From eb55c7e733cc896b0afd2ded288a340482838a59 Mon Sep 17 00:00:00 2001 From: jjspace <8007967+jjspace@users.noreply.github.com> Date: Tue, 15 Apr 2025 16:59:17 -0400 Subject: [PATCH 01/21] create sandcastle package --- .gitignore | 3 +- package.json | 5 +- packages/sandcastle/.gitignore | 14 +++++ packages/sandcastle/README.md | 54 +++++++++++++++++++ packages/sandcastle/eslint.config.js | 28 ++++++++++ packages/sandcastle/index.html | 13 +++++ packages/sandcastle/package.json | 29 ++++++++++ packages/sandcastle/public/vite.svg | 1 + packages/sandcastle/src/App.css | 42 +++++++++++++++ packages/sandcastle/src/App.tsx | 35 ++++++++++++ packages/sandcastle/src/assets/react.svg | 1 + packages/sandcastle/src/index.css | 68 ++++++++++++++++++++++++ packages/sandcastle/src/main.tsx | 10 ++++ packages/sandcastle/src/vite-env.d.ts | 1 + packages/sandcastle/tsconfig.app.json | 26 +++++++++ packages/sandcastle/tsconfig.json | 7 +++ packages/sandcastle/tsconfig.node.json | 24 +++++++++ packages/sandcastle/vite.config.ts | 21 ++++++++ 18 files changed, 379 insertions(+), 3 deletions(-) create mode 100644 packages/sandcastle/.gitignore create mode 100644 packages/sandcastle/README.md create mode 100644 packages/sandcastle/eslint.config.js create mode 100644 packages/sandcastle/index.html create mode 100644 packages/sandcastle/package.json create mode 100644 packages/sandcastle/public/vite.svg create mode 100644 packages/sandcastle/src/App.css create mode 100644 packages/sandcastle/src/App.tsx create mode 100644 packages/sandcastle/src/assets/react.svg create mode 100644 packages/sandcastle/src/index.css create mode 100644 packages/sandcastle/src/main.tsx create mode 100644 packages/sandcastle/src/vite-env.d.ts create mode 100644 packages/sandcastle/tsconfig.app.json create mode 100644 packages/sandcastle/tsconfig.json create mode 100644 packages/sandcastle/tsconfig.node.json create mode 100644 packages/sandcastle/vite.config.ts diff --git a/.gitignore b/.gitignore index 2356a17e08cf..056370a688f2 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ Thumbs.db /Apps/Sandcastle/jsHintOptions.js /Apps/Sandcastle/gallery/gallery-index.js /Apps/Sandcastle/templates/bucket.css +/Apps/Sandcastle2 /Source/Assets/ /Source/**/*.d.ts @@ -43,4 +44,4 @@ yarn.lock .idea/shelf # Used in the CLA checking GitHub workflow -GoogleConfig.json \ No newline at end of file +GoogleConfig.json diff --git a/package.json b/package.json index 7c25b0e615c0..8f0d210af4f2 100644 --- a/package.json +++ b/package.json @@ -157,6 +157,7 @@ }, "workspaces": [ "packages/engine", - "packages/widgets" + "packages/widgets", + "packages/sandcastle" ] -} \ No newline at end of file +} diff --git a/packages/sandcastle/.gitignore b/packages/sandcastle/.gitignore new file mode 100644 index 000000000000..acc2a2f6cbda --- /dev/null +++ b/packages/sandcastle/.gitignore @@ -0,0 +1,14 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + diff --git a/packages/sandcastle/README.md b/packages/sandcastle/README.md new file mode 100644 index 000000000000..bee7491d3b4e --- /dev/null +++ b/packages/sandcastle/README.md @@ -0,0 +1,54 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules: + +```js +export default tseslint.config({ + extends: [ + // Remove ...tseslint.configs.recommended and replace with this + ...tseslint.configs.recommendedTypeChecked, + // Alternatively, use this for stricter rules + ...tseslint.configs.strictTypeChecked, + // Optionally, add this for stylistic rules + ...tseslint.configs.stylisticTypeChecked, + ], + languageOptions: { + // other options... + parserOptions: { + project: ["./tsconfig.node.json", "./tsconfig.app.json"], + tsconfigRootDir: import.meta.dirname, + }, + }, +}); +``` + +You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules: + +```js +// eslint.config.js +import reactX from "eslint-plugin-react-x"; +import reactDom from "eslint-plugin-react-dom"; + +export default tseslint.config({ + plugins: { + // Add the react-x and react-dom plugins + "react-x": reactX, + "react-dom": reactDom, + }, + rules: { + // other rules... + // Enable its recommended typescript rules + ...reactX.configs["recommended-typescript"].rules, + ...reactDom.configs.recommended.rules, + }, +}); +``` diff --git a/packages/sandcastle/eslint.config.js b/packages/sandcastle/eslint.config.js new file mode 100644 index 000000000000..79a552ea9d4d --- /dev/null +++ b/packages/sandcastle/eslint.config.js @@ -0,0 +1,28 @@ +import js from "@eslint/js"; +import globals from "globals"; +import reactHooks from "eslint-plugin-react-hooks"; +import reactRefresh from "eslint-plugin-react-refresh"; +import tseslint from "typescript-eslint"; + +export default tseslint.config( + { ignores: ["dist"] }, + { + extends: [js.configs.recommended, ...tseslint.configs.recommended], + files: ["**/*.{ts,tsx}"], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + plugins: { + "react-hooks": reactHooks, + "react-refresh": reactRefresh, + }, + rules: { + ...reactHooks.configs.recommended.rules, + "react-refresh/only-export-components": [ + "warn", + { allowConstantExport: true }, + ], + }, + }, +); diff --git a/packages/sandcastle/index.html b/packages/sandcastle/index.html new file mode 100644 index 000000000000..e4b78eae1230 --- /dev/null +++ b/packages/sandcastle/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + TS + + +
+ + + diff --git a/packages/sandcastle/package.json b/packages/sandcastle/package.json new file mode 100644 index 000000000000..e4cb8d905d02 --- /dev/null +++ b/packages/sandcastle/package.json @@ -0,0 +1,29 @@ +{ + "name": "sandcastle", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@eslint/js": "^9.21.0", + "@types/react": "^19.0.10", + "@types/react-dom": "^19.0.4", + "@vitejs/plugin-react": "^4.3.4", + "eslint": "^9.21.0", + "eslint-plugin-react-hooks": "^5.1.0", + "eslint-plugin-react-refresh": "^0.4.19", + "globals": "^15.15.0", + "typescript": "~5.7.2", + "typescript-eslint": "^8.24.1", + "vite": "^6.2.0" + } +} diff --git a/packages/sandcastle/public/vite.svg b/packages/sandcastle/public/vite.svg new file mode 100644 index 000000000000..e7b8dfb1b2a6 --- /dev/null +++ b/packages/sandcastle/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/sandcastle/src/App.css b/packages/sandcastle/src/App.css new file mode 100644 index 000000000000..b9d355df2a59 --- /dev/null +++ b/packages/sandcastle/src/App.css @@ -0,0 +1,42 @@ +#root { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +@keyframes logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: no-preference) { + a:nth-of-type(2) .logo { + animation: logo-spin infinite 20s linear; + } +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} diff --git a/packages/sandcastle/src/App.tsx b/packages/sandcastle/src/App.tsx new file mode 100644 index 000000000000..3d7ded3ff624 --- /dev/null +++ b/packages/sandcastle/src/App.tsx @@ -0,0 +1,35 @@ +import { useState } from 'react' +import reactLogo from './assets/react.svg' +import viteLogo from '/vite.svg' +import './App.css' + +function App() { + const [count, setCount] = useState(0) + + return ( + <> +
+ + Vite logo + + + React logo + +
+

Vite + React

+
+ +

+ Edit src/App.tsx and save to test HMR +

+
+

+ Click on the Vite and React logos to learn more +

+ + ) +} + +export default App diff --git a/packages/sandcastle/src/assets/react.svg b/packages/sandcastle/src/assets/react.svg new file mode 100644 index 000000000000..6c87de9bb335 --- /dev/null +++ b/packages/sandcastle/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/sandcastle/src/index.css b/packages/sandcastle/src/index.css new file mode 100644 index 000000000000..08a3ac9e1e5c --- /dev/null +++ b/packages/sandcastle/src/index.css @@ -0,0 +1,68 @@ +:root { + font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/packages/sandcastle/src/main.tsx b/packages/sandcastle/src/main.tsx new file mode 100644 index 000000000000..bef5202a32cb --- /dev/null +++ b/packages/sandcastle/src/main.tsx @@ -0,0 +1,10 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import './index.css' +import App from './App.tsx' + +createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/packages/sandcastle/src/vite-env.d.ts b/packages/sandcastle/src/vite-env.d.ts new file mode 100644 index 000000000000..11f02fe2a006 --- /dev/null +++ b/packages/sandcastle/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/packages/sandcastle/tsconfig.app.json b/packages/sandcastle/tsconfig.app.json new file mode 100644 index 000000000000..358ca9ba93f0 --- /dev/null +++ b/packages/sandcastle/tsconfig.app.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src"] +} diff --git a/packages/sandcastle/tsconfig.json b/packages/sandcastle/tsconfig.json new file mode 100644 index 000000000000..1ffef600d959 --- /dev/null +++ b/packages/sandcastle/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/packages/sandcastle/tsconfig.node.json b/packages/sandcastle/tsconfig.node.json new file mode 100644 index 000000000000..db0becc8b033 --- /dev/null +++ b/packages/sandcastle/tsconfig.node.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2022", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/packages/sandcastle/vite.config.ts b/packages/sandcastle/vite.config.ts new file mode 100644 index 000000000000..1b165c76e44f --- /dev/null +++ b/packages/sandcastle/vite.config.ts @@ -0,0 +1,21 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; + +// https://vite.dev/config/ +export default defineConfig(({ command }) => { + return { + plugins: [react()], + base: "/Apps/Sandcastle2", + build: { + outDir: "../../Apps/Sandcastle2", + // "the outDir is not inside project root and will not be emptied" without this setting + emptyOutDir: true, + sourcemap: command === "serve", + }, + server: { + // Given the nature of loading and constructing a CesiumJS Viewer on startup HMR can get memory intensive + // The state of the editor could also be lost when developing if the page refreshes unexpectedly + hmr: false, + }, + }; +}); From 793ba8897a0af2617374d853b44f2dec54e3b6cb Mon Sep 17 00:00:00 2001 From: jjspace <8007967+jjspace@users.noreply.github.com> Date: Thu, 17 Apr 2025 16:07:03 -0400 Subject: [PATCH 02/21] elevate eslint config, run prettier --- .prettierignore | 4 ++++ eslint.config.js | 29 ++++++++++++++++++++++++++++ package.json | 7 +++++-- packages/sandcastle/eslint.config.js | 28 --------------------------- packages/sandcastle/package.json | 9 ++------- packages/sandcastle/src/App.tsx | 14 +++++++------- packages/sandcastle/src/main.tsx | 12 ++++++------ 7 files changed, 53 insertions(+), 50 deletions(-) delete mode 100644 packages/sandcastle/eslint.config.js diff --git a/.prettierignore b/.prettierignore index c46eee96cb50..5c7ac378e24f 100644 --- a/.prettierignore +++ b/.prettierignore @@ -18,6 +18,7 @@ !**/*.html !**/*.md !**/*.ts +!**/*.tsx # Re-ignore a few things caught above @@ -33,6 +34,9 @@ packages/widgets/Build/** packages/widgets/index.js packages/widgets/Source/ThirdParty/** +packages/sandcastle/node_modules/** +Apps/Sandcastle2/** + Specs/jasmine/** Apps/Sandcastle/ThirdParty diff --git a/eslint.config.js b/eslint.config.js index 39649c64b28a..ebfe5a687faf 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,6 +1,9 @@ import globals from "globals"; import html from "eslint-plugin-html"; import configCesium from "@cesium/eslint-config"; +import reactHooks from "eslint-plugin-react-hooks"; +import reactRefresh from "eslint-plugin-react-refresh"; +import tseslint from "typescript-eslint"; export default [ { @@ -15,6 +18,7 @@ export default [ "Apps/HelloWorld.html", "Apps/Sandcastle/jsHintOptions.js", "Apps/Sandcastle/gallery/gallery-index.js", + "Apps/Sandcastle2/", "packages/engine/Source/Scene/GltfPipeline/**/*", "packages/engine/Source/Shaders/**/*", "Specs/jasmine/*", @@ -74,6 +78,31 @@ export default [ sourceType: "module", }, }, + ...[...tseslint.configs.recommended].map((config) => ({ + // This is needed to restrict to a specific path unless using the tseslint.config function + // https://typescript-eslint.io/packages/typescript-eslint#config + ...config, + files: ["packages/sandcastle/**/*.{ts,tsx}"], + })), + { + // This config came from the vite project generation + files: ["packages/sandcastle/**/*.{ts,tsx}"], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + plugins: { + "react-hooks": reactHooks, + "react-refresh": reactRefresh, + }, + rules: { + ...reactHooks.configs.recommended.rules, + "react-refresh/only-export-components": [ + "warn", + { allowConstantExport: true }, + ], + }, + }, { files: ["Specs/**/*", "packages/**/Specs/**/*"], languageOptions: { diff --git a/package.json b/package.json index 8f0d210af4f2..d95f02f43e06 100644 --- a/package.json +++ b/package.json @@ -63,6 +63,8 @@ "esbuild": "^0.25.0", "eslint": "^9.1.1", "eslint-plugin-html": "^8.1.1", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.19", "express": "^4.17.1", "globals": "^16.0.0", "globby": "^14.0.0", @@ -101,6 +103,7 @@ "rimraf": "^5.0.0", "tsd-jsdoc": "^2.5.0", "typescript": "^5.3.2", + "typescript-eslint": "^8.30.1", "yargs": "^17.0.1" }, "scripts": { @@ -118,7 +121,7 @@ "coverage": "gulp coverage", "build-docs": "gulp buildDocs", "build-docs-watch": "gulp buildDocsWatch", - "eslint": "eslint \"./**/*.*js\" \"./**/*.html\" --cache --quiet", + "eslint": "eslint \"./**/*.*js\" \"./**/*.*ts*\" \"./**/*.html\" --cache --quiet", "make-zip": "gulp makeZip", "markdownlint": "markdownlint \"**/*.md\"", "release": "gulp release", @@ -146,7 +149,7 @@ "node": ">=18.18.0" }, "lint-staged": { - "*.{js,cjs,mjs,css,html}": [ + "*.{js,cjs,mjs,ts,tsx,css,html}": [ "eslint --cache --quiet", "prettier --write" ], diff --git a/packages/sandcastle/eslint.config.js b/packages/sandcastle/eslint.config.js deleted file mode 100644 index 79a552ea9d4d..000000000000 --- a/packages/sandcastle/eslint.config.js +++ /dev/null @@ -1,28 +0,0 @@ -import js from "@eslint/js"; -import globals from "globals"; -import reactHooks from "eslint-plugin-react-hooks"; -import reactRefresh from "eslint-plugin-react-refresh"; -import tseslint from "typescript-eslint"; - -export default tseslint.config( - { ignores: ["dist"] }, - { - extends: [js.configs.recommended, ...tseslint.configs.recommended], - files: ["**/*.{ts,tsx}"], - languageOptions: { - ecmaVersion: 2020, - globals: globals.browser, - }, - plugins: { - "react-hooks": reactHooks, - "react-refresh": reactRefresh, - }, - rules: { - ...reactHooks.configs.recommended.rules, - "react-refresh/only-export-components": [ - "warn", - { allowConstantExport: true }, - ], - }, - }, -); diff --git a/packages/sandcastle/package.json b/packages/sandcastle/package.json index e4cb8d905d02..3bf1931701ef 100644 --- a/packages/sandcastle/package.json +++ b/packages/sandcastle/package.json @@ -1,7 +1,7 @@ { - "name": "sandcastle", + "name": "@cesium/sandcastle", "private": true, - "version": "0.0.0", + "version": "0.0.1", "type": "module", "scripts": { "dev": "vite", @@ -14,16 +14,11 @@ "react-dom": "^19.0.0" }, "devDependencies": { - "@eslint/js": "^9.21.0", "@types/react": "^19.0.10", "@types/react-dom": "^19.0.4", "@vitejs/plugin-react": "^4.3.4", - "eslint": "^9.21.0", - "eslint-plugin-react-hooks": "^5.1.0", - "eslint-plugin-react-refresh": "^0.4.19", "globals": "^15.15.0", "typescript": "~5.7.2", - "typescript-eslint": "^8.24.1", "vite": "^6.2.0" } } diff --git a/packages/sandcastle/src/App.tsx b/packages/sandcastle/src/App.tsx index 3d7ded3ff624..e25f329e260f 100644 --- a/packages/sandcastle/src/App.tsx +++ b/packages/sandcastle/src/App.tsx @@ -1,10 +1,10 @@ -import { useState } from 'react' -import reactLogo from './assets/react.svg' -import viteLogo from '/vite.svg' -import './App.css' +import { useState } from "react"; +import reactLogo from "./assets/react.svg"; +import viteLogo from "/vite.svg"; +import "./App.css"; function App() { - const [count, setCount] = useState(0) + const [count, setCount] = useState(0); return ( <> @@ -29,7 +29,7 @@ function App() { Click on the Vite and React logos to learn more

- ) + ); } -export default App +export default App; diff --git a/packages/sandcastle/src/main.tsx b/packages/sandcastle/src/main.tsx index bef5202a32cb..eff7ccc67760 100644 --- a/packages/sandcastle/src/main.tsx +++ b/packages/sandcastle/src/main.tsx @@ -1,10 +1,10 @@ -import { StrictMode } from 'react' -import { createRoot } from 'react-dom/client' -import './index.css' -import App from './App.tsx' +import { StrictMode } from "react"; +import { createRoot } from "react-dom/client"; +import "./index.css"; +import App from "./App.tsx"; -createRoot(document.getElementById('root')!).render( +createRoot(document.getElementById("root")!).render( , -) +); From 8a73405d6f63bd5ce038e28ff1f0cfa5871a3931 Mon Sep 17 00:00:00 2001 From: jjspace <8007967+jjspace@users.noreply.github.com> Date: Thu, 17 Apr 2025 17:10:56 -0400 Subject: [PATCH 03/21] import hackathon code --- eslint.config.js | 1 + packages/sandcastle/index.html | 4 +- packages/sandcastle/package.json | 4 + packages/sandcastle/public/Cesium.d.ts | 50627 +++++++++++++ .../Batched/BatchedColors/batchedColors.b3dm | Bin 0 -> 13320 bytes .../Batched/BatchedColors/tileset.json | 41 + .../batchedTranslucent.b3dm | Bin 0 -> 9672 bytes .../Batched/BatchedTranslucent/tileset.json | 41 + .../batchedTranslucentOpaqueMix.b3dm | Bin 0 -> 10024 bytes .../BatchedTranslucentOpaqueMix/tileset.json | 41 + .../batchedWithBatchTable.b3dm | Bin 0 -> 10304 bytes .../BatchedWithBatchTable/tileset.json | 41 + .../Photogrammetry/content.b3dm | Bin 0 -> 4176 bytes .../Photogrammetry/tileset.json | 31 + .../Classification/PointCloud/content.geom | Bin 0 -> 856 bytes .../Classification/PointCloud/tileset.json | 41 + .../Composite/Composite/composite.cmpt | Bin 0 -> 13472 bytes .../Composite/Composite/tileset.json | 41 + .../Hierarchy/BatchTableHierarchy/tile.b3dm | Bin 0 -> 78264 bytes .../BatchTableHierarchy/tileset.json | 53 + .../instancedOrientation.i3dm | Bin 0 -> 4432 bytes .../InstancedOrientation/tileset.json | 29 + .../instancedWithBatchTable.i3dm | Bin 0 -> 3784 bytes .../InstancedWithBatchTable/tileset.json | 29 + .../PointCloudBatched/pointCloudBatched.pnts | Bin 0 -> 25632 bytes .../PointCloud/PointCloudBatched/tileset.json | 21 + .../pointCloudConstantColor.pnts | Bin 0 -> 12184 bytes .../PointCloudConstantColor/tileset.json | 21 + .../PointCloudDraco/pointCloudDraco.pnts | Bin 0 -> 15968 bytes .../PointCloud/PointCloudDraco/tileset.json | 27 + .../PointCloudNormals/pointCloudNormals.pnts | Bin 0 -> 27216 bytes .../PointCloud/PointCloudNormals/tileset.json | 21 + .../PointCloudRGB/pointCloudRGB.pnts | Bin 0 -> 15184 bytes .../PointCloud/PointCloudRGB/tileset.json | 21 + .../PointCloud/PointCloudTimeDynamic/0.pnts | Bin 0 -> 33404 bytes .../PointCloud/PointCloudTimeDynamic/1.pnts | Bin 0 -> 33404 bytes .../PointCloud/PointCloudTimeDynamic/2.pnts | Bin 0 -> 33404 bytes .../PointCloud/PointCloudTimeDynamic/3.pnts | Bin 0 -> 33404 bytes .../PointCloud/PointCloudTimeDynamic/4.pnts | Bin 0 -> 33404 bytes .../pointCloudWithPerPointProperties.pnts | Bin 0 -> 33336 bytes .../tileset.json | 39 + .../Cesium3DTiles/Tilesets/Tileset/ll.b3dm | Bin 0 -> 9704 bytes .../Cesium3DTiles/Tilesets/Tileset/lr.b3dm | Bin 0 -> 9704 bytes .../Tilesets/Tileset/parent.b3dm | Bin 0 -> 9680 bytes .../Tilesets/Tileset/tileset.json | 124 + .../Cesium3DTiles/Tilesets/Tileset/ul.b3dm | Bin 0 -> 9688 bytes .../Cesium3DTiles/Tilesets/Tileset/ur.b3dm | Bin 0 -> 9688 bytes .../TilesetWithViewerRequestVolume/ll.b3dm | Bin 0 -> 9688 bytes .../TilesetWithViewerRequestVolume/lr.b3dm | Bin 0 -> 9688 bytes .../points.pnts | Bin 0 -> 15136 bytes .../tileset.json | 126 + .../TilesetWithViewerRequestVolume/ul.b3dm | Bin 0 -> 9672 bytes .../TilesetWithViewerRequestVolume/ur.b3dm | Bin 0 -> 9672 bytes .../VoxelBox3DTiles/subtrees/0.0.0.subtree | Bin 0 -> 144 bytes .../VoxelBox3DTiles/subtrees/0/0/0/0.json | 11 + .../Voxel/VoxelBox3DTiles/tiles/0/0/0/0.gltf | 105 + .../Voxel/VoxelBox3DTiles/tiles/0/0/0/a.bin | Bin 0 -> 128 bytes .../Voxel/VoxelBox3DTiles/tileset.json | 97 + .../subtrees/0.0.0.subtree | Bin 0 -> 144 bytes .../subtrees/0/0/0/0.json | 11 + .../VoxelCylinder3DTiles/tiles/0/0/0/0.gltf | 122 + .../VoxelCylinder3DTiles/tiles/0/0/0/a.bin | Bin 0 -> 128 bytes .../VoxelCylinder3DTiles/tiles/1/0/0/0.gltf | 130 + .../VoxelCylinder3DTiles/tiles/1/0/0/1.gltf | 130 + .../VoxelCylinder3DTiles/tiles/1/0/0/a0.bin | Bin 0 -> 128 bytes .../VoxelCylinder3DTiles/tiles/1/0/0/a1.bin | Bin 0 -> 128 bytes .../VoxelCylinder3DTiles/tiles/1/0/1/0.gltf | 130 + .../VoxelCylinder3DTiles/tiles/1/0/1/1.gltf | 130 + .../VoxelCylinder3DTiles/tiles/1/0/1/a0.bin | Bin 0 -> 128 bytes .../VoxelCylinder3DTiles/tiles/1/0/1/a1.bin | Bin 0 -> 128 bytes .../VoxelCylinder3DTiles/tiles/1/1/0/0.gltf | 130 + .../VoxelCylinder3DTiles/tiles/1/1/0/1.gltf | 130 + .../VoxelCylinder3DTiles/tiles/1/1/0/a0.bin | Bin 0 -> 128 bytes .../VoxelCylinder3DTiles/tiles/1/1/0/a1.bin | Bin 0 -> 128 bytes .../VoxelCylinder3DTiles/tiles/1/1/1/0.gltf | 130 + .../VoxelCylinder3DTiles/tiles/1/1/1/1.gltf | 130 + .../VoxelCylinder3DTiles/tiles/1/1/1/a0.bin | Bin 0 -> 128 bytes .../VoxelCylinder3DTiles/tiles/1/1/1/a1.bin | Bin 0 -> 128 bytes .../Voxel/VoxelCylinder3DTiles/tileset.json | 92 + .../Voxel/VoxelEllipsoid3DTiles/schema.json | 14 + .../subtrees/0/0/0/0.json | 14 + .../VoxelEllipsoid3DTiles/tiles/0/0/0/0.gltf | 100 + .../VoxelEllipsoid3DTiles/tiles/0/0/0/a.bin | Bin 0 -> 32 bytes .../Voxel/VoxelEllipsoid3DTiles/tileset.json | 61 + .../public/SampleData/ClampToGround.czml | 80 + .../SampleData/MultipartVehicle_part1.czml | 244 + .../SampleData/MultipartVehicle_part2.czml | 174 + .../SampleData/MultipartVehicle_part3.czml | 114 + .../sandcastle/public/SampleData/Vehicle.czml | 487 + .../public/SampleData/cesium_stripes.png | Bin 0 -> 18714 bytes .../public/SampleData/circular_particle.png | Bin 0 -> 975 bytes .../sandcastle/public/SampleData/fire.png | Bin 0 -> 104016 bytes .../public/SampleData/gpx/complexTrk.gpx | 219 + .../public/SampleData/gpx/lamina.gpx | 60712 ++++++++++++++++ .../public/SampleData/gpx/route.gpx | 25 + .../public/SampleData/gpx/simple.gpx | 10 + .../sandcastle/public/SampleData/gpx/wpt.gpx | 22 + .../public/SampleData/kml/bikeRide.kml | 10565 +++ .../SampleData/kml/eiffel-tower-flyto.kml | 46 + .../kml/facilities/GroundStation.png | Bin 0 -> 7043 bytes .../kml/facilities/LaserStation.png | Bin 0 -> 6684 bytes .../SampleData/kml/facilities/LaunchPad.png | Bin 0 -> 6735 bytes .../SampleData/kml/facilities/LaunchSite.png | Bin 0 -> 5655 bytes .../kml/facilities/OpticalTrackingStation.png | Bin 0 -> 2538 bytes .../kml/facilities/RadarStation.png | Bin 0 -> 7452 bytes .../SampleData/kml/facilities/agiLogo.svg | 32 + .../SampleData/kml/facilities/facilities.kml | 1 + .../SampleData/kml/gdpPerCapita2008.kmz | Bin 0 -> 382584 bytes .../models/BoxInstanced/BoxInstanced.gltf | 292 + .../models/BoxInstanced/geometry.bin | Bin 0 -> 648 bytes .../models/BoxInstanced/instances.bin | Bin 0 -> 176 bytes .../models/BoxInstanced/metadata.bin | Bin 0 -> 104 bytes .../SampleData/models/BoxUnlit/BoxUnlit.gltf | 151 + .../models/CesiumAir/Cesium_Air.glb | Bin 0 -> 586652 bytes .../models/CesiumBalloon/CesiumBalloon.glb | Bin 0 -> 712168 bytes .../CesiumBalloonKTX2/CesiumBalloonKTX2.glb | Bin 0 -> 453512 bytes .../models/CesiumDrone/CesiumDrone.glb | Bin 0 -> 1169536 bytes .../models/CesiumMan/Cesium_Man.glb | Bin 0 -> 490876 bytes .../CesiumMilkTruck/CesiumMilkTruck.dae | 412 + .../CesiumMilkTruck/CesiumMilkTruck.glb | Bin 0 -> 441972 bytes .../CesiumMilkTruck/CesiumMilkTruck.jpg | Bin 0 -> 296200 bytes .../SampleData/models/DracoCompressed/0.bin | Bin 0 -> 13971 bytes .../DracoCompressed/CesiumMilkTruck.gltf | 592 + .../DracoCompressed/CesiumMilkTruck.png | Bin 0 -> 427633 bytes .../models/GroundVehicle/GroundVehicle.glb | Bin 0 -> 6135996 bytes .../models/ParcLeadMine/ParcLeadMine.glb | Bin 0 -> 63056 bytes .../public/SampleData/models/Pawns/Pawns.glb | Bin 0 -> 253532 bytes .../models/PointCloudWave/PointCloudWave.glb | Bin 0 -> 62076 bytes .../models/ShadowTester/Shadow_Tester.glb | Bin 0 -> 42976 bytes .../models/ShadowTester/Shadow_Tester_2.glb | Bin 0 -> 61684 bytes .../models/ShadowTester/Shadow_Tester_3.glb | Bin 0 -> 51940 bytes .../models/ShadowTester/Shadow_Tester_4.glb | Bin 0 -> 131172 bytes .../ShadowTester/Shadow_Tester_Point.glb | Bin 0 -> 64928 bytes .../ShadowTester/Shadow_Transparent.glb | Bin 0 -> 3216 bytes .../models/WoodTower/Wood_Tower.glb | Bin 0 -> 1194408 bytes .../SampleData/ne_10m_us_states.topojson | 763 + .../public/SampleData/population909500.json | 1 + .../sandcastle/public/SampleData/simple.czml | 2416 + .../public/SampleData/simplestyles.geojson | 2314 + .../sandcastle/public/SampleData/smoke.png | Bin 0 -> 57979 bytes .../public/SampleData/snowflake_particle.png | Bin 0 -> 3270 bytes .../public/SampleData/tracking.czml | 4010 + .../sandcastle/public/Sandcastle-client.js | 203 + .../sandcastle/public/Sandcastle-header.js | 111 + .../sandcastle/public/Sandcastle-helpers.js | 46 + packages/sandcastle/public/bucket.css | 66 + packages/sandcastle/public/bucket.html | 20 + packages/sandcastle/public/bucketRaw.css | 66 + packages/sandcastle/public/favicon.ico | Bin 0 -> 49334 bytes .../sandcastle/public/gallery/3D Models.html | 183 + .../sandcastle/public/gallery/3D Models.jpg | Bin 0 -> 24887 bytes .../sandcastle/public/gallery/Billboards.html | 381 + .../sandcastle/public/gallery/Billboards.jpg | Bin 0 -> 27162 bytes packages/sandcastle/public/gallery/Moon.html | 381 + packages/sandcastle/public/gallery/Moon.jpg | Bin 0 -> 29545 bytes .../public/gallery/Terrain Exaggeration.html | 206 + .../public/gallery/Terrain Exaggeration.jpg | Bin 0 -> 64055 bytes .../public/images/Cesium_Logo_Color.jpg | Bin 0 -> 49939 bytes .../images/Cesium_Logo_Color_Overlay.png | Bin 0 -> 23746 bytes .../public/images/Cesium_Logo_ETC1S.ktx2 | Bin 0 -> 3559 bytes .../public/images/Cesium_Logo_UASTC.ktx2 | Bin 0 -> 13975 bytes .../public/images/Cesium_Logo_overlay.png | Bin 0 -> 4664 bytes packages/sandcastle/public/images/bumpmap.png | Bin 0 -> 28984 bytes .../public/images/cesium-logomark-192.png | Bin 0 -> 10082 bytes .../public/images/cesium-logomark.svg | 5 + .../cesium_maptiler/Cesium_Logo_Color.jpg | Bin 0 -> 38666 bytes .../Cesium_Logo_Color.jpg.aux.xml | 9 + .../Cesium_Logo_Color/0/0/0.png | Bin 0 -> 1635 bytes .../Cesium_Logo_Color/1/0/1.png | Bin 0 -> 2963 bytes .../Cesium_Logo_Color/2/0/2.png | Bin 0 -> 3706 bytes .../Cesium_Logo_Color/2/1/2.png | Bin 0 -> 2499 bytes .../Cesium_Logo_Color/3/1/4.png | Bin 0 -> 7940 bytes .../Cesium_Logo_Color/3/2/4.png | Bin 0 -> 4567 bytes .../Cesium_Logo_Color/4/2/8.png | Bin 0 -> 406 bytes .../Cesium_Logo_Color/4/2/9.png | Bin 0 -> 8229 bytes .../Cesium_Logo_Color/4/3/8.png | Bin 0 -> 397 bytes .../Cesium_Logo_Color/4/3/9.png | Bin 0 -> 14579 bytes .../Cesium_Logo_Color/4/4/8.png | Bin 0 -> 397 bytes .../Cesium_Logo_Color/4/4/9.png | Bin 0 -> 8783 bytes .../Cesium_Logo_Color/4/5/8.png | Bin 0 -> 416 bytes .../Cesium_Logo_Color/4/5/9.png | Bin 0 -> 2794 bytes .../Cesium_Logo_Color/tilemapresource.xml | 17 + .../sandcastle/public/images/checkerboard.png | Bin 0 -> 751 bytes .../sandcastle/public/images/earthbump1k.jpg | Bin 0 -> 91237 bytes .../sandcastle/public/images/earthspec1k.jpg | Bin 0 -> 116543 bytes .../sandcastle/public/images/facility.gif | Bin 0 -> 179 bytes .../sandcastle/public/images/gitHub16px.png | Bin 0 -> 1748 bytes .../sandcastle/public/images/normalmap.png | Bin 0 -> 26798 bytes .../sandcastle/public/images/share16px.png | Bin 0 -> 381 bytes .../sandcastle/public/images/whiteShapes.png | Bin 0 -> 1439 bytes packages/sandcastle/public/vite.svg | 1 - packages/sandcastle/src/App.css | 77 +- packages/sandcastle/src/App.tsx | 749 +- packages/sandcastle/src/Gallery.css | 19 + packages/sandcastle/src/Gallery.tsx | 47 + packages/sandcastle/src/gallery-index.ts | 921 + packages/sandcastle/src/main.tsx | 1 + packages/sandcastle/src/reset.css | 75 + 198 files changed, 140304 insertions(+), 53 deletions(-) create mode 100644 packages/sandcastle/public/Cesium.d.ts create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Batched/BatchedColors/batchedColors.b3dm create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Batched/BatchedColors/tileset.json create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Batched/BatchedTranslucent/batchedTranslucent.b3dm create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Batched/BatchedTranslucent/tileset.json create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Batched/BatchedTranslucentOpaqueMix/batchedTranslucentOpaqueMix.b3dm create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Batched/BatchedTranslucentOpaqueMix/tileset.json create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Batched/BatchedWithBatchTable/batchedWithBatchTable.b3dm create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Batched/BatchedWithBatchTable/tileset.json create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Classification/Photogrammetry/content.b3dm create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Classification/Photogrammetry/tileset.json create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Classification/PointCloud/content.geom create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Classification/PointCloud/tileset.json create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Composite/Composite/composite.cmpt create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Composite/Composite/tileset.json create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tile.b3dm create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tileset.json create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Instanced/InstancedOrientation/instancedOrientation.i3dm create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Instanced/InstancedOrientation/tileset.json create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Instanced/InstancedWithBatchTable/instancedWithBatchTable.i3dm create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Instanced/InstancedWithBatchTable/tileset.json create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/PointCloud/PointCloudBatched/pointCloudBatched.pnts create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/PointCloud/PointCloudBatched/tileset.json create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/PointCloud/PointCloudConstantColor/pointCloudConstantColor.pnts create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/PointCloud/PointCloudConstantColor/tileset.json create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/PointCloud/PointCloudDraco/pointCloudDraco.pnts create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/PointCloud/PointCloudDraco/tileset.json create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/PointCloud/PointCloudNormals/pointCloudNormals.pnts create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/PointCloud/PointCloudNormals/tileset.json create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/PointCloud/PointCloudRGB/pointCloudRGB.pnts create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/PointCloud/PointCloudRGB/tileset.json create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/PointCloud/PointCloudTimeDynamic/0.pnts create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/PointCloud/PointCloudTimeDynamic/1.pnts create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/PointCloud/PointCloudTimeDynamic/2.pnts create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/PointCloud/PointCloudTimeDynamic/3.pnts create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/PointCloud/PointCloudTimeDynamic/4.pnts create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/PointCloud/PointCloudWithPerPointProperties/pointCloudWithPerPointProperties.pnts create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/PointCloud/PointCloudWithPerPointProperties/tileset.json create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Tilesets/Tileset/ll.b3dm create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Tilesets/Tileset/lr.b3dm create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Tilesets/Tileset/parent.b3dm create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Tilesets/Tileset/tileset.json create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Tilesets/Tileset/ul.b3dm create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Tilesets/Tileset/ur.b3dm create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Tilesets/TilesetWithViewerRequestVolume/ll.b3dm create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Tilesets/TilesetWithViewerRequestVolume/lr.b3dm create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Tilesets/TilesetWithViewerRequestVolume/points.pnts create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Tilesets/TilesetWithViewerRequestVolume/tileset.json create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Tilesets/TilesetWithViewerRequestVolume/ul.b3dm create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Tilesets/TilesetWithViewerRequestVolume/ur.b3dm create mode 100755 packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelBox3DTiles/subtrees/0.0.0.subtree create mode 100755 packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelBox3DTiles/subtrees/0/0/0/0.json create mode 100755 packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelBox3DTiles/tiles/0/0/0/0.gltf create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelBox3DTiles/tiles/0/0/0/a.bin create mode 100755 packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelBox3DTiles/tileset.json create mode 100755 packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/subtrees/0.0.0.subtree create mode 100755 packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/subtrees/0/0/0/0.json create mode 100755 packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/0/0/0/0.gltf create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/0/0/0/a.bin create mode 100755 packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/0/0/0.gltf create mode 100755 packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/0/0/1.gltf create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/0/0/a0.bin create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/0/0/a1.bin create mode 100755 packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/0/1/0.gltf create mode 100755 packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/0/1/1.gltf create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/0/1/a0.bin create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/0/1/a1.bin create mode 100755 packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/1/0/0.gltf create mode 100755 packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/1/0/1.gltf create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/1/0/a0.bin create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/1/0/a1.bin create mode 100755 packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/1/1/0.gltf create mode 100755 packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/1/1/1.gltf create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/1/1/a0.bin create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/1/1/a1.bin create mode 100755 packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tileset.json create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelEllipsoid3DTiles/schema.json create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelEllipsoid3DTiles/subtrees/0/0/0/0.json create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelEllipsoid3DTiles/tiles/0/0/0/0.gltf create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelEllipsoid3DTiles/tiles/0/0/0/a.bin create mode 100644 packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelEllipsoid3DTiles/tileset.json create mode 100644 packages/sandcastle/public/SampleData/ClampToGround.czml create mode 100644 packages/sandcastle/public/SampleData/MultipartVehicle_part1.czml create mode 100644 packages/sandcastle/public/SampleData/MultipartVehicle_part2.czml create mode 100644 packages/sandcastle/public/SampleData/MultipartVehicle_part3.czml create mode 100644 packages/sandcastle/public/SampleData/Vehicle.czml create mode 100644 packages/sandcastle/public/SampleData/cesium_stripes.png create mode 100644 packages/sandcastle/public/SampleData/circular_particle.png create mode 100644 packages/sandcastle/public/SampleData/fire.png create mode 100644 packages/sandcastle/public/SampleData/gpx/complexTrk.gpx create mode 100644 packages/sandcastle/public/SampleData/gpx/lamina.gpx create mode 100644 packages/sandcastle/public/SampleData/gpx/route.gpx create mode 100644 packages/sandcastle/public/SampleData/gpx/simple.gpx create mode 100644 packages/sandcastle/public/SampleData/gpx/wpt.gpx create mode 100644 packages/sandcastle/public/SampleData/kml/bikeRide.kml create mode 100644 packages/sandcastle/public/SampleData/kml/eiffel-tower-flyto.kml create mode 100644 packages/sandcastle/public/SampleData/kml/facilities/GroundStation.png create mode 100644 packages/sandcastle/public/SampleData/kml/facilities/LaserStation.png create mode 100644 packages/sandcastle/public/SampleData/kml/facilities/LaunchPad.png create mode 100644 packages/sandcastle/public/SampleData/kml/facilities/LaunchSite.png create mode 100644 packages/sandcastle/public/SampleData/kml/facilities/OpticalTrackingStation.png create mode 100644 packages/sandcastle/public/SampleData/kml/facilities/RadarStation.png create mode 100644 packages/sandcastle/public/SampleData/kml/facilities/agiLogo.svg create mode 100644 packages/sandcastle/public/SampleData/kml/facilities/facilities.kml create mode 100644 packages/sandcastle/public/SampleData/kml/gdpPerCapita2008.kmz create mode 100644 packages/sandcastle/public/SampleData/models/BoxInstanced/BoxInstanced.gltf create mode 100644 packages/sandcastle/public/SampleData/models/BoxInstanced/geometry.bin create mode 100644 packages/sandcastle/public/SampleData/models/BoxInstanced/instances.bin create mode 100644 packages/sandcastle/public/SampleData/models/BoxInstanced/metadata.bin create mode 100644 packages/sandcastle/public/SampleData/models/BoxUnlit/BoxUnlit.gltf create mode 100644 packages/sandcastle/public/SampleData/models/CesiumAir/Cesium_Air.glb create mode 100644 packages/sandcastle/public/SampleData/models/CesiumBalloon/CesiumBalloon.glb create mode 100644 packages/sandcastle/public/SampleData/models/CesiumBalloonKTX2/CesiumBalloonKTX2.glb create mode 100644 packages/sandcastle/public/SampleData/models/CesiumDrone/CesiumDrone.glb create mode 100644 packages/sandcastle/public/SampleData/models/CesiumMan/Cesium_Man.glb create mode 100644 packages/sandcastle/public/SampleData/models/CesiumMilkTruck/CesiumMilkTruck.dae create mode 100644 packages/sandcastle/public/SampleData/models/CesiumMilkTruck/CesiumMilkTruck.glb create mode 100644 packages/sandcastle/public/SampleData/models/CesiumMilkTruck/CesiumMilkTruck.jpg create mode 100644 packages/sandcastle/public/SampleData/models/DracoCompressed/0.bin create mode 100644 packages/sandcastle/public/SampleData/models/DracoCompressed/CesiumMilkTruck.gltf create mode 100644 packages/sandcastle/public/SampleData/models/DracoCompressed/CesiumMilkTruck.png create mode 100644 packages/sandcastle/public/SampleData/models/GroundVehicle/GroundVehicle.glb create mode 100644 packages/sandcastle/public/SampleData/models/ParcLeadMine/ParcLeadMine.glb create mode 100644 packages/sandcastle/public/SampleData/models/Pawns/Pawns.glb create mode 100644 packages/sandcastle/public/SampleData/models/PointCloudWave/PointCloudWave.glb create mode 100644 packages/sandcastle/public/SampleData/models/ShadowTester/Shadow_Tester.glb create mode 100644 packages/sandcastle/public/SampleData/models/ShadowTester/Shadow_Tester_2.glb create mode 100644 packages/sandcastle/public/SampleData/models/ShadowTester/Shadow_Tester_3.glb create mode 100644 packages/sandcastle/public/SampleData/models/ShadowTester/Shadow_Tester_4.glb create mode 100644 packages/sandcastle/public/SampleData/models/ShadowTester/Shadow_Tester_Point.glb create mode 100644 packages/sandcastle/public/SampleData/models/ShadowTester/Shadow_Transparent.glb create mode 100644 packages/sandcastle/public/SampleData/models/WoodTower/Wood_Tower.glb create mode 100644 packages/sandcastle/public/SampleData/ne_10m_us_states.topojson create mode 100644 packages/sandcastle/public/SampleData/population909500.json create mode 100644 packages/sandcastle/public/SampleData/simple.czml create mode 100644 packages/sandcastle/public/SampleData/simplestyles.geojson create mode 100644 packages/sandcastle/public/SampleData/smoke.png create mode 100644 packages/sandcastle/public/SampleData/snowflake_particle.png create mode 100644 packages/sandcastle/public/SampleData/tracking.czml create mode 100644 packages/sandcastle/public/Sandcastle-client.js create mode 100644 packages/sandcastle/public/Sandcastle-header.js create mode 100644 packages/sandcastle/public/Sandcastle-helpers.js create mode 100644 packages/sandcastle/public/bucket.css create mode 100644 packages/sandcastle/public/bucket.html create mode 100644 packages/sandcastle/public/bucketRaw.css create mode 100644 packages/sandcastle/public/favicon.ico create mode 100644 packages/sandcastle/public/gallery/3D Models.html create mode 100644 packages/sandcastle/public/gallery/3D Models.jpg create mode 100644 packages/sandcastle/public/gallery/Billboards.html create mode 100644 packages/sandcastle/public/gallery/Billboards.jpg create mode 100644 packages/sandcastle/public/gallery/Moon.html create mode 100644 packages/sandcastle/public/gallery/Moon.jpg create mode 100644 packages/sandcastle/public/gallery/Terrain Exaggeration.html create mode 100644 packages/sandcastle/public/gallery/Terrain Exaggeration.jpg create mode 100644 packages/sandcastle/public/images/Cesium_Logo_Color.jpg create mode 100644 packages/sandcastle/public/images/Cesium_Logo_Color_Overlay.png create mode 100644 packages/sandcastle/public/images/Cesium_Logo_ETC1S.ktx2 create mode 100644 packages/sandcastle/public/images/Cesium_Logo_UASTC.ktx2 create mode 100644 packages/sandcastle/public/images/Cesium_Logo_overlay.png create mode 100644 packages/sandcastle/public/images/bumpmap.png create mode 100644 packages/sandcastle/public/images/cesium-logomark-192.png create mode 100644 packages/sandcastle/public/images/cesium-logomark.svg create mode 100644 packages/sandcastle/public/images/cesium_maptiler/Cesium_Logo_Color.jpg create mode 100644 packages/sandcastle/public/images/cesium_maptiler/Cesium_Logo_Color.jpg.aux.xml create mode 100644 packages/sandcastle/public/images/cesium_maptiler/Cesium_Logo_Color/0/0/0.png create mode 100644 packages/sandcastle/public/images/cesium_maptiler/Cesium_Logo_Color/1/0/1.png create mode 100644 packages/sandcastle/public/images/cesium_maptiler/Cesium_Logo_Color/2/0/2.png create mode 100644 packages/sandcastle/public/images/cesium_maptiler/Cesium_Logo_Color/2/1/2.png create mode 100644 packages/sandcastle/public/images/cesium_maptiler/Cesium_Logo_Color/3/1/4.png create mode 100644 packages/sandcastle/public/images/cesium_maptiler/Cesium_Logo_Color/3/2/4.png create mode 100644 packages/sandcastle/public/images/cesium_maptiler/Cesium_Logo_Color/4/2/8.png create mode 100644 packages/sandcastle/public/images/cesium_maptiler/Cesium_Logo_Color/4/2/9.png create mode 100644 packages/sandcastle/public/images/cesium_maptiler/Cesium_Logo_Color/4/3/8.png create mode 100644 packages/sandcastle/public/images/cesium_maptiler/Cesium_Logo_Color/4/3/9.png create mode 100644 packages/sandcastle/public/images/cesium_maptiler/Cesium_Logo_Color/4/4/8.png create mode 100644 packages/sandcastle/public/images/cesium_maptiler/Cesium_Logo_Color/4/4/9.png create mode 100644 packages/sandcastle/public/images/cesium_maptiler/Cesium_Logo_Color/4/5/8.png create mode 100644 packages/sandcastle/public/images/cesium_maptiler/Cesium_Logo_Color/4/5/9.png create mode 100644 packages/sandcastle/public/images/cesium_maptiler/Cesium_Logo_Color/tilemapresource.xml create mode 100644 packages/sandcastle/public/images/checkerboard.png create mode 100644 packages/sandcastle/public/images/earthbump1k.jpg create mode 100644 packages/sandcastle/public/images/earthspec1k.jpg create mode 100644 packages/sandcastle/public/images/facility.gif create mode 100644 packages/sandcastle/public/images/gitHub16px.png create mode 100644 packages/sandcastle/public/images/normalmap.png create mode 100644 packages/sandcastle/public/images/share16px.png create mode 100644 packages/sandcastle/public/images/whiteShapes.png delete mode 100644 packages/sandcastle/public/vite.svg create mode 100644 packages/sandcastle/src/Gallery.css create mode 100644 packages/sandcastle/src/Gallery.tsx create mode 100644 packages/sandcastle/src/gallery-index.ts create mode 100644 packages/sandcastle/src/reset.css diff --git a/eslint.config.js b/eslint.config.js index ebfe5a687faf..48d57253b32f 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -19,6 +19,7 @@ export default [ "Apps/Sandcastle/jsHintOptions.js", "Apps/Sandcastle/gallery/gallery-index.js", "Apps/Sandcastle2/", + "packages/sandcastle/public/", "packages/engine/Source/Scene/GltfPipeline/**/*", "packages/engine/Source/Shaders/**/*", "Specs/jasmine/*", diff --git a/packages/sandcastle/index.html b/packages/sandcastle/index.html index e4b78eae1230..a38d41ec38a7 100644 --- a/packages/sandcastle/index.html +++ b/packages/sandcastle/index.html @@ -2,9 +2,9 @@ - + - Vite + React + TS + Sandcastle Reborn
diff --git a/packages/sandcastle/package.json b/packages/sandcastle/package.json index 3bf1931701ef..b8341c0f94ef 100644 --- a/packages/sandcastle/package.json +++ b/packages/sandcastle/package.json @@ -10,10 +10,14 @@ "preview": "vite preview" }, "dependencies": { + "@monaco-editor/react": "^4.7.0", + "monaco-editor": "^0.52.2", + "pako": "^2.1.0", "react": "^19.0.0", "react-dom": "^19.0.0" }, "devDependencies": { + "@types/pako": "^2.0.3", "@types/react": "^19.0.10", "@types/react-dom": "^19.0.4", "@vitejs/plugin-react": "^4.3.4", diff --git a/packages/sandcastle/public/Cesium.d.ts b/packages/sandcastle/public/Cesium.d.ts new file mode 100644 index 000000000000..793c9bdbef9c --- /dev/null +++ b/packages/sandcastle/public/Cesium.d.ts @@ -0,0 +1,50627 @@ +declare module "cesium" { + /** + * Enum containing WebGL Constant values by name. + * for use without an active WebGL context, or in cases where certain constants are unavailable using the WebGL context + * (For example, in [Safari 9]{@link https://github.com/CesiumGS/cesium/issues/2989}). + * + * These match the constants from the [WebGL 1.0]{@link https://www.khronos.org/registry/webgl/specs/latest/1.0/} + * and [WebGL 2.0]{@link https://www.khronos.org/registry/webgl/specs/latest/2.0/} + * specifications. + */ + export enum WebGLConstants { + DEPTH_BUFFER_BIT = 256, + STENCIL_BUFFER_BIT = 1024, + COLOR_BUFFER_BIT = 16384, + POINTS = 0, + LINES = 1, + LINE_LOOP = 2, + LINE_STRIP = 3, + TRIANGLES = 4, + TRIANGLE_STRIP = 5, + TRIANGLE_FAN = 6, + ZERO = 0, + ONE = 1, + SRC_COLOR = 768, + ONE_MINUS_SRC_COLOR = 769, + SRC_ALPHA = 770, + ONE_MINUS_SRC_ALPHA = 771, + DST_ALPHA = 772, + ONE_MINUS_DST_ALPHA = 773, + DST_COLOR = 774, + ONE_MINUS_DST_COLOR = 775, + SRC_ALPHA_SATURATE = 776, + FUNC_ADD = 32774, + BLEND_EQUATION = 32777, + BLEND_EQUATION_RGB = 32777, + BLEND_EQUATION_ALPHA = 34877, + FUNC_SUBTRACT = 32778, + FUNC_REVERSE_SUBTRACT = 32779, + BLEND_DST_RGB = 32968, + BLEND_SRC_RGB = 32969, + BLEND_DST_ALPHA = 32970, + BLEND_SRC_ALPHA = 32971, + CONSTANT_COLOR = 32769, + ONE_MINUS_CONSTANT_COLOR = 32770, + CONSTANT_ALPHA = 32771, + ONE_MINUS_CONSTANT_ALPHA = 32772, + BLEND_COLOR = 32773, + ARRAY_BUFFER = 34962, + ELEMENT_ARRAY_BUFFER = 34963, + ARRAY_BUFFER_BINDING = 34964, + ELEMENT_ARRAY_BUFFER_BINDING = 34965, + STREAM_DRAW = 35040, + STATIC_DRAW = 35044, + DYNAMIC_DRAW = 35048, + BUFFER_SIZE = 34660, + BUFFER_USAGE = 34661, + CURRENT_VERTEX_ATTRIB = 34342, + FRONT = 1028, + BACK = 1029, + FRONT_AND_BACK = 1032, + CULL_FACE = 2884, + BLEND = 3042, + DITHER = 3024, + STENCIL_TEST = 2960, + DEPTH_TEST = 2929, + SCISSOR_TEST = 3089, + POLYGON_OFFSET_FILL = 32823, + SAMPLE_ALPHA_TO_COVERAGE = 32926, + SAMPLE_COVERAGE = 32928, + NO_ERROR = 0, + INVALID_ENUM = 1280, + INVALID_VALUE = 1281, + INVALID_OPERATION = 1282, + OUT_OF_MEMORY = 1285, + CW = 2304, + CCW = 2305, + LINE_WIDTH = 2849, + ALIASED_POINT_SIZE_RANGE = 33901, + ALIASED_LINE_WIDTH_RANGE = 33902, + CULL_FACE_MODE = 2885, + FRONT_FACE = 2886, + DEPTH_RANGE = 2928, + DEPTH_WRITEMASK = 2930, + DEPTH_CLEAR_VALUE = 2931, + DEPTH_FUNC = 2932, + STENCIL_CLEAR_VALUE = 2961, + STENCIL_FUNC = 2962, + STENCIL_FAIL = 2964, + STENCIL_PASS_DEPTH_FAIL = 2965, + STENCIL_PASS_DEPTH_PASS = 2966, + STENCIL_REF = 2967, + STENCIL_VALUE_MASK = 2963, + STENCIL_WRITEMASK = 2968, + STENCIL_BACK_FUNC = 34816, + STENCIL_BACK_FAIL = 34817, + STENCIL_BACK_PASS_DEPTH_FAIL = 34818, + STENCIL_BACK_PASS_DEPTH_PASS = 34819, + STENCIL_BACK_REF = 36003, + STENCIL_BACK_VALUE_MASK = 36004, + STENCIL_BACK_WRITEMASK = 36005, + VIEWPORT = 2978, + SCISSOR_BOX = 3088, + COLOR_CLEAR_VALUE = 3106, + COLOR_WRITEMASK = 3107, + UNPACK_ALIGNMENT = 3317, + PACK_ALIGNMENT = 3333, + MAX_TEXTURE_SIZE = 3379, + MAX_VIEWPORT_DIMS = 3386, + SUBPIXEL_BITS = 3408, + RED_BITS = 3410, + GREEN_BITS = 3411, + BLUE_BITS = 3412, + ALPHA_BITS = 3413, + DEPTH_BITS = 3414, + STENCIL_BITS = 3415, + POLYGON_OFFSET_UNITS = 10752, + POLYGON_OFFSET_FACTOR = 32824, + TEXTURE_BINDING_2D = 32873, + SAMPLE_BUFFERS = 32936, + SAMPLES = 32937, + SAMPLE_COVERAGE_VALUE = 32938, + SAMPLE_COVERAGE_INVERT = 32939, + COMPRESSED_TEXTURE_FORMATS = 34467, + DONT_CARE = 4352, + FASTEST = 4353, + NICEST = 4354, + GENERATE_MIPMAP_HINT = 33170, + BYTE = 5120, + UNSIGNED_BYTE = 5121, + SHORT = 5122, + UNSIGNED_SHORT = 5123, + INT = 5124, + UNSIGNED_INT = 5125, + FLOAT = 5126, + DEPTH_COMPONENT = 6402, + ALPHA = 6406, + RGB = 6407, + RGBA = 6408, + LUMINANCE = 6409, + LUMINANCE_ALPHA = 6410, + UNSIGNED_SHORT_4_4_4_4 = 32819, + UNSIGNED_SHORT_5_5_5_1 = 32820, + UNSIGNED_SHORT_5_6_5 = 33635, + FRAGMENT_SHADER = 35632, + VERTEX_SHADER = 35633, + MAX_VERTEX_ATTRIBS = 34921, + MAX_VERTEX_UNIFORM_VECTORS = 36347, + MAX_VARYING_VECTORS = 36348, + MAX_COMBINED_TEXTURE_IMAGE_UNITS = 35661, + MAX_VERTEX_TEXTURE_IMAGE_UNITS = 35660, + MAX_TEXTURE_IMAGE_UNITS = 34930, + MAX_FRAGMENT_UNIFORM_VECTORS = 36349, + SHADER_TYPE = 35663, + DELETE_STATUS = 35712, + LINK_STATUS = 35714, + VALIDATE_STATUS = 35715, + ATTACHED_SHADERS = 35717, + ACTIVE_UNIFORMS = 35718, + ACTIVE_ATTRIBUTES = 35721, + SHADING_LANGUAGE_VERSION = 35724, + CURRENT_PROGRAM = 35725, + NEVER = 512, + LESS = 513, + EQUAL = 514, + LEQUAL = 515, + GREATER = 516, + NOTEQUAL = 517, + GEQUAL = 518, + ALWAYS = 519, + KEEP = 7680, + REPLACE = 7681, + INCR = 7682, + DECR = 7683, + INVERT = 5386, + INCR_WRAP = 34055, + DECR_WRAP = 34056, + VENDOR = 7936, + RENDERER = 7937, + VERSION = 7938, + NEAREST = 9728, + LINEAR = 9729, + NEAREST_MIPMAP_NEAREST = 9984, + LINEAR_MIPMAP_NEAREST = 9985, + NEAREST_MIPMAP_LINEAR = 9986, + LINEAR_MIPMAP_LINEAR = 9987, + TEXTURE_MAG_FILTER = 10240, + TEXTURE_MIN_FILTER = 10241, + TEXTURE_WRAP_S = 10242, + TEXTURE_WRAP_T = 10243, + TEXTURE_2D = 3553, + TEXTURE = 5890, + TEXTURE_CUBE_MAP = 34067, + TEXTURE_BINDING_CUBE_MAP = 34068, + TEXTURE_CUBE_MAP_POSITIVE_X = 34069, + TEXTURE_CUBE_MAP_NEGATIVE_X = 34070, + TEXTURE_CUBE_MAP_POSITIVE_Y = 34071, + TEXTURE_CUBE_MAP_NEGATIVE_Y = 34072, + TEXTURE_CUBE_MAP_POSITIVE_Z = 34073, + TEXTURE_CUBE_MAP_NEGATIVE_Z = 34074, + MAX_CUBE_MAP_TEXTURE_SIZE = 34076, + TEXTURE0 = 33984, + TEXTURE1 = 33985, + TEXTURE2 = 33986, + TEXTURE3 = 33987, + TEXTURE4 = 33988, + TEXTURE5 = 33989, + TEXTURE6 = 33990, + TEXTURE7 = 33991, + TEXTURE8 = 33992, + TEXTURE9 = 33993, + TEXTURE10 = 33994, + TEXTURE11 = 33995, + TEXTURE12 = 33996, + TEXTURE13 = 33997, + TEXTURE14 = 33998, + TEXTURE15 = 33999, + TEXTURE16 = 34000, + TEXTURE17 = 34001, + TEXTURE18 = 34002, + TEXTURE19 = 34003, + TEXTURE20 = 34004, + TEXTURE21 = 34005, + TEXTURE22 = 34006, + TEXTURE23 = 34007, + TEXTURE24 = 34008, + TEXTURE25 = 34009, + TEXTURE26 = 34010, + TEXTURE27 = 34011, + TEXTURE28 = 34012, + TEXTURE29 = 34013, + TEXTURE30 = 34014, + TEXTURE31 = 34015, + ACTIVE_TEXTURE = 34016, + REPEAT = 10497, + CLAMP_TO_EDGE = 33071, + MIRRORED_REPEAT = 33648, + FLOAT_VEC2 = 35664, + FLOAT_VEC3 = 35665, + FLOAT_VEC4 = 35666, + INT_VEC2 = 35667, + INT_VEC3 = 35668, + INT_VEC4 = 35669, + BOOL = 35670, + BOOL_VEC2 = 35671, + BOOL_VEC3 = 35672, + BOOL_VEC4 = 35673, + FLOAT_MAT2 = 35674, + FLOAT_MAT3 = 35675, + FLOAT_MAT4 = 35676, + SAMPLER_2D = 35678, + SAMPLER_CUBE = 35680, + VERTEX_ATTRIB_ARRAY_ENABLED = 34338, + VERTEX_ATTRIB_ARRAY_SIZE = 34339, + VERTEX_ATTRIB_ARRAY_STRIDE = 34340, + VERTEX_ATTRIB_ARRAY_TYPE = 34341, + VERTEX_ATTRIB_ARRAY_NORMALIZED = 34922, + VERTEX_ATTRIB_ARRAY_POINTER = 34373, + VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 34975, + IMPLEMENTATION_COLOR_READ_TYPE = 35738, + IMPLEMENTATION_COLOR_READ_FORMAT = 35739, + COMPILE_STATUS = 35713, + LOW_FLOAT = 36336, + MEDIUM_FLOAT = 36337, + HIGH_FLOAT = 36338, + LOW_INT = 36339, + MEDIUM_INT = 36340, + HIGH_INT = 36341, + FRAMEBUFFER = 36160, + RENDERBUFFER = 36161, + RGBA4 = 32854, + RGB5_A1 = 32855, + RGB565 = 36194, + DEPTH_COMPONENT16 = 33189, + STENCIL_INDEX = 6401, + STENCIL_INDEX8 = 36168, + DEPTH_STENCIL = 34041, + RENDERBUFFER_WIDTH = 36162, + RENDERBUFFER_HEIGHT = 36163, + RENDERBUFFER_INTERNAL_FORMAT = 36164, + RENDERBUFFER_RED_SIZE = 36176, + RENDERBUFFER_GREEN_SIZE = 36177, + RENDERBUFFER_BLUE_SIZE = 36178, + RENDERBUFFER_ALPHA_SIZE = 36179, + RENDERBUFFER_DEPTH_SIZE = 36180, + RENDERBUFFER_STENCIL_SIZE = 36181, + FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 36048, + FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 36049, + FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 36050, + FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 36051, + COLOR_ATTACHMENT0 = 36064, + DEPTH_ATTACHMENT = 36096, + STENCIL_ATTACHMENT = 36128, + DEPTH_STENCIL_ATTACHMENT = 33306, + NONE = 0, + FRAMEBUFFER_COMPLETE = 36053, + FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 36054, + FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 36055, + FRAMEBUFFER_INCOMPLETE_DIMENSIONS = 36057, + FRAMEBUFFER_UNSUPPORTED = 36061, + FRAMEBUFFER_BINDING = 36006, + RENDERBUFFER_BINDING = 36007, + MAX_RENDERBUFFER_SIZE = 34024, + INVALID_FRAMEBUFFER_OPERATION = 1286, + UNPACK_FLIP_Y_WEBGL = 37440, + UNPACK_PREMULTIPLY_ALPHA_WEBGL = 37441, + CONTEXT_LOST_WEBGL = 37442, + UNPACK_COLORSPACE_CONVERSION_WEBGL = 37443, + BROWSER_DEFAULT_WEBGL = 37444, + COMPRESSED_RGB_S3TC_DXT1_EXT = 33776, + COMPRESSED_RGBA_S3TC_DXT1_EXT = 33777, + COMPRESSED_RGBA_S3TC_DXT3_EXT = 33778, + COMPRESSED_RGBA_S3TC_DXT5_EXT = 33779, + COMPRESSED_RGB_PVRTC_4BPPV1_IMG = 35840, + COMPRESSED_RGB_PVRTC_2BPPV1_IMG = 35841, + COMPRESSED_RGBA_PVRTC_4BPPV1_IMG = 35842, + COMPRESSED_RGBA_PVRTC_2BPPV1_IMG = 35843, + COMPRESSED_RGBA_ASTC_4x4_WEBGL = 37808, + COMPRESSED_RGB_ETC1_WEBGL = 36196, + COMPRESSED_RGBA_BPTC_UNORM = 36492, + HALF_FLOAT_OES = 36193, + DOUBLE = 5130, + READ_BUFFER = 3074, + UNPACK_ROW_LENGTH = 3314, + UNPACK_SKIP_ROWS = 3315, + UNPACK_SKIP_PIXELS = 3316, + PACK_ROW_LENGTH = 3330, + PACK_SKIP_ROWS = 3331, + PACK_SKIP_PIXELS = 3332, + COLOR = 6144, + DEPTH = 6145, + STENCIL = 6146, + RED = 6403, + RGB8 = 32849, + RGBA8 = 32856, + RGB10_A2 = 32857, + TEXTURE_BINDING_3D = 32874, + UNPACK_SKIP_IMAGES = 32877, + UNPACK_IMAGE_HEIGHT = 32878, + TEXTURE_3D = 32879, + TEXTURE_WRAP_R = 32882, + MAX_3D_TEXTURE_SIZE = 32883, + UNSIGNED_INT_2_10_10_10_REV = 33640, + MAX_ELEMENTS_VERTICES = 33000, + MAX_ELEMENTS_INDICES = 33001, + TEXTURE_MIN_LOD = 33082, + TEXTURE_MAX_LOD = 33083, + TEXTURE_BASE_LEVEL = 33084, + TEXTURE_MAX_LEVEL = 33085, + MIN = 32775, + MAX = 32776, + DEPTH_COMPONENT24 = 33190, + MAX_TEXTURE_LOD_BIAS = 34045, + TEXTURE_COMPARE_MODE = 34892, + TEXTURE_COMPARE_FUNC = 34893, + CURRENT_QUERY = 34917, + QUERY_RESULT = 34918, + QUERY_RESULT_AVAILABLE = 34919, + STREAM_READ = 35041, + STREAM_COPY = 35042, + STATIC_READ = 35045, + STATIC_COPY = 35046, + DYNAMIC_READ = 35049, + DYNAMIC_COPY = 35050, + MAX_DRAW_BUFFERS = 34852, + DRAW_BUFFER0 = 34853, + DRAW_BUFFER1 = 34854, + DRAW_BUFFER2 = 34855, + DRAW_BUFFER3 = 34856, + DRAW_BUFFER4 = 34857, + DRAW_BUFFER5 = 34858, + DRAW_BUFFER6 = 34859, + DRAW_BUFFER7 = 34860, + DRAW_BUFFER8 = 34861, + DRAW_BUFFER9 = 34862, + DRAW_BUFFER10 = 34863, + DRAW_BUFFER11 = 34864, + DRAW_BUFFER12 = 34865, + DRAW_BUFFER13 = 34866, + DRAW_BUFFER14 = 34867, + DRAW_BUFFER15 = 34868, + MAX_FRAGMENT_UNIFORM_COMPONENTS = 35657, + MAX_VERTEX_UNIFORM_COMPONENTS = 35658, + SAMPLER_3D = 35679, + SAMPLER_2D_SHADOW = 35682, + FRAGMENT_SHADER_DERIVATIVE_HINT = 35723, + PIXEL_PACK_BUFFER = 35051, + PIXEL_UNPACK_BUFFER = 35052, + PIXEL_PACK_BUFFER_BINDING = 35053, + PIXEL_UNPACK_BUFFER_BINDING = 35055, + FLOAT_MAT2x3 = 35685, + FLOAT_MAT2x4 = 35686, + FLOAT_MAT3x2 = 35687, + FLOAT_MAT3x4 = 35688, + FLOAT_MAT4x2 = 35689, + FLOAT_MAT4x3 = 35690, + SRGB = 35904, + SRGB8 = 35905, + SRGB8_ALPHA8 = 35907, + COMPARE_REF_TO_TEXTURE = 34894, + RGBA32F = 34836, + RGB32F = 34837, + RGBA16F = 34842, + RGB16F = 34843, + VERTEX_ATTRIB_ARRAY_INTEGER = 35069, + MAX_ARRAY_TEXTURE_LAYERS = 35071, + MIN_PROGRAM_TEXEL_OFFSET = 35076, + MAX_PROGRAM_TEXEL_OFFSET = 35077, + MAX_VARYING_COMPONENTS = 35659, + TEXTURE_2D_ARRAY = 35866, + TEXTURE_BINDING_2D_ARRAY = 35869, + R11F_G11F_B10F = 35898, + UNSIGNED_INT_10F_11F_11F_REV = 35899, + RGB9_E5 = 35901, + UNSIGNED_INT_5_9_9_9_REV = 35902, + TRANSFORM_FEEDBACK_BUFFER_MODE = 35967, + MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS = 35968, + TRANSFORM_FEEDBACK_VARYINGS = 35971, + TRANSFORM_FEEDBACK_BUFFER_START = 35972, + TRANSFORM_FEEDBACK_BUFFER_SIZE = 35973, + TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN = 35976, + RASTERIZER_DISCARD = 35977, + MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS = 35978, + MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS = 35979, + INTERLEAVED_ATTRIBS = 35980, + SEPARATE_ATTRIBS = 35981, + TRANSFORM_FEEDBACK_BUFFER = 35982, + TRANSFORM_FEEDBACK_BUFFER_BINDING = 35983, + RGBA32UI = 36208, + RGB32UI = 36209, + RGBA16UI = 36214, + RGB16UI = 36215, + RGBA8UI = 36220, + RGB8UI = 36221, + RGBA32I = 36226, + RGB32I = 36227, + RGBA16I = 36232, + RGB16I = 36233, + RGBA8I = 36238, + RGB8I = 36239, + RED_INTEGER = 36244, + RGB_INTEGER = 36248, + RGBA_INTEGER = 36249, + SAMPLER_2D_ARRAY = 36289, + SAMPLER_2D_ARRAY_SHADOW = 36292, + SAMPLER_CUBE_SHADOW = 36293, + UNSIGNED_INT_VEC2 = 36294, + UNSIGNED_INT_VEC3 = 36295, + UNSIGNED_INT_VEC4 = 36296, + INT_SAMPLER_2D = 36298, + INT_SAMPLER_3D = 36299, + INT_SAMPLER_CUBE = 36300, + INT_SAMPLER_2D_ARRAY = 36303, + UNSIGNED_INT_SAMPLER_2D = 36306, + UNSIGNED_INT_SAMPLER_3D = 36307, + UNSIGNED_INT_SAMPLER_CUBE = 36308, + UNSIGNED_INT_SAMPLER_2D_ARRAY = 36311, + DEPTH_COMPONENT32F = 36012, + DEPTH32F_STENCIL8 = 36013, + FLOAT_32_UNSIGNED_INT_24_8_REV = 36269, + FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING = 33296, + FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE = 33297, + FRAMEBUFFER_ATTACHMENT_RED_SIZE = 33298, + FRAMEBUFFER_ATTACHMENT_GREEN_SIZE = 33299, + FRAMEBUFFER_ATTACHMENT_BLUE_SIZE = 33300, + FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE = 33301, + FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE = 33302, + FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE = 33303, + FRAMEBUFFER_DEFAULT = 33304, + UNSIGNED_INT_24_8 = 34042, + DEPTH24_STENCIL8 = 35056, + UNSIGNED_NORMALIZED = 35863, + DRAW_FRAMEBUFFER_BINDING = 36006, + READ_FRAMEBUFFER = 36008, + DRAW_FRAMEBUFFER = 36009, + READ_FRAMEBUFFER_BINDING = 36010, + RENDERBUFFER_SAMPLES = 36011, + FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER = 36052, + MAX_COLOR_ATTACHMENTS = 36063, + COLOR_ATTACHMENT1 = 36065, + COLOR_ATTACHMENT2 = 36066, + COLOR_ATTACHMENT3 = 36067, + COLOR_ATTACHMENT4 = 36068, + COLOR_ATTACHMENT5 = 36069, + COLOR_ATTACHMENT6 = 36070, + COLOR_ATTACHMENT7 = 36071, + COLOR_ATTACHMENT8 = 36072, + COLOR_ATTACHMENT9 = 36073, + COLOR_ATTACHMENT10 = 36074, + COLOR_ATTACHMENT11 = 36075, + COLOR_ATTACHMENT12 = 36076, + COLOR_ATTACHMENT13 = 36077, + COLOR_ATTACHMENT14 = 36078, + COLOR_ATTACHMENT15 = 36079, + FRAMEBUFFER_INCOMPLETE_MULTISAMPLE = 36182, + MAX_SAMPLES = 36183, + HALF_FLOAT = 5131, + RG = 33319, + RG_INTEGER = 33320, + R8 = 33321, + RG8 = 33323, + R16F = 33325, + R32F = 33326, + RG16F = 33327, + RG32F = 33328, + R8I = 33329, + R8UI = 33330, + R16I = 33331, + R16UI = 33332, + R32I = 33333, + R32UI = 33334, + RG8I = 33335, + RG8UI = 33336, + RG16I = 33337, + RG16UI = 33338, + RG32I = 33339, + RG32UI = 33340, + VERTEX_ARRAY_BINDING = 34229, + R8_SNORM = 36756, + RG8_SNORM = 36757, + RGB8_SNORM = 36758, + RGBA8_SNORM = 36759, + SIGNED_NORMALIZED = 36764, + COPY_READ_BUFFER = 36662, + COPY_WRITE_BUFFER = 36663, + COPY_READ_BUFFER_BINDING = 36662, + COPY_WRITE_BUFFER_BINDING = 36663, + UNIFORM_BUFFER = 35345, + UNIFORM_BUFFER_BINDING = 35368, + UNIFORM_BUFFER_START = 35369, + UNIFORM_BUFFER_SIZE = 35370, + MAX_VERTEX_UNIFORM_BLOCKS = 35371, + MAX_FRAGMENT_UNIFORM_BLOCKS = 35373, + MAX_COMBINED_UNIFORM_BLOCKS = 35374, + MAX_UNIFORM_BUFFER_BINDINGS = 35375, + MAX_UNIFORM_BLOCK_SIZE = 35376, + MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS = 35377, + MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS = 35379, + UNIFORM_BUFFER_OFFSET_ALIGNMENT = 35380, + ACTIVE_UNIFORM_BLOCKS = 35382, + UNIFORM_TYPE = 35383, + UNIFORM_SIZE = 35384, + UNIFORM_BLOCK_INDEX = 35386, + UNIFORM_OFFSET = 35387, + UNIFORM_ARRAY_STRIDE = 35388, + UNIFORM_MATRIX_STRIDE = 35389, + UNIFORM_IS_ROW_MAJOR = 35390, + UNIFORM_BLOCK_BINDING = 35391, + UNIFORM_BLOCK_DATA_SIZE = 35392, + UNIFORM_BLOCK_ACTIVE_UNIFORMS = 35394, + UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES = 35395, + UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER = 35396, + UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER = 35398, + INVALID_INDEX = 4294967295, + MAX_VERTEX_OUTPUT_COMPONENTS = 37154, + MAX_FRAGMENT_INPUT_COMPONENTS = 37157, + MAX_SERVER_WAIT_TIMEOUT = 37137, + OBJECT_TYPE = 37138, + SYNC_CONDITION = 37139, + SYNC_STATUS = 37140, + SYNC_FLAGS = 37141, + SYNC_FENCE = 37142, + SYNC_GPU_COMMANDS_COMPLETE = 37143, + UNSIGNALED = 37144, + SIGNALED = 37145, + ALREADY_SIGNALED = 37146, + TIMEOUT_EXPIRED = 37147, + CONDITION_SATISFIED = 37148, + WAIT_FAILED = 37149, + SYNC_FLUSH_COMMANDS_BIT = 1, + VERTEX_ATTRIB_ARRAY_DIVISOR = 35070, + ANY_SAMPLES_PASSED = 35887, + ANY_SAMPLES_PASSED_CONSERVATIVE = 36202, + SAMPLER_BINDING = 35097, + RGB10_A2UI = 36975, + INT_2_10_10_10_REV = 36255, + TRANSFORM_FEEDBACK = 36386, + TRANSFORM_FEEDBACK_PAUSED = 36387, + TRANSFORM_FEEDBACK_ACTIVE = 36388, + TRANSFORM_FEEDBACK_BINDING = 36389, + COMPRESSED_R11_EAC = 37488, + COMPRESSED_SIGNED_R11_EAC = 37489, + COMPRESSED_RG11_EAC = 37490, + COMPRESSED_SIGNED_RG11_EAC = 37491, + COMPRESSED_RGB8_ETC2 = 37492, + COMPRESSED_SRGB8_ETC2 = 37493, + COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 37494, + COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 37495, + COMPRESSED_RGBA8_ETC2_EAC = 37496, + COMPRESSED_SRGB8_ALPHA8_ETC2_EAC = 37497, + TEXTURE_IMMUTABLE_FORMAT = 37167, + MAX_ELEMENT_INDEX = 36203, + TEXTURE_IMMUTABLE_LEVELS = 33503, + MAX_TEXTURE_MAX_ANISOTROPY_EXT = 34047, + } + + export namespace ArcGISTiledElevationTerrainProvider { + /** + * Initialization options for the ArcGISTiledElevationTerrainProvider constructor + * @property [token] - The authorization token to use to connect to the service. + * @property [ellipsoid = Ellipsoid.default] - The ellipsoid. If the tilingScheme is specified, + * this parameter is ignored and the tiling scheme's ellipsoid is used instead. + * If neither parameter is specified, the default ellipsoid is used. + */ + type ConstructorOptions = { + token?: string; + ellipsoid?: Ellipsoid; + }; + } + + /** + *
+ * To construct a CesiumTerrainProvider, call {@link ArcGISTiledElevationTerrainProvider.fromUrl}. Do not call the constructor directly. + *
+ * + * A {@link TerrainProvider} that produces terrain geometry by tessellating height maps + * retrieved from Elevation Tiles of an an ArcGIS ImageService. + * @example + * const terrainProvider = await Cesium.ArcGISTiledElevationTerrainProvider.fromUrl("https://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer", { + * token: "KED1aF_I4UzXOHy3BnhwyBHU4l5oY6rO6walkmHoYqGp4XyIWUd5YZUC1ZrLAzvV40pR6gBXQayh0eFA8m6vPg.." + * }); + * viewer.terrainProvider = terrainProvider; + * @param [options] - A url or an object describing initialization options + */ + export class ArcGISTiledElevationTerrainProvider { + constructor(options?: CesiumTerrainProvider.ConstructorOptions); + /** + * Gets an event that is raised when the terrain provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + */ + readonly errorEvent: Event; + /** + * Gets the credit to display when this terrain provider is active. Typically this is used to credit + * the source of the terrain. + */ + readonly credit: Credit; + /** + * Gets the tiling scheme used by this provider. + */ + readonly tilingScheme: GeographicTilingScheme; + /** + * Gets a value indicating whether or not the provider includes a water mask. The water mask + * indicates which areas of the globe are water rather than land, so they can be rendered + * as a reflective surface with animated waves. + */ + readonly hasWaterMask: boolean; + /** + * Gets a value indicating whether or not the requested tiles include vertex normals. + */ + readonly hasVertexNormals: boolean; + /** + * Gets an object that can be used to determine availability of terrain from this provider, such as + * at points and in rectangles. This property may be undefined if availability + * information is not available. + */ + readonly availability: TileAvailability; + /** + * Creates a {@link TerrainProvider} that produces terrain geometry by tessellating height maps + * retrieved from Elevation Tiles of an an ArcGIS ImageService. + * @example + * const terrainProvider = await Cesium.ArcGISTiledElevationTerrainProvider.fromUrl("https://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer", { + * token: "KED1aF_I4UzXOHy3BnhwyBHU4l5oY6rO6walkmHoYqGp4XyIWUd5YZUC1ZrLAzvV40pR6gBXQayh0eFA8m6vPg.." + * }); + * viewer.terrainProvider = terrainProvider; + * @param url - The URL of the ArcGIS ImageServer service. + * @param [options] - A url or an object describing initialization options. + */ + static fromUrl( + url: Resource | string | Promise | Promise, + options?: ArcGISTiledElevationTerrainProvider.ConstructorOptions, + ): Promise; + /** + * Requests the geometry for a given tile. The result includes terrain + * data and indicates that all child tiles are available. + * @param x - The X coordinate of the tile for which to request geometry. + * @param y - The Y coordinate of the tile for which to request geometry. + * @param level - The level of the tile for which to request geometry. + * @param [request] - The request object. Intended for internal use only. + * @returns A promise for the requested geometry. If this method + * returns undefined instead of a promise, it is an indication that too many requests are already + * pending and the request will be retried later. + */ + requestTileGeometry( + x: number, + y: number, + level: number, + request?: Request, + ): Promise | undefined; + /** + * Gets the maximum geometric error allowed in a tile at a given level. + * @param level - The tile level for which to get the maximum geometric error. + * @returns The maximum geometric error. + */ + getLevelMaximumGeometricError(level: number): number; + /** + * Determines whether data for a tile is available to be loaded. + * @param x - The X coordinate of the tile for which to request geometry. + * @param y - The Y coordinate of the tile for which to request geometry. + * @param level - The level of the tile for which to request geometry. + * @returns Undefined if not supported, otherwise true or false. + */ + getTileDataAvailable( + x: number, + y: number, + level: number, + ): boolean | undefined; + /** + * Makes sure we load availability data for a tile + * @param x - The X coordinate of the tile for which to request geometry. + * @param y - The Y coordinate of the tile for which to request geometry. + * @param level - The level of the tile for which to request geometry. + * @returns This provider does not support loading availability. + */ + loadTileDataAvailability(x: number, y: number, level: number): undefined; + } + + /** + * ArcType defines the path that should be taken connecting vertices. + */ + export enum ArcType { + /** + * Straight line that does not conform to the surface of the ellipsoid. + */ + NONE = 0, + /** + * Follow geodesic path. + */ + GEODESIC = 1, + /** + * Follow rhumb or loxodrome path. + */ + RHUMB = 2, + } + + /** + * A collection of key-value pairs that is stored as a hash for easy + * lookup but also provides an array for fast iteration. + */ + export class AssociativeArray { + constructor(); + /** + * Gets the number of items in the collection. + */ + length: number; + /** + * Gets an unordered array of all values in the collection. + * This is a live array that will automatically reflect the values in the collection, + * it should not be modified directly. + */ + values: any[]; + /** + * Determines if the provided key is in the array. + * @param key - The key to check. + * @returns true if the key is in the array, false otherwise. + */ + contains(key: string | number): boolean; + /** + * Associates the provided key with the provided value. If the key already + * exists, it is overwritten with the new value. + * @param key - A unique identifier. + * @param value - The value to associate with the provided key. + */ + set(key: string | number, value: any): void; + /** + * Retrieves the value associated with the provided key. + * @param key - The key whose value is to be retrieved. + * @returns The associated value, or undefined if the key does not exist in the collection. + */ + get(key: string | number): any; + /** + * Removes a key-value pair from the collection. + * @param key - The key to be removed. + * @returns True if it was removed, false if the key was not in the collection. + */ + remove(key: string | number): boolean; + /** + * Clears the collection. + */ + removeAll(): void; + } + + /** + * Creates an instance of an AxisAlignedBoundingBox from the minimum and maximum points along the x, y, and z axes. + * @param [minimum = Cartesian3.ZERO] - The minimum point along the x, y, and z axes. + * @param [maximum = Cartesian3.ZERO] - The maximum point along the x, y, and z axes. + * @param [center] - The center of the box; automatically computed if not supplied. + */ + export class AxisAlignedBoundingBox { + constructor( + minimum?: Cartesian3, + maximum?: Cartesian3, + center?: Cartesian3, + ); + /** + * The minimum point defining the bounding box. + */ + minimum: Cartesian3; + /** + * The maximum point defining the bounding box. + */ + maximum: Cartesian3; + /** + * The center point of the bounding box. + */ + center: Cartesian3; + /** + * Creates an instance of an AxisAlignedBoundingBox from its corners. + * @example + * // Compute an axis aligned bounding box from the two corners. + * const box = Cesium.AxisAlignedBoundingBox.fromCorners(new Cesium.Cartesian3(-1, -1, -1), new Cesium.Cartesian3(1, 1, 1)); + * @param minimum - The minimum point along the x, y, and z axes. + * @param maximum - The maximum point along the x, y, and z axes. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new AxisAlignedBoundingBox instance if one was not provided. + */ + static fromCorners( + minimum: Cartesian3, + maximum: Cartesian3, + result?: AxisAlignedBoundingBox, + ): AxisAlignedBoundingBox; + /** + * Computes an instance of an AxisAlignedBoundingBox. The box is determined by + * finding the points spaced the farthest apart on the x, y, and z axes. + * @example + * // Compute an axis aligned bounding box enclosing two points. + * const box = Cesium.AxisAlignedBoundingBox.fromPoints([new Cesium.Cartesian3(2, 0, 0), new Cesium.Cartesian3(-2, 0, 0)]); + * @param positions - List of points that the bounding box will enclose. Each point must have a x, y, and z properties. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new AxisAlignedBoundingBox instance if one was not provided. + */ + static fromPoints( + positions: Cartesian3[], + result?: AxisAlignedBoundingBox, + ): AxisAlignedBoundingBox; + /** + * Duplicates a AxisAlignedBoundingBox instance. + * @param box - The bounding box to duplicate. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new AxisAlignedBoundingBox instance if none was provided. (Returns undefined if box is undefined) + */ + static clone( + box: AxisAlignedBoundingBox, + result?: AxisAlignedBoundingBox, + ): AxisAlignedBoundingBox; + /** + * Compares the provided AxisAlignedBoundingBox componentwise and returns + * true if they are equal, false otherwise. + * @param [left] - The first AxisAlignedBoundingBox. + * @param [right] - The second AxisAlignedBoundingBox. + * @returns true if left and right are equal, false otherwise. + */ + static equals( + left?: AxisAlignedBoundingBox, + right?: AxisAlignedBoundingBox, + ): boolean; + /** + * Determines which side of a plane a box is located. + * @param box - The bounding box to test. + * @param plane - The plane to test against. + * @returns {@link Intersect.INSIDE} if the entire box is on the side of the plane + * the normal is pointing, {@link Intersect.OUTSIDE} if the entire box is + * on the opposite side, and {@link Intersect.INTERSECTING} if the box + * intersects the plane. + */ + static intersectPlane(box: AxisAlignedBoundingBox, plane: Plane): Intersect; + /** + * Duplicates this AxisAlignedBoundingBox instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new AxisAlignedBoundingBox instance if one was not provided. + */ + clone(result?: AxisAlignedBoundingBox): AxisAlignedBoundingBox; + /** + * Determines which side of a plane this box is located. + * @param plane - The plane to test against. + * @returns {@link Intersect.INSIDE} if the entire box is on the side of the plane + * the normal is pointing, {@link Intersect.OUTSIDE} if the entire box is + * on the opposite side, and {@link Intersect.INTERSECTING} if the box + * intersects the plane. + */ + intersectPlane(plane: Plane): Intersect; + /** + * Compares this AxisAlignedBoundingBox against the provided AxisAlignedBoundingBox componentwise and returns + * true if they are equal, false otherwise. + * @param [right] - The right hand side AxisAlignedBoundingBox. + * @returns true if they are equal, false otherwise. + */ + equals(right?: AxisAlignedBoundingBox): boolean; + } + + /** + * Provides geocoding through Bing Maps. + * @param options - Object with the following properties: + * @param options.key - A key to use with the Bing Maps geocoding service + * @param [options.culture] - A Bing Maps {@link https://docs.microsoft.com/en-us/bingmaps/rest-services/common-parameters-and-types/supported-culture-codes|Culture Code} to return results in a specific culture and language. + */ + export class BingMapsGeocoderService { + constructor(options: { key: string; culture?: string }); + /** + * The URL endpoint for the Bing geocoder service + */ + readonly url: string; + /** + * The key for the Bing geocoder service + */ + readonly key: string; + /** + * Gets the credit to display after a geocode is performed. Typically this is used to credit + * the geocoder service. + */ + readonly credit: Credit | undefined; + /** + * @param query - The query to be sent to the geocoder service + */ + geocode(query: string): Promise; + } + + /** + * A bounding rectangle given by a corner, width and height. + * @param [x = 0.0] - The x coordinate of the rectangle. + * @param [y = 0.0] - The y coordinate of the rectangle. + * @param [width = 0.0] - The width of the rectangle. + * @param [height = 0.0] - The height of the rectangle. + */ + export class BoundingRectangle { + constructor(x?: number, y?: number, width?: number, height?: number); + /** + * The x coordinate of the rectangle. + */ + x: number; + /** + * The y coordinate of the rectangle. + */ + y: number; + /** + * The width of the rectangle. + */ + width: number; + /** + * The height of the rectangle. + */ + height: number; + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: BoundingRectangle, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new BoundingRectangle instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: BoundingRectangle, + ): BoundingRectangle; + /** + * Computes a bounding rectangle enclosing the list of 2D points. + * The rectangle is oriented with the corner at the bottom left. + * @param positions - List of points that the bounding rectangle will enclose. Each point must have x and y properties. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingRectangle instance if one was not provided. + */ + static fromPoints( + positions: Cartesian2[], + result?: BoundingRectangle, + ): BoundingRectangle; + /** + * Computes a bounding rectangle from a rectangle. + * @param rectangle - The valid rectangle used to create a bounding rectangle. + * @param [projection = GeographicProjection] - The projection used to project the rectangle into 2D. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingRectangle instance if one was not provided. + */ + static fromRectangle( + rectangle: Rectangle, + projection?: any, + result?: BoundingRectangle, + ): BoundingRectangle; + /** + * Duplicates a BoundingRectangle instance. + * @param rectangle - The bounding rectangle to duplicate. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingRectangle instance if one was not provided. (Returns undefined if rectangle is undefined) + */ + static clone( + rectangle: BoundingRectangle, + result?: BoundingRectangle, + ): BoundingRectangle; + /** + * Computes a bounding rectangle that is the union of the left and right bounding rectangles. + * @param left - A rectangle to enclose in bounding rectangle. + * @param right - A rectangle to enclose in a bounding rectangle. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingRectangle instance if one was not provided. + */ + static union( + left: BoundingRectangle, + right: BoundingRectangle, + result?: BoundingRectangle, + ): BoundingRectangle; + /** + * Computes a bounding rectangle by enlarging the provided rectangle until it contains the provided point. + * @param rectangle - A rectangle to expand. + * @param point - A point to enclose in a bounding rectangle. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingRectangle instance if one was not provided. + */ + static expand( + rectangle: BoundingRectangle, + point: Cartesian2, + result?: BoundingRectangle, + ): BoundingRectangle; + /** + * Determines if two rectangles intersect. + * @param left - A rectangle to check for intersection. + * @param right - The other rectangle to check for intersection. + * @returns Intersect.INTERSECTING if the rectangles intersect, Intersect.OUTSIDE otherwise. + */ + static intersect( + left: BoundingRectangle, + right: BoundingRectangle, + ): Intersect; + /** + * Compares the provided BoundingRectangles componentwise and returns + * true if they are equal, false otherwise. + * @param [left] - The first BoundingRectangle. + * @param [right] - The second BoundingRectangle. + * @returns true if left and right are equal, false otherwise. + */ + static equals(left?: BoundingRectangle, right?: BoundingRectangle): boolean; + /** + * Duplicates this BoundingRectangle instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingRectangle instance if one was not provided. + */ + clone(result?: BoundingRectangle): BoundingRectangle; + /** + * Determines if this rectangle intersects with another. + * @param right - A rectangle to check for intersection. + * @returns Intersect.INTERSECTING if the rectangles intersect, Intersect.OUTSIDE otherwise. + */ + intersect(right: BoundingRectangle): Intersect; + /** + * Compares this BoundingRectangle against the provided BoundingRectangle componentwise and returns + * true if they are equal, false otherwise. + * @param [right] - The right hand side BoundingRectangle. + * @returns true if they are equal, false otherwise. + */ + equals(right?: BoundingRectangle): boolean; + } + + /** + * A bounding sphere with a center and a radius. + * @param [center = Cartesian3.ZERO] - The center of the bounding sphere. + * @param [radius = 0.0] - The radius of the bounding sphere. + */ + export class BoundingSphere { + constructor(center?: Cartesian3, radius?: number); + /** + * The center point of the sphere. + */ + center: Cartesian3; + /** + * The radius of the sphere. + */ + radius: number; + /** + * Computes a tight-fitting bounding sphere enclosing a list of 3D Cartesian points. + * The bounding sphere is computed by running two algorithms, a naive algorithm and + * Ritter's algorithm. The smaller of the two spheres is used to ensure a tight fit. + * @param [positions] - An array of points that the bounding sphere will enclose. Each point must have x, y, and z properties. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingSphere instance if one was not provided. + */ + static fromPoints( + positions?: Cartesian3[], + result?: BoundingSphere, + ): BoundingSphere; + /** + * Computes a bounding sphere from a rectangle projected in 2D. + * @param [rectangle] - The rectangle around which to create a bounding sphere. + * @param [projection = GeographicProjection] - The projection used to project the rectangle into 2D. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingSphere instance if none was provided. + */ + static fromRectangle2D( + rectangle?: Rectangle, + projection?: any, + result?: BoundingSphere, + ): BoundingSphere; + /** + * Computes a bounding sphere from a rectangle projected in 2D. The bounding sphere accounts for the + * object's minimum and maximum heights over the rectangle. + * @param [rectangle] - The rectangle around which to create a bounding sphere. + * @param [projection = GeographicProjection] - The projection used to project the rectangle into 2D. + * @param [minimumHeight = 0.0] - The minimum height over the rectangle. + * @param [maximumHeight = 0.0] - The maximum height over the rectangle. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingSphere instance if none was provided. + */ + static fromRectangleWithHeights2D( + rectangle?: Rectangle, + projection?: any, + minimumHeight?: number, + maximumHeight?: number, + result?: BoundingSphere, + ): BoundingSphere; + /** + * Computes a bounding sphere from a rectangle in 3D. The bounding sphere is created using a subsample of points + * on the ellipsoid and contained in the rectangle. It may not be accurate for all rectangles on all types of ellipsoids. + * @param [rectangle] - The valid rectangle used to create a bounding sphere. + * @param [ellipsoid = Ellipsoid.default] - The ellipsoid used to determine positions of the rectangle. + * @param [surfaceHeight = 0.0] - The height above the surface of the ellipsoid. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingSphere instance if none was provided. + */ + static fromRectangle3D( + rectangle?: Rectangle, + ellipsoid?: Ellipsoid, + surfaceHeight?: number, + result?: BoundingSphere, + ): BoundingSphere; + /** + * Computes a tight-fitting bounding sphere enclosing a list of 3D points, where the points are + * stored in a flat array in X, Y, Z, order. The bounding sphere is computed by running two + * algorithms, a naive algorithm and Ritter's algorithm. The smaller of the two spheres is used to + * ensure a tight fit. + * @example + * // Compute the bounding sphere from 3 positions, each specified relative to a center. + * // In addition to the X, Y, and Z coordinates, the points array contains two additional + * // elements per point which are ignored for the purpose of computing the bounding sphere. + * const center = new Cesium.Cartesian3(1.0, 2.0, 3.0); + * const points = [1.0, 2.0, 3.0, 0.1, 0.2, + * 4.0, 5.0, 6.0, 0.1, 0.2, + * 7.0, 8.0, 9.0, 0.1, 0.2]; + * const sphere = Cesium.BoundingSphere.fromVertices(points, center, 5); + * @param [positions] - An array of points that the bounding sphere will enclose. Each point + * is formed from three elements in the array in the order X, Y, Z. + * @param [center = Cartesian3.ZERO] - The position to which the positions are relative, which need not be the + * origin of the coordinate system. This is useful when the positions are to be used for + * relative-to-center (RTC) rendering. + * @param [stride = 3] - The number of array elements per vertex. It must be at least 3, but it may + * be higher. Regardless of the value of this parameter, the X coordinate of the first position + * is at array index 0, the Y coordinate is at array index 1, and the Z coordinate is at array index + * 2. When stride is 3, the X coordinate of the next position then begins at array index 3. If + * the stride is 5, however, two array elements are skipped and the next position begins at array + * index 5. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingSphere instance if one was not provided. + */ + static fromVertices( + positions?: number[], + center?: Cartesian3, + stride?: number, + result?: BoundingSphere, + ): BoundingSphere; + /** + * Computes a tight-fitting bounding sphere enclosing a list of EncodedCartesian3s, where the points are + * stored in parallel flat arrays in X, Y, Z, order. The bounding sphere is computed by running two + * algorithms, a naive algorithm and Ritter's algorithm. The smaller of the two spheres is used to + * ensure a tight fit. + * @param [positionsHigh] - An array of high bits of the encoded cartesians that the bounding sphere will enclose. Each point + * is formed from three elements in the array in the order X, Y, Z. + * @param [positionsLow] - An array of low bits of the encoded cartesians that the bounding sphere will enclose. Each point + * is formed from three elements in the array in the order X, Y, Z. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingSphere instance if one was not provided. + */ + static fromEncodedCartesianVertices( + positionsHigh?: number[], + positionsLow?: number[], + result?: BoundingSphere, + ): BoundingSphere; + /** + * Computes a bounding sphere from the corner points of an axis-aligned bounding box. The sphere + * tightly and fully encompasses the box. + * @example + * // Create a bounding sphere around the unit cube + * const sphere = Cesium.BoundingSphere.fromCornerPoints(new Cesium.Cartesian3(-0.5, -0.5, -0.5), new Cesium.Cartesian3(0.5, 0.5, 0.5)); + * @param [corner] - The minimum height over the rectangle. + * @param [oppositeCorner] - The maximum height over the rectangle. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingSphere instance if none was provided. + */ + static fromCornerPoints( + corner?: Cartesian3, + oppositeCorner?: Cartesian3, + result?: BoundingSphere, + ): BoundingSphere; + /** + * Creates a bounding sphere encompassing an ellipsoid. + * @example + * const boundingSphere = Cesium.BoundingSphere.fromEllipsoid(ellipsoid); + * @param ellipsoid - The ellipsoid around which to create a bounding sphere. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingSphere instance if none was provided. + */ + static fromEllipsoid( + ellipsoid: Ellipsoid, + result?: BoundingSphere, + ): BoundingSphere; + /** + * Computes a tight-fitting bounding sphere enclosing the provided array of bounding spheres. + * @param [boundingSpheres] - The array of bounding spheres. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingSphere instance if none was provided. + */ + static fromBoundingSpheres( + boundingSpheres?: BoundingSphere[], + result?: BoundingSphere, + ): BoundingSphere; + /** + * Computes a tight-fitting bounding sphere enclosing the provided oriented bounding box. + * @param orientedBoundingBox - The oriented bounding box. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingSphere instance if none was provided. + */ + static fromOrientedBoundingBox( + orientedBoundingBox: OrientedBoundingBox, + result?: BoundingSphere, + ): BoundingSphere; + /** + * Computes a tight-fitting bounding sphere enclosing the provided affine transformation. + * @param transformation - The affine transformation. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingSphere instance if none was provided. + */ + static fromTransformation( + transformation: Matrix4, + result?: BoundingSphere, + ): BoundingSphere; + /** + * Duplicates a BoundingSphere instance. + * @param sphere - The bounding sphere to duplicate. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingSphere instance if none was provided. (Returns undefined if sphere is undefined) + */ + static clone( + sphere: BoundingSphere, + result?: BoundingSphere, + ): BoundingSphere; + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: BoundingSphere, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new BoundingSphere instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: BoundingSphere, + ): BoundingSphere; + /** + * Computes a bounding sphere that contains both the left and right bounding spheres. + * @param left - A sphere to enclose in a bounding sphere. + * @param right - A sphere to enclose in a bounding sphere. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingSphere instance if none was provided. + */ + static union( + left: BoundingSphere, + right: BoundingSphere, + result?: BoundingSphere, + ): BoundingSphere; + /** + * Computes a bounding sphere by enlarging the provided sphere to contain the provided point. + * @param sphere - A sphere to expand. + * @param point - A point to enclose in a bounding sphere. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingSphere instance if none was provided. + */ + static expand( + sphere: BoundingSphere, + point: Cartesian3, + result?: BoundingSphere, + ): BoundingSphere; + /** + * Determines which side of a plane a sphere is located. + * @param sphere - The bounding sphere to test. + * @param plane - The plane to test against. + * @returns {@link Intersect.INSIDE} if the entire sphere is on the side of the plane + * the normal is pointing, {@link Intersect.OUTSIDE} if the entire sphere is + * on the opposite side, and {@link Intersect.INTERSECTING} if the sphere + * intersects the plane. + */ + static intersectPlane(sphere: BoundingSphere, plane: Plane): Intersect; + /** + * Applies a 4x4 affine transformation matrix to a bounding sphere. + * @param sphere - The bounding sphere to apply the transformation to. + * @param transform - The transformation matrix to apply to the bounding sphere. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingSphere instance if none was provided. + */ + static transform( + sphere: BoundingSphere, + transform: Matrix4, + result?: BoundingSphere, + ): BoundingSphere; + /** + * Computes the estimated distance squared from the closest point on a bounding sphere to a point. + * @example + * // Sort bounding spheres from back to front + * spheres.sort(function(a, b) { + * return Cesium.BoundingSphere.distanceSquaredTo(b, camera.positionWC) - Cesium.BoundingSphere.distanceSquaredTo(a, camera.positionWC); + * }); + * @param sphere - The sphere. + * @param cartesian - The point + * @returns The distance squared from the bounding sphere to the point. Returns 0 if the point is inside the sphere. + */ + static distanceSquaredTo( + sphere: BoundingSphere, + cartesian: Cartesian3, + ): number; + /** + * Applies a 4x4 affine transformation matrix to a bounding sphere where there is no scale + * The transformation matrix is not verified to have a uniform scale of 1. + * This method is faster than computing the general bounding sphere transform using {@link BoundingSphere.transform}. + * @example + * const modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(positionOnEllipsoid); + * const boundingSphere = new Cesium.BoundingSphere(); + * const newBoundingSphere = Cesium.BoundingSphere.transformWithoutScale(boundingSphere, modelMatrix); + * @param sphere - The bounding sphere to apply the transformation to. + * @param transform - The transformation matrix to apply to the bounding sphere. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingSphere instance if none was provided. + */ + static transformWithoutScale( + sphere: BoundingSphere, + transform: Matrix4, + result?: BoundingSphere, + ): BoundingSphere; + /** + * The distances calculated by the vector from the center of the bounding sphere to position projected onto direction + * plus/minus the radius of the bounding sphere. + *
+ * If you imagine the infinite number of planes with normal direction, this computes the smallest distance to the + * closest and farthest planes from position that intersect the bounding sphere. + * @param sphere - The bounding sphere to calculate the distance to. + * @param position - The position to calculate the distance from. + * @param direction - The direction from position. + * @param [result] - A Interval to store the nearest and farthest distances. + * @returns The nearest and farthest distances on the bounding sphere from position in direction. + */ + static computePlaneDistances( + sphere: BoundingSphere, + position: Cartesian3, + direction: Cartesian3, + result?: Interval, + ): Interval; + /** + * Creates a bounding sphere in 2D from a bounding sphere in 3D world coordinates. + * @param sphere - The bounding sphere to transform to 2D. + * @param [projection = GeographicProjection] - The projection to 2D. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingSphere instance if none was provided. + */ + static projectTo2D( + sphere: BoundingSphere, + projection?: any, + result?: BoundingSphere, + ): BoundingSphere; + /** + * Determines whether or not a sphere is hidden from view by the occluder. + * @param sphere - The bounding sphere surrounding the occluded object. + * @param occluder - The occluder. + * @returns true if the sphere is not visible; otherwise false. + */ + static isOccluded(sphere: BoundingSphere, occluder: Occluder): boolean; + /** + * Compares the provided BoundingSphere componentwise and returns + * true if they are equal, false otherwise. + * @param [left] - The first BoundingSphere. + * @param [right] - The second BoundingSphere. + * @returns true if left and right are equal, false otherwise. + */ + static equals(left?: BoundingSphere, right?: BoundingSphere): boolean; + /** + * Determines which side of a plane the sphere is located. + * @param plane - The plane to test against. + * @returns {@link Intersect.INSIDE} if the entire sphere is on the side of the plane + * the normal is pointing, {@link Intersect.OUTSIDE} if the entire sphere is + * on the opposite side, and {@link Intersect.INTERSECTING} if the sphere + * intersects the plane. + */ + intersectPlane(plane: Plane): Intersect; + /** + * Computes the estimated distance squared from the closest point on a bounding sphere to a point. + * @example + * // Sort bounding spheres from back to front + * spheres.sort(function(a, b) { + * return b.distanceSquaredTo(camera.positionWC) - a.distanceSquaredTo(camera.positionWC); + * }); + * @param cartesian - The point + * @returns The estimated distance squared from the bounding sphere to the point. + */ + distanceSquaredTo(cartesian: Cartesian3): number; + /** + * The distances calculated by the vector from the center of the bounding sphere to position projected onto direction + * plus/minus the radius of the bounding sphere. + *
+ * If you imagine the infinite number of planes with normal direction, this computes the smallest distance to the + * closest and farthest planes from position that intersect the bounding sphere. + * @param position - The position to calculate the distance from. + * @param direction - The direction from position. + * @param [result] - A Interval to store the nearest and farthest distances. + * @returns The nearest and farthest distances on the bounding sphere from position in direction. + */ + computePlaneDistances( + position: Cartesian3, + direction: Cartesian3, + result?: Interval, + ): Interval; + /** + * Determines whether or not a sphere is hidden from view by the occluder. + * @param occluder - The occluder. + * @returns true if the sphere is not visible; otherwise false. + */ + isOccluded(occluder: Occluder): boolean; + /** + * Compares this BoundingSphere against the provided BoundingSphere componentwise and returns + * true if they are equal, false otherwise. + * @param [right] - The right hand side BoundingSphere. + * @returns true if they are equal, false otherwise. + */ + equals(right?: BoundingSphere): boolean; + /** + * Duplicates this BoundingSphere instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new BoundingSphere instance if none was provided. + */ + clone(result?: BoundingSphere): BoundingSphere; + /** + * Computes the radius of the BoundingSphere. + * @returns The radius of the BoundingSphere. + */ + volume(): number; + } + + /** + * Describes a cube centered at the origin. + * @example + * const box = new Cesium.BoxGeometry({ + * vertexFormat : Cesium.VertexFormat.POSITION_ONLY, + * maximum : new Cesium.Cartesian3(250000.0, 250000.0, 250000.0), + * minimum : new Cesium.Cartesian3(-250000.0, -250000.0, -250000.0) + * }); + * const geometry = Cesium.BoxGeometry.createGeometry(box); + * @param options - Object with the following properties: + * @param options.minimum - The minimum x, y, and z coordinates of the box. + * @param options.maximum - The maximum x, y, and z coordinates of the box. + * @param [options.vertexFormat = VertexFormat.DEFAULT] - The vertex attributes to be computed. + */ + export class BoxGeometry { + constructor(options: { + minimum: Cartesian3; + maximum: Cartesian3; + vertexFormat?: VertexFormat; + }); + /** + * Creates a cube centered at the origin given its dimensions. + * @example + * const box = Cesium.BoxGeometry.fromDimensions({ + * vertexFormat : Cesium.VertexFormat.POSITION_ONLY, + * dimensions : new Cesium.Cartesian3(500000.0, 500000.0, 500000.0) + * }); + * const geometry = Cesium.BoxGeometry.createGeometry(box); + * @param options - Object with the following properties: + * @param options.dimensions - The width, depth, and height of the box stored in the x, y, and z coordinates of the Cartesian3, respectively. + * @param [options.vertexFormat = VertexFormat.DEFAULT] - The vertex attributes to be computed. + */ + static fromDimensions(options: { + dimensions: Cartesian3; + vertexFormat?: VertexFormat; + }): BoxGeometry; + /** + * Creates a cube from the dimensions of an AxisAlignedBoundingBox. + * @example + * const aabb = Cesium.AxisAlignedBoundingBox.fromPoints(Cesium.Cartesian3.fromDegreesArray([ + * -72.0, 40.0, + * -70.0, 35.0, + * -75.0, 30.0, + * -70.0, 30.0, + * -68.0, 40.0 + * ])); + * const box = Cesium.BoxGeometry.fromAxisAlignedBoundingBox(aabb); + * @param boundingBox - A description of the AxisAlignedBoundingBox. + */ + static fromAxisAlignedBoundingBox( + boundingBox: AxisAlignedBoundingBox, + ): BoxGeometry; + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: BoxGeometry, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new BoxGeometry instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: BoxGeometry, + ): BoxGeometry; + /** + * Computes the geometric representation of a box, including its vertices, indices, and a bounding sphere. + * @param boxGeometry - A description of the box. + * @returns The computed vertices and indices. + */ + static createGeometry(boxGeometry: BoxGeometry): Geometry | undefined; + } + + /** + * A description of the outline of a cube centered at the origin. + * @example + * const box = new Cesium.BoxOutlineGeometry({ + * maximum : new Cesium.Cartesian3(250000.0, 250000.0, 250000.0), + * minimum : new Cesium.Cartesian3(-250000.0, -250000.0, -250000.0) + * }); + * const geometry = Cesium.BoxOutlineGeometry.createGeometry(box); + * @param options - Object with the following properties: + * @param options.minimum - The minimum x, y, and z coordinates of the box. + * @param options.maximum - The maximum x, y, and z coordinates of the box. + */ + export class BoxOutlineGeometry { + constructor(options: { minimum: Cartesian3; maximum: Cartesian3 }); + /** + * Creates an outline of a cube centered at the origin given its dimensions. + * @example + * const box = Cesium.BoxOutlineGeometry.fromDimensions({ + * dimensions : new Cesium.Cartesian3(500000.0, 500000.0, 500000.0) + * }); + * const geometry = Cesium.BoxOutlineGeometry.createGeometry(box); + * @param options - Object with the following properties: + * @param options.dimensions - The width, depth, and height of the box stored in the x, y, and z coordinates of the Cartesian3, respectively. + */ + static fromDimensions(options: { + dimensions: Cartesian3; + }): BoxOutlineGeometry; + /** + * Creates an outline of a cube from the dimensions of an AxisAlignedBoundingBox. + * @example + * const aabb = Cesium.AxisAlignedBoundingBox.fromPoints(Cesium.Cartesian3.fromDegreesArray([ + * -72.0, 40.0, + * -70.0, 35.0, + * -75.0, 30.0, + * -70.0, 30.0, + * -68.0, 40.0 + * ])); + * const box = Cesium.BoxOutlineGeometry.fromAxisAlignedBoundingBox(aabb); + * + * + * @param boundingBox - A description of the AxisAlignedBoundingBox. + */ + static fromAxisAlignedBoundingBox( + boundingBox: AxisAlignedBoundingBox, + ): BoxOutlineGeometry; + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: BoxOutlineGeometry, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new BoxOutlineGeometry instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: BoxOutlineGeometry, + ): BoxOutlineGeometry; + /** + * Computes the geometric representation of an outline of a box, including its vertices, indices, and a bounding sphere. + * @param boxGeometry - A description of the box outline. + * @returns The computed vertices and indices. + */ + static createGeometry( + boxGeometry: BoxOutlineGeometry, + ): Geometry | undefined; + } + + /** + * A 2D Cartesian point. + * @param [x = 0.0] - The X component. + * @param [y = 0.0] - The Y component. + */ + export class Cartesian2 { + constructor(x?: number, y?: number); + /** + * The X component. + */ + x: number; + /** + * The Y component. + */ + y: number; + /** + * Creates a Cartesian2 instance from x and y coordinates. + * @param x - The x coordinate. + * @param y - The y coordinate. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian2 instance if one was not provided. + */ + static fromElements(x: number, y: number, result?: Cartesian2): Cartesian2; + /** + * Duplicates a Cartesian2 instance. + * @param cartesian - The Cartesian to duplicate. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian2 instance if one was not provided. (Returns undefined if cartesian is undefined) + */ + static clone(cartesian: Cartesian2, result?: Cartesian2): Cartesian2; + /** + * Creates a Cartesian2 instance from an existing Cartesian3. This simply takes the + * x and y properties of the Cartesian3 and drops z. + * @param cartesian - The Cartesian3 instance to create a Cartesian2 instance from. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian2 instance if one was not provided. + */ + static fromCartesian3( + cartesian: Cartesian3, + result?: Cartesian2, + ): Cartesian2; + /** + * Creates a Cartesian2 instance from an existing Cartesian4. This simply takes the + * x and y properties of the Cartesian4 and drops z and w. + * @param cartesian - The Cartesian4 instance to create a Cartesian2 instance from. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian2 instance if one was not provided. + */ + static fromCartesian4( + cartesian: Cartesian4, + result?: Cartesian2, + ): Cartesian2; + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: Cartesian2, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new Cartesian2 instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: Cartesian2, + ): Cartesian2; + /** + * Flattens an array of Cartesian2s into an array of components. + * @param array - The array of cartesians to pack. + * @param [result] - The array onto which to store the result. If this is a typed array, it must have array.length * 2 components, else a {@link DeveloperError} will be thrown. If it is a regular array, it will be resized to have (array.length * 2) elements. + * @returns The packed array. + */ + static packArray(array: Cartesian2[], result?: number[]): number[]; + /** + * Unpacks an array of cartesian components into an array of Cartesian2s. + * @param array - The array of components to unpack. + * @param [result] - The array onto which to store the result. + * @returns The unpacked array. + */ + static unpackArray(array: number[], result?: Cartesian2[]): Cartesian2[]; + /** + * Creates a Cartesian2 from two consecutive elements in an array. + * @example + * // Create a Cartesian2 with (1.0, 2.0) + * const v = [1.0, 2.0]; + * const p = Cesium.Cartesian2.fromArray(v); + * + * // Create a Cartesian2 with (1.0, 2.0) using an offset into an array + * const v2 = [0.0, 0.0, 1.0, 2.0]; + * const p2 = Cesium.Cartesian2.fromArray(v2, 2); + * @param array - The array whose two consecutive elements correspond to the x and y components, respectively. + * @param [startingIndex = 0] - The offset into the array of the first element, which corresponds to the x component. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian2 instance if one was not provided. + */ + static fromArray( + array: number[], + startingIndex?: number, + result?: Cartesian2, + ): Cartesian2; + /** + * Computes the value of the maximum component for the supplied Cartesian. + * @param cartesian - The cartesian to use. + * @returns The value of the maximum component. + */ + static maximumComponent(cartesian: Cartesian2): number; + /** + * Computes the value of the minimum component for the supplied Cartesian. + * @param cartesian - The cartesian to use. + * @returns The value of the minimum component. + */ + static minimumComponent(cartesian: Cartesian2): number; + /** + * Compares two Cartesians and computes a Cartesian which contains the minimum components of the supplied Cartesians. + * @param first - A cartesian to compare. + * @param second - A cartesian to compare. + * @param result - The object into which to store the result. + * @returns A cartesian with the minimum components. + */ + static minimumByComponent( + first: Cartesian2, + second: Cartesian2, + result: Cartesian2, + ): Cartesian2; + /** + * Compares two Cartesians and computes a Cartesian which contains the maximum components of the supplied Cartesians. + * @param first - A cartesian to compare. + * @param second - A cartesian to compare. + * @param result - The object into which to store the result. + * @returns A cartesian with the maximum components. + */ + static maximumByComponent( + first: Cartesian2, + second: Cartesian2, + result: Cartesian2, + ): Cartesian2; + /** + * Constrain a value to lie between two values. + * @param value - The value to clamp. + * @param min - The minimum bound. + * @param max - The maximum bound. + * @param result - The object into which to store the result. + * @returns The clamped value such that min <= result <= max. + */ + static clamp( + value: Cartesian2, + min: Cartesian2, + max: Cartesian2, + result: Cartesian2, + ): Cartesian2; + /** + * Computes the provided Cartesian's squared magnitude. + * @param cartesian - The Cartesian instance whose squared magnitude is to be computed. + * @returns The squared magnitude. + */ + static magnitudeSquared(cartesian: Cartesian2): number; + /** + * Computes the Cartesian's magnitude (length). + * @param cartesian - The Cartesian instance whose magnitude is to be computed. + * @returns The magnitude. + */ + static magnitude(cartesian: Cartesian2): number; + /** + * Computes the distance between two points. + * @example + * // Returns 1.0 + * const d = Cesium.Cartesian2.distance(new Cesium.Cartesian2(1.0, 0.0), new Cesium.Cartesian2(2.0, 0.0)); + * @param left - The first point to compute the distance from. + * @param right - The second point to compute the distance to. + * @returns The distance between two points. + */ + static distance(left: Cartesian2, right: Cartesian2): number; + /** + * Computes the squared distance between two points. Comparing squared distances + * using this function is more efficient than comparing distances using {@link Cartesian2#distance}. + * @example + * // Returns 4.0, not 2.0 + * const d = Cesium.Cartesian2.distance(new Cesium.Cartesian2(1.0, 0.0), new Cesium.Cartesian2(3.0, 0.0)); + * @param left - The first point to compute the distance from. + * @param right - The second point to compute the distance to. + * @returns The distance between two points. + */ + static distanceSquared(left: Cartesian2, right: Cartesian2): number; + /** + * Computes the normalized form of the supplied Cartesian. + * @param cartesian - The Cartesian to be normalized. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static normalize(cartesian: Cartesian2, result: Cartesian2): Cartesian2; + /** + * Computes the dot (scalar) product of two Cartesians. + * @param left - The first Cartesian. + * @param right - The second Cartesian. + * @returns The dot product. + */ + static dot(left: Cartesian2, right: Cartesian2): number; + /** + * Computes the magnitude of the cross product that would result from implicitly setting the Z coordinate of the input vectors to 0 + * @param left - The first Cartesian. + * @param right - The second Cartesian. + * @returns The cross product. + */ + static cross(left: Cartesian2, right: Cartesian2): number; + /** + * Computes the componentwise product of two Cartesians. + * @param left - The first Cartesian. + * @param right - The second Cartesian. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyComponents( + left: Cartesian2, + right: Cartesian2, + result: Cartesian2, + ): Cartesian2; + /** + * Computes the componentwise quotient of two Cartesians. + * @param left - The first Cartesian. + * @param right - The second Cartesian. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static divideComponents( + left: Cartesian2, + right: Cartesian2, + result: Cartesian2, + ): Cartesian2; + /** + * Computes the componentwise sum of two Cartesians. + * @param left - The first Cartesian. + * @param right - The second Cartesian. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static add( + left: Cartesian2, + right: Cartesian2, + result: Cartesian2, + ): Cartesian2; + /** + * Computes the componentwise difference of two Cartesians. + * @param left - The first Cartesian. + * @param right - The second Cartesian. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static subtract( + left: Cartesian2, + right: Cartesian2, + result: Cartesian2, + ): Cartesian2; + /** + * Multiplies the provided Cartesian componentwise by the provided scalar. + * @param cartesian - The Cartesian to be scaled. + * @param scalar - The scalar to multiply with. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyByScalar( + cartesian: Cartesian2, + scalar: number, + result: Cartesian2, + ): Cartesian2; + /** + * Divides the provided Cartesian componentwise by the provided scalar. + * @param cartesian - The Cartesian to be divided. + * @param scalar - The scalar to divide by. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static divideByScalar( + cartesian: Cartesian2, + scalar: number, + result: Cartesian2, + ): Cartesian2; + /** + * Negates the provided Cartesian. + * @param cartesian - The Cartesian to be negated. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static negate(cartesian: Cartesian2, result: Cartesian2): Cartesian2; + /** + * Computes the absolute value of the provided Cartesian. + * @param cartesian - The Cartesian whose absolute value is to be computed. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static abs(cartesian: Cartesian2, result: Cartesian2): Cartesian2; + /** + * Computes the linear interpolation or extrapolation at t using the provided cartesians. + * @param start - The value corresponding to t at 0.0. + * @param end - The value corresponding to t at 1.0. + * @param t - The point along t at which to interpolate. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static lerp( + start: Cartesian2, + end: Cartesian2, + t: number, + result: Cartesian2, + ): Cartesian2; + /** + * Returns the angle, in radians, between the provided Cartesians. + * @param left - The first Cartesian. + * @param right - The second Cartesian. + * @returns The angle between the Cartesians. + */ + static angleBetween(left: Cartesian2, right: Cartesian2): number; + /** + * Returns the axis that is most orthogonal to the provided Cartesian. + * @param cartesian - The Cartesian on which to find the most orthogonal axis. + * @param result - The object onto which to store the result. + * @returns The most orthogonal axis. + */ + static mostOrthogonalAxis( + cartesian: Cartesian2, + result: Cartesian2, + ): Cartesian2; + /** + * Compares the provided Cartesians componentwise and returns + * true if they are equal, false otherwise. + * @param [left] - The first Cartesian. + * @param [right] - The second Cartesian. + * @returns true if left and right are equal, false otherwise. + */ + static equals(left?: Cartesian2, right?: Cartesian2): boolean; + /** + * Compares the provided Cartesians componentwise and returns + * true if they pass an absolute or relative tolerance test, + * false otherwise. + * @param [left] - The first Cartesian. + * @param [right] - The second Cartesian. + * @param [relativeEpsilon = 0] - The relative epsilon tolerance to use for equality testing. + * @param [absoluteEpsilon = relativeEpsilon] - The absolute epsilon tolerance to use for equality testing. + * @returns true if left and right are within the provided epsilon, false otherwise. + */ + static equalsEpsilon( + left?: Cartesian2, + right?: Cartesian2, + relativeEpsilon?: number, + absoluteEpsilon?: number, + ): boolean; + /** + * An immutable Cartesian2 instance initialized to (0.0, 0.0). + */ + static readonly ZERO: Cartesian2; + /** + * An immutable Cartesian2 instance initialized to (1.0, 1.0). + */ + static readonly ONE: Cartesian2; + /** + * An immutable Cartesian2 instance initialized to (1.0, 0.0). + */ + static readonly UNIT_X: Cartesian2; + /** + * An immutable Cartesian2 instance initialized to (0.0, 1.0). + */ + static readonly UNIT_Y: Cartesian2; + /** + * Duplicates this Cartesian2 instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian2 instance if one was not provided. + */ + clone(result?: Cartesian2): Cartesian2; + /** + * Compares this Cartesian against the provided Cartesian componentwise and returns + * true if they are equal, false otherwise. + * @param [right] - The right hand side Cartesian. + * @returns true if they are equal, false otherwise. + */ + equals(right?: Cartesian2): boolean; + /** + * Compares this Cartesian against the provided Cartesian componentwise and returns + * true if they pass an absolute or relative tolerance test, + * false otherwise. + * @param [right] - The right hand side Cartesian. + * @param [relativeEpsilon = 0] - The relative epsilon tolerance to use for equality testing. + * @param [absoluteEpsilon = relativeEpsilon] - The absolute epsilon tolerance to use for equality testing. + * @returns true if they are within the provided epsilon, false otherwise. + */ + equalsEpsilon( + right?: Cartesian2, + relativeEpsilon?: number, + absoluteEpsilon?: number, + ): boolean; + /** + * Creates a string representing this Cartesian in the format '(x, y)'. + * @returns A string representing the provided Cartesian in the format '(x, y)'. + */ + toString(): string; + } + + /** + * A 3D Cartesian point. + * @param [x = 0.0] - The X component. + * @param [y = 0.0] - The Y component. + * @param [z = 0.0] - The Z component. + */ + export class Cartesian3 { + constructor(x?: number, y?: number, z?: number); + /** + * The X component. + */ + x: number; + /** + * The Y component. + */ + y: number; + /** + * The Z component. + */ + z: number; + /** + * Converts the provided Spherical into Cartesian3 coordinates. + * @param spherical - The Spherical to be converted to Cartesian3. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian3 instance if one was not provided. + */ + static fromSpherical(spherical: Spherical, result?: Cartesian3): Cartesian3; + /** + * Creates a Cartesian3 instance from x, y and z coordinates. + * @param x - The x coordinate. + * @param y - The y coordinate. + * @param z - The z coordinate. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian3 instance if one was not provided. + */ + static fromElements( + x: number, + y: number, + z: number, + result?: Cartesian3, + ): Cartesian3; + /** + * Duplicates a Cartesian3 instance. + * @param cartesian - The Cartesian to duplicate. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian3 instance if one was not provided. (Returns undefined if cartesian is undefined) + */ + static clone(cartesian: Cartesian3, result?: Cartesian3): Cartesian3; + /** + * Creates a Cartesian3 instance from an existing Cartesian4. This simply takes the + * x, y, and z properties of the Cartesian4 and drops w. + * @param cartesian - The Cartesian4 instance to create a Cartesian3 instance from. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian3 instance if one was not provided. + */ + static fromCartesian4( + cartesian: Cartesian4, + result?: Cartesian3, + ): Cartesian3; + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: Cartesian3, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new Cartesian3 instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: Cartesian3, + ): Cartesian3; + /** + * Flattens an array of Cartesian3s into an array of components. + * @param array - The array of cartesians to pack. + * @param [result] - The array onto which to store the result. If this is a typed array, it must have array.length * 3 components, else a {@link DeveloperError} will be thrown. If it is a regular array, it will be resized to have (array.length * 3) elements. + * @returns The packed array. + */ + static packArray(array: Cartesian3[], result?: number[]): number[]; + /** + * Unpacks an array of cartesian components into an array of Cartesian3s. + * @param array - The array of components to unpack. + * @param [result] - The array onto which to store the result. + * @returns The unpacked array. + */ + static unpackArray(array: number[], result?: Cartesian3[]): Cartesian3[]; + /** + * Creates a Cartesian3 from three consecutive elements in an array. + * @example + * // Create a Cartesian3 with (1.0, 2.0, 3.0) + * const v = [1.0, 2.0, 3.0]; + * const p = Cesium.Cartesian3.fromArray(v); + * + * // Create a Cartesian3 with (1.0, 2.0, 3.0) using an offset into an array + * const v2 = [0.0, 0.0, 1.0, 2.0, 3.0]; + * const p2 = Cesium.Cartesian3.fromArray(v2, 2); + * @param array - The array whose three consecutive elements correspond to the x, y, and z components, respectively. + * @param [startingIndex = 0] - The offset into the array of the first element, which corresponds to the x component. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian3 instance if one was not provided. + */ + static fromArray( + array: number[], + startingIndex?: number, + result?: Cartesian3, + ): Cartesian3; + /** + * Computes the value of the maximum component for the supplied Cartesian. + * @param cartesian - The cartesian to use. + * @returns The value of the maximum component. + */ + static maximumComponent(cartesian: Cartesian3): number; + /** + * Computes the value of the minimum component for the supplied Cartesian. + * @param cartesian - The cartesian to use. + * @returns The value of the minimum component. + */ + static minimumComponent(cartesian: Cartesian3): number; + /** + * Compares two Cartesians and computes a Cartesian which contains the minimum components of the supplied Cartesians. + * @param first - A cartesian to compare. + * @param second - A cartesian to compare. + * @param result - The object into which to store the result. + * @returns A cartesian with the minimum components. + */ + static minimumByComponent( + first: Cartesian3, + second: Cartesian3, + result: Cartesian3, + ): Cartesian3; + /** + * Compares two Cartesians and computes a Cartesian which contains the maximum components of the supplied Cartesians. + * @param first - A cartesian to compare. + * @param second - A cartesian to compare. + * @param result - The object into which to store the result. + * @returns A cartesian with the maximum components. + */ + static maximumByComponent( + first: Cartesian3, + second: Cartesian3, + result: Cartesian3, + ): Cartesian3; + /** + * Constrain a value to lie between two values. + * @param cartesian - The value to clamp. + * @param min - The minimum bound. + * @param max - The maximum bound. + * @param result - The object into which to store the result. + * @returns The clamped value such that min <= value <= max. + */ + static clamp( + cartesian: Cartesian3, + min: Cartesian3, + max: Cartesian3, + result: Cartesian3, + ): Cartesian3; + /** + * Computes the provided Cartesian's squared magnitude. + * @param cartesian - The Cartesian instance whose squared magnitude is to be computed. + * @returns The squared magnitude. + */ + static magnitudeSquared(cartesian: Cartesian3): number; + /** + * Computes the Cartesian's magnitude (length). + * @param cartesian - The Cartesian instance whose magnitude is to be computed. + * @returns The magnitude. + */ + static magnitude(cartesian: Cartesian3): number; + /** + * Computes the distance between two points. + * @example + * // Returns 1.0 + * const d = Cesium.Cartesian3.distance(new Cesium.Cartesian3(1.0, 0.0, 0.0), new Cesium.Cartesian3(2.0, 0.0, 0.0)); + * @param left - The first point to compute the distance from. + * @param right - The second point to compute the distance to. + * @returns The distance between two points. + */ + static distance(left: Cartesian3, right: Cartesian3): number; + /** + * Computes the squared distance between two points. Comparing squared distances + * using this function is more efficient than comparing distances using {@link Cartesian3#distance}. + * @example + * // Returns 4.0, not 2.0 + * const d = Cesium.Cartesian3.distanceSquared(new Cesium.Cartesian3(1.0, 0.0, 0.0), new Cesium.Cartesian3(3.0, 0.0, 0.0)); + * @param left - The first point to compute the distance from. + * @param right - The second point to compute the distance to. + * @returns The distance between two points. + */ + static distanceSquared(left: Cartesian3, right: Cartesian3): number; + /** + * Computes the normalized form of the supplied Cartesian. + * @param cartesian - The Cartesian to be normalized. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static normalize(cartesian: Cartesian3, result: Cartesian3): Cartesian3; + /** + * Computes the dot (scalar) product of two Cartesians. + * @param left - The first Cartesian. + * @param right - The second Cartesian. + * @returns The dot product. + */ + static dot(left: Cartesian3, right: Cartesian3): number; + /** + * Computes the componentwise product of two Cartesians. + * @param left - The first Cartesian. + * @param right - The second Cartesian. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyComponents( + left: Cartesian3, + right: Cartesian3, + result: Cartesian3, + ): Cartesian3; + /** + * Computes the componentwise quotient of two Cartesians. + * @param left - The first Cartesian. + * @param right - The second Cartesian. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static divideComponents( + left: Cartesian3, + right: Cartesian3, + result: Cartesian3, + ): Cartesian3; + /** + * Computes the componentwise sum of two Cartesians. + * @param left - The first Cartesian. + * @param right - The second Cartesian. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static add( + left: Cartesian3, + right: Cartesian3, + result: Cartesian3, + ): Cartesian3; + /** + * Computes the componentwise difference of two Cartesians. + * @param left - The first Cartesian. + * @param right - The second Cartesian. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static subtract( + left: Cartesian3, + right: Cartesian3, + result: Cartesian3, + ): Cartesian3; + /** + * Multiplies the provided Cartesian componentwise by the provided scalar. + * @param cartesian - The Cartesian to be scaled. + * @param scalar - The scalar to multiply with. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyByScalar( + cartesian: Cartesian3, + scalar: number, + result: Cartesian3, + ): Cartesian3; + /** + * Divides the provided Cartesian componentwise by the provided scalar. + * @param cartesian - The Cartesian to be divided. + * @param scalar - The scalar to divide by. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static divideByScalar( + cartesian: Cartesian3, + scalar: number, + result: Cartesian3, + ): Cartesian3; + /** + * Negates the provided Cartesian. + * @param cartesian - The Cartesian to be negated. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static negate(cartesian: Cartesian3, result: Cartesian3): Cartesian3; + /** + * Computes the absolute value of the provided Cartesian. + * @param cartesian - The Cartesian whose absolute value is to be computed. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static abs(cartesian: Cartesian3, result: Cartesian3): Cartesian3; + /** + * Computes the linear interpolation or extrapolation at t using the provided cartesians. + * @param start - The value corresponding to t at 0.0. + * @param end - The value corresponding to t at 1.0. + * @param t - The point along t at which to interpolate. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static lerp( + start: Cartesian3, + end: Cartesian3, + t: number, + result: Cartesian3, + ): Cartesian3; + /** + * Returns the angle, in radians, between the provided Cartesians. + * @param left - The first Cartesian. + * @param right - The second Cartesian. + * @returns The angle between the Cartesians. + */ + static angleBetween(left: Cartesian3, right: Cartesian3): number; + /** + * Returns the axis that is most orthogonal to the provided Cartesian. + * @param cartesian - The Cartesian on which to find the most orthogonal axis. + * @param result - The object onto which to store the result. + * @returns The most orthogonal axis. + */ + static mostOrthogonalAxis( + cartesian: Cartesian3, + result: Cartesian3, + ): Cartesian3; + /** + * Projects vector a onto vector b + * @param a - The vector that needs projecting + * @param b - The vector to project onto + * @param result - The result cartesian + * @returns The modified result parameter + */ + static projectVector( + a: Cartesian3, + b: Cartesian3, + result: Cartesian3, + ): Cartesian3; + /** + * Compares the provided Cartesians componentwise and returns + * true if they are equal, false otherwise. + * @param [left] - The first Cartesian. + * @param [right] - The second Cartesian. + * @returns true if left and right are equal, false otherwise. + */ + static equals(left?: Cartesian3, right?: Cartesian3): boolean; + /** + * Compares the provided Cartesians componentwise and returns + * true if they pass an absolute or relative tolerance test, + * false otherwise. + * @param [left] - The first Cartesian. + * @param [right] - The second Cartesian. + * @param [relativeEpsilon = 0] - The relative epsilon tolerance to use for equality testing. + * @param [absoluteEpsilon = relativeEpsilon] - The absolute epsilon tolerance to use for equality testing. + * @returns true if left and right are within the provided epsilon, false otherwise. + */ + static equalsEpsilon( + left?: Cartesian3, + right?: Cartesian3, + relativeEpsilon?: number, + absoluteEpsilon?: number, + ): boolean; + /** + * Computes the cross (outer) product of two Cartesians. + * @param left - The first Cartesian. + * @param right - The second Cartesian. + * @param result - The object onto which to store the result. + * @returns The cross product. + */ + static cross( + left: Cartesian3, + right: Cartesian3, + result: Cartesian3, + ): Cartesian3; + /** + * Computes the midpoint between the right and left Cartesian. + * @param left - The first Cartesian. + * @param right - The second Cartesian. + * @param result - The object onto which to store the result. + * @returns The midpoint. + */ + static midpoint( + left: Cartesian3, + right: Cartesian3, + result: Cartesian3, + ): Cartesian3; + /** + * Returns a Cartesian3 position from longitude and latitude values given in degrees. + * @example + * const position = Cesium.Cartesian3.fromDegrees(-115.0, 37.0); + * @param longitude - The longitude, in degrees + * @param latitude - The latitude, in degrees + * @param [height = 0.0] - The height, in meters, above the ellipsoid. + * @param [ellipsoid = Ellipsoid.default] - The ellipsoid on which the position lies. + * @param [result] - The object onto which to store the result. + * @returns The position + */ + static fromDegrees( + longitude: number, + latitude: number, + height?: number, + ellipsoid?: Ellipsoid, + result?: Cartesian3, + ): Cartesian3; + /** + * Returns a Cartesian3 position from longitude and latitude values given in radians. + * @example + * const position = Cesium.Cartesian3.fromRadians(-2.007, 0.645); + * @param longitude - The longitude, in radians + * @param latitude - The latitude, in radians + * @param [height = 0.0] - The height, in meters, above the ellipsoid. + * @param [ellipsoid = Ellipsoid.default] - The ellipsoid on which the position lies. + * @param [result] - The object onto which to store the result. + * @returns The position + */ + static fromRadians( + longitude: number, + latitude: number, + height?: number, + ellipsoid?: Ellipsoid, + result?: Cartesian3, + ): Cartesian3; + /** + * Returns an array of Cartesian3 positions given an array of longitude and latitude values given in degrees. + * @example + * const positions = Cesium.Cartesian3.fromDegreesArray([-115.0, 37.0, -107.0, 33.0]); + * @param coordinates - A list of longitude and latitude values. Values alternate [longitude, latitude, longitude, latitude...]. + * @param [ellipsoid = Ellipsoid.default] - The ellipsoid on which the coordinates lie. + * @param [result] - An array of Cartesian3 objects to store the result. + * @returns The array of positions. + */ + static fromDegreesArray( + coordinates: number[], + ellipsoid?: Ellipsoid, + result?: Cartesian3[], + ): Cartesian3[]; + /** + * Returns an array of Cartesian3 positions given an array of longitude and latitude values given in radians. + * @example + * const positions = Cesium.Cartesian3.fromRadiansArray([-2.007, 0.645, -1.867, .575]); + * @param coordinates - A list of longitude and latitude values. Values alternate [longitude, latitude, longitude, latitude...]. + * @param [ellipsoid = Ellipsoid.default] - The ellipsoid on which the coordinates lie. + * @param [result] - An array of Cartesian3 objects to store the result. + * @returns The array of positions. + */ + static fromRadiansArray( + coordinates: number[], + ellipsoid?: Ellipsoid, + result?: Cartesian3[], + ): Cartesian3[]; + /** + * Returns an array of Cartesian3 positions given an array of longitude, latitude and height values where longitude and latitude are given in degrees. + * @example + * const positions = Cesium.Cartesian3.fromDegreesArrayHeights([-115.0, 37.0, 100000.0, -107.0, 33.0, 150000.0]); + * @param coordinates - A list of longitude, latitude and height values. Values alternate [longitude, latitude, height, longitude, latitude, height...]. + * @param [ellipsoid = Ellipsoid.default] - The ellipsoid on which the position lies. + * @param [result] - An array of Cartesian3 objects to store the result. + * @returns The array of positions. + */ + static fromDegreesArrayHeights( + coordinates: number[], + ellipsoid?: Ellipsoid, + result?: Cartesian3[], + ): Cartesian3[]; + /** + * Returns an array of Cartesian3 positions given an array of longitude, latitude and height values where longitude and latitude are given in radians. + * @example + * const positions = Cesium.Cartesian3.fromRadiansArrayHeights([-2.007, 0.645, 100000.0, -1.867, .575, 150000.0]); + * @param coordinates - A list of longitude, latitude and height values. Values alternate [longitude, latitude, height, longitude, latitude, height...]. + * @param [ellipsoid = Ellipsoid.default] - The ellipsoid on which the position lies. + * @param [result] - An array of Cartesian3 objects to store the result. + * @returns The array of positions. + */ + static fromRadiansArrayHeights( + coordinates: number[], + ellipsoid?: Ellipsoid, + result?: Cartesian3[], + ): Cartesian3[]; + /** + * An immutable Cartesian3 instance initialized to (0.0, 0.0, 0.0). + */ + static readonly ZERO: Cartesian3; + /** + * An immutable Cartesian3 instance initialized to (1.0, 1.0, 1.0). + */ + static readonly ONE: Cartesian3; + /** + * An immutable Cartesian3 instance initialized to (1.0, 0.0, 0.0). + */ + static readonly UNIT_X: Cartesian3; + /** + * An immutable Cartesian3 instance initialized to (0.0, 1.0, 0.0). + */ + static readonly UNIT_Y: Cartesian3; + /** + * An immutable Cartesian3 instance initialized to (0.0, 0.0, 1.0). + */ + static readonly UNIT_Z: Cartesian3; + /** + * Duplicates this Cartesian3 instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian3 instance if one was not provided. + */ + clone(result?: Cartesian3): Cartesian3; + /** + * Compares this Cartesian against the provided Cartesian componentwise and returns + * true if they are equal, false otherwise. + * @param [right] - The right hand side Cartesian. + * @returns true if they are equal, false otherwise. + */ + equals(right?: Cartesian3): boolean; + /** + * Compares this Cartesian against the provided Cartesian componentwise and returns + * true if they pass an absolute or relative tolerance test, + * false otherwise. + * @param [right] - The right hand side Cartesian. + * @param [relativeEpsilon = 0] - The relative epsilon tolerance to use for equality testing. + * @param [absoluteEpsilon = relativeEpsilon] - The absolute epsilon tolerance to use for equality testing. + * @returns true if they are within the provided epsilon, false otherwise. + */ + equalsEpsilon( + right?: Cartesian3, + relativeEpsilon?: number, + absoluteEpsilon?: number, + ): boolean; + /** + * Creates a string representing this Cartesian in the format '(x, y, z)'. + * @returns A string representing this Cartesian in the format '(x, y, z)'. + */ + toString(): string; + } + + /** + * A 4D Cartesian point. + * @param [x = 0.0] - The X component. + * @param [y = 0.0] - The Y component. + * @param [z = 0.0] - The Z component. + * @param [w = 0.0] - The W component. + */ + export class Cartesian4 { + constructor(x?: number, y?: number, z?: number, w?: number); + /** + * The X component. + */ + x: number; + /** + * The Y component. + */ + y: number; + /** + * The Z component. + */ + z: number; + /** + * The W component. + */ + w: number; + /** + * Creates a Cartesian4 instance from x, y, z and w coordinates. + * @param x - The x coordinate. + * @param y - The y coordinate. + * @param z - The z coordinate. + * @param w - The w coordinate. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian4 instance if one was not provided. + */ + static fromElements( + x: number, + y: number, + z: number, + w: number, + result?: Cartesian4, + ): Cartesian4; + /** + * Creates a Cartesian4 instance from a {@link Color}. red, green, blue, + * and alpha map to x, y, z, and w, respectively. + * @param color - The source color. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian4 instance if one was not provided. + */ + static fromColor(color: Color, result?: Cartesian4): Cartesian4; + /** + * Duplicates a Cartesian4 instance. + * @param cartesian - The Cartesian to duplicate. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian4 instance if one was not provided. (Returns undefined if cartesian is undefined) + */ + static clone(cartesian: Cartesian4, result?: Cartesian4): Cartesian4; + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: Cartesian4, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new Cartesian4 instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: Cartesian4, + ): Cartesian4; + /** + * Flattens an array of Cartesian4s into an array of components. + * @param array - The array of cartesians to pack. + * @param [result] - The array onto which to store the result. If this is a typed array, it must have array.length * 4 components, else a {@link DeveloperError} will be thrown. If it is a regular array, it will be resized to have (array.length * 4) elements. + * @returns The packed array. + */ + static packArray(array: Cartesian4[], result?: number[]): number[]; + /** + * Unpacks an array of cartesian components into an array of Cartesian4s. + * @param array - The array of components to unpack. + * @param [result] - The array onto which to store the result. + * @returns The unpacked array. + */ + static unpackArray(array: number[], result?: Cartesian4[]): Cartesian4[]; + /** + * Creates a Cartesian4 from four consecutive elements in an array. + * @example + * // Create a Cartesian4 with (1.0, 2.0, 3.0, 4.0) + * const v = [1.0, 2.0, 3.0, 4.0]; + * const p = Cesium.Cartesian4.fromArray(v); + * + * // Create a Cartesian4 with (1.0, 2.0, 3.0, 4.0) using an offset into an array + * const v2 = [0.0, 0.0, 1.0, 2.0, 3.0, 4.0]; + * const p2 = Cesium.Cartesian4.fromArray(v2, 2); + * @param array - The array whose four consecutive elements correspond to the x, y, z, and w components, respectively. + * @param [startingIndex = 0] - The offset into the array of the first element, which corresponds to the x component. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian4 instance if one was not provided. + */ + static fromArray( + array: number[], + startingIndex?: number, + result?: Cartesian4, + ): Cartesian4; + /** + * Computes the value of the maximum component for the supplied Cartesian. + * @param cartesian - The cartesian to use. + * @returns The value of the maximum component. + */ + static maximumComponent(cartesian: Cartesian4): number; + /** + * Computes the value of the minimum component for the supplied Cartesian. + * @param cartesian - The cartesian to use. + * @returns The value of the minimum component. + */ + static minimumComponent(cartesian: Cartesian4): number; + /** + * Compares two Cartesians and computes a Cartesian which contains the minimum components of the supplied Cartesians. + * @param first - A cartesian to compare. + * @param second - A cartesian to compare. + * @param result - The object into which to store the result. + * @returns A cartesian with the minimum components. + */ + static minimumByComponent( + first: Cartesian4, + second: Cartesian4, + result: Cartesian4, + ): Cartesian4; + /** + * Compares two Cartesians and computes a Cartesian which contains the maximum components of the supplied Cartesians. + * @param first - A cartesian to compare. + * @param second - A cartesian to compare. + * @param result - The object into which to store the result. + * @returns A cartesian with the maximum components. + */ + static maximumByComponent( + first: Cartesian4, + second: Cartesian4, + result: Cartesian4, + ): Cartesian4; + /** + * Constrain a value to lie between two values. + * @param value - The value to clamp. + * @param min - The minimum bound. + * @param max - The maximum bound. + * @param result - The object into which to store the result. + * @returns The clamped value such that min <= result <= max. + */ + static clamp( + value: Cartesian4, + min: Cartesian4, + max: Cartesian4, + result: Cartesian4, + ): Cartesian4; + /** + * Computes the provided Cartesian's squared magnitude. + * @param cartesian - The Cartesian instance whose squared magnitude is to be computed. + * @returns The squared magnitude. + */ + static magnitudeSquared(cartesian: Cartesian4): number; + /** + * Computes the Cartesian's magnitude (length). + * @param cartesian - The Cartesian instance whose magnitude is to be computed. + * @returns The magnitude. + */ + static magnitude(cartesian: Cartesian4): number; + /** + * Computes the 4-space distance between two points. + * @example + * // Returns 1.0 + * const d = Cesium.Cartesian4.distance( + * new Cesium.Cartesian4(1.0, 0.0, 0.0, 0.0), + * new Cesium.Cartesian4(2.0, 0.0, 0.0, 0.0)); + * @param left - The first point to compute the distance from. + * @param right - The second point to compute the distance to. + * @returns The distance between two points. + */ + static distance(left: Cartesian4, right: Cartesian4): number; + /** + * Computes the squared distance between two points. Comparing squared distances + * using this function is more efficient than comparing distances using {@link Cartesian4#distance}. + * @example + * // Returns 4.0, not 2.0 + * const d = Cesium.Cartesian4.distance( + * new Cesium.Cartesian4(1.0, 0.0, 0.0, 0.0), + * new Cesium.Cartesian4(3.0, 0.0, 0.0, 0.0)); + * @param left - The first point to compute the distance from. + * @param right - The second point to compute the distance to. + * @returns The distance between two points. + */ + static distanceSquared(left: Cartesian4, right: Cartesian4): number; + /** + * Computes the normalized form of the supplied Cartesian. + * @param cartesian - The Cartesian to be normalized. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static normalize(cartesian: Cartesian4, result: Cartesian4): Cartesian4; + /** + * Computes the dot (scalar) product of two Cartesians. + * @param left - The first Cartesian. + * @param right - The second Cartesian. + * @returns The dot product. + */ + static dot(left: Cartesian4, right: Cartesian4): number; + /** + * Computes the componentwise product of two Cartesians. + * @param left - The first Cartesian. + * @param right - The second Cartesian. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyComponents( + left: Cartesian4, + right: Cartesian4, + result: Cartesian4, + ): Cartesian4; + /** + * Computes the componentwise quotient of two Cartesians. + * @param left - The first Cartesian. + * @param right - The second Cartesian. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static divideComponents( + left: Cartesian4, + right: Cartesian4, + result: Cartesian4, + ): Cartesian4; + /** + * Computes the componentwise sum of two Cartesians. + * @param left - The first Cartesian. + * @param right - The second Cartesian. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static add( + left: Cartesian4, + right: Cartesian4, + result: Cartesian4, + ): Cartesian4; + /** + * Computes the componentwise difference of two Cartesians. + * @param left - The first Cartesian. + * @param right - The second Cartesian. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static subtract( + left: Cartesian4, + right: Cartesian4, + result: Cartesian4, + ): Cartesian4; + /** + * Multiplies the provided Cartesian componentwise by the provided scalar. + * @param cartesian - The Cartesian to be scaled. + * @param scalar - The scalar to multiply with. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyByScalar( + cartesian: Cartesian4, + scalar: number, + result: Cartesian4, + ): Cartesian4; + /** + * Divides the provided Cartesian componentwise by the provided scalar. + * @param cartesian - The Cartesian to be divided. + * @param scalar - The scalar to divide by. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static divideByScalar( + cartesian: Cartesian4, + scalar: number, + result: Cartesian4, + ): Cartesian4; + /** + * Negates the provided Cartesian. + * @param cartesian - The Cartesian to be negated. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static negate(cartesian: Cartesian4, result: Cartesian4): Cartesian4; + /** + * Computes the absolute value of the provided Cartesian. + * @param cartesian - The Cartesian whose absolute value is to be computed. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static abs(cartesian: Cartesian4, result: Cartesian4): Cartesian4; + /** + * Computes the linear interpolation or extrapolation at t using the provided cartesians. + * @param start - The value corresponding to t at 0.0. + * @param end - The value corresponding to t at 1.0. + * @param t - The point along t at which to interpolate. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static lerp( + start: Cartesian4, + end: Cartesian4, + t: number, + result: Cartesian4, + ): Cartesian4; + /** + * Returns the axis that is most orthogonal to the provided Cartesian. + * @param cartesian - The Cartesian on which to find the most orthogonal axis. + * @param result - The object onto which to store the result. + * @returns The most orthogonal axis. + */ + static mostOrthogonalAxis( + cartesian: Cartesian4, + result: Cartesian4, + ): Cartesian4; + /** + * Compares the provided Cartesians componentwise and returns + * true if they are equal, false otherwise. + * @param [left] - The first Cartesian. + * @param [right] - The second Cartesian. + * @returns true if left and right are equal, false otherwise. + */ + static equals(left?: Cartesian4, right?: Cartesian4): boolean; + /** + * Compares the provided Cartesians componentwise and returns + * true if they pass an absolute or relative tolerance test, + * false otherwise. + * @param [left] - The first Cartesian. + * @param [right] - The second Cartesian. + * @param [relativeEpsilon = 0] - The relative epsilon tolerance to use for equality testing. + * @param [absoluteEpsilon = relativeEpsilon] - The absolute epsilon tolerance to use for equality testing. + * @returns true if left and right are within the provided epsilon, false otherwise. + */ + static equalsEpsilon( + left?: Cartesian4, + right?: Cartesian4, + relativeEpsilon?: number, + absoluteEpsilon?: number, + ): boolean; + /** + * An immutable Cartesian4 instance initialized to (0.0, 0.0, 0.0, 0.0). + */ + static readonly ZERO: Cartesian4; + /** + * An immutable Cartesian4 instance initialized to (1.0, 1.0, 1.0, 1.0). + */ + static readonly ONE: Cartesian4; + /** + * An immutable Cartesian4 instance initialized to (1.0, 0.0, 0.0, 0.0). + */ + static readonly UNIT_X: Cartesian4; + /** + * An immutable Cartesian4 instance initialized to (0.0, 1.0, 0.0, 0.0). + */ + static readonly UNIT_Y: Cartesian4; + /** + * An immutable Cartesian4 instance initialized to (0.0, 0.0, 1.0, 0.0). + */ + static readonly UNIT_Z: Cartesian4; + /** + * An immutable Cartesian4 instance initialized to (0.0, 0.0, 0.0, 1.0). + */ + static readonly UNIT_W: Cartesian4; + /** + * Duplicates this Cartesian4 instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian4 instance if one was not provided. + */ + clone(result?: Cartesian4): Cartesian4; + /** + * Compares this Cartesian against the provided Cartesian componentwise and returns + * true if they are equal, false otherwise. + * @param [right] - The right hand side Cartesian. + * @returns true if they are equal, false otherwise. + */ + equals(right?: Cartesian4): boolean; + /** + * Compares this Cartesian against the provided Cartesian componentwise and returns + * true if they pass an absolute or relative tolerance test, + * false otherwise. + * @param [right] - The right hand side Cartesian. + * @param [relativeEpsilon = 0] - The relative epsilon tolerance to use for equality testing. + * @param [absoluteEpsilon = relativeEpsilon] - The absolute epsilon tolerance to use for equality testing. + * @returns true if they are within the provided epsilon, false otherwise. + */ + equalsEpsilon( + right?: Cartesian4, + relativeEpsilon?: number, + absoluteEpsilon?: number, + ): boolean; + /** + * Creates a string representing this Cartesian in the format '(x, y, z, w)'. + * @returns A string representing the provided Cartesian in the format '(x, y, z, w)'. + */ + toString(): string; + /** + * Packs an arbitrary floating point value to 4 values representable using uint8. + * @param value - A floating point number. + * @param [result] - The Cartesian4 that will contain the packed float. + * @returns A Cartesian4 representing the float packed to values in x, y, z, and w. + */ + static packFloat(value: number, result?: Cartesian4): Cartesian4; + } + + /** + * A position defined by longitude, latitude, and height. + * @param [longitude = 0.0] - The longitude, in radians. + * @param [latitude = 0.0] - The latitude, in radians. + * @param [height = 0.0] - The height, in meters, above the ellipsoid. + */ + export class Cartographic { + constructor(longitude?: number, latitude?: number, height?: number); + /** + * The longitude, in radians. + */ + longitude: number; + /** + * The latitude, in radians. + */ + latitude: number; + /** + * The height, in meters, above the ellipsoid. + */ + height: number; + /** + * Creates a new Cartographic instance from longitude and latitude + * specified in radians. + * @param longitude - The longitude, in radians. + * @param latitude - The latitude, in radians. + * @param [height = 0.0] - The height, in meters, above the ellipsoid. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartographic instance if one was not provided. + */ + static fromRadians( + longitude: number, + latitude: number, + height?: number, + result?: Cartographic, + ): Cartographic; + /** + * Creates a new Cartographic instance from longitude and latitude + * specified in degrees. The values in the resulting object will + * be in radians. + * @param longitude - The longitude, in degrees. + * @param latitude - The latitude, in degrees. + * @param [height = 0.0] - The height, in meters, above the ellipsoid. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartographic instance if one was not provided. + */ + static fromDegrees( + longitude: number, + latitude: number, + height?: number, + result?: Cartographic, + ): Cartographic; + /** + * Creates a new Cartographic instance from a Cartesian position. The values in the + * resulting object will be in radians. + * @param cartesian - The Cartesian position to convert to cartographic representation. + * @param [ellipsoid = Ellipsoid.default] - The ellipsoid on which the position lies. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter, new Cartographic instance if none was provided, or undefined if the cartesian is at the center of the ellipsoid. + */ + static fromCartesian( + cartesian: Cartesian3, + ellipsoid?: Ellipsoid, + result?: Cartographic, + ): Cartographic; + /** + * Creates a new Cartesian3 instance from a Cartographic input. The values in the inputted + * object should be in radians. + * @param cartographic - Input to be converted into a Cartesian3 output. + * @param [ellipsoid = Ellipsoid.default] - The ellipsoid on which the position lies. + * @param [result] - The object onto which to store the result. + * @returns The position + */ + static toCartesian( + cartographic: Cartographic, + ellipsoid?: Ellipsoid, + result?: Cartesian3, + ): Cartesian3; + /** + * Duplicates a Cartographic instance. + * @param cartographic - The cartographic to duplicate. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartographic instance if one was not provided. (Returns undefined if cartographic is undefined) + */ + static clone( + cartographic: Cartographic, + result?: Cartographic, + ): Cartographic; + /** + * Compares the provided cartographics componentwise and returns + * true if they are equal, false otherwise. + * @param [left] - The first cartographic. + * @param [right] - The second cartographic. + * @returns true if left and right are equal, false otherwise. + */ + static equals(left?: Cartographic, right?: Cartographic): boolean; + /** + * Compares the provided cartographics componentwise and returns + * true if they are within the provided epsilon, + * false otherwise. + * @param [left] - The first cartographic. + * @param [right] - The second cartographic. + * @param [epsilon = 0] - The epsilon to use for equality testing. + * @returns true if left and right are within the provided epsilon, false otherwise. + */ + static equalsEpsilon( + left?: Cartographic, + right?: Cartographic, + epsilon?: number, + ): boolean; + /** + * An immutable Cartographic instance initialized to (0.0, 0.0, 0.0). + */ + static readonly ZERO: Cartographic; + /** + * Duplicates this instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartographic instance if one was not provided. + */ + clone(result?: Cartographic): Cartographic; + /** + * Compares the provided against this cartographic componentwise and returns + * true if they are equal, false otherwise. + * @param [right] - The second cartographic. + * @returns true if left and right are equal, false otherwise. + */ + equals(right?: Cartographic): boolean; + /** + * Compares the provided against this cartographic componentwise and returns + * true if they are within the provided epsilon, + * false otherwise. + * @param [right] - The second cartographic. + * @param [epsilon = 0] - The epsilon to use for equality testing. + * @returns true if left and right are within the provided epsilon, false otherwise. + */ + equalsEpsilon(right?: Cartographic, epsilon?: number): boolean; + /** + * Creates a string representing this cartographic in the format '(longitude, latitude, height)'. + * @returns A string representing the provided cartographic in the format '(longitude, latitude, height)'. + */ + toString(): string; + } + + /** + * Geocodes queries containing longitude and latitude coordinates and an optional height. + * Query format: `longitude latitude (height)` with longitude/latitude in degrees and height in meters. + */ + export class CartographicGeocoderService { + constructor(); + /** + * Gets the credit to display after a geocode is performed. Typically this is used to credit + * the geocoder service. + */ + readonly credit: Credit | undefined; + /** + * @param query - The query to be sent to the geocoder service + */ + geocode(query: string): Promise; + } + + /** + * A Catmull-Rom spline is a cubic spline where the tangent at control points, + * except the first and last, are computed using the previous and next control points. + * Catmull-Rom splines are in the class C1. + * @example + * // spline above the earth from Philadelphia to Los Angeles + * const spline = new Cesium.CatmullRomSpline({ + * times : [ 0.0, 1.5, 3.0, 4.5, 6.0 ], + * points : [ + * new Cesium.Cartesian3(1235398.0, -4810983.0, 4146266.0), + * new Cesium.Cartesian3(1372574.0, -5345182.0, 4606657.0), + * new Cesium.Cartesian3(-757983.0, -5542796.0, 4514323.0), + * new Cesium.Cartesian3(-2821260.0, -5248423.0, 4021290.0), + * new Cesium.Cartesian3(-2539788.0, -4724797.0, 3620093.0) + * ] + * }); + * + * const p0 = spline.evaluate(times[i]); // equal to positions[i] + * const p1 = spline.evaluate(times[i] + delta); // interpolated value when delta < times[i + 1] - times[i] + * @param options - Object with the following properties: + * @param options.times - An array of strictly increasing, unit-less, floating-point times at each point. + * The values are in no way connected to the clock time. They are the parameterization for the curve. + * @param options.points - The array of {@link Cartesian3} control points. + * @param [options.firstTangent] - The tangent of the curve at the first control point. + * If the tangent is not given, it will be estimated. + * @param [options.lastTangent] - The tangent of the curve at the last control point. + * If the tangent is not given, it will be estimated. + */ + export class CatmullRomSpline { + constructor(options: { + times: number[]; + points: Cartesian3[]; + firstTangent?: Cartesian3; + lastTangent?: Cartesian3; + }); + /** + * An array of times for the control points. + */ + readonly times: number[]; + /** + * An array of {@link Cartesian3} control points. + */ + readonly points: Cartesian3[]; + /** + * The tangent at the first control point. + */ + readonly firstTangent: Cartesian3; + /** + * The tangent at the last control point. + */ + readonly lastTangent: Cartesian3; + /** + * Finds an index i in times such that the parameter + * time is in the interval [times[i], times[i + 1]]. + * @param time - The time. + * @returns The index for the element at the start of the interval. + */ + findTimeInterval(time: number): number; + /** + * Wraps the given time to the period covered by the spline. + * @param time - The time. + * @returns The time, wrapped around to the updated animation. + */ + wrapTime(time: number): number; + /** + * Clamps the given time to the period covered by the spline. + * @param time - The time. + * @returns The time, clamped to the animation period. + */ + clampTime(time: number): number; + /** + * Evaluates the curve at a given time. + * @param time - The time at which to evaluate the curve. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance of the point on the curve at the given time. + */ + evaluate(time: number, result?: Cartesian3): Cartesian3; + } + + export namespace CesiumTerrainProvider { + /** + * Initialization options for the CesiumTerrainProvider constructor + * @property [requestVertexNormals = false] - Flag that indicates if the client should request additional lighting information from the server, in the form of per vertex normals if available. + * @property [requestWaterMask = false] - Flag that indicates if the client should request per tile water masks from the server, if available. + * @property [requestMetadata = true] - Flag that indicates if the client should request per tile metadata from the server, if available. + * @property [ellipsoid = Ellipsoid.default] - The ellipsoid. If not specified, the default ellipsoid is used. + * @property [credit] - A credit for the data source, which is displayed on the canvas. + */ + type ConstructorOptions = { + requestVertexNormals?: boolean; + requestWaterMask?: boolean; + requestMetadata?: boolean; + ellipsoid?: Ellipsoid; + credit?: Credit | string; + }; + } + + /** + *
+ * To construct a CesiumTerrainProvider, call {@link CesiumTerrainProvider.fromIonAssetId} or {@link CesiumTerrainProvider.fromUrl}. Do not call the constructor directly. + *
+ * + * A {@link TerrainProvider} that accesses terrain data in a Cesium terrain format. + * Terrain formats can be one of the following: + *
    + *
  • {@link https://github.com/AnalyticalGraphicsInc/quantized-mesh Quantized Mesh}
  • + *
  • {@link https://github.com/AnalyticalGraphicsInc/cesium/wiki/heightmap-1.0 Height Map}
  • + *
+ * @example + * // Create Arctic DEM terrain with normals. + * try { + * const viewer = new Cesium.Viewer("cesiumContainer", { + * terrainProvider: await Cesium.CesiumTerrainProvider.fromIonAssetId(3956, { + * requestVertexNormals: true + * }) + * }); + * } catch (error) { + * console.log(error); + * } + * @param [options] - An object describing initialization options + */ + export class CesiumTerrainProvider { + constructor(options?: CesiumTerrainProvider.ConstructorOptions); + /** + * Requests the geometry for a given tile. The result must include terrain data and + * may optionally include a water mask and an indication of which child tiles are available. + * @param x - The X coordinate of the tile for which to request geometry. + * @param y - The Y coordinate of the tile for which to request geometry. + * @param level - The level of the tile for which to request geometry. + * @param [request] - The request object. Intended for internal use only. + * @returns A promise for the requested geometry. If this method + * returns undefined instead of a promise, it is an indication that too many requests are already + * pending and the request will be retried later. + */ + requestTileGeometry( + x: number, + y: number, + level: number, + request?: Request, + ): Promise | undefined; + /** + * Gets an event that is raised when the terrain provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + */ + readonly errorEvent: Event; + /** + * Gets the credit to display when this terrain provider is active. Typically this is used to credit + * the source of the terrain. + */ + readonly credit: Credit; + /** + * Gets the tiling scheme used by this provider. + */ + readonly tilingScheme: GeographicTilingScheme; + /** + * Gets a value indicating whether or not the provider includes a water mask. The water mask + * indicates which areas of the globe are water rather than land, so they can be rendered + * as a reflective surface with animated waves. + */ + readonly hasWaterMask: boolean; + /** + * Gets a value indicating whether or not the requested tiles include vertex normals. + */ + readonly hasVertexNormals: boolean; + /** + * Gets a value indicating whether or not the requested tiles include metadata. + */ + readonly hasMetadata: boolean; + /** + * Boolean flag that indicates if the client should request vertex normals from the server. + * Vertex normals data is appended to the standard tile mesh data only if the client requests the vertex normals and + * if the server provides vertex normals. + */ + readonly requestVertexNormals: boolean; + /** + * Boolean flag that indicates if the client should request a watermask from the server. + * Watermask data is appended to the standard tile mesh data only if the client requests the watermask and + * if the server provides a watermask. + */ + readonly requestWaterMask: boolean; + /** + * Boolean flag that indicates if the client should request metadata from the server. + * Metadata is appended to the standard tile mesh data only if the client requests the metadata and + * if the server provides a metadata. + */ + readonly requestMetadata: boolean; + /** + * Gets an object that can be used to determine availability of terrain from this provider, such as + * at points and in rectangles. This property may be undefined if availability + * information is not available. Note that this reflects tiles that are known to be available currently. + * Additional tiles may be discovered to be available in the future, e.g. if availability information + * exists deeper in the tree rather than it all being discoverable at the root. However, a tile that + * is available now will not become unavailable in the future. + */ + readonly availability: TileAvailability; + /** + * Gets the maximum geometric error allowed in a tile at a given level. + * @param level - The tile level for which to get the maximum geometric error. + * @returns The maximum geometric error. + */ + getLevelMaximumGeometricError(level: number): number; + /** + * Creates a {@link TerrainProvider} from a Cesium ion asset ID that accesses terrain data in a Cesium terrain format + * Terrain formats can be one of the following: + *
    + *
  • {@link https://github.com/AnalyticalGraphicsInc/quantized-mesh Quantized Mesh}
  • + *
  • {@link https://github.com/AnalyticalGraphicsInc/cesium/wiki/heightmap-1.0 Height Map}
  • + *
+ * @example + * // Create Arctic DEM terrain with normals. + * try { + * const viewer = new Cesium.Viewer("cesiumContainer", { + * terrainProvider: await Cesium.CesiumTerrainProvider.fromIonAssetId(3956, { + * requestVertexNormals: true + * }) + * }); + * } catch (error) { + * console.log(error); + * } + * @param assetId - The Cesium ion asset id. + * @param [options] - An object describing initialization options. + */ + static fromIonAssetId( + assetId: number, + options?: CesiumTerrainProvider.ConstructorOptions, + ): Promise; + /** + * Creates a {@link TerrainProvider} that accesses terrain data in a Cesium terrain format. + * Terrain formats can be one of the following: + *
    + *
  • {@link https://github.com/AnalyticalGraphicsInc/quantized-mesh Quantized Mesh}
  • + *
  • {@link https://github.com/AnalyticalGraphicsInc/cesium/wiki/heightmap-1.0 Height Map}
  • + *
+ * @example + * // Create Arctic DEM terrain with normals. + * try { + * const viewer = new Cesium.Viewer("cesiumContainer", { + * terrainProvider: await Cesium.CesiumTerrainProvider.fromUrl( + * Cesium.IonResource.fromAssetId(3956), { + * requestVertexNormals: true + * }) + * }); + * } catch (error) { + * console.log(error); + * } + * @param url - The URL of the Cesium terrain server. + * @param [options] - An object describing initialization options. + */ + static fromUrl( + url: Resource | string | Promise | Promise, + options?: CesiumTerrainProvider.ConstructorOptions, + ): Promise; + /** + * Determines whether data for a tile is available to be loaded. + * @param x - The X coordinate of the tile for which to request geometry. + * @param y - The Y coordinate of the tile for which to request geometry. + * @param level - The level of the tile for which to request geometry. + * @returns Undefined if not supported or availability is unknown, otherwise true or false. + */ + getTileDataAvailable( + x: number, + y: number, + level: number, + ): boolean | undefined; + /** + * Makes sure we load availability data for a tile + * @param x - The X coordinate of the tile for which to request geometry. + * @param y - The Y coordinate of the tile for which to request geometry. + * @param level - The level of the tile for which to request geometry. + * @returns Undefined if nothing need to be loaded or a Promise that resolves when all required tiles are loaded + */ + loadTileDataAvailability( + x: number, + y: number, + level: number, + ): undefined | Promise; + } + + /** + * Contains functions for checking that supplied arguments are of a specified type + * or meet specified conditions + */ + export const Check: { + /** + * Throws if test is not defined + * + * @param {string} name The name of the variable being tested + * @param {*} test The value that is to be checked + * @exception {DeveloperError} test must be defined + */ + defined(name: string, test: T): asserts test is NonNullable; + /** + * Contains type checking functions, all using the typeof operator + */ + typeOf: { + /** + * Throws if test is not typeof 'string' + * + * @param {string} name The name of the variable being tested + * @param {*} test The value to test + * @exception {DeveloperError} test must be typeof 'string' + */ + string(name: string, test: any): asserts test is string; + /** + * Throws if test is not typeof 'function' + * + * @param {string} name The name of the variable being tested + * @param {*} test The value to test + * @exception {DeveloperError} test must be typeof 'function' + */ + func(name: string, test: any): asserts test is Function; + /** + * Throws if test is not typeof 'object' + * + * @param {string} name The name of the variable being tested + * @param {*} test The value to test + * @exception {DeveloperError} test must be typeof 'object' + */ + object(name: string, test: any): asserts test is object; + /** + * Throws if test is not typeof 'boolean' + * + * @param {string} name The name of the variable being tested + * @param {*} test The value to test + * @exception {DeveloperError} test must be typeof 'boolean' + */ + bool(name: string, test: any): asserts test is boolean; + /** + * Throws if test is not typeof 'bigint' + * + * @param {string} name The name of the variable being tested + * @param {*} test The value to test + * @exception {DeveloperError} test must be typeof 'bigint' + */ + bigint(name: string, test: any): asserts test is bigint; + /** + * Throws if test is not typeof 'number' + * + * @param {string} name The name of the variable being tested + * @param {*} test The value to test + * @exception {DeveloperError} test must be typeof 'number' + */ + number: { + (name: string, test: any): void; + /** + * Throws if test is not typeof 'number' and less than limit + * + * @param {string} name The name of the variable being tested + * @param {*} test The value to test + * @param {number} limit The limit value to compare against + * @exception {DeveloperError} test must be typeof 'number' and less than limit + */ + lessThan( + name: string, + test: any, + limit: number, + ): asserts test is number; + /** + * Throws if test is not typeof 'number' and less than or equal to limit + * + * @param {string} name The name of the variable being tested + * @param {*} test The value to test + * @param {number} limit The limit value to compare against + * @exception {DeveloperError} test must be typeof 'number' and less than or equal to limit + */ + lessThanOrEquals( + name: string, + test: any, + limit: number, + ): asserts test is number; + /** + * Throws if test is not typeof 'number' and greater than limit + * + * @param {string} name The name of the variable being tested + * @param {*} test The value to test + * @param {number} limit The limit value to compare against + * @exception {DeveloperError} test must be typeof 'number' and greater than limit + */ + greaterThan( + name: string, + test: any, + limit: number, + ): asserts test is number; + /** + * Throws if test is not typeof 'number' and greater than or equal to limit + * + * @param {string} name The name of the variable being tested + * @param {*} test The value to test + * @param {number} limit The limit value to compare against + * @exception {DeveloperError} test must be typeof 'number' and greater than or equal to limit + */ + greaterThanOrEquals( + name: string, + test: any, + limit: number, + ): asserts test is number; + /** + * Throws if test1 and test2 is not typeof 'number' and not equal in value + * + * @param {string} name1 The name of the first variable being tested + * @param {string} name2 The name of the second variable being tested against + * @param {*} test1 The value to test + * @param {*} test2 The value to test against + * @exception {DeveloperError} test1 and test2 should be type of 'number' and be equal in value + */ + equals(name1: string, name2: string, test1: any, test2: any): void; + }; + }; + }; + + /** + * A description of a circle on the ellipsoid. Circle geometry can be rendered with both {@link Primitive} and {@link GroundPrimitive}. + * @example + * // Create a circle. + * const circle = new Cesium.CircleGeometry({ + * center : Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883), + * radius : 100000.0 + * }); + * const geometry = Cesium.CircleGeometry.createGeometry(circle); + * @param options - Object with the following properties: + * @param options.center - The circle's center point in the fixed frame. + * @param options.radius - The radius in meters. + * @param [options.ellipsoid = Ellipsoid.default] - The ellipsoid the circle will be on. + * @param [options.height = 0.0] - The distance in meters between the circle and the ellipsoid surface. + * @param [options.granularity = 0.02] - The angular distance between points on the circle in radians. + * @param [options.vertexFormat = VertexFormat.DEFAULT] - The vertex attributes to be computed. + * @param [options.extrudedHeight = 0.0] - The distance in meters between the circle's extruded face and the ellipsoid surface. + * @param [options.stRotation = 0.0] - The rotation of the texture coordinates, in radians. A positive rotation is counter-clockwise. + */ + export class CircleGeometry { + constructor(options: { + center: Cartesian3; + radius: number; + ellipsoid?: Ellipsoid; + height?: number; + granularity?: number; + vertexFormat?: VertexFormat; + extrudedHeight?: number; + stRotation?: number; + }); + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: CircleGeometry, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new CircleGeometry instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: CircleGeometry, + ): CircleGeometry; + /** + * Computes the geometric representation of a circle on an ellipsoid, including its vertices, indices, and a bounding sphere. + * @param circleGeometry - A description of the circle. + * @returns The computed vertices and indices. + */ + static createGeometry(circleGeometry: CircleGeometry): Geometry | undefined; + } + + /** + * A description of the outline of a circle on the ellipsoid. + * @example + * // Create a circle. + * const circle = new Cesium.CircleOutlineGeometry({ + * center : Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883), + * radius : 100000.0 + * }); + * const geometry = Cesium.CircleOutlineGeometry.createGeometry(circle); + * @param options - Object with the following properties: + * @param options.center - The circle's center point in the fixed frame. + * @param options.radius - The radius in meters. + * @param [options.ellipsoid = Ellipsoid.default] - The ellipsoid the circle will be on. + * @param [options.height = 0.0] - The distance in meters between the circle and the ellipsoid surface. + * @param [options.granularity = 0.02] - The angular distance between points on the circle in radians. + * @param [options.extrudedHeight = 0.0] - The distance in meters between the circle's extruded face and the ellipsoid surface. + * @param [options.numberOfVerticalLines = 16] - Number of lines to draw between the top and bottom of an extruded circle. + */ + export class CircleOutlineGeometry { + constructor(options: { + center: Cartesian3; + radius: number; + ellipsoid?: Ellipsoid; + height?: number; + granularity?: number; + extrudedHeight?: number; + numberOfVerticalLines?: number; + }); + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: CircleOutlineGeometry, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new CircleOutlineGeometry instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: CircleOutlineGeometry, + ): CircleOutlineGeometry; + /** + * Computes the geometric representation of an outline of a circle on an ellipsoid, including its vertices, indices, and a bounding sphere. + * @param circleGeometry - A description of the circle. + * @returns The computed vertices and indices. + */ + static createGeometry( + circleGeometry: CircleOutlineGeometry, + ): Geometry | undefined; + } + + /** + * A simple clock for keeping track of simulated time. + * @example + * // Create a clock that loops on Christmas day 2013 and runs in real-time. + * const clock = new Cesium.Clock({ + * startTime : Cesium.JulianDate.fromIso8601("2013-12-25"), + * currentTime : Cesium.JulianDate.fromIso8601("2013-12-25"), + * stopTime : Cesium.JulianDate.fromIso8601("2013-12-26"), + * clockRange : Cesium.ClockRange.LOOP_STOP, + * clockStep : Cesium.ClockStep.SYSTEM_CLOCK_MULTIPLIER + * }); + * @param [options] - Object with the following properties: + * @param [options.startTime] - The start time of the clock. + * @param [options.stopTime] - The stop time of the clock. + * @param [options.currentTime] - The current time. + * @param [options.multiplier = 1.0] - Determines how much time advances when {@link Clock#tick} is called, negative values allow for advancing backwards. + * @param [options.clockStep = ClockStep.SYSTEM_CLOCK_MULTIPLIER] - Determines if calls to {@link Clock#tick} are frame dependent or system clock dependent. + * @param [options.clockRange = ClockRange.UNBOUNDED] - Determines how the clock should behave when {@link Clock#startTime} or {@link Clock#stopTime} is reached. + * @param [options.canAnimate = true] - Indicates whether {@link Clock#tick} can advance time. This could be false if data is being buffered, for example. The clock will only tick when both {@link Clock#canAnimate} and {@link Clock#shouldAnimate} are true. + * @param [options.shouldAnimate = false] - Indicates whether {@link Clock#tick} should attempt to advance time. The clock will only tick when both {@link Clock#canAnimate} and {@link Clock#shouldAnimate} are true. + */ + export class Clock { + constructor(options?: { + startTime?: JulianDate; + stopTime?: JulianDate; + currentTime?: JulianDate; + multiplier?: number; + clockStep?: ClockStep; + clockRange?: ClockRange; + canAnimate?: boolean; + shouldAnimate?: boolean; + }); + /** + * The start time of the clock. + */ + startTime: JulianDate; + /** + * The stop time of the clock. + */ + stopTime: JulianDate; + /** + * Determines how the clock should behave when + * {@link Clock#startTime} or {@link Clock#stopTime} + * is reached. + */ + clockRange: ClockRange; + /** + * Indicates whether {@link Clock#tick} can advance time. This could be false if data is being buffered, + * for example. The clock will only advance time when both + * {@link Clock#canAnimate} and {@link Clock#shouldAnimate} are true. + */ + canAnimate: boolean; + /** + * An {@link Event} that is fired whenever {@link Clock#tick} is called. + */ + onTick: Event; + /** + * An {@link Event} that is fired whenever {@link Clock#stopTime} is reached. + */ + onStop: Event; + /** + * The current time. + * Changing this property will change + * {@link Clock#clockStep} from {@link ClockStep.SYSTEM_CLOCK} to + * {@link ClockStep.SYSTEM_CLOCK_MULTIPLIER}. + */ + currentTime: JulianDate; + /** + * Gets or sets how much time advances when {@link Clock#tick} is called. Negative values allow for advancing backwards. + * If {@link Clock#clockStep} is set to {@link ClockStep.TICK_DEPENDENT}, this is the number of seconds to advance. + * If {@link Clock#clockStep} is set to {@link ClockStep.SYSTEM_CLOCK_MULTIPLIER}, this value is multiplied by the + * elapsed system time since the last call to {@link Clock#tick}. + * Changing this property will change + * {@link Clock#clockStep} from {@link ClockStep.SYSTEM_CLOCK} to + * {@link ClockStep.SYSTEM_CLOCK_MULTIPLIER}. + */ + multiplier: number; + /** + * Determines if calls to {@link Clock#tick} are frame dependent or system clock dependent. + * Changing this property to {@link ClockStep.SYSTEM_CLOCK} will set + * {@link Clock#multiplier} to 1.0, {@link Clock#shouldAnimate} to true, and + * {@link Clock#currentTime} to the current system clock time. + */ + clockStep: ClockStep; + /** + * Indicates whether {@link Clock#tick} should attempt to advance time. + * The clock will only advance time when both + * {@link Clock#canAnimate} and {@link Clock#shouldAnimate} are true. + * Changing this property will change + * {@link Clock#clockStep} from {@link ClockStep.SYSTEM_CLOCK} to + * {@link ClockStep.SYSTEM_CLOCK_MULTIPLIER}. + */ + shouldAnimate: boolean; + /** + * Advances the clock from the current time based on the current configuration options. + * tick should be called every frame, regardless of whether animation is taking place + * or not. To control animation, use the {@link Clock#shouldAnimate} property. + * @returns The new value of the {@link Clock#currentTime} property. + */ + tick(): JulianDate; + } + + /** + * Constants used by {@link Clock#tick} to determine behavior + * when {@link Clock#startTime} or {@link Clock#stopTime} is reached. + */ + export enum ClockRange { + /** + * {@link Clock#tick} will always advances the clock in its current direction. + */ + UNBOUNDED = 0, + /** + * When {@link Clock#startTime} or {@link Clock#stopTime} is reached, + * {@link Clock#tick} will not advance {@link Clock#currentTime} any further. + */ + CLAMPED = 1, + /** + * When {@link Clock#stopTime} is reached, {@link Clock#tick} will advance + * {@link Clock#currentTime} to the opposite end of the interval. When + * time is moving backwards, {@link Clock#tick} will not advance past + * {@link Clock#startTime} + */ + LOOP_STOP = 2, + } + + /** + * Constants to determine how much time advances with each call + * to {@link Clock#tick}. + */ + export enum ClockStep { + /** + * {@link Clock#tick} advances the current time by a fixed step, + * which is the number of seconds specified by {@link Clock#multiplier}. + */ + TICK_DEPENDENT = 0, + /** + * {@link Clock#tick} advances the current time by the amount of system + * time elapsed since the previous call multiplied by {@link Clock#multiplier}. + */ + SYSTEM_CLOCK_MULTIPLIER = 1, + /** + * {@link Clock#tick} sets the clock to the current system time; + * ignoring all other settings. + */ + SYSTEM_CLOCK = 2, + } + + /** + * A color, specified using red, green, blue, and alpha values, + * which range from 0 (no intensity) to 1.0 (full intensity). + * @param [red = 1.0] - The red component. + * @param [green = 1.0] - The green component. + * @param [blue = 1.0] - The blue component. + * @param [alpha = 1.0] - The alpha component. + */ + export class Color { + constructor(red?: number, green?: number, blue?: number, alpha?: number); + /** + * The red component. + */ + red: number; + /** + * The green component. + */ + green: number; + /** + * The blue component. + */ + blue: number; + /** + * The alpha component. + */ + alpha: number; + /** + * Creates a Color instance from a {@link Cartesian4}. x, y, z, + * and w map to red, green, blue, and alpha, respectively. + * @param cartesian - The source cartesian. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Color instance if one was not provided. + */ + static fromCartesian4(cartesian: Cartesian4, result?: Color): Color; + /** + * Creates a new Color specified using red, green, blue, and alpha values + * that are in the range of 0 to 255, converting them internally to a range of 0.0 to 1.0. + * @param [red = 255] - The red component. + * @param [green = 255] - The green component. + * @param [blue = 255] - The blue component. + * @param [alpha = 255] - The alpha component. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Color instance if one was not provided. + */ + static fromBytes( + red?: number, + green?: number, + blue?: number, + alpha?: number, + result?: Color, + ): Color; + /** + * Creates a new Color that has the same red, green, and blue components + * of the specified color, but with the specified alpha value. + * @example + * const translucentRed = Cesium.Color.fromAlpha(Cesium.Color.RED, 0.9); + * @param color - The base color + * @param alpha - The new alpha component. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Color instance if one was not provided. + */ + static fromAlpha(color: Color, alpha: number, result?: Color): Color; + /** + * Creates a new Color from a single numeric unsigned 32-bit RGBA value, using the endianness + * of the system. + * @example + * const color = Cesium.Color.fromRgba(0x67ADDFFF); + * @param rgba - A single numeric unsigned 32-bit RGBA value. + * @param [result] - The object to store the result in, if undefined a new instance will be created. + * @returns The color object. + */ + static fromRgba(rgba: number, result?: Color): Color; + /** + * Creates a Color instance from hue, saturation, and lightness. + * @param [hue = 0] - The hue angle 0...1 + * @param [saturation = 0] - The saturation value 0...1 + * @param [lightness = 0] - The lightness value 0...1 + * @param [alpha = 1.0] - The alpha component 0...1 + * @param [result] - The object to store the result in, if undefined a new instance will be created. + * @returns The color object. + */ + static fromHsl( + hue?: number, + saturation?: number, + lightness?: number, + alpha?: number, + result?: Color, + ): Color; + /** + * Creates a random color using the provided options. For reproducible random colors, you should + * call {@link Math#setRandomNumberSeed} once at the beginning of your application. + * @example + * //Create a completely random color + * const color = Cesium.Color.fromRandom(); + * + * //Create a random shade of yellow. + * const color1 = Cesium.Color.fromRandom({ + * red : 1.0, + * green : 1.0, + * alpha : 1.0 + * }); + * + * //Create a random bright color. + * const color2 = Cesium.Color.fromRandom({ + * minimumRed : 0.75, + * minimumGreen : 0.75, + * minimumBlue : 0.75, + * alpha : 1.0 + * }); + * @param [options] - Object with the following properties: + * @param [options.red] - If specified, the red component to use instead of a randomized value. + * @param [options.minimumRed = 0.0] - The maximum red value to generate if none was specified. + * @param [options.maximumRed = 1.0] - The minimum red value to generate if none was specified. + * @param [options.green] - If specified, the green component to use instead of a randomized value. + * @param [options.minimumGreen = 0.0] - The maximum green value to generate if none was specified. + * @param [options.maximumGreen = 1.0] - The minimum green value to generate if none was specified. + * @param [options.blue] - If specified, the blue component to use instead of a randomized value. + * @param [options.minimumBlue = 0.0] - The maximum blue value to generate if none was specified. + * @param [options.maximumBlue = 1.0] - The minimum blue value to generate if none was specified. + * @param [options.alpha] - If specified, the alpha component to use instead of a randomized value. + * @param [options.minimumAlpha = 0.0] - The maximum alpha value to generate if none was specified. + * @param [options.maximumAlpha = 1.0] - The minimum alpha value to generate if none was specified. + * @param [result] - The object to store the result in, if undefined a new instance will be created. + * @returns The modified result parameter or a new instance if result was undefined. + */ + static fromRandom( + options?: { + red?: number; + minimumRed?: number; + maximumRed?: number; + green?: number; + minimumGreen?: number; + maximumGreen?: number; + blue?: number; + minimumBlue?: number; + maximumBlue?: number; + alpha?: number; + minimumAlpha?: number; + maximumAlpha?: number; + }, + result?: Color, + ): Color; + /** + * Creates a Color instance from a CSS color value. + * @example + * const cesiumBlue = Cesium.Color.fromCssColorString('#67ADDF'); + * const green = Cesium.Color.fromCssColorString('green'); + * @param color - The CSS color value in #rgb, #rgba, #rrggbb, #rrggbbaa, rgb(), rgba(), hsl(), or hsla() format. + * @param [result] - The object to store the result in, if undefined a new instance will be created. + * @returns The color object, or undefined if the string was not a valid CSS color. + */ + static fromCssColorString(color: string, result?: Color): Color; + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: Color, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new Color instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: Color, + ): Color; + /** + * Converts a 'byte' color component in the range of 0 to 255 into + * a 'float' color component in the range of 0 to 1.0. + * @param number - The number to be converted. + * @returns The converted number. + */ + static byteToFloat(number: number): number; + /** + * Converts a 'float' color component in the range of 0 to 1.0 into + * a 'byte' color component in the range of 0 to 255. + * @param number - The number to be converted. + * @returns The converted number. + */ + static floatToByte(number: number): number; + /** + * Duplicates a Color. + * @param color - The Color to duplicate. + * @param [result] - The object to store the result in, if undefined a new instance will be created. + * @returns The modified result parameter or a new instance if result was undefined. (Returns undefined if color is undefined) + */ + static clone(color: Color, result?: Color): Color; + /** + * Returns true if the first Color equals the second color. + * @param [left] - The first Color to compare for equality. + * @param [right] - The second Color to compare for equality. + * @returns true if the Colors are equal; otherwise, false. + */ + static equals(left?: Color, right?: Color): boolean; + /** + * Returns a duplicate of a Color instance. + * @param [result] - The object to store the result in, if undefined a new instance will be created. + * @returns The modified result parameter or a new instance if result was undefined. + */ + clone(result?: Color): Color; + /** + * Returns true if this Color equals other. + * @param [other] - The Color to compare for equality. + * @returns true if the Colors are equal; otherwise, false. + */ + equals(other?: Color): boolean; + /** + * Returns true if this Color equals other componentwise within the specified epsilon. + * @param other - The Color to compare for equality. + * @param [epsilon = 0.0] - The epsilon to use for equality testing. + * @returns true if the Colors are equal within the specified epsilon; otherwise, false. + */ + equalsEpsilon(other: Color, epsilon?: number): boolean; + /** + * Creates a string representing this Color in the format '(red, green, blue, alpha)'. + * @returns A string representing this Color in the format '(red, green, blue, alpha)'. + */ + toString(): string; + /** + * Creates a string containing the CSS color value for this color. + * @returns The CSS equivalent of this color. + */ + toCssColorString(): string; + /** + * Creates a string containing CSS hex string color value for this color. + * @returns The CSS hex string equivalent of this color. + */ + toCssHexString(): string; + /** + * Converts this color to an array of red, green, blue, and alpha values + * that are in the range of 0 to 255. + * @param [result] - The array to store the result in, if undefined a new instance will be created. + * @returns The modified result parameter or a new instance if result was undefined. + */ + toBytes(result?: number[]): number[]; + /** + * Converts this color to a single numeric unsigned 32-bit RGBA value, using the endianness + * of the system. + * @example + * const rgba = Cesium.Color.BLUE.toRgba(); + * @returns A single numeric unsigned 32-bit RGBA value. + */ + toRgba(): number; + /** + * Brightens this color by the provided magnitude. + * @example + * const brightBlue = Cesium.Color.BLUE.brighten(0.5, new Cesium.Color()); + * @param magnitude - A positive number indicating the amount to brighten. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + brighten(magnitude: number, result: Color): Color; + /** + * Darkens this color by the provided magnitude. + * @example + * const darkBlue = Cesium.Color.BLUE.darken(0.5, new Cesium.Color()); + * @param magnitude - A positive number indicating the amount to darken. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + darken(magnitude: number, result: Color): Color; + /** + * Creates a new Color that has the same red, green, and blue components + * as this Color, but with the specified alpha value. + * @example + * const translucentRed = Cesium.Color.RED.withAlpha(0.9); + * @param alpha - The new alpha component. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Color instance if one was not provided. + */ + withAlpha(alpha: number, result?: Color): Color; + /** + * Computes the componentwise sum of two Colors. + * @param left - The first Color. + * @param right - The second Color. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static add(left: Color, right: Color, result: Color): Color; + /** + * Computes the componentwise difference of two Colors. + * @param left - The first Color. + * @param right - The second Color. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static subtract(left: Color, right: Color, result: Color): Color; + /** + * Computes the componentwise product of two Colors. + * @param left - The first Color. + * @param right - The second Color. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiply(left: Color, right: Color, result: Color): Color; + /** + * Computes the componentwise quotient of two Colors. + * @param left - The first Color. + * @param right - The second Color. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static divide(left: Color, right: Color, result: Color): Color; + /** + * Computes the componentwise modulus of two Colors. + * @param left - The first Color. + * @param right - The second Color. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static mod(left: Color, right: Color, result: Color): Color; + /** + * Computes the linear interpolation or extrapolation at t between the provided colors. + * @param start - The color corresponding to t at 0.0. + * @param end - The color corresponding to t at 1.0. + * @param t - The point along t at which to interpolate. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static lerp(start: Color, end: Color, t: number, result: Color): Color; + /** + * Multiplies the provided Color componentwise by the provided scalar. + * @param color - The Color to be scaled. + * @param scalar - The scalar to multiply with. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyByScalar(color: Color, scalar: number, result: Color): Color; + /** + * Divides the provided Color componentwise by the provided scalar. + * @param color - The Color to be divided. + * @param scalar - The scalar to divide with. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static divideByScalar(color: Color, scalar: number, result: Color): Color; + /** + * An immutable Color instance initialized to CSS color #F0F8FF + * + */ + static readonly ALICEBLUE: Color; + /** + * An immutable Color instance initialized to CSS color #FAEBD7 + * + */ + static readonly ANTIQUEWHITE: Color; + /** + * An immutable Color instance initialized to CSS color #00FFFF + * + */ + static readonly AQUA: Color; + /** + * An immutable Color instance initialized to CSS color #7FFFD4 + * + */ + static readonly AQUAMARINE: Color; + /** + * An immutable Color instance initialized to CSS color #F0FFFF + * + */ + static readonly AZURE: Color; + /** + * An immutable Color instance initialized to CSS color #F5F5DC + * + */ + static readonly BEIGE: Color; + /** + * An immutable Color instance initialized to CSS color #FFE4C4 + * + */ + static readonly BISQUE: Color; + /** + * An immutable Color instance initialized to CSS color #000000 + * + */ + static readonly BLACK: Color; + /** + * An immutable Color instance initialized to CSS color #FFEBCD + * + */ + static readonly BLANCHEDALMOND: Color; + /** + * An immutable Color instance initialized to CSS color #0000FF + * + */ + static readonly BLUE: Color; + /** + * An immutable Color instance initialized to CSS color #8A2BE2 + * + */ + static readonly BLUEVIOLET: Color; + /** + * An immutable Color instance initialized to CSS color #A52A2A + * + */ + static readonly BROWN: Color; + /** + * An immutable Color instance initialized to CSS color #DEB887 + * + */ + static readonly BURLYWOOD: Color; + /** + * An immutable Color instance initialized to CSS color #5F9EA0 + * + */ + static readonly CADETBLUE: Color; + /** + * An immutable Color instance initialized to CSS color #7FFF00 + * + */ + static readonly CHARTREUSE: Color; + /** + * An immutable Color instance initialized to CSS color #D2691E + * + */ + static readonly CHOCOLATE: Color; + /** + * An immutable Color instance initialized to CSS color #FF7F50 + * + */ + static readonly CORAL: Color; + /** + * An immutable Color instance initialized to CSS color #6495ED + * + */ + static readonly CORNFLOWERBLUE: Color; + /** + * An immutable Color instance initialized to CSS color #FFF8DC + * + */ + static readonly CORNSILK: Color; + /** + * An immutable Color instance initialized to CSS color #DC143C + * + */ + static readonly CRIMSON: Color; + /** + * An immutable Color instance initialized to CSS color #00FFFF + * + */ + static readonly CYAN: Color; + /** + * An immutable Color instance initialized to CSS color #00008B + * + */ + static readonly DARKBLUE: Color; + /** + * An immutable Color instance initialized to CSS color #008B8B + * + */ + static readonly DARKCYAN: Color; + /** + * An immutable Color instance initialized to CSS color #B8860B + * + */ + static readonly DARKGOLDENROD: Color; + /** + * An immutable Color instance initialized to CSS color #A9A9A9 + * + */ + static readonly DARKGRAY: Color; + /** + * An immutable Color instance initialized to CSS color #006400 + * + */ + static readonly DARKGREEN: Color; + /** + * An immutable Color instance initialized to CSS color #A9A9A9 + * + */ + static readonly DARKGREY: Color; + /** + * An immutable Color instance initialized to CSS color #BDB76B + * + */ + static readonly DARKKHAKI: Color; + /** + * An immutable Color instance initialized to CSS color #8B008B + * + */ + static readonly DARKMAGENTA: Color; + /** + * An immutable Color instance initialized to CSS color #556B2F + * + */ + static readonly DARKOLIVEGREEN: Color; + /** + * An immutable Color instance initialized to CSS color #FF8C00 + * + */ + static readonly DARKORANGE: Color; + /** + * An immutable Color instance initialized to CSS color #9932CC + * + */ + static readonly DARKORCHID: Color; + /** + * An immutable Color instance initialized to CSS color #8B0000 + * + */ + static readonly DARKRED: Color; + /** + * An immutable Color instance initialized to CSS color #E9967A + * + */ + static readonly DARKSALMON: Color; + /** + * An immutable Color instance initialized to CSS color #8FBC8F + * + */ + static readonly DARKSEAGREEN: Color; + /** + * An immutable Color instance initialized to CSS color #483D8B + * + */ + static readonly DARKSLATEBLUE: Color; + /** + * An immutable Color instance initialized to CSS color #2F4F4F + * + */ + static readonly DARKSLATEGRAY: Color; + /** + * An immutable Color instance initialized to CSS color #2F4F4F + * + */ + static readonly DARKSLATEGREY: Color; + /** + * An immutable Color instance initialized to CSS color #00CED1 + * + */ + static readonly DARKTURQUOISE: Color; + /** + * An immutable Color instance initialized to CSS color #9400D3 + * + */ + static readonly DARKVIOLET: Color; + /** + * An immutable Color instance initialized to CSS color #FF1493 + * + */ + static readonly DEEPPINK: Color; + /** + * An immutable Color instance initialized to CSS color #00BFFF + * + */ + static readonly DEEPSKYBLUE: Color; + /** + * An immutable Color instance initialized to CSS color #696969 + * + */ + static readonly DIMGRAY: Color; + /** + * An immutable Color instance initialized to CSS color #696969 + * + */ + static readonly DIMGREY: Color; + /** + * An immutable Color instance initialized to CSS color #1E90FF + * + */ + static readonly DODGERBLUE: Color; + /** + * An immutable Color instance initialized to CSS color #B22222 + * + */ + static readonly FIREBRICK: Color; + /** + * An immutable Color instance initialized to CSS color #FFFAF0 + * + */ + static readonly FLORALWHITE: Color; + /** + * An immutable Color instance initialized to CSS color #228B22 + * + */ + static readonly FORESTGREEN: Color; + /** + * An immutable Color instance initialized to CSS color #FF00FF + * + */ + static readonly FUCHSIA: Color; + /** + * An immutable Color instance initialized to CSS color #DCDCDC + * + */ + static readonly GAINSBORO: Color; + /** + * An immutable Color instance initialized to CSS color #F8F8FF + * + */ + static readonly GHOSTWHITE: Color; + /** + * An immutable Color instance initialized to CSS color #FFD700 + * + */ + static readonly GOLD: Color; + /** + * An immutable Color instance initialized to CSS color #DAA520 + * + */ + static readonly GOLDENROD: Color; + /** + * An immutable Color instance initialized to CSS color #808080 + * + */ + static readonly GRAY: Color; + /** + * An immutable Color instance initialized to CSS color #008000 + * + */ + static readonly GREEN: Color; + /** + * An immutable Color instance initialized to CSS color #ADFF2F + * + */ + static readonly GREENYELLOW: Color; + /** + * An immutable Color instance initialized to CSS color #808080 + * + */ + static readonly GREY: Color; + /** + * An immutable Color instance initialized to CSS color #F0FFF0 + * + */ + static readonly HONEYDEW: Color; + /** + * An immutable Color instance initialized to CSS color #FF69B4 + * + */ + static readonly HOTPINK: Color; + /** + * An immutable Color instance initialized to CSS color #CD5C5C + * + */ + static readonly INDIANRED: Color; + /** + * An immutable Color instance initialized to CSS color #4B0082 + * + */ + static readonly INDIGO: Color; + /** + * An immutable Color instance initialized to CSS color #FFFFF0 + * + */ + static readonly IVORY: Color; + /** + * An immutable Color instance initialized to CSS color #F0E68C + * + */ + static readonly KHAKI: Color; + /** + * An immutable Color instance initialized to CSS color #E6E6FA + * + */ + static readonly LAVENDER: Color; + /** + * An immutable Color instance initialized to CSS color #FFF0F5 + * + */ + static readonly LAVENDAR_BLUSH: Color; + /** + * An immutable Color instance initialized to CSS color #7CFC00 + * + */ + static readonly LAWNGREEN: Color; + /** + * An immutable Color instance initialized to CSS color #FFFACD + * + */ + static readonly LEMONCHIFFON: Color; + /** + * An immutable Color instance initialized to CSS color #ADD8E6 + * + */ + static readonly LIGHTBLUE: Color; + /** + * An immutable Color instance initialized to CSS color #F08080 + * + */ + static readonly LIGHTCORAL: Color; + /** + * An immutable Color instance initialized to CSS color #E0FFFF + * + */ + static readonly LIGHTCYAN: Color; + /** + * An immutable Color instance initialized to CSS color #FAFAD2 + * + */ + static readonly LIGHTGOLDENRODYELLOW: Color; + /** + * An immutable Color instance initialized to CSS color #D3D3D3 + * + */ + static readonly LIGHTGRAY: Color; + /** + * An immutable Color instance initialized to CSS color #90EE90 + * + */ + static readonly LIGHTGREEN: Color; + /** + * An immutable Color instance initialized to CSS color #D3D3D3 + * + */ + static readonly LIGHTGREY: Color; + /** + * An immutable Color instance initialized to CSS color #FFB6C1 + * + */ + static readonly LIGHTPINK: Color; + /** + * An immutable Color instance initialized to CSS color #20B2AA + * + */ + static readonly LIGHTSEAGREEN: Color; + /** + * An immutable Color instance initialized to CSS color #87CEFA + * + */ + static readonly LIGHTSKYBLUE: Color; + /** + * An immutable Color instance initialized to CSS color #778899 + * + */ + static readonly LIGHTSLATEGRAY: Color; + /** + * An immutable Color instance initialized to CSS color #778899 + * + */ + static readonly LIGHTSLATEGREY: Color; + /** + * An immutable Color instance initialized to CSS color #B0C4DE + * + */ + static readonly LIGHTSTEELBLUE: Color; + /** + * An immutable Color instance initialized to CSS color #FFFFE0 + * + */ + static readonly LIGHTYELLOW: Color; + /** + * An immutable Color instance initialized to CSS color #00FF00 + * + */ + static readonly LIME: Color; + /** + * An immutable Color instance initialized to CSS color #32CD32 + * + */ + static readonly LIMEGREEN: Color; + /** + * An immutable Color instance initialized to CSS color #FAF0E6 + * + */ + static readonly LINEN: Color; + /** + * An immutable Color instance initialized to CSS color #FF00FF + * + */ + static readonly MAGENTA: Color; + /** + * An immutable Color instance initialized to CSS color #800000 + * + */ + static readonly MAROON: Color; + /** + * An immutable Color instance initialized to CSS color #66CDAA + * + */ + static readonly MEDIUMAQUAMARINE: Color; + /** + * An immutable Color instance initialized to CSS color #0000CD + * + */ + static readonly MEDIUMBLUE: Color; + /** + * An immutable Color instance initialized to CSS color #BA55D3 + * + */ + static readonly MEDIUMORCHID: Color; + /** + * An immutable Color instance initialized to CSS color #9370DB + * + */ + static readonly MEDIUMPURPLE: Color; + /** + * An immutable Color instance initialized to CSS color #3CB371 + * + */ + static readonly MEDIUMSEAGREEN: Color; + /** + * An immutable Color instance initialized to CSS color #7B68EE + * + */ + static readonly MEDIUMSLATEBLUE: Color; + /** + * An immutable Color instance initialized to CSS color #00FA9A + * + */ + static readonly MEDIUMSPRINGGREEN: Color; + /** + * An immutable Color instance initialized to CSS color #48D1CC + * + */ + static readonly MEDIUMTURQUOISE: Color; + /** + * An immutable Color instance initialized to CSS color #C71585 + * + */ + static readonly MEDIUMVIOLETRED: Color; + /** + * An immutable Color instance initialized to CSS color #191970 + * + */ + static readonly MIDNIGHTBLUE: Color; + /** + * An immutable Color instance initialized to CSS color #F5FFFA + * + */ + static readonly MINTCREAM: Color; + /** + * An immutable Color instance initialized to CSS color #FFE4E1 + * + */ + static readonly MISTYROSE: Color; + /** + * An immutable Color instance initialized to CSS color #FFE4B5 + * + */ + static readonly MOCCASIN: Color; + /** + * An immutable Color instance initialized to CSS color #FFDEAD + * + */ + static readonly NAVAJOWHITE: Color; + /** + * An immutable Color instance initialized to CSS color #000080 + * + */ + static readonly NAVY: Color; + /** + * An immutable Color instance initialized to CSS color #FDF5E6 + * + */ + static readonly OLDLACE: Color; + /** + * An immutable Color instance initialized to CSS color #808000 + * + */ + static readonly OLIVE: Color; + /** + * An immutable Color instance initialized to CSS color #6B8E23 + * + */ + static readonly OLIVEDRAB: Color; + /** + * An immutable Color instance initialized to CSS color #FFA500 + * + */ + static readonly ORANGE: Color; + /** + * An immutable Color instance initialized to CSS color #FF4500 + * + */ + static readonly ORANGERED: Color; + /** + * An immutable Color instance initialized to CSS color #DA70D6 + * + */ + static readonly ORCHID: Color; + /** + * An immutable Color instance initialized to CSS color #EEE8AA + * + */ + static readonly PALEGOLDENROD: Color; + /** + * An immutable Color instance initialized to CSS color #98FB98 + * + */ + static readonly PALEGREEN: Color; + /** + * An immutable Color instance initialized to CSS color #AFEEEE + * + */ + static readonly PALETURQUOISE: Color; + /** + * An immutable Color instance initialized to CSS color #DB7093 + * + */ + static readonly PALEVIOLETRED: Color; + /** + * An immutable Color instance initialized to CSS color #FFEFD5 + * + */ + static readonly PAPAYAWHIP: Color; + /** + * An immutable Color instance initialized to CSS color #FFDAB9 + * + */ + static readonly PEACHPUFF: Color; + /** + * An immutable Color instance initialized to CSS color #CD853F + * + */ + static readonly PERU: Color; + /** + * An immutable Color instance initialized to CSS color #FFC0CB + * + */ + static readonly PINK: Color; + /** + * An immutable Color instance initialized to CSS color #DDA0DD + * + */ + static readonly PLUM: Color; + /** + * An immutable Color instance initialized to CSS color #B0E0E6 + * + */ + static readonly POWDERBLUE: Color; + /** + * An immutable Color instance initialized to CSS color #800080 + * + */ + static readonly PURPLE: Color; + /** + * An immutable Color instance initialized to CSS color #FF0000 + * + */ + static readonly RED: Color; + /** + * An immutable Color instance initialized to CSS color #BC8F8F + * + */ + static readonly ROSYBROWN: Color; + /** + * An immutable Color instance initialized to CSS color #4169E1 + * + */ + static readonly ROYALBLUE: Color; + /** + * An immutable Color instance initialized to CSS color #8B4513 + * + */ + static readonly SADDLEBROWN: Color; + /** + * An immutable Color instance initialized to CSS color #FA8072 + * + */ + static readonly SALMON: Color; + /** + * An immutable Color instance initialized to CSS color #F4A460 + * + */ + static readonly SANDYBROWN: Color; + /** + * An immutable Color instance initialized to CSS color #2E8B57 + * + */ + static readonly SEAGREEN: Color; + /** + * An immutable Color instance initialized to CSS color #FFF5EE + * + */ + static readonly SEASHELL: Color; + /** + * An immutable Color instance initialized to CSS color #A0522D + * + */ + static readonly SIENNA: Color; + /** + * An immutable Color instance initialized to CSS color #C0C0C0 + * + */ + static readonly SILVER: Color; + /** + * An immutable Color instance initialized to CSS color #87CEEB + * + */ + static readonly SKYBLUE: Color; + /** + * An immutable Color instance initialized to CSS color #6A5ACD + * + */ + static readonly SLATEBLUE: Color; + /** + * An immutable Color instance initialized to CSS color #708090 + * + */ + static readonly SLATEGRAY: Color; + /** + * An immutable Color instance initialized to CSS color #708090 + * + */ + static readonly SLATEGREY: Color; + /** + * An immutable Color instance initialized to CSS color #FFFAFA + * + */ + static readonly SNOW: Color; + /** + * An immutable Color instance initialized to CSS color #00FF7F + * + */ + static readonly SPRINGGREEN: Color; + /** + * An immutable Color instance initialized to CSS color #4682B4 + * + */ + static readonly STEELBLUE: Color; + /** + * An immutable Color instance initialized to CSS color #D2B48C + * + */ + static readonly TAN: Color; + /** + * An immutable Color instance initialized to CSS color #008080 + * + */ + static readonly TEAL: Color; + /** + * An immutable Color instance initialized to CSS color #D8BFD8 + * + */ + static readonly THISTLE: Color; + /** + * An immutable Color instance initialized to CSS color #FF6347 + * + */ + static readonly TOMATO: Color; + /** + * An immutable Color instance initialized to CSS color #40E0D0 + * + */ + static readonly TURQUOISE: Color; + /** + * An immutable Color instance initialized to CSS color #EE82EE + * + */ + static readonly VIOLET: Color; + /** + * An immutable Color instance initialized to CSS color #F5DEB3 + * + */ + static readonly WHEAT: Color; + /** + * An immutable Color instance initialized to CSS color #FFFFFF + * + */ + static readonly WHITE: Color; + /** + * An immutable Color instance initialized to CSS color #F5F5F5 + * + */ + static readonly WHITESMOKE: Color; + /** + * An immutable Color instance initialized to CSS color #FFFF00 + * + */ + static readonly YELLOW: Color; + /** + * An immutable Color instance initialized to CSS color #9ACD32 + * + */ + static readonly YELLOWGREEN: Color; + /** + * An immutable Color instance initialized to CSS transparent. + * + */ + static readonly TRANSPARENT: Color; + } + + /** + * Value and type information for per-instance geometry color. + * @example + * const instance = new Cesium.GeometryInstance({ + * geometry : Cesium.BoxGeometry.fromDimensions({ + * dimensions : new Cesium.Cartesian3(1000000.0, 1000000.0, 500000.0) + * }), + * modelMatrix : Cesium.Matrix4.multiplyByTranslation(Cesium.Transforms.eastNorthUpToFixedFrame( + * Cesium.Cartesian3.fromDegrees(0.0, 0.0)), new Cesium.Cartesian3(0.0, 0.0, 1000000.0), new Cesium.Matrix4()), + * id : 'box', + * attributes : { + * color : new Cesium.ColorGeometryInstanceAttribute(red, green, blue, alpha) + * } + * }); + * @param [red = 1.0] - The red component. + * @param [green = 1.0] - The green component. + * @param [blue = 1.0] - The blue component. + * @param [alpha = 1.0] - The alpha component. + */ + export class ColorGeometryInstanceAttribute { + constructor(red?: number, green?: number, blue?: number, alpha?: number); + /** + * The values for the attributes stored in a typed array. + */ + value: Uint8Array; + /** + * The datatype of each component in the attribute, e.g., individual elements in + * {@link ColorGeometryInstanceAttribute#value}. + */ + readonly componentDatatype: ComponentDatatype; + /** + * The number of components in the attributes, i.e., {@link ColorGeometryInstanceAttribute#value}. + */ + readonly componentsPerAttribute: number; + /** + * When true and componentDatatype is an integer format, + * indicate that the components should be mapped to the range [0, 1] (unsigned) + * or [-1, 1] (signed) when they are accessed as floating-point for rendering. + */ + readonly normalize: boolean; + /** + * Creates a new {@link ColorGeometryInstanceAttribute} instance given the provided {@link Color}. + * @example + * const instance = new Cesium.GeometryInstance({ + * geometry : geometry, + * attributes : { + * color : Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.CORNFLOWERBLUE), + * } + * }); + * @param color - The color. + * @returns The new {@link ColorGeometryInstanceAttribute} instance. + */ + static fromColor(color: Color): ColorGeometryInstanceAttribute; + /** + * Converts a color to a typed array that can be used to assign a color attribute. + * @example + * const attributes = primitive.getGeometryInstanceAttributes('an id'); + * attributes.color = Cesium.ColorGeometryInstanceAttribute.toValue(Cesium.Color.AQUA, attributes.color); + * @param color - The color. + * @param [result] - The array to store the result in, if undefined a new instance will be created. + * @returns The modified result parameter or a new instance if result was undefined. + */ + static toValue(color: Color, result?: Uint8Array): Uint8Array; + /** + * Compares the provided ColorGeometryInstanceAttributes and returns + * true if they are equal, false otherwise. + * @param [left] - The first ColorGeometryInstanceAttribute. + * @param [right] - The second ColorGeometryInstanceAttribute. + * @returns true if left and right are equal, false otherwise. + */ + static equals( + left?: ColorGeometryInstanceAttribute, + right?: ColorGeometryInstanceAttribute, + ): boolean; + } + + /** + * WebGL component datatypes. Components are intrinsics, + * which form attributes, which form vertices. + */ + export enum ComponentDatatype { + /** + * 8-bit signed byte corresponding to gl.BYTE and the type + * of an element in Int8Array. + */ + BYTE = WebGLConstants.BYTE, + /** + * 8-bit unsigned byte corresponding to UNSIGNED_BYTE and the type + * of an element in Uint8Array. + */ + UNSIGNED_BYTE = WebGLConstants.UNSIGNED_BYTE, + /** + * 16-bit signed short corresponding to SHORT and the type + * of an element in Int16Array. + */ + SHORT = WebGLConstants.SHORT, + /** + * 16-bit unsigned short corresponding to UNSIGNED_SHORT and the type + * of an element in Uint16Array. + */ + UNSIGNED_SHORT = WebGLConstants.UNSIGNED_SHORT, + /** + * 32-bit signed int corresponding to INT and the type + * of an element in Int32Array. + */ + INT = WebGLConstants.INT, + /** + * 32-bit unsigned int corresponding to UNSIGNED_INT and the type + * of an element in Uint32Array. + */ + UNSIGNED_INT = WebGLConstants.UNSIGNED_INT, + /** + * 32-bit floating-point corresponding to FLOAT and the type + * of an element in Float32Array. + */ + FLOAT = WebGLConstants.FLOAT, + /** + * 64-bit floating-point corresponding to gl.DOUBLE (in Desktop OpenGL; + * this is not supported in WebGL, and is emulated in Cesium via {@link GeometryPipeline.encodeAttribute}) + * and the type of an element in Float64Array. + */ + DOUBLE = WebGLConstants.DOUBLE, + } + + /** + * Describes a compressed texture and contains a compressed texture buffer. + * @param internalFormat - The pixel format of the compressed texture. + * @param pixelDatatype - The pixel datatype of the compressed texture. + * @param width - The width of the texture. + * @param height - The height of the texture. + * @param buffer - The compressed texture buffer. + */ + export class CompressedTextureBuffer { + constructor( + internalFormat: PixelFormat, + pixelDatatype: PixelDatatype, + width: number, + height: number, + buffer: Uint8Array, + ); + /** + * The format of the compressed texture. + */ + readonly internalFormat: PixelFormat; + /** + * The datatype of the compressed texture. + */ + readonly pixelDatatype: PixelDatatype; + /** + * The width of the texture. + */ + readonly width: number; + /** + * The height of the texture. + */ + readonly height: number; + /** + * The compressed texture buffer. + */ + readonly bufferView: Uint8Array; + /** + * The compressed texture buffer. Alias for bufferView. + */ + readonly arrayBufferView: Uint8Array; + /** + * Creates a shallow clone of a compressed texture buffer. + * @param object - The compressed texture buffer to be cloned. + * @returns A shallow clone of the compressed texture buffer. + */ + static clone(object: CompressedTextureBuffer): CompressedTextureBuffer; + /** + * Creates a shallow clone of this compressed texture buffer. + * @returns A shallow clone of the compressed texture buffer. + */ + clone(): CompressedTextureBuffer; + } + + /** + * A spline that evaluates to a constant value. Although this follows the {@link Spline} interface, + * it does not maintain an internal array of times since its value never changes. + * @example + * const position = new Cesium.Cartesian3(1.0, 2.0, 3.0); + * const spline = new Cesium.ConstantSpline(position); + * + * const p0 = spline.evaluate(0.0); + * @param value - The constant value that the spline evaluates to. + */ + export class ConstantSpline { + constructor(value: number | Cartesian3 | Quaternion); + /** + * The constant value that the spline evaluates to. + */ + readonly value: number | Cartesian3 | Quaternion; + /** + * Finds an index i in times such that the parameter + * time is in the interval [times[i], times[i + 1]]. + * + * Since a constant spline has no internal times array, this will throw an error. + * @param time - The time. + */ + findTimeInterval(time: number): void; + /** + * Wraps the given time to the period covered by the spline. + * @param time - The time. + * @returns The time, wrapped around to the updated animation. + */ + wrapTime(time: number): number; + /** + * Clamps the given time to the period covered by the spline. + * @param time - The time. + * @returns The time, clamped to the animation period. + */ + clampTime(time: number): number; + /** + * Evaluates the curve at a given time. + * @param time - The time at which to evaluate the curve. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or the value that the constant spline represents. + */ + evaluate( + time: number, + result?: Cartesian3 | Quaternion, + ): number | Cartesian3 | Quaternion; + } + + /** + * A description of a polygon composed of arbitrary coplanar positions. + * @example + * const polygonGeometry = new Cesium.CoplanarPolygonGeometry({ + * polygonHierarchy: new Cesium.PolygonHierarchy( + * Cesium.Cartesian3.fromDegreesArrayHeights([ + * -90.0, 30.0, 0.0, + * -90.0, 30.0, 300000.0, + * -80.0, 30.0, 300000.0, + * -80.0, 30.0, 0.0 + * ])) + * }); + * @param options - Object with the following properties: + * @param options.polygonHierarchy - A polygon hierarchy that can include holes. + * @param [options.stRotation = 0.0] - The rotation of the texture coordinates, in radians. A positive rotation is counter-clockwise. + * @param [options.vertexFormat = VertexFormat.DEFAULT] - The vertex attributes to be computed. + * @param [options.ellipsoid = Ellipsoid.default] - The ellipsoid to be used as a reference. + * @param [options.textureCoordinates] - Texture coordinates as a {@link PolygonHierarchy} of {@link Cartesian2} points. + */ + export class CoplanarPolygonGeometry { + constructor(options: { + polygonHierarchy: PolygonHierarchy; + stRotation?: number; + vertexFormat?: VertexFormat; + ellipsoid?: Ellipsoid; + textureCoordinates?: PolygonHierarchy; + }); + /** + * The number of elements used to pack the object into an array. + */ + packedLength: number; + /** + * A description of a coplanar polygon from an array of positions. + * @example + * // create a polygon from points + * const polygon = Cesium.CoplanarPolygonGeometry.fromPositions({ + * positions : Cesium.Cartesian3.fromDegreesArray([ + * -72.0, 40.0, + * -70.0, 35.0, + * -75.0, 30.0, + * -70.0, 30.0, + * -68.0, 40.0 + * ]) + * }); + * const geometry = Cesium.PolygonGeometry.createGeometry(polygon); + * @param options - Object with the following properties: + * @param options.positions - An array of positions that defined the corner points of the polygon. + * @param [options.vertexFormat = VertexFormat.DEFAULT] - The vertex attributes to be computed. + * @param [options.stRotation = 0.0] - The rotation of the texture coordinates, in radians. A positive rotation is counter-clockwise. + * @param [options.ellipsoid = Ellipsoid.default] - The ellipsoid to be used as a reference. + * @param [options.textureCoordinates] - Texture coordinates as a {@link PolygonHierarchy} of {@link Cartesian2} points. + */ + static fromPositions(options: { + positions: Cartesian3[]; + vertexFormat?: VertexFormat; + stRotation?: number; + ellipsoid?: Ellipsoid; + textureCoordinates?: PolygonHierarchy; + }): CoplanarPolygonGeometry; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: CoplanarPolygonGeometry, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new CoplanarPolygonGeometry instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: CoplanarPolygonGeometry, + ): CoplanarPolygonGeometry; + /** + * Computes the geometric representation of an arbitrary coplanar polygon, including its vertices, indices, and a bounding sphere. + * @param polygonGeometry - A description of the polygon. + * @returns The computed vertices and indices. + */ + static createGeometry( + polygonGeometry: CoplanarPolygonGeometry, + ): Geometry | undefined; + } + + /** + * A description of the outline of a polygon composed of arbitrary coplanar positions. + * @example + * const polygonOutline = new Cesium.CoplanarPolygonOutlineGeometry({ + * positions : Cesium.Cartesian3.fromDegreesArrayHeights([ + * -90.0, 30.0, 0.0, + * -90.0, 30.0, 1000.0, + * -80.0, 30.0, 1000.0, + * -80.0, 30.0, 0.0 + * ]) + * }); + * const geometry = Cesium.CoplanarPolygonOutlineGeometry.createGeometry(polygonOutline); + * @param options - Object with the following properties: + * @param options.polygonHierarchy - A polygon hierarchy that can include holes. + */ + export class CoplanarPolygonOutlineGeometry { + constructor(options: { polygonHierarchy: PolygonHierarchy }); + /** + * The number of elements used to pack the object into an array. + */ + packedLength: number; + /** + * A description of a coplanar polygon outline from an array of positions. + * @param options - Object with the following properties: + * @param options.positions - An array of positions that defined the corner points of the polygon. + */ + static fromPositions(options: { + positions: Cartesian3[]; + }): CoplanarPolygonOutlineGeometry; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: CoplanarPolygonOutlineGeometry, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new CoplanarPolygonOutlineGeometry instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: CoplanarPolygonOutlineGeometry, + ): CoplanarPolygonOutlineGeometry; + /** + * Computes the geometric representation of an arbitrary coplanar polygon, including its vertices, indices, and a bounding sphere. + * @param polygonGeometry - A description of the polygon. + * @returns The computed vertices and indices. + */ + static createGeometry( + polygonGeometry: CoplanarPolygonOutlineGeometry, + ): Geometry | undefined; + } + + /** + * Style options for corners. + */ + export enum CornerType { + /** + * + * + * Corner has a smooth edge. + */ + ROUNDED = 0, + /** + * + * + * Corner point is the intersection of adjacent edges. + */ + MITERED = 1, + /** + * + * + * Corner is clipped. + */ + BEVELED = 2, + } + + /** + * A description of a corridor. Corridor geometry can be rendered with both {@link Primitive} and {@link GroundPrimitive}. + * @example + * const corridor = new Cesium.CorridorGeometry({ + * vertexFormat : Cesium.VertexFormat.POSITION_ONLY, + * positions : Cesium.Cartesian3.fromDegreesArray([-72.0, 40.0, -70.0, 35.0]), + * width : 100000 + * }); + * @param options - Object with the following properties: + * @param options.positions - An array of positions that define the center of the corridor. + * @param options.width - The distance between the edges of the corridor in meters. + * @param [options.ellipsoid = Ellipsoid.default] - The ellipsoid to be used as a reference. + * @param [options.granularity = Math.RADIANS_PER_DEGREE] - The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer. + * @param [options.height = 0] - The distance in meters between the ellipsoid surface and the positions. + * @param [options.extrudedHeight] - The distance in meters between the ellipsoid surface and the extruded face. + * @param [options.vertexFormat = VertexFormat.DEFAULT] - The vertex attributes to be computed. + * @param [options.cornerType = CornerType.ROUNDED] - Determines the style of the corners. + */ + export class CorridorGeometry { + constructor(options: { + positions: Cartesian3[]; + width: number; + ellipsoid?: Ellipsoid; + granularity?: number; + height?: number; + extrudedHeight?: number; + vertexFormat?: VertexFormat; + cornerType?: CornerType; + }); + /** + * The number of elements used to pack the object into an array. + */ + packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: CorridorGeometry, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new CorridorGeometry instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: CorridorGeometry, + ): CorridorGeometry; + /** + * Computes the bounding rectangle given the provided options + * @param options - Object with the following properties: + * @param options.positions - An array of positions that define the center of the corridor. + * @param options.width - The distance between the edges of the corridor in meters. + * @param [options.ellipsoid = Ellipsoid.default] - The ellipsoid to be used as a reference. + * @param [options.cornerType = CornerType.ROUNDED] - Determines the style of the corners. + * @param [result] - An object in which to store the result. + * @returns The result rectangle. + */ + static computeRectangle( + options: { + positions: Cartesian3[]; + width: number; + ellipsoid?: Ellipsoid; + cornerType?: CornerType; + }, + result?: Rectangle, + ): Rectangle; + /** + * Computes the geometric representation of a corridor, including its vertices, indices, and a bounding sphere. + * @param corridorGeometry - A description of the corridor. + * @returns The computed vertices and indices. + */ + static createGeometry( + corridorGeometry: CorridorGeometry, + ): Geometry | undefined; + } + + /** + * A description of a corridor outline. + * @example + * const corridor = new Cesium.CorridorOutlineGeometry({ + * positions : Cesium.Cartesian3.fromDegreesArray([-72.0, 40.0, -70.0, 35.0]), + * width : 100000 + * }); + * @param options - Object with the following properties: + * @param options.positions - An array of positions that define the center of the corridor outline. + * @param options.width - The distance between the edges of the corridor outline. + * @param [options.ellipsoid = Ellipsoid.default] - The ellipsoid to be used as a reference. + * @param [options.granularity = Math.RADIANS_PER_DEGREE] - The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer. + * @param [options.height = 0] - The distance in meters between the positions and the ellipsoid surface. + * @param [options.extrudedHeight] - The distance in meters between the extruded face and the ellipsoid surface. + * @param [options.cornerType = CornerType.ROUNDED] - Determines the style of the corners. + */ + export class CorridorOutlineGeometry { + constructor(options: { + positions: Cartesian3[]; + width: number; + ellipsoid?: Ellipsoid; + granularity?: number; + height?: number; + extrudedHeight?: number; + cornerType?: CornerType; + }); + /** + * The number of elements used to pack the object into an array. + */ + packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: CorridorOutlineGeometry, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new CorridorOutlineGeometry instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: CorridorOutlineGeometry, + ): CorridorOutlineGeometry; + /** + * Computes the geometric representation of a corridor, including its vertices, indices, and a bounding sphere. + * @param corridorOutlineGeometry - A description of the corridor. + * @returns The computed vertices and indices. + */ + static createGeometry( + corridorOutlineGeometry: CorridorOutlineGeometry, + ): Geometry | undefined; + } + + /** + * A credit contains data pertaining to how to display attributions/credits for certain content on the screen. + * @example + * // Create a credit with a tooltip, image and link + * const credit = new Cesium.Credit(''); + * @param html - An string representing an html code snippet + * @param [showOnScreen = false] - If true, the credit will be visible in the main credit container. Otherwise, it will appear in a popover. All credits are displayed `inline`, if you have an image we recommend sizing it correctly to match the text or use css to `vertical-align` it. + */ + export class Credit { + constructor(html: string, showOnScreen?: boolean); + /** + * The credit content + */ + readonly html: string; + /** + * Whether the credit should be displayed on screen or in a lightbox + */ + showOnScreen: boolean; + /** + * Gets the credit element + */ + readonly element: HTMLElement; + /** + * Returns true if the credits are equal + * @param [left] - The first credit + * @param [right] - The second credit + * @returns true if left and right are equal, false otherwise. + */ + static equals(left?: Credit, right?: Credit): boolean; + /** + * Returns true if the credits are equal + * @param [credit] - The credit to compare to. + * @returns true if left and right are equal, false otherwise. + */ + equals(credit?: Credit): boolean; + /** + * Duplicates a Credit instance. + * @param [credit] - The Credit to duplicate. + * @returns A new Credit instance that is a duplicate of the one provided. (Returns undefined if the credit is undefined) + */ + static clone(credit?: Credit): Credit; + } + + /** + * Defines functions for 3rd order polynomial functions of one variable with only real coefficients. + */ + export namespace CubicRealPolynomial { + /** + * Provides the discriminant of the cubic equation from the supplied coefficients. + * @param a - The coefficient of the 3rd order monomial. + * @param b - The coefficient of the 2nd order monomial. + * @param c - The coefficient of the 1st order monomial. + * @param d - The coefficient of the 0th order monomial. + * @returns The value of the discriminant. + */ + function computeDiscriminant( + a: number, + b: number, + c: number, + d: number, + ): number; + /** + * Provides the real valued roots of the cubic polynomial with the provided coefficients. + * @param a - The coefficient of the 3rd order monomial. + * @param b - The coefficient of the 2nd order monomial. + * @param c - The coefficient of the 1st order monomial. + * @param d - The coefficient of the 0th order monomial. + * @returns The real valued roots. + */ + function computeRealRoots( + a: number, + b: number, + c: number, + d: number, + ): number[]; + } + + /** + * The culling volume defined by planes. + * @param [planes] - An array of clipping planes. + */ + export class CullingVolume { + constructor(planes?: Cartesian4[]); + /** + * Each plane is represented by a Cartesian4 object, where the x, y, and z components + * define the unit vector normal to the plane, and the w component is the distance of the + * plane from the origin. + */ + planes: Cartesian4[]; + /** + * Constructs a culling volume from a bounding sphere. Creates six planes that create a box containing the sphere. + * The planes are aligned to the x, y, and z axes in world coordinates. + * @param boundingSphere - The bounding sphere used to create the culling volume. + * @param [result] - The object onto which to store the result. + * @returns The culling volume created from the bounding sphere. + */ + static fromBoundingSphere( + boundingSphere: BoundingSphere, + result?: CullingVolume, + ): CullingVolume; + /** + * Determines whether a bounding volume intersects the culling volume. + * @param boundingVolume - The bounding volume whose intersection with the culling volume is to be tested. + * @returns Intersect.OUTSIDE, Intersect.INTERSECTING, or Intersect.INSIDE. + */ + computeVisibility(boundingVolume: any): Intersect; + } + + export namespace CustomHeightmapTerrainProvider { + /** + * @param x - The X coordinate of the tile for which to request geometry. + * @param y - The Y coordinate of the tile for which to request geometry. + * @param level - The level of the tile for which to request geometry. + */ + type GeometryCallback = ( + x: number, + y: number, + level: number, + ) => + | Int8Array + | Uint8Array + | Int16Array + | Uint16Array + | Int32Array + | Uint32Array + | Float32Array + | Float64Array + | number[] + | Promise< + | Int8Array + | Uint8Array + | Int16Array + | Uint16Array + | Int32Array + | Uint32Array + | Float32Array + | Float64Array + | number[] + > + | undefined; + } + + /** + * A simple {@link TerrainProvider} that gets height values from a callback function. + * It can be used for procedurally generated terrain or as a way to load custom + * heightmap data without creating a subclass of {@link TerrainProvider}. + * + * There are some limitations such as no water mask, no vertex normals, and no + * availability, so a full-fledged {@link TerrainProvider} subclass is better suited + * for these more sophisticated use cases. + * @example + * const viewer = new Cesium.Viewer("cesiumContainer", { + * terrainProvider: new Cesium.CustomHeightmapTerrainProvider({ + * width: 32, + * height: 32, + * callback: function (x, y, level) { + * return new Float32Array(32 * 32); // all zeros + * }, + * }), + * }); + * @param options - Object with the following properties: + * @param options.callback - The callback function for requesting tile geometry. + * @param options.width - The number of columns per heightmap tile. + * @param options.height - The number of rows per heightmap tile. + * @param [options.tilingScheme] - The tiling scheme specifying how the ellipsoidal + * surface is broken into tiles. If this parameter is not provided, a {@link GeographicTilingScheme} + * is used. + * @param [options.ellipsoid = Ellipsoid.default] - The ellipsoid. If the tilingScheme is specified, + * this parameter is ignored and the tiling scheme's ellipsoid is used instead. If neither + * parameter is specified, the default ellipsoid is used. + * @param [options.credit] - A credit for the data source, which is displayed on the canvas. + */ + export class CustomHeightmapTerrainProvider { + constructor(options: { + callback: CustomHeightmapTerrainProvider.GeometryCallback; + width: number; + height: number; + tilingScheme?: TilingScheme; + ellipsoid?: Ellipsoid; + credit?: Credit | string; + }); + /** + * Gets an event that is raised when the terrain provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + */ + readonly errorEvent: Event; + /** + * Gets the credit to display when this terrain provider is active. Typically this is used to credit + * the source of the terrain. + */ + readonly credit: Credit; + /** + * Gets the tiling scheme used by this provider. + */ + readonly tilingScheme: TilingScheme; + /** + * Gets a value indicating whether or not the provider includes a water mask. The water mask + * indicates which areas of the globe are water rather than land, so they can be rendered + * as a reflective surface with animated waves. + * Water mask is not supported by {@link CustomHeightmapTerrainProvider}, so the return + * value will always be false. + */ + readonly hasWaterMask: boolean; + /** + * Gets a value indicating whether or not the requested tiles include vertex normals. + * Vertex normals are not supported by {@link CustomHeightmapTerrainProvider}, so the return + * value will always be false. + */ + readonly hasVertexNormals: boolean; + /** + * Gets an object that can be used to determine availability of terrain from this provider, such as + * at points and in rectangles. This property may be undefined if availability + * information is not available. + */ + readonly availability: TileAvailability; + /** + * Gets the number of columns per heightmap tile. + */ + readonly width: boolean; + /** + * Gets the number of rows per heightmap tile. + */ + readonly height: boolean; + /** + * Requests the geometry for a given tile. The result includes terrain + * data and indicates that all child tiles are available. + * @param x - The X coordinate of the tile for which to request geometry. + * @param y - The Y coordinate of the tile for which to request geometry. + * @param level - The level of the tile for which to request geometry. + * @param [request] - The request object. Intended for internal use only. + * @returns A promise for the requested geometry. If this method + * returns undefined instead of a promise, it is an indication that too many requests are already + * pending and the request will be retried later. + */ + requestTileGeometry( + x: number, + y: number, + level: number, + request?: Request, + ): Promise | undefined; + /** + * Gets the maximum geometric error allowed in a tile at a given level. + * @param level - The tile level for which to get the maximum geometric error. + * @returns The maximum geometric error. + */ + getLevelMaximumGeometricError(level: number): number; + /** + * Determines whether data for a tile is available to be loaded. + * @param x - The X coordinate of the tile for which to request geometry. + * @param y - The Y coordinate of the tile for which to request geometry. + * @param level - The level of the tile for which to request geometry. + * @returns Undefined if not supported, otherwise true or false. + */ + getTileDataAvailable( + x: number, + y: number, + level: number, + ): boolean | undefined; + /** + * Makes sure we load availability data for a tile + * @param x - The X coordinate of the tile for which to request geometry. + * @param y - The Y coordinate of the tile for which to request geometry. + * @param level - The level of the tile for which to request geometry. + * @returns Undefined if nothing need to be loaded or a Promise that resolves when all required tiles are loaded + */ + loadTileDataAvailability( + x: number, + y: number, + level: number, + ): undefined | Promise; + } + + /** + * A description of a cylinder. + * @example + * // create cylinder geometry + * const cylinder = new Cesium.CylinderGeometry({ + * length: 200000, + * topRadius: 80000, + * bottomRadius: 200000, + * }); + * const geometry = Cesium.CylinderGeometry.createGeometry(cylinder); + * @param options - Object with the following properties: + * @param options.length - The length of the cylinder. + * @param options.topRadius - The radius of the top of the cylinder. + * @param options.bottomRadius - The radius of the bottom of the cylinder. + * @param [options.slices = 128] - The number of edges around the perimeter of the cylinder. + * @param [options.vertexFormat = VertexFormat.DEFAULT] - The vertex attributes to be computed. + */ + export class CylinderGeometry { + constructor(options: { + length: number; + topRadius: number; + bottomRadius: number; + slices?: number; + vertexFormat?: VertexFormat; + }); + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: CylinderGeometry, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new CylinderGeometry instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: CylinderGeometry, + ): CylinderGeometry; + /** + * Computes the geometric representation of a cylinder, including its vertices, indices, and a bounding sphere. + * @param cylinderGeometry - A description of the cylinder. + * @returns The computed vertices and indices. + */ + static createGeometry( + cylinderGeometry: CylinderGeometry, + ): Geometry | undefined; + } + + /** + * A description of the outline of a cylinder. + * @example + * // create cylinder geometry + * const cylinder = new Cesium.CylinderOutlineGeometry({ + * length: 200000, + * topRadius: 80000, + * bottomRadius: 200000, + * }); + * const geometry = Cesium.CylinderOutlineGeometry.createGeometry(cylinder); + * @param options - Object with the following properties: + * @param options.length - The length of the cylinder. + * @param options.topRadius - The radius of the top of the cylinder. + * @param options.bottomRadius - The radius of the bottom of the cylinder. + * @param [options.slices = 128] - The number of edges around the perimeter of the cylinder. + * @param [options.numberOfVerticalLines = 16] - Number of lines to draw between the top and bottom surfaces of the cylinder. + */ + export class CylinderOutlineGeometry { + constructor(options: { + length: number; + topRadius: number; + bottomRadius: number; + slices?: number; + numberOfVerticalLines?: number; + }); + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: CylinderOutlineGeometry, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new CylinderOutlineGeometry instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: CylinderOutlineGeometry, + ): CylinderOutlineGeometry; + /** + * Computes the geometric representation of an outline of a cylinder, including its vertices, indices, and a bounding sphere. + * @param cylinderGeometry - A description of the cylinder outline. + * @returns The computed vertices and indices. + */ + static createGeometry( + cylinderGeometry: CylinderOutlineGeometry, + ): Geometry | undefined; + } + + /** + * A simple proxy that appends the desired resource as the sole query parameter + * to the given proxy URL. + * @param proxy - The proxy URL that will be used to requests all resources. + */ + export class DefaultProxy extends Proxy { + constructor(proxy: string); + /** + * Get the final URL to use to request a given resource. + * @param resource - The resource to request. + * @returns proxied resource + */ + getURL(resource: string): string; + } + + /** + * Constructs an exception object that is thrown due to a developer error, e.g., invalid argument, + * argument out of range, etc. This exception should only be thrown during development; + * it usually indicates a bug in the calling code. This exception should never be + * caught; instead the calling code should strive not to generate it. + *

+ * On the other hand, a {@link RuntimeError} indicates an exception that may + * be thrown at runtime, e.g., out of memory, that the calling code should be prepared + * to catch. + * @param [message] - The error message for this exception. + */ + export class DeveloperError extends Error { + constructor(message?: string); + /** + * 'DeveloperError' indicating that this exception was thrown due to a developer error. + */ + readonly name: string; + /** + * The explanation for why this exception was thrown. + */ + readonly message: string; + /** + * The stack trace of this exception, if available. + */ + readonly stack: string; + } + + /** + * Determines visibility based on the distance to the camera. + * @example + * // Make a billboard that is only visible when the distance to the camera is between 10 and 20 meters. + * billboard.distanceDisplayCondition = new Cesium.DistanceDisplayCondition(10.0, 20.0); + * @param [near = 0.0] - The smallest distance in the interval where the object is visible. + * @param [far = Number.MAX_VALUE] - The largest distance in the interval where the object is visible. + */ + export class DistanceDisplayCondition { + constructor(near?: number, far?: number); + /** + * The smallest distance in the interval where the object is visible. + */ + near: number; + /** + * The largest distance in the interval where the object is visible. + */ + far: number; + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: DistanceDisplayCondition, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new DistanceDisplayCondition instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: DistanceDisplayCondition, + ): DistanceDisplayCondition; + /** + * Determines if two distance display conditions are equal. + * @param [left] - A distance display condition. + * @param [right] - Another distance display condition. + * @returns Whether the two distance display conditions are equal. + */ + static equals( + left?: DistanceDisplayCondition, + right?: DistanceDisplayCondition, + ): boolean; + /** + * Duplicates a distance display condition instance. + * @param [value] - The distance display condition to duplicate. + * @param [result] - The result onto which to store the result. + * @returns The duplicated instance. + */ + static clone( + value?: DistanceDisplayCondition, + result?: DistanceDisplayCondition, + ): DistanceDisplayCondition; + /** + * Duplicates this instance. + * @param [result] - The result onto which to store the result. + * @returns The duplicated instance. + */ + clone(result?: DistanceDisplayCondition): DistanceDisplayCondition; + /** + * Determines if this distance display condition is equal to another. + * @param [other] - Another distance display condition. + * @returns Whether this distance display condition is equal to the other. + */ + equals(other?: DistanceDisplayCondition): boolean; + } + + /** + * Value and type information for per-instance geometry attribute that determines if the geometry instance has a distance display condition. + * @example + * const instance = new Cesium.GeometryInstance({ + * geometry : new Cesium.BoxGeometry({ + * vertexFormat : Cesium.VertexFormat.POSITION_AND_NORMAL, + * minimum : new Cesium.Cartesian3(-250000.0, -250000.0, -250000.0), + * maximum : new Cesium.Cartesian3(250000.0, 250000.0, 250000.0) + * }), + * modelMatrix : Cesium.Matrix4.multiplyByTranslation(Cesium.Transforms.eastNorthUpToFixedFrame( + * Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883)), new Cesium.Cartesian3(0.0, 0.0, 1000000.0), new Cesium.Matrix4()), + * id : 'box', + * attributes : { + * distanceDisplayCondition : new Cesium.DistanceDisplayConditionGeometryInstanceAttribute(100.0, 10000.0) + * } + * }); + * @param [near = 0.0] - The near distance. + * @param [far = Number.MAX_VALUE] - The far distance. + */ + export class DistanceDisplayConditionGeometryInstanceAttribute { + constructor(near?: number, far?: number); + /** + * The values for the attributes stored in a typed array. + */ + value: Float32Array; + /** + * The datatype of each component in the attribute, e.g., individual elements in + * {@link DistanceDisplayConditionGeometryInstanceAttribute#value}. + */ + readonly componentDatatype: ComponentDatatype; + /** + * The number of components in the attributes, i.e., {@link DistanceDisplayConditionGeometryInstanceAttribute#value}. + */ + readonly componentsPerAttribute: number; + /** + * When true and componentDatatype is an integer format, + * indicate that the components should be mapped to the range [0, 1] (unsigned) + * or [-1, 1] (signed) when they are accessed as floating-point for rendering. + */ + readonly normalize: boolean; + /** + * Creates a new {@link DistanceDisplayConditionGeometryInstanceAttribute} instance given the provided an enabled flag and {@link DistanceDisplayCondition}. + * @example + * const distanceDisplayCondition = new Cesium.DistanceDisplayCondition(100.0, 10000.0); + * const instance = new Cesium.GeometryInstance({ + * geometry : geometry, + * attributes : { + * distanceDisplayCondition : Cesium.DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition(distanceDisplayCondition) + * } + * }); + * @param distanceDisplayCondition - The distance display condition. + * @returns The new {@link DistanceDisplayConditionGeometryInstanceAttribute} instance. + */ + static fromDistanceDisplayCondition( + distanceDisplayCondition: DistanceDisplayCondition, + ): DistanceDisplayConditionGeometryInstanceAttribute; + /** + * Converts a distance display condition to a typed array that can be used to assign a distance display condition attribute. + * @example + * const attributes = primitive.getGeometryInstanceAttributes('an id'); + * attributes.distanceDisplayCondition = Cesium.DistanceDisplayConditionGeometryInstanceAttribute.toValue(distanceDisplayCondition, attributes.distanceDisplayCondition); + * @param distanceDisplayCondition - The distance display condition value. + * @param [result] - The array to store the result in, if undefined a new instance will be created. + * @returns The modified result parameter or a new instance if result was undefined. + */ + static toValue( + distanceDisplayCondition: DistanceDisplayCondition, + result?: Float32Array, + ): Float32Array; + } + + /** + * Easing functions for use with TweenCollection. These function are from + * {@link https://github.com/sole/tween.js/|Tween.js} and Robert Penner. See the + * {@link http://sole.github.io/tween.js/examples/03_graphs.html|Tween.js graphs for each function}. + */ + export namespace EasingFunction { + /** + * Linear easing. + */ + const LINEAR_NONE: EasingFunction.Callback; + /** + * Quadratic in. + */ + const QUADRATIC_IN: EasingFunction.Callback; + /** + * Quadratic out. + */ + const QUADRATIC_OUT: EasingFunction.Callback; + /** + * Quadratic in then out. + */ + const QUADRATIC_IN_OUT: EasingFunction.Callback; + /** + * Cubic in. + */ + const CUBIC_IN: EasingFunction.Callback; + /** + * Cubic out. + */ + const CUBIC_OUT: EasingFunction.Callback; + /** + * Cubic in then out. + */ + const CUBIC_IN_OUT: EasingFunction.Callback; + /** + * Quartic in. + */ + const QUARTIC_IN: EasingFunction.Callback; + /** + * Quartic out. + */ + const QUARTIC_OUT: EasingFunction.Callback; + /** + * Quartic in then out. + */ + const QUARTIC_IN_OUT: EasingFunction.Callback; + /** + * Quintic in. + */ + const QUINTIC_IN: EasingFunction.Callback; + /** + * Quintic out. + */ + const QUINTIC_OUT: EasingFunction.Callback; + /** + * Quintic in then out. + */ + const QUINTIC_IN_OUT: EasingFunction.Callback; + /** + * Sinusoidal in. + */ + const SINUSOIDAL_IN: EasingFunction.Callback; + /** + * Sinusoidal out. + */ + const SINUSOIDAL_OUT: EasingFunction.Callback; + /** + * Sinusoidal in then out. + */ + const SINUSOIDAL_IN_OUT: EasingFunction.Callback; + /** + * Exponential in. + */ + const EXPONENTIAL_IN: EasingFunction.Callback; + /** + * Exponential out. + */ + const EXPONENTIAL_OUT: EasingFunction.Callback; + /** + * Exponential in then out. + */ + const EXPONENTIAL_IN_OUT: EasingFunction.Callback; + /** + * Circular in. + */ + const CIRCULAR_IN: EasingFunction.Callback; + /** + * Circular out. + */ + const CIRCULAR_OUT: EasingFunction.Callback; + /** + * Circular in then out. + */ + const CIRCULAR_IN_OUT: EasingFunction.Callback; + /** + * Elastic in. + */ + const ELASTIC_IN: EasingFunction.Callback; + /** + * Elastic out. + */ + const ELASTIC_OUT: EasingFunction.Callback; + /** + * Elastic in then out. + */ + const ELASTIC_IN_OUT: EasingFunction.Callback; + /** + * Back in. + */ + const BACK_IN: EasingFunction.Callback; + /** + * Back out. + */ + const BACK_OUT: EasingFunction.Callback; + /** + * Back in then out. + */ + const BACK_IN_OUT: EasingFunction.Callback; + /** + * Bounce in. + */ + const BOUNCE_IN: EasingFunction.Callback; + /** + * Bounce out. + */ + const BOUNCE_OUT: EasingFunction.Callback; + /** + * Bounce in then out. + */ + const BOUNCE_IN_OUT: EasingFunction.Callback; + /** + * Function interface for implementing a custom easing function. + * @example + * function quadraticIn(time) { + * return time * time; + * } + * @example + * function quadraticOut(time) { + * return time * (2.0 - time); + * } + * @param time - The time in the range [0, 1]. + */ + type Callback = (time: number) => number; + } + + /** + * A description of an ellipse on an ellipsoid. Ellipse geometry can be rendered with both {@link Primitive} and {@link GroundPrimitive}. + * @example + * // Create an ellipse. + * const ellipse = new Cesium.EllipseGeometry({ + * center : Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883), + * semiMajorAxis : 500000.0, + * semiMinorAxis : 300000.0, + * rotation : Cesium.Math.toRadians(60.0) + * }); + * const geometry = Cesium.EllipseGeometry.createGeometry(ellipse); + * @param options - Object with the following properties: + * @param options.center - The ellipse's center point in the fixed frame. + * @param options.semiMajorAxis - The length of the ellipse's semi-major axis in meters. + * @param options.semiMinorAxis - The length of the ellipse's semi-minor axis in meters. + * @param [options.ellipsoid = Ellipsoid.default] - The ellipsoid the ellipse will be on. + * @param [options.height = 0.0] - The distance in meters between the ellipse and the ellipsoid surface. + * @param [options.extrudedHeight] - The distance in meters between the ellipse's extruded face and the ellipsoid surface. + * @param [options.rotation = 0.0] - The angle of rotation counter-clockwise from north. + * @param [options.stRotation = 0.0] - The rotation of the texture coordinates counter-clockwise from north. + * @param [options.granularity = Math.RADIANS_PER_DEGREE] - The angular distance between points on the ellipse in radians. + * @param [options.vertexFormat = VertexFormat.DEFAULT] - The vertex attributes to be computed. + */ + export class EllipseGeometry { + constructor(options: { + center: Cartesian3; + semiMajorAxis: number; + semiMinorAxis: number; + ellipsoid?: Ellipsoid; + height?: number; + extrudedHeight?: number; + rotation?: number; + stRotation?: number; + granularity?: number; + vertexFormat?: VertexFormat; + }); + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: EllipseGeometry, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new EllipseGeometry instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: EllipseGeometry, + ): EllipseGeometry; + /** + * Computes the bounding rectangle based on the provided options + * @param options - Object with the following properties: + * @param options.center - The ellipse's center point in the fixed frame. + * @param options.semiMajorAxis - The length of the ellipse's semi-major axis in meters. + * @param options.semiMinorAxis - The length of the ellipse's semi-minor axis in meters. + * @param [options.ellipsoid = Ellipsoid.default] - The ellipsoid the ellipse will be on. + * @param [options.rotation = 0.0] - The angle of rotation counter-clockwise from north. + * @param [options.granularity = Math.RADIANS_PER_DEGREE] - The angular distance between points on the ellipse in radians. + * @param [result] - An object in which to store the result + * @returns The result rectangle + */ + static computeRectangle( + options: { + center: Cartesian3; + semiMajorAxis: number; + semiMinorAxis: number; + ellipsoid?: Ellipsoid; + rotation?: number; + granularity?: number; + }, + result?: Rectangle, + ): Rectangle; + /** + * Computes the geometric representation of a ellipse on an ellipsoid, including its vertices, indices, and a bounding sphere. + * @param ellipseGeometry - A description of the ellipse. + * @returns The computed vertices and indices. + */ + static createGeometry( + ellipseGeometry: EllipseGeometry, + ): Geometry | undefined; + } + + /** + * A description of the outline of an ellipse on an ellipsoid. + * @example + * const ellipse = new Cesium.EllipseOutlineGeometry({ + * center : Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883), + * semiMajorAxis : 500000.0, + * semiMinorAxis : 300000.0, + * rotation : Cesium.Math.toRadians(60.0) + * }); + * const geometry = Cesium.EllipseOutlineGeometry.createGeometry(ellipse); + * @param options - Object with the following properties: + * @param options.center - The ellipse's center point in the fixed frame. + * @param options.semiMajorAxis - The length of the ellipse's semi-major axis in meters. + * @param options.semiMinorAxis - The length of the ellipse's semi-minor axis in meters. + * @param [options.ellipsoid = Ellipsoid.default] - The ellipsoid the ellipse will be on. + * @param [options.height = 0.0] - The distance in meters between the ellipse and the ellipsoid surface. + * @param [options.extrudedHeight] - The distance in meters between the ellipse's extruded face and the ellipsoid surface. + * @param [options.rotation = 0.0] - The angle from north (counter-clockwise) in radians. + * @param [options.granularity = 0.02] - The angular distance between points on the ellipse in radians. + * @param [options.numberOfVerticalLines = 16] - Number of lines to draw between the top and bottom surface of an extruded ellipse. + */ + export class EllipseOutlineGeometry { + constructor(options: { + center: Cartesian3; + semiMajorAxis: number; + semiMinorAxis: number; + ellipsoid?: Ellipsoid; + height?: number; + extrudedHeight?: number; + rotation?: number; + granularity?: number; + numberOfVerticalLines?: number; + }); + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: EllipseOutlineGeometry, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new EllipseOutlineGeometry instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: EllipseOutlineGeometry, + ): EllipseOutlineGeometry; + /** + * Computes the geometric representation of an outline of an ellipse on an ellipsoid, including its vertices, indices, and a bounding sphere. + * @param ellipseGeometry - A description of the ellipse. + * @returns The computed vertices and indices. + */ + static createGeometry( + ellipseGeometry: EllipseOutlineGeometry, + ): Geometry | undefined; + } + + /** + * A quadratic surface defined in Cartesian coordinates by the equation + * (x / a)^2 + (y / b)^2 + (z / c)^2 = 1. Primarily used + * by Cesium to represent the shape of planetary bodies. + * + * Rather than constructing this object directly, one of the provided + * constants is normally used. + * @param [x = 0] - The radius in the x direction. + * @param [y = 0] - The radius in the y direction. + * @param [z = 0] - The radius in the z direction. + */ + export class Ellipsoid { + constructor(x?: number, y?: number, z?: number); + /** + * Gets the radii of the ellipsoid. + */ + readonly radii: Cartesian3; + /** + * Gets the squared radii of the ellipsoid. + */ + readonly radiiSquared: Cartesian3; + /** + * Gets the radii of the ellipsoid raise to the fourth power. + */ + readonly radiiToTheFourth: Cartesian3; + /** + * Gets one over the radii of the ellipsoid. + */ + readonly oneOverRadii: Cartesian3; + /** + * Gets one over the squared radii of the ellipsoid. + */ + readonly oneOverRadiiSquared: Cartesian3; + /** + * Gets the minimum radius of the ellipsoid. + */ + readonly minimumRadius: number; + /** + * Gets the maximum radius of the ellipsoid. + */ + readonly maximumRadius: number; + /** + * Duplicates an Ellipsoid instance. + * @param ellipsoid - The ellipsoid to duplicate. + * @param [result] - The object onto which to store the result, or undefined if a new + * instance should be created. + * @returns The cloned Ellipsoid. (Returns undefined if ellipsoid is undefined) + */ + static clone(ellipsoid: Ellipsoid, result?: Ellipsoid): Ellipsoid; + /** + * Computes an Ellipsoid from a Cartesian specifying the radii in x, y, and z directions. + * @param [cartesian = Cartesian3.ZERO] - The ellipsoid's radius in the x, y, and z directions. + * @param [result] - The object onto which to store the result, or undefined if a new + * instance should be created. + * @returns A new Ellipsoid instance. + */ + static fromCartesian3( + cartesian?: Cartesian3, + result?: Ellipsoid, + ): Ellipsoid; + /** + * An Ellipsoid instance initialized to the WGS84 standard. + */ + static readonly WGS84: Ellipsoid; + /** + * An Ellipsoid instance initialized to radii of (1.0, 1.0, 1.0). + */ + static readonly UNIT_SPHERE: Ellipsoid; + /** + * An Ellipsoid instance initialized to a sphere with the lunar radius. + */ + static readonly MOON: Ellipsoid; + /** + * The default ellipsoid used when not otherwise specified. + * @example + * Cesium.Ellipsoid.default = Cesium.Ellipsoid.MOON; + * + * // Apollo 11 landing site + * const position = Cesium.Cartesian3.fromRadians( + * 0.67416, + * 23.47315, + * ); + */ + static default: Ellipsoid; + /** + * Duplicates an Ellipsoid instance. + * @param [result] - The object onto which to store the result, or undefined if a new + * instance should be created. + * @returns The cloned Ellipsoid. + */ + clone(result?: Ellipsoid): Ellipsoid; + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: Ellipsoid, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new Ellipsoid instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: Ellipsoid, + ): Ellipsoid; + /** + * Computes the unit vector directed from the center of this ellipsoid toward the provided Cartesian position. + * @param cartesian - The Cartesian for which to to determine the geocentric normal. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian3 instance if none was provided. + */ + geocentricSurfaceNormal( + cartesian: Cartesian3, + result?: Cartesian3, + ): Cartesian3; + /** + * Computes the normal of the plane tangent to the surface of the ellipsoid at the provided position. + * @param cartographic - The cartographic position for which to to determine the geodetic normal. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian3 instance if none was provided. + */ + geodeticSurfaceNormalCartographic( + cartographic: Cartographic, + result?: Cartesian3, + ): Cartesian3; + /** + * Computes the normal of the plane tangent to the surface of the ellipsoid at the provided position. + * @param cartesian - The Cartesian position for which to to determine the surface normal. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian3 instance if none was provided, or undefined if a normal cannot be found. + */ + geodeticSurfaceNormal( + cartesian: Cartesian3, + result?: Cartesian3, + ): Cartesian3; + /** + * Converts the provided cartographic to Cartesian representation. + * @example + * //Create a Cartographic and determine it's Cartesian representation on a WGS84 ellipsoid. + * const position = new Cesium.Cartographic(Cesium.Math.toRadians(21), Cesium.Math.toRadians(78), 5000); + * const cartesianPosition = Cesium.Ellipsoid.WGS84.cartographicToCartesian(position); + * @param cartographic - The cartographic position. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian3 instance if none was provided. + */ + cartographicToCartesian( + cartographic: Cartographic, + result?: Cartesian3, + ): Cartesian3; + /** + * Converts the provided array of cartographics to an array of Cartesians. + * @example + * //Convert an array of Cartographics and determine their Cartesian representation on a WGS84 ellipsoid. + * const positions = [new Cesium.Cartographic(Cesium.Math.toRadians(21), Cesium.Math.toRadians(78), 0), + * new Cesium.Cartographic(Cesium.Math.toRadians(21.321), Cesium.Math.toRadians(78.123), 100), + * new Cesium.Cartographic(Cesium.Math.toRadians(21.645), Cesium.Math.toRadians(78.456), 250)]; + * const cartesianPositions = Cesium.Ellipsoid.WGS84.cartographicArrayToCartesianArray(positions); + * @param cartographics - An array of cartographic positions. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Array instance if none was provided. + */ + cartographicArrayToCartesianArray( + cartographics: Cartographic[], + result?: Cartesian3[], + ): Cartesian3[]; + /** + * Converts the provided cartesian to cartographic representation. + * The cartesian is undefined at the center of the ellipsoid. + * @example + * //Create a Cartesian and determine it's Cartographic representation on a WGS84 ellipsoid. + * const position = new Cesium.Cartesian3(17832.12, 83234.52, 952313.73); + * const cartographicPosition = Cesium.Ellipsoid.WGS84.cartesianToCartographic(position); + * @param cartesian - The Cartesian position to convert to cartographic representation. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter, new Cartographic instance if none was provided, or undefined if the cartesian is at the center of the ellipsoid. + */ + cartesianToCartographic( + cartesian: Cartesian3, + result?: Cartographic, + ): Cartographic; + /** + * Converts the provided array of cartesians to an array of cartographics. + * @example + * //Create an array of Cartesians and determine their Cartographic representation on a WGS84 ellipsoid. + * const positions = [new Cesium.Cartesian3(17832.12, 83234.52, 952313.73), + * new Cesium.Cartesian3(17832.13, 83234.53, 952313.73), + * new Cesium.Cartesian3(17832.14, 83234.54, 952313.73)] + * const cartographicPositions = Cesium.Ellipsoid.WGS84.cartesianArrayToCartographicArray(positions); + * @param cartesians - An array of Cartesian positions. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Array instance if none was provided. + */ + cartesianArrayToCartographicArray( + cartesians: Cartesian3[], + result?: Cartographic[], + ): Cartographic[]; + /** + * Scales the provided Cartesian position along the geodetic surface normal + * so that it is on the surface of this ellipsoid. If the position is + * at the center of the ellipsoid, this function returns undefined. + * @param cartesian - The Cartesian position to scale. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter, a new Cartesian3 instance if none was provided, or undefined if the position is at the center. + */ + scaleToGeodeticSurface( + cartesian: Cartesian3, + result?: Cartesian3, + ): Cartesian3; + /** + * Scales the provided Cartesian position along the geocentric surface normal + * so that it is on the surface of this ellipsoid. + * @param cartesian - The Cartesian position to scale. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian3 instance if none was provided. + */ + scaleToGeocentricSurface( + cartesian: Cartesian3, + result?: Cartesian3, + ): Cartesian3; + /** + * Transforms a Cartesian X, Y, Z position to the ellipsoid-scaled space by multiplying + * its components by the result of {@link Ellipsoid#oneOverRadii}. + * @param position - The position to transform. + * @param [result] - The position to which to copy the result, or undefined to create and + * return a new instance. + * @returns The position expressed in the scaled space. The returned instance is the + * one passed as the result parameter if it is not undefined, or a new instance of it is. + */ + transformPositionToScaledSpace( + position: Cartesian3, + result?: Cartesian3, + ): Cartesian3; + /** + * Transforms a Cartesian X, Y, Z position from the ellipsoid-scaled space by multiplying + * its components by the result of {@link Ellipsoid#radii}. + * @param position - The position to transform. + * @param [result] - The position to which to copy the result, or undefined to create and + * return a new instance. + * @returns The position expressed in the unscaled space. The returned instance is the + * one passed as the result parameter if it is not undefined, or a new instance of it is. + */ + transformPositionFromScaledSpace( + position: Cartesian3, + result?: Cartesian3, + ): Cartesian3; + /** + * Compares this Ellipsoid against the provided Ellipsoid componentwise and returns + * true if they are equal, false otherwise. + * @param [right] - The other Ellipsoid. + * @returns true if they are equal, false otherwise. + */ + equals(right?: Ellipsoid): boolean; + /** + * Creates a string representing this Ellipsoid in the format '(radii.x, radii.y, radii.z)'. + * @returns A string representing this ellipsoid in the format '(radii.x, radii.y, radii.z)'. + */ + toString(): string; + /** + * Computes a point which is the intersection of the surface normal with the z-axis. + * @param position - the position. must be on the surface of the ellipsoid. + * @param [buffer = 0.0] - A buffer to subtract from the ellipsoid size when checking if the point is inside the ellipsoid. + * In earth case, with common earth datums, there is no need for this buffer since the intersection point is always (relatively) very close to the center. + * In WGS84 datum, intersection point is at max z = +-42841.31151331382 (0.673% of z-axis). + * Intersection point could be outside the ellipsoid if the ratio of MajorAxis / AxisOfRotation is bigger than the square root of 2 + * @param [result] - The cartesian to which to copy the result, or undefined to create and + * return a new instance. + * @returns the intersection point if it's inside the ellipsoid, undefined otherwise + */ + getSurfaceNormalIntersectionWithZAxis( + position: Cartesian3, + buffer?: number, + result?: Cartesian3, + ): Cartesian3 | undefined; + /** + * Computes the ellipsoid curvatures at a given position on the surface. + * @param surfacePosition - The position on the ellipsoid surface where curvatures will be calculated. + * @param [result] - The cartesian to which to copy the result, or undefined to create and return a new instance. + * @returns The local curvature of the ellipsoid surface at the provided position, in east and north directions. + */ + getLocalCurvature( + surfacePosition: Cartesian3, + result?: Cartesian2, + ): Cartesian2; + /** + * Computes an approximation of the surface area of a rectangle on the surface of an ellipsoid using + * Gauss-Legendre 10th order quadrature. + * @param rectangle - The rectangle used for computing the surface area. + * @returns The approximate area of the rectangle on the surface of this ellipsoid. + */ + surfaceArea(rectangle: Rectangle): number; + } + + /** + * Initializes a geodesic on the ellipsoid connecting the two provided planetodetic points. + * @param [start] - The initial planetodetic point on the path. + * @param [end] - The final planetodetic point on the path. + * @param [ellipsoid = Ellipsoid.default] - The ellipsoid on which the geodesic lies. + */ + export class EllipsoidGeodesic { + constructor( + start?: Cartographic, + end?: Cartographic, + ellipsoid?: Ellipsoid, + ); + /** + * Gets the ellipsoid. + */ + readonly ellipsoid: Ellipsoid; + /** + * Gets the surface distance between the start and end point + */ + readonly surfaceDistance: number; + /** + * Gets the initial planetodetic point on the path. + */ + readonly start: Cartographic; + /** + * Gets the final planetodetic point on the path. + */ + readonly end: Cartographic; + /** + * Gets the heading at the initial point. + */ + readonly startHeading: number; + /** + * Gets the heading at the final point. + */ + readonly endHeading: number; + /** + * Sets the start and end points of the geodesic + * @param start - The initial planetodetic point on the path. + * @param end - The final planetodetic point on the path. + */ + setEndPoints(start: Cartographic, end: Cartographic): void; + /** + * Provides the location of a point at the indicated portion along the geodesic. + * @param fraction - The portion of the distance between the initial and final points. + * @param [result] - The object in which to store the result. + * @returns The location of the point along the geodesic. + */ + interpolateUsingFraction( + fraction: number, + result?: Cartographic, + ): Cartographic; + /** + * Provides the location of a point at the indicated distance along the geodesic. + * @param distance - The distance from the initial point to the point of interest along the geodesic + * @param [result] - The object in which to store the result. + * @returns The location of the point along the geodesic. + */ + interpolateUsingSurfaceDistance( + distance: number, + result?: Cartographic, + ): Cartographic; + } + + /** + * A description of an ellipsoid centered at the origin. + * @example + * const ellipsoid = new Cesium.EllipsoidGeometry({ + * vertexFormat : Cesium.VertexFormat.POSITION_ONLY, + * radii : new Cesium.Cartesian3(1000000.0, 500000.0, 500000.0) + * }); + * const geometry = Cesium.EllipsoidGeometry.createGeometry(ellipsoid); + * @param [options] - Object with the following properties: + * @param [options.radii = Cartesian3(1.0, 1.0, 1.0)] - The radii of the ellipsoid in the x, y, and z directions. + * @param [options.innerRadii = options.radii] - The inner radii of the ellipsoid in the x, y, and z directions. + * @param [options.minimumClock = 0.0] - The minimum angle lying in the xy-plane measured from the positive x-axis and toward the positive y-axis. + * @param [options.maximumClock = 2*PI] - The maximum angle lying in the xy-plane measured from the positive x-axis and toward the positive y-axis. + * @param [options.minimumCone = 0.0] - The minimum angle measured from the positive z-axis and toward the negative z-axis. + * @param [options.maximumCone = PI] - The maximum angle measured from the positive z-axis and toward the negative z-axis. + * @param [options.stackPartitions = 64] - The number of times to partition the ellipsoid into stacks. + * @param [options.slicePartitions = 64] - The number of times to partition the ellipsoid into radial slices. + * @param [options.vertexFormat = VertexFormat.DEFAULT] - The vertex attributes to be computed. + */ + export class EllipsoidGeometry { + constructor(options?: { + radii?: Cartesian3; + innerRadii?: Cartesian3; + minimumClock?: number; + maximumClock?: number; + minimumCone?: number; + maximumCone?: number; + stackPartitions?: number; + slicePartitions?: number; + vertexFormat?: VertexFormat; + }); + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: EllipsoidGeometry, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new EllipsoidGeometry instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: EllipsoidGeometry, + ): EllipsoidGeometry; + /** + * Computes the geometric representation of an ellipsoid, including its vertices, indices, and a bounding sphere. + * @param ellipsoidGeometry - A description of the ellipsoid. + * @returns The computed vertices and indices. + */ + static createGeometry( + ellipsoidGeometry: EllipsoidGeometry, + ): Geometry | undefined; + } + + /** + * A description of the outline of an ellipsoid centered at the origin. + * @example + * const ellipsoid = new Cesium.EllipsoidOutlineGeometry({ + * radii : new Cesium.Cartesian3(1000000.0, 500000.0, 500000.0), + * stackPartitions: 6, + * slicePartitions: 5 + * }); + * const geometry = Cesium.EllipsoidOutlineGeometry.createGeometry(ellipsoid); + * @param [options] - Object with the following properties: + * @param [options.radii = Cartesian3(1.0, 1.0, 1.0)] - The radii of the ellipsoid in the x, y, and z directions. + * @param [options.innerRadii = options.radii] - The inner radii of the ellipsoid in the x, y, and z directions. + * @param [options.minimumClock = 0.0] - The minimum angle lying in the xy-plane measured from the positive x-axis and toward the positive y-axis. + * @param [options.maximumClock = 2*PI] - The maximum angle lying in the xy-plane measured from the positive x-axis and toward the positive y-axis. + * @param [options.minimumCone = 0.0] - The minimum angle measured from the positive z-axis and toward the negative z-axis. + * @param [options.maximumCone = PI] - The maximum angle measured from the positive z-axis and toward the negative z-axis. + * @param [options.stackPartitions = 10] - The count of stacks for the ellipsoid (1 greater than the number of parallel lines). + * @param [options.slicePartitions = 8] - The count of slices for the ellipsoid (Equal to the number of radial lines). + * @param [options.subdivisions = 128] - The number of points per line, determining the granularity of the curvature. + */ + export class EllipsoidOutlineGeometry { + constructor(options?: { + radii?: Cartesian3; + innerRadii?: Cartesian3; + minimumClock?: number; + maximumClock?: number; + minimumCone?: number; + maximumCone?: number; + stackPartitions?: number; + slicePartitions?: number; + subdivisions?: number; + }); + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: EllipsoidOutlineGeometry, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new EllipsoidOutlineGeometry instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: EllipsoidOutlineGeometry, + ): EllipsoidOutlineGeometry; + /** + * Computes the geometric representation of an outline of an ellipsoid, including its vertices, indices, and a bounding sphere. + * @param ellipsoidGeometry - A description of the ellipsoid outline. + * @returns The computed vertices and indices. + */ + static createGeometry( + ellipsoidGeometry: EllipsoidOutlineGeometry, + ): Geometry | undefined; + } + + /** + * Initializes a rhumb line on the ellipsoid connecting the two provided planetodetic points. + * @param [start] - The initial planetodetic point on the path. + * @param [end] - The final planetodetic point on the path. + * @param [ellipsoid = Ellipsoid.default] - The ellipsoid on which the rhumb line lies. + */ + export class EllipsoidRhumbLine { + constructor( + start?: Cartographic, + end?: Cartographic, + ellipsoid?: Ellipsoid, + ); + /** + * Gets the ellipsoid. + */ + readonly ellipsoid: Ellipsoid; + /** + * Gets the surface distance between the start and end point + */ + readonly surfaceDistance: number; + /** + * Gets the initial planetodetic point on the path. + */ + readonly start: Cartographic; + /** + * Gets the final planetodetic point on the path. + */ + readonly end: Cartographic; + /** + * Gets the heading from the start point to the end point. + */ + readonly heading: number; + /** + * Create a rhumb line using an initial position with a heading and distance. + * @param start - The initial planetodetic point on the path. + * @param heading - The heading in radians. + * @param distance - The rhumb line distance between the start and end point. + * @param [ellipsoid = Ellipsoid.default] - The ellipsoid on which the rhumb line lies. + * @param [result] - The object in which to store the result. + * @returns The EllipsoidRhumbLine object. + */ + static fromStartHeadingDistance( + start: Cartographic, + heading: number, + distance: number, + ellipsoid?: Ellipsoid, + result?: EllipsoidRhumbLine, + ): EllipsoidRhumbLine; + /** + * Sets the start and end points of the rhumb line. + * @param start - The initial planetodetic point on the path. + * @param end - The final planetodetic point on the path. + */ + setEndPoints(start: Cartographic, end: Cartographic): void; + /** + * Provides the location of a point at the indicated portion along the rhumb line. + * @param fraction - The portion of the distance between the initial and final points. + * @param [result] - The object in which to store the result. + * @returns The location of the point along the rhumb line. + */ + interpolateUsingFraction( + fraction: number, + result?: Cartographic, + ): Cartographic; + /** + * Provides the location of a point at the indicated distance along the rhumb line. + * @param distance - The distance from the initial point to the point of interest along the rhumbLine. + * @param [result] - The object in which to store the result. + * @returns The location of the point along the rhumb line. + */ + interpolateUsingSurfaceDistance( + distance: number, + result?: Cartographic, + ): Cartographic; + /** + * Provides the location of a point at the indicated longitude along the rhumb line. + * If the longitude is outside the range of start and end points, the first intersection with the longitude from the start point in the direction of the heading is returned. This follows the spiral property of a rhumb line. + * @param intersectionLongitude - The longitude, in radians, at which to find the intersection point from the starting point using the heading. + * @param [result] - The object in which to store the result. + * @returns The location of the intersection point along the rhumb line, undefined if there is no intersection or infinite intersections. + */ + findIntersectionWithLongitude( + intersectionLongitude: number, + result?: Cartographic, + ): Cartographic; + /** + * Provides the location of a point at the indicated latitude along the rhumb line. + * If the latitude is outside the range of start and end points, the first intersection with the latitude from that start point in the direction of the heading is returned. This follows the spiral property of a rhumb line. + * @param intersectionLatitude - The latitude, in radians, at which to find the intersection point from the starting point using the heading. + * @param [result] - The object in which to store the result. + * @returns The location of the intersection point along the rhumb line, undefined if there is no intersection or infinite intersections. + */ + findIntersectionWithLatitude( + intersectionLatitude: number, + result?: Cartographic, + ): Cartographic; + } + + /** + * A plane tangent to the provided ellipsoid at the provided origin. + * If origin is not on the surface of the ellipsoid, it's surface projection will be used. + * If origin is at the center of the ellipsoid, an exception will be thrown. + * @param origin - The point on the surface of the ellipsoid where the tangent plane touches. + * @param [ellipsoid = Ellipsoid.default] - The ellipsoid to use. + */ + export class EllipsoidTangentPlane { + constructor(origin: Cartesian3, ellipsoid?: Ellipsoid); + /** + * Gets the ellipsoid. + */ + ellipsoid: Ellipsoid; + /** + * Gets the origin. + */ + origin: Cartesian3; + /** + * Gets the plane which is tangent to the ellipsoid. + */ + readonly plane: Plane; + /** + * Gets the local X-axis (east) of the tangent plane. + */ + readonly xAxis: Cartesian3; + /** + * Gets the local Y-axis (north) of the tangent plane. + */ + readonly yAxis: Cartesian3; + /** + * Gets the local Z-axis (up) of the tangent plane. + */ + readonly zAxis: Cartesian3; + /** + * Creates a new instance from the provided ellipsoid and the center + * point of the provided Cartesians. + * @param cartesians - The list of positions surrounding the center point. + * @param [ellipsoid = Ellipsoid.default] - The ellipsoid to use. + * @returns The new instance of EllipsoidTangentPlane. + */ + static fromPoints( + cartesians: Cartesian3[], + ellipsoid?: Ellipsoid, + ): EllipsoidTangentPlane; + /** + * Computes the projection of the provided 3D position onto the 2D plane, radially outward from the {@link EllipsoidTangentPlane.ellipsoid} coordinate system origin. + * @param cartesian - The point to project. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian2 instance if none was provided. Undefined if there is no intersection point + */ + projectPointOntoPlane( + cartesian: Cartesian3, + result?: Cartesian2, + ): Cartesian2; + /** + * Computes the projection of the provided 3D positions onto the 2D plane (where possible), radially outward from the global origin. + * The resulting array may be shorter than the input array - if a single projection is impossible it will not be included. + * @param cartesians - The array of points to project. + * @param [result] - The array of Cartesian2 instances onto which to store results. + * @returns The modified result parameter or a new array of Cartesian2 instances if none was provided. + */ + projectPointsOntoPlane( + cartesians: Cartesian3[], + result?: Cartesian2[], + ): Cartesian2[]; + /** + * Computes the projection of the provided 3D position onto the 2D plane, along the plane normal. + * @param cartesian - The point to project. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian2 instance if none was provided. + */ + projectPointToNearestOnPlane( + cartesian: Cartesian3, + result?: Cartesian2, + ): Cartesian2; + /** + * Computes the projection of the provided 3D positions onto the 2D plane, along the plane normal. + * @param cartesians - The array of points to project. + * @param [result] - The array of Cartesian2 instances onto which to store results. + * @returns The modified result parameter or a new array of Cartesian2 instances if none was provided. This will have the same length as cartesians. + */ + projectPointsToNearestOnPlane( + cartesians: Cartesian3[], + result?: Cartesian2[], + ): Cartesian2[]; + /** + * Computes the projection of the provided 2D position onto the 3D ellipsoid. + * @param cartesian - The points to project. + * @param [result] - The Cartesian3 instance to store result. + * @returns The modified result parameter or a new Cartesian3 instance if none was provided. + */ + projectPointOntoEllipsoid( + cartesian: Cartesian2, + result?: Cartesian3, + ): Cartesian3; + /** + * Computes the projection of the provided 2D positions onto the 3D ellipsoid. + * @param cartesians - The array of points to project. + * @param [result] - The array of Cartesian3 instances onto which to store results. + * @returns The modified result parameter or a new array of Cartesian3 instances if none was provided. + */ + projectPointsOntoEllipsoid( + cartesians: Cartesian2[], + result?: Cartesian3[], + ): Cartesian3[]; + } + + /** + * A very simple {@link TerrainProvider} that produces geometry by tessellating an ellipsoidal + * surface. + * @param [options] - Object with the following properties: + * @param [options.tilingScheme] - The tiling scheme specifying how the ellipsoidal + * surface is broken into tiles. If this parameter is not provided, a {@link GeographicTilingScheme} + * is used. + * @param [options.ellipsoid = Ellipsoid.default] - The ellipsoid. If the tilingScheme is specified, + * this parameter is ignored and the tiling scheme's ellipsoid is used instead. If neither + * parameter is specified, the default ellipsoid is used. + */ + export class EllipsoidTerrainProvider { + constructor(options?: { + tilingScheme?: TilingScheme; + ellipsoid?: Ellipsoid; + }); + /** + * Gets an event that is raised when the terrain provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + */ + readonly errorEvent: Event; + /** + * Gets the credit to display when this terrain provider is active. Typically this is used to credit + * the source of the terrain. + */ + readonly credit: Credit; + /** + * Gets the tiling scheme used by this provider. + */ + readonly tilingScheme: GeographicTilingScheme; + /** + * Gets a value indicating whether or not the provider includes a water mask. The water mask + * indicates which areas of the globe are water rather than land, so they can be rendered + * as a reflective surface with animated waves. + */ + readonly hasWaterMask: boolean; + /** + * Gets a value indicating whether or not the requested tiles include vertex normals. + */ + readonly hasVertexNormals: boolean; + /** + * Gets an object that can be used to determine availability of terrain from this provider, such as + * at points and in rectangles. This property may be undefined if availability + * information is not available. + */ + readonly availability: TileAvailability; + /** + * Requests the geometry for a given tile. The result includes terrain + * data and indicates that all child tiles are available. + * @param x - The X coordinate of the tile for which to request geometry. + * @param y - The Y coordinate of the tile for which to request geometry. + * @param level - The level of the tile for which to request geometry. + * @param [request] - The request object. Intended for internal use only. + * @returns A promise for the requested geometry. If this method + * returns undefined instead of a promise, it is an indication that too many requests are already + * pending and the request will be retried later. + */ + requestTileGeometry( + x: number, + y: number, + level: number, + request?: Request, + ): Promise | undefined; + /** + * Gets the maximum geometric error allowed in a tile at a given level. + * @param level - The tile level for which to get the maximum geometric error. + * @returns The maximum geometric error. + */ + getLevelMaximumGeometricError(level: number): number; + /** + * Determines whether data for a tile is available to be loaded. + * @param x - The X coordinate of the tile for which to request geometry. + * @param y - The Y coordinate of the tile for which to request geometry. + * @param level - The level of the tile for which to request geometry. + * @returns Undefined if not supported, otherwise true or false. + */ + getTileDataAvailable( + x: number, + y: number, + level: number, + ): boolean | undefined; + /** + * Makes sure we load availability data for a tile + * @param x - The X coordinate of the tile for which to request geometry. + * @param y - The Y coordinate of the tile for which to request geometry. + * @param level - The level of the tile for which to request geometry. + * @returns This provider does not support loading availability. + */ + loadTileDataAvailability(x: number, y: number, level: number): undefined; + } + + /** + * A generic utility class for managing subscribers for a particular event. + * This class is usually instantiated inside of a container class and + * exposed as a property for others to subscribe to. + * @example + * MyObject.prototype.myListener = function(arg1, arg2) { + * this.myArg1Copy = arg1; + * this.myArg2Copy = arg2; + * } + * + * const myObjectInstance = new MyObject(); + * const evt = new Cesium.Event(); + * evt.addEventListener(MyObject.prototype.myListener, myObjectInstance); + * evt.raiseEvent('1', '2'); + * evt.removeEventListener(MyObject.prototype.myListener); + */ + export class Event< + Listener extends (...args: any[]) => void = (...args: any[]) => void, + > { + constructor(); + /** + * The number of listeners currently subscribed to the event. + */ + readonly numberOfListeners: number; + /** + * Registers a callback function to be executed whenever the event is raised. + * An optional scope can be provided to serve as the this pointer + * in which the function will execute. + * @param listener - The function to be executed when the event is raised. + * @param [scope] - An optional object scope to serve as the this + * pointer in which the listener function will execute. + * @returns A function that will remove this event listener when invoked. + */ + addEventListener(listener: Listener, scope?: any): Event.RemoveCallback; + /** + * Unregisters a previously registered callback. + * @param listener - The function to be unregistered. + * @param [scope] - The scope that was originally passed to addEventListener. + * @returns true if the listener was removed; false if the listener and scope are not registered with the event. + */ + removeEventListener(listener: Listener, scope?: any): boolean; + /** + * Raises the event by calling each registered listener with all supplied arguments. + * @param arguments - This method takes any number of parameters and passes them through to the listener functions. + */ + raiseEvent(...arguments: Parameters): void; + } + + export namespace Event { + /** + * A function that removes a listener. + */ + type RemoveCallback = () => void; + } + + /** + * A convenience object that simplifies the common pattern of attaching event listeners + * to several events, then removing all those listeners at once later, for example, in + * a destroy method. + * @example + * const helper = new Cesium.EventHelper(); + * + * helper.add(someObject.event, listener1, this); + * helper.add(otherObject.event, listener2, this); + * + * // later... + * helper.removeAll(); + */ + export class EventHelper { + constructor(); + /** + * Adds a listener to an event, and records the registration to be cleaned up later. + * @param event - The event to attach to. + * @param listener - The function to be executed when the event is raised. + * @param [scope] - An optional object scope to serve as the this + * pointer in which the listener function will execute. + * @returns A function that will remove this event listener when invoked. + */ + add( + event: Event, + listener: (...params: any[]) => any, + scope?: any, + ): EventHelper.RemoveCallback; + /** + * Unregisters all previously added listeners. + */ + removeAll(): void; + } + + export namespace EventHelper { + /** + * A function that removes a listener. + */ + type RemoveCallback = () => void; + } + + /** + * Constants to determine how an interpolated value is extrapolated + * when querying outside the bounds of available data. + */ + export enum ExtrapolationType { + /** + * No extrapolation occurs. + */ + NONE = 0, + /** + * The first or last value is used when outside the range of sample data. + */ + HOLD = 1, + /** + * The value is extrapolated. + */ + EXTRAPOLATE = 2, + } + + /** + * A set of functions to detect whether the current browser supports + * various features. + */ + export namespace FeatureDetection { + /** + * Detects whether the current browser supports Basis Universal textures and the web assembly modules needed to transcode them. + * @returns true if the browser supports web assembly modules and the scene supports Basis Universal textures, false if not. + */ + function supportsBasis(scene: Scene): boolean; + /** + * Detects whether the current browser supports the full screen standard. + * @returns true if the browser supports the full screen standard, false if not. + */ + function supportsFullscreen(): boolean; + /** + * Detects whether the current browser supports typed arrays. + * @returns true if the browser supports typed arrays, false if not. + */ + function supportsTypedArrays(): boolean; + /** + * Detects whether the current browser supports BigInt64Array typed arrays. + * @returns true if the browser supports BigInt64Array typed arrays, false if not. + */ + function supportsBigInt64Array(): boolean; + /** + * Detects whether the current browser supports BigUint64Array typed arrays. + * @returns true if the browser supports BigUint64Array typed arrays, false if not. + */ + function supportsBigUint64Array(): boolean; + /** + * Detects whether the current browser supports BigInt. + * @returns true if the browser supports BigInt, false if not. + */ + function supportsBigInt(): boolean; + /** + * Detects whether the current browser supports Web Workers. + * @returns true if the browsers supports Web Workers, false if not. + */ + function supportsWebWorkers(): boolean; + /** + * Detects whether the current browser supports Web Assembly. + * @returns true if the browsers supports Web Assembly, false if not. + */ + function supportsWebAssembly(): boolean; + /** + * Detects whether the current browser supports a WebGL2 rendering context for the specified scene. + * @param scene - the Cesium scene specifying the rendering context + * @returns true if the browser supports a WebGL2 rendering context, false if not. + */ + function supportsWebgl2(scene: Scene): boolean; + /** + * Detects whether the current browser supports ECMAScript modules in web workers. + * @returns true if the browser supports ECMAScript modules in web workers. + */ + function supportsEsmWebWorkers(): boolean; + } + + /** + * Describes a frustum at the given the origin and orientation. + * @param options - Object with the following properties: + * @param options.frustum - The frustum. + * @param options.origin - The origin of the frustum. + * @param options.orientation - The orientation of the frustum. + * @param [options.vertexFormat = VertexFormat.DEFAULT] - The vertex attributes to be computed. + */ + export class FrustumGeometry { + constructor(options: { + frustum: PerspectiveFrustum | OrthographicFrustum; + origin: Cartesian3; + orientation: Quaternion; + vertexFormat?: VertexFormat; + }); + /** + * The number of elements used to pack the object into an array. + */ + packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: FrustumGeometry, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: FrustumGeometry, + ): void; + /** + * Computes the geometric representation of a frustum, including its vertices, indices, and a bounding sphere. + * @param frustumGeometry - A description of the frustum. + * @returns The computed vertices and indices. + */ + static createGeometry( + frustumGeometry: FrustumGeometry, + ): Geometry | undefined; + } + + /** + * A description of the outline of a frustum with the given the origin and orientation. + * @param options - Object with the following properties: + * @param options.frustum - The frustum. + * @param options.origin - The origin of the frustum. + * @param options.orientation - The orientation of the frustum. + */ + export class FrustumOutlineGeometry { + constructor(options: { + frustum: PerspectiveFrustum | OrthographicFrustum; + origin: Cartesian3; + orientation: Quaternion; + }); + /** + * The number of elements used to pack the object into an array. + */ + packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: FrustumOutlineGeometry, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: FrustumOutlineGeometry, + ): void; + /** + * Computes the geometric representation of a frustum outline, including its vertices, indices, and a bounding sphere. + * @param frustumGeometry - A description of the frustum. + * @returns The computed vertices and indices. + */ + static createGeometry( + frustumGeometry: FrustumOutlineGeometry, + ): Geometry | undefined; + } + + /** + * Browser-independent functions for working with the standard fullscreen API. + */ + export namespace Fullscreen { + /** + * The element that is currently fullscreen, if any. To simply check if the + * browser is in fullscreen mode or not, use {@link Fullscreen#fullscreen}. + */ + const element: any; + /** + * The name of the event on the document that is fired when fullscreen is + * entered or exited. This event name is intended for use with addEventListener. + * In your event handler, to determine if the browser is in fullscreen mode or not, + * use {@link Fullscreen#fullscreen}. + */ + const changeEventName: string; + /** + * The name of the event that is fired when a fullscreen error + * occurs. This event name is intended for use with addEventListener. + */ + const errorEventName: string; + /** + * Determine whether the browser will allow an element to be made fullscreen, or not. + * For example, by default, iframes cannot go fullscreen unless the containing page + * adds an "allowfullscreen" attribute (or prefixed equivalent). + */ + const enabled: boolean; + /** + * Determines if the browser is currently in fullscreen mode. + */ + const fullscreen: boolean; + /** + * Detects whether the browser supports the standard fullscreen API. + * @returns true if the browser supports the standard fullscreen API, + * false otherwise. + */ + function supportsFullscreen(): boolean; + /** + * Asynchronously requests the browser to enter fullscreen mode on the given element. + * If fullscreen mode is not supported by the browser, does nothing. + * @example + * // Put the entire page into fullscreen. + * Cesium.Fullscreen.requestFullscreen(document.body) + * + * // Place only the Cesium canvas into fullscreen. + * Cesium.Fullscreen.requestFullscreen(scene.canvas) + * @param element - The HTML element which will be placed into fullscreen mode. + * @param [vrDevice] - The HMDVRDevice device. + */ + function requestFullscreen(element: any, vrDevice?: any): void; + /** + * Asynchronously exits fullscreen mode. If the browser is not currently + * in fullscreen, or if fullscreen mode is not supported by the browser, does nothing. + */ + function exitFullscreen(): void; + } + + /** + * The type of geocoding to be performed by a {@link GeocoderService}. + */ + export enum GeocodeType { + /** + * Perform a search where the input is considered complete. + */ + SEARCH = 0, + /** + * Perform an auto-complete using partial input, typically + * reserved for providing possible results as a user is typing. + */ + AUTOCOMPLETE = 1, + } + + export namespace GeocoderService { + /** + * @property displayName - The display name for a location + * @property destination - The bounding box for a location + */ + type Result = { + displayName: string; + destination: Rectangle | Cartesian3; + attributions?: object[]; + }; + } + + /** + * Provides geocoding through an external service. This type describes an interface and + * is not intended to be used. + */ + export class GeocoderService { + constructor(); + /** + * Gets the credit to display after a geocode is performed. Typically this is used to credit + * the geocoder service. + */ + readonly credit: Credit | undefined; + /** + * Parses credits from the geocoder result attributions, if present. + * @param geocoderResult - The geocoder result + * @returns A list of credits if present in the result, otherwise undefined + */ + static getCreditsFromResult( + geocoderResult: GeocoderService.Result, + ): Credit[] | undefined; + /** + * @param query - The query to be sent to the geocoder service + * @param [type = GeocodeType.SEARCH] - The type of geocode to perform. + */ + geocode( + query: string, + type?: GeocodeType, + ): Promise; + } + + /** + * A simple map projection where longitude and latitude are linearly mapped to X and Y by multiplying + * them by the {@link Ellipsoid#maximumRadius}. This projection + * is commonly known as geographic, equirectangular, equidistant cylindrical, or plate carrée. When using the WGS84 ellipsoid, it + * is also known as EPSG:4326. + * @param [ellipsoid = Ellipsoid.default] - The ellipsoid. + */ + export class GeographicProjection { + constructor(ellipsoid?: Ellipsoid); + /** + * Gets the {@link Ellipsoid}. + */ + readonly ellipsoid: Ellipsoid; + /** + * Projects a set of {@link Cartographic} coordinates, in radians, to map coordinates, in meters. + * X and Y are the longitude and latitude, respectively, multiplied by the maximum radius of the + * ellipsoid. Z is the unmodified height. + * @param cartographic - The coordinates to project. + * @param [result] - An instance into which to copy the result. If this parameter is + * undefined, a new instance is created and returned. + * @returns The projected coordinates. If the result parameter is not undefined, the + * coordinates are copied there and that instance is returned. Otherwise, a new instance is + * created and returned. + */ + project(cartographic: Cartographic, result?: Cartesian3): Cartesian3; + /** + * Unprojects a set of projected {@link Cartesian3} coordinates, in meters, to {@link Cartographic} + * coordinates, in radians. Longitude and Latitude are the X and Y coordinates, respectively, + * divided by the maximum radius of the ellipsoid. Height is the unmodified Z coordinate. + * @param cartesian - The Cartesian position to unproject with height (z) in meters. + * @param [result] - An instance into which to copy the result. If this parameter is + * undefined, a new instance is created and returned. + * @returns The unprojected coordinates. If the result parameter is not undefined, the + * coordinates are copied there and that instance is returned. Otherwise, a new instance is + * created and returned. + */ + unproject(cartesian: Cartesian3, result?: Cartographic): Cartographic; + } + + /** + * A tiling scheme for geometry referenced to a simple {@link GeographicProjection} where + * longitude and latitude are directly mapped to X and Y. This projection is commonly + * known as geographic, equirectangular, equidistant cylindrical, or plate carrée. + * @param [options] - Object with the following properties: + * @param [options.ellipsoid = Ellipsoid.default] - The ellipsoid whose surface is being tiled. Defaults to + * the default ellipsoid. + * @param [options.rectangle = Rectangle.MAX_VALUE] - The rectangle, in radians, covered by the tiling scheme. + * @param [options.numberOfLevelZeroTilesX = 2] - The number of tiles in the X direction at level zero of + * the tile tree. + * @param [options.numberOfLevelZeroTilesY = 1] - The number of tiles in the Y direction at level zero of + * the tile tree. + */ + export class GeographicTilingScheme { + constructor(options?: { + ellipsoid?: Ellipsoid; + rectangle?: Rectangle; + numberOfLevelZeroTilesX?: number; + numberOfLevelZeroTilesY?: number; + }); + /** + * Gets the ellipsoid that is tiled by this tiling scheme. + */ + ellipsoid: Ellipsoid; + /** + * Gets the rectangle, in radians, covered by this tiling scheme. + */ + rectangle: Rectangle; + /** + * Gets the map projection used by this tiling scheme. + */ + projection: MapProjection; + /** + * Gets the total number of tiles in the X direction at a specified level-of-detail. + * @param level - The level-of-detail. + * @returns The number of tiles in the X direction at the given level. + */ + getNumberOfXTilesAtLevel(level: number): number; + /** + * Gets the total number of tiles in the Y direction at a specified level-of-detail. + * @param level - The level-of-detail. + * @returns The number of tiles in the Y direction at the given level. + */ + getNumberOfYTilesAtLevel(level: number): number; + /** + * Transforms a rectangle specified in geodetic radians to the native coordinate system + * of this tiling scheme. + * @param rectangle - The rectangle to transform. + * @param [result] - The instance to which to copy the result, or undefined if a new instance + * should be created. + * @returns The specified 'result', or a new object containing the native rectangle if 'result' + * is undefined. + */ + rectangleToNativeRectangle( + rectangle: Rectangle, + result?: Rectangle, + ): Rectangle; + /** + * Converts tile x, y coordinates and level to a rectangle expressed in the native coordinates + * of the tiling scheme. + * @param x - The integer x coordinate of the tile. + * @param y - The integer y coordinate of the tile. + * @param level - The tile level-of-detail. Zero is the least detailed. + * @param [result] - The instance to which to copy the result, or undefined if a new instance + * should be created. + * @returns The specified 'result', or a new object containing the rectangle + * if 'result' is undefined. + */ + tileXYToNativeRectangle( + x: number, + y: number, + level: number, + result?: any, + ): Rectangle; + /** + * Converts tile x, y coordinates and level to a cartographic rectangle in radians. + * @param x - The integer x coordinate of the tile. + * @param y - The integer y coordinate of the tile. + * @param level - The tile level-of-detail. Zero is the least detailed. + * @param [result] - The instance to which to copy the result, or undefined if a new instance + * should be created. + * @returns The specified 'result', or a new object containing the rectangle + * if 'result' is undefined. + */ + tileXYToRectangle( + x: number, + y: number, + level: number, + result?: any, + ): Rectangle; + /** + * Calculates the tile x, y coordinates of the tile containing + * a given cartographic position. + * @param position - The position. + * @param level - The tile level-of-detail. Zero is the least detailed. + * @param [result] - The instance to which to copy the result, or undefined if a new instance + * should be created. + * @returns The specified 'result', or a new object containing the tile x, y coordinates + * if 'result' is undefined. + */ + positionToTileXY( + position: Cartographic, + level: number, + result?: Cartesian2, + ): Cartesian2; + } + + /** + * A geometry representation with attributes forming vertices and optional index data + * defining primitives. Geometries and an {@link Appearance}, which describes the shading, + * can be assigned to a {@link Primitive} for visualization. A Primitive can + * be created from many heterogeneous - in many cases - geometries for performance. + *

+ * Geometries can be transformed and optimized using functions in {@link GeometryPipeline}. + *

+ * @example + * // Create geometry with a position attribute and indexed lines. + * const positions = new Float64Array([ + * 0.0, 0.0, 0.0, + * 7500000.0, 0.0, 0.0, + * 0.0, 7500000.0, 0.0 + * ]); + * + * const geometry = new Cesium.Geometry({ + * attributes : { + * position : new Cesium.GeometryAttribute({ + * componentDatatype : Cesium.ComponentDatatype.DOUBLE, + * componentsPerAttribute : 3, + * values : positions + * }) + * }, + * indices : new Uint16Array([0, 1, 1, 2, 2, 0]), + * primitiveType : Cesium.PrimitiveType.LINES, + * boundingSphere : Cesium.BoundingSphere.fromVertices(positions) + * }); + * @param options - Object with the following properties: + * @param options.attributes - Attributes, which make up the geometry's vertices. + * @param [options.primitiveType = PrimitiveType.TRIANGLES] - The type of primitives in the geometry. + * @param [options.indices] - Optional index data that determines the primitives in the geometry. + * @param [options.boundingSphere] - An optional bounding sphere that fully enclosed the geometry. + */ + export class Geometry { + constructor(options: { + attributes: GeometryAttributes; + primitiveType?: PrimitiveType; + indices?: Uint16Array | Uint32Array; + boundingSphere?: BoundingSphere; + }); + /** + * Attributes, which make up the geometry's vertices. Each property in this object corresponds to a + * {@link GeometryAttribute} containing the attribute's data. + *

+ * Attributes are always stored non-interleaved in a Geometry. + *

+ *

+ * There are reserved attribute names with well-known semantics. The following attributes + * are created by a Geometry (depending on the provided {@link VertexFormat}. + *

    + *
  • position - 3D vertex position. 64-bit floating-point (for precision). 3 components per attribute. See {@link VertexFormat#position}.
  • + *
  • normal - Normal (normalized), commonly used for lighting. 32-bit floating-point. 3 components per attribute. See {@link VertexFormat#normal}.
  • + *
  • st - 2D texture coordinate. 32-bit floating-point. 2 components per attribute. See {@link VertexFormat#st}.
  • + *
  • bitangent - Bitangent (normalized), used for tangent-space effects like bump mapping. 32-bit floating-point. 3 components per attribute. See {@link VertexFormat#bitangent}.
  • + *
  • tangent - Tangent (normalized), used for tangent-space effects like bump mapping. 32-bit floating-point. 3 components per attribute. See {@link VertexFormat#tangent}.
  • + *
+ *

+ *

+ * The following attribute names are generally not created by a Geometry, but are added + * to a Geometry by a {@link Primitive} or {@link GeometryPipeline} functions to prepare + * the geometry for rendering. + *

    + *
  • position3DHigh - High 32 bits for encoded 64-bit position computed with {@link GeometryPipeline.encodeAttribute}. 32-bit floating-point. 4 components per attribute.
  • + *
  • position3DLow - Low 32 bits for encoded 64-bit position computed with {@link GeometryPipeline.encodeAttribute}. 32-bit floating-point. 4 components per attribute.
  • + *
  • position2DHigh - High 32 bits for encoded 64-bit 2D (Columbus view) position computed with {@link GeometryPipeline.encodeAttribute}. 32-bit floating-point. 4 components per attribute.
  • + *
  • position2DLow - Low 32 bits for encoded 64-bit 2D (Columbus view) position computed with {@link GeometryPipeline.encodeAttribute}. 32-bit floating-point. 4 components per attribute.
  • + *
  • color - RGBA color (normalized) usually from {@link GeometryInstance#color}. 32-bit floating-point. 4 components per attribute.
  • + *
  • pickColor - RGBA color used for picking. 32-bit floating-point. 4 components per attribute.
  • + *
+ *

+ * @example + * geometry.attributes.position = new Cesium.GeometryAttribute({ + * componentDatatype : Cesium.ComponentDatatype.FLOAT, + * componentsPerAttribute : 3, + * values : new Float32Array(0) + * }); + */ + attributes: GeometryAttributes; + /** + * Optional index data that - along with {@link Geometry#primitiveType} - + * determines the primitives in the geometry. + */ + indices: any[] | undefined; + /** + * The type of primitives in the geometry. This is most often {@link PrimitiveType.TRIANGLES}, + * but can varying based on the specific geometry. + */ + primitiveType: PrimitiveType | undefined; + /** + * An optional bounding sphere that fully encloses the geometry. This is + * commonly used for culling. + */ + boundingSphere: BoundingSphere | undefined; + /** + * Computes the number of vertices in a geometry. The runtime is linear with + * respect to the number of attributes in a vertex, not the number of vertices. + * @example + * const numVertices = Cesium.Geometry.computeNumberOfVertices(geometry); + * @param geometry - The geometry. + * @returns The number of vertices in the geometry. + */ + static computeNumberOfVertices(geometry: Geometry): number; + } + + /** + * Values and type information for geometry attributes. A {@link Geometry} + * generally contains one or more attributes. All attributes together form + * the geometry's vertices. + * @example + * const geometry = new Cesium.Geometry({ + * attributes : { + * position : new Cesium.GeometryAttribute({ + * componentDatatype : Cesium.ComponentDatatype.FLOAT, + * componentsPerAttribute : 3, + * values : new Float32Array([ + * 0.0, 0.0, 0.0, + * 7500000.0, 0.0, 0.0, + * 0.0, 7500000.0, 0.0 + * ]) + * }) + * }, + * primitiveType : Cesium.PrimitiveType.LINE_LOOP + * }); + * @param [options] - Object with the following properties: + * @param options.componentDatatype - The datatype of each component in the attribute, e.g., individual elements in values. + * @param options.componentsPerAttribute - A number between 1 and 4 that defines the number of components in an attributes. + * @param [options.normalize = false] - When true and componentDatatype is an integer format, indicate that the components should be mapped to the range [0, 1] (unsigned) or [-1, 1] (signed) when they are accessed as floating-point for rendering. + * @param options.values - The values for the attributes stored in a typed array. + */ + export class GeometryAttribute { + constructor(options?: { + componentDatatype: ComponentDatatype; + componentsPerAttribute: number; + normalize?: boolean; + values: + | number[] + | Int8Array + | Uint8Array + | Int16Array + | Uint16Array + | Int32Array + | Uint32Array + | Float32Array + | Float64Array; + }); + /** + * The datatype of each component in the attribute, e.g., individual elements in + * {@link GeometryAttribute#values}. + */ + componentDatatype: ComponentDatatype; + /** + * A number between 1 and 4 that defines the number of components in an attributes. + * For example, a position attribute with x, y, and z components would have 3 as + * shown in the code example. + * @example + * attribute.componentDatatype = Cesium.ComponentDatatype.FLOAT; + * attribute.componentsPerAttribute = 3; + * attribute.values = new Float32Array([ + * 0.0, 0.0, 0.0, + * 7500000.0, 0.0, 0.0, + * 0.0, 7500000.0, 0.0 + * ]); + */ + componentsPerAttribute: number; + /** + * When true and componentDatatype is an integer format, + * indicate that the components should be mapped to the range [0, 1] (unsigned) + * or [-1, 1] (signed) when they are accessed as floating-point for rendering. + *

+ * This is commonly used when storing colors using {@link ComponentDatatype.UNSIGNED_BYTE}. + *

+ * @example + * attribute.componentDatatype = Cesium.ComponentDatatype.UNSIGNED_BYTE; + * attribute.componentsPerAttribute = 4; + * attribute.normalize = true; + * attribute.values = new Uint8Array([ + * Cesium.Color.floatToByte(color.red), + * Cesium.Color.floatToByte(color.green), + * Cesium.Color.floatToByte(color.blue), + * Cesium.Color.floatToByte(color.alpha) + * ]); + */ + normalize: boolean; + /** + * The values for the attributes stored in a typed array. In the code example, + * every three elements in values defines one attributes since + * componentsPerAttribute is 3. + * @example + * attribute.componentDatatype = Cesium.ComponentDatatype.FLOAT; + * attribute.componentsPerAttribute = 3; + * attribute.values = new Float32Array([ + * 0.0, 0.0, 0.0, + * 7500000.0, 0.0, 0.0, + * 0.0, 7500000.0, 0.0 + * ]); + */ + values: + | number[] + | Int8Array + | Uint8Array + | Int16Array + | Uint16Array + | Int32Array + | Uint32Array + | Float32Array + | Float64Array; + } + + /** + * Attributes, which make up a geometry's vertices. Each property in this object corresponds to a + * {@link GeometryAttribute} containing the attribute's data. + *

+ * Attributes are always stored non-interleaved in a Geometry. + *

+ */ + export class GeometryAttributes { + constructor(); + /** + * The 3D position attribute. + *

+ * 64-bit floating-point (for precision). 3 components per attribute. + *

+ */ + position: GeometryAttribute | undefined; + /** + * The normal attribute (normalized), which is commonly used for lighting. + *

+ * 32-bit floating-point. 3 components per attribute. + *

+ */ + normal: GeometryAttribute | undefined; + /** + * The 2D texture coordinate attribute. + *

+ * 32-bit floating-point. 2 components per attribute + *

+ */ + st: GeometryAttribute | undefined; + /** + * The bitangent attribute (normalized), which is used for tangent-space effects like bump mapping. + *

+ * 32-bit floating-point. 3 components per attribute. + *

+ */ + bitangent: GeometryAttribute | undefined; + /** + * The tangent attribute (normalized), which is used for tangent-space effects like bump mapping. + *

+ * 32-bit floating-point. 3 components per attribute. + *

+ */ + tangent: GeometryAttribute | undefined; + /** + * The color attribute. + *

+ * 8-bit unsigned integer. 4 components per attribute. + *

+ */ + color: GeometryAttribute | undefined; + } + + /** + * Base class for all geometry creation utility classes that can be passed to {@link GeometryInstance} + * for asynchronous geometry creation. + */ + export class GeometryFactory { + constructor(); + /** + * Returns a geometry. + * @param geometryFactory - A description of the circle. + * @returns The computed vertices and indices. + */ + static createGeometry( + geometryFactory: GeometryFactory, + ): Geometry | undefined; + } + + /** + * Geometry instancing allows one {@link Geometry} object to be positions in several + * different locations and colored uniquely. For example, one {@link BoxGeometry} can + * be instanced several times, each with a different modelMatrix to change + * its position, rotation, and scale. + * @example + * // Create geometry for a box, and two instances that refer to it. + * // One instance positions the box on the bottom and colored aqua. + * // The other instance positions the box on the top and color white. + * const geometry = Cesium.BoxGeometry.fromDimensions({ + * vertexFormat : Cesium.VertexFormat.POSITION_AND_NORMAL, + * dimensions : new Cesium.Cartesian3(1000000.0, 1000000.0, 500000.0) + * }); + * const instanceBottom = new Cesium.GeometryInstance({ + * geometry : geometry, + * modelMatrix : Cesium.Matrix4.multiplyByTranslation(Cesium.Transforms.eastNorthUpToFixedFrame( + * Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883)), new Cesium.Cartesian3(0.0, 0.0, 1000000.0), new Cesium.Matrix4()), + * attributes : { + * color : Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.AQUA) + * }, + * id : 'bottom' + * }); + * const instanceTop = new Cesium.GeometryInstance({ + * geometry : geometry, + * modelMatrix : Cesium.Matrix4.multiplyByTranslation(Cesium.Transforms.eastNorthUpToFixedFrame( + * Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883)), new Cesium.Cartesian3(0.0, 0.0, 3000000.0), new Cesium.Matrix4()), + * attributes : { + * color : Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.AQUA) + * }, + * id : 'top' + * }); + * @param options - Object with the following properties: + * @param options.geometry - The geometry to instance. + * @param [options.modelMatrix = Matrix4.IDENTITY] - The model matrix that transforms to transform the geometry from model to world coordinates. + * @param [options.id] - A user-defined object to return when the instance is picked with {@link Scene#pick} or get/set per-instance attributes with {@link Primitive#getGeometryInstanceAttributes}. + * @param [options.attributes] - Per-instance attributes like a show or color attribute shown in the example below. + */ + export class GeometryInstance { + constructor(options: { + geometry: Geometry | GeometryFactory; + modelMatrix?: Matrix4; + id?: any; + attributes?: any; + }); + /** + * The geometry being instanced. + */ + geometry: Geometry; + /** + * The 4x4 transformation matrix that transforms the geometry from model to world coordinates. + * When this is the identity matrix, the geometry is drawn in world coordinates, i.e., Earth's WGS84 coordinates. + * Local reference frames can be used by providing a different transformation matrix, like that returned + * by {@link Transforms.eastNorthUpToFixedFrame}. + */ + modelMatrix: Matrix4; + /** + * User-defined object returned when the instance is picked or used to get/set per-instance attributes. + */ + id: any | undefined; + /** + * Per-instance attributes like {@link ColorGeometryInstanceAttribute} or {@link ShowGeometryInstanceAttribute}. + * {@link Geometry} attributes varying per vertex; these attributes are constant for the entire instance. + */ + attributes: any; + } + + /** + * Values and type information for per-instance geometry attributes. + * @example + * const instance = new Cesium.GeometryInstance({ + * geometry : Cesium.BoxGeometry.fromDimensions({ + * dimensions : new Cesium.Cartesian3(1000000.0, 1000000.0, 500000.0) + * }), + * modelMatrix : Cesium.Matrix4.multiplyByTranslation(Cesium.Transforms.eastNorthUpToFixedFrame( + * Cesium.Cartesian3.fromDegrees(0.0, 0.0)), new Cesium.Cartesian3(0.0, 0.0, 1000000.0), new Cesium.Matrix4()), + * id : 'box', + * attributes : { + * color : new Cesium.GeometryInstanceAttribute({ + * componentDatatype : Cesium.ComponentDatatype.UNSIGNED_BYTE, + * componentsPerAttribute : 4, + * normalize : true, + * value : [255, 255, 0, 255] + * }) + * } + * }); + * @param options - Object with the following properties: + * @param options.componentDatatype - The datatype of each component in the attribute, e.g., individual elements in values. + * @param options.componentsPerAttribute - A number between 1 and 4 that defines the number of components in an attributes. + * @param [options.normalize = false] - When true and componentDatatype is an integer format, indicate that the components should be mapped to the range [0, 1] (unsigned) or [-1, 1] (signed) when they are accessed as floating-point for rendering. + * @param options.value - The value for the attribute. + */ + export class GeometryInstanceAttribute { + constructor(options: { + componentDatatype: ComponentDatatype; + componentsPerAttribute: number; + normalize?: boolean; + value: number[]; + }); + /** + * The datatype of each component in the attribute, e.g., individual elements in + * {@link GeometryInstanceAttribute#value}. + */ + componentDatatype: ComponentDatatype; + /** + * A number between 1 and 4 that defines the number of components in an attributes. + * For example, a position attribute with x, y, and z components would have 3 as + * shown in the code example. + * @example + * show : new Cesium.GeometryInstanceAttribute({ + * componentDatatype : Cesium.ComponentDatatype.UNSIGNED_BYTE, + * componentsPerAttribute : 1, + * normalize : true, + * value : [1.0] + * }) + */ + componentsPerAttribute: number; + /** + * When true and componentDatatype is an integer format, + * indicate that the components should be mapped to the range [0, 1] (unsigned) + * or [-1, 1] (signed) when they are accessed as floating-point for rendering. + *

+ * This is commonly used when storing colors using {@link ComponentDatatype.UNSIGNED_BYTE}. + *

+ * @example + * attribute.componentDatatype = Cesium.ComponentDatatype.UNSIGNED_BYTE; + * attribute.componentsPerAttribute = 4; + * attribute.normalize = true; + * attribute.value = [ + * Cesium.Color.floatToByte(color.red), + * Cesium.Color.floatToByte(color.green), + * Cesium.Color.floatToByte(color.blue), + * Cesium.Color.floatToByte(color.alpha) + * ]; + */ + normalize: boolean; + /** + * The values for the attributes stored in a typed array. In the code example, + * every three elements in values defines one attributes since + * componentsPerAttribute is 3. + * @example + * show : new Cesium.GeometryInstanceAttribute({ + * componentDatatype : Cesium.ComponentDatatype.UNSIGNED_BYTE, + * componentsPerAttribute : 1, + * normalize : true, + * value : [1.0] + * }) + */ + value: number[]; + } + + /** + * Content pipeline functions for geometries. + */ + export namespace GeometryPipeline { + /** + * Converts a geometry's triangle indices to line indices. If the geometry has an indices + * and its primitiveType is TRIANGLES, TRIANGLE_STRIP, + * TRIANGLE_FAN, it is converted to LINES; otherwise, the geometry is not changed. + *

+ * This is commonly used to create a wireframe geometry for visual debugging. + *

+ * @example + * geometry = Cesium.GeometryPipeline.toWireframe(geometry); + * @param geometry - The geometry to modify. + * @returns The modified geometry argument, with its triangle indices converted to lines. + */ + function toWireframe(geometry: Geometry): Geometry; + /** + * Creates a new {@link Geometry} with LINES representing the provided + * attribute (attributeName) for the provided geometry. This is used to + * visualize vector attributes like normals, tangents, and bitangents. + * @example + * const geometry = Cesium.GeometryPipeline.createLineSegmentsForVectors(instance.geometry, 'bitangent', 100000.0); + * @param geometry - The Geometry instance with the attribute. + * @param [attributeName = 'normal'] - The name of the attribute. + * @param [length = 10000.0] - The length of each line segment in meters. This can be negative to point the vector in the opposite direction. + * @returns A new Geometry instance with line segments for the vector. + */ + function createLineSegmentsForVectors( + geometry: Geometry, + attributeName?: string, + length?: number, + ): Geometry; + /** + * Creates an object that maps attribute names to unique locations (indices) + * for matching vertex attributes and shader programs. + * @example + * const attributeLocations = Cesium.GeometryPipeline.createAttributeLocations(geometry); + * // Example output + * // { + * // 'position' : 0, + * // 'normal' : 1 + * // } + * @param geometry - The geometry, which is not modified, to create the object for. + * @returns An object with attribute name / index pairs. + */ + function createAttributeLocations(geometry: Geometry): any; + /** + * Reorders a geometry's attributes and indices to achieve better performance from the GPU's pre-vertex-shader cache. + * @example + * geometry = Cesium.GeometryPipeline.reorderForPreVertexCache(geometry); + * @param geometry - The geometry to modify. + * @returns The modified geometry argument, with its attributes and indices reordered for the GPU's pre-vertex-shader cache. + */ + function reorderForPreVertexCache(geometry: Geometry): Geometry; + /** + * Reorders a geometry's indices to achieve better performance from the GPU's + * post vertex-shader cache by using the Tipsify algorithm. If the geometry primitiveType + * is not TRIANGLES or the geometry does not have an indices, this function has no effect. + * @example + * geometry = Cesium.GeometryPipeline.reorderForPostVertexCache(geometry); + * @param geometry - The geometry to modify. + * @param [cacheCapacity = 24] - The number of vertices that can be held in the GPU's vertex cache. + * @returns The modified geometry argument, with its indices reordered for the post-vertex-shader cache. + */ + function reorderForPostVertexCache( + geometry: Geometry, + cacheCapacity?: number, + ): Geometry; + /** + * Splits a geometry into multiple geometries, if necessary, to ensure that indices in the + * indices fit into unsigned shorts. This is used to meet the WebGL requirements + * when unsigned int indices are not supported. + *

+ * If the geometry does not have any indices, this function has no effect. + *

+ * @example + * const geometries = Cesium.GeometryPipeline.fitToUnsignedShortIndices(geometry); + * @param geometry - The geometry to be split into multiple geometries. + * @returns An array of geometries, each with indices that fit into unsigned shorts. + */ + function fitToUnsignedShortIndices(geometry: Geometry): Geometry[]; + /** + * Projects a geometry's 3D position attribute to 2D, replacing the position + * attribute with separate position3D and position2D attributes. + *

+ * If the geometry does not have a position, this function has no effect. + *

+ * @example + * geometry = Cesium.GeometryPipeline.projectTo2D(geometry, 'position', 'position3D', 'position2D'); + * @param geometry - The geometry to modify. + * @param attributeName - The name of the attribute. + * @param attributeName3D - The name of the attribute in 3D. + * @param attributeName2D - The name of the attribute in 2D. + * @param [projection = new GeographicProjection()] - The projection to use. + * @returns The modified geometry argument with position3D and position2D attributes. + */ + function projectTo2D( + geometry: Geometry, + attributeName: string, + attributeName3D: string, + attributeName2D: string, + projection?: any, + ): Geometry; + /** + * Encodes floating-point geometry attribute values as two separate attributes to improve + * rendering precision. + *

+ * This is commonly used to create high-precision position vertex attributes. + *

+ * @example + * geometry = Cesium.GeometryPipeline.encodeAttribute(geometry, 'position3D', 'position3DHigh', 'position3DLow'); + * @param geometry - The geometry to modify. + * @param attributeName - The name of the attribute. + * @param attributeHighName - The name of the attribute for the encoded high bits. + * @param attributeLowName - The name of the attribute for the encoded low bits. + * @returns The modified geometry argument, with its encoded attribute. + */ + function encodeAttribute( + geometry: Geometry, + attributeName: string, + attributeHighName: string, + attributeLowName: string, + ): Geometry; + /** + * Transforms a geometry instance to world coordinates. This changes + * the instance's modelMatrix to {@link Matrix4.IDENTITY} and transforms the + * following attributes if they are present: position, normal, + * tangent, and bitangent. + * @example + * Cesium.GeometryPipeline.transformToWorldCoordinates(instance); + * @param instance - The geometry instance to modify. + * @returns The modified instance argument, with its attributes transforms to world coordinates. + */ + function transformToWorldCoordinates( + instance: GeometryInstance, + ): GeometryInstance; + /** + * Computes per-vertex normals for a geometry containing TRIANGLES by averaging the normals of + * all triangles incident to the vertex. The result is a new normal attribute added to the geometry. + * This assumes a counter-clockwise winding order. + * @example + * Cesium.GeometryPipeline.computeNormal(geometry); + * @param geometry - The geometry to modify. + * @returns The modified geometry argument with the computed normal attribute. + */ + function computeNormal(geometry: Geometry): Geometry; + /** + * Computes per-vertex tangents and bitangents for a geometry containing TRIANGLES. + * The result is new tangent and bitangent attributes added to the geometry. + * This assumes a counter-clockwise winding order. + *

+ * Based on Computing Tangent Space Basis Vectors + * for an Arbitrary Mesh by Eric Lengyel. + *

+ * @example + * Cesium.GeometryPipeline.computeTangentAndBiTangent(geometry); + * @param geometry - The geometry to modify. + * @returns The modified geometry argument with the computed tangent and bitangent attributes. + */ + function computeTangentAndBitangent(geometry: Geometry): Geometry; + /** + * Compresses and packs geometry normal attribute values to save memory. + * @example + * geometry = Cesium.GeometryPipeline.compressVertices(geometry); + * @param geometry - The geometry to modify. + * @returns The modified geometry argument, with its normals compressed and packed. + */ + function compressVertices(geometry: Geometry): Geometry; + } + + /** + *
+ * To construct GoogleEarthEnterpriseMetadata, call {@link GoogleEarthEnterpriseMetadata.fromUrl}. Do not call the constructor directly. + *
+ * + * Provides metadata using the Google Earth Enterprise REST API. This is used by the GoogleEarthEnterpriseImageryProvider + * and GoogleEarthEnterpriseTerrainProvider to share metadata requests. + */ + export class GoogleEarthEnterpriseMetadata { + constructor(); + /** + * True if imagery is available. + */ + imageryPresent: boolean; + /** + * True if imagery is sent as a protocol buffer, false if sent as plain images. If undefined we will try both. + */ + protoImagery: boolean | undefined; + /** + * True if terrain is available. + */ + terrainPresent: boolean; + /** + * Exponent used to compute constant to calculate negative height values. + */ + negativeAltitudeExponentBias: number; + /** + * Threshold where any numbers smaller are actually negative values. They are multiplied by -2^negativeAltitudeExponentBias. + */ + negativeAltitudeThreshold: number; + /** + * Dictionary of provider id to copyright strings. + */ + providers: any; + /** + * Key used to decode packets + */ + key: ArrayBuffer; + /** + * Gets the name of the Google Earth Enterprise server. + */ + readonly url: string; + /** + * Gets the proxy used for metadata requests. + */ + readonly proxy: Proxy; + /** + * Gets the resource used for metadata requests. + */ + readonly resource: Resource; + /** + * Creates a metadata object using the Google Earth Enterprise REST API. This is used by the GoogleEarthEnterpriseImageryProvider + * and GoogleEarthEnterpriseTerrainProvider to share metadata requests. + * @param resourceOrUrl - The url of the Google Earth Enterprise server hosting the imagery. + * @returns A promise which resolves to the created GoogleEarthEnterpriseMetadata instance/ + */ + static fromUrl( + resourceOrUrl: Resource | string, + ): Promise; + /** + * Converts a tiles (x, y, level) position into a quadkey used to request an image + * from a Google Earth Enterprise server. + * @param x - The tile's x coordinate. + * @param y - The tile's y coordinate. + * @param level - The tile's zoom level. + */ + static tileXYToQuadKey(x: number, y: number, level: number): void; + /** + * Converts a tile's quadkey used to request an image from a Google Earth Enterprise server into the + * (x, y, level) position. + * @param quadkey - The tile's quad key + */ + static quadKeyToTileXY(quadkey: string): void; + } + + /** + * Terrain data for a single tile from a Google Earth Enterprise server. + * @example + * const buffer = ... + * const childTileMask = ... + * const terrainData = new Cesium.GoogleEarthEnterpriseTerrainData({ + * buffer : heightBuffer, + * childTileMask : childTileMask + * }); + * @param options - Object with the following properties: + * @param options.buffer - The buffer containing terrain data. + * @param options.negativeAltitudeExponentBias - Multiplier for negative terrain heights that are encoded as very small positive values. + * @param options.negativeElevationThreshold - Threshold for negative values + * @param [options.childTileMask = 15] - A bit mask indicating which of this tile's four children exist. + * If a child's bit is set, geometry will be requested for that tile as well when it + * is needed. If the bit is cleared, the child tile is not requested and geometry is + * instead upsampled from the parent. The bit values are as follows: + * + * + * + * + * + * + *
Bit PositionBit ValueChild Tile
01Southwest
12Southeast
24Northeast
38Northwest
+ * @param [options.createdByUpsampling = false] - True if this instance was created by upsampling another instance; + * otherwise, false. + * @param [options.credits] - Array of credits for this tile. + */ + export class GoogleEarthEnterpriseTerrainData { + constructor(options: { + buffer: ArrayBuffer; + negativeAltitudeExponentBias: number; + negativeElevationThreshold: number; + childTileMask?: number; + createdByUpsampling?: boolean; + credits?: Credit[]; + }); + /** + * An array of credits for this tile + */ + credits: Credit[]; + /** + * The water mask included in this terrain data, if any. A water mask is a rectangular + * Uint8Array or image where a value of 255 indicates water and a value of 0 indicates land. + * Values in between 0 and 255 are allowed as well to smoothly blend between land and water. + */ + waterMask: Uint8Array | HTMLImageElement | HTMLCanvasElement; + /** + * Computes the terrain height at a specified longitude and latitude. + * @param rectangle - The rectangle covered by this terrain data. + * @param longitude - The longitude in radians. + * @param latitude - The latitude in radians. + * @returns The terrain height at the specified position. If the position + * is outside the rectangle, this method will extrapolate the height, which is likely to be wildly + * incorrect for positions far outside the rectangle. + */ + interpolateHeight( + rectangle: Rectangle, + longitude: number, + latitude: number, + ): number; + /** + * Upsamples this terrain data for use by a descendant tile. The resulting instance will contain a subset of the + * height samples in this instance, interpolated if necessary. + * @param tilingScheme - The tiling scheme of this terrain data. + * @param thisX - The X coordinate of this tile in the tiling scheme. + * @param thisY - The Y coordinate of this tile in the tiling scheme. + * @param thisLevel - The level of this tile in the tiling scheme. + * @param descendantX - The X coordinate within the tiling scheme of the descendant tile for which we are upsampling. + * @param descendantY - The Y coordinate within the tiling scheme of the descendant tile for which we are upsampling. + * @param descendantLevel - The level within the tiling scheme of the descendant tile for which we are upsampling. + * @returns A promise for upsampled heightmap terrain data for the descendant tile, + * or undefined if too many asynchronous upsample operations are in progress and the request has been + * deferred. + */ + upsample( + tilingScheme: TilingScheme, + thisX: number, + thisY: number, + thisLevel: number, + descendantX: number, + descendantY: number, + descendantLevel: number, + ): Promise | undefined; + /** + * Determines if a given child tile is available, based on the + * {@link HeightmapTerrainData.childTileMask}. The given child tile coordinates are assumed + * to be one of the four children of this tile. If non-child tile coordinates are + * given, the availability of the southeast child tile is returned. + * @param thisX - The tile X coordinate of this (the parent) tile. + * @param thisY - The tile Y coordinate of this (the parent) tile. + * @param childX - The tile X coordinate of the child tile to check for availability. + * @param childY - The tile Y coordinate of the child tile to check for availability. + * @returns True if the child tile is available; otherwise, false. + */ + isChildAvailable( + thisX: number, + thisY: number, + childX: number, + childY: number, + ): boolean; + /** + * Gets a value indicating whether or not this terrain data was created by upsampling lower resolution + * terrain data. If this value is false, the data was obtained from some other source, such + * as by downloading it from a remote server. This method should return true for instances + * returned from a call to {@link HeightmapTerrainData#upsample}. + * @returns True if this instance was created by upsampling; otherwise, false. + */ + wasCreatedByUpsampling(): boolean; + } + + export namespace GoogleEarthEnterpriseTerrainProvider { + /** + * Initialization options for GoogleEarthEnterpriseTerrainProvider constructor + * @property [ellipsoid = Ellipsoid.default] - The ellipsoid. If not specified, the default ellipsoid is used. + * @property [credit] - A credit for the data source, which is displayed on the canvas. + */ + type ConstructorOptions = { + ellipsoid?: Ellipsoid; + credit?: Credit | string; + }; + } + + /** + *
+ * To construct a GoogleEarthEnterpriseTerrainProvider, call {@link GoogleEarthEnterpriseTerrainProvider.fromMetadata}. Do not call the constructor directly. + *
+ * + * Provides tiled terrain using the Google Earth Enterprise REST API. + * @example + * const geeMetadata = await GoogleEarthEnterpriseMetadata.fromUrl("http://www.example.com"); + * const gee = Cesium.GoogleEarthEnterpriseTerrainProvider.fromMetadata(geeMetadata); + * @param [options] - An object describing initialization options + */ + export class GoogleEarthEnterpriseTerrainProvider { + constructor( + options?: GoogleEarthEnterpriseTerrainProvider.ConstructorOptions, + ); + /** + * Gets the name of the Google Earth Enterprise server url hosting the imagery. + */ + readonly url: string; + /** + * Gets the proxy used by this provider. + */ + readonly proxy: Proxy; + /** + * Gets the tiling scheme used by this provider. + */ + readonly tilingScheme: TilingScheme; + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + */ + readonly errorEvent: Event; + /** + * Gets the credit to display when this terrain provider is active. Typically this is used to credit + * the source of the terrain. + */ + readonly credit: Credit; + /** + * Gets a value indicating whether or not the provider includes a water mask. The water mask + * indicates which areas of the globe are water rather than land, so they can be rendered + * as a reflective surface with animated waves. + */ + readonly hasWaterMask: boolean; + /** + * Gets a value indicating whether or not the requested tiles include vertex normals. + */ + readonly hasVertexNormals: boolean; + /** + * Gets an object that can be used to determine availability of terrain from this provider, such as + * at points and in rectangles. This property may be undefined if availability + * information is not available. + */ + readonly availability: TileAvailability; + /** + * Creates a GoogleEarthTerrainProvider from GoogleEarthEnterpriseMetadata + * @example + * const geeMetadata = await GoogleEarthEnterpriseMetadata.fromUrl("http://www.example.com"); + * const gee = Cesium.GoogleEarthEnterpriseTerrainProvider.fromMetadata(geeMetadata); + * @param metadata - A metadata object that can be used to share metadata requests with a GoogleEarthEnterpriseImageryProvider. + * @param options - An object describing initialization options + */ + static fromMetadata( + metadata: GoogleEarthEnterpriseMetadata, + options: GoogleEarthEnterpriseTerrainProvider.ConstructorOptions, + ): GoogleEarthEnterpriseTerrainProvider; + /** + * Requests the geometry for a given tile. The result must include terrain data and + * may optionally include a water mask and an indication of which child tiles are available. + * @param x - The X coordinate of the tile for which to request geometry. + * @param y - The Y coordinate of the tile for which to request geometry. + * @param level - The level of the tile for which to request geometry. + * @param [request] - The request object. Intended for internal use only. + * @returns A promise for the requested geometry. If this method + * returns undefined instead of a promise, it is an indication that too many requests are already + * pending and the request will be retried later. + */ + requestTileGeometry( + x: number, + y: number, + level: number, + request?: Request, + ): Promise | undefined; + /** + * Gets the maximum geometric error allowed in a tile at a given level. + * @param level - The tile level for which to get the maximum geometric error. + * @returns The maximum geometric error. + */ + getLevelMaximumGeometricError(level: number): number; + /** + * Determines whether data for a tile is available to be loaded. + * @param x - The X coordinate of the tile for which to request geometry. + * @param y - The Y coordinate of the tile for which to request geometry. + * @param level - The level of the tile for which to request geometry. + * @returns Undefined if not supported, otherwise true or false. + */ + getTileDataAvailable( + x: number, + y: number, + level: number, + ): boolean | undefined; + /** + * Makes sure we load availability data for a tile + * @param x - The X coordinate of the tile for which to request geometry. + * @param y - The Y coordinate of the tile for which to request geometry. + * @param level - The level of the tile for which to request geometry. + */ + loadTileDataAvailability(x: number, y: number, level: number): undefined; + } + + /** + * Provides geocoding through Google. + * @param options - Object with the following properties: + * @param options.key - An API key to use with the Google geocoding service + */ + export class GoogleGeocoderService { + constructor(options: { key: string }); + /** + * Gets the credit to display after a geocode is performed. Typically this is used to credit + * the geocoder service. + */ + readonly credit: Credit | undefined; + /** + * Get a list of possible locations that match a search string. + * @param query - The query to be sent to the geocoder service + */ + geocode(query: string): Promise; + } + + /** + * Default settings for accessing the Google Maps API. + *
+ * An API key is only required if you are directly using any Google Maps APIs, such as through {@link createGooglePhotorealistic3DTileset}. + * Follow instructions for managing API keys for the Google Maps Platform at {@link https://developers.google.com/maps/documentation/embed/get-api-key} + */ + export namespace GoogleMaps { + /** + * Gets or sets the default Google Maps API key. + */ + var defaultApiKey: undefined | string; + /** + * Gets or sets the default Google Map Tiles API endpoint. + */ + var mapTilesApiEndpoint: string | Resource; + } + + /** + * Represents a Gregorian date in a more precise format than the JavaScript Date object. + * In addition to submillisecond precision, this object can also represent leap seconds. + * @param [year] - The year as a whole number. + * @param [month] - The month as a whole number with range [1, 12]. + * @param [day] - The day of the month as a whole number starting at 1. + * @param [hour] - The hour as a whole number with range [0, 23]. + * @param [minute] - The minute of the hour as a whole number with range [0, 59]. + * @param [second] - The second of the minute as a whole number with range [0, 60], with 60 representing a leap second. + * @param [millisecond] - The millisecond of the second as a floating point number with range [0.0, 1000.0). + * @param [isLeapSecond] - Whether this time is during a leap second. + */ + export class GregorianDate { + constructor( + year?: number, + month?: number, + day?: number, + hour?: number, + minute?: number, + second?: number, + millisecond?: number, + isLeapSecond?: boolean, + ); + /** + * Gets or sets the year as a whole number. + */ + year: number; + /** + * Gets or sets the month as a whole number with range [1, 12]. + */ + month: number; + /** + * Gets or sets the day of the month as a whole number starting at 1. + */ + day: number; + /** + * Gets or sets the hour as a whole number with range [0, 23]. + */ + hour: number; + /** + * Gets or sets the minute of the hour as a whole number with range [0, 59]. + */ + minute: number; + /** + * Gets or sets the second of the minute as a whole number with range [0, 60], with 60 representing a leap second. + */ + second: number; + /** + * Gets or sets the millisecond of the second as a floating point number with range [0.0, 1000.0). + */ + millisecond: number; + /** + * Gets or sets whether this time is during a leap second. + */ + isLeapSecond: boolean; + } + + /** + * A description of a polyline on terrain or 3D Tiles. Only to be used with {@link GroundPolylinePrimitive}. + * @example + * const positions = Cesium.Cartesian3.fromDegreesArray([ + * -112.1340164450331, 36.05494287836128, + * -112.08821010582645, 36.097804071380715, + * -112.13296079730024, 36.168769146801104 + * ]); + * + * const geometry = new Cesium.GroundPolylineGeometry({ + * positions : positions + * }); + * @param options - Options with the following properties: + * @param options.positions - An array of {@link Cartesian3} defining the polyline's points. Heights above the ellipsoid will be ignored. + * @param [options.width = 1.0] - The screen space width in pixels. + * @param [options.granularity = 9999.0] - The distance interval in meters used for interpolating options.points. Defaults to 9999.0 meters. Zero indicates no interpolation. + * @param [options.loop = false] - Whether during geometry creation a line segment will be added between the last and first line positions to make this Polyline a loop. + * @param [options.arcType = ArcType.GEODESIC] - The type of line the polyline segments must follow. Valid options are {@link ArcType.GEODESIC} and {@link ArcType.RHUMB}. + */ + export class GroundPolylineGeometry { + constructor(options: { + positions: Cartesian3[]; + width?: number; + granularity?: number; + loop?: boolean; + arcType?: ArcType; + }); + /** + * The screen space width in pixels. + */ + width: number; + /** + * The distance interval used for interpolating options.points. Zero indicates no interpolation. + * Default of 9999.0 allows centimeter accuracy with 32 bit floating point. + */ + granularity: boolean; + /** + * Whether during geometry creation a line segment will be added between the last and first line positions to make this Polyline a loop. + * If the geometry has two positions this parameter will be ignored. + */ + loop: boolean; + /** + * The type of path the polyline must follow. Valid options are {@link ArcType.GEODESIC} and {@link ArcType.RHUMB}. + */ + arcType: ArcType; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: PolygonGeometry, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: PolygonGeometry, + ): void; + } + + /** + * Defines a heading angle, pitch angle, and range in a local frame. + * Heading is the rotation from the local east direction where a positive angle is increasing southward. + * Pitch is the rotation from the local xy-plane. Positive pitch angles are above the plane. Negative pitch + * angles are below the plane. Range is the distance from the center of the frame. + * @param [heading = 0.0] - The heading angle in radians. + * @param [pitch = 0.0] - The pitch angle in radians. + * @param [range = 0.0] - The distance from the center in meters. + */ + export class HeadingPitchRange { + constructor(heading?: number, pitch?: number, range?: number); + /** + * Heading is the rotation from the local east direction where a positive angle is increasing southward. + */ + heading: number; + /** + * Pitch is the rotation from the local xy-plane. Positive pitch angles + * are above the plane. Negative pitch angles are below the plane. + */ + pitch: number; + /** + * Range is the distance from the center of the local frame. + */ + range: number; + /** + * Duplicates a HeadingPitchRange instance. + * @param hpr - The HeadingPitchRange to duplicate. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new HeadingPitchRange instance if one was not provided. (Returns undefined if hpr is undefined) + */ + static clone( + hpr: HeadingPitchRange, + result?: HeadingPitchRange, + ): HeadingPitchRange; + } + + /** + * A rotation expressed as a heading, pitch, and roll. Heading is the rotation about the + * negative z axis. Pitch is the rotation about the negative y axis. Roll is the rotation about + * the positive x axis. + * @param [heading = 0.0] - The heading component in radians. + * @param [pitch = 0.0] - The pitch component in radians. + * @param [roll = 0.0] - The roll component in radians. + */ + export class HeadingPitchRoll { + constructor(heading?: number, pitch?: number, roll?: number); + /** + * Gets or sets the heading. + */ + heading: number; + /** + * Gets or sets the pitch. + */ + pitch: number; + /** + * Gets or sets the roll. + */ + roll: number; + /** + * Computes the heading, pitch and roll from a quaternion (see http://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles ) + * @param quaternion - The quaternion from which to retrieve heading, pitch, and roll, all expressed in radians. + * @param [result] - The object in which to store the result. If not provided, a new instance is created and returned. + * @returns The modified result parameter or a new HeadingPitchRoll instance if one was not provided. + */ + static fromQuaternion( + quaternion: Quaternion, + result?: HeadingPitchRoll, + ): HeadingPitchRoll; + /** + * Returns a new HeadingPitchRoll instance from angles given in degrees. + * @param heading - the heading in degrees + * @param pitch - the pitch in degrees + * @param roll - the heading in degrees + * @param [result] - The object in which to store the result. If not provided, a new instance is created and returned. + * @returns A new HeadingPitchRoll instance + */ + static fromDegrees( + heading: number, + pitch: number, + roll: number, + result?: HeadingPitchRoll, + ): HeadingPitchRoll; + /** + * Duplicates a HeadingPitchRoll instance. + * @param headingPitchRoll - The HeadingPitchRoll to duplicate. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new HeadingPitchRoll instance if one was not provided. (Returns undefined if headingPitchRoll is undefined) + */ + static clone( + headingPitchRoll: HeadingPitchRoll, + result?: HeadingPitchRoll, + ): HeadingPitchRoll; + /** + * Compares the provided HeadingPitchRolls componentwise and returns + * true if they are equal, false otherwise. + * @param [left] - The first HeadingPitchRoll. + * @param [right] - The second HeadingPitchRoll. + * @returns true if left and right are equal, false otherwise. + */ + static equals(left?: HeadingPitchRoll, right?: HeadingPitchRoll): boolean; + /** + * Compares the provided HeadingPitchRolls componentwise and returns + * true if they pass an absolute or relative tolerance test, + * false otherwise. + * @param [left] - The first HeadingPitchRoll. + * @param [right] - The second HeadingPitchRoll. + * @param [relativeEpsilon = 0] - The relative epsilon tolerance to use for equality testing. + * @param [absoluteEpsilon = relativeEpsilon] - The absolute epsilon tolerance to use for equality testing. + * @returns true if left and right are within the provided epsilon, false otherwise. + */ + static equalsEpsilon( + left?: HeadingPitchRoll, + right?: HeadingPitchRoll, + relativeEpsilon?: number, + absoluteEpsilon?: number, + ): boolean; + /** + * Duplicates this HeadingPitchRoll instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new HeadingPitchRoll instance if one was not provided. + */ + clone(result?: HeadingPitchRoll): HeadingPitchRoll; + /** + * Compares this HeadingPitchRoll against the provided HeadingPitchRoll componentwise and returns + * true if they are equal, false otherwise. + * @param [right] - The right hand side HeadingPitchRoll. + * @returns true if they are equal, false otherwise. + */ + equals(right?: HeadingPitchRoll): boolean; + /** + * Compares this HeadingPitchRoll against the provided HeadingPitchRoll componentwise and returns + * true if they pass an absolute or relative tolerance test, + * false otherwise. + * @param [right] - The right hand side HeadingPitchRoll. + * @param [relativeEpsilon = 0] - The relative epsilon tolerance to use for equality testing. + * @param [absoluteEpsilon = relativeEpsilon] - The absolute epsilon tolerance to use for equality testing. + * @returns true if they are within the provided epsilon, false otherwise. + */ + equalsEpsilon( + right?: HeadingPitchRoll, + relativeEpsilon?: number, + absoluteEpsilon?: number, + ): boolean; + /** + * Creates a string representing this HeadingPitchRoll in the format '(heading, pitch, roll)' in radians. + * @returns A string representing the provided HeadingPitchRoll in the format '(heading, pitch, roll)'. + */ + toString(): string; + } + + /** + * The encoding that is used for a heightmap + */ + export enum HeightmapEncoding { + /** + * No encoding + */ + NONE = 0, + /** + * LERC encoding + */ + LERC = 1, + } + + /** + * Terrain data for a single tile where the terrain data is represented as a heightmap. A heightmap + * is a rectangular array of heights in row-major order from north to south and west to east. + * @example + * const buffer = ... + * const heightBuffer = new Uint16Array(buffer, 0, that._heightmapWidth * that._heightmapWidth); + * const childTileMask = new Uint8Array(buffer, heightBuffer.byteLength, 1)[0]; + * const waterMask = new Uint8Array(buffer, heightBuffer.byteLength + 1, buffer.byteLength - heightBuffer.byteLength - 1); + * const terrainData = new Cesium.HeightmapTerrainData({ + * buffer : heightBuffer, + * width : 65, + * height : 65, + * childTileMask : childTileMask, + * waterMask : waterMask + * }); + * @param options - Object with the following properties: + * @param options.buffer - The buffer containing height data. + * @param options.width - The width (longitude direction) of the heightmap, in samples. + * @param options.height - The height (latitude direction) of the heightmap, in samples. + * @param [options.childTileMask = 15] - A bit mask indicating which of this tile's four children exist. + * If a child's bit is set, geometry will be requested for that tile as well when it + * is needed. If the bit is cleared, the child tile is not requested and geometry is + * instead upsampled from the parent. The bit values are as follows: + * + * + * + * + * + * + *
Bit PositionBit ValueChild Tile
01Southwest
12Southeast
24Northwest
38Northeast
+ * @param [options.waterMask] - The water mask included in this terrain data, if any. A water mask is a square + * Uint8Array or image where a value of 255 indicates water and a value of 0 indicates land. + * Values in between 0 and 255 are allowed as well to smoothly blend between land and water. + * @param [options.structure] - An object describing the structure of the height data. + * @param [options.structure.heightScale = 1.0] - The factor by which to multiply height samples in order to obtain + * the height above the heightOffset, in meters. The heightOffset is added to the resulting + * height after multiplying by the scale. + * @param [options.structure.heightOffset = 0.0] - The offset to add to the scaled height to obtain the final + * height in meters. The offset is added after the height sample is multiplied by the + * heightScale. + * @param [options.structure.elementsPerHeight = 1] - The number of elements in the buffer that make up a single height + * sample. This is usually 1, indicating that each element is a separate height sample. If + * it is greater than 1, that number of elements together form the height sample, which is + * computed according to the structure.elementMultiplier and structure.isBigEndian properties. + * @param [options.structure.stride = 1] - The number of elements to skip to get from the first element of + * one height to the first element of the next height. + * @param [options.structure.elementMultiplier = 256.0] - The multiplier used to compute the height value when the + * stride property is greater than 1. For example, if the stride is 4 and the strideMultiplier + * is 256, the height is computed as follows: + * `height = buffer[index] + buffer[index + 1] * 256 + buffer[index + 2] * 256 * 256 + buffer[index + 3] * 256 * 256 * 256` + * This is assuming that the isBigEndian property is false. If it is true, the order of the + * elements is reversed. + * @param [options.structure.isBigEndian = false] - Indicates endianness of the elements in the buffer when the + * stride property is greater than 1. If this property is false, the first element is the + * low-order element. If it is true, the first element is the high-order element. + * @param [options.structure.lowestEncodedHeight] - The lowest value that can be stored in the height buffer. Any heights that are lower + * than this value after encoding with the `heightScale` and `heightOffset` are clamped to this value. For example, if the height + * buffer is a `Uint16Array`, this value should be 0 because a `Uint16Array` cannot store negative numbers. If this parameter is + * not specified, no minimum value is enforced. + * @param [options.structure.highestEncodedHeight] - The highest value that can be stored in the height buffer. Any heights that are higher + * than this value after encoding with the `heightScale` and `heightOffset` are clamped to this value. For example, if the height + * buffer is a `Uint16Array`, this value should be `256 * 256 - 1` or 65535 because a `Uint16Array` cannot store numbers larger + * than 65535. If this parameter is not specified, no maximum value is enforced. + * @param [options.encoding = HeightmapEncoding.NONE] - The encoding that is used on the buffer. + * @param [options.createdByUpsampling = false] - True if this instance was created by upsampling another instance; + * otherwise, false. + */ + export class HeightmapTerrainData { + constructor(options: { + buffer: + | Int8Array + | Uint8Array + | Int16Array + | Uint16Array + | Int32Array + | Uint32Array + | Float32Array + | Float64Array; + width: number; + height: number; + childTileMask?: number; + waterMask?: Uint8Array; + structure?: { + heightScale?: number; + heightOffset?: number; + elementsPerHeight?: number; + stride?: number; + elementMultiplier?: number; + isBigEndian?: boolean; + lowestEncodedHeight?: number; + highestEncodedHeight?: number; + }; + encoding?: HeightmapEncoding; + createdByUpsampling?: boolean; + }); + /** + * An array of credits for this tile. + */ + credits: Credit[]; + /** + * The water mask included in this terrain data, if any. A water mask is a square + * Uint8Array or image where a value of 255 indicates water and a value of 0 indicates land. + * Values in between 0 and 255 are allowed as well to smoothly blend between land and water. + */ + waterMask: Uint8Array | HTMLImageElement | HTMLCanvasElement; + /** + * Computes the terrain height at a specified longitude and latitude. + * @param rectangle - The rectangle covered by this terrain data. + * @param longitude - The longitude in radians. + * @param latitude - The latitude in radians. + * @returns The terrain height at the specified position. If the position + * is outside the rectangle, this method will extrapolate the height, which is likely to be wildly + * incorrect for positions far outside the rectangle. + */ + interpolateHeight( + rectangle: Rectangle, + longitude: number, + latitude: number, + ): number; + /** + * Upsamples this terrain data for use by a descendant tile. The resulting instance will contain a subset of the + * height samples in this instance, interpolated if necessary. + * @param tilingScheme - The tiling scheme of this terrain data. + * @param thisX - The X coordinate of this tile in the tiling scheme. + * @param thisY - The Y coordinate of this tile in the tiling scheme. + * @param thisLevel - The level of this tile in the tiling scheme. + * @param descendantX - The X coordinate within the tiling scheme of the descendant tile for which we are upsampling. + * @param descendantY - The Y coordinate within the tiling scheme of the descendant tile for which we are upsampling. + * @param descendantLevel - The level within the tiling scheme of the descendant tile for which we are upsampling. + * @returns A promise for upsampled heightmap terrain data for the descendant tile, + * or undefined if the mesh is unavailable. + */ + upsample( + tilingScheme: TilingScheme, + thisX: number, + thisY: number, + thisLevel: number, + descendantX: number, + descendantY: number, + descendantLevel: number, + ): Promise | undefined; + /** + * Determines if a given child tile is available, based on the + * {@link HeightmapTerrainData.childTileMask}. The given child tile coordinates are assumed + * to be one of the four children of this tile. If non-child tile coordinates are + * given, the availability of the southeast child tile is returned. + * @param thisX - The tile X coordinate of this (the parent) tile. + * @param thisY - The tile Y coordinate of this (the parent) tile. + * @param childX - The tile X coordinate of the child tile to check for availability. + * @param childY - The tile Y coordinate of the child tile to check for availability. + * @returns True if the child tile is available; otherwise, false. + */ + isChildAvailable( + thisX: number, + thisY: number, + childX: number, + childY: number, + ): boolean; + /** + * Gets a value indicating whether or not this terrain data was created by upsampling lower resolution + * terrain data. If this value is false, the data was obtained from some other source, such + * as by downloading it from a remote server. This method should return true for instances + * returned from a call to {@link HeightmapTerrainData#upsample}. + * @returns True if this instance was created by upsampling; otherwise, false. + */ + wasCreatedByUpsampling(): boolean; + } + + /** + * An {@link InterpolationAlgorithm} for performing Hermite interpolation. + */ + export namespace HermitePolynomialApproximation { + /** + * Given the desired degree, returns the number of data points required for interpolation. + * @param degree - The desired degree of interpolation. + * @param [inputOrder = 0] - The order of the inputs (0 means just the data, 1 means the data and its derivative, etc). + * @returns The number of required data points needed for the desired degree of interpolation. + */ + function getRequiredDataPoints(degree: number, inputOrder?: number): number; + /** + * Interpolates values using Hermite Polynomial Approximation. + * @param x - The independent variable for which the dependent variables will be interpolated. + * @param xTable - The array of independent variables to use to interpolate. The values + * in this array must be in increasing order and the same value must not occur twice in the array. + * @param yTable - The array of dependent variables to use to interpolate. For a set of three + * dependent values (p,q,w) at time 1 and time 2 this should be as follows: {p1, q1, w1, p2, q2, w2}. + * @param yStride - The number of dependent variable values in yTable corresponding to + * each independent variable value in xTable. + * @param [result] - An existing array into which to store the result. + * @returns The array of interpolated values, or the result parameter if one was provided. + */ + function interpolateOrderZero( + x: number, + xTable: number[], + yTable: number[], + yStride: number, + result?: number[], + ): number[]; + /** + * Interpolates values using Hermite Polynomial Approximation. + * @param x - The independent variable for which the dependent variables will be interpolated. + * @param xTable - The array of independent variables to use to interpolate. The values + * in this array must be in increasing order and the same value must not occur twice in the array. + * @param yTable - The array of dependent variables to use to interpolate. For a set of three + * dependent values (p,q,w) at time 1 and time 2 this should be as follows: {p1, q1, w1, p2, q2, w2}. + * @param yStride - The number of dependent variable values in yTable corresponding to + * each independent variable value in xTable. + * @param inputOrder - The number of derivatives supplied for input. + * @param outputOrder - The number of derivatives desired for output. + * @param [result] - An existing array into which to store the result. + * @returns The array of interpolated values, or the result parameter if one was provided. + */ + function interpolate( + x: number, + xTable: number[], + yTable: number[], + yStride: number, + inputOrder: number, + outputOrder: number, + result?: number[], + ): number[]; + } + + /** + * A Hermite spline is a cubic interpolating spline. Points, incoming tangents, outgoing tangents, and times + * must be defined for each control point. The outgoing tangents are defined for points [0, n - 2] and the incoming + * tangents are defined for points [1, n - 1]. For example, when interpolating a segment of the curve between points[i] and + * points[i + 1], the tangents at the points will be outTangents[i] and inTangents[i], + * respectively. + * @example + * // Create a G1 continuous Hermite spline + * const times = [ 0.0, 1.5, 3.0, 4.5, 6.0 ]; + * const spline = new Cesium.HermiteSpline({ + * times : times, + * points : [ + * new Cesium.Cartesian3(1235398.0, -4810983.0, 4146266.0), + * new Cesium.Cartesian3(1372574.0, -5345182.0, 4606657.0), + * new Cesium.Cartesian3(-757983.0, -5542796.0, 4514323.0), + * new Cesium.Cartesian3(-2821260.0, -5248423.0, 4021290.0), + * new Cesium.Cartesian3(-2539788.0, -4724797.0, 3620093.0) + * ], + * outTangents : [ + * new Cesium.Cartesian3(1125196, -161816, 270551), + * new Cesium.Cartesian3(-996690.5, -365906.5, 184028.5), + * new Cesium.Cartesian3(-2096917, 48379.5, -292683.5), + * new Cesium.Cartesian3(-890902.5, 408999.5, -447115) + * ], + * inTangents : [ + * new Cesium.Cartesian3(-1993381, -731813, 368057), + * new Cesium.Cartesian3(-4193834, 96759, -585367), + * new Cesium.Cartesian3(-1781805, 817999, -894230), + * new Cesium.Cartesian3(1165345, 112641, 47281) + * ] + * }); + * + * const p0 = spline.evaluate(times[0]); + * @param options - Object with the following properties: + * @param options.times - An array of strictly increasing, unit-less, floating-point times at each point. + * The values are in no way connected to the clock time. They are the parameterization for the curve. + * @param options.points - The array of control points. + * @param options.inTangents - The array of incoming tangents at each control point. + * @param options.outTangents - The array of outgoing tangents at each control point. + */ + export class HermiteSpline { + constructor(options: { + times: number[]; + points: Cartesian3[]; + inTangents: Cartesian3[]; + outTangents: Cartesian3[]; + }); + /** + * An array of times for the control points. + */ + readonly times: number[]; + /** + * An array of control points. + */ + readonly points: Cartesian3[]; + /** + * An array of incoming tangents at each control point. + */ + readonly inTangents: Cartesian3[]; + /** + * An array of outgoing tangents at each control point. + */ + readonly outTangents: Cartesian3[]; + /** + * Creates a spline where the tangents at each control point are the same. + * The curves are guaranteed to be at least in the class C1. + * @example + * const points = [ + * new Cesium.Cartesian3(1235398.0, -4810983.0, 4146266.0), + * new Cesium.Cartesian3(1372574.0, -5345182.0, 4606657.0), + * new Cesium.Cartesian3(-757983.0, -5542796.0, 4514323.0), + * new Cesium.Cartesian3(-2821260.0, -5248423.0, 4021290.0), + * new Cesium.Cartesian3(-2539788.0, -4724797.0, 3620093.0) + * ]; + * + * // Add tangents + * const tangents = new Array(points.length); + * tangents[0] = new Cesium.Cartesian3(1125196, -161816, 270551); + * const temp = new Cesium.Cartesian3(); + * for (let i = 1; i < tangents.length - 1; ++i) { + * tangents[i] = Cesium.Cartesian3.multiplyByScalar(Cesium.Cartesian3.subtract(points[i + 1], points[i - 1], temp), 0.5, new Cesium.Cartesian3()); + * } + * tangents[tangents.length - 1] = new Cesium.Cartesian3(1165345, 112641, 47281); + * + * const spline = Cesium.HermiteSpline.createC1({ + * times : times, + * points : points, + * tangents : tangents + * }); + * @param options - Object with the following properties: + * @param options.times - The array of control point times. + * @param options.points - The array of control points. + * @param options.tangents - The array of tangents at the control points. + * @returns A hermite spline. + */ + static createC1(options: { + times: number[]; + points: Cartesian3[]; + tangents: Cartesian3[]; + }): HermiteSpline; + /** + * Creates a natural cubic spline. The tangents at the control points are generated + * to create a curve in the class C2. + * @example + * // Create a natural cubic spline above the earth from Philadelphia to Los Angeles. + * const spline = Cesium.HermiteSpline.createNaturalCubic({ + * times : [ 0.0, 1.5, 3.0, 4.5, 6.0 ], + * points : [ + * new Cesium.Cartesian3(1235398.0, -4810983.0, 4146266.0), + * new Cesium.Cartesian3(1372574.0, -5345182.0, 4606657.0), + * new Cesium.Cartesian3(-757983.0, -5542796.0, 4514323.0), + * new Cesium.Cartesian3(-2821260.0, -5248423.0, 4021290.0), + * new Cesium.Cartesian3(-2539788.0, -4724797.0, 3620093.0) + * ] + * }); + * @param options - Object with the following properties: + * @param options.times - The array of control point times. + * @param options.points - The array of control points. + * @returns A hermite spline, or a linear spline if less than 3 control points were given. + */ + static createNaturalCubic(options: { + times: number[]; + points: Cartesian3[]; + }): HermiteSpline | LinearSpline; + /** + * Creates a clamped cubic spline. The tangents at the interior control points are generated + * to create a curve in the class C2. + * @example + * // Create a clamped cubic spline above the earth from Philadelphia to Los Angeles. + * const spline = Cesium.HermiteSpline.createClampedCubic({ + * times : [ 0.0, 1.5, 3.0, 4.5, 6.0 ], + * points : [ + * new Cesium.Cartesian3(1235398.0, -4810983.0, 4146266.0), + * new Cesium.Cartesian3(1372574.0, -5345182.0, 4606657.0), + * new Cesium.Cartesian3(-757983.0, -5542796.0, 4514323.0), + * new Cesium.Cartesian3(-2821260.0, -5248423.0, 4021290.0), + * new Cesium.Cartesian3(-2539788.0, -4724797.0, 3620093.0) + * ], + * firstTangent : new Cesium.Cartesian3(1125196, -161816, 270551), + * lastTangent : new Cesium.Cartesian3(1165345, 112641, 47281) + * }); + * @param options - Object with the following properties: + * @param options.times - The array of control point times. + * @param options.points - The array of control points. + * @param options.firstTangent - The outgoing tangent of the first control point. + * @param options.lastTangent - The incoming tangent of the last control point. + * @returns A hermite spline, or a linear spline if less than 3 control points were given. + */ + static createClampedCubic(options: { + times: number[]; + points: number[] | Cartesian3[]; + firstTangent: Cartesian3; + lastTangent: Cartesian3; + }): HermiteSpline | LinearSpline; + /** + * Finds an index i in times such that the parameter + * time is in the interval [times[i], times[i + 1]]. + * @param time - The time. + * @returns The index for the element at the start of the interval. + */ + findTimeInterval(time: number): number; + /** + * Wraps the given time to the period covered by the spline. + * @param time - The time. + * @returns The time, wrapped around to the updated animation. + */ + wrapTime(time: number): number; + /** + * Clamps the given time to the period covered by the spline. + * @param time - The time. + * @returns The time, clamped to the animation period. + */ + clampTime(time: number): number; + /** + * Evaluates the curve at a given time. + * @param time - The time at which to evaluate the curve. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance of the point on the curve at the given time. + */ + evaluate(time: number, result?: Cartesian3): Cartesian3; + } + + /** + * Hilbert Order helper functions. + */ + export namespace HilbertOrder {} + + /** + * Default settings for accessing the iTwin platform. + */ + export namespace ITwinPlatform { + /** + * Status states for a mesh-export export. + * Valid values are: NotStarted, InProgress, Complete, Invalid + */ + enum ExportStatus {} + /** + * Types of mesh-export exports. CesiumJS only supports loading 3DTILES type exports. + * Valid values are: IMODEL, CESIUM, 3DTILES + */ + enum ExportType {} + /** + * Types of Reality data. This is a partial list of types we know we can support + */ + enum RealityDataType {} + /** + * Gets or sets the default iTwin access token. This token should have the itwin-platform scope. + */ + var defaultAccessToken: string | undefined; + /** + * Gets or sets the default iTwin API endpoint. + */ + var apiEndpoint: string | Resource; + } + + /** + * Constants for WebGL index datatypes. These corresponds to the + * type parameter of {@link http://www.khronos.org/opengles/sdk/docs/man/xhtml/glDrawElements.xml|drawElements}. + */ + export enum IndexDatatype { + /** + * 8-bit unsigned byte corresponding to UNSIGNED_BYTE and the type + * of an element in Uint8Array. + */ + UNSIGNED_BYTE = WebGLConstants.UNSIGNED_BYTE, + /** + * 16-bit unsigned short corresponding to UNSIGNED_SHORT and the type + * of an element in Uint16Array. + */ + UNSIGNED_SHORT = WebGLConstants.UNSIGNED_SHORT, + /** + * 32-bit unsigned int corresponding to UNSIGNED_INT and the type + * of an element in Uint32Array. + */ + UNSIGNED_INT = WebGLConstants.UNSIGNED_INT, + } + + export namespace InterpolationAlgorithm { + /** + * Gets the name of this interpolation algorithm. + */ + var type: string; + /** + * Given the desired degree, returns the number of data points required for interpolation. + * @param degree - The desired degree of interpolation. + * @returns The number of required data points needed for the desired degree of interpolation. + */ + function getRequiredDataPoints(degree: number): number; + /** + * Performs zero order interpolation. + * @param x - The independent variable for which the dependent variables will be interpolated. + * @param xTable - The array of independent variables to use to interpolate. The values + * in this array must be in increasing order and the same value must not occur twice in the array. + * @param yTable - The array of dependent variables to use to interpolate. For a set of three + * dependent values (p,q,w) at time 1 and time 2 this should be as follows: {p1, q1, w1, p2, q2, w2}. + * @param yStride - The number of dependent variable values in yTable corresponding to + * each independent variable value in xTable. + * @param [result] - An existing array into which to store the result. + * @returns The array of interpolated values, or the result parameter if one was provided. + */ + function interpolateOrderZero( + x: number, + xTable: number[], + yTable: number[], + yStride: number, + result?: number[], + ): number[]; + /** + * Performs higher order interpolation. Not all interpolators need to support high-order interpolation, + * if this function remains undefined on implementing objects, interpolateOrderZero will be used instead. + * @param x - The independent variable for which the dependent variables will be interpolated. + * @param xTable - The array of independent variables to use to interpolate. The values + * in this array must be in increasing order and the same value must not occur twice in the array. + * @param yTable - The array of dependent variables to use to interpolate. For a set of three + * dependent values (p,q,w) at time 1 and time 2 this should be as follows: {p1, q1, w1, p2, q2, w2}. + * @param yStride - The number of dependent variable values in yTable corresponding to + * each independent variable value in xTable. + * @param inputOrder - The number of derivatives supplied for input. + * @param outputOrder - The number of derivatives desired for output. + * @param [result] - An existing array into which to store the result. + * @returns The array of interpolated values, or the result parameter if one was provided. + */ + function interpolate( + x: number, + xTable: number[], + yTable: number[], + yStride: number, + inputOrder: number, + outputOrder: number, + result?: number[], + ): number[]; + } + + /** + * The interface for interpolation algorithms. + */ + export interface InterpolationAlgorithm {} + + /** + * This enumerated type is used in determining where, relative to the frustum, an + * object is located. The object can either be fully contained within the frustum (INSIDE), + * partially inside the frustum and partially outside (INTERSECTING), or somewhere entirely + * outside of the frustum's 6 planes (OUTSIDE). + */ + export enum Intersect { + /** + * Represents that an object is not contained within the frustum. + */ + OUTSIDE = -1, + /** + * Represents that an object intersects one of the frustum's planes. + */ + INTERSECTING = 0, + /** + * Represents that an object is fully within the frustum. + */ + INSIDE = 1, + } + + /** + * Functions for computing the intersection between geometries such as rays, planes, triangles, and ellipsoids. + */ + export namespace IntersectionTests { + /** + * Computes the intersection of a ray and a plane. + * @param ray - The ray. + * @param plane - The plane. + * @param [result] - The object onto which to store the result. + * @returns The intersection point or undefined if there is no intersections. + */ + function rayPlane(ray: Ray, plane: Plane, result?: Cartesian3): Cartesian3; + /** + * Computes the intersection of a ray and a triangle as a parametric distance along the input ray. The result is negative when the triangle is behind the ray. + * + * Implements {@link https://cadxfem.org/inf/Fast%20MinimumStorage%20RayTriangle%20Intersection.pdf| + * Fast Minimum Storage Ray/Triangle Intersection} by Tomas Moller and Ben Trumbore. + * @param ray - The ray. + * @param p0 - The first vertex of the triangle. + * @param p1 - The second vertex of the triangle. + * @param p2 - The third vertex of the triangle. + * @param [cullBackFaces = false] - If true, will only compute an intersection with the front face of the triangle + * and return undefined for intersections with the back face. + * @returns The intersection as a parametric distance along the ray, or undefined if there is no intersection. + */ + function rayTriangleParametric( + ray: Ray, + p0: Cartesian3, + p1: Cartesian3, + p2: Cartesian3, + cullBackFaces?: boolean, + ): number; + /** + * Computes the intersection of a ray and a triangle as a Cartesian3 coordinate. + * + * Implements {@link https://cadxfem.org/inf/Fast%20MinimumStorage%20RayTriangle%20Intersection.pdf| + * Fast Minimum Storage Ray/Triangle Intersection} by Tomas Moller and Ben Trumbore. + * @param ray - The ray. + * @param p0 - The first vertex of the triangle. + * @param p1 - The second vertex of the triangle. + * @param p2 - The third vertex of the triangle. + * @param [cullBackFaces = false] - If true, will only compute an intersection with the front face of the triangle + * and return undefined for intersections with the back face. + * @param [result] - The Cartesian3 onto which to store the result. + * @returns The intersection point or undefined if there is no intersections. + */ + function rayTriangle( + ray: Ray, + p0: Cartesian3, + p1: Cartesian3, + p2: Cartesian3, + cullBackFaces?: boolean, + result?: Cartesian3, + ): Cartesian3; + /** + * Computes the intersection of a line segment and a triangle. + * @param v0 - The an end point of the line segment. + * @param v1 - The other end point of the line segment. + * @param p0 - The first vertex of the triangle. + * @param p1 - The second vertex of the triangle. + * @param p2 - The third vertex of the triangle. + * @param [cullBackFaces = false] - If true, will only compute an intersection with the front face of the triangle + * and return undefined for intersections with the back face. + * @param [result] - The Cartesian3 onto which to store the result. + * @returns The intersection point or undefined if there is no intersections. + */ + function lineSegmentTriangle( + v0: Cartesian3, + v1: Cartesian3, + p0: Cartesian3, + p1: Cartesian3, + p2: Cartesian3, + cullBackFaces?: boolean, + result?: Cartesian3, + ): Cartesian3; + /** + * Computes the intersection points of a ray with a sphere. + * @param ray - The ray. + * @param sphere - The sphere. + * @param [result] - The result onto which to store the result. + * @returns The interval containing scalar points along the ray or undefined if there are no intersections. + */ + function raySphere( + ray: Ray, + sphere: BoundingSphere, + result?: Interval, + ): Interval; + /** + * Computes the intersection points of a line segment with a sphere. + * @param p0 - An end point of the line segment. + * @param p1 - The other end point of the line segment. + * @param sphere - The sphere. + * @param [result] - The result onto which to store the result. + * @returns The interval containing scalar points along the ray or undefined if there are no intersections. + */ + function lineSegmentSphere( + p0: Cartesian3, + p1: Cartesian3, + sphere: BoundingSphere, + result?: Interval, + ): Interval; + /** + * Computes the intersection points of a ray with an ellipsoid. + * @param ray - The ray. + * @param ellipsoid - The ellipsoid. + * @returns The interval containing scalar points along the ray or undefined if there are no intersections. + */ + function rayEllipsoid(ray: Ray, ellipsoid: Ellipsoid): Interval; + /** + * Provides the point along the ray which is nearest to the ellipsoid. + * @param ray - The ray. + * @param ellipsoid - The ellipsoid. + * @returns The nearest planetodetic point on the ray. + */ + function grazingAltitudeLocation( + ray: Ray, + ellipsoid: Ellipsoid, + ): Cartesian3; + /** + * Computes the intersection of a line segment and a plane. + * @example + * const origin = Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883); + * const normal = ellipsoid.geodeticSurfaceNormal(origin); + * const plane = Cesium.Plane.fromPointNormal(origin, normal); + * + * const p0 = new Cesium.Cartesian3(...); + * const p1 = new Cesium.Cartesian3(...); + * + * // find the intersection of the line segment from p0 to p1 and the tangent plane at origin. + * const intersection = Cesium.IntersectionTests.lineSegmentPlane(p0, p1, plane); + * @param endPoint0 - An end point of the line segment. + * @param endPoint1 - The other end point of the line segment. + * @param plane - The plane. + * @param [result] - The object onto which to store the result. + * @returns The intersection point or undefined if there is no intersection. + */ + function lineSegmentPlane( + endPoint0: Cartesian3, + endPoint1: Cartesian3, + plane: Plane, + result?: Cartesian3, + ): Cartesian3; + /** + * Computes the intersection of a triangle and a plane + * @example + * const origin = Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883); + * const normal = ellipsoid.geodeticSurfaceNormal(origin); + * const plane = Cesium.Plane.fromPointNormal(origin, normal); + * + * const p0 = new Cesium.Cartesian3(...); + * const p1 = new Cesium.Cartesian3(...); + * const p2 = new Cesium.Cartesian3(...); + * + * // convert the triangle composed of points (p0, p1, p2) to three triangles that don't cross the plane + * const triangles = Cesium.IntersectionTests.trianglePlaneIntersection(p0, p1, p2, plane); + * @param p0 - First point of the triangle + * @param p1 - Second point of the triangle + * @param p2 - Third point of the triangle + * @param plane - Intersection plane + * @returns An object with properties positions and indices, which are arrays that represent three triangles that do not cross the plane. (Undefined if no intersection exists) + */ + function trianglePlaneIntersection( + p0: Cartesian3, + p1: Cartesian3, + p2: Cartesian3, + plane: Plane, + ): any; + } + + /** + * Contains functions for operating on 2D triangles. + */ + export namespace Intersections2D { + /** + * Splits a 2D triangle at given axis-aligned threshold value and returns the resulting + * polygon on a given side of the threshold. The resulting polygon may have 0, 1, 2, + * 3, or 4 vertices. + * @example + * const result = Cesium.Intersections2D.clipTriangleAtAxisAlignedThreshold(0.5, false, 0.2, 0.6, 0.4); + * // result === [2, 0, -1, 1, 0, 0.25, -1, 1, 2, 0.5] + * @param threshold - The threshold coordinate value at which to clip the triangle. + * @param keepAbove - true to keep the portion of the triangle above the threshold, or false + * to keep the portion below. + * @param u0 - The coordinate of the first vertex in the triangle, in counter-clockwise order. + * @param u1 - The coordinate of the second vertex in the triangle, in counter-clockwise order. + * @param u2 - The coordinate of the third vertex in the triangle, in counter-clockwise order. + * @param [result] - The array into which to copy the result. If this parameter is not supplied, + * a new array is constructed and returned. + * @returns The polygon that results after the clip, specified as a list of + * vertices. The vertices are specified in counter-clockwise order. + * Each vertex is either an index from the existing list (identified as + * a 0, 1, or 2) or -1 indicating a new vertex not in the original triangle. + * For new vertices, the -1 is followed by three additional numbers: the + * index of each of the two original vertices forming the line segment that + * the new vertex lies on, and the fraction of the distance from the first + * vertex to the second one. + */ + function clipTriangleAtAxisAlignedThreshold( + threshold: number, + keepAbove: boolean, + u0: number, + u1: number, + u2: number, + result?: number[], + ): number[]; + /** + * Compute the barycentric coordinates of a 2D position within a 2D triangle. + * @example + * const result = Cesium.Intersections2D.computeBarycentricCoordinates(0.0, 0.0, 0.0, 1.0, -1, -0.5, 1, -0.5); + * // result === new Cesium.Cartesian3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0); + * @param x - The x coordinate of the position for which to find the barycentric coordinates. + * @param y - The y coordinate of the position for which to find the barycentric coordinates. + * @param x1 - The x coordinate of the triangle's first vertex. + * @param y1 - The y coordinate of the triangle's first vertex. + * @param x2 - The x coordinate of the triangle's second vertex. + * @param y2 - The y coordinate of the triangle's second vertex. + * @param x3 - The x coordinate of the triangle's third vertex. + * @param y3 - The y coordinate of the triangle's third vertex. + * @param [result] - The instance into to which to copy the result. If this parameter + * is undefined, a new instance is created and returned. + * @returns The barycentric coordinates of the position within the triangle. + */ + function computeBarycentricCoordinates( + x: number, + y: number, + x1: number, + y1: number, + x2: number, + y2: number, + x3: number, + y3: number, + result?: Cartesian3, + ): Cartesian3; + /** + * Compute the intersection between 2 line segments + * @example + * const result = Cesium.Intersections2D.computeLineSegmentLineSegmentIntersection(0.0, 0.0, 0.0, 2.0, -1, 1, 1, 1); + * // result === new Cesium.Cartesian2(0.0, 1.0); + * @param x00 - The x coordinate of the first line's first vertex. + * @param y00 - The y coordinate of the first line's first vertex. + * @param x01 - The x coordinate of the first line's second vertex. + * @param y01 - The y coordinate of the first line's second vertex. + * @param x10 - The x coordinate of the second line's first vertex. + * @param y10 - The y coordinate of the second line's first vertex. + * @param x11 - The x coordinate of the second line's second vertex. + * @param y11 - The y coordinate of the second line's second vertex. + * @param [result] - The instance into to which to copy the result. If this parameter + * is undefined, a new instance is created and returned. + * @returns The intersection point, undefined if there is no intersection point or lines are coincident. + */ + function computeLineSegmentLineSegmentIntersection( + x00: number, + y00: number, + x01: number, + y01: number, + x10: number, + y10: number, + x11: number, + y11: number, + result?: Cartesian2, + ): Cartesian2; + } + + /** + * Represents the closed interval [start, stop]. + * @param [start = 0.0] - The beginning of the interval. + * @param [stop = 0.0] - The end of the interval. + */ + export class Interval { + constructor(start?: number, stop?: number); + /** + * The beginning of the interval. + */ + start: number; + /** + * The end of the interval. + */ + stop: number; + } + + /** + * Default settings for accessing the Cesium ion API. + * + * An ion access token is only required if you are using any ion related APIs. + * A default access token is provided for evaluation purposes only. + * Sign up for a free ion account and get your own access token at {@link https://cesium.com} + */ + export namespace Ion { + /** + * Gets or sets the default Cesium ion access token. + */ + var defaultAccessToken: string; + /** + * Gets or sets the default Cesium ion server. + */ + var defaultServer: string | Resource; + } + + /** + * Underlying geocoding services that can be used via Cesium ion. + */ + export enum IonGeocodeProviderType { + /** + * Google geocoder, for use with Google data. + */ + GOOGLE = "GOOGLE", + /** + * Bing geocoder, for use with Bing data. + */ + BING = "BING", + /** + * Use the default geocoder as set on the server. Used when neither Bing or + * Google data is used. + */ + DEFAULT = "DEFAULT", + } + + /** + * Provides geocoding through Cesium ion. + * @param options - Object with the following properties: + * @param options.scene - The scene + * @param [options.accessToken = Ion.defaultAccessToken] - The access token to use. + * @param [options.server = Ion.defaultServer] - The resource to the Cesium ion API server. + * @param [options.geocodeProviderType = IonGeocodeProviderType.DEFAULT] - The geocoder the Cesium ion API server should use to fulfill this request. + */ + export class IonGeocoderService { + constructor(options: { + scene: Scene; + accessToken?: string; + server?: string | Resource; + geocodeProviderType?: IonGeocodeProviderType; + }); + /** + * Gets the credit to display after a geocode is performed. Typically this is used to credit + * the geocoder service. + */ + readonly credit: Credit | undefined; + /** + * The geocoding service that Cesium ion API server should use to fulfill geocding requests. + */ + geocodeProviderType: IonGeocodeProviderType; + /** + * @param query - The query to be sent to the geocoder service + * @param [type = GeocodeType.SEARCH] - The type of geocode to perform. + */ + geocode( + query: string, + type?: GeocodeType, + ): Promise; + } + + /** + * A {@link Resource} instance that encapsulates Cesium ion asset access. + * This object is normally not instantiated directly, use {@link IonResource.fromAssetId}. + * @param endpoint - The result of the Cesium ion asset endpoint service. + * @param endpointResource - The resource used to retrieve the endpoint. + */ + export class IonResource extends Resource { + constructor(endpoint: any, endpointResource: Resource); + /** + * Asynchronously creates an instance. + * @example + * // Load a Cesium3DTileset with asset ID of 124624234 + * try { + * const resource = await Cesium.IonResource.fromAssetId(124624234); + * const tileset = await Cesium.Cesium3DTileset.fromUrl(resource); + * scene.primitives.add(tileset); + * } catch (error) { + * console.error(`Error creating tileset: ${error}`); + * } + * @example + * //Load a CZML file with asset ID of 10890 + * Cesium.IonResource.fromAssetId(10890) + * .then(function (resource) { + * viewer.dataSources.add(Cesium.CzmlDataSource.load(resource)); + * }); + * @param assetId - The Cesium ion asset id. + * @param [options] - An object with the following properties: + * @param [options.accessToken = Ion.defaultAccessToken] - The access token to use. + * @param [options.server = Ion.defaultServer] - The resource to the Cesium ion API server. + * @returns A Promise to am instance representing the Cesium ion Asset. + */ + static fromAssetId( + assetId: number, + options?: { + accessToken?: string; + server?: string | Resource; + }, + ): Promise; + /** + * Gets the credits required for attribution of the asset. + */ + readonly credits: Credit[]; + /** + * Duplicates a Resource instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Resource instance if one was not provided. + */ + clone(result?: Resource): Resource; + /** + * Asynchronously loads the given image resource. Returns a promise that will resolve to + * an {@link https://developer.mozilla.org/en-US/docs/Web/API/ImageBitmap|ImageBitmap} if preferImageBitmap is true and the browser supports createImageBitmap or otherwise an + * {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement|Image} once loaded, or reject if the image failed to load. + * @example + * // load a single image asynchronously + * resource.fetchImage().then(function(image) { + * // use the loaded image + * }).catch(function(error) { + * // an error occurred + * }); + * + * // load several images in parallel + * Promise.all([resource1.fetchImage(), resource2.fetchImage()]).then(function(images) { + * // images is an array containing all the loaded images + * }); + * @param [options] - An object with the following properties. + * @param [options.preferBlob = false] - If true, we will load the image via a blob. + * @param [options.preferImageBitmap = false] - If true, image will be decoded during fetch and an ImageBitmap is returned. + * @param [options.flipY = false] - If true, image will be vertically flipped during decode. Only applies if the browser supports createImageBitmap. + * @param [options.skipColorSpaceConversion = false] - If true, any custom gamma or color profiles in the image will be ignored. Only applies if the browser supports createImageBitmap. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + fetchImage(options?: { + preferBlob?: boolean; + preferImageBitmap?: boolean; + flipY?: boolean; + skipColorSpaceConversion?: boolean; + }): Promise | undefined; + } + + /** + * Constants related to ISO8601 support. + */ + export namespace Iso8601 { + /** + * A {@link JulianDate} representing the earliest time representable by an ISO8601 date. + * This is equivalent to the date string '0000-01-01T00:00:00Z' + */ + const MINIMUM_VALUE: JulianDate; + /** + * A {@link JulianDate} representing the latest time representable by an ISO8601 date. + * This is equivalent to the date string '9999-12-31T24:00:00Z' + */ + const MAXIMUM_VALUE: JulianDate; + /** + * A {@link TimeInterval} representing the largest interval representable by an ISO8601 interval. + * This is equivalent to the interval string '0000-01-01T00:00:00Z/9999-12-31T24:00:00Z' + */ + const MAXIMUM_INTERVAL: TimeInterval; + } + + /** + * Represents an astronomical Julian date, which is the number of days since noon on January 1, -4712 (4713 BC). + * For increased precision, this class stores the whole number part of the date and the seconds + * part of the date in separate components. In order to be safe for arithmetic and represent + * leap seconds, the date is always stored in the International Atomic Time standard + * {@link TimeStandard.TAI}. + * @param [julianDayNumber = 0.0] - The Julian Day Number representing the number of whole days. Fractional days will also be handled correctly. + * @param [secondsOfDay = 0.0] - The number of seconds into the current Julian Day Number. Fractional seconds, negative seconds and seconds greater than a day will be handled correctly. + * @param [timeStandard = TimeStandard.UTC] - The time standard in which the first two parameters are defined. + */ + export class JulianDate { + constructor( + julianDayNumber?: number, + secondsOfDay?: number, + timeStandard?: TimeStandard, + ); + /** + * Gets or sets the number of whole days. + */ + dayNumber: number; + /** + * Gets or sets the number of seconds into the current day. + */ + secondsOfDay: number; + /** + * Creates a new instance from a GregorianDate. + * @param date - A GregorianDate. + * @param [result] - An existing instance to use for the result. + * @returns The modified result parameter or a new instance if none was provided. + */ + static fromGregorianDate( + date: GregorianDate, + result?: JulianDate, + ): JulianDate; + /** + * Creates a new instance from a JavaScript Date. + * @param date - A JavaScript Date. + * @param [result] - An existing instance to use for the result. + * @returns The modified result parameter or a new instance if none was provided. + */ + static fromDate(date: Date, result?: JulianDate): JulianDate; + /** + * Creates a new instance from a from an {@link http://en.wikipedia.org/wiki/ISO_8601|ISO 8601} date. + * This method is superior to Date.parse because it will handle all valid formats defined by the ISO 8601 + * specification, including leap seconds and sub-millisecond times, which discarded by most JavaScript implementations. + * @param iso8601String - An ISO 8601 date. + * @param [result] - An existing instance to use for the result. + * @returns The modified result parameter or a new instance if none was provided. + */ + static fromIso8601(iso8601String: string, result?: JulianDate): JulianDate; + /** + * Creates a new instance that represents the current system time. + * This is equivalent to calling JulianDate.fromDate(new Date());. + * @param [result] - An existing instance to use for the result. + * @returns The modified result parameter or a new instance if none was provided. + */ + static now(result?: JulianDate): JulianDate; + /** + * Creates a {@link GregorianDate} from the provided instance. + * @param julianDate - The date to be converted. + * @param [result] - An existing instance to use for the result. + * @returns The modified result parameter or a new instance if none was provided. + */ + static toGregorianDate( + julianDate: JulianDate, + result?: GregorianDate, + ): GregorianDate; + /** + * Creates a JavaScript Date from the provided instance. + * Since JavaScript dates are only accurate to the nearest millisecond and + * cannot represent a leap second, consider using {@link JulianDate.toGregorianDate} instead. + * If the provided JulianDate is during a leap second, the previous second is used. + * @param julianDate - The date to be converted. + * @returns A new instance representing the provided date. + */ + static toDate(julianDate: JulianDate): Date; + /** + * Creates an ISO8601 representation of the provided date. + * @param julianDate - The date to be converted. + * @param [precision] - The number of fractional digits used to represent the seconds component. By default, the most precise representation is used. + * @returns The ISO8601 representation of the provided date. + */ + static toIso8601(julianDate: JulianDate, precision?: number): string; + /** + * Duplicates a JulianDate instance. + * @param julianDate - The date to duplicate. + * @param [result] - An existing instance to use for the result. + * @returns The modified result parameter or a new instance if none was provided. Returns undefined if julianDate is undefined. + */ + static clone(julianDate: JulianDate, result?: JulianDate): JulianDate; + /** + * Compares two instances. + * @param left - The first instance. + * @param right - The second instance. + * @returns A negative value if left is less than right, a positive value if left is greater than right, or zero if left and right are equal. + */ + static compare(left: JulianDate, right: JulianDate): number; + /** + * Compares two instances and returns true if they are equal, false otherwise. + * @param [left] - The first instance. + * @param [right] - The second instance. + * @returns true if the dates are equal; otherwise, false. + */ + static equals(left?: JulianDate, right?: JulianDate): boolean; + /** + * Compares two instances and returns true if they are within epsilon seconds of + * each other. That is, in order for the dates to be considered equal (and for + * this function to return true), the absolute value of the difference between them, in + * seconds, must be less than epsilon. + * @param [left] - The first instance. + * @param [right] - The second instance. + * @param [epsilon = 0] - The maximum number of seconds that should separate the two instances. + * @returns true if the two dates are within epsilon seconds of each other; otherwise false. + */ + static equalsEpsilon( + left?: JulianDate, + right?: JulianDate, + epsilon?: number, + ): boolean; + /** + * Computes the total number of whole and fractional days represented by the provided instance. + * @param julianDate - The date. + * @returns The Julian date as single floating point number. + */ + static totalDays(julianDate: JulianDate): number; + /** + * Computes the difference in seconds between the provided instance. + * @param left - The first instance. + * @param right - The second instance. + * @returns The difference, in seconds, when subtracting right from left. + */ + static secondsDifference(left: JulianDate, right: JulianDate): number; + /** + * Computes the difference in days between the provided instance. + * @param left - The first instance. + * @param right - The second instance. + * @returns The difference, in days, when subtracting right from left. + */ + static daysDifference(left: JulianDate, right: JulianDate): number; + /** + * Computes the number of seconds the provided instance is ahead of UTC. + * @param julianDate - The date. + * @returns The number of seconds the provided instance is ahead of UTC + */ + static computeTaiMinusUtc(julianDate: JulianDate): number; + /** + * Adds the provided number of seconds to the provided date instance. + * @param julianDate - The date. + * @param seconds - The number of seconds to add or subtract. + * @param result - An existing instance to use for the result. + * @returns The modified result parameter. + */ + static addSeconds( + julianDate: JulianDate, + seconds: number, + result: JulianDate, + ): JulianDate; + /** + * Adds the provided number of minutes to the provided date instance. + * @param julianDate - The date. + * @param minutes - The number of minutes to add or subtract. + * @param result - An existing instance to use for the result. + * @returns The modified result parameter. + */ + static addMinutes( + julianDate: JulianDate, + minutes: number, + result: JulianDate, + ): JulianDate; + /** + * Adds the provided number of hours to the provided date instance. + * @param julianDate - The date. + * @param hours - The number of hours to add or subtract. + * @param result - An existing instance to use for the result. + * @returns The modified result parameter. + */ + static addHours( + julianDate: JulianDate, + hours: number, + result: JulianDate, + ): JulianDate; + /** + * Adds the provided number of days to the provided date instance. + * @param julianDate - The date. + * @param days - The number of days to add or subtract. + * @param result - An existing instance to use for the result. + * @returns The modified result parameter. + */ + static addDays( + julianDate: JulianDate, + days: number, + result: JulianDate, + ): JulianDate; + /** + * Compares the provided instances and returns true if left is earlier than right, false otherwise. + * @param left - The first instance. + * @param right - The second instance. + * @returns true if left is earlier than right, false otherwise. + */ + static lessThan(left: JulianDate, right: JulianDate): boolean; + /** + * Compares the provided instances and returns true if left is earlier than or equal to right, false otherwise. + * @param left - The first instance. + * @param right - The second instance. + * @returns true if left is earlier than or equal to right, false otherwise. + */ + static lessThanOrEquals(left: JulianDate, right: JulianDate): boolean; + /** + * Compares the provided instances and returns true if left is later than right, false otherwise. + * @param left - The first instance. + * @param right - The second instance. + * @returns true if left is later than right, false otherwise. + */ + static greaterThan(left: JulianDate, right: JulianDate): boolean; + /** + * Compares the provided instances and returns true if left is later than or equal to right, false otherwise. + * @param left - The first instance. + * @param right - The second instance. + * @returns true if left is later than or equal to right, false otherwise. + */ + static greaterThanOrEquals(left: JulianDate, right: JulianDate): boolean; + /** + * Duplicates this instance. + * @param [result] - An existing instance to use for the result. + * @returns The modified result parameter or a new instance if none was provided. + */ + clone(result?: JulianDate): JulianDate; + /** + * Compares this and the provided instance and returns true if they are equal, false otherwise. + * @param [right] - The second instance. + * @returns true if the dates are equal; otherwise, false. + */ + equals(right?: JulianDate): boolean; + /** + * Compares this and the provided instance and returns true if they are within epsilon seconds of + * each other. That is, in order for the dates to be considered equal (and for + * this function to return true), the absolute value of the difference between them, in + * seconds, must be less than epsilon. + * @param [right] - The second instance. + * @param [epsilon = 0] - The maximum number of seconds that should separate the two instances. + * @returns true if the two dates are within epsilon seconds of each other; otherwise false. + */ + equalsEpsilon(right?: JulianDate, epsilon?: number): boolean; + /** + * Creates a string representing this date in ISO8601 format. + * @returns A string representing this date in ISO8601 format. + */ + toString(): string; + /** + * Gets or sets the list of leap seconds used throughout Cesium. + */ + static leapSeconds: LeapSecond[]; + } + + /** + * This enumerated type is for representing keyboard modifiers. These are keys + * that are held down in addition to other event types. + */ + export enum KeyboardEventModifier { + /** + * Represents the shift key being held down. + */ + SHIFT = 0, + /** + * Represents the control key being held down. + */ + CTRL = 1, + /** + * Represents the alt key being held down. + */ + ALT = 2, + } + + /** + * An {@link InterpolationAlgorithm} for performing Lagrange interpolation. + */ + export namespace LagrangePolynomialApproximation { + /** + * Given the desired degree, returns the number of data points required for interpolation. + * @param degree - The desired degree of interpolation. + * @returns The number of required data points needed for the desired degree of interpolation. + */ + function getRequiredDataPoints(degree: number): number; + /** + * Interpolates values using Lagrange Polynomial Approximation. + * @param x - The independent variable for which the dependent variables will be interpolated. + * @param xTable - The array of independent variables to use to interpolate. The values + * in this array must be in increasing order and the same value must not occur twice in the array. + * @param yTable - The array of dependent variables to use to interpolate. For a set of three + * dependent values (p,q,w) at time 1 and time 2 this should be as follows: {p1, q1, w1, p2, q2, w2}. + * @param yStride - The number of dependent variable values in yTable corresponding to + * each independent variable value in xTable. + * @param [result] - An existing array into which to store the result. + * @returns The array of interpolated values, or the result parameter if one was provided. + */ + function interpolateOrderZero( + x: number, + xTable: number[], + yTable: number[], + yStride: number, + result?: number[], + ): number[]; + } + + /** + * Describes a single leap second, which is constructed from a {@link JulianDate} and a + * numerical offset representing the number of seconds TAI is ahead of the UTC time standard. + * @param [date] - A Julian date representing the time of the leap second. + * @param [offset] - The cumulative number of seconds that TAI is ahead of UTC at the provided date. + */ + export class LeapSecond { + constructor(date?: JulianDate, offset?: number); + /** + * Gets or sets the date at which this leap second occurs. + */ + julianDate: JulianDate; + /** + * Gets or sets the cumulative number of seconds between the UTC and TAI time standards at the time + * of this leap second. + */ + offset: number; + } + + /** + * An {@link InterpolationAlgorithm} for performing linear interpolation. + */ + export namespace LinearApproximation { + /** + * Given the desired degree, returns the number of data points required for interpolation. + * Since linear interpolation can only generate a first degree polynomial, this function + * always returns 2. + * @param degree - The desired degree of interpolation. + * @returns This function always returns 2. + */ + function getRequiredDataPoints(degree: number): number; + /** + * Interpolates values using linear approximation. + * @param x - The independent variable for which the dependent variables will be interpolated. + * @param xTable - The array of independent variables to use to interpolate. The values + * in this array must be in increasing order and the same value must not occur twice in the array. + * @param yTable - The array of dependent variables to use to interpolate. For a set of three + * dependent values (p,q,w) at time 1 and time 2 this should be as follows: {p1, q1, w1, p2, q2, w2}. + * @param yStride - The number of dependent variable values in yTable corresponding to + * each independent variable value in xTable. + * @param [result] - An existing array into which to store the result. + * @returns The array of interpolated values, or the result parameter if one was provided. + */ + function interpolateOrderZero( + x: number, + xTable: number[], + yTable: number[], + yStride: number, + result?: number[], + ): number[]; + } + + /** + * A spline that uses piecewise linear interpolation to create a curve. + * @example + * const times = [ 0.0, 1.5, 3.0, 4.5, 6.0 ]; + * const spline = new Cesium.LinearSpline({ + * times : times, + * points : [ + * new Cesium.Cartesian3(1235398.0, -4810983.0, 4146266.0), + * new Cesium.Cartesian3(1372574.0, -5345182.0, 4606657.0), + * new Cesium.Cartesian3(-757983.0, -5542796.0, 4514323.0), + * new Cesium.Cartesian3(-2821260.0, -5248423.0, 4021290.0), + * new Cesium.Cartesian3(-2539788.0, -4724797.0, 3620093.0) + * ] + * }); + * + * const p0 = spline.evaluate(times[0]); + * @param options - Object with the following properties: + * @param options.times - An array of strictly increasing, unit-less, floating-point times at each point. + * The values are in no way connected to the clock time. They are the parameterization for the curve. + * @param options.points - The array of control points. + */ + export class LinearSpline { + constructor(options: { times: number[]; points: number[] | Cartesian3[] }); + /** + * An array of times for the control points. + */ + readonly times: number[]; + /** + * An array of {@link Cartesian3} control points. + */ + readonly points: number[] | Cartesian3[]; + /** + * Finds an index i in times such that the parameter + * time is in the interval [times[i], times[i + 1]]. + * @param time - The time. + * @returns The index for the element at the start of the interval. + */ + findTimeInterval(time: number): number; + /** + * Wraps the given time to the period covered by the spline. + * @param time - The time. + * @returns The time, wrapped around to the updated animation. + */ + wrapTime(time: number): number; + /** + * Clamps the given time to the period covered by the spline. + * @param time - The time. + * @returns The time, clamped to the animation period. + */ + clampTime(time: number): number; + /** + * Evaluates the curve at a given time. + * @param time - The time at which to evaluate the curve. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance of the point on the curve at the given time. + */ + evaluate(time: number, result?: Cartesian3): number | Cartesian3; + } + + /** + * Defines how geodetic ellipsoid coordinates ({@link Cartographic}) project to a + * flat map like Cesium's 2D and Columbus View modes. + */ + export class MapProjection { + constructor(); + /** + * Gets the {@link Ellipsoid}. + */ + readonly ellipsoid: Ellipsoid; + /** + * Projects {@link Cartographic} coordinates, in radians, to projection-specific map coordinates, in meters. + * @param cartographic - The coordinates to project. + * @param [result] - An instance into which to copy the result. If this parameter is + * undefined, a new instance is created and returned. + * @returns The projected coordinates. If the result parameter is not undefined, the + * coordinates are copied there and that instance is returned. Otherwise, a new instance is + * created and returned. + */ + project(cartographic: Cartographic, result?: Cartesian3): Cartesian3; + /** + * Unprojects projection-specific map {@link Cartesian3} coordinates, in meters, to {@link Cartographic} + * coordinates, in radians. + * @param cartesian - The Cartesian position to unproject with height (z) in meters. + * @param [result] - An instance into which to copy the result. If this parameter is + * undefined, a new instance is created and returned. + * @returns The unprojected coordinates. If the result parameter is not undefined, the + * coordinates are copied there and that instance is returned. Otherwise, a new instance is + * created and returned. + */ + unproject(cartesian: Cartesian3, result?: Cartographic): Cartographic; + } + + /** + * Math functions. + */ + export namespace Math { + /** + * 0.1 + */ + const EPSILON1 = 0.1; + /** + * 0.01 + */ + const EPSILON2 = 0.01; + /** + * 0.001 + */ + const EPSILON3 = 0.001; + /** + * 0.0001 + */ + const EPSILON4 = 0.0001; + /** + * 0.00001 + */ + const EPSILON5 = 0.00001; + /** + * 0.000001 + */ + const EPSILON6 = 0.000001; + /** + * 0.0000001 + */ + const EPSILON7 = 1e-7; + /** + * 0.00000001 + */ + const EPSILON8 = 1e-8; + /** + * 0.000000001 + */ + const EPSILON9 = 1e-9; + /** + * 0.0000000001 + */ + const EPSILON10 = 1e-10; + /** + * 0.00000000001 + */ + const EPSILON11 = 1e-11; + /** + * 0.000000000001 + */ + const EPSILON12 = 1e-12; + /** + * 0.0000000000001 + */ + const EPSILON13 = 1e-13; + /** + * 0.00000000000001 + */ + const EPSILON14 = 1e-14; + /** + * 0.000000000000001 + */ + const EPSILON15 = 1e-15; + /** + * 0.0000000000000001 + */ + const EPSILON16 = 1e-16; + /** + * 0.00000000000000001 + */ + const EPSILON17 = 1e-17; + /** + * 0.000000000000000001 + */ + const EPSILON18 = 1e-18; + /** + * 0.0000000000000000001 + */ + const EPSILON19 = 1e-19; + /** + * 0.00000000000000000001 + */ + const EPSILON20 = 1e-20; + /** + * 0.000000000000000000001 + */ + const EPSILON21 = 1e-21; + /** + * The gravitational parameter of the Earth in meters cubed + * per second squared as defined by the WGS84 model: 3.986004418e14 + */ + const GRAVITATIONALPARAMETER = 398600441800000; + /** + * Radius of the sun in meters: 6.955e8 + */ + const SOLAR_RADIUS = 695500000; + /** + * The mean radius of the moon, according to the "Report of the IAU/IAG Working Group on + * Cartographic Coordinates and Rotational Elements of the Planets and satellites: 2000", + * Celestial Mechanics 82: 83-110, 2002. + */ + const LUNAR_RADIUS = 1737400; + /** + * 64 * 1024 + */ + const SIXTY_FOUR_KILOBYTES: number; + /** + * 4 * 1024 * 1024 * 1024 + */ + const FOUR_GIGABYTES: number; + /** + * Returns the sign of the value; 1 if the value is positive, -1 if the value is + * negative, or 0 if the value is 0. + * @param value - The value to return the sign of. + * @returns The sign of value. + */ + function sign(value: number): number; + /** + * Returns 1.0 if the given value is positive or zero, and -1.0 if it is negative. + * This is similar to {@link Math#sign} except that returns 1.0 instead of + * 0.0 when the input value is 0.0. + * @param value - The value to return the sign of. + * @returns The sign of value. + */ + function signNotZero(value: number): number; + /** + * Converts a scalar value in the range [-1.0, 1.0] to a SNORM in the range [0, rangeMaximum] + * @param value - The scalar value in the range [-1.0, 1.0] + * @param [rangeMaximum = 255] - The maximum value in the mapped range, 255 by default. + * @returns A SNORM value, where 0 maps to -1.0 and rangeMaximum maps to 1.0. + */ + function toSNorm(value: number, rangeMaximum?: number): number; + /** + * Converts a SNORM value in the range [0, rangeMaximum] to a scalar in the range [-1.0, 1.0]. + * @param value - SNORM value in the range [0, rangeMaximum] + * @param [rangeMaximum = 255] - The maximum value in the SNORM range, 255 by default. + * @returns Scalar in the range [-1.0, 1.0]. + */ + function fromSNorm(value: number, rangeMaximum?: number): number; + /** + * Converts a scalar value in the range [rangeMinimum, rangeMaximum] to a scalar in the range [0.0, 1.0] + * @param value - The scalar value in the range [rangeMinimum, rangeMaximum] + * @param rangeMinimum - The minimum value in the mapped range. + * @param rangeMaximum - The maximum value in the mapped range. + * @returns A scalar value, where rangeMinimum maps to 0.0 and rangeMaximum maps to 1.0. + */ + function normalize( + value: number, + rangeMinimum: number, + rangeMaximum: number, + ): number; + /** + * Returns the hyperbolic sine of a number. + * The hyperbolic sine of value is defined to be + * (ex - e-x)/2.0 + * where e is Euler's number, approximately 2.71828183. + * + *

Special cases: + *

    + *
  • If the argument is NaN, then the result is NaN.
  • + * + *
  • If the argument is infinite, then the result is an infinity + * with the same sign as the argument.
  • + * + *
  • If the argument is zero, then the result is a zero with the + * same sign as the argument.
  • + *
+ *

+ * @param value - The number whose hyperbolic sine is to be returned. + * @returns The hyperbolic sine of value. + */ + function sinh(value: number): number; + /** + * Returns the hyperbolic cosine of a number. + * The hyperbolic cosine of value is defined to be + * (ex + e-x)/2.0 + * where e is Euler's number, approximately 2.71828183. + * + *

Special cases: + *

    + *
  • If the argument is NaN, then the result is NaN.
  • + * + *
  • If the argument is infinite, then the result is positive infinity.
  • + * + *
  • If the argument is zero, then the result is 1.0.
  • + *
+ *

+ * @param value - The number whose hyperbolic cosine is to be returned. + * @returns The hyperbolic cosine of value. + */ + function cosh(value: number): number; + /** + * Computes the linear interpolation of two values. + * @example + * const n = Cesium.Math.lerp(0.0, 2.0, 0.5); // returns 1.0 + * @param p - The start value to interpolate. + * @param q - The end value to interpolate. + * @param time - The time of interpolation generally in the range [0.0, 1.0]. + * @returns The linearly interpolated value. + */ + function lerp(p: number, q: number, time: number): number; + /** + * pi + */ + const PI: number; + /** + * 1/pi + */ + const ONE_OVER_PI: number; + /** + * pi/2 + */ + const PI_OVER_TWO: number; + /** + * pi/3 + */ + const PI_OVER_THREE: number; + /** + * pi/4 + */ + const PI_OVER_FOUR: number; + /** + * pi/6 + */ + const PI_OVER_SIX: number; + /** + * 3pi/2 + */ + const THREE_PI_OVER_TWO: number; + /** + * 2pi + */ + const TWO_PI: number; + /** + * 1/2pi + */ + const ONE_OVER_TWO_PI: number; + /** + * The number of radians in a degree. + */ + const RADIANS_PER_DEGREE: number; + /** + * The number of degrees in a radian. + */ + const DEGREES_PER_RADIAN: number; + /** + * The number of radians in an arc second. + */ + const RADIANS_PER_ARCSECOND: number; + /** + * Converts degrees to radians. + * @param degrees - The angle to convert in degrees. + * @returns The corresponding angle in radians. + */ + function toRadians(degrees: number): number; + /** + * Converts radians to degrees. + * @param radians - The angle to convert in radians. + * @returns The corresponding angle in degrees. + */ + function toDegrees(radians: number): number; + /** + * Converts a longitude value, in radians, to the range [-Math.PI, Math.PI). + * @example + * // Convert 270 degrees to -90 degrees longitude + * const longitude = Cesium.Math.convertLongitudeRange(Cesium.Math.toRadians(270.0)); + * @param angle - The longitude value, in radians, to convert to the range [-Math.PI, Math.PI). + * @returns The equivalent longitude value in the range [-Math.PI, Math.PI). + */ + function convertLongitudeRange(angle: number): number; + /** + * Convenience function that clamps a latitude value, in radians, to the range [-Math.PI/2, Math.PI/2). + * Useful for sanitizing data before use in objects requiring correct range. + * @example + * // Clamp 108 degrees latitude to 90 degrees latitude + * const latitude = Cesium.Math.clampToLatitudeRange(Cesium.Math.toRadians(108.0)); + * @param angle - The latitude value, in radians, to clamp to the range [-Math.PI/2, Math.PI/2). + * @returns The latitude value clamped to the range [-Math.PI/2, Math.PI/2). + */ + function clampToLatitudeRange(angle: number): number; + /** + * Produces an angle in the range -Pi <= angle <= Pi which is equivalent to the provided angle. + * @param angle - in radians + * @returns The angle in the range [-Math.PI, Math.PI]. + */ + function negativePiToPi(angle: number): number; + /** + * Produces an angle in the range 0 <= angle <= 2Pi which is equivalent to the provided angle. + * @param angle - in radians + * @returns The angle in the range [0, Math.TWO_PI]. + */ + function zeroToTwoPi(angle: number): number; + /** + * The modulo operation that also works for negative dividends. + * @param m - The dividend. + * @param n - The divisor. + * @returns The remainder. + */ + function mod(m: number, n: number): number; + /** + * Determines if two values are equal using an absolute or relative tolerance test. This is useful + * to avoid problems due to roundoff error when comparing floating-point values directly. The values are + * first compared using an absolute tolerance test. If that fails, a relative tolerance test is performed. + * Use this test if you are unsure of the magnitudes of left and right. + * @example + * const a = Cesium.Math.equalsEpsilon(0.0, 0.01, Cesium.Math.EPSILON2); // true + * const b = Cesium.Math.equalsEpsilon(0.0, 0.1, Cesium.Math.EPSILON2); // false + * const c = Cesium.Math.equalsEpsilon(3699175.1634344, 3699175.2, Cesium.Math.EPSILON7); // true + * const d = Cesium.Math.equalsEpsilon(3699175.1634344, 3699175.2, Cesium.Math.EPSILON9); // false + * @param left - The first value to compare. + * @param right - The other value to compare. + * @param [relativeEpsilon = 0] - The maximum inclusive delta between left and right for the relative tolerance test. + * @param [absoluteEpsilon = relativeEpsilon] - The maximum inclusive delta between left and right for the absolute tolerance test. + * @returns true if the values are equal within the epsilon; otherwise, false. + */ + function equalsEpsilon( + left: number, + right: number, + relativeEpsilon?: number, + absoluteEpsilon?: number, + ): boolean; + /** + * Determines if the left value is less than the right value. If the two values are within + * absoluteEpsilon of each other, they are considered equal and this function returns false. + * @param left - The first number to compare. + * @param right - The second number to compare. + * @param absoluteEpsilon - The absolute epsilon to use in comparison. + * @returns true if left is less than right by more than + * absoluteEpsilon. false if left is greater or if the two + * values are nearly equal. + */ + function lessThan( + left: number, + right: number, + absoluteEpsilon: number, + ): boolean; + /** + * Determines if the left value is less than or equal to the right value. If the two values are within + * absoluteEpsilon of each other, they are considered equal and this function returns true. + * @param left - The first number to compare. + * @param right - The second number to compare. + * @param absoluteEpsilon - The absolute epsilon to use in comparison. + * @returns true if left is less than right or if the + * the values are nearly equal. + */ + function lessThanOrEquals( + left: number, + right: number, + absoluteEpsilon: number, + ): boolean; + /** + * Determines if the left value is greater the right value. If the two values are within + * absoluteEpsilon of each other, they are considered equal and this function returns false. + * @param left - The first number to compare. + * @param right - The second number to compare. + * @param absoluteEpsilon - The absolute epsilon to use in comparison. + * @returns true if left is greater than right by more than + * absoluteEpsilon. false if left is less or if the two + * values are nearly equal. + */ + function greaterThan( + left: number, + right: number, + absoluteEpsilon: number, + ): boolean; + /** + * Determines if the left value is greater than or equal to the right value. If the two values are within + * absoluteEpsilon of each other, they are considered equal and this function returns true. + * @param left - The first number to compare. + * @param right - The second number to compare. + * @param absoluteEpsilon - The absolute epsilon to use in comparison. + * @returns true if left is greater than right or if the + * the values are nearly equal. + */ + function greaterThanOrEquals( + left: number, + right: number, + absoluteEpsilon: number, + ): boolean; + /** + * Computes the factorial of the provided number. + * @example + * //Compute 7!, which is equal to 5040 + * const computedFactorial = Cesium.Math.factorial(7); + * @param n - The number whose factorial is to be computed. + * @returns The factorial of the provided number or undefined if the number is less than 0. + */ + function factorial(n: number): number; + /** + * Increments a number with a wrapping to a minimum value if the number exceeds the maximum value. + * @example + * const n = Cesium.Math.incrementWrap(5, 10, 0); // returns 6 + * const m = Cesium.Math.incrementWrap(10, 10, 0); // returns 0 + * @param [n] - The number to be incremented. + * @param [maximumValue] - The maximum incremented value before rolling over to the minimum value. + * @param [minimumValue = 0.0] - The number reset to after the maximum value has been exceeded. + * @returns The incremented number. + */ + function incrementWrap( + n?: number, + maximumValue?: number, + minimumValue?: number, + ): number; + /** + * Determines if a non-negative integer is a power of two. + * The maximum allowed input is (2^32)-1 due to 32-bit bitwise operator limitation in Javascript. + * @example + * const t = Cesium.Math.isPowerOfTwo(16); // true + * const f = Cesium.Math.isPowerOfTwo(20); // false + * @param n - The integer to test in the range [0, (2^32)-1]. + * @returns true if the number if a power of two; otherwise, false. + */ + function isPowerOfTwo(n: number): boolean; + /** + * Computes the next power-of-two integer greater than or equal to the provided non-negative integer. + * The maximum allowed input is 2^31 due to 32-bit bitwise operator limitation in Javascript. + * @example + * const n = Cesium.Math.nextPowerOfTwo(29); // 32 + * const m = Cesium.Math.nextPowerOfTwo(32); // 32 + * @param n - The integer to test in the range [0, 2^31]. + * @returns The next power-of-two integer. + */ + function nextPowerOfTwo(n: number): number; + /** + * Computes the previous power-of-two integer less than or equal to the provided non-negative integer. + * The maximum allowed input is (2^32)-1 due to 32-bit bitwise operator limitation in Javascript. + * @example + * const n = Cesium.Math.previousPowerOfTwo(29); // 16 + * const m = Cesium.Math.previousPowerOfTwo(32); // 32 + * @param n - The integer to test in the range [0, (2^32)-1]. + * @returns The previous power-of-two integer. + */ + function previousPowerOfTwo(n: number): number; + /** + * Constraint a value to lie between two values. + * @param value - The value to clamp. + * @param min - The minimum value. + * @param max - The maximum value. + * @returns The clamped value such that min <= result <= max. + */ + function clamp(value: number, min: number, max: number): number; + /** + * Sets the seed used by the random number generator + * in {@link Math#nextRandomNumber}. + * @param seed - An integer used as the seed. + */ + function setRandomNumberSeed(seed: number): void; + /** + * Generates a random floating point number in the range of [0.0, 1.0) + * using a Mersenne twister. + * @returns A random number in the range of [0.0, 1.0). + */ + function nextRandomNumber(): number; + /** + * Generates a random number between two numbers. + * @param min - The minimum value. + * @param max - The maximum value. + * @returns A random number between the min and max. + */ + function randomBetween(min: number, max: number): number; + /** + * Computes Math.acos(value), but first clamps value to the range [-1.0, 1.0] + * so that the function will never return NaN. + * @param value - The value for which to compute acos. + * @returns The acos of the value if the value is in the range [-1.0, 1.0], or the acos of -1.0 or 1.0, + * whichever is closer, if the value is outside the range. + */ + function acosClamped(value: number): number; + /** + * Computes Math.asin(value), but first clamps value to the range [-1.0, 1.0] + * so that the function will never return NaN. + * @param value - The value for which to compute asin. + * @returns The asin of the value if the value is in the range [-1.0, 1.0], or the asin of -1.0 or 1.0, + * whichever is closer, if the value is outside the range. + */ + function asinClamped(value: number): number; + /** + * Finds the chord length between two points given the circle's radius and the angle between the points. + * @param angle - The angle between the two points. + * @param radius - The radius of the circle. + * @returns The chord length. + */ + function chordLength(angle: number, radius: number): number; + /** + * Finds the logarithm of a number to a base. + * @param number - The number. + * @param base - The base. + * @returns The result. + */ + function logBase(number: number, base: number): number; + /** + * Finds the cube root of a number. + * Returns NaN if number is not provided. + * @param [number] - The number. + * @returns The result. + */ + function cbrt(number?: number): number; + /** + * Finds the base 2 logarithm of a number. + * @param number - The number. + * @returns The result. + */ + function log2(number: number): number; + /** + * Computes a fast approximation of Atan for input in the range [-1, 1]. + * + * Based on Michal Drobot's approximation from ShaderFastLibs, + * which in turn is based on "Efficient approximations for the arctangent function," + * Rajan, S. Sichun Wang Inkol, R. Joyal, A., May 2006. + * Adapted from ShaderFastLibs under MIT License. + * @param x - An input number in the range [-1, 1] + * @returns An approximation of atan(x) + */ + function fastApproximateAtan(x: number): number; + /** + * Computes a fast approximation of Atan2(x, y) for arbitrary input scalars. + * + * Range reduction math based on nvidia's cg reference implementation: http://developer.download.nvidia.com/cg/atan2.html + * @param x - An input number that isn't zero if y is zero. + * @param y - An input number that isn't zero if x is zero. + * @returns An approximation of atan2(x, y) + */ + function fastApproximateAtan2(x: number, y: number): number; + } + + export interface Matrix2 extends ArrayLike {} + + /** + * A 2x2 matrix, indexable as a column-major order array. + * Constructor parameters are in row-major order for code readability. + * @param [column0Row0 = 0.0] - The value for column 0, row 0. + * @param [column1Row0 = 0.0] - The value for column 1, row 0. + * @param [column0Row1 = 0.0] - The value for column 0, row 1. + * @param [column1Row1 = 0.0] - The value for column 1, row 1. + */ + export class Matrix2 implements ArrayLike { + constructor( + column0Row0?: number, + column1Row0?: number, + column0Row1?: number, + column1Row1?: number, + ); + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: Matrix2, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new Matrix2 instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: Matrix2, + ): Matrix2; + /** + * Flattens an array of Matrix2s into an array of components. The components + * are stored in column-major order. + * @param array - The array of matrices to pack. + * @param [result] - The array onto which to store the result. If this is a typed array, it must have array.length * 4 components, else a {@link DeveloperError} will be thrown. If it is a regular array, it will be resized to have (array.length * 4) elements. + * @returns The packed array. + */ + static packArray(array: Matrix2[], result?: number[]): number[]; + /** + * Unpacks an array of column-major matrix components into an array of Matrix2s. + * @param array - The array of components to unpack. + * @param [result] - The array onto which to store the result. + * @returns The unpacked array. + */ + static unpackArray(array: number[], result?: Matrix2[]): Matrix2[]; + /** + * Duplicates a Matrix2 instance. + * @param matrix - The matrix to duplicate. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Matrix2 instance if one was not provided. (Returns undefined if matrix is undefined) + */ + static clone(matrix: Matrix2, result?: Matrix2): Matrix2; + /** + * Creates a Matrix2 from 4 consecutive elements in an array. + * @example + * // Create the Matrix2: + * // [1.0, 2.0] + * // [1.0, 2.0] + * + * const v = [1.0, 1.0, 2.0, 2.0]; + * const m = Cesium.Matrix2.fromArray(v); + * + * // Create same Matrix2 with using an offset into an array + * const v2 = [0.0, 0.0, 1.0, 1.0, 2.0, 2.0]; + * const m2 = Cesium.Matrix2.fromArray(v2, 2); + * @param array - The array whose 4 consecutive elements correspond to the positions of the matrix. Assumes column-major order. + * @param [startingIndex = 0] - The offset into the array of the first element, which corresponds to first column first row position in the matrix. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Matrix2 instance if one was not provided. + */ + static fromArray( + array: number[], + startingIndex?: number, + result?: Matrix2, + ): Matrix2; + /** + * Creates a Matrix2 instance from a column-major order array. + * @param values - The column-major order array. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix2 instance if one was not provided. + */ + static fromColumnMajorArray(values: number[], result?: Matrix2): Matrix2; + /** + * Creates a Matrix2 instance from a row-major order array. + * The resulting matrix will be in column-major order. + * @param values - The row-major order array. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix2 instance if one was not provided. + */ + static fromRowMajorArray(values: number[], result?: Matrix2): Matrix2; + /** + * Computes a Matrix2 instance representing a non-uniform scale. + * @example + * // Creates + * // [7.0, 0.0] + * // [0.0, 8.0] + * const m = Cesium.Matrix2.fromScale(new Cesium.Cartesian2(7.0, 8.0)); + * @param scale - The x and y scale factors. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix2 instance if one was not provided. + */ + static fromScale(scale: Cartesian2, result?: Matrix2): Matrix2; + /** + * Computes a Matrix2 instance representing a uniform scale. + * @example + * // Creates + * // [2.0, 0.0] + * // [0.0, 2.0] + * const m = Cesium.Matrix2.fromUniformScale(2.0); + * @param scale - The uniform scale factor. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix2 instance if one was not provided. + */ + static fromUniformScale(scale: number, result?: Matrix2): Matrix2; + /** + * Creates a rotation matrix. + * @example + * // Rotate a point 45 degrees counterclockwise. + * const p = new Cesium.Cartesian2(5, 6); + * const m = Cesium.Matrix2.fromRotation(Cesium.Math.toRadians(45.0)); + * const rotated = Cesium.Matrix2.multiplyByVector(m, p, new Cesium.Cartesian2()); + * @param angle - The angle, in radians, of the rotation. Positive angles are counterclockwise. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix2 instance if one was not provided. + */ + static fromRotation(angle: number, result?: Matrix2): Matrix2; + /** + * Creates an Array from the provided Matrix2 instance. + * The array will be in column-major order. + * @param matrix - The matrix to use.. + * @param [result] - The Array onto which to store the result. + * @returns The modified Array parameter or a new Array instance if one was not provided. + */ + static toArray(matrix: Matrix2, result?: number[]): number[]; + /** + * Computes the array index of the element at the provided row and column. + * @example + * const myMatrix = new Cesium.Matrix2(); + * const column1Row0Index = Cesium.Matrix2.getElementIndex(1, 0); + * const column1Row0 = myMatrix[column1Row0Index] + * myMatrix[column1Row0Index] = 10.0; + * @param row - The zero-based index of the row. + * @param column - The zero-based index of the column. + * @returns The index of the element at the provided row and column. + */ + static getElementIndex(row: number, column: number): number; + /** + * Retrieves a copy of the matrix column at the provided index as a Cartesian2 instance. + * @param matrix - The matrix to use. + * @param index - The zero-based index of the column to retrieve. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static getColumn( + matrix: Matrix2, + index: number, + result: Cartesian2, + ): Cartesian2; + /** + * Computes a new matrix that replaces the specified column in the provided matrix with the provided Cartesian2 instance. + * @param matrix - The matrix to use. + * @param index - The zero-based index of the column to set. + * @param cartesian - The Cartesian whose values will be assigned to the specified column. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static setColumn( + matrix: Matrix2, + index: number, + cartesian: Cartesian2, + result: Cartesian2, + ): Matrix2; + /** + * Retrieves a copy of the matrix row at the provided index as a Cartesian2 instance. + * @param matrix - The matrix to use. + * @param index - The zero-based index of the row to retrieve. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static getRow( + matrix: Matrix2, + index: number, + result: Cartesian2, + ): Cartesian2; + /** + * Computes a new matrix that replaces the specified row in the provided matrix with the provided Cartesian2 instance. + * @param matrix - The matrix to use. + * @param index - The zero-based index of the row to set. + * @param cartesian - The Cartesian whose values will be assigned to the specified row. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static setRow( + matrix: Matrix2, + index: number, + cartesian: Cartesian2, + result: Matrix2, + ): Matrix2; + /** + * Computes a new matrix that replaces the scale with the provided scale. + * This assumes the matrix is an affine transformation. + * @param matrix - The matrix to use. + * @param scale - The scale that replaces the scale of the provided matrix. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static setScale( + matrix: Matrix2, + scale: Cartesian2, + result: Matrix2, + ): Matrix2; + /** + * Computes a new matrix that replaces the scale with the provided uniform scale. + * This assumes the matrix is an affine transformation. + * @param matrix - The matrix to use. + * @param scale - The uniform scale that replaces the scale of the provided matrix. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static setUniformScale( + matrix: Matrix2, + scale: number, + result: Matrix2, + ): Matrix2; + /** + * Extracts the non-uniform scale assuming the matrix is an affine transformation. + * @param matrix - The matrix. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static getScale(matrix: Matrix2, result: Cartesian2): Cartesian2; + /** + * Computes the maximum scale assuming the matrix is an affine transformation. + * The maximum scale is the maximum length of the column vectors. + * @param matrix - The matrix. + * @returns The maximum scale. + */ + static getMaximumScale(matrix: Matrix2): number; + /** + * Sets the rotation assuming the matrix is an affine transformation. + * @param matrix - The matrix. + * @param rotation - The rotation matrix. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static setRotation( + matrix: Matrix2, + rotation: Matrix2, + result: Matrix2, + ): Matrix2; + /** + * Extracts the rotation matrix assuming the matrix is an affine transformation. + * @param matrix - The matrix. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static getRotation(matrix: Matrix2, result: Matrix2): Matrix2; + /** + * Computes the product of two matrices. + * @param left - The first matrix. + * @param right - The second matrix. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiply(left: Matrix2, right: Matrix2, result: Matrix2): Matrix2; + /** + * Computes the sum of two matrices. + * @param left - The first matrix. + * @param right - The second matrix. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static add(left: Matrix2, right: Matrix2, result: Matrix2): Matrix2; + /** + * Computes the difference of two matrices. + * @param left - The first matrix. + * @param right - The second matrix. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static subtract(left: Matrix2, right: Matrix2, result: Matrix2): Matrix2; + /** + * Computes the product of a matrix and a column vector. + * @param matrix - The matrix. + * @param cartesian - The column. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyByVector( + matrix: Matrix2, + cartesian: Cartesian2, + result: Cartesian2, + ): Cartesian2; + /** + * Computes the product of a matrix and a scalar. + * @param matrix - The matrix. + * @param scalar - The number to multiply by. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyByScalar( + matrix: Matrix2, + scalar: number, + result: Matrix2, + ): Matrix2; + /** + * Computes the product of a matrix times a (non-uniform) scale, as if the scale were a scale matrix. + * @example + * // Instead of Cesium.Matrix2.multiply(m, Cesium.Matrix2.fromScale(scale), m); + * Cesium.Matrix2.multiplyByScale(m, scale, m); + * @param matrix - The matrix on the left-hand side. + * @param scale - The non-uniform scale on the right-hand side. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyByScale( + matrix: Matrix2, + scale: Cartesian2, + result: Matrix2, + ): Matrix2; + /** + * Computes the product of a matrix times a uniform scale, as if the scale were a scale matrix. + * @example + * // Instead of Cesium.Matrix2.multiply(m, Cesium.Matrix2.fromUniformScale(scale), m); + * Cesium.Matrix2.multiplyByUniformScale(m, scale, m); + * @param matrix - The matrix on the left-hand side. + * @param scale - The uniform scale on the right-hand side. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyByUniformScale( + matrix: Matrix2, + scale: number, + result: Matrix2, + ): Matrix2; + /** + * Creates a negated copy of the provided matrix. + * @param matrix - The matrix to negate. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static negate(matrix: Matrix2, result: Matrix2): Matrix2; + /** + * Computes the transpose of the provided matrix. + * @param matrix - The matrix to transpose. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static transpose(matrix: Matrix2, result: Matrix2): Matrix2; + /** + * Computes a matrix, which contains the absolute (unsigned) values of the provided matrix's elements. + * @param matrix - The matrix with signed elements. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static abs(matrix: Matrix2, result: Matrix2): Matrix2; + /** + * Compares the provided matrices componentwise and returns + * true if they are equal, false otherwise. + * @param [left] - The first matrix. + * @param [right] - The second matrix. + * @returns true if left and right are equal, false otherwise. + */ + static equals(left?: Matrix2, right?: Matrix2): boolean; + /** + * Compares the provided matrices componentwise and returns + * true if they are within the provided epsilon, + * false otherwise. + * @param [left] - The first matrix. + * @param [right] - The second matrix. + * @param [epsilon = 0] - The epsilon to use for equality testing. + * @returns true if left and right are within the provided epsilon, false otherwise. + */ + static equalsEpsilon( + left?: Matrix2, + right?: Matrix2, + epsilon?: number, + ): boolean; + /** + * An immutable Matrix2 instance initialized to the identity matrix. + */ + static readonly IDENTITY: Matrix2; + /** + * An immutable Matrix2 instance initialized to the zero matrix. + */ + static readonly ZERO: Matrix2; + /** + * The index into Matrix2 for column 0, row 0. + * @example + * const matrix = new Cesium.Matrix2(); + * matrix[Cesium.Matrix2.COLUMN0ROW0] = 5.0; // set column 0, row 0 to 5.0 + */ + static readonly COLUMN0ROW0: number; + /** + * The index into Matrix2 for column 0, row 1. + * @example + * const matrix = new Cesium.Matrix2(); + * matrix[Cesium.Matrix2.COLUMN0ROW1] = 5.0; // set column 0, row 1 to 5.0 + */ + static readonly COLUMN0ROW1: number; + /** + * The index into Matrix2 for column 1, row 0. + * @example + * const matrix = new Cesium.Matrix2(); + * matrix[Cesium.Matrix2.COLUMN1ROW0] = 5.0; // set column 1, row 0 to 5.0 + */ + static readonly COLUMN1ROW0: number; + /** + * The index into Matrix2 for column 1, row 1. + * @example + * const matrix = new Cesium.Matrix2(); + * matrix[Cesium.Matrix2.COLUMN1ROW1] = 5.0; // set column 1, row 1 to 5.0 + */ + static readonly COLUMN1ROW1: number; + /** + * Gets the number of items in the collection. + */ + length: number; + /** + * Duplicates the provided Matrix2 instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Matrix2 instance if one was not provided. + */ + clone(result?: Matrix2): Matrix2; + /** + * Compares this matrix to the provided matrix componentwise and returns + * true if they are equal, false otherwise. + * @param [right] - The right hand side matrix. + * @returns true if they are equal, false otherwise. + */ + equals(right?: Matrix2): boolean; + /** + * Compares this matrix to the provided matrix componentwise and returns + * true if they are within the provided epsilon, + * false otherwise. + * @param [right] - The right hand side matrix. + * @param [epsilon = 0] - The epsilon to use for equality testing. + * @returns true if they are within the provided epsilon, false otherwise. + */ + equalsEpsilon(right?: Matrix2, epsilon?: number): boolean; + /** + * Creates a string representing this Matrix with each row being + * on a separate line and in the format '(column0, column1)'. + * @returns A string representing the provided Matrix with each row being on a separate line and in the format '(column0, column1)'. + */ + toString(): string; + } + + export interface Matrix3 extends ArrayLike {} + + /** + * A 3x3 matrix, indexable as a column-major order array. + * Constructor parameters are in row-major order for code readability. + * @param [column0Row0 = 0.0] - The value for column 0, row 0. + * @param [column1Row0 = 0.0] - The value for column 1, row 0. + * @param [column2Row0 = 0.0] - The value for column 2, row 0. + * @param [column0Row1 = 0.0] - The value for column 0, row 1. + * @param [column1Row1 = 0.0] - The value for column 1, row 1. + * @param [column2Row1 = 0.0] - The value for column 2, row 1. + * @param [column0Row2 = 0.0] - The value for column 0, row 2. + * @param [column1Row2 = 0.0] - The value for column 1, row 2. + * @param [column2Row2 = 0.0] - The value for column 2, row 2. + */ + export class Matrix3 implements ArrayLike { + constructor( + column0Row0?: number, + column1Row0?: number, + column2Row0?: number, + column0Row1?: number, + column1Row1?: number, + column2Row1?: number, + column0Row2?: number, + column1Row2?: number, + column2Row2?: number, + ); + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: Matrix3, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new Matrix3 instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: Matrix3, + ): Matrix3; + /** + * Flattens an array of Matrix3s into an array of components. The components + * are stored in column-major order. + * @param array - The array of matrices to pack. + * @param [result] - The array onto which to store the result. If this is a typed array, it must have array.length * 9 components, else a {@link DeveloperError} will be thrown. If it is a regular array, it will be resized to have (array.length * 9) elements. + * @returns The packed array. + */ + static packArray(array: Matrix3[], result?: number[]): number[]; + /** + * Unpacks an array of column-major matrix components into an array of Matrix3s. + * @param array - The array of components to unpack. + * @param [result] - The array onto which to store the result. + * @returns The unpacked array. + */ + static unpackArray(array: number[], result?: Matrix3[]): Matrix3[]; + /** + * Duplicates a Matrix3 instance. + * @param matrix - The matrix to duplicate. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Matrix3 instance if one was not provided. (Returns undefined if matrix is undefined) + */ + static clone(matrix: Matrix3, result?: Matrix3): Matrix3; + /** + * Creates a Matrix3 from 9 consecutive elements in an array. + * @example + * // Create the Matrix3: + * // [1.0, 2.0, 3.0] + * // [1.0, 2.0, 3.0] + * // [1.0, 2.0, 3.0] + * + * const v = [1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 3.0, 3.0, 3.0]; + * const m = Cesium.Matrix3.fromArray(v); + * + * // Create same Matrix3 with using an offset into an array + * const v2 = [0.0, 0.0, 1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 3.0, 3.0, 3.0]; + * const m2 = Cesium.Matrix3.fromArray(v2, 2); + * @param array - The array whose 9 consecutive elements correspond to the positions of the matrix. Assumes column-major order. + * @param [startingIndex = 0] - The offset into the array of the first element, which corresponds to first column first row position in the matrix. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Matrix3 instance if one was not provided. + */ + static fromArray( + array: number[], + startingIndex?: number, + result?: Matrix3, + ): Matrix3; + /** + * Creates a Matrix3 instance from a column-major order array. + * @param values - The column-major order array. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix3 instance if one was not provided. + */ + static fromColumnMajorArray(values: number[], result?: Matrix3): Matrix3; + /** + * Creates a Matrix3 instance from a row-major order array. + * The resulting matrix will be in column-major order. + * @param values - The row-major order array. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix3 instance if one was not provided. + */ + static fromRowMajorArray(values: number[], result?: Matrix3): Matrix3; + /** + * Computes a 3x3 rotation matrix from the provided quaternion. + * @param quaternion - the quaternion to use. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The 3x3 rotation matrix from this quaternion. + */ + static fromQuaternion(quaternion: Quaternion, result?: Matrix3): Matrix3; + /** + * Computes a 3x3 rotation matrix from the provided headingPitchRoll. (see http://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles ) + * @param headingPitchRoll - the headingPitchRoll to use. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The 3x3 rotation matrix from this headingPitchRoll. + */ + static fromHeadingPitchRoll( + headingPitchRoll: HeadingPitchRoll, + result?: Matrix3, + ): Matrix3; + /** + * Computes a Matrix3 instance representing a non-uniform scale. + * @example + * // Creates + * // [7.0, 0.0, 0.0] + * // [0.0, 8.0, 0.0] + * // [0.0, 0.0, 9.0] + * const m = Cesium.Matrix3.fromScale(new Cesium.Cartesian3(7.0, 8.0, 9.0)); + * @param scale - The x, y, and z scale factors. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix3 instance if one was not provided. + */ + static fromScale(scale: Cartesian3, result?: Matrix3): Matrix3; + /** + * Computes a Matrix3 instance representing a uniform scale. + * @example + * // Creates + * // [2.0, 0.0, 0.0] + * // [0.0, 2.0, 0.0] + * // [0.0, 0.0, 2.0] + * const m = Cesium.Matrix3.fromUniformScale(2.0); + * @param scale - The uniform scale factor. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix3 instance if one was not provided. + */ + static fromUniformScale(scale: number, result?: Matrix3): Matrix3; + /** + * Computes a Matrix3 instance representing the cross product equivalent matrix of a Cartesian3 vector. + * @example + * // Creates + * // [0.0, -9.0, 8.0] + * // [9.0, 0.0, -7.0] + * // [-8.0, 7.0, 0.0] + * const m = Cesium.Matrix3.fromCrossProduct(new Cesium.Cartesian3(7.0, 8.0, 9.0)); + * @param vector - the vector on the left hand side of the cross product operation. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix3 instance if one was not provided. + */ + static fromCrossProduct(vector: Cartesian3, result?: Matrix3): Matrix3; + /** + * Creates a rotation matrix around the x-axis. + * @example + * // Rotate a point 45 degrees counterclockwise around the x-axis. + * const p = new Cesium.Cartesian3(5, 6, 7); + * const m = Cesium.Matrix3.fromRotationX(Cesium.Math.toRadians(45.0)); + * const rotated = Cesium.Matrix3.multiplyByVector(m, p, new Cesium.Cartesian3()); + * @param angle - The angle, in radians, of the rotation. Positive angles are counterclockwise. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix3 instance if one was not provided. + */ + static fromRotationX(angle: number, result?: Matrix3): Matrix3; + /** + * Creates a rotation matrix around the y-axis. + * @example + * // Rotate a point 45 degrees counterclockwise around the y-axis. + * const p = new Cesium.Cartesian3(5, 6, 7); + * const m = Cesium.Matrix3.fromRotationY(Cesium.Math.toRadians(45.0)); + * const rotated = Cesium.Matrix3.multiplyByVector(m, p, new Cesium.Cartesian3()); + * @param angle - The angle, in radians, of the rotation. Positive angles are counterclockwise. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix3 instance if one was not provided. + */ + static fromRotationY(angle: number, result?: Matrix3): Matrix3; + /** + * Creates a rotation matrix around the z-axis. + * @example + * // Rotate a point 45 degrees counterclockwise around the z-axis. + * const p = new Cesium.Cartesian3(5, 6, 7); + * const m = Cesium.Matrix3.fromRotationZ(Cesium.Math.toRadians(45.0)); + * const rotated = Cesium.Matrix3.multiplyByVector(m, p, new Cesium.Cartesian3()); + * @param angle - The angle, in radians, of the rotation. Positive angles are counterclockwise. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix3 instance if one was not provided. + */ + static fromRotationZ(angle: number, result?: Matrix3): Matrix3; + /** + * Creates an Array from the provided Matrix3 instance. + * The array will be in column-major order. + * @param matrix - The matrix to use.. + * @param [result] - The Array onto which to store the result. + * @returns The modified Array parameter or a new Array instance if one was not provided. + */ + static toArray(matrix: Matrix3, result?: number[]): number[]; + /** + * Computes the array index of the element at the provided row and column. + * @example + * const myMatrix = new Cesium.Matrix3(); + * const column1Row0Index = Cesium.Matrix3.getElementIndex(1, 0); + * const column1Row0 = myMatrix[column1Row0Index] + * myMatrix[column1Row0Index] = 10.0; + * @param column - The zero-based index of the column. + * @param row - The zero-based index of the row. + * @returns The index of the element at the provided row and column. + */ + static getElementIndex(column: number, row: number): number; + /** + * Retrieves a copy of the matrix column at the provided index as a Cartesian3 instance. + * @param matrix - The matrix to use. + * @param index - The zero-based index of the column to retrieve. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static getColumn( + matrix: Matrix3, + index: number, + result: Cartesian3, + ): Cartesian3; + /** + * Computes a new matrix that replaces the specified column in the provided matrix with the provided Cartesian3 instance. + * @param matrix - The matrix to use. + * @param index - The zero-based index of the column to set. + * @param cartesian - The Cartesian whose values will be assigned to the specified column. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static setColumn( + matrix: Matrix3, + index: number, + cartesian: Cartesian3, + result: Matrix3, + ): Matrix3; + /** + * Retrieves a copy of the matrix row at the provided index as a Cartesian3 instance. + * @param matrix - The matrix to use. + * @param index - The zero-based index of the row to retrieve. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static getRow( + matrix: Matrix3, + index: number, + result: Cartesian3, + ): Cartesian3; + /** + * Computes a new matrix that replaces the specified row in the provided matrix with the provided Cartesian3 instance. + * @param matrix - The matrix to use. + * @param index - The zero-based index of the row to set. + * @param cartesian - The Cartesian whose values will be assigned to the specified row. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static setRow( + matrix: Matrix3, + index: number, + cartesian: Cartesian3, + result: Matrix3, + ): Matrix3; + /** + * Computes a new matrix that replaces the scale with the provided scale. + * This assumes the matrix is an affine transformation. + * @param matrix - The matrix to use. + * @param scale - The scale that replaces the scale of the provided matrix. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static setScale( + matrix: Matrix3, + scale: Cartesian3, + result: Matrix3, + ): Matrix3; + /** + * Computes a new matrix that replaces the scale with the provided uniform scale. + * This assumes the matrix is an affine transformation. + * @param matrix - The matrix to use. + * @param scale - The uniform scale that replaces the scale of the provided matrix. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static setUniformScale( + matrix: Matrix3, + scale: number, + result: Matrix3, + ): Matrix3; + /** + * Extracts the non-uniform scale assuming the matrix is an affine transformation. + * @param matrix - The matrix. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static getScale(matrix: Matrix3, result: Cartesian3): Cartesian3; + /** + * Computes the maximum scale assuming the matrix is an affine transformation. + * The maximum scale is the maximum length of the column vectors. + * @param matrix - The matrix. + * @returns The maximum scale. + */ + static getMaximumScale(matrix: Matrix3): number; + /** + * Sets the rotation assuming the matrix is an affine transformation. + * @param matrix - The matrix. + * @param rotation - The rotation matrix. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static setRotation( + matrix: Matrix3, + rotation: Matrix3, + result: Matrix3, + ): Matrix3; + /** + * Extracts the rotation matrix assuming the matrix is an affine transformation. + * @param matrix - The matrix. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static getRotation(matrix: Matrix3, result: Matrix3): Matrix3; + /** + * Computes the product of two matrices. + * @param left - The first matrix. + * @param right - The second matrix. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiply(left: Matrix3, right: Matrix3, result: Matrix3): Matrix3; + /** + * Computes the sum of two matrices. + * @param left - The first matrix. + * @param right - The second matrix. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static add(left: Matrix3, right: Matrix3, result: Matrix3): Matrix3; + /** + * Computes the difference of two matrices. + * @param left - The first matrix. + * @param right - The second matrix. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static subtract(left: Matrix3, right: Matrix3, result: Matrix3): Matrix3; + /** + * Computes the product of a matrix and a column vector. + * @param matrix - The matrix. + * @param cartesian - The column. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyByVector( + matrix: Matrix3, + cartesian: Cartesian3, + result: Cartesian3, + ): Cartesian3; + /** + * Computes the product of a matrix and a scalar. + * @param matrix - The matrix. + * @param scalar - The number to multiply by. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyByScalar( + matrix: Matrix3, + scalar: number, + result: Matrix3, + ): Matrix3; + /** + * Computes the product of a matrix times a (non-uniform) scale, as if the scale were a scale matrix. + * @example + * // Instead of Cesium.Matrix3.multiply(m, Cesium.Matrix3.fromScale(scale), m); + * Cesium.Matrix3.multiplyByScale(m, scale, m); + * @param matrix - The matrix on the left-hand side. + * @param scale - The non-uniform scale on the right-hand side. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyByScale( + matrix: Matrix3, + scale: Cartesian3, + result: Matrix3, + ): Matrix3; + /** + * Computes the product of a matrix times a uniform scale, as if the scale were a scale matrix. + * @example + * // Instead of Cesium.Matrix3.multiply(m, Cesium.Matrix3.fromUniformScale(scale), m); + * Cesium.Matrix3.multiplyByUniformScale(m, scale, m); + * @param matrix - The matrix on the left-hand side. + * @param scale - The uniform scale on the right-hand side. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyByUniformScale( + matrix: Matrix3, + scale: number, + result: Matrix3, + ): Matrix3; + /** + * Creates a negated copy of the provided matrix. + * @param matrix - The matrix to negate. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static negate(matrix: Matrix3, result: Matrix3): Matrix3; + /** + * Computes the transpose of the provided matrix. + * @param matrix - The matrix to transpose. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static transpose(matrix: Matrix3, result: Matrix3): Matrix3; + /** + * Computes the eigenvectors and eigenvalues of a symmetric matrix. + *

+ * Returns a diagonal matrix and unitary matrix such that: + * matrix = unitary matrix * diagonal matrix * transpose(unitary matrix) + *

+ *

+ * The values along the diagonal of the diagonal matrix are the eigenvalues. The columns + * of the unitary matrix are the corresponding eigenvectors. + *

+ * @example + * const a = //... symetric matrix + * const result = { + * unitary : new Cesium.Matrix3(), + * diagonal : new Cesium.Matrix3() + * }; + * Cesium.Matrix3.computeEigenDecomposition(a, result); + * + * const unitaryTranspose = Cesium.Matrix3.transpose(result.unitary, new Cesium.Matrix3()); + * const b = Cesium.Matrix3.multiply(result.unitary, result.diagonal, new Cesium.Matrix3()); + * Cesium.Matrix3.multiply(b, unitaryTranspose, b); // b is now equal to a + * + * const lambda = Cesium.Matrix3.getColumn(result.diagonal, 0, new Cesium.Cartesian3()).x; // first eigenvalue + * const v = Cesium.Matrix3.getColumn(result.unitary, 0, new Cesium.Cartesian3()); // first eigenvector + * const c = Cesium.Cartesian3.multiplyByScalar(v, lambda, new Cesium.Cartesian3()); // equal to Cesium.Matrix3.multiplyByVector(a, v) + * @param matrix - The matrix to decompose into diagonal and unitary matrix. Expected to be symmetric. + * @param [result] - An object with unitary and diagonal properties which are matrices onto which to store the result. + * @returns An object with unitary and diagonal properties which are the unitary and diagonal matrices, respectively. + */ + static computeEigenDecomposition(matrix: Matrix3, result?: any): any; + /** + * Computes a matrix, which contains the absolute (unsigned) values of the provided matrix's elements. + * @param matrix - The matrix with signed elements. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static abs(matrix: Matrix3, result: Matrix3): Matrix3; + /** + * Computes the determinant of the provided matrix. + * @param matrix - The matrix to use. + * @returns The value of the determinant of the matrix. + */ + static determinant(matrix: Matrix3): number; + /** + * Computes the inverse of the provided matrix. + * @param matrix - The matrix to invert. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static inverse(matrix: Matrix3, result: Matrix3): Matrix3; + /** + * Computes the inverse transpose of a matrix. + * @param matrix - The matrix to transpose and invert. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static inverseTranspose(matrix: Matrix3, result: Matrix3): Matrix3; + /** + * Compares the provided matrices componentwise and returns + * true if they are equal, false otherwise. + * @param [left] - The first matrix. + * @param [right] - The second matrix. + * @returns true if left and right are equal, false otherwise. + */ + static equals(left?: Matrix3, right?: Matrix3): boolean; + /** + * Compares the provided matrices componentwise and returns + * true if they are within the provided epsilon, + * false otherwise. + * @param [left] - The first matrix. + * @param [right] - The second matrix. + * @param [epsilon = 0] - The epsilon to use for equality testing. + * @returns true if left and right are within the provided epsilon, false otherwise. + */ + static equalsEpsilon( + left?: Matrix3, + right?: Matrix3, + epsilon?: number, + ): boolean; + /** + * An immutable Matrix3 instance initialized to the identity matrix. + */ + static readonly IDENTITY: Matrix3; + /** + * An immutable Matrix3 instance initialized to the zero matrix. + */ + static readonly ZERO: Matrix3; + /** + * The index into Matrix3 for column 0, row 0. + */ + static readonly COLUMN0ROW0: number; + /** + * The index into Matrix3 for column 0, row 1. + */ + static readonly COLUMN0ROW1: number; + /** + * The index into Matrix3 for column 0, row 2. + */ + static readonly COLUMN0ROW2: number; + /** + * The index into Matrix3 for column 1, row 0. + */ + static readonly COLUMN1ROW0: number; + /** + * The index into Matrix3 for column 1, row 1. + */ + static readonly COLUMN1ROW1: number; + /** + * The index into Matrix3 for column 1, row 2. + */ + static readonly COLUMN1ROW2: number; + /** + * The index into Matrix3 for column 2, row 0. + */ + static readonly COLUMN2ROW0: number; + /** + * The index into Matrix3 for column 2, row 1. + */ + static readonly COLUMN2ROW1: number; + /** + * The index into Matrix3 for column 2, row 2. + */ + static readonly COLUMN2ROW2: number; + /** + * Gets the number of items in the collection. + */ + length: number; + /** + * Duplicates the provided Matrix3 instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Matrix3 instance if one was not provided. + */ + clone(result?: Matrix3): Matrix3; + /** + * Compares this matrix to the provided matrix componentwise and returns + * true if they are equal, false otherwise. + * @param [right] - The right hand side matrix. + * @returns true if they are equal, false otherwise. + */ + equals(right?: Matrix3): boolean; + /** + * Compares this matrix to the provided matrix componentwise and returns + * true if they are within the provided epsilon, + * false otherwise. + * @param [right] - The right hand side matrix. + * @param [epsilon = 0] - The epsilon to use for equality testing. + * @returns true if they are within the provided epsilon, false otherwise. + */ + equalsEpsilon(right?: Matrix3, epsilon?: number): boolean; + /** + * Creates a string representing this Matrix with each row being + * on a separate line and in the format '(column0, column1, column2)'. + * @returns A string representing the provided Matrix with each row being on a separate line and in the format '(column0, column1, column2)'. + */ + toString(): string; + } + + export interface Matrix4 extends ArrayLike {} + + /** + * A 4x4 matrix, indexable as a column-major order array. + * Constructor parameters are in row-major order for code readability. + * @param [column0Row0 = 0.0] - The value for column 0, row 0. + * @param [column1Row0 = 0.0] - The value for column 1, row 0. + * @param [column2Row0 = 0.0] - The value for column 2, row 0. + * @param [column3Row0 = 0.0] - The value for column 3, row 0. + * @param [column0Row1 = 0.0] - The value for column 0, row 1. + * @param [column1Row1 = 0.0] - The value for column 1, row 1. + * @param [column2Row1 = 0.0] - The value for column 2, row 1. + * @param [column3Row1 = 0.0] - The value for column 3, row 1. + * @param [column0Row2 = 0.0] - The value for column 0, row 2. + * @param [column1Row2 = 0.0] - The value for column 1, row 2. + * @param [column2Row2 = 0.0] - The value for column 2, row 2. + * @param [column3Row2 = 0.0] - The value for column 3, row 2. + * @param [column0Row3 = 0.0] - The value for column 0, row 3. + * @param [column1Row3 = 0.0] - The value for column 1, row 3. + * @param [column2Row3 = 0.0] - The value for column 2, row 3. + * @param [column3Row3 = 0.0] - The value for column 3, row 3. + */ + export class Matrix4 implements ArrayLike { + constructor( + column0Row0?: number, + column1Row0?: number, + column2Row0?: number, + column3Row0?: number, + column0Row1?: number, + column1Row1?: number, + column2Row1?: number, + column3Row1?: number, + column0Row2?: number, + column1Row2?: number, + column2Row2?: number, + column3Row2?: number, + column0Row3?: number, + column1Row3?: number, + column2Row3?: number, + column3Row3?: number, + ); + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: Matrix4, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new Matrix4 instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: Matrix4, + ): Matrix4; + /** + * Flattens an array of Matrix4s into an array of components. The components + * are stored in column-major order. + * @param array - The array of matrices to pack. + * @param [result] - The array onto which to store the result. If this is a typed array, it must have array.length * 16 components, else a {@link DeveloperError} will be thrown. If it is a regular array, it will be resized to have (array.length * 16) elements. + * @returns The packed array. + */ + static packArray(array: Matrix4[], result?: number[]): number[]; + /** + * Unpacks an array of column-major matrix components into an array of Matrix4s. + * @param array - The array of components to unpack. + * @param [result] - The array onto which to store the result. + * @returns The unpacked array. + */ + static unpackArray(array: number[], result?: Matrix4[]): Matrix4[]; + /** + * Duplicates a Matrix4 instance. + * @param matrix - The matrix to duplicate. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Matrix4 instance if one was not provided. (Returns undefined if matrix is undefined) + */ + static clone(matrix: Matrix4, result?: Matrix4): Matrix4; + /** + * Creates a Matrix4 from 16 consecutive elements in an array. + * @example + * // Create the Matrix4: + * // [1.0, 2.0, 3.0, 4.0] + * // [1.0, 2.0, 3.0, 4.0] + * // [1.0, 2.0, 3.0, 4.0] + * // [1.0, 2.0, 3.0, 4.0] + * + * const v = [1.0, 1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 2.0, 3.0, 3.0, 3.0, 3.0, 4.0, 4.0, 4.0, 4.0]; + * const m = Cesium.Matrix4.fromArray(v); + * + * // Create same Matrix4 with using an offset into an array + * const v2 = [0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 2.0, 3.0, 3.0, 3.0, 3.0, 4.0, 4.0, 4.0, 4.0]; + * const m2 = Cesium.Matrix4.fromArray(v2, 2); + * @param array - The array whose 16 consecutive elements correspond to the positions of the matrix. Assumes column-major order. + * @param [startingIndex = 0] - The offset into the array of the first element, which corresponds to first column first row position in the matrix. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Matrix4 instance if one was not provided. + */ + static fromArray( + array: number[], + startingIndex?: number, + result?: Matrix4, + ): Matrix4; + /** + * Computes a Matrix4 instance from a column-major order array. + * @param values - The column-major order array. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix4 instance if one was not provided. + */ + static fromColumnMajorArray(values: number[], result?: Matrix4): Matrix4; + /** + * Computes a Matrix4 instance from a row-major order array. + * The resulting matrix will be in column-major order. + * @param values - The row-major order array. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix4 instance if one was not provided. + */ + static fromRowMajorArray(values: number[], result?: Matrix4): Matrix4; + /** + * Computes a Matrix4 instance from a Matrix3 representing the rotation + * and a Cartesian3 representing the translation. + * @param rotation - The upper left portion of the matrix representing the rotation. + * @param [translation = Cartesian3.ZERO] - The upper right portion of the matrix representing the translation. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix4 instance if one was not provided. + */ + static fromRotationTranslation( + rotation: Matrix3, + translation?: Cartesian3, + result?: Matrix4, + ): Matrix4; + /** + * Computes a Matrix4 instance from a translation, rotation, and scale (TRS) + * representation with the rotation represented as a quaternion. + * @example + * const result = Cesium.Matrix4.fromTranslationQuaternionRotationScale( + * new Cesium.Cartesian3(1.0, 2.0, 3.0), // translation + * Cesium.Quaternion.IDENTITY, // rotation + * new Cesium.Cartesian3(7.0, 8.0, 9.0), // scale + * result); + * @param translation - The translation transformation. + * @param rotation - The rotation transformation. + * @param scale - The non-uniform scale transformation. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix4 instance if one was not provided. + */ + static fromTranslationQuaternionRotationScale( + translation: Cartesian3, + rotation: Quaternion, + scale: Cartesian3, + result?: Matrix4, + ): Matrix4; + /** + * Creates a Matrix4 instance from a {@link TranslationRotationScale} instance. + * @param translationRotationScale - The instance. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix4 instance if one was not provided. + */ + static fromTranslationRotationScale( + translationRotationScale: TranslationRotationScale, + result?: Matrix4, + ): Matrix4; + /** + * Creates a Matrix4 instance from a Cartesian3 representing the translation. + * @param translation - The upper right portion of the matrix representing the translation. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix4 instance if one was not provided. + */ + static fromTranslation(translation: Cartesian3, result?: Matrix4): Matrix4; + /** + * Computes a Matrix4 instance representing a non-uniform scale. + * @example + * // Creates + * // [7.0, 0.0, 0.0, 0.0] + * // [0.0, 8.0, 0.0, 0.0] + * // [0.0, 0.0, 9.0, 0.0] + * // [0.0, 0.0, 0.0, 1.0] + * const m = Cesium.Matrix4.fromScale(new Cesium.Cartesian3(7.0, 8.0, 9.0)); + * @param scale - The x, y, and z scale factors. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix4 instance if one was not provided. + */ + static fromScale(scale: Cartesian3, result?: Matrix4): Matrix4; + /** + * Computes a Matrix4 instance representing a uniform scale. + * @example + * // Creates + * // [2.0, 0.0, 0.0, 0.0] + * // [0.0, 2.0, 0.0, 0.0] + * // [0.0, 0.0, 2.0, 0.0] + * // [0.0, 0.0, 0.0, 1.0] + * const m = Cesium.Matrix4.fromUniformScale(2.0); + * @param scale - The uniform scale factor. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix4 instance if one was not provided. + */ + static fromUniformScale(scale: number, result?: Matrix4): Matrix4; + /** + * Creates a rotation matrix. + * @param rotation - The rotation matrix. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix4 instance if one was not provided. + */ + static fromRotation(rotation: Matrix3, result?: Matrix4): Matrix4; + /** + * Computes a Matrix4 instance from a Camera. + * @param camera - The camera to use. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new Matrix4 instance if one was not provided. + */ + static fromCamera(camera: Camera, result?: Matrix4): Matrix4; + /** + * Computes a Matrix4 instance representing a perspective transformation matrix. + * @param fovY - The field of view along the Y axis in radians. + * @param aspectRatio - The aspect ratio. + * @param near - The distance to the near plane in meters. + * @param far - The distance to the far plane in meters. + * @param result - The object in which the result will be stored. + * @returns The modified result parameter. + */ + static computePerspectiveFieldOfView( + fovY: number, + aspectRatio: number, + near: number, + far: number, + result: Matrix4, + ): Matrix4; + /** + * Computes a Matrix4 instance representing an orthographic transformation matrix. + * @param left - The number of meters to the left of the camera that will be in view. + * @param right - The number of meters to the right of the camera that will be in view. + * @param bottom - The number of meters below of the camera that will be in view. + * @param top - The number of meters above of the camera that will be in view. + * @param near - The distance to the near plane in meters. + * @param far - The distance to the far plane in meters. + * @param result - The object in which the result will be stored. + * @returns The modified result parameter. + */ + static computeOrthographicOffCenter( + left: number, + right: number, + bottom: number, + top: number, + near: number, + far: number, + result: Matrix4, + ): Matrix4; + /** + * Computes a Matrix4 instance representing an off center perspective transformation. + * @param left - The number of meters to the left of the camera that will be in view. + * @param right - The number of meters to the right of the camera that will be in view. + * @param bottom - The number of meters below the camera that will be in view. + * @param top - The number of meters above the camera that will be in view. + * @param near - The distance to the near plane in meters. + * @param far - The distance to the far plane in meters. + * @param result - The object in which the result will be stored. + * @returns The modified result parameter. + */ + static computePerspectiveOffCenter( + left: number, + right: number, + bottom: number, + top: number, + near: number, + far: number, + result: Matrix4, + ): Matrix4; + /** + * Computes a Matrix4 instance representing an infinite off center perspective transformation. + * @param left - The number of meters to the left of the camera that will be in view. + * @param right - The number of meters to the right of the camera that will be in view. + * @param bottom - The number of meters below of the camera that will be in view. + * @param top - The number of meters above of the camera that will be in view. + * @param near - The distance to the near plane in meters. + * @param result - The object in which the result will be stored. + * @returns The modified result parameter. + */ + static computeInfinitePerspectiveOffCenter( + left: number, + right: number, + bottom: number, + top: number, + near: number, + result: Matrix4, + ): Matrix4; + /** + * Computes a Matrix4 instance that transforms from normalized device coordinates to window coordinates. + * @example + * // Create viewport transformation using an explicit viewport and depth range. + * const m = Cesium.Matrix4.computeViewportTransformation({ + * x : 0.0, + * y : 0.0, + * width : 1024.0, + * height : 768.0 + * }, 0.0, 1.0, new Cesium.Matrix4()); + * @param [viewport = { x : 0.0, y : 0.0, width : 0.0, height : 0.0 }] - The viewport's corners as shown in Example 1. + * @param [nearDepthRange = 0.0] - The near plane distance in window coordinates. + * @param [farDepthRange = 1.0] - The far plane distance in window coordinates. + * @param [result] - The object in which the result will be stored. + * @returns The modified result parameter. + */ + static computeViewportTransformation( + viewport?: any, + nearDepthRange?: number, + farDepthRange?: number, + result?: Matrix4, + ): Matrix4; + /** + * Computes a Matrix4 instance that transforms from world space to view space. + * @param position - The position of the camera. + * @param direction - The forward direction. + * @param up - The up direction. + * @param right - The right direction. + * @param result - The object in which the result will be stored. + * @returns The modified result parameter. + */ + static computeView( + position: Cartesian3, + direction: Cartesian3, + up: Cartesian3, + right: Cartesian3, + result: Matrix4, + ): Matrix4; + /** + * Computes an Array from the provided Matrix4 instance. + * The array will be in column-major order. + * @example + * //create an array from an instance of Matrix4 + * // m = [10.0, 14.0, 18.0, 22.0] + * // [11.0, 15.0, 19.0, 23.0] + * // [12.0, 16.0, 20.0, 24.0] + * // [13.0, 17.0, 21.0, 25.0] + * const a = Cesium.Matrix4.toArray(m); + * + * // m remains the same + * //creates a = [10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 24.0, 25.0] + * @param matrix - The matrix to use.. + * @param [result] - The Array onto which to store the result. + * @returns The modified Array parameter or a new Array instance if one was not provided. + */ + static toArray(matrix: Matrix4, result?: number[]): number[]; + /** + * Computes the array index of the element at the provided row and column. + * @example + * const myMatrix = new Cesium.Matrix4(); + * const column1Row0Index = Cesium.Matrix4.getElementIndex(1, 0); + * const column1Row0 = myMatrix[column1Row0Index]; + * myMatrix[column1Row0Index] = 10.0; + * @param row - The zero-based index of the row. + * @param column - The zero-based index of the column. + * @returns The index of the element at the provided row and column. + */ + static getElementIndex(row: number, column: number): number; + /** + * Retrieves a copy of the matrix column at the provided index as a Cartesian4 instance. + * @example + * //returns a Cartesian4 instance with values from the specified column + * // m = [10.0, 11.0, 12.0, 13.0] + * // [14.0, 15.0, 16.0, 17.0] + * // [18.0, 19.0, 20.0, 21.0] + * // [22.0, 23.0, 24.0, 25.0] + * + * //Example 1: Creates an instance of Cartesian + * const a = Cesium.Matrix4.getColumn(m, 2, new Cesium.Cartesian4()); + * @example + * //Example 2: Sets values for Cartesian instance + * const a = new Cesium.Cartesian4(); + * Cesium.Matrix4.getColumn(m, 2, a); + * + * // a.x = 12.0; a.y = 16.0; a.z = 20.0; a.w = 24.0; + * @param matrix - The matrix to use. + * @param index - The zero-based index of the column to retrieve. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static getColumn( + matrix: Matrix4, + index: number, + result: Cartesian4, + ): Cartesian4; + /** + * Computes a new matrix that replaces the specified column in the provided matrix with the provided Cartesian4 instance. + * @example + * //creates a new Matrix4 instance with new column values from the Cartesian4 instance + * // m = [10.0, 11.0, 12.0, 13.0] + * // [14.0, 15.0, 16.0, 17.0] + * // [18.0, 19.0, 20.0, 21.0] + * // [22.0, 23.0, 24.0, 25.0] + * + * const a = Cesium.Matrix4.setColumn(m, 2, new Cesium.Cartesian4(99.0, 98.0, 97.0, 96.0), new Cesium.Matrix4()); + * + * // m remains the same + * // a = [10.0, 11.0, 99.0, 13.0] + * // [14.0, 15.0, 98.0, 17.0] + * // [18.0, 19.0, 97.0, 21.0] + * // [22.0, 23.0, 96.0, 25.0] + * @param matrix - The matrix to use. + * @param index - The zero-based index of the column to set. + * @param cartesian - The Cartesian whose values will be assigned to the specified column. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static setColumn( + matrix: Matrix4, + index: number, + cartesian: Cartesian4, + result: Matrix4, + ): Matrix4; + /** + * Retrieves a copy of the matrix row at the provided index as a Cartesian4 instance. + * @example + * //returns a Cartesian4 instance with values from the specified column + * // m = [10.0, 11.0, 12.0, 13.0] + * // [14.0, 15.0, 16.0, 17.0] + * // [18.0, 19.0, 20.0, 21.0] + * // [22.0, 23.0, 24.0, 25.0] + * + * //Example 1: Returns an instance of Cartesian + * const a = Cesium.Matrix4.getRow(m, 2, new Cesium.Cartesian4()); + * @example + * //Example 2: Sets values for a Cartesian instance + * const a = new Cesium.Cartesian4(); + * Cesium.Matrix4.getRow(m, 2, a); + * + * // a.x = 18.0; a.y = 19.0; a.z = 20.0; a.w = 21.0; + * @param matrix - The matrix to use. + * @param index - The zero-based index of the row to retrieve. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static getRow( + matrix: Matrix4, + index: number, + result: Cartesian4, + ): Cartesian4; + /** + * Computes a new matrix that replaces the specified row in the provided matrix with the provided Cartesian4 instance. + * @example + * //create a new Matrix4 instance with new row values from the Cartesian4 instance + * // m = [10.0, 11.0, 12.0, 13.0] + * // [14.0, 15.0, 16.0, 17.0] + * // [18.0, 19.0, 20.0, 21.0] + * // [22.0, 23.0, 24.0, 25.0] + * + * const a = Cesium.Matrix4.setRow(m, 2, new Cesium.Cartesian4(99.0, 98.0, 97.0, 96.0), new Cesium.Matrix4()); + * + * // m remains the same + * // a = [10.0, 11.0, 12.0, 13.0] + * // [14.0, 15.0, 16.0, 17.0] + * // [99.0, 98.0, 97.0, 96.0] + * // [22.0, 23.0, 24.0, 25.0] + * @param matrix - The matrix to use. + * @param index - The zero-based index of the row to set. + * @param cartesian - The Cartesian whose values will be assigned to the specified row. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static setRow( + matrix: Matrix4, + index: number, + cartesian: Cartesian4, + result: Matrix4, + ): Matrix4; + /** + * Computes a new matrix that replaces the translation in the rightmost column of the provided + * matrix with the provided translation. This assumes the matrix is an affine transformation. + * @param matrix - The matrix to use. + * @param translation - The translation that replaces the translation of the provided matrix. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static setTranslation( + matrix: Matrix4, + translation: Cartesian3, + result: Matrix4, + ): Matrix4; + /** + * Computes a new matrix that replaces the scale with the provided scale. + * This assumes the matrix is an affine transformation. + * @param matrix - The matrix to use. + * @param scale - The scale that replaces the scale of the provided matrix. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static setScale( + matrix: Matrix4, + scale: Cartesian3, + result: Matrix4, + ): Matrix4; + /** + * Computes a new matrix that replaces the scale with the provided uniform scale. + * This assumes the matrix is an affine transformation. + * @param matrix - The matrix to use. + * @param scale - The uniform scale that replaces the scale of the provided matrix. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static setUniformScale( + matrix: Matrix4, + scale: number, + result: Matrix4, + ): Matrix4; + /** + * Extracts the non-uniform scale assuming the matrix is an affine transformation. + * @param matrix - The matrix. + * @param result - The object onto which to store the result. + * @returns The modified result parameter + */ + static getScale(matrix: Matrix4, result: Cartesian3): Cartesian3; + /** + * Computes the maximum scale assuming the matrix is an affine transformation. + * The maximum scale is the maximum length of the column vectors in the upper-left + * 3x3 matrix. + * @param matrix - The matrix. + * @returns The maximum scale. + */ + static getMaximumScale(matrix: Matrix4): number; + /** + * Sets the rotation assuming the matrix is an affine transformation. + * @param matrix - The matrix. + * @param rotation - The rotation matrix. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static setRotation( + matrix: Matrix4, + rotation: Matrix3, + result: Matrix4, + ): Matrix4; + /** + * Extracts the rotation matrix assuming the matrix is an affine transformation. + * @param matrix - The matrix. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static getRotation(matrix: Matrix4, result: Matrix3): Matrix3; + /** + * Computes the product of two matrices. + * @param left - The first matrix. + * @param right - The second matrix. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiply(left: Matrix4, right: Matrix4, result: Matrix4): Matrix4; + /** + * Computes the sum of two matrices. + * @param left - The first matrix. + * @param right - The second matrix. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static add(left: Matrix4, right: Matrix4, result: Matrix4): Matrix4; + /** + * Computes the difference of two matrices. + * @param left - The first matrix. + * @param right - The second matrix. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static subtract(left: Matrix4, right: Matrix4, result: Matrix4): Matrix4; + /** + * Computes the product of two matrices assuming the matrices are affine transformation matrices, + * where the upper left 3x3 elements are any matrix, and + * the upper three elements in the fourth column are the translation. + * The bottom row is assumed to be [0, 0, 0, 1]. + * The matrix is not verified to be in the proper form. + * This method is faster than computing the product for general 4x4 + * matrices using {@link Matrix4.multiply}. + * @example + * const m1 = new Cesium.Matrix4(1.0, 6.0, 7.0, 0.0, 2.0, 5.0, 8.0, 0.0, 3.0, 4.0, 9.0, 0.0, 0.0, 0.0, 0.0, 1.0); + * const m2 = Cesium.Transforms.eastNorthUpToFixedFrame(new Cesium.Cartesian3(1.0, 1.0, 1.0)); + * const m3 = Cesium.Matrix4.multiplyTransformation(m1, m2, new Cesium.Matrix4()); + * @param left - The first matrix. + * @param right - The second matrix. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyTransformation( + left: Matrix4, + right: Matrix4, + result: Matrix4, + ): Matrix4; + /** + * Multiplies a transformation matrix (with a bottom row of [0.0, 0.0, 0.0, 1.0]) + * by a 3x3 rotation matrix. This is an optimization + * for Matrix4.multiply(m, Matrix4.fromRotationTranslation(rotation), m); with less allocations and arithmetic operations. + * @example + * // Instead of Cesium.Matrix4.multiply(m, Cesium.Matrix4.fromRotationTranslation(rotation), m); + * Cesium.Matrix4.multiplyByMatrix3(m, rotation, m); + * @param matrix - The matrix on the left-hand side. + * @param rotation - The 3x3 rotation matrix on the right-hand side. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyByMatrix3( + matrix: Matrix4, + rotation: Matrix3, + result: Matrix4, + ): Matrix4; + /** + * Multiplies a transformation matrix (with a bottom row of [0.0, 0.0, 0.0, 1.0]) + * by an implicit translation matrix defined by a {@link Cartesian3}. This is an optimization + * for Matrix4.multiply(m, Matrix4.fromTranslation(position), m); with less allocations and arithmetic operations. + * @example + * // Instead of Cesium.Matrix4.multiply(m, Cesium.Matrix4.fromTranslation(position), m); + * Cesium.Matrix4.multiplyByTranslation(m, position, m); + * @param matrix - The matrix on the left-hand side. + * @param translation - The translation on the right-hand side. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyByTranslation( + matrix: Matrix4, + translation: Cartesian3, + result: Matrix4, + ): Matrix4; + /** + * Multiplies an affine transformation matrix (with a bottom row of [0.0, 0.0, 0.0, 1.0]) + * by an implicit non-uniform scale matrix. This is an optimization + * for Matrix4.multiply(m, Matrix4.fromUniformScale(scale), m);, where + * m must be an affine matrix. + * This function performs fewer allocations and arithmetic operations. + * @example + * // Instead of Cesium.Matrix4.multiply(m, Cesium.Matrix4.fromScale(scale), m); + * Cesium.Matrix4.multiplyByScale(m, scale, m); + * @param matrix - The affine matrix on the left-hand side. + * @param scale - The non-uniform scale on the right-hand side. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyByScale( + matrix: Matrix4, + scale: Cartesian3, + result: Matrix4, + ): Matrix4; + /** + * Computes the product of a matrix times a uniform scale, as if the scale were a scale matrix. + * @example + * // Instead of Cesium.Matrix4.multiply(m, Cesium.Matrix4.fromUniformScale(scale), m); + * Cesium.Matrix4.multiplyByUniformScale(m, scale, m); + * @param matrix - The matrix on the left-hand side. + * @param scale - The uniform scale on the right-hand side. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyByUniformScale( + matrix: Matrix4, + scale: number, + result: Matrix4, + ): Matrix4; + /** + * Computes the product of a matrix and a column vector. + * @param matrix - The matrix. + * @param cartesian - The vector. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyByVector( + matrix: Matrix4, + cartesian: Cartesian4, + result: Cartesian4, + ): Cartesian4; + /** + * Computes the product of a matrix and a {@link Cartesian3}. This is equivalent to calling {@link Matrix4.multiplyByVector} + * with a {@link Cartesian4} with a w component of zero. + * @example + * const p = new Cesium.Cartesian3(1.0, 2.0, 3.0); + * const result = Cesium.Matrix4.multiplyByPointAsVector(matrix, p, new Cesium.Cartesian3()); + * // A shortcut for + * // Cartesian3 p = ... + * // Cesium.Matrix4.multiplyByVector(matrix, new Cesium.Cartesian4(p.x, p.y, p.z, 0.0), result); + * @param matrix - The matrix. + * @param cartesian - The point. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyByPointAsVector( + matrix: Matrix4, + cartesian: Cartesian3, + result: Cartesian3, + ): Cartesian3; + /** + * Computes the product of a matrix and a {@link Cartesian3}. This is equivalent to calling {@link Matrix4.multiplyByVector} + * with a {@link Cartesian4} with a w component of 1, but returns a {@link Cartesian3} instead of a {@link Cartesian4}. + * @example + * const p = new Cesium.Cartesian3(1.0, 2.0, 3.0); + * const result = Cesium.Matrix4.multiplyByPoint(matrix, p, new Cesium.Cartesian3()); + * @param matrix - The matrix. + * @param cartesian - The point. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyByPoint( + matrix: Matrix4, + cartesian: Cartesian3, + result: Cartesian3, + ): Cartesian3; + /** + * Computes the product of a matrix and a scalar. + * @example + * //create a Matrix4 instance which is a scaled version of the supplied Matrix4 + * // m = [10.0, 11.0, 12.0, 13.0] + * // [14.0, 15.0, 16.0, 17.0] + * // [18.0, 19.0, 20.0, 21.0] + * // [22.0, 23.0, 24.0, 25.0] + * + * const a = Cesium.Matrix4.multiplyByScalar(m, -2, new Cesium.Matrix4()); + * + * // m remains the same + * // a = [-20.0, -22.0, -24.0, -26.0] + * // [-28.0, -30.0, -32.0, -34.0] + * // [-36.0, -38.0, -40.0, -42.0] + * // [-44.0, -46.0, -48.0, -50.0] + * @param matrix - The matrix. + * @param scalar - The number to multiply by. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyByScalar( + matrix: Matrix4, + scalar: number, + result: Matrix4, + ): Matrix4; + /** + * Computes a negated copy of the provided matrix. + * @example + * //create a new Matrix4 instance which is a negation of a Matrix4 + * // m = [10.0, 11.0, 12.0, 13.0] + * // [14.0, 15.0, 16.0, 17.0] + * // [18.0, 19.0, 20.0, 21.0] + * // [22.0, 23.0, 24.0, 25.0] + * + * const a = Cesium.Matrix4.negate(m, new Cesium.Matrix4()); + * + * // m remains the same + * // a = [-10.0, -11.0, -12.0, -13.0] + * // [-14.0, -15.0, -16.0, -17.0] + * // [-18.0, -19.0, -20.0, -21.0] + * // [-22.0, -23.0, -24.0, -25.0] + * @param matrix - The matrix to negate. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static negate(matrix: Matrix4, result: Matrix4): Matrix4; + /** + * Computes the transpose of the provided matrix. + * @example + * //returns transpose of a Matrix4 + * // m = [10.0, 11.0, 12.0, 13.0] + * // [14.0, 15.0, 16.0, 17.0] + * // [18.0, 19.0, 20.0, 21.0] + * // [22.0, 23.0, 24.0, 25.0] + * + * const a = Cesium.Matrix4.transpose(m, new Cesium.Matrix4()); + * + * // m remains the same + * // a = [10.0, 14.0, 18.0, 22.0] + * // [11.0, 15.0, 19.0, 23.0] + * // [12.0, 16.0, 20.0, 24.0] + * // [13.0, 17.0, 21.0, 25.0] + * @param matrix - The matrix to transpose. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static transpose(matrix: Matrix4, result: Matrix4): Matrix4; + /** + * Computes a matrix, which contains the absolute (unsigned) values of the provided matrix's elements. + * @param matrix - The matrix with signed elements. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static abs(matrix: Matrix4, result: Matrix4): Matrix4; + /** + * Compares the provided matrices componentwise and returns + * true if they are equal, false otherwise. + * @example + * //compares two Matrix4 instances + * + * // a = [10.0, 14.0, 18.0, 22.0] + * // [11.0, 15.0, 19.0, 23.0] + * // [12.0, 16.0, 20.0, 24.0] + * // [13.0, 17.0, 21.0, 25.0] + * + * // b = [10.0, 14.0, 18.0, 22.0] + * // [11.0, 15.0, 19.0, 23.0] + * // [12.0, 16.0, 20.0, 24.0] + * // [13.0, 17.0, 21.0, 25.0] + * + * if(Cesium.Matrix4.equals(a,b)) { + * console.log("Both matrices are equal"); + * } else { + * console.log("They are not equal"); + * } + * + * //Prints "Both matrices are equal" on the console + * @param [left] - The first matrix. + * @param [right] - The second matrix. + * @returns true if left and right are equal, false otherwise. + */ + static equals(left?: Matrix4, right?: Matrix4): boolean; + /** + * Compares the provided matrices componentwise and returns + * true if they are within the provided epsilon, + * false otherwise. + * @example + * //compares two Matrix4 instances + * + * // a = [10.5, 14.5, 18.5, 22.5] + * // [11.5, 15.5, 19.5, 23.5] + * // [12.5, 16.5, 20.5, 24.5] + * // [13.5, 17.5, 21.5, 25.5] + * + * // b = [10.0, 14.0, 18.0, 22.0] + * // [11.0, 15.0, 19.0, 23.0] + * // [12.0, 16.0, 20.0, 24.0] + * // [13.0, 17.0, 21.0, 25.0] + * + * if(Cesium.Matrix4.equalsEpsilon(a,b,0.1)){ + * console.log("Difference between both the matrices is less than 0.1"); + * } else { + * console.log("Difference between both the matrices is not less than 0.1"); + * } + * + * //Prints "Difference between both the matrices is not less than 0.1" on the console + * @param [left] - The first matrix. + * @param [right] - The second matrix. + * @param [epsilon = 0] - The epsilon to use for equality testing. + * @returns true if left and right are within the provided epsilon, false otherwise. + */ + static equalsEpsilon( + left?: Matrix4, + right?: Matrix4, + epsilon?: number, + ): boolean; + /** + * Gets the translation portion of the provided matrix, assuming the matrix is an affine transformation matrix. + * @param matrix - The matrix to use. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static getTranslation(matrix: Matrix4, result: Cartesian3): Cartesian3; + /** + * Gets the upper left 3x3 matrix of the provided matrix. + * @example + * // returns a Matrix3 instance from a Matrix4 instance + * + * // m = [10.0, 14.0, 18.0, 22.0] + * // [11.0, 15.0, 19.0, 23.0] + * // [12.0, 16.0, 20.0, 24.0] + * // [13.0, 17.0, 21.0, 25.0] + * + * const b = new Cesium.Matrix3(); + * Cesium.Matrix4.getMatrix3(m,b); + * + * // b = [10.0, 14.0, 18.0] + * // [11.0, 15.0, 19.0] + * // [12.0, 16.0, 20.0] + * @param matrix - The matrix to use. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static getMatrix3(matrix: Matrix4, result: Matrix3): Matrix3; + /** + * Computes the inverse of the provided matrix using Cramers Rule. + * If the determinant is zero, the matrix can not be inverted, and an exception is thrown. + * If the matrix is a proper rigid transformation, it is more efficient + * to invert it with {@link Matrix4.inverseTransformation}. + * @param matrix - The matrix to invert. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static inverse(matrix: Matrix4, result: Matrix4): Matrix4; + /** + * Computes the inverse of the provided matrix assuming it is a proper rigid matrix, + * where the upper left 3x3 elements are a rotation matrix, + * and the upper three elements in the fourth column are the translation. + * The bottom row is assumed to be [0, 0, 0, 1]. + * The matrix is not verified to be in the proper form. + * This method is faster than computing the inverse for a general 4x4 + * matrix using {@link Matrix4.inverse}. + * @param matrix - The matrix to invert. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static inverseTransformation(matrix: Matrix4, result: Matrix4): Matrix4; + /** + * Computes the inverse transpose of a matrix. + * @param matrix - The matrix to transpose and invert. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static inverseTranspose(matrix: Matrix4, result: Matrix4): Matrix4; + /** + * An immutable Matrix4 instance initialized to the identity matrix. + */ + static readonly IDENTITY: Matrix4; + /** + * An immutable Matrix4 instance initialized to the zero matrix. + */ + static readonly ZERO: Matrix4; + /** + * The index into Matrix4 for column 0, row 0. + */ + static readonly COLUMN0ROW0: number; + /** + * The index into Matrix4 for column 0, row 1. + */ + static readonly COLUMN0ROW1: number; + /** + * The index into Matrix4 for column 0, row 2. + */ + static readonly COLUMN0ROW2: number; + /** + * The index into Matrix4 for column 0, row 3. + */ + static readonly COLUMN0ROW3: number; + /** + * The index into Matrix4 for column 1, row 0. + */ + static readonly COLUMN1ROW0: number; + /** + * The index into Matrix4 for column 1, row 1. + */ + static readonly COLUMN1ROW1: number; + /** + * The index into Matrix4 for column 1, row 2. + */ + static readonly COLUMN1ROW2: number; + /** + * The index into Matrix4 for column 1, row 3. + */ + static readonly COLUMN1ROW3: number; + /** + * The index into Matrix4 for column 2, row 0. + */ + static readonly COLUMN2ROW0: number; + /** + * The index into Matrix4 for column 2, row 1. + */ + static readonly COLUMN2ROW1: number; + /** + * The index into Matrix4 for column 2, row 2. + */ + static readonly COLUMN2ROW2: number; + /** + * The index into Matrix4 for column 2, row 3. + */ + static readonly COLUMN2ROW3: number; + /** + * The index into Matrix4 for column 3, row 0. + */ + static readonly COLUMN3ROW0: number; + /** + * The index into Matrix4 for column 3, row 1. + */ + static readonly COLUMN3ROW1: number; + /** + * The index into Matrix4 for column 3, row 2. + */ + static readonly COLUMN3ROW2: number; + /** + * The index into Matrix4 for column 3, row 3. + */ + static readonly COLUMN3ROW3: number; + /** + * Gets the number of items in the collection. + */ + length: number; + /** + * Duplicates the provided Matrix4 instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Matrix4 instance if one was not provided. + */ + clone(result?: Matrix4): Matrix4; + /** + * Compares this matrix to the provided matrix componentwise and returns + * true if they are equal, false otherwise. + * @param [right] - The right hand side matrix. + * @returns true if they are equal, false otherwise. + */ + equals(right?: Matrix4): boolean; + /** + * Compares this matrix to the provided matrix componentwise and returns + * true if they are within the provided epsilon, + * false otherwise. + * @param [right] - The right hand side matrix. + * @param [epsilon = 0] - The epsilon to use for equality testing. + * @returns true if they are within the provided epsilon, false otherwise. + */ + equalsEpsilon(right?: Matrix4, epsilon?: number): boolean; + /** + * Computes a string representing this Matrix with each row being + * on a separate line and in the format '(column0, column1, column2, column3)'. + * @returns A string representing the provided Matrix with each row being on a separate line and in the format '(column0, column1, column2, column3)'. + */ + toString(): string; + } + + /** + * A spline that linearly interpolates over an array of weight values used by morph targets. + * @example + * const times = [ 0.0, 1.5, 3.0, 4.5, 6.0 ]; + * const weights = [0.0, 1.0, 0.25, 0.75, 0.5, 0.5, 0.75, 0.25, 1.0, 0.0]; //Two targets + * const spline = new Cesium.WeightSpline({ + * times : times, + * weights : weights + * }); + * + * const p0 = spline.evaluate(times[0]); + * @param options - Object with the following properties: + * @param options.times - An array of strictly increasing, unit-less, floating-point times at each point. + * The values are in no way connected to the clock time. They are the parameterization for the curve. + * @param options.weights - The array of floating-point control weights given. The weights are ordered such + * that all weights for the targets are given in chronological order and order in which they appear in + * the glTF from which the morph targets come. This means for 2 targets, weights = [w(0,0), w(0,1), w(1,0), w(1,1) ...] + * where i and j in w(i,j) are the time indices and target indices, respectively. + */ + export class MorphWeightSpline { + constructor(options: { times: number[]; weights: number[] }); + /** + * Finds an index i in times such that the parameter + * time is in the interval [times[i], times[i + 1]]. + * @param time - The time. + * @returns The index for the element at the start of the interval. + */ + findTimeInterval(time: number): number; + /** + * Wraps the given time to the period covered by the spline. + * @param time - The time. + * @returns The time, wrapped around to the updated animation. + */ + wrapTime(time: number): number; + /** + * Clamps the given time to the period covered by the spline. + * @param time - The time. + * @returns The time, clamped to the animation period. + */ + clampTime(time: number): number; + /** + * Evaluates the curve at a given time. + * @param time - The time at which to evaluate the curve. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance of the point on the curve at the given time. + */ + evaluate(time: number, result?: number[]): number[]; + } + + /** + * Represents a scalar value's lower and upper bound at a near distance and far distance in eye space. + * @param [near = 0.0] - The lower bound of the camera range. + * @param [nearValue = 0.0] - The value at the lower bound of the camera range. + * @param [far = 1.0] - The upper bound of the camera range. + * @param [farValue = 0.0] - The value at the upper bound of the camera range. + */ + export class NearFarScalar { + constructor( + near?: number, + nearValue?: number, + far?: number, + farValue?: number, + ); + /** + * The lower bound of the camera range. + */ + near: number; + /** + * The value at the lower bound of the camera range. + */ + nearValue: number; + /** + * The upper bound of the camera range. + */ + far: number; + /** + * The value at the upper bound of the camera range. + */ + farValue: number; + /** + * Duplicates a NearFarScalar instance. + * @param nearFarScalar - The NearFarScalar to duplicate. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new NearFarScalar instance if one was not provided. (Returns undefined if nearFarScalar is undefined) + */ + static clone( + nearFarScalar: NearFarScalar, + result?: NearFarScalar, + ): NearFarScalar; + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: NearFarScalar, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new NearFarScalar instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: NearFarScalar, + ): NearFarScalar; + /** + * Compares the provided NearFarScalar and returns true if they are equal, + * false otherwise. + * @param [left] - The first NearFarScalar. + * @param [right] - The second NearFarScalar. + * @returns true if left and right are equal; otherwise false. + */ + static equals(left?: NearFarScalar, right?: NearFarScalar): boolean; + /** + * Duplicates this instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new NearFarScalar instance if one was not provided. + */ + clone(result?: NearFarScalar): NearFarScalar; + /** + * Compares this instance to the provided NearFarScalar and returns true if they are equal, + * false otherwise. + * @param [right] - The right hand side NearFarScalar. + * @returns true if left and right are equal; otherwise false. + */ + equals(right?: NearFarScalar): boolean; + } + + /** + * Creates an Occluder derived from an object's position and radius, as well as the camera position. + * The occluder can be used to determine whether or not other objects are visible or hidden behind the + * visible horizon defined by the occluder and camera position. + * @example + * // Construct an occluder one unit away from the origin with a radius of one. + * const cameraPosition = Cesium.Cartesian3.ZERO; + * const occluderBoundingSphere = new Cesium.BoundingSphere(new Cesium.Cartesian3(0, 0, -1), 1); + * const occluder = new Cesium.Occluder(occluderBoundingSphere, cameraPosition); + * @param occluderBoundingSphere - The bounding sphere surrounding the occluder. + * @param cameraPosition - The coordinate of the viewer/camera. + */ + export class Occluder { + constructor( + occluderBoundingSphere: BoundingSphere, + cameraPosition: Cartesian3, + ); + /** + * The position of the occluder. + */ + position: Cartesian3; + /** + * The radius of the occluder. + */ + radius: number; + /** + * The position of the camera. + */ + cameraPosition: Cartesian3; + /** + * Creates an occluder from a bounding sphere and the camera position. + * @param occluderBoundingSphere - The bounding sphere surrounding the occluder. + * @param cameraPosition - The coordinate of the viewer/camera. + * @param [result] - The object onto which to store the result. + * @returns The occluder derived from an object's position and radius, as well as the camera position. + */ + static fromBoundingSphere( + occluderBoundingSphere: BoundingSphere, + cameraPosition: Cartesian3, + result?: Occluder, + ): Occluder; + /** + * Determines whether or not a point, the occludee, is hidden from view by the occluder. + * @example + * const cameraPosition = new Cesium.Cartesian3(0, 0, 0); + * const littleSphere = new Cesium.BoundingSphere(new Cesium.Cartesian3(0, 0, -1), 0.25); + * const occluder = new Cesium.Occluder(littleSphere, cameraPosition); + * const point = new Cesium.Cartesian3(0, 0, -3); + * occluder.isPointVisible(point); //returns true + * @param occludee - The point surrounding the occludee object. + * @returns true if the occludee is visible; otherwise false. + */ + isPointVisible(occludee: Cartesian3): boolean; + /** + * Determines whether or not a sphere, the occludee, is hidden from view by the occluder. + * @example + * const cameraPosition = new Cesium.Cartesian3(0, 0, 0); + * const littleSphere = new Cesium.BoundingSphere(new Cesium.Cartesian3(0, 0, -1), 0.25); + * const occluder = new Cesium.Occluder(littleSphere, cameraPosition); + * const bigSphere = new Cesium.BoundingSphere(new Cesium.Cartesian3(0, 0, -3), 1); + * occluder.isBoundingSphereVisible(bigSphere); //returns true + * @param occludee - The bounding sphere surrounding the occludee object. + * @returns true if the occludee is visible; otherwise false. + */ + isBoundingSphereVisible(occludee: BoundingSphere): boolean; + /** + * Determine to what extent an occludee is visible (not visible, partially visible, or fully visible). + * @example + * const sphere1 = new Cesium.BoundingSphere(new Cesium.Cartesian3(0, 0, -1.5), 0.5); + * const sphere2 = new Cesium.BoundingSphere(new Cesium.Cartesian3(0, 0, -2.5), 0.5); + * const cameraPosition = new Cesium.Cartesian3(0, 0, 0); + * const occluder = new Cesium.Occluder(sphere1, cameraPosition); + * occluder.computeVisibility(sphere2); //returns Visibility.NONE + * @param occludeeBS - The bounding sphere of the occludee. + * @returns Visibility.NONE if the occludee is not visible, + * Visibility.PARTIAL if the occludee is partially visible, or + * Visibility.FULL if the occludee is fully visible. + */ + computeVisibility(occludeeBS: BoundingSphere): Visibility; + /** + * Computes a point that can be used as the occludee position to the visibility functions. + * Use a radius of zero for the occludee radius. Typically, a user computes a bounding sphere around + * an object that is used for visibility; however it is also possible to compute a point that if + * seen/not seen would also indicate if an object is visible/not visible. This function is better + * called for objects that do not move relative to the occluder and is large, such as a chunk of + * terrain. You are better off not calling this and using the object's bounding sphere for objects + * such as a satellite or ground vehicle. + * @example + * const cameraPosition = new Cesium.Cartesian3(0, 0, 0); + * const occluderBoundingSphere = new Cesium.BoundingSphere(new Cesium.Cartesian3(0, 0, -8), 2); + * const occluder = new Cesium.Occluder(occluderBoundingSphere, cameraPosition); + * const positions = [new Cesium.Cartesian3(-0.25, 0, -5.3), new Cesium.Cartesian3(0.25, 0, -5.3)]; + * const tileOccluderSphere = Cesium.BoundingSphere.fromPoints(positions); + * const occludeePosition = tileOccluderSphere.center; + * const occludeePt = Cesium.Occluder.computeOccludeePoint(occluderBoundingSphere, occludeePosition, positions); + * @param occluderBoundingSphere - The bounding sphere surrounding the occluder. + * @param occludeePosition - The point where the occludee (bounding sphere of radius 0) is located. + * @param positions - List of altitude points on the horizon near the surface of the occluder. + * @returns An object containing two attributes: occludeePoint and valid + * which is a boolean value. + */ + static computeOccludeePoint( + occluderBoundingSphere: BoundingSphere, + occludeePosition: Cartesian3, + positions: Cartesian3[], + ): any; + /** + * Computes a point that can be used as the occludee position to the visibility functions from a rectangle. + * @param rectangle - The rectangle used to create a bounding sphere. + * @param [ellipsoid = Ellipsoid.default] - The ellipsoid used to determine positions of the rectangle. + * @returns An object containing two attributes: occludeePoint and valid + * which is a boolean value. + */ + static computeOccludeePointFromRectangle( + rectangle: Rectangle, + ellipsoid?: Ellipsoid, + ): any; + } + + /** + * Provides geocoding via a {@link https://opencagedata.com/|OpenCage} server. + * @example + * // Configure a Viewer to use the OpenCage Geocoder + * const viewer = new Cesium.Viewer('cesiumContainer', { + * geocoder: new Cesium.OpenCageGeocoderService('https://api.opencagedata.com/geocode/v1/', '') + * }); + * @param url - The endpoint to the OpenCage server. + * @param apiKey - The OpenCage API Key. + * @param [params] - An object with the following properties (See https://opencagedata.com/api#forward-opt): + * @param [params.abbrv] - When set to 1 we attempt to abbreviate and shorten the formatted string we return. + * @param [options.add_request] - When set to 1 the various request parameters are added to the response for ease of debugging. + * @param [options.bounds] - Provides the geocoder with a hint to the region that the query resides in. + * @param [options.countrycode] - Restricts the results to the specified country or countries (as defined by the ISO 3166-1 Alpha 2 standard). + * @param [options.jsonp] - Wraps the returned JSON with a function name. + * @param [options.language] - An IETF format language code. + * @param [options.limit] - The maximum number of results we should return. + * @param [options.min_confidence] - An integer from 1-10. Only results with at least this confidence will be returned. + * @param [options.no_annotations] - When set to 1 results will not contain annotations. + * @param [options.no_dedupe] - When set to 1 results will not be deduplicated. + * @param [options.no_record] - When set to 1 the query contents are not logged. + * @param [options.pretty] - When set to 1 results are 'pretty' printed for easier reading. Useful for debugging. + * @param [options.proximity] - Provides the geocoder with a hint to bias results in favour of those closer to the specified location (For example: 41.40139,2.12870). + */ + export class OpenCageGeocoderService { + constructor( + url: Resource | string, + apiKey: string, + params?: { + abbrv?: number; + }, + ); + /** + * The Resource used to access the OpenCage endpoint. + */ + readonly url: Resource; + /** + * Optional params passed to OpenCage in order to customize geocoding + */ + readonly params: any; + /** + * Gets the credit to display after a geocode is performed. Typically this is used to credit + * the geocoder service. + */ + readonly credit: Credit | undefined; + /** + * @param query - The query to be sent to the geocoder service + */ + geocode(query: string): Promise; + } + + /** + * Creates an instance of an OrientedBoundingBox. + * An OrientedBoundingBox of some object is a closed and convex rectangular cuboid. It can provide a tighter bounding volume than {@link BoundingSphere} or {@link AxisAlignedBoundingBox} in many cases. + * @example + * // Create an OrientedBoundingBox using a transformation matrix, a position where the box will be translated, and a scale. + * const center = new Cesium.Cartesian3(1.0, 0.0, 0.0); + * const halfAxes = Cesium.Matrix3.fromScale(new Cesium.Cartesian3(1.0, 3.0, 2.0), new Cesium.Matrix3()); + * + * const obb = new Cesium.OrientedBoundingBox(center, halfAxes); + * @param [center = Cartesian3.ZERO] - The center of the box. + * @param [halfAxes = Matrix3.ZERO] - The three orthogonal half-axes of the bounding box. + * Equivalently, the transformation matrix, to rotate and scale a 2x2x2 + * cube centered at the origin. + */ + export class OrientedBoundingBox { + constructor(center?: Cartesian3, halfAxes?: Matrix3); + /** + * The center of the box. + */ + center: Cartesian3; + /** + * The three orthogonal half-axes of the bounding box. Equivalently, the + * transformation matrix, to rotate and scale a 2x2x2 cube centered at the + * origin. + */ + halfAxes: Matrix3; + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: OrientedBoundingBox, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new OrientedBoundingBox instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: OrientedBoundingBox, + ): OrientedBoundingBox; + /** + * Computes an instance of an OrientedBoundingBox of the given positions. + * This is an implementation of Stefan Gottschalk's Collision Queries using Oriented Bounding Boxes solution (PHD thesis). + * Reference: http://gamma.cs.unc.edu/users/gottschalk/main.pdf + * @example + * // Compute an object oriented bounding box enclosing two points. + * const box = Cesium.OrientedBoundingBox.fromPoints([new Cesium.Cartesian3(2, 0, 0), new Cesium.Cartesian3(-2, 0, 0)]); + * @param [positions] - List of {@link Cartesian3} points that the bounding box will enclose. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new OrientedBoundingBox instance if one was not provided. + */ + static fromPoints( + positions?: Cartesian3[], + result?: OrientedBoundingBox, + ): OrientedBoundingBox; + /** + * Computes an OrientedBoundingBox that bounds a {@link Rectangle} on the surface of an {@link Ellipsoid}. + * There are no guarantees about the orientation of the bounding box. + * @param rectangle - The cartographic rectangle on the surface of the ellipsoid. + * @param [minimumHeight = 0.0] - The minimum height (elevation) within the tile. + * @param [maximumHeight = 0.0] - The maximum height (elevation) within the tile. + * @param [ellipsoid = Ellipsoid.default] - The ellipsoid on which the rectangle is defined. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new OrientedBoundingBox instance if none was provided. + */ + static fromRectangle( + rectangle: Rectangle, + minimumHeight?: number, + maximumHeight?: number, + ellipsoid?: Ellipsoid, + result?: OrientedBoundingBox, + ): OrientedBoundingBox; + /** + * Computes an OrientedBoundingBox that bounds an affine transformation. + * @param transformation - The affine transformation. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new OrientedBoundingBox instance if none was provided. + */ + static fromTransformation( + transformation: Matrix4, + result?: OrientedBoundingBox, + ): OrientedBoundingBox; + /** + * Duplicates a OrientedBoundingBox instance. + * @param box - The bounding box to duplicate. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new OrientedBoundingBox instance if none was provided. (Returns undefined if box is undefined) + */ + static clone( + box: OrientedBoundingBox, + result?: OrientedBoundingBox, + ): OrientedBoundingBox; + /** + * Determines which side of a plane the oriented bounding box is located. + * @param box - The oriented bounding box to test. + * @param plane - The plane to test against. + * @returns {@link Intersect.INSIDE} if the entire box is on the side of the plane + * the normal is pointing, {@link Intersect.OUTSIDE} if the entire box is + * on the opposite side, and {@link Intersect.INTERSECTING} if the box + * intersects the plane. + */ + static intersectPlane(box: OrientedBoundingBox, plane: Plane): Intersect; + /** + * Computes the estimated distance squared from the closest point on a bounding box to a point. + * @example + * // Sort bounding boxes from back to front + * boxes.sort(function(a, b) { + * return Cesium.OrientedBoundingBox.distanceSquaredTo(b, camera.positionWC) - Cesium.OrientedBoundingBox.distanceSquaredTo(a, camera.positionWC); + * }); + * @param box - The box. + * @param cartesian - The point + * @returns The distance squared from the oriented bounding box to the point. Returns 0 if the point is inside the box. + */ + static distanceSquaredTo( + box: OrientedBoundingBox, + cartesian: Cartesian3, + ): number; + /** + * The distances calculated by the vector from the center of the bounding box to position projected onto direction. + *
+ * If you imagine the infinite number of planes with normal direction, this computes the smallest distance to the + * closest and farthest planes from position that intersect the bounding box. + * @param box - The bounding box to calculate the distance to. + * @param position - The position to calculate the distance from. + * @param direction - The direction from position. + * @param [result] - A Interval to store the nearest and farthest distances. + * @returns The nearest and farthest distances on the bounding box from position in direction. + */ + static computePlaneDistances( + box: OrientedBoundingBox, + position: Cartesian3, + direction: Cartesian3, + result?: Interval, + ): Interval; + /** + * Computes the eight corners of an oriented bounding box. The corners are ordered by (-X, -Y, -Z), (-X, -Y, +Z), (-X, +Y, -Z), (-X, +Y, +Z), (+X, -Y, -Z), (+X, -Y, +Z), (+X, +Y, -Z), (+X, +Y, +Z). + * @param box - The oriented bounding box. + * @param [result] - An array of eight {@link Cartesian3} instances onto which to store the corners. + * @returns The modified result parameter or a new array if none was provided. + */ + static computeCorners( + box: OrientedBoundingBox, + result?: Cartesian3[], + ): Cartesian3[]; + /** + * Computes a transformation matrix from an oriented bounding box. + * @param box - The oriented bounding box. + * @param result - The object onto which to store the result. + * @returns The modified result parameter or a new {@link Matrix4} instance if none was provided. + */ + static computeTransformation( + box: OrientedBoundingBox, + result: Matrix4, + ): Matrix4; + /** + * Determines whether or not a bounding box is hidden from view by the occluder. + * @param box - The bounding box surrounding the occludee object. + * @param occluder - The occluder. + * @returns true if the box is not visible; otherwise false. + */ + static isOccluded(box: OrientedBoundingBox, occluder: Occluder): boolean; + /** + * Determines which side of a plane the oriented bounding box is located. + * @param plane - The plane to test against. + * @returns {@link Intersect.INSIDE} if the entire box is on the side of the plane + * the normal is pointing, {@link Intersect.OUTSIDE} if the entire box is + * on the opposite side, and {@link Intersect.INTERSECTING} if the box + * intersects the plane. + */ + intersectPlane(plane: Plane): Intersect; + /** + * Computes the estimated distance squared from the closest point on a bounding box to a point. + * @example + * // Sort bounding boxes from back to front + * boxes.sort(function(a, b) { + * return b.distanceSquaredTo(camera.positionWC) - a.distanceSquaredTo(camera.positionWC); + * }); + * @param cartesian - The point + * @returns The estimated distance squared from the bounding sphere to the point. + */ + distanceSquaredTo(cartesian: Cartesian3): number; + /** + * The distances calculated by the vector from the center of the bounding box to position projected onto direction. + *
+ * If you imagine the infinite number of planes with normal direction, this computes the smallest distance to the + * closest and farthest planes from position that intersect the bounding box. + * @param position - The position to calculate the distance from. + * @param direction - The direction from position. + * @param [result] - A Interval to store the nearest and farthest distances. + * @returns The nearest and farthest distances on the bounding box from position in direction. + */ + computePlaneDistances( + position: Cartesian3, + direction: Cartesian3, + result?: Interval, + ): Interval; + /** + * Computes the eight corners of an oriented bounding box. The corners are ordered by (-X, -Y, -Z), (-X, -Y, +Z), (-X, +Y, -Z), (-X, +Y, +Z), (+X, -Y, -Z), (+X, -Y, +Z), (+X, +Y, -Z), (+X, +Y, +Z). + * @param [result] - An array of eight {@link Cartesian3} instances onto which to store the corners. + * @returns The modified result parameter or a new array if none was provided. + */ + computeCorners(result?: Cartesian3[]): Cartesian3[]; + /** + * Computes a transformation matrix from an oriented bounding box. + * @param result - The object onto which to store the result. + * @returns The modified result parameter or a new {@link Matrix4} instance if none was provided. + */ + computeTransformation(result: Matrix4): Matrix4; + /** + * Determines whether or not a bounding box is hidden from view by the occluder. + * @param occluder - The occluder. + * @returns true if the sphere is not visible; otherwise false. + */ + isOccluded(occluder: Occluder): boolean; + /** + * Compares the provided OrientedBoundingBox componentwise and returns + * true if they are equal, false otherwise. + * @param [left] - The first OrientedBoundingBox. + * @param [right] - The second OrientedBoundingBox. + * @returns true if left and right are equal, false otherwise. + */ + static equals( + left?: OrientedBoundingBox, + right?: OrientedBoundingBox, + ): boolean; + /** + * Duplicates this OrientedBoundingBox instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new OrientedBoundingBox instance if one was not provided. + */ + clone(result?: OrientedBoundingBox): OrientedBoundingBox; + /** + * Compares this OrientedBoundingBox against the provided OrientedBoundingBox componentwise and returns + * true if they are equal, false otherwise. + * @param [right] - The right hand side OrientedBoundingBox. + * @returns true if they are equal, false otherwise. + */ + equals(right?: OrientedBoundingBox): boolean; + } + + /** + * The viewing frustum is defined by 6 planes. + * Each plane is represented by a {@link Cartesian4} object, where the x, y, and z components + * define the unit vector normal to the plane, and the w component is the distance of the + * plane from the origin/camera position. + * @example + * const maxRadii = ellipsoid.maximumRadius; + * + * const frustum = new Cesium.OrthographicFrustum(); + * frustum.near = 0.01 * maxRadii; + * frustum.far = 50.0 * maxRadii; + * @param [options] - An object with the following properties: + * @param [options.width] - The width of the frustum in meters. + * @param [options.aspectRatio] - The aspect ratio of the frustum's width to it's height. + * @param [options.near = 1.0] - The distance of the near plane. + * @param [options.far = 500000000.0] - The distance of the far plane. + */ + export class OrthographicFrustum { + constructor(options?: { + width?: number; + aspectRatio?: number; + near?: number; + far?: number; + }); + /** + * The horizontal width of the frustum in meters. + */ + width: number | undefined; + /** + * The aspect ratio of the frustum's width to it's height. + */ + aspectRatio: number | undefined; + /** + * The distance of the near plane. + */ + near: number; + /** + * The distance of the far plane. + */ + far: number; + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: OrthographicFrustum, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new OrthographicFrustum instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: OrthographicFrustum, + ): OrthographicFrustum; + /** + * Gets the orthographic projection matrix computed from the view frustum. + */ + readonly projectionMatrix: Matrix4; + /** + * Creates a culling volume for this frustum. + * @example + * // Check if a bounding volume intersects the frustum. + * const cullingVolume = frustum.computeCullingVolume(cameraPosition, cameraDirection, cameraUp); + * const intersect = cullingVolume.computeVisibility(boundingVolume); + * @param position - The eye position. + * @param direction - The view direction. + * @param up - The up direction. + * @returns A culling volume at the given position and orientation. + */ + computeCullingVolume( + position: Cartesian3, + direction: Cartesian3, + up: Cartesian3, + ): CullingVolume; + /** + * Returns the pixel's width and height in meters. + * @example + * // Example 1 + * // Get the width and height of a pixel. + * const pixelSize = camera.frustum.getPixelDimensions(scene.drawingBufferWidth, scene.drawingBufferHeight, 0.0, scene.pixelRatio, new Cesium.Cartesian2()); + * @param drawingBufferWidth - The width of the drawing buffer. + * @param drawingBufferHeight - The height of the drawing buffer. + * @param distance - The distance to the near plane in meters. + * @param pixelRatio - The scaling factor from pixel space to coordinate space. + * @param result - The object onto which to store the result. + * @returns The modified result parameter or a new instance of {@link Cartesian2} with the pixel's width and height in the x and y properties, respectively. + */ + getPixelDimensions( + drawingBufferWidth: number, + drawingBufferHeight: number, + distance: number, + pixelRatio: number, + result: Cartesian2, + ): Cartesian2; + /** + * Returns a duplicate of a OrthographicFrustum instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new OrthographicFrustum instance if one was not provided. + */ + clone(result?: OrthographicFrustum): OrthographicFrustum; + /** + * Compares the provided OrthographicFrustum componentwise and returns + * true if they are equal, false otherwise. + * @param [other] - The right hand side OrthographicFrustum. + * @returns true if they are equal, false otherwise. + */ + equals(other?: OrthographicFrustum): boolean; + /** + * Compares the provided OrthographicFrustum componentwise and returns + * true if they pass an absolute or relative tolerance test, + * false otherwise. + * @param other - The right hand side OrthographicFrustum. + * @param relativeEpsilon - The relative epsilon tolerance to use for equality testing. + * @param [absoluteEpsilon = relativeEpsilon] - The absolute epsilon tolerance to use for equality testing. + * @returns true if this and other are within the provided epsilon, false otherwise. + */ + equalsEpsilon( + other: OrthographicFrustum, + relativeEpsilon: number, + absoluteEpsilon?: number, + ): boolean; + } + + /** + * The viewing frustum is defined by 6 planes. + * Each plane is represented by a {@link Cartesian4} object, where the x, y, and z components + * define the unit vector normal to the plane, and the w component is the distance of the + * plane from the origin/camera position. + * @example + * const maxRadii = ellipsoid.maximumRadius; + * + * const frustum = new Cesium.OrthographicOffCenterFrustum(); + * frustum.right = maxRadii * Cesium.Math.PI; + * frustum.left = -c.frustum.right; + * frustum.top = c.frustum.right * (canvas.clientHeight / canvas.clientWidth); + * frustum.bottom = -c.frustum.top; + * frustum.near = 0.01 * maxRadii; + * frustum.far = 50.0 * maxRadii; + * @param [options] - An object with the following properties: + * @param [options.left] - The left clipping plane distance. + * @param [options.right] - The right clipping plane distance. + * @param [options.top] - The top clipping plane distance. + * @param [options.bottom] - The bottom clipping plane distance. + * @param [options.near = 1.0] - The near clipping plane distance. + * @param [options.far = 500000000.0] - The far clipping plane distance. + */ + export class OrthographicOffCenterFrustum { + constructor(options?: { + left?: number; + right?: number; + top?: number; + bottom?: number; + near?: number; + far?: number; + }); + /** + * The left clipping plane. + */ + left: number | undefined; + /** + * The right clipping plane. + */ + right: number | undefined; + /** + * The top clipping plane. + */ + top: number | undefined; + /** + * The bottom clipping plane. + */ + bottom: number | undefined; + /** + * The distance of the near plane. + */ + near: number; + /** + * The distance of the far plane. + */ + far: number; + /** + * Gets the orthographic projection matrix computed from the view frustum. + */ + readonly projectionMatrix: Matrix4; + /** + * Creates a culling volume for this frustum. + * @example + * // Check if a bounding volume intersects the frustum. + * const cullingVolume = frustum.computeCullingVolume(cameraPosition, cameraDirection, cameraUp); + * const intersect = cullingVolume.computeVisibility(boundingVolume); + * @param position - The eye position. + * @param direction - The view direction. + * @param up - The up direction. + * @returns A culling volume at the given position and orientation. + */ + computeCullingVolume( + position: Cartesian3, + direction: Cartesian3, + up: Cartesian3, + ): CullingVolume; + /** + * Returns the pixel's width and height in meters. + * @example + * // Example 1 + * // Get the width and height of a pixel. + * const pixelSize = camera.frustum.getPixelDimensions(scene.drawingBufferWidth, scene.drawingBufferHeight, 0.0, scene.pixelRatio, new Cesium.Cartesian2()); + * @param drawingBufferWidth - The width of the drawing buffer. + * @param drawingBufferHeight - The height of the drawing buffer. + * @param distance - The distance to the near plane in meters. + * @param pixelRatio - The scaling factor from pixel space to coordinate space. + * @param result - The object onto which to store the result. + * @returns The modified result parameter or a new instance of {@link Cartesian2} with the pixel's width and height in the x and y properties, respectively. + */ + getPixelDimensions( + drawingBufferWidth: number, + drawingBufferHeight: number, + distance: number, + pixelRatio: number, + result: Cartesian2, + ): Cartesian2; + /** + * Returns a duplicate of a OrthographicOffCenterFrustum instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new OrthographicOffCenterFrustum instance if one was not provided. + */ + clone(result?: OrthographicOffCenterFrustum): OrthographicOffCenterFrustum; + /** + * Compares the provided OrthographicOffCenterFrustum componentwise and returns + * true if they are equal, false otherwise. + * @param [other] - The right hand side OrthographicOffCenterFrustum. + * @returns true if they are equal, false otherwise. + */ + equals(other?: OrthographicOffCenterFrustum): boolean; + /** + * Compares the provided OrthographicOffCenterFrustum componentwise and returns + * true if they pass an absolute or relative tolerance test, + * false otherwise. + * @param other - The right hand side OrthographicOffCenterFrustum. + * @param relativeEpsilon - The relative epsilon tolerance to use for equality testing. + * @param [absoluteEpsilon = relativeEpsilon] - The absolute epsilon tolerance to use for equality testing. + * @returns true if this and other are within the provided epsilon, false otherwise. + */ + equalsEpsilon( + other: OrthographicOffCenterFrustum, + relativeEpsilon: number, + absoluteEpsilon?: number, + ): boolean; + } + + export namespace Packable { + /** + * The number of elements used to pack the object into an array. + */ + var packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + */ + function pack(value: any, array: number[], startingIndex?: number): void; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new Object instance if one was not provided. + */ + function unpack(array: number[], startingIndex?: number, result?: any): any; + } + + /** + * Static interface for types which can store their values as packed + * elements in an array. These methods and properties are expected to be + * defined on a constructor function. + */ + export interface Packable {} + + /** + * Static interface for {@link Packable} types which are interpolated in a + * different representation than their packed value. These methods and + * properties are expected to be defined on a constructor function. + */ + export namespace PackableForInterpolation { + /** + * The number of elements used to store the object into an array in its interpolatable form. + */ + var packedInterpolationLength: number; + /** + * Converts a packed array into a form suitable for interpolation. + * @param packedArray - The packed array. + * @param [startingIndex = 0] - The index of the first element to be converted. + * @param [lastIndex = packedArray.length] - The index of the last element to be converted. + * @param [result] - The object into which to store the result. + */ + function convertPackedArrayForInterpolation( + packedArray: number[], + startingIndex?: number, + lastIndex?: number, + result?: number[], + ): void; + /** + * Retrieves an instance from a packed array converted with {@link PackableForInterpolation.convertPackedArrayForInterpolation}. + * @param array - The array previously packed for interpolation. + * @param sourceArray - The original packed array. + * @param [startingIndex = 0] - The startingIndex used to convert the array. + * @param [lastIndex = packedArray.length] - The lastIndex used to convert the array. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new Object instance if one was not provided. + */ + function unpackInterpolationResult( + array: number[], + sourceArray: number[], + startingIndex?: number, + lastIndex?: number, + result?: any, + ): any; + } + + /** + * Provides geocoding via a {@link https://pelias.io/|Pelias} server. + * @example + * // Configure a Viewer to use the Pelias server hosted by https://geocode.earth/ + * const viewer = new Cesium.Viewer('cesiumContainer', { + * geocoder: new Cesium.PeliasGeocoderService(new Cesium.Resource({ + * url: 'https://api.geocode.earth/v1/', + * queryParameters: { + * api_key: '' + * } + * })) + * }); + * @param url - The endpoint to the Pelias server. + */ + export class PeliasGeocoderService { + constructor(url: Resource | string); + /** + * The Resource used to access the Pelias endpoint. + */ + readonly url: Resource; + /** + * Gets the credit to display after a geocode is performed. Typically this is used to credit + * the geocoder service. + */ + readonly credit: Credit | undefined; + /** + * @param query - The query to be sent to the geocoder service + * @param [type = GeocodeType.SEARCH] - The type of geocode to perform. + */ + geocode( + query: string, + type?: GeocodeType, + ): Promise; + } + + /** + * The viewing frustum is defined by 6 planes. + * Each plane is represented by a {@link Cartesian4} object, where the x, y, and z components + * define the unit vector normal to the plane, and the w component is the distance of the + * plane from the origin/camera position. + * @example + * const frustum = new Cesium.PerspectiveFrustum({ + * fov : Cesium.Math.PI_OVER_THREE, + * aspectRatio : canvas.clientWidth / canvas.clientHeight + * near : 1.0, + * far : 1000.0 + * }); + * @param [options] - An object with the following properties: + * @param [options.fov] - The angle of the field of view (FOV), in radians. + * @param [options.aspectRatio] - The aspect ratio of the frustum's width to it's height. + * @param [options.near = 1.0] - The distance of the near plane. + * @param [options.far = 500000000.0] - The distance of the far plane. + * @param [options.xOffset = 0.0] - The offset in the x direction. + * @param [options.yOffset = 0.0] - The offset in the y direction. + */ + export class PerspectiveFrustum { + constructor(options?: { + fov?: number; + aspectRatio?: number; + near?: number; + far?: number; + xOffset?: number; + yOffset?: number; + }); + /** + * The angle of the field of view (FOV), in radians. This angle will be used + * as the horizontal FOV if the width is greater than the height, otherwise + * it will be the vertical FOV. + */ + fov: number | undefined; + /** + * The aspect ratio of the frustum's width to it's height. + */ + aspectRatio: number | undefined; + /** + * The distance of the near plane. + */ + near: number; + /** + * The distance of the far plane. + */ + far: number; + /** + * Offsets the frustum in the x direction. + */ + xOffset: number; + /** + * Offsets the frustum in the y direction. + */ + yOffset: number; + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: PerspectiveFrustum, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new PerspectiveFrustum instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: PerspectiveFrustum, + ): PerspectiveFrustum; + /** + * Gets the perspective projection matrix computed from the view frustum. + * If necessary, the projection matrix will be recomputed. + */ + readonly projectionMatrix: Matrix4; + /** + * The perspective projection matrix computed from the view frustum with an infinite far plane. + */ + readonly infiniteProjectionMatrix: Matrix4; + /** + * Gets the angle of the vertical field of view, in radians. + */ + readonly fovy: number | undefined; + /** + * Creates a culling volume for this frustum. + * @example + * // Check if a bounding volume intersects the frustum. + * const cullingVolume = frustum.computeCullingVolume(cameraPosition, cameraDirection, cameraUp); + * const intersect = cullingVolume.computeVisibility(boundingVolume); + * @param position - The eye position. + * @param direction - The view direction. + * @param up - The up direction. + * @returns A culling volume at the given position and orientation. + */ + computeCullingVolume( + position: Cartesian3, + direction: Cartesian3, + up: Cartesian3, + ): CullingVolume; + /** + * Returns the pixel's width and height in meters. + * @example + * // Example 1 + * // Get the width and height of a pixel. + * const pixelSize = camera.frustum.getPixelDimensions(scene.drawingBufferWidth, scene.drawingBufferHeight, 1.0, scene.pixelRatio, new Cesium.Cartesian2()); + * @example + * // Example 2 + * // Get the width and height of a pixel if the near plane was set to 'distance'. + * // For example, get the size of a pixel of an image on a billboard. + * const position = camera.position; + * const direction = camera.direction; + * const toCenter = Cesium.Cartesian3.subtract(primitive.boundingVolume.center, position, new Cesium.Cartesian3()); // vector from camera to a primitive + * const toCenterProj = Cesium.Cartesian3.multiplyByScalar(direction, Cesium.Cartesian3.dot(direction, toCenter), new Cesium.Cartesian3()); // project vector onto camera direction vector + * const distance = Cesium.Cartesian3.magnitude(toCenterProj); + * const pixelSize = camera.frustum.getPixelDimensions(scene.drawingBufferWidth, scene.drawingBufferHeight, distance, scene.pixelRatio, new Cesium.Cartesian2()); + * @param drawingBufferWidth - The width of the drawing buffer. + * @param drawingBufferHeight - The height of the drawing buffer. + * @param distance - The distance to the near plane in meters. + * @param pixelRatio - The scaling factor from pixel space to coordinate space. + * @param result - The object onto which to store the result. + * @returns The modified result parameter or a new instance of {@link Cartesian2} with the pixel's width and height in the x and y properties, respectively. + */ + getPixelDimensions( + drawingBufferWidth: number, + drawingBufferHeight: number, + distance: number, + pixelRatio: number, + result: Cartesian2, + ): Cartesian2; + /** + * Returns a duplicate of a PerspectiveFrustum instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new PerspectiveFrustum instance if one was not provided. + */ + clone(result?: PerspectiveFrustum): PerspectiveFrustum; + /** + * Compares the provided PerspectiveFrustum componentwise and returns + * true if they are equal, false otherwise. + * @param [other] - The right hand side PerspectiveFrustum. + * @returns true if they are equal, false otherwise. + */ + equals(other?: PerspectiveFrustum): boolean; + /** + * Compares the provided PerspectiveFrustum componentwise and returns + * true if they pass an absolute or relative tolerance test, + * false otherwise. + * @param other - The right hand side PerspectiveFrustum. + * @param relativeEpsilon - The relative epsilon tolerance to use for equality testing. + * @param [absoluteEpsilon = relativeEpsilon] - The absolute epsilon tolerance to use for equality testing. + * @returns true if this and other are within the provided epsilon, false otherwise. + */ + equalsEpsilon( + other: PerspectiveFrustum, + relativeEpsilon: number, + absoluteEpsilon?: number, + ): boolean; + } + + /** + * The viewing frustum is defined by 6 planes. + * Each plane is represented by a {@link Cartesian4} object, where the x, y, and z components + * define the unit vector normal to the plane, and the w component is the distance of the + * plane from the origin/camera position. + * @example + * const frustum = new Cesium.PerspectiveOffCenterFrustum({ + * left : -1.0, + * right : 1.0, + * top : 1.0, + * bottom : -1.0, + * near : 1.0, + * far : 100.0 + * }); + * @param [options] - An object with the following properties: + * @param [options.left] - The left clipping plane distance. + * @param [options.right] - The right clipping plane distance. + * @param [options.top] - The top clipping plane distance. + * @param [options.bottom] - The bottom clipping plane distance. + * @param [options.near = 1.0] - The near clipping plane distance. + * @param [options.far = 500000000.0] - The far clipping plane distance. + */ + export class PerspectiveOffCenterFrustum { + constructor(options?: { + left?: number; + right?: number; + top?: number; + bottom?: number; + near?: number; + far?: number; + }); + /** + * Defines the left clipping plane. + */ + left: number | undefined; + /** + * Defines the right clipping plane. + */ + right: number | undefined; + /** + * Defines the top clipping plane. + */ + top: number | undefined; + /** + * Defines the bottom clipping plane. + */ + bottom: number | undefined; + /** + * The distance of the near plane. + */ + near: number; + /** + * The distance of the far plane. + */ + far: number; + /** + * Gets the perspective projection matrix computed from the view frustum. + * The projection matrix will be recomputed if any frustum parameters have changed. + */ + readonly projectionMatrix: Matrix4; + /** + * Gets the perspective projection matrix computed from the view frustum with an infinite far plane. + */ + readonly infiniteProjectionMatrix: Matrix4; + /** + * Creates a culling volume for this frustum. + * @example + * // Check if a bounding volume intersects the frustum. + * const cullingVolume = frustum.computeCullingVolume(cameraPosition, cameraDirection, cameraUp); + * const intersect = cullingVolume.computeVisibility(boundingVolume); + * @param position - The eye position. + * @param direction - The view direction. + * @param up - The up direction. + * @returns A culling volume at the given position and orientation. + */ + computeCullingVolume( + position: Cartesian3, + direction: Cartesian3, + up: Cartesian3, + ): CullingVolume; + /** + * Returns the pixel's width and height in meters. + * @example + * // Example 1 + * // Get the width and height of a pixel. + * const pixelSize = camera.frustum.getPixelDimensions(scene.drawingBufferWidth, scene.drawingBufferHeight, 1.0, scene.pixelRatio, new Cesium.Cartesian2()); + * @example + * // Example 2 + * // Get the width and height of a pixel if the near plane was set to 'distance'. + * // For example, get the size of a pixel of an image on a billboard. + * const position = camera.position; + * const direction = camera.direction; + * const toCenter = Cesium.Cartesian3.subtract(primitive.boundingVolume.center, position, new Cesium.Cartesian3()); // vector from camera to a primitive + * const toCenterProj = Cesium.Cartesian3.multiplyByScalar(direction, Cesium.Cartesian3.dot(direction, toCenter), new Cesium.Cartesian3()); // project vector onto camera direction vector + * const distance = Cesium.Cartesian3.magnitude(toCenterProj); + * const pixelSize = camera.frustum.getPixelDimensions(scene.drawingBufferWidth, scene.drawingBufferHeight, distance, scene.pixelRatio, new Cesium.Cartesian2()); + * @param drawingBufferWidth - The width of the drawing buffer. + * @param drawingBufferHeight - The height of the drawing buffer. + * @param distance - The distance to the near plane in meters. + * @param pixelRatio - The scaling factor from pixel space to coordinate space. + * @param result - The object onto which to store the result. + * @returns The modified result parameter or a new instance of {@link Cartesian2} with the pixel's width and height in the x and y properties, respectively. + */ + getPixelDimensions( + drawingBufferWidth: number, + drawingBufferHeight: number, + distance: number, + pixelRatio: number, + result: Cartesian2, + ): Cartesian2; + /** + * Returns a duplicate of a PerspectiveOffCenterFrustum instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new PerspectiveFrustum instance if one was not provided. + */ + clone(result?: PerspectiveOffCenterFrustum): PerspectiveOffCenterFrustum; + /** + * Compares the provided PerspectiveOffCenterFrustum componentwise and returns + * true if they are equal, false otherwise. + * @param [other] - The right hand side PerspectiveOffCenterFrustum. + * @returns true if they are equal, false otherwise. + */ + equals(other?: PerspectiveOffCenterFrustum): boolean; + /** + * Compares the provided PerspectiveOffCenterFrustum componentwise and returns + * true if they pass an absolute or relative tolerance test, + * false otherwise. + * @param other - The right hand side PerspectiveOffCenterFrustum. + * @param relativeEpsilon - The relative epsilon tolerance to use for equality testing. + * @param [absoluteEpsilon = relativeEpsilon] - The absolute epsilon tolerance to use for equality testing. + * @returns true if this and other are within the provided epsilon, false otherwise. + */ + equalsEpsilon( + other: PerspectiveOffCenterFrustum, + relativeEpsilon: number, + absoluteEpsilon?: number, + ): boolean; + } + + /** + * A utility class for generating custom map pins as canvas elements. + *

+ *
+ *
+ * Example pins generated using both the maki icon set, which ships with Cesium, and single character text. + *
+ */ + export class PinBuilder { + constructor(); + /** + * Creates an empty pin of the specified color and size. + * @param color - The color of the pin. + * @param size - The size of the pin, in pixels. + * @returns The canvas element that represents the generated pin. + */ + fromColor(color: Color, size: number): HTMLCanvasElement; + /** + * Creates a pin with the specified icon, color, and size. + * @param url - The url of the image to be stamped onto the pin. + * @param color - The color of the pin. + * @param size - The size of the pin, in pixels. + * @returns The canvas element or a Promise to the canvas element that represents the generated pin. + */ + fromUrl( + url: Resource | string, + color: Color, + size: number, + ): HTMLCanvasElement | Promise; + /** + * Creates a pin with the specified {@link https://www.mapbox.com/maki/|maki} icon identifier, color, and size. + * @param id - The id of the maki icon to be stamped onto the pin. + * @param color - The color of the pin. + * @param size - The size of the pin, in pixels. + * @returns The canvas element or a Promise to the canvas element that represents the generated pin. + */ + fromMakiIconId( + id: string, + color: Color, + size: number, + ): HTMLCanvasElement | Promise; + /** + * Creates a pin with the specified text, color, and size. The text will be sized to be as large as possible + * while still being contained completely within the pin. + * @param text - The text to be stamped onto the pin. + * @param color - The color of the pin. + * @param size - The size of the pin, in pixels. + * @returns The canvas element that represents the generated pin. + */ + fromText(text: string, color: Color, size: number): HTMLCanvasElement; + } + + /** + * The format of a pixel, i.e., the number of components it has and what they represent. + */ + export enum PixelFormat { + /** + * A pixel format containing a depth value. + */ + DEPTH_COMPONENT = WebGLConstants.DEPTH_COMPONENT, + /** + * A pixel format containing a depth and stencil value, most often used with {@link PixelDatatype.UNSIGNED_INT_24_8}. + */ + DEPTH_STENCIL = WebGLConstants.DEPTH_STENCIL, + /** + * A pixel format containing an alpha channel. + */ + ALPHA = WebGLConstants.ALPHA, + /** + * A pixel format containing a red channel + */ + RED = WebGLConstants.RED, + /** + * A pixel format containing red and green channels. + */ + RG = WebGLConstants.RG, + /** + * A pixel format containing red, green, and blue channels. + */ + RGB = WebGLConstants.RGB, + /** + * A pixel format containing red, green, blue, and alpha channels. + */ + RGBA = WebGLConstants.RGBA, + /** + * A pixel format containing a luminance (intensity) channel. + */ + LUMINANCE = WebGLConstants.LUMINANCE, + /** + * A pixel format containing luminance (intensity) and alpha channels. + */ + LUMINANCE_ALPHA = WebGLConstants.LUMINANCE_ALPHA, + /** + * A pixel format containing red, green, and blue channels that is DXT1 compressed. + */ + RGB_DXT1 = WebGLConstants.COMPRESSED_RGB_S3TC_DXT1_EXT, + /** + * A pixel format containing red, green, blue, and alpha channels that is DXT1 compressed. + */ + RGBA_DXT1 = WebGLConstants.COMPRESSED_RGBA_S3TC_DXT1_EXT, + /** + * A pixel format containing red, green, blue, and alpha channels that is DXT3 compressed. + */ + RGBA_DXT3 = WebGLConstants.COMPRESSED_RGBA_S3TC_DXT3_EXT, + /** + * A pixel format containing red, green, blue, and alpha channels that is DXT5 compressed. + */ + RGBA_DXT5 = WebGLConstants.COMPRESSED_RGBA_S3TC_DXT5_EXT, + /** + * A pixel format containing red, green, and blue channels that is PVR 4bpp compressed. + */ + RGB_PVRTC_4BPPV1 = WebGLConstants.COMPRESSED_RGB_PVRTC_4BPPV1_IMG, + /** + * A pixel format containing red, green, and blue channels that is PVR 2bpp compressed. + */ + RGB_PVRTC_2BPPV1 = WebGLConstants.COMPRESSED_RGB_PVRTC_2BPPV1_IMG, + /** + * A pixel format containing red, green, blue, and alpha channels that is PVR 4bpp compressed. + */ + RGBA_PVRTC_4BPPV1 = WebGLConstants.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG, + /** + * A pixel format containing red, green, blue, and alpha channels that is PVR 2bpp compressed. + */ + RGBA_PVRTC_2BPPV1 = WebGLConstants.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG, + /** + * A pixel format containing red, green, blue, and alpha channels that is ASTC compressed. + */ + RGBA_ASTC = WebGLConstants.COMPRESSED_RGBA_ASTC_4x4_WEBGL, + /** + * A pixel format containing red, green, and blue channels that is ETC1 compressed. + */ + RGB_ETC1 = WebGLConstants.COMPRESSED_RGB_ETC1_WEBGL, + /** + * A pixel format containing red, green, and blue channels that is ETC2 compressed. + */ + RGB8_ETC2 = WebGLConstants.COMPRESSED_RGB8_ETC2, + /** + * A pixel format containing red, green, blue, and alpha channels that is ETC2 compressed. + */ + RGBA8_ETC2_EAC = WebGLConstants.COMPRESSED_RGBA8_ETC2_EAC, + /** + * A pixel format containing red, green, blue, and alpha channels that is BC7 compressed. + */ + RGBA_BC7 = WebGLConstants.COMPRESSED_RGBA_BPTC_UNORM, + } + + /** + * A plane in Hessian Normal Form defined by + *
+   * ax + by + cz + d = 0
+   * 
+ * where (a, b, c) is the plane's normal, d is the signed + * distance to the plane, and (x, y, z) is any point on + * the plane. + * @example + * // The plane x=0 + * const plane = new Cesium.Plane(Cesium.Cartesian3.UNIT_X, 0.0); + * @param normal - The plane's normal (normalized). + * @param distance - The shortest distance from the origin to the plane. The sign of + * distance determines which side of the plane the origin + * is on. If distance is positive, the origin is in the half-space + * in the direction of the normal; if negative, the origin is in the half-space + * opposite to the normal; if zero, the plane passes through the origin. + */ + export class Plane { + constructor(normal: Cartesian3, distance: number); + /** + * The plane's normal. + */ + normal: Cartesian3; + /** + * The shortest distance from the origin to the plane. The sign of + * distance determines which side of the plane the origin + * is on. If distance is positive, the origin is in the half-space + * in the direction of the normal; if negative, the origin is in the half-space + * opposite to the normal; if zero, the plane passes through the origin. + */ + distance: number; + /** + * Creates a plane from a normal and a point on the plane. + * @example + * const point = Cesium.Cartesian3.fromDegrees(-72.0, 40.0); + * const normal = ellipsoid.geodeticSurfaceNormal(point); + * const tangentPlane = Cesium.Plane.fromPointNormal(point, normal); + * @param point - The point on the plane. + * @param normal - The plane's normal (normalized). + * @param [result] - The object onto which to store the result. + * @returns A new plane instance or the modified result parameter. + */ + static fromPointNormal( + point: Cartesian3, + normal: Cartesian3, + result?: Plane, + ): Plane; + /** + * Creates a plane from the general equation + * @param coefficients - The plane's normal (normalized). + * @param [result] - The object onto which to store the result. + * @returns A new plane instance or the modified result parameter. + */ + static fromCartesian4(coefficients: Cartesian4, result?: Plane): Plane; + /** + * Computes the signed shortest distance of a point to a plane. + * The sign of the distance determines which side of the plane the point + * is on. If the distance is positive, the point is in the half-space + * in the direction of the normal; if negative, the point is in the half-space + * opposite to the normal; if zero, the plane passes through the point. + * @param plane - The plane. + * @param point - The point. + * @returns The signed shortest distance of the point to the plane. + */ + static getPointDistance(plane: Plane, point: Cartesian3): number; + /** + * Projects a point onto the plane. + * @param plane - The plane to project the point onto + * @param point - The point to project onto the plane + * @param [result] - The result point. If undefined, a new Cartesian3 will be created. + * @returns The modified result parameter or a new Cartesian3 instance if one was not provided. + */ + static projectPointOntoPlane( + plane: Plane, + point: Cartesian3, + result?: Cartesian3, + ): Cartesian3; + /** + * Transforms the plane by the given transformation matrix. + * @param plane - The plane. + * @param transform - The transformation matrix. + * @param [result] - The object into which to store the result. + * @returns The plane transformed by the given transformation matrix. + */ + static transform(plane: Plane, transform: Matrix4, result?: Plane): Plane; + /** + * Duplicates a Plane instance. + * @param plane - The plane to duplicate. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Plane instance if one was not provided. + */ + static clone(plane: Plane, result?: Plane): Plane; + /** + * Compares the provided Planes by normal and distance and returns + * true if they are equal, false otherwise. + * @param left - The first plane. + * @param right - The second plane. + * @returns true if left and right are equal, false otherwise. + */ + static equals(left: Plane, right: Plane): boolean; + /** + * A constant initialized to the XY plane passing through the origin, with normal in positive Z. + */ + static readonly ORIGIN_XY_PLANE: Plane; + /** + * A constant initialized to the YZ plane passing through the origin, with normal in positive X. + */ + static readonly ORIGIN_YZ_PLANE: Plane; + /** + * A constant initialized to the ZX plane passing through the origin, with normal in positive Y. + */ + static readonly ORIGIN_ZX_PLANE: Plane; + } + + /** + * Describes geometry representing a plane centered at the origin, with a unit width and length. + * @example + * const planeGeometry = new Cesium.PlaneGeometry({ + * vertexFormat : Cesium.VertexFormat.POSITION_ONLY + * }); + * @param [options] - Object with the following properties: + * @param [options.vertexFormat = VertexFormat.DEFAULT] - The vertex attributes to be computed. + */ + export class PlaneGeometry { + constructor(options?: { vertexFormat?: VertexFormat }); + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: PlaneGeometry, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new PlaneGeometry instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: PlaneGeometry, + ): PlaneGeometry; + /** + * Computes the geometric representation of a plane, including its vertices, indices, and a bounding sphere. + * @param planeGeometry - A description of the plane. + * @returns The computed vertices and indices. + */ + static createGeometry(planeGeometry: PlaneGeometry): Geometry | undefined; + } + + /** + * Describes geometry representing the outline of a plane centered at the origin, with a unit width and length. + */ + export class PlaneOutlineGeometry { + constructor(); + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @returns The array that was packed into + */ + static pack(value: PlaneOutlineGeometry, array: number[]): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new PlaneOutlineGeometry instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: PlaneOutlineGeometry, + ): PlaneOutlineGeometry; + /** + * Computes the geometric representation of an outline of a plane, including its vertices, indices, and a bounding sphere. + * @returns The computed vertices and indices. + */ + static createGeometry(): Geometry | undefined; + } + + /** + * A description of a polygon on the ellipsoid. The polygon is defined by a polygon hierarchy. Polygon geometry can be rendered with both {@link Primitive} and {@link GroundPrimitive}. + * @example + * // 1. create a polygon from points + * const polygon = new Cesium.PolygonGeometry({ + * polygonHierarchy : new Cesium.PolygonHierarchy( + * Cesium.Cartesian3.fromDegreesArray([ + * -72.0, 40.0, + * -70.0, 35.0, + * -75.0, 30.0, + * -70.0, 30.0, + * -68.0, 40.0 + * ]) + * ) + * }); + * const geometry = Cesium.PolygonGeometry.createGeometry(polygon); + * + * // 2. create a nested polygon with holes + * const polygonWithHole = new Cesium.PolygonGeometry({ + * polygonHierarchy : new Cesium.PolygonHierarchy( + * Cesium.Cartesian3.fromDegreesArray([ + * -109.0, 30.0, + * -95.0, 30.0, + * -95.0, 40.0, + * -109.0, 40.0 + * ]), + * [new Cesium.PolygonHierarchy( + * Cesium.Cartesian3.fromDegreesArray([ + * -107.0, 31.0, + * -107.0, 39.0, + * -97.0, 39.0, + * -97.0, 31.0 + * ]), + * [new Cesium.PolygonHierarchy( + * Cesium.Cartesian3.fromDegreesArray([ + * -105.0, 33.0, + * -99.0, 33.0, + * -99.0, 37.0, + * -105.0, 37.0 + * ]), + * [new Cesium.PolygonHierarchy( + * Cesium.Cartesian3.fromDegreesArray([ + * -103.0, 34.0, + * -101.0, 34.0, + * -101.0, 36.0, + * -103.0, 36.0 + * ]) + * )] + * )] + * )] + * ) + * }); + * const geometry = Cesium.PolygonGeometry.createGeometry(polygonWithHole); + * + * // 3. create extruded polygon + * const extrudedPolygon = new Cesium.PolygonGeometry({ + * polygonHierarchy : new Cesium.PolygonHierarchy( + * Cesium.Cartesian3.fromDegreesArray([ + * -72.0, 40.0, + * -70.0, 35.0, + * -75.0, 30.0, + * -70.0, 30.0, + * -68.0, 40.0 + * ]) + * ), + * extrudedHeight: 300000 + * }); + * const geometry = Cesium.PolygonGeometry.createGeometry(extrudedPolygon); + * @param options - Object with the following properties: + * @param options.polygonHierarchy - A polygon hierarchy that can include holes. + * @param [options.height = 0.0] - The distance in meters between the polygon and the ellipsoid surface. + * @param [options.extrudedHeight] - The distance in meters between the polygon's extruded face and the ellipsoid surface. + * @param [options.vertexFormat = VertexFormat.DEFAULT] - The vertex attributes to be computed. + * @param [options.stRotation = 0.0] - The rotation of the texture coordinates, in radians. A positive rotation is counter-clockwise. + * @param [options.ellipsoid = Ellipsoid.default] - The ellipsoid to be used as a reference. + * @param [options.granularity = Math.RADIANS_PER_DEGREE] - The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer. + * @param [options.perPositionHeight = false] - Use the height of options.positions for each position instead of using options.height to determine the height. + * @param [options.closeTop = true] - When false, leaves off the top of an extruded polygon open. + * @param [options.closeBottom = true] - When false, leaves off the bottom of an extruded polygon open. + * @param [options.arcType = ArcType.GEODESIC] - The type of line the polygon edges must follow. Valid options are {@link ArcType.GEODESIC} and {@link ArcType.RHUMB}. + * @param [options.textureCoordinates] - Texture coordinates as a {@link PolygonHierarchy} of {@link Cartesian2} points. Has no effect for ground primitives. + */ + export class PolygonGeometry { + constructor(options: { + polygonHierarchy: PolygonHierarchy; + height?: number; + extrudedHeight?: number; + vertexFormat?: VertexFormat; + stRotation?: number; + ellipsoid?: Ellipsoid; + granularity?: number; + perPositionHeight?: boolean; + closeTop?: boolean; + closeBottom?: boolean; + arcType?: ArcType; + textureCoordinates?: PolygonHierarchy; + }); + /** + * The number of elements used to pack the object into an array. + */ + packedLength: number; + /** + * A description of a polygon from an array of positions. Polygon geometry can be rendered with both {@link Primitive} and {@link GroundPrimitive}. + * @example + * // create a polygon from points + * const polygon = Cesium.PolygonGeometry.fromPositions({ + * positions : Cesium.Cartesian3.fromDegreesArray([ + * -72.0, 40.0, + * -70.0, 35.0, + * -75.0, 30.0, + * -70.0, 30.0, + * -68.0, 40.0 + * ]) + * }); + * const geometry = Cesium.PolygonGeometry.createGeometry(polygon); + * @param options - Object with the following properties: + * @param options.positions - An array of positions that defined the corner points of the polygon. + * @param [options.height = 0.0] - The height of the polygon. + * @param [options.extrudedHeight] - The height of the polygon extrusion. + * @param [options.vertexFormat = VertexFormat.DEFAULT] - The vertex attributes to be computed. + * @param [options.stRotation = 0.0] - The rotation of the texture coordinates, in radians. A positive rotation is counter-clockwise. + * @param [options.ellipsoid = Ellipsoid.default] - The ellipsoid to be used as a reference. + * @param [options.granularity = Math.RADIANS_PER_DEGREE] - The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer. + * @param [options.perPositionHeight = false] - Use the height of options.positions for each position instead of using options.height to determine the height. + * @param [options.closeTop = true] - When false, leaves off the top of an extruded polygon open. + * @param [options.closeBottom = true] - When false, leaves off the bottom of an extruded polygon open. + * @param [options.arcType = ArcType.GEODESIC] - The type of line the polygon edges must follow. Valid options are {@link ArcType.GEODESIC} and {@link ArcType.RHUMB}. + * @param [options.textureCoordinates] - Texture coordinates as a {@link PolygonHierarchy} of {@link Cartesian2} points. Has no effect for ground primitives. + */ + static fromPositions(options: { + positions: Cartesian3[]; + height?: number; + extrudedHeight?: number; + vertexFormat?: VertexFormat; + stRotation?: number; + ellipsoid?: Ellipsoid; + granularity?: number; + perPositionHeight?: boolean; + closeTop?: boolean; + closeBottom?: boolean; + arcType?: ArcType; + textureCoordinates?: PolygonHierarchy; + }): PolygonGeometry; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: PolygonGeometry, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: PolygonGeometry, + ): void; + /** + * Computes a rectangle which encloses the polygon defined by the list of positions, including cases over the international date line and the poles. + * @param positions - A linear ring defining the outer boundary of the polygon. + * @param [ellipsoid = Ellipsoid.default] - The ellipsoid to be used as a reference. + * @param [arcType = ArcType.GEODESIC] - The type of line the polygon edges must follow. Valid options are {@link ArcType.GEODESIC} and {@link ArcType.RHUMB}. + * @param [result] - An object in which to store the result. + * @returns The result rectangle + */ + static computeRectangleFromPositions( + positions: Cartesian3[], + ellipsoid?: Ellipsoid, + arcType?: ArcType, + result?: Rectangle, + ): Rectangle; + /** + * Computes the geometric representation of a polygon, including its vertices, indices, and a bounding sphere. + * @param polygonGeometry - A description of the polygon. + * @returns The computed vertices and indices. + */ + static createGeometry( + polygonGeometry: PolygonGeometry, + ): Geometry | undefined; + } + + /** + * An hierarchy of linear rings which define a polygon and its holes. + * The holes themselves may also have holes which nest inner polygons. + * @param [positions] - A linear ring defining the outer boundary of the polygon or hole. + * @param [holes] - An array of polygon hierarchies defining holes in the polygon. + */ + export class PolygonHierarchy { + constructor(positions?: Cartesian3[], holes?: PolygonHierarchy[]); + /** + * A linear ring defining the outer boundary of the polygon or hole. + */ + positions: Cartesian3[]; + /** + * An array of polygon hierarchies defining holes in the polygon. + */ + holes: PolygonHierarchy[]; + } + + /** + * A description of the outline of a polygon on the ellipsoid. The polygon is defined by a polygon hierarchy. + * @example + * // 1. create a polygon outline from points + * const polygon = new Cesium.PolygonOutlineGeometry({ + * polygonHierarchy : new Cesium.PolygonHierarchy( + * Cesium.Cartesian3.fromDegreesArray([ + * -72.0, 40.0, + * -70.0, 35.0, + * -75.0, 30.0, + * -70.0, 30.0, + * -68.0, 40.0 + * ]) + * ) + * }); + * const geometry = Cesium.PolygonOutlineGeometry.createGeometry(polygon); + * + * // 2. create a nested polygon with holes outline + * const polygonWithHole = new Cesium.PolygonOutlineGeometry({ + * polygonHierarchy : new Cesium.PolygonHierarchy( + * Cesium.Cartesian3.fromDegreesArray([ + * -109.0, 30.0, + * -95.0, 30.0, + * -95.0, 40.0, + * -109.0, 40.0 + * ]), + * [new Cesium.PolygonHierarchy( + * Cesium.Cartesian3.fromDegreesArray([ + * -107.0, 31.0, + * -107.0, 39.0, + * -97.0, 39.0, + * -97.0, 31.0 + * ]), + * [new Cesium.PolygonHierarchy( + * Cesium.Cartesian3.fromDegreesArray([ + * -105.0, 33.0, + * -99.0, 33.0, + * -99.0, 37.0, + * -105.0, 37.0 + * ]), + * [new Cesium.PolygonHierarchy( + * Cesium.Cartesian3.fromDegreesArray([ + * -103.0, 34.0, + * -101.0, 34.0, + * -101.0, 36.0, + * -103.0, 36.0 + * ]) + * )] + * )] + * )] + * ) + * }); + * const geometry = Cesium.PolygonOutlineGeometry.createGeometry(polygonWithHole); + * + * // 3. create extruded polygon outline + * const extrudedPolygon = new Cesium.PolygonOutlineGeometry({ + * polygonHierarchy : new Cesium.PolygonHierarchy( + * Cesium.Cartesian3.fromDegreesArray([ + * -72.0, 40.0, + * -70.0, 35.0, + * -75.0, 30.0, + * -70.0, 30.0, + * -68.0, 40.0 + * ]) + * ), + * extrudedHeight: 300000 + * }); + * const geometry = Cesium.PolygonOutlineGeometry.createGeometry(extrudedPolygon); + * @param options - Object with the following properties: + * @param options.polygonHierarchy - A polygon hierarchy that can include holes. + * @param [options.height = 0.0] - The distance in meters between the polygon and the ellipsoid surface. + * @param [options.extrudedHeight] - The distance in meters between the polygon's extruded face and the ellipsoid surface. + * @param [options.vertexFormat = VertexFormat.DEFAULT] - The vertex attributes to be computed. + * @param [options.ellipsoid = Ellipsoid.default] - The ellipsoid to be used as a reference. + * @param [options.granularity = Math.RADIANS_PER_DEGREE] - The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer. + * @param [options.perPositionHeight = false] - Use the height of options.positions for each position instead of using options.height to determine the height. + * @param [options.arcType = ArcType.GEODESIC] - The type of path the outline must follow. Valid options are {@link ArcType.GEODESIC} and {@link ArcType.RHUMB}. + */ + export class PolygonOutlineGeometry { + constructor(options: { + polygonHierarchy: PolygonHierarchy; + height?: number; + extrudedHeight?: number; + vertexFormat?: VertexFormat; + ellipsoid?: Ellipsoid; + granularity?: number; + perPositionHeight?: boolean; + arcType?: ArcType; + }); + /** + * The number of elements used to pack the object into an array. + */ + packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: PolygonOutlineGeometry, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new PolygonOutlineGeometry instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: PolygonOutlineGeometry, + ): PolygonOutlineGeometry; + /** + * A description of a polygon outline from an array of positions. + * @example + * // create a polygon from points + * const polygon = Cesium.PolygonOutlineGeometry.fromPositions({ + * positions : Cesium.Cartesian3.fromDegreesArray([ + * -72.0, 40.0, + * -70.0, 35.0, + * -75.0, 30.0, + * -70.0, 30.0, + * -68.0, 40.0 + * ]) + * }); + * const geometry = Cesium.PolygonOutlineGeometry.createGeometry(polygon); + * @param options - Object with the following properties: + * @param options.positions - An array of positions that defined the corner points of the polygon. + * @param [options.height = 0.0] - The height of the polygon. + * @param [options.extrudedHeight] - The height of the polygon extrusion. + * @param [options.ellipsoid = Ellipsoid.default] - The ellipsoid to be used as a reference. + * @param [options.granularity = Math.RADIANS_PER_DEGREE] - The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer. + * @param [options.perPositionHeight = false] - Use the height of options.positions for each position instead of using options.height to determine the height. + * @param [options.arcType = ArcType.GEODESIC] - The type of path the outline must follow. Valid options are {@link LinkType.GEODESIC} and {@link ArcType.RHUMB}. + */ + static fromPositions(options: { + positions: Cartesian3[]; + height?: number; + extrudedHeight?: number; + ellipsoid?: Ellipsoid; + granularity?: number; + perPositionHeight?: boolean; + arcType?: ArcType; + }): PolygonOutlineGeometry; + /** + * Computes the geometric representation of a polygon outline, including its vertices, indices, and a bounding sphere. + * @param polygonGeometry - A description of the polygon outline. + * @returns The computed vertices and indices. + */ + static createGeometry( + polygonGeometry: PolygonOutlineGeometry, + ): Geometry | undefined; + } + + /** + * A description of a polyline modeled as a line strip; the first two positions define a line segment, + * and each additional position defines a line segment from the previous position. The polyline is capable of + * displaying with a material. + * @example + * // A polyline with two connected line segments + * const polyline = new Cesium.PolylineGeometry({ + * positions : Cesium.Cartesian3.fromDegreesArray([ + * 0.0, 0.0, + * 5.0, 0.0, + * 5.0, 5.0 + * ]), + * width : 10.0 + * }); + * const geometry = Cesium.PolylineGeometry.createGeometry(polyline); + * @param options - Object with the following properties: + * @param options.positions - An array of {@link Cartesian3} defining the positions in the polyline as a line strip. + * @param [options.width = 1.0] - The width in pixels. + * @param [options.colors] - An Array of {@link Color} defining the per vertex or per segment colors. + * @param [options.colorsPerVertex = false] - A boolean that determines whether the colors will be flat across each segment of the line or interpolated across the vertices. + * @param [options.arcType = ArcType.GEODESIC] - The type of line the polyline segments must follow. + * @param [options.granularity = Math.RADIANS_PER_DEGREE] - The distance, in radians, between each latitude and longitude if options.arcType is not ArcType.NONE. Determines the number of positions in the buffer. + * @param [options.vertexFormat = VertexFormat.DEFAULT] - The vertex attributes to be computed. + * @param [options.ellipsoid = Ellipsoid.default] - The ellipsoid to be used as a reference. + */ + export class PolylineGeometry { + constructor(options: { + positions: Cartesian3[]; + width?: number; + colors?: Color[]; + colorsPerVertex?: boolean; + arcType?: ArcType; + granularity?: number; + vertexFormat?: VertexFormat; + ellipsoid?: Ellipsoid; + }); + /** + * The number of elements used to pack the object into an array. + */ + packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: PolylineGeometry, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new PolylineGeometry instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: PolylineGeometry, + ): PolylineGeometry; + /** + * Computes the geometric representation of a polyline, including its vertices, indices, and a bounding sphere. + * @param polylineGeometry - A description of the polyline. + * @returns The computed vertices and indices. + */ + static createGeometry( + polylineGeometry: PolylineGeometry, + ): Geometry | undefined; + } + + /** + * A description of a polyline with a volume (a 2D shape extruded along a polyline). + * @example + * function computeCircle(radius) { + * const positions = []; + * for (let i = 0; i < 360; i++) { + * const radians = Cesium.Math.toRadians(i); + * positions.push(new Cesium.Cartesian2(radius * Math.cos(radians), radius * Math.sin(radians))); + * } + * return positions; + * } + * + * const volume = new Cesium.PolylineVolumeGeometry({ + * vertexFormat : Cesium.VertexFormat.POSITION_ONLY, + * polylinePositions : Cesium.Cartesian3.fromDegreesArray([ + * -72.0, 40.0, + * -70.0, 35.0 + * ]), + * shapePositions : computeCircle(100000.0) + * }); + * @param options - Object with the following properties: + * @param options.polylinePositions - An array of {@link Cartesian3} positions that define the center of the polyline volume. + * @param options.shapePositions - An array of {@link Cartesian2} positions that define the shape to be extruded along the polyline + * @param [options.ellipsoid = Ellipsoid.default] - The ellipsoid to be used as a reference. + * @param [options.granularity = Math.RADIANS_PER_DEGREE] - The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer. + * @param [options.vertexFormat = VertexFormat.DEFAULT] - The vertex attributes to be computed. + * @param [options.cornerType = CornerType.ROUNDED] - Determines the style of the corners. + */ + export class PolylineVolumeGeometry { + constructor(options: { + polylinePositions: Cartesian3[]; + shapePositions: Cartesian2[]; + ellipsoid?: Ellipsoid; + granularity?: number; + vertexFormat?: VertexFormat; + cornerType?: CornerType; + }); + /** + * The number of elements used to pack the object into an array. + */ + packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: PolylineVolumeGeometry, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new PolylineVolumeGeometry instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: PolylineVolumeGeometry, + ): PolylineVolumeGeometry; + /** + * Computes the geometric representation of a polyline with a volume, including its vertices, indices, and a bounding sphere. + * @param polylineVolumeGeometry - A description of the polyline volume. + * @returns The computed vertices and indices. + */ + static createGeometry( + polylineVolumeGeometry: PolylineVolumeGeometry, + ): Geometry | undefined; + } + + /** + * A description of a polyline with a volume (a 2D shape extruded along a polyline). + * @example + * function computeCircle(radius) { + * const positions = []; + * for (let i = 0; i < 360; i++) { + * const radians = Cesium.Math.toRadians(i); + * positions.push(new Cesium.Cartesian2(radius * Math.cos(radians), radius * Math.sin(radians))); + * } + * return positions; + * } + * + * const volumeOutline = new Cesium.PolylineVolumeOutlineGeometry({ + * polylinePositions : Cesium.Cartesian3.fromDegreesArray([ + * -72.0, 40.0, + * -70.0, 35.0 + * ]), + * shapePositions : computeCircle(100000.0) + * }); + * @param options - Object with the following properties: + * @param options.polylinePositions - An array of positions that define the center of the polyline volume. + * @param options.shapePositions - An array of positions that define the shape to be extruded along the polyline + * @param [options.ellipsoid = Ellipsoid.default] - The ellipsoid to be used as a reference. + * @param [options.granularity = Math.RADIANS_PER_DEGREE] - The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer. + * @param [options.cornerType = CornerType.ROUNDED] - Determines the style of the corners. + */ + export class PolylineVolumeOutlineGeometry { + constructor(options: { + polylinePositions: Cartesian3[]; + shapePositions: Cartesian2[]; + ellipsoid?: Ellipsoid; + granularity?: number; + cornerType?: CornerType; + }); + /** + * The number of elements used to pack the object into an array. + */ + packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: PolylineVolumeOutlineGeometry, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new PolylineVolumeOutlineGeometry instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: PolylineVolumeOutlineGeometry, + ): PolylineVolumeOutlineGeometry; + /** + * Computes the geometric representation of the outline of a polyline with a volume, including its vertices, indices, and a bounding sphere. + * @param polylineVolumeOutlineGeometry - A description of the polyline volume outline. + * @returns The computed vertices and indices. + */ + static createGeometry( + polylineVolumeOutlineGeometry: PolylineVolumeOutlineGeometry, + ): Geometry | undefined; + } + + /** + * The type of a geometric primitive, i.e., points, lines, and triangles. + */ + export enum PrimitiveType { + /** + * Points primitive where each vertex (or index) is a separate point. + */ + POINTS = WebGLConstants.POINTS, + /** + * Lines primitive where each two vertices (or indices) is a line segment. Line segments are not necessarily connected. + */ + LINES = WebGLConstants.LINES, + /** + * Line loop primitive where each vertex (or index) after the first connects a line to + * the previous vertex, and the last vertex implicitly connects to the first. + */ + LINE_LOOP = WebGLConstants.LINE_LOOP, + /** + * Line strip primitive where each vertex (or index) after the first connects a line to the previous vertex. + */ + LINE_STRIP = WebGLConstants.LINE_STRIP, + /** + * Triangles primitive where each three vertices (or indices) is a triangle. Triangles do not necessarily share edges. + */ + TRIANGLES = WebGLConstants.TRIANGLES, + /** + * Triangle strip primitive where each vertex (or index) after the first two connect to + * the previous two vertices forming a triangle. For example, this can be used to model a wall. + */ + TRIANGLE_STRIP = WebGLConstants.TRIANGLE_STRIP, + /** + * Triangle fan primitive where each vertex (or index) after the first two connect to + * the previous vertex and the first vertex forming a triangle. For example, this can be used + * to model a cone or circle. + */ + TRIANGLE_FAN = WebGLConstants.TRIANGLE_FAN, + } + + /** + * Base class for proxying requested made by {@link Resource}. + */ + export class Proxy { + constructor(); + /** + * Get the final URL to use to request a given resource. + * @param resource - The resource to request. + * @returns proxied resource + */ + getURL(resource: string): string; + } + + /** + * Defines functions for 2nd order polynomial functions of one variable with only real coefficients. + */ + export namespace QuadraticRealPolynomial { + /** + * Provides the discriminant of the quadratic equation from the supplied coefficients. + * @param a - The coefficient of the 2nd order monomial. + * @param b - The coefficient of the 1st order monomial. + * @param c - The coefficient of the 0th order monomial. + * @returns The value of the discriminant. + */ + function computeDiscriminant(a: number, b: number, c: number): number; + /** + * Provides the real valued roots of the quadratic polynomial with the provided coefficients. + * @param a - The coefficient of the 2nd order monomial. + * @param b - The coefficient of the 1st order monomial. + * @param c - The coefficient of the 0th order monomial. + * @returns The real valued roots. + */ + function computeRealRoots(a: number, b: number, c: number): number[]; + } + + /** + * Terrain data for a single tile where the terrain data is represented as a quantized mesh. A quantized + * mesh consists of three vertex attributes, longitude, latitude, and height. All attributes are expressed + * as 16-bit values in the range 0 to 32767. Longitude and latitude are zero at the southwest corner + * of the tile and 32767 at the northeast corner. Height is zero at the minimum height in the tile + * and 32767 at the maximum height in the tile. + * @example + * const data = new Cesium.QuantizedMeshTerrainData({ + * minimumHeight : -100, + * maximumHeight : 2101, + * quantizedVertices : new Uint16Array([// order is SW NW SE NE + * // longitude + * 0, 0, 32767, 32767, + * // latitude + * 0, 32767, 0, 32767, + * // heights + * 16384, 0, 32767, 16384]), + * indices : new Uint16Array([0, 3, 1, + * 0, 2, 3]), + * boundingSphere : new Cesium.BoundingSphere(new Cesium.Cartesian3(1.0, 2.0, 3.0), 10000), + * orientedBoundingBox : new Cesium.OrientedBoundingBox(new Cesium.Cartesian3(1.0, 2.0, 3.0), Cesium.Matrix3.fromRotationX(Cesium.Math.PI, new Cesium.Matrix3())), + * horizonOcclusionPoint : new Cesium.Cartesian3(3.0, 2.0, 1.0), + * westIndices : [0, 1], + * southIndices : [0, 1], + * eastIndices : [2, 3], + * northIndices : [1, 3], + * westSkirtHeight : 1.0, + * southSkirtHeight : 1.0, + * eastSkirtHeight : 1.0, + * northSkirtHeight : 1.0 + * }); + * @param options - Object with the following properties: + * @param options.quantizedVertices - The buffer containing the quantized mesh. + * @param options.indices - The indices specifying how the quantized vertices are linked + * together into triangles. Each three indices specifies one triangle. + * @param options.minimumHeight - The minimum terrain height within the tile, in meters above the ellipsoid. + * @param options.maximumHeight - The maximum terrain height within the tile, in meters above the ellipsoid. + * @param options.boundingSphere - A sphere bounding all of the vertices in the mesh. + * @param [options.orientedBoundingBox] - An OrientedBoundingBox bounding all of the vertices in the mesh. + * @param options.horizonOcclusionPoint - The horizon occlusion point of the mesh. If this point + * is below the horizon, the entire tile is assumed to be below the horizon as well. + * The point is expressed in ellipsoid-scaled coordinates. + * @param options.westIndices - The indices of the vertices on the western edge of the tile. + * @param options.southIndices - The indices of the vertices on the southern edge of the tile. + * @param options.eastIndices - The indices of the vertices on the eastern edge of the tile. + * @param options.northIndices - The indices of the vertices on the northern edge of the tile. + * @param options.westSkirtHeight - The height of the skirt to add on the western edge of the tile. + * @param options.southSkirtHeight - The height of the skirt to add on the southern edge of the tile. + * @param options.eastSkirtHeight - The height of the skirt to add on the eastern edge of the tile. + * @param options.northSkirtHeight - The height of the skirt to add on the northern edge of the tile. + * @param [options.childTileMask = 15] - A bit mask indicating which of this tile's four children exist. + * If a child's bit is set, geometry will be requested for that tile as well when it + * is needed. If the bit is cleared, the child tile is not requested and geometry is + * instead upsampled from the parent. The bit values are as follows: + * + * + * + * + * + * + *
Bit PositionBit ValueChild Tile
01Southwest
12Southeast
24Northwest
38Northeast
+ * @param [options.createdByUpsampling = false] - True if this instance was created by upsampling another instance; + * otherwise, false. + * @param [options.encodedNormals] - The buffer containing per vertex normals, encoded using 'oct' encoding + * @param [options.waterMask] - The buffer containing the watermask. + * @param [options.credits] - Array of credits for this tile. + */ + export class QuantizedMeshTerrainData { + constructor(options: { + quantizedVertices: Uint16Array; + indices: Uint16Array | Uint32Array; + minimumHeight: number; + maximumHeight: number; + boundingSphere: BoundingSphere; + orientedBoundingBox?: OrientedBoundingBox; + horizonOcclusionPoint: Cartesian3; + westIndices: number[]; + southIndices: number[]; + eastIndices: number[]; + northIndices: number[]; + westSkirtHeight: number; + southSkirtHeight: number; + eastSkirtHeight: number; + northSkirtHeight: number; + childTileMask?: number; + createdByUpsampling?: boolean; + encodedNormals?: Uint8Array; + waterMask?: Uint8Array; + credits?: Credit[]; + }); + /** + * An array of credits for this tile. + */ + credits: Credit[]; + /** + * The water mask included in this terrain data, if any. A water mask is a rectangular + * Uint8Array or image where a value of 255 indicates water and a value of 0 indicates land. + * Values in between 0 and 255 are allowed as well to smoothly blend between land and water. + */ + waterMask: Uint8Array | HTMLImageElement | HTMLCanvasElement; + /** + * Upsamples this terrain data for use by a descendant tile. The resulting instance will contain a subset of the + * vertices in this instance, interpolated if necessary. + * @param tilingScheme - The tiling scheme of this terrain data. + * @param thisX - The X coordinate of this tile in the tiling scheme. + * @param thisY - The Y coordinate of this tile in the tiling scheme. + * @param thisLevel - The level of this tile in the tiling scheme. + * @param descendantX - The X coordinate within the tiling scheme of the descendant tile for which we are upsampling. + * @param descendantY - The Y coordinate within the tiling scheme of the descendant tile for which we are upsampling. + * @param descendantLevel - The level within the tiling scheme of the descendant tile for which we are upsampling. + * @returns A promise for upsampled heightmap terrain data for the descendant tile, + * or undefined if too many asynchronous upsample operations are in progress and the request has been + * deferred. + */ + upsample( + tilingScheme: TilingScheme, + thisX: number, + thisY: number, + thisLevel: number, + descendantX: number, + descendantY: number, + descendantLevel: number, + ): Promise | undefined; + /** + * Computes the terrain height at a specified longitude and latitude. + * @param rectangle - The rectangle covered by this terrain data. + * @param longitude - The longitude in radians. + * @param latitude - The latitude in radians. + * @returns The terrain height at the specified position. The position is clamped to + * the rectangle, so expect incorrect results for positions far outside the rectangle. + */ + interpolateHeight( + rectangle: Rectangle, + longitude: number, + latitude: number, + ): number; + /** + * Determines if a given child tile is available, based on the + * {@link HeightmapTerrainData.childTileMask}. The given child tile coordinates are assumed + * to be one of the four children of this tile. If non-child tile coordinates are + * given, the availability of the southeast child tile is returned. + * @param thisX - The tile X coordinate of this (the parent) tile. + * @param thisY - The tile Y coordinate of this (the parent) tile. + * @param childX - The tile X coordinate of the child tile to check for availability. + * @param childY - The tile Y coordinate of the child tile to check for availability. + * @returns True if the child tile is available; otherwise, false. + */ + isChildAvailable( + thisX: number, + thisY: number, + childX: number, + childY: number, + ): boolean; + /** + * Gets a value indicating whether or not this terrain data was created by upsampling lower resolution + * terrain data. If this value is false, the data was obtained from some other source, such + * as by downloading it from a remote server. This method should return true for instances + * returned from a call to {@link HeightmapTerrainData#upsample}. + * @returns True if this instance was created by upsampling; otherwise, false. + */ + wasCreatedByUpsampling(): boolean; + } + + /** + * Defines functions for 4th order polynomial functions of one variable with only real coefficients. + */ + export namespace QuarticRealPolynomial { + /** + * Provides the discriminant of the quartic equation from the supplied coefficients. + * @param a - The coefficient of the 4th order monomial. + * @param b - The coefficient of the 3rd order monomial. + * @param c - The coefficient of the 2nd order monomial. + * @param d - The coefficient of the 1st order monomial. + * @param e - The coefficient of the 0th order monomial. + * @returns The value of the discriminant. + */ + function computeDiscriminant( + a: number, + b: number, + c: number, + d: number, + e: number, + ): number; + /** + * Provides the real valued roots of the quartic polynomial with the provided coefficients. + * @param a - The coefficient of the 4th order monomial. + * @param b - The coefficient of the 3rd order monomial. + * @param c - The coefficient of the 2nd order monomial. + * @param d - The coefficient of the 1st order monomial. + * @param e - The coefficient of the 0th order monomial. + * @returns The real valued roots. + */ + function computeRealRoots( + a: number, + b: number, + c: number, + d: number, + e: number, + ): number[]; + } + + /** + * A set of 4-dimensional coordinates used to represent rotation in 3-dimensional space. + * @param [x = 0.0] - The X component. + * @param [y = 0.0] - The Y component. + * @param [z = 0.0] - The Z component. + * @param [w = 0.0] - The W component. + */ + export class Quaternion { + constructor(x?: number, y?: number, z?: number, w?: number); + /** + * The X component. + */ + x: number; + /** + * The Y component. + */ + y: number; + /** + * The Z component. + */ + z: number; + /** + * The W component. + */ + w: number; + /** + * Computes a quaternion representing a rotation around an axis. + * @param axis - The axis of rotation. + * @param angle - The angle in radians to rotate around the axis. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Quaternion instance if one was not provided. + */ + static fromAxisAngle( + axis: Cartesian3, + angle: number, + result?: Quaternion, + ): Quaternion; + /** + * Computes a Quaternion from the provided Matrix3 instance. + * @param matrix - The rotation matrix. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Quaternion instance if one was not provided. + */ + static fromRotationMatrix(matrix: Matrix3, result?: Quaternion): Quaternion; + /** + * Computes a rotation from the given heading, pitch and roll angles. Heading is the rotation about the + * negative z axis. Pitch is the rotation about the negative y axis. Roll is the rotation about + * the positive x axis. + * @param headingPitchRoll - The rotation expressed as a heading, pitch and roll. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Quaternion instance if none was provided. + */ + static fromHeadingPitchRoll( + headingPitchRoll: HeadingPitchRoll, + result?: Quaternion, + ): Quaternion; + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: Quaternion, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new Quaternion instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: Quaternion, + ): Quaternion; + /** + * The number of elements used to store the object into an array in its interpolatable form. + */ + static packedInterpolationLength: number; + /** + * Converts a packed array into a form suitable for interpolation. + * @param packedArray - The packed array. + * @param [startingIndex = 0] - The index of the first element to be converted. + * @param [lastIndex = packedArray.length] - The index of the last element to be converted. + * @param [result] - The object into which to store the result. + */ + static convertPackedArrayForInterpolation( + packedArray: number[], + startingIndex?: number, + lastIndex?: number, + result?: number[], + ): void; + /** + * Retrieves an instance from a packed array converted with {@link convertPackedArrayForInterpolation}. + * @param array - The array previously packed for interpolation. + * @param sourceArray - The original packed array. + * @param [firstIndex = 0] - The firstIndex used to convert the array. + * @param [lastIndex = packedArray.length] - The lastIndex used to convert the array. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new Quaternion instance if one was not provided. + */ + static unpackInterpolationResult( + array: number[], + sourceArray: number[], + firstIndex?: number, + lastIndex?: number, + result?: Quaternion, + ): Quaternion; + /** + * Duplicates a Quaternion instance. + * @param quaternion - The quaternion to duplicate. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Quaternion instance if one was not provided. (Returns undefined if quaternion is undefined) + */ + static clone(quaternion: Quaternion, result?: Quaternion): Quaternion; + /** + * Computes the conjugate of the provided quaternion. + * @param quaternion - The quaternion to conjugate. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static conjugate(quaternion: Quaternion, result: Quaternion): Quaternion; + /** + * Computes magnitude squared for the provided quaternion. + * @param quaternion - The quaternion to conjugate. + * @returns The magnitude squared. + */ + static magnitudeSquared(quaternion: Quaternion): number; + /** + * Computes magnitude for the provided quaternion. + * @param quaternion - The quaternion to conjugate. + * @returns The magnitude. + */ + static magnitude(quaternion: Quaternion): number; + /** + * Computes the normalized form of the provided quaternion. + * @param quaternion - The quaternion to normalize. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static normalize(quaternion: Quaternion, result: Quaternion): Quaternion; + /** + * Computes the inverse of the provided quaternion. + * @param quaternion - The quaternion to normalize. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static inverse(quaternion: Quaternion, result: Quaternion): Quaternion; + /** + * Computes the componentwise sum of two quaternions. + * @param left - The first quaternion. + * @param right - The second quaternion. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static add( + left: Quaternion, + right: Quaternion, + result: Quaternion, + ): Quaternion; + /** + * Computes the componentwise difference of two quaternions. + * @param left - The first quaternion. + * @param right - The second quaternion. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static subtract( + left: Quaternion, + right: Quaternion, + result: Quaternion, + ): Quaternion; + /** + * Negates the provided quaternion. + * @param quaternion - The quaternion to be negated. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static negate(quaternion: Quaternion, result: Quaternion): Quaternion; + /** + * Computes the dot (scalar) product of two quaternions. + * @param left - The first quaternion. + * @param right - The second quaternion. + * @returns The dot product. + */ + static dot(left: Quaternion, right: Quaternion): number; + /** + * Computes the product of two quaternions. + * @param left - The first quaternion. + * @param right - The second quaternion. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiply( + left: Quaternion, + right: Quaternion, + result: Quaternion, + ): Quaternion; + /** + * Multiplies the provided quaternion componentwise by the provided scalar. + * @param quaternion - The quaternion to be scaled. + * @param scalar - The scalar to multiply with. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static multiplyByScalar( + quaternion: Quaternion, + scalar: number, + result: Quaternion, + ): Quaternion; + /** + * Divides the provided quaternion componentwise by the provided scalar. + * @param quaternion - The quaternion to be divided. + * @param scalar - The scalar to divide by. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static divideByScalar( + quaternion: Quaternion, + scalar: number, + result: Quaternion, + ): Quaternion; + /** + * Computes the axis of rotation of the provided quaternion. + * @param quaternion - The quaternion to use. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static computeAxis(quaternion: Quaternion, result: Cartesian3): Cartesian3; + /** + * Computes the angle of rotation of the provided quaternion. + * @param quaternion - The quaternion to use. + * @returns The angle of rotation. + */ + static computeAngle(quaternion: Quaternion): number; + /** + * Computes the linear interpolation or extrapolation at t using the provided quaternions. + * @param start - The value corresponding to t at 0.0. + * @param end - The value corresponding to t at 1.0. + * @param t - The point along t at which to interpolate. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static lerp( + start: Quaternion, + end: Quaternion, + t: number, + result: Quaternion, + ): Quaternion; + /** + * Computes the spherical linear interpolation or extrapolation at t using the provided quaternions. + * @param start - The value corresponding to t at 0.0. + * @param end - The value corresponding to t at 1.0. + * @param t - The point along t at which to interpolate. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static slerp( + start: Quaternion, + end: Quaternion, + t: number, + result: Quaternion, + ): Quaternion; + /** + * The logarithmic quaternion function. + * @param quaternion - The unit quaternion. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static log(quaternion: Quaternion, result: Cartesian3): Cartesian3; + /** + * The exponential quaternion function. + * @param cartesian - The cartesian. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static exp(cartesian: Cartesian3, result: Quaternion): Quaternion; + /** + * Computes an inner quadrangle point. + *

This will compute quaternions that ensure a squad curve is C1.

+ * @param q0 - The first quaternion. + * @param q1 - The second quaternion. + * @param q2 - The third quaternion. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static computeInnerQuadrangle( + q0: Quaternion, + q1: Quaternion, + q2: Quaternion, + result: Quaternion, + ): Quaternion; + /** + * Computes the spherical quadrangle interpolation between quaternions. + * @example + * // 1. compute the squad interpolation between two quaternions on a curve + * const s0 = Cesium.Quaternion.computeInnerQuadrangle(quaternions[i - 1], quaternions[i], quaternions[i + 1], new Cesium.Quaternion()); + * const s1 = Cesium.Quaternion.computeInnerQuadrangle(quaternions[i], quaternions[i + 1], quaternions[i + 2], new Cesium.Quaternion()); + * const q = Cesium.Quaternion.squad(quaternions[i], quaternions[i + 1], s0, s1, t, new Cesium.Quaternion()); + * + * // 2. compute the squad interpolation as above but where the first quaternion is a end point. + * const s1 = Cesium.Quaternion.computeInnerQuadrangle(quaternions[0], quaternions[1], quaternions[2], new Cesium.Quaternion()); + * const q = Cesium.Quaternion.squad(quaternions[0], quaternions[1], quaternions[0], s1, t, new Cesium.Quaternion()); + * @param q0 - The first quaternion. + * @param q1 - The second quaternion. + * @param s0 - The first inner quadrangle. + * @param s1 - The second inner quadrangle. + * @param t - The time in [0,1] used to interpolate. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static squad( + q0: Quaternion, + q1: Quaternion, + s0: Quaternion, + s1: Quaternion, + t: number, + result: Quaternion, + ): Quaternion; + /** + * Computes the spherical linear interpolation or extrapolation at t using the provided quaternions. + * This implementation is faster than {@link Quaternion#slerp}, but is only accurate up to 10-6. + * @param start - The value corresponding to t at 0.0. + * @param end - The value corresponding to t at 1.0. + * @param t - The point along t at which to interpolate. + * @param result - The object onto which to store the result. + * @returns The modified result parameter. + */ + static fastSlerp( + start: Quaternion, + end: Quaternion, + t: number, + result: Quaternion, + ): Quaternion; + /** + * Computes the spherical quadrangle interpolation between quaternions. + * An implementation that is faster than {@link Quaternion#squad}, but less accurate. + * @param q0 - The first quaternion. + * @param q1 - The second quaternion. + * @param s0 - The first inner quadrangle. + * @param s1 - The second inner quadrangle. + * @param t - The time in [0,1] used to interpolate. + * @param result - The object onto which to store the result. + * @returns The modified result parameter or a new instance if none was provided. + */ + static fastSquad( + q0: Quaternion, + q1: Quaternion, + s0: Quaternion, + s1: Quaternion, + t: number, + result: Quaternion, + ): Quaternion; + /** + * Compares the provided quaternions componentwise and returns + * true if they are equal, false otherwise. + * @param [left] - The first quaternion. + * @param [right] - The second quaternion. + * @returns true if left and right are equal, false otherwise. + */ + static equals(left?: Quaternion, right?: Quaternion): boolean; + /** + * Compares the provided quaternions componentwise and returns + * true if they are within the provided epsilon, + * false otherwise. + * @param [left] - The first quaternion. + * @param [right] - The second quaternion. + * @param [epsilon = 0] - The epsilon to use for equality testing. + * @returns true if left and right are within the provided epsilon, false otherwise. + */ + static equalsEpsilon( + left?: Quaternion, + right?: Quaternion, + epsilon?: number, + ): boolean; + /** + * An immutable Quaternion instance initialized to (0.0, 0.0, 0.0, 0.0). + */ + static readonly ZERO: Quaternion; + /** + * An immutable Quaternion instance initialized to (0.0, 0.0, 0.0, 1.0). + */ + static readonly IDENTITY: Quaternion; + /** + * Duplicates this Quaternion instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Quaternion instance if one was not provided. + */ + clone(result?: Quaternion): Quaternion; + /** + * Compares this and the provided quaternion componentwise and returns + * true if they are equal, false otherwise. + * @param [right] - The right hand side quaternion. + * @returns true if left and right are equal, false otherwise. + */ + equals(right?: Quaternion): boolean; + /** + * Compares this and the provided quaternion componentwise and returns + * true if they are within the provided epsilon, + * false otherwise. + * @param [right] - The right hand side quaternion. + * @param [epsilon = 0] - The epsilon to use for equality testing. + * @returns true if left and right are within the provided epsilon, false otherwise. + */ + equalsEpsilon(right?: Quaternion, epsilon?: number): boolean; + /** + * Returns a string representing this quaternion in the format (x, y, z, w). + * @returns A string representing this Quaternion. + */ + toString(): string; + } + + /** + * A spline that uses spherical linear (slerp) interpolation to create a quaternion curve. + * The generated curve is in the class C1. + * @param options - Object with the following properties: + * @param options.times - An array of strictly increasing, unit-less, floating-point times at each point. + * The values are in no way connected to the clock time. They are the parameterization for the curve. + * @param options.points - The array of {@link Quaternion} control points. + */ + export class QuaternionSpline { + constructor(options: { times: number[]; points: Quaternion[] }); + /** + * An array of times for the control points. + */ + readonly times: number[]; + /** + * An array of {@link Quaternion} control points. + */ + readonly points: Quaternion[]; + /** + * Finds an index i in times such that the parameter + * time is in the interval [times[i], times[i + 1]]. + * @param time - The time. + * @returns The index for the element at the start of the interval. + */ + findTimeInterval(time: number): number; + /** + * Wraps the given time to the period covered by the spline. + * @param time - The time. + * @returns The time, wrapped around to the updated animation. + */ + wrapTime(time: number): number; + /** + * Clamps the given time to the period covered by the spline. + * @param time - The time. + * @returns The time, clamped to the animation period. + */ + clampTime(time: number): number; + /** + * Evaluates the curve at a given time. + * @param time - The time at which to evaluate the curve. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance of the point on the curve at the given time. + */ + evaluate(time: number, result?: Quaternion): Quaternion; + } + + /** + * A queue that can enqueue items at the end, and dequeue items from the front. + */ + export class Queue { + constructor(); + /** + * The length of the queue. + */ + readonly length: number; + /** + * Enqueues the specified item. + * @param item - The item to enqueue. + */ + enqueue(item: any): void; + /** + * Dequeues an item. Returns undefined if the queue is empty. + * @returns The the dequeued item. + */ + dequeue(): any; + /** + * Returns the item at the front of the queue. Returns undefined if the queue is empty. + * @returns The item at the front of the queue. + */ + peek(): any; + /** + * Check whether this queue contains the specified item. + * @param item - The item to search for. + */ + contains(item: any): void; + /** + * Remove all items from the queue. + */ + clear(): void; + /** + * Sort the items in the queue in-place. + * @param compareFunction - A function that defines the sort order. + */ + sort(compareFunction: Queue.Comparator): void; + } + + export namespace Queue { + /** + * A function used to compare two items while sorting a queue. + * @example + * function compareNumbers(a, b) { + * return a - b; + * } + * @param a - An item in the array. + * @param b - An item in the array. + */ + type Comparator = (a: any, b: any) => number; + } + + /** + * Represents a ray that extends infinitely from the provided origin in the provided direction. + * @param [origin = Cartesian3.ZERO] - The origin of the ray. + * @param [direction = Cartesian3.ZERO] - The direction of the ray. + */ + export class Ray { + constructor(origin?: Cartesian3, direction?: Cartesian3); + /** + * The origin of the ray. + */ + origin: Cartesian3; + /** + * The direction of the ray. + */ + direction: Cartesian3; + /** + * Duplicates a Ray instance. + * @param ray - The ray to duplicate. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Ray instance if one was not provided. (Returns undefined if ray is undefined) + */ + static clone(ray: Ray, result?: Ray): Ray; + /** + * Computes the point along the ray given by r(t) = o + t*d, + * where o is the origin of the ray and d is the direction. + * @example + * //Get the first intersection point of a ray and an ellipsoid. + * const intersection = Cesium.IntersectionTests.rayEllipsoid(ray, ellipsoid); + * const point = Cesium.Ray.getPoint(ray, intersection.start); + * @param ray - The ray. + * @param t - A scalar value. + * @param [result] - The object in which the result will be stored. + * @returns The modified result parameter, or a new instance if none was provided. + */ + static getPoint(ray: Ray, t: number, result?: Cartesian3): Cartesian3; + } + + /** + * A two dimensional region specified as longitude and latitude coordinates. + * @param [west = 0.0] - The westernmost longitude, in radians, in the range [-Pi, Pi]. + * @param [south = 0.0] - The southernmost latitude, in radians, in the range [-Pi/2, Pi/2]. + * @param [east = 0.0] - The easternmost longitude, in radians, in the range [-Pi, Pi]. + * @param [north = 0.0] - The northernmost latitude, in radians, in the range [-Pi/2, Pi/2]. + */ + export class Rectangle { + constructor(west?: number, south?: number, east?: number, north?: number); + /** + * The westernmost longitude in radians in the range [-Pi, Pi]. + */ + west: number; + /** + * The southernmost latitude in radians in the range [-Pi/2, Pi/2]. + */ + south: number; + /** + * The easternmost longitude in radians in the range [-Pi, Pi]. + */ + east: number; + /** + * The northernmost latitude in radians in the range [-Pi/2, Pi/2]. + */ + north: number; + /** + * Gets the width of the rectangle in radians. + */ + readonly width: number; + /** + * Gets the height of the rectangle in radians. + */ + readonly height: number; + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: Rectangle, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new Rectangle instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: Rectangle, + ): Rectangle; + /** + * Computes the width of a rectangle in radians. + * @param rectangle - The rectangle to compute the width of. + * @returns The width. + */ + static computeWidth(rectangle: Rectangle): number; + /** + * Computes the height of a rectangle in radians. + * @param rectangle - The rectangle to compute the height of. + * @returns The height. + */ + static computeHeight(rectangle: Rectangle): number; + /** + * Creates a rectangle given the boundary longitude and latitude in degrees. + * @example + * const rectangle = Cesium.Rectangle.fromDegrees(0.0, 20.0, 10.0, 30.0); + * @param [west = 0.0] - The westernmost longitude in degrees in the range [-180.0, 180.0]. + * @param [south = 0.0] - The southernmost latitude in degrees in the range [-90.0, 90.0]. + * @param [east = 0.0] - The easternmost longitude in degrees in the range [-180.0, 180.0]. + * @param [north = 0.0] - The northernmost latitude in degrees in the range [-90.0, 90.0]. + * @param [result] - The object onto which to store the result, or undefined if a new instance should be created. + * @returns The modified result parameter or a new Rectangle instance if none was provided. + */ + static fromDegrees( + west?: number, + south?: number, + east?: number, + north?: number, + result?: Rectangle, + ): Rectangle; + /** + * Creates a rectangle given the boundary longitude and latitude in radians. + * @example + * const rectangle = Cesium.Rectangle.fromRadians(0.0, Math.PI/4, Math.PI/8, 3*Math.PI/4); + * @param [west = 0.0] - The westernmost longitude in radians in the range [-Math.PI, Math.PI]. + * @param [south = 0.0] - The southernmost latitude in radians in the range [-Math.PI/2, Math.PI/2]. + * @param [east = 0.0] - The easternmost longitude in radians in the range [-Math.PI, Math.PI]. + * @param [north = 0.0] - The northernmost latitude in radians in the range [-Math.PI/2, Math.PI/2]. + * @param [result] - The object onto which to store the result, or undefined if a new instance should be created. + * @returns The modified result parameter or a new Rectangle instance if none was provided. + */ + static fromRadians( + west?: number, + south?: number, + east?: number, + north?: number, + result?: Rectangle, + ): Rectangle; + /** + * Creates the smallest possible Rectangle that encloses all positions in the provided array. + * @param cartographics - The list of Cartographic instances. + * @param [result] - The object onto which to store the result, or undefined if a new instance should be created. + * @returns The modified result parameter or a new Rectangle instance if none was provided. + */ + static fromCartographicArray( + cartographics: Cartographic[], + result?: Rectangle, + ): Rectangle; + /** + * Creates the smallest possible Rectangle that encloses all positions in the provided array. + * @param cartesians - The list of Cartesian instances. + * @param [ellipsoid = Ellipsoid.default] - The ellipsoid the cartesians are on. + * @param [result] - The object onto which to store the result, or undefined if a new instance should be created. + * @returns The modified result parameter or a new Rectangle instance if none was provided. + */ + static fromCartesianArray( + cartesians: Cartesian3[], + ellipsoid?: Ellipsoid, + result?: Rectangle, + ): Rectangle; + /** + * Create a rectangle from a bounding sphere, ignoring height. + * @param boundingSphere - The bounding sphere. + * @param [ellipsoid = Ellipsoid.default] - The ellipsoid. + * @param [result] - The object onto which to store the result, or undefined if a new instance should be created. + * @returns The modified result parameter or a new Rectangle instance if none was provided. + */ + static fromBoundingSphere( + boundingSphere: BoundingSphere, + ellipsoid?: Ellipsoid, + result?: Rectangle, + ): Rectangle; + /** + * Duplicates a Rectangle. + * @param rectangle - The rectangle to clone. + * @param [result] - The object onto which to store the result, or undefined if a new instance should be created. + * @returns The modified result parameter or a new Rectangle instance if none was provided. (Returns undefined if rectangle is undefined) + */ + static clone(rectangle: Rectangle, result?: Rectangle): Rectangle; + /** + * Compares the provided Rectangles componentwise and returns + * true if they pass an absolute or relative tolerance test, + * false otherwise. + * @param [left] - The first Rectangle. + * @param [right] - The second Rectangle. + * @param [absoluteEpsilon = 0] - The absolute epsilon tolerance to use for equality testing. + * @returns true if left and right are within the provided epsilon, false otherwise. + */ + static equalsEpsilon( + left?: Rectangle, + right?: Rectangle, + absoluteEpsilon?: number, + ): boolean; + /** + * Duplicates this Rectangle. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Rectangle instance if none was provided. + */ + clone(result?: Rectangle): Rectangle; + /** + * Compares the provided Rectangle with this Rectangle componentwise and returns + * true if they are equal, false otherwise. + * @param [other] - The Rectangle to compare. + * @returns true if the Rectangles are equal, false otherwise. + */ + equals(other?: Rectangle): boolean; + /** + * Compares the provided rectangles and returns true if they are equal, + * false otherwise. + * @param [left] - The first Rectangle. + * @param [right] - The second Rectangle. + * @returns true if left and right are equal; otherwise false. + */ + static equals(left?: Rectangle, right?: Rectangle): boolean; + /** + * Compares the provided Rectangle with this Rectangle componentwise and returns + * true if they are within the provided epsilon, + * false otherwise. + * @param [other] - The Rectangle to compare. + * @param [epsilon = 0] - The epsilon to use for equality testing. + * @returns true if the Rectangles are within the provided epsilon, false otherwise. + */ + equalsEpsilon(other?: Rectangle, epsilon?: number): boolean; + /** + * Computes the southwest corner of a rectangle. + * @param rectangle - The rectangle for which to find the corner + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartographic instance if none was provided. + */ + static southwest(rectangle: Rectangle, result?: Cartographic): Cartographic; + /** + * Computes the northwest corner of a rectangle. + * @param rectangle - The rectangle for which to find the corner + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartographic instance if none was provided. + */ + static northwest(rectangle: Rectangle, result?: Cartographic): Cartographic; + /** + * Computes the northeast corner of a rectangle. + * @param rectangle - The rectangle for which to find the corner + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartographic instance if none was provided. + */ + static northeast(rectangle: Rectangle, result?: Cartographic): Cartographic; + /** + * Computes the southeast corner of a rectangle. + * @param rectangle - The rectangle for which to find the corner + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartographic instance if none was provided. + */ + static southeast(rectangle: Rectangle, result?: Cartographic): Cartographic; + /** + * Computes the center of a rectangle. + * @param rectangle - The rectangle for which to find the center + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartographic instance if none was provided. + */ + static center(rectangle: Rectangle, result?: Cartographic): Cartographic; + /** + * Computes the intersection of two rectangles. This function assumes that the rectangle's coordinates are + * latitude and longitude in radians and produces a correct intersection, taking into account the fact that + * the same angle can be represented with multiple values as well as the wrapping of longitude at the + * anti-meridian. For a simple intersection that ignores these factors and can be used with projected + * coordinates, see {@link Rectangle.simpleIntersection}. + * @param rectangle - On rectangle to find an intersection + * @param otherRectangle - Another rectangle to find an intersection + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter, a new Rectangle instance if none was provided or undefined if there is no intersection. + */ + static intersection( + rectangle: Rectangle, + otherRectangle: Rectangle, + result?: Rectangle, + ): Rectangle | undefined; + /** + * Computes a simple intersection of two rectangles. Unlike {@link Rectangle.intersection}, this function + * does not attempt to put the angular coordinates into a consistent range or to account for crossing the + * anti-meridian. As such, it can be used for rectangles where the coordinates are not simply latitude + * and longitude (i.e. projected coordinates). + * @param rectangle - On rectangle to find an intersection + * @param otherRectangle - Another rectangle to find an intersection + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter, a new Rectangle instance if none was provided or undefined if there is no intersection. + */ + static simpleIntersection( + rectangle: Rectangle, + otherRectangle: Rectangle, + result?: Rectangle, + ): Rectangle | undefined; + /** + * Computes a rectangle that is the union of two rectangles. + * @param rectangle - A rectangle to enclose in rectangle. + * @param otherRectangle - A rectangle to enclose in a rectangle. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Rectangle instance if none was provided. + */ + static union( + rectangle: Rectangle, + otherRectangle: Rectangle, + result?: Rectangle, + ): Rectangle; + /** + * Computes a rectangle by enlarging the provided rectangle until it contains the provided cartographic. + * @param rectangle - A rectangle to expand. + * @param cartographic - A cartographic to enclose in a rectangle. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Rectangle instance if one was not provided. + */ + static expand( + rectangle: Rectangle, + cartographic: Cartographic, + result?: Rectangle, + ): Rectangle; + /** + * Returns true if the cartographic is on or inside the rectangle, false otherwise. + * @param rectangle - The rectangle + * @param cartographic - The cartographic to test. + * @returns true if the provided cartographic is inside the rectangle, false otherwise. + */ + static contains(rectangle: Rectangle, cartographic: Cartographic): boolean; + /** + * Samples a rectangle so that it includes a list of Cartesian points suitable for passing to + * {@link BoundingSphere#fromPoints}. Sampling is necessary to account + * for rectangles that cover the poles or cross the equator. + * @param rectangle - The rectangle to subsample. + * @param [ellipsoid = Ellipsoid.default] - The ellipsoid to use. + * @param [surfaceHeight = 0.0] - The height of the rectangle above the ellipsoid. + * @param [result] - The array of Cartesians onto which to store the result. + * @returns The modified result parameter or a new Array of Cartesians instances if none was provided. + */ + static subsample( + rectangle: Rectangle, + ellipsoid?: Ellipsoid, + surfaceHeight?: number, + result?: Cartesian3[], + ): Cartesian3[]; + /** + * Computes a subsection of a rectangle from normalized coordinates in the range [0.0, 1.0]. + * @param rectangle - The rectangle to subsection. + * @param westLerp - The west interpolation factor in the range [0.0, 1.0]. Must be less than or equal to eastLerp. + * @param southLerp - The south interpolation factor in the range [0.0, 1.0]. Must be less than or equal to northLerp. + * @param eastLerp - The east interpolation factor in the range [0.0, 1.0]. Must be greater than or equal to westLerp. + * @param northLerp - The north interpolation factor in the range [0.0, 1.0]. Must be greater than or equal to southLerp. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Rectangle instance if none was provided. + */ + static subsection( + rectangle: Rectangle, + westLerp: number, + southLerp: number, + eastLerp: number, + northLerp: number, + result?: Rectangle, + ): Rectangle; + /** + * The largest possible rectangle. + */ + static readonly MAX_VALUE: Rectangle; + } + + /** + * A description of a cartographic rectangle on an ellipsoid centered at the origin. Rectangle geometry can be rendered with both {@link Primitive} and {@link GroundPrimitive}. + * @example + * // 1. create a rectangle + * const rectangle = new Cesium.RectangleGeometry({ + * ellipsoid : Cesium.Ellipsoid.default, + * rectangle : Cesium.Rectangle.fromDegrees(-80.0, 39.0, -74.0, 42.0), + * height : 10000.0 + * }); + * const geometry = Cesium.RectangleGeometry.createGeometry(rectangle); + * + * // 2. create an extruded rectangle without a top + * const rectangle = new Cesium.RectangleGeometry({ + * ellipsoid : Cesium.Ellipsoid.default, + * rectangle : Cesium.Rectangle.fromDegrees(-80.0, 39.0, -74.0, 42.0), + * height : 10000.0, + * extrudedHeight: 300000 + * }); + * const geometry = Cesium.RectangleGeometry.createGeometry(rectangle); + * @param options - Object with the following properties: + * @param options.rectangle - A cartographic rectangle with north, south, east and west properties in radians. + * @param [options.vertexFormat = VertexFormat.DEFAULT] - The vertex attributes to be computed. + * @param [options.ellipsoid = Ellipsoid.default] - The ellipsoid on which the rectangle lies. + * @param [options.granularity = Math.RADIANS_PER_DEGREE] - The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer. + * @param [options.height = 0.0] - The distance in meters between the rectangle and the ellipsoid surface. + * @param [options.rotation = 0.0] - The rotation of the rectangle, in radians. A positive rotation is counter-clockwise. + * @param [options.stRotation = 0.0] - The rotation of the texture coordinates, in radians. A positive rotation is counter-clockwise. + * @param [options.extrudedHeight] - The distance in meters between the rectangle's extruded face and the ellipsoid surface. + */ + export class RectangleGeometry { + constructor(options: { + rectangle: Rectangle; + vertexFormat?: VertexFormat; + ellipsoid?: Ellipsoid; + granularity?: number; + height?: number; + rotation?: number; + stRotation?: number; + extrudedHeight?: number; + }); + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: RectangleGeometry, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new RectangleGeometry instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: RectangleGeometry, + ): RectangleGeometry; + /** + * Computes the bounding rectangle based on the provided options + * @param options - Object with the following properties: + * @param options.rectangle - A cartographic rectangle with north, south, east and west properties in radians. + * @param [options.ellipsoid = Ellipsoid.default] - The ellipsoid on which the rectangle lies. + * @param [options.granularity = Math.RADIANS_PER_DEGREE] - The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer. + * @param [options.rotation = 0.0] - The rotation of the rectangle, in radians. A positive rotation is counter-clockwise. + * @param [result] - An object in which to store the result. + * @returns The result rectangle + */ + static computeRectangle( + options: { + rectangle: Rectangle; + ellipsoid?: Ellipsoid; + granularity?: number; + rotation?: number; + }, + result?: Rectangle, + ): Rectangle; + /** + * Computes the geometric representation of a rectangle, including its vertices, indices, and a bounding sphere. + * @param rectangleGeometry - A description of the rectangle. + * @returns The computed vertices and indices. + */ + static createGeometry( + rectangleGeometry: RectangleGeometry, + ): Geometry | undefined; + } + + /** + * A description of the outline of a a cartographic rectangle on an ellipsoid centered at the origin. + * @example + * const rectangle = new Cesium.RectangleOutlineGeometry({ + * ellipsoid : Cesium.Ellipsoid.WGS84, + * rectangle : Cesium.Rectangle.fromDegrees(-80.0, 39.0, -74.0, 42.0), + * height : 10000.0 + * }); + * const geometry = Cesium.RectangleOutlineGeometry.createGeometry(rectangle); + * @param options - Object with the following properties: + * @param options.rectangle - A cartographic rectangle with north, south, east and west properties in radians. + * @param [options.ellipsoid = Ellipsoid.default] - The ellipsoid on which the rectangle lies. + * @param [options.granularity = Math.RADIANS_PER_DEGREE] - The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer. + * @param [options.height = 0.0] - The distance in meters between the rectangle and the ellipsoid surface. + * @param [options.rotation = 0.0] - The rotation of the rectangle, in radians. A positive rotation is counter-clockwise. + * @param [options.extrudedHeight] - The distance in meters between the rectangle's extruded face and the ellipsoid surface. + */ + export class RectangleOutlineGeometry { + constructor(options: { + rectangle: Rectangle; + ellipsoid?: Ellipsoid; + granularity?: number; + height?: number; + rotation?: number; + extrudedHeight?: number; + }); + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: RectangleOutlineGeometry, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new Quaternion instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: RectangleOutlineGeometry, + ): RectangleOutlineGeometry; + /** + * Computes the geometric representation of an outline of a rectangle, including its vertices, indices, and a bounding sphere. + * @param rectangleGeometry - A description of the rectangle outline. + * @returns The computed vertices and indices. + */ + static createGeometry( + rectangleGeometry: RectangleOutlineGeometry, + ): Geometry | undefined; + } + + /** + * Constants for identifying well-known reference frames. + */ + export enum ReferenceFrame { + /** + * The fixed frame. + */ + FIXED = 0, + /** + * The inertial frame. + */ + INERTIAL = 1, + } + + /** + * Stores information for making a request. In general this does not need to be constructed directly. + * @param [options] - An object with the following properties: + * @param [options.url] - The url to request. + * @param [options.requestFunction] - The function that makes the actual data request. + * @param [options.cancelFunction] - The function that is called when the request is cancelled. + * @param [options.priorityFunction] - The function that is called to update the request's priority, which occurs once per frame. + * @param [options.priority = 0.0] - The initial priority of the request. + * @param [options.throttle = false] - Whether to throttle and prioritize the request. If false, the request will be sent immediately. If true, the request will be throttled and sent based on priority. + * @param [options.throttleByServer = false] - Whether to throttle the request by server. + * @param [options.type = RequestType.OTHER] - The type of request. + * @param [options.serverKey] - A key used to identify the server that a request is going to. + */ + export class Request { + constructor(options?: { + url?: string; + requestFunction?: Request.RequestCallback; + cancelFunction?: Request.CancelCallback; + priorityFunction?: Request.PriorityCallback; + priority?: number; + throttle?: boolean; + throttleByServer?: boolean; + type?: RequestType; + serverKey?: string; + }); + /** + * The URL to request. + */ + url: string; + /** + * The function that makes the actual data request. + */ + requestFunction: Request.RequestCallback; + /** + * The function that is called when the request is cancelled. + */ + cancelFunction: Request.CancelCallback; + /** + * The function that is called to update the request's priority, which occurs once per frame. + */ + priorityFunction: Request.PriorityCallback; + /** + * Priority is a unit-less value where lower values represent higher priority. + * For world-based objects, this is usually the distance from the camera. + * A request that does not have a priority function defaults to a priority of 0. + * + * If priorityFunction is defined, this value is updated every frame with the result of that call. + */ + priority: number; + /** + * Whether to throttle and prioritize the request. If false, the request will be sent immediately. If true, the + * request will be throttled and sent based on priority. + */ + readonly throttle: boolean; + /** + * Whether to throttle the request by server. Browsers typically support about 6-8 parallel connections + * for HTTP/1 servers, and an unlimited amount of connections for HTTP/2 servers. Setting this value + * to true is preferable for requests going through HTTP/1 servers. + */ + readonly throttleByServer: boolean; + /** + * Type of request. + */ + readonly type: RequestType; + /** + * The current state of the request. + */ + readonly state: RequestState; + /** + * Duplicates a Request instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Resource instance if one was not provided. + */ + clone(result?: Request): Request; + } + + export namespace Request { + /** + * The function that makes the actual data request. + */ + type RequestCallback = () => Promise; + /** + * The function that is called when the request is cancelled. + */ + type CancelCallback = () => void; + /** + * The function that is called to update the request's priority, which occurs once per frame. + */ + type PriorityCallback = () => number; + } + + /** + * An event that is raised when a request encounters an error. + * @param [statusCode] - The HTTP error status code, such as 404. + * @param [response] - The response included along with the error. + * @param [responseHeaders] - The response headers, represented either as an object literal or as a + * string in the format returned by XMLHttpRequest's getAllResponseHeaders() function. + */ + export class RequestErrorEvent { + constructor( + statusCode?: number, + response?: any, + responseHeaders?: string | any, + ); + /** + * The HTTP error status code, such as 404. If the error does not have a particular + * HTTP code, this property will be undefined. + */ + statusCode: number; + /** + * The response included along with the error. If the error does not include a response, + * this property will be undefined. + */ + response: any; + /** + * The headers included in the response, represented as an object literal of key/value pairs. + * If the error does not include any headers, this property will be undefined. + */ + responseHeaders: any; + /** + * Creates a string representing this RequestErrorEvent. + * @returns A string representing the provided RequestErrorEvent. + */ + toString(): string; + } + + /** + * The request scheduler is used to track and constrain the number of active requests in order to prioritize incoming requests. The ability + * to retain control over the number of requests in CesiumJS is important because due to events such as changes in the camera position, + * a lot of new requests may be generated and a lot of in-flight requests may become redundant. The request scheduler manually constrains the + * number of requests so that newer requests wait in a shorter queue and don't have to compete for bandwidth with requests that have expired. + */ + export namespace RequestScheduler { + /** + * The maximum number of simultaneous active requests. Un-throttled requests do not observe this limit. + */ + var maximumRequests: number; + /** + * The maximum number of simultaneous active requests per server. Un-throttled requests or servers specifically + * listed in {@link requestsByServer} do not observe this limit. + */ + var maximumRequestsPerServer: number; + /** + * A per server key list of overrides to use for throttling instead of maximumRequestsPerServer. + * Useful when streaming data from a known HTTP/2 or HTTP/3 server. + * @example + * RequestScheduler.requestsByServer["myserver.com:443"] = 18; + * @example + * RequestScheduler.requestsByServer = { + * "api.cesium.com:443": 18, + * "assets.cesium.com:443": 18, + * }; + */ + var requestsByServer: any; + /** + * Specifies if the request scheduler should throttle incoming requests, or let the browser queue requests under its control. + */ + var throttleRequests: boolean; + } + + /** + * State of the request. + */ + export enum RequestState { + /** + * Initial unissued state. + */ + UNISSUED = 0, + /** + * Issued but not yet active. Will become active when open slots are available. + */ + ISSUED = 1, + /** + * Actual http request has been sent. + */ + ACTIVE = 2, + /** + * Request completed successfully. + */ + RECEIVED = 3, + /** + * Request was cancelled, either explicitly or automatically because of low priority. + */ + CANCELLED = 4, + /** + * Request failed. + */ + FAILED = 5, + } + + /** + * An enum identifying the type of request. Used for finer grained logging and priority sorting. + */ + export enum RequestType { + /** + * Terrain request. + */ + TERRAIN = 0, + /** + * Imagery request. + */ + IMAGERY = 1, + /** + * 3D Tiles request. + */ + TILES3D = 2, + /** + * Other request. + */ + OTHER = 3, + } + + export namespace Resource { + /** + * Initialization options for the Resource constructor + * @property url - The url of the resource. + * @property [queryParameters] - An object containing query parameters that will be sent when retrieving the resource. + * @property [templateValues] - Key/Value pairs that are used to replace template values (eg. {x}). + * @property [headers = {}] - Additional HTTP headers that will be sent. + * @property [proxy] - A proxy to be used when loading the resource. + * @property [retryCallback] - The Function to call when a request for this resource fails. If it returns true, the request will be retried. + * @property [retryAttempts = 0] - The number of times the retryCallback should be called before giving up. + * @property [request] - A Request object that will be used. Intended for internal use only. + * @property [parseUrl = true] - If true, parse the url for query parameters; otherwise store the url without change + */ + type ConstructorOptions = { + url: string; + queryParameters?: any; + templateValues?: any; + headers?: any; + proxy?: Proxy; + retryCallback?: Resource.RetryCallback; + retryAttempts?: number; + request?: Request; + parseUrl?: boolean; + }; + /** + * A function that returns the value of the property. + * @param [resource] - The resource that failed to load. + * @param [error] - The error that occurred during the loading of the resource. + */ + type RetryCallback = ( + resource?: Resource, + error?: RequestErrorEvent, + ) => boolean | Promise; + } + + /** + * A resource that includes the location and any other parameters we need to retrieve it or create derived resources. It also provides the ability to retry requests. + * @example + * function refreshTokenRetryCallback(resource, error) { + * if (error.statusCode === 403) { + * // 403 status code means a new token should be generated + * return getNewAccessToken() + * .then(function(token) { + * resource.queryParameters.access_token = token; + * return true; + * }) + * .catch(function() { + * return false; + * }); + * } + * + * return false; + * } + * + * const resource = new Resource({ + * url: 'http://server.com/path/to/resource.json', + * proxy: new DefaultProxy('/proxy/'), + * headers: { + * 'X-My-Header': 'valueOfHeader' + * }, + * queryParameters: { + * 'access_token': '123-435-456-000' + * }, + * retryCallback: refreshTokenRetryCallback, + * retryAttempts: 1 + * }); + * @param options - A url or an object describing initialization options + */ + export class Resource { + constructor(options: string | Resource.ConstructorOptions); + /** + * Additional HTTP headers that will be sent with the request. + */ + headers: any; + /** + * A Request object that will be used. Intended for internal use only. + */ + request: Request; + /** + * A proxy to be used when loading the resource. + */ + proxy: Proxy; + /** + * Function to call when a request for this resource fails. If it returns true or a Promise that resolves to true, the request will be retried. + */ + retryCallback: (...params: any[]) => any; + /** + * The number of times the retryCallback should be called before giving up. + */ + retryAttempts: number; + /** + * Returns true if blobs are supported. + */ + static readonly isBlobSupported: boolean; + /** + * Query parameters appended to the url. + */ + readonly queryParameters: any; + /** + * The key/value pairs used to replace template parameters in the url. + */ + readonly templateValues: any; + /** + * The url to the resource with template values replaced, query string appended and encoded by proxy if one was set. + */ + url: string; + /** + * The file extension of the resource. + */ + readonly extension: string; + /** + * True if the Resource refers to a data URI. + */ + isDataUri: boolean; + /** + * True if the Resource refers to a blob URI. + */ + isBlobUri: boolean; + /** + * True if the Resource refers to a cross origin URL. + */ + isCrossOriginUrl: boolean; + /** + * True if the Resource has request headers. This is equivalent to checking if the headers property has any keys. + */ + hasHeaders: boolean; + /** + * Override Object#toString so that implicit string conversion gives the + * complete URL represented by this Resource. + * @returns The URL represented by this Resource + */ + toString(): string; + /** + * Returns the url, optional with the query string and processed by a proxy. + * @param [query = false] - If true, the query string is included. + * @param [proxy = false] - If true, the url is processed by the proxy object, if defined. + * @returns The url with all the requested components. + */ + getUrlComponent(query?: boolean, proxy?: boolean): string; + /** + * Combines the specified object and the existing query parameters. This allows you to add many parameters at once, + * as opposed to adding them one at a time to the queryParameters property. If a value is already set, it will be replaced with the new value. + * @param params - The query parameters + * @param [useAsDefault = false] - If true the params will be used as the default values, so they will only be set if they are undefined. + */ + setQueryParameters(params: any, useAsDefault?: boolean): void; + /** + * Combines the specified object and the existing query parameters. This allows you to add many parameters at once, + * as opposed to adding them one at a time to the queryParameters property. + * @param params - The query parameters + */ + appendQueryParameters(params: any): void; + /** + * Combines the specified object and the existing template values. This allows you to add many values at once, + * as opposed to adding them one at a time to the templateValues property. If a value is already set, it will become an array and the new value will be appended. + * @param template - The template values + * @param [useAsDefault = false] - If true the values will be used as the default values, so they will only be set if they are undefined. + */ + setTemplateValues(template: any, useAsDefault?: boolean): void; + /** + * Returns a resource relative to the current instance. All properties remain the same as the current instance unless overridden in options. + * @param options - An object with the following properties + * @param [options.url] - The url that will be resolved relative to the url of the current instance. + * @param [options.queryParameters] - An object containing query parameters that will be combined with those of the current instance. + * @param [options.templateValues] - Key/Value pairs that are used to replace template values (eg. {x}). These will be combined with those of the current instance. + * @param [options.headers = {}] - Additional HTTP headers that will be sent. + * @param [options.proxy] - A proxy to be used when loading the resource. + * @param [options.retryCallback] - The function to call when loading the resource fails. + * @param [options.retryAttempts] - The number of times the retryCallback should be called before giving up. + * @param [options.request] - A Request object that will be used. Intended for internal use only. + * @param [options.preserveQueryParameters = false] - If true, this will keep all query parameters from the current resource and derived resource. If false, derived parameters will replace those of the current resource. + * @returns The resource derived from the current one. + */ + getDerivedResource(options: { + url?: string; + queryParameters?: any; + templateValues?: any; + headers?: any; + proxy?: Proxy; + retryCallback?: Resource.RetryCallback; + retryAttempts?: number; + request?: Request; + preserveQueryParameters?: boolean; + }): Resource; + /** + * Duplicates a Resource instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Resource instance if one was not provided. + */ + clone(result?: Resource): Resource; + /** + * Returns the base path of the Resource. + * @param [includeQuery = false] - Whether or not to include the query string and fragment form the uri + * @returns The base URI of the resource + */ + getBaseUri(includeQuery?: boolean): string; + /** + * Appends a forward slash to the URL. + */ + appendForwardSlash(): void; + /** + * Asynchronously loads the resource as raw binary data. Returns a promise that will resolve to + * an ArrayBuffer once loaded, or reject if the resource failed to load. The data is loaded + * using XMLHttpRequest, which means that in order to make requests to another origin, + * the server must have Cross-Origin Resource Sharing (CORS) headers enabled. + * @example + * // load a single URL asynchronously + * resource.fetchArrayBuffer().then(function(arrayBuffer) { + * // use the data + * }).catch(function(error) { + * // an error occurred + * }); + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + fetchArrayBuffer(): Promise | undefined; + /** + * Creates a Resource and calls fetchArrayBuffer() on it. + * @param options - A url or an object with the following properties + * @param options.url - The url of the resource. + * @param [options.queryParameters] - An object containing query parameters that will be sent when retrieving the resource. + * @param [options.templateValues] - Key/Value pairs that are used to replace template values (eg. {x}). + * @param [options.headers = {}] - Additional HTTP headers that will be sent. + * @param [options.proxy] - A proxy to be used when loading the resource. + * @param [options.retryCallback] - The Function to call when a request for this resource fails. If it returns true, the request will be retried. + * @param [options.retryAttempts = 0] - The number of times the retryCallback should be called before giving up. + * @param [options.request] - A Request object that will be used. Intended for internal use only. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + static fetchArrayBuffer(options: { + url: string; + queryParameters?: any; + templateValues?: any; + headers?: any; + proxy?: Proxy; + retryCallback?: Resource.RetryCallback; + retryAttempts?: number; + request?: Request; + }): Promise | undefined; + /** + * Asynchronously loads the given resource as a blob. Returns a promise that will resolve to + * a Blob once loaded, or reject if the resource failed to load. The data is loaded + * using XMLHttpRequest, which means that in order to make requests to another origin, + * the server must have Cross-Origin Resource Sharing (CORS) headers enabled. + * @example + * // load a single URL asynchronously + * resource.fetchBlob().then(function(blob) { + * // use the data + * }).catch(function(error) { + * // an error occurred + * }); + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + fetchBlob(): Promise | undefined; + /** + * Creates a Resource and calls fetchBlob() on it. + * @param options - A url or an object with the following properties + * @param options.url - The url of the resource. + * @param [options.queryParameters] - An object containing query parameters that will be sent when retrieving the resource. + * @param [options.templateValues] - Key/Value pairs that are used to replace template values (eg. {x}). + * @param [options.headers = {}] - Additional HTTP headers that will be sent. + * @param [options.proxy] - A proxy to be used when loading the resource. + * @param [options.retryCallback] - The Function to call when a request for this resource fails. If it returns true, the request will be retried. + * @param [options.retryAttempts = 0] - The number of times the retryCallback should be called before giving up. + * @param [options.request] - A Request object that will be used. Intended for internal use only. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + static fetchBlob(options: { + url: string; + queryParameters?: any; + templateValues?: any; + headers?: any; + proxy?: Proxy; + retryCallback?: Resource.RetryCallback; + retryAttempts?: number; + request?: Request; + }): Promise | undefined; + /** + * Asynchronously loads the given image resource. Returns a promise that will resolve to + * an {@link https://developer.mozilla.org/en-US/docs/Web/API/ImageBitmap|ImageBitmap} if preferImageBitmap is true and the browser supports createImageBitmap or otherwise an + * {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement|Image} once loaded, or reject if the image failed to load. + * @example + * // load a single image asynchronously + * resource.fetchImage().then(function(image) { + * // use the loaded image + * }).catch(function(error) { + * // an error occurred + * }); + * + * // load several images in parallel + * Promise.all([resource1.fetchImage(), resource2.fetchImage()]).then(function(images) { + * // images is an array containing all the loaded images + * }); + * @param [options] - An object with the following properties. + * @param [options.preferBlob = false] - If true, we will load the image via a blob. + * @param [options.preferImageBitmap = false] - If true, image will be decoded during fetch and an ImageBitmap is returned. + * @param [options.flipY = false] - If true, image will be vertically flipped during decode. Only applies if the browser supports createImageBitmap. + * @param [options.skipColorSpaceConversion = false] - If true, any custom gamma or color profiles in the image will be ignored. Only applies if the browser supports createImageBitmap. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + fetchImage(options?: { + preferBlob?: boolean; + preferImageBitmap?: boolean; + flipY?: boolean; + skipColorSpaceConversion?: boolean; + }): Promise | undefined; + /** + * Creates a Resource and calls fetchImage() on it. + * @param options - A url or an object with the following properties + * @param options.url - The url of the resource. + * @param [options.queryParameters] - An object containing query parameters that will be sent when retrieving the resource. + * @param [options.templateValues] - Key/Value pairs that are used to replace template values (eg. {x}). + * @param [options.headers = {}] - Additional HTTP headers that will be sent. + * @param [options.proxy] - A proxy to be used when loading the resource. + * @param [options.flipY = false] - Whether to vertically flip the image during fetch and decode. Only applies when requesting an image and the browser supports createImageBitmap. + * @param [options.retryCallback] - The Function to call when a request for this resource fails. If it returns true, the request will be retried. + * @param [options.retryAttempts = 0] - The number of times the retryCallback should be called before giving up. + * @param [options.request] - A Request object that will be used. Intended for internal use only. + * @param [options.preferBlob = false] - If true, we will load the image via a blob. + * @param [options.preferImageBitmap = false] - If true, image will be decoded during fetch and an ImageBitmap is returned. + * @param [options.skipColorSpaceConversion = false] - If true, any custom gamma or color profiles in the image will be ignored. Only applies when requesting an image and the browser supports createImageBitmap. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + static fetchImage(options: { + url: string; + queryParameters?: any; + templateValues?: any; + headers?: any; + proxy?: Proxy; + flipY?: boolean; + retryCallback?: Resource.RetryCallback; + retryAttempts?: number; + request?: Request; + preferBlob?: boolean; + preferImageBitmap?: boolean; + skipColorSpaceConversion?: boolean; + }): Promise | undefined; + /** + * Asynchronously loads the given resource as text. Returns a promise that will resolve to + * a String once loaded, or reject if the resource failed to load. The data is loaded + * using XMLHttpRequest, which means that in order to make requests to another origin, + * the server must have Cross-Origin Resource Sharing (CORS) headers enabled. + * @example + * // load text from a URL, setting a custom header + * const resource = new Resource({ + * url: 'http://someUrl.com/someJson.txt', + * headers: { + * 'X-Custom-Header' : 'some value' + * } + * }); + * resource.fetchText().then(function(text) { + * // Do something with the text + * }).catch(function(error) { + * // an error occurred + * }); + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + fetchText(): Promise | undefined; + /** + * Creates a Resource and calls fetchText() on it. + * @param options - A url or an object with the following properties + * @param options.url - The url of the resource. + * @param [options.queryParameters] - An object containing query parameters that will be sent when retrieving the resource. + * @param [options.templateValues] - Key/Value pairs that are used to replace template values (eg. {x}). + * @param [options.headers = {}] - Additional HTTP headers that will be sent. + * @param [options.proxy] - A proxy to be used when loading the resource. + * @param [options.retryCallback] - The Function to call when a request for this resource fails. If it returns true, the request will be retried. + * @param [options.retryAttempts = 0] - The number of times the retryCallback should be called before giving up. + * @param [options.request] - A Request object that will be used. Intended for internal use only. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + static fetchText(options: { + url: string; + queryParameters?: any; + templateValues?: any; + headers?: any; + proxy?: Proxy; + retryCallback?: Resource.RetryCallback; + retryAttempts?: number; + request?: Request; + }): Promise | undefined; + /** + * Asynchronously loads the given resource as JSON. Returns a promise that will resolve to + * a JSON object once loaded, or reject if the resource failed to load. The data is loaded + * using XMLHttpRequest, which means that in order to make requests to another origin, + * the server must have Cross-Origin Resource Sharing (CORS) headers enabled. This function + * adds 'Accept: application/json,*/*;q=0.01' to the request headers, if not + * already specified. + * @example + * resource.fetchJson().then(function(jsonData) { + * // Do something with the JSON object + * }).catch(function(error) { + * // an error occurred + * }); + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + fetchJson(): Promise | undefined; + /** + * Creates a Resource and calls fetchJson() on it. + * @param options - A url or an object with the following properties + * @param options.url - The url of the resource. + * @param [options.queryParameters] - An object containing query parameters that will be sent when retrieving the resource. + * @param [options.templateValues] - Key/Value pairs that are used to replace template values (eg. {x}). + * @param [options.headers = {}] - Additional HTTP headers that will be sent. + * @param [options.proxy] - A proxy to be used when loading the resource. + * @param [options.retryCallback] - The Function to call when a request for this resource fails. If it returns true, the request will be retried. + * @param [options.retryAttempts = 0] - The number of times the retryCallback should be called before giving up. + * @param [options.request] - A Request object that will be used. Intended for internal use only. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + static fetchJson(options: { + url: string; + queryParameters?: any; + templateValues?: any; + headers?: any; + proxy?: Proxy; + retryCallback?: Resource.RetryCallback; + retryAttempts?: number; + request?: Request; + }): Promise | undefined; + /** + * Asynchronously loads the given resource as XML. Returns a promise that will resolve to + * an XML Document once loaded, or reject if the resource failed to load. The data is loaded + * using XMLHttpRequest, which means that in order to make requests to another origin, + * the server must have Cross-Origin Resource Sharing (CORS) headers enabled. + * @example + * // load XML from a URL, setting a custom header + * Cesium.loadXML('http://someUrl.com/someXML.xml', { + * 'X-Custom-Header' : 'some value' + * }).then(function(document) { + * // Do something with the document + * }).catch(function(error) { + * // an error occurred + * }); + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + fetchXML(): Promise | undefined; + /** + * Creates a Resource and calls fetchXML() on it. + * @param options - A url or an object with the following properties + * @param options.url - The url of the resource. + * @param [options.queryParameters] - An object containing query parameters that will be sent when retrieving the resource. + * @param [options.templateValues] - Key/Value pairs that are used to replace template values (eg. {x}). + * @param [options.headers = {}] - Additional HTTP headers that will be sent. + * @param [options.proxy] - A proxy to be used when loading the resource. + * @param [options.retryCallback] - The Function to call when a request for this resource fails. If it returns true, the request will be retried. + * @param [options.retryAttempts = 0] - The number of times the retryCallback should be called before giving up. + * @param [options.request] - A Request object that will be used. Intended for internal use only. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + static fetchXML(options: { + url: string; + queryParameters?: any; + templateValues?: any; + headers?: any; + proxy?: Proxy; + retryCallback?: Resource.RetryCallback; + retryAttempts?: number; + request?: Request; + }): Promise | undefined; + /** + * Requests a resource using JSONP. + * @example + * // load a data asynchronously + * resource.fetchJsonp().then(function(data) { + * // use the loaded data + * }).catch(function(error) { + * // an error occurred + * }); + * @param [callbackParameterName = 'callback'] - The callback parameter name that the server expects. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + fetchJsonp(callbackParameterName?: string): Promise | undefined; + /** + * Creates a Resource from a URL and calls fetchJsonp() on it. + * @param options - A url or an object with the following properties + * @param options.url - The url of the resource. + * @param [options.queryParameters] - An object containing query parameters that will be sent when retrieving the resource. + * @param [options.templateValues] - Key/Value pairs that are used to replace template values (eg. {x}). + * @param [options.headers = {}] - Additional HTTP headers that will be sent. + * @param [options.proxy] - A proxy to be used when loading the resource. + * @param [options.retryCallback] - The Function to call when a request for this resource fails. If it returns true, the request will be retried. + * @param [options.retryAttempts = 0] - The number of times the retryCallback should be called before giving up. + * @param [options.request] - A Request object that will be used. Intended for internal use only. + * @param [options.callbackParameterName = 'callback'] - The callback parameter name that the server expects. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + static fetchJsonp(options: { + url: string; + queryParameters?: any; + templateValues?: any; + headers?: any; + proxy?: Proxy; + retryCallback?: Resource.RetryCallback; + retryAttempts?: number; + request?: Request; + callbackParameterName?: string; + }): Promise | undefined; + /** + * Asynchronously loads the given resource. Returns a promise that will resolve to + * the result once loaded, or reject if the resource failed to load. The data is loaded + * using XMLHttpRequest, which means that in order to make requests to another origin, + * the server must have Cross-Origin Resource Sharing (CORS) headers enabled. It's recommended that you use + * the more specific functions eg. fetchJson, fetchBlob, etc. + * @example + * resource.fetch() + * .then(function(body) { + * // use the data + * }).catch(function(error) { + * // an error occurred + * }); + * @param [options] - Object with the following properties: + * @param [options.responseType] - The type of response. This controls the type of item returned. + * @param [options.headers] - Additional HTTP headers to send with the request, if any. + * @param [options.overrideMimeType] - Overrides the MIME type returned by the server. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + fetch(options?: { + responseType?: string; + headers?: any; + overrideMimeType?: string; + }): Promise | undefined; + /** + * Creates a Resource from a URL and calls fetch() on it. + * @param options - A url or an object with the following properties + * @param options.url - The url of the resource. + * @param [options.queryParameters] - An object containing query parameters that will be sent when retrieving the resource. + * @param [options.templateValues] - Key/Value pairs that are used to replace template values (eg. {x}). + * @param [options.headers = {}] - Additional HTTP headers that will be sent. + * @param [options.proxy] - A proxy to be used when loading the resource. + * @param [options.retryCallback] - The Function to call when a request for this resource fails. If it returns true, the request will be retried. + * @param [options.retryAttempts = 0] - The number of times the retryCallback should be called before giving up. + * @param [options.request] - A Request object that will be used. Intended for internal use only. + * @param [options.responseType] - The type of response. This controls the type of item returned. + * @param [options.overrideMimeType] - Overrides the MIME type returned by the server. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + static fetch(options: { + url: string; + queryParameters?: any; + templateValues?: any; + headers?: any; + proxy?: Proxy; + retryCallback?: Resource.RetryCallback; + retryAttempts?: number; + request?: Request; + responseType?: string; + overrideMimeType?: string; + }): Promise | undefined; + /** + * Asynchronously deletes the given resource. Returns a promise that will resolve to + * the result once loaded, or reject if the resource failed to load. The data is loaded + * using XMLHttpRequest, which means that in order to make requests to another origin, + * the server must have Cross-Origin Resource Sharing (CORS) headers enabled. + * @example + * resource.delete() + * .then(function(body) { + * // use the data + * }).catch(function(error) { + * // an error occurred + * }); + * @param [options] - Object with the following properties: + * @param [options.responseType] - The type of response. This controls the type of item returned. + * @param [options.headers] - Additional HTTP headers to send with the request, if any. + * @param [options.overrideMimeType] - Overrides the MIME type returned by the server. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + delete(options?: { + responseType?: string; + headers?: any; + overrideMimeType?: string; + }): Promise | undefined; + /** + * Creates a Resource from a URL and calls delete() on it. + * @param options - A url or an object with the following properties + * @param options.url - The url of the resource. + * @param [options.data] - Data that is posted with the resource. + * @param [options.queryParameters] - An object containing query parameters that will be sent when retrieving the resource. + * @param [options.templateValues] - Key/Value pairs that are used to replace template values (eg. {x}). + * @param [options.headers = {}] - Additional HTTP headers that will be sent. + * @param [options.proxy] - A proxy to be used when loading the resource. + * @param [options.retryCallback] - The Function to call when a request for this resource fails. If it returns true, the request will be retried. + * @param [options.retryAttempts = 0] - The number of times the retryCallback should be called before giving up. + * @param [options.request] - A Request object that will be used. Intended for internal use only. + * @param [options.responseType] - The type of response. This controls the type of item returned. + * @param [options.overrideMimeType] - Overrides the MIME type returned by the server. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + static delete(options: { + url: string; + data?: any; + queryParameters?: any; + templateValues?: any; + headers?: any; + proxy?: Proxy; + retryCallback?: Resource.RetryCallback; + retryAttempts?: number; + request?: Request; + responseType?: string; + overrideMimeType?: string; + }): Promise | undefined; + /** + * Asynchronously gets headers the given resource. Returns a promise that will resolve to + * the result once loaded, or reject if the resource failed to load. The data is loaded + * using XMLHttpRequest, which means that in order to make requests to another origin, + * the server must have Cross-Origin Resource Sharing (CORS) headers enabled. + * @example + * resource.head() + * .then(function(headers) { + * // use the data + * }).catch(function(error) { + * // an error occurred + * }); + * @param [options] - Object with the following properties: + * @param [options.responseType] - The type of response. This controls the type of item returned. + * @param [options.headers] - Additional HTTP headers to send with the request, if any. + * @param [options.overrideMimeType] - Overrides the MIME type returned by the server. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + head(options?: { + responseType?: string; + headers?: any; + overrideMimeType?: string; + }): Promise | undefined; + /** + * Creates a Resource from a URL and calls head() on it. + * @param options - A url or an object with the following properties + * @param options.url - The url of the resource. + * @param [options.queryParameters] - An object containing query parameters that will be sent when retrieving the resource. + * @param [options.templateValues] - Key/Value pairs that are used to replace template values (eg. {x}). + * @param [options.headers = {}] - Additional HTTP headers that will be sent. + * @param [options.proxy] - A proxy to be used when loading the resource. + * @param [options.retryCallback] - The Function to call when a request for this resource fails. If it returns true, the request will be retried. + * @param [options.retryAttempts = 0] - The number of times the retryCallback should be called before giving up. + * @param [options.request] - A Request object that will be used. Intended for internal use only. + * @param [options.responseType] - The type of response. This controls the type of item returned. + * @param [options.overrideMimeType] - Overrides the MIME type returned by the server. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + static head(options: { + url: string; + queryParameters?: any; + templateValues?: any; + headers?: any; + proxy?: Proxy; + retryCallback?: Resource.RetryCallback; + retryAttempts?: number; + request?: Request; + responseType?: string; + overrideMimeType?: string; + }): Promise | undefined; + /** + * Asynchronously gets options the given resource. Returns a promise that will resolve to + * the result once loaded, or reject if the resource failed to load. The data is loaded + * using XMLHttpRequest, which means that in order to make requests to another origin, + * the server must have Cross-Origin Resource Sharing (CORS) headers enabled. + * @example + * resource.options() + * .then(function(headers) { + * // use the data + * }).catch(function(error) { + * // an error occurred + * }); + * @param [options] - Object with the following properties: + * @param [options.responseType] - The type of response. This controls the type of item returned. + * @param [options.headers] - Additional HTTP headers to send with the request, if any. + * @param [options.overrideMimeType] - Overrides the MIME type returned by the server. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + options(options?: { + responseType?: string; + headers?: any; + overrideMimeType?: string; + }): Promise | undefined; + /** + * Creates a Resource from a URL and calls options() on it. + * @param options - A url or an object with the following properties + * @param options.url - The url of the resource. + * @param [options.queryParameters] - An object containing query parameters that will be sent when retrieving the resource. + * @param [options.templateValues] - Key/Value pairs that are used to replace template values (eg. {x}). + * @param [options.headers = {}] - Additional HTTP headers that will be sent. + * @param [options.proxy] - A proxy to be used when loading the resource. + * @param [options.retryCallback] - The Function to call when a request for this resource fails. If it returns true, the request will be retried. + * @param [options.retryAttempts = 0] - The number of times the retryCallback should be called before giving up. + * @param [options.request] - A Request object that will be used. Intended for internal use only. + * @param [options.responseType] - The type of response. This controls the type of item returned. + * @param [options.overrideMimeType] - Overrides the MIME type returned by the server. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + static options(options: { + url: string; + queryParameters?: any; + templateValues?: any; + headers?: any; + proxy?: Proxy; + retryCallback?: Resource.RetryCallback; + retryAttempts?: number; + request?: Request; + responseType?: string; + overrideMimeType?: string; + }): Promise | undefined; + /** + * Asynchronously posts data to the given resource. Returns a promise that will resolve to + * the result once loaded, or reject if the resource failed to load. The data is loaded + * using XMLHttpRequest, which means that in order to make requests to another origin, + * the server must have Cross-Origin Resource Sharing (CORS) headers enabled. + * @example + * resource.post(data) + * .then(function(result) { + * // use the result + * }).catch(function(error) { + * // an error occurred + * }); + * @param data - Data that is posted with the resource. + * @param [options] - Object with the following properties: + * @param [options.data] - Data that is posted with the resource. + * @param [options.responseType] - The type of response. This controls the type of item returned. + * @param [options.headers] - Additional HTTP headers to send with the request, if any. + * @param [options.overrideMimeType] - Overrides the MIME type returned by the server. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + post( + data: any, + options?: { + data?: any; + responseType?: string; + headers?: any; + overrideMimeType?: string; + }, + ): Promise | undefined; + /** + * Creates a Resource from a URL and calls post() on it. + * @param options - A url or an object with the following properties + * @param options.url - The url of the resource. + * @param options.data - Data that is posted with the resource. + * @param [options.queryParameters] - An object containing query parameters that will be sent when retrieving the resource. + * @param [options.templateValues] - Key/Value pairs that are used to replace template values (eg. {x}). + * @param [options.headers = {}] - Additional HTTP headers that will be sent. + * @param [options.proxy] - A proxy to be used when loading the resource. + * @param [options.retryCallback] - The Function to call when a request for this resource fails. If it returns true, the request will be retried. + * @param [options.retryAttempts = 0] - The number of times the retryCallback should be called before giving up. + * @param [options.request] - A Request object that will be used. Intended for internal use only. + * @param [options.responseType] - The type of response. This controls the type of item returned. + * @param [options.overrideMimeType] - Overrides the MIME type returned by the server. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + static post(options: { + url: string; + data: any; + queryParameters?: any; + templateValues?: any; + headers?: any; + proxy?: Proxy; + retryCallback?: Resource.RetryCallback; + retryAttempts?: number; + request?: Request; + responseType?: string; + overrideMimeType?: string; + }): Promise | undefined; + /** + * Asynchronously puts data to the given resource. Returns a promise that will resolve to + * the result once loaded, or reject if the resource failed to load. The data is loaded + * using XMLHttpRequest, which means that in order to make requests to another origin, + * the server must have Cross-Origin Resource Sharing (CORS) headers enabled. + * @example + * resource.put(data) + * .then(function(result) { + * // use the result + * }).catch(function(error) { + * // an error occurred + * }); + * @param data - Data that is posted with the resource. + * @param [options] - Object with the following properties: + * @param [options.responseType] - The type of response. This controls the type of item returned. + * @param [options.headers] - Additional HTTP headers to send with the request, if any. + * @param [options.overrideMimeType] - Overrides the MIME type returned by the server. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + put( + data: any, + options?: { + responseType?: string; + headers?: any; + overrideMimeType?: string; + }, + ): Promise | undefined; + /** + * Creates a Resource from a URL and calls put() on it. + * @param options - A url or an object with the following properties + * @param options.url - The url of the resource. + * @param options.data - Data that is posted with the resource. + * @param [options.queryParameters] - An object containing query parameters that will be sent when retrieving the resource. + * @param [options.templateValues] - Key/Value pairs that are used to replace template values (eg. {x}). + * @param [options.headers = {}] - Additional HTTP headers that will be sent. + * @param [options.proxy] - A proxy to be used when loading the resource. + * @param [options.retryCallback] - The Function to call when a request for this resource fails. If it returns true, the request will be retried. + * @param [options.retryAttempts = 0] - The number of times the retryCallback should be called before giving up. + * @param [options.request] - A Request object that will be used. Intended for internal use only. + * @param [options.responseType] - The type of response. This controls the type of item returned. + * @param [options.overrideMimeType] - Overrides the MIME type returned by the server. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + static put(options: { + url: string; + data: any; + queryParameters?: any; + templateValues?: any; + headers?: any; + proxy?: Proxy; + retryCallback?: Resource.RetryCallback; + retryAttempts?: number; + request?: Request; + responseType?: string; + overrideMimeType?: string; + }): Promise | undefined; + /** + * Asynchronously patches data to the given resource. Returns a promise that will resolve to + * the result once loaded, or reject if the resource failed to load. The data is loaded + * using XMLHttpRequest, which means that in order to make requests to another origin, + * the server must have Cross-Origin Resource Sharing (CORS) headers enabled. + * @example + * resource.patch(data) + * .then(function(result) { + * // use the result + * }).catch(function(error) { + * // an error occurred + * }); + * @param data - Data that is posted with the resource. + * @param [options] - Object with the following properties: + * @param [options.responseType] - The type of response. This controls the type of item returned. + * @param [options.headers] - Additional HTTP headers to send with the request, if any. + * @param [options.overrideMimeType] - Overrides the MIME type returned by the server. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + patch( + data: any, + options?: { + responseType?: string; + headers?: any; + overrideMimeType?: string; + }, + ): Promise | undefined; + /** + * Creates a Resource from a URL and calls patch() on it. + * @param options - A url or an object with the following properties + * @param options.url - The url of the resource. + * @param options.data - Data that is posted with the resource. + * @param [options.queryParameters] - An object containing query parameters that will be sent when retrieving the resource. + * @param [options.templateValues] - Key/Value pairs that are used to replace template values (eg. {x}). + * @param [options.headers = {}] - Additional HTTP headers that will be sent. + * @param [options.proxy] - A proxy to be used when loading the resource. + * @param [options.retryCallback] - The Function to call when a request for this resource fails. If it returns true, the request will be retried. + * @param [options.retryAttempts = 0] - The number of times the retryCallback should be called before giving up. + * @param [options.request] - A Request object that will be used. Intended for internal use only. + * @param [options.responseType] - The type of response. This controls the type of item returned. + * @param [options.overrideMimeType] - Overrides the MIME type returned by the server. + * @returns a promise that will resolve to the requested data when loaded. Returns undefined if request.throttle is true and the request does not have high enough priority. + */ + static patch(options: { + url: string; + data: any; + queryParameters?: any; + templateValues?: any; + headers?: any; + proxy?: Proxy; + retryCallback?: Resource.RetryCallback; + retryAttempts?: number; + request?: Request; + responseType?: string; + overrideMimeType?: string; + }): Promise | undefined; + /** + * A resource instance initialized to the current browser location + */ + static readonly DEFAULT: Resource; + } + + /** + * Constructs an exception object that is thrown due to an error that can occur at runtime, e.g., + * out of memory, could not compile shader, etc. If a function may throw this + * exception, the calling code should be prepared to catch it. + *

+ * On the other hand, a {@link DeveloperError} indicates an exception due + * to a developer error, e.g., invalid argument, that usually indicates a bug in the + * calling code. + * @param [message] - The error message for this exception. + */ + export class RuntimeError extends Error { + constructor(message?: string); + /** + * 'RuntimeError' indicating that this exception was thrown due to a runtime error. + */ + readonly name: string; + /** + * The explanation for why this exception was thrown. + */ + readonly message: string; + /** + * The stack trace of this exception, if available. + */ + readonly stack: string; + } + + export namespace ScreenSpaceEventHandler { + /** + * An Event that occurs at a single position on screen. + */ + type PositionedEvent = { + position: Cartesian2; + }; + /** + * @param event - The event which triggered the listener + */ + type PositionedEventCallback = ( + event: ScreenSpaceEventHandler.PositionedEvent, + ) => void; + /** + * An Event that starts at one position and ends at another. + */ + type MotionEvent = { + startPosition: Cartesian2; + endPosition: Cartesian2; + }; + /** + * @param event - The event which triggered the listener + */ + type MotionEventCallback = ( + event: ScreenSpaceEventHandler.MotionEvent, + ) => void; + /** + * An Event that occurs at a two positions on screen. + */ + type TwoPointEvent = { + position1: Cartesian2; + position2: Cartesian2; + }; + /** + * @param event - The event which triggered the listener + */ + type TwoPointEventCallback = ( + event: ScreenSpaceEventHandler.TwoPointEvent, + ) => void; + /** + * An Event that starts at a two positions on screen and moves to two other positions. + */ + type TwoPointMotionEvent = { + position1: Cartesian2; + position2: Cartesian2; + previousPosition1: Cartesian2; + previousPosition2: Cartesian2; + }; + /** + * @param event - The event which triggered the listener + */ + type TwoPointMotionEventCallback = ( + event: ScreenSpaceEventHandler.TwoPointMotionEvent, + ) => void; + /** + * @param delta - The amount that the mouse wheel moved + */ + type WheelEventCallback = (delta: number) => void; + } + + /** + * Handles user input events. Custom functions can be added to be executed on + * when the user enters input. + * @param [element = document] - The element to add events to. + */ + export class ScreenSpaceEventHandler { + constructor(element?: HTMLCanvasElement); + /** + * Set a function to be executed on an input event. + * @param action - Function to be executed when the input event occurs. + * @param type - The ScreenSpaceEventType of input event. + * @param [modifier] - A KeyboardEventModifier key that is held when a type + * event occurs. + */ + setInputAction( + action: + | ScreenSpaceEventHandler.PositionedEventCallback + | ScreenSpaceEventHandler.MotionEventCallback + | ScreenSpaceEventHandler.WheelEventCallback + | ScreenSpaceEventHandler.TwoPointEventCallback + | ScreenSpaceEventHandler.TwoPointMotionEventCallback, + type: ScreenSpaceEventType, + modifier?: KeyboardEventModifier, + ): void; + /** + * Returns the function to be executed on an input event. + * @param type - The ScreenSpaceEventType of input event. + * @param [modifier] - A KeyboardEventModifier key that is held when a type + * event occurs. + * @returns The function to be executed on an input event. + */ + getInputAction( + type: ScreenSpaceEventType, + modifier?: KeyboardEventModifier, + ): + | ScreenSpaceEventHandler.PositionedEventCallback + | ScreenSpaceEventHandler.MotionEventCallback + | ScreenSpaceEventHandler.WheelEventCallback + | ScreenSpaceEventHandler.TwoPointEventCallback + | ScreenSpaceEventHandler.TwoPointMotionEventCallback; + /** + * Removes the function to be executed on an input event. + * @param type - The ScreenSpaceEventType of input event. + * @param [modifier] - A KeyboardEventModifier key that is held when a type + * event occurs. + */ + removeInputAction( + type: ScreenSpaceEventType, + modifier?: KeyboardEventModifier, + ): void; + /** + * Returns true if this object was destroyed; otherwise, false. + *

+ * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Removes listeners held by this object. + *

+ * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * handler = handler && handler.destroy(); + */ + destroy(): void; + /** + * The amount of time, in milliseconds, that mouse events will be disabled after + * receiving any touch events, such that any emulated mouse events will be ignored. + */ + static mouseEmulationIgnoreMilliseconds: number; + /** + * The amount of time, in milliseconds, before a touch on the screen becomes a + * touch and hold. + */ + static touchHoldDelayMilliseconds: number; + } + + /** + * This enumerated type is for classifying mouse events: down, up, click, double click, move and move while a button is held down. + */ + export enum ScreenSpaceEventType { + /** + * Represents a mouse left button down event. + */ + LEFT_DOWN = 0, + /** + * Represents a mouse left button up event. + */ + LEFT_UP = 1, + /** + * Represents a mouse left click event. + */ + LEFT_CLICK = 2, + /** + * Represents a mouse left double click event. + */ + LEFT_DOUBLE_CLICK = 3, + /** + * Represents a mouse left button down event. + */ + RIGHT_DOWN = 5, + /** + * Represents a mouse right button up event. + */ + RIGHT_UP = 6, + /** + * Represents a mouse right click event. + */ + RIGHT_CLICK = 7, + /** + * Represents a mouse middle button down event. + */ + MIDDLE_DOWN = 10, + /** + * Represents a mouse middle button up event. + */ + MIDDLE_UP = 11, + /** + * Represents a mouse middle click event. + */ + MIDDLE_CLICK = 12, + /** + * Represents a mouse move event. + */ + MOUSE_MOVE = 15, + /** + * Represents a mouse wheel event. + */ + WHEEL = 16, + /** + * Represents the start of a two-finger event on a touch surface. + */ + PINCH_START = 17, + /** + * Represents the end of a two-finger event on a touch surface. + */ + PINCH_END = 18, + /** + * Represents a change of a two-finger event on a touch surface. + */ + PINCH_MOVE = 19, + } + + /** + * Value and type information for per-instance geometry attribute that determines if the geometry instance will be shown. + * @example + * const instance = new Cesium.GeometryInstance({ + * geometry : new Cesium.BoxGeometry({ + * vertexFormat : Cesium.VertexFormat.POSITION_AND_NORMAL, + * minimum : new Cesium.Cartesian3(-250000.0, -250000.0, -250000.0), + * maximum : new Cesium.Cartesian3(250000.0, 250000.0, 250000.0) + * }), + * modelMatrix : Cesium.Matrix4.multiplyByTranslation(Cesium.Transforms.eastNorthUpToFixedFrame( + * Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883)), new Cesium.Cartesian3(0.0, 0.0, 1000000.0), new Cesium.Matrix4()), + * id : 'box', + * attributes : { + * show : new Cesium.ShowGeometryInstanceAttribute(false) + * } + * }); + * @param [show = true] - Determines if the geometry instance will be shown. + */ + export class ShowGeometryInstanceAttribute { + constructor(show?: boolean); + /** + * The values for the attributes stored in a typed array. + */ + value: Uint8Array; + /** + * The datatype of each component in the attribute, e.g., individual elements in + * {@link ColorGeometryInstanceAttribute#value}. + */ + readonly componentDatatype: ComponentDatatype; + /** + * The number of components in the attributes, i.e., {@link ColorGeometryInstanceAttribute#value}. + */ + readonly componentsPerAttribute: number; + /** + * When true and componentDatatype is an integer format, + * indicate that the components should be mapped to the range [0, 1] (unsigned) + * or [-1, 1] (signed) when they are accessed as floating-point for rendering. + */ + readonly normalize: boolean; + /** + * Converts a boolean show to a typed array that can be used to assign a show attribute. + * @example + * const attributes = primitive.getGeometryInstanceAttributes('an id'); + * attributes.show = Cesium.ShowGeometryInstanceAttribute.toValue(true, attributes.show); + * @param show - The show value. + * @param [result] - The array to store the result in, if undefined a new instance will be created. + * @returns The modified result parameter or a new instance if result was undefined. + */ + static toValue(show: boolean, result?: Uint8Array): Uint8Array; + } + + /** + * Contains functions for finding the Cartesian coordinates of the sun and the moon in the + * Earth-centered inertial frame. + */ + export namespace Simon1994PlanetaryPositions { + /** + * Computes the position of the Sun in the Earth-centered inertial frame + * @param [julianDate] - The time at which to compute the Sun's position, if not provided the current system time is used. + * @param [result] - The object onto which to store the result. + * @returns Calculated sun position + */ + function computeSunPositionInEarthInertialFrame( + julianDate?: JulianDate, + result?: Cartesian3, + ): Cartesian3; + /** + * Computes the position of the Moon in the Earth-centered inertial frame + * @param [julianDate] - The time at which to compute the Moon's position, if not provided the current system time is used. + * @param [result] - The object onto which to store the result. + * @returns Calculated moon position + */ + function computeMoonPositionInEarthInertialFrame( + julianDate?: JulianDate, + result?: Cartesian3, + ): Cartesian3; + } + + /** + * A description of a polyline modeled as a line strip; the first two positions define a line segment, + * and each additional position defines a line segment from the previous position. + * @example + * // A polyline with two connected line segments + * const polyline = new Cesium.SimplePolylineGeometry({ + * positions : Cesium.Cartesian3.fromDegreesArray([ + * 0.0, 0.0, + * 5.0, 0.0, + * 5.0, 5.0 + * ]) + * }); + * const geometry = Cesium.SimplePolylineGeometry.createGeometry(polyline); + * @param options - Object with the following properties: + * @param options.positions - An array of {@link Cartesian3} defining the positions in the polyline as a line strip. + * @param [options.colors] - An Array of {@link Color} defining the per vertex or per segment colors. + * @param [options.colorsPerVertex = false] - A boolean that determines whether the colors will be flat across each segment of the line or interpolated across the vertices. + * @param [options.arcType = ArcType.GEODESIC] - The type of line the polyline segments must follow. + * @param [options.granularity = Math.RADIANS_PER_DEGREE] - The distance, in radians, between each latitude and longitude if options.arcType is not ArcType.NONE. Determines the number of positions in the buffer. + * @param [options.ellipsoid = Ellipsoid.default] - The ellipsoid to be used as a reference. + */ + export class SimplePolylineGeometry { + constructor(options: { + positions: Cartesian3[]; + colors?: Color[]; + colorsPerVertex?: boolean; + arcType?: ArcType; + granularity?: number; + ellipsoid?: Ellipsoid; + }); + /** + * The number of elements used to pack the object into an array. + */ + packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: SimplePolylineGeometry, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new SimplePolylineGeometry instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: SimplePolylineGeometry, + ): SimplePolylineGeometry; + /** + * Computes the geometric representation of a simple polyline, including its vertices, indices, and a bounding sphere. + * @param simplePolylineGeometry - A description of the polyline. + * @returns The computed vertices and indices. + */ + static createGeometry( + simplePolylineGeometry: SimplePolylineGeometry, + ): Geometry | undefined; + } + + /** + * A description of a sphere centered at the origin. + * @example + * const sphere = new Cesium.SphereGeometry({ + * radius : 100.0, + * vertexFormat : Cesium.VertexFormat.POSITION_ONLY + * }); + * const geometry = Cesium.SphereGeometry.createGeometry(sphere); + * @param [options] - Object with the following properties: + * @param [options.radius = 1.0] - The radius of the sphere. + * @param [options.stackPartitions = 64] - The number of times to partition the ellipsoid into stacks. + * @param [options.slicePartitions = 64] - The number of times to partition the ellipsoid into radial slices. + * @param [options.vertexFormat = VertexFormat.DEFAULT] - The vertex attributes to be computed. + */ + export class SphereGeometry { + constructor(options?: { + radius?: number; + stackPartitions?: number; + slicePartitions?: number; + vertexFormat?: VertexFormat; + }); + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: SphereGeometry, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new SphereGeometry instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: SphereGeometry, + ): SphereGeometry; + /** + * Computes the geometric representation of a sphere, including its vertices, indices, and a bounding sphere. + * @param sphereGeometry - A description of the sphere. + * @returns The computed vertices and indices. + */ + static createGeometry(sphereGeometry: SphereGeometry): Geometry | undefined; + } + + /** + * A description of the outline of a sphere. + * @example + * const sphere = new Cesium.SphereOutlineGeometry({ + * radius : 100.0, + * stackPartitions : 6, + * slicePartitions: 5 + * }); + * const geometry = Cesium.SphereOutlineGeometry.createGeometry(sphere); + * @param [options] - Object with the following properties: + * @param [options.radius = 1.0] - The radius of the sphere. + * @param [options.stackPartitions = 10] - The count of stacks for the sphere (1 greater than the number of parallel lines). + * @param [options.slicePartitions = 8] - The count of slices for the sphere (Equal to the number of radial lines). + * @param [options.subdivisions = 200] - The number of points per line, determining the granularity of the curvature . + */ + export class SphereOutlineGeometry { + constructor(options?: { + radius?: number; + stackPartitions?: number; + slicePartitions?: number; + subdivisions?: number; + }); + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: SphereOutlineGeometry, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new SphereOutlineGeometry instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: SphereOutlineGeometry, + ): SphereOutlineGeometry; + /** + * Computes the geometric representation of an outline of a sphere, including its vertices, indices, and a bounding sphere. + * @param sphereGeometry - A description of the sphere outline. + * @returns The computed vertices and indices. + */ + static createGeometry( + sphereGeometry: SphereOutlineGeometry, + ): Geometry | undefined; + } + + /** + * A set of curvilinear 3-dimensional coordinates. + * @param [clock = 0.0] - The angular coordinate lying in the xy-plane measured from the positive x-axis and toward the positive y-axis. + * @param [cone = 0.0] - The angular coordinate measured from the positive z-axis and toward the negative z-axis. + * @param [magnitude = 1.0] - The linear coordinate measured from the origin. + */ + export class Spherical { + constructor(clock?: number, cone?: number, magnitude?: number); + /** + * The clock component. + */ + clock: number; + /** + * The cone component. + */ + cone: number; + /** + * The magnitude component. + */ + magnitude: number; + /** + * Converts the provided Cartesian3 into Spherical coordinates. + * @param cartesian3 - The Cartesian3 to be converted to Spherical. + * @param [result] - The object in which the result will be stored, if undefined a new instance will be created. + * @returns The modified result parameter, or a new instance if one was not provided. + */ + static fromCartesian3( + cartesian3: Cartesian3, + result?: Spherical, + ): Spherical; + /** + * Creates a duplicate of a Spherical. + * @param spherical - The spherical to clone. + * @param [result] - The object to store the result into, if undefined a new instance will be created. + * @returns The modified result parameter or a new instance if result was undefined. (Returns undefined if spherical is undefined) + */ + static clone(spherical: Spherical, result?: Spherical): Spherical; + /** + * Computes the normalized version of the provided spherical. + * @param spherical - The spherical to be normalized. + * @param [result] - The object to store the result into, if undefined a new instance will be created. + * @returns The modified result parameter or a new instance if result was undefined. + */ + static normalize(spherical: Spherical, result?: Spherical): Spherical; + /** + * Returns true if the first spherical is equal to the second spherical, false otherwise. + * @param [left] - The first Spherical to be compared. + * @param [right] - The second Spherical to be compared. + * @returns true if the first spherical is equal to the second spherical, false otherwise. + */ + static equals(left?: Spherical, right?: Spherical): boolean; + /** + * Returns true if the first spherical is within the provided epsilon of the second spherical, false otherwise. + * @param left - The first Spherical to be compared. + * @param right - The second Spherical to be compared. + * @param [epsilon = 0.0] - The epsilon to compare against. + * @returns true if the first spherical is within the provided epsilon of the second spherical, false otherwise. + */ + static equalsEpsilon( + left: Spherical, + right: Spherical, + epsilon?: number, + ): boolean; + /** + * Returns true if this spherical is equal to the provided spherical, false otherwise. + * @param [other] - The Spherical to be compared. + * @returns true if this spherical is equal to the provided spherical, false otherwise. + */ + equals(other?: Spherical): boolean; + /** + * Creates a duplicate of this Spherical. + * @param [result] - The object to store the result into, if undefined a new instance will be created. + * @returns The modified result parameter or a new instance if result was undefined. + */ + clone(result?: Spherical): Spherical; + /** + * Returns true if this spherical is within the provided epsilon of the provided spherical, false otherwise. + * @param other - The Spherical to be compared. + * @param epsilon - The epsilon to compare against. + * @returns true if this spherical is within the provided epsilon of the provided spherical, false otherwise. + */ + equalsEpsilon(other: Spherical, epsilon: number): boolean; + /** + * Returns a string representing this instance in the format (clock, cone, magnitude). + * @returns A string representing this instance. + */ + toString(): string; + } + + /** + * Creates a curve parameterized and evaluated by time. This type describes an interface + * and is not intended to be instantiated directly. + */ + export class Spline { + constructor(); + /** + * An array of times for the control points. + */ + times: number[]; + /** + * An array of control points. + */ + points: Cartesian3[] | Quaternion[]; + /** + * Evaluates the curve at a given time. + * @param time - The time at which to evaluate the curve. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance of the point on the curve at the given time. + */ + evaluate( + time: number, + result?: Cartesian3 | Quaternion | number[], + ): Cartesian3 | Quaternion | number[]; + /** + * Finds an index i in times such that the parameter + * time is in the interval [times[i], times[i + 1]]. + * @param time - The time. + * @param startIndex - The index from which to start the search. + * @returns The index for the element at the start of the interval. + */ + findTimeInterval(time: number, startIndex: number): number; + /** + * Wraps the given time to the period covered by the spline. + * @param time - The time. + * @returns The time, wrapped around the animation period. + */ + wrapTime(time: number): number; + /** + * Clamps the given time to the period covered by the spline. + * @param time - The time. + * @returns The time, clamped to the animation period. + */ + clampTime(time: number): number; + } + + /** + * A spline that is composed of piecewise constants representing a step function. + * @example + * const times = [ 0.0, 1.5, 3.0, 4.5, 6.0 ]; + * const spline = new Cesium.SteppedSpline({ + * times : times, + * points : [ + * new Cesium.Cartesian3(1235398.0, -4810983.0, 4146266.0), + * new Cesium.Cartesian3(1372574.0, -5345182.0, 4606657.0), + * new Cesium.Cartesian3(-757983.0, -5542796.0, 4514323.0), + * new Cesium.Cartesian3(-2821260.0, -5248423.0, 4021290.0), + * new Cesium.Cartesian3(-2539788.0, -4724797.0, 3620093.0) + * ] + * }); + * + * const p0 = spline.evaluate(times[0]); + * @param options - Object with the following properties: + * @param options.times - An array of strictly increasing, unit-less, floating-point times at each point. The values are in no way connected to the clock time. They are the parameterization for the curve. + * @param options.points - The array of control points. + */ + export class SteppedSpline { + constructor(options: { + times: number[]; + points: number[] | Cartesian3[] | Quaternion[]; + }); + /** + * An array of times for the control points. + */ + readonly times: number[]; + /** + * An array of control points. + */ + readonly points: number[] | Cartesian3[] | Quaternion[]; + /** + * Finds an index i in times such that the parameter + * time is in the interval [times[i], times[i + 1]]. + * @param time - The time. + * @param startIndex - The index from which to start the search. + * @returns The index for the element at the start of the interval. + */ + findTimeInterval(time: number, startIndex: number): number; + /** + * Wraps the given time to the period covered by the spline. + * @param time - The time. + * @returns The time, wrapped around to the updated animation. + */ + wrapTime(time: number): number; + /** + * Clamps the given time to the period covered by the spline. + * @param time - The time. + * @returns The time, clamped to the animation period. + */ + clampTime(time: number): number; + /** + * Evaluates the curve at a given time. + * @param time - The time at which to evaluate the curve. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance of the point on the curve at the given time. + */ + evaluate( + time: number, + result?: Cartesian3 | Quaternion, + ): number | Cartesian3 | Quaternion; + } + + /** + * Represents a point in stereographic coordinates, which can be obtained by projecting a cartesian coordinate from one pole onto a tangent plane at the other pole. + * The stereographic projection faithfully represents the relative directions of all great circles passing through its center point. + * To faithfully represents angles everywhere, this is a conformal projection, which means points are projected onto an arbrary sphere. + * @param [position] - The steroegraphic coordinates. + * @param [tangentPlane] - The tangent plane onto which the point was projected. + */ + export function Stereographic( + position?: Cartesian2, + tangentPlane?: EllipseGeometry, + ): void; + + /** + * A wrapper around a web worker that allows scheduling tasks for a given worker, + * returning results asynchronously via a promise. + * + * The Worker is not constructed until a task is scheduled. + * @param workerPath - The Url to the worker. This can either be an absolute path or relative to the Cesium Workers folder. + * @param [maximumActiveTasks = Number.POSITIVE_INFINITY] - The maximum number of active tasks. Once exceeded, + * scheduleTask will not queue any more tasks, allowing + * work to be rescheduled in future frames. + */ + export class TaskProcessor { + constructor(workerPath: string, maximumActiveTasks?: number); + /** + * Schedule a task to be processed by the web worker asynchronously. If there are currently more + * tasks active than the maximum set by the constructor, will immediately return undefined. + * Otherwise, returns a promise that will resolve to the result posted back by the worker when + * finished. + * @example + * const taskProcessor = new Cesium.TaskProcessor('myWorkerPath'); + * const promise = taskProcessor.scheduleTask({ + * someParameter : true, + * another : 'hello' + * }); + * if (!Cesium.defined(promise)) { + * // too many active tasks - try again later + * } else { + * promise.then(function(result) { + * // use the result of the task + * }); + * } + * @param parameters - Any input data that will be posted to the worker. + * @param [transferableObjects] - An array of objects contained in parameters that should be + * transferred to the worker instead of copied. + * @returns Either a promise that will resolve to the result when available, or undefined + * if there are too many active tasks, + */ + scheduleTask( + parameters: any, + transferableObjects?: object[], + ): Promise | undefined; + /** + * Posts a message to a web worker with configuration to initialize loading + * and compiling a web assembly module asynchronously, as well as an optional + * fallback JavaScript module to use if Web Assembly is not supported. + * @param [webAssemblyOptions] - An object with the following properties: + * @param [webAssemblyOptions.modulePath] - The path of the web assembly JavaScript wrapper module. + * @param [webAssemblyOptions.wasmBinaryFile] - The path of the web assembly binary file. + * @param [webAssemblyOptions.fallbackModulePath] - The path of the fallback JavaScript module to use if web assembly is not supported. + * @returns A promise that resolves to the result when the web worker has loaded and compiled the web assembly module and is ready to process tasks. + */ + initWebAssemblyModule(webAssemblyOptions?: { + modulePath?: string; + wasmBinaryFile?: string; + fallbackModulePath?: string; + }): Promise; + /** + * Returns true if this object was destroyed; otherwise, false. + *

+ * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys this object. This will immediately terminate the Worker. + *

+ * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + */ + destroy(): void; + } + + /** + * Terrain data for a single tile. This type describes an + * interface and is not intended to be instantiated directly. + */ + export class TerrainData { + constructor(); + /** + * An array of credits for this tile. + */ + credits: Credit[]; + /** + * The water mask included in this terrain data, if any. A water mask is a rectangular + * Uint8Array or image where a value of 255 indicates water and a value of 0 indicates land. + * Values in between 0 and 255 are allowed as well to smoothly blend between land and water. + */ + waterMask: Uint8Array | HTMLImageElement | HTMLCanvasElement; + /** + * Computes the terrain height at a specified longitude and latitude. + * @param rectangle - The rectangle covered by this terrain data. + * @param longitude - The longitude in radians. + * @param latitude - The latitude in radians. + * @returns The terrain height at the specified position. If the position + * is outside the rectangle, this method will extrapolate the height, which is likely to be wildly + * incorrect for positions far outside the rectangle. + */ + interpolateHeight( + rectangle: Rectangle, + longitude: number, + latitude: number, + ): number; + /** + * Determines if a given child tile is available, based on the + * {@link TerrainData#childTileMask}. The given child tile coordinates are assumed + * to be one of the four children of this tile. If non-child tile coordinates are + * given, the availability of the southeast child tile is returned. + * @param thisX - The tile X coordinate of this (the parent) tile. + * @param thisY - The tile Y coordinate of this (the parent) tile. + * @param childX - The tile X coordinate of the child tile to check for availability. + * @param childY - The tile Y coordinate of the child tile to check for availability. + * @returns True if the child tile is available; otherwise, false. + */ + isChildAvailable( + thisX: number, + thisY: number, + childX: number, + childY: number, + ): boolean; + /** + * Upsamples this terrain data for use by a descendant tile. + * @param tilingScheme - The tiling scheme of this terrain data. + * @param thisX - The X coordinate of this tile in the tiling scheme. + * @param thisY - The Y coordinate of this tile in the tiling scheme. + * @param thisLevel - The level of this tile in the tiling scheme. + * @param descendantX - The X coordinate within the tiling scheme of the descendant tile for which we are upsampling. + * @param descendantY - The Y coordinate within the tiling scheme of the descendant tile for which we are upsampling. + * @param descendantLevel - The level within the tiling scheme of the descendant tile for which we are upsampling. + * @returns A promise for upsampled terrain data for the descendant tile, + * or undefined if too many asynchronous upsample operations are in progress and the request has been + * deferred. + */ + upsample( + tilingScheme: TilingScheme, + thisX: number, + thisY: number, + thisLevel: number, + descendantX: number, + descendantY: number, + descendantLevel: number, + ): Promise | undefined; + /** + * Gets a value indicating whether or not this terrain data was created by upsampling lower resolution + * terrain data. If this value is false, the data was obtained from some other source, such + * as by downloading it from a remote server. This method should return true for instances + * returned from a call to {@link TerrainData#upsample}. + * @returns True if this instance was created by upsampling; otherwise, false. + */ + wasCreatedByUpsampling(): boolean; + } + + export namespace TerrainProvider { + /** + * A function that is called when an error occurs. + * @param err - An object holding details about the error that occurred. + */ + type ErrorEvent = (this: TerrainProvider, err: TileProviderError) => void; + } + + /** + * Provides terrain or other geometry for the surface of an ellipsoid. The surface geometry is + * organized into a pyramid of tiles according to a {@link TilingScheme}. This type describes an + * interface and is not intended to be instantiated directly. + */ + export class TerrainProvider { + constructor(); + /** + * Gets an event that is raised when the terrain provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + */ + readonly errorEvent: Event; + /** + * Gets the credit to display when this terrain provider is active. Typically this is used to credit + * the source of the terrain. + */ + readonly credit: Credit; + /** + * Gets the tiling scheme used by the provider. + */ + readonly tilingScheme: TilingScheme; + /** + * Gets a value indicating whether or not the provider includes a water mask. The water mask + * indicates which areas of the globe are water rather than land, so they can be rendered + * as a reflective surface with animated waves. + */ + readonly hasWaterMask: boolean; + /** + * Gets a value indicating whether or not the requested tiles include vertex normals. + */ + readonly hasVertexNormals: boolean; + /** + * Gets an object that can be used to determine availability of terrain from this provider, such as + * at points and in rectangles. This property may be undefined if availability + * information is not available. + */ + readonly availability: TileAvailability; + /** + * Gets a list of indices for a triangle mesh representing a regular grid. Calling + * this function multiple times with the same grid width and height returns the + * same list of indices. The total number of vertices must be less than or equal + * to 65536. + * @param width - The number of vertices in the regular grid in the horizontal direction. + * @param height - The number of vertices in the regular grid in the vertical direction. + * @returns The list of indices. Uint16Array gets returned for 64KB or less and Uint32Array for 4GB or less. + */ + static getRegularGridIndices( + width: number, + height: number, + ): Uint16Array | Uint32Array; + /** + * Specifies the quality of terrain created from heightmaps. A value of 1.0 will + * ensure that adjacent heightmap vertices are separated by no more than + * {@link Globe.maximumScreenSpaceError} screen pixels and will probably go very slowly. + * A value of 0.5 will cut the estimated level zero geometric error in half, allowing twice the + * screen pixels between adjacent heightmap vertices and thus rendering more quickly. + */ + static heightmapTerrainQuality: number; + /** + * Determines an appropriate geometric error estimate when the geometry comes from a heightmap. + * @param ellipsoid - The ellipsoid to which the terrain is attached. + * @param tileImageWidth - The width, in pixels, of the heightmap associated with a single tile. + * @param numberOfTilesAtLevelZero - The number of tiles in the horizontal direction at tile level zero. + * @returns An estimated geometric error. + */ + static getEstimatedLevelZeroGeometricErrorForAHeightmap( + ellipsoid: Ellipsoid, + tileImageWidth: number, + numberOfTilesAtLevelZero: number, + ): number; + /** + * Requests the geometry for a given tile. The result must include terrain data and + * may optionally include a water mask and an indication of which child tiles are available. + * @param x - The X coordinate of the tile for which to request geometry. + * @param y - The Y coordinate of the tile for which to request geometry. + * @param level - The level of the tile for which to request geometry. + * @param [request] - The request object. Intended for internal use only. + * @returns A promise for the requested geometry. If this method + * returns undefined instead of a promise, it is an indication that too many requests are already + * pending and the request will be retried later. + */ + requestTileGeometry( + x: number, + y: number, + level: number, + request?: Request, + ): Promise | undefined; + /** + * Gets the maximum geometric error allowed in a tile at a given level. + * @param level - The tile level for which to get the maximum geometric error. + * @returns The maximum geometric error. + */ + getLevelMaximumGeometricError(level: number): number; + /** + * Determines whether data for a tile is available to be loaded. + * @param x - The X coordinate of the tile for which to request geometry. + * @param y - The Y coordinate of the tile for which to request geometry. + * @param level - The level of the tile for which to request geometry. + * @returns Undefined if not supported by the terrain provider, otherwise true or false. + */ + getTileDataAvailable( + x: number, + y: number, + level: number, + ): boolean | undefined; + /** + * Makes sure we load availability data for a tile + * @param x - The X coordinate of the tile for which to request geometry. + * @param y - The Y coordinate of the tile for which to request geometry. + * @param level - The level of the tile for which to request geometry. + * @returns Undefined if nothing need to be loaded or a Promise that resolves when all required tiles are loaded + */ + loadTileDataAvailability( + x: number, + y: number, + level: number, + ): undefined | Promise; + } + + /** + * Reports the availability of tiles in a {@link TilingScheme}. + * @param tilingScheme - The tiling scheme in which to report availability. + * @param maximumLevel - The maximum tile level that is potentially available. + */ + export class TileAvailability { + constructor(tilingScheme: TilingScheme, maximumLevel: number); + /** + * Marks a rectangular range of tiles in a particular level as being available. For best performance, + * add your ranges in order of increasing level. + * @param level - The level. + * @param startX - The X coordinate of the first available tiles at the level. + * @param startY - The Y coordinate of the first available tiles at the level. + * @param endX - The X coordinate of the last available tiles at the level. + * @param endY - The Y coordinate of the last available tiles at the level. + */ + addAvailableTileRange( + level: number, + startX: number, + startY: number, + endX: number, + endY: number, + ): void; + /** + * Determines the level of the most detailed tile covering the position. This function + * usually completes in time logarithmic to the number of rectangles added with + * {@link TileAvailability#addAvailableTileRange}. + * @param position - The position for which to determine the maximum available level. The height component is ignored. + * @returns The level of the most detailed tile covering the position. + */ + computeMaximumLevelAtPosition(position: Cartographic): number; + /** + * Finds the most detailed level that is available _everywhere_ within a given rectangle. More detailed + * tiles may be available in parts of the rectangle, but not the whole thing. The return value of this + * function may be safely passed to {@link sampleTerrain} for any position within the rectangle. This function + * usually completes in time logarithmic to the number of rectangles added with + * {@link TileAvailability#addAvailableTileRange}. + * @param rectangle - The rectangle. + * @returns The best available level for the entire rectangle. + */ + computeBestAvailableLevelOverRectangle(rectangle: Rectangle): number; + /** + * Determines if a particular tile is available. + * @param level - The tile level to check. + * @param x - The X coordinate of the tile to check. + * @param y - The Y coordinate of the tile to check. + * @returns True if the tile is available; otherwise, false. + */ + isTileAvailable(level: number, x: number, y: number): boolean; + /** + * Computes a bit mask indicating which of a tile's four children exist. + * If a child's bit is set, a tile is available for that child. If it is cleared, + * the tile is not available. The bit values are as follows: + * + * + * + * + * + * + *
Bit PositionBit ValueChild Tile
01Southwest
12Southeast
24Northwest
38Northeast
+ * @param level - The level of the parent tile. + * @param x - The X coordinate of the parent tile. + * @param y - The Y coordinate of the parent tile. + * @returns The bit mask indicating child availability. + */ + computeChildMaskForTile(level: number, x: number, y: number): number; + } + + /** + * Provides details about an error that occurred in an {@link ImageryProvider} or a {@link TerrainProvider}. + * @param provider - The imagery or terrain provider that experienced the error. + * @param message - A message describing the error. + * @param [x] - The X coordinate of the tile that experienced the error, or undefined if the error + * is not specific to a particular tile. + * @param [y] - The Y coordinate of the tile that experienced the error, or undefined if the error + * is not specific to a particular tile. + * @param [level] - The level of the tile that experienced the error, or undefined if the error + * is not specific to a particular tile. + * @param [timesRetried = 0] - The number of times this operation has been retried. + * @param [error] - The error or exception that occurred, if any. + */ + export class TileProviderError { + constructor( + provider: ImageryProvider | TerrainProvider, + message: string, + x?: number, + y?: number, + level?: number, + timesRetried?: number, + error?: Error, + ); + /** + * The {@link ImageryProvider} or {@link TerrainProvider} that experienced the error. + */ + provider: ImageryProvider | TerrainProvider; + /** + * The message describing the error. + */ + message: string; + /** + * The X coordinate of the tile that experienced the error. If the error is not specific + * to a particular tile, this property will be undefined. + */ + x: number; + /** + * The Y coordinate of the tile that experienced the error. If the error is not specific + * to a particular tile, this property will be undefined. + */ + y: number; + /** + * The level-of-detail of the tile that experienced the error. If the error is not specific + * to a particular tile, this property will be undefined. + */ + level: number; + /** + * The number of times this operation has been retried. + */ + timesRetried: number; + /** + * True if the failed operation should be retried; otherwise, false. The imagery or terrain provider + * will set the initial value of this property before raising the event, but any listeners + * can change it. The value after the last listener is invoked will be acted upon. + */ + retry: boolean; + /** + * The error or exception that occurred, if any. + */ + error: Error; + /** + * Reports an error in an {@link ImageryProvider} or {@link TerrainProvider} by raising an event if it has any listeners, or by + * logging the error to the console if the event has no listeners. This method also tracks the number + * of times the operation has been retried. + * @param previousError - The error instance returned by this function the last + * time it was called for this error, or undefined if this is the first time this error has + * occurred. + * @param [provider] - The imagery or terrain provider that encountered the error. + * @param [event] - The event to raise to inform listeners of the error. + * @param [message] - The message describing the error. + * @param [x] - The X coordinate of the tile that experienced the error, or undefined if the + * error is not specific to a particular tile. + * @param [y] - The Y coordinate of the tile that experienced the error, or undefined if the + * error is not specific to a particular tile. + * @param [level] - The level-of-detail of the tile that experienced the error, or undefined if the + * error is not specific to a particular tile. + * @param [errorDetails] - The error or exception that occurred, if any. + * @returns The error instance that was passed to the event listeners and that + * should be passed to this function the next time it is called for the same error in order + * to track retry counts. + */ + static reportError( + previousError: TileProviderError, + provider?: ImageryProvider | TerrainProvider, + event?: Event, + message?: string, + x?: number, + y?: number, + level?: number, + errorDetails?: Error, + ): TileProviderError; + /** + * Reports success of an operation by resetting the retry count of a previous error, if any. This way, + * if the error occurs again in the future, the listeners will be informed that it has not yet been retried. + * @param previousError - The previous error, or undefined if this operation has + * not previously resulted in an error. + */ + static reportSuccess(previousError: TileProviderError): void; + } + + export namespace TileProviderError { + /** + * A function that will be called to retry the operation. + */ + type RetryFunction = () => void; + } + + /** + * A tiling scheme for geometry or imagery on the surface of an ellipsoid. At level-of-detail zero, + * the coarsest, least-detailed level, the number of tiles is configurable. + * At level of detail one, each of the level zero tiles has four children, two in each direction. + * At level of detail two, each of the level one tiles has four children, two in each direction. + * This continues for as many levels as are present in the geometry or imagery source. + */ + export class TilingScheme { + constructor(); + /** + * Gets the ellipsoid that is tiled by the tiling scheme. + */ + ellipsoid: Ellipsoid; + /** + * Gets the rectangle, in radians, covered by this tiling scheme. + */ + rectangle: Rectangle; + /** + * Gets the map projection used by the tiling scheme. + */ + projection: MapProjection; + /** + * Gets the total number of tiles in the X direction at a specified level-of-detail. + * @param level - The level-of-detail. + * @returns The number of tiles in the X direction at the given level. + */ + getNumberOfXTilesAtLevel(level: number): number; + /** + * Gets the total number of tiles in the Y direction at a specified level-of-detail. + * @param level - The level-of-detail. + * @returns The number of tiles in the Y direction at the given level. + */ + getNumberOfYTilesAtLevel(level: number): number; + /** + * Transforms a rectangle specified in geodetic radians to the native coordinate system + * of this tiling scheme. + * @param rectangle - The rectangle to transform. + * @param [result] - The instance to which to copy the result, or undefined if a new instance + * should be created. + * @returns The specified 'result', or a new object containing the native rectangle if 'result' + * is undefined. + */ + rectangleToNativeRectangle( + rectangle: Rectangle, + result?: Rectangle, + ): Rectangle; + /** + * Converts tile x, y coordinates and level to a rectangle expressed in the native coordinates + * of the tiling scheme. + * @param x - The integer x coordinate of the tile. + * @param y - The integer y coordinate of the tile. + * @param level - The tile level-of-detail. Zero is the least detailed. + * @param [result] - The instance to which to copy the result, or undefined if a new instance + * should be created. + * @returns The specified 'result', or a new object containing the rectangle + * if 'result' is undefined. + */ + tileXYToNativeRectangle( + x: number, + y: number, + level: number, + result?: any, + ): Rectangle; + /** + * Converts tile x, y coordinates and level to a cartographic rectangle in radians. + * @param x - The integer x coordinate of the tile. + * @param y - The integer y coordinate of the tile. + * @param level - The tile level-of-detail. Zero is the least detailed. + * @param [result] - The instance to which to copy the result, or undefined if a new instance + * should be created. + * @returns The specified 'result', or a new object containing the rectangle + * if 'result' is undefined. + */ + tileXYToRectangle( + x: number, + y: number, + level: number, + result?: any, + ): Rectangle; + /** + * Calculates the tile x, y coordinates of the tile containing + * a given cartographic position. + * @param position - The position. + * @param level - The tile level-of-detail. Zero is the least detailed. + * @param [result] - The instance to which to copy the result, or undefined if a new instance + * should be created. + * @returns The specified 'result', or a new object containing the tile x, y coordinates + * if 'result' is undefined. + */ + positionToTileXY( + position: Cartographic, + level: number, + result?: Cartesian2, + ): Cartesian2; + } + + /** + * An interval defined by a start and a stop time; optionally including those times as part of the interval. + * Arbitrary data can optionally be associated with each instance for used with {@link TimeIntervalCollection}. + * @example + * // Create an instance that spans August 1st, 1980 and is associated + * // with a Cartesian position. + * const timeInterval = new Cesium.TimeInterval({ + * start : Cesium.JulianDate.fromIso8601('1980-08-01T00:00:00Z'), + * stop : Cesium.JulianDate.fromIso8601('1980-08-02T00:00:00Z'), + * isStartIncluded : true, + * isStopIncluded : false, + * data : Cesium.Cartesian3.fromDegrees(39.921037, -75.170082) + * }); + * @example + * // Create two instances from ISO 8601 intervals with associated numeric data + * // then compute their intersection, summing the data they contain. + * const left = Cesium.TimeInterval.fromIso8601({ + * iso8601 : '2000/2010', + * data : 2 + * }); + * + * const right = Cesium.TimeInterval.fromIso8601({ + * iso8601 : '1995/2005', + * data : 3 + * }); + * + * //The result of the below intersection will be an interval equivalent to + * //const intersection = Cesium.TimeInterval.fromIso8601({ + * // iso8601 : '2000/2005', + * // data : 5 + * //}); + * const intersection = new Cesium.TimeInterval(); + * Cesium.TimeInterval.intersect(left, right, intersection, function(leftData, rightData) { + * return leftData + rightData; + * }); + * @example + * // Check if an interval contains a specific time. + * const dateToCheck = Cesium.JulianDate.fromIso8601('1982-09-08T11:30:00Z'); + * const containsDate = Cesium.TimeInterval.contains(timeInterval, dateToCheck); + * @param [options] - Object with the following properties: + * @param [options.start = new JulianDate()] - The start time of the interval. + * @param [options.stop = new JulianDate()] - The stop time of the interval. + * @param [options.isStartIncluded = true] - true if options.start is included in the interval, false otherwise. + * @param [options.isStopIncluded = true] - true if options.stop is included in the interval, false otherwise. + * @param [options.data] - Arbitrary data associated with this interval. + */ + export class TimeInterval { + constructor(options?: { + start?: JulianDate; + stop?: JulianDate; + isStartIncluded?: boolean; + isStopIncluded?: boolean; + data?: any; + }); + /** + * Gets or sets the start time of this interval. + */ + start: JulianDate; + /** + * Gets or sets the stop time of this interval. + */ + stop: JulianDate; + /** + * Gets or sets the data associated with this interval. + */ + data: any; + /** + * Gets or sets whether or not the start time is included in this interval. + */ + isStartIncluded: boolean; + /** + * Gets or sets whether or not the stop time is included in this interval. + */ + isStopIncluded: boolean; + /** + * Gets whether or not this interval is empty. + */ + readonly isEmpty: boolean; + /** + * Creates a new instance from a {@link http://en.wikipedia.org/wiki/ISO_8601|ISO 8601} interval. + * @param options - Object with the following properties: + * @param options.iso8601 - An ISO 8601 interval. + * @param [options.isStartIncluded = true] - true if options.start is included in the interval, false otherwise. + * @param [options.isStopIncluded = true] - true if options.stop is included in the interval, false otherwise. + * @param [options.data] - Arbitrary data associated with this interval. + * @param [result] - An existing instance to use for the result. + * @returns The modified result parameter or a new instance if none was provided. + */ + static fromIso8601( + options: { + iso8601: string; + isStartIncluded?: boolean; + isStopIncluded?: boolean; + data?: any; + }, + result?: TimeInterval, + ): TimeInterval; + /** + * Creates an ISO8601 representation of the provided interval. + * @param timeInterval - The interval to be converted. + * @param [precision] - The number of fractional digits used to represent the seconds component. By default, the most precise representation is used. + * @returns The ISO8601 representation of the provided interval. + */ + static toIso8601(timeInterval: TimeInterval, precision?: number): string; + /** + * Duplicates the provided instance. + * @param [timeInterval] - The instance to clone. + * @param [result] - An existing instance to use for the result. + * @returns The modified result parameter or a new instance if none was provided. + */ + static clone( + timeInterval?: TimeInterval, + result?: TimeInterval, + ): TimeInterval; + /** + * Compares two instances and returns true if they are equal, false otherwise. + * @param [left] - The first instance. + * @param [right] - The second instance. + * @param [dataComparer] - A function which compares the data of the two intervals. If omitted, reference equality is used. + * @returns true if the dates are equal; otherwise, false. + */ + static equals( + left?: TimeInterval, + right?: TimeInterval, + dataComparer?: TimeInterval.DataComparer, + ): boolean; + /** + * Compares two instances and returns true if they are within epsilon seconds of + * each other. That is, in order for the dates to be considered equal (and for + * this function to return true), the absolute value of the difference between them, in + * seconds, must be less than epsilon. + * @param [left] - The first instance. + * @param [right] - The second instance. + * @param [epsilon = 0] - The maximum number of seconds that should separate the two instances. + * @param [dataComparer] - A function which compares the data of the two intervals. If omitted, reference equality is used. + * @returns true if the two dates are within epsilon seconds of each other; otherwise false. + */ + static equalsEpsilon( + left?: TimeInterval, + right?: TimeInterval, + epsilon?: number, + dataComparer?: TimeInterval.DataComparer, + ): boolean; + /** + * Computes the intersection of two intervals, optionally merging their data. + * @param left - The first interval. + * @param [right] - The second interval. + * @param [result] - An existing instance to use for the result. + * @param [mergeCallback] - A function which merges the data of the two intervals. If omitted, the data from the left interval will be used. + * @returns The modified result parameter. + */ + static intersect( + left: TimeInterval, + right?: TimeInterval, + result?: TimeInterval, + mergeCallback?: TimeInterval.MergeCallback, + ): TimeInterval; + /** + * Checks if the specified date is inside the provided interval. + * @param timeInterval - The interval. + * @param julianDate - The date to check. + * @returns true if the interval contains the specified date, false otherwise. + */ + static contains( + timeInterval: TimeInterval, + julianDate: JulianDate, + ): boolean; + /** + * Duplicates this instance. + * @param [result] - An existing instance to use for the result. + * @returns The modified result parameter or a new instance if none was provided. + */ + clone(result?: TimeInterval): TimeInterval; + /** + * Compares this instance against the provided instance componentwise and returns + * true if they are equal, false otherwise. + * @param [right] - The right hand side interval. + * @param [dataComparer] - A function which compares the data of the two intervals. If omitted, reference equality is used. + * @returns true if they are equal, false otherwise. + */ + equals( + right?: TimeInterval, + dataComparer?: TimeInterval.DataComparer, + ): boolean; + /** + * Compares this instance against the provided instance componentwise and returns + * true if they are within the provided epsilon, + * false otherwise. + * @param [right] - The right hand side interval. + * @param [epsilon = 0] - The epsilon to use for equality testing. + * @param [dataComparer] - A function which compares the data of the two intervals. If omitted, reference equality is used. + * @returns true if they are within the provided epsilon, false otherwise. + */ + equalsEpsilon( + right?: TimeInterval, + epsilon?: number, + dataComparer?: TimeInterval.DataComparer, + ): boolean; + /** + * Creates a string representing this TimeInterval in ISO8601 format. + * @returns A string representing this TimeInterval in ISO8601 format. + */ + toString(): string; + /** + * An immutable empty interval. + */ + static readonly EMPTY: TimeInterval; + } + + export namespace TimeInterval { + /** + * Function interface for merging interval data. + * @param leftData - The first data instance. + * @param rightData - The second data instance. + */ + type MergeCallback = (leftData: any, rightData: any) => any; + /** + * Function interface for comparing interval data. + * @param leftData - The first data instance. + * @param rightData - The second data instance. + */ + type DataComparer = (leftData: any, rightData: any) => boolean; + } + + /** + * A non-overlapping collection of {@link TimeInterval} instances sorted by start time. + * @param [intervals] - An array of intervals to add to the collection. + */ + export class TimeIntervalCollection { + constructor(intervals?: TimeInterval[]); + /** + * Gets an event that is raised whenever the collection of intervals change. + */ + readonly changedEvent: Event; + /** + * Gets the start time of the collection. + */ + readonly start: JulianDate; + /** + * Gets whether or not the start time is included in the collection. + */ + readonly isStartIncluded: boolean; + /** + * Gets the stop time of the collection. + */ + readonly stop: JulianDate; + /** + * Gets whether or not the stop time is included in the collection. + */ + readonly isStopIncluded: boolean; + /** + * Gets the number of intervals in the collection. + */ + readonly length: number; + /** + * Gets whether or not the collection is empty. + */ + readonly isEmpty: boolean; + /** + * Compares this instance against the provided instance componentwise and returns + * true if they are equal, false otherwise. + * @param [right] - The right hand side collection. + * @param [dataComparer] - A function which compares the data of the two intervals. If omitted, reference equality is used. + * @returns true if they are equal, false otherwise. + */ + equals( + right?: TimeIntervalCollection, + dataComparer?: TimeInterval.DataComparer, + ): boolean; + /** + * Gets the interval at the specified index. + * @param index - The index of the interval to retrieve. + * @returns The interval at the specified index, or undefined if no interval exists as that index. + */ + get(index: number): TimeInterval | undefined; + /** + * Removes all intervals from the collection. + */ + removeAll(): void; + /** + * Finds and returns the interval that contains the specified date. + * @param date - The date to search for. + * @returns The interval containing the specified date, undefined if no such interval exists. + */ + findIntervalContainingDate(date: JulianDate): TimeInterval | undefined; + /** + * Finds and returns the data for the interval that contains the specified date. + * @param date - The date to search for. + * @returns The data for the interval containing the specified date, or undefined if no such interval exists. + */ + findDataForIntervalContainingDate(date: JulianDate): any; + /** + * Checks if the specified date is inside this collection. + * @param julianDate - The date to check. + * @returns true if the collection contains the specified date, false otherwise. + */ + contains(julianDate: JulianDate): boolean; + /** + * Finds and returns the index of the interval in the collection that contains the specified date. + * @param date - The date to search for. + * @returns The index of the interval that contains the specified date, if no such interval exists, + * it returns a negative number which is the bitwise complement of the index of the next interval that + * starts after the date, or if no interval starts after the specified date, the bitwise complement of + * the length of the collection. + */ + indexOf(date: JulianDate): number; + /** + * Returns the first interval in the collection that matches the specified parameters. + * All parameters are optional and undefined parameters are treated as a don't care condition. + * @param [options] - Object with the following properties: + * @param [options.start] - The start time of the interval. + * @param [options.stop] - The stop time of the interval. + * @param [options.isStartIncluded] - true if options.start is included in the interval, false otherwise. + * @param [options.isStopIncluded] - true if options.stop is included in the interval, false otherwise. + * @returns The first interval in the collection that matches the specified parameters. + */ + findInterval(options?: { + start?: JulianDate; + stop?: JulianDate; + isStartIncluded?: boolean; + isStopIncluded?: boolean; + }): TimeInterval | undefined; + /** + * Adds an interval to the collection, merging intervals that contain the same data and + * splitting intervals of different data as needed in order to maintain a non-overlapping collection. + * The data in the new interval takes precedence over any existing intervals in the collection. + * @param interval - The interval to add. + * @param [dataComparer] - A function which compares the data of the two intervals. If omitted, reference equality is used. + */ + addInterval( + interval: TimeInterval, + dataComparer?: TimeInterval.DataComparer, + ): void; + /** + * Removes the specified interval from this interval collection, creating a hole over the specified interval. + * The data property of the input interval is ignored. + * @param interval - The interval to remove. + * @returns true if the interval was removed, false if no part of the interval was in the collection. + */ + removeInterval(interval: TimeInterval): boolean; + /** + * Creates a new instance that is the intersection of this collection and the provided collection. + * @param other - The collection to intersect with. + * @param [dataComparer] - A function which compares the data of the two intervals. If omitted, reference equality is used. + * @param [mergeCallback] - A function which merges the data of the two intervals. If omitted, the data from the left interval will be used. + * @returns A new TimeIntervalCollection which is the intersection of this collection and the provided collection. + */ + intersect( + other: TimeIntervalCollection, + dataComparer?: TimeInterval.DataComparer, + mergeCallback?: TimeInterval.MergeCallback, + ): TimeIntervalCollection; + /** + * Creates a new instance from a JulianDate array. + * @param options - Object with the following properties: + * @param options.julianDates - An array of ISO 8601 dates. + * @param [options.isStartIncluded = true] - true if start time is included in the interval, false otherwise. + * @param [options.isStopIncluded = true] - true if stop time is included in the interval, false otherwise. + * @param [options.leadingInterval = false] - true if you want to add a interval from Iso8601.MINIMUM_VALUE to start time, false otherwise. + * @param [options.trailingInterval = false] - true if you want to add a interval from stop time to Iso8601.MAXIMUM_VALUE, false otherwise. + * @param [options.dataCallback] - A function that will be return the data that is called with each interval before it is added to the collection. If unspecified, the data will be the index in the collection. + * @param [result] - An existing instance to use for the result. + * @returns The modified result parameter or a new instance if none was provided. + */ + static fromJulianDateArray( + options: { + julianDates: JulianDate[]; + isStartIncluded?: boolean; + isStopIncluded?: boolean; + leadingInterval?: boolean; + trailingInterval?: boolean; + dataCallback?: (...params: any[]) => any; + }, + result?: TimeIntervalCollection, + ): TimeIntervalCollection; + /** + * Creates a new instance from an {@link http://en.wikipedia.org/wiki/ISO_8601|ISO 8601} time interval (start/end/duration). + * @param options - Object with the following properties: + * @param options.iso8601 - An ISO 8601 interval. + * @param [options.isStartIncluded = true] - true if start time is included in the interval, false otherwise. + * @param [options.isStopIncluded = true] - true if stop time is included in the interval, false otherwise. + * @param [options.leadingInterval = false] - true if you want to add a interval from Iso8601.MINIMUM_VALUE to start time, false otherwise. + * @param [options.trailingInterval = false] - true if you want to add a interval from stop time to Iso8601.MAXIMUM_VALUE, false otherwise. + * @param [options.dataCallback] - A function that will be return the data that is called with each interval before it is added to the collection. If unspecified, the data will be the index in the collection. + * @param [result] - An existing instance to use for the result. + * @returns The modified result parameter or a new instance if none was provided. + */ + static fromIso8601( + options: { + iso8601: string; + isStartIncluded?: boolean; + isStopIncluded?: boolean; + leadingInterval?: boolean; + trailingInterval?: boolean; + dataCallback?: (...params: any[]) => any; + }, + result?: TimeIntervalCollection, + ): TimeIntervalCollection; + /** + * Creates a new instance from a {@link http://en.wikipedia.org/wiki/ISO_8601|ISO 8601} date array. + * @param options - Object with the following properties: + * @param options.iso8601Dates - An array of ISO 8601 dates. + * @param [options.isStartIncluded = true] - true if start time is included in the interval, false otherwise. + * @param [options.isStopIncluded = true] - true if stop time is included in the interval, false otherwise. + * @param [options.leadingInterval = false] - true if you want to add a interval from Iso8601.MINIMUM_VALUE to start time, false otherwise. + * @param [options.trailingInterval = false] - true if you want to add a interval from stop time to Iso8601.MAXIMUM_VALUE, false otherwise. + * @param [options.dataCallback] - A function that will be return the data that is called with each interval before it is added to the collection. If unspecified, the data will be the index in the collection. + * @param [result] - An existing instance to use for the result. + * @returns The modified result parameter or a new instance if none was provided. + */ + static fromIso8601DateArray( + options: { + iso8601Dates: string[]; + isStartIncluded?: boolean; + isStopIncluded?: boolean; + leadingInterval?: boolean; + trailingInterval?: boolean; + dataCallback?: (...params: any[]) => any; + }, + result?: TimeIntervalCollection, + ): TimeIntervalCollection; + /** + * Creates a new instance from a {@link http://en.wikipedia.org/wiki/ISO_8601|ISO 8601} duration array. + * @param options - Object with the following properties: + * @param options.epoch - An date that the durations are relative to. + * @param options.iso8601Durations - An array of ISO 8601 durations. + * @param [options.relativeToPrevious = false] - true if durations are relative to previous date, false if always relative to the epoch. + * @param [options.isStartIncluded = true] - true if start time is included in the interval, false otherwise. + * @param [options.isStopIncluded = true] - true if stop time is included in the interval, false otherwise. + * @param [options.leadingInterval = false] - true if you want to add a interval from Iso8601.MINIMUM_VALUE to start time, false otherwise. + * @param [options.trailingInterval = false] - true if you want to add a interval from stop time to Iso8601.MAXIMUM_VALUE, false otherwise. + * @param [options.dataCallback] - A function that will be return the data that is called with each interval before it is added to the collection. If unspecified, the data will be the index in the collection. + * @param [result] - An existing instance to use for the result. + * @returns The modified result parameter or a new instance if none was provided. + */ + static fromIso8601DurationArray( + options: { + epoch: JulianDate; + iso8601Durations: string; + relativeToPrevious?: boolean; + isStartIncluded?: boolean; + isStopIncluded?: boolean; + leadingInterval?: boolean; + trailingInterval?: boolean; + dataCallback?: (...params: any[]) => any; + }, + result?: TimeIntervalCollection, + ): TimeIntervalCollection; + } + + /** + * Provides the type of time standards which JulianDate can take as input. + */ + export enum TimeStandard { + /** + * Represents the coordinated Universal Time (UTC) time standard. + * + * UTC is related to TAI according to the relationship + * UTC = TAI - deltaT where deltaT is the number of leap + * seconds which have been introduced as of the time in TAI. + */ + UTC = 0, + /** + * Represents the International Atomic Time (TAI) time standard. + * TAI is the principal time standard to which the other time standards are related. + */ + TAI = 1, + } + + /** + * Constants for identifying well-known tracking reference frames. + */ + export enum TrackingReferenceFrame { + /** + * Auto-detect algorithm. The reference frame used to track the Entity will + * be automatically selected based on its trajectory: near-surface slow moving + * objects will be tracked in the entity's local east-north-up reference + * frame, while faster objects like satellites will use VVLH (Vehicle Velocity, + * Local Horizontal). + */ + AUTODETECT = 0, + /** + * The entity's local East-North-Up reference frame. + */ + ENU = 1, + /** + * The entity's inertial reference frame. If entity has no defined orientation + * property, it falls back to auto-detect algorithm. + */ + INERTIAL = 2, + /** + * The entity's inertial reference frame with orientation fixed to its + * {@link VelocityOrientationProperty}, ignoring its own orientation. + */ + VELOCITY = 3, + } + + /** + * Contains functions for transforming positions to various reference frames. + */ + export namespace Transforms { + /** + * Generates a function that computes a 4x4 transformation matrix from a reference frame + * centered at the provided origin to the provided ellipsoid's fixed reference frame. + * @param firstAxis - name of the first axis of the local reference frame. Must be + * 'east', 'north', 'up', 'west', 'south' or 'down'. + * @param secondAxis - name of the second axis of the local reference frame. Must be + * 'east', 'north', 'up', 'west', 'south' or 'down'. + * @returns The function that will computes a + * 4x4 transformation matrix from a reference frame, with first axis and second axis compliant with the parameters, + */ + function localFrameToFixedFrameGenerator( + firstAxis: string, + secondAxis: string, + ): Transforms.LocalFrameToFixedFrame; + /** + * Computes a 4x4 transformation matrix from a reference frame + * centered at the provided origin to the provided ellipsoid's fixed reference frame. + * @param origin - The center point of the local reference frame. + * @param [ellipsoid = Ellipsoid.default] - The ellipsoid whose fixed frame is used in the transformation. + * @param [result] - The object onto which to store the result. + */ + type LocalFrameToFixedFrame = ( + origin: Cartesian3, + ellipsoid?: Ellipsoid, + result?: Matrix4, + ) => Matrix4; + /** + * Computes a 4x4 transformation matrix from a reference frame with an east-north-up axes + * centered at the provided origin to the provided ellipsoid's fixed reference frame. + * The local axes are defined as: + *
    + *
  • The x axis points in the local east direction.
  • + *
  • The y axis points in the local north direction.
  • + *
  • The z axis points in the direction of the ellipsoid surface normal which passes through the position.
  • + *
+ * @example + * // Get the transform from local east-north-up at cartographic (0.0, 0.0) to Earth's fixed frame. + * const center = Cesium.Cartesian3.fromDegrees(0.0, 0.0); + * const transform = Cesium.Transforms.eastNorthUpToFixedFrame(center); + * @param origin - The center point of the local reference frame. + * @param [ellipsoid = Ellipsoid.default] - The ellipsoid whose fixed frame is used in the transformation. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Matrix4 instance if none was provided. + */ + function eastNorthUpToFixedFrame( + origin: Cartesian3, + ellipsoid?: Ellipsoid, + result?: Matrix4, + ): Matrix4; + /** + * Computes a 4x4 transformation matrix from a reference frame with an north-east-down axes + * centered at the provided origin to the provided ellipsoid's fixed reference frame. + * The local axes are defined as: + *
    + *
  • The x axis points in the local north direction.
  • + *
  • The y axis points in the local east direction.
  • + *
  • The z axis points in the opposite direction of the ellipsoid surface normal which passes through the position.
  • + *
+ * @example + * // Get the transform from local north-east-down at cartographic (0.0, 0.0) to Earth's fixed frame. + * const center = Cesium.Cartesian3.fromDegrees(0.0, 0.0); + * const transform = Cesium.Transforms.northEastDownToFixedFrame(center); + * @param origin - The center point of the local reference frame. + * @param [ellipsoid = Ellipsoid.default] - The ellipsoid whose fixed frame is used in the transformation. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Matrix4 instance if none was provided. + */ + function northEastDownToFixedFrame( + origin: Cartesian3, + ellipsoid?: Ellipsoid, + result?: Matrix4, + ): Matrix4; + /** + * Computes a 4x4 transformation matrix from a reference frame with an north-up-east axes + * centered at the provided origin to the provided ellipsoid's fixed reference frame. + * The local axes are defined as: + *
    + *
  • The x axis points in the local north direction.
  • + *
  • The y axis points in the direction of the ellipsoid surface normal which passes through the position.
  • + *
  • The z axis points in the local east direction.
  • + *
+ * @example + * // Get the transform from local north-up-east at cartographic (0.0, 0.0) to Earth's fixed frame. + * const center = Cesium.Cartesian3.fromDegrees(0.0, 0.0); + * const transform = Cesium.Transforms.northUpEastToFixedFrame(center); + * @param origin - The center point of the local reference frame. + * @param [ellipsoid = Ellipsoid.default] - The ellipsoid whose fixed frame is used in the transformation. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Matrix4 instance if none was provided. + */ + function northUpEastToFixedFrame( + origin: Cartesian3, + ellipsoid?: Ellipsoid, + result?: Matrix4, + ): Matrix4; + /** + * Computes a 4x4 transformation matrix from a reference frame with an north-west-up axes + * centered at the provided origin to the provided ellipsoid's fixed reference frame. + * The local axes are defined as: + *
    + *
  • The x axis points in the local north direction.
  • + *
  • The y axis points in the local west direction.
  • + *
  • The z axis points in the direction of the ellipsoid surface normal which passes through the position.
  • + *
+ * @example + * // Get the transform from local north-West-Up at cartographic (0.0, 0.0) to Earth's fixed frame. + * const center = Cesium.Cartesian3.fromDegrees(0.0, 0.0); + * const transform = Cesium.Transforms.northWestUpToFixedFrame(center); + * @param origin - The center point of the local reference frame. + * @param [ellipsoid = Ellipsoid.default] - The ellipsoid whose fixed frame is used in the transformation. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Matrix4 instance if none was provided. + */ + function northWestUpToFixedFrame( + origin: Cartesian3, + ellipsoid?: Ellipsoid, + result?: Matrix4, + ): Matrix4; + /** + * Computes a 4x4 transformation matrix from a reference frame with axes computed from the heading-pitch-roll angles + * centered at the provided origin to the provided ellipsoid's fixed reference frame. Heading is the rotation from the local east + * direction where a positive angle is increasing eastward. Pitch is the rotation from the local east-north plane. Positive pitch angles + * are above the plane. Negative pitch angles are below the plane. Roll is the first rotation applied about the local east axis. + * @example + * // Get the transform from local heading-pitch-roll at cartographic (0.0, 0.0) to Earth's fixed frame. + * const center = Cesium.Cartesian3.fromDegrees(0.0, 0.0); + * const heading = -Cesium.Math.PI_OVER_TWO; + * const pitch = Cesium.Math.PI_OVER_FOUR; + * const roll = 0.0; + * const hpr = new Cesium.HeadingPitchRoll(heading, pitch, roll); + * const transform = Cesium.Transforms.headingPitchRollToFixedFrame(center, hpr); + * @param origin - The center point of the local reference frame. + * @param headingPitchRoll - The heading, pitch, and roll. + * @param [ellipsoid = Ellipsoid.default] - The ellipsoid whose fixed frame is used in the transformation. + * @param [fixedFrameTransform = Transforms.eastNorthUpToFixedFrame] - A 4x4 transformation + * matrix from a reference frame to the provided ellipsoid's fixed reference frame + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Matrix4 instance if none was provided. + */ + function headingPitchRollToFixedFrame( + origin: Cartesian3, + headingPitchRoll: HeadingPitchRoll, + ellipsoid?: Ellipsoid, + fixedFrameTransform?: Transforms.LocalFrameToFixedFrame, + result?: Matrix4, + ): Matrix4; + /** + * Computes a quaternion from a reference frame with axes computed from the heading-pitch-roll angles + * centered at the provided origin. Heading is the rotation from the local east + * direction where a positive angle is increasing eastward. Pitch is the rotation from the local east-north plane. Positive pitch angles + * are above the plane. Negative pitch angles are below the plane. Roll is the first rotation applied about the local east axis. + * @example + * // Get the quaternion from local heading-pitch-roll at cartographic (0.0, 0.0) to Earth's fixed frame. + * const center = Cesium.Cartesian3.fromDegrees(0.0, 0.0); + * const heading = -Cesium.Math.PI_OVER_TWO; + * const pitch = Cesium.Math.PI_OVER_FOUR; + * const roll = 0.0; + * const hpr = new HeadingPitchRoll(heading, pitch, roll); + * const quaternion = Cesium.Transforms.headingPitchRollQuaternion(center, hpr); + * @param origin - The center point of the local reference frame. + * @param headingPitchRoll - The heading, pitch, and roll. + * @param [ellipsoid = Ellipsoid.default] - The ellipsoid whose fixed frame is used in the transformation. + * @param [fixedFrameTransform = Transforms.eastNorthUpToFixedFrame] - A 4x4 transformation + * matrix from a reference frame to the provided ellipsoid's fixed reference frame + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Quaternion instance if none was provided. + */ + function headingPitchRollQuaternion( + origin: Cartesian3, + headingPitchRoll: HeadingPitchRoll, + ellipsoid?: Ellipsoid, + fixedFrameTransform?: Transforms.LocalFrameToFixedFrame, + result?: Quaternion, + ): Quaternion; + /** + * Computes heading-pitch-roll angles from a transform in a particular reference frame. Heading is the rotation from the local east + * direction where a positive angle is increasing eastward. Pitch is the rotation from the local east-north plane. Positive pitch angles + * are above the plane. Negative pitch angles are below the plane. Roll is the first rotation applied about the local east axis. + * @param transform - The transform + * @param [ellipsoid = Ellipsoid.default] - The ellipsoid whose fixed frame is used in the transformation. + * @param [fixedFrameTransform = Transforms.eastNorthUpToFixedFrame] - A 4x4 transformation + * matrix from a reference frame to the provided ellipsoid's fixed reference frame + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new HeadingPitchRoll instance if none was provided. + */ + function fixedFrameToHeadingPitchRoll( + transform: Matrix4, + ellipsoid?: Ellipsoid, + fixedFrameTransform?: Transforms.LocalFrameToFixedFrame, + result?: HeadingPitchRoll, + ): HeadingPitchRoll; + /** + * The default function to compute a rotation matrix to transform a point or vector from the International Celestial + * Reference Frame (GCRF/ICRF) inertial frame axes to the central body, typically Earth, fixed frame axis at a given + * time for use in lighting and transformation from inertial reference frames. This function may return undefined if + * the data necessary to do the transformation is not yet loaded. + * @example + * // Set the default ICRF to fixed transformation to that of the Moon. + * Cesium.Transforms.computeIcrfToCentralBodyFixedMatrix = Cesium.Transforms.computeIcrfToMoonFixedMatrix; + * @param date - The time at which to compute the rotation matrix. + * @param [result] - The object onto which to store the result. If this parameter is + * not specified, a new instance is created and returned. + * @returns The rotation matrix, or undefined if the data necessary to do the + * transformation is not yet loaded. + */ + function computeIcrfToCentralBodyFixedMatrix( + date: JulianDate, + result?: Matrix3, + ): Matrix3 | undefined; + /** + * Computes a rotation matrix to transform a point or vector from True Equator Mean Equinox (TEME) axes to the + * pseudo-fixed axes at a given time. This method treats the UT1 time standard as equivalent to UTC. + * @example + * //Set the view to the inertial frame. + * scene.postUpdate.addEventListener(function(scene, time) { + * const now = Cesium.JulianDate.now(); + * const offset = Cesium.Matrix4.multiplyByPoint(camera.transform, camera.position, new Cesium.Cartesian3()); + * const transform = Cesium.Matrix4.fromRotationTranslation(Cesium.Transforms.computeTemeToPseudoFixedMatrix(now)); + * const inverseTransform = Cesium.Matrix4.inverseTransformation(transform, new Cesium.Matrix4()); + * Cesium.Matrix4.multiplyByPoint(inverseTransform, offset, offset); + * camera.lookAtTransform(transform, offset); + * }); + * @param date - The time at which to compute the rotation matrix. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Matrix3 instance if none was provided. + */ + function computeTemeToPseudoFixedMatrix( + date: JulianDate, + result?: Matrix3, + ): Matrix3; + /** + * Preloads the data necessary to transform between the ICRF and Fixed axes, in either + * direction, over a given interval. This function returns a promise that, when resolved, + * indicates that the preload has completed. + * @example + * const interval = new Cesium.TimeInterval(...); + * await Cesium.Transforms.preloadIcrfFixed(interval)); + * // the data is now loaded + * @param timeInterval - The interval to preload. + * @returns A promise that, when resolved, indicates that the preload has completed + * and evaluation of the transformation between the fixed and ICRF axes will + * no longer return undefined for a time inside the interval. + */ + function preloadIcrfFixed(timeInterval: TimeInterval): Promise; + /** + * Computes a rotation matrix to transform a point or vector from the International Celestial + * Reference Frame (GCRF/ICRF) inertial frame axes to the Earth-Fixed frame axes (ITRF) + * at a given time. This function may return undefined if the data necessary to + * do the transformation is not yet loaded. + * @example + * scene.postUpdate.addEventListener(function(scene, time) { + * // View in ICRF. + * const icrfToFixed = Cesium.Transforms.computeIcrfToFixedMatrix(time); + * if (Cesium.defined(icrfToFixed)) { + * const offset = Cesium.Cartesian3.clone(camera.position); + * const transform = Cesium.Matrix4.fromRotationTranslation(icrfToFixed); + * camera.lookAtTransform(transform, offset); + * } + * }); + * @param date - The time at which to compute the rotation matrix. + * @param [result] - The object onto which to store the result. If this parameter is + * not specified, a new instance is created and returned. + * @returns The rotation matrix, or undefined if the data necessary to do the + * transformation is not yet loaded. + */ + function computeIcrfToFixedMatrix( + date: JulianDate, + result?: Matrix3, + ): Matrix3 | undefined; + /** + * Computes a rotation matrix to transform a point or vector from the Moon-Fixed frame axes + * to the International Celestial Reference Frame (GCRF/ICRF) inertial frame axes + * at a given time. + * @example + * // Transform a point from the Fixed axes to the ICRF axes. + * const now = Cesium.JulianDate.now(); + * const pointInFixed = Cesium.Cartesian3.fromDegrees(0.0, 0.0); + * const fixedToIcrf = Cesium.Transforms.computeMoonFixedToIcrfMatrix(now); + * let pointInInertial = new Cesium.Cartesian3(); + * if (Cesium.defined(fixedToIcrf)) { + * pointInInertial = Cesium.Matrix3.multiplyByVector(fixedToIcrf, pointInFixed, pointInInertial); + * } + * @param date - The time at which to compute the rotation matrix. + * @param [result] - The object onto which to store the result. If this parameter is + * not specified, a new instance is created and returned. + * @returns The rotation matrix. + */ + function computeMoonFixedToIcrfMatrix( + date: JulianDate, + result?: Matrix3, + ): Matrix3; + /** + * Computes a rotation matrix to transform a point or vector from the International Celestial + * Reference Frame (GCRF/ICRF) inertial frame axes to the Moon-Fixed frame axes + * at a given time. + * @example + * // Set the default ICRF to fixed transformation to that of the Moon. + * Cesium.Transforms.computeIcrfToCentralBodyFixedMatrix = Cesium.Transforms.computeIcrfToMoonFixedMatrix; + * @param date - The time at which to compute the rotation matrix. + * @param [result] - The object onto which to store the result. If this parameter is + * not specified, a new instance is created and returned. + * @returns The rotation matrix. + */ + function computeIcrfToMoonFixedMatrix( + date: JulianDate, + result?: Matrix3, + ): Matrix3; + /** + * Computes a rotation matrix to transform a point or vector from the Earth-Fixed frame axes (ITRF) + * to the International Celestial Reference Frame (GCRF/ICRF) inertial frame axes + * at a given time. This function may return undefined if the data necessary to + * do the transformation is not yet loaded. + * @example + * // Transform a point from the Fixed axes to the ICRF axes. + * const now = Cesium.JulianDate.now(); + * const pointInFixed = Cesium.Cartesian3.fromDegrees(0.0, 0.0); + * const fixedToIcrf = Cesium.Transforms.computeFixedToIcrfMatrix(now); + * let pointInInertial = new Cesium.Cartesian3(); + * if (Cesium.defined(fixedToIcrf)) { + * pointInInertial = Cesium.Matrix3.multiplyByVector(fixedToIcrf, pointInFixed, pointInInertial); + * } + * @param date - The time at which to compute the rotation matrix. + * @param [result] - The object onto which to store the result. If this parameter is + * not specified, a new instance is created and returned. + * @returns The rotation matrix, or undefined if the data necessary to do the + * transformation is not yet loaded. + */ + function computeFixedToIcrfMatrix( + date: JulianDate, + result?: Matrix3, + ): Matrix3 | undefined; + /** + * Transform a point from model coordinates to window coordinates. + * @param modelViewProjectionMatrix - The 4x4 model-view-projection matrix. + * @param viewportTransformation - The 4x4 viewport transformation. + * @param point - The point to transform. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian2 instance if none was provided. + */ + function pointToWindowCoordinates( + modelViewProjectionMatrix: Matrix4, + viewportTransformation: Matrix4, + point: Cartesian3, + result?: Cartesian2, + ): Cartesian2; + /** + * Transform a position and velocity to a rotation matrix. + * @param position - The position to transform. + * @param velocity - The velocity vector to transform. + * @param [ellipsoid = Ellipsoid.default] - The ellipsoid whose fixed frame is used in the transformation. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Matrix3 instance if none was provided. + */ + function rotationMatrixFromPositionVelocity( + position: Cartesian3, + velocity: Cartesian3, + ellipsoid?: Ellipsoid, + result?: Matrix3, + ): Matrix3; + } + + /** + * An affine transformation defined by a translation, rotation, and scale. + * @param [translation = Cartesian3.ZERO] - A {@link Cartesian3} specifying the (x, y, z) translation to apply to the node. + * @param [rotation = Quaternion.IDENTITY] - A {@link Quaternion} specifying the (x, y, z, w) rotation to apply to the node. + * @param [scale = new Cartesian3(1.0, 1.0, 1.0)] - A {@link Cartesian3} specifying the (x, y, z) scaling to apply to the node. + */ + export class TranslationRotationScale { + constructor( + translation?: Cartesian3, + rotation?: Quaternion, + scale?: Cartesian3, + ); + /** + * Gets or sets the (x, y, z) translation to apply to the node. + */ + translation: Cartesian3; + /** + * Gets or sets the (x, y, z, w) rotation to apply to the node. + */ + rotation: Quaternion; + /** + * Gets or sets the (x, y, z) scaling to apply to the node. + */ + scale: Cartesian3; + /** + * Compares this instance against the provided instance and returns + * true if they are equal, false otherwise. + * @param [right] - The right hand side TranslationRotationScale. + * @returns true if they are equal, false otherwise. + */ + equals(right?: TranslationRotationScale): boolean; + } + + /** + * Uses the Tridiagonal Matrix Algorithm, also known as the Thomas Algorithm, to solve + * a system of linear equations where the coefficient matrix is a tridiagonal matrix. + */ + export namespace TridiagonalSystemSolver { + /** + * Solves a tridiagonal system of linear equations. + * @example + * const lowerDiagonal = [1.0, 1.0, 1.0, 1.0]; + * const diagonal = [2.0, 4.0, 4.0, 4.0, 2.0]; + * const upperDiagonal = [1.0, 1.0, 1.0, 1.0]; + * const rightHandSide = [ + * new Cesium.Cartesian3(410757.0, -1595711.0, 1375302.0), + * new Cesium.Cartesian3(-5986705.0, -2190640.0, 1099600.0), + * new Cesium.Cartesian3(-12593180.0, 288588.0, -1755549.0), + * new Cesium.Cartesian3(-5349898.0, 2457005.0, -2685438.0), + * new Cesium.Cartesian3(845820.0, 1573488.0, -1205591.0) + * ]; + * + * const solution = Cesium.TridiagonalSystemSolver.solve(lowerDiagonal, diagonal, upperDiagonal, rightHandSide); + * @param diagonal - An array with length n that contains the diagonal of the coefficient matrix. + * @param lower - An array with length n - 1 that contains the lower diagonal of the coefficient matrix. + * @param upper - An array with length n - 1 that contains the upper diagonal of the coefficient matrix. + * @param right - An array of Cartesians with length n that is the right side of the system of equations. + * @returns An array of Cartesians with length n that is the solution to the tridiagonal system of equations. + */ + function solve( + diagonal: number[], + lower: number[], + upper: number[], + right: Cartesian3[], + ): Cartesian3[]; + } + + /** + * A singleton that contains all of the servers that are trusted. Credentials will be sent with + * any requests to these servers. + */ + export namespace TrustedServers { + /** + * Adds a trusted server to the registry + * @example + * // Add a trusted server + * TrustedServers.add('my.server.com', 80); + * @param host - The host to be added. + * @param port - The port used to access the host. + */ + function add(host: string, port: number): void; + /** + * Removes a trusted server from the registry + * @example + * // Remove a trusted server + * TrustedServers.remove('my.server.com', 80); + * @param host - The host to be removed. + * @param port - The port used to access the host. + */ + function remove(host: string, port: number): void; + /** + * Tests whether a server is trusted or not. The server must have been added with the port if it is included in the url. + * @example + * // Add server + * TrustedServers.add('my.server.com', 81); + * + * // Check if server is trusted + * if (TrustedServers.contains('https://my.server.com:81/path/to/file.png')) { + * // my.server.com:81 is trusted + * } + * if (TrustedServers.contains('https://my.server.com/path/to/file.png')) { + * // my.server.com isn't trusted + * } + * @param url - The url to be tested against the trusted list + * @returns Returns true if url is trusted, false otherwise. + */ + function contains(url: string): boolean; + /** + * Clears the registry + * @example + * // Remove a trusted server + * TrustedServers.clear(); + */ + function clear(): void; + } + + export namespace VRTheWorldTerrainProvider { + /** + * Initialization options for the VRTheWorldTerrainProvider constructor + * @property [ellipsoid = Ellipsoid.default] - The ellipsoid. If not specified, the default ellipsoid is used. + * @property [credit] - A credit for the data source, which is displayed on the canvas. + */ + type ConstructorOptions = { + ellipsoid?: Ellipsoid; + credit?: Credit | string; + }; + } + + /** + *
+ * To construct a VRTheWorldTerrainProvider, call {@link VRTheWorldTerrainProvider.fromUrl}. Do not call the constructor directly. + *
+ * + * A {@link TerrainProvider} that produces terrain geometry by tessellating height maps + * retrieved from a {@link http://vr-theworld.com/|VT MÄK VR-TheWorld server}. + * @example + * const terrainProvider = await Cesium.VRTheWorldTerrainProvider.fromUrl( + * "https://www.vr-theworld.com/vr-theworld/tiles1.0.0/73/" + * ); + * viewer.terrainProvider = terrainProvider; + * @param [options] - An object describing initialization options. + */ + export class VRTheWorldTerrainProvider { + constructor(options?: VRTheWorldTerrainProvider.ConstructorOptions); + /** + * Gets an event that is raised when the terrain provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + */ + readonly errorEvent: Event; + /** + * Gets the credit to display when this terrain provider is active. Typically this is used to credit + * the source of the terrain. + */ + readonly credit: Credit; + /** + * Gets the tiling scheme used by this provider. + */ + readonly tilingScheme: GeographicTilingScheme; + /** + * Gets a value indicating whether or not the provider includes a water mask. The water mask + * indicates which areas of the globe are water rather than land, so they can be rendered + * as a reflective surface with animated waves. + */ + readonly hasWaterMask: boolean; + /** + * Gets a value indicating whether or not the requested tiles include vertex normals. + */ + readonly hasVertexNormals: boolean; + /** + * Gets an object that can be used to determine availability of terrain from this provider, such as + * at points and in rectangles. This property may be undefined if availability + * information is not available. + */ + readonly availability: TileAvailability; + /** + * Creates a {@link TerrainProvider} that produces terrain geometry by tessellating height maps + * retrieved from a {@link http://vr-theworld.com/|VT MÄK VR-TheWorld server}. + * @example + * const terrainProvider = await Cesium.VRTheWorldTerrainProvider.fromUrl( + * "https://www.vr-theworld.com/vr-theworld/tiles1.0.0/73/" + * ); + * viewer.terrainProvider = terrainProvider; + * @param url - The URL of the VR-TheWorld TileMap. + * @param [options] - An object describing initialization options. + */ + static fromUrl( + url: Resource | string, + options?: VRTheWorldTerrainProvider.ConstructorOptions, + ): Promise; + /** + * Requests the geometry for a given tile. The result includes terrain + * data and indicates that all child tiles are available. + * @param x - The X coordinate of the tile for which to request geometry. + * @param y - The Y coordinate of the tile for which to request geometry. + * @param level - The level of the tile for which to request geometry. + * @param [request] - The request object. Intended for internal use only. + * @returns A promise for the requested geometry. If this method + * returns undefined instead of a promise, it is an indication that too many requests are already + * pending and the request will be retried later. + */ + requestTileGeometry( + x: number, + y: number, + level: number, + request?: Request, + ): Promise | undefined; + /** + * Gets the maximum geometric error allowed in a tile at a given level. + * @param level - The tile level for which to get the maximum geometric error. + * @returns The maximum geometric error. + */ + getLevelMaximumGeometricError(level: number): number; + /** + * Determines whether data for a tile is available to be loaded. + * @param x - The X coordinate of the tile for which to request geometry. + * @param y - The Y coordinate of the tile for which to request geometry. + * @param level - The level of the tile for which to request geometry. + * @returns Undefined if not supported, otherwise true or false. + */ + getTileDataAvailable( + x: number, + y: number, + level: number, + ): boolean | undefined; + /** + * Makes sure we load availability data for a tile + * @param x - The X coordinate of the tile for which to request geometry. + * @param y - The Y coordinate of the tile for which to request geometry. + * @param level - The level of the tile for which to request geometry. + * @returns Undefined if nothing need to be loaded or a Promise that resolves when all required tiles are loaded + */ + loadTileDataAvailability( + x: number, + y: number, + level: number, + ): undefined | Promise; + } + + /** + * A vertex format defines what attributes make up a vertex. A VertexFormat can be provided + * to a {@link Geometry} to request that certain properties be computed, e.g., just position, + * position and normal, etc. + * @example + * // Create a vertex format with position and 2D texture coordinate attributes. + * const format = new Cesium.VertexFormat({ + * position : true, + * st : true + * }); + * @param [options] - An object with boolean properties corresponding to VertexFormat properties as shown in the code example. + */ + export class VertexFormat { + constructor(options?: any); + /** + * When true, the vertex has a 3D position attribute. + *

+ * 64-bit floating-point (for precision). 3 components per attribute. + *

+ */ + position: boolean; + /** + * When true, the vertex has a normal attribute (normalized), which is commonly used for lighting. + *

+ * 32-bit floating-point. 3 components per attribute. + *

+ */ + normal: boolean; + /** + * When true, the vertex has a 2D texture coordinate attribute. + *

+ * 32-bit floating-point. 2 components per attribute + *

+ */ + st: boolean; + /** + * When true, the vertex has a bitangent attribute (normalized), which is used for tangent-space effects like bump mapping. + *

+ * 32-bit floating-point. 3 components per attribute. + *

+ */ + bitangent: boolean; + /** + * When true, the vertex has a tangent attribute (normalized), which is used for tangent-space effects like bump mapping. + *

+ * 32-bit floating-point. 3 components per attribute. + *

+ */ + tangent: boolean; + /** + * When true, the vertex has an RGB color attribute. + *

+ * 8-bit unsigned byte. 3 components per attribute. + *

+ */ + color: boolean; + /** + * An immutable vertex format with only a position attribute. + */ + static readonly POSITION_ONLY: VertexFormat; + /** + * An immutable vertex format with position and normal attributes. + * This is compatible with per-instance color appearances like {@link PerInstanceColorAppearance}. + */ + static readonly POSITION_AND_NORMAL: VertexFormat; + /** + * An immutable vertex format with position, normal, and st attributes. + * This is compatible with {@link MaterialAppearance} when {@link MaterialAppearance#materialSupport} + * is TEXTURED/code>. + */ + static readonly POSITION_NORMAL_AND_ST: VertexFormat; + /** + * An immutable vertex format with position and st attributes. + * This is compatible with {@link EllipsoidSurfaceAppearance}. + */ + static readonly POSITION_AND_ST: VertexFormat; + /** + * An immutable vertex format with position and color attributes. + */ + static readonly POSITION_AND_COLOR: VertexFormat; + /** + * An immutable vertex format with well-known attributes: position, normal, st, tangent, and bitangent. + */ + static readonly ALL: VertexFormat; + /** + * An immutable vertex format with position, normal, and st attributes. + * This is compatible with most appearances and materials; however + * normal and st attributes are not always required. When this is + * known in advance, another VertexFormat should be used. + */ + static readonly DEFAULT: VertexFormat; + /** + * The number of elements used to pack the object into an array. + */ + static packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: VertexFormat, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new VertexFormat instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: VertexFormat, + ): VertexFormat; + /** + * Duplicates a VertexFormat instance. + * @param vertexFormat - The vertex format to duplicate. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new VertexFormat instance if one was not provided. (Returns undefined if vertexFormat is undefined) + */ + static clone( + vertexFormat: VertexFormat, + result?: VertexFormat, + ): VertexFormat; + } + + /** + * Synchronizes a video element with a simulation clock. + * @param [options] - Object with the following properties: + * @param [options.clock] - The clock instance used to drive the video. + * @param [options.element] - The video element to be synchronized. + * @param [options.epoch = Iso8601.MINIMUM_VALUE] - The simulation time that marks the start of the video. + * @param [options.tolerance = 1.0] - The maximum amount of time, in seconds, that the clock and video can diverge. + */ + export class VideoSynchronizer { + constructor(options?: { + clock?: Clock; + element?: HTMLVideoElement; + epoch?: JulianDate; + tolerance?: number; + }); + /** + * Gets or sets the simulation time that marks the start of the video. + */ + epoch: JulianDate; + /** + * Gets or sets the amount of time in seconds the video's currentTime + * and the clock's currentTime can diverge before a video seek is performed. + * Lower values make the synchronization more accurate but video + * performance might suffer. Higher values provide better performance + * but at the cost of accuracy. + */ + tolerance: number; + /** + * Gets or sets the clock used to drive the video element. + */ + clock: Clock; + /** + * Gets or sets the video element to synchronize. + */ + element: HTMLVideoElement; + /** + * Destroys and resources used by the object. Once an object is destroyed, it should not be used. + */ + destroy(): void; + /** + * Returns true if this object was destroyed; otherwise, false. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + } + + /** + * This enumerated type is used in determining to what extent an object, the occludee, + * is visible during horizon culling. An occluder may fully block an occludee, in which case + * it has no visibility, may partially block an occludee from view, or may not block it at all, + * leading to full visibility. + */ + export enum Visibility { + /** + * Represents that no part of an object is visible. + */ + NONE = -1, + /** + * Represents that part, but not all, of an object is visible + */ + PARTIAL = 0, + /** + * Represents that an object is visible in its entirety. + */ + FULL = 1, + } + + /** + * A description of a wall, which is similar to a KML line string. A wall is defined by a series of points, + * which extrude down to the ground. Optionally, they can extrude downwards to a specified height. + * @example + * // create a wall that spans from ground level to 10000 meters + * const wall = new Cesium.WallGeometry({ + * positions : Cesium.Cartesian3.fromDegreesArrayHeights([ + * 19.0, 47.0, 10000.0, + * 19.0, 48.0, 10000.0, + * 20.0, 48.0, 10000.0, + * 20.0, 47.0, 10000.0, + * 19.0, 47.0, 10000.0 + * ]) + * }); + * const geometry = Cesium.WallGeometry.createGeometry(wall); + * @param options - Object with the following properties: + * @param options.positions - An array of Cartesian objects, which are the points of the wall. + * @param [options.granularity = Math.RADIANS_PER_DEGREE] - The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer. + * @param [options.maximumHeights] - An array parallel to positions that give the maximum height of the + * wall at positions. If undefined, the height of each position in used. + * @param [options.minimumHeights] - An array parallel to positions that give the minimum height of the + * wall at positions. If undefined, the height at each position is 0.0. + * @param [options.ellipsoid = Ellipsoid.default] - The ellipsoid for coordinate manipulation + * @param [options.vertexFormat = VertexFormat.DEFAULT] - The vertex attributes to be computed. + */ + export class WallGeometry { + constructor(options: { + positions: Cartesian3[]; + granularity?: number; + maximumHeights?: number[]; + minimumHeights?: number[]; + ellipsoid?: Ellipsoid; + vertexFormat?: VertexFormat; + }); + /** + * The number of elements used to pack the object into an array. + */ + packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: WallGeometry, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new WallGeometry instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: WallGeometry, + ): WallGeometry; + /** + * A description of a wall, which is similar to a KML line string. A wall is defined by a series of points, + * which extrude down to the ground. Optionally, they can extrude downwards to a specified height. + * @example + * // create a wall that spans from 10000 meters to 20000 meters + * const wall = Cesium.WallGeometry.fromConstantHeights({ + * positions : Cesium.Cartesian3.fromDegreesArray([ + * 19.0, 47.0, + * 19.0, 48.0, + * 20.0, 48.0, + * 20.0, 47.0, + * 19.0, 47.0, + * ]), + * minimumHeight : 20000.0, + * maximumHeight : 10000.0 + * }); + * const geometry = Cesium.WallGeometry.createGeometry(wall); + * @param options - Object with the following properties: + * @param options.positions - An array of Cartesian objects, which are the points of the wall. + * @param [options.maximumHeight] - A constant that defines the maximum height of the + * wall at positions. If undefined, the height of each position in used. + * @param [options.minimumHeight] - A constant that defines the minimum height of the + * wall at positions. If undefined, the height at each position is 0.0. + * @param [options.ellipsoid = Ellipsoid.default] - The ellipsoid for coordinate manipulation + * @param [options.vertexFormat = VertexFormat.DEFAULT] - The vertex attributes to be computed. + */ + static fromConstantHeights(options: { + positions: Cartesian3[]; + maximumHeight?: number; + minimumHeight?: number; + ellipsoid?: Ellipsoid; + vertexFormat?: VertexFormat; + }): WallGeometry; + /** + * Computes the geometric representation of a wall, including its vertices, indices, and a bounding sphere. + * @param wallGeometry - A description of the wall. + * @returns The computed vertices and indices. + */ + static createGeometry(wallGeometry: WallGeometry): Geometry | undefined; + } + + /** + * A description of a wall outline. A wall is defined by a series of points, + * which extrude down to the ground. Optionally, they can extrude downwards to a specified height. + * @example + * // create a wall outline that spans from ground level to 10000 meters + * const wall = new Cesium.WallOutlineGeometry({ + * positions : Cesium.Cartesian3.fromDegreesArrayHeights([ + * 19.0, 47.0, 10000.0, + * 19.0, 48.0, 10000.0, + * 20.0, 48.0, 10000.0, + * 20.0, 47.0, 10000.0, + * 19.0, 47.0, 10000.0 + * ]) + * }); + * const geometry = Cesium.WallOutlineGeometry.createGeometry(wall); + * @param options - Object with the following properties: + * @param options.positions - An array of Cartesian objects, which are the points of the wall. + * @param [options.granularity = Math.RADIANS_PER_DEGREE] - The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer. + * @param [options.maximumHeights] - An array parallel to positions that give the maximum height of the + * wall at positions. If undefined, the height of each position in used. + * @param [options.minimumHeights] - An array parallel to positions that give the minimum height of the + * wall at positions. If undefined, the height at each position is 0.0. + * @param [options.ellipsoid = Ellipsoid.default] - The ellipsoid for coordinate manipulation + */ + export class WallOutlineGeometry { + constructor(options: { + positions: Cartesian3[]; + granularity?: number; + maximumHeights?: number[]; + minimumHeights?: number[]; + ellipsoid?: Ellipsoid; + }); + /** + * The number of elements used to pack the object into an array. + */ + packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + static pack( + value: WallOutlineGeometry, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new WallOutlineGeometry instance if one was not provided. + */ + static unpack( + array: number[], + startingIndex?: number, + result?: WallOutlineGeometry, + ): WallOutlineGeometry; + /** + * A description of a walloutline. A wall is defined by a series of points, + * which extrude down to the ground. Optionally, they can extrude downwards to a specified height. + * @example + * // create a wall that spans from 10000 meters to 20000 meters + * const wall = Cesium.WallOutlineGeometry.fromConstantHeights({ + * positions : Cesium.Cartesian3.fromDegreesArray([ + * 19.0, 47.0, + * 19.0, 48.0, + * 20.0, 48.0, + * 20.0, 47.0, + * 19.0, 47.0, + * ]), + * minimumHeight : 20000.0, + * maximumHeight : 10000.0 + * }); + * const geometry = Cesium.WallOutlineGeometry.createGeometry(wall); + * @param options - Object with the following properties: + * @param options.positions - An array of Cartesian objects, which are the points of the wall. + * @param [options.maximumHeight] - A constant that defines the maximum height of the + * wall at positions. If undefined, the height of each position in used. + * @param [options.minimumHeight] - A constant that defines the minimum height of the + * wall at positions. If undefined, the height at each position is 0.0. + * @param [options.ellipsoid = Ellipsoid.default] - The ellipsoid for coordinate manipulation + */ + static fromConstantHeights(options: { + positions: Cartesian3[]; + maximumHeight?: number; + minimumHeight?: number; + ellipsoid?: Ellipsoid; + }): WallOutlineGeometry; + /** + * Computes the geometric representation of a wall outline, including its vertices, indices, and a bounding sphere. + * @param wallGeometry - A description of the wall outline. + * @returns The computed vertices and indices. + */ + static createGeometry( + wallGeometry: WallOutlineGeometry, + ): Geometry | undefined; + } + + /** + * The map projection used by Google Maps, Bing Maps, and most of ArcGIS Online, EPSG:3857. This + * projection use longitude and latitude expressed with the WGS84 and transforms them to Mercator using + * the spherical (rather than ellipsoidal) equations. + * @param [ellipsoid = Ellipsoid.WGS84] - The ellipsoid. + */ + export class WebMercatorProjection { + constructor(ellipsoid?: Ellipsoid); + /** + * Gets the {@link Ellipsoid}. + */ + readonly ellipsoid: Ellipsoid; + /** + * Converts a Mercator angle, in the range -PI to PI, to a geodetic latitude + * in the range -PI/2 to PI/2. + * @param mercatorAngle - The angle to convert. + * @returns The geodetic latitude in radians. + */ + static mercatorAngleToGeodeticLatitude(mercatorAngle: number): number; + /** + * Converts a geodetic latitude in radians, in the range -PI/2 to PI/2, to a Mercator + * angle in the range -PI to PI. + * @param latitude - The geodetic latitude in radians. + * @returns The Mercator angle. + */ + static geodeticLatitudeToMercatorAngle(latitude: number): number; + /** + * The maximum latitude (both North and South) supported by a Web Mercator + * (EPSG:3857) projection. Technically, the Mercator projection is defined + * for any latitude up to (but not including) 90 degrees, but it makes sense + * to cut it off sooner because it grows exponentially with increasing latitude. + * The logic behind this particular cutoff value, which is the one used by + * Google Maps, Bing Maps, and Esri, is that it makes the projection + * square. That is, the rectangle is equal in the X and Y directions. + * + * The constant value is computed by calling: + * WebMercatorProjection.mercatorAngleToGeodeticLatitude(Math.PI) + */ + static MaximumLatitude: number; + /** + * Converts geodetic ellipsoid coordinates, in radians, to the equivalent Web Mercator + * X, Y, Z coordinates expressed in meters and returned in a {@link Cartesian3}. The height + * is copied unmodified to the Z coordinate. + * @param cartographic - The cartographic coordinates in radians. + * @param [result] - The instance to which to copy the result, or undefined if a + * new instance should be created. + * @returns The equivalent web mercator X, Y, Z coordinates, in meters. + */ + project(cartographic: Cartographic, result?: Cartesian3): Cartesian3; + /** + * Converts Web Mercator X, Y coordinates, expressed in meters, to a {@link Cartographic} + * containing geodetic ellipsoid coordinates. The Z coordinate is copied unmodified to the + * height. + * @param cartesian - The web mercator Cartesian position to unrproject with height (z) in meters. + * @param [result] - The instance to which to copy the result, or undefined if a + * new instance should be created. + * @returns The equivalent cartographic coordinates. + */ + unproject(cartesian: Cartesian3, result?: Cartographic): Cartographic; + } + + /** + * A tiling scheme for geometry referenced to a {@link WebMercatorProjection}, EPSG:3857. This is + * the tiling scheme used by Google Maps, Microsoft Bing Maps, and most of ESRI ArcGIS Online. + * @param [options] - Object with the following properties: + * @param [options.ellipsoid = Ellipsoid.default] - The ellipsoid whose surface is being tiled. Defaults to + * the default ellipsoid. + * @param [options.numberOfLevelZeroTilesX = 1] - The number of tiles in the X direction at level zero of + * the tile tree. + * @param [options.numberOfLevelZeroTilesY = 1] - The number of tiles in the Y direction at level zero of + * the tile tree. + * @param [options.rectangleSouthwestInMeters] - The southwest corner of the rectangle covered by the + * tiling scheme, in meters. If this parameter or rectangleNortheastInMeters is not specified, the entire + * globe is covered in the longitude direction and an equal distance is covered in the latitude + * direction, resulting in a square projection. + * @param [options.rectangleNortheastInMeters] - The northeast corner of the rectangle covered by the + * tiling scheme, in meters. If this parameter or rectangleSouthwestInMeters is not specified, the entire + * globe is covered in the longitude direction and an equal distance is covered in the latitude + * direction, resulting in a square projection. + */ + export class WebMercatorTilingScheme { + constructor(options?: { + ellipsoid?: Ellipsoid; + numberOfLevelZeroTilesX?: number; + numberOfLevelZeroTilesY?: number; + rectangleSouthwestInMeters?: Cartesian2; + rectangleNortheastInMeters?: Cartesian2; + }); + /** + * Gets the ellipsoid that is tiled by this tiling scheme. + */ + ellipsoid: Ellipsoid; + /** + * Gets the rectangle, in radians, covered by this tiling scheme. + */ + rectangle: Rectangle; + /** + * Gets the map projection used by this tiling scheme. + */ + projection: MapProjection; + /** + * Gets the total number of tiles in the X direction at a specified level-of-detail. + * @param level - The level-of-detail. + * @returns The number of tiles in the X direction at the given level. + */ + getNumberOfXTilesAtLevel(level: number): number; + /** + * Gets the total number of tiles in the Y direction at a specified level-of-detail. + * @param level - The level-of-detail. + * @returns The number of tiles in the Y direction at the given level. + */ + getNumberOfYTilesAtLevel(level: number): number; + /** + * Transforms a rectangle specified in geodetic radians to the native coordinate system + * of this tiling scheme. + * @param rectangle - The rectangle to transform. + * @param [result] - The instance to which to copy the result, or undefined if a new instance + * should be created. + * @returns The specified 'result', or a new object containing the native rectangle if 'result' + * is undefined. + */ + rectangleToNativeRectangle( + rectangle: Rectangle, + result?: Rectangle, + ): Rectangle; + /** + * Converts tile x, y coordinates and level to a rectangle expressed in the native coordinates + * of the tiling scheme. + * @param x - The integer x coordinate of the tile. + * @param y - The integer y coordinate of the tile. + * @param level - The tile level-of-detail. Zero is the least detailed. + * @param [result] - The instance to which to copy the result, or undefined if a new instance + * should be created. + * @returns The specified 'result', or a new object containing the rectangle + * if 'result' is undefined. + */ + tileXYToNativeRectangle( + x: number, + y: number, + level: number, + result?: any, + ): Rectangle; + /** + * Converts tile x, y coordinates and level to a cartographic rectangle in radians. + * @param x - The integer x coordinate of the tile. + * @param y - The integer y coordinate of the tile. + * @param level - The tile level-of-detail. Zero is the least detailed. + * @param [result] - The instance to which to copy the result, or undefined if a new instance + * should be created. + * @returns The specified 'result', or a new object containing the rectangle + * if 'result' is undefined. + */ + tileXYToRectangle( + x: number, + y: number, + level: number, + result?: any, + ): Rectangle; + /** + * Calculates the tile x, y coordinates of the tile containing + * a given cartographic position. + * @param position - The position. + * @param level - The tile level-of-detail. Zero is the least detailed. + * @param [result] - The instance to which to copy the result, or undefined if a new instance + * should be created. + * @returns The specified 'result', or a new object containing the tile x, y coordinates + * if 'result' is undefined. + */ + positionToTileXY( + position: Cartographic, + level: number, + result?: Cartesian2, + ): Cartesian2; + } + + /** + * Winding order defines the order of vertices for a triangle to be considered front-facing. + */ + export enum WindingOrder { + /** + * Vertices are in clockwise order. + */ + CLOCKWISE = WebGLConstants.CW, + /** + * Vertices are in counter-clockwise order. + */ + COUNTER_CLOCKWISE = WebGLConstants.CCW, + } + + /** + * Computes the barycentric coordinates for a point with respect to a triangle. + * @example + * // Returns Cartesian3.UNIT_X + * const p = new Cesium.Cartesian3(-1.0, 0.0, 0.0); + * const b = Cesium.barycentricCoordinates(p, + * new Cesium.Cartesian3(-1.0, 0.0, 0.0), + * new Cesium.Cartesian3( 1.0, 0.0, 0.0), + * new Cesium.Cartesian3( 0.0, 1.0, 1.0)); + * @param point - The point to test. + * @param p0 - The first point of the triangle, corresponding to the barycentric x-axis. + * @param p1 - The second point of the triangle, corresponding to the barycentric y-axis. + * @param p2 - The third point of the triangle, corresponding to the barycentric z-axis. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Cartesian3 instance if one was not provided. If the triangle is degenerate the function will return undefined. + */ + export function barycentricCoordinates( + point: Cartesian2 | Cartesian3, + p0: Cartesian2 | Cartesian3, + p1: Cartesian2 | Cartesian3, + p2: Cartesian2 | Cartesian3, + result?: Cartesian3, + ): Cartesian3 | undefined; + + /** + * Finds an item in a sorted array. + * @example + * // Create a comparator function to search through an array of numbers. + * function comparator(a, b) { + * return a - b; + * }; + * const numbers = [0, 2, 4, 6, 8]; + * const index = Cesium.binarySearch(numbers, 6, comparator); // 3 + * @param array - The sorted array to search. + * @param itemToFind - The item to find in the array. + * @param comparator - The function to use to compare the item to + * elements in the array. + * @returns The index of itemToFind in the array, if it exists. If itemToFind + * does not exist, the return value is a negative number which is the bitwise complement (~) + * of the index before which the itemToFind should be inserted in order to maintain the + * sorted order of the array. + */ + export function binarySearch( + array: any[], + itemToFind: any, + comparator: binarySearchComparator, + ): number; + + /** + * A function used to compare two items while performing a binary search. + * @example + * function compareNumbers(a, b) { + * return a - b; + * } + * @param a - An item in the array. + * @param b - The item being searched for. + */ + export type binarySearchComparator = (a: any, b: any) => number; + + /** + * Given a relative URL under the Cesium base URL, returns an absolute URL. + * @example + * const viewer = new Cesium.Viewer("cesiumContainer", { + * baseLayer: Cesium.ImageryLayer.fromProviderAsync( + * Cesium.TileMapServiceImageryProvider.fromUrl( + * Cesium.buildModuleUrl("Assets/Textures/NaturalEarthII"), + * )), + * baseLayerPicker: false, + * }); + * @param relativeUrl - The relative path. + * @returns The absolutely URL representation of the provided path. + */ + export function buildModuleUrl(relativeUrl: string): string; + + /** + * Clones an object, returning a new object containing the same properties. + * @param object - The object to clone. + * @param [deep = false] - If true, all properties will be deep cloned recursively. + * @returns The cloned object. + */ + export function clone(object: any, deep?: boolean): any; + + /** + * Merges two objects, copying their properties onto a new combined object. When two objects have the same + * property, the value of the property on the first object is used. If either object is undefined, + * it will be treated as an empty object. + * @example + * const object1 = { + * propOne : 1, + * propTwo : { + * value1 : 10 + * } + * } + * const object2 = { + * propTwo : 2 + * } + * const final = Cesium.combine(object1, object2); + * + * // final === { + * // propOne : 1, + * // propTwo : { + * // value1 : 10 + * // } + * // } + * @param [object1] - The first object to merge. + * @param [object2] - The second object to merge. + * @param [deep = false] - Perform a recursive merge. + * @returns The combined object containing all properties from both objects. + */ + export function combine(object1?: any, object2?: any, deep?: boolean): any; + + /** + * Creates a Globally unique identifier (GUID) string. A GUID is 128 bits long, and can guarantee uniqueness across space and time. + * @example + * this.guid = Cesium.createGuid(); + */ + export function createGuid(): string; + + /** + * Creates a {@link CesiumTerrainProvider} instance for the {@link https://cesium.com/content/#cesium-world-bathymetry|Cesium World Bathymetry}. + * @example + * // Create Cesium World Bathymetry with default settings + * try { + * const viewer = new Cesium.Viewer("cesiumContainer", { + * terrainProvider: await Cesium.createWorldBathymetryAsync(); + * }); + * } catch (error) { + * console.log(error); + * } + * @example + * // Create Cesium World Bathymetry with normals. + * try { + * const viewer1 = new Cesium.Viewer("cesiumContainer", { + * terrainProvider: await Cesium.createWorldBathymetryAsync({ + * requestVertexNormals: true + * }); + * }); + * } catch (error) { + * console.log(error); + * } + * @param [options] - Object with the following properties: + * @param [options.requestVertexNormals = false] - Flag that indicates if the client should request additional lighting information from the server if available. + * @returns A promise that resolves to the created CesiumTerrainProvider + */ + export function createWorldBathymetryAsync(options?: { + requestVertexNormals?: boolean; + }): Promise; + + /** + * Creates a {@link CesiumTerrainProvider} instance for the {@link https://cesium.com/content/#cesium-world-terrain|Cesium World Terrain}. + * @example + * // Create Cesium World Terrain with default settings + * try { + * const viewer = new Cesium.Viewer("cesiumContainer", { + * terrainProvider: await Cesium.createWorldTerrainAsync(); + * }); + * } catch (error) { + * console.log(error); + * } + * @example + * // Create Cesium World Terrain with water and normals. + * try { + * const viewer1 = new Cesium.Viewer("cesiumContainer", { + * terrainProvider: await Cesium.createWorldTerrainAsync({ + * requestWaterMask: true, + * requestVertexNormals: true + * }); + * }); + * } catch (error) { + * console.log(error); + * } + * @param [options] - Object with the following properties: + * @param [options.requestVertexNormals = false] - Flag that indicates if the client should request additional lighting information from the server if available. + * @param [options.requestWaterMask = false] - Flag that indicates if the client should request per tile water masks from the server if available. + * @returns A promise that resolves to the created CesiumTerrainProvider + */ + export function createWorldTerrainAsync(options?: { + requestVertexNormals?: boolean; + requestWaterMask?: boolean; + }): Promise; + + /** + * Returns the first parameter if not undefined, otherwise the second parameter. + * Useful for setting a default value for a parameter. + * @example + * param = Cesium.defaultValue(param, 'default'); + * @returns Returns the first parameter if not undefined, otherwise the second parameter. + */ + export function defaultValue(a: any, b: any): any; + + /** + * @example + * if (Cesium.defined(positions)) { + * doSomething(); + * } else { + * doSomethingElse(); + * } + * @param value - The object. + * @returns Returns true if the object is defined, returns false otherwise. + */ + export function defined(value: Type): value is NonNullable; + + /** + * Destroys an object. Each of the object's functions, including functions in its prototype, + * is replaced with a function that throws a {@link DeveloperError}, except for the object's + * isDestroyed function, which is set to a function that returns true. + * The object's properties are removed with delete. + *

+ * This function is used by objects that hold native resources, e.g., WebGL resources, which + * need to be explicitly released. Client code calls an object's destroy function, + * which then releases the native resource and calls destroyObject to put itself + * in a destroyed state. + * @example + * // How a texture would destroy itself. + * this.destroy = function () { + * _gl.deleteTexture(_texture); + * return Cesium.destroyObject(this); + * }; + * @param object - The object to destroy. + * @param [message] - The message to include in the exception that is thrown if + * a destroyed object's function is called. + */ + export function destroyObject(object: any, message?: string): void; + + /** + * Formats an error object into a String. If available, uses name, message, and stack + * properties, otherwise, falls back on toString(). + * @param object - The item to find in the array. + * @returns A string containing the formatted error. + */ + export function formatError(object: any): string; + + /** + * Given a relative Uri and a base Uri, returns the absolute Uri of the relative Uri. + * @example + * //absolute Uri will be "https://test.com/awesome.png"; + * const absoluteUri = Cesium.getAbsoluteUri('awesome.png', 'https://test.com'); + * @param relative - The relative Uri. + * @param [base] - The base Uri. + * @returns The absolute Uri of the given relative Uri. + */ + export function getAbsoluteUri(relative: string, base?: string): string; + + /** + * Given a URI, returns the base path of the URI. + * @example + * // basePath will be "/Gallery/"; + * const basePath = Cesium.getBaseUri('/Gallery/simple.czml?value=true&example=false'); + * + * // basePath will be "/Gallery/?value=true&example=false"; + * const basePath = Cesium.getBaseUri('/Gallery/simple.czml?value=true&example=false', true); + * @param uri - The Uri. + * @param [includeQuery = false] - Whether or not to include the query string and fragment form the uri + * @returns The base path of the Uri. + */ + export function getBaseUri(uri: string, includeQuery?: boolean): string; + + /** + * Given a URI, returns the extension of the URI. + * @example + * //extension will be "czml"; + * const extension = Cesium.getExtensionFromUri('/Gallery/simple.czml?value=true&example=false'); + * @param uri - The Uri. + * @returns The extension of the Uri. + */ + export function getExtensionFromUri(uri: string): string; + + /** + * Given a URI, returns the last segment of the URI, removing any path or query information. + * @example + * //fileName will be"simple.czml"; + * const fileName = Cesium.getFilenameFromUri('/Gallery/simple.czml?value=true&example=false'); + * @param uri - The Uri. + * @returns The last segment of the Uri. + */ + export function getFilenameFromUri(uri: string): string; + + /** + * Extract a pixel array from a loaded image. Draws the image + * into a canvas so it can read the pixels back. + * @param image - The image to extract pixels from. + * @param width - The width of the image. If not defined, then image.width is assigned. + * @param height - The height of the image. If not defined, then image.height is assigned. + * @returns The pixels of the image. + */ + export function getImagePixels( + image: HTMLImageElement | ImageBitmap, + width: number, + height: number, + ): ImageData; + + /** + * Gets a timestamp that can be used in measuring the time between events. Timestamps + * are expressed in milliseconds, but it is not specified what the milliseconds are + * measured from. This function uses performance.now() if it is available, or Date.now() + * otherwise. + * @returns The timestamp in milliseconds since some unspecified reference time. + */ + export function getTimestamp(): number; + + /** + * Determines if a given date is a leap year. + * @example + * const leapYear = Cesium.isLeapYear(2000); // true + * @param year - The year to be tested. + * @returns True if year is a leap year. + */ + export function isLeapYear(year: number): boolean; + + /** + * A stable merge sort. + * @example + * // Assume array contains BoundingSpheres in world coordinates. + * // Sort them in ascending order of distance from the camera. + * const position = camera.positionWC; + * Cesium.mergeSort(array, function(a, b, position) { + * return Cesium.BoundingSphere.distanceSquaredTo(b, position) - Cesium.BoundingSphere.distanceSquaredTo(a, position); + * }, position); + * @param array - The array to sort. + * @param comparator - The function to use to compare elements in the array. + * @param [userDefinedObject] - Any item to pass as the third parameter to comparator. + */ + export function mergeSort( + array: any[], + comparator: mergeSortComparator, + userDefinedObject?: any, + ): void; + + /** + * A function used to compare two items while performing a merge sort. + * @example + * function compareNumbers(a, b, userDefinedObject) { + * return a - b; + * } + * @param a - An item in the array. + * @param b - An item in the array. + * @param [userDefinedObject] - An object that was passed to {@link mergeSort}. + */ + export type mergeSortComparator = ( + a: any, + b: any, + userDefinedObject?: any, + ) => number; + + /** + * Converts an object representing a set of name/value pairs into a query string, + * with names and values encoded properly for use in a URL. Values that are arrays + * will produce multiple values with the same name. + * @example + * const str = Cesium.objectToQuery({ + * key1 : 'some value', + * key2 : 'a/b', + * key3 : ['x', 'y'] + * }); + * @param obj - The object containing data to encode. + * @returns An encoded query string. + */ + export function objectToQuery(obj: any): string; + + /** + * Determines if a point is inside a triangle. + * @example + * // Returns true + * const p = new Cesium.Cartesian2(0.25, 0.25); + * const b = Cesium.pointInsideTriangle(p, + * new Cesium.Cartesian2(0.0, 0.0), + * new Cesium.Cartesian2(1.0, 0.0), + * new Cesium.Cartesian2(0.0, 1.0)); + * @param point - The point to test. + * @param p0 - The first point of the triangle. + * @param p1 - The second point of the triangle. + * @param p2 - The third point of the triangle. + * @returns true if the point is inside the triangle; otherwise, false. + */ + export function pointInsideTriangle( + point: Cartesian2 | Cartesian3, + p0: Cartesian2 | Cartesian3, + p1: Cartesian2 | Cartesian3, + p2: Cartesian2 | Cartesian3, + ): boolean; + + /** + * Parses a query string into an object, where the keys and values of the object are the + * name/value pairs from the query string, decoded. If a name appears multiple times, + * the value in the object will be an array of values. + * @example + * const obj = Cesium.queryToObject('key1=some%20value&key2=a%2Fb&key3=x&key3=y'); + * // obj will be: + * // { + * // key1 : 'some value', + * // key2 : 'a/b', + * // key3 : ['x', 'y'] + * // } + * @param queryString - The query string. + * @returns An object containing the parameters parsed from the query string. + */ + export function queryToObject(queryString: string): any; + + /** + * Initiates a terrain height query for an array of {@link Cartographic} positions by + * requesting tiles from a terrain provider, sampling, and interpolating. The interpolation + * matches the triangles used to render the terrain at the specified level. The query + * happens asynchronously, so this function returns a promise that is resolved when + * the query completes. Each point height is modified in place. If a height can not be + * determined because no terrain data is available for the specified level at that location, + * or another error occurs, the height is set to undefined. As is typical of the + * {@link Cartographic} type, the supplied height is a height above the reference ellipsoid + * (such as {@link Ellipsoid.WGS84}) rather than an altitude above mean sea level. In other + * words, it will not necessarily be 0.0 if sampled in the ocean. This function needs the + * terrain level of detail as input, if you need to get the altitude of the terrain as precisely + * as possible (i.e. with maximum level of detail) use {@link sampleTerrainMostDetailed}. + * @example + * // Query the terrain height of two Cartographic positions + * const terrainProvider = await Cesium.createWorldTerrainAsync(); + * const positions = [ + * Cesium.Cartographic.fromDegrees(86.925145, 27.988257), + * Cesium.Cartographic.fromDegrees(87.0, 28.0) + * ]; + * const updatedPositions = await Cesium.sampleTerrain(terrainProvider, 11, positions); + * // positions[0].height and positions[1].height have been updated. + * // updatedPositions is just a reference to positions. + * + * // To handle tile errors, pass true for the rejectOnTileFail parameter. + * try { + * const updatedPositions = await Cesium.sampleTerrain(terrainProvider, 11, positions, true); + * } catch (error) { + * // A tile request error occurred. + * } + * @param terrainProvider - The terrain provider from which to query heights. + * @param level - The terrain level-of-detail from which to query terrain heights. + * @param positions - The positions to update with terrain heights. + * @param [rejectOnTileFail = false] - If true, for any failed terrain tile requests, the promise will be rejected. If false, returned heights will be undefined. + * @returns A promise that resolves to the provided list of positions when terrain the query has completed. + */ + export function sampleTerrain( + terrainProvider: TerrainProvider, + level: number, + positions: Cartographic[], + rejectOnTileFail?: boolean, + ): Promise; + + /** + * Initiates a sampleTerrain() request at the maximum available tile level for a terrain dataset. + * @example + * // Query the terrain height of two Cartographic positions + * const terrainProvider = await Cesium.createWorldTerrainAsync(); + * const positions = [ + * Cesium.Cartographic.fromDegrees(86.925145, 27.988257), + * Cesium.Cartographic.fromDegrees(87.0, 28.0) + * ]; + * const updatedPositions = await Cesium.sampleTerrainMostDetailed(terrainProvider, positions); + * // positions[0].height and positions[1].height have been updated. + * // updatedPositions is just a reference to positions. + * + * // To handle tile errors, pass true for the rejectOnTileFail parameter. + * try { + * const updatedPositions = await Cesium.sampleTerrainMostDetailed(terrainProvider, positions, true); + * } catch (error) { + * // A tile request error occurred. + * } + * @param terrainProvider - The terrain provider from which to query heights. + * @param positions - The positions to update with terrain heights. + * @param [rejectOnTileFail = false] - If true, for a failed terrain tile request the promise will be rejected. If false, returned heights will be undefined. + * @returns A promise that resolves to the provided list of positions when terrain the query has completed. This + * promise will reject if the terrain provider's `availability` property is undefined. + */ + export function sampleTerrainMostDetailed( + terrainProvider: TerrainProvider, + positions: Cartographic[], + rejectOnTileFail?: boolean, + ): Promise; + + /** + * Converts the value from sRGB color space to linear color space. + * @example + * const srgbColor = [0.5, 0.5, 0.5]; + * const linearColor = srgbColor.map(function (c) { + * return Cesium.srgbToLinear(c); + * }); + * @param value - The color value in sRGB color space. + * @returns Returns the color value in linear color space. + */ + export function srgbToLinear(value: number): number; + + /** + * Subdivides an array into a number of smaller, equal sized arrays. + * @param array - The array to divide. + * @param numberOfArrays - The number of arrays to divide the provided array into. + */ + export function subdivideArray(array: any[], numberOfArrays: number): void; + + /** + * Writes the given text into a new canvas. The canvas will be sized to fit the text. + * If text is blank, returns undefined. + * @param text - The text to write. + * @param [options] - Object with the following properties: + * @param [options.font = '10px sans-serif'] - The CSS font to use. + * @param [options.fill = true] - Whether to fill the text. + * @param [options.stroke = false] - Whether to stroke the text. + * @param [options.fillColor = Color.WHITE] - The fill color. + * @param [options.strokeColor = Color.BLACK] - The stroke color. + * @param [options.strokeWidth = 1] - The stroke width. + * @param [options.backgroundColor = Color.TRANSPARENT] - The background color of the canvas. + * @param [options.padding = 0] - The pixel size of the padding to add around the text. + * @returns A new canvas with the given text drawn into it. The dimensions object + * from measureText will also be added to the returned canvas. If text is + * blank, returns undefined. + */ + export function writeTextToCanvas( + text: string, + options?: { + font?: string; + fill?: boolean; + stroke?: boolean; + fillColor?: Color; + strokeColor?: Color; + strokeWidth?: number; + backgroundColor?: Color; + padding?: number; + }, + ): HTMLCanvasElement | undefined; + + export namespace BillboardGraphics { + /** + * Initialization options for the BillboardGraphics constructor + * @property [show = true] - A boolean Property specifying the visibility of the billboard. + * @property [image] - A Property specifying the Image, URI, or Canvas to use for the billboard. + * @property [scale = 1.0] - A numeric Property specifying the scale to apply to the image size. + * @property [pixelOffset = Cartesian2.ZERO] - A {@link Cartesian2} Property specifying the pixel offset. + * @property [eyeOffset = Cartesian3.ZERO] - A {@link Cartesian3} Property specifying the eye offset. + * @property [horizontalOrigin = HorizontalOrigin.CENTER] - A Property specifying the {@link HorizontalOrigin}. + * @property [verticalOrigin = VerticalOrigin.CENTER] - A Property specifying the {@link VerticalOrigin}. + * @property [heightReference = HeightReference.NONE] - A Property specifying what the height is relative to. + * @property [color = Color.WHITE] - A Property specifying the tint {@link Color} of the image. + * @property [rotation = 0] - A numeric Property specifying the rotation about the alignedAxis. + * @property [alignedAxis = Cartesian3.ZERO] - A {@link Cartesian3} Property specifying the unit vector axis of rotation. + * @property [sizeInMeters] - A boolean Property specifying whether this billboard's size should be measured in meters. + * @property [width] - A numeric Property specifying the width of the billboard in pixels, overriding the native size. + * @property [height] - A numeric Property specifying the height of the billboard in pixels, overriding the native size. + * @property [scaleByDistance] - A {@link NearFarScalar} Property used to scale the point based on distance from the camera. + * @property [translucencyByDistance] - A {@link NearFarScalar} Property used to set translucency based on distance from the camera. + * @property [pixelOffsetScaleByDistance] - A {@link NearFarScalar} Property used to set pixelOffset based on distance from the camera. + * @property [imageSubRegion] - A Property specifying a {@link BoundingRectangle} that defines a sub-region of the image to use for the billboard, rather than the entire image, measured in pixels from the bottom-left. + * @property [distanceDisplayCondition] - A Property specifying at what distance from the camera that this billboard will be displayed. + * @property [disableDepthTestDistance] - A Property specifying the distance from the camera at which to disable the depth test to. + * @property [splitDirection] - A Property specifying the {@link SplitDirection} of the billboard. + */ + type ConstructorOptions = { + show?: Property | boolean; + image?: Property | string | HTMLCanvasElement; + scale?: Property | number; + pixelOffset?: Property | Cartesian2; + eyeOffset?: Property | Cartesian3; + horizontalOrigin?: Property | HorizontalOrigin; + verticalOrigin?: Property | VerticalOrigin; + heightReference?: Property | HeightReference; + color?: Property | Color; + rotation?: Property | number; + alignedAxis?: Property | Cartesian3; + sizeInMeters?: Property | boolean; + width?: Property | number; + height?: Property | number; + scaleByDistance?: Property | NearFarScalar; + translucencyByDistance?: Property | NearFarScalar; + pixelOffsetScaleByDistance?: Property | NearFarScalar; + imageSubRegion?: Property | BoundingRectangle; + distanceDisplayCondition?: Property | DistanceDisplayCondition; + disableDepthTestDistance?: Property | number; + splitDirection?: Property | SplitDirection; + }; + } + + /** + * Describes a two dimensional icon located at the position of the containing {@link Entity}. + *

+ *

+ *
+ * Example billboards + *
+ *

+ * @param [options] - Object describing initialization options + */ + export class BillboardGraphics { + constructor(options?: BillboardGraphics.ConstructorOptions); + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the boolean Property specifying the visibility of the billboard. + */ + show: Property | undefined; + /** + * Gets or sets the Property specifying the Image, URI, or Canvas to use for the billboard. + */ + image: Property | undefined; + /** + * Gets or sets the numeric Property specifying the uniform scale to apply to the image. + * A scale greater than 1.0 enlarges the billboard while a scale less than 1.0 shrinks it. + *

+ *

+ *
+ * From left to right in the above image, the scales are 0.5, 1.0, and 2.0. + *
+ *

+ */ + scale: Property | undefined; + /** + * Gets or sets the {@link Cartesian2} Property specifying the billboard's pixel offset in screen space + * from the origin of this billboard. This is commonly used to align multiple billboards and labels at + * the same position, e.g., an image and text. The screen space origin is the top, left corner of the + * canvas; x increases from left to right, and y increases from top to bottom. + *

+ *

+ * + * + * + *
default
b.pixeloffset = new Cartesian2(50, 25);
+ * The billboard's origin is indicated by the yellow point. + *
+ *

+ */ + pixelOffset: Property | undefined; + /** + * Gets or sets the {@link Cartesian3} Property specifying the billboard's offset in eye coordinates. + * Eye coordinates is a left-handed coordinate system, where x points towards the viewer's + * right, y points up, and z points into the screen. + *

+ * An eye offset is commonly used to arrange multiple billboards or objects at the same position, e.g., to + * arrange a billboard above its corresponding 3D model. + *

+ * Below, the billboard is positioned at the center of the Earth but an eye offset makes it always + * appear on top of the Earth regardless of the viewer's or Earth's orientation. + *

+ *

+ * + * + * + *
+ * b.eyeOffset = new Cartesian3(0.0, 8000000.0, 0.0); + *
+ *

+ */ + eyeOffset: Property | undefined; + /** + * Gets or sets the Property specifying the {@link HorizontalOrigin}. + */ + horizontalOrigin: Property | undefined; + /** + * Gets or sets the Property specifying the {@link VerticalOrigin}. + */ + verticalOrigin: Property | undefined; + /** + * Gets or sets the Property specifying the {@link HeightReference}. + */ + heightReference: Property | undefined; + /** + * Gets or sets the Property specifying the {@link Color} that is multiplied with the image. + * This has two common use cases. First, the same white texture may be used by many different billboards, + * each with a different color, to create colored billboards. Second, the color's alpha component can be + * used to make the billboard translucent as shown below. An alpha of 0.0 makes the billboard + * transparent, and 1.0 makes the billboard opaque. + *

+ *

+ * + * + * + *
default
alpha : 0.5
+ *
+ *

+ */ + color: Property | undefined; + /** + * Gets or sets the numeric Property specifying the rotation of the image + * counter clockwise from the alignedAxis. + */ + rotation: Property | undefined; + /** + * Gets or sets the {@link Cartesian3} Property specifying the unit vector axis of rotation + * in the fixed frame. When set to Cartesian3.ZERO the rotation is from the top of the screen. + */ + alignedAxis: Property | undefined; + /** + * Gets or sets the boolean Property specifying if this billboard's size will be measured in meters. + */ + sizeInMeters: Property | undefined; + /** + * Gets or sets the numeric Property specifying the width of the billboard in pixels. + * When undefined, the native width is used. + */ + width: Property | undefined; + /** + * Gets or sets the numeric Property specifying the height of the billboard in pixels. + * When undefined, the native height is used. + */ + height: Property | undefined; + /** + * Gets or sets {@link NearFarScalar} Property specifying the scale of the billboard based on the distance from the camera. + * A billboard's scale will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the billboard's scale remains clamped to the nearest bound. + */ + scaleByDistance: Property | undefined; + /** + * Gets or sets {@link NearFarScalar} Property specifying the translucency of the billboard based on the distance from the camera. + * A billboard's translucency will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the billboard's translucency remains clamped to the nearest bound. + */ + translucencyByDistance: Property | undefined; + /** + * Gets or sets {@link NearFarScalar} Property specifying the pixel offset of the billboard based on the distance from the camera. + * A billboard's pixel offset will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the billboard's pixel offset remains clamped to the nearest bound. + */ + pixelOffsetScaleByDistance: Property | undefined; + /** + * Gets or sets the Property specifying a {@link BoundingRectangle} that defines a + * sub-region of the image to use for the billboard, rather than the entire image, + * measured in pixels from the bottom-left. + */ + imageSubRegion: Property | undefined; + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this billboard will be displayed. + */ + distanceDisplayCondition: Property | undefined; + /** + * Gets or sets the distance from the camera at which to disable the depth test to, for example, prevent clipping against terrain. + * When set to zero, the depth test is always applied. When set to Number.POSITIVE_INFINITY, the depth test is never applied. + */ + disableDepthTestDistance: Property | undefined; + /** + * Gets or sets the Property specifying the {@link SplitDirection} of this billboard. + */ + splitDirection: Property | undefined; + /** + * Duplicates this instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance if one was not provided. + */ + clone(result?: BillboardGraphics): BillboardGraphics; + /** + * Assigns each unassigned property on this object to the value + * of the same property on the provided source object. + * @param source - The object to be merged into this object. + */ + merge(source: BillboardGraphics): void; + } + + /** + * A {@link Visualizer} which maps {@link Entity#billboard} to a {@link Billboard}. + * @param entityCluster - The entity cluster to manage the collection of billboards and optionally cluster with other entities. + * @param entityCollection - The entityCollection to visualize. + */ + export class BillboardVisualizer { + constructor( + entityCluster: EntityCluster, + entityCollection: EntityCollection, + ); + /** + * Updates the primitives created by this visualizer to match their + * Entity counterpart at the given time. + * @param time - The time to update to. + * @returns This function always returns true. + */ + update(time: JulianDate): boolean; + /** + * Returns true if this object was destroyed; otherwise, false. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Removes and destroys all primitives created by this instance. + */ + destroy(): void; + } + + /** + * The BoundingSphere has been computed. + */ + export const DONE = 0; + + /** + * The BoundingSphere is still being computed. + */ + export const PENDING = 1; + + /** + * The BoundingSphere does not exist. + */ + export const FAILED = 2; + + /** + * A {@link GeometryUpdater} for boxes. + * Clients do not normally create this class directly, but instead rely on {@link DataSourceDisplay}. + * @param entity - The entity containing the geometry to be visualized. + * @param scene - The scene where visualization is taking place. + */ + export class BoxGeometryUpdater { + constructor(entity: Entity, scene: Scene); + /** + * Creates the geometry instance which represents the fill of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @returns The geometry instance representing the filled portion of the geometry. + */ + createFillGeometryInstance(time: JulianDate): GeometryInstance; + /** + * Creates the geometry instance which represents the outline of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @returns The geometry instance representing the outline portion of the geometry. + */ + createOutlineGeometryInstance(time: JulianDate): GeometryInstance; + } + + export namespace BoxGraphics { + /** + * Initialization options for the BoxGraphics constructor + * @property [show = true] - A boolean Property specifying the visibility of the box. + * @property [dimensions] - A {@link Cartesian3} Property specifying the length, width, and height of the box. + * @property [heightReference = HeightReference.NONE] - A Property specifying what the height from the entity position is relative to. + * @property [fill = true] - A boolean Property specifying whether the box is filled with the provided material. + * @property [material = Color.WHITE] - A Property specifying the material used to fill the box. + * @property [outline = false] - A boolean Property specifying whether the box is outlined. + * @property [outlineColor = Color.BLACK] - A Property specifying the {@link Color} of the outline. + * @property [outlineWidth = 1.0] - A numeric Property specifying the width of the outline. + * @property [shadows = ShadowMode.DISABLED] - An enum Property specifying whether the box casts or receives shadows from light sources. + * @property [distanceDisplayCondition] - A Property specifying at what distance from the camera that this box will be displayed. + */ + type ConstructorOptions = { + show?: Property | boolean; + dimensions?: Property | Cartesian3; + heightReference?: Property | HeightReference; + fill?: Property | boolean; + material?: MaterialProperty | Color; + outline?: Property | boolean; + outlineColor?: Property | Color; + outlineWidth?: Property | number; + shadows?: Property | ShadowMode; + distanceDisplayCondition?: Property | DistanceDisplayCondition; + }; + } + + /** + * Describes a box. The center position and orientation are determined by the containing {@link Entity}. + * @param [options] - Object describing initialization options + */ + export class BoxGraphics { + constructor(options?: BoxGraphics.ConstructorOptions); + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the boolean Property specifying the visibility of the box. + */ + show: Property | undefined; + /** + * Gets or sets {@link Cartesian3} Property property specifying the length, width, and height of the box. + */ + dimensions: Property | undefined; + /** + * Gets or sets the Property specifying the {@link HeightReference}. + */ + heightReference: Property | undefined; + /** + * Gets or sets the boolean Property specifying whether the box is filled with the provided material. + */ + fill: Property | undefined; + /** + * Gets or sets the material used to fill the box. + */ + material: MaterialProperty | undefined; + /** + * Gets or sets the Property specifying whether the box is outlined. + */ + outline: Property | undefined; + /** + * Gets or sets the Property specifying the {@link Color} of the outline. + */ + outlineColor: Property | undefined; + /** + * Gets or sets the numeric Property specifying the width of the outline. + *

+ * Note: This property will be ignored on all major browsers on Windows platforms. For details, see (@link https://github.com/CesiumGS/cesium/issues/40}. + *

+ */ + outlineWidth: Property | undefined; + /** + * Get or sets the enum Property specifying whether the box + * casts or receives shadows from light sources. + */ + shadows: Property | undefined; + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this box will be displayed. + */ + distanceDisplayCondition: Property | undefined; + /** + * Duplicates this instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance if one was not provided. + */ + clone(result?: BoxGraphics): BoxGraphics; + /** + * Assigns each unassigned property on this object to the value + * of the same property on the provided source object. + * @param source - The object to be merged into this object. + */ + merge(source: BoxGraphics): void; + } + + /** + * A {@link PositionProperty} whose value is lazily evaluated by a callback function. + * @param callback - The function to be called when the position property is evaluated. + * @param isConstant - true when the callback function returns the same value every time, false if the value will change. + * @param [referenceFrame = ReferenceFrame.FIXED] - The reference frame in which the position is defined. + */ + export class CallbackPositionProperty { + constructor( + callback: CallbackPositionProperty.Callback, + isConstant: boolean, + referenceFrame?: ReferenceFrame, + ); + /** + * Gets a value indicating if this property is constant. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + */ + readonly definitionChanged: Event; + /** + * Gets the reference frame in which the position is defined. + */ + referenceFrame: ReferenceFrame; + /** + * Gets the value of the property at the provided time in the fixed frame. + * @param [time = JulianDate.now()] - The time for which to retrieve the value. If omitted, the current system time is used. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time?: JulianDate, result?: Cartesian3): Cartesian3 | undefined; + /** + * Sets the callback to be used. + * @param callback - The function to be called when the property is evaluated. + * @param isConstant - true when the callback function returns the same value every time, false if the value will change. + */ + setCallback( + callback: CallbackPositionProperty.Callback, + isConstant: boolean, + ): void; + /** + * Gets the value of the property at the provided time and in the provided reference frame. + * @param time - The time for which to retrieve the value. + * @param referenceFrame - The desired referenceFrame of the result. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValueInReferenceFrame( + time: JulianDate, + referenceFrame: ReferenceFrame, + result?: Cartesian3, + ): Cartesian3 | undefined; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; + } + + export namespace CallbackPositionProperty { + /** + * A function that returns the value of the position property. + * @param [time = JulianDate.now()] - The time for which to retrieve the value. If omitted, the current system time is used. + * @param [result] - The object to store the value into. If omitted, the function must create and return a new instance. + */ + type Callback = ( + time?: JulianDate, + result?: Cartesian3, + ) => Cartesian3 | undefined; + } + + /** + * A {@link Property} whose value is lazily evaluated by a callback function. + * @param callback - The function to be called when the property is evaluated. + * @param isConstant - true when the callback function returns the same value every time, false if the value will change. + */ + export class CallbackProperty { + constructor(callback: CallbackProperty.Callback, isConstant: boolean); + /** + * Gets a value indicating if this property is constant. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is changed whenever setCallback is called. + */ + readonly definitionChanged: Event; + /** + * Gets the value of the property. + * @param [time = JulianDate.now()] - The time for which to retrieve the value. If omitted, the current system time is used. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied or is unsupported. + */ + getValue(time?: JulianDate, result?: any): any; + /** + * Sets the callback to be used. + * @param callback - The function to be called when the property is evaluated. + * @param isConstant - true when the callback function returns the same value every time, false if the value will change. + */ + setCallback(callback: CallbackProperty.Callback, isConstant: boolean): void; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; + } + + export namespace CallbackProperty { + /** + * A function that returns the value of the property. + * @param [time = JulianDate.now()] - The time for which to retrieve the value. If omitted, the current system time is used. + * @param [result] - The object to store the value into. If omitted, the function must create and return a new instance. + */ + type Callback = (time?: JulianDate, result?: any) => any; + } + + export namespace Cesium3DTilesetGraphics { + /** + * Initialization options for the Cesium3DTilesetGraphics constructor + * @property [show = true] - A boolean Property specifying the visibility of the tileset. + * @property [uri] - A string or Resource Property specifying the URI of the tileset. + * @property [maximumScreenSpaceError] - A number or Property specifying the maximum screen space error used to drive level of detail refinement. + */ + type ConstructorOptions = { + show?: Property | boolean; + uri?: Property | string | Resource; + maximumScreenSpaceError?: Property | number; + }; + } + + /** + * A 3D Tiles tileset represented by an {@link Entity}. + * The tileset modelMatrix is determined by the containing Entity position and orientation + * or is left unset if position is undefined. + * @param [options] - Object describing initialization options + */ + export class Cesium3DTilesetGraphics { + constructor(options?: Cesium3DTilesetGraphics.ConstructorOptions); + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the boolean Property specifying the visibility of the model. + */ + show: Property | undefined; + /** + * Gets or sets the string Property specifying the URI of the glTF asset. + */ + uri: Property | undefined; + /** + * Gets or sets the maximum screen space error used to drive level of detail refinement. + */ + maximumScreenSpaceError: Property | undefined; + /** + * Duplicates this instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance if one was not provided. + */ + clone(result?: Cesium3DTilesetGraphics): Cesium3DTilesetGraphics; + /** + * Assigns each unassigned property on this object to the value + * of the same property on the provided source object. + * @param source - The object to be merged into this object. + */ + merge(source: Cesium3DTilesetGraphics): void; + } + + /** + * A {@link Visualizer} which maps {@link Entity#tileset} to a {@link Cesium3DTileset}. + * @param scene - The scene the primitives will be rendered in. + * @param entityCollection - The entityCollection to visualize. + */ + export class Cesium3DTilesetVisualizer { + constructor(scene: Scene, entityCollection: EntityCollection); + /** + * Updates models created this visualizer to match their + * Entity counterpart at the given time. + * @param time - The time to update to. + * @returns This function always returns true. + */ + update(time: JulianDate): boolean; + /** + * Returns true if this object was destroyed; otherwise, false. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Removes and destroys all primitives created by this instance. + */ + destroy(): void; + } + + /** + * A {@link MaterialProperty} that maps to checkerboard {@link Material} uniforms. + * @param [options] - Object with the following properties: + * @param [options.evenColor = Color.WHITE] - A Property specifying the first {@link Color}. + * @param [options.oddColor = Color.BLACK] - A Property specifying the second {@link Color}. + * @param [options.repeat = new Cartesian2(2.0, 2.0)] - A {@link Cartesian2} Property specifying how many times the tiles repeat in each direction. + */ + export class CheckerboardMaterialProperty { + constructor(options?: { + evenColor?: Property | Color; + oddColor?: Property | Color; + repeat?: Property | Cartesian2; + }); + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the Property specifying the first {@link Color}. + */ + evenColor: Property | undefined; + /** + * Gets or sets the Property specifying the second {@link Color}. + */ + oddColor: Property | undefined; + /** + * Gets or sets the {@link Cartesian2} Property specifying how many times the tiles repeat in each direction. + */ + repeat: Property | undefined; + /** + * Gets the {@link Material} type at the provided time. + * @param time - The time for which to retrieve the type. + * @returns The type of material. + */ + getType(time: JulianDate): string; + /** + * Gets the value of the property at the provided time. + * @param [time = JulianDate.now()] - The time for which to retrieve the value. If omitted, the current system time is used. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time?: JulianDate, result?: any): any; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; + } + + /** + * A {@link MaterialProperty} that maps to solid color {@link Material} uniforms. + * @param [color = Color.WHITE] - The {@link Color} Property to be used. + */ + export class ColorMaterialProperty { + constructor(color?: Property | Color); + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the {@link Color} {@link Property}. + */ + color: Property | undefined; + /** + * Gets the {@link Material} type at the provided time. + * @param time - The time for which to retrieve the type. + * @returns The type of material. + */ + getType(time: JulianDate): string; + /** + * Gets the value of the property at the provided time. + * @param [time = JulianDate.now()] - The time for which to retrieve the value. If omitted, the current system time is used. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time?: JulianDate, result?: any): any; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; + } + + /** + * Non-destructively composites multiple {@link EntityCollection} instances into a single collection. + * If a Entity with the same ID exists in multiple collections, it is non-destructively + * merged into a single new entity instance. If an entity has the same property in multiple + * collections, the property of the Entity in the last collection of the list it + * belongs to is used. CompositeEntityCollection can be used almost anywhere that a + * EntityCollection is used. + * @param [collections] - The initial list of EntityCollection instances to merge. + * @param [owner] - The data source (or composite entity collection) which created this collection. + */ + export class CompositeEntityCollection { + constructor( + collections?: EntityCollection[], + owner?: DataSource | CompositeEntityCollection, + ); + /** + * Gets the event that is fired when entities are added or removed from the collection. + * The generated event is a {@link EntityCollection.collectionChangedEventCallback}. + */ + readonly collectionChanged: Event; + /** + * Gets a globally unique identifier for this collection. + */ + readonly id: string; + /** + * Gets the array of Entity instances in the collection. + * This array should not be modified directly. + */ + readonly values: Entity[]; + /** + * Gets the owner of this composite entity collection, ie. the data source or composite entity collection which created it. + */ + readonly owner: DataSource | CompositeEntityCollection; + /** + * Adds a collection to the composite. + * @param collection - the collection to add. + * @param [index] - the index to add the collection at. If omitted, the collection will + * added on top of all existing collections. + */ + addCollection(collection: EntityCollection, index?: number): void; + /** + * Removes a collection from this composite, if present. + * @param collection - The collection to remove. + * @returns true if the collection was in the composite and was removed, + * false if the collection was not in the composite. + */ + removeCollection(collection: EntityCollection): boolean; + /** + * Removes all collections from this composite. + */ + removeAllCollections(): void; + /** + * Checks to see if the composite contains a given collection. + * @param collection - the collection to check for. + * @returns true if the composite contains the collection, false otherwise. + */ + containsCollection(collection: EntityCollection): boolean; + /** + * Returns true if the provided entity is in this collection, false otherwise. + * @param entity - The entity. + * @returns true if the provided entity is in this collection, false otherwise. + */ + contains(entity: Entity): boolean; + /** + * Determines the index of a given collection in the composite. + * @param collection - The collection to find the index of. + * @returns The index of the collection in the composite, or -1 if the collection does not exist in the composite. + */ + indexOfCollection(collection: EntityCollection): number; + /** + * Gets a collection by index from the composite. + * @param index - the index to retrieve. + */ + getCollection(index: number): void; + /** + * Gets the number of collections in this composite. + */ + getCollectionsLength(): void; + /** + * Raises a collection up one position in the composite. + * @param collection - the collection to move. + */ + raiseCollection(collection: EntityCollection): void; + /** + * Lowers a collection down one position in the composite. + * @param collection - the collection to move. + */ + lowerCollection(collection: EntityCollection): void; + /** + * Raises a collection to the top of the composite. + * @param collection - the collection to move. + */ + raiseCollectionToTop(collection: EntityCollection): void; + /** + * Lowers a collection to the bottom of the composite. + * @param collection - the collection to move. + */ + lowerCollectionToBottom(collection: EntityCollection): void; + /** + * Prevents {@link EntityCollection#collectionChanged} events from being raised + * until a corresponding call is made to {@link EntityCollection#resumeEvents}, at which + * point a single event will be raised that covers all suspended operations. + * This allows for many items to be added and removed efficiently. + * While events are suspended, recompositing of the collections will + * also be suspended, as this can be a costly operation. + * This function can be safely called multiple times as long as there + * are corresponding calls to {@link EntityCollection#resumeEvents}. + */ + suspendEvents(): void; + /** + * Resumes raising {@link EntityCollection#collectionChanged} events immediately + * when an item is added or removed. Any modifications made while while events were suspended + * will be triggered as a single event when this function is called. This function also ensures + * the collection is recomposited if events are also resumed. + * This function is reference counted and can safely be called multiple times as long as there + * are corresponding calls to {@link EntityCollection#resumeEvents}. + */ + resumeEvents(): void; + /** + * Computes the maximum availability of the entities in the collection. + * If the collection contains a mix of infinitely available data and non-infinite data, + * It will return the interval pertaining to the non-infinite data only. If all + * data is infinite, an infinite interval will be returned. + * @returns The availability of entities in the collection. + */ + computeAvailability(): TimeInterval; + /** + * Gets an entity with the specified id. + * @param id - The id of the entity to retrieve. + * @returns The entity with the provided id or undefined if the id did not exist in the collection. + */ + getById(id: string): Entity | undefined; + } + + /** + * A {@link CompositeProperty} which is also a {@link MaterialProperty}. + */ + export class CompositeMaterialProperty { + constructor(); + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is changed whenever setValue is called with data different + * than the current value. + */ + readonly definitionChanged: Event; + /** + * Gets the interval collection. + */ + intervals: TimeIntervalCollection; + /** + * Gets the {@link Material} type at the provided time. + * @param time - The time for which to retrieve the type. + * @returns The type of material. + */ + getType(time: JulianDate): string; + /** + * Gets the value of the property at the provided time. + * @param [time = JulianDate.now()] - The time for which to retrieve the value. If omitted, the current system time is used. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time?: JulianDate, result?: any): any; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; + } + + /** + * A {@link CompositeProperty} which is also a {@link PositionProperty}. + * @param [referenceFrame = ReferenceFrame.FIXED] - The reference frame in which the position is defined. + */ + export class CompositePositionProperty { + constructor(referenceFrame?: ReferenceFrame); + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is changed whenever setValue is called with data different + * than the current value. + */ + readonly definitionChanged: Event; + /** + * Gets the interval collection. + */ + intervals: TimeIntervalCollection; + /** + * Gets or sets the reference frame which this position presents itself as. + * Each PositionProperty making up this object has it's own reference frame, + * so this property merely exposes a "preferred" reference frame for clients + * to use. + */ + referenceFrame: ReferenceFrame; + /** + * Gets the value of the property at the provided time in the fixed frame. + * @param [time = JulianDate.now()] - The time for which to retrieve the value. If omitted, the current system time is used. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time?: JulianDate, result?: Cartesian3): Cartesian3 | undefined; + /** + * Gets the value of the property at the provided time and in the provided reference frame. + * @param time - The time for which to retrieve the value. + * @param referenceFrame - The desired referenceFrame of the result. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValueInReferenceFrame( + time: JulianDate, + referenceFrame: ReferenceFrame, + result?: Cartesian3, + ): Cartesian3 | undefined; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; + } + + /** + * A {@link Property} which is defined by a {@link TimeIntervalCollection}, where the + * data property of each {@link TimeInterval} is another Property instance which is + * evaluated at the provided time. + * @example + * const constantProperty = ...; + * const sampledProperty = ...; + * + * //Create a composite property from two previously defined properties + * //where the property is valid on August 1st, 2012 and uses a constant + * //property for the first half of the day and a sampled property for the + * //remaining half. + * const composite = new Cesium.CompositeProperty(); + * composite.intervals.addInterval(Cesium.TimeInterval.fromIso8601({ + * iso8601 : '2012-08-01T00:00:00.00Z/2012-08-01T12:00:00.00Z', + * data : constantProperty + * })); + * composite.intervals.addInterval(Cesium.TimeInterval.fromIso8601({ + * iso8601 : '2012-08-01T12:00:00.00Z/2012-08-02T00:00:00.00Z', + * isStartIncluded : false, + * isStopIncluded : false, + * data : sampledProperty + * })); + */ + export class CompositeProperty { + constructor(); + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is changed whenever setValue is called with data different + * than the current value. + */ + readonly definitionChanged: Event; + /** + * Gets the interval collection. + */ + intervals: TimeIntervalCollection; + /** + * Gets the value of the property at the provided time. + * @param [time = JulianDate.now()] - The time for which to retrieve the value. If omitted, the current system time is used. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time?: JulianDate, result?: any): any; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; + } + + /** + * A {@link PositionProperty} whose value does not change in respect to the + * {@link ReferenceFrame} in which is it defined. + * @param [value] - The property value. + * @param [referenceFrame = ReferenceFrame.FIXED] - The reference frame in which the position is defined. + */ + export class ConstantPositionProperty { + constructor(value?: Cartesian3, referenceFrame?: ReferenceFrame); + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + */ + readonly definitionChanged: Event; + /** + * Gets the reference frame in which the position is defined. + */ + referenceFrame: ReferenceFrame; + /** + * Gets the value of the property at the provided time in the fixed frame. + * @param [time = JulianDate.now()] - The time for which to retrieve the value. If omitted, the current system time is used. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time?: JulianDate, result?: any): any; + /** + * Sets the value of the property. + * @param value - The property value. + * @param [referenceFrame = this.referenceFrame] - The reference frame in which the position is defined. + */ + setValue(value: Cartesian3, referenceFrame?: ReferenceFrame): void; + /** + * Gets the value of the property at the provided time and in the provided reference frame. + * @param time - The time for which to retrieve the value. + * @param referenceFrame - The desired referenceFrame of the result. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValueInReferenceFrame( + time: JulianDate, + referenceFrame: ReferenceFrame, + result?: Cartesian3, + ): Cartesian3; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; + } + + /** + * A {@link Property} whose value does not change with respect to simulation time. + * @param [value] - The property value. + */ + export class ConstantProperty { + constructor(value?: any); + /** + * Gets a value indicating if this property is constant. + * This property always returns true. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is changed whenever setValue is called with data different + * than the current value. + */ + readonly definitionChanged: Event; + /** + * Gets the value of the property. + * @param [time] - The time for which to retrieve the value. This parameter is unused since the value does not change with respect to time. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time?: JulianDate, result?: any): any; + /** + * Sets the value of the property. + * @param value - The property value. + */ + setValue(value: any): void; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; + /** + * Gets this property's value. + * @returns This property's value. + */ + valueOf(): any; + /** + * Creates a string representing this property's value. + * @returns A string representing the property's value. + */ + toString(): string; + } + + /** + * A {@link GeometryUpdater} for corridors. + * Clients do not normally create this class directly, but instead rely on {@link DataSourceDisplay}. + * @param entity - The entity containing the geometry to be visualized. + * @param scene - The scene where visualization is taking place. + */ + export class CorridorGeometryUpdater { + constructor(entity: Entity, scene: Scene); + /** + * Creates the geometry instance which represents the fill of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @returns The geometry instance representing the filled portion of the geometry. + */ + createFillGeometryInstance(time: JulianDate): GeometryInstance; + /** + * Creates the geometry instance which represents the outline of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @returns The geometry instance representing the outline portion of the geometry. + */ + createOutlineGeometryInstance(time: JulianDate): GeometryInstance; + } + + export namespace CorridorGraphics { + /** + * Initialization options for the CorridorGraphics constructor + * @property [show = true] - A boolean Property specifying the visibility of the corridor. + * @property [positions] - A Property specifying the array of {@link Cartesian3} positions that define the centerline of the corridor. + * @property [width] - A numeric Property specifying the distance between the edges of the corridor. + * @property [height = 0] - A numeric Property specifying the altitude of the corridor relative to the ellipsoid surface. + * @property [heightReference = HeightReference.NONE] - A Property specifying what the height is relative to. + * @property [extrudedHeight] - A numeric Property specifying the altitude of the corridor's extruded face relative to the ellipsoid surface. + * @property [extrudedHeightReference = HeightReference.NONE] - A Property specifying what the extrudedHeight is relative to. + * @property [cornerType = CornerType.ROUNDED] - A {@link CornerType} Property specifying the style of the corners. + * @property [granularity = Cesium.Math.RADIANS_PER_DEGREE] - A numeric Property specifying the distance between each latitude and longitude. + * @property [fill = true] - A boolean Property specifying whether the corridor is filled with the provided material. + * @property [material = Color.WHITE] - A Property specifying the material used to fill the corridor. + * @property [outline = false] - A boolean Property specifying whether the corridor is outlined. + * @property [outlineColor = Color.BLACK] - A Property specifying the {@link Color} of the outline. + * @property [outlineWidth = 1.0] - A numeric Property specifying the width of the outline. + * @property [shadows = ShadowMode.DISABLED] - An enum Property specifying whether the corridor casts or receives shadows from light sources. + * @property [distanceDisplayCondition] - A Property specifying at what distance from the camera that this corridor will be displayed. + * @property [classificationType = ClassificationType.BOTH] - An enum Property specifying whether this corridor will classify terrain, 3D Tiles, or both when on the ground. + * @property [zIndex] - A Property specifying the zIndex of the corridor, used for ordering. Only has an effect if height and extrudedHeight are undefined, and if the corridor is static. + */ + type ConstructorOptions = { + show?: Property | boolean; + positions?: Property | Cartesian3[]; + width?: Property | number; + height?: Property | number; + heightReference?: Property | HeightReference; + extrudedHeight?: Property | number; + extrudedHeightReference?: Property | HeightReference; + cornerType?: Property | CornerType; + granularity?: Property | number; + fill?: Property | boolean; + material?: MaterialProperty | Color; + outline?: Property | boolean; + outlineColor?: Property | Color; + outlineWidth?: Property | number; + shadows?: Property | ShadowMode; + distanceDisplayCondition?: Property | DistanceDisplayCondition; + classificationType?: Property | ClassificationType; + zIndex?: ConstantProperty | number; + }; + } + + /** + * Describes a corridor, which is a shape defined by a centerline and width that + * conforms to the curvature of the globe. It can be placed on the surface or at altitude + * and can optionally be extruded into a volume. + * @param [options] - Object describing initialization options + */ + export class CorridorGraphics { + constructor(options?: CorridorGraphics.ConstructorOptions); + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the boolean Property specifying the visibility of the corridor. + */ + show: Property | undefined; + /** + * Gets or sets a Property specifying the array of {@link Cartesian3} positions that define the centerline of the corridor. + */ + positions: Property | undefined; + /** + * Gets or sets the numeric Property specifying the width of the outline. + */ + width: Property | undefined; + /** + * Gets or sets the numeric Property specifying the altitude of the corridor. + */ + height: Property | undefined; + /** + * Gets or sets the Property specifying the {@link HeightReference}. + */ + heightReference: Property | undefined; + /** + * Gets or sets the numeric Property specifying the altitude of the corridor extrusion. + * Setting this property creates a corridor shaped volume starting at height and ending + * at this altitude. + */ + extrudedHeight: Property | undefined; + /** + * Gets or sets the Property specifying the extruded {@link HeightReference}. + */ + extrudedHeightReference: Property | undefined; + /** + * Gets or sets the {@link CornerType} Property specifying how corners are styled. + */ + cornerType: Property | undefined; + /** + * Gets or sets the numeric Property specifying the sampling distance between each latitude and longitude point. + */ + granularity: Property | undefined; + /** + * Gets or sets the boolean Property specifying whether the corridor is filled with the provided material. + */ + fill: Property | undefined; + /** + * Gets or sets the Property specifying the material used to fill the corridor. + */ + material: MaterialProperty | undefined; + /** + * Gets or sets the Property specifying whether the corridor is outlined. + */ + outline: Property | undefined; + /** + * Gets or sets the Property specifying the {@link Color} of the outline. + */ + outlineColor: Property | undefined; + /** + * Gets or sets the numeric Property specifying the width of the outline. + *

+ * Note: This property will be ignored on all major browsers on Windows platforms. For details, see (@link https://github.com/CesiumGS/cesium/issues/40}. + *

+ */ + outlineWidth: Property | undefined; + /** + * Get or sets the enum Property specifying whether the corridor + * casts or receives shadows from light sources. + */ + shadows: Property | undefined; + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this corridor will be displayed. + */ + distanceDisplayCondition: Property | undefined; + /** + * Gets or sets the {@link ClassificationType} Property specifying whether this corridor will classify terrain, 3D Tiles, or both when on the ground. + */ + classificationType: Property | undefined; + /** + * Gets or sets the zIndex Property specifying the ordering of the corridor. Only has an effect if the coridor is static and neither height or exturdedHeight are specified. + */ + zIndex: ConstantProperty | undefined; + /** + * Duplicates this instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance if one was not provided. + */ + clone(result?: CorridorGraphics): CorridorGraphics; + /** + * Assigns each unassigned property on this object to the value + * of the same property on the provided source object. + * @param source - The object to be merged into this object. + */ + merge(source: CorridorGraphics): void; + } + + /** + * A {@link DataSource} implementation which can be used to manually manage a group of entities. + * @example + * const dataSource = new Cesium.CustomDataSource('myData'); + * + * const entity = dataSource.entities.add({ + * position : Cesium.Cartesian3.fromDegrees(1, 2, 0), + * billboard : { + * image : 'image.png' + * } + * }); + * + * viewer.dataSources.add(dataSource); + * @param [name] - A human-readable name for this instance. + */ + export class CustomDataSource { + constructor(name?: string); + /** + * Gets or sets a human-readable name for this instance. + */ + name: string; + /** + * Gets or sets the clock for this instance. + */ + clock: DataSourceClock; + /** + * Gets the collection of {@link Entity} instances. + */ + entities: EntityCollection; + /** + * Gets or sets whether the data source is currently loading data. + */ + isLoading: boolean; + /** + * Gets an event that will be raised when the underlying data changes. + */ + changedEvent: Event; + /** + * Gets an event that will be raised if an error is encountered during processing. + */ + errorEvent: Event; + /** + * Gets an event that will be raised when the data source either starts or stops loading. + */ + loadingEvent: Event; + /** + * Gets whether or not this data source should be displayed. + */ + show: boolean; + /** + * Gets or sets the clustering options for this data source. This object can be shared between multiple data sources. + */ + clustering: EntityCluster; + /** + * Updates the data source to the provided time. This function is optional and + * is not required to be implemented. It is provided for data sources which + * retrieve data based on the current animation time or scene state. + * If implemented, update will be called by {@link DataSourceDisplay} once a frame. + * @param time - The simulation time. + * @returns True if this data source is ready to be displayed at the provided time, false otherwise. + */ + update(time: JulianDate): boolean; + } + + /** + * A {@link GeometryUpdater} for cylinders. + * Clients do not normally create this class directly, but instead rely on {@link DataSourceDisplay}. + * @param entity - The entity containing the geometry to be visualized. + * @param scene - The scene where visualization is taking place. + */ + export class CylinderGeometryUpdater { + constructor(entity: Entity, scene: Scene); + /** + * Creates the geometry instance which represents the fill of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @returns The geometry instance representing the filled portion of the geometry. + */ + createFillGeometryInstance(time: JulianDate): GeometryInstance; + /** + * Creates the geometry instance which represents the outline of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @returns The geometry instance representing the outline portion of the geometry. + */ + createOutlineGeometryInstance(time: JulianDate): GeometryInstance; + } + + export namespace CylinderGraphics { + /** + * Initialization options for the CylinderGraphics constructor + * @property [show = true] - A boolean Property specifying the visibility of the cylinder. + * @property [length] - A numeric Property specifying the length of the cylinder. + * @property [topRadius] - A numeric Property specifying the radius of the top of the cylinder. + * @property [bottomRadius] - A numeric Property specifying the radius of the bottom of the cylinder. + * @property [heightReference = HeightReference.NONE] - A Property specifying what the height from the entity position is relative to. + * @property [fill = true] - A boolean Property specifying whether the cylinder is filled with the provided material. + * @property [material = Color.WHITE] - A Property specifying the material used to fill the cylinder. + * @property [outline = false] - A boolean Property specifying whether the cylinder is outlined. + * @property [outlineColor = Color.BLACK] - A Property specifying the {@link Color} of the outline. + * @property [outlineWidth = 1.0] - A numeric Property specifying the width of the outline. + * @property [numberOfVerticalLines = 16] - A numeric Property specifying the number of vertical lines to draw along the perimeter for the outline. + * @property [slices = 128] - The number of edges around the perimeter of the cylinder. + * @property [shadows = ShadowMode.DISABLED] - An enum Property specifying whether the cylinder casts or receives shadows from light sources. + * @property [distanceDisplayCondition] - A Property specifying at what distance from the camera that this cylinder will be displayed. + */ + type ConstructorOptions = { + show?: Property | boolean; + length?: Property | number; + topRadius?: Property | number; + bottomRadius?: Property | number; + heightReference?: Property | HeightReference; + fill?: Property | boolean; + material?: MaterialProperty | Color; + outline?: Property | boolean; + outlineColor?: Property | Color; + outlineWidth?: Property | number; + numberOfVerticalLines?: Property | number; + slices?: Property | number; + shadows?: Property | ShadowMode; + distanceDisplayCondition?: Property | DistanceDisplayCondition; + }; + } + + /** + * Describes a cylinder, truncated cone, or cone defined by a length, top radius, and bottom radius. + * The center position and orientation are determined by the containing {@link Entity}. + * @param [options] - Object describing initialization options + */ + export class CylinderGraphics { + constructor(options?: CylinderGraphics.ConstructorOptions); + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the boolean Property specifying the visibility of the cylinder. + */ + show: Property | undefined; + /** + * Gets or sets the numeric Property specifying the length of the cylinder. + */ + length: Property | undefined; + /** + * Gets or sets the numeric Property specifying the radius of the top of the cylinder. + */ + topRadius: Property | undefined; + /** + * Gets or sets the numeric Property specifying the radius of the bottom of the cylinder. + */ + bottomRadius: Property | undefined; + /** + * Gets or sets the Property specifying the {@link HeightReference}. + */ + heightReference: Property | undefined; + /** + * Gets or sets the boolean Property specifying whether the cylinder is filled with the provided material. + */ + fill: Property | undefined; + /** + * Gets or sets the Property specifying the material used to fill the cylinder. + */ + material: MaterialProperty | undefined; + /** + * Gets or sets the boolean Property specifying whether the cylinder is outlined. + */ + outline: Property | undefined; + /** + * Gets or sets the Property specifying the {@link Color} of the outline. + */ + outlineColor: Property | undefined; + /** + * Gets or sets the numeric Property specifying the width of the outline. + *

+ * Note: This property will be ignored on all major browsers on Windows platforms. For details, see (@link https://github.com/CesiumGS/cesium/issues/40}. + *

+ */ + outlineWidth: Property | undefined; + /** + * Gets or sets the Property specifying the number of vertical lines to draw along the perimeter for the outline. + */ + numberOfVerticalLines: Property | undefined; + /** + * Gets or sets the Property specifying the number of edges around the perimeter of the cylinder. + */ + slices: Property | undefined; + /** + * Get or sets the enum Property specifying whether the cylinder + * casts or receives shadows from light sources. + */ + shadows: Property | undefined; + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this cylinder will be displayed. + */ + distanceDisplayCondition: Property | undefined; + /** + * Duplicates this instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance if one was not provided. + */ + clone(result?: CylinderGraphics): CylinderGraphics; + /** + * Assigns each unassigned property on this object to the value + * of the same property on the provided source object. + * @param source - The object to be merged into this object. + */ + merge(source: CylinderGraphics): void; + } + + export namespace CzmlDataSource { + /** + * Initialization options for the load method. + * @property [sourceUri] - Overrides the url to use for resolving relative links. + * @property [credit] - A credit for the data source, which is displayed on the canvas. + */ + type LoadOptions = { + sourceUri?: Resource | string; + credit?: Credit | string; + }; + type UpdaterFunction = ( + entity: Entity, + packet: any, + entityCollection: EntityCollection, + sourceUri: string, + ) => void; + } + + /** + * A {@link DataSource} which processes {@link https://github.com/AnalyticalGraphicsInc/czml-writer/wiki/CZML-Guide|CZML}. + * @param [name] - An optional name for the data source. This value will be overwritten if a loaded document contains a name. + */ + export class CzmlDataSource { + constructor(name?: string); + /** + * Creates a Promise to a new instance loaded with the provided CZML data. + * @param czml - A url or CZML object to be processed. + * @param [options] - An object specifying configuration options + * @returns A promise that resolves to the new instance once the data is processed. + */ + static load( + czml: Resource | string | any, + options?: CzmlDataSource.LoadOptions, + ): Promise; + /** + * Gets a human-readable name for this instance. + */ + name: string; + /** + * Gets the clock settings defined by the loaded CZML. If no clock is explicitly + * defined in the CZML, the combined availability of all objects is returned. If + * only static data exists, this value is undefined. + */ + clock: DataSourceClock; + /** + * Gets the collection of {@link Entity} instances. + */ + entities: EntityCollection; + /** + * Gets a value indicating if the data source is currently loading data. + */ + isLoading: boolean; + /** + * Gets an event that will be raised when the underlying data changes. + */ + changedEvent: Event; + /** + * Gets an event that will be raised if an error is encountered during processing. + */ + errorEvent: Event; + /** + * Gets an event that will be raised when the data source either starts or stops loading. + */ + loadingEvent: Event; + /** + * Gets whether or not this data source should be displayed. + */ + show: boolean; + /** + * Gets or sets the clustering options for this data source. This object can be shared between multiple data sources. + */ + clustering: EntityCluster; + /** + * Gets the credit that will be displayed for the data source + */ + credit: Credit; + /** + * Gets the array of CZML processing functions. + */ + static updaters: CzmlDataSource.UpdaterFunction[]; + /** + * Processes the provided url or CZML object without clearing any existing data. + * @param czml - A url or CZML object to be processed. + * @param [options] - An object specifying configuration options + * @returns A promise that resolves to this instances once the data is processed. + */ + process( + czml: Resource | string | any, + options?: CzmlDataSource.LoadOptions, + ): Promise; + /** + * Loads the provided url or CZML object, replacing any existing data. + * @param czml - A url or CZML object to be processed. + * @param [options] - An object specifying configuration options + * @returns A promise that resolves to this instances once the data is processed. + */ + load( + czml: Resource | string | any, + options?: CzmlDataSource.LoadOptions, + ): Promise; + /** + * Updates the data source to the provided time. This function is optional and + * is not required to be implemented. It is provided for data sources which + * retrieve data based on the current animation time or scene state. + * If implemented, update will be called by {@link DataSourceDisplay} once a frame. + * @param time - The simulation time. + * @returns True if this data source is ready to be displayed at the provided time, false otherwise. + */ + update(time: JulianDate): boolean; + /** + * A helper function used by custom CZML updater functions + * which creates or updates a {@link Property} from a CZML packet. + * @param type - The constructor function for the property being processed. + * @param object - The object on which the property will be added or updated. + * @param propertyName - The name of the property on the object. + * @param packetData - The CZML packet being processed. + * @param interval - A constraining interval for which the data is valid. + * @param sourceUri - The originating uri of the data being processed. + * @param entityCollection - The collection being processsed. + */ + static processPacketData( + type: (...params: any[]) => any, + object: any, + propertyName: string, + packetData: any, + interval: TimeInterval, + sourceUri: string, + entityCollection: EntityCollection, + ): void; + /** + * A helper function used by custom CZML updater functions + * which creates or updates a {@link PositionProperty} from a CZML packet. + * @param object - The object on which the property will be added or updated. + * @param propertyName - The name of the property on the object. + * @param packetData - The CZML packet being processed. + * @param interval - A constraining interval for which the data is valid. + * @param sourceUri - The originating uri of the data being processed. + * @param entityCollection - The collection being processsed. + */ + static processPositionPacketData( + object: any, + propertyName: string, + packetData: any, + interval: TimeInterval, + sourceUri: string, + entityCollection: EntityCollection, + ): void; + /** + * A helper function used by custom CZML updater functions + * which creates or updates a {@link MaterialProperty} from a CZML packet. + * @param object - The object on which the property will be added or updated. + * @param propertyName - The name of the property on the object. + * @param packetData - The CZML packet being processed. + * @param interval - A constraining interval for which the data is valid. + * @param sourceUri - The originating uri of the data being processed. + * @param entityCollection - The collection being processsed. + */ + static processMaterialPacketData( + object: any, + propertyName: string, + packetData: any, + interval: TimeInterval, + sourceUri: string, + entityCollection: EntityCollection, + ): void; + } + + /** + * Defines the interface for data sources, which turn arbitrary data into a + * {@link EntityCollection} for generic consumption. This object is an interface + * for documentation purposes and is not intended to be instantiated directly. + */ + export class DataSource { + constructor(); + /** + * Gets a human-readable name for this instance. + */ + name: string; + /** + * Gets the preferred clock settings for this data source. + */ + clock: DataSourceClock; + /** + * Gets the collection of {@link Entity} instances. + */ + entities: EntityCollection; + /** + * Gets a value indicating if the data source is currently loading data. + */ + isLoading: boolean; + /** + * Gets an event that will be raised when the underlying data changes. + */ + changedEvent: Event; + /** + * Gets an event that will be raised if an error is encountered during processing. + */ + errorEvent: Event<(arg0: this, arg1: RequestErrorEvent) => void>; + /** + * Gets an event that will be raised when the value of isLoading changes. + */ + loadingEvent: Event<(arg0: this, arg1: boolean) => void>; + /** + * Gets whether or not this data source should be displayed. + */ + show: boolean; + /** + * Gets or sets the clustering options for this data source. This object can be shared between multiple data sources. + */ + clustering: EntityCluster; + /** + * Updates the data source to the provided time. This function is optional and + * is not required to be implemented. It is provided for data sources which + * retrieve data based on the current animation time or scene state. + * If implemented, update will be called by {@link DataSourceDisplay} once a frame. + * @param time - The simulation time. + * @returns True if this data source is ready to be displayed at the provided time, false otherwise. + */ + update(time: JulianDate): boolean; + } + + /** + * Represents desired clock settings for a particular {@link DataSource}. These settings may be applied + * to the {@link Clock} when the DataSource is loaded. + */ + export class DataSourceClock { + constructor(); + /** + * Gets the event that is raised whenever a new property is assigned. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the desired start time of the clock. + * See {@link Clock#startTime}. + */ + startTime: JulianDate; + /** + * Gets or sets the desired stop time of the clock. + * See {@link Clock#stopTime}. + */ + stopTime: JulianDate; + /** + * Gets or sets the desired current time when this data source is loaded. + * See {@link Clock#currentTime}. + */ + currentTime: JulianDate; + /** + * Gets or sets the desired clock range setting. + * See {@link Clock#clockRange}. + */ + clockRange: ClockRange; + /** + * Gets or sets the desired clock step setting. + * See {@link Clock#clockStep}. + */ + clockStep: ClockStep; + /** + * Gets or sets the desired clock multiplier. + * See {@link Clock#multiplier}. + */ + multiplier: number; + /** + * Duplicates a DataSourceClock instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance if one was not provided. + */ + clone(result?: DataSourceClock): DataSourceClock; + /** + * Returns true if this DataSourceClock is equivalent to the other + * @param [other] - The other DataSourceClock to compare to. + * @returns true if the DataSourceClocks are equal; otherwise, false. + */ + equals(other?: DataSourceClock): boolean; + /** + * Assigns each unassigned property on this object to the value + * of the same property on the provided source object. + * @param source - The object to be merged into this object. + */ + merge(source: DataSourceClock): void; + /** + * Gets the value of this clock instance as a {@link Clock} object. + * @returns The modified result parameter or a new instance if one was not provided. + */ + getValue(): Clock; + } + + /** + * A collection of {@link DataSource} instances. + */ + export class DataSourceCollection { + constructor(); + /** + * Gets the number of data sources in this collection. + */ + readonly length: number; + /** + * An event that is raised when a data source is added to the collection. + * Event handlers are passed the data source that was added. + */ + readonly dataSourceAdded: Event; + /** + * An event that is raised when a data source is removed from the collection. + * Event handlers are passed the data source that was removed. + */ + readonly dataSourceRemoved: Event; + /** + * An event that is raised when a data source changes position in the collection. Event handlers are passed the data source + * that was moved, its new index after the move, and its old index prior to the move. + */ + readonly dataSourceMoved: Event; + /** + * Adds a data source to the collection. + * @param dataSource - A data source or a promise to a data source to add to the collection. + * When passing a promise, the data source will not actually be added + * to the collection until the promise resolves successfully. + * @returns A Promise that resolves once the data source has been added to the collection. + */ + add(dataSource: DataSource | Promise): Promise; + /** + * Removes a data source from this collection, if present. + * @param dataSource - The data source to remove. + * @param [destroy = false] - Whether to destroy the data source in addition to removing it. + * @returns true if the data source was in the collection and was removed, + * false if the data source was not in the collection. + */ + remove(dataSource: DataSource, destroy?: boolean): boolean; + /** + * Removes all data sources from this collection. + * @param [destroy = false] - whether to destroy the data sources in addition to removing them. + */ + removeAll(destroy?: boolean): void; + /** + * Checks to see if the collection contains a given data source. + * @param dataSource - The data source to check for. + * @returns true if the collection contains the data source, false otherwise. + */ + contains(dataSource: DataSource): boolean; + /** + * Determines the index of a given data source in the collection. + * @param dataSource - The data source to find the index of. + * @returns The index of the data source in the collection, or -1 if the data source does not exist in the collection. + */ + indexOf(dataSource: DataSource): number; + /** + * Gets a data source by index from the collection. + * @param index - the index to retrieve. + * @returns The data source at the specified index. + */ + get(index: number): DataSource; + /** + * Gets a data source by name from the collection. + * @param name - The name to retrieve. + * @returns A list of all data sources matching the provided name. + */ + getByName(name: string): DataSource[]; + /** + * Raises a data source up one position in the collection. + * @param dataSource - The data source to move. + */ + raise(dataSource: DataSource): void; + /** + * Lowers a data source down one position in the collection. + * @param dataSource - The data source to move. + */ + lower(dataSource: DataSource): void; + /** + * Raises a data source to the top of the collection. + * @param dataSource - The data source to move. + */ + raiseToTop(dataSource: DataSource): void; + /** + * Lowers a data source to the bottom of the collection. + * @param dataSource - The data source to move. + */ + lowerToBottom(dataSource: DataSource): void; + /** + * Returns true if this object was destroyed; otherwise, false. + * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the resources held by all data sources in this collection. Explicitly destroying this + * object allows for deterministic release of WebGL resources, instead of relying on the garbage + * collector. Once this object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * dataSourceCollection = dataSourceCollection && dataSourceCollection.destroy(); + */ + destroy(): void; + } + + /** + * Visualizes a collection of {@link DataSource} instances. + * @param options - Object with the following properties: + * @param options.scene - The scene in which to display the data. + * @param options.dataSourceCollection - The data sources to display. + * @param [options.visualizersCallback = DataSourceDisplay.defaultVisualizersCallback] - A function which creates an array of visualizers used for visualization. + * If undefined, all standard visualizers are used. + */ + export class DataSourceDisplay { + constructor(options: { + scene: Scene; + dataSourceCollection: DataSourceCollection; + visualizersCallback?: DataSourceDisplay.VisualizersCallback; + }); + /** + * Gets or sets the default function which creates an array of visualizers used for visualization. + * By default, this function uses all standard visualizers. + */ + static defaultVisualizersCallback(): void; + /** + * Gets the scene associated with this display. + */ + scene: Scene; + /** + * Gets the collection of data sources to display. + */ + dataSources: DataSourceCollection; + /** + * Gets the default data source instance which can be used to + * manually create and visualize entities not tied to + * a specific data source. This instance is always available + * and does not appear in the list dataSources collection. + */ + defaultDataSource: CustomDataSource; + /** + * Gets a value indicating whether or not all entities in the data source are ready + */ + readonly ready: boolean; + /** + * Returns true if this object was destroyed; otherwise, false. + *

+ * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

+ * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * dataSourceDisplay = dataSourceDisplay.destroy(); + */ + destroy(): void; + /** + * Updates the display to the provided time. + * @param time - The simulation time. + * @returns True if all data sources are ready to be displayed, false otherwise. + */ + update(time: JulianDate): boolean; + } + + export namespace DataSourceDisplay { + /** + * A function which creates an array of visualizers used for visualization. + * @example + * function createVisualizers(scene, entityCluster, dataSource) { + * return [new Cesium.BillboardVisualizer(entityCluster, dataSource.entities)]; + * } + * @param scene - The scene to create visualizers for. + * @param entityCluster - The entity cluster to create visualizers for. + * @param dataSource - The data source to create visualizers for. + */ + type VisualizersCallback = ( + scene: Scene, + entityCluster: EntityCluster, + dataSource: DataSource, + ) => Visualizer[]; + } + + /** + * A {@link GeometryUpdater} for ellipses. + * Clients do not normally create this class directly, but instead rely on {@link DataSourceDisplay}. + * @param entity - The entity containing the geometry to be visualized. + * @param scene - The scene where visualization is taking place. + */ + export class EllipseGeometryUpdater { + constructor(entity: Entity, scene: Scene); + /** + * Creates the geometry instance which represents the fill of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @returns The geometry instance representing the filled portion of the geometry. + */ + createFillGeometryInstance(time: JulianDate): GeometryInstance; + /** + * Creates the geometry instance which represents the outline of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @returns The geometry instance representing the outline portion of the geometry. + */ + createOutlineGeometryInstance(time: JulianDate): GeometryInstance; + /** + * Gets a value indicating if the geometry should be drawn on terrain. + */ + readonly onTerrain: boolean; + } + + export namespace EllipseGraphics { + /** + * Initialization options for the EllipseGraphics constructor + * @property [show = true] - A boolean Property specifying the visibility of the ellipse. + * @property [semiMajorAxis] - The numeric Property specifying the semi-major axis. + * @property [semiMinorAxis] - The numeric Property specifying the semi-minor axis. + * @property [height = 0] - A numeric Property specifying the altitude of the ellipse relative to the ellipsoid surface. + * @property [heightReference = HeightReference.NONE] - A Property specifying what the height is relative to. + * @property [extrudedHeight] - A numeric Property specifying the altitude of the ellipse's extruded face relative to the ellipsoid surface. + * @property [extrudedHeightReference = HeightReference.NONE] - A Property specifying what the extrudedHeight is relative to. + * @property [rotation = 0.0] - A numeric property specifying the rotation of the ellipse counter-clockwise from north. + * @property [stRotation = 0.0] - A numeric property specifying the rotation of the ellipse texture counter-clockwise from north. + * @property [granularity = Cesium.Math.RADIANS_PER_DEGREE] - A numeric Property specifying the angular distance between points on the ellipse. + * @property [fill = true] - A boolean Property specifying whether the ellipse is filled with the provided material. + * @property [material = Color.WHITE] - A Property specifying the material used to fill the ellipse. + * @property [outline = false] - A boolean Property specifying whether the ellipse is outlined. + * @property [outlineColor = Color.BLACK] - A Property specifying the {@link Color} of the outline. + * @property [outlineWidth = 1.0] - A numeric Property specifying the width of the outline. + * @property [numberOfVerticalLines = 16] - A numeric Property specifying the number of vertical lines to draw along the perimeter for the outline. + * @property [shadows = ShadowMode.DISABLED] - An enum Property specifying whether the ellipse casts or receives shadows from light sources. + * @property [distanceDisplayCondition] - A Property specifying at what distance from the camera that this ellipse will be displayed. + * @property [classificationType = ClassificationType.BOTH] - An enum Property specifying whether this ellipse will classify terrain, 3D Tiles, or both when on the ground. + * @property [zIndex = 0] - A property specifying the zIndex of the Ellipse. Used for ordering ground geometry. Only has an effect if the ellipse is constant and neither height or exturdedHeight are specified. + */ + type ConstructorOptions = { + show?: Property | boolean; + semiMajorAxis?: Property | number; + semiMinorAxis?: Property | number; + height?: Property | number; + heightReference?: Property | HeightReference; + extrudedHeight?: Property | number; + extrudedHeightReference?: Property | HeightReference; + rotation?: Property | number; + stRotation?: Property | number; + granularity?: Property | number; + fill?: Property | boolean; + material?: MaterialProperty | Color; + outline?: Property | boolean; + outlineColor?: Property | Color; + outlineWidth?: Property | number; + numberOfVerticalLines?: Property | number; + shadows?: Property | ShadowMode; + distanceDisplayCondition?: Property | DistanceDisplayCondition; + classificationType?: Property | ClassificationType; + zIndex?: ConstantProperty | number; + }; + } + + /** + * Describes an ellipse defined by a center point and semi-major and semi-minor axes. + * The ellipse conforms to the curvature of the globe and can be placed on the surface or + * at altitude and can optionally be extruded into a volume. + * The center point is determined by the containing {@link Entity}. + * @param [options] - Object describing initialization options + */ + export class EllipseGraphics { + constructor(options?: EllipseGraphics.ConstructorOptions); + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the boolean Property specifying the visibility of the ellipse. + */ + show: Property | undefined; + /** + * Gets or sets the numeric Property specifying the semi-major axis. + */ + semiMajorAxis: Property | undefined; + /** + * Gets or sets the numeric Property specifying the semi-minor axis. + */ + semiMinorAxis: Property | undefined; + /** + * Gets or sets the numeric Property specifying the altitude of the ellipse. + */ + height: Property | undefined; + /** + * Gets or sets the Property specifying the {@link HeightReference}. + */ + heightReference: Property | undefined; + /** + * Gets or sets the numeric Property specifying the altitude of the ellipse extrusion. + * Setting this property creates volume starting at height and ending at this altitude. + */ + extrudedHeight: Property | undefined; + /** + * Gets or sets the Property specifying the extruded {@link HeightReference}. + */ + extrudedHeightReference: Property | undefined; + /** + * Gets or sets the numeric property specifying the rotation of the ellipse counter-clockwise from north. + */ + rotation: Property | undefined; + /** + * Gets or sets the numeric property specifying the rotation of the ellipse texture counter-clockwise from north. + */ + stRotation: Property | undefined; + /** + * Gets or sets the numeric Property specifying the angular distance between points on the ellipse. + */ + granularity: Property | undefined; + /** + * Gets or sets the boolean Property specifying whether the ellipse is filled with the provided material. + */ + fill: Property | undefined; + /** + * Gets or sets the Property specifying the material used to fill the ellipse. + */ + material: MaterialProperty | undefined; + /** + * Gets or sets the Property specifying whether the ellipse is outlined. + */ + outline: Property | undefined; + /** + * Gets or sets the Property specifying the {@link Color} of the outline. + */ + outlineColor: Property | undefined; + /** + * Gets or sets the numeric Property specifying the width of the outline. + *

+ * Note: This property will be ignored on all major browsers on Windows platforms. For details, see (@link https://github.com/CesiumGS/cesium/issues/40}. + *

+ */ + outlineWidth: Property | undefined; + /** + * Gets or sets the numeric Property specifying the number of vertical lines to draw along the perimeter for the outline. + */ + numberOfVerticalLines: Property | undefined; + /** + * Get or sets the enum Property specifying whether the ellipse + * casts or receives shadows from light sources. + */ + shadows: Property | undefined; + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this ellipse will be displayed. + */ + distanceDisplayCondition: Property | undefined; + /** + * Gets or sets the {@link ClassificationType} Property specifying whether this ellipse will classify terrain, 3D Tiles, or both when on the ground. + */ + classificationType: Property | undefined; + /** + * Gets or sets the zIndex Property specifying the ellipse ordering. Only has an effect if the ellipse is constant and neither height or extrudedHeight are specified + */ + zIndex: ConstantProperty | undefined; + /** + * Duplicates this instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance if one was not provided. + */ + clone(result?: EllipseGraphics): EllipseGraphics; + /** + * Assigns each unassigned property on this object to the value + * of the same property on the provided source object. + * @param source - The object to be merged into this object. + */ + merge(source: EllipseGraphics): void; + } + + /** + * A {@link GeometryUpdater} for ellipsoids. + * Clients do not normally create this class directly, but instead rely on {@link DataSourceDisplay}. + * @param entity - The entity containing the geometry to be visualized. + * @param scene - The scene where visualization is taking place. + */ + export class EllipsoidGeometryUpdater { + constructor(entity: Entity, scene: Scene); + /** + * Creates the geometry instance which represents the fill of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @param [skipModelMatrix = false] - Whether to compute a model matrix for the geometry instance + * @param [modelMatrixResult] - Used to store the result of the model matrix calculation + * @returns The geometry instance representing the filled portion of the geometry. + */ + createFillGeometryInstance( + time: JulianDate, + skipModelMatrix?: boolean, + modelMatrixResult?: Matrix4, + ): GeometryInstance; + /** + * Creates the geometry instance which represents the outline of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @param [skipModelMatrix = false] - Whether to compute a model matrix for the geometry instance + * @param [modelMatrixResult] - Used to store the result of the model matrix calculation + * @returns The geometry instance representing the outline portion of the geometry. + */ + createOutlineGeometryInstance( + time: JulianDate, + skipModelMatrix?: boolean, + modelMatrixResult?: Matrix4, + ): GeometryInstance; + } + + export namespace EllipsoidGraphics { + /** + * Initialization options for the EllipsoidGraphics constructor + * @property [show = true] - A boolean Property specifying the visibility of the ellipsoid. + * @property [radii] - A {@link Cartesian3} Property specifying the radii of the ellipsoid. + * @property [innerRadii] - A {@link Cartesian3} Property specifying the inner radii of the ellipsoid. + * @property [minimumClock = 0.0] - A Property specifying the minimum clock angle of the ellipsoid. + * @property [maximumClock = 2*PI] - A Property specifying the maximum clock angle of the ellipsoid. + * @property [minimumCone = 0.0] - A Property specifying the minimum cone angle of the ellipsoid. + * @property [maximumCone = PI] - A Property specifying the maximum cone angle of the ellipsoid. + * @property [heightReference = HeightReference.NONE] - A Property specifying what the height from the entity position is relative to. + * @property [fill = true] - A boolean Property specifying whether the ellipsoid is filled with the provided material. + * @property [material = Color.WHITE] - A Property specifying the material used to fill the ellipsoid. + * @property [outline = false] - A boolean Property specifying whether the ellipsoid is outlined. + * @property [outlineColor = Color.BLACK] - A Property specifying the {@link Color} of the outline. + * @property [outlineWidth = 1.0] - A numeric Property specifying the width of the outline. + * @property [stackPartitions = 64] - A Property specifying the number of stacks. + * @property [slicePartitions = 64] - A Property specifying the number of radial slices. + * @property [subdivisions = 128] - A Property specifying the number of samples per outline ring, determining the granularity of the curvature. + * @property [shadows = ShadowMode.DISABLED] - An enum Property specifying whether the ellipsoid casts or receives shadows from light sources. + * @property [distanceDisplayCondition] - A Property specifying at what distance from the camera that this ellipsoid will be displayed. + */ + type ConstructorOptions = { + show?: Property | boolean; + radii?: Property | Cartesian3; + innerRadii?: Property | Cartesian3; + minimumClock?: Property | number; + maximumClock?: Property | number; + minimumCone?: Property | number; + maximumCone?: Property | number; + heightReference?: Property | HeightReference; + fill?: Property | boolean; + material?: MaterialProperty | Color; + outline?: Property | boolean; + outlineColor?: Property | Color; + outlineWidth?: Property | number; + stackPartitions?: Property | number; + slicePartitions?: Property | number; + subdivisions?: Property | number; + shadows?: Property | ShadowMode; + distanceDisplayCondition?: Property | DistanceDisplayCondition; + }; + } + + /** + * Describe an ellipsoid or sphere. The center position and orientation are determined by the containing {@link Entity}. + * @param [options] - Object describing initialization options + */ + export class EllipsoidGraphics { + constructor(options?: EllipsoidGraphics.ConstructorOptions); + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the boolean Property specifying the visibility of the ellipsoid. + */ + show: Property | undefined; + /** + * Gets or sets the {@link Cartesian3} {@link Property} specifying the radii of the ellipsoid. + */ + radii: Property | undefined; + /** + * Gets or sets the {@link Cartesian3} {@link Property} specifying the inner radii of the ellipsoid. + */ + innerRadii: Property | undefined; + /** + * Gets or sets the Property specifying the minimum clock angle of the ellipsoid. + */ + minimumClock: Property | undefined; + /** + * Gets or sets the Property specifying the maximum clock angle of the ellipsoid. + */ + maximumClock: Property | undefined; + /** + * Gets or sets the Property specifying the minimum cone angle of the ellipsoid. + */ + minimumCone: Property | undefined; + /** + * Gets or sets the Property specifying the maximum cone angle of the ellipsoid. + */ + maximumCone: Property | undefined; + /** + * Gets or sets the Property specifying the {@link HeightReference}. + */ + heightReference: Property | undefined; + /** + * Gets or sets the boolean Property specifying whether the ellipsoid is filled with the provided material. + */ + fill: Property | undefined; + /** + * Gets or sets the Property specifying the material used to fill the ellipsoid. + */ + material: MaterialProperty; + /** + * Gets or sets the Property specifying whether the ellipsoid is outlined. + */ + outline: Property | undefined; + /** + * Gets or sets the Property specifying the {@link Color} of the outline. + */ + outlineColor: Property | undefined; + /** + * Gets or sets the numeric Property specifying the width of the outline. + *

+ * Note: This property will be ignored on all major browsers on Windows platforms. For details, see (@link https://github.com/CesiumGS/cesium/issues/40}. + *

+ */ + outlineWidth: Property | undefined; + /** + * Gets or sets the Property specifying the number of stacks. + */ + stackPartitions: Property | undefined; + /** + * Gets or sets the Property specifying the number of radial slices per 360 degrees. + */ + slicePartitions: Property | undefined; + /** + * Gets or sets the Property specifying the number of samples per outline ring, determining the granularity of the curvature. + */ + subdivisions: Property | undefined; + /** + * Get or sets the enum Property specifying whether the ellipsoid + * casts or receives shadows from light sources. + */ + shadows: Property | undefined; + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this ellipsoid will be displayed. + */ + distanceDisplayCondition: Property | undefined; + /** + * Duplicates this instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance if one was not provided. + */ + clone(result?: EllipsoidGraphics): EllipsoidGraphics; + /** + * Assigns each unassigned property on this object to the value + * of the same property on the provided source object. + * @param source - The object to be merged into this object. + */ + merge(source: EllipsoidGraphics): void; + } + + export namespace Entity { + /** + * Initialization options for the Entity constructor + * @property [id] - A unique identifier for this object. If none is provided, a GUID is generated. + * @property [name] - A human readable name to display to users. It does not have to be unique. + * @property [availability] - The availability, if any, associated with this object. + * @property [show] - A boolean value indicating if the entity and its children are displayed. + * @property [trackingReferenceFrame = TrackingReferenceFrame.AUTODETECT] - The reference frame used when this entity is being tracked.
If undefined, reference frame is determined based on entity velocity: near-surface slow moving entities are tracked using the local east-north-up reference frame, whereas fast moving entities such as satellites are tracked using VVLH (Vehicle Velocity, Local Horizontal). + * @property [description] - A string Property specifying an HTML description for this entity. + * @property [position] - A Property specifying the entity position. + * @property [orientation = Transforms.eastNorthUpToFixedFrame(position)] - A Property specifying the entity orientation in respect to Earth-fixed-Earth-centered (ECEF). If undefined, east-north-up at entity position is used. + * @property [viewFrom] - A suggested initial offset for viewing this object. + * @property [parent] - A parent entity to associate with this entity. + * @property [billboard] - A billboard to associate with this entity. + * @property [box] - A box to associate with this entity. + * @property [corridor] - A corridor to associate with this entity. + * @property [cylinder] - A cylinder to associate with this entity. + * @property [ellipse] - A ellipse to associate with this entity. + * @property [ellipsoid] - A ellipsoid to associate with this entity. + * @property [label] - A options.label to associate with this entity. + * @property [model] - A model to associate with this entity. + * @property [tileset] - A 3D Tiles tileset to associate with this entity. + * @property [path] - A path to associate with this entity. + * @property [plane] - A plane to associate with this entity. + * @property [point] - A point to associate with this entity. + * @property [polygon] - A polygon to associate with this entity. + * @property [polyline] - A polyline to associate with this entity. + * @property [properties] - Arbitrary properties to associate with this entity. + * @property [polylineVolume] - A polylineVolume to associate with this entity. + * @property [rectangle] - A rectangle to associate with this entity. + * @property [wall] - A wall to associate with this entity. + */ + type ConstructorOptions = { + id?: string; + name?: string; + availability?: TimeIntervalCollection; + show?: boolean; + trackingReferenceFrame?: TrackingReferenceFrame; + description?: Property | string; + position?: PositionProperty | Cartesian3 | CallbackPositionProperty; + orientation?: Property | Quaternion; + viewFrom?: Property | Cartesian3; + parent?: Entity; + billboard?: BillboardGraphics | BillboardGraphics.ConstructorOptions; + box?: BoxGraphics | BoxGraphics.ConstructorOptions; + corridor?: CorridorGraphics | CorridorGraphics.ConstructorOptions; + cylinder?: CylinderGraphics | CylinderGraphics.ConstructorOptions; + ellipse?: EllipseGraphics | EllipseGraphics.ConstructorOptions; + ellipsoid?: EllipsoidGraphics | EllipsoidGraphics.ConstructorOptions; + label?: LabelGraphics | LabelGraphics.ConstructorOptions; + model?: ModelGraphics | ModelGraphics.ConstructorOptions; + tileset?: + | Cesium3DTilesetGraphics + | Cesium3DTilesetGraphics.ConstructorOptions; + path?: PathGraphics | PathGraphics.ConstructorOptions; + plane?: PlaneGraphics | PlaneGraphics.ConstructorOptions; + point?: PointGraphics | PointGraphics.ConstructorOptions; + polygon?: PolygonGraphics | PolygonGraphics.ConstructorOptions; + polyline?: PolylineGraphics | PolylineGraphics.ConstructorOptions; + properties?: + | PropertyBag + | { + [key: string]: any; + }; + polylineVolume?: + | PolylineVolumeGraphics + | PolylineVolumeGraphics.ConstructorOptions; + rectangle?: RectangleGraphics | RectangleGraphics.ConstructorOptions; + wall?: WallGraphics | WallGraphics.ConstructorOptions; + }; + } + + /** + * Entity instances aggregate multiple forms of visualization into a single high-level object. + * They can be created manually and added to {@link Viewer#entities} or be produced by + * data sources, such as {@link CzmlDataSource} and {@link GeoJsonDataSource}. + * @param [options] - Object describing initialization options + */ + export class Entity { + constructor(options?: Entity.ConstructorOptions); + /** + * Gets or sets the entity collection that this entity belongs to. + */ + entityCollection: EntityCollection; + /** + * The availability, if any, associated with this object. + * If availability is undefined, it is assumed that this object's + * other properties will return valid data for any provided time. + * If availability exists, the objects other properties will only + * provide valid data if queried within the given interval. + */ + availability: TimeIntervalCollection | undefined; + /** + * Gets the unique ID associated with this object. + */ + id: string; + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the name of the object. The name is intended for end-user + * consumption and does not need to be unique. + */ + name: string | undefined; + /** + * Gets or sets whether this entity should be displayed. When set to true, + * the entity is only displayed if the parent entity's show property is also true. + */ + show: boolean; + /** + * Gets or sets the entity's tracking reference frame. + */ + trackingReferenceFrame: TrackingReferenceFrame; + /** + * Gets whether this entity is being displayed, taking into account + * the visibility of any ancestor entities. + */ + isShowing: boolean; + /** + * Gets or sets the parent object. + */ + parent: Entity | undefined; + /** + * Gets the names of all properties registered on this instance. + */ + propertyNames: string[]; + /** + * Gets or sets the billboard. + */ + billboard: BillboardGraphics | undefined; + /** + * Gets or sets the box. + */ + box: BoxGraphics | undefined; + /** + * Gets or sets the corridor. + */ + corridor: CorridorGraphics | undefined; + /** + * Gets or sets the cylinder. + */ + cylinder: CylinderGraphics | undefined; + /** + * Gets or sets the description. + */ + description: Property | undefined; + /** + * Gets or sets the ellipse. + */ + ellipse: EllipseGraphics | undefined; + /** + * Gets or sets the ellipsoid. + */ + ellipsoid: EllipsoidGraphics | undefined; + /** + * Gets or sets the label. + */ + label: LabelGraphics | undefined; + /** + * Gets or sets the model. + */ + model: ModelGraphics | undefined; + /** + * Gets or sets the tileset. + */ + tileset: Cesium3DTilesetGraphics | undefined; + /** + * Gets or sets the orientation in respect to Earth-fixed-Earth-centered (ECEF). + * Defaults to east-north-up at entity position. + */ + orientation: Property | undefined; + /** + * Gets or sets the path. + */ + path: PathGraphics | undefined; + /** + * Gets or sets the plane. + */ + plane: PlaneGraphics | undefined; + /** + * Gets or sets the point graphic. + */ + point: PointGraphics | undefined; + /** + * Gets or sets the polygon. + */ + polygon: PolygonGraphics | undefined; + /** + * Gets or sets the polyline. + */ + polyline: PolylineGraphics | undefined; + /** + * Gets or sets the polyline volume. + */ + polylineVolume: PolylineVolumeGraphics | undefined; + /** + * Gets or sets the bag of arbitrary properties associated with this entity. + */ + properties: PropertyBag | undefined; + /** + * Gets or sets the position. + */ + position: PositionProperty | undefined; + /** + * Gets or sets the rectangle. + */ + rectangle: RectangleGraphics | undefined; + /** + * Gets or sets the suggested initial offset when tracking this object. + * The offset is typically defined in the east-north-up reference frame, + * but may be another frame depending on the object's velocity. + */ + viewFrom: Property | undefined; + /** + * Gets or sets the wall. + */ + wall: WallGraphics | undefined; + /** + * Given a time, returns true if this object should have data during that time. + * @param time - The time to check availability for. + * @returns true if the object should have data during the provided time, false otherwise. + */ + isAvailable(time: JulianDate): boolean; + /** + * Adds a property to this object. Once a property is added, it can be + * observed with {@link Entity#definitionChanged} and composited + * with {@link CompositeEntityCollection} + * @param propertyName - The name of the property to add. + */ + addProperty(propertyName: string): void; + /** + * Removed a property previously added with addProperty. + * @param propertyName - The name of the property to remove. + */ + removeProperty(propertyName: string): void; + /** + * Assigns each unassigned property on this object to the value + * of the same property on the provided source object. + * @param source - The object to be merged into this object. + */ + merge(source: Entity): void; + /** + * Computes the model matrix for the entity's transform at specified time. Returns undefined if position is undefined + * @param time - The time to retrieve model matrix for. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new Matrix4 instance if one was not provided. Result is undefined if position is undefined. + */ + computeModelMatrix(time: JulianDate, result?: Matrix4): Matrix4; + /** + * Checks if the given Scene supports materials besides Color on Entities draped on terrain or 3D Tiles. + * If this feature is not supported, Entities with non-color materials but no `height` will + * instead be rendered as if height is 0. + * @param scene - The current scene. + * @returns Whether or not the current scene supports materials for entities on terrain. + */ + static supportsMaterialsforEntitiesOnTerrain(scene: Scene): boolean; + /** + * Checks if the given Scene supports polylines clamped to terrain or 3D Tiles. + * If this feature is not supported, Entities with PolylineGraphics will be rendered with vertices at + * the provided heights and using the `arcType` parameter instead of clamped to the ground. + * @param scene - The current scene. + * @returns Whether or not the current scene supports polylines on terrain or 3D TIles. + */ + static supportsPolylinesOnTerrain(scene: Scene): boolean; + } + + /** + * Defines how screen space objects (billboards, points, labels) are clustered. + * @param [options] - An object with the following properties: + * @param [options.enabled = false] - Whether or not to enable clustering. + * @param [options.pixelRange = 80] - The pixel range to extend the screen space bounding box. + * @param [options.minimumClusterSize = 2] - The minimum number of screen space objects that can be clustered. + * @param [options.clusterBillboards = true] - Whether or not to cluster the billboards of an entity. + * @param [options.clusterLabels = true] - Whether or not to cluster the labels of an entity. + * @param [options.clusterPoints = true] - Whether or not to cluster the points of an entity. + * @param [options.show = true] - Determines if the entities in the cluster will be shown. + */ + export class EntityCluster { + constructor(options?: { + enabled?: boolean; + pixelRange?: number; + minimumClusterSize?: number; + clusterBillboards?: boolean; + clusterLabels?: boolean; + clusterPoints?: boolean; + show?: boolean; + }); + /** + * Determines if entities in this collection will be shown. + */ + show: boolean; + /** + * Gets or sets whether clustering is enabled. + */ + enabled: boolean; + /** + * Gets or sets the pixel range to extend the screen space bounding box. + */ + pixelRange: number; + /** + * Gets or sets the minimum number of screen space objects that can be clustered. + */ + minimumClusterSize: number; + /** + * Gets the event that will be raised when a new cluster will be displayed. The signature of the event listener is {@link EntityCluster.newClusterCallback}. + */ + clusterEvent: Event; + /** + * Gets or sets whether clustering billboard entities is enabled. + */ + clusterBillboards: boolean; + /** + * Gets or sets whether clustering labels entities is enabled. + */ + clusterLabels: boolean; + /** + * Gets or sets whether clustering point entities is enabled. + */ + clusterPoints: boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

+ * Unlike other objects that use WebGL resources, this object can be reused. For example, if a data source is removed + * from a data source collection and added to another. + *

+ */ + destroy(): void; + } + + export namespace EntityCluster { + /** + * A event listener function used to style clusters. + * @example + * // The default cluster values. + * dataSource.clustering.clusterEvent.addEventListener(function(entities, cluster) { + * cluster.label.show = true; + * cluster.label.text = entities.length.toLocaleString(); + * }); + * @param clusteredEntities - An array of the entities contained in the cluster. + * @param cluster - An object containing the Billboard, Label, and Point + * primitives that represent this cluster of entities. + */ + type newClusterCallback = ( + clusteredEntities: Entity[], + cluster: { + billboard: Billboard; + label: Label; + point: PointPrimitive; + }, + ) => void; + } + + /** + * An observable collection of {@link Entity} instances where each entity has a unique id. + * @param [owner] - The data source (or composite entity collection) which created this collection. + */ + export class EntityCollection { + constructor(owner?: DataSource | CompositeEntityCollection); + /** + * Prevents {@link EntityCollection#collectionChanged} events from being raised + * until a corresponding call is made to {@link EntityCollection#resumeEvents}, at which + * point a single event will be raised that covers all suspended operations. + * This allows for many items to be added and removed efficiently. + * This function can be safely called multiple times as long as there + * are corresponding calls to {@link EntityCollection#resumeEvents}. + */ + suspendEvents(): void; + /** + * Resumes raising {@link EntityCollection#collectionChanged} events immediately + * when an item is added or removed. Any modifications made while while events were suspended + * will be triggered as a single event when this function is called. + * This function is reference counted and can safely be called multiple times as long as there + * are corresponding calls to {@link EntityCollection#resumeEvents}. + */ + resumeEvents(): void; + /** + * Gets the event that is fired when entities are added or removed from the collection. + * The generated event is a {@link EntityCollection.CollectionChangedEventCallback}. + */ + readonly collectionChanged: Event; + /** + * Gets a globally unique identifier for this collection. + */ + readonly id: string; + /** + * Gets the array of Entity instances in the collection. + * This array should not be modified directly. + */ + readonly values: Entity[]; + /** + * Gets whether or not this entity collection should be + * displayed. When true, each entity is only displayed if + * its own show property is also true. + */ + show: boolean; + /** + * Gets the owner of this entity collection, ie. the data source or composite entity collection which created it. + */ + readonly owner: DataSource | CompositeEntityCollection; + /** + * Computes the maximum availability of the entities in the collection. + * If the collection contains a mix of infinitely available data and non-infinite data, + * it will return the interval pertaining to the non-infinite data only. If all + * data is infinite, an infinite interval will be returned. + * @returns The availability of entities in the collection. + */ + computeAvailability(): TimeInterval; + /** + * Add an entity to the collection. + * @param entity - The entity to be added. + * @returns The entity that was added. + */ + add(entity: Entity | Entity.ConstructorOptions): Entity; + /** + * Removes an entity from the collection. + * @param entity - The entity to be removed. + * @returns true if the item was removed, false if it did not exist in the collection. + */ + remove(entity: Entity): boolean; + /** + * Returns true if the provided entity is in this collection, false otherwise. + * @param entity - The entity. + * @returns true if the provided entity is in this collection, false otherwise. + */ + contains(entity: Entity): boolean; + /** + * Removes an entity with the provided id from the collection. + * @param id - The id of the entity to remove. + * @returns true if the item was removed, false if no item with the provided id existed in the collection. + */ + removeById(id: string): boolean; + /** + * Removes all Entities from the collection. + */ + removeAll(): void; + /** + * Gets an entity with the specified id. + * @param id - The id of the entity to retrieve. + * @returns The entity with the provided id or undefined if the id did not exist in the collection. + */ + getById(id: string): Entity | undefined; + /** + * Gets an entity with the specified id or creates it and adds it to the collection if it does not exist. + * @param id - The id of the entity to retrieve or create. + * @returns The new or existing object. + */ + getOrCreateEntity(id: string): Entity; + } + + export namespace EntityCollection { + /** + * The signature of the event generated by {@link EntityCollection#collectionChanged}. + * @param collection - The collection that triggered the event. + * @param added - The array of {@link Entity} instances that have been added to the collection. + * @param removed - The array of {@link Entity} instances that have been removed from the collection. + * @param changed - The array of {@link Entity} instances that have been modified. + */ + type CollectionChangedEventCallback = ( + collection: EntityCollection, + added: Entity[], + removed: Entity[], + changed: Entity[], + ) => void; + } + + /** + * A utility object for tracking an entity with the camera. + * @param entity - The entity to track with the camera. + * @param scene - The scene to use. + * @param [ellipsoid = Ellipsoid.default] - The ellipsoid to use for orienting the camera. + */ + export class EntityView { + constructor(entity: Entity, scene: Scene, ellipsoid?: Ellipsoid); + /** + * The entity to track with the camera. + */ + entity: Entity; + /** + * The scene in which to track the object. + */ + scene: Scene; + /** + * The ellipsoid to use for orienting the camera. + */ + ellipsoid: Ellipsoid; + /** + * The bounding sphere of the object. + */ + boundingSphere: BoundingSphere; + /** + * Gets or sets a camera offset that will be used to + * initialize subsequent EntityViews. + */ + static defaultOffset3D: Cartesian3; + /** + * Should be called each animation frame to update the camera + * to the latest settings. + * @param time - The current animation time. + * @param [boundingSphere] - bounding sphere of the object. + */ + update(time: JulianDate, boundingSphere?: BoundingSphere): void; + } + + export namespace GeoJsonDataSource { + /** + * Initialization options for the load method. + * @property [sourceUri] - Overrides the url to use for resolving relative links. + * @property [describe = GeoJsonDataSource.defaultDescribeProperty] - A function which returns a Property object (or just a string). + * @property [markerSize = GeoJsonDataSource.markerSize] - The default size of the map pin created for each point, in pixels. + * @property [markerSymbol = GeoJsonDataSource.markerSymbol] - The default symbol of the map pin created for each point. + * @property [markerColor = GeoJsonDataSource.markerColor] - The default color of the map pin created for each point. + * @property [stroke = GeoJsonDataSource.stroke] - The default color of polylines and polygon outlines. + * @property [strokeWidth = GeoJsonDataSource.strokeWidth] - The default width of polylines and polygon outlines. + * @property [fill = GeoJsonDataSource.fill] - The default color for polygon interiors. + * @property [clampToGround = GeoJsonDataSource.clampToGround] - true if we want the geometry features (polygons or linestrings) clamped to the ground. + * @property [credit] - A credit for the data source, which is displayed on the canvas. + */ + type LoadOptions = { + sourceUri?: string; + describe?: GeoJsonDataSource.describe; + markerSize?: number; + markerSymbol?: string; + markerColor?: Color; + stroke?: Color; + strokeWidth?: number; + fill?: Color; + clampToGround?: boolean; + credit?: Credit | string; + }; + /** + * This callback is displayed as part of the GeoJsonDataSource class. + * @param properties - The properties of the feature. + * @param nameProperty - The property key that Cesium estimates to have the name of the feature. + */ + type describe = (properties: any, nameProperty: string) => void; + } + + /** + * A {@link DataSource} which processes both + * {@link http://www.geojson.org/|GeoJSON} and {@link https://github.com/mbostock/topojson|TopoJSON} data. + * {@link https://github.com/mapbox/simplestyle-spec|simplestyle-spec} properties will also be used if they + * are present. + * @example + * const viewer = new Cesium.Viewer('cesiumContainer'); + * viewer.dataSources.add(Cesium.GeoJsonDataSource.load('../../SampleData/ne_10m_us_states.topojson', { + * stroke: Cesium.Color.HOTPINK, + * fill: Cesium.Color.PINK, + * strokeWidth: 3, + * markerSymbol: '?' + * })); + * @param [name] - The name of this data source. If undefined, a name will be taken from + * the name of the GeoJSON file. + */ + export class GeoJsonDataSource { + constructor(name?: string); + /** + * Creates a Promise to a new instance loaded with the provided GeoJSON or TopoJSON data. + * @param data - A url, GeoJSON object, or TopoJSON object to be loaded. + * @param [options] - An object specifying configuration options + * @returns A promise that will resolve when the data is loaded. + */ + static load( + data: Resource | string | any, + options?: GeoJsonDataSource.LoadOptions, + ): Promise; + /** + * Gets or sets the default size of the map pin created for each point, in pixels. + */ + static markerSize: number; + /** + * Gets or sets the default symbol of the map pin created for each point. + * This can be any valid {@link http://mapbox.com/maki/|Maki} identifier, any single character, + * or blank if no symbol is to be used. + */ + static markerSymbol: string; + /** + * Gets or sets the default color of the map pin created for each point. + */ + static markerColor: Color; + /** + * Gets or sets the default color of polylines and polygon outlines. + */ + static stroke: Color; + /** + * Gets or sets the default width of polylines and polygon outlines. + */ + static strokeWidth: number; + /** + * Gets or sets default color for polygon interiors. + */ + static fill: Color; + /** + * Gets or sets default of whether to clamp to the ground. + */ + static clampToGround: boolean; + /** + * Gets an object that maps the name of a crs to a callback function which takes a GeoJSON coordinate + * and transforms it into a WGS84 Earth-fixed Cartesian. Older versions of GeoJSON which + * supported the EPSG type can be added to this list as well, by specifying the complete EPSG name, + * for example 'EPSG:4326'. + */ + static crsNames: any; + /** + * Gets an object that maps the href property of a crs link to a callback function + * which takes the crs properties object and returns a Promise that resolves + * to a function that takes a GeoJSON coordinate and transforms it into a WGS84 Earth-fixed Cartesian. + * Items in this object take precedence over those defined in crsLinkHrefs, assuming + * the link has a type specified. + */ + static crsLinkHrefs: any; + /** + * Gets an object that maps the type property of a crs link to a callback function + * which takes the crs properties object and returns a Promise that resolves + * to a function that takes a GeoJSON coordinate and transforms it into a WGS84 Earth-fixed Cartesian. + * Items in crsLinkHrefs take precedence over this object. + */ + static crsLinkTypes: any; + /** + * Gets or sets a human-readable name for this instance. + */ + name: string; + /** + * This DataSource only defines static data, therefore this property is always undefined. + */ + clock: DataSourceClock; + /** + * Gets the collection of {@link Entity} instances. + */ + entities: EntityCollection; + /** + * Gets a value indicating if the data source is currently loading data. + */ + isLoading: boolean; + /** + * Gets an event that will be raised when the underlying data changes. + */ + changedEvent: Event; + /** + * Gets an event that will be raised if an error is encountered during processing. + */ + errorEvent: Event; + /** + * Gets an event that will be raised when the data source either starts or stops loading. + */ + loadingEvent: Event; + /** + * Gets whether or not this data source should be displayed. + */ + show: boolean; + /** + * Gets or sets the clustering options for this data source. This object can be shared between multiple data sources. + */ + clustering: EntityCluster; + /** + * Gets the credit that will be displayed for the data source + */ + credit: Credit; + /** + * Asynchronously loads the provided GeoJSON or TopoJSON data, replacing any existing data. + * @param data - A url, GeoJSON object, or TopoJSON object to be loaded. + * @param [options] - An object specifying configuration options + * @returns a promise that will resolve when the GeoJSON is loaded. + */ + load( + data: Resource | string | any, + options?: GeoJsonDataSource.LoadOptions, + ): Promise; + /** + * Asynchronously loads the provided GeoJSON or TopoJSON data, without replacing any existing data. + * @param data - A url, GeoJSON object, or TopoJSON object to be loaded. + * @param [options] - An object specifying configuration options + * @returns a promise that will resolve when the GeoJSON is loaded. + */ + process( + data: Resource | string | any, + options?: GeoJsonDataSource.LoadOptions, + ): Promise; + /** + * Updates the data source to the provided time. This function is optional and + * is not required to be implemented. It is provided for data sources which + * retrieve data based on the current animation time or scene state. + * If implemented, update will be called by {@link DataSourceDisplay} once a frame. + * @param time - The simulation time. + * @returns True if this data source is ready to be displayed at the provided time, false otherwise. + */ + update(time: JulianDate): boolean; + } + + /** + * An abstract class for updating geometry entities. + * @param options - An object with the following properties: + * @param options.entity - The entity containing the geometry to be visualized. + * @param options.scene - The scene where visualization is taking place. + * @param options.geometryOptions - Options for the geometry + * @param options.geometryPropertyName - The geometry property name + * @param options.observedPropertyNames - The entity properties this geometry cares about + */ + export class GeometryUpdater { + constructor(options: { + entity: Entity; + scene: Scene; + geometryOptions: any; + geometryPropertyName: string; + observedPropertyNames: string[]; + }); + /** + * Gets the unique ID associated with this updater + */ + readonly id: string; + /** + * Gets the entity associated with this geometry. + */ + readonly entity: Entity; + /** + * Gets a value indicating if the geometry has a fill component. + */ + readonly fillEnabled: boolean; + /** + * Gets a value indicating if fill visibility varies with simulation time. + */ + readonly hasConstantFill: boolean; + /** + * Gets the material property used to fill the geometry. + */ + readonly fillMaterialProperty: MaterialProperty; + /** + * Gets a value indicating if the geometry has an outline component. + */ + readonly outlineEnabled: boolean; + /** + * Gets a value indicating if the geometry has an outline component. + */ + readonly hasConstantOutline: boolean; + /** + * Gets the {@link Color} property for the geometry outline. + */ + readonly outlineColorProperty: Property; + /** + * Gets the constant with of the geometry outline, in pixels. + * This value is only valid if isDynamic is false. + */ + readonly outlineWidth: number; + /** + * Gets the property specifying whether the geometry + * casts or receives shadows from light sources. + */ + readonly shadowsProperty: Property; + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this geometry will be displayed. + */ + readonly distanceDisplayConditionProperty: Property; + /** + * Gets or sets the {@link ClassificationType} Property specifying if this geometry will classify terrain, 3D Tiles, or both when on the ground. + */ + readonly classificationTypeProperty: Property; + /** + * Gets a value indicating if the geometry is time-varying. + */ + readonly isDynamic: boolean; + /** + * Gets a value indicating if the geometry is closed. + * This property is only valid for static geometry. + */ + readonly isClosed: boolean; + /** + * Gets an event that is raised whenever the public properties + * of this updater change. + */ + readonly geometryChanged: boolean; + /** + * Checks if the geometry is outlined at the provided time. + * @param time - The time for which to retrieve visibility. + * @returns true if geometry is outlined at the provided time, false otherwise. + */ + isOutlineVisible(time: JulianDate): boolean; + /** + * Checks if the geometry is filled at the provided time. + * @param time - The time for which to retrieve visibility. + * @returns true if geometry is filled at the provided time, false otherwise. + */ + isFilled(time: JulianDate): boolean; + /** + * Creates the geometry instance which represents the fill of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @returns The geometry instance representing the filled portion of the geometry. + */ + createFillGeometryInstance(time: JulianDate): GeometryInstance; + /** + * Creates the geometry instance which represents the outline of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @returns The geometry instance representing the outline portion of the geometry. + */ + createOutlineGeometryInstance(time: JulianDate): GeometryInstance; + /** + * Returns true if this object was destroyed; otherwise, false. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys and resources used by the object. Once an object is destroyed, it should not be used. + */ + destroy(): void; + } + + export const geometryUpdaters: GeometryUpdater[]; + + /** + * A general purpose visualizer for geometry represented by {@link Primitive} instances. + * @param scene - The scene the primitives will be rendered in. + * @param entityCollection - The entityCollection to visualize. + * @param [primitives = scene.primitives] - A collection to add primitives related to the entities + * @param [groundPrimitives = scene.groundPrimitives] - A collection to add ground primitives related to the entities + */ + export class GeometryVisualizer { + constructor( + scene: Scene, + entityCollection: EntityCollection, + primitives?: PrimitiveCollection, + groundPrimitives?: PrimitiveCollection, + ); + /** + * Updates all of the primitives created by this visualizer to match their + * Entity counterpart at the given time. + * @param time - The time to update to. + * @returns True if the visualizer successfully updated to the provided time, + * false if the visualizer is waiting for asynchronous primitives to be created. + */ + update(time: JulianDate): boolean; + /** + * Returns true if this object was destroyed; otherwise, false. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Removes and destroys all primitives created by this instance. + */ + destroy(): void; + } + + /** + * A {@link DataSource} which processes the GPS Exchange Format (GPX). + * @example + * const viewer = new Cesium.Viewer('cesiumContainer'); + * viewer.dataSources.add(Cesium.GpxDataSource.load('../../SampleData/track.gpx')); + */ + export class GpxDataSource { + constructor(); + /** + * Creates a Promise to a new instance loaded with the provided GPX data. + * @param data - A url, parsed GPX document, or Blob containing binary GPX data. + * @param [options] - An object with the following properties: + * @param [options.clampToGround] - True if the symbols should be rendered at the same height as the terrain + * @param [options.waypointImage] - Image to use for waypoint billboards. + * @param [options.trackImage] - Image to use for track billboards. + * @param [options.trackColor] - Color to use for track lines. + * @param [options.routeColor] - Color to use for route lines. + * @returns A promise that will resolve to a new GpxDataSource instance once the gpx is loaded. + */ + static load( + data: string | Document | Blob, + options?: { + clampToGround?: boolean; + waypointImage?: string; + trackImage?: string; + trackColor?: string; + routeColor?: string; + }, + ): Promise; + /** + * Gets a human-readable name for this instance. + * This will be automatically be set to the GPX document name on load. + */ + name: string; + /** + * Gets the version of the GPX Schema in use. + */ + version: string; + /** + * Gets the creator of the GPX document. + */ + creator: string; + /** + * Gets an object containing metadata about the GPX file. + */ + metadata: any; + /** + * Gets the clock settings defined by the loaded GPX. This represents the total + * availability interval for all time-dynamic data. If the GPX does not contain + * time-dynamic data, this value is undefined. + */ + clock: DataSourceClock; + /** + * Gets the collection of {@link Entity} instances. + */ + entities: EntityCollection; + /** + * Gets a value indicating if the data source is currently loading data. + */ + isLoading: boolean; + /** + * Gets an event that will be raised when the underlying data changes. + */ + changedEvent: Event; + /** + * Gets an event that will be raised if an error is encountered during processing. + */ + errorEvent: Event; + /** + * Gets an event that will be raised when the data source either starts or stops loading. + */ + loadingEvent: Event; + /** + * Gets whether or not this data source should be displayed. + */ + show: boolean; + /** + * Gets or sets the clustering options for this data source. This object can be shared between multiple data sources. + */ + clustering: EntityCluster; + /** + * Updates the data source to the provided time. This function is optional and + * is not required to be implemented. It is provided for data sources which + * retrieve data based on the current animation time or scene state. + * If implemented, update will be called by {@link DataSourceDisplay} once a frame. + * @param time - The simulation time. + * @returns True if this data source is ready to be displayed at the provided time, false otherwise. + */ + update(time: JulianDate): boolean; + /** + * Asynchronously loads the provided GPX data, replacing any existing data. + * @param data - A url, parsed GPX document, or Blob containing binary GPX data or a parsed GPX document. + * @param [options] - An object with the following properties: + * @param [options.clampToGround] - True if the symbols should be rendered at the same height as the terrain + * @param [options.waypointImage] - Image to use for waypoint billboards. + * @param [options.trackImage] - Image to use for track billboards. + * @param [options.trackColor] - Color to use for track lines. + * @param [options.routeColor] - Color to use for route lines. + * @returns A promise that will resolve to this instances once the GPX is loaded. + */ + load( + data: string | Document | Blob, + options?: { + clampToGround?: boolean; + waypointImage?: string; + trackImage?: string; + trackColor?: string; + routeColor?: string; + }, + ): Promise; + } + + /** + * A {@link MaterialProperty} that maps to grid {@link Material} uniforms. + * @param [options] - Object with the following properties: + * @param [options.color = Color.WHITE] - A Property specifying the grid {@link Color}. + * @param [options.cellAlpha = 0.1] - A numeric Property specifying cell alpha values. + * @param [options.lineCount = new Cartesian2(8, 8)] - A {@link Cartesian2} Property specifying the number of grid lines along each axis. + * @param [options.lineThickness = new Cartesian2(1.0, 1.0)] - A {@link Cartesian2} Property specifying the thickness of grid lines along each axis. + * @param [options.lineOffset = new Cartesian2(0.0, 0.0)] - A {@link Cartesian2} Property specifying starting offset of grid lines along each axis. + */ + export class GridMaterialProperty { + constructor(options?: { + color?: Property | Color; + cellAlpha?: Property | number; + lineCount?: Property | Cartesian2; + lineThickness?: Property | Cartesian2; + lineOffset?: Property | Cartesian2; + }); + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the Property specifying the grid {@link Color}. + */ + color: Property | undefined; + /** + * Gets or sets the numeric Property specifying cell alpha values. + */ + cellAlpha: Property | undefined; + /** + * Gets or sets the {@link Cartesian2} Property specifying the number of grid lines along each axis. + */ + lineCount: Property | undefined; + /** + * Gets or sets the {@link Cartesian2} Property specifying the thickness of grid lines along each axis. + */ + lineThickness: Property | undefined; + /** + * Gets or sets the {@link Cartesian2} Property specifying the starting offset of grid lines along each axis. + */ + lineOffset: Property | undefined; + /** + * Gets the {@link Material} type at the provided time. + * @param time - The time for which to retrieve the type. + * @returns The type of material. + */ + getType(time: JulianDate): string; + /** + * Gets the value of the property at the provided time. + * @param [time = JulianDate.now()] - The time for which to retrieve the value. If omitted, the current system time is used. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time?: JulianDate, result?: any): any; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; + } + + /** + * An abstract class for updating ground geometry entities. + * @param options - An object with the following properties: + * @param options.entity - The entity containing the geometry to be visualized. + * @param options.scene - The scene where visualization is taking place. + * @param options.geometryOptions - Options for the geometry + * @param options.geometryPropertyName - The geometry property name + * @param options.observedPropertyNames - The entity properties this geometry cares about + */ + export class GroundGeometryUpdater { + constructor(options: { + entity: Entity; + scene: Scene; + geometryOptions: any; + geometryPropertyName: string; + observedPropertyNames: string[]; + }); + /** + * Gets the zindex + */ + readonly zIndex: number; + /** + * Destroys and resources used by the object. Once an object is destroyed, it should not be used. + */ + destroy(): void; + } + + /** + * A {@link MaterialProperty} that maps to image {@link Material} uniforms. + * @param [options] - Object with the following properties: + * @param [options.image] - A Property specifying the Image, URL, Canvas, or Video. + * @param [options.repeat = new Cartesian2(1.0, 1.0)] - A {@link Cartesian2} Property specifying the number of times the image repeats in each direction. + * @param [options.color = Color.WHITE] - The color applied to the image + * @param [options.transparent = false] - Set to true when the image has transparency (for example, when a png has transparent sections) + */ + export class ImageMaterialProperty { + constructor(options?: { + image?: + | Property + | string + | HTMLImageElement + | HTMLCanvasElement + | HTMLVideoElement; + repeat?: Property | Cartesian2; + color?: Property | Color; + transparent?: Property | boolean; + }); + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the Property specifying Image, URL, Canvas, or Video to use. + */ + image: Property | undefined; + /** + * Gets or sets the {@link Cartesian2} Property specifying the number of times the image repeats in each direction. + */ + repeat: Property | undefined; + /** + * Gets or sets the Color Property specifying the desired color applied to the image. + */ + color: Property | undefined; + /** + * Gets or sets the Boolean Property specifying whether the image has transparency + */ + transparent: Property | undefined; + /** + * Gets the {@link Material} type at the provided time. + * @param time - The time for which to retrieve the type. + * @returns The type of material. + */ + getType(time: JulianDate): string; + /** + * Gets the value of the property at the provided time. + * @param [time = JulianDate.now()] - The time for which to retrieve the value. If omitted, the current system time is used. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time?: JulianDate, result?: any): any; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; + } + + /** + * Representation of from KML + * @param position - camera position + * @param headingPitchRoll - camera orientation + */ + export class KmlCamera { + constructor(position: Cartesian3, headingPitchRoll: HeadingPitchRoll); + } + + export namespace KmlDataSource { + /** + * Initialization options for the `load` method. + * @property [sourceUri] - Overrides the url to use for resolving relative links and other KML network features. + * @property [clampToGround = false] - true if we want the geometry features (Polygons, LineStrings and LinearRings) clamped to the ground. + * @property [ellipsoid = Ellipsoid.default] - The global ellipsoid used for geographical calculations. + * @property [screenOverlayContainer] - A container for ScreenOverlay images. + */ + type LoadOptions = { + sourceUri?: string; + clampToGround?: boolean; + ellipsoid?: Ellipsoid; + screenOverlayContainer?: Element | string; + }; + /** + * Options for constructing a new KmlDataSource, or calling the static `load` method. + * @property [camera] - The camera that is used for viewRefreshModes and sending camera properties to network links. + * @property [canvas] - The canvas that is used for sending viewer properties to network links. + * @property [credit] - A credit for the data source, which is displayed on the canvas. + * @property [sourceUri] - Overrides the url to use for resolving relative links and other KML network features. + * @property [clampToGround = false] - true if we want the geometry features (Polygons, LineStrings and LinearRings) clamped to the ground. + * @property [ellipsoid = Ellipsoid.default] - The global ellipsoid used for geographical calculations. + * @property [screenOverlayContainer] - A container for ScreenOverlay images. + */ + type ConstructorOptions = { + camera?: Camera; + canvas?: HTMLCanvasElement; + credit?: Credit | string; + sourceUri?: string; + clampToGround?: boolean; + ellipsoid?: Ellipsoid; + screenOverlayContainer?: Element | string; + }; + } + + /** + * A {@link DataSource} which processes Keyhole Markup Language 2.2 (KML). + *

+ * KML support in Cesium is incomplete, but a large amount of the standard, + * as well as Google's gx extension namespace, is supported. See Github issue + * {@link https://github.com/CesiumGS/cesium/issues/873|#873} for a + * detailed list of what is and isn't supported. Cesium will also write information to the + * console when it encounters most unsupported features. + *

+ *

+ * Non visual feature data, such as atom:author and ExtendedData + * is exposed via an instance of {@link KmlFeatureData}, which is added to each {@link Entity} + * under the kml property. + *

+ * @example + * const viewer = new Cesium.Viewer('cesiumContainer'); + * viewer.dataSources.add(Cesium.KmlDataSource.load('../../SampleData/facilities.kmz', + * { + * camera: viewer.scene.camera, + * canvas: viewer.scene.canvas + * }) + * ); + * @param [options] - Object describing initialization options + */ + export class KmlDataSource { + constructor(options?: KmlDataSource.ConstructorOptions); + /** + * The current size of this Canvas will be used to populate the Link parameters + * for client height and width. + */ + canvas: HTMLCanvasElement | undefined; + /** + * The position and orientation of this {@link Camera} will be used to + * populate various camera parameters when making network requests. + * Camera movement will determine when to trigger NetworkLink refresh if + * viewRefreshMode is onStop. + */ + camera: Camera | undefined; + /** + * Creates a Promise to a new instance loaded with the provided KML data. + * @param data - A url, parsed KML document, or Blob containing binary KMZ data or a parsed KML document. + * @param [options] - An object specifying configuration options + * @returns A promise that will resolve to a new KmlDataSource instance once the KML is loaded. + */ + static load( + data: Resource | string | Document | Blob, + options?: KmlDataSource.ConstructorOptions, + ): Promise; + /** + * Gets or sets a human-readable name for this instance. + * This will be automatically be set to the KML document name on load. + */ + name: string; + /** + * Gets the clock settings defined by the loaded KML. This represents the total + * availability interval for all time-dynamic data. If the KML does not contain + * time-dynamic data, this value is undefined. + */ + clock: DataSourceClock; + /** + * Gets the collection of {@link Entity} instances. + */ + entities: EntityCollection; + /** + * Gets a value indicating if the data source is currently loading data. + */ + isLoading: boolean; + /** + * Gets an event that will be raised when the underlying data changes. + */ + changedEvent: Event; + /** + * Gets an event that will be raised if an error is encountered during processing. + */ + errorEvent: Event; + /** + * Gets an event that will be raised when the data source either starts or stops loading. + */ + loadingEvent: Event; + /** + * Gets an event that will be raised when the data source refreshes a network link. + */ + refreshEvent: Event; + /** + * Gets an event that will be raised when the data source finds an unsupported node type. + */ + unsupportedNodeEvent: Event; + /** + * Gets whether or not this data source should be displayed. + */ + show: boolean; + /** + * Gets or sets the clustering options for this data source. This object can be shared between multiple data sources. + */ + clustering: EntityCluster; + /** + * Gets the credit that will be displayed for the data source + */ + credit: Credit; + /** + * Gets the KML Tours that are used to guide the camera to specified destinations on given time intervals. + */ + kmlTours: KmlTour[]; + /** + * Asynchronously loads the provided KML data, replacing any existing data. + * @param data - A url, parsed KML document, or Blob containing binary KMZ data or a parsed KML document. + * @param [options] - An object specifying configuration options + * @returns A promise that will resolve to this instances once the KML is loaded. + */ + load( + data: Resource | string | Document | Blob, + options?: KmlDataSource.LoadOptions, + ): Promise; + /** + * Cleans up any non-entity elements created by the data source. Currently this only affects ScreenOverlay elements. + */ + destroy(): void; + /** + * Updates any NetworkLink that require updating. + * @param time - The simulation time. + * @returns True if this data source is ready to be displayed at the provided time, false otherwise. + */ + update(time: JulianDate): boolean; + } + + /** + * Contains KML Feature data loaded into the Entity.kml property by {@link KmlDataSource}. + */ + export class KmlFeatureData { + constructor(); + /** + * Gets the atom syndication format author field. + */ + author: KmlFeatureData.Author; + /** + * Gets the link. + */ + link: KmlFeatureData.Link; + /** + * Gets the unstructured address field. + */ + address: string; + /** + * Gets the phone number. + */ + phoneNumber: string; + /** + * Gets the snippet. + */ + snippet: string; + /** + * Gets the extended data, parsed into a JSON object. + * Currently only the Data property is supported. + * SchemaData and custom data are ignored. + */ + extendedData: string; + } + + export namespace KmlFeatureData { + /** + * @property name - Gets the name. + * @property uri - Gets the URI. + * @property age - Gets the email. + */ + type Author = { + name: string; + uri: string; + age: number; + }; + /** + * @property href - Gets the href. + * @property hreflang - Gets the language of the linked resource. + * @property rel - Gets the link relation. + * @property type - Gets the link type. + * @property title - Gets the link title. + * @property length - Gets the link length. + */ + type Link = { + href: string; + hreflang: string; + rel: string; + type: string; + title: string; + length: string; + }; + } + + /** + * @param position - camera position + * @param headingPitchRange - camera orientation + */ + export class KmlLookAt { + constructor(position: Cartesian3, headingPitchRange: HeadingPitchRange); + } + + /** + * Describes a KmlTour, which uses KmlTourFlyTo, and KmlTourWait to + * guide the camera to a specified destinations on given time intervals. + * @param name - name parsed from KML + * @param id - id parsed from KML + * @param playlist - array with KmlTourFlyTos and KmlTourWaits + */ + export class KmlTour { + constructor(name: string, id: string, playlist: any[]); + /** + * Id of kml gx:Tour entry + */ + id: string; + /** + * Tour name + */ + name: string; + /** + * Index of current entry from playlist + */ + playlistIndex: number; + /** + * Array of playlist entries + */ + playlist: any[]; + /** + * Event will be called when tour starts to play, + * before any playlist entry starts to play. + */ + tourStart: Event; + /** + * Event will be called when all playlist entries are + * played, or tour playback being canceled. + * + * If tour playback was terminated, event callback will + * be called with terminated=true parameter. + */ + tourEnd: Event; + /** + * Event will be called when entry from playlist starts to play. + * + * Event callback will be called with curent entry as first parameter. + */ + entryStart: Event; + /** + * Event will be called when entry from playlist ends to play. + * + * Event callback will be called with following parameters: + * 1. entry - entry + * 2. terminated - true if playback was terminated by calling {@link KmlTour#stop} + */ + entryEnd: Event; + /** + * Add entry to this tour playlist. + * @param entry - an entry to add to the playlist. + */ + addPlaylistEntry(entry: KmlTourFlyTo | KmlTourWait): void; + /** + * Play this tour. + * @param widget - The widget. + * @param [cameraOptions] - these options will be merged with {@link Camera#flyTo} + * options for FlyTo playlist entries. + */ + play(widget: CesiumWidget, cameraOptions?: any): void; + /** + * Stop curently playing tour. + */ + stop(): void; + } + + /** + * Transitions the KmlTour to the next destination. This transition is facilitated + * using a specified flyToMode over a given number of seconds. + * @param duration - entry duration + * @param flyToMode - KML fly to mode: bounce, smooth, etc + * @param view - KmlCamera or KmlLookAt + */ + export class KmlTourFlyTo { + constructor( + duration: number, + flyToMode: string, + view: KmlCamera | KmlLookAt, + ); + /** + * Play this playlist entry + * @param done - function which will be called when playback ends + * @param camera - Cesium camera + * @param [cameraOptions] - which will be merged with camera flyTo options. See {@link Camera#flyTo} + */ + play( + done: KmlTourFlyTo.DoneCallback, + camera: Camera, + cameraOptions?: any, + ): void; + /** + * Stop execution of curent entry. Cancel camera flyTo + */ + stop(): void; + /** + * Returns options for {@link Camera#flyTo} or {@link Camera#flyToBoundingSphere} + * depends on this.view type. + * @param cameraOptions - options to merge with generated. See {@link Camera#flyTo} + * @returns {@link Camera#flyTo} or {@link Camera#flyToBoundingSphere} options + */ + getCameraOptions(cameraOptions: any): any; + } + + export namespace KmlTourFlyTo { + /** + * A function that will be executed when the flight completes. + * @param terminated - true if {@link KmlTourFlyTo#stop} was + * called before entry done playback. + */ + type DoneCallback = (terminated: boolean) => void; + } + + /** + * Pauses the KmlTour for a given number of seconds. + * @param duration - entry duration + */ + export class KmlTourWait { + constructor(duration: number); + /** + * Play this playlist entry + * @param done - function which will be called when playback ends + */ + play(done: KmlTourWait.DoneCallback): void; + /** + * Stop execution of curent entry, cancel curent timeout + */ + stop(): void; + } + + export namespace KmlTourWait { + /** + * A function which will be called when playback ends. + * @param terminated - true if {@link KmlTourWait#stop} was + * called before entry done playback. + */ + type DoneCallback = (terminated: boolean) => void; + } + + export namespace LabelGraphics { + /** + * Initialization options for the LabelGraphics constructor + * @property [show = true] - A boolean Property specifying the visibility of the label. + * @property [text] - A Property specifying the text. Explicit newlines '\n' are supported. + * @property [font = '30px sans-serif'] - A Property specifying the CSS font. + * @property [style = LabelStyle.FILL] - A Property specifying the {@link LabelStyle}. + * @property [scale = 1.0] - A numeric Property specifying the scale to apply to the text. + * @property [showBackground = false] - A boolean Property specifying the visibility of the background behind the label. + * @property [backgroundColor = new Color(0.165, 0.165, 0.165, 0.8)] - A Property specifying the background {@link Color}. + * @property [backgroundPadding = new Cartesian2(7, 5)] - A {@link Cartesian2} Property specifying the horizontal and vertical background padding in pixels. + * @property [pixelOffset = Cartesian2.ZERO] - A {@link Cartesian2} Property specifying the pixel offset. + * @property [eyeOffset = Cartesian3.ZERO] - A {@link Cartesian3} Property specifying the eye offset. + * @property [horizontalOrigin = HorizontalOrigin.CENTER] - A Property specifying the {@link HorizontalOrigin}. + * @property [verticalOrigin = VerticalOrigin.CENTER] - A Property specifying the {@link VerticalOrigin}. + * @property [heightReference = HeightReference.NONE] - A Property specifying what the height is relative to. + * @property [fillColor = Color.WHITE] - A Property specifying the fill {@link Color}. + * @property [outlineColor = Color.BLACK] - A Property specifying the outline {@link Color}. + * @property [outlineWidth = 1.0] - A numeric Property specifying the outline width. + * @property [translucencyByDistance] - A {@link NearFarScalar} Property used to set translucency based on distance from the camera. + * @property [pixelOffsetScaleByDistance] - A {@link NearFarScalar} Property used to set pixelOffset based on distance from the camera. + * @property [scaleByDistance] - A {@link NearFarScalar} Property used to set scale based on distance from the camera. + * @property [distanceDisplayCondition] - A Property specifying at what distance from the camera that this label will be displayed. + * @property [disableDepthTestDistance] - A Property specifying the distance from the camera at which to disable the depth test to. + */ + type ConstructorOptions = { + show?: Property | boolean; + text?: Property | string; + font?: Property | string; + style?: Property | LabelStyle; + scale?: Property | number; + showBackground?: Property | boolean; + backgroundColor?: Property | Color; + backgroundPadding?: Property | Cartesian2; + pixelOffset?: Property | Cartesian2; + eyeOffset?: Property | Cartesian3; + horizontalOrigin?: Property | HorizontalOrigin; + verticalOrigin?: Property | VerticalOrigin; + heightReference?: Property | HeightReference; + fillColor?: Property | Color; + outlineColor?: Property | Color; + outlineWidth?: Property | number; + translucencyByDistance?: Property | NearFarScalar; + pixelOffsetScaleByDistance?: Property | NearFarScalar; + scaleByDistance?: Property | NearFarScalar; + distanceDisplayCondition?: Property | DistanceDisplayCondition; + disableDepthTestDistance?: Property | number; + }; + } + + /** + * Describes a two dimensional label located at the position of the containing {@link Entity}. + *

+ *

+ *
+ * Example labels + *
+ *

+ * @param [options] - Object describing initialization options + */ + export class LabelGraphics { + constructor(options?: LabelGraphics.ConstructorOptions); + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the boolean Property specifying the visibility of the label. + */ + show: Property | undefined; + /** + * Gets or sets the string Property specifying the text of the label. + * Explicit newlines '\n' are supported. + */ + text: Property | undefined; + /** + * Gets or sets the string Property specifying the font in CSS syntax. + */ + font: Property | undefined; + /** + * Gets or sets the Property specifying the {@link LabelStyle}. + */ + style: Property | undefined; + /** + * Gets or sets the numeric Property specifying the uniform scale to apply to the image. + * A scale greater than 1.0 enlarges the label while a scale less than 1.0 shrinks it. + *

+ *

+ *
+ * From left to right in the above image, the scales are 0.5, 1.0, + * and 2.0. + *
+ *

+ */ + scale: Property | undefined; + /** + * Gets or sets the boolean Property specifying the visibility of the background behind the label. + */ + showBackground: Property | undefined; + /** + * Gets or sets the Property specifying the background {@link Color}. + */ + backgroundColor: Property | undefined; + /** + * Gets or sets the {@link Cartesian2} Property specifying the label's horizontal and vertical + * background padding in pixels. + */ + backgroundPadding: Property | undefined; + /** + * Gets or sets the {@link Cartesian2} Property specifying the label's pixel offset in screen space + * from the origin of this label. This is commonly used to align multiple labels and labels at + * the same position, e.g., an image and text. The screen space origin is the top, left corner of the + * canvas; x increases from left to right, and y increases from top to bottom. + *

+ *

+ * + * + * + *
default
l.pixeloffset = new Cartesian2(25, 75);
+ * The label's origin is indicated by the yellow point. + *
+ *

+ */ + pixelOffset: Property | undefined; + /** + * Gets or sets the {@link Cartesian3} Property specifying the label's offset in eye coordinates. + * Eye coordinates is a left-handed coordinate system, where x points towards the viewer's + * right, y points up, and z points into the screen. + *

+ * An eye offset is commonly used to arrange multiple labels or objects at the same position, e.g., to + * arrange a label above its corresponding 3D model. + *

+ * Below, the label is positioned at the center of the Earth but an eye offset makes it always + * appear on top of the Earth regardless of the viewer's or Earth's orientation. + *

+ *

+ * + * + * + *
+ * l.eyeOffset = new Cartesian3(0.0, 8000000.0, 0.0);

+ *
+ *

+ */ + eyeOffset: Property | undefined; + /** + * Gets or sets the Property specifying the {@link HorizontalOrigin}. + */ + horizontalOrigin: Property | undefined; + /** + * Gets or sets the Property specifying the {@link VerticalOrigin}. + */ + verticalOrigin: Property | undefined; + /** + * Gets or sets the Property specifying the {@link HeightReference}. + */ + heightReference: Property | undefined; + /** + * Gets or sets the Property specifying the fill {@link Color}. + */ + fillColor: Property | undefined; + /** + * Gets or sets the Property specifying the outline {@link Color}. + */ + outlineColor: Property | undefined; + /** + * Gets or sets the numeric Property specifying the outline width. + */ + outlineWidth: Property | undefined; + /** + * Gets or sets {@link NearFarScalar} Property specifying the translucency of the label based on the distance from the camera. + * A label's translucency will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the label's translucency remains clamped to the nearest bound. + */ + translucencyByDistance: Property | undefined; + /** + * Gets or sets {@link NearFarScalar} Property specifying the pixel offset of the label based on the distance from the camera. + * A label's pixel offset will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the label's pixel offset remains clamped to the nearest bound. + */ + pixelOffsetScaleByDistance: Property | undefined; + /** + * Gets or sets near and far scaling properties of a Label based on the label's distance from the camera. + * A label's scale will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the label's scale remains clamped to the nearest bound. If undefined, + * scaleByDistance will be disabled. + */ + scaleByDistance: Property | undefined; + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this label will be displayed. + */ + distanceDisplayCondition: Property | undefined; + /** + * Gets or sets the distance from the camera at which to disable the depth test to, for example, prevent clipping against terrain. + * When set to zero, the depth test is always applied. When set to Number.POSITIVE_INFINITY, the depth test is never applied. + */ + disableDepthTestDistance: Property | undefined; + /** + * Duplicates this instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance if one was not provided. + */ + clone(result?: LabelGraphics): LabelGraphics; + /** + * Assigns each unassigned property on this object to the value + * of the same property on the provided source object. + * @param source - The object to be merged into this object. + */ + merge(source: LabelGraphics): void; + } + + /** + * A {@link Visualizer} which maps the {@link LabelGraphics} instance + * in {@link Entity#label} to a {@link Label}. + * @param entityCluster - The entity cluster to manage the collection of billboards and optionally cluster with other entities. + * @param entityCollection - The entityCollection to visualize. + */ + export class LabelVisualizer { + constructor( + entityCluster: EntityCluster, + entityCollection: EntityCollection, + ); + /** + * Updates the primitives created by this visualizer to match their + * Entity counterpart at the given time. + * @param time - The time to update to. + * @returns This function always returns true. + */ + update(time: JulianDate): boolean; + /** + * Returns true if this object was destroyed; otherwise, false. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Removes and destroys all primitives created by this instance. + */ + destroy(): void; + } + + /** + * The interface for all {@link Property} objects that represent {@link Material} uniforms. + * This type defines an interface and cannot be instantiated directly. + */ + export class MaterialProperty { + constructor(); + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + */ + readonly definitionChanged: Event; + /** + * Gets the {@link Material} type at the provided time. + * @param time - The time for which to retrieve the type. + * @returns The type of material. + */ + getType(time: JulianDate): string; + /** + * Gets the value of the property at the provided time. + * @param [time = JulianDate.now()] - The time for which to retrieve the value. If omitted, the current system time is used. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time?: JulianDate, result?: any): any; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; + } + + export namespace ModelGraphics { + /** + * Initialization options for the ModelGraphics constructor + * @property [show = true] - A boolean Property specifying the visibility of the model. + * @property [uri] - A string or Resource Property specifying the URI of the glTF asset. + * @property [scale = 1.0] - A numeric Property specifying a uniform linear scale. + * @property [enableVerticalExaggeration = true] - A boolean Property specifying if the model is exaggerated along the ellipsoid normal when {@link Scene.verticalExaggeration} is set to a value other than 1.0. + * @property [minimumPixelSize = 0.0] - A numeric Property specifying the approximate minimum pixel size of the model regardless of zoom. + * @property [maximumScale] - The maximum scale size of a model. An upper limit for minimumPixelSize. + * @property [incrementallyLoadTextures = true] - Determine if textures may continue to stream in after the model is loaded. + * @property [runAnimations = true] - A boolean Property specifying if glTF animations specified in the model should be started. + * @property [clampAnimations = true] - A boolean Property specifying if glTF animations should hold the last pose for time durations with no keyframes. + * @property [shadows = ShadowMode.ENABLED] - An enum Property specifying whether the model casts or receives shadows from light sources. + * @property [heightReference = HeightReference.NONE] - A Property specifying what the height is relative to. + * @property [silhouetteColor = Color.RED] - A Property specifying the {@link Color} of the silhouette. + * @property [silhouetteSize = 0.0] - A numeric Property specifying the size of the silhouette in pixels. + * @property [color = Color.WHITE] - A Property specifying the {@link Color} that blends with the model's rendered color. + * @property [colorBlendMode = ColorBlendMode.HIGHLIGHT] - An enum Property specifying how the color blends with the model. + * @property [colorBlendAmount = 0.5] - A numeric Property specifying the color strength when the colorBlendMode is MIX. A value of 0.0 results in the model's rendered color while a value of 1.0 results in a solid color, with any value in-between resulting in a mix of the two. + * @property [imageBasedLightingFactor = new Cartesian2(1.0, 1.0)] - A property specifying the contribution from diffuse and specular image-based lighting. + * @property [environmentMapOptions] - The properties for managing dynamic environment maps on this entity. + * @property [lightColor] - A property specifying the light color when shading the model. When undefined the scene's light color is used instead. + * @property [distanceDisplayCondition] - A Property specifying at what distance from the camera that this model will be displayed. + * @property [nodeTransformations] - An object, where keys are names of nodes, and values are {@link TranslationRotationScale} Properties describing the transformation to apply to that node. The transformation is applied after the node's existing transformation as specified in the glTF, and does not replace the node's existing transformation. + * @property [articulations] - An object, where keys are composed of an articulation name, a single space, and a stage name, and the values are numeric properties. + * @property [clippingPlanes] - A property specifying the {@link ClippingPlaneCollection} used to selectively disable rendering the model. + * @property [customShader] - A property specifying the {@link CustomShader} to apply to this model. + */ + type ConstructorOptions = { + show?: Property | boolean; + uri?: Property | string | Resource; + scale?: Property | number; + enableVerticalExaggeration?: Property | boolean; + minimumPixelSize?: Property | number; + maximumScale?: Property | number; + incrementallyLoadTextures?: Property | boolean; + runAnimations?: Property | boolean; + clampAnimations?: Property | boolean; + shadows?: Property | ShadowMode; + heightReference?: Property | HeightReference; + silhouetteColor?: Property | Color; + silhouetteSize?: Property | number; + color?: Property | Color; + colorBlendMode?: Property | ColorBlendMode; + colorBlendAmount?: Property | number; + imageBasedLightingFactor?: Property | Cartesian2; + environmentMapOptions?: + | PropertyBag + | { + [key: string]: any; + }; + lightColor?: Property | Color; + distanceDisplayCondition?: Property | DistanceDisplayCondition; + nodeTransformations?: + | PropertyBag + | { + [key: string]: TranslationRotationScale; + }; + articulations?: + | PropertyBag + | { + [key: string]: number; + }; + clippingPlanes?: Property | ClippingPlaneCollection; + customShader?: Property | CustomShader; + }; + } + + /** + * A 3D model based on {@link https://github.com/KhronosGroup/glTF|glTF}, the runtime asset format for WebGL, OpenGL ES, and OpenGL. + * The position and orientation of the model is determined by the containing {@link Entity}. + *

+ * Cesium includes support for glTF geometry, materials, animations, and skinning. + * Cameras and lights are not currently supported. + *

+ * @param [options] - Object describing initialization options + */ + export class ModelGraphics { + constructor(options?: ModelGraphics.ConstructorOptions); + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the boolean Property specifying the visibility of the model. + */ + show: Property | undefined; + /** + * Gets or sets the string Property specifying the URI of the glTF asset. + */ + uri: Property | undefined; + /** + * Gets or sets the numeric Property specifying a uniform linear scale + * for this model. Values greater than 1.0 increase the size of the model while + * values less than 1.0 decrease it. + */ + scale: Property | undefined; + /** + * Gets or sets the boolean Property specifying if the model is exaggerated along the ellipsoid normal when {@link Scene.verticalExaggeration} is set to a value other than 1.0. + */ + enableVerticalExaggeration: Property | undefined; + /** + * Gets or sets the numeric Property specifying the approximate minimum + * pixel size of the model regardless of zoom. This can be used to ensure that + * a model is visible even when the viewer zooms out. When 0.0, + * no minimum size is enforced. + */ + minimumPixelSize: Property | undefined; + /** + * Gets or sets the numeric Property specifying the maximum scale + * size of a model. This property is used as an upper limit for + * {@link ModelGraphics#minimumPixelSize}. + */ + maximumScale: Property | undefined; + /** + * Get or sets the boolean Property specifying whether textures + * may continue to stream in after the model is loaded. + */ + incrementallyLoadTextures: Property | undefined; + /** + * Gets or sets the boolean Property specifying if glTF animations should be run. + */ + runAnimations: Property | undefined; + /** + * Gets or sets the boolean Property specifying if glTF animations should hold the last pose for time durations with no keyframes. + */ + clampAnimations: Property | undefined; + /** + * Get or sets the enum Property specifying whether the model + * casts or receives shadows from light sources. + */ + shadows: Property | undefined; + /** + * Gets or sets the Property specifying the {@link HeightReference}. + */ + heightReference: Property | undefined; + /** + * Gets or sets the Property specifying the {@link Color} of the silhouette. + */ + silhouetteColor: Property | undefined; + /** + * Gets or sets the numeric Property specifying the size of the silhouette in pixels. + */ + silhouetteSize: Property | undefined; + /** + * Gets or sets the Property specifying the {@link Color} that blends with the model's rendered color. + */ + color: Property | undefined; + /** + * Gets or sets the enum Property specifying how the color blends with the model. + */ + colorBlendMode: Property | undefined; + /** + * A numeric Property specifying the color strength when the colorBlendMode is MIX. + * A value of 0.0 results in the model's rendered color while a value of 1.0 results in a solid color, with + * any value in-between resulting in a mix of the two. + */ + colorBlendAmount: Property | undefined; + /** + * A property specifying the {@link Cartesian2} used to scale the diffuse and specular image-based lighting contribution to the final color. + */ + imageBasedLightingFactor: Property | undefined; + /** + * Gets or sets the {@link DynamicEnvironmentMapManager.ConstructorOptions} to apply to this model. This is represented as an {@link PropertyBag}. + */ + environmentMapOptions: PropertyBag; + /** + * A property specifying the {@link Cartesian3} light color when shading the model. When undefined the scene's light color is used instead. + */ + lightColor: Property | undefined; + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this model will be displayed. + */ + distanceDisplayCondition: Property | undefined; + /** + * Gets or sets the set of node transformations to apply to this model. This is represented as an {@link PropertyBag}, where keys are + * names of nodes, and values are {@link TranslationRotationScale} Properties describing the transformation to apply to that node. + * The transformation is applied after the node's existing transformation as specified in the glTF, and does not replace the node's existing transformation. + */ + nodeTransformations: PropertyBag; + /** + * Gets or sets the set of articulation values to apply to this model. This is represented as an {@link PropertyBag}, where keys are + * composed as the name of the articulation, a single space, and the name of the stage. + */ + articulations: PropertyBag; + /** + * A property specifying the {@link ClippingPlaneCollection} used to selectively disable rendering the model. + */ + clippingPlanes: Property | undefined; + /** + * Gets or sets the {@link CustomShader} to apply to this model. When undefined, no custom shader code is used. + */ + customShader: Property | undefined; + /** + * Duplicates this instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance if one was not provided. + */ + clone(result?: ModelGraphics): ModelGraphics; + /** + * Assigns each unassigned property on this object to the value + * of the same property on the provided source object. + * @param source - The object to be merged into this object. + */ + merge(source: ModelGraphics): void; + } + + /** + * A {@link Visualizer} which maps {@link Entity#model} to a {@link Model}. + * @param scene - The scene the primitives will be rendered in. + * @param entityCollection - The entityCollection to visualize. + */ + export class ModelVisualizer { + constructor(scene: Scene, entityCollection: EntityCollection); + /** + * Updates models created this visualizer to match their + * Entity counterpart at the given time. + * @param time - The time to update to. + * @returns This function always returns true. + */ + update(time: JulianDate): boolean; + /** + * Returns true if this object was destroyed; otherwise, false. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Removes and destroys all primitives created by this instance. + */ + destroy(): void; + } + + /** + * A {@link Property} that produces {@link TranslationRotationScale} data. + * @param [options] - Object with the following properties: + * @param [options.translation = Cartesian3.ZERO] - A {@link Cartesian3} Property specifying the (x, y, z) translation to apply to the node. + * @param [options.rotation = Quaternion.IDENTITY] - A {@link Quaternion} Property specifying the (x, y, z, w) rotation to apply to the node. + * @param [options.scale = new Cartesian3(1.0, 1.0, 1.0)] - A {@link Cartesian3} Property specifying the (x, y, z) scaling to apply to the node. + */ + export class NodeTransformationProperty { + constructor(options?: { + translation?: Property | Cartesian3; + rotation?: Property | Quaternion; + scale?: Property | Cartesian3; + }); + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the {@link Cartesian3} Property specifying the (x, y, z) translation to apply to the node. + */ + translation: Property | undefined; + /** + * Gets or sets the {@link Quaternion} Property specifying the (x, y, z, w) rotation to apply to the node. + */ + rotation: Property | undefined; + /** + * Gets or sets the {@link Cartesian3} Property specifying the (x, y, z) scaling to apply to the node. + */ + scale: Property | undefined; + /** + * Gets the value of the property at the provided time. + * @param [time = JulianDate.now()] - The time for which to retrieve the value. If omitted, the current system time is used. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue( + time?: JulianDate, + result?: TranslationRotationScale, + ): TranslationRotationScale; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; + } + + export namespace PathGraphics { + /** + * Initialization options for the PathGraphics constructor + * @property [show = true] - A boolean Property specifying the visibility of the path. + * @property [leadTime] - A Property specifying the number of seconds in front the object to show. + * @property [trailTime] - A Property specifying the number of seconds behind of the object to show. + * @property [width = 1.0] - A numeric Property specifying the width in pixels. + * @property [resolution = 60] - A numeric Property specifying the maximum number of seconds to step when sampling the position. + * @property [material = Color.WHITE] - A Property specifying the material used to draw the path. + * @property [distanceDisplayCondition] - A Property specifying at what distance from the camera that this path will be displayed. + */ + type ConstructorOptions = { + show?: Property | boolean; + leadTime?: Property | number; + trailTime?: Property | number; + width?: Property | number; + resolution?: Property | number; + material?: MaterialProperty | Color; + distanceDisplayCondition?: Property | DistanceDisplayCondition; + }; + } + + /** + * Describes a polyline defined as the path made by an {@link Entity} as it moves over time. + * @param [options] - Object describing initialization options + */ + export class PathGraphics { + constructor(options?: PathGraphics.ConstructorOptions); + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the boolean Property specifying the visibility of the path. + */ + show: Property | undefined; + /** + * Gets or sets the Property specifying the number of seconds in front of the object to show. + */ + leadTime: Property | undefined; + /** + * Gets or sets the Property specifying the number of seconds behind the object to show. + */ + trailTime: Property | undefined; + /** + * Gets or sets the numeric Property specifying the width in pixels. + */ + width: Property | undefined; + /** + * Gets or sets the Property specifying the maximum number of seconds to step when sampling the position. + */ + resolution: Property | undefined; + /** + * Gets or sets the Property specifying the material used to draw the path. + */ + material: MaterialProperty; + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this path will be displayed. + */ + distanceDisplayCondition: Property | undefined; + /** + * Duplicates this instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance if one was not provided. + */ + clone(result?: PathGraphics): PathGraphics; + /** + * Assigns each unassigned property on this object to the value + * of the same property on the provided source object. + * @param source - The object to be merged into this object. + */ + merge(source: PathGraphics): void; + } + + /** + * A {@link Visualizer} which maps {@link Entity#path} to a {@link Polyline}. + * @param scene - The scene the primitives will be rendered in. + * @param entityCollection - The entityCollection to visualize. + */ + export class PathVisualizer { + constructor(scene: Scene, entityCollection: EntityCollection); + /** + * Updates all of the primitives created by this visualizer to match their + * Entity counterpart at the given time. + * @param time - The time to update to. + * @returns This function always returns true. + */ + update(time: JulianDate): boolean; + /** + * Returns true if this object was destroyed; otherwise, false. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Removes and destroys all primitives created by this instance. + */ + destroy(): void; + } + + /** + * A {@link GeometryUpdater} for planes. + * Clients do not normally create this class directly, but instead rely on {@link DataSourceDisplay}. + * @param entity - The entity containing the geometry to be visualized. + * @param scene - The scene where visualization is taking place. + */ + export class PlaneGeometryUpdater { + constructor(entity: Entity, scene: Scene); + /** + * Creates the geometry instance which represents the fill of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @returns The geometry instance representing the filled portion of the geometry. + */ + createFillGeometryInstance(time: JulianDate): GeometryInstance; + /** + * Creates the geometry instance which represents the outline of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @returns The geometry instance representing the outline portion of the geometry. + */ + createOutlineGeometryInstance(time: JulianDate): GeometryInstance; + } + + export namespace PlaneGraphics { + /** + * Initialization options for the PlaneGraphics constructor + * @property [show = true] - A boolean Property specifying the visibility of the plane. + * @property [plane] - A {@link Plane} Property specifying the normal and distance for the plane. + * @property [dimensions] - A {@link Cartesian2} Property specifying the width and height of the plane. + * @property [fill = true] - A boolean Property specifying whether the plane is filled with the provided material. + * @property [material = Color.WHITE] - A Property specifying the material used to fill the plane. + * @property [outline = false] - A boolean Property specifying whether the plane is outlined. + * @property [outlineColor = Color.BLACK] - A Property specifying the {@link Color} of the outline. + * @property [outlineWidth = 1.0] - A numeric Property specifying the width of the outline. + * @property [shadows = ShadowMode.DISABLED] - An enum Property specifying whether the plane casts or receives shadows from light sources. + * @property [distanceDisplayCondition] - A Property specifying at what distance from the camera that this plane will be displayed. + */ + type ConstructorOptions = { + show?: Property | boolean; + plane?: Property | Plane; + dimensions?: Property | Cartesian2; + fill?: Property | boolean; + material?: MaterialProperty | Color; + outline?: Property | boolean; + outlineColor?: Property | Color; + outlineWidth?: Property | number; + shadows?: Property | ShadowMode; + distanceDisplayCondition?: Property | DistanceDisplayCondition; + }; + } + + /** + * Describes a plane. The center position and orientation are determined by the containing {@link Entity}. + * @param [options] - Object describing initialization options + */ + export class PlaneGraphics { + constructor(options?: PlaneGraphics.ConstructorOptions); + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the boolean Property specifying the visibility of the plane. + */ + show: Property | undefined; + /** + * Gets or sets the {@link Plane} Property specifying the normal and distance of the plane. + */ + plane: Property | undefined; + /** + * Gets or sets the {@link Cartesian2} Property specifying the width and height of the plane. + */ + dimensions: Property | undefined; + /** + * Gets or sets the boolean Property specifying whether the plane is filled with the provided material. + */ + fill: Property | undefined; + /** + * Gets or sets the material used to fill the plane. + */ + material: MaterialProperty; + /** + * Gets or sets the Property specifying whether the plane is outlined. + */ + outline: Property | undefined; + /** + * Gets or sets the Property specifying the {@link Color} of the outline. + */ + outlineColor: Property | undefined; + /** + * Gets or sets the numeric Property specifying the width of the outline. + *

+ * Note: This property will be ignored on all major browsers on Windows platforms. For details, see (@link https://github.com/CesiumGS/cesium/issues/40}. + *

+ */ + outlineWidth: Property | undefined; + /** + * Get or sets the enum Property specifying whether the plane + * casts or receives shadows from light sources. + */ + shadows: Property | undefined; + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this plane will be displayed. + */ + distanceDisplayCondition: Property | undefined; + /** + * Duplicates this instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance if one was not provided. + */ + clone(result?: PlaneGraphics): PlaneGraphics; + /** + * Assigns each unassigned property on this object to the value + * of the same property on the provided source object. + * @param source - The object to be merged into this object. + */ + merge(source: PlaneGraphics): void; + } + + export namespace PointGraphics { + /** + * Initialization options for the PointGraphics constructor + * @property [show = true] - A boolean Property specifying the visibility of the point. + * @property [pixelSize = 1] - A numeric Property specifying the size in pixels. + * @property [heightReference = HeightReference.NONE] - A Property specifying what the height is relative to. + * @property [color = Color.WHITE] - A Property specifying the {@link Color} of the point. + * @property [outlineColor = Color.BLACK] - A Property specifying the {@link Color} of the outline. + * @property [outlineWidth = 0] - A numeric Property specifying the the outline width in pixels. + * @property [scaleByDistance] - A {@link NearFarScalar} Property used to scale the point based on distance. + * @property [translucencyByDistance] - A {@link NearFarScalar} Property used to set translucency based on distance from the camera. + * @property [distanceDisplayCondition] - A Property specifying at what distance from the camera that this point will be displayed. + * @property [disableDepthTestDistance] - A Property specifying the distance from the camera at which to disable the depth test to. + * @property [splitDirection] - A Property specifying the {@link SplitDirection} split to apply to this point. + */ + type ConstructorOptions = { + show?: Property | boolean; + pixelSize?: Property | number; + heightReference?: Property | HeightReference; + color?: Property | Color; + outlineColor?: Property | Color; + outlineWidth?: Property | number; + scaleByDistance?: Property | NearFarScalar; + translucencyByDistance?: Property | NearFarScalar; + distanceDisplayCondition?: Property | DistanceDisplayCondition; + disableDepthTestDistance?: Property | number; + splitDirection?: Property | SplitDirection; + }; + } + + /** + * Describes a graphical point located at the position of the containing {@link Entity}. + * @param [options] - Object describing initialization options + */ + export class PointGraphics { + constructor(options?: PointGraphics.ConstructorOptions); + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the boolean Property specifying the visibility of the point. + */ + show: Property | undefined; + /** + * Gets or sets the numeric Property specifying the size in pixels. + */ + pixelSize: Property | undefined; + /** + * Gets or sets the Property specifying the {@link HeightReference}. + */ + heightReference: Property | undefined; + /** + * Gets or sets the Property specifying the {@link Color} of the point. + */ + color: Property | undefined; + /** + * Gets or sets the Property specifying the {@link Color} of the outline. + */ + outlineColor: Property | undefined; + /** + * Gets or sets the numeric Property specifying the the outline width in pixels. + */ + outlineWidth: Property | undefined; + /** + * Gets or sets the {@link NearFarScalar} Property used to scale the point based on distance. + * If undefined, a constant size is used. + */ + scaleByDistance: Property | undefined; + /** + * Gets or sets {@link NearFarScalar} Property specifying the translucency of the point based on the distance from the camera. + * A point's translucency will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the points's translucency remains clamped to the nearest bound. + */ + translucencyByDistance: Property | undefined; + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this point will be displayed. + */ + distanceDisplayCondition: Property | undefined; + /** + * Gets or sets the distance from the camera at which to disable the depth test to, for example, prevent clipping against terrain. + * When set to zero, the depth test is always applied. When set to Number.POSITIVE_INFINITY, the depth test is never applied. + */ + disableDepthTestDistance: Property | undefined; + /** + * Gets or sets the Property specifying the {@link SplitDirection} of this point. + */ + splitDirection: Property | undefined; + /** + * Duplicates this instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance if one was not provided. + */ + clone(result?: PointGraphics): PointGraphics; + /** + * Assigns each unassigned property on this object to the value + * of the same property on the provided source object. + * @param source - The object to be merged into this object. + */ + merge(source: PointGraphics): void; + } + + /** + * A {@link Visualizer} which maps {@link Entity#point} to a {@link PointPrimitive}. + * @param entityCluster - The entity cluster to manage the collection of billboards and optionally cluster with other entities. + * @param entityCollection - The entityCollection to visualize. + */ + export class PointVisualizer { + constructor( + entityCluster: EntityCluster, + entityCollection: EntityCollection, + ); + /** + * Updates the primitives created by this visualizer to match their + * Entity counterpart at the given time. + * @param time - The time to update to. + * @returns This function always returns true. + */ + update(time: JulianDate): boolean; + /** + * Returns true if this object was destroyed; otherwise, false. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Removes and destroys all primitives created by this instance. + */ + destroy(): void; + } + + /** + * A {@link GeometryUpdater} for polygons. + * Clients do not normally create this class directly, but instead rely on {@link DataSourceDisplay}. + * @param entity - The entity containing the geometry to be visualized. + * @param scene - The scene where visualization is taking place. + */ + export class PolygonGeometryUpdater { + constructor(entity: Entity, scene: Scene); + /** + * Creates the geometry instance which represents the fill of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @returns The geometry instance representing the filled portion of the geometry. + */ + createFillGeometryInstance(time: JulianDate): GeometryInstance; + /** + * Creates the geometry instance which represents the outline of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @returns The geometry instance representing the outline portion of the geometry. + */ + createOutlineGeometryInstance(time: JulianDate): GeometryInstance; + } + + export namespace PolygonGraphics { + /** + * Initialization options for the PolygonGraphics constructor + * @property [show = true] - A boolean Property specifying the visibility of the polygon. + * @property [hierarchy] - A Property specifying the {@link PolygonHierarchy}. + * @property [height = 0] - A numeric Property specifying the altitude of the polygon relative to the ellipsoid surface. + * @property [heightReference = HeightReference.NONE] - A Property specifying what the height is relative to. + * @property [extrudedHeight] - A numeric Property specifying the altitude of the polygon's extruded face relative to the ellipsoid surface. + * @property [extrudedHeightReference = HeightReference.NONE] - A Property specifying what the extrudedHeight is relative to. + * @property [stRotation = 0.0] - A numeric property specifying the rotation of the polygon texture counter-clockwise from north. Only has an effect if textureCoordinates is not defined. + * @property [granularity = Cesium.Math.RADIANS_PER_DEGREE] - A numeric Property specifying the angular distance between each latitude and longitude point. + * @property [fill = true] - A boolean Property specifying whether the polygon is filled with the provided material. + * @property [material = Color.WHITE] - A Property specifying the material used to fill the polygon. + * @property [outline = false] - A boolean Property specifying whether the polygon is outlined. + * @property [outlineColor = Color.BLACK] - A Property specifying the {@link Color} of the outline. + * @property [outlineWidth = 1.0] - A numeric Property specifying the width of the outline. + * @property [perPositionHeight = false] - A boolean specifying whether or not the height of each position is used. + * @property [closeTop = true] - When false, leaves off the top of an extruded polygon open. + * @property [closeBottom = true] - When false, leaves off the bottom of an extruded polygon open. + * @property [arcType = ArcType.GEODESIC] - The type of line the polygon edges must follow. + * @property [shadows = ShadowMode.DISABLED] - An enum Property specifying whether the polygon casts or receives shadows from light sources. + * @property [distanceDisplayCondition] - A Property specifying at what distance from the camera that this polygon will be displayed. + * @property [classificationType = ClassificationType.BOTH] - An enum Property specifying whether this polygon will classify terrain, 3D Tiles, or both when on the ground. + * @property [zIndex = 0] - A property specifying the zIndex used for ordering ground geometry. Only has an effect if the polygon is constant and neither height or extrudedHeight are specified. + * @property [textureCoordinates] - A Property specifying texture coordinates as a {@link PolygonHierarchy} of {@link Cartesian2} points. Has no effect for ground primitives. + */ + type ConstructorOptions = { + show?: Property | boolean; + hierarchy?: Property | PolygonHierarchy | Cartesian3[]; + height?: Property | number; + heightReference?: Property | HeightReference; + extrudedHeight?: Property | number; + extrudedHeightReference?: Property | HeightReference; + stRotation?: Property | number; + granularity?: Property | number; + fill?: Property | boolean; + material?: MaterialProperty | Color; + outline?: Property | boolean; + outlineColor?: Property | Color; + outlineWidth?: Property | number; + perPositionHeight?: Property | boolean; + closeTop?: boolean | boolean; + closeBottom?: boolean | boolean; + arcType?: Property | ArcType; + shadows?: Property | ShadowMode; + distanceDisplayCondition?: Property | DistanceDisplayCondition; + classificationType?: Property | ClassificationType; + zIndex?: ConstantProperty | number; + textureCoordinates?: Property | PolygonHierarchy; + }; + } + + /** + * Describes a polygon defined by an hierarchy of linear rings which make up the outer shape and any nested holes. + * The polygon conforms to the curvature of the globe and can be placed on the surface or + * at altitude and can optionally be extruded into a volume. + * @param [options] - Object describing initialization options + */ + export class PolygonGraphics { + constructor(options?: PolygonGraphics.ConstructorOptions); + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the boolean Property specifying the visibility of the polygon. + */ + show: Property | undefined; + /** + * Gets or sets the Property specifying the {@link PolygonHierarchy}. + */ + hierarchy: Property | undefined; + /** + * Gets or sets the numeric Property specifying the constant altitude of the polygon. + */ + height: Property | undefined; + /** + * Gets or sets the Property specifying the {@link HeightReference}. + */ + heightReference: Property | undefined; + /** + * Gets or sets the numeric Property specifying the altitude of the polygon extrusion. + * If {@link PolygonGraphics#perPositionHeight} is false, the volume starts at {@link PolygonGraphics#height} and ends at this altitude. + * If {@link PolygonGraphics#perPositionHeight} is true, the volume starts at the height of each {@link PolygonGraphics#hierarchy} position and ends at this altitude. + */ + extrudedHeight: Property | undefined; + /** + * Gets or sets the Property specifying the extruded {@link HeightReference}. + */ + extrudedHeightReference: Property | undefined; + /** + * Gets or sets the numeric property specifying the rotation of the polygon texture counter-clockwise from north. Only has an effect if textureCoordinates is not defined. + */ + stRotation: Property | undefined; + /** + * Gets or sets the numeric Property specifying the angular distance between points on the polygon. + */ + granularity: Property | undefined; + /** + * Gets or sets the boolean Property specifying whether the polygon is filled with the provided material. + */ + fill: Property | undefined; + /** + * Gets or sets the Property specifying the material used to fill the polygon. + */ + material: MaterialProperty; + /** + * Gets or sets the Property specifying whether the polygon is outlined. + */ + outline: Property | undefined; + /** + * Gets or sets the Property specifying the {@link Color} of the outline. + */ + outlineColor: Property | undefined; + /** + * Gets or sets the numeric Property specifying the width of the outline. + *

+ * Note: This property will be ignored on all major browsers on Windows platforms. For details, see (@link https://github.com/CesiumGS/cesium/issues/40}. + *

+ */ + outlineWidth: Property | undefined; + /** + * Gets or sets the boolean specifying whether or not the the height of each position is used. + * If true, the shape will have non-uniform altitude defined by the height of each {@link PolygonGraphics#hierarchy} position. + * If false, the shape will have a constant altitude as specified by {@link PolygonGraphics#height}. + */ + perPositionHeight: Property | undefined; + /** + * Gets or sets a boolean specifying whether or not the top of an extruded polygon is included. + */ + closeTop: Property | undefined; + /** + * Gets or sets a boolean specifying whether or not the bottom of an extruded polygon is included. + */ + closeBottom: Property | undefined; + /** + * Gets or sets the {@link ArcType} Property specifying the type of lines the polygon edges use. + */ + arcType: Property | undefined; + /** + * Get or sets the enum Property specifying whether the polygon + * casts or receives shadows from light sources. + */ + shadows: Property | undefined; + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this polygon will be displayed. + */ + distanceDisplayCondition: Property | undefined; + /** + * Gets or sets the {@link ClassificationType} Property specifying whether this polygon will classify terrain, 3D Tiles, or both when on the ground. + */ + classificationType: Property | undefined; + /** + * Gets or sets the zIndex Prperty specifying the ordering of ground geometry. Only has an effect if the polygon is constant and neither height or extrudedHeight are specified. + */ + zIndex: ConstantProperty | undefined; + /** + * A Property specifying texture coordinates as a {@link PolygonHierarchy} of {@link Cartesian2} points. Has no effect for ground primitives. + */ + textureCoordinates: Property | undefined; + /** + * Duplicates this instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance if one was not provided. + */ + clone(result?: PolygonGraphics): PolygonGraphics; + /** + * Assigns each unassigned property on this object to the value + * of the same property on the provided source object. + * @param source - The object to be merged into this object. + */ + merge(source: PolygonGraphics): void; + } + + /** + * A {@link MaterialProperty} that maps to PolylineArrow {@link Material} uniforms. + * @param [color = Color.WHITE] - The {@link Color} Property to be used. + */ + export class PolylineArrowMaterialProperty { + constructor(color?: Property | Color); + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the {@link Color} {@link Property}. + */ + color: Property | undefined; + /** + * Gets the {@link Material} type at the provided time. + * @param time - The time for which to retrieve the type. + * @returns The type of material. + */ + getType(time: JulianDate): string; + /** + * Gets the value of the property at the provided time. + * @param [time = JulianDate.now()] - The time for which to retrieve the value. If omitted, the current system time is used. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time?: JulianDate, result?: any): any; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; + } + + /** + * A {@link MaterialProperty} that maps to polyline dash {@link Material} uniforms. + * @param [options] - Object with the following properties: + * @param [options.color = Color.WHITE] - A Property specifying the {@link Color} of the line. + * @param [options.gapColor = Color.TRANSPARENT] - A Property specifying the {@link Color} of the gaps in the line. + * @param [options.dashLength = 16.0] - A numeric Property specifying the length of the dash pattern in pixels. + * @param [options.dashPattern = 255.0] - A numeric Property specifying a 16 bit pattern for the dash + */ + export class PolylineDashMaterialProperty { + constructor(options?: { + color?: Property | Color; + gapColor?: Property | Color; + dashLength?: Property | number; + dashPattern?: Property | number; + }); + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the Property specifying the {@link Color} of the line. + */ + color: Property | undefined; + /** + * Gets or sets the Property specifying the {@link Color} of the gaps in the line. + */ + gapColor: Property | undefined; + /** + * Gets or sets the numeric Property specifying the length of a dash cycle + */ + dashLength: Property | undefined; + /** + * Gets or sets the numeric Property specifying a dash pattern + */ + dashPattern: Property | undefined; + /** + * Gets the {@link Material} type at the provided time. + * @param time - The time for which to retrieve the type. + * @returns The type of material. + */ + getType(time: JulianDate): string; + /** + * Gets the value of the property at the provided time. + * @param [time = JulianDate.now()] - The time for which to retrieve the value. If omitted, the current system time is used. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time?: JulianDate, result?: any): any; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; + } + + /** + * A {@link GeometryUpdater} for polylines. + * Clients do not normally create this class directly, but instead rely on {@link DataSourceDisplay}. + * @param entity - The entity containing the geometry to be visualized. + * @param scene - The scene where visualization is taking place. + */ + export class PolylineGeometryUpdater { + constructor(entity: Entity, scene: Scene); + /** + * Gets the unique ID associated with this updater + */ + readonly id: string; + /** + * Gets the entity associated with this geometry. + */ + readonly entity: Entity; + /** + * Gets a value indicating if the geometry has a fill component. + */ + readonly fillEnabled: boolean; + /** + * Gets a value indicating if fill visibility varies with simulation time. + */ + readonly hasConstantFill: boolean; + /** + * Gets the material property used to fill the geometry. + */ + readonly fillMaterialProperty: MaterialProperty; + /** + * Gets the material property used to fill the geometry when it fails the depth test. + */ + readonly depthFailMaterialProperty: MaterialProperty; + /** + * Gets a value indicating if the geometry has an outline component. + */ + readonly outlineEnabled: boolean; + /** + * Gets a value indicating if outline visibility varies with simulation time. + */ + readonly hasConstantOutline: boolean; + /** + * Gets the {@link Color} property for the geometry outline. + */ + readonly outlineColorProperty: Property; + /** + * Gets the property specifying whether the geometry + * casts or receives shadows from light sources. + */ + readonly shadowsProperty: Property; + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this geometry will be displayed. + */ + readonly distanceDisplayConditionProperty: Property; + /** + * Gets or sets the {@link ClassificationType} Property specifying if this geometry will classify terrain, 3D Tiles, or both when on the ground. + */ + readonly classificationTypeProperty: Property; + /** + * Gets a value indicating if the geometry is time-varying. + */ + readonly isDynamic: boolean; + /** + * Gets a value indicating if the geometry is closed. + * This property is only valid for static geometry. + */ + readonly isClosed: boolean; + /** + * Gets an event that is raised whenever the public properties + * of this updater change. + */ + readonly geometryChanged: boolean; + /** + * Gets a value indicating if the path of the line. + */ + readonly arcType: ArcType; + /** + * Gets a value indicating if the geometry is clamped to the ground. + * Returns false if polylines on terrain is not supported. + */ + readonly clampToGround: boolean; + /** + * Gets the zindex + */ + readonly zIndex: number; + /** + * Checks if the geometry is outlined at the provided time. + * @param time - The time for which to retrieve visibility. + * @returns true if geometry is outlined at the provided time, false otherwise. + */ + isOutlineVisible(time: JulianDate): boolean; + /** + * Checks if the geometry is filled at the provided time. + * @param time - The time for which to retrieve visibility. + * @returns true if geometry is filled at the provided time, false otherwise. + */ + isFilled(time: JulianDate): boolean; + /** + * Creates the geometry instance which represents the fill of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @returns The geometry instance representing the filled portion of the geometry. + */ + createFillGeometryInstance(time: JulianDate): GeometryInstance; + /** + * Creates the geometry instance which represents the outline of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @returns The geometry instance representing the outline portion of the geometry. + */ + createOutlineGeometryInstance(time: JulianDate): GeometryInstance; + /** + * Returns true if this object was destroyed; otherwise, false. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys and resources used by the object. Once an object is destroyed, it should not be used. + */ + destroy(): void; + } + + /** + * A {@link MaterialProperty} that maps to polyline glow {@link Material} uniforms. + * @param [options] - Object with the following properties: + * @param [options.color = Color.WHITE] - A Property specifying the {@link Color} of the line. + * @param [options.glowPower = 0.25] - A numeric Property specifying the strength of the glow, as a percentage of the total line width. + * @param [options.taperPower = 1.0] - A numeric Property specifying the strength of the tapering effect, as a percentage of the total line length. If 1.0 or higher, no taper effect is used. + */ + export class PolylineGlowMaterialProperty { + constructor(options?: { + color?: Property | Color; + glowPower?: Property | number; + taperPower?: Property | number; + }); + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the Property specifying the {@link Color} of the line. + */ + color: Property | undefined; + /** + * Gets or sets the numeric Property specifying the strength of the glow, as a percentage of the total line width (less than 1.0). + */ + glowPower: Property | undefined; + /** + * Gets or sets the numeric Property specifying the strength of the tapering effect, as a percentage of the total line length. If 1.0 or higher, no taper effect is used. + */ + taperPower: Property | undefined; + /** + * Gets the {@link Material} type at the provided time. + * @param time - The time for which to retrieve the type. + * @returns The type of material. + */ + getType(time: JulianDate): string; + /** + * Gets the value of the property at the provided time. + * @param [time = JulianDate.now()] - The time for which to retrieve the value. If omitted, the current system time is used. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time?: JulianDate, result?: any): any; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; + } + + export namespace PolylineGraphics { + /** + * Initialization options for the PolylineGraphics constructor + * @property [show = true] - A boolean Property specifying the visibility of the polyline. + * @property [positions] - A Property specifying the array of {@link Cartesian3} positions that define the line strip. + * @property [width = 1.0] - A numeric Property specifying the width in pixels. + * @property [granularity = Cesium.Math.RADIANS_PER_DEGREE] - A numeric Property specifying the angular distance between each latitude and longitude if arcType is not ArcType.NONE. + * @property [material = Color.WHITE] - A Property specifying the material used to draw the polyline. + * @property [depthFailMaterial] - A property specifying the material used to draw the polyline when it is below the terrain. + * @property [arcType = ArcType.GEODESIC] - The type of line the polyline segments must follow. + * @property [clampToGround = false] - A boolean Property specifying whether the Polyline should be clamped to the ground. + * @property [shadows = ShadowMode.DISABLED] - An enum Property specifying whether the polyline casts or receives shadows from light sources. + * @property [distanceDisplayCondition] - A Property specifying at what distance from the camera that this polyline will be displayed. + * @property [classificationType = ClassificationType.BOTH] - An enum Property specifying whether this polyline will classify terrain, 3D Tiles, or both when on the ground. + * @property [zIndex = 0] - A Property specifying the zIndex used for ordering ground geometry. Only has an effect if `clampToGround` is true and polylines on terrain is supported. + */ + type ConstructorOptions = { + show?: Property | boolean; + positions?: Property | Cartesian3[]; + width?: Property | number; + granularity?: Property | number; + material?: MaterialProperty | Color; + depthFailMaterial?: MaterialProperty | Color; + arcType?: Property | ArcType; + clampToGround?: Property | boolean; + shadows?: Property | ShadowMode; + distanceDisplayCondition?: Property | DistanceDisplayCondition; + classificationType?: Property | ClassificationType; + zIndex?: Property | number; + }; + } + + /** + * Describes a polyline. The first two positions define a line segment, + * and each additional position defines a line segment from the previous position. The segments + * can be linear connected points, great arcs, or clamped to terrain. + * @param [options] - Object describing initialization options + */ + export class PolylineGraphics { + constructor(options?: PolylineGraphics.ConstructorOptions); + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the boolean Property specifying the visibility of the polyline. + */ + show: Property | undefined; + /** + * Gets or sets the Property specifying the array of {@link Cartesian3} + * positions that define the line strip. + */ + positions: Property | undefined; + /** + * Gets or sets the numeric Property specifying the width in pixels. + */ + width: Property | undefined; + /** + * Gets or sets the numeric Property specifying the angular distance between each latitude and longitude if arcType is not ArcType.NONE and clampToGround is false. + */ + granularity: Property | undefined; + /** + * Gets or sets the Property specifying the material used to draw the polyline. + */ + material: MaterialProperty; + /** + * Gets or sets the Property specifying the material used to draw the polyline when it fails the depth test. + *

+ * Requires the EXT_frag_depth WebGL extension to render properly. If the extension is not supported, + * there may be artifacts. + *

+ */ + depthFailMaterial: MaterialProperty; + /** + * Gets or sets the {@link ArcType} Property specifying whether the line segments should be great arcs, rhumb lines or linearly connected. + */ + arcType: Property | undefined; + /** + * Gets or sets the boolean Property specifying whether the polyline + * should be clamped to the ground. + */ + clampToGround: Property | undefined; + /** + * Get or sets the enum Property specifying whether the polyline + * casts or receives shadows from light sources. + */ + shadows: Property | undefined; + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this polyline will be displayed. + */ + distanceDisplayCondition: Property | undefined; + /** + * Gets or sets the {@link ClassificationType} Property specifying whether this polyline will classify terrain, 3D Tiles, or both when on the ground. + */ + classificationType: Property | undefined; + /** + * Gets or sets the zIndex Property specifying the ordering of the polyline. Only has an effect if `clampToGround` is true and polylines on terrain is supported. + */ + zIndex: ConstantProperty | undefined; + /** + * Duplicates this instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance if one was not provided. + */ + clone(result?: PolylineGraphics): PolylineGraphics; + /** + * Assigns each unassigned property on this object to the value + * of the same property on the provided source object. + * @param source - The object to be merged into this object. + */ + merge(source: PolylineGraphics): void; + } + + /** + * A {@link MaterialProperty} that maps to polyline outline {@link Material} uniforms. + * @param [options] - Object with the following properties: + * @param [options.color = Color.WHITE] - A Property specifying the {@link Color} of the line. + * @param [options.outlineColor = Color.BLACK] - A Property specifying the {@link Color} of the outline. + * @param [options.outlineWidth = 1.0] - A numeric Property specifying the width of the outline, in pixels. + */ + export class PolylineOutlineMaterialProperty { + constructor(options?: { + color?: Property | Color; + outlineColor?: Property | Color; + outlineWidth?: Property | number; + }); + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the Property specifying the {@link Color} of the line. + */ + color: Property | undefined; + /** + * Gets or sets the Property specifying the {@link Color} of the outline. + */ + outlineColor: Property | undefined; + /** + * Gets or sets the numeric Property specifying the width of the outline. + */ + outlineWidth: Property | undefined; + /** + * Gets the {@link Material} type at the provided time. + * @param time - The time for which to retrieve the type. + * @returns The type of material. + */ + getType(time: JulianDate): string; + /** + * Gets the value of the property at the provided time. + * @param [time = JulianDate.now()] - The time for which to retrieve the value. If omitted, the current system time is used. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time?: JulianDate, result?: any): any; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; + } + + /** + * A visualizer for polylines represented by {@link Primitive} instances. + * @param scene - The scene the primitives will be rendered in. + * @param entityCollection - The entityCollection to visualize. + * @param [primitives = scene.primitives] - A collection to add primitives related to the entities + * @param [groundPrimitives = scene.groundPrimitives] - A collection to add ground primitives related to the entities + */ + export class PolylineVisualizer { + constructor( + scene: Scene, + entityCollection: EntityCollection, + primitives?: PrimitiveCollection, + groundPrimitives?: PrimitiveCollection, + ); + /** + * Updates all of the primitives created by this visualizer to match their + * Entity counterpart at the given time. + * @param time - The time to update to. + * @returns True if the visualizer successfully updated to the provided time, + * false if the visualizer is waiting for asynchronous primitives to be created. + */ + update(time: JulianDate): boolean; + /** + * Returns true if this object was destroyed; otherwise, false. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Removes and destroys all primitives created by this instance. + */ + destroy(): void; + } + + /** + * A {@link GeometryUpdater} for polyline volumes. + * Clients do not normally create this class directly, but instead rely on {@link DataSourceDisplay}. + * @param entity - The entity containing the geometry to be visualized. + * @param scene - The scene where visualization is taking place. + */ + export class PolylineVolumeGeometryUpdater { + constructor(entity: Entity, scene: Scene); + /** + * Creates the geometry instance which represents the fill of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @returns The geometry instance representing the filled portion of the geometry. + */ + createFillGeometryInstance(time: JulianDate): GeometryInstance; + /** + * Creates the geometry instance which represents the outline of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @returns The geometry instance representing the outline portion of the geometry. + */ + createOutlineGeometryInstance(time: JulianDate): GeometryInstance; + } + + export namespace PolylineVolumeGraphics { + /** + * Initialization options for the PolylineVolumeGraphics constructor + * @property [show = true] - A boolean Property specifying the visibility of the volume. + * @property [positions] - A Property specifying the array of {@link Cartesian3} positions which define the line strip. + * @property [shape] - A Property specifying the array of {@link Cartesian2} positions which define the shape to be extruded. + * @property [cornerType = CornerType.ROUNDED] - A {@link CornerType} Property specifying the style of the corners. + * @property [granularity = Cesium.Math.RADIANS_PER_DEGREE] - A numeric Property specifying the angular distance between each latitude and longitude point. + * @property [fill = true] - A boolean Property specifying whether the volume is filled with the provided material. + * @property [material = Color.WHITE] - A Property specifying the material used to fill the volume. + * @property [outline = false] - A boolean Property specifying whether the volume is outlined. + * @property [outlineColor = Color.BLACK] - A Property specifying the {@link Color} of the outline. + * @property [outlineWidth = 1.0] - A numeric Property specifying the width of the outline. + * @property [shadows = ShadowMode.DISABLED] - An enum Property specifying whether the volume casts or receives shadows from light sources. + * @property [distanceDisplayCondition] - A Property specifying at what distance from the camera that this volume will be displayed. + */ + type ConstructorOptions = { + show?: Property | boolean; + positions?: Property | Cartesian3[]; + shape?: Property | Cartesian2[]; + cornerType?: Property | CornerType; + granularity?: Property | number; + fill?: Property | boolean; + material?: MaterialProperty | Color; + outline?: Property | boolean; + outlineColor?: Property | Color; + outlineWidth?: Property | number; + shadows?: Property | ShadowMode; + distanceDisplayCondition?: Property | DistanceDisplayCondition; + }; + } + + /** + * Describes a polyline volume defined as a line strip and corresponding two dimensional shape which is extruded along it. + * The resulting volume conforms to the curvature of the globe. + * @param [options] - Object describing initialization options + */ + export class PolylineVolumeGraphics { + constructor(options?: PolylineVolumeGraphics.ConstructorOptions); + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the boolean Property specifying the visibility of the volume. + */ + show: Property | undefined; + /** + * Gets or sets the Property specifying the array of {@link Cartesian3} positions which define the line strip. + */ + positions: Property | undefined; + /** + * Gets or sets the Property specifying the array of {@link Cartesian2} positions which define the shape to be extruded. + */ + shape: Property | undefined; + /** + * Gets or sets the {@link CornerType} Property specifying the style of the corners. + */ + cornerType: Property | undefined; + /** + * Gets or sets the numeric Property specifying the angular distance between points on the volume. + */ + granularity: Property | undefined; + /** + * Gets or sets the boolean Property specifying whether the volume is filled with the provided material. + */ + fill: Property | undefined; + /** + * Gets or sets the Property specifying the material used to fill the volume. + */ + material: MaterialProperty; + /** + * Gets or sets the Property specifying whether the volume is outlined. + */ + outline: Property | undefined; + /** + * Gets or sets the Property specifying the {@link Color} of the outline. + */ + outlineColor: Property | undefined; + /** + * Gets or sets the numeric Property specifying the width of the outline. + *

+ * Note: This property will be ignored on all major browsers on Windows platforms. For details, see (@link https://github.com/CesiumGS/cesium/issues/40}. + *

+ */ + outlineWidth: Property | undefined; + /** + * Get or sets the enum Property specifying whether the volume + * casts or receives shadows from light sources. + */ + shadows: Property | undefined; + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this volume will be displayed. + */ + distanceDisplayCondition: Property | undefined; + /** + * Duplicates this instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance if one was not provided. + */ + clone(result?: PolylineVolumeGraphics): PolylineVolumeGraphics; + /** + * Assigns each unassigned property on this object to the value + * of the same property on the provided source object. + * @param source - The object to be merged into this object. + */ + merge(source: PolylineVolumeGraphics): void; + } + + /** + * The interface for all {@link Property} objects that define a world + * location as a {@link Cartesian3} with an associated {@link ReferenceFrame}. + * This type defines an interface and cannot be instantiated directly. + */ + export class PositionProperty { + constructor(); + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + */ + readonly definitionChanged: Event; + /** + * Gets the reference frame that the position is defined in. + */ + referenceFrame: ReferenceFrame; + /** + * Gets the value of the property at the provided time in the fixed frame. + * @param [time = JulianDate.now()] - The time for which to retrieve the value. If omitted, the current system time is used. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time?: JulianDate, result?: Cartesian3): Cartesian3 | undefined; + /** + * Gets the value of the property at the provided time and in the provided reference frame. + * @param time - The time for which to retrieve the value. + * @param referenceFrame - The desired referenceFrame of the result. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValueInReferenceFrame( + time: JulianDate, + referenceFrame: ReferenceFrame, + result?: Cartesian3, + ): Cartesian3 | undefined; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; + } + + /** + * A {@link Property} whose value is an array whose items are the computed value + * of other PositionProperty instances. + * @param [value] - An array of Property instances. + * @param [referenceFrame = ReferenceFrame.FIXED] - The reference frame in which the position is defined. + */ + export class PositionPropertyArray { + constructor(value?: Property[], referenceFrame?: ReferenceFrame); + /** + * Gets a value indicating if this property is constant. This property + * is considered constant if all property items in the array are constant. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is changed whenever setValue is called with data different + * than the current value or one of the properties in the array also changes. + */ + readonly definitionChanged: Event; + /** + * Gets the reference frame in which the position is defined. + */ + referenceFrame: ReferenceFrame; + /** + * Gets the value of the property. + * @param [time = JulianDate.now()] - The time for which to retrieve the value. If omitted, the current system time is used. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time?: JulianDate, result?: Cartesian3[]): Cartesian3[]; + /** + * Gets the value of the property at the provided time and in the provided reference frame. + * @param time - The time for which to retrieve the value. + * @param referenceFrame - The desired referenceFrame of the result. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValueInReferenceFrame( + time: JulianDate, + referenceFrame: ReferenceFrame, + result?: Cartesian3[], + ): Cartesian3[]; + /** + * Sets the value of the property. + * @param value - An array of Property instances. + */ + setValue(value: Property[]): void; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; + } + + /** + * The interface for all properties, which represent a value that can optionally vary over time. + * This type defines an interface and cannot be instantiated directly. + */ + export class Property { + constructor(); + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + */ + readonly definitionChanged: Event; + /** + * Gets the value of the property at the provided time. + * @param [time = JulianDate.now()] - The time for which to retrieve the value. If omitted, the current system time is used. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time?: JulianDate, result?: any): any; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; + } + + /** + * A {@link Property} whose value is an array whose items are the computed value + * of other property instances. + * @param [value] - An array of Property instances. + */ + export class PropertyArray { + constructor(value?: Property[]); + /** + * Gets a value indicating if this property is constant. This property + * is considered constant if all property items in the array are constant. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is changed whenever setValue is called with data different + * than the current value or one of the properties in the array also changes. + */ + readonly definitionChanged: Event; + /** + * Gets the value of the property. + * @param [time = JulianDate.now()] - The time for which to retrieve the value. If omitted, the current system time is used. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter, which is an array of values produced by evaluating each of the contained properties at the given time or a new instance if the result parameter was not supplied. + */ + getValue(time?: JulianDate, result?: object[]): object[]; + /** + * Sets the value of the property. + * @param value - An array of Property instances. + */ + setValue(value: Property[]): void; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; + } + + export interface PropertyBag extends Record {} + + /** + * A {@link Property} whose value is a key-value mapping of property names to the computed value of other properties. + * @param [value] - An object, containing key-value mapping of property names to properties. + * @param [createPropertyCallback] - A function that will be called when the value of any of the properties in value are not a Property. + */ + export class PropertyBag implements Record { + constructor( + value?: any, + createPropertyCallback?: (...params: any[]) => any, + ); + /** + * Gets the names of all properties registered on this instance. + */ + propertyNames: any[]; + /** + * Gets a value indicating if this property is constant. This property + * is considered constant if all property items in this object are constant. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the set of properties contained in this + * object changes, or one of the properties itself changes. + */ + readonly definitionChanged: Event; + /** + * Determines if this object has defined a property with the given name. + * @param propertyName - The name of the property to check for. + * @returns True if this object has defined a property with the given name, false otherwise. + */ + hasProperty(propertyName: string): boolean; + /** + * Adds a property to this object. + * @param propertyName - The name of the property to add. + * @param [value] - The value of the new property, if provided. + * @param [createPropertyCallback] - A function that will be called when the value of this new property is set to a value that is not a Property. + */ + addProperty( + propertyName: string, + value?: any, + createPropertyCallback?: (...params: any[]) => any, + ): void; + /** + * Removed a property previously added with addProperty. + * @param propertyName - The name of the property to remove. + */ + removeProperty(propertyName: string): void; + /** + * Gets the value of this property. Each contained property will be evaluated at the given time, and the overall + * result will be an object, mapping property names to those values. + * @param [time = JulianDate.now()] - The time for which to retrieve the value. If omitted, the current system time is used. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * Note that any properties in result which are not part of this PropertyBag will be left as-is. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time?: JulianDate, result?: any): any; + /** + * Assigns each unassigned property on this object to the value + * of the same property on the provided source object. + * @param source - The object to be merged into this object. + * @param [createPropertyCallback] - A function that will be called when the value of any of the properties in value are not a Property. + */ + merge( + source: any, + createPropertyCallback?: (...params: any[]) => any, + ): void; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; + } + + /** + * A {@link GeometryUpdater} for rectangles. + * Clients do not normally create this class directly, but instead rely on {@link DataSourceDisplay}. + * @param entity - The entity containing the geometry to be visualized. + * @param scene - The scene where visualization is taking place. + */ + export class RectangleGeometryUpdater { + constructor(entity: Entity, scene: Scene); + /** + * Creates the geometry instance which represents the fill of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @returns The geometry instance representing the filled portion of the geometry. + */ + createFillGeometryInstance(time: JulianDate): GeometryInstance; + /** + * Creates the geometry instance which represents the outline of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @returns The geometry instance representing the outline portion of the geometry. + */ + createOutlineGeometryInstance(time: JulianDate): GeometryInstance; + } + + export namespace RectangleGraphics { + /** + * Initialization options for the RectangleGraphics constructor + * @property [show = true] - A boolean Property specifying the visibility of the rectangle. + * @property [coordinates] - The Property specifying the {@link Rectangle}. + * @property [height = 0] - A numeric Property specifying the altitude of the rectangle relative to the ellipsoid surface. + * @property [heightReference = HeightReference.NONE] - A Property specifying what the height is relative to. + * @property [extrudedHeight] - A numeric Property specifying the altitude of the rectangle's extruded face relative to the ellipsoid surface. + * @property [extrudedHeightReference = HeightReference.NONE] - A Property specifying what the extrudedHeight is relative to. + * @property [rotation = 0.0] - A numeric property specifying the rotation of the rectangle clockwise from north. + * @property [stRotation = 0.0] - A numeric property specifying the rotation of the rectangle texture counter-clockwise from north. + * @property [granularity = Cesium.Math.RADIANS_PER_DEGREE] - A numeric Property specifying the angular distance between points on the rectangle. + * @property [fill = true] - A boolean Property specifying whether the rectangle is filled with the provided material. + * @property [material = Color.WHITE] - A Property specifying the material used to fill the rectangle. + * @property [outline = false] - A boolean Property specifying whether the rectangle is outlined. + * @property [outlineColor = Color.BLACK] - A Property specifying the {@link Color} of the outline. + * @property [outlineWidth = 1.0] - A numeric Property specifying the width of the outline. + * @property [shadows = ShadowMode.DISABLED] - An enum Property specifying whether the rectangle casts or receives shadows from light sources. + * @property [distanceDisplayCondition] - A Property specifying at what distance from the camera that this rectangle will be displayed. + * @property [classificationType = ClassificationType.BOTH] - An enum Property specifying whether this rectangle will classify terrain, 3D Tiles, or both when on the ground. + * @property [zIndex = 0] - A Property specifying the zIndex used for ordering ground geometry. Only has an effect if the rectangle is constant and neither height or extrudedHeight are specified. + */ + type ConstructorOptions = { + show?: Property | boolean; + coordinates?: Property | Rectangle; + height?: Property | number; + heightReference?: Property | HeightReference; + extrudedHeight?: Property | number; + extrudedHeightReference?: Property | HeightReference; + rotation?: Property | number; + stRotation?: Property | number; + granularity?: Property | number; + fill?: Property | boolean; + material?: MaterialProperty | Color; + outline?: Property | boolean; + outlineColor?: Property | Color; + outlineWidth?: Property | number; + shadows?: Property | ShadowMode; + distanceDisplayCondition?: Property | DistanceDisplayCondition; + classificationType?: Property | ClassificationType; + zIndex?: Property | number; + }; + } + + /** + * Describes graphics for a {@link Rectangle}. + * The rectangle conforms to the curvature of the globe and can be placed on the surface or + * at altitude and can optionally be extruded into a volume. + * @param [options] - Object describing initialization options + */ + export class RectangleGraphics { + constructor(options?: RectangleGraphics.ConstructorOptions); + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the boolean Property specifying the visibility of the rectangle. + */ + show: Property | undefined; + /** + * Gets or sets the Property specifying the {@link Rectangle}. + */ + coordinates: Property | undefined; + /** + * Gets or sets the numeric Property specifying the altitude of the rectangle. + */ + height: Property | undefined; + /** + * Gets or sets the Property specifying the {@link HeightReference}. + */ + heightReference: Property | undefined; + /** + * Gets or sets the numeric Property specifying the altitude of the rectangle extrusion. + * Setting this property creates volume starting at height and ending at this altitude. + */ + extrudedHeight: Property | undefined; + /** + * Gets or sets the Property specifying the extruded {@link HeightReference}. + */ + extrudedHeightReference: Property | undefined; + /** + * Gets or sets the numeric property specifying the rotation of the rectangle clockwise from north. + */ + rotation: Property | undefined; + /** + * Gets or sets the numeric property specifying the rotation of the rectangle texture counter-clockwise from north. + */ + stRotation: Property | undefined; + /** + * Gets or sets the numeric Property specifying the angular distance between points on the rectangle. + */ + granularity: Property | undefined; + /** + * Gets or sets the boolean Property specifying whether the rectangle is filled with the provided material. + */ + fill: Property | undefined; + /** + * Gets or sets the Property specifying the material used to fill the rectangle. + */ + material: MaterialProperty; + /** + * Gets or sets the Property specifying whether the rectangle is outlined. + */ + outline: Property | undefined; + /** + * Gets or sets the Property specifying the {@link Color} of the outline. + */ + outlineColor: Property | undefined; + /** + * Gets or sets the numeric Property specifying the width of the outline. + *

+ * Note: This property will be ignored on all major browsers on Windows platforms. For details, see (@link https://github.com/CesiumGS/cesium/issues/40}. + *

+ */ + outlineWidth: Property | undefined; + /** + * Get or sets the enum Property specifying whether the rectangle + * casts or receives shadows from light sources. + */ + shadows: Property | undefined; + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this rectangle will be displayed. + */ + distanceDisplayCondition: Property | undefined; + /** + * Gets or sets the {@link ClassificationType} Property specifying whether this rectangle will classify terrain, 3D Tiles, or both when on the ground. + */ + classificationType: Property | undefined; + /** + * Gets or sets the zIndex Property specifying the ordering of the rectangle. Only has an effect if the rectangle is constant and neither height or extrudedHeight are specified. + */ + zIndex: ConstantProperty | undefined; + /** + * Duplicates this instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance if one was not provided. + */ + clone(result?: RectangleGraphics): RectangleGraphics; + /** + * Assigns each unassigned property on this object to the value + * of the same property on the provided source object. + * @param source - The object to be merged into this object. + */ + merge(source: RectangleGraphics): void; + } + + /** + * A {@link Property} which transparently links to another property on a provided object. + * @example + * const collection = new Cesium.EntityCollection(); + * + * //Create a new entity and assign a billboard scale. + * const object1 = new Cesium.Entity({id:'object1'}); + * object1.billboard = new Cesium.BillboardGraphics(); + * object1.billboard.scale = new Cesium.ConstantProperty(2.0); + * collection.add(object1); + * + * //Create a second entity and reference the scale from the first one. + * const object2 = new Cesium.Entity({id:'object2'}); + * object2.model = new Cesium.ModelGraphics(); + * object2.model.scale = new Cesium.ReferenceProperty(collection, 'object1', ['billboard', 'scale']); + * collection.add(object2); + * + * //Create a third object, but use the fromString helper function. + * const object3 = new Cesium.Entity({id:'object3'}); + * object3.billboard = new Cesium.BillboardGraphics(); + * object3.billboard.scale = Cesium.ReferenceProperty.fromString(collection, 'object1#billboard.scale'); + * collection.add(object3); + * + * //You can refer to an entity with a # or . in id and property names by escaping them. + * const object4 = new Cesium.Entity({id:'#object.4'}); + * object4.billboard = new Cesium.BillboardGraphics(); + * object4.billboard.scale = new Cesium.ConstantProperty(2.0); + * collection.add(object4); + * + * const object5 = new Cesium.Entity({id:'object5'}); + * object5.billboard = new Cesium.BillboardGraphics(); + * object5.billboard.scale = Cesium.ReferenceProperty.fromString(collection, '\\#object\\.4#billboard.scale'); + * collection.add(object5); + * @param targetCollection - The entity collection which will be used to resolve the reference. + * @param targetId - The id of the entity which is being referenced. + * @param targetPropertyNames - The names of the property on the target entity which we will use. + */ + export class ReferenceProperty { + constructor( + targetCollection: EntityCollection, + targetId: string, + targetPropertyNames: string[], + ); + /** + * Gets a value indicating if this property is constant. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is changed whenever the referenced property's definition is changed. + */ + readonly definitionChanged: Event; + /** + * Gets the reference frame that the position is defined in. + * This property is only valid if the referenced property is a {@link PositionProperty}. + */ + readonly referenceFrame: ReferenceFrame; + /** + * Gets the id of the entity being referenced. + */ + readonly targetId: string; + /** + * Gets the collection containing the entity being referenced. + */ + readonly targetCollection: EntityCollection; + /** + * Gets the array of property names used to retrieve the referenced property. + */ + readonly targetPropertyNames: any; + /** + * Gets the resolved instance of the underlying referenced property. + */ + readonly resolvedProperty: Property | undefined; + /** + * Creates a new instance given the entity collection that will + * be used to resolve it and a string indicating the target entity id and property. + * The format of the string is "objectId#foo.bar", where # separates the id from + * property path and . separates sub-properties. If the reference identifier or + * or any sub-properties contains a # . or \ they must be escaped. + * @returns A new instance of ReferenceProperty. + */ + static fromString( + targetCollection: EntityCollection, + referenceString: string, + ): ReferenceProperty; + /** + * Gets the value of the property at the provided time. + * @param [time = JulianDate.now()] - The time for which to retrieve the value. If omitted, the current system time is used. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time?: JulianDate, result?: any): any; + /** + * Gets the value of the property at the provided time and in the provided reference frame. + * This method is only valid if the property being referenced is a {@link PositionProperty}. + * @param time - The time for which to retrieve the value. + * @param referenceFrame - The desired referenceFrame of the result. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValueInReferenceFrame( + time: JulianDate, + referenceFrame: ReferenceFrame, + result?: Cartesian3, + ): Cartesian3; + /** + * Gets the {@link Material} type at the provided time. + * This method is only valid if the property being referenced is a {@link MaterialProperty}. + * @param time - The time for which to retrieve the type. + * @returns The type of material. + */ + getType(time: JulianDate): string; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; + } + + export namespace Rotation { + /** + * The number of elements used to pack the object into an array. + */ + var packedLength: number; + /** + * Stores the provided instance into the provided array. + * @param value - The value to pack. + * @param array - The array to pack into. + * @param [startingIndex = 0] - The index into the array at which to start packing the elements. + * @returns The array that was packed into + */ + function pack( + value: Rotation, + array: number[], + startingIndex?: number, + ): number[]; + /** + * Retrieves an instance from a packed array. + * @param array - The packed array. + * @param [startingIndex = 0] - The starting index of the element to be unpacked. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new Rotation instance if one was not provided. + */ + function unpack( + array: number[], + startingIndex?: number, + result?: Rotation, + ): Rotation; + /** + * Converts a packed array into a form suitable for interpolation. + * @param packedArray - The packed array. + * @param [startingIndex = 0] - The index of the first element to be converted. + * @param [lastIndex = packedArray.length] - The index of the last element to be converted. + * @param [result] - The object into which to store the result. + */ + function convertPackedArrayForInterpolation( + packedArray: number[], + startingIndex?: number, + lastIndex?: number, + result?: number[], + ): void; + /** + * Retrieves an instance from a packed array converted with {@link Rotation.convertPackedArrayForInterpolation}. + * @param array - The array previously packed for interpolation. + * @param sourceArray - The original packed array. + * @param [firstIndex = 0] - The firstIndex used to convert the array. + * @param [lastIndex = packedArray.length] - The lastIndex used to convert the array. + * @param [result] - The object into which to store the result. + * @returns The modified result parameter or a new Rotation instance if one was not provided. + */ + function unpackInterpolationResult( + array: number[], + sourceArray: number[], + firstIndex?: number, + lastIndex?: number, + result?: Rotation, + ): Rotation; + } + + /** + * Represents a {@link Packable} number that always interpolates values + * towards the shortest angle of rotation. This object is never used directly + * but is instead passed to the constructor of {@link SampledProperty} + * in order to represent a two-dimensional angle of rotation. + * @example + * const time1 = Cesium.JulianDate.fromIso8601('2010-05-07T00:00:00'); + * const time2 = Cesium.JulianDate.fromIso8601('2010-05-07T00:01:00'); + * const time3 = Cesium.JulianDate.fromIso8601('2010-05-07T00:02:00'); + * + * const property = new Cesium.SampledProperty(Cesium.Rotation); + * property.addSample(time1, 0); + * property.addSample(time3, Cesium.Math.toRadians(350)); + * + * //Getting the value at time2 will equal 355 degrees instead + * //of 175 degrees (which is what you get if you construct + * //a SampledProperty(Number) instead. Note, the actual + * //return value is in radians, not degrees. + * property.getValue(time2); + */ + export interface Rotation {} + + /** + * A {@link SampledProperty} which is also a {@link PositionProperty}. + * @param [referenceFrame = ReferenceFrame.FIXED] - The reference frame in which the position is defined. + * @param [numberOfDerivatives = 0] - The number of derivatives that accompany each position; i.e. velocity, acceleration, etc... + */ + export class SampledPositionProperty { + constructor(referenceFrame?: ReferenceFrame, numberOfDerivatives?: number); + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + */ + readonly definitionChanged: Event; + /** + * Gets the reference frame in which the position is defined. + */ + referenceFrame: ReferenceFrame; + /** + * Gets the degree of interpolation to perform when retrieving a value. Call setInterpolationOptions to set this. + */ + readonly interpolationDegree: number; + /** + * Gets the interpolation algorithm to use when retrieving a value. Call setInterpolationOptions to set this. + */ + readonly interpolationAlgorithm: InterpolationAlgorithm; + /** + * The number of derivatives contained by this property; i.e. 0 for just position, 1 for velocity, etc. + */ + numberOfDerivatives: number; + /** + * Gets or sets the type of extrapolation to perform when a value + * is requested at a time after any available samples. + */ + forwardExtrapolationType: ExtrapolationType; + /** + * Gets or sets the amount of time to extrapolate forward before + * the property becomes undefined. A value of 0 will extrapolate forever. + */ + forwardExtrapolationDuration: number; + /** + * Gets or sets the type of extrapolation to perform when a value + * is requested at a time before any available samples. + */ + backwardExtrapolationType: ExtrapolationType; + /** + * Gets or sets the amount of time to extrapolate backward + * before the property becomes undefined. A value of 0 will extrapolate forever. + */ + backwardExtrapolationDuration: number; + /** + * Gets the position at the provided time. + * @param [time = JulianDate.now()] - The time for which to retrieve the value. If omitted, the current system time is used. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time?: JulianDate, result?: Cartesian3): Cartesian3 | undefined; + /** + * Gets the position at the provided time and in the provided reference frame. + * @param time - The time for which to retrieve the value. + * @param referenceFrame - The desired referenceFrame of the result. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValueInReferenceFrame( + time: JulianDate, + referenceFrame: ReferenceFrame, + result?: Cartesian3, + ): Cartesian3 | undefined; + /** + * Sets the algorithm and degree to use when interpolating a position. + * @param [options] - Object with the following properties: + * @param [options.interpolationAlgorithm] - The new interpolation algorithm. If undefined, the existing property will be unchanged. + * @param [options.interpolationDegree] - The new interpolation degree. If undefined, the existing property will be unchanged. + */ + setInterpolationOptions(options?: { + interpolationAlgorithm?: InterpolationAlgorithm; + interpolationDegree?: number; + }): void; + /** + * Adds a new sample. + * @param time - The sample time. + * @param position - The position at the provided time. + * @param [derivatives] - The array of derivative values at the provided time. + */ + addSample( + time: JulianDate, + position: Cartesian3, + derivatives?: Cartesian3[], + ): void; + /** + * Adds multiple samples via parallel arrays. + * @param times - An array of JulianDate instances where each index is a sample time. + * @param positions - An array of Cartesian3 position instances, where each value corresponds to the provided time index. + * @param [derivatives] - An array where each value is another array containing derivatives for the corresponding time index. + */ + addSamples( + times: JulianDate[], + positions: Cartesian3[], + derivatives?: any[][], + ): void; + /** + * Adds samples as a single packed array where each new sample is represented as a date, + * followed by the packed representation of the corresponding value and derivatives. + * @param packedSamples - The array of packed samples. + * @param [epoch] - If any of the dates in packedSamples are numbers, they are considered an offset from this epoch, in seconds. + */ + addSamplesPackedArray(packedSamples: number[], epoch?: JulianDate): void; + /** + * Removes a sample at the given time, if present. + * @param time - The sample time. + * @returns true if a sample at time was removed, false otherwise. + */ + removeSample(time: JulianDate): boolean; + /** + * Removes all samples for the given time interval. + * @param time - The time interval for which to remove all samples. + */ + removeSamples(time: TimeInterval): void; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; + } + + /** + * A {@link Property} whose value is interpolated for a given time from the + * provided set of samples and specified interpolation algorithm and degree. + * @example + * //Create a linearly interpolated Cartesian2 + * const property = new Cesium.SampledProperty(Cesium.Cartesian2); + * + * //Populate it with data + * property.addSample(Cesium.JulianDate.fromIso8601('2012-08-01T00:00:00.00Z'), new Cesium.Cartesian2(0, 0)); + * property.addSample(Cesium.JulianDate.fromIso8601('2012-08-02T00:00:00.00Z'), new Cesium.Cartesian2(4, 7)); + * + * //Retrieve an interpolated value + * const result = property.getValue(Cesium.JulianDate.fromIso8601('2012-08-01T12:00:00.00Z')); + * @example + * //Create a simple numeric SampledProperty that uses third degree Hermite Polynomial Approximation + * const property = new Cesium.SampledProperty(Number); + * property.setInterpolationOptions({ + * interpolationDegree : 3, + * interpolationAlgorithm : Cesium.HermitePolynomialApproximation + * }); + * + * //Populate it with data + * property.addSample(Cesium.JulianDate.fromIso8601('2012-08-01T00:00:00.00Z'), 1.0); + * property.addSample(Cesium.JulianDate.fromIso8601('2012-08-01T00:01:00.00Z'), 6.0); + * property.addSample(Cesium.JulianDate.fromIso8601('2012-08-01T00:02:00.00Z'), 12.0); + * property.addSample(Cesium.JulianDate.fromIso8601('2012-08-01T00:03:30.00Z'), 5.0); + * property.addSample(Cesium.JulianDate.fromIso8601('2012-08-01T00:06:30.00Z'), 2.0); + * + * //Samples can be added in any order. + * property.addSample(Cesium.JulianDate.fromIso8601('2012-08-01T00:00:30.00Z'), 6.2); + * + * //Retrieve an interpolated value + * const result = property.getValue(Cesium.JulianDate.fromIso8601('2012-08-01T00:02:34.00Z')); + * @param type - The type of property. + * @param [derivativeTypes] - When supplied, indicates that samples will contain derivative information of the specified types. + */ + export class SampledProperty { + constructor(type: number | Packable, derivativeTypes?: Packable[]); + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + */ + readonly definitionChanged: Event; + /** + * Gets the type of property. + */ + type: any; + /** + * Gets the derivative types used by this property. + */ + derivativeTypes: Packable[]; + /** + * Gets the degree of interpolation to perform when retrieving a value. + */ + interpolationDegree: number; + /** + * Gets the interpolation algorithm to use when retrieving a value. + */ + interpolationAlgorithm: InterpolationAlgorithm; + /** + * Gets or sets the type of extrapolation to perform when a value + * is requested at a time after any available samples. + */ + forwardExtrapolationType: ExtrapolationType; + /** + * Gets or sets the amount of time to extrapolate forward before + * the property becomes undefined. A value of 0 will extrapolate forever. + */ + forwardExtrapolationDuration: number; + /** + * Gets or sets the type of extrapolation to perform when a value + * is requested at a time before any available samples. + */ + backwardExtrapolationType: ExtrapolationType; + /** + * Gets or sets the amount of time to extrapolate backward + * before the property becomes undefined. A value of 0 will extrapolate forever. + */ + backwardExtrapolationDuration: number; + /** + * Gets the value of the property at the provided time. + * @param [time = JulianDate.now()] - The time for which to retrieve the value. If omitted, the current system time is used. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time?: JulianDate, result?: any): any; + /** + * Sets the algorithm and degree to use when interpolating a value. + * @param [options] - Object with the following properties: + * @param [options.interpolationAlgorithm] - The new interpolation algorithm. If undefined, the existing property will be unchanged. + * @param [options.interpolationDegree] - The new interpolation degree. If undefined, the existing property will be unchanged. + */ + setInterpolationOptions(options?: { + interpolationAlgorithm?: InterpolationAlgorithm; + interpolationDegree?: number; + }): void; + /** + * Adds a new sample. + * @param time - The sample time. + * @param value - The value at the provided time. + * @param [derivatives] - The array of derivatives at the provided time. + */ + addSample( + time: JulianDate, + value: Packable, + derivatives?: Packable[], + ): void; + /** + * Adds an array of samples. + * @param times - An array of JulianDate instances where each index is a sample time. + * @param values - The array of values, where each value corresponds to the provided times index. + * @param [derivativeValues] - An array where each item is the array of derivatives at the equivalent time index. + */ + addSamples( + times: JulianDate[], + values: Packable[], + derivativeValues?: any[][], + ): void; + /** + * Retrieves the time of the provided sample associated with the index. A negative index accesses the list of samples in reverse order. + * @param index - The index of samples list. + * @returns The JulianDate time of the sample, or undefined if failed. + */ + getSample(index: number): JulianDate | undefined; + /** + * Adds samples as a single packed array where each new sample is represented as a date, + * followed by the packed representation of the corresponding value and derivatives. + * @param packedSamples - The array of packed samples. + * @param [epoch] - If any of the dates in packedSamples are numbers, they are considered an offset from this epoch, in seconds. + */ + addSamplesPackedArray(packedSamples: number[], epoch?: JulianDate): void; + /** + * Removes a sample at the given time, if present. + * @param time - The sample time. + * @returns true if a sample at time was removed, false otherwise. + */ + removeSample(time: JulianDate): boolean; + /** + * Removes all samples for the given time interval. + * @param time - The time interval for which to remove all samples. + */ + removeSamples(time: TimeInterval): void; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; + } + + /** + * A {@link MaterialProperty} that maps to stripe {@link Material} uniforms. + * @param [options] - Object with the following properties: + * @param [options.orientation = StripeOrientation.HORIZONTAL] - A Property specifying the {@link StripeOrientation}. + * @param [options.evenColor = Color.WHITE] - A Property specifying the first {@link Color}. + * @param [options.oddColor = Color.BLACK] - A Property specifying the second {@link Color}. + * @param [options.offset = 0] - A numeric Property specifying how far into the pattern to start the material. + * @param [options.repeat = 1] - A numeric Property specifying how many times the stripes repeat. + */ + export class StripeMaterialProperty { + constructor(options?: { + orientation?: Property | StripeOrientation; + evenColor?: Property | Color; + oddColor?: Property | Color; + offset?: Property | number; + repeat?: Property | number; + }); + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the Property specifying the {@link StripeOrientation}/ + */ + orientation: Property | undefined; + /** + * Gets or sets the Property specifying the first {@link Color}. + */ + evenColor: Property | undefined; + /** + * Gets or sets the Property specifying the second {@link Color}. + */ + oddColor: Property | undefined; + /** + * Gets or sets the numeric Property specifying the point into the pattern + * to begin drawing; with 0.0 being the beginning of the even color, 1.0 the beginning + * of the odd color, 2.0 being the even color again, and any multiple or fractional values + * being in between. + */ + offset: Property | undefined; + /** + * Gets or sets the numeric Property specifying how many times the stripes repeat. + */ + repeat: Property | undefined; + /** + * Gets the {@link Material} type at the provided time. + * @param time - The time for which to retrieve the type. + * @returns The type of material. + */ + getType(time: JulianDate): string; + /** + * Gets the value of the property at the provided time. + * @param [time = JulianDate.now()] - The time for which to retrieve the value. If omitted, the current system time is used. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time?: JulianDate, result?: any): any; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; + } + + /** + * Defined the orientation of stripes in {@link StripeMaterialProperty}. + */ + export enum StripeOrientation { + /** + * Horizontal orientation. + */ + HORIZONTAL = 0, + /** + * Vertical orientation. + */ + VERTICAL = 1, + } + + /** + * A {@link TimeIntervalCollectionProperty} which is also a {@link PositionProperty}. + * @param [referenceFrame = ReferenceFrame.FIXED] - The reference frame in which the position is defined. + */ + export class TimeIntervalCollectionPositionProperty { + constructor(referenceFrame?: ReferenceFrame); + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is considered to have changed if a call to getValue would return + * a different result for the same time. + */ + readonly definitionChanged: Event; + /** + * Gets the interval collection. + */ + readonly intervals: TimeIntervalCollection; + /** + * Gets the reference frame in which the position is defined. + */ + readonly referenceFrame: ReferenceFrame; + /** + * Gets the value of the property at the provided time in the fixed frame. + * @param [time = JulianDate.now()] - The time for which to retrieve the value. If omitted, the current system time is used. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time?: JulianDate, result?: any): Cartesian3 | undefined; + /** + * Gets the value of the property at the provided time and in the provided reference frame. + * @param time - The time for which to retrieve the value. + * @param referenceFrame - The desired referenceFrame of the result. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValueInReferenceFrame( + time: JulianDate, + referenceFrame: ReferenceFrame, + result?: Cartesian3, + ): Cartesian3 | undefined; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; + } + + /** + * A {@link Property} which is defined by a {@link TimeIntervalCollection}, where the + * data property of each {@link TimeInterval} represents the value at time. + * @example + * //Create a Cartesian2 interval property which contains data on August 1st, 2012 + * //and uses a different value every 6 hours. + * const composite = new Cesium.TimeIntervalCollectionProperty(); + * composite.intervals.addInterval(Cesium.TimeInterval.fromIso8601({ + * iso8601 : '2012-08-01T00:00:00.00Z/2012-08-01T06:00:00.00Z', + * isStartIncluded : true, + * isStopIncluded : false, + * data : new Cesium.Cartesian2(2.0, 3.4) + * })); + * composite.intervals.addInterval(Cesium.TimeInterval.fromIso8601({ + * iso8601 : '2012-08-01T06:00:00.00Z/2012-08-01T12:00:00.00Z', + * isStartIncluded : true, + * isStopIncluded : false, + * data : new Cesium.Cartesian2(12.0, 2.7) + * })); + * composite.intervals.addInterval(Cesium.TimeInterval.fromIso8601({ + * iso8601 : '2012-08-01T12:00:00.00Z/2012-08-01T18:00:00.00Z', + * isStartIncluded : true, + * isStopIncluded : false, + * data : new Cesium.Cartesian2(5.0, 12.4) + * })); + * composite.intervals.addInterval(Cesium.TimeInterval.fromIso8601({ + * iso8601 : '2012-08-01T18:00:00.00Z/2012-08-02T00:00:00.00Z', + * isStartIncluded : true, + * isStopIncluded : true, + * data : new Cesium.Cartesian2(85.0, 4.1) + * })); + */ + export class TimeIntervalCollectionProperty { + constructor(); + /** + * Gets a value indicating if this property is constant. A property is considered + * constant if getValue always returns the same result for the current definition. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + * The definition is changed whenever setValue is called with data different + * than the current value. + */ + readonly definitionChanged: Event; + /** + * Gets the interval collection. + */ + readonly intervals: TimeIntervalCollection; + /** + * Gets the value of the property at the provided time. + * @param [time = JulianDate.now()] - The time for which to retrieve the value. If omitted, the current system time is used. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time?: JulianDate, result?: any): any; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; + } + + /** + * A {@link Property} which evaluates to a {@link Quaternion} rotation + * based on the velocity of the provided {@link PositionProperty}. + * @example + * //Create an entity with position and orientation. + * const position = new Cesium.SampledProperty(); + * position.addSamples(...); + * const entity = viewer.entities.add({ + * position : position, + * orientation : new Cesium.VelocityOrientationProperty(position) + * })); + * @param [position] - The position property used to compute the orientation. + * @param [ellipsoid = Ellipsoid.default] - The ellipsoid used to determine which way is up. + */ + export class VelocityOrientationProperty { + constructor(position?: PositionProperty, ellipsoid?: Ellipsoid); + /** + * Gets a value indicating if this property is constant. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the position property used to compute orientation. + */ + position: Property | undefined; + /** + * Gets or sets the ellipsoid used to determine which way is up. + */ + ellipsoid: Property | undefined; + /** + * Gets the value of the property at the provided time. + * @param [time = JulianDate.now()] - The time for which to retrieve the value. If omitted, the current system time is used. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time?: JulianDate, result?: Quaternion): Quaternion; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; + } + + /** + * A {@link Property} which evaluates to a {@link Cartesian3} vector + * based on the velocity of the provided {@link PositionProperty}. + * @example + * //Create an entity with a billboard rotated to match its velocity. + * const position = new Cesium.SampledProperty(); + * position.addSamples(...); + * const entity = viewer.entities.add({ + * position : position, + * billboard : { + * image : 'image.png', + * alignedAxis : new Cesium.VelocityVectorProperty(position, true) // alignedAxis must be a unit vector + * } + * })); + * @param [position] - The position property used to compute the velocity. + * @param [normalize = true] - Whether to normalize the computed velocity vector. + */ + export class VelocityVectorProperty { + constructor(position?: PositionProperty, normalize?: boolean); + /** + * Gets a value indicating if this property is constant. + */ + readonly isConstant: boolean; + /** + * Gets the event that is raised whenever the definition of this property changes. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the position property used to compute the velocity vector. + */ + position: Property | undefined; + /** + * Gets or sets whether the vector produced by this property + * will be normalized or not. + */ + normalize: boolean; + /** + * Gets the value of the property at the provided time. + * @param [time = JulianDate.now()] - The time for which to retrieve the value. If omitted, the current system time is used. + * @param [result] - The object to store the value into, if omitted, a new instance is created and returned. + * @returns The modified result parameter or a new instance if the result parameter was not supplied. + */ + getValue(time?: JulianDate, result?: Cartesian3): Cartesian3; + /** + * Compares this property to the provided property and returns + * true if they are equal, false otherwise. + * @param [other] - The other property. + * @returns true if left and right are equal, false otherwise. + */ + equals(other?: Property): boolean; + } + + /** + * Defines the interface for visualizers. Visualizers are plug-ins to + * {@link DataSourceDisplay} that render data associated with + * {@link DataSource} instances. + * This object is an interface for documentation purposes and is not intended + * to be instantiated directly. + */ + export class Visualizer { + constructor(); + /** + * Updates the visualization to the provided time. + * @param time - The time. + * @returns True if the display was updated to the provided time, + * false if the visualizer is waiting for an asynchronous operation to + * complete before data can be updated. + */ + update(time: JulianDate): boolean; + /** + * Returns true if this object was destroyed; otherwise, false. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Removes all visualization and cleans up any resources associated with this instance. + */ + destroy(): void; + } + + /** + * A {@link GeometryUpdater} for walls. + * Clients do not normally create this class directly, but instead rely on {@link DataSourceDisplay}. + * @param entity - The entity containing the geometry to be visualized. + * @param scene - The scene where visualization is taking place. + */ + export class WallGeometryUpdater { + constructor(entity: Entity, scene: Scene); + /** + * Creates the geometry instance which represents the fill of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @returns The geometry instance representing the filled portion of the geometry. + */ + createFillGeometryInstance(time: JulianDate): GeometryInstance; + /** + * Creates the geometry instance which represents the outline of the geometry. + * @param time - The time to use when retrieving initial attribute values. + * @returns The geometry instance representing the outline portion of the geometry. + */ + createOutlineGeometryInstance(time: JulianDate): GeometryInstance; + } + + export namespace WallGraphics { + /** + * Initialization options for the WallGraphics constructor + * @property [show = true] - A boolean Property specifying the visibility of the wall. + * @property [positions] - A Property specifying the array of {@link Cartesian3} positions which define the top of the wall. + * @property [minimumHeights] - A Property specifying an array of heights to be used for the bottom of the wall instead of the globe surface. + * @property [maximumHeights] - A Property specifying an array of heights to be used for the top of the wall instead of the height of each position. + * @property [granularity = Cesium.Math.RADIANS_PER_DEGREE] - A numeric Property specifying the angular distance between each latitude and longitude point. + * @property [fill = true] - A boolean Property specifying whether the wall is filled with the provided material. + * @property [material = Color.WHITE] - A Property specifying the material used to fill the wall. + * @property [outline = false] - A boolean Property specifying whether the wall is outlined. + * @property [outlineColor = Color.BLACK] - A Property specifying the {@link Color} of the outline. + * @property [outlineWidth = 1.0] - A numeric Property specifying the width of the outline. + * @property [shadows = ShadowMode.DISABLED] - An enum Property specifying whether the wall casts or receives shadows from light sources. + * @property [distanceDisplayCondition] - A Property specifying at what distance from the camera that this wall will be displayed. + */ + type ConstructorOptions = { + show?: Property | boolean; + positions?: Property | Cartesian3[]; + minimumHeights?: Property | number[]; + maximumHeights?: Property | number[]; + granularity?: Property | number; + fill?: Property | boolean; + material?: MaterialProperty | Color; + outline?: Property | boolean; + outlineColor?: Property | Color; + outlineWidth?: Property | number; + shadows?: Property | ShadowMode; + distanceDisplayCondition?: Property | DistanceDisplayCondition; + }; + } + + /** + * Describes a two dimensional wall defined as a line strip and optional maximum and minimum heights. + * The wall conforms to the curvature of the globe and can be placed along the surface or at altitude. + * @param [options] - Object describing initialization options + */ + export class WallGraphics { + constructor(options?: WallGraphics.ConstructorOptions); + /** + * Gets the event that is raised whenever a property or sub-property is changed or modified. + */ + readonly definitionChanged: Event; + /** + * Gets or sets the boolean Property specifying the visibility of the wall. + */ + show: Property | undefined; + /** + * Gets or sets the Property specifying the array of {@link Cartesian3} positions which define the top of the wall. + */ + positions: Property | undefined; + /** + * Gets or sets the Property specifying an array of heights to be used for the bottom of the wall instead of the surface of the globe. + * If defined, the array must be the same length as {@link Wall#positions}. + */ + minimumHeights: Property | undefined; + /** + * Gets or sets the Property specifying an array of heights to be used for the top of the wall instead of the height of each position. + * If defined, the array must be the same length as {@link Wall#positions}. + */ + maximumHeights: Property | undefined; + /** + * Gets or sets the numeric Property specifying the angular distance between points on the wall. + */ + granularity: Property | undefined; + /** + * Gets or sets the boolean Property specifying whether the wall is filled with the provided material. + */ + fill: Property | undefined; + /** + * Gets or sets the Property specifying the material used to fill the wall. + */ + material: MaterialProperty; + /** + * Gets or sets the Property specifying whether the wall is outlined. + */ + outline: Property | undefined; + /** + * Gets or sets the Property specifying the {@link Color} of the outline. + */ + outlineColor: Property | undefined; + /** + * Gets or sets the numeric Property specifying the width of the outline. + *

+ * Note: This property will be ignored on all major browsers on Windows platforms. For details, see (@link https://github.com/CesiumGS/cesium/issues/40}. + *

+ */ + outlineWidth: Property | undefined; + /** + * Get or sets the enum Property specifying whether the wall + * casts or receives shadows from light sources. + */ + shadows: Property | undefined; + /** + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this wall will be displayed. + */ + distanceDisplayCondition: Property | undefined; + /** + * Duplicates this instance. + * @param [result] - The object onto which to store the result. + * @returns The modified result parameter or a new instance if one was not provided. + */ + clone(result?: WallGraphics): WallGraphics; + /** + * Assigns each unassigned property on this object to the value + * of the same property on the provided source object. + * @param source - The object to be merged into this object. + */ + merge(source: WallGraphics): void; + } + + /** + * @property kml - The generated KML. + * @property externalFiles - An object dictionary of external files + */ + export type exportKmlResultKml = { + kml: string; + externalFiles: { + [key: string]: Blob; + }; + }; + + /** + * @property kmz - The generated kmz file. + */ + export type exportKmlResultKmz = { + kmz: Blob; + }; + + /** + * Exports an EntityCollection as a KML document. Only Point, Billboard, Model, Path, Polygon, Polyline geometries + * will be exported. Note that there is not a 1 to 1 mapping of Entity properties to KML Feature properties. For + * example, entity properties that are time dynamic but cannot be dynamic in KML are exported with their values at + * options.time or the beginning of the EntityCollection's time interval if not specified. For time-dynamic properties + * that are supported in KML, we use the samples if it is a {@link SampledProperty} otherwise we sample the value using + * the options.sampleDuration. Point, Billboard, Model and Path geometries with time-dynamic positions will be exported + * as gx:Track Features. Not all Materials are representable in KML, so for more advanced Materials just the primary + * color is used. Canvas objects are exported as PNG images. + * @example + * Cesium.exportKml({ + * entities: entityCollection + * }) + * .then(function(result) { + * // The XML string is in result.kml + * + * const externalFiles = result.externalFiles + * for(const file in externalFiles) { + * // file is the name of the file used in the KML document as the href + * // externalFiles[file] is a blob with the contents of the file + * } + * }); + * @param options - An object with the following properties: + * @param options.entities - The EntityCollection to export as KML. + * @param [options.ellipsoid = Ellipsoid.default] - The ellipsoid for the output file. + * @param [options.modelCallback] - A callback that will be called with a {@link ModelGraphics} instance and should return the URI to use in the KML. Required if a model exists in the entity collection. + * @param [options.time = entities.computeAvailability().start] - The time value to use to get properties that are not time varying in KML. + * @param [options.defaultAvailability = entities.computeAvailability()] - The interval that will be sampled if an entity doesn't have an availability. + * @param [options.sampleDuration = 60] - The number of seconds to sample properties that are varying in KML. + * @param [options.kmz = false] - If true KML and external files will be compressed into a kmz file. + * @returns A promise that resolved to an object containing the KML string and a dictionary of external file blobs, or a kmz file as a blob if options.kmz is true. + */ + export function exportKml(options: { + entities: EntityCollection; + ellipsoid?: Ellipsoid; + modelCallback?: exportKmlModelCallback; + time?: JulianDate; + defaultAvailability?: TimeInterval; + sampleDuration?: number; + kmz?: boolean; + }): Promise; + + /** + * Since KML does not support glTF models, this callback is required to specify what URL to use for the model in the KML document. + * It can also be used to add additional files to the externalFiles object, which is the list of files embedded in the exported KMZ, + * or otherwise returned with the KML string when exporting. + * @param model - The ModelGraphics instance for an Entity. + * @param time - The time that any properties should use to get the value. + * @param externalFiles - An object that maps a filename to a Blob or a Promise that resolves to a Blob. + */ + export type exportKmlModelCallback = ( + model: ModelGraphics, + time: JulianDate, + externalFiles: any, + ) => string; + + /** + * Options to control the setting up of a WebGL Context. + *

+ * allowTextureFilterAnisotropic defaults to true, which enables + * anisotropic texture filtering when the WebGL extension is supported. + * Setting this to false will improve performance, but hurt visual quality, + * especially for horizon views. + *

+ * @property [requestWebgl1 = false] - If true and the browser supports it, use a WebGL 1 rendering context + * @property [allowTextureFilterAnisotropic = true] - If true, use anisotropic filtering during texture sampling + * @property [webgl] - WebGL options to be passed on to canvas.getContext + * @property [getWebGLStub] - A function to create a WebGL stub for testing + */ + export type ContextOptions = { + requestWebgl1?: boolean; + allowTextureFilterAnisotropic?: boolean; + webgl?: WebGLOptions; + getWebGLStub?: (...params: any[]) => any; + }; + + /** + * WebGL options to be passed on to HTMLCanvasElement.getContext(). + * See {@link https://registry.khronos.org/webgl/specs/latest/1.0/#5.2|WebGLContextAttributes} + * but note the modified defaults for 'alpha', 'stencil', and 'powerPreference' + * + *

+ * alpha defaults to false, which can improve performance + * compared to the standard WebGL default of true. If an application needs + * to composite Cesium above other HTML elements using alpha-blending, set + * alpha to true. + *

+ */ + export type WebGLOptions = { + alpha?: boolean; + depth?: boolean; + stencil?: boolean; + antialias?: boolean; + premultipliedAlpha?: boolean; + preserveDrawingBuffer?: boolean; + powerPreference?: "default" | "low-power" | "high-performance"; + failIfMajorPerformanceCaveat?: boolean; + }; + + /** + * The data type of a pixel. + */ + export enum PixelDatatype { + UNSIGNED_BYTE = WebGLConstants.UNSIGNED_BYTE, + UNSIGNED_SHORT = WebGLConstants.UNSIGNED_SHORT, + UNSIGNED_INT = WebGLConstants.UNSIGNED_INT, + FLOAT = WebGLConstants.FLOAT, + HALF_FLOAT = WebGLConstants.HALF_FLOAT_OES, + UNSIGNED_INT_24_8 = WebGLConstants.UNSIGNED_INT_24_8, + UNSIGNED_SHORT_4_4_4_4 = WebGLConstants.UNSIGNED_SHORT_4_4_4_4, + UNSIGNED_SHORT_5_5_5_1 = WebGLConstants.UNSIGNED_SHORT_5_5_5_1, + UNSIGNED_SHORT_5_6_5 = WebGLConstants.UNSIGNED_SHORT_5_6_5, + } + + /** + * Enumerates all possible filters used when magnifying WebGL textures. + */ + export enum TextureMagnificationFilter { + /** + * Samples the texture by returning the closest pixel. + */ + NEAREST = WebGLConstants.NEAREST, + /** + * Samples the texture through bi-linear interpolation of the four nearest pixels. This produces smoother results than NEAREST filtering. + */ + LINEAR = WebGLConstants.LINEAR, + } + + /** + * Enumerates all possible filters used when minifying WebGL textures. + */ + export enum TextureMinificationFilter { + /** + * Samples the texture by returning the closest pixel. + */ + NEAREST = WebGLConstants.NEAREST, + /** + * Samples the texture through bi-linear interpolation of the four nearest pixels. This produces smoother results than NEAREST filtering. + */ + LINEAR = WebGLConstants.LINEAR, + /** + * Selects the nearest mip level and applies nearest sampling within that level. + *

+ * Requires that the texture has a mipmap. The mip level is chosen by the view angle and screen-space size of the texture. + *

+ */ + NEAREST_MIPMAP_NEAREST = WebGLConstants.NEAREST_MIPMAP_NEAREST, + /** + * Selects the nearest mip level and applies linear sampling within that level. + *

+ * Requires that the texture has a mipmap. The mip level is chosen by the view angle and screen-space size of the texture. + *

+ */ + LINEAR_MIPMAP_NEAREST = WebGLConstants.LINEAR_MIPMAP_NEAREST, + /** + * Read texture values with nearest sampling from two adjacent mip levels and linearly interpolate the results. + *

+ * This option provides a good balance of visual quality and speed when sampling from a mipmapped texture. + *

+ *

+ * Requires that the texture has a mipmap. The mip level is chosen by the view angle and screen-space size of the texture. + *

+ */ + NEAREST_MIPMAP_LINEAR = WebGLConstants.NEAREST_MIPMAP_LINEAR, + /** + * Read texture values with linear sampling from two adjacent mip levels and linearly interpolate the results. + *

+ * This option provides a good balance of visual quality and speed when sampling from a mipmapped texture. + *

+ *

+ * Requires that the texture has a mipmap. The mip level is chosen by the view angle and screen-space size of the texture. + *

+ */ + LINEAR_MIPMAP_LINEAR = WebGLConstants.LINEAR_MIPMAP_LINEAR, + } + + /** + * An appearance defines the full GLSL vertex and fragment shaders and the + * render state used to draw a {@link Primitive}. All appearances implement + * this base Appearance interface. + * @param [options] - Object with the following properties: + * @param [options.translucent = true] - When true, the geometry is expected to appear translucent so {@link Appearance#renderState} has alpha blending enabled. + * @param [options.closed = false] - When true, the geometry is expected to be closed so {@link Appearance#renderState} has backface culling enabled. + * @param [options.material = Material.ColorType] - The material used to determine the fragment color. + * @param [options.vertexShaderSource] - Optional GLSL vertex shader source to override the default vertex shader. + * @param [options.fragmentShaderSource] - Optional GLSL fragment shader source to override the default fragment shader. + * @param [options.renderState] - Optional render state to override the default render state. + */ + export class Appearance { + constructor(options?: { + translucent?: boolean; + closed?: boolean; + material?: Material; + vertexShaderSource?: string; + fragmentShaderSource?: string; + renderState?: any; + }); + /** + * The material used to determine the fragment color. Unlike other {@link Appearance} + * properties, this is not read-only, so an appearance's material can change on the fly. + */ + material: Material; + /** + * When true, the geometry is expected to appear translucent. + */ + translucent: boolean; + /** + * The GLSL source code for the vertex shader. + */ + readonly vertexShaderSource: string; + /** + * The GLSL source code for the fragment shader. The full fragment shader + * source is built procedurally taking into account the {@link Appearance#material}. + * Use {@link Appearance#getFragmentShaderSource} to get the full source. + */ + readonly fragmentShaderSource: string; + /** + * The WebGL fixed-function state to use when rendering the geometry. + */ + readonly renderState: any; + /** + * When true, the geometry is expected to be closed. + */ + readonly closed: boolean; + /** + * Procedurally creates the full GLSL fragment shader source for this appearance + * taking into account {@link Appearance#fragmentShaderSource} and {@link Appearance#material}. + * @returns The full GLSL fragment shader source. + */ + getFragmentShaderSource(): string; + /** + * Determines if the geometry is translucent based on {@link Appearance#translucent} and {@link Material#isTranslucent}. + * @returns true if the appearance is translucent. + */ + isTranslucent(): boolean; + /** + * Creates a render state. This is not the final render state instance; instead, + * it can contain a subset of render state properties identical to the render state + * created in the context. + * @returns The render state. + */ + getRenderState(): any; + } + + /** + * ArcGisBaseMapType enumerates the ArcGIS image tile layers that are supported by default. + */ + export enum ArcGisBaseMapType { + SATELLITE = 1, + OCEANS = 2, + HILLSHADE = 3, + } + + export namespace ArcGisMapServerImageryProvider { + /** + * Initialization options for the ArcGisMapServerImageryProvider constructor + * @property [tileDiscardPolicy] - The policy that determines if a tile + * is invalid and should be discarded. If this value is not specified, a default + * {@link DiscardMissingTileImagePolicy} is used for tiled map servers, and a + * {@link NeverTileDiscardPolicy} is used for non-tiled map servers. In the former case, + * we request tile 0,0 at the maximum tile level and check pixels (0,0), (200,20), (20,200), + * (80,110), and (160, 130). If all of these pixels are transparent, the discard check is + * disabled and no tiles are discarded. If any of them have a non-transparent color, any + * tile that has the same values in these pixel locations is discarded. The end result of + * these defaults should be correct tile discarding for a standard ArcGIS Server. To ensure + * that no tiles are discarded, construct and pass a {@link NeverTileDiscardPolicy} for this + * parameter. + * @property [usePreCachedTilesIfAvailable = true] - If true, the server's pre-cached + * tiles are used if they are available. Exporting Tiles is only supported with deprecated APIs. + * @property [layers] - A comma-separated list of the layers to show, or undefined if all layers should be shown. + * @property [enablePickFeatures = true] - If true, {@link ArcGisMapServerImageryProvider#pickFeatures} will invoke + * the Identify service on the MapServer and return the features included in the response. If false, + * {@link ArcGisMapServerImageryProvider#pickFeatures} will immediately return undefined (indicating no pickable features) + * without communicating with the server. Set this property to false if you don't want this provider's features to + * be pickable. Can be overridden by setting the {@link ArcGisMapServerImageryProvider#enablePickFeatures} property on the object. + * @property [rectangle = Rectangle.MAX_VALUE] - The rectangle of the layer. This parameter is ignored when accessing + * a tiled layer. + * @property [tilingScheme = new GeographicTilingScheme()] - The tiling scheme to use to divide the world into tiles. + * This parameter is ignored when accessing a tiled server. + * @property [ellipsoid = Ellipsoid.default] - The ellipsoid. If the tilingScheme is specified and used, + * this parameter is ignored and the tiling scheme's ellipsoid is used instead. If neither + * parameter is specified, the default ellipsoid is used. + * @property [credit] - A credit for the data source, which is displayed on the canvas. This parameter is ignored when accessing a tiled server. + * @property [tileWidth = 256] - The width of each tile in pixels. This parameter is ignored when accessing a tiled server. + * @property [tileHeight = 256] - The height of each tile in pixels. This parameter is ignored when accessing a tiled server. + * @property [maximumLevel] - The maximum tile level to request, or undefined if there is no maximum. This parameter is ignored when accessing + * a tiled server. + */ + type ConstructorOptions = { + tileDiscardPolicy?: TileDiscardPolicy; + usePreCachedTilesIfAvailable?: boolean; + layers?: string; + enablePickFeatures?: boolean; + rectangle?: Rectangle; + tilingScheme?: TilingScheme; + ellipsoid?: Ellipsoid; + credit?: Credit | string; + tileWidth?: number; + tileHeight?: number; + maximumLevel?: number; + }; + } + + /** + *
+ * This object is normally not instantiated directly, use {@link ArcGisMapServerImageryProvider.fromBasemapType} or {@link ArcGisMapServerImageryProvider.fromUrl}. + *
+ * + * Provides tiled imagery hosted by an ArcGIS MapServer. By default, the server's pre-cached tiles are + * used, if available. + * + *
+ * + * An {@link https://developers.arcgis.com/documentation/mapping-apis-and-services/security| ArcGIS Access Token } is required to authenticate requests to an ArcGIS Image Tile service. + * To access secure ArcGIS resources, it's required to create an ArcGIS developer + * account or an ArcGIS online account, then implement an authentication method to obtain an access token. + * @example + * // Set the default access token for accessing ArcGIS Image Tile service + * Cesium.ArcGisMapService.defaultAccessToken = ""; + * + * // Add a base layer from a default ArcGIS basemap + * const viewer = new Cesium.Viewer("cesiumContainer", { + * baseLayer: Cesium.ImageryLayer.fromProviderAsync( + * Cesium.ArcGisMapServerImageryProvider.fromBasemapType( + * Cesium.ArcGisBaseMapType.SATELLITE + * ) + * ), + * }); + * @example + * // Create an imagery provider from the url directly + * const esri = await Cesium.ArcGisMapServerImageryProvider.fromUrl( + * "https://ibasemaps-api.arcgis.com/arcgis/rest/services/World_Imagery/MapServer", { + * token: "" + * }); + * @param [options] - Object describing initialization options + */ + export class ArcGisMapServerImageryProvider { + constructor(options?: ArcGisMapServerImageryProvider.ConstructorOptions); + /** + * Gets or sets a value indicating whether feature picking is enabled. If true, {@link ArcGisMapServerImageryProvider#pickFeatures} will + * invoke the "identify" operation on the ArcGIS server and return the features included in the response. If false, + * {@link ArcGisMapServerImageryProvider#pickFeatures} will immediately return undefined (indicating no pickable features) + * without communicating with the server. + */ + enablePickFeatures: boolean; + /** + * Creates an {@link ImageryProvider} which provides tiled imagery from an ArcGIS base map. + * @example + * // Set the default access token for accessing ArcGIS Image Tile service + * Cesium.ArcGisMapService.defaultAccessToken = ""; + * + * // Add a base layer from a default ArcGIS basemap + * const provider = await Cesium.ArcGisMapServerImageryProvider.fromBasemapType( + * Cesium.ArcGisBaseMapType.SATELLITE); + * @example + * // Add a base layer from a default ArcGIS Basemap + * const viewer = new Cesium.Viewer("cesiumContainer", { + * baseLayer: Cesium.ImageryLayer.fromProviderAsync( + * Cesium.ArcGisMapServerImageryProvider.fromBasemapType( + * Cesium.ArcGisBaseMapType.HILLSHADE, { + * token: "" + * } + * ) + * ), + * }); + * @param style - The style of the ArcGIS base map imagery. Valid options are {@link ArcGisBaseMapType.SATELLITE}, {@link ArcGisBaseMapType.OCEANS}, and {@link ArcGisBaseMapType.HILLSHADE}. + * @param [options] - Object describing initialization options. + * @returns A promise that resolves to the created ArcGisMapServerImageryProvider. + */ + static fromBasemapType( + style: ArcGisBaseMapType, + options?: ArcGisMapServerImageryProvider.ConstructorOptions, + ): Promise; + /** + * Gets the URL of the ArcGIS MapServer. + */ + readonly url: string; + /** + * Gets the ArcGIS token used to authenticate with the ArcGis MapServer service. + */ + readonly token: string; + /** + * Gets the proxy used by this provider. + */ + readonly proxy: Proxy; + /** + * Gets the width of each tile, in pixels. + */ + readonly tileWidth: number; + /** + * Gets the height of each tile, in pixels. + */ + readonly tileHeight: number; + /** + * Gets the maximum level-of-detail that can be requested. + */ + readonly maximumLevel: number | undefined; + /** + * Gets the minimum level-of-detail that can be requested. + */ + readonly minimumLevel: number; + /** + * Gets the tiling scheme used by this provider. + */ + readonly tilingScheme: TilingScheme; + /** + * Gets the rectangle, in radians, of the imagery provided by this instance. + */ + readonly rectangle: Rectangle; + /** + * Gets the tile discard policy. If not undefined, the discard policy is responsible + * for filtering out "missing" tiles via its shouldDiscardImage function. If this function + * returns undefined, no tiles are filtered. + */ + readonly tileDiscardPolicy: TileDiscardPolicy; + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + */ + readonly errorEvent: Event; + /** + * Gets the credit to display when this imagery provider is active. Typically this is used to credit + * the source of the imagery. + */ + readonly credit: Credit; + /** + * Gets a value indicating whether this imagery provider is using pre-cached tiles from the + * ArcGIS MapServer. + */ + readonly usingPrecachedTiles: boolean; + /** + * Gets a value indicating whether or not the images provided by this imagery provider + * include an alpha channel. If this property is false, an alpha channel, if present, will + * be ignored. If this property is true, any images without an alpha channel will be treated + * as if their alpha is 1.0 everywhere. When this property is false, memory usage + * and texture upload time are reduced. + */ + readonly hasAlphaChannel: boolean; + /** + * Gets the comma-separated list of layer IDs to show. + */ + layers: string; + /** + * Creates an {@link ImageryProvider} which provides tiled imagery hosted by an ArcGIS MapServer. By default, the server's pre-cached tiles are + * used, if available. + * @example + * const esri = await Cesium.ArcGisMapServerImageryProvider.fromUrl( + * "https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer" + * ); + * @param url - The URL of the ArcGIS MapServer service. + * @param [options] - Object describing initialization options. + * @returns A promise that resolves to the created ArcGisMapServerImageryProvider. + */ + static fromUrl( + url: Resource | string, + options?: ArcGisMapServerImageryProvider.ConstructorOptions, + ): Promise; + /** + * Gets the credits to be displayed when a given tile is displayed. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level; + * @returns The credits to be displayed when the tile is displayed. + */ + getTileCredits(x: number, y: number, level: number): Credit[]; + /** + * Requests the image for a given tile. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param [request] - The request object. Intended for internal use only. + * @returns A promise for the image that will resolve when the image is available, or + * undefined if there are too many active requests to the server, and the request should be retried later. + */ + requestImage( + x: number, + y: number, + level: number, + request?: Request, + ): Promise | undefined; + /** + * /** + * Asynchronously determines what features, if any, are located at a given longitude and latitude within + * a tile. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param longitude - The longitude at which to pick features. + * @param latitude - The latitude at which to pick features. + * @returns A promise for the picked features that will resolve when the asynchronous + * picking completes. The resolved value is an array of {@link ImageryLayerFeatureInfo} + * instances. The array may be empty if no features are found at the given location. + */ + pickFeatures( + x: number, + y: number, + level: number, + longitude: number, + latitude: number, + ): Promise | undefined; + } + + /** + * Default options for accessing the ArcGIS image tile service. + * + * An ArcGIS access token is required to access ArcGIS image tile layers. + * A default token is provided for evaluation purposes only. + * To obtain an access token, go to {@link https://developers.arcgis.com} and create a free account. + * More info can be found in the {@link https://developers.arcgis.com/documentation/mapping-apis-and-services/security/ | ArcGIS developer guide}. + */ + export namespace ArcGisMapService { + /** + * Gets or sets the default ArcGIS access token. + */ + var defaultAccessToken: string; + /** + * Gets or sets the URL of the ArcGIS World Imagery tile service. + */ + var defaultWorldImageryServer: string | Resource; + /** + * Gets or sets the URL of the ArcGIS World Hillshade tile service. + */ + var defaultWorldHillshadeServer: string | Resource; + /** + * Gets or sets the URL of the ArcGIS World Oceans tile service. + */ + var defaultWorldOceanServer: string | Resource; + function getDefaultTokenCredit(providedKey: string): string | undefined; + } + + /** + * Common atmosphere settings used by 3D Tiles and models for rendering sky atmosphere, ground atmosphere, and fog. + * + *

+ * This class is not to be confused with {@link SkyAtmosphere}, which is responsible for rendering the sky. + *

+ *

+ * While the atmosphere settings affect the color of fog, see {@link Fog} to control how fog is rendered. + *

+ * @example + * // Turn on dynamic atmosphere lighting using the sun direction + * scene.atmosphere.dynamicLighting = Cesium.DynamicAtmosphereLightingType.SUNLIGHT; + * @example + * // Turn on dynamic lighting using whatever light source is in the scene + * scene.light = new Cesium.DirectionalLight({ + * direction: new Cesium.Cartesian3(1, 0, 0) + * }); + * scene.atmosphere.dynamicLighting = Cesium.DynamicAtmosphereLightingType.SCENE_LIGHT; + * @example + * // Adjust the color of the atmosphere effects. + * scene.atmosphere.hueShift = 0.4; // Cycle 40% around the color wheel + * scene.atmosphere.brightnessShift = 0.25; // Increase the brightness + * scene.atmosphere.saturationShift = -0.1; // Desaturate the colors + */ + export class Atmosphere { + constructor(); + /** + * The intensity of the light that is used for computing the ground atmosphere color. + */ + lightIntensity: number; + /** + * The Rayleigh scattering coefficient used in the atmospheric scattering equations for the ground atmosphere. + */ + rayleighCoefficient: Cartesian3; + /** + * The Mie scattering coefficient used in the atmospheric scattering equations for the ground atmosphere. + */ + mieCoefficient: Cartesian3; + /** + * The Rayleigh scale height used in the atmospheric scattering equations for the ground atmosphere, in meters. + */ + rayleighScaleHeight: number; + /** + * The Mie scale height used in the atmospheric scattering equations for the ground atmosphere, in meters. + */ + mieScaleHeight: number; + /** + * The anisotropy of the medium to consider for Mie scattering. + *

+ * Valid values are between -1.0 and 1.0. + *

+ */ + mieAnisotropy: number; + /** + * The hue shift to apply to the atmosphere. Defaults to 0.0 (no shift). + * A hue shift of 1.0 indicates a complete rotation of the hues available. + */ + hueShift: number; + /** + * The saturation shift to apply to the atmosphere. Defaults to 0.0 (no shift). + * A saturation shift of -1.0 is monochrome. + */ + saturationShift: number; + /** + * The brightness shift to apply to the atmosphere. Defaults to 0.0 (no shift). + * A brightness shift of -1.0 is complete darkness, which will let space show through. + */ + brightnessShift: number; + /** + * When not DynamicAtmosphereLightingType.NONE, the selected light source will + * be used for dynamically lighting all atmosphere-related rendering effects. + */ + dynamicLighting: DynamicAtmosphereLightingType; + /** + * Returns true if the atmosphere shader requires a color correct step. + * @param atmosphere - The atmosphere instance to check + * @returns true if the atmosphere shader requires a color correct step + */ + static requiresColorCorrect(atmosphere: Atmosphere): boolean; + } + + /** + * An enum describing the x, y, and z axes and helper conversion functions. + */ + export enum Axis { + /** + * Denotes the x-axis. + */ + X = 0, + /** + * Denotes the y-axis. + */ + Y = 1, + /** + * Denotes the z-axis. + */ + Z = 2, + } + + export namespace Billboard { + /** + * Initialization options for the first param of Billboard constructor + * @property position - The cartesian position of the billboard. + * @property [id] - A user-defined object to return when the billboard is picked with {@link Scene#pick}. + * @property [show = true] - Determines if this billboard will be shown. + * @property [image] - A loaded HTMLImageElement, ImageData, or a url to an image to use for the billboard. + * @property [scale = 1.0] - A number specifying the uniform scale that is multiplied with the billboard's image size in pixels. + * @property [pixelOffset = Cartesian2.ZERO] - A {@link Cartesian2} Specifying the pixel offset in screen space from the origin of this billboard. + * @property [eyeOffset = Cartesian3.ZERO] - A {@link Cartesian3} Specifying the 3D Cartesian offset applied to this billboard in eye coordinates. + * @property [horizontalOrigin = HorizontalOrigin.CENTER] - A {@link HorizontalOrigin} Specifying the horizontal origin of this billboard. + * @property [verticalOrigin = VerticalOrigin.CENTER] - A {@link VerticalOrigin} Specifying the vertical origin of this billboard. + * @property [heightReference = HeightReference.NONE] - A {@link HeightReference} Specifying the height reference of this billboard. + * @property [color = Color.WHITE] - A {@link Color} Specifying the color that is multiplied with the billboard's texture. + * @property [rotation = 0] - A number specifying the rotation angle in radians. + * @property [alignedAxis = Cartesian3.ZERO] - A {@link Cartesian3} Specifying the aligned axis in world space. + * @property [sizeInMeters] - A boolean specifying if the billboard size is in meters or pixels. + * @property [width] - A number specifying the width of the billboard. If undefined, the image width will be used. + * @property [height] - A number specifying the height of the billboard. If undefined, the image height will be used. + * @property [scaleByDistance] - A {@link NearFarScalar} Specifying near and far scaling properties of a Billboard based on the billboard's distance from the camera. + * @property [translucencyByDistance] - A {@link NearFarScalar} Specifying near and far translucency properties of a Billboard based on the billboard's distance from the camera. + * @property [pixelOffsetScaleByDistance] - A {@link NearFarScalar} Specifying near and far pixel offset scaling properties of a Billboard based on the billboard's distance from the camera. + * @property [imageSubRegion] - A {@link BoundingRectangle} Specifying the sub-region of the image to use for the billboard, rather than the entire image. + * @property [distanceDisplayCondition] - A {@link DistanceDisplayCondition} Specifying the distance from the camera at which this billboard will be displayed. + * @property [disableDepthTestDistance] - A number specifying the distance from the camera at which to disable the depth test to, for example, prevent clipping against terrain. + * @property [splitDirection] - A {@link SplitDirection} Specifying the split property of the billboard. + */ + type ConstructorOptions = { + position: Cartesian3; + id?: any; + show?: boolean; + image?: string | HTMLCanvasElement; + scale?: number; + pixelOffset?: Cartesian2; + eyeOffset?: Cartesian3; + horizontalOrigin?: HorizontalOrigin; + verticalOrigin?: VerticalOrigin; + heightReference?: HeightReference; + color?: Color; + rotation?: number; + alignedAxis?: Cartesian3; + sizeInMeters?: boolean; + width?: number; + height?: number; + scaleByDistance?: NearFarScalar; + translucencyByDistance?: NearFarScalar; + pixelOffsetScaleByDistance?: NearFarScalar; + imageSubRegion?: BoundingRectangle; + distanceDisplayCondition?: DistanceDisplayCondition; + disableDepthTestDistance?: number; + splitDirection?: SplitDirection; + }; + /** + * A function that creates an image. + * @param id - The identifier of the image to load. + */ + type CreateImageCallback = ( + id: string, + ) => + | HTMLImageElement + | HTMLCanvasElement + | Promise; + } + + /** + *
+ * A billboard is created and its initial + * properties are set by calling {@link BillboardCollection#add}. Do not call the constructor directly. + *
+ * A viewport-aligned image positioned in the 3D scene, that is created + * and rendered using a {@link BillboardCollection}. + *

+ *
+ *
+ * Example billboards + *
+ * @param options - Object describing initialization options + * @param billboardCollection - Instance of BillboardCollection + */ + export class Billboard { + constructor( + options: Billboard.ConstructorOptions, + billboardCollection: BillboardCollection, + ); + /** + * Determines if this billboard will be shown. Use this to hide or show a billboard, instead + * of removing it and re-adding it to the collection. + */ + show: boolean; + /** + * Gets or sets the Cartesian position of this billboard. + */ + position: Cartesian3; + /** + * Gets or sets the height reference of this billboard. + */ + heightReference: HeightReference; + /** + * Gets or sets the pixel offset in screen space from the origin of this billboard. This is commonly used + * to align multiple billboards and labels at the same position, e.g., an image and text. The + * screen space origin is the top, left corner of the canvas; x increases from + * left to right, and y increases from top to bottom. + *

+ *
+ * + * + * + *
default
b.pixeloffset = new Cartesian2(50, 25);
+ * The billboard's origin is indicated by the yellow point. + *
+ */ + pixelOffset: Cartesian2; + /** + * Gets or sets near and far scaling properties of a Billboard based on the billboard's distance from the camera. + * A billboard's scale will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the billboard's scale remains clamped to the nearest bound. If undefined, + * scaleByDistance will be disabled. + * @example + * // Example 1. + * // Set a billboard's scaleByDistance to scale by 1.5 when the + * // camera is 1500 meters from the billboard and disappear as + * // the camera distance approaches 8.0e6 meters. + * b.scaleByDistance = new Cesium.NearFarScalar(1.5e2, 1.5, 8.0e6, 0.0); + * @example + * // Example 2. + * // disable scaling by distance + * b.scaleByDistance = undefined; + */ + scaleByDistance: NearFarScalar; + /** + * Gets or sets near and far translucency properties of a Billboard based on the billboard's distance from the camera. + * A billboard's translucency will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the billboard's translucency remains clamped to the nearest bound. If undefined, + * translucencyByDistance will be disabled. + * @example + * // Example 1. + * // Set a billboard's translucency to 1.0 when the + * // camera is 1500 meters from the billboard and disappear as + * // the camera distance approaches 8.0e6 meters. + * b.translucencyByDistance = new Cesium.NearFarScalar(1.5e2, 1.0, 8.0e6, 0.0); + * @example + * // Example 2. + * // disable translucency by distance + * b.translucencyByDistance = undefined; + */ + translucencyByDistance: NearFarScalar; + /** + * Gets or sets near and far pixel offset scaling properties of a Billboard based on the billboard's distance from the camera. + * A billboard's pixel offset will be scaled between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the billboard's pixel offset scale remains clamped to the nearest bound. If undefined, + * pixelOffsetScaleByDistance will be disabled. + * @example + * // Example 1. + * // Set a billboard's pixel offset scale to 0.0 when the + * // camera is 1500 meters from the billboard and scale pixel offset to 10.0 pixels + * // in the y direction the camera distance approaches 8.0e6 meters. + * b.pixelOffset = new Cesium.Cartesian2(0.0, 1.0); + * b.pixelOffsetScaleByDistance = new Cesium.NearFarScalar(1.5e2, 0.0, 8.0e6, 10.0); + * @example + * // Example 2. + * // disable pixel offset by distance + * b.pixelOffsetScaleByDistance = undefined; + */ + pixelOffsetScaleByDistance: NearFarScalar; + /** + * Gets or sets the 3D Cartesian offset applied to this billboard in eye coordinates. Eye coordinates is a left-handed + * coordinate system, where x points towards the viewer's right, y points up, and + * z points into the screen. Eye coordinates use the same scale as world and model coordinates, + * which is typically meters. + *

+ * An eye offset is commonly used to arrange multiple billboards or objects at the same position, e.g., to + * arrange a billboard above its corresponding 3D model. + *

+ * Below, the billboard is positioned at the center of the Earth but an eye offset makes it always + * appear on top of the Earth regardless of the viewer's or Earth's orientation. + *

+ *
+ * + * + * + *
+ * b.eyeOffset = new Cartesian3(0.0, 8000000.0, 0.0);

+ *
+ */ + eyeOffset: Cartesian3; + /** + * Gets or sets the horizontal origin of this billboard, which determines if the billboard is + * to the left, center, or right of its anchor position. + *

+ *
+ *
+ *
+ * @example + * // Use a bottom, left origin + * b.horizontalOrigin = Cesium.HorizontalOrigin.LEFT; + * b.verticalOrigin = Cesium.VerticalOrigin.BOTTOM; + */ + horizontalOrigin: HorizontalOrigin; + /** + * Gets or sets the vertical origin of this billboard, which determines if the billboard is + * to the above, below, or at the center of its anchor position. + *

+ *
+ *
+ *
+ * @example + * // Use a bottom, left origin + * b.horizontalOrigin = Cesium.HorizontalOrigin.LEFT; + * b.verticalOrigin = Cesium.VerticalOrigin.BOTTOM; + */ + verticalOrigin: VerticalOrigin; + /** + * Gets or sets the uniform scale that is multiplied with the billboard's image size in pixels. + * A scale of 1.0 does not change the size of the billboard; a scale greater than + * 1.0 enlarges the billboard; a positive scale less than 1.0 shrinks + * the billboard. + *

+ *
+ *
+ * From left to right in the above image, the scales are 0.5, 1.0, + * and 2.0. + *
+ */ + scale: number; + /** + * Gets or sets the color that is multiplied with the billboard's texture. This has two common use cases. First, + * the same white texture may be used by many different billboards, each with a different color, to create + * colored billboards. Second, the color's alpha component can be used to make the billboard translucent as shown below. + * An alpha of 0.0 makes the billboard transparent, and 1.0 makes the billboard opaque. + *

+ *
+ * + * + * + *
default
alpha : 0.5
+ *
+ *
+ * The red, green, blue, and alpha values are indicated by value's red, green, + * blue, and alpha properties as shown in Example 1. These components range from 0.0 + * (no intensity) to 1.0 (full intensity). + * @example + * // Example 1. Assign yellow. + * b.color = Cesium.Color.YELLOW; + * @example + * // Example 2. Make a billboard 50% translucent. + * b.color = new Cesium.Color(1.0, 1.0, 1.0, 0.5); + */ + color: Color; + /** + * Gets or sets the rotation angle in radians. + */ + rotation: number; + /** + * Gets or sets the aligned axis in world space. The aligned axis is the unit vector that the billboard up vector points towards. + * The default is the zero vector, which means the billboard is aligned to the screen up vector. + * @example + * // Example 1. + * // Have the billboard up vector point north + * billboard.alignedAxis = Cesium.Cartesian3.UNIT_Z; + * @example + * // Example 2. + * // Have the billboard point east. + * billboard.alignedAxis = Cesium.Cartesian3.UNIT_Z; + * billboard.rotation = -Cesium.Math.PI_OVER_TWO; + * @example + * // Example 3. + * // Reset the aligned axis + * billboard.alignedAxis = Cesium.Cartesian3.ZERO; + */ + alignedAxis: Cartesian3; + /** + * Gets or sets a width for the billboard. If undefined, the image width will be used. + */ + width: number | undefined; + /** + * Gets or sets a height for the billboard. If undefined, the image height will be used. + */ + height: number | undefined; + /** + * Gets or sets if the billboard size is in meters or pixels. true to size the billboard in meters; + * otherwise, the size is in pixels. + */ + sizeInMeters: boolean; + /** + * Gets or sets the condition specifying at what distance from the camera that this billboard will be displayed. + */ + distanceDisplayCondition: DistanceDisplayCondition; + /** + * Gets or sets the distance from the camera at which to disable the depth test to, for example, prevent clipping against terrain. + * When set to zero, the depth test is always applied. When set to Number.POSITIVE_INFINITY, the depth test is never applied. + */ + disableDepthTestDistance: number; + /** + * Gets or sets the user-defined object returned when the billboard is picked. + */ + id: any; + /** + *

+ * Gets or sets the image to be used for this billboard. If a texture has already been created for the + * given image, the existing texture is used. + *

+ *

+ * This property can be set to a loaded Image, a URL which will be loaded as an Image automatically, + * a canvas, or another billboard's image property (from the same billboard collection). + *

+ * @example + * // load an image from a URL + * b.image = 'some/image/url.png'; + * + * // assuming b1 and b2 are billboards in the same billboard collection, + * // use the same image for both billboards. + * b2.image = b1.image; + */ + image: string; + /** + * When true, this billboard is ready to render, i.e., the image + * has been downloaded and the WebGL resources are created. + */ + readonly ready: boolean; + /** + * Gets or sets the {@link SplitDirection} of this billboard. + */ + splitDirection: SplitDirection; + /** + *

+ * Sets the image to be used for this billboard. If a texture has already been created for the + * given id, the existing texture is used. + *

+ *

+ * This function is useful for dynamically creating textures that are shared across many billboards. + * Only the first billboard will actually call the function and create the texture, while subsequent + * billboards created with the same id will simply re-use the existing texture. + *

+ *

+ * To load an image from a URL, setting the {@link Billboard#image} property is more convenient. + *

+ * @example + * // create a billboard image dynamically + * function drawImage(id) { + * // create and draw an image using a canvas + * const canvas = document.createElement('canvas'); + * const context2D = canvas.getContext('2d'); + * // ... draw image + * return canvas; + * } + * // drawImage will be called to create the texture + * b.setImage('myImage', drawImage); + * + * // subsequent billboards created in the same collection using the same id will use the existing + * // texture, without the need to create the canvas or draw the image + * b2.setImage('myImage', drawImage); + * @param id - The id of the image. This can be any string that uniquely identifies the image. + * @param image - The image to load. This parameter + * can either be a loaded Image or Canvas, a URL which will be loaded as an Image automatically, + * or a function which will be called to create the image if it hasn't been loaded already. + */ + setImage( + id: string, + image: + | HTMLImageElement + | HTMLCanvasElement + | string + | Resource + | Billboard.CreateImageCallback, + ): void; + /** + * Uses a sub-region of the image with the given id as the image for this billboard, + * measured in pixels from the bottom-left. + * @param id - The id of the image to use. + * @param subRegion - The sub-region of the image. + */ + setImageSubRegion(id: string, subRegion: BoundingRectangle): void; + /** + * Computes the screen-space position of the billboard's origin, taking into account eye and pixel offsets. + * The screen space origin is the top, left corner of the canvas; x increases from + * left to right, and y increases from top to bottom. + * @example + * console.log(b.computeScreenSpacePosition(scene).toString()); + * @param scene - The scene. + * @param [result] - The object onto which to store the result. + * @returns The screen-space position of the billboard. + */ + computeScreenSpacePosition(scene: Scene, result?: Cartesian2): Cartesian2; + /** + * Determines if this billboard equals another billboard. Billboards are equal if all their properties + * are equal. Billboards in different collections can be equal. + * @param [other] - The billboard to compare for equality. + * @returns true if the billboards are equal; otherwise, false. + */ + equals(other?: Billboard): boolean; + } + + /** + * A renderable collection of billboards. Billboards are viewport-aligned + * images positioned in the 3D scene. + *

+ *
+ *
+ * Example billboards + *
+ *

+ * Billboards are added and removed from the collection using {@link BillboardCollection#add} + * and {@link BillboardCollection#remove}. Billboards in a collection automatically share textures + * for images with the same identifier. + * @example + * // Create a billboard collection with two billboards + * const billboards = scene.primitives.add(new Cesium.BillboardCollection()); + * billboards.add({ + * position : new Cesium.Cartesian3(1.0, 2.0, 3.0), + * image : 'url/to/image' + * }); + * billboards.add({ + * position : new Cesium.Cartesian3(4.0, 5.0, 6.0), + * image : 'url/to/another/image' + * }); + * @param [options] - Object with the following properties: + * @param [options.modelMatrix = Matrix4.IDENTITY] - The 4x4 transformation matrix that transforms each billboard from model to world coordinates. + * @param [options.debugShowBoundingVolume = false] - For debugging only. Determines if this primitive's commands' bounding spheres are shown. + * @param [options.scene] - Must be passed in for billboards that use the height reference property or will be depth tested against the globe. + * @param [options.blendOption = BlendOption.OPAQUE_AND_TRANSLUCENT] - The billboard blending option. The default + * is used for rendering both opaque and translucent billboards. However, if either all of the billboards are completely opaque or all are completely translucent, + * setting the technique to BlendOption.OPAQUE or BlendOption.TRANSLUCENT can improve performance by up to 2x. + * @param [options.show = true] - Determines if the billboards in the collection will be shown. + */ + export class BillboardCollection { + constructor(options?: { + modelMatrix?: Matrix4; + debugShowBoundingVolume?: boolean; + scene?: Scene; + blendOption?: BlendOption; + show?: boolean; + }); + /** + * Determines if billboards in this collection will be shown. + */ + show: boolean; + /** + * The 4x4 transformation matrix that transforms each billboard in this collection from model to world coordinates. + * When this is the identity matrix, the billboards are drawn in world coordinates, i.e., Earth's WGS84 coordinates. + * Local reference frames can be used by providing a different transformation matrix, like that returned + * by {@link Transforms.eastNorthUpToFixedFrame}. + * @example + * const center = Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883); + * billboards.modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(center); + * billboards.add({ + * image : 'url/to/image', + * position : new Cesium.Cartesian3(0.0, 0.0, 0.0) // center + * }); + * billboards.add({ + * image : 'url/to/image', + * position : new Cesium.Cartesian3(1000000.0, 0.0, 0.0) // east + * }); + * billboards.add({ + * image : 'url/to/image', + * position : new Cesium.Cartesian3(0.0, 1000000.0, 0.0) // north + * }); + * billboards.add({ + * image : 'url/to/image', + * position : new Cesium.Cartesian3(0.0, 0.0, 1000000.0) // up + * }); + */ + modelMatrix: Matrix4; + /** + * This property is for debugging only; it is not for production use nor is it optimized. + *

+ * Draws the bounding sphere for each draw command in the primitive. + *

+ */ + debugShowBoundingVolume: boolean; + /** + * This property is for debugging only; it is not for production use nor is it optimized. + *

+ * Draws the texture atlas for this BillboardCollection as a fullscreen quad. + *

+ */ + debugShowTextureAtlas: boolean; + /** + * The billboard blending option. The default is used for rendering both opaque and translucent billboards. + * However, if either all of the billboards are completely opaque or all are completely translucent, + * setting the technique to BlendOption.OPAQUE or BlendOption.TRANSLUCENT can improve + * performance by up to 2x. + */ + blendOption: BlendOption; + /** + * Returns the number of billboards in this collection. This is commonly used with + * {@link BillboardCollection#get} to iterate over all the billboards + * in the collection. + */ + readonly length: number; + /** + * Creates and adds a billboard with the specified initial properties to the collection. + * The added billboard is returned so it can be modified or removed from the collection later. + * @example + * // Example 1: Add a billboard, specifying all the default values. + * const b = billboards.add({ + * show : true, + * position : Cesium.Cartesian3.ZERO, + * pixelOffset : Cesium.Cartesian2.ZERO, + * eyeOffset : Cesium.Cartesian3.ZERO, + * heightReference : Cesium.HeightReference.NONE, + * horizontalOrigin : Cesium.HorizontalOrigin.CENTER, + * verticalOrigin : Cesium.VerticalOrigin.CENTER, + * scale : 1.0, + * image : 'url/to/image', + * imageSubRegion : undefined, + * color : Cesium.Color.WHITE, + * id : undefined, + * rotation : 0.0, + * alignedAxis : Cesium.Cartesian3.ZERO, + * width : undefined, + * height : undefined, + * scaleByDistance : undefined, + * translucencyByDistance : undefined, + * pixelOffsetScaleByDistance : undefined, + * sizeInMeters : false, + * distanceDisplayCondition : undefined + * }); + * @example + * // Example 2: Specify only the billboard's cartographic position. + * const b = billboards.add({ + * position : Cesium.Cartesian3.fromDegrees(longitude, latitude, height) + * }); + * @param [options] - A template describing the billboard's properties as shown in Example 1. + * @returns The billboard that was added to the collection. + */ + add(options?: Billboard.ConstructorOptions): Billboard; + /** + * Removes a billboard from the collection. + * @example + * const b = billboards.add(...); + * billboards.remove(b); // Returns true + * @param billboard - The billboard to remove. + * @returns true if the billboard was removed; false if the billboard was not found in the collection. + */ + remove(billboard: Billboard): boolean; + /** + * Removes all billboards from the collection. + * @example + * billboards.add(...); + * billboards.add(...); + * billboards.removeAll(); + */ + removeAll(): void; + /** + * Check whether this collection contains a given billboard. + * @param [billboard] - The billboard to check for. + * @returns true if this collection contains the billboard, false otherwise. + */ + contains(billboard?: Billboard): boolean; + /** + * Returns the billboard in the collection at the specified index. Indices are zero-based + * and increase as billboards are added. Removing a billboard shifts all billboards after + * it to the left, changing their indices. This function is commonly used with + * {@link BillboardCollection#length} to iterate over all the billboards + * in the collection. + * @example + * // Toggle the show property of every billboard in the collection + * const len = billboards.length; + * for (let i = 0; i < len; ++i) { + * const b = billboards.get(i); + * b.show = !b.show; + * } + * @param index - The zero-based index of the billboard. + * @returns The billboard at the specified index. + */ + get(index: number): Billboard; + /** + * Called when {@link Viewer} or {@link CesiumWidget} render the scene to + * get the draw commands needed to render this primitive. + *

+ * Do not call this function directly. This is documented just to + * list the exceptions that may be propagated when the scene is rendered: + *

+ */ + update(): void; + /** + * Returns true if this object was destroyed; otherwise, false. + *

+ * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

+ * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * billboards = billboards && billboards.destroy(); + */ + destroy(): void; + } + + export namespace BingMapsImageryProvider { + /** + * Initialization options for the BingMapsImageryProvider constructor + * @property [key] - The Bing Maps key for your application, which can be + * created at {@link https://www.bingmapsportal.com/}. + * @property [tileProtocol] - The protocol to use when loading tiles, e.g. 'http' or 'https'. + * By default, tiles are loaded using the same protocol as the page. + * @property [mapStyle = BingMapsStyle.AERIAL] - The type of Bing Maps imagery to load. + * @property [mapLayer] - Additional display layer options as defined on {@link https://learn.microsoft.com/en-us/bingmaps/rest-services/imagery/get-imagery-metadata#template-parameters} + * @property [culture = ''] - The culture to use when requesting Bing Maps imagery. Not + * all cultures are supported. See {@link http://msdn.microsoft.com/en-us/library/hh441729.aspx} + * for information on the supported cultures. + * @property [ellipsoid = Ellipsoid.default] - The ellipsoid. If not specified, the default ellipsoid is used. + * @property [tileDiscardPolicy] - The policy that determines if a tile + * is invalid and should be discarded. By default, a {@link DiscardEmptyTileImagePolicy} + * will be used, with the expectation that the Bing Maps server will send a zero-length response for missing tiles. + * To ensure that no tiles are discarded, construct and pass a {@link NeverTileDiscardPolicy} for this parameter. + */ + type ConstructorOptions = { + key?: string; + tileProtocol?: string; + mapStyle?: BingMapsStyle; + mapLayer?: string; + culture?: string; + ellipsoid?: Ellipsoid; + tileDiscardPolicy?: TileDiscardPolicy; + }; + } + + /** + *
+ * To construct a BingMapsImageryProvider, call {@link BingMapsImageryProvider.fromUrl}. Do not call the constructor directly. + *
+ * + * Provides tiled imagery using the Bing Maps Imagery REST API. + * @example + * const bing = await Cesium.BingMapsImageryProvider.fromUrl( + * "https://dev.virtualearth.net", { + * key: "get-yours-at-https://www.bingmapsportal.com/", + * mapStyle: Cesium.BingMapsStyle.AERIAL + * }); + * @param options - Object describing initialization options + */ + export class BingMapsImageryProvider { + constructor(options: BingMapsImageryProvider.ConstructorOptions); + /** + * Gets the name of the BingMaps server url hosting the imagery. + */ + readonly url: string; + /** + * Gets the proxy used by this provider. + */ + readonly proxy: Proxy; + /** + * Gets the Bing Maps key. + */ + readonly key: string; + /** + * Gets the type of Bing Maps imagery to load. + */ + readonly mapStyle: BingMapsStyle; + /** + * Gets the additional map layer options as defined in {@link https://learn.microsoft.com/en-us/bingmaps/rest-services/imagery/get-imagery-metadata#template-parameters}/ + */ + readonly mapLayer: string; + /** + * The culture to use when requesting Bing Maps imagery. Not + * all cultures are supported. See {@link http://msdn.microsoft.com/en-us/library/hh441729.aspx} + * for information on the supported cultures. + */ + readonly culture: string; + /** + * Gets the width of each tile, in pixels. + */ + readonly tileWidth: number; + /** + * Gets the height of each tile, in pixels. + */ + readonly tileHeight: number; + /** + * Gets the maximum level-of-detail that can be requested. + */ + readonly maximumLevel: number | undefined; + /** + * Gets the minimum level-of-detail that can be requested. + */ + readonly minimumLevel: number; + /** + * Gets the tiling scheme used by this provider. + */ + readonly tilingScheme: TilingScheme; + /** + * Gets the rectangle, in radians, of the imagery provided by this instance. + */ + readonly rectangle: Rectangle; + /** + * Gets the tile discard policy. If not undefined, the discard policy is responsible + * for filtering out "missing" tiles via its shouldDiscardImage function. If this function + * returns undefined, no tiles are filtered. + */ + readonly tileDiscardPolicy: TileDiscardPolicy; + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + */ + readonly errorEvent: Event; + /** + * Gets the credit to display when this imagery provider is active. Typically this is used to credit + * the source of the imagery. + */ + readonly credit: Credit; + /** + * Gets a value indicating whether or not the images provided by this imagery provider + * include an alpha channel. If this property is false, an alpha channel, if present, will + * be ignored. If this property is true, any images without an alpha channel will be treated + * as if their alpha is 1.0 everywhere. Setting this property to false reduces memory usage + * and texture upload time. + */ + readonly hasAlphaChannel: boolean; + /** + * Creates an {@link ImageryProvider} which provides tiled imagery using the Bing Maps Imagery REST API. + * @example + * const bing = await Cesium.BingMapsImageryProvider.fromUrl( + * "https://dev.virtualearth.net", { + * key: "get-yours-at-https://www.bingmapsportal.com/", + * mapStyle: Cesium.BingMapsStyle.AERIAL + * }); + * @param url - The url of the Bing Maps server hosting the imagery. + * @param options - Object describing initialization options + * @returns A promise that resolves to the created BingMapsImageryProvider + */ + static fromUrl( + url: Resource | string, + options: BingMapsImageryProvider.ConstructorOptions, + ): Promise; + /** + * Gets the credits to be displayed when a given tile is displayed. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level; + * @returns The credits to be displayed when the tile is displayed. + */ + getTileCredits(x: number, y: number, level: number): Credit[]; + /** + * Requests the image for a given tile. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param [request] - The request object. Intended for internal use only. + * @returns A promise for the image that will resolve when the image is available, or + * undefined if there are too many active requests to the server, and the request should be retried later. + */ + requestImage( + x: number, + y: number, + level: number, + request?: Request, + ): Promise | undefined; + /** + * Picking features is not currently supported by this imagery provider, so this function simply returns + * undefined. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param longitude - The longitude at which to pick features. + * @param latitude - The latitude at which to pick features. + * @returns Undefined since picking is not supported. + */ + pickFeatures( + x: number, + y: number, + level: number, + longitude: number, + latitude: number, + ): undefined; + /** + * Converts a tiles (x, y, level) position into a quadkey used to request an image + * from a Bing Maps server. + * @param x - The tile's x coordinate. + * @param y - The tile's y coordinate. + * @param level - The tile's zoom level. + */ + static tileXYToQuadKey(x: number, y: number, level: number): void; + /** + * Converts a tile's quadkey used to request an image from a Bing Maps server into the + * (x, y, level) position. + * @param quadkey - The tile's quad key + */ + static quadKeyToTileXY(quadkey: string): void; + /** + * Gets or sets the URL to the Bing logo for display in the credit. + */ + static logoUrl: string; + } + + /** + * The types of imagery provided by Bing Maps. + */ + export enum BingMapsStyle { + /** + * Aerial imagery. + */ + AERIAL = "Aerial", + /** + * Aerial imagery with a road overlay. + */ + AERIAL_WITH_LABELS = "AerialWithLabels", + /** + * Aerial imagery with a road overlay. + */ + AERIAL_WITH_LABELS_ON_DEMAND = "AerialWithLabelsOnDemand", + /** + * Roads without additional imagery. + */ + ROAD = "Road", + /** + * Roads without additional imagery. + */ + ROAD_ON_DEMAND = "RoadOnDemand", + /** + * A dark version of the road maps. + */ + CANVAS_DARK = "CanvasDark", + /** + * A lighter version of the road maps. + */ + CANVAS_LIGHT = "CanvasLight", + /** + * A grayscale version of the road maps. + */ + CANVAS_GRAY = "CanvasGray", + /** + * Ordnance Survey imagery. This imagery is visible only for the London, UK area. + */ + ORDNANCE_SURVEY = "OrdnanceSurvey", + /** + * Collins Bart imagery. + */ + COLLINS_BART = "CollinsBart", + } + + /** + * Determines how two pixels' values are combined. + */ + export enum BlendEquation { + /** + * Pixel values are added componentwise. This is used in additive blending for translucency. + */ + ADD = WebGLConstants.FUNC_ADD, + /** + * Pixel values are subtracted componentwise (source - destination). This is used in alpha blending for translucency. + */ + SUBTRACT = WebGLConstants.FUNC_SUBTRACT, + /** + * Pixel values are subtracted componentwise (destination - source). + */ + REVERSE_SUBTRACT = WebGLConstants.FUNC_REVERSE_SUBTRACT, + /** + * Pixel values are given to the minimum function (min(source, destination)). + * + * This equation operates on each pixel color component. + */ + MIN = WebGLConstants.MIN, + /** + * Pixel values are given to the maximum function (max(source, destination)). + * + * This equation operates on each pixel color component. + */ + MAX = WebGLConstants.MAX, + } + + /** + * Determines how blending factors are computed. + */ + export enum BlendFunction { + /** + * The blend factor is zero. + */ + ZERO = WebGLConstants.ZERO, + /** + * The blend factor is one. + */ + ONE = WebGLConstants.ONE, + /** + * The blend factor is the source color. + */ + SOURCE_COLOR = WebGLConstants.SRC_COLOR, + /** + * The blend factor is one minus the source color. + */ + ONE_MINUS_SOURCE_COLOR = WebGLConstants.ONE_MINUS_SRC_COLOR, + /** + * The blend factor is the destination color. + */ + DESTINATION_COLOR = WebGLConstants.DST_COLOR, + /** + * The blend factor is one minus the destination color. + */ + ONE_MINUS_DESTINATION_COLOR = WebGLConstants.ONE_MINUS_DST_COLOR, + /** + * The blend factor is the source alpha. + */ + SOURCE_ALPHA = WebGLConstants.SRC_ALPHA, + /** + * The blend factor is one minus the source alpha. + */ + ONE_MINUS_SOURCE_ALPHA = WebGLConstants.ONE_MINUS_SRC_ALPHA, + /** + * The blend factor is the destination alpha. + */ + DESTINATION_ALPHA = WebGLConstants.DST_ALPHA, + /** + * The blend factor is one minus the destination alpha. + */ + ONE_MINUS_DESTINATION_ALPHA = WebGLConstants.ONE_MINUS_DST_ALPHA, + /** + * The blend factor is the constant color. + */ + CONSTANT_COLOR = WebGLConstants.CONSTANT_COLOR, + /** + * The blend factor is one minus the constant color. + */ + ONE_MINUS_CONSTANT_COLOR = WebGLConstants.ONE_MINUS_CONSTANT_COLOR, + /** + * The blend factor is the constant alpha. + */ + CONSTANT_ALPHA = WebGLConstants.CONSTANT_ALPHA, + /** + * The blend factor is one minus the constant alpha. + */ + ONE_MINUS_CONSTANT_ALPHA = WebGLConstants.ONE_MINUS_CONSTANT_ALPHA, + /** + * The blend factor is the saturated source alpha. + */ + SOURCE_ALPHA_SATURATE = WebGLConstants.SRC_ALPHA_SATURATE, + } + + /** + * Determines how opaque and translucent parts of billboards, points, and labels are blended with the scene. + */ + export enum BlendOption { + /** + * The billboards, points, or labels in the collection are completely opaque. + */ + OPAQUE = 0, + /** + * The billboards, points, or labels in the collection are completely translucent. + */ + TRANSLUCENT = 1, + /** + * The billboards, points, or labels in the collection are both opaque and translucent. + */ + OPAQUE_AND_TRANSLUCENT = 2, + } + + /** + * The blending state combines {@link BlendEquation} and {@link BlendFunction} and the + * enabled flag to define the full blending state for combining source and + * destination fragments when rendering. + *

+ * This is a helper when using custom render states with {@link Appearance#renderState}. + *

+ */ + export namespace BlendingState { + /** + * Blending is disabled. + */ + const DISABLED: any; + /** + * Blending is enabled using alpha blending, source(source.alpha) + destination(1 - source.alpha). + */ + const ALPHA_BLEND: any; + /** + * Blending is enabled using alpha blending with premultiplied alpha, source + destination(1 - source.alpha). + */ + const PRE_MULTIPLIED_ALPHA_BLEND: any; + /** + * Blending is enabled using additive blending, source(source.alpha) + destination. + */ + const ADDITIVE_BLEND: any; + } + + /** + * A ParticleEmitter that emits particles within a box. + * Particles will be positioned randomly within the box and have initial velocities emanating from the center of the box. + * @param dimensions - The width, height and depth dimensions of the box. + */ + export class BoxEmitter { + constructor(dimensions: Cartesian3); + /** + * The width, height and depth dimensions of the box in meters. + */ + dimensions: Cartesian3; + } + + /** + * An orientation given by a pair of unit vectors + * @property direction - The unit "direction" vector + * @property up - The unit "up" vector + */ + export type DirectionUp = { + direction: Cartesian3; + up: Cartesian3; + }; + + /** + * An orientation given by numeric heading, pitch, and roll + * @property [heading = 0.0] - The heading in radians + * @property [pitch = -Math.PI_OVER_TWO] - The pitch in radians + * @property [roll = 0.0] - The roll in radians + */ + export type HeadingPitchRollValues = { + heading?: number; + pitch?: number; + roll?: number; + }; + + /** + * The camera is defined by a position, orientation, and view frustum. + *

+ * The orientation forms an orthonormal basis with a view, up and right = view x up unit vectors. + *

+ * The viewing frustum is defined by 6 planes. + * Each plane is represented by a {@link Cartesian4} object, where the x, y, and z components + * define the unit vector normal to the plane, and the w component is the distance of the + * plane from the origin/camera position. + * @example + * // Create a camera looking down the negative z-axis, positioned at the origin, + * // with a field of view of 60 degrees, and 1:1 aspect ratio. + * const camera = new Cesium.Camera(scene); + * camera.position = new Cesium.Cartesian3(); + * camera.direction = Cesium.Cartesian3.negate(Cesium.Cartesian3.UNIT_Z, new Cesium.Cartesian3()); + * camera.up = Cesium.Cartesian3.clone(Cesium.Cartesian3.UNIT_Y); + * camera.frustum.fov = Cesium.Math.PI_OVER_THREE; + * camera.frustum.near = 1.0; + * camera.frustum.far = 2.0; + * @param scene - The scene. + */ + export class Camera { + constructor(scene: Scene); + /** + * The position of the camera. + */ + position: Cartesian3; + /** + * The view direction of the camera. + */ + direction: Cartesian3; + /** + * The up direction of the camera. + */ + up: Cartesian3; + /** + * The right direction of the camera. + */ + right: Cartesian3; + /** + * The region of space in view. + */ + frustum: + | PerspectiveFrustum + | PerspectiveOffCenterFrustum + | OrthographicFrustum; + /** + * The default amount to move the camera when an argument is not + * provided to the move methods. + */ + defaultMoveAmount: number; + /** + * The default amount to rotate the camera when an argument is not + * provided to the look methods. + */ + defaultLookAmount: number; + /** + * The default amount to rotate the camera when an argument is not + * provided to the rotate methods. + */ + defaultRotateAmount: number; + /** + * The default amount to move the camera when an argument is not + * provided to the zoom methods. + */ + defaultZoomAmount: number; + /** + * If set, the camera will not be able to rotate past this axis in either direction. + */ + constrainedAxis: Cartesian3 | undefined; + /** + * The factor multiplied by the the map size used to determine where to clamp the camera position + * when zooming out from the surface. The default is 1.5. Only valid for 2D and the map is rotatable. + */ + maximumZoomFactor: number; + /** + * The amount the camera has to change before the changed event is raised. The value is a percentage in the [0, 1] range. + */ + percentageChanged: number; + /** + * The default rectangle the camera will view on creation. + */ + static DEFAULT_VIEW_RECTANGLE: Rectangle; + /** + * A scalar to multiply to the camera position and add it back after setting the camera to view the rectangle. + * A value of zero means the camera will view the entire {@link Camera#DEFAULT_VIEW_RECTANGLE}, a value greater than zero + * will move it further away from the extent, and a value less than zero will move it close to the extent. + */ + static DEFAULT_VIEW_FACTOR: number; + /** + * The default heading/pitch/range that is used when the camera flies to a location that contains a bounding sphere. + */ + static DEFAULT_OFFSET: HeadingPitchRange; + /** + * Gets the camera's reference frame. The inverse of this transformation is appended to the view matrix. + */ + readonly transform: Matrix4; + /** + * Gets the inverse camera transform. + */ + readonly inverseTransform: Matrix4; + /** + * Gets the view matrix. + */ + readonly viewMatrix: Matrix4; + /** + * Gets the inverse view matrix. + */ + readonly inverseViewMatrix: Matrix4; + /** + * Gets the {@link Cartographic} position of the camera, with longitude and latitude + * expressed in radians and height in meters. In 2D and Columbus View, it is possible + * for the returned longitude and latitude to be outside the range of valid longitudes + * and latitudes when the camera is outside the map. + */ + readonly positionCartographic: Cartographic; + /** + * Gets the position of the camera in world coordinates. + */ + readonly positionWC: Cartesian3; + /** + * Gets the view direction of the camera in world coordinates. + */ + readonly directionWC: Cartesian3; + /** + * Gets the up direction of the camera in world coordinates. + */ + readonly upWC: Cartesian3; + /** + * Gets the right direction of the camera in world coordinates. + */ + readonly rightWC: Cartesian3; + /** + * Gets the camera heading in radians. + */ + readonly heading: number; + /** + * Gets the camera pitch in radians. + */ + readonly pitch: number; + /** + * Gets the camera roll in radians. + */ + readonly roll: number; + /** + * Gets the event that will be raised at when the camera starts to move. + */ + readonly moveStart: Event; + /** + * Gets the event that will be raised when the camera has stopped moving. + */ + readonly moveEnd: Event; + /** + * Gets the event that will be raised when the camera has changed by percentageChanged. + */ + readonly changed: Event; + /** + * Sets the camera position, orientation and transform. + * @example + * // 1. Set position with a top-down view + * viewer.camera.setView({ + * destination : Cesium.Cartesian3.fromDegrees(-117.16, 32.71, 15000.0) + * }); + * + * // 2 Set view with heading, pitch and roll + * viewer.camera.setView({ + * destination : cartesianPosition, + * orientation: { + * heading : Cesium.Math.toRadians(90.0), // east, default value is 0.0 (north) + * pitch : Cesium.Math.toRadians(-90), // default value (looking down) + * roll : 0.0 // default value + * } + * }); + * + * // 3. Change heading, pitch and roll with the camera position remaining the same. + * viewer.camera.setView({ + * orientation: { + * heading : Cesium.Math.toRadians(90.0), // east, default value is 0.0 (north) + * pitch : Cesium.Math.toRadians(-90), // default value (looking down) + * roll : 0.0 // default value + * } + * }); + * + * + * // 4. View rectangle with a top-down view + * viewer.camera.setView({ + * destination : Cesium.Rectangle.fromDegrees(west, south, east, north) + * }); + * + * // 5. Set position with an orientation using unit vectors. + * viewer.camera.setView({ + * destination : Cesium.Cartesian3.fromDegrees(-122.19, 46.25, 5000.0), + * orientation : { + * direction : new Cesium.Cartesian3(-0.04231243104240401, -0.20123236049443421, -0.97862924300734), + * up : new Cesium.Cartesian3(-0.47934589305293746, -0.8553216253114552, 0.1966022179118339) + * } + * }); + * @param options - Object with the following properties: + * @param [options.destination] - The final position of the camera in world coordinates or a rectangle that would be visible from a top-down view. + * @param [options.orientation] - An object that contains either direction and up properties or heading, pitch and roll properties. By default, the direction will point + * towards the center of the frame in 3D and in the negative z direction in Columbus view. The up direction will point towards local north in 3D and in the positive + * y direction in Columbus view. Orientation is not used in 2D when in infinite scrolling mode. + * @param [options.endTransform] - Transform matrix representing the reference frame of the camera. + * @param [options.convert] - Whether to convert the destination from world coordinates to scene coordinates (only relevant when not using 3D). Defaults to true. + */ + setView(options: { + destination?: Cartesian3 | Rectangle; + orientation?: HeadingPitchRollValues | DirectionUp; + endTransform?: Matrix4; + convert?: boolean; + }): void; + /** + * Fly the camera to the home view. Use {@link Camera#.DEFAULT_VIEW_RECTANGLE} to set + * the default view for the 3D scene. The home view for 2D and columbus view shows the + * entire map. + * @param [duration] - The duration of the flight in seconds. If omitted, Cesium attempts to calculate an ideal duration based on the distance to be traveled by the flight. See {@link Camera#flyTo} + */ + flyHome(duration?: number): void; + /** + * Transform a vector or point from world coordinates to the camera's reference frame. + * @param cartesian - The vector or point to transform. + * @param [result] - The object onto which to store the result. + * @returns The transformed vector or point. + */ + worldToCameraCoordinates( + cartesian: Cartesian4, + result?: Cartesian4, + ): Cartesian4; + /** + * Transform a point from world coordinates to the camera's reference frame. + * @param cartesian - The point to transform. + * @param [result] - The object onto which to store the result. + * @returns The transformed point. + */ + worldToCameraCoordinatesPoint( + cartesian: Cartesian3, + result?: Cartesian3, + ): Cartesian3; + /** + * Transform a vector from world coordinates to the camera's reference frame. + * @param cartesian - The vector to transform. + * @param [result] - The object onto which to store the result. + * @returns The transformed vector. + */ + worldToCameraCoordinatesVector( + cartesian: Cartesian3, + result?: Cartesian3, + ): Cartesian3; + /** + * Transform a vector or point from the camera's reference frame to world coordinates. + * @param cartesian - The vector or point to transform. + * @param [result] - The object onto which to store the result. + * @returns The transformed vector or point. + */ + cameraToWorldCoordinates( + cartesian: Cartesian4, + result?: Cartesian4, + ): Cartesian4; + /** + * Transform a point from the camera's reference frame to world coordinates. + * @param cartesian - The point to transform. + * @param [result] - The object onto which to store the result. + * @returns The transformed point. + */ + cameraToWorldCoordinatesPoint( + cartesian: Cartesian3, + result?: Cartesian3, + ): Cartesian3; + /** + * Transform a vector from the camera's reference frame to world coordinates. + * @param cartesian - The vector to transform. + * @param [result] - The object onto which to store the result. + * @returns The transformed vector. + */ + cameraToWorldCoordinatesVector( + cartesian: Cartesian3, + result?: Cartesian3, + ): Cartesian3; + /** + * Translates the camera's position by amount along direction. + * @param direction - The direction to move. + * @param [amount] - The amount, in meters, to move. Defaults to defaultMoveAmount. + */ + move(direction: Cartesian3, amount?: number): void; + /** + * Translates the camera's position by amount along the camera's view vector. + * When in 2D mode, this will zoom in the camera instead of translating the camera's position. + * @param [amount] - The amount, in meters, to move. Defaults to defaultMoveAmount. + */ + moveForward(amount?: number): void; + /** + * Translates the camera's position by amount along the opposite direction + * of the camera's view vector. + * When in 2D mode, this will zoom out the camera instead of translating the camera's position. + * @param [amount] - The amount, in meters, to move. Defaults to defaultMoveAmount. + */ + moveBackward(amount?: number): void; + /** + * Translates the camera's position by amount along the camera's up vector. + * @param [amount] - The amount, in meters, to move. Defaults to defaultMoveAmount. + */ + moveUp(amount?: number): void; + /** + * Translates the camera's position by amount along the opposite direction + * of the camera's up vector. + * @param [amount] - The amount, in meters, to move. Defaults to defaultMoveAmount. + */ + moveDown(amount?: number): void; + /** + * Translates the camera's position by amount along the camera's right vector. + * @param [amount] - The amount, in meters, to move. Defaults to defaultMoveAmount. + */ + moveRight(amount?: number): void; + /** + * Translates the camera's position by amount along the opposite direction + * of the camera's right vector. + * @param [amount] - The amount, in meters, to move. Defaults to defaultMoveAmount. + */ + moveLeft(amount?: number): void; + /** + * Rotates the camera around its up vector by amount, in radians, in the opposite direction + * of its right vector if not in 2D mode. + * @param [amount] - The amount, in radians, to rotate by. Defaults to defaultLookAmount. + */ + lookLeft(amount?: number): void; + /** + * Rotates the camera around its up vector by amount, in radians, in the direction + * of its right vector if not in 2D mode. + * @param [amount] - The amount, in radians, to rotate by. Defaults to defaultLookAmount. + */ + lookRight(amount?: number): void; + /** + * Rotates the camera around its right vector by amount, in radians, in the direction + * of its up vector if not in 2D mode. + * @param [amount] - The amount, in radians, to rotate by. Defaults to defaultLookAmount. + */ + lookUp(amount?: number): void; + /** + * Rotates the camera around its right vector by amount, in radians, in the opposite direction + * of its up vector if not in 2D mode. + * @param [amount] - The amount, in radians, to rotate by. Defaults to defaultLookAmount. + */ + lookDown(amount?: number): void; + /** + * Rotate each of the camera's orientation vectors around axis by angle + * @param axis - The axis to rotate around. + * @param [angle] - The angle, in radians, to rotate by. Defaults to defaultLookAmount. + */ + look(axis: Cartesian3, angle?: number): void; + /** + * Rotate the camera counter-clockwise around its direction vector by amount, in radians. + * @param [amount] - The amount, in radians, to rotate by. Defaults to defaultLookAmount. + */ + twistLeft(amount?: number): void; + /** + * Rotate the camera clockwise around its direction vector by amount, in radians. + * @param [amount] - The amount, in radians, to rotate by. Defaults to defaultLookAmount. + */ + twistRight(amount?: number): void; + /** + * Rotates the camera around axis by angle. The distance + * of the camera's position to the center of the camera's reference frame remains the same. + * @param axis - The axis to rotate around given in world coordinates. + * @param [angle] - The angle, in radians, to rotate by. Defaults to defaultRotateAmount. + */ + rotate(axis: Cartesian3, angle?: number): void; + /** + * Rotates the camera around the center of the camera's reference frame by angle downwards. + * @param [angle] - The angle, in radians, to rotate by. Defaults to defaultRotateAmount. + */ + rotateDown(angle?: number): void; + /** + * Rotates the camera around the center of the camera's reference frame by angle upwards. + * @param [angle] - The angle, in radians, to rotate by. Defaults to defaultRotateAmount. + */ + rotateUp(angle?: number): void; + /** + * Rotates the camera around the center of the camera's reference frame by angle to the right. + * @param [angle] - The angle, in radians, to rotate by. Defaults to defaultRotateAmount. + */ + rotateRight(angle?: number): void; + /** + * Rotates the camera around the center of the camera's reference frame by angle to the left. + * @param [angle] - The angle, in radians, to rotate by. Defaults to defaultRotateAmount. + */ + rotateLeft(angle?: number): void; + /** + * Zooms amount along the camera's view vector. + * @param [amount] - The amount to move. Defaults to defaultZoomAmount. + */ + zoomIn(amount?: number): void; + /** + * Zooms amount along the opposite direction of + * the camera's view vector. + * @param [amount] - The amount to move. Defaults to defaultZoomAmount. + */ + zoomOut(amount?: number): void; + /** + * Gets the magnitude of the camera position. In 3D, this is the vector magnitude. In 2D and + * Columbus view, this is the distance to the map. + * @returns The magnitude of the position. + */ + getMagnitude(): number; + /** + * Sets the camera position and orientation using a target and offset. The target must be given in + * world coordinates. The offset can be either a cartesian or heading/pitch/range in the local east-north-up reference frame centered at the target. + * If the offset is a cartesian, then it is an offset from the center of the reference frame defined by the transformation matrix. If the offset + * is heading/pitch/range, then the heading and the pitch angles are defined in the reference frame defined by the transformation matrix. + * The heading is the angle from y axis and increasing towards the x axis. Pitch is the rotation from the xy-plane. Positive pitch + * angles are below the plane. Negative pitch angles are above the plane. The range is the distance from the center. + * + * In 2D, there must be a top down view. The camera will be placed above the target looking down. The height above the + * target will be the magnitude of the offset. The heading will be determined from the offset. If the heading cannot be + * determined from the offset, the heading will be north. + * @example + * // 1. Using a cartesian offset + * const center = Cesium.Cartesian3.fromDegrees(-98.0, 40.0); + * viewer.camera.lookAt(center, new Cesium.Cartesian3(0.0, -4790000.0, 3930000.0)); + * + * // 2. Using a HeadingPitchRange offset + * const center = Cesium.Cartesian3.fromDegrees(-72.0, 40.0); + * const heading = Cesium.Math.toRadians(50.0); + * const pitch = Cesium.Math.toRadians(-20.0); + * const range = 5000.0; + * viewer.camera.lookAt(center, new Cesium.HeadingPitchRange(heading, pitch, range)); + * @param target - The target position in world coordinates. + * @param offset - The offset from the target in the local east-north-up reference frame centered at the target. + */ + lookAt(target: Cartesian3, offset: Cartesian3 | HeadingPitchRange): void; + /** + * Sets the camera position and orientation using a target and transformation matrix. The offset can be either a cartesian or heading/pitch/range. + * If the offset is a cartesian, then it is an offset from the center of the reference frame defined by the transformation matrix. If the offset + * is heading/pitch/range, then the heading and the pitch angles are defined in the reference frame defined by the transformation matrix. + * The heading is the angle from y axis and increasing towards the x axis. Pitch is the rotation from the xy-plane. Positive pitch + * angles are below the plane. Negative pitch angles are above the plane. The range is the distance from the center. + * + * In 2D, there must be a top down view. The camera will be placed above the center of the reference frame. The height above the + * target will be the magnitude of the offset. The heading will be determined from the offset. If the heading cannot be + * determined from the offset, the heading will be north. + * @example + * // 1. Using a cartesian offset + * const transform = Cesium.Transforms.eastNorthUpToFixedFrame(Cesium.Cartesian3.fromDegrees(-98.0, 40.0)); + * viewer.camera.lookAtTransform(transform, new Cesium.Cartesian3(0.0, -4790000.0, 3930000.0)); + * + * // 2. Using a HeadingPitchRange offset + * const transform = Cesium.Transforms.eastNorthUpToFixedFrame(Cesium.Cartesian3.fromDegrees(-72.0, 40.0)); + * const heading = Cesium.Math.toRadians(50.0); + * const pitch = Cesium.Math.toRadians(-20.0); + * const range = 5000.0; + * viewer.camera.lookAtTransform(transform, new Cesium.HeadingPitchRange(heading, pitch, range)); + * @param transform - The transformation matrix defining the reference frame. + * @param [offset] - The offset from the target in a reference frame centered at the target. + */ + lookAtTransform( + transform: Matrix4, + offset?: Cartesian3 | HeadingPitchRange, + ): void; + /** + * Get the camera position needed to view a rectangle on an ellipsoid or map + * @param rectangle - The rectangle to view. + * @param [result] - The camera position needed to view the rectangle + * @returns The camera position needed to view the rectangle + */ + getRectangleCameraCoordinates( + rectangle: Rectangle, + result?: Cartesian3, + ): Cartesian3; + /** + * Pick an ellipsoid or map. + * @example + * const canvas = viewer.scene.canvas; + * const center = new Cesium.Cartesian2(canvas.clientWidth / 2.0, canvas.clientHeight / 2.0); + * const ellipsoid = viewer.scene.ellipsoid; + * const result = viewer.camera.pickEllipsoid(center, ellipsoid); + * @param windowPosition - The x and y coordinates of a pixel. + * @param [ellipsoid = Ellipsoid.default] - The ellipsoid to pick. + * @param [result] - The object onto which to store the result. + * @returns If the ellipsoid or map was picked, + * returns the point on the surface of the ellipsoid or map in world + * coordinates. If the ellipsoid or map was not picked, returns undefined. + */ + pickEllipsoid( + windowPosition: Cartesian2, + ellipsoid?: Ellipsoid, + result?: Cartesian3, + ): Cartesian3 | undefined; + /** + * Create a ray from the camera position through the pixel at windowPosition + * in world coordinates. + * @param windowPosition - The x and y coordinates of a pixel. + * @param [result] - The object onto which to store the result. + * @returns Returns the {@link Cartesian3} position and direction of the ray, or undefined if the pick ray cannot be determined. + */ + getPickRay(windowPosition: Cartesian2, result?: Ray): Ray | undefined; + /** + * Return the distance from the camera to the front of the bounding sphere. + * @param boundingSphere - The bounding sphere in world coordinates. + * @returns The distance to the bounding sphere. + */ + distanceToBoundingSphere(boundingSphere: BoundingSphere): number; + /** + * Return the pixel size in meters. + * @param boundingSphere - The bounding sphere in world coordinates. + * @param drawingBufferWidth - The drawing buffer width. + * @param drawingBufferHeight - The drawing buffer height. + * @returns The pixel size in meters. + */ + getPixelSize( + boundingSphere: BoundingSphere, + drawingBufferWidth: number, + drawingBufferHeight: number, + ): number; + /** + * Cancels the current camera flight and leaves the camera at its current location. + * If no flight is in progress, this function does nothing. + */ + cancelFlight(): void; + /** + * Completes the current camera flight and moves the camera immediately to its final destination. + * If no flight is in progress, this function does nothing. + */ + completeFlight(): void; + /** + * Flies the camera from its current position to a new position. + * @example + * // 1. Fly to a position with a top-down view + * viewer.camera.flyTo({ + * destination : Cesium.Cartesian3.fromDegrees(-117.16, 32.71, 15000.0) + * }); + * + * // 2. Fly to a Rectangle with a top-down view + * viewer.camera.flyTo({ + * destination : Cesium.Rectangle.fromDegrees(west, south, east, north) + * }); + * + * // 3. Fly to a position with an orientation using unit vectors. + * viewer.camera.flyTo({ + * destination : Cesium.Cartesian3.fromDegrees(-122.19, 46.25, 5000.0), + * orientation : { + * direction : new Cesium.Cartesian3(-0.04231243104240401, -0.20123236049443421, -0.97862924300734), + * up : new Cesium.Cartesian3(-0.47934589305293746, -0.8553216253114552, 0.1966022179118339) + * } + * }); + * + * // 4. Fly to a position with an orientation using heading, pitch and roll. + * viewer.camera.flyTo({ + * destination : Cesium.Cartesian3.fromDegrees(-122.19, 46.25, 5000.0), + * orientation : { + * heading : Cesium.Math.toRadians(175.0), + * pitch : Cesium.Math.toRadians(-35.0), + * roll : 0.0 + * } + * }); + * @param options - Object with the following properties: + * @param options.destination - The final position of the camera in world coordinates or a rectangle that would be visible from a top-down view. + * @param [options.orientation] - An object that contains either direction and up properties or heading, pitch and roll properties. By default, the direction will point + * towards the center of the frame in 3D and in the negative z direction in Columbus view. The up direction will point towards local north in 3D and in the positive + * y direction in Columbus view. Orientation is not used in 2D when in infinite scrolling mode. + * @param [options.duration] - The duration of the flight in seconds. If omitted, Cesium attempts to calculate an ideal duration based on the distance to be traveled by the flight. + * @param [options.complete] - The function to execute when the flight is complete. + * @param [options.cancel] - The function to execute if the flight is cancelled. + * @param [options.endTransform] - Transform matrix representing the reference frame the camera will be in when the flight is completed. + * @param [options.maximumHeight] - The maximum height at the peak of the flight. + * @param [options.pitchAdjustHeight] - If camera flyes higher than that value, adjust pitch duiring the flight to look down, and keep Earth in viewport. + * @param [options.flyOverLongitude] - There are always two ways between 2 points on globe. This option force camera to choose fight direction to fly over that longitude. + * @param [options.flyOverLongitudeWeight] - Fly over the lon specifyed via flyOverLongitude only if that way is not longer than short way times flyOverLongitudeWeight. + * @param [options.convert] - Whether to convert the destination from world coordinates to scene coordinates (only relevant when not using 3D). Defaults to true. + * @param [options.easingFunction] - Controls how the time is interpolated over the duration of the flight. + */ + flyTo(options: { + destination: Cartesian3 | Rectangle; + orientation?: any; + duration?: number; + complete?: Camera.FlightCompleteCallback; + cancel?: Camera.FlightCancelledCallback; + endTransform?: Matrix4; + maximumHeight?: number; + pitchAdjustHeight?: number; + flyOverLongitude?: number; + flyOverLongitudeWeight?: number; + convert?: boolean; + easingFunction?: EasingFunction.Callback; + }): void; + /** + * Sets the camera so that the current view contains the provided bounding sphere. + * + *

The offset is heading/pitch/range in the local east-north-up reference frame centered at the center of the bounding sphere. + * The heading and the pitch angles are defined in the local east-north-up reference frame. + * The heading is the angle from y axis and increasing towards the x axis. Pitch is the rotation from the xy-plane. Positive pitch + * angles are below the plane. Negative pitch angles are above the plane. The range is the distance from the center. If the range is + * zero, a range will be computed such that the whole bounding sphere is visible.

+ * + *

In 2D, there must be a top down view. The camera will be placed above the target looking down. The height above the + * target will be the range. The heading will be determined from the offset. If the heading cannot be + * determined from the offset, the heading will be north.

+ * @param boundingSphere - The bounding sphere to view, in world coordinates. + * @param [offset] - The offset from the target in the local east-north-up reference frame centered at the target. + */ + viewBoundingSphere( + boundingSphere: BoundingSphere, + offset?: HeadingPitchRange, + ): void; + /** + * Flies the camera to a location where the current view contains the provided bounding sphere. + * + *

The offset is heading/pitch/range in the local east-north-up reference frame centered at the center of the bounding sphere. + * The heading and the pitch angles are defined in the local east-north-up reference frame. + * The heading is the angle from y axis and increasing towards the x axis. Pitch is the rotation from the xy-plane. Positive pitch + * angles are below the plane. Negative pitch angles are above the plane. The range is the distance from the center. If the range is + * zero, a range will be computed such that the whole bounding sphere is visible.

+ * + *

In 2D and Columbus View, there must be a top down view. The camera will be placed above the target looking down. The height above the + * target will be the range. The heading will be aligned to local north.

+ * @param boundingSphere - The bounding sphere to view, in world coordinates. + * @param [options] - Object with the following properties: + * @param [options.duration] - The duration of the flight in seconds. If omitted, Cesium attempts to calculate an ideal duration based on the distance to be traveled by the flight. + * @param [options.offset] - The offset from the target in the local east-north-up reference frame centered at the target. + * @param [options.complete] - The function to execute when the flight is complete. + * @param [options.cancel] - The function to execute if the flight is cancelled. + * @param [options.endTransform] - Transform matrix representing the reference frame the camera will be in when the flight is completed. + * @param [options.maximumHeight] - The maximum height at the peak of the flight. + * @param [options.pitchAdjustHeight] - If camera flyes higher than that value, adjust pitch duiring the flight to look down, and keep Earth in viewport. + * @param [options.flyOverLongitude] - There are always two ways between 2 points on globe. This option force camera to choose fight direction to fly over that longitude. + * @param [options.flyOverLongitudeWeight] - Fly over the lon specifyed via flyOverLongitude only if that way is not longer than short way times flyOverLongitudeWeight. + * @param [options.easingFunction] - Controls how the time is interpolated over the duration of the flight. + */ + flyToBoundingSphere( + boundingSphere: BoundingSphere, + options?: { + duration?: number; + offset?: HeadingPitchRange; + complete?: Camera.FlightCompleteCallback; + cancel?: Camera.FlightCancelledCallback; + endTransform?: Matrix4; + maximumHeight?: number; + pitchAdjustHeight?: number; + flyOverLongitude?: number; + flyOverLongitudeWeight?: number; + easingFunction?: EasingFunction.Callback; + }, + ): void; + /** + * Computes the approximate visible rectangle on the ellipsoid. + * @param [ellipsoid = Ellipsoid.default] - The ellipsoid that you want to know the visible region. + * @param [result] - The rectangle in which to store the result + * @returns The visible rectangle or undefined if the ellipsoid isn't visible at all. + */ + computeViewRectangle( + ellipsoid?: Ellipsoid, + result?: Rectangle, + ): Rectangle | undefined; + /** + * Switches the frustum/projection to perspective. + * + * This function is a no-op in 2D which must always be orthographic. + */ + switchToPerspectiveFrustum(): void; + /** + * Switches the frustum/projection to orthographic. + * + * This function is a no-op in 2D which will always be orthographic. + */ + switchToOrthographicFrustum(): void; + } + + export namespace Camera { + /** + * A function that will execute when a flight completes. + */ + type FlightCompleteCallback = () => void; + /** + * A function that will execute when a flight is cancelled. + */ + type FlightCancelledCallback = () => void; + } + + /** + * Aggregates input events. For example, suppose the following inputs are received between frames: + * left mouse button down, mouse move, mouse move, left mouse button up. These events will be aggregated into + * one event with a start and end position of the mouse. + * @param [canvas = document] - The element to handle events for. + */ + export class CameraEventAggregator { + constructor(canvas?: HTMLCanvasElement); + /** + * Gets the current mouse position. + */ + currentMousePosition: Cartesian2; + /** + * Gets whether any mouse button is down, a touch has started, or the wheel has been moved. + */ + anyButtonDown: boolean; + /** + * Gets if a mouse button down or touch has started and has been moved. + * @param type - The camera event type. + * @param [modifier] - The keyboard modifier. + * @returns Returns true if a mouse button down or touch has started and has been moved; otherwise, false + */ + isMoving(type: CameraEventType, modifier?: KeyboardEventModifier): boolean; + /** + * Gets the aggregated start and end position of the current event. + * @param type - The camera event type. + * @param [modifier] - The keyboard modifier. + * @returns An object with two {@link Cartesian2} properties: startPosition and endPosition. + */ + getMovement(type: CameraEventType, modifier?: KeyboardEventModifier): any; + /** + * Gets the start and end position of the last move event (not the aggregated event). + * @param type - The camera event type. + * @param [modifier] - The keyboard modifier. + * @returns An object with two {@link Cartesian2} properties: startPosition and endPosition or undefined. + */ + getLastMovement( + type: CameraEventType, + modifier?: KeyboardEventModifier, + ): any | undefined; + /** + * Gets whether the mouse button is down or a touch has started. + * @param type - The camera event type. + * @param [modifier] - The keyboard modifier. + * @returns Whether the mouse button is down or a touch has started. + */ + isButtonDown( + type: CameraEventType, + modifier?: KeyboardEventModifier, + ): boolean; + /** + * Gets the mouse position that started the aggregation. + * @param type - The camera event type. + * @param [modifier] - The keyboard modifier. + * @returns The mouse position. + */ + getStartMousePosition( + type: CameraEventType, + modifier?: KeyboardEventModifier, + ): Cartesian2; + /** + * Gets the time the button was pressed or the touch was started. + * @param type - The camera event type. + * @param [modifier] - The keyboard modifier. + * @returns The time the button was pressed or the touch was started. + */ + getButtonPressTime( + type: CameraEventType, + modifier?: KeyboardEventModifier, + ): Date; + /** + * Gets the time the button was released or the touch was ended. + * @param type - The camera event type. + * @param [modifier] - The keyboard modifier. + * @returns The time the button was released or the touch was ended. + */ + getButtonReleaseTime( + type: CameraEventType, + modifier?: KeyboardEventModifier, + ): Date; + /** + * Signals that all of the events have been handled and the aggregator should be reset to handle new events. + */ + reset(): void; + /** + * Returns true if this object was destroyed; otherwise, false. + *

+ * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Removes mouse listeners held by this object. + *

+ * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * handler = handler && handler.destroy(); + */ + destroy(): void; + } + + /** + * Enumerates the available input for interacting with the camera. + */ + export enum CameraEventType { + /** + * A left mouse button press followed by moving the mouse and releasing the button. + */ + LEFT_DRAG = 0, + /** + * A right mouse button press followed by moving the mouse and releasing the button. + */ + RIGHT_DRAG = 1, + /** + * A middle mouse button press followed by moving the mouse and releasing the button. + */ + MIDDLE_DRAG = 2, + /** + * Scrolling the middle mouse button. + */ + WHEEL = 3, + /** + * A two-finger touch on a touch surface. + */ + PINCH = 4, + } + + /** + * A tile in a {@link Cesium3DTileset}. When a tile is first created, its content is not loaded; + * the content is loaded on-demand when needed based on the view. + *

+ * Do not construct this directly, instead access tiles through {@link Cesium3DTileset#tileVisible}. + *

+ * @param tileset - The tileset + * @param baseResource - The base resource for the tileset + * @param header - The JSON header for the tile + * @param parent - The parent tile of the new tile + */ + export class Cesium3DTile { + constructor( + tileset: Cesium3DTileset, + baseResource: Resource, + header: any, + parent: Cesium3DTile, + ); + /** + * The local transform of this tile. + */ + transform: Matrix4; + /** + * The final computed transform of this tile. + */ + readonly computedTransform: Matrix4; + /** + * The error, in meters, introduced if this tile is rendered and its children are not. + * This is used to compute screen space error, i.e., the error measured in pixels. + */ + readonly geometricError: number; + /** + * Gets the tile's children. + */ + readonly children: Cesium3DTile[]; + /** + * This tile's parent or undefined if this tile is the root. + *

+ * When a tile's content points to an external tileset JSON file, the external tileset's + * root tile's parent is not undefined; instead, the parent references + * the tile (with its content pointing to an external tileset JSON file) as if the two tilesets were merged. + *

+ */ + readonly parent: Cesium3DTile; + /** + * The time in seconds after the tile's content is ready when the content expires and new content is requested. + */ + expireDuration: number; + /** + * The date when the content expires and new content is requested. + */ + expireDate: JulianDate; + /** + * The tileset containing this tile. + */ + readonly tileset: Cesium3DTileset; + /** + * The tile's content. This represents the actual tile's payload, + * not the content's metadata in the tileset JSON file. + */ + readonly content: Cesium3DTileContent; + /** + * Get the bounding sphere derived from the tile's bounding volume. + */ + readonly boundingSphere: BoundingSphere; + /** + * Returns the extras property in the tileset JSON for this tile, which contains application specific metadata. + * Returns undefined if extras does not exist. + */ + readonly extras: any; + /** + * Gets the I3S Node for the tile. + */ + i3sNode: string; + } + + /** + * Defines how per-feature colors set from the Cesium API or declarative styling blend with the source colors from + * the original feature, e.g. glTF material or per-point color in the tile. + *

+ * When REPLACE or MIX are used and the source color is a glTF material, the technique must assign the + * _3DTILESDIFFUSE semantic to the diffuse color parameter. Otherwise only HIGHLIGHT is supported. + *

+ *

+ * A feature whose color evaluates to white (1.0, 1.0, 1.0) is always rendered without color blending, regardless of the + * tileset's color blend mode. + *

+ *

+   * "techniques": {
+   *   "technique0": {
+   *     "parameters": {
+   *       "diffuse": {
+   *         "semantic": "_3DTILESDIFFUSE",
+   *         "type": 35666
+   *       }
+   *     }
+   *   }
+   * }
+   * 
+ */ + export enum Cesium3DTileColorBlendMode { + /** + * Multiplies the source color by the feature color. + */ + HIGHLIGHT = 0, + /** + * Replaces the source color with the feature color. + */ + REPLACE = 1, + /** + * Blends the source color and feature color together. + */ + MIX = 2, + } + + /** + * The content of a tile in a {@link Cesium3DTileset}. + *

+ * Derived classes of this interface provide access to individual features in the tile. + * Access derived objects through {@link Cesium3DTile#content}. + *

+ *

+ * This type describes an interface and is not intended to be instantiated directly. + *

+ */ + export class Cesium3DTileContent { + constructor(); + /** + * Gets the number of features in the tile. + */ + readonly featuresLength: number; + /** + * Gets the number of points in the tile. + *

+ * Only applicable for tiles with Point Cloud content. This is different than {@link Cesium3DTileContent#featuresLength} which + * equals the number of groups of points as distinguished by the BATCH_ID feature table semantic. + *

+ */ + readonly pointsLength: number; + /** + * Gets the number of triangles in the tile. + */ + readonly trianglesLength: number; + /** + * Gets the tile's geometry memory in bytes. + */ + readonly geometryByteLength: number; + /** + * Gets the tile's texture memory in bytes. + */ + readonly texturesByteLength: number; + /** + * Gets the amount of memory used by the batch table textures and any binary + * metadata properties not accounted for in geometryByteLength or + * texturesByteLength + */ + readonly batchTableByteLength: number; + /** + * Gets the array of {@link Cesium3DTileContent} objects for contents that contain other contents, such as composite tiles. The inner contents may in turn have inner contents, such as a composite tile that contains a composite tile. + */ + readonly innerContents: any[]; + /** + * Returns true when the tile's content is ready to render; otherwise false + */ + readonly ready: boolean; + /** + * Gets the tileset for this tile. + */ + readonly tileset: Cesium3DTileset; + /** + * Gets the tile containing this content. + */ + readonly tile: Cesium3DTile; + /** + * Gets the url of the tile's content. + */ + readonly url: string; + /** + * Returns whether the feature has this property. + * @param batchId - The batchId for the feature. + * @param name - The case-sensitive name of the property. + * @returns true if the feature has this property; otherwise, false. + */ + hasProperty(batchId: number, name: string): boolean; + /** + * Returns the {@link Cesium3DTileFeature} object for the feature with the + * given batchId. This object is used to get and modify the + * feature's properties. + *

+ * Features in a tile are ordered by batchId, an index used to retrieve their metadata from the batch table. + *

+ * @param batchId - The batchId for the feature. + * @returns The corresponding {@link Cesium3DTileFeature} object. + */ + getFeature(batchId: number): Cesium3DTileFeature; + } + + /** + * A feature of a {@link Cesium3DTileset}. + *

+ * Provides access to a feature's properties stored in the tile's batch table, as well + * as the ability to show/hide a feature and change its highlight color via + * {@link Cesium3DTileFeature#show} and {@link Cesium3DTileFeature#color}, respectively. + *

+ *

+ * Modifications to a Cesium3DTileFeature object have the lifetime of the tile's + * content. If the tile's content is unloaded, e.g., due to it going out of view and needing + * to free space in the cache for visible tiles, listen to the {@link Cesium3DTileset#tileUnload} event to save any + * modifications. Also listen to the {@link Cesium3DTileset#tileVisible} event to reapply any modifications. + *

+ *

+ * Do not construct this directly. Access it through {@link Cesium3DTileContent#getFeature} + * or picking using {@link Scene#pick}. + *

+ * @example + * // On mouse over, display all the properties for a feature in the console log. + * handler.setInputAction(function(movement) { + * const feature = scene.pick(movement.endPosition); + * if (feature instanceof Cesium.Cesium3DTileFeature) { + * const propertyIds = feature.getPropertyIds(); + * const length = propertyIds.length; + * for (let i = 0; i < length; ++i) { + * const propertyId = propertyIds[i]; + * console.log(`{propertyId}: ${feature.getProperty(propertyId)}`); + * } + * } + * }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); + */ + export class Cesium3DTileFeature { + constructor(); + /** + * Gets or sets if the feature will be shown. This is set for all features + * when a style's show is evaluated. + */ + show: boolean; + /** + * Gets or sets the highlight color multiplied with the feature's color. When + * this is white, the feature's color is not changed. This is set for all features + * when a style's color is evaluated. + */ + color: Color; + /** + * Gets a typed array containing the ECEF positions of the polyline. + * Returns undefined if {@link Cesium3DTileset#vectorKeepDecodedPositions} is false + * or the feature is not a polyline in a vector tile. + */ + polylinePositions: Float64Array; + /** + * Gets the tileset containing the feature. + */ + readonly tileset: Cesium3DTileset; + /** + * All objects returned by {@link Scene#pick} have a primitive property. This returns + * the tileset containing the feature. + */ + readonly primitive: Cesium3DTileset; + /** + * Get the feature ID associated with this feature. For 3D Tiles 1.0, the + * batch ID is returned. For EXT_mesh_features, this is the feature ID from + * the selected feature ID set. + */ + readonly featureId: number; + /** + * Returns whether the feature contains this property. This includes properties from this feature's + * class and inherited classes when using a batch table hierarchy. + * @param name - The case-sensitive name of the property. + * @returns Whether the feature contains this property. + */ + hasProperty(name: string): boolean; + /** + * Returns an array of property IDs for the feature. This includes properties from this feature's + * class and inherited classes when using a batch table hierarchy. + * @param [results] - An array into which to store the results. + * @returns The IDs of the feature's properties. + */ + getPropertyIds(results?: string[]): string[]; + /** + * Returns a copy of the value of the feature's property with the given name. This includes properties from this feature's + * class and inherited classes when using a batch table hierarchy. + * @example + * // Display all the properties for a feature in the console log. + * const propertyIds = feature.getPropertyIds(); + * const length = propertyIds.length; + * for (let i = 0; i < length; ++i) { + * const propertyId = propertyIds[i]; + * console.log(`{propertyId}: ${feature.getProperty(propertyId)}`); + * } + * @param name - The case-sensitive name of the property. + * @returns The value of the property or undefined if the feature does not have this property. + */ + getProperty(name: string): any; + /** + * Returns a copy of the feature's property with the given name, examining all + * the metadata from 3D Tiles 1.0 formats, the EXT_structural_metadata and legacy + * EXT_feature_metadata glTF extensions, and the metadata present either in the + * tileset JSON (3D Tiles 1.1) or in the 3DTILES_metadata 3D Tiles extension. + * Metadata is checked against name from most specific to most general and the + * first match is returned. Metadata is checked in this order: + * + *
    + *
  1. Batch table (structural metadata) property by semantic
  2. + *
  3. Batch table (structural metadata) property by property ID
  4. + *
  5. Content metadata property by semantic
  6. + *
  7. Content metadata property by property
  8. + *
  9. Tile metadata property by semantic
  10. + *
  11. Tile metadata property by property ID
  12. + *
  13. Subtree metadata property by semantic
  14. + *
  15. Subtree metadata property by property ID
  16. + *
  17. Group metadata property by semantic
  18. + *
  19. Group metadata property by property ID
  20. + *
  21. Tileset metadata property by semantic
  22. + *
  23. Tileset metadata property by property ID
  24. + *
  25. Otherwise, return undefined
  26. + *
+ *

+ * For 3D Tiles Next details, see the {@link https://github.com/CesiumGS/3d-tiles/tree/main/extensions/3DTILES_metadata|3DTILES_metadata Extension} + * for 3D Tiles, as well as the {@link https://github.com/CesiumGS/glTF/tree/3d-tiles-next/extensions/2.0/Vendor/EXT_structural_metadata|EXT_structural_metadata Extension} + * for glTF. For the legacy glTF extension, see {@link https://github.com/CesiumGS/glTF/tree/3d-tiles-next/extensions/2.0/Vendor/EXT_feature_metadata|EXT_feature_metadata Extension} + *

+ * @param content - The content for accessing the metadata + * @param batchId - The batch ID (or feature ID) of the feature to get a property for + * @param name - The semantic or property ID of the feature. Semantics are checked before property IDs in each granularity of metadata. + * @returns The value of the property or undefined if the feature does not have this property. + */ + static getPropertyInherited( + content: Cesium3DTileContent, + batchId: number, + name: string, + ): any; + /** + * Sets the value of the feature's property with the given name. + *

+ * If a property with the given name doesn't exist, it is created. + *

+ * @example + * const height = feature.getProperty('Height'); // e.g., the height of a building + * @example + * const name = 'clicked'; + * if (feature.getProperty(name)) { + * console.log('already clicked'); + * } else { + * feature.setProperty(name, true); + * console.log('first click'); + * } + * @param name - The case-sensitive name of the property. + * @param value - The value of the property that will be copied. + */ + setProperty(name: string, value: any): void; + } + + /** + * A point feature of a {@link Cesium3DTileset}. + *

+ * Provides access to a feature's properties stored in the tile's batch table, as well + * as the ability to show/hide a feature and change its point properties + *

+ *

+ * Modifications to a Cesium3DTilePointFeature object have the lifetime of the tile's + * content. If the tile's content is unloaded, e.g., due to it going out of view and needing + * to free space in the cache for visible tiles, listen to the {@link Cesium3DTileset#tileUnload} event to save any + * modifications. Also listen to the {@link Cesium3DTileset#tileVisible} event to reapply any modifications. + *

+ *

+ * Do not construct this directly. Access it through {@link Cesium3DTileContent#getFeature} + * or picking using {@link Scene#pick} and {@link Scene#pickPosition}. + *

+ * @example + * // On mouse over, display all the properties for a feature in the console log. + * handler.setInputAction(function(movement) { + * const feature = scene.pick(movement.endPosition); + * if (feature instanceof Cesium.Cesium3DTilePointFeature) { + * const propertyIds = feature.getPropertyIds(); + * const length = propertyIds.length; + * for (let i = 0; i < length; ++i) { + * const propertyId = propertyIds[i]; + * console.log(`{propertyId}: ${feature.getProperty(propertyId)}`); + * } + * } + * }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); + */ + export class Cesium3DTilePointFeature { + constructor(); + /** + * Gets or sets if the feature will be shown. This is set for all features + * when a style's show is evaluated. + */ + show: boolean; + /** + * Gets or sets the color of the point of this feature. + *

+ * Only applied when image is undefined. + *

+ */ + color: Color; + /** + * Gets or sets the point size of this feature. + *

+ * Only applied when image is undefined. + *

+ */ + pointSize: number; + /** + * Gets or sets the point outline color of this feature. + *

+ * Only applied when image is undefined. + *

+ */ + pointOutlineColor: Color; + /** + * Gets or sets the point outline width in pixels of this feature. + *

+ * Only applied when image is undefined. + *

+ */ + pointOutlineWidth: number; + /** + * Gets or sets the label color of this feature. + *

+ * The color will be applied to the label if labelText is defined. + *

+ */ + labelColor: Color; + /** + * Gets or sets the label outline color of this feature. + *

+ * The outline color will be applied to the label if labelText is defined. + *

+ */ + labelOutlineColor: Color; + /** + * Gets or sets the outline width in pixels of this feature. + *

+ * The outline width will be applied to the point if labelText is defined. + *

+ */ + labelOutlineWidth: number; + /** + * Gets or sets the font of this feature. + *

+ * Only applied when the labelText is defined. + *

+ */ + font: string; + /** + * Gets or sets the fill and outline style of this feature. + *

+ * Only applied when labelText is defined. + *

+ */ + labelStyle: LabelStyle; + /** + * Gets or sets the text for this feature. + */ + labelText: string; + /** + * Gets or sets the background color of the text for this feature. + *

+ * Only applied when labelText is defined. + *

+ */ + backgroundColor: Color; + /** + * Gets or sets the background padding of the text for this feature. + *

+ * Only applied when labelText is defined. + *

+ */ + backgroundPadding: Cartesian2; + /** + * Gets or sets whether to display the background of the text for this feature. + *

+ * Only applied when labelText is defined. + *

+ */ + backgroundEnabled: boolean; + /** + * Gets or sets the near and far scaling properties for this feature. + */ + scaleByDistance: NearFarScalar; + /** + * Gets or sets the near and far translucency properties for this feature. + */ + translucencyByDistance: NearFarScalar; + /** + * Gets or sets the condition specifying at what distance from the camera that this feature will be displayed. + */ + distanceDisplayCondition: DistanceDisplayCondition; + /** + * Gets or sets the height offset in meters of this feature. + */ + heightOffset: number; + /** + * Gets or sets whether the anchor line is displayed. + *

+ * Only applied when heightOffset is defined. + *

+ */ + anchorLineEnabled: boolean; + /** + * Gets or sets the color for the anchor line. + *

+ * Only applied when heightOffset is defined. + *

+ */ + anchorLineColor: Color; + /** + * Gets or sets the image of this feature. + */ + image: string; + /** + * Gets or sets the distance where depth testing will be disabled. + */ + disableDepthTestDistance: number; + /** + * Gets or sets the horizontal origin of this point, which determines if the point is + * to the left, center, or right of its anchor position. + */ + horizontalOrigin: HorizontalOrigin; + /** + * Gets or sets the vertical origin of this point, which determines if the point is + * to the bottom, center, or top of its anchor position. + */ + verticalOrigin: VerticalOrigin; + /** + * Gets or sets the horizontal origin of this point's text, which determines if the point's text is + * to the left, center, or right of its anchor position. + */ + labelHorizontalOrigin: HorizontalOrigin; + /** + * Get or sets the vertical origin of this point's text, which determines if the point's text is + * to the bottom, center, top, or baseline of it's anchor point. + */ + labelVerticalOrigin: VerticalOrigin; + /** + * Gets the tileset containing the feature. + */ + readonly tileset: Cesium3DTileset; + /** + * All objects returned by {@link Scene#pick} have a primitive property. This returns + * the tileset containing the feature. + */ + readonly primitive: Cesium3DTileset; + /** + * Returns whether the feature contains this property. This includes properties from this feature's + * class and inherited classes when using a batch table hierarchy. + * @param name - The case-sensitive name of the property. + * @returns Whether the feature contains this property. + */ + hasProperty(name: string): boolean; + /** + * Returns an array of property IDs for the feature. This includes properties from this feature's + * class and inherited classes when using a batch table hierarchy. + * @param [results] - An array into which to store the results. + * @returns The IDs of the feature's properties. + */ + getPropertyIds(results?: string[]): string[]; + /** + * Returns a copy of the value of the feature's property with the given name. This includes properties from this feature's + * class and inherited classes when using a batch table hierarchy. + * @example + * // Display all the properties for a feature in the console log. + * const propertyIds = feature.getPropertyIds(); + * const length = propertyIds.length; + * for (let i = 0; i < length; ++i) { + * const propertyId = propertyIds[i]; + * console.log(`{propertyId} : ${feature.getProperty(propertyId)}`); + * } + * @param name - The case-sensitive name of the property. + * @returns The value of the property or undefined if the feature does not have this property. + */ + getProperty(name: string): any; + /** + * Sets the value of the feature's property with the given name. + *

+ * If a property with the given name doesn't exist, it is created. + *

+ * @example + * const height = feature.getProperty('Height'); // e.g., the height of a building + * @example + * const name = 'clicked'; + * if (feature.getProperty(name)) { + * console.log('already clicked'); + * } else { + * feature.setProperty(name, true); + * console.log('first click'); + * } + * @param name - The case-sensitive name of the property. + * @param value - The value of the property that will be copied. + */ + setProperty(name: string, value: any): void; + } + + /** + * A style that is applied to a {@link Cesium3DTileset}. + *

+ * Evaluates an expression defined using the + * {@link https://github.com/CesiumGS/3d-tiles/tree/main/specification/Styling|3D Tiles Styling language}. + *

+ * @example + * tileset.style = new Cesium.Cesium3DTileStyle({ + * color : { + * conditions : [ + * ['${Height} >= 100', 'color("purple", 0.5)'], + * ['${Height} >= 50', 'color("red")'], + * ['true', 'color("blue")'] + * ] + * }, + * show : '${Height} > 0', + * meta : { + * description : '"Building id ${id} has height ${Height}."' + * } + * }); + * @example + * tileset.style = new Cesium.Cesium3DTileStyle({ + * color : 'vec4(${Temperature})', + * pointSize : '${Temperature} * 2.0' + * }); + * @param [style] - An object defining a style. + */ + export class Cesium3DTileStyle { + constructor(style?: any); + /** + * Gets the object defining the style using the + * {@link https://github.com/CesiumGS/3d-tiles/tree/main/specification/Styling|3D Tiles Styling language}. + */ + readonly style: any; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's show property. Alternatively a boolean, string, or object defining a show style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

+ * The expression must return or convert to a Boolean. + *

+ *

+ * This expression is applicable to all tile formats. + *

+ * @example + * const style = new Cesium3DTileStyle({ + * show : '(regExp("^Chest").test(${County})) && (${YearBuilt} >= 1970)' + * }); + * style.show.evaluate(feature); // returns true or false depending on the feature's properties + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override show expression with a custom function + * style.show = { + * evaluate : function(feature) { + * return true; + * } + * }; + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override show expression with a boolean + * style.show = true; + * }; + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override show expression with a string + * style.show = '${Height} > 0'; + * }; + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override show expression with a condition + * style.show = { + * conditions: [ + * ['${height} > 2', 'false'], + * ['true', 'true'] + * ]; + * }; + */ + show: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's color property. Alternatively a string or object defining a color style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

+ * The expression must return a Color. + *

+ *

+ * This expression is applicable to all tile formats. + *

+ * @example + * const style = new Cesium3DTileStyle({ + * color : '(${Temperature} > 90) ? color("red") : color("white")' + * }); + * style.color.evaluateColor(feature, result); // returns a Cesium.Color object + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override color expression with a custom function + * style.color = { + * evaluateColor : function(feature, result) { + * return Cesium.Color.clone(Cesium.Color.WHITE, result); + * } + * }; + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override color expression with a string + * style.color = 'color("blue")'; + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override color expression with a condition + * style.color = { + * conditions : [ + * ['${height} > 2', 'color("cyan")'], + * ['true', 'color("blue")'] + * ] + * }; + */ + color: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's pointSize property. Alternatively a string or object defining a point size style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

+ * The expression must return a Number. + *

+ *

+ * This expression is only applicable to point features in a Vector tile or a Point Cloud tile. + *

+ * @example + * const style = new Cesium3DTileStyle({ + * pointSize : '(${Temperature} > 90) ? 2.0 : 1.0' + * }); + * style.pointSize.evaluate(feature); // returns a Number + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override pointSize expression with a custom function + * style.pointSize = { + * evaluate : function(feature) { + * return 1.0; + * } + * }; + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override pointSize expression with a number + * style.pointSize = 1.0; + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override pointSize expression with a string + * style.pointSize = '${height} / 10'; + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override pointSize expression with a condition + * style.pointSize = { + * conditions : [ + * ['${height} > 2', '1.0'], + * ['true', '2.0'] + * ] + * }; + */ + pointSize: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's pointOutlineColor property. Alternatively a string or object defining a color style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

+ * The expression must return a Color. + *

+ *

+ * This expression is only applicable to point features in a Vector tile. + *

+ * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override pointOutlineColor expression with a string + * style.pointOutlineColor = 'color("blue")'; + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override pointOutlineColor expression with a condition + * style.pointOutlineColor = { + * conditions : [ + * ['${height} > 2', 'color("cyan")'], + * ['true', 'color("blue")'] + * ] + * }; + */ + pointOutlineColor: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's pointOutlineWidth property. Alternatively a string or object defining a number style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

+ * The expression must return a Number. + *

+ *

+ * This expression is only applicable to point features in a Vector tile. + *

+ * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override pointOutlineWidth expression with a string + * style.pointOutlineWidth = '5'; + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override pointOutlineWidth expression with a condition + * style.pointOutlineWidth = { + * conditions : [ + * ['${height} > 2', '5'], + * ['true', '0'] + * ] + * }; + */ + pointOutlineWidth: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's labelColor property. Alternatively a string or object defining a color style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

+ * The expression must return a Color. + *

+ *

+ * This expression is only applicable to point features in a Vector tile. + *

+ * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override labelColor expression with a string + * style.labelColor = 'color("blue")'; + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override labelColor expression with a condition + * style.labelColor = { + * conditions : [ + * ['${height} > 2', 'color("cyan")'], + * ['true', 'color("blue")'] + * ] + * }; + */ + labelColor: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's labelOutlineColor property. Alternatively a string or object defining a color style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

+ * The expression must return a Color. + *

+ *

+ * This expression is only applicable to point features in a Vector tile. + *

+ * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override labelOutlineColor expression with a string + * style.labelOutlineColor = 'color("blue")'; + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override labelOutlineColor expression with a condition + * style.labelOutlineColor = { + * conditions : [ + * ['${height} > 2', 'color("cyan")'], + * ['true', 'color("blue")'] + * ] + * }; + */ + labelOutlineColor: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's labelOutlineWidth property. Alternatively a string or object defining a number style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

+ * The expression must return a Number. + *

+ *

+ * This expression is only applicable to point features in a Vector tile. + *

+ * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override labelOutlineWidth expression with a string + * style.labelOutlineWidth = '5'; + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override labelOutlineWidth expression with a condition + * style.labelOutlineWidth = { + * conditions : [ + * ['${height} > 2', '5'], + * ['true', '0'] + * ] + * }; + */ + labelOutlineWidth: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's font property. Alternatively a string or object defining a string style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

+ * The expression must return a String. + *

+ *

+ * This expression is only applicable to point features in a Vector tile. + *

+ * @example + * const style = new Cesium3DTileStyle({ + * font : '(${Temperature} > 90) ? "30px Helvetica" : "24px Helvetica"' + * }); + * style.font.evaluate(feature); // returns a String + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override font expression with a custom function + * style.font = { + * evaluate : function(feature) { + * return '24px Helvetica'; + * } + * }; + */ + font: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's label style property. Alternatively a string or object defining a number style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

+ * The expression must return a LabelStyle. + *

+ *

+ * This expression is only applicable to point features in a Vector tile. + *

+ * @example + * const style = new Cesium3DTileStyle({ + * labelStyle : `(\${Temperature} > 90) ? ${LabelStyle.FILL_AND_OUTLINE} : ${LabelStyle.FILL}` + * }); + * style.labelStyle.evaluate(feature); // returns a LabelStyle + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override labelStyle expression with a custom function + * style.labelStyle = { + * evaluate : function(feature) { + * return LabelStyle.FILL; + * } + * }; + */ + labelStyle: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's labelText property. Alternatively a string or object defining a string style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

+ * The expression must return a String. + *

+ *

+ * This expression is only applicable to point features in a Vector tile. + *

+ * @example + * const style = new Cesium3DTileStyle({ + * labelText : '(${Temperature} > 90) ? ">90" : "<=90"' + * }); + * style.labelText.evaluate(feature); // returns a String + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override labelText expression with a custom function + * style.labelText = { + * evaluate : function(feature) { + * return 'Example label text'; + * } + * }; + */ + labelText: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's backgroundColor property. Alternatively a string or object defining a color style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

+ * The expression must return a Color. + *

+ *

+ * This expression is only applicable to point features in a Vector tile. + *

+ * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override backgroundColor expression with a string + * style.backgroundColor = 'color("blue")'; + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override backgroundColor expression with a condition + * style.backgroundColor = { + * conditions : [ + * ['${height} > 2', 'color("cyan")'], + * ['true', 'color("blue")'] + * ] + * }; + */ + backgroundColor: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's backgroundPadding property. Alternatively a string or object defining a vec2 style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

+ * The expression must return a Cartesian2. + *

+ *

+ * This expression is only applicable to point features in a Vector tile. + *

+ * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override backgroundPadding expression with a string + * style.backgroundPadding = 'vec2(5.0, 7.0)'; + * style.backgroundPadding.evaluate(feature); // returns a Cartesian2 + */ + backgroundPadding: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's backgroundEnabled property. Alternatively a string or object defining a boolean style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

+ * The expression must return a Boolean. + *

+ *

+ * This expression is only applicable to point features in a Vector tile. + *

+ * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override backgroundEnabled expression with a string + * style.backgroundEnabled = 'true'; + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override backgroundEnabled expression with a condition + * style.backgroundEnabled = { + * conditions : [ + * ['${height} > 2', 'true'], + * ['true', 'false'] + * ] + * }; + */ + backgroundEnabled: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's scaleByDistance property. Alternatively a string or object defining a vec4 style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

+ * The expression must return a Cartesian4. + *

+ *

+ * This expression is only applicable to point features in a Vector tile. + *

+ * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override scaleByDistance expression with a string + * style.scaleByDistance = 'vec4(1.5e2, 2.0, 1.5e7, 0.5)'; + * style.scaleByDistance.evaluate(feature); // returns a Cartesian4 + */ + scaleByDistance: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's translucencyByDistance property. Alternatively a string or object defining a vec4 style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

+ * The expression must return a Cartesian4. + *

+ *

+ * This expression is only applicable to point features in a Vector tile. + *

+ * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override translucencyByDistance expression with a string + * style.translucencyByDistance = 'vec4(1.5e2, 1.0, 1.5e7, 0.2)'; + * style.translucencyByDistance.evaluate(feature); // returns a Cartesian4 + */ + translucencyByDistance: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's distanceDisplayCondition property. Alternatively a string or object defining a vec2 style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

+ * The expression must return a Cartesian2. + *

+ *

+ * This expression is only applicable to point features in a Vector tile. + *

+ * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override distanceDisplayCondition expression with a string + * style.distanceDisplayCondition = 'vec2(0.0, 5.5e6)'; + * style.distanceDisplayCondition.evaluate(feature); // returns a Cartesian2 + */ + distanceDisplayCondition: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's heightOffset property. Alternatively a string or object defining a number style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

+ * The expression must return a Number. + *

+ *

+ * This expression is only applicable to point features in a Vector tile. + *

+ * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override heightOffset expression with a string + * style.heightOffset = '2.0'; + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override heightOffset expression with a condition + * style.heightOffset = { + * conditions : [ + * ['${height} > 2', '4.0'], + * ['true', '2.0'] + * ] + * }; + */ + heightOffset: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's anchorLineEnabled property. Alternatively a string or object defining a boolean style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

+ * The expression must return a Boolean. + *

+ *

+ * This expression is only applicable to point features in a Vector tile. + *

+ * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override anchorLineEnabled expression with a string + * style.anchorLineEnabled = 'true'; + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override anchorLineEnabled expression with a condition + * style.anchorLineEnabled = { + * conditions : [ + * ['${height} > 2', 'true'], + * ['true', 'false'] + * ] + * }; + */ + anchorLineEnabled: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's anchorLineColor property. Alternatively a string or object defining a color style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

+ * The expression must return a Color. + *

+ *

+ * This expression is only applicable to point features in a Vector tile. + *

+ * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override anchorLineColor expression with a string + * style.anchorLineColor = 'color("blue")'; + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override anchorLineColor expression with a condition + * style.anchorLineColor = { + * conditions : [ + * ['${height} > 2', 'color("cyan")'], + * ['true', 'color("blue")'] + * ] + * }; + */ + anchorLineColor: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's image property. Alternatively a string or object defining a string style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

+ * The expression must return a String. + *

+ *

+ * This expression is only applicable to point features in a Vector tile. + *

+ * @example + * const style = new Cesium3DTileStyle({ + * image : '(${Temperature} > 90) ? "/url/to/image1" : "/url/to/image2"' + * }); + * style.image.evaluate(feature); // returns a String + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override image expression with a custom function + * style.image = { + * evaluate : function(feature) { + * return '/url/to/image'; + * } + * }; + */ + image: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's disableDepthTestDistance property. Alternatively a string or object defining a number style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

+ * The expression must return a Number. + *

+ *

+ * This expression is only applicable to point features in a Vector tile. + *

+ * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override disableDepthTestDistance expression with a string + * style.disableDepthTestDistance = '1000.0'; + * style.disableDepthTestDistance.evaluate(feature); // returns a Number + */ + disableDepthTestDistance: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's horizontalOrigin property. Alternatively a string or object defining a number style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

+ * The expression must return a HorizontalOrigin. + *

+ *

+ * This expression is only applicable to point features in a Vector tile. + *

+ * @example + * const style = new Cesium3DTileStyle({ + * horizontalOrigin : HorizontalOrigin.LEFT + * }); + * style.horizontalOrigin.evaluate(feature); // returns a HorizontalOrigin + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override horizontalOrigin expression with a custom function + * style.horizontalOrigin = { + * evaluate : function(feature) { + * return HorizontalOrigin.CENTER; + * } + * }; + */ + horizontalOrigin: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's verticalOrigin property. Alternatively a string or object defining a number style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

+ * The expression must return a VerticalOrigin. + *

+ *

+ * This expression is only applicable to point features in a Vector tile. + *

+ * @example + * const style = new Cesium3DTileStyle({ + * verticalOrigin : VerticalOrigin.TOP + * }); + * style.verticalOrigin.evaluate(feature); // returns a VerticalOrigin + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override verticalOrigin expression with a custom function + * style.verticalOrigin = { + * evaluate : function(feature) { + * return VerticalOrigin.CENTER; + * } + * }; + */ + verticalOrigin: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's labelHorizontalOrigin property. Alternatively a string or object defining a number style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

+ * The expression must return a HorizontalOrigin. + *

+ *

+ * This expression is only applicable to point features in a Vector tile. + *

+ * @example + * const style = new Cesium3DTileStyle({ + * labelHorizontalOrigin : HorizontalOrigin.LEFT + * }); + * style.labelHorizontalOrigin.evaluate(feature); // returns a HorizontalOrigin + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override labelHorizontalOrigin expression with a custom function + * style.labelHorizontalOrigin = { + * evaluate : function(feature) { + * return HorizontalOrigin.CENTER; + * } + * }; + */ + labelHorizontalOrigin: StyleExpression; + /** + * Gets or sets the {@link StyleExpression} object used to evaluate the style's labelVerticalOrigin property. Alternatively a string or object defining a number style can be used. + * The getter will return the internal {@link Expression} or {@link ConditionsExpression}, which may differ from the value provided to the setter. + *

+ * The expression must return a VerticalOrigin. + *

+ *

+ * This expression is only applicable to point features in a Vector tile. + *

+ * @example + * const style = new Cesium3DTileStyle({ + * labelVerticalOrigin : VerticalOrigin.TOP + * }); + * style.labelVerticalOrigin.evaluate(feature); // returns a VerticalOrigin + * @example + * const style = new Cesium.Cesium3DTileStyle(); + * // Override labelVerticalOrigin expression with a custom function + * style.labelVerticalOrigin = { + * evaluate : function(feature) { + * return VerticalOrigin.CENTER; + * } + * }; + */ + labelVerticalOrigin: StyleExpression; + /** + * Gets or sets the object containing application-specific expression that can be explicitly + * evaluated, e.g., for display in a UI. + * @example + * const style = new Cesium3DTileStyle({ + * meta : { + * description : '"Building id ${id} has height ${Height}."' + * } + * }); + * style.meta.description.evaluate(feature); // returns a String with the substituted variables + */ + meta: StyleExpression; + } + + export namespace Cesium3DTilesVoxelProvider { + /** + * Initialization options for the Cesium3DTilesVoxelProvider constructor + * @property className - The class in the tileset schema describing voxel metadata. + * @property names - The metadata names. + * @property types - The metadata types. + * @property componentTypes - The metadata component types. + * @property shape - The {@link VoxelShapeType}. + * @property dimensions - The number of voxels per dimension of a tile. This is the same for all tiles in the dataset. + * @property [paddingBefore = Cartesian3.ZERO] - The number of padding voxels before the tile. This improves rendering quality when sampling the edge of a tile, but it increases memory usage. + * @property [paddingAfter = Cartesian3.ZERO] - The number of padding voxels after the tile. This improves rendering quality when sampling the edge of a tile, but it increases memory usage. + * @property [globalTransform = Matrix4.IDENTITY] - A transform from local space to global space. + * @property [shapeTransform = Matrix4.IDENTITY] - A transform from shape space to local space. + * @property [minBounds] - The minimum bounds. + * @property [maxBounds] - The maximum bounds. + * @property [minimumValues] - The metadata minimum values. + * @property [maximumValues] - The metadata maximum values. + * @property [maximumTileCount] - The maximum number of tiles that exist for this provider. This value is used as a hint to the voxel renderer to allocate an appropriate amount of GPU memory. If this value is not known it can be undefined. + */ + type ConstructorOptions = { + className: string; + names: string[]; + types: MetadataType[]; + componentTypes: MetadataComponentType[]; + shape: VoxelShapeType; + dimensions: Cartesian3; + paddingBefore?: Cartesian3; + paddingAfter?: Cartesian3; + globalTransform?: Matrix4; + shapeTransform?: Matrix4; + minBounds?: Cartesian3; + maxBounds?: Cartesian3; + minimumValues?: number[][]; + maximumValues?: number[][]; + maximumTileCount?: number; + }; + } + + /** + * A {@link VoxelProvider} that fetches voxel data from a 3D Tiles tileset. + *

+ * Implements the {@link VoxelProvider} interface. + *

+ *
+ * This object is normally not instantiated directly, use {@link Cesium3DTilesVoxelProvider.fromUrl}. + *
+ * @param options - An object describing initialization options + */ + export class Cesium3DTilesVoxelProvider extends VoxelProvider { + constructor(options: Cesium3DTilesVoxelProvider.ConstructorOptions); + /** + * A transform from local space to global space. + */ + readonly globalTransform: Matrix4; + /** + * A transform from shape space to local space. + */ + readonly shapeTransform: Matrix4; + /** + * Gets the {@link VoxelShapeType} + */ + readonly shape: VoxelShapeType; + /** + * Gets the minimum bounds. + * If undefined, the shape's default minimum bounds will be used instead. + */ + readonly minBounds: Cartesian3 | undefined; + /** + * Gets the maximum bounds. + * If undefined, the shape's default maximum bounds will be used instead. + */ + readonly maxBounds: Cartesian3 | undefined; + /** + * Gets the number of voxels per dimension of a tile. This is the same for all tiles in the dataset. + */ + readonly dimensions: Cartesian3; + /** + * Gets the number of padding voxels before the tile. This improves rendering quality when sampling the edge of a tile, but it increases memory usage. + */ + readonly paddingBefore: Cartesian3; + /** + * Gets the number of padding voxels after the tile. This improves rendering quality when sampling the edge of a tile, but it increases memory usage. + */ + readonly paddingAfter: Cartesian3; + /** + * The metadata class for this tileset. + */ + readonly className: string; + /** + * Gets the metadata names. + */ + readonly names: string[]; + /** + * Gets the metadata types. + */ + readonly types: MetadataType[]; + /** + * Gets the metadata component types. + */ + readonly componentTypes: MetadataComponentType[]; + /** + * Gets the ordering of the metadata in the buffers. + */ + readonly metadataOrder: VoxelMetadataOrder; + /** + * Gets the metadata minimum values. + */ + readonly minimumValues: number[][] | undefined; + /** + * Gets the metadata maximum values. + */ + readonly maximumValues: number[][] | undefined; + /** + * The maximum number of tiles that exist for this provider. + * This value is used as a hint to the voxel renderer to allocate an appropriate amount of GPU memory. + * If this value is not known it can be undefined. + */ + readonly maximumTileCount: number | undefined; + /** + * The number of levels of detail containing available tiles in the tileset. + */ + readonly availableLevels: number | undefined; + /** + * Creates a {@link Cesium3DTilesVoxelProvider} that fetches voxel data from a 3D Tiles tileset. + * @example + * try { + * const voxelProvider = await Cesium3DTilesVoxelProvider.fromUrl( + * "http://localhost:8002/tilesets/voxel/tileset.json" + * ); + * const voxelPrimitive = new VoxelPrimitive({ + * provider: voxelProvider, + * customShader: customShader, + * }); + * scene.primitives.add(voxelPrimitive); + * } catch (error) { + * console.error(`Error creating voxel primitive: ${error}`); + * } + * @param url - The URL to a tileset JSON file + * @returns The created provider + */ + static fromUrl(url: Resource | string): Promise; + /** + * Requests the data for a given tile. + * @param [options] - Object with the following properties: + * @param [options.tileLevel = 0] - The tile's level. + * @param [options.tileX = 0] - The tile's X coordinate. + * @param [options.tileY = 0] - The tile's Y coordinate. + * @param [options.tileZ = 0] - The tile's Z coordinate. + * @returns A promise resolving to a VoxelContent containing the data for the tile, or undefined if the request could not be scheduled this frame. + */ + requestData(options?: { + tileLevel?: number; + tileX?: number; + tileY?: number; + tileZ?: number; + }): Promise | undefined; + } + + export namespace Cesium3DTileset { + /** + * Initialization options for the Cesium3DTileset constructor + * @property [show = true] - Determines if the tileset will be shown. + * @property [modelMatrix = Matrix4.IDENTITY] - A 4x4 transformation matrix that transforms the tileset's root tile. + * @property [modelUpAxis = Axis.Y] - Which axis is considered up when loading models for tile contents. + * @property [modelForwardAxis = Axis.X] - Which axis is considered forward when loading models for tile contents. + * @property [shadows = ShadowMode.ENABLED] - Determines whether the tileset casts or receives shadows from light sources. + * @property [maximumScreenSpaceError = 16] - The maximum screen space error used to drive level of detail refinement. + * @property [cacheBytes = 536870912] - The size (in bytes) to which the tile cache will be trimmed, if the cache contains tiles not needed for the current view. + * @property [maximumCacheOverflowBytes = 536870912] - The maximum additional memory (in bytes) to allow for cache headroom, if more than {@link Cesium3DTileset#cacheBytes} are needed for the current view. + * @property [cullWithChildrenBounds = true] - Optimization option. Whether to cull tiles using the union of their children bounding volumes. + * @property [cullRequestsWhileMoving = true] - Optimization option. Don't request tiles that will likely be unused when they come back because of the camera's movement. This optimization only applies to stationary tilesets. + * @property [cullRequestsWhileMovingMultiplier = 60.0] - Optimization option. Multiplier used in culling requests while moving. Larger is more aggressive culling, smaller less aggressive culling. + * @property [preloadWhenHidden = false] - Preload tiles when tileset.show is false. Loads tiles as if the tileset is visible but does not render them. + * @property [preloadFlightDestinations = true] - Optimization option. Preload tiles at the camera's flight destination while the camera is in flight. + * @property [preferLeaves = false] - Optimization option. Prefer loading of leaves first. + * @property [dynamicScreenSpaceError = true] - Optimization option. For street-level horizon views, use lower resolution tiles far from the camera. This reduces the amount of data loaded and improves tileset loading time with a slight drop in visual quality in the distance. + * @property [dynamicScreenSpaceErrorDensity = 2.0e-4] - Similar to {@link Fog#density}, this option controls the camera distance at which the {@link Cesium3DTileset#dynamicScreenSpaceError} optimization applies. Larger values will cause tiles closer to the camera to be affected. + * @property [dynamicScreenSpaceErrorFactor = 24.0] - A parameter that controls the intensity of the {@link Cesium3DTileset#dynamicScreenSpaceError} optimization for tiles on the horizon. Larger values cause lower resolution tiles to load, improving runtime performance at a slight reduction of visual quality. + * @property [dynamicScreenSpaceErrorHeightFalloff = 0.25] - A ratio of the tileset's height that determines where "street level" camera views occur. When the camera is below this height, the {@link Cesium3DTileset#dynamicScreenSpaceError} optimization will have the maximum effect, and it will roll off above this value. + * @property [progressiveResolutionHeightFraction = 0.3] - Optimization option. If between (0.0, 0.5], tiles at or above the screen space error for the reduced screen resolution of progressiveResolutionHeightFraction*screenHeight will be prioritized first. This can help get a quick layer of tiles down while full resolution tiles continue to load. + * @property [foveatedScreenSpaceError = true] - Optimization option. Prioritize loading tiles in the center of the screen by temporarily raising the screen space error for tiles around the edge of the screen. Screen space error returns to normal once all the tiles in the center of the screen as determined by the {@link Cesium3DTileset#foveatedConeSize} are loaded. + * @property [foveatedConeSize = 0.1] - Optimization option. Used when {@link Cesium3DTileset#foveatedScreenSpaceError} is true to control the cone size that determines which tiles are deferred. Tiles that are inside this cone are loaded immediately. Tiles outside the cone are potentially deferred based on how far outside the cone they are and their screen space error. This is controlled by {@link Cesium3DTileset#foveatedInterpolationCallback} and {@link Cesium3DTileset#foveatedMinimumScreenSpaceErrorRelaxation}. Setting this to 0.0 means the cone will be the line formed by the camera position and its view direction. Setting this to 1.0 means the cone encompasses the entire field of view of the camera, disabling the effect. + * @property [foveatedMinimumScreenSpaceErrorRelaxation = 0.0] - Optimization option. Used when {@link Cesium3DTileset#foveatedScreenSpaceError} is true to control the starting screen space error relaxation for tiles outside the foveated cone. The screen space error will be raised starting with tileset value up to {@link Cesium3DTileset#maximumScreenSpaceError} based on the provided {@link Cesium3DTileset#foveatedInterpolationCallback}. + * @property [foveatedInterpolationCallback = Math.lerp] - Optimization option. Used when {@link Cesium3DTileset#foveatedScreenSpaceError} is true to control how much to raise the screen space error for tiles outside the foveated cone, interpolating between {@link Cesium3DTileset#foveatedMinimumScreenSpaceErrorRelaxation} and {@link Cesium3DTileset#maximumScreenSpaceError} + * @property [foveatedTimeDelay = 0.2] - Optimization option. Used when {@link Cesium3DTileset#foveatedScreenSpaceError} is true to control how long in seconds to wait after the camera stops moving before deferred tiles start loading in. This time delay prevents requesting tiles around the edges of the screen when the camera is moving. Setting this to 0.0 will immediately request all tiles in any given view. + * @property [skipLevelOfDetail = false] - Optimization option. Determines if level of detail skipping should be applied during the traversal. + * @property [baseScreenSpaceError = 1024] - When skipLevelOfDetail is true, the screen space error that must be reached before skipping levels of detail. + * @property [skipScreenSpaceErrorFactor = 16] - When skipLevelOfDetail is true, a multiplier defining the minimum screen space error to skip. Used in conjunction with skipLevels to determine which tiles to load. + * @property [skipLevels = 1] - When skipLevelOfDetail is true, a constant defining the minimum number of levels to skip when loading tiles. When it is 0, no levels are skipped. Used in conjunction with skipScreenSpaceErrorFactor to determine which tiles to load. + * @property [immediatelyLoadDesiredLevelOfDetail = false] - When skipLevelOfDetail is true, only tiles that meet the maximum screen space error will ever be downloaded. Skipping factors are ignored and just the desired tiles are loaded. + * @property [loadSiblings = false] - When skipLevelOfDetail is true, determines whether siblings of visible tiles are always downloaded during traversal. + * @property [clippingPlanes] - The {@link ClippingPlaneCollection} used to selectively disable rendering the tileset. + * @property [clippingPolygons] - The {@link ClippingPolygonCollection} used to selectively disable rendering the tileset. + * @property [classificationType] - Determines whether terrain, 3D Tiles or both will be classified by this tileset. See {@link Cesium3DTileset#classificationType} for details about restrictions and limitations. + * @property [ellipsoid = Ellipsoid.WGS84] - The ellipsoid determining the size and shape of the globe. + * @property [pointCloudShading] - Options for constructing a {@link PointCloudShading} object to control point attenuation based on geometric error and lighting. + * @property [lightColor] - The light color when shading models. When undefined the scene's light color is used instead. + * @property [imageBasedLighting] - The properties for managing image-based lighting for this tileset. + * @property [environmentMapOptions] - The properties for managing dynamic environment maps on this tileset. + * @property [backFaceCulling = true] - Whether to cull back-facing geometry. When true, back face culling is determined by the glTF material's doubleSided property; when false, back face culling is disabled. + * @property [enableShowOutline = true] - Whether to enable outlines for models using the {@link https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/CESIUM_primitive_outline|CESIUM_primitive_outline} extension. This can be set to false to avoid the additional processing of geometry at load time. When false, the showOutlines and outlineColor options are ignored. + * @property [showOutline = true] - Whether to display the outline for models using the {@link https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/CESIUM_primitive_outline|CESIUM_primitive_outline} extension. When true, outlines are displayed. When false, outlines are not displayed. + * @property [outlineColor = Color.BLACK] - The color to use when rendering outlines. + * @property [vectorClassificationOnly = false] - Indicates that only the tileset's vector tiles should be used for classification. + * @property [vectorKeepDecodedPositions = false] - Whether vector tiles should keep decoded positions in memory. This is used with {@link Cesium3DTileFeature.getPolylinePositions}. + * @property [featureIdLabel = "featureId_0"] - Label of the feature ID set to use for picking and styling. For EXT_mesh_features, this is the feature ID's label property, or "featureId_N" (where N is the index in the featureIds array) when not specified. EXT_feature_metadata did not have a label field, so such feature ID sets are always labeled "featureId_N" where N is the index in the list of all feature Ids, where feature ID attributes are listed before feature ID textures. If featureIdLabel is an integer N, it is converted to the string "featureId_N" automatically. If both per-primitive and per-instance feature IDs are present, the instance feature IDs take priority. + * @property [instanceFeatureIdLabel = "instanceFeatureId_0"] - Label of the instance feature ID set used for picking and styling. If instanceFeatureIdLabel is set to an integer N, it is converted to the string "instanceFeatureId_N" automatically. If both per-primitive and per-instance feature IDs are present, the instance feature IDs take priority. + * @property [showCreditsOnScreen = false] - Whether to display the credits of this tileset on screen. + * @property [splitDirection = SplitDirection.NONE] - The {@link SplitDirection} split to apply to this tileset. + * @property [enableCollision = false] - When true, enables collisions for camera or CPU picking. While this is true the camera will be prevented from going below the tileset surface if {@link ScreenSpaceCameraController#enableCollisionDetection} is true. + * @property [projectTo2D = false] - Whether to accurately project the tileset to 2D. If this is true, the tileset will be projected accurately to 2D, but it will use more memory to do so. If this is false, the tileset will use less memory and will still render in 2D / CV mode, but its projected positions may be inaccurate. This cannot be set after the tileset has been created. + * @property [enablePick = false] - Whether to allow collision and CPU picking with pick when using WebGL 1. If using WebGL 2 or above, this option will be ignored. If using WebGL 1 and this is true, the pick operation will work correctly, but it will use more memory to do so. If running with WebGL 1 and this is false, the model will use less memory, but pick will always return undefined. This cannot be set after the tileset has loaded. + * @property [debugHeatmapTilePropertyName] - The tile variable to colorize as a heatmap. All rendered tiles will be colorized relative to each other's specified variable value. + * @property [debugFreezeFrame = false] - For debugging only. Determines if only the tiles from last frame should be used for rendering. + * @property [debugColorizeTiles = false] - For debugging only. When true, assigns a random color to each tile. + * @property [enableDebugWireframe = false] - For debugging only. This must be true for debugWireframe to work in WebGL1. This cannot be set after the tileset has been created. + * @property [debugWireframe = false] - For debugging only. When true, render's each tile's content as a wireframe. + * @property [debugShowBoundingVolume = false] - For debugging only. When true, renders the bounding volume for each tile. + * @property [debugShowContentBoundingVolume = false] - For debugging only. When true, renders the bounding volume for each tile's content. + * @property [debugShowViewerRequestVolume = false] - For debugging only. When true, renders the viewer request volume for each tile. + * @property [debugShowGeometricError = false] - For debugging only. When true, draws labels to indicate the geometric error of each tile. + * @property [debugShowRenderingStatistics = false] - For debugging only. When true, draws labels to indicate the number of commands, points, triangles and features for each tile. + * @property [debugShowMemoryUsage = false] - For debugging only. When true, draws labels to indicate the texture and geometry memory in megabytes used by each tile. + * @property [debugShowUrl = false] - For debugging only. When true, draws labels to indicate the url of each tile. + */ + type ConstructorOptions = { + show?: boolean; + modelMatrix?: Matrix4; + modelUpAxis?: Axis; + modelForwardAxis?: Axis; + shadows?: ShadowMode; + maximumScreenSpaceError?: number; + cacheBytes?: number; + maximumCacheOverflowBytes?: number; + cullWithChildrenBounds?: boolean; + cullRequestsWhileMoving?: boolean; + cullRequestsWhileMovingMultiplier?: number; + preloadWhenHidden?: boolean; + preloadFlightDestinations?: boolean; + preferLeaves?: boolean; + dynamicScreenSpaceError?: boolean; + dynamicScreenSpaceErrorDensity?: number; + dynamicScreenSpaceErrorFactor?: number; + dynamicScreenSpaceErrorHeightFalloff?: number; + progressiveResolutionHeightFraction?: number; + foveatedScreenSpaceError?: boolean; + foveatedConeSize?: number; + foveatedMinimumScreenSpaceErrorRelaxation?: number; + foveatedInterpolationCallback?: Cesium3DTileset.foveatedInterpolationCallback; + foveatedTimeDelay?: number; + skipLevelOfDetail?: boolean; + baseScreenSpaceError?: number; + skipScreenSpaceErrorFactor?: number; + skipLevels?: number; + immediatelyLoadDesiredLevelOfDetail?: boolean; + loadSiblings?: boolean; + clippingPlanes?: ClippingPlaneCollection; + clippingPolygons?: ClippingPolygonCollection; + classificationType?: ClassificationType; + ellipsoid?: Ellipsoid; + pointCloudShading?: any; + lightColor?: Cartesian3; + imageBasedLighting?: ImageBasedLighting; + environmentMapOptions?: DynamicEnvironmentMapManager.ConstructorOptions; + backFaceCulling?: boolean; + enableShowOutline?: boolean; + showOutline?: boolean; + outlineColor?: Color; + vectorClassificationOnly?: boolean; + vectorKeepDecodedPositions?: boolean; + featureIdLabel?: string | number; + instanceFeatureIdLabel?: string | number; + showCreditsOnScreen?: boolean; + splitDirection?: SplitDirection; + enableCollision?: boolean; + projectTo2D?: boolean; + enablePick?: boolean; + debugHeatmapTilePropertyName?: string; + debugFreezeFrame?: boolean; + debugColorizeTiles?: boolean; + enableDebugWireframe?: boolean; + debugWireframe?: boolean; + debugShowBoundingVolume?: boolean; + debugShowContentBoundingVolume?: boolean; + debugShowViewerRequestVolume?: boolean; + debugShowGeometricError?: boolean; + debugShowRenderingStatistics?: boolean; + debugShowMemoryUsage?: boolean; + debugShowUrl?: boolean; + }; + /** + * Optimization option. Used as a callback when {@link Cesium3DTileset#foveatedScreenSpaceError} is true to control how much to raise the screen space error for tiles outside the foveated cone, + * interpolating between {@link Cesium3DTileset#foveatedMinimumScreenSpaceErrorRelaxation} and {@link Cesium3DTileset#maximumScreenSpaceError}. + * @param p - The start value to interpolate. + * @param q - The end value to interpolate. + * @param time - The time of interpolation generally in the range [0.0, 1.0]. + */ + type foveatedInterpolationCallback = ( + p: number, + q: number, + time: number, + ) => number; + } + + /** + * A {@link https://github.com/CesiumGS/3d-tiles/tree/main/specification|3D Tiles tileset}, + * used for streaming massive heterogeneous 3D geospatial datasets. + * + *
+ * This object is normally not instantiated directly, use {@link Cesium3DTileset.fromUrl}. + *
+ * @example + * try { + * const tileset = await Cesium.Cesium3DTileset.fromUrl( + * "http://localhost:8002/tilesets/Seattle/tileset.json" + * ); + * scene.primitives.add(tileset); + * } catch (error) { + * console.error(`Error creating tileset: ${error}`); + * } + * @example + * // Turn on camera collisions with the tileset. + * try { + * const tileset = await Cesium.Cesium3DTileset.fromUrl( + * "http://localhost:8002/tilesets/Seattle/tileset.json", + * { enableCollision: true } + * ); + * scene.primitives.add(tileset); + * } catch (error) { + * console.error(`Error creating tileset: ${error}`); + * } + * @example + * // Common setting for the skipLevelOfDetail optimization + * const tileset = await Cesium.Cesium3DTileset.fromUrl( + * "http://localhost:8002/tilesets/Seattle/tileset.json", { + * skipLevelOfDetail: true, + * baseScreenSpaceError: 1024, + * skipScreenSpaceErrorFactor: 16, + * skipLevels: 1, + * immediatelyLoadDesiredLevelOfDetail: false, + * loadSiblings: false, + * cullWithChildrenBounds: true + * }); + * scene.primitives.add(tileset); + * @example + * // Common settings for the dynamicScreenSpaceError optimization + * const tileset = await Cesium.Cesium3DTileset.fromUrl( + * "http://localhost:8002/tilesets/Seattle/tileset.json", { + * dynamicScreenSpaceError: true, + * dynamicScreenSpaceErrorDensity: 2.0e-4, + * dynamicScreenSpaceErrorFactor: 24.0, + * dynamicScreenSpaceErrorHeightFalloff: 0.25 + * }); + * scene.primitives.add(tileset); + * @param options - An object describing initialization options + */ + export class Cesium3DTileset { + constructor(options: Cesium3DTileset.ConstructorOptions); + /** + * Optimization option. Don't request tiles that will likely be unused when they come back because of the camera's movement. This optimization only applies to stationary tilesets. + */ + cullRequestsWhileMoving: boolean; + /** + * Optimization option. Multiplier used in culling requests while moving. Larger is more aggressive culling, smaller less aggressive culling. + */ + cullRequestsWhileMovingMultiplier: number; + /** + * Optimization option. If between (0.0, 0.5], tiles at or above the screen space error for the reduced screen resolution of progressiveResolutionHeightFraction*screenHeight will be prioritized first. This can help get a quick layer of tiles down while full resolution tiles continue to load. + */ + progressiveResolutionHeightFraction: number; + /** + * Optimization option. Prefer loading of leaves first. + */ + preferLeaves: boolean; + /** + * Preload tiles when tileset.show is false. Loads tiles as if the tileset is visible but does not render them. + */ + preloadWhenHidden: boolean; + /** + * Optimization option. Fetch tiles at the camera's flight destination while the camera is in flight. + */ + preloadFlightDestinations: boolean; + /** + * Optimization option. For street-level horizon views, use lower resolution tiles far from the camera. This reduces + * the amount of data loaded and improves tileset loading time with a slight drop in visual quality in the distance. + *

+ * This optimization is strongest when the camera is close to the ground plane of the tileset and looking at the + * horizon. Furthermore, the results are more accurate for tightly fitting bounding volumes like box and region. + */ + dynamicScreenSpaceError: boolean; + /** + * Optimization option. Prioritize loading tiles in the center of the screen by temporarily raising the + * screen space error for tiles around the edge of the screen. Screen space error returns to normal once all + * the tiles in the center of the screen as determined by the {@link Cesium3DTileset#foveatedConeSize} are loaded. + */ + foveatedScreenSpaceError: boolean; + /** + * Gets or sets a callback to control how much to raise the screen space error for tiles outside the foveated cone, + * interpolating between {@link Cesium3DTileset#foveatedMinimumScreenSpaceErrorRelaxation} and {@link Cesium3DTileset#maximumScreenSpaceError}. + */ + foveatedInterpolationCallback: Cesium3DTileset.foveatedInterpolationCallback; + /** + * Optimization option. Used when {@link Cesium3DTileset#foveatedScreenSpaceError} is true to control + * how long in seconds to wait after the camera stops moving before deferred tiles start loading in. + * This time delay prevents requesting tiles around the edges of the screen when the camera is moving. + * Setting this to 0.0 will immediately request all tiles in any given view. + */ + foveatedTimeDelay: number; + /** + * Similar to {@link Fog#density}, this option controls the camera distance at which the {@link Cesium3DTileset#dynamicScreenSpaceError} + * optimization applies. Larger values will cause tiles closer to the camera to be affected. This value must be + * non-negative. + *

+ * This optimization works by rolling off the tile screen space error (SSE) with camera distance like a bell curve. + * This has the effect of selecting lower resolution tiles far from the camera. Near the camera, no adjustment is + * made. For tiles further away, the SSE is reduced by up to {@link Cesium3DTileset#dynamicScreenSpaceErrorFactor} + * (measured in pixels of error). + *

+ *

+ * Increasing the density makes the bell curve narrower so tiles closer to the camera are affected. This is analagous + * to moving fog closer to the camera. + *

+ *

+ * When the density is 0, the optimization will have no effect on the tileset. + *

+ */ + dynamicScreenSpaceErrorDensity: number; + /** + * A parameter that controls the intensity of the {@link Cesium3DTileset#dynamicScreenSpaceError} optimization for + * tiles on the horizon. Larger values cause lower resolution tiles to load, improving runtime performance at a slight + * reduction of visual quality. The value must be non-negative. + *

+ * More specifically, this parameter represents the maximum adjustment to screen space error (SSE) in pixels for tiles + * far away from the camera. See {@link Cesium3DTileset#dynamicScreenSpaceErrorDensity} for more details about how + * this optimization works. + *

+ *

+ * When the SSE factor is set to 0, the optimization will have no effect on the tileset. + *

+ */ + dynamicScreenSpaceErrorFactor: number; + /** + * A ratio of the tileset's height that determines "street level" for the {@link Cesium3DTileset#dynamicScreenSpaceError} + * optimization. When the camera is below this height, the dynamic screen space error optimization will have the maximum + * effect, and it will roll off above this value. Valid values are between 0.0 and 1.0. + *

+ */ + dynamicScreenSpaceErrorHeightFalloff: number; + /** + * Determines whether the tileset casts or receives shadows from light sources. + *

+ * Enabling shadows has a performance impact. A tileset that casts shadows must be rendered twice, once from the camera and again from the light's point of view. + *

+ *

+ * Shadows are rendered only when {@link Viewer#shadows} is true. + *

+ */ + shadows: ShadowMode; + /** + * Determines if the tileset will be shown. + */ + show: boolean; + /** + * Defines how per-feature colors set from the Cesium API or declarative styling blend with the source colors from + * the original feature, e.g. glTF material or per-point color in the tile. + */ + colorBlendMode: Cesium3DTileColorBlendMode; + /** + * Defines the value used to linearly interpolate between the source color and feature color when the {@link Cesium3DTileset#colorBlendMode} is MIX. + * A value of 0.0 results in the source color while a value of 1.0 results in the feature color, with any value in-between + * resulting in a mix of the source color and feature color. + */ + colorBlendAmount: number; + /** + * The event fired to indicate progress of loading new tiles. This event is fired when a new tile + * is requested, when a requested tile is finished downloading, and when a downloaded tile has been + * processed and is ready to render. + *

+ * The number of pending tile requests, numberOfPendingRequests, and number of tiles + * processing, numberOfTilesProcessing are passed to the event listener. + *

+ *

+ * This event is fired at the end of the frame after the scene is rendered. + *

+ * @example + * tileset.loadProgress.addEventListener(function(numberOfPendingRequests, numberOfTilesProcessing) { + * if ((numberOfPendingRequests === 0) && (numberOfTilesProcessing === 0)) { + * console.log('Stopped loading'); + * return; + * } + * + * console.log(`Loading: requests: ${numberOfPendingRequests}, processing: ${numberOfTilesProcessing}`); + * }); + */ + loadProgress: Event; + /** + * The event fired to indicate that all tiles that meet the screen space error this frame are loaded. The tileset + * is completely loaded for this view. + *

+ * This event is fired at the end of the frame after the scene is rendered. + *

+ * @example + * tileset.allTilesLoaded.addEventListener(function() { + * console.log('All tiles are loaded'); + * }); + */ + allTilesLoaded: Event; + /** + * The event fired to indicate that all tiles that meet the screen space error this frame are loaded. This event + * is fired once when all tiles in the initial view are loaded. + *

+ * This event is fired at the end of the frame after the scene is rendered. + *

+ * @example + * tileset.initialTilesLoaded.addEventListener(function() { + * console.log('Initial tiles are loaded'); + * }); + */ + initialTilesLoaded: Event; + /** + * The event fired to indicate that a tile's content was loaded. + *

+ * The loaded {@link Cesium3DTile} is passed to the event listener. + *

+ *

+ * This event is fired during the tileset traversal while the frame is being rendered + * so that updates to the tile take effect in the same frame. Do not create or modify + * Cesium entities or primitives during the event listener. + *

+ * @example + * tileset.tileLoad.addEventListener(function(tile) { + * console.log('A tile was loaded.'); + * }); + */ + tileLoad: Event; + /** + * The event fired to indicate that a tile's content was unloaded. + *

+ * The unloaded {@link Cesium3DTile} is passed to the event listener. + *

+ *

+ * This event is fired immediately before the tile's content is unloaded while the frame is being + * rendered so that the event listener has access to the tile's content. Do not create + * or modify Cesium entities or primitives during the event listener. + *

+ * @example + * tileset.tileUnload.addEventListener(function(tile) { + * console.log('A tile was unloaded from the cache.'); + * }); + */ + tileUnload: Event; + /** + * The event fired to indicate that a tile's content failed to load. + *

+ * If there are no event listeners, error messages will be logged to the console. + *

+ *

+ * The error object passed to the listener contains two properties: + *

    + *
  • url: the url of the failed tile.
  • + *
  • message: the error message.
  • + *
+ *

+ * If multiple contents are present, this event is raised once per inner content with errors. + *

+ * @example + * tileset.tileFailed.addEventListener(function(error) { + * console.log(`An error occurred loading tile: ${error.url}`); + * console.log(`Error: ${error.message}`); + * }); + */ + tileFailed: Event; + /** + * This event fires once for each visible tile in a frame. This can be used to manually + * style a tileset. + *

+ * The visible {@link Cesium3DTile} is passed to the event listener. + *

+ *

+ * This event is fired during the tileset traversal while the frame is being rendered + * so that updates to the tile take effect in the same frame. Do not create or modify + * Cesium entities or primitives during the event listener. + *

+ * @example + * tileset.tileVisible.addEventListener(function(tile) { + * if (tile.content instanceof Cesium.Model3DTileContent) { + * console.log('A 3D model tile is visible.'); + * } + * }); + * @example + * // Apply a red style and then manually set random colors for every other feature when the tile becomes visible. + * tileset.style = new Cesium.Cesium3DTileStyle({ + * color : 'color("red")' + * }); + * tileset.tileVisible.addEventListener(function(tile) { + * const content = tile.content; + * const featuresLength = content.featuresLength; + * for (let i = 0; i < featuresLength; i+=2) { + * content.getFeature(i).color = Cesium.Color.fromRandom(); + * } + * }); + */ + tileVisible: Event; + /** + * Optimization option. Determines if level of detail skipping should be applied during the traversal. + *

+ * The common strategy for replacement-refinement traversal is to store all levels of the tree in memory and require + * all children to be loaded before the parent can refine. With this optimization levels of the tree can be skipped + * entirely and children can be rendered alongside their parents. The tileset requires significantly less memory when + * using this optimization. + *

+ */ + skipLevelOfDetail: boolean; + /** + * The screen space error that must be reached before skipping levels of detail. + *

+ * Only used when {@link Cesium3DTileset#skipLevelOfDetail} is true. + *

+ */ + baseScreenSpaceError: number; + /** + * Multiplier defining the minimum screen space error to skip. + * For example, if a tile has screen space error of 100, no tiles will be loaded unless they + * are leaves or have a screen space error <= 100 / skipScreenSpaceErrorFactor. + *

+ * Only used when {@link Cesium3DTileset#skipLevelOfDetail} is true. + *

+ */ + skipScreenSpaceErrorFactor: number; + /** + * Constant defining the minimum number of levels to skip when loading tiles. When it is 0, no levels are skipped. + * For example, if a tile is level 1, no tiles will be loaded unless they are at level greater than 2. + *

+ * Only used when {@link Cesium3DTileset#skipLevelOfDetail} is true. + *

+ */ + skipLevels: number; + /** + * When true, only tiles that meet the maximum screen space error will ever be downloaded. + * Skipping factors are ignored and just the desired tiles are loaded. + *

+ * Only used when {@link Cesium3DTileset#skipLevelOfDetail} is true. + *

+ */ + immediatelyLoadDesiredLevelOfDetail: boolean; + /** + * Determines whether siblings of visible tiles are always downloaded during traversal. + * This may be useful for ensuring that tiles are already available when the viewer turns left/right. + *

+ * Only used when {@link Cesium3DTileset#skipLevelOfDetail} is true. + *

+ */ + loadSiblings: boolean; + /** + * The light color when shading models. When undefined the scene's light color is used instead. + *

+ * For example, disabling additional light sources by setting + * tileset.imageBasedLighting.imageBasedLightingFactor = new Cartesian2(0.0, 0.0) + * will make the tileset much darker. Here, increasing the intensity of the light source will make the tileset brighter. + *

+ */ + lightColor: Cartesian3; + /** + * Whether to cull back-facing geometry. When true, back face culling is determined + * by the glTF material's doubleSided property; when false, back face culling is disabled. + */ + backFaceCulling: boolean; + /** + * Whether to display the outline for models using the + * {@link https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/CESIUM_primitive_outline|CESIUM_primitive_outline} extension. + * When true, outlines are displayed. When false, outlines are not displayed. + */ + showOutline: boolean; + /** + * The color to use when rendering outlines. + */ + outlineColor: Color; + /** + * The {@link SplitDirection} to apply to this tileset. + */ + splitDirection: SplitDirection; + /** + * If true, allows collisions for camera collisions or picking. While this is true the camera will be prevented from going in or below the tileset surface if {@link ScreenSpaceCameraController#enableCollisionDetection} is true. This can have performance implecations if the tileset contains tile with a larger number of vertices. + */ + enableCollision: boolean; + /** + * This property is for debugging only; it is not optimized for production use. + *

+ * Determines if only the tiles from last frame should be used for rendering. This + * effectively "freezes" the tileset to the previous frame so it is possible to zoom + * out and see what was rendered. + *

+ */ + debugFreezeFrame: boolean; + /** + * This property is for debugging only; it is not optimized for production use. + *

+ * When true, assigns a random color to each tile. This is useful for visualizing + * what features belong to what tiles, especially with additive refinement where features + * from parent tiles may be interleaved with features from child tiles. + *

+ */ + debugColorizeTiles: boolean; + /** + * This property is for debugging only; it is not optimized for production use. + *

+ * When true, renders each tile's content as a wireframe. + *

+ */ + debugWireframe: boolean; + /** + * This property is for debugging only; it is not optimized for production use. + *

+ * When true, renders the bounding volume for each visible tile. The bounding volume is + * white if the tile has a content bounding volume or is empty; otherwise, it is red. Tiles that don't meet the + * screen space error and are still refining to their descendants are yellow. + *

+ */ + debugShowBoundingVolume: boolean; + /** + * This property is for debugging only; it is not optimized for production use. + *

+ * When true, renders the bounding volume for each visible tile's content. The bounding volume is + * blue if the tile has a content bounding volume; otherwise it is red. + *

+ */ + debugShowContentBoundingVolume: boolean; + /** + * This property is for debugging only; it is not optimized for production use. + *

+ * When true, renders the viewer request volume for each tile. + *

+ */ + debugShowViewerRequestVolume: boolean; + /** + * This property is for debugging only; it is not optimized for production use. + *

+ * When true, draws labels to indicate the geometric error of each tile. + *

+ */ + debugShowGeometricError: boolean; + /** + * This property is for debugging only; it is not optimized for production use. + *

+ * When true, draws labels to indicate the number of commands, points, triangles and features of each tile. + *

+ */ + debugShowRenderingStatistics: boolean; + /** + * This property is for debugging only; it is not optimized for production use. + *

+ * When true, draws labels to indicate the geometry and texture memory usage of each tile. + *

+ */ + debugShowMemoryUsage: boolean; + /** + * This property is for debugging only; it is not optimized for production use. + *

+ * When true, draws labels to indicate the url of each tile. + *

+ */ + debugShowUrl: boolean; + /** + * Function for examining vector lines as they are being streamed. + */ + examineVectorLinesFunction: (...params: any[]) => any; + /** + * Gets the tileset's asset object property, which contains metadata about the tileset. + *

+ * See the {@link https://github.com/CesiumGS/3d-tiles/tree/main/specification#reference-asset|asset schema reference} + * in the 3D Tiles spec for the full set of properties. + *

+ */ + readonly asset: any; + /** + * Gets the tileset's extensions object property. + */ + readonly extensions: any; + /** + * The {@link ClippingPlaneCollection} used to selectively disable rendering the tileset. + */ + clippingPlanes: ClippingPlaneCollection; + /** + * The {@link ClippingPolygonCollection} used to selectively disable rendering the tileset. + */ + clippingPolygons: ClippingPolygonCollection; + /** + * Gets the tileset's properties dictionary object, which contains metadata about per-feature properties. + *

+ * See the {@link https://github.com/CesiumGS/3d-tiles/tree/main/specification#reference-properties|properties schema reference} + * in the 3D Tiles spec for the full set of properties. + *

+ * @example + * console.log(`Maximum building height: ${tileset.properties.height.maximum}`); + * console.log(`Minimum building height: ${tileset.properties.height.minimum}`); + */ + readonly properties: any; + /** + * When true, all tiles that meet the screen space error this frame are loaded. The tileset is + * completely loaded for this view. + */ + readonly tilesLoaded: boolean; + /** + * The resource used to fetch the tileset JSON file + */ + readonly resource: Resource; + /** + * The base path that non-absolute paths in tileset JSON file are relative to. + */ + readonly basePath: string; + /** + * The style, defined using the + * {@link https://github.com/CesiumGS/3d-tiles/tree/main/specification/Styling|3D Tiles Styling language}, + * applied to each feature in the tileset. + *

+ * Assign undefined to remove the style, which will restore the visual + * appearance of the tileset to its default when no style was applied. + *

+ *

+ * The style is applied to a tile before the {@link Cesium3DTileset#tileVisible} + * event is raised, so code in tileVisible can manually set a feature's + * properties (e.g. color and show) after the style is applied. When + * a new style is assigned any manually set properties are overwritten. + *

+ *

+ * Use an always "true" condition to specify the Color for all objects that are not + * overridden by pre-existing conditions. Otherwise, the default color Cesium.Color.White + * will be used. Similarly, use an always "true" condition to specify the show property + * for all objects that are not overridden by pre-existing conditions. Otherwise, the + * default show value true will be used. + *

+ * @example + * tileset.style = new Cesium.Cesium3DTileStyle({ + * color : { + * conditions : [ + * ['${Height} >= 100', 'color("purple", 0.5)'], + * ['${Height} >= 50', 'color("red")'], + * ['true', 'color("blue")'] + * ] + * }, + * show : '${Height} > 0', + * meta : { + * description : '"Building id ${id} has height ${Height}."' + * } + * }); + */ + style: Cesium3DTileStyle | undefined; + /** + * A custom shader to apply to all tiles in the tileset. Only used for + * contents that use {@link Model}. Using custom shaders with a + * {@link Cesium3DTileStyle} may lead to undefined behavior. + */ + customShader: CustomShader | undefined; + /** + * The maximum screen space error used to drive level of detail refinement. This value helps determine when a tile + * refines to its descendants, and therefore plays a major role in balancing performance with visual quality. + *

+ * A tile's screen space error is roughly equivalent to the number of pixels wide that would be drawn if a sphere with a + * radius equal to the tile's geometric error were rendered at the tile's position. If this value exceeds + * maximumScreenSpaceError the tile refines to its descendants. + *

+ *

+ * Depending on the tileset, maximumScreenSpaceError may need to be tweaked to achieve the right balance. + * Higher values provide better performance but lower visual quality. + *

+ */ + maximumScreenSpaceError: number; + /** + * The amount of GPU memory (in bytes) used to cache tiles. This memory usage is estimated from + * geometry, textures, and batch table textures of loaded tiles. For point clouds, this value also + * includes per-point metadata. + *

+ * Tiles not in view are unloaded to enforce this. + *

+ *

+ * If decreasing this value results in unloading tiles, the tiles are unloaded the next frame. + *

+ *

+ * If tiles sized more than cacheBytes are needed to meet the + * desired screen space error, determined by {@link Cesium3DTileset#maximumScreenSpaceError}, + * for the current view, then the memory usage of the tiles loaded will exceed + * cacheBytes by up to maximumCacheOverflowBytes. + * For example, if cacheBytes is 500000, but 600000 bytes + * of tiles are needed to meet the screen space error, then 600000 bytes of tiles + * may be loaded (if maximumCacheOverflowBytes is at least 100000). + * When these tiles go out of view, they will be unloaded. + *

+ */ + cacheBytes: number; + /** + * The maximum additional amount of GPU memory (in bytes) that will be used to cache tiles. + *

+ * If tiles sized more than cacheBytes plus maximumCacheOverflowBytes + * are needed to meet the desired screen space error, determined by + * {@link Cesium3DTileset#maximumScreenSpaceError} for the current view, then + * {@link Cesium3DTileset#memoryAdjustedScreenSpaceError} will be adjusted + * until the tiles required to meet the adjusted screen space error use less + * than cacheBytes plus maximumCacheOverflowBytes. + *

+ */ + maximumCacheOverflowBytes: number; + /** + * Options for controlling point size based on geometric error and eye dome lighting. + */ + pointCloudShading: PointCloudShading; + /** + * The root tile. + */ + readonly root: Cesium3DTile; + /** + * The tileset's bounding sphere. + * @example + * const tileset = await Cesium.Cesium3DTileset.fromUrl("http://localhost:8002/tilesets/Seattle/tileset.json"); + * + * viewer.scene.primitives.add(tileset); + * + * // Set the camera to view the newly added tileset + * viewer.camera.viewBoundingSphere(tileset.boundingSphere, new Cesium.HeadingPitchRange(0, -0.5, 0)); + */ + readonly boundingSphere: BoundingSphere; + /** + * A 4x4 transformation matrix that transforms the entire tileset. + * @example + * // Adjust a tileset's height from the globe's surface. + * const heightOffset = 20.0; + * const boundingSphere = tileset.boundingSphere; + * const cartographic = Cesium.Cartographic.fromCartesian(boundingSphere.center); + * const surface = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, 0.0); + * const offset = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, heightOffset); + * const translation = Cesium.Cartesian3.subtract(offset, surface, new Cesium.Cartesian3()); + * tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation); + */ + modelMatrix: Matrix4; + /** + * Returns the time, in milliseconds, since the tileset was loaded and first updated. + */ + readonly timeSinceLoad: number; + /** + * The total amount of GPU memory in bytes used by the tileset. This value is estimated from + * geometry, texture, batch table textures, and binary metadata of loaded tiles. + */ + readonly totalMemoryUsageInBytes: number; + /** + * Determines whether terrain, 3D Tiles, or both will be classified by this tileset. + *

+ * This option is only applied to tilesets containing batched 3D models, + * glTF content, geometry data, or vector data. Even when undefined, vector + * and geometry data must render as classifications and will default to + * rendering on both terrain and other 3D Tiles tilesets. + *

+ *

+ * When enabled for batched 3D model and glTF tilesets, there are a few + * requirements/limitations on the glTF: + *

    + *
  • The glTF cannot contain morph targets, skins, or animations.
  • + *
  • The glTF cannot contain the EXT_mesh_gpu_instancing extension.
  • + *
  • Only meshes with TRIANGLES can be used to classify other assets.
  • + *
  • The meshes must be watertight.
  • + *
  • The POSITION semantic is required.
  • + *
  • If _BATCHIDs and an index buffer are both present, all indices with the same batch id must occupy contiguous sections of the index buffer.
  • + *
  • If _BATCHIDs are present with no index buffer, all positions with the same batch id must occupy contiguous sections of the position buffer.
  • + *
+ *

+ *

+ * Additionally, classification is not supported for points or instanced 3D + * models. + *

+ *

+ * The 3D Tiles or terrain receiving the classification must be opaque. + *

+ */ + readonly classificationType: ClassificationType; + /** + * Gets an ellipsoid describing the shape of the globe. + */ + readonly ellipsoid: Ellipsoid; + /** + * Optimization option. Used when {@link Cesium3DTileset#foveatedScreenSpaceError} is true to control the cone size that determines which tiles are deferred. + * Tiles that are inside this cone are loaded immediately. Tiles outside the cone are potentially deferred based on how far outside the cone they are and {@link Cesium3DTileset#foveatedInterpolationCallback} and {@link Cesium3DTileset#foveatedMinimumScreenSpaceErrorRelaxation}. + * Setting this to 0.0 means the cone will be the line formed by the camera position and its view direction. Setting this to 1.0 means the cone encompasses the entire field of view of the camera, essentially disabling the effect. + */ + foveatedConeSize: number; + /** + * Optimization option. Used when {@link Cesium3DTileset#foveatedScreenSpaceError} is true to control the starting screen space error relaxation for tiles outside the foveated cone. + * The screen space error will be raised starting with this value up to {@link Cesium3DTileset#maximumScreenSpaceError} based on the provided {@link Cesium3DTileset#foveatedInterpolationCallback}. + */ + foveatedMinimumScreenSpaceErrorRelaxation: number; + /** + * Returns the extras property at the top-level of the tileset JSON, which contains application specific metadata. + * Returns undefined if extras does not exist. + */ + readonly extras: any; + /** + * The properties for managing image-based lighting on this tileset. + */ + imageBasedLighting: ImageBasedLighting; + /** + * The properties for managing dynamic environment maps on this model. Affects lighting. + * @example + * // Change the ground color used for a tileset's environment map to a forest green + * const environmentMapManager = tileset.environmentMapManager; + * environmentMapManager.groundColor = Cesium.Color.fromCssColorString("#203b34"); + */ + readonly environmentMapManager: DynamicEnvironmentMapManager; + /** + * Indicates that only the tileset's vector tiles should be used for classification. + */ + vectorClassificationOnly: boolean; + /** + * Whether vector tiles should keep decoded positions in memory. + * This is used with {@link Cesium3DTileFeature.getPolylinePositions}. + */ + vectorKeepDecodedPositions: boolean; + /** + * Determines whether the credits of the tileset will be displayed on the screen + */ + showCreditsOnScreen: boolean; + /** + * Label of the feature ID set to use for picking and styling. + *

+ * For EXT_mesh_features, this is the feature ID's label property, or + * "featureId_N" (where N is the index in the featureIds array) when not + * specified. EXT_feature_metadata did not have a label field, so such + * feature ID sets are always labeled "featureId_N" where N is the index in + * the list of all feature Ids, where feature ID attributes are listed before + * feature ID textures. + *

+ *

+ * If featureIdLabel is set to an integer N, it is converted to + * the string "featureId_N" automatically. If both per-primitive and + * per-instance feature IDs are present, the instance feature IDs take + * priority. + *

+ */ + featureIdLabel: string; + /** + * Label of the instance feature ID set used for picking and styling. + *

+ * If instanceFeatureIdLabel is set to an integer N, it is converted to + * the string "instanceFeatureId_N" automatically. + * If both per-primitive and per-instance feature IDs are present, the + * instance feature IDs take priority. + *

+ */ + instanceFeatureIdLabel: string; + /** + * Creates a {@link https://github.com/CesiumGS/3d-tiles/tree/main/specification|3D Tiles tileset}, + * used for streaming massive heterogeneous 3D geospatial datasets, from a Cesium ion asset ID. + * @example + * // Load a Cesium3DTileset with a Cesium ion asset ID of 124624234 + * try { + * const tileset = await Cesium.Cesium3DTileset.fromIonAssetId(124624234); + * scene.primitives.add(tileset); + * } catch (error) { + * console.error(`Error creating tileset: ${error}`); + * } + * @param assetId - The Cesium ion asset id. + * @param [options] - An object describing initialization options + */ + static fromIonAssetId( + assetId: number, + options?: Cesium3DTileset.ConstructorOptions, + ): Promise; + /** + * Creates a {@link https://github.com/CesiumGS/3d-tiles/tree/main/specification|3D Tiles tileset}, + * used for streaming massive heterogeneous 3D geospatial datasets. + * @example + * try { + * const tileset = await Cesium.Cesium3DTileset.fromUrl( + * "http://localhost:8002/tilesets/Seattle/tileset.json" + * ); + * scene.primitives.add(tileset); + * } catch (error) { + * console.error(`Error creating tileset: ${error}`); + * } + * @example + * // Common setting for the skipLevelOfDetail optimization + * const tileset = await Cesium.Cesium3DTileset.fromUrl( + * "http://localhost:8002/tilesets/Seattle/tileset.json", { + * skipLevelOfDetail: true, + * baseScreenSpaceError: 1024, + * skipScreenSpaceErrorFactor: 16, + * skipLevels: 1, + * immediatelyLoadDesiredLevelOfDetail: false, + * loadSiblings: false, + * cullWithChildrenBounds: true + * }); + * scene.primitives.add(tileset); + * @example + * // Common settings for the dynamicScreenSpaceError optimization + * const tileset = await Cesium.Cesium3DTileset.fromUrl( + * "http://localhost:8002/tilesets/Seattle/tileset.json", { + * dynamicScreenSpaceError: true, + * dynamicScreenSpaceErrorDensity: 2.0e-4, + * dynamicScreenSpaceErrorFactor: 24.0, + * dynamicScreenSpaceErrorHeightFalloff: 0.25 + * }); + * scene.primitives.add(tileset); + * @param url - The url to a tileset JSON file. + * @param [options] - An object describing initialization options + */ + static fromUrl( + url: Resource | string, + options?: Cesium3DTileset.ConstructorOptions, + ): Promise; + /** + * Provides a hook to override the method used to request the tileset json + * useful when fetching tilesets from remote servers + * @param tilesetUrl - The url of the json file to be fetched + * @returns A promise that resolves with the fetched json data + */ + static loadJson(tilesetUrl: Resource | string): Promise; + /** + * Marks the tileset's {@link Cesium3DTileset#style} as dirty, which forces all + * features to re-evaluate the style in the next frame each is visible. + */ + makeStyleDirty(): void; + /** + * Unloads all tiles that weren't selected the previous frame. This can be used to + * explicitly manage the tile cache and reduce the total number of tiles loaded below + * {@link Cesium3DTileset#cacheBytes}. + *

+ * Tile unloads occur at the next frame to keep all the WebGL delete calls + * within the render loop. + *

+ */ + trimLoadedTiles(): void; + /** + * true if the tileset JSON file lists the extension in extensionsUsed; otherwise, false. + * @param extensionName - The name of the extension to check. + * @returns true if the tileset JSON file lists the extension in extensionsUsed; otherwise, false. + */ + hasExtension(extensionName: string): boolean; + /** + * Returns true if this object was destroyed; otherwise, false. + *

+ * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

+ * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * tileset = tileset && tileset.destroy(); + */ + destroy(): void; + /** + * Get the height of the loaded surface at a given cartographic. This function will only take into account meshes for loaded tiles, not neccisarily the most detailed tiles available for a tileset. This function will always return undefined when sampling a point cloud. + * @example + * const tileset = await Cesium.Cesium3DTileset.fromIonAssetId(124624234); + * scene.primitives.add(tileset); + * + * const height = tileset.getHeight(scene.camera.positionCartographic, scene); + * @param cartographic - The cartographic for which to find the height. + * @param scene - The scene where visualization is taking place. + * @returns The height of the cartographic or undefined if it could not be found. + */ + getHeight(cartographic: Cartographic, scene: Scene): number | undefined; + } + + /** + * A ParticleEmitter that emits particles from a circle. + * Particles will be positioned within a circle and have initial velocities going along the z vector. + * @param [radius = 1.0] - The radius of the circle in meters. + */ + export class CircleEmitter { + constructor(radius?: number); + /** + * The radius of the circle in meters. + */ + radius: number; + /** + * The angle of the cone in radians. + */ + angle: number; + } + + /** + * A classification primitive represents a volume enclosing geometry in the {@link Scene} to be highlighted. + *

+ * A primitive combines geometry instances with an {@link Appearance} that describes the full shading, including + * {@link Material} and {@link RenderState}. Roughly, the geometry instance defines the structure and placement, + * and the appearance defines the visual characteristics. Decoupling geometry and appearance allows us to mix + * and match most of them and add a new geometry or appearance independently of each other. + * Only {@link PerInstanceColorAppearance} with the same color across all instances is supported at this time when using + * ClassificationPrimitive directly. + * For full {@link Appearance} support when classifying terrain or 3D Tiles use {@link GroundPrimitive} instead. + *

+ *

+ * For correct rendering, this feature requires the EXT_frag_depth WebGL extension. For hardware that do not support this extension, there + * will be rendering artifacts for some viewing angles. + *

+ *

+ * Valid geometries are {@link BoxGeometry}, {@link CylinderGeometry}, {@link EllipsoidGeometry}, {@link PolylineVolumeGeometry}, and {@link SphereGeometry}. + *

+ *

+ * Geometries that follow the surface of the ellipsoid, such as {@link CircleGeometry}, {@link CorridorGeometry}, {@link EllipseGeometry}, {@link PolygonGeometry}, and {@link RectangleGeometry}, + * are also valid if they are extruded volumes; otherwise, they will not be rendered. + *

+ * @param [options] - Object with the following properties: + * @param [options.geometryInstances] - The geometry instances to render. This can either be a single instance or an array of length one. + * @param [options.appearance] - The appearance used to render the primitive. Defaults to PerInstanceColorAppearance when GeometryInstances have a color attribute. + * @param [options.show = true] - Determines if this primitive will be shown. + * @param [options.vertexCacheOptimize = false] - When true, geometry vertices are optimized for the pre and post-vertex-shader caches. + * @param [options.interleave = false] - When true, geometry vertex attributes are interleaved, which can slightly improve rendering performance but increases load time. + * @param [options.compressVertices = true] - When true, the geometry vertices are compressed, which will save memory. + * @param [options.releaseGeometryInstances = true] - When true, the primitive does not keep a reference to the input geometryInstances to save memory. + * @param [options.allowPicking = true] - When true, each geometry instance will only be pickable with {@link Scene#pick}. When false, GPU memory is saved. + * @param [options.asynchronous = true] - Determines if the primitive will be created asynchronously or block until ready. If false initializeTerrainHeights() must be called first. + * @param [options.classificationType = ClassificationType.BOTH] - Determines whether terrain, 3D Tiles or both will be classified. + * @param [options.debugShowBoundingVolume = false] - For debugging only. Determines if this primitive's commands' bounding spheres are shown. + * @param [options.debugShowShadowVolume = false] - For debugging only. Determines if the shadow volume for each geometry in the primitive is drawn. Must be true on + * creation for the volumes to be created before the geometry is released or options.releaseGeometryInstance must be false. + */ + export class ClassificationPrimitive { + constructor(options?: { + geometryInstances?: any[] | GeometryInstance; + appearance?: Appearance; + show?: boolean; + vertexCacheOptimize?: boolean; + interleave?: boolean; + compressVertices?: boolean; + releaseGeometryInstances?: boolean; + allowPicking?: boolean; + asynchronous?: boolean; + classificationType?: ClassificationType; + debugShowBoundingVolume?: boolean; + debugShowShadowVolume?: boolean; + }); + /** + * The geometry instance rendered with this primitive. This may + * be undefined if options.releaseGeometryInstances + * is true when the primitive is constructed. + *

+ * Changing this property after the primitive is rendered has no effect. + *

+ *

+ * Because of the rendering technique used, all geometry instances must be the same color. + * If there is an instance with a differing color, a DeveloperError will be thrown + * on the first attempt to render. + *

+ */ + readonly geometryInstances: any[] | GeometryInstance; + /** + * Determines if the primitive will be shown. This affects all geometry + * instances in the primitive. + */ + show: boolean; + /** + * Determines whether terrain, 3D Tiles or both will be classified. + */ + classificationType: ClassificationType; + /** + * This property is for debugging only; it is not for production use nor is it optimized. + *

+ * Draws the bounding sphere for each draw command in the primitive. + *

+ */ + debugShowBoundingVolume: boolean; + /** + * This property is for debugging only; it is not for production use nor is it optimized. + *

+ * Draws the shadow volume for each geometry in the primitive. + *

+ */ + debugShowShadowVolume: boolean; + /** + * When true, geometry vertices are optimized for the pre and post-vertex-shader caches. + */ + readonly vertexCacheOptimize: boolean; + /** + * Determines if geometry vertex attributes are interleaved, which can slightly improve rendering performance. + */ + readonly interleave: boolean; + /** + * When true, the primitive does not keep a reference to the input geometryInstances to save memory. + */ + readonly releaseGeometryInstances: boolean; + /** + * When true, each geometry instance will only be pickable with {@link Scene#pick}. When false, GPU memory is saved. + */ + readonly allowPicking: boolean; + /** + * Determines if the geometry instances will be created and batched on a web worker. + */ + readonly asynchronous: boolean; + /** + * When true, geometry vertices are compressed, which will save memory. + */ + readonly compressVertices: boolean; + /** + * Determines if the primitive is complete and ready to render. If this property is + * true, the primitive will be rendered the next time that {@link ClassificationPrimitive#update} + * is called. + */ + readonly ready: boolean; + /** + * Determines if ClassificationPrimitive rendering is supported. + * @param scene - The scene. + * @returns true if ClassificationPrimitives are supported; otherwise, returns false + */ + static isSupported(scene: Scene): boolean; + /** + * Called when {@link Viewer} or {@link CesiumWidget} render the scene to + * get the draw commands needed to render this primitive. + *

+ * Do not call this function directly. This is documented just to + * list the exceptions that may be propagated when the scene is rendered: + *

+ */ + update(): void; + /** + * Returns the modifiable per-instance attributes for a {@link GeometryInstance}. + * @example + * const attributes = primitive.getGeometryInstanceAttributes('an id'); + * attributes.color = Cesium.ColorGeometryInstanceAttribute.toValue(Cesium.Color.AQUA); + * attributes.show = Cesium.ShowGeometryInstanceAttribute.toValue(true); + * @param id - The id of the {@link GeometryInstance}. + * @returns The typed array in the attribute's format or undefined if the is no instance with id. + */ + getGeometryInstanceAttributes(id: any): any; + /** + * Returns true if this object was destroyed; otherwise, false. + *

+ * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + *

+ * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

+ * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + *

+ * @example + * e = e && e.destroy(); + */ + destroy(): void; + } + + /** + * Whether a classification affects terrain, 3D Tiles or both. + */ + export enum ClassificationType { + /** + * Only terrain will be classified. + */ + TERRAIN = 0, + /** + * Only 3D Tiles will be classified. + */ + CESIUM_3D_TILE = 1, + /** + * Both terrain and 3D Tiles will be classified. + */ + BOTH = 2, + } + + /** + * A Plane in Hessian Normal form to be used with {@link ClippingPlaneCollection}. + * Compatible with mathematics functions in {@link Plane} + * @param normal - The plane's normal (normalized). + * @param distance - The shortest distance from the origin to the plane. The sign of + * distance determines which side of the plane the origin + * is on. If distance is positive, the origin is in the half-space + * in the direction of the normal; if negative, the origin is in the half-space + * opposite to the normal; if zero, the plane passes through the origin. + */ + export class ClippingPlane { + constructor(normal: Cartesian3, distance: number); + /** + * The shortest distance from the origin to the plane. The sign of + * distance determines which side of the plane the origin + * is on. If distance is positive, the origin is in the half-space + * in the direction of the normal; if negative, the origin is in the half-space + * opposite to the normal; if zero, the plane passes through the origin. + */ + distance: number; + /** + * The plane's normal. + */ + normal: Cartesian3; + /** + * Create a ClippingPlane from a Plane object. + * @param plane - The plane containing parameters to copy + * @param [result] - The object on which to store the result + * @returns The ClippingPlane generated from the plane's parameters. + */ + static fromPlane(plane: Plane, result?: ClippingPlane): ClippingPlane; + /** + * Clones the ClippingPlane without setting its ownership. + * @param clippingPlane - The ClippingPlane to be cloned + * @param [result] - The object on which to store the cloned parameters. + * @returns a clone of the input ClippingPlane + */ + static clone( + clippingPlane: ClippingPlane, + result?: ClippingPlane, + ): ClippingPlane; + } + + /** + * Specifies a set of clipping planes. Clipping planes selectively disable rendering in a region on the + * outside of the specified list of {@link ClippingPlane} objects for a single gltf model, 3D Tileset, or the globe. + *

+ * In general the clipping planes' coordinates are relative to the object they're attached to, so a plane with distance set to 0 will clip + * through the center of the object. + *

+ *

+ * For 3D Tiles, the root tile's transform is used to position the clipping planes. If a transform is not defined, the root tile's {@link Cesium3DTile#boundingSphere} is used instead. + *

+ * @example + * // This clipping plane's distance is positive, which means its normal + * // is facing the origin. This will clip everything that is behind + * // the plane, which is anything with y coordinate < -5. + * const clippingPlanes = new Cesium.ClippingPlaneCollection({ + * planes : [ + * new Cesium.ClippingPlane(new Cesium.Cartesian3(0.0, 1.0, 0.0), 5.0) + * ], + * }); + * // Create an entity and attach the ClippingPlaneCollection to the model. + * const entity = viewer.entities.add({ + * position : Cesium.Cartesian3.fromDegrees(-123.0744619, 44.0503706, 10000), + * model : { + * uri : 'model.gltf', + * minimumPixelSize : 128, + * maximumScale : 20000, + * clippingPlanes : clippingPlanes + * } + * }); + * viewer.zoomTo(entity); + * @param [options] - Object with the following properties: + * @param [options.planes = []] - An array of {@link ClippingPlane} objects used to selectively disable rendering on the outside of each plane. + * @param [options.enabled = true] - Determines whether the clipping planes are active. + * @param [options.modelMatrix = Matrix4.IDENTITY] - The 4x4 transformation matrix specifying an additional transform relative to the clipping planes original coordinate system. + * @param [options.unionClippingRegions = false] - If true, a region will be clipped if it is on the outside of any plane in the collection. Otherwise, a region will only be clipped if it is on the outside of every plane. + * @param [options.edgeColor = Color.WHITE] - The color applied to highlight the edge along which an object is clipped. + * @param [options.edgeWidth = 0.0] - The width, in pixels, of the highlight applied to the edge along which an object is clipped. + */ + export class ClippingPlaneCollection { + constructor(options?: { + planes?: ClippingPlane[]; + enabled?: boolean; + modelMatrix?: Matrix4; + unionClippingRegions?: boolean; + edgeColor?: Color; + edgeWidth?: number; + }); + /** + * The 4x4 transformation matrix specifying an additional transform relative to the clipping planes + * original coordinate system. + */ + modelMatrix: Matrix4; + /** + * The color applied to highlight the edge along which an object is clipped. + */ + edgeColor: Color; + /** + * The width, in pixels, of the highlight applied to the edge along which an object is clipped. + */ + edgeWidth: number; + /** + * An event triggered when a new clipping plane is added to the collection. Event handlers + * are passed the new plane and the index at which it was added. + */ + planeAdded: Event; + /** + * An event triggered when a new clipping plane is removed from the collection. Event handlers + * are passed the new plane and the index from which it was removed. + */ + planeRemoved: Event; + /** + * Returns the number of planes in this collection. This is commonly used with + * {@link ClippingPlaneCollection#get} to iterate over all the planes + * in the collection. + */ + readonly length: number; + /** + * If true, a region will be clipped if it is on the outside of any plane in the + * collection. Otherwise, a region will only be clipped if it is on the + * outside of every plane. + */ + unionClippingRegions: boolean; + /** + * If true, clipping will be enabled. + */ + enabled: boolean; + /** + * Adds the specified {@link ClippingPlane} to the collection to be used to selectively disable rendering + * on the outside of each plane. Use {@link ClippingPlaneCollection#unionClippingRegions} to modify + * how modify the clipping behavior of multiple planes. + * @param plane - The ClippingPlane to add to the collection. + */ + add(plane: ClippingPlane): void; + /** + * Returns the plane in the collection at the specified index. Indices are zero-based + * and increase as planes are added. Removing a plane shifts all planes after + * it to the left, changing their indices. This function is commonly used with + * {@link ClippingPlaneCollection#length} to iterate over all the planes + * in the collection. + * @param index - The zero-based index of the plane. + * @returns The ClippingPlane at the specified index. + */ + get(index: number): ClippingPlane; + /** + * Checks whether this collection contains a ClippingPlane equal to the given ClippingPlane. + * @param [clippingPlane] - The ClippingPlane to check for. + * @returns true if this collection contains the ClippingPlane, false otherwise. + */ + contains(clippingPlane?: ClippingPlane): boolean; + /** + * Removes the first occurrence of the given ClippingPlane from the collection. + * @returns true if the plane was removed; false if the plane was not found in the collection. + */ + remove(clippingPlane: ClippingPlane): boolean; + /** + * Removes all planes from the collection. + */ + removeAll(): void; + /** + * Called when {@link Viewer} or {@link CesiumWidget} render the scene to + * build the resources for clipping planes. + *

+ * Do not call this function directly. + *

+ */ + update(): void; + /** + * Returns true if this object was destroyed; otherwise, false. + *

+ * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

+ * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * clippingPlanes = clippingPlanes && clippingPlanes.destroy(); + */ + destroy(): void; + } + + /** + * A geodesic polygon to be used with {@link ClippingPlaneCollection} for selectively hiding regions in a model, a 3D tileset, or the globe. + * @example + * const positions = Cesium.Cartesian3.fromRadiansArray([ + * -1.3194369277314022, + * 0.6988062530900625, + * -1.31941, + * 0.69879, + * -1.3193955980204217, + * 0.6988091578771254, + * -1.3193931220959367, + * 0.698743632490865, + * -1.3194358224045408, + * 0.6987471965556998, + * ]); + * + * const polygon = new Cesium.ClippingPolygon({ + * positions: positions + * }); + * @param options - Object with the following properties: + * @param options.positions - A list of three or more Cartesian coordinates defining the outer ring of the clipping polygon. + */ + export class ClippingPolygon { + constructor(options: { positions: Cartesian3[]; ellipsoid?: Ellipsoid }); + /** + * Returns the total number of positions in the polygon, include any holes. + */ + readonly length: number; + /** + * Returns the outer ring of positions. + */ + readonly positions: Cartesian3[]; + /** + * Returns the ellipsoid used to project the polygon onto surfaces when clipping. + */ + readonly ellipsoid: Ellipsoid; + /** + * Clones the ClippingPolygon without setting its ownership. + * @param polygon - The ClippingPolygon to be cloned + * @param [result] - The object on which to store the cloned parameters. + * @returns a clone of the input ClippingPolygon + */ + static clone( + polygon: ClippingPolygon, + result?: ClippingPolygon, + ): ClippingPolygon; + /** + * Compares the provided ClippingPolygons and returns + * true if they are equal, false otherwise. + * @param left - The first polygon. + * @param right - The second polygon. + * @returns true if left and right are equal, false otherwise. + */ + static equals(left: ClippingPolygon, right: ClippingPolygon): boolean; + /** + * Computes a cartographic rectangle which encloses the polygon defined by the list of positions, including cases over the international date line and the poles. + * @param [result] - An object in which to store the result. + * @returns The result rectangle + */ + computeRectangle(result?: Rectangle): Rectangle; + } + + /** + * Specifies a set of clipping polygons. Clipping polygons selectively disable rendering in a region + * inside or outside the specified list of {@link ClippingPolygon} objects for a single glTF model, 3D Tileset, or the globe. + * + * Clipping Polygons are only supported in WebGL 2 contexts. + * @example + * const positions = Cesium.Cartesian3.fromRadiansArray([ + * -1.3194369277314022, + * 0.6988062530900625, + * -1.31941, + * 0.69879, + * -1.3193955980204217, + * 0.6988091578771254, + * -1.3193931220959367, + * 0.698743632490865, + * -1.3194358224045408, + * 0.6987471965556998, + * ]); + * + * const polygon = new Cesium.ClippingPolygon({ + * positions: positions + * }); + * + * const polygons = new Cesium.ClippingPolygonCollection({ + * polygons: [ polygon ] + * }); + * @param [options] - Object with the following properties: + * @param [options.polygons = []] - An array of {@link ClippingPolygon} objects used to selectively disable rendering on the inside of each polygon. + * @param [options.enabled = true] - Determines whether the clipping polygons are active. + * @param [options.inverse = false] - If true, a region will be clipped if it is outside of every polygon in the collection. Otherwise, a region will only be clipped if it is on the inside of any polygon. + */ + export class ClippingPolygonCollection { + constructor(options?: { + polygons?: ClippingPolygon[]; + enabled?: boolean; + inverse?: boolean; + }); + /** + * An event triggered when a new clipping polygon is added to the collection. Event handlers + * are passed the new polygon and the index at which it was added. + */ + polygonAdded: Event; + /** + * An event triggered when a new clipping polygon is removed from the collection. Event handlers + * are passed the new polygon and the index from which it was removed. + */ + polygonRemoved: Event; + /** + * Returns the number of polygons in this collection. This is commonly used with + * {@link ClippingPolygonCollection#get} to iterate over all the polygons + * in the collection. + */ + readonly length: number; + /** + * Adds the specified {@link ClippingPolygon} to the collection to be used to selectively disable rendering + * on the inside of each polygon. Use {@link ClippingPolygonCollection#unionClippingRegions} to modify + * how modify the clipping behavior of multiple polygons. + * @example + * const polygons = new Cesium.ClippingPolygonCollection(); + * + * const positions = Cesium.Cartesian3.fromRadiansArray([ + * -1.3194369277314022, + * 0.6988062530900625, + * -1.31941, + * 0.69879, + * -1.3193955980204217, + * 0.6988091578771254, + * -1.3193931220959367, + * 0.698743632490865, + * -1.3194358224045408, + * 0.6987471965556998, + * ]); + * + * polygons.add(new Cesium.ClippingPolygon({ + * positions: positions + * })); + * @param polygon - The ClippingPolygon to add to the collection. + * @returns The added ClippingPolygon. + */ + add(polygon: ClippingPolygon): ClippingPolygon; + /** + * Returns the clipping polygon in the collection at the specified index. Indices are zero-based + * and increase as polygons are added. Removing a polygon polygon all polygons after + * it to the left, changing their indices. This function is commonly used with + * {@link ClippingPolygonCollection#length} to iterate over all the polygons + * in the collection. + * @param index - The zero-based index of the polygon. + * @returns The ClippingPolygon at the specified index. + */ + get(index: number): ClippingPolygon; + /** + * Checks whether this collection contains a ClippingPolygon equal to the given ClippingPolygon. + * @param polygon - The ClippingPolygon to check for. + * @returns true if this collection contains the ClippingPolygon, false otherwise. + */ + contains(polygon: ClippingPolygon): boolean; + /** + * Removes the first occurrence of the given ClippingPolygon from the collection. + * @returns true if the polygon was removed; false if the polygon was not found in the collection. + */ + remove(polygon: ClippingPolygon): boolean; + /** + * Removes all polygons from the collection. + */ + removeAll(): void; + /** + * Function for checking if the context will allow clipping polygons, which require floating point textures. + * @param scene - The scene that will contain clipped objects and clipping textures. + * @returns true if the context supports clipping polygons. + */ + static isSupported(scene: Scene | any): boolean; + /** + * Returns true if this object was destroyed; otherwise, false. + *

+ * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

+ * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * clippingPolygons = clippingPolygons && clippingPolygons.destroy(); + */ + destroy(): void; + } + + /** + * A renderable collection of clouds in the 3D scene. + *

+ *
+ *
+ * Example cumulus clouds + *
+ *

+ * Clouds are added and removed from the collection using {@link CloudCollection#add} + * and {@link CloudCollection#remove}. + * @example + * // Create a cloud collection with two cumulus clouds + * const clouds = scene.primitives.add(new Cesium.CloudCollection()); + * clouds.add({ + * position : new Cesium.Cartesian3(1.0, 2.0, 3.0), + * maximumSize: new Cesium.Cartesian3(20.0, 12.0, 8.0) + * }); + * clouds.add({ + * position : new Cesium.Cartesian3(4.0, 5.0, 6.0), + * maximumSize: new Cesium.Cartesian3(15.0, 9.0, 9.0), + * slice: 0.5 + * }); + * @param [options] - Object with the following properties: + * @param [options.show = true] - Whether to display the clouds. + * @param [options.noiseDetail = 16.0] - Desired amount of detail in the noise texture. + * @param [options.noiseOffset = Cartesian3.ZERO] - Desired translation of data in noise texture. + * @param [options.debugBillboards = false] - For debugging only. Determines if the billboards are rendered with an opaque color. + * @param [options.debugEllipsoids = false] - For debugging only. Determines if the clouds will be rendered as opaque ellipsoids. + */ + export class CloudCollection { + constructor(options?: { + show?: boolean; + noiseDetail?: number; + noiseOffset?: number; + debugBillboards?: boolean; + debugEllipsoids?: boolean; + }); + /** + *

+ * Controls the amount of detail captured in the precomputed noise texture + * used to render the cumulus clouds. In order for the texture to be tileable, + * this must be a power of two. For best results, set this to be a power of two + * between 8.0 and 32.0 (inclusive). + *

+ * + *
+ * + * + * + *
+ * clouds.noiseDetail = 8.0;
+ * + *
+ * clouds.noiseDetail = 32.0;
+ * + *
+ *
+ */ + noiseDetail: number; + /** + *

+ * Applies a translation to noise texture coordinates to generate different data. + * This can be modified if the default noise does not generate good-looking clouds. + *

+ * + *
+ * + * + * + *
+ * default
+ * + *
+ * clouds.noiseOffset = new Cesium.Cartesian3(10, 20, 10);
+ * + *
+ *
+ */ + noiseOffset: Cartesian3; + /** + * Determines if billboards in this collection will be shown. + */ + show: boolean; + /** + * This property is for debugging only; it is not for production use nor is it optimized. + *

+ * Renders the billboards with one opaque color for the sake of debugging. + *

+ */ + debugBillboards: boolean; + /** + * This property is for debugging only; it is not for production use nor is it optimized. + *

+ * Draws the clouds as opaque, monochrome ellipsoids for the sake of debugging. + * If debugBillboards is also true, then the ellipsoids will draw on top of the billboards. + *

+ */ + debugEllipsoids: boolean; + /** + * Returns the number of clouds in this collection. + */ + length: number; + /** + * Creates and adds a cloud with the specified initial properties to the collection. + * The added cloud is returned so it can be modified or removed from the collection later. + * @example + * // Example 1: Add a cumulus cloud, specifying all the default values. + * const c = clouds.add({ + * show : true, + * position : Cesium.Cartesian3.ZERO, + * scale : new Cesium.Cartesian2(20.0, 12.0), + * maximumSize: new Cesium.Cartesian3(20.0, 12.0, 12.0), + * slice: -1.0, + * cloudType : CloudType.CUMULUS + * }); + * @example + * // Example 2: Specify only the cloud's cartographic position. + * const c = clouds.add({ + * position : Cesium.Cartesian3.fromDegrees(longitude, latitude, height) + * }); + * @param [options] - A template describing the cloud's properties as shown in Example 1. + * @returns The cloud that was added to the collection. + */ + add(options?: any): CumulusCloud; + /** + * Removes a cloud from the collection. + * @example + * const c = clouds.add(...); + * clouds.remove(c); // Returns true + * @param cloud - The cloud to remove. + * @returns true if the cloud was removed; false if the cloud was not found in the collection. + */ + remove(cloud: CumulusCloud): boolean; + /** + * Removes all clouds from the collection. + * @example + * clouds.add(...); + * clouds.add(...); + * clouds.removeAll(); + */ + removeAll(): void; + /** + * Check whether this collection contains a given cloud. + * @param [cloud] - The cloud to check for. + * @returns true if this collection contains the cloud, false otherwise. + */ + contains(cloud?: CumulusCloud): boolean; + /** + * Returns the cloud in the collection at the specified index. Indices are zero-based + * and increase as clouds are added. Removing a cloud shifts all clouds after + * it to the left, changing their indices. This function is commonly used with + * {@link CloudCollection#length} to iterate over all the clouds in the collection. + * @example + * // Toggle the show property of every cloud in the collection + * const len = clouds.length; + * for (let i = 0; i < len; ++i) { + * const c = clouds.get(i); + * c.show = !c.show; + * } + * @param index - The zero-based index of the cloud. + * @returns The cloud at the specified index. + */ + get(index: number): CumulusCloud; + /** + * Returns true if this object was destroyed; otherwise, false. + *

+ * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

+ * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * clouds = clouds && clouds.destroy(); + */ + destroy(): void; + } + + /** + * Specifies the type of the cloud that is added to a {@link CloudCollection} in {@link CloudCollection#add}. + */ + export enum CloudType { + /** + * Cumulus cloud. + */ + CUMULUS = 0, + } + + /** + * Defines different modes for blending between a target color and a primitive's source color. + * + * HIGHLIGHT multiplies the source color by the target color + * REPLACE replaces the source color with the target color + * MIX blends the source color and target color together + */ + export enum ColorBlendMode { + HIGHLIGHT = 0, + REPLACE = 1, + MIX = 2, + } + + /** + * An expression for a style applied to a {@link Cesium3DTileset}. + *

+ * Evaluates a conditions expression defined using the + * {@link https://github.com/CesiumGS/3d-tiles/tree/main/specification/Styling|3D Tiles Styling language}. + *

+ *

+ * Implements the {@link StyleExpression} interface. + *

+ * @example + * const expression = new Cesium.ConditionsExpression({ + * conditions : [ + * ['${Area} > 10, 'color("#FF0000")'], + * ['${id} !== "1"', 'color("#00FF00")'], + * ['true', 'color("#FFFFFF")'] + * ] + * }); + * expression.evaluateColor(feature, result); // returns a Cesium.Color object + * @param [conditionsExpression] - The conditions expression defined using the 3D Tiles Styling language. + * @param [defines] - Defines in the style. + */ + export class ConditionsExpression { + constructor(conditionsExpression?: any, defines?: any); + /** + * Gets the conditions expression defined in the 3D Tiles Styling language. + */ + readonly conditionsExpression: any; + /** + * Evaluates the result of an expression, optionally using the provided feature's properties. If the result of + * the expression in the + * {@link https://github.com/CesiumGS/3d-tiles/tree/main/specification/Styling|3D Tiles Styling language} + * is of type Boolean, Number, or String, the corresponding JavaScript + * primitive type will be returned. If the result is a RegExp, a Javascript RegExp + * object will be returned. If the result is a Cartesian2, Cartesian3, or Cartesian4, + * a {@link Cartesian2}, {@link Cartesian3}, or {@link Cartesian4} object will be returned. If the result argument is + * a {@link Color}, the {@link Cartesian4} value is converted to a {@link Color} and then returned. + * @param feature - The feature whose properties may be used as variables in the expression. + * @param [result] - The object onto which to store the result. + * @returns The result of evaluating the expression. + */ + evaluate( + feature: Cesium3DTileFeature, + result?: any, + ): + | boolean + | number + | string + | RegExp + | Cartesian2 + | Cartesian3 + | Cartesian4 + | Color; + /** + * Evaluates the result of a Color expression, using the values defined by a feature. + *

+ * This is equivalent to {@link ConditionsExpression#evaluate} but always returns a {@link Color} object. + *

+ * @param feature - The feature whose properties may be used as variables in the expression. + * @param [result] - The object in which to store the result + * @returns The modified result parameter or a new Color instance if one was not provided. + */ + evaluateColor(feature: Cesium3DTileFeature, result?: Color): Color; + } + + /** + * A ParticleEmitter that emits particles within a cone. + * Particles will be positioned at the tip of the cone and have initial velocities going towards the base. + * @param [angle = Cesium.Math.toRadians(30.0)] - The angle of the cone in radians. + */ + export class ConeEmitter { + constructor(angle?: number); + } + + /** + * The credit display is responsible for displaying credits on screen. + * @example + * // Add a credit with a tooltip, image and link to display onscreen + * const credit = new Cesium.Credit(``, true); + * viewer.creditDisplay.addStaticCredit(credit); + * @example + * // Add a credit with a plaintext link to display in the lightbox + * const credit = new Cesium.Credit('Cesium'); + * viewer.creditDisplay.addStaticCredit(credit); + * @param container - The HTML element where credits will be displayed + * @param [delimiter = '•'] - The string to separate text credits + * @param [viewport = document.body] - The HTML element that will contain the credits popup + */ + export class CreditDisplay { + constructor( + container: HTMLElement, + delimiter?: string, + viewport?: HTMLElement, + ); + /** + * The HTML element where credits will be displayed. + */ + container: HTMLElement; + /** + * Adds a {@link Credit} that will show on screen or in the lightbox until + * the next frame. This is mostly for internal use. Use {@link CreditDisplay.addStaticCredit} to add a persistent credit to the screen. + * @param credit - The credit to display in the next frame. + */ + addCreditToNextFrame(credit: Credit): void; + /** + * Adds a {@link Credit} that will show on screen or in the lightbox until removed with {@link CreditDisplay.removeStaticCredit}. + * @example + * // Add a credit with a tooltip, image and link to display onscreen + * const credit = new Cesium.Credit(``, true); + * viewer.creditDisplay.addStaticCredit(credit); + * @example + * // Add a credit with a plaintext link to display in the lightbox + * const credit = new Cesium.Credit('Cesium'); + * viewer.creditDisplay.addStaticCredit(credit); + * @param credit - The credit to added + */ + addStaticCredit(credit: Credit): void; + /** + * Removes a static credit shown on screen or in the lightbox. + * @param credit - The credit to be removed. + */ + removeStaticCredit(credit: Credit): void; + /** + * Updates the credit display before a new frame is rendered. + */ + update(): void; + /** + * Resets the credit display to a beginning of frame state, clearing out current credits. + */ + beginFrame(): void; + /** + * Sets the credit display to the end of frame state, displaying credits from the last frame in the credit container. + */ + endFrame(): void; + /** + * Destroys the resources held by this object. Destroying an object allows for deterministic + * release of resources, instead of relying on the garbage collector to destroy this object. + *

+ * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + */ + destroy(): void; + /** + * Returns true if this object was destroyed; otherwise, false. + *

+ * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Gets or sets the Cesium logo credit. + */ + static cesiumCredit: Credit; + } + + /** + * Determines which triangles, if any, are culled. + */ + export enum CullFace { + /** + * Front-facing triangles are culled. + */ + FRONT = WebGLConstants.FRONT, + /** + * Back-facing triangles are culled. + */ + BACK = WebGLConstants.BACK, + /** + * Both front-facing and back-facing triangles are culled. + */ + FRONT_AND_BACK = WebGLConstants.FRONT_AND_BACK, + } + + /** + *
+ * A cloud is created and its initial properties are set by calling {@link CloudCollection#add}. + * and {@link CloudCollection#remove}. Do not call the constructor directly. + *
+ * A cumulus cloud billboard positioned in the 3D scene, that is created and rendered using a {@link CloudCollection}. + *

+ *
+ *
+ * Example cumulus clouds + *
+ */ + export class CumulusCloud { + constructor(); + /** + * Determines if this cumulus cloud will be shown. Use this to hide or show a cloud, instead + * of removing it and re-adding it to the collection. + */ + show: boolean; + /** + * Gets or sets the Cartesian position of this cumulus cloud. + */ + position: Cartesian3; + /** + *

Gets or sets the scale of the cumulus cloud billboard in meters. + * The scale property will affect the size of the billboard, + * but not the cloud's actual appearance.

+ *
+ * + * + * + *
+ * cloud.scale = new Cesium.Cartesian2(12, 8);
+ * + *
+ * cloud.scale = new Cesium.Cartesian2(24, 10);
+ * + *
+ *
+ * + *

To modify the cloud's appearance, modify its maximumSize + * and slice properties.

+ */ + scale: Cartesian2; + /** + *

Gets or sets the maximum size of the cumulus cloud rendered on the billboard. + * This defines a maximum ellipsoid volume that the cloud can appear in. + * Rather than guaranteeing a specific size, this specifies a boundary for the + * cloud to appear in, and changing it can affect the shape of the cloud.

+ *

Changing the z-value of maximumSize has the most dramatic effect + * on the cloud's appearance because it changes the depth of the cloud, and thus the + * positions at which the cloud-shaping texture is sampled.

+ *
+ * + * + * + * + * + * + * + * + * + *
+ * cloud.maximumSize = new Cesium.Cartesian3(14, 9, 10);
+ * + *
+ * cloud.maximumSize.x = 25;
+ * + *
+ * cloud.maximumSize.y = 5;
+ * + *
+ * cloud.maximumSize.z = 17;
+ * + *
+ *
+ * + *

To modify the billboard's actual size, modify the cloud's scale property.

+ */ + maximumSize: Cartesian3; + /** + * Sets the color of the cloud + */ + color: Color; + /** + *

Gets or sets the "slice" of the cloud that is rendered on the billboard, i.e. + * the specific cross-section of the cloud chosen for the billboard's appearance. + * Given a value between 0 and 1, the slice specifies how deeply into the cloud + * to intersect based on its maximum size in the z-direction.

+ *
+ * + * + * + * + *
cloud.slice = 0.32;
cloud.slice = 0.5;
cloud.slice = 0.6;
+ *
+ * + *
+ *

Due to the nature in which this slice is calculated, + * values below 0.2 may result in cross-sections that are too small, + * and the edge of the ellipsoid will be visible. Similarly, values above 0.7 + * will cause the cloud to appear smaller. Values outside the range [0.1, 0.9] + * should be avoided entirely because they do not produce desirable results.

+ * + *
+ * + * + * + *
cloud.slice = 0.08;
cloud.slice = 0.8;
+ *
+ * + *

If slice is set to a negative number, the cloud will not render a cross-section. + * Instead, it will render the outside of the ellipsoid that is visible. For clouds with + * small values of `maximumSize.z`, this can produce good-looking results, but for larger + * clouds, this can result in a cloud that is undesirably warped to the ellipsoid volume.

+ * + *
+ * + * + * + *
+ * cloud.slice = -1.0;
cloud.maximumSize.z = 18;

+ * + *
+ * cloud.slice = -1.0;
cloud.maximumSize.z = 30;

+ *
+ *
+ */ + slice: number; + /** + * Gets or sets the brightness of the cloud. This can be used to give clouds + * a darker, grayer appearance. + *

+ *
+ * + * + * + * + *
cloud.brightness = 1.0;
cloud.brightness = 0.6;
cloud.brightness = 0.0;
+ *
+ */ + brightness: number; + } + + /** + * Visualizes a vertex attribute by displaying it as a color for debugging. + *

+ * Components for well-known unit-length vectors, i.e., normal, + * tangent, and bitangent, are scaled and biased + * from [-1.0, 1.0] to (-1.0, 1.0). + *

+ * @example + * const primitive = new Cesium.Primitive({ + * geometryInstances : // ... + * appearance : new Cesium.DebugAppearance({ + * attributeName : 'normal' + * }) + * }); + * @param options - Object with the following properties: + * @param options.attributeName - The name of the attribute to visualize. + * @param [options.perInstanceAttribute = false] - Boolean that determines whether this attribute is a per-instance geometry attribute. + * @param [options.glslDatatype = 'vec3'] - The GLSL datatype of the attribute. Supported datatypes are float, vec2, vec3, and vec4. + * @param [options.vertexShaderSource] - Optional GLSL vertex shader source to override the default vertex shader. + * @param [options.fragmentShaderSource] - Optional GLSL fragment shader source to override the default fragment shader. + * @param [options.renderState] - Optional render state to override the default render state. + */ + export class DebugAppearance { + constructor(options: { + attributeName: string; + perInstanceAttribute?: boolean; + glslDatatype?: string; + vertexShaderSource?: string; + fragmentShaderSource?: string; + renderState?: any; + }); + /** + * This property is part of the {@link Appearance} interface, but is not + * used by {@link DebugAppearance} since a fully custom fragment shader is used. + */ + material: Material; + /** + * When true, the geometry is expected to appear translucent. + */ + translucent: boolean; + /** + * The GLSL source code for the vertex shader. + */ + readonly vertexShaderSource: string; + /** + * The GLSL source code for the fragment shader. The full fragment shader + * source is built procedurally taking into account the {@link DebugAppearance#material}. + * Use {@link DebugAppearance#getFragmentShaderSource} to get the full source. + */ + readonly fragmentShaderSource: string; + /** + * The WebGL fixed-function state to use when rendering the geometry. + */ + readonly renderState: any; + /** + * When true, the geometry is expected to be closed. + */ + readonly closed: boolean; + /** + * The name of the attribute being visualized. + */ + readonly attributeName: string; + /** + * The GLSL datatype of the attribute being visualized. + */ + readonly glslDatatype: string; + /** + * Returns the full GLSL fragment shader source, which for {@link DebugAppearance} is just + * {@link DebugAppearance#fragmentShaderSource}. + * @returns The full GLSL fragment shader source. + */ + getFragmentShaderSource(): string; + /** + * Determines if the geometry is translucent based on {@link DebugAppearance#translucent}. + * @returns true if the appearance is translucent. + */ + isTranslucent(): boolean; + /** + * Creates a render state. This is not the final render state instance; instead, + * it can contain a subset of render state properties identical to the render state + * created in the context. + * @returns The render state. + */ + getRenderState(): any; + } + + /** + * Draws the outline of the camera's view frustum. + * @example + * primitives.add(new Cesium.DebugCameraPrimitive({ + * camera : camera, + * color : Cesium.Color.YELLOW + * })); + * @param options - Object with the following properties: + * @param options.camera - The camera. + * @param [options.frustumSplits] - Distances to the near and far planes of the camera frustums. This overrides the camera's frustum near and far values. + * @param [options.color = Color.CYAN] - The color of the debug outline. + * @param [options.updateOnChange = true] - Whether the primitive updates when the underlying camera changes. + * @param [options.show = true] - Determines if this primitive will be shown. + * @param [options.id] - A user-defined object to return when the instance is picked with {@link Scene#pick}. + */ + export class DebugCameraPrimitive { + constructor(options: { + camera: Camera; + frustumSplits?: number[]; + color?: Color; + updateOnChange?: boolean; + show?: boolean; + id?: any; + }); + /** + * Determines if this primitive will be shown. + */ + show: boolean; + /** + * User-defined value returned when the primitive is picked. + */ + id: any; + /** + * Returns true if this object was destroyed; otherwise, false. + *

+ * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + *

+ * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

+ * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + *

+ * @example + * p = p && p.destroy(); + */ + destroy(): void; + } + + /** + * Draws the axes of a reference frame defined by a matrix that transforms to world + * coordinates, i.e., Earth's WGS84 coordinates. The most prominent example is + * a primitives modelMatrix. + *

+ * The X axis is red; Y is green; and Z is blue. + *

+ *

+ * This is for debugging only; it is not optimized for production use. + *

+ * @example + * primitives.add(new Cesium.DebugModelMatrixPrimitive({ + * modelMatrix : primitive.modelMatrix, // primitive to debug + * length : 100000.0, + * width : 10.0 + * })); + * @param [options] - Object with the following properties: + * @param [options.length = 10000000.0] - The length of the axes in meters. + * @param [options.width = 2.0] - The width of the axes in pixels. + * @param [options.modelMatrix = Matrix4.IDENTITY] - The 4x4 matrix that defines the reference frame, i.e., origin plus axes, to visualize. + * @param [options.show = true] - Determines if this primitive will be shown. + * @param [options.id] - A user-defined object to return when the instance is picked with {@link Scene#pick} + */ + export class DebugModelMatrixPrimitive { + constructor(options?: { + length?: number; + width?: number; + modelMatrix?: Matrix4; + show?: boolean; + id?: any; + }); + /** + * The length of the axes in meters. + */ + length: number; + /** + * The width of the axes in pixels. + */ + width: number; + /** + * Determines if this primitive will be shown. + */ + show: boolean; + /** + * The 4x4 matrix that defines the reference frame, i.e., origin plus axes, to visualize. + */ + modelMatrix: Matrix4; + /** + * User-defined value returned when the primitive is picked. + */ + id: any; + /** + * Returns true if this object was destroyed; otherwise, false. + *

+ * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + *

+ * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

+ * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + *

+ * @example + * p = p && p.destroy(); + */ + destroy(): void; + } + + /** + * Determines the function used to compare two depths for the depth test. + */ + export enum DepthFunction { + /** + * The depth test never passes. + */ + NEVER = WebGLConstants.NEVER, + /** + * The depth test passes if the incoming depth is less than the stored depth. + */ + LESS = WebGLConstants.LESS, + /** + * The depth test passes if the incoming depth is equal to the stored depth. + */ + EQUAL = WebGLConstants.EQUAL, + /** + * The depth test passes if the incoming depth is less than or equal to the stored depth. + */ + LESS_OR_EQUAL = WebGLConstants.LEQUAL, + /** + * The depth test passes if the incoming depth is greater than the stored depth. + */ + GREATER = WebGLConstants.GREATER, + /** + * The depth test passes if the incoming depth is not equal to the stored depth. + */ + NOT_EQUAL = WebGLConstants.NOTEQUAL, + /** + * The depth test passes if the incoming depth is greater than or equal to the stored depth. + */ + GREATER_OR_EQUAL = WebGLConstants.GEQUAL, + /** + * The depth test always passes. + */ + ALWAYS = WebGLConstants.ALWAYS, + } + + /** + * Returns the type that the given class property has in a GLSL shader. + * + * It returns the same string as `PropertyTextureProperty.prototype.getGlslType` + * for a property texture property with the given class property + * @param classProperty - The class property + * @returns The GLSL shader type string for the property + */ + export function getGlslType(classProperty: MetadataClassProperty): string; + + /** + * Returns a shader statement that applies the inverse of the + * value transform to the given value, based on the given offset + * and scale. + * @param input - The input value + * @param offset - The offset + * @param scale - The scale + * @returns The statement + */ + export function unapplyValueTransform( + input: string, + offset: string, + scale: string, + ): string; + + /** + * Returns a shader statement that applies the inverse of the + * normalization, based on the given component type + * @param input - The input value + * @param componentType - The component type + * @returns The statement + */ + export function unnormalize(input: string, componentType: string): string; + + /** + * Creates a shader statement that returns the value of the specified + * property, normalized to the range [0, 1]. + * @param classProperty - The class property + * @param metadataProperty - The metadata property, either + * a `PropertyTextureProperty` or a `PropertyAttributeProperty` + * @returns The string + */ + export function getSourceValueStringScalar( + classProperty: MetadataClassProperty, + metadataProperty: any, + ): string; + + /** + * Creates a shader statement that returns the value of the specified + * component of the given property, normalized to the range [0, 1]. + * @param classProperty - The class property + * @param metadataProperty - The metadata property, either + * a `PropertyTextureProperty` or a `PropertyAttributeProperty` + * @param componentName - The name, in ["x", "y", "z", "w"] + * @returns The string + */ + export function getSourceValueStringComponent( + classProperty: MetadataClassProperty, + metadataProperty: any, + componentName: string, + ): string; + + /** + * A light that gets emitted in a single direction from infinitely far away. + * @param options - Object with the following properties: + * @param options.direction - The direction in which light gets emitted. + * @param [options.color = Color.WHITE] - The color of the light. + * @param [options.intensity = 1.0] - The intensity of the light. + */ + export class DirectionalLight { + constructor(options: { + direction: Cartesian3; + color?: Color; + intensity?: number; + }); + /** + * The direction in which light gets emitted. + */ + direction: Cartesian3; + /** + * The color of the light. + */ + color: Color; + /** + * The intensity of the light. + */ + intensity: number; + } + + /** + * A policy for discarding tile images that contain no data (and so aren't actually images). + * This policy discards {@link DiscardEmptyTileImagePolicy.EMPTY_IMAGE}, which is + * expected to be used in place of any empty tile images by the image loading code. + */ + export class DiscardEmptyTileImagePolicy { + constructor(); + /** + * Determines if the discard policy is ready to process images. + * @returns True if the discard policy is ready to process images; otherwise, false. + */ + isReady(): boolean; + /** + * Given a tile image, decide whether to discard that image. + * @param image - An image to test. + * @returns True if the image should be discarded; otherwise, false. + */ + shouldDiscardImage(image: HTMLImageElement): boolean; + /** + * Default value for representing an empty image. + */ + static readonly EMPTY_IMAGE: HTMLImageElement; + } + + /** + * A policy for discarding tile images that match a known image containing a + * "missing" image. + * @param options - Object with the following properties: + * @param options.missingImageUrl - The URL of the known missing image. + * @param options.pixelsToCheck - An array of {@link Cartesian2} pixel positions to + * compare against the missing image. + * @param [options.disableCheckIfAllPixelsAreTransparent = false] - If true, the discard check will be disabled + * if all of the pixelsToCheck in the missingImageUrl have an alpha value of 0. If false, the + * discard check will proceed no matter the values of the pixelsToCheck. + */ + export class DiscardMissingTileImagePolicy { + constructor(options: { + missingImageUrl: Resource | string; + pixelsToCheck: Cartesian2[]; + disableCheckIfAllPixelsAreTransparent?: boolean; + }); + /** + * Determines if the discard policy is ready to process images. + * @returns True if the discard policy is ready to process images; otherwise, false. + */ + isReady(): boolean; + /** + * Given a tile image, decide whether to discard that image. + * @param image - An image to test. + * @returns True if the image should be discarded; otherwise, false. + */ + shouldDiscardImage(image: HTMLImageElement): boolean; + } + + /** + * Atmosphere lighting effects (sky atmosphere, ground atmosphere, fog) can be + * further modified with dynamic lighting from the sun or other light source + * that changes over time. This enum determines which light source to use. + */ + export enum DynamicAtmosphereLightingType { + /** + * Do not use dynamic atmosphere lighting. Atmosphere lighting effects will + * be lit from directly above rather than using the scene's light source. + */ + NONE = 0, + /** + * Use the scene's current light source for dynamic atmosphere lighting. + */ + SCENE_LIGHT = 1, + /** + * Force the dynamic atmosphere lighting to always use the sunlight direction, + * even if the scene uses a different light source. + */ + SUNLIGHT = 2, + } + + export namespace DynamicEnvironmentMapManager { + /** + * Options for the DynamicEnvironmentMapManager constructor + * @property [enabled = true] - If true, the environment map and related properties will continue to update. + * @property [mipmapLevels = 7] - The number of mipmap levels to generate for specular maps. More mipmap levels will produce a higher resolution specular reflection. + * @property [maximumSecondsDifference = 3600] - The maximum amount of elapsed seconds before a new environment map is created. + * @property [maximumPositionEpsilon = 1000] - The maximum difference in position before a new environment map is created, in meters. Small differences in position will not visibly affect results. + * @property [atmosphereScatteringIntensity = 2.0] - The intensity of the scattered light emitted from the atmosphere. This should be adjusted relative to the value of {@link Scene.light} intensity. + * @property [gamma = 1.0] - The gamma correction to apply to the range of light emitted from the environment. 1.0 uses the unmodified emitted light color. + * @property [brightness = 1.0] - The brightness of light emitted from the environment. 1.0 uses the unmodified emitted environment color. Less than 1.0 makes the light darker while greater than 1.0 makes it brighter. + * @property [saturation = 1.0] - The saturation of the light emitted from the environment. 1.0 uses the unmodified emitted environment color. Less than 1.0 reduces the saturation while greater than 1.0 increases it. + * @property [groundColor = DynamicEnvironmentMapManager.AVERAGE_EARTH_GROUND_COLOR] - Solid color used to represent the ground. + * @property [groundAlbedo = 0.31] - The percentage of light reflected from the ground. The average earth albedo is 0.31. + */ + type ConstructorOptions = { + enabled?: boolean; + mipmapLevels?: number; + maximumSecondsDifference?: number; + maximumPositionEpsilon?: number; + atmosphereScatteringIntensity?: number; + gamma?: number; + brightness?: number; + saturation?: number; + groundColor?: Color; + groundAlbedo?: number; + }; + } + + /** + * Generates an environment map at the given position based on scene's current lighting conditions. From this, it produces multiple levels of specular maps and spherical harmonic coefficients than can be used with {@link ImageBasedLighting} for models or tilesets. + * @example + * // Enable time-of-day environment mapping in a scene + * scene.atmosphere.dynamicLighting = Cesium.DynamicAtmosphereLightingType.SUNLIGHT; + * + * // Decrease the directional lighting contribution + * scene.light.intensity = 0.5 + * + * // Increase the intensity of of the environment map lighting contribution + * const environmentMapManager = tileset.environmentMapManager; + * environmentMapManager.atmosphereScatteringIntensity = 3.0; + * @example + * // Change the ground color used for a model's environment map to a forest green + * const environmentMapManager = model.environmentMapManager; + * environmentMapManager.groundColor = Cesium.Color.fromCssColorString("#203b34"); + * @param [options] - An object describing initialization options. + */ + export class DynamicEnvironmentMapManager { + constructor(options?: DynamicEnvironmentMapManager.ConstructorOptions); + /** + * If true, the environment map and related properties will continue to update. + */ + enabled: boolean; + /** + * The maximum amount of elapsed seconds before a new environment map is created. + */ + maximumSecondsDifference: number; + /** + * The maximum difference in position before a new environment map is created, in meters. Small differences in position will not visibly affect results. + */ + maximumPositionEpsilon: number; + /** + * The intensity of the scattered light emitted from the atmosphere. This should be adjusted relative to the value of {@link Scene.light} intensity. + */ + atmosphereScatteringIntensity: number; + /** + * The gamma correction to apply to the range of light emitted from the environment. 1.0 uses the unmodified incoming light color. + */ + gamma: number; + /** + * The brightness of light emitted from the environment. 1.0 uses the unmodified emitted environment color. Less than 1.0 + * makes the light darker while greater than 1.0 makes it brighter. + */ + brightness: number; + /** + * The saturation of the light emitted from the environment. 1.0 uses the unmodified emitted environment color. Less than 1.0 reduces the + * saturation while greater than 1.0 increases it. + */ + saturation: number; + /** + * Solid color used to represent the ground. + */ + groundColor: Color; + /** + * The percentage of light reflected from the ground. The average earth albedo is 0.31. + */ + groundAlbedo: number; + /** + * The position around which the environment map is generated. + */ + position: Cartesian3 | undefined; + /** + * Returns true if this object was destroyed; otherwise, false. + *

+ * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

+ * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * mapManager = mapManager && mapManager.destroy(); + */ + destroy(): void; + /** + * Returns true if dynamic updates are supported in the current WebGL rendering context. + * Dynamic updates requires the EXT_color_buffer_float or EXT_color_buffer_half_float extension. + * @param scene - The object containing the rendering context + * @returns true if supported + */ + static isDynamicUpdateSupported(scene: Scene): boolean; + /** + * Average hue of ground color on earth, a warm green-gray. + */ + static readonly AVERAGE_EARTH_GROUND_COLOR: Color; + /** + * The default third order spherical harmonic coefficients used for the diffuse color of image-based lighting, a white ambient light with low intensity. + *

+ * There are nine Cartesian3 coefficients. + * The order of the coefficients is: L0,0, L1,-1, L1,0, L1,1, L2,-2, L2,-1, L2,0, L2,1, L2,2 + *

+ */ + static readonly DEFAULT_SPHERICAL_HARMONIC_COEFFICIENTS: Cartesian3[]; + } + + /** + * An appearance for geometry on the surface of the ellipsoid like {@link PolygonGeometry} + * and {@link RectangleGeometry}, which supports all materials like {@link MaterialAppearance} + * with {@link MaterialAppearance.MaterialSupport.ALL}. However, this appearance requires + * fewer vertex attributes since the fragment shader can procedurally compute normal, + * tangent, and bitangent. + * @example + * const primitive = new Cesium.Primitive({ + * geometryInstances : new Cesium.GeometryInstance({ + * geometry : new Cesium.PolygonGeometry({ + * vertexFormat : Cesium.EllipsoidSurfaceAppearance.VERTEX_FORMAT, + * // ... + * }) + * }), + * appearance : new Cesium.EllipsoidSurfaceAppearance({ + * material : Cesium.Material.fromType('Stripe') + * }) + * }); + * @param [options] - Object with the following properties: + * @param [options.flat = false] - When true, flat shading is used in the fragment shader, which means lighting is not taking into account. + * @param [options.faceForward = options.aboveGround] - When true, the fragment shader flips the surface normal as needed to ensure that the normal faces the viewer to avoid dark spots. This is useful when both sides of a geometry should be shaded like {@link WallGeometry}. + * @param [options.translucent = true] - When true, the geometry is expected to appear translucent so {@link EllipsoidSurfaceAppearance#renderState} has alpha blending enabled. + * @param [options.aboveGround = false] - When true, the geometry is expected to be on the ellipsoid's surface - not at a constant height above it - so {@link EllipsoidSurfaceAppearance#renderState} has backface culling enabled. + * @param [options.material = Material.ColorType] - The material used to determine the fragment color. + * @param [options.vertexShaderSource] - Optional GLSL vertex shader source to override the default vertex shader. + * @param [options.fragmentShaderSource] - Optional GLSL fragment shader source to override the default fragment shader. + * @param [options.renderState] - Optional render state to override the default render state. + */ + export class EllipsoidSurfaceAppearance { + constructor(options?: { + flat?: boolean; + faceForward?: boolean; + translucent?: boolean; + aboveGround?: boolean; + material?: Material; + vertexShaderSource?: string; + fragmentShaderSource?: string; + renderState?: any; + }); + /** + * The material used to determine the fragment color. Unlike other {@link EllipsoidSurfaceAppearance} + * properties, this is not read-only, so an appearance's material can change on the fly. + */ + material: Material; + /** + * When true, the geometry is expected to appear translucent. + */ + translucent: boolean; + /** + * The GLSL source code for the vertex shader. + */ + readonly vertexShaderSource: string; + /** + * The GLSL source code for the fragment shader. The full fragment shader + * source is built procedurally taking into account {@link EllipsoidSurfaceAppearance#material}, + * {@link EllipsoidSurfaceAppearance#flat}, and {@link EllipsoidSurfaceAppearance#faceForward}. + * Use {@link EllipsoidSurfaceAppearance#getFragmentShaderSource} to get the full source. + */ + readonly fragmentShaderSource: string; + /** + * The WebGL fixed-function state to use when rendering the geometry. + *

+ * The render state can be explicitly defined when constructing a {@link EllipsoidSurfaceAppearance} + * instance, or it is set implicitly via {@link EllipsoidSurfaceAppearance#translucent} + * and {@link EllipsoidSurfaceAppearance#aboveGround}. + *

+ */ + readonly renderState: any; + /** + * When true, the geometry is expected to be closed so + * {@link EllipsoidSurfaceAppearance#renderState} has backface culling enabled. + * If the viewer enters the geometry, it will not be visible. + */ + readonly closed: boolean; + /** + * The {@link VertexFormat} that this appearance instance is compatible with. + * A geometry can have more vertex attributes and still be compatible - at a + * potential performance cost - but it can't have less. + */ + readonly vertexFormat: VertexFormat; + /** + * When true, flat shading is used in the fragment shader, + * which means lighting is not taking into account. + */ + readonly flat: boolean; + /** + * When true, the fragment shader flips the surface normal + * as needed to ensure that the normal faces the viewer to avoid + * dark spots. This is useful when both sides of a geometry should be + * shaded like {@link WallGeometry}. + */ + readonly faceForward: boolean; + /** + * When true, the geometry is expected to be on the ellipsoid's + * surface - not at a constant height above it - so {@link EllipsoidSurfaceAppearance#renderState} + * has backface culling enabled. + */ + readonly aboveGround: boolean; + /** + * The {@link VertexFormat} that all {@link EllipsoidSurfaceAppearance} instances + * are compatible with, which requires only position and st + * attributes. Other attributes are procedurally computed in the fragment shader. + */ + static readonly VERTEX_FORMAT: VertexFormat; + /** + * Procedurally creates the full GLSL fragment shader source. For {@link EllipsoidSurfaceAppearance}, + * this is derived from {@link EllipsoidSurfaceAppearance#fragmentShaderSource}, {@link EllipsoidSurfaceAppearance#flat}, + * and {@link EllipsoidSurfaceAppearance#faceForward}. + * @returns The full GLSL fragment shader source. + */ + getFragmentShaderSource(): string; + /** + * Determines if the geometry is translucent based on {@link EllipsoidSurfaceAppearance#translucent} and {@link Material#isTranslucent}. + * @returns true if the appearance is translucent. + */ + isTranslucent(): boolean; + /** + * Creates a render state. This is not the final render state instance; instead, + * it can contain a subset of render state properties identical to the render state + * created in the context. + * @returns The render state. + */ + getRenderState(): any; + } + + /** + * An expression for a style applied to a {@link Cesium3DTileset}. + *

+ * Evaluates an expression defined using the + * {@link https://github.com/CesiumGS/3d-tiles/tree/main/specification/Styling|3D Tiles Styling language}. + *

+ *

+ * Implements the {@link StyleExpression} interface. + *

+ * @example + * const expression = new Cesium.Expression('(regExp("^Chest").test(${County})) && (${YearBuilt} >= 1970)'); + * expression.evaluate(feature); // returns true or false depending on the feature's properties + * @example + * const expression = new Cesium.Expression('(${Temperature} > 90) ? color("red") : color("white")'); + * expression.evaluateColor(feature, result); // returns a Cesium.Color object + * @param [expression] - The expression defined using the 3D Tiles Styling language. + * @param [defines] - Defines in the style. + */ + export class Expression { + constructor(expression?: string, defines?: any); + /** + * Gets the expression defined in the 3D Tiles Styling language. + */ + readonly expression: string; + /** + * Evaluates the result of an expression, optionally using the provided feature's properties. If the result of + * the expression in the + * {@link https://github.com/CesiumGS/3d-tiles/tree/main/specification/Styling|3D Tiles Styling language} + * is of type Boolean, Number, or String, the corresponding JavaScript + * primitive type will be returned. If the result is a RegExp, a Javascript RegExp + * object will be returned. If the result is a Cartesian2, Cartesian3, or Cartesian4, + * a {@link Cartesian2}, {@link Cartesian3}, or {@link Cartesian4} object will be returned. If the result argument is + * a {@link Color}, the {@link Cartesian4} value is converted to a {@link Color} and then returned. + * @param feature - The feature whose properties may be used as variables in the expression. + * @param [result] - The object onto which to store the result. + * @returns The result of evaluating the expression. + */ + evaluate( + feature: Cesium3DTileFeature, + result?: any, + ): + | boolean + | number + | string + | RegExp + | Cartesian2 + | Cartesian3 + | Cartesian4 + | Color; + /** + * Evaluates the result of a Color expression, optionally using the provided feature's properties. + *

+ * This is equivalent to {@link Expression#evaluate} but always returns a {@link Color} object. + *

+ * @param feature - The feature whose properties may be used as variables in the expression. + * @param [result] - The object in which to store the result + * @returns The modified result parameter or a new Color instance if one was not provided. + */ + evaluateColor(feature: Cesium3DTileFeature, result?: Color): Color; + } + + /** + * Blends the atmosphere to geometry far from the camera for horizon views. Allows for additional + * performance improvements by rendering less geometry and dispatching less terrain requests. + */ + export class Fog { + constructor(); + /** + * true if fog is enabled, false otherwise. + * @example + * // Disable fog in the scene + * viewer.scene.fog.enabled = false; + */ + enabled: boolean; + /** + * true if fog is renderable in shaders, false otherwise. + * This allows to benefits from optimized tile loading strategy based on fog density without the actual visual rendering. + * @example + * // Use fog culling but don't render it + * viewer.scene.fog.enabled = true; + * viewer.scene.fog.renderable = false; + */ + renderable: boolean; + /** + * A scalar that determines the density of the fog. Terrain that is in full fog are culled. + * The density of the fog increases as this number approaches 1.0 and becomes less dense as it approaches zero. + * The more dense the fog is, the more aggressively the terrain is culled. For example, if the camera is a height of + * 1000.0m above the ellipsoid, increasing the value to 3.0e-3 will cause many tiles close to the viewer be culled. + * Decreasing the value will push the fog further from the viewer, but decrease performance as more of the terrain is rendered. + * @example + * // Double the default fog density + * viewer.scene.fog.density = 0.0012; + */ + density: number; + /** + * A scalar used in the function to adjust density based on the height of the camera above the terrain. + */ + heightScalar: number; + /** + * The maximum height fog is applied. If the camera is above this height fog will be disabled. + */ + maxHeight: number; + /** + * A scalar that impacts the visual density of fog. This value does not impact the culling of terrain. + * Use in combination with the {@link Fog.density} to make fog appear more or less dense. + * @example + * // Increase fog appearance effect + * viewer.scene.fog.visualDensityScalar = 0.6; + */ + visualDensityScalar: number; + /** + * A factor used to increase the screen space error of terrain tiles when they are partially in fog. The effect is to reduce + * the number of terrain tiles requested for rendering. If set to zero, the feature will be disabled. If the value is increased + * for mountainous regions, less tiles will need to be requested, but the terrain meshes near the horizon may be a noticeably + * lower resolution. If the value is increased in a relatively flat area, there will be little noticeable change on the horizon. + */ + screenSpaceErrorFactor: number; + /** + * The minimum brightness of the fog color from lighting. A value of 0.0 can cause the fog to be completely black. A value of 1.0 will not affect + * the brightness at all. + */ + minimumBrightness: number; + /** + * Exponent factor used in the function to adjust how density changes based on the height of the camera above the ellipsoid. Smaller values produce a more gradual transition as camera height increases. + * Value must be greater than 0. + */ + heightFalloff: number; + } + + /** + * Monitors the frame rate (frames per second) in a {@link Scene} and raises an event if the frame rate is + * lower than a threshold. Later, if the frame rate returns to the required level, a separate event is raised. + * To avoid creating multiple FrameRateMonitors for a single {@link Scene}, use {@link FrameRateMonitor.fromScene} + * instead of constructing an instance explicitly. + * @param [options] - Object with the following properties: + * @param options.scene - The Scene instance for which to monitor performance. + * @param [options.samplingWindow = 5.0] - The length of the sliding window over which to compute the average frame rate, in seconds. + * @param [options.quietPeriod = 2.0] - The length of time to wait at startup and each time the page becomes visible (i.e. when the user + * switches back to the tab) before starting to measure performance, in seconds. + * @param [options.warmupPeriod = 5.0] - The length of the warmup period, in seconds. During the warmup period, a separate + * (usually lower) frame rate is required. + * @param [options.minimumFrameRateDuringWarmup = 4] - The minimum frames-per-second that are required for acceptable performance during + * the warmup period. If the frame rate averages less than this during any samplingWindow during the warmupPeriod, the + * lowFrameRate event will be raised and the page will redirect to the redirectOnLowFrameRateUrl, if any. + * @param [options.minimumFrameRateAfterWarmup = 8] - The minimum frames-per-second that are required for acceptable performance after + * the end of the warmup period. If the frame rate averages less than this during any samplingWindow after the warmupPeriod, the + * lowFrameRate event will be raised and the page will redirect to the redirectOnLowFrameRateUrl, if any. + */ + export class FrameRateMonitor { + constructor(options?: { + scene: Scene; + samplingWindow?: number; + quietPeriod?: number; + warmupPeriod?: number; + minimumFrameRateDuringWarmup?: number; + minimumFrameRateAfterWarmup?: number; + }); + /** + * Gets or sets the length of the sliding window over which to compute the average frame rate, in seconds. + */ + samplingWindow: number; + /** + * Gets or sets the length of time to wait at startup and each time the page becomes visible (i.e. when the user + * switches back to the tab) before starting to measure performance, in seconds. + */ + quietPeriod: number; + /** + * Gets or sets the length of the warmup period, in seconds. During the warmup period, a separate + * (usually lower) frame rate is required. + */ + warmupPeriod: number; + /** + * Gets or sets the minimum frames-per-second that are required for acceptable performance during + * the warmup period. If the frame rate averages less than this during any samplingWindow during the warmupPeriod, the + * lowFrameRate event will be raised and the page will redirect to the redirectOnLowFrameRateUrl, if any. + */ + minimumFrameRateDuringWarmup: number; + /** + * Gets or sets the minimum frames-per-second that are required for acceptable performance after + * the end of the warmup period. If the frame rate averages less than this during any samplingWindow after the warmupPeriod, the + * lowFrameRate event will be raised and the page will redirect to the redirectOnLowFrameRateUrl, if any. + */ + minimumFrameRateAfterWarmup: number; + /** + * The default frame rate monitoring settings. These settings are used when {@link FrameRateMonitor.fromScene} + * needs to create a new frame rate monitor, and for any settings that are not passed to the + * {@link FrameRateMonitor} constructor. + */ + static defaultSettings: any; + /** + * Gets the {@link FrameRateMonitor} for a given scene. If the scene does not yet have + * a {@link FrameRateMonitor}, one is created with the {@link FrameRateMonitor.defaultSettings}. + * @param scene - The scene for which to get the {@link FrameRateMonitor}. + * @returns The scene's {@link FrameRateMonitor}. + */ + static fromScene(scene: Scene): FrameRateMonitor; + /** + * Gets the {@link Scene} instance for which to monitor performance. + */ + scene: Scene; + /** + * Gets the event that is raised when a low frame rate is detected. The function will be passed + * the {@link Scene} instance as its first parameter and the average number of frames per second + * over the sampling window as its second parameter. + */ + lowFrameRate: Event; + /** + * Gets the event that is raised when the frame rate returns to a normal level after having been low. + * The function will be passed the {@link Scene} instance as its first parameter and the average + * number of frames per second over the sampling window as its second parameter. + */ + nominalFrameRate: Event; + /** + * Gets the most recently computed average frames-per-second over the last samplingWindow. + * This property may be undefined if the frame rate has not been computed. + */ + lastFramesPerSecond: number; + /** + * Pauses monitoring of the frame rate. To resume monitoring, {@link FrameRateMonitor#unpause} + * must be called once for each time this function is called. + */ + pause(): void; + /** + * Resumes monitoring of the frame rate. If {@link FrameRateMonitor#pause} was called + * multiple times, this function must be called the same number of times in order to + * actually resume monitoring. + */ + unpause(): void; + /** + * Returns true if this object was destroyed; otherwise, false. + *

+ * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Unsubscribes this instance from all events it is listening to. + * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + */ + destroy(): void; + } + + /** + * Describes the format in which to request GetFeatureInfo from a Web Map Service (WMS) server. + * @param type - The type of response to expect from a GetFeatureInfo request. Valid + * values are 'json', 'xml', 'html', or 'text'. + * @param [format] - The info format to request from the WMS server. This is usually a + * MIME type such as 'application/json' or text/xml'. If this parameter is not specified, the provider will request 'json' + * using 'application/json', 'xml' using 'text/xml', 'html' using 'text/html', and 'text' using 'text/plain'. + * @param [callback] - A function to invoke with the GetFeatureInfo response from the WMS server + * in order to produce an array of picked {@link ImageryLayerFeatureInfo} instances. If this parameter is not specified, + * a default function for the type of response is used. + */ + export class GetFeatureInfoFormat { + constructor( + type: string, + format?: string, + callback?: (...params: any[]) => any, + ); + } + + /** + * The globe rendered in the scene, including its terrain ({@link Globe#terrainProvider}) + * and imagery layers ({@link Globe#imageryLayers}). Access the globe using {@link Scene#globe}. + * @param [ellipsoid = Ellipsoid.default] - Determines the size and shape of the + * globe. + */ + export class Globe { + constructor(ellipsoid?: Ellipsoid); + /** + * Determines if the globe will be shown. + */ + show: boolean; + /** + * The maximum screen-space error used to drive level-of-detail refinement. Higher + * values will provide better performance but lower visual quality. + */ + maximumScreenSpaceError: number; + /** + * The size of the terrain tile cache, expressed as a number of tiles. Any additional + * tiles beyond this number will be freed, as long as they aren't needed for rendering + * this frame. A larger number will consume more memory but will show detail faster + * when, for example, zooming out and then back in. + */ + tileCacheSize: number; + /** + * Gets or sets the number of loading descendant tiles that is considered "too many". + * If a tile has too many loading descendants, that tile will be loaded and rendered before any of + * its descendants are loaded and rendered. This means more feedback for the user that something + * is happening at the cost of a longer overall load time. Setting this to 0 will cause each + * tile level to be loaded successively, significantly increasing load time. Setting it to a large + * number (e.g. 1000) will minimize the number of tiles that are loaded but tend to make + * detail appear all at once after a long wait. + */ + loadingDescendantLimit: number; + /** + * Gets or sets a value indicating whether the ancestors of rendered tiles should be preloaded. + * Setting this to true optimizes the zoom-out experience and provides more detail in + * newly-exposed areas when panning. The down side is that it requires loading more tiles. + */ + preloadAncestors: boolean; + /** + * Gets or sets a value indicating whether the siblings of rendered tiles should be preloaded. + * Setting this to true causes tiles with the same parent as a rendered tile to be loaded, even + * if they are culled. Setting this to true may provide a better panning experience at the + * cost of loading more tiles. + */ + preloadSiblings: boolean; + /** + * The color to use to highlight terrain fill tiles. If undefined, fill tiles are not + * highlighted at all. The alpha value is used to alpha blend with the tile's + * actual color. Because terrain fill tiles do not represent the actual terrain surface, + * it may be useful in some applications to indicate visually that they are not to be trusted. + */ + fillHighlightColor: Color; + /** + * Enable lighting the globe with the scene's light source. + */ + enableLighting: boolean; + /** + * A multiplier to adjust terrain lambert lighting. + * This number is multiplied by the result of czm_getLambertDiffuse in GlobeFS.glsl. + * This only takes effect when enableLighting is true. + */ + lambertDiffuseMultiplier: number; + /** + * Enable dynamic lighting effects on atmosphere and fog. This only takes effect + * when enableLighting is true. + */ + dynamicAtmosphereLighting: boolean; + /** + * Whether dynamic atmosphere lighting uses the sun direction instead of the scene's + * light direction. This only takes effect when enableLighting and + * dynamicAtmosphereLighting are true. + */ + dynamicAtmosphereLightingFromSun: boolean; + /** + * Enable the ground atmosphere, which is drawn over the globe when viewed from a distance between lightingFadeInDistance and lightingFadeOutDistance. + */ + showGroundAtmosphere: boolean; + /** + * The intensity of the light that is used for computing the ground atmosphere color. + */ + atmosphereLightIntensity: number; + /** + * The Rayleigh scattering coefficient used in the atmospheric scattering equations for the ground atmosphere. + */ + atmosphereRayleighCoefficient: Cartesian3; + /** + * The Mie scattering coefficient used in the atmospheric scattering equations for the ground atmosphere. + */ + atmosphereMieCoefficient: Cartesian3; + /** + * The Rayleigh scale height used in the atmospheric scattering equations for the ground atmosphere, in meters. + */ + atmosphereRayleighScaleHeight: number; + /** + * The Mie scale height used in the atmospheric scattering equations for the ground atmosphere, in meters. + */ + atmosphereMieScaleHeight: number; + /** + * The anisotropy of the medium to consider for Mie scattering. + *

+ * Valid values are between -1.0 and 1.0. + *

+ */ + atmosphereMieAnisotropy: number; + /** + * The distance where everything becomes lit. This only takes effect + * when enableLighting or showGroundAtmosphere is true. + */ + lightingFadeOutDistance: number; + /** + * The distance where lighting resumes. This only takes effect + * when enableLighting or showGroundAtmosphere is true. + */ + lightingFadeInDistance: number; + /** + * The distance where the darkness of night from the ground atmosphere fades out to a lit ground atmosphere. + * This only takes effect when showGroundAtmosphere, enableLighting, and + * dynamicAtmosphereLighting are true. + */ + nightFadeOutDistance: number; + /** + * The distance where the darkness of night from the ground atmosphere fades in to an unlit ground atmosphere. + * This only takes effect when showGroundAtmosphere, enableLighting, and + * dynamicAtmosphereLighting are true. + */ + nightFadeInDistance: number; + /** + * True if an animated wave effect should be shown in areas of the globe + * covered by water; otherwise, false. This property is ignored if the + * terrainProvider does not provide a water mask. + */ + showWaterEffect: boolean; + /** + * True if primitives such as billboards, polylines, labels, etc. should be depth-tested + * against the terrain surface, or false if such primitives should always be drawn on top + * of terrain unless they're on the opposite side of the globe. The disadvantage of depth + * testing primitives against terrain is that slight numerical noise or terrain level-of-detail + * switched can sometimes make a primitive that should be on the surface disappear underneath it. + */ + depthTestAgainstTerrain: boolean; + /** + * Determines whether the globe casts or receives shadows from light sources. Setting the globe + * to cast shadows may impact performance since the terrain is rendered again from the light's perspective. + * Currently only terrain that is in view casts shadows. By default the globe does not cast shadows. + */ + shadows: ShadowMode; + /** + * The hue shift to apply to the atmosphere. Defaults to 0.0 (no shift). + * A hue shift of 1.0 indicates a complete rotation of the hues available. + */ + atmosphereHueShift: number; + /** + * The saturation shift to apply to the atmosphere. Defaults to 0.0 (no shift). + * A saturation shift of -1.0 is monochrome. + */ + atmosphereSaturationShift: number; + /** + * The brightness shift to apply to the atmosphere. Defaults to 0.0 (no shift). + * A brightness shift of -1.0 is complete darkness, which will let space show through. + */ + atmosphereBrightnessShift: number; + /** + * Whether to show terrain skirts. Terrain skirts are geometry extending downwards from a tile's edges used to hide seams between neighboring tiles. + * Skirts are always hidden when the camera is underground or translucency is enabled. + */ + showSkirts: boolean; + /** + * Whether to cull back-facing terrain. Back faces are not culled when the camera is underground or translucency is enabled. + */ + backFaceCulling: boolean; + /** + * Determines the darkness of the vertex shadow. + * This only takes effect when enableLighting is true. + */ + vertexShadowDarkness: number; + /** + * Gets an ellipsoid describing the shape of this globe. + */ + ellipsoid: Ellipsoid; + /** + * Gets the collection of image layers that will be rendered on this globe. + */ + imageryLayers: ImageryLayerCollection; + /** + * Gets an event that's raised when an imagery layer is added, shown, hidden, moved, or removed. + */ + readonly imageryLayersUpdatedEvent: Event; + /** + * Returns true when the tile load queue is empty, false otherwise. When the load queue is empty, + * all terrain and imagery for the current view have been loaded. + */ + readonly tilesLoaded: boolean; + /** + * Gets or sets the color of the globe when no imagery is available. + */ + baseColor: Color; + /** + * A property specifying a {@link ClippingPlaneCollection} used to selectively disable rendering on the outside of each plane. + */ + clippingPlanes: ClippingPlaneCollection; + /** + * A property specifying a {@link ClippingPolygonCollection} used to selectively disable rendering inside or outside a list of polygons. + */ + clippingPolygons: ClippingPolygonCollection; + /** + * A property specifying a {@link Rectangle} used to limit globe rendering to a cartographic area. + * Defaults to the maximum extent of cartographic coordinates. + */ + cartographicLimitRectangle: Rectangle; + /** + * The normal map to use for rendering waves in the ocean. Setting this property will + * only have an effect if the configured terrain provider includes a water mask. + */ + oceanNormalMapUrl: string; + /** + * The terrain provider providing surface geometry for this globe. + */ + terrainProvider: TerrainProvider; + /** + * Gets an event that's raised when the terrain provider is changed + */ + readonly terrainProviderChanged: Event; + /** + * Gets an event that's raised when the length of the tile load queue has changed since the last render frame. When the load queue is empty, + * all terrain and imagery for the current view have been loaded. The event passes the new length of the tile load queue. + */ + tileLoadProgressEvent: Event; + /** + * Gets or sets the material appearance of the Globe. This can be one of several built-in {@link Material} objects or a custom material, scripted with + * {@link https://github.com/CesiumGS/cesium/wiki/Fabric|Fabric}. + */ + material: Material | undefined; + /** + * The color to render the back side of the globe when the camera is underground or the globe is translucent, + * blended with the globe color based on the camera's distance. + *

+ * To disable underground coloring, set undergroundColor to undefined. + */ + undergroundColor: Color; + /** + * Gets or sets the near and far distance for blending {@link Globe#undergroundColor} with the globe color. + * The alpha will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the alpha remains clamped to the nearest bound. If undefined, + * the underground color will not be blended with the globe color. + *

+ * When the camera is above the ellipsoid the distance is computed from the nearest + * point on the ellipsoid instead of the camera's position. + */ + undergroundColorAlphaByDistance: NearFarScalar; + /** + * Properties for controlling globe translucency. + */ + translucency: GlobeTranslucency; + /** + * Find an intersection between a ray and the globe surface that was rendered. The ray must be given in world coordinates. + * @example + * // find intersection of ray through a pixel and the globe + * const ray = viewer.camera.getPickRay(windowCoordinates); + * const intersection = globe.pick(ray, scene); + * @param ray - The ray to test for intersection. + * @param scene - The scene. + * @param [result] - The object onto which to store the result. + * @returns The intersection or undefined if none was found. + */ + pick(ray: Ray, scene: Scene, result?: Cartesian3): Cartesian3 | undefined; + /** + * Get the height of the surface at a given cartographic. + * @param cartographic - The cartographic for which to find the height. + * @returns The height of the cartographic or undefined if it could not be found. + */ + getHeight(cartographic: Cartographic): number | undefined; + /** + * Returns true if this object was destroyed; otherwise, false. + *

+ * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

+ * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * globe = globe && globe.destroy(); + */ + destroy(): void; + } + + /** + * Properties for controlling globe translucency. + */ + export class GlobeTranslucency { + constructor(); + /** + * When true, the globe is rendered as a translucent surface. + *

+ * The alpha is computed by blending {@link Globe#material}, {@link Globe#imageryLayers}, + * and {@link Globe#baseColor}, all of which may contain translucency, and then multiplying by + * {@link GlobeTranslucency#frontFaceAlpha} and {@link GlobeTranslucency#frontFaceAlphaByDistance} for front faces and + * {@link GlobeTranslucency#backFaceAlpha} and {@link GlobeTranslucency#backFaceAlphaByDistance} for back faces. + * When the camera is underground back faces and front faces are swapped, i.e. back-facing geometry + * is considered front facing. + *

+ * Translucency is disabled by default. + */ + enabled: boolean; + /** + * A constant translucency to apply to front faces of the globe. + *

+ * {@link GlobeTranslucency#enabled} must be set to true for this option to take effect. + * @example + * // Set front face translucency to 0.5. + * globe.translucency.frontFaceAlpha = 0.5; + * globe.translucency.enabled = true; + */ + frontFaceAlpha: number; + /** + * Gets or sets near and far translucency properties of front faces of the globe based on the distance to the camera. + * The translucency will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the translucency remains clamped to the nearest bound. If undefined, + * frontFaceAlphaByDistance will be disabled. + *

+ * {@link GlobeTranslucency#enabled} must be set to true for this option to take effect. + * @example + * // Example 1. + * // Set front face translucency to 0.5 when the + * // camera is 1500 meters from the surface and 1.0 + * // as the camera distance approaches 8.0e6 meters. + * globe.translucency.frontFaceAlphaByDistance = new Cesium.NearFarScalar(1.5e2, 0.5, 8.0e6, 1.0); + * globe.translucency.enabled = true; + * @example + * // Example 2. + * // Disable front face translucency by distance + * globe.translucency.frontFaceAlphaByDistance = undefined; + */ + frontFaceAlphaByDistance: NearFarScalar; + /** + * A constant translucency to apply to back faces of the globe. + *

+ * {@link GlobeTranslucency#enabled} must be set to true for this option to take effect. + * @example + * // Set back face translucency to 0.5. + * globe.translucency.backFaceAlpha = 0.5; + * globe.translucency.enabled = true; + */ + backFaceAlpha: number; + /** + * Gets or sets near and far translucency properties of back faces of the globe based on the distance to the camera. + * The translucency will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the translucency remains clamped to the nearest bound. If undefined, + * backFaceAlphaByDistance will be disabled. + *

+ * {@link GlobeTranslucency#enabled} must be set to true for this option to take effect. + * @example + * // Example 1. + * // Set back face translucency to 0.5 when the + * // camera is 1500 meters from the surface and 1.0 + * // as the camera distance approaches 8.0e6 meters. + * globe.translucency.backFaceAlphaByDistance = new Cesium.NearFarScalar(1.5e2, 0.5, 8.0e6, 1.0); + * globe.translucency.enabled = true; + * @example + * // Example 2. + * // Disable back face translucency by distance + * globe.translucency.backFaceAlphaByDistance = undefined; + */ + backFaceAlphaByDistance: NearFarScalar; + /** + * A property specifying a {@link Rectangle} used to limit translucency to a cartographic area. + * Defaults to the maximum extent of cartographic coordinates. + */ + rectangle: Rectangle; + } + + /** + * Loads the gltf object + */ + export function loadGltfJson(): void; + + /** + * Removes an extension from gltf.extensions, gltf.extensionsUsed, gltf.extensionsRequired, and any other objects in the glTF if it is present. + * @param gltf - A javascript object containing a glTF asset. + * @param extension - The extension to remove. + * @returns The extension data removed from gltf.extensions. + */ + export function removeExtension(gltf: any, extension: string): any; + + export namespace GoogleEarthEnterpriseImageryProvider { + /** + * Initialization options for the GoogleEarthEnterpriseImageryProvider constructor + * @property [ellipsoid = Ellipsoid.default] - The ellipsoid. If not specified, the default ellipsoid is used. + * @property [tileDiscardPolicy] - The policy that determines if a tile + * is invalid and should be discarded. If this value is not specified, a default + * is to discard tiles that fail to download. + * @property [credit] - A credit for the data source, which is displayed on the canvas. + */ + type ConstructorOptions = { + ellipsoid?: Ellipsoid; + tileDiscardPolicy?: TileDiscardPolicy; + credit?: Credit | string; + }; + } + + /** + *
+ * To construct a GoogleEarthEnterpriseImageryProvider, call {@link GoogleEarthEnterpriseImageryProvider.fromMetadata}. Do not call the constructor directly. + *
+ * + * Provides tiled imagery using the Google Earth Enterprise REST API. + * + * Notes: This provider is for use with the 3D Earth API of Google Earth Enterprise, + * {@link GoogleEarthEnterpriseMapsProvider} should be used with 2D Maps API. + * @example + * const geeMetadata = await GoogleEarthEnterpriseMetadata.fromUrl("http://www.example.com"); + * const gee = Cesium.GoogleEarthEnterpriseImageryProvider.fromMetadata(geeMetadata); + * @param [options] - Object describing initialization options + */ + export class GoogleEarthEnterpriseImageryProvider { + constructor( + options?: GoogleEarthEnterpriseImageryProvider.ConstructorOptions, + ); + /** + * Gets the name of the Google Earth Enterprise server url hosting the imagery. + */ + readonly url: string; + /** + * Gets the proxy used by this provider. + */ + readonly proxy: Proxy; + /** + * Gets the width of each tile, in pixels. + */ + readonly tileWidth: number; + /** + * Gets the height of each tile, in pixels. + */ + readonly tileHeight: number; + /** + * Gets the maximum level-of-detail that can be requested. + */ + readonly maximumLevel: number | undefined; + /** + * Gets the minimum level-of-detail that can be requested. + */ + readonly minimumLevel: number; + /** + * Gets the tiling scheme used by this provider. + */ + readonly tilingScheme: TilingScheme; + /** + * Gets the rectangle, in radians, of the imagery provided by this instance. + */ + readonly rectangle: Rectangle; + /** + * Gets the tile discard policy. If not undefined, the discard policy is responsible + * for filtering out "missing" tiles via its shouldDiscardImage function. If this function + * returns undefined, no tiles are filtered. + */ + readonly tileDiscardPolicy: TileDiscardPolicy; + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + */ + readonly errorEvent: Event; + /** + * Gets the credit to display when this imagery provider is active. Typically this is used to credit + * the source of the imagery. + */ + readonly credit: Credit; + /** + * Gets a value indicating whether or not the images provided by this imagery provider + * include an alpha channel. If this property is false, an alpha channel, if present, will + * be ignored. If this property is true, any images without an alpha channel will be treated + * as if their alpha is 1.0 everywhere. Setting this property to false reduces memory usage + * and texture upload time. + */ + readonly hasAlphaChannel: boolean; + /** + * Creates a tiled imagery provider using the Google Earth Enterprise REST API. + * @example + * const geeMetadata = await GoogleEarthEnterpriseMetadata.fromUrl("http://www.example.com"); + * const gee = Cesium.GoogleEarthEnterpriseImageryProvider.fromMetadata(geeMetadata); + * @param metadata - A metadata object that can be used to share metadata requests with a GoogleEarthEnterpriseTerrainProvider. + * @param options - Object describing initialization options. + */ + static fromMetadata( + metadata: GoogleEarthEnterpriseMetadata, + options: GoogleEarthEnterpriseImageryProvider.ConstructorOptions, + ): GoogleEarthEnterpriseImageryProvider; + /** + * Gets the credits to be displayed when a given tile is displayed. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level; + * @returns The credits to be displayed when the tile is displayed. + */ + getTileCredits(x: number, y: number, level: number): Credit[]; + /** + * Requests the image for a given tile. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param [request] - The request object. Intended for internal use only. + * @returns A promise for the image that will resolve when the image is available, or + * undefined if there are too many active requests to the server, and the request should be retried later. + */ + requestImage( + x: number, + y: number, + level: number, + request?: Request, + ): Promise | undefined; + /** + * Picking features is not currently supported by this imagery provider, so this function simply returns + * undefined. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param longitude - The longitude at which to pick features. + * @param latitude - The latitude at which to pick features. + * @returns Undefined since picking is not supported. + */ + pickFeatures( + x: number, + y: number, + level: number, + longitude: number, + latitude: number, + ): undefined; + } + + export namespace GoogleEarthEnterpriseMapsProvider { + /** + * Initialization options for the GoogleEarthEnterpriseMapsProvider constructor + * @property channel - The channel (id) to be used when requesting data from the server. + * The channel number can be found by looking at the json file located at: + * earth.localdomain/default_map/query?request=Json&vars=geeServerDefs The /default_map path may + * differ depending on your Google Earth Enterprise server configuration. Look for the "id" that + * is associated with a "ImageryMaps" requestType. There may be more than one id available. + * Example: + * { + * layers: [ + * { + * id: 1002, + * requestType: "ImageryMaps" + * }, + * { + * id: 1007, + * requestType: "VectorMapsRaster" + * } + * ] + * } + * @property [path = "/default_map"] - The path of the Google Earth server hosting the imagery. + * @property [maximumLevel] - The maximum level-of-detail supported by the Google Earth + * Enterprise server, or undefined if there is no limit. + * @property [tileDiscardPolicy] - The policy that determines if a tile + * is invalid and should be discarded. To ensure that no tiles are discarded, construct and pass + * a {@link NeverTileDiscardPolicy} for this parameter. + * @property [ellipsoid = Ellipsoid.default] - The ellipsoid. If not specified, the default ellipsoid is used. + */ + type ConstructorOptions = { + channel: number; + path?: string; + maximumLevel?: number; + tileDiscardPolicy?: TileDiscardPolicy; + ellipsoid?: Ellipsoid; + }; + } + + /** + *
+ * To construct a GoogleEarthEnterpriseMapsProvider, call {@link GoogleEarthEnterpriseImageryProvider.fromUrl}. Do not call the constructor directly. + *
+ * + * Provides tiled imagery using the Google Earth Imagery API. + * + * Notes: This imagery provider does not work with the public Google Earth servers. It works with the + * Google Earth Enterprise Server. + * + * By default the Google Earth Enterprise server does not set the + * {@link http://www.w3.org/TR/cors/|Cross-Origin Resource Sharing} headers. You can either + * use a proxy server which adds these headers, or in the /opt/google/gehttpd/conf/gehttpd.conf + * and add the 'Header set Access-Control-Allow-Origin "*"' option to the '<Directory />' and + * '<Directory "/opt/google/gehttpd/htdocs">' directives. + * + * This provider is for use with 2D Maps API as part of Google Earth Enterprise. For 3D Earth API uses, it + * is necessary to use {@link GoogleEarthEnterpriseImageryProvider} + * @example + * const google = await Cesium.GoogleEarthEnterpriseMapsProvider.fromUrl("https://earth.localdomain", 1008); + * @param options - Object describing initialization options + */ + export class GoogleEarthEnterpriseMapsProvider { + constructor(options: GoogleEarthEnterpriseMapsProvider.ConstructorOptions); + /** + * Gets the URL of the Google Earth MapServer. + */ + readonly url: string; + /** + * Gets the url path of the data on the Google Earth server. + */ + readonly path: string; + /** + * Gets the proxy used by this provider. + */ + readonly proxy: Proxy; + /** + * Gets the imagery channel (id) currently being used. + */ + readonly channel: number; + /** + * Gets the width of each tile, in pixels. + */ + readonly tileWidth: number; + /** + * Gets the height of each tile, in pixels. + */ + readonly tileHeight: number; + /** + * Gets the maximum level-of-detail that can be requested. + */ + readonly maximumLevel: number | undefined; + /** + * Gets the minimum level-of-detail that can be requested. + */ + readonly minimumLevel: number; + /** + * Gets the tiling scheme used by this provider. + */ + readonly tilingScheme: TilingScheme; + /** + * Gets the version of the data used by this provider. + */ + readonly version: number; + /** + * Gets the type of data that is being requested from the provider. + */ + readonly requestType: string; + /** + * Gets the rectangle, in radians, of the imagery provided by this instance. + */ + readonly rectangle: Rectangle; + /** + * Gets the tile discard policy. If not undefined, the discard policy is responsible + * for filtering out "missing" tiles via its shouldDiscardImage function. If this function + * returns undefined, no tiles are filtered. + */ + readonly tileDiscardPolicy: TileDiscardPolicy; + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + */ + readonly errorEvent: Event; + /** + * Gets the credit to display when this imagery provider is active. Typically this is used to credit + * the source of the imagery. + */ + readonly credit: Credit; + /** + * Gets a value indicating whether or not the images provided by this imagery provider + * include an alpha channel. If this property is false, an alpha channel, if present, will + * be ignored. If this property is true, any images without an alpha channel will be treated + * as if their alpha is 1.0 everywhere. When this property is false, memory usage + * and texture upload time are reduced. + */ + readonly hasAlphaChannel: boolean; + /** + * Creates a tiled imagery provider using the Google Earth Imagery API. + * @example + * const google = await Cesium.GoogleEarthEnterpriseMapsProvider.fromUrl("https://earth.localdomain", 1008); + * @param url - The url of the Google Earth server hosting the imagery. + * @param [options] - Object describing initialization options + * @returns The created GoogleEarthEnterpriseMapsProvider. + */ + static fromUrl( + url: Resource | string, + options?: GoogleEarthEnterpriseMapsProvider.ConstructorOptions, + ): Promise; + /** + * Gets the credits to be displayed when a given tile is displayed. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level; + * @returns The credits to be displayed when the tile is displayed. + */ + getTileCredits(x: number, y: number, level: number): Credit[]; + /** + * Requests the image for a given tile. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param [request] - The request object. Intended for internal use only. + * @returns A promise for the image that will resolve when the image is available, or + * undefined if there are too many active requests to the server, and the request should be retried later. + */ + requestImage( + x: number, + y: number, + level: number, + request?: Request, + ): Promise | undefined; + /** + * Picking features is not currently supported by this imagery provider, so this function simply returns + * undefined. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param longitude - The longitude at which to pick features. + * @param latitude - The latitude at which to pick features. + * @returns Undefined since picking is not supported. + */ + pickFeatures( + x: number, + y: number, + level: number, + longitude: number, + latitude: number, + ): undefined; + /** + * Gets or sets the URL to the Google Earth logo for display in the credit. + */ + static logoUrl: string; + } + + export namespace GridImageryProvider { + /** + * Initialization options for the GridImageryProvider constructor + * @property [tilingScheme = new GeographicTilingScheme()] - The tiling scheme for which to draw tiles. + * @property [ellipsoid = Ellipsoid.default] - The ellipsoid. If the tilingScheme is specified, + * this parameter is ignored and the tiling scheme's ellipsoid is used instead. If neither + * parameter is specified, the default ellipsoid is used. + * @property [cells = 8] - The number of grids cells. + * @property [color = Color(1.0, 1.0, 1.0, 0.4)] - The color to draw grid lines. + * @property [glowColor = Color(0.0, 1.0, 0.0, 0.05)] - The color to draw glow for grid lines. + * @property [glowWidth = 6] - The width of lines used for rendering the line glow effect. + * @property [backgroundColor = Color(0.0, 0.5, 0.0, 0.2)] - Background fill color. + * @property [tileWidth = 256] - The width of the tile for level-of-detail selection purposes. + * @property [tileHeight = 256] - The height of the tile for level-of-detail selection purposes. + * @property [canvasSize = 256] - The size of the canvas used for rendering. + */ + type ConstructorOptions = { + tilingScheme?: TilingScheme; + ellipsoid?: Ellipsoid; + cells?: number; + color?: Color; + glowColor?: Color; + glowWidth?: number; + backgroundColor?: Color; + tileWidth?: number; + tileHeight?: number; + canvasSize?: number; + }; + } + + /** + * An {@link ImageryProvider} that draws a wireframe grid on every tile with controllable background and glow. + * May be useful for custom rendering effects or debugging terrain. + * @param options - Object describing initialization options + */ + export class GridImageryProvider { + constructor(options: GridImageryProvider.ConstructorOptions); + /** + * Gets the proxy used by this provider. + */ + readonly proxy: Proxy; + /** + * Gets the width of each tile, in pixels. + */ + readonly tileWidth: number; + /** + * Gets the height of each tile, in pixels. + */ + readonly tileHeight: number; + /** + * Gets the maximum level-of-detail that can be requested. + */ + readonly maximumLevel: number | undefined; + /** + * Gets the minimum level-of-detail that can be requested. + */ + readonly minimumLevel: number; + /** + * Gets the tiling scheme used by this provider. + */ + readonly tilingScheme: TilingScheme; + /** + * Gets the rectangle, in radians, of the imagery provided by this instance. + */ + readonly rectangle: Rectangle; + /** + * Gets the tile discard policy. If not undefined, the discard policy is responsible + * for filtering out "missing" tiles via its shouldDiscardImage function. If this function + * returns undefined, no tiles are filtered. + */ + readonly tileDiscardPolicy: TileDiscardPolicy; + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + */ + readonly errorEvent: Event; + /** + * Gets the credit to display when this imagery provider is active. Typically this is used to credit + * the source of the imagery. + */ + readonly credit: Credit; + /** + * Gets a value indicating whether or not the images provided by this imagery provider + * include an alpha channel. If this property is false, an alpha channel, if present, will + * be ignored. If this property is true, any images without an alpha channel will be treated + * as if their alpha is 1.0 everywhere. When this property is false, memory usage + * and texture upload time are reduced. + */ + readonly hasAlphaChannel: boolean; + /** + * Draws a grid of lines into a canvas. + */ + _drawGrid(): void; + /** + * Render a grid into a canvas with background and glow + */ + _createGridCanvas(): void; + /** + * Gets the credits to be displayed when a given tile is displayed. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level; + * @returns The credits to be displayed when the tile is displayed. + */ + getTileCredits(x: number, y: number, level: number): Credit[]; + /** + * Requests the image for a given tile. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param [request] - The request object. Intended for internal use only. + * @returns The resolved image as a Canvas DOM object. + */ + requestImage( + x: number, + y: number, + level: number, + request?: Request, + ): Promise; + /** + * Picking features is not currently supported by this imagery provider, so this function simply returns + * undefined. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param longitude - The longitude at which to pick features. + * @param latitude - The latitude at which to pick features. + * @returns Undefined since picking is not supported. + */ + pickFeatures( + x: number, + y: number, + level: number, + longitude: number, + latitude: number, + ): undefined; + } + + /** + * A GroundPolylinePrimitive represents a polyline draped over the terrain or 3D Tiles in the {@link Scene}. + *

+ * Only to be used with GeometryInstances containing {@link GroundPolylineGeometry}. + *

+ * @example + * // 1. Draw a polyline on terrain with a basic color material + * + * const instance = new Cesium.GeometryInstance({ + * geometry : new Cesium.GroundPolylineGeometry({ + * positions : Cesium.Cartesian3.fromDegreesArray([ + * -112.1340164450331, 36.05494287836128, + * -112.08821010582645, 36.097804071380715 + * ]), + * width : 4.0 + * }), + * id : 'object returned when this instance is picked and to get/set per-instance attributes' + * }); + * + * scene.groundPrimitives.add(new Cesium.GroundPolylinePrimitive({ + * geometryInstances : instance, + * appearance : new Cesium.PolylineMaterialAppearance() + * })); + * + * // 2. Draw a looped polyline on terrain with per-instance color and a distance display condition. + * // Distance display conditions for polylines on terrain are based on an approximate terrain height + * // instead of true terrain height. + * + * const instance2 = new Cesium.GeometryInstance({ + * geometry : new Cesium.GroundPolylineGeometry({ + * positions : Cesium.Cartesian3.fromDegreesArray([ + * -112.1340164450331, 36.05494287836128, + * -112.08821010582645, 36.097804071380715, + * -112.13296079730024, 36.168769146801104 + * ]), + * loop : true, + * width : 4.0 + * }), + * attributes : { + * color : Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.fromCssColorString('green').withAlpha(0.7)), + * distanceDisplayCondition : new Cesium.DistanceDisplayConditionGeometryInstanceAttribute(1000, 30000) + * }, + * id : 'object returned when this instance is picked and to get/set per-instance attributes' + * }); + * + * scene.groundPrimitives.add(new Cesium.GroundPolylinePrimitive({ + * geometryInstances : instance2, + * appearance : new Cesium.PolylineColorAppearance() + * })); + * @param [options] - Object with the following properties: + * @param [options.geometryInstances] - GeometryInstances containing GroundPolylineGeometry + * @param [options.appearance] - The Appearance used to render the polyline. Defaults to a white color {@link Material} on a {@link PolylineMaterialAppearance}. + * @param [options.show = true] - Determines if this primitive will be shown. + * @param [options.interleave = false] - When true, geometry vertex attributes are interleaved, which can slightly improve rendering performance but increases load time. + * @param [options.releaseGeometryInstances = true] - When true, the primitive does not keep a reference to the input geometryInstances to save memory. + * @param [options.allowPicking = true] - When true, each geometry instance will only be pickable with {@link Scene#pick}. When false, GPU memory is saved. + * @param [options.asynchronous = true] - Determines if the primitive will be created asynchronously or block until ready. If false initializeTerrainHeights() must be called first. + * @param [options.classificationType = ClassificationType.BOTH] - Determines whether terrain, 3D Tiles or both will be classified. + * @param [options.debugShowBoundingVolume = false] - For debugging only. Determines if this primitive's commands' bounding spheres are shown. + * @param [options.debugShowShadowVolume = false] - For debugging only. Determines if the shadow volume for each geometry in the primitive is drawn. Must be true on creation to have effect. + */ + export class GroundPolylinePrimitive { + constructor(options?: { + geometryInstances?: any[] | GeometryInstance; + appearance?: Appearance; + show?: boolean; + interleave?: boolean; + releaseGeometryInstances?: boolean; + allowPicking?: boolean; + asynchronous?: boolean; + classificationType?: ClassificationType; + debugShowBoundingVolume?: boolean; + debugShowShadowVolume?: boolean; + }); + /** + * The geometry instances rendered with this primitive. This may + * be undefined if options.releaseGeometryInstances + * is true when the primitive is constructed. + *

+ * Changing this property after the primitive is rendered has no effect. + *

+ */ + readonly geometryInstances: any[] | GeometryInstance; + /** + * The {@link Appearance} used to shade this primitive. Each geometry + * instance is shaded with the same appearance. Some appearances, like + * {@link PolylineColorAppearance} allow giving each instance unique + * properties. + */ + appearance: Appearance; + /** + * Determines if the primitive will be shown. This affects all geometry + * instances in the primitive. + */ + show: boolean; + /** + * Determines whether terrain, 3D Tiles or both will be classified. + */ + classificationType: ClassificationType; + /** + * This property is for debugging only; it is not for production use nor is it optimized. + *

+ * Draws the bounding sphere for each draw command in the primitive. + *

+ */ + debugShowBoundingVolume: boolean; + /** + * Determines if geometry vertex attributes are interleaved, which can slightly improve rendering performance. + */ + readonly interleave: boolean; + /** + * When true, the primitive does not keep a reference to the input geometryInstances to save memory. + */ + readonly releaseGeometryInstances: boolean; + /** + * When true, each geometry instance will only be pickable with {@link Scene#pick}. When false, GPU memory is saved. + */ + readonly allowPicking: boolean; + /** + * Determines if the geometry instances will be created and batched on a web worker. + */ + readonly asynchronous: boolean; + /** + * Determines if the primitive is complete and ready to render. If this property is + * true, the primitive will be rendered the next time that {@link GroundPolylinePrimitive#update} + * is called. + */ + readonly ready: boolean; + /** + * This property is for debugging only; it is not for production use nor is it optimized. + *

+ * If true, draws the shadow volume for each geometry in the primitive. + *

+ */ + readonly debugShowShadowVolume: boolean; + /** + * Initializes the minimum and maximum terrain heights. This only needs to be called if you are creating the + * GroundPolylinePrimitive synchronously. + * @returns A promise that will resolve once the terrain heights have been loaded. + */ + static initializeTerrainHeights(): Promise; + /** + * Called when {@link Viewer} or {@link CesiumWidget} render the scene to + * get the draw commands needed to render this primitive. + *

+ * Do not call this function directly. This is documented just to + * list the exceptions that may be propagated when the scene is rendered: + *

+ */ + update(): void; + /** + * Returns the modifiable per-instance attributes for a {@link GeometryInstance}. + * @example + * const attributes = primitive.getGeometryInstanceAttributes('an id'); + * attributes.color = Cesium.ColorGeometryInstanceAttribute.toValue(Cesium.Color.AQUA); + * attributes.show = Cesium.ShowGeometryInstanceAttribute.toValue(true); + * @param id - The id of the {@link GeometryInstance}. + * @returns The typed array in the attribute's format or undefined if the is no instance with id. + */ + getGeometryInstanceAttributes(id: any): any; + /** + * Checks if the given Scene supports GroundPolylinePrimitives. + * GroundPolylinePrimitives require support for the WEBGL_depth_texture extension. + * @param scene - The current scene. + * @returns Whether or not the current scene supports GroundPolylinePrimitives. + */ + static isSupported(scene: Scene): boolean; + /** + * Returns true if this object was destroyed; otherwise, false. + *

+ * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + *

+ * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

+ * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + *

+ * @example + * e = e && e.destroy(); + */ + destroy(): void; + } + + /** + * A ground primitive represents geometry draped over terrain or 3D Tiles in the {@link Scene}. + *

+ * A primitive combines geometry instances with an {@link Appearance} that describes the full shading, including + * {@link Material} and {@link RenderState}. Roughly, the geometry instance defines the structure and placement, + * and the appearance defines the visual characteristics. Decoupling geometry and appearance allows us to mix + * and match most of them and add a new geometry or appearance independently of each other. + *

+ *

+ * Support for the WEBGL_depth_texture extension is required to use GeometryInstances with different PerInstanceColors + * or materials besides PerInstanceColorAppearance. + *

+ *

+ * Textured GroundPrimitives were designed for notional patterns and are not meant for precisely mapping + * textures to terrain - for that use case, use {@link SingleTileImageryProvider}. + *

+ *

+ * For correct rendering, this feature requires the EXT_frag_depth WebGL extension. For hardware that do not support this extension, there + * will be rendering artifacts for some viewing angles. + *

+ *

+ * Valid geometries are {@link CircleGeometry}, {@link CorridorGeometry}, {@link EllipseGeometry}, {@link PolygonGeometry}, and {@link RectangleGeometry}. + *

+ * @example + * // Example 1: Create primitive with a single instance + * const rectangleInstance = new Cesium.GeometryInstance({ + * geometry : new Cesium.RectangleGeometry({ + * rectangle : Cesium.Rectangle.fromDegrees(-140.0, 30.0, -100.0, 40.0) + * }), + * id : 'rectangle', + * attributes : { + * color : new Cesium.ColorGeometryInstanceAttribute(0.0, 1.0, 1.0, 0.5) + * } + * }); + * scene.primitives.add(new Cesium.GroundPrimitive({ + * geometryInstances : rectangleInstance + * })); + * + * // Example 2: Batch instances + * const color = new Cesium.ColorGeometryInstanceAttribute(0.0, 1.0, 1.0, 0.5); // Both instances must have the same color. + * const rectangleInstance = new Cesium.GeometryInstance({ + * geometry : new Cesium.RectangleGeometry({ + * rectangle : Cesium.Rectangle.fromDegrees(-140.0, 30.0, -100.0, 40.0) + * }), + * id : 'rectangle', + * attributes : { + * color : color + * } + * }); + * const ellipseInstance = new Cesium.GeometryInstance({ + * geometry : new Cesium.EllipseGeometry({ + * center : Cesium.Cartesian3.fromDegrees(-105.0, 40.0), + * semiMinorAxis : 300000.0, + * semiMajorAxis : 400000.0 + * }), + * id : 'ellipse', + * attributes : { + * color : color + * } + * }); + * scene.primitives.add(new Cesium.GroundPrimitive({ + * geometryInstances : [rectangleInstance, ellipseInstance] + * })); + * @param [options] - Object with the following properties: + * @param [options.geometryInstances] - The geometry instances to render. + * @param [options.appearance] - The appearance used to render the primitive. Defaults to a flat PerInstanceColorAppearance when GeometryInstances have a color attribute. + * @param [options.show = true] - Determines if this primitive will be shown. + * @param [options.vertexCacheOptimize = false] - When true, geometry vertices are optimized for the pre and post-vertex-shader caches. + * @param [options.interleave = false] - When true, geometry vertex attributes are interleaved, which can slightly improve rendering performance but increases load time. + * @param [options.compressVertices = true] - When true, the geometry vertices are compressed, which will save memory. + * @param [options.releaseGeometryInstances = true] - When true, the primitive does not keep a reference to the input geometryInstances to save memory. + * @param [options.allowPicking = true] - When true, each geometry instance will only be pickable with {@link Scene#pick}. When false, GPU memory is saved. + * @param [options.asynchronous = true] - Determines if the primitive will be created asynchronously or block until ready. If false initializeTerrainHeights() must be called first. + * @param [options.classificationType = ClassificationType.BOTH] - Determines whether terrain, 3D Tiles or both will be classified. + * @param [options.debugShowBoundingVolume = false] - For debugging only. Determines if this primitive's commands' bounding spheres are shown. + * @param [options.debugShowShadowVolume = false] - For debugging only. Determines if the shadow volume for each geometry in the primitive is drawn. Must be true on + * creation for the volumes to be created before the geometry is released or options.releaseGeometryInstance must be false. + */ + export class GroundPrimitive { + constructor(options?: { + geometryInstances?: any[] | GeometryInstance; + appearance?: Appearance; + show?: boolean; + vertexCacheOptimize?: boolean; + interleave?: boolean; + compressVertices?: boolean; + releaseGeometryInstances?: boolean; + allowPicking?: boolean; + asynchronous?: boolean; + classificationType?: ClassificationType; + debugShowBoundingVolume?: boolean; + debugShowShadowVolume?: boolean; + }); + /** + * The {@link Appearance} used to shade this primitive. Each geometry + * instance is shaded with the same appearance. Some appearances, like + * {@link PerInstanceColorAppearance} allow giving each instance unique + * properties. + */ + appearance: Appearance; + /** + * The geometry instances rendered with this primitive. This may + * be undefined if options.releaseGeometryInstances + * is true when the primitive is constructed. + *

+ * Changing this property after the primitive is rendered has no effect. + *

+ */ + readonly geometryInstances: any[] | GeometryInstance; + /** + * Determines if the primitive will be shown. This affects all geometry + * instances in the primitive. + */ + show: boolean; + /** + * Determines whether terrain, 3D Tiles or both will be classified. + */ + classificationType: ClassificationType; + /** + * This property is for debugging only; it is not for production use nor is it optimized. + *

+ * Draws the bounding sphere for each draw command in the primitive. + *

+ */ + debugShowBoundingVolume: boolean; + /** + * This property is for debugging only; it is not for production use nor is it optimized. + *

+ * Draws the shadow volume for each geometry in the primitive. + *

+ */ + debugShowShadowVolume: boolean; + /** + * When true, geometry vertices are optimized for the pre and post-vertex-shader caches. + */ + readonly vertexCacheOptimize: boolean; + /** + * Determines if geometry vertex attributes are interleaved, which can slightly improve rendering performance. + */ + readonly interleave: boolean; + /** + * When true, the primitive does not keep a reference to the input geometryInstances to save memory. + */ + readonly releaseGeometryInstances: boolean; + /** + * When true, each geometry instance will only be pickable with {@link Scene#pick}. When false, GPU memory is saved. + */ + readonly allowPicking: boolean; + /** + * Determines if the geometry instances will be created and batched on a web worker. + */ + readonly asynchronous: boolean; + /** + * When true, geometry vertices are compressed, which will save memory. + */ + readonly compressVertices: boolean; + /** + * Determines if the primitive is complete and ready to render. If this property is + * true, the primitive will be rendered the next time that {@link GroundPrimitive#update} + * is called. + */ + readonly ready: boolean; + /** + * Determines if GroundPrimitive rendering is supported. + * @param scene - The scene. + * @returns true if GroundPrimitives are supported; otherwise, returns false + */ + static isSupported(scene: Scene): boolean; + /** + * Initializes the minimum and maximum terrain heights. This only needs to be called if you are creating the + * GroundPrimitive synchronously. + * @returns A promise that will resolve once the terrain heights have been loaded. + */ + static initializeTerrainHeights(): Promise; + /** + * Called when {@link Viewer} or {@link CesiumWidget} render the scene to + * get the draw commands needed to render this primitive. + *

+ * Do not call this function directly. This is documented just to + * list the exceptions that may be propagated when the scene is rendered: + *

+ */ + update(): void; + /** + * Returns the modifiable per-instance attributes for a {@link GeometryInstance}. + * @example + * const attributes = primitive.getGeometryInstanceAttributes('an id'); + * attributes.color = Cesium.ColorGeometryInstanceAttribute.toValue(Cesium.Color.AQUA); + * attributes.show = Cesium.ShowGeometryInstanceAttribute.toValue(true); + * @param id - The id of the {@link GeometryInstance}. + * @returns The typed array in the attribute's format or undefined if the is no instance with id. + */ + getGeometryInstanceAttributes(id: any): any; + /** + * Returns true if this object was destroyed; otherwise, false. + *

+ * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + *

+ * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

+ * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + *

+ * @example + * e = e && e.destroy(); + */ + destroy(): void; + /** + * Checks if the given Scene supports materials on GroundPrimitives. + * Materials on GroundPrimitives require support for the WEBGL_depth_texture extension. + * @param scene - The current scene. + * @returns Whether or not the current scene supports materials on GroundPrimitives. + */ + static supportsMaterials(scene: Scene): boolean; + } + + /** + * Represents the position relative to the terrain. + */ + export enum HeightReference { + /** + * The position is absolute. + */ + NONE = 0, + /** + * The position is clamped to the terrain and 3D Tiles. + */ + CLAMP_TO_GROUND = 1, + /** + * The position height is the height above the terrain and 3D Tiles. + */ + RELATIVE_TO_GROUND = 2, + /** + * The position is clamped to terain. + */ + CLAMP_TO_TERRAIN = 3, + /** + * The position height is the height above terrain. + */ + RELATIVE_TO_TERRAIN = 4, + /** + * The position is clamped to 3D Tiles. + */ + CLAMP_TO_3D_TILE = 5, + /** + * The position height is the height above 3D Tiles. + */ + RELATIVE_TO_3D_TILE = 6, + } + + /** + * The horizontal location of an origin relative to an object, e.g., a {@link Billboard} + * or {@link Label}. For example, setting the horizontal origin to LEFT + * or RIGHT will display a billboard to the left or right (in screen space) + * of the anchor position. + *

+ *
+ *
+ *
+ */ + export enum HorizontalOrigin { + /** + * The origin is at the horizontal center of the object. + */ + CENTER = 0, + /** + * The origin is on the left side of the object. + */ + LEFT = 1, + /** + * The origin is on the right side of the object. + */ + RIGHT = -1, + } + + export namespace I3SDataProvider { + /** + * Initialization options for the I3SDataProvider constructor + * @example + * // Increase LOD by reducing SSE + * const cesium3dTilesetOptions = { + * maximumScreenSpaceError: 1, + * }; + * const i3sOptions = { + * cesium3dTilesetOptions: cesium3dTilesetOptions, + * }; + * @example + * // Set a custom outline color to replace the color defined in I3S symbology + * const cesium3dTilesetOptions = { + * outlineColor: Cesium.Color.BLUE, + * }; + * const i3sOptions = { + * cesium3dTilesetOptions: cesium3dTilesetOptions, + * applySymbology: true, + * }; + * @property [name] - The name of the I3S dataset. + * @property [show = true] - Determines if the dataset will be shown. + * @property [geoidTiledTerrainProvider] - Tiled elevation provider describing an Earth Gravitational Model. If defined, geometry will be shifted based on the offsets given by this provider. Required to position I3S data sets with gravity-related height at the correct location. + * @property [cesium3dTilesetOptions] - Object containing options to pass to an internally created {@link Cesium3DTileset}. See {@link Cesium3DTileset} for list of valid properties. All options can be used with the exception of url and show which are overridden by values from I3SDataProvider. + * @property [showFeatures = false] - Determines if the features will be shown. + * @property [adjustMaterialAlphaMode = false] - The option to adjust the alpha mode of the material based on the transparency of the vertex color. When true, the alpha mode of the material (if not defined) will be set to BLEND for geometry with any transparency in the color vertex attribute. + * @property [applySymbology = false] - Determines if the I3S symbology will be parsed and applied for the layers. + * @property [calculateNormals = false] - Determines if the flat normals will be generated for I3S geometry without normals. + */ + type ConstructorOptions = { + name?: string; + show?: boolean; + geoidTiledTerrainProvider?: + | ArcGISTiledElevationTerrainProvider + | Promise; + cesium3dTilesetOptions?: Cesium3DTileset.ConstructorOptions; + showFeatures?: boolean; + adjustMaterialAlphaMode?: boolean; + applySymbology?: boolean; + calculateNormals?: boolean; + }; + } + + /** + * An I3SDataProvider is the main public class for I3S support. The url option + * should return a scene object. Currently supported I3S versions are 1.6 and + * 1.7/1.8 (OGC I3S 1.2). I3SFeature and I3SNode classes implement the + * Object Model for I3S entities, with public interfaces. + * + *
+ * This object is normally not instantiated directly, use {@link I3SDataProvider.fromUrl}. + *
+ * @example + * try { + * const i3sData = await I3SDataProvider.fromUrl( + * "https://tiles.arcgis.com/tiles/z2tnIkrLQ2BRzr6P/arcgis/rest/services/Frankfurt2017_vi3s_18/SceneServer/layers/0" + * ); + * viewer.scene.primitives.add(i3sData); + * } catch (error) { + * console.log(`There was an error creating the I3S Data Provider: ${error}`); + * } + * @example + * try { + * const geoidService = await Cesium.ArcGISTiledElevationTerrainProvider.fromUrl( + * "https://tiles.arcgis.com/tiles/z2tnIkrLQ2BRzr6P/arcgis/rest/services/EGM2008/ImageServer" + * ); + * const i3sData = await I3SDataProvider.fromUrl( + * "https://tiles.arcgis.com/tiles/z2tnIkrLQ2BRzr6P/arcgis/rest/services/Frankfurt2017_vi3s_18/SceneServer/layers/0", { + * geoidTiledTerrainProvider: geoidService + * }); + * viewer.scene.primitives.add(i3sData); + * } catch (error) { + * console.log(`There was an error creating the I3S Data Provider: ${error}`); + * } + * @param options - An object describing initialization options + */ + export class I3SDataProvider { + constructor(options: I3SDataProvider.ConstructorOptions); + /** + * Gets a human-readable name for this dataset. + */ + readonly name: string; + /** + * Determines if the dataset will be shown. + */ + show: boolean; + /** + * The terrain provider referencing the GEOID service to be used for orthometric to ellipsoidal conversion. + */ + readonly geoidTiledTerrainProvider: ArcGISTiledElevationTerrainProvider; + /** + * Gets the collection of layers. + */ + readonly layers: I3SLayer[]; + /** + * Gets the collection of building sublayers. + */ + readonly sublayers: I3SSublayer[]; + /** + * Gets the I3S data for this object. + */ + readonly data: any; + /** + * Gets the extent covered by this I3S. + */ + readonly extent: Rectangle; + /** + * The resource used to fetch the I3S dataset. + */ + readonly resource: Resource; + /** + * Determines if the features will be shown. + */ + readonly showFeatures: boolean; + /** + * Determines if the alpha mode of the material will be adjusted depending on the color vertex attribute. + */ + readonly adjustMaterialAlphaMode: boolean; + /** + * Determines if the I3S symbology will be parsed and applied for the layers. + */ + readonly applySymbology: boolean; + /** + * Determines if the flat normals will be generated for I3S geometry without normals. + */ + readonly calculateNormals: boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

+ * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + *

+ */ + destroy(): void; + /** + * Returns true if this object was destroyed; otherwise, false. + *

+ * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + *

+ * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Creates an I3SDataProvider. Currently supported I3S versions are 1.6 and + * 1.7/1.8 (OGC I3S 1.2). + * @example + * try { + * const i3sData = await I3SDataProvider.fromUrl( + * "https://tiles.arcgis.com/tiles/z2tnIkrLQ2BRzr6P/arcgis/rest/services/Frankfurt2017_vi3s_18/SceneServer/layers/0" + * ); + * viewer.scene.primitives.add(i3sData); + * } catch (error) { + * console.log(`There was an error creating the I3S Data Provider: ${error}`); + * } + * @example + * try { + * const geoidService = await Cesium.ArcGISTiledElevationTerrainProvider.fromUrl( + * "https://tiles.arcgis.com/tiles/z2tnIkrLQ2BRzr6P/arcgis/rest/services/EGM2008/ImageServer" + * ); + * const i3sData = await I3SDataProvider.fromUrl( + * "https://tiles.arcgis.com/tiles/z2tnIkrLQ2BRzr6P/arcgis/rest/services/Frankfurt2017_vi3s_18/SceneServer/layers/0", { + * geoidTiledTerrainProvider: geoidService + * }); + * viewer.scene.primitives.add(i3sData); + * } catch (error) { + * console.log(`There was an error creating the I3S Data Provider: ${error}`); + * } + * @param url - The url of the I3S dataset, which should return an I3S scene object + * @param options - An object describing initialization options + */ + static fromUrl( + url: string | Resource, + options: I3SDataProvider.ConstructorOptions, + ): Promise; + /** + * Returns the collection of names for all available attributes + * @returns The collection of attribute names + */ + getAttributeNames(): string[]; + /** + * Returns the collection of values for the attribute with the given name + * @param name - The attribute name + * @returns The collection of attribute values + */ + getAttributeValues(name: string): string[]; + /** + * Filters the drawn elements of a scene to specific attribute names and values + * @param [filters = []] - The collection of attribute filters + * @returns A promise that is resolved when the filter is applied + */ + filterByAttributes(filters?: I3SNode.AttributeFilter[]): Promise; + } + + /** + * This class implements an I3S Feature. + *

+ * Do not construct this directly, instead access tiles through {@link I3SNode}. + *

+ */ + export class I3SFeature { + constructor(); + /** + * Gets the resource for the feature + */ + readonly resource: Resource; + /** + * Gets the I3S data for this object. + */ + readonly data: any; + } + + /** + * This class implements an I3S Field which is custom data attached + * to nodes + */ + export class I3SField { + constructor(); + /** + * Gets the resource for the fields + */ + readonly resource: Resource; + /** + * Gets the header for this field. + */ + readonly header: any; + /** + * Gets the values for this field. + */ + readonly values: any; + /** + * Gets the name for the field. + */ + readonly name: string; + /** + * Loads the content. + * @returns A promise that is resolved when the field data is loaded + */ + load(): Promise; + } + + /** + * This class implements an I3S Geometry. Each I3SGeometry + * generates an in memory glTF to be used as content for a Cesium3DTile + *

+ * Do not construct this directly, instead access tiles through {@link I3SNode}. + *

+ */ + export class I3SGeometry { + constructor(); + /** + * Gets the resource for the geometry + */ + readonly resource: Resource; + /** + * Gets the I3S data for this object. + */ + readonly data: any; + /** + * Gets the custom attributes of the geometry. + */ + readonly customAttributes: any; + /** + * Find a triangle touching the point [px, py, pz], then return the vertex closest to the search point + * @param px - The x component of the point to query + * @param py - The y component of the point to query + * @param pz - The z component of the point to query + * @returns A structure containing the index of the closest point, + * the squared distance from the queried point to the point that is found, + * the distance from the queried point to the point that is found, + * the queried position in local space, + * the closest position in local space + */ + getClosestPointIndexOnTriangle(px: number, py: number, pz: number): any; + } + + /** + * This class implements an I3S layer. In CesiumJS each I3SLayer creates a Cesium3DTileset. + *

+ * Do not construct this directly, instead access layers through {@link I3SDataProvider}. + *

+ */ + export class I3SLayer { + constructor(); + /** + * Gets the resource for the layer. + */ + readonly resource: Resource; + /** + * Gets the root node of this layer. + */ + readonly rootNode: I3SNode; + /** + * Gets the Cesium3DTileset for this layer. + */ + readonly tileset: Cesium3DTileset | undefined; + /** + * Gets the I3S data for this object. + */ + readonly data: any; + /** + * The version string of the loaded I3S dataset + */ + readonly version: string; + /** + * The major version number of the loaded I3S dataset + */ + readonly majorVersion: number; + /** + * The minor version number of the loaded I3S dataset + */ + readonly minorVersion: number; + /** + * When true, when the loaded I3S version is 1.6 or older + */ + readonly legacyVersion16: boolean; + /** + * Filters the drawn elements of a layer to specific attribute names and values + * @param [filters = []] - The collection of attribute filters + * @returns A promise that is resolved when the filter is applied + */ + filterByAttributes(filters?: I3SNode.AttributeFilter[]): Promise; + } + + export namespace I3SNode { + /** + * A filter given by an attribute name and values. + * The 3D feature object should be hidden if its value for the attribute name is not specified in the collection of values. + * @property name - The name of the attribute + * @property values - The collection of values + */ + type AttributeFilter = { + name: string; + values: string[] | number[]; + }; + } + + /** + * This class implements an I3S Node. In CesiumJS each I3SNode creates a Cesium3DTile. + *

+ * Do not construct this directly, instead access tiles through {@link I3SLayer}. + *

+ */ + export class I3SNode { + constructor(); + /** + * Gets the resource for the node. + */ + readonly resource: Resource; + /** + * Gets the parent layer. + */ + readonly layer: I3SLayer; + /** + * Gets the parent node. + */ + readonly parent: I3SNode | undefined; + /** + * Gets the children nodes. + */ + readonly children: I3SNode[]; + /** + * Gets the collection of geometries. + */ + readonly geometryData: I3SGeometry[]; + /** + * Gets the collection of features. + */ + readonly featureData: I3SFeature[]; + /** + * Gets the collection of fields. + */ + readonly fields: I3SField[]; + /** + * Gets the Cesium3DTile for this node. + */ + readonly tile: Cesium3DTile; + /** + * Gets the I3S data for this object. + */ + readonly data: any; + /** + * Loads the node fields. + * @returns A promise that is resolved when the I3S Node fields are loaded + */ + loadFields(): Promise; + /** + * Loads the node field. + * @param name - The field name + * @returns A promise that is resolved when the I3S Node field is loaded + */ + loadField(name: string): Promise; + /** + * Returns the fields for a given picked position + * @param pickedPosition - The picked position + * @returns Object containing field names and their values + */ + getFieldsForPickedPosition(pickedPosition: Cartesian3): any; + /** + * Returns the fields for a given feature + * @param featureIndex - Index of the feature whose attributes we want to get + * @returns Object containing field names and their values + */ + getFieldsForFeature(featureIndex: number): any; + } + + /** + * This class implements an I3S statistics for Building Scene Layer. + *

+ * Do not construct this directly, instead access statistics through {@link I3SDataProvider}. + *

+ */ + export class I3SStatistics { + constructor(); + /** + * Gets the resource for the statistics + */ + readonly resource: Resource; + /** + * Gets the I3S data for this object. + */ + readonly data: any; + /** + * Gets the collection of attribute names. + */ + readonly names: string[]; + } + + /** + * This class implements an I3S sublayer for Building Scene Layer. + *

+ * This object is normally not instantiated directly, use {@link I3SSublayer.fromData}. + *

+ */ + export class I3SSublayer { + constructor(); + /** + * Gets the resource for the sublayer + */ + readonly resource: Resource; + /** + * Gets the I3S data for this object. + */ + readonly data: any; + /** + * Gets the name for the sublayer. + */ + readonly name: string; + /** + * Gets the model name for the sublayer. + */ + readonly modelName: string; + /** + * Gets the collection of child sublayers. + */ + readonly sublayers: I3SSublayer[]; + /** + * Gets or sets the sublayer visibility. + */ + visibility: boolean; + /** + * Determines if the sublayer will be shown. + */ + readonly show: boolean; + } + + /** + * This class implements an I3S symbology for I3S Layers. + *

+ * Do not construct this directly, instead access symbology through {@link I3SLayer}. + *

+ */ + export class I3SSymbology { + constructor(); + /** + * Gets the default symbology data. + */ + readonly defaultSymbology: any; + } + + /** + * Methods for loading iTwin platform data into CesiumJS + */ + export namespace ITwinData { + /** + * Create a {@link Cesium3DTileset} for the given iModel id using iTwin's Mesh Export API. + * + * If there is not a completed export available for the given iModel id, the returned promise will resolve to undefined. + * We recommend waiting 10-20 seconds and trying to load the tileset again. + * If all exports are Invalid this will throw an error. + * @example + * const tileset = await Cesium.ITwinData.createTilesetFromIModelId(iModelId); + * if (Cesium.defined(tileset)) { + * viewer.scene.primitives.add(tileset); + * } + * @param iModelId - The id of the iModel to load + * @param [options] - Object containing options to pass to the internally created {@link Cesium3DTileset}. + * @returns A promise that will resolve to the created 3D tileset or undefined if there is no completed export for the given iModel id + */ + function createTilesetFromIModelId( + iModelId: string, + options?: Cesium3DTileset.ConstructorOptions, + ): Promise; + /** + * Create a tileset for the specified reality data id. This function only works + * with 3D Tiles meshes and point clouds. + * + * If the type or rootDocument are not provided this function + * will first request the full metadata for the specified reality data to fill these values. + * @param iTwinId - The id of the iTwin to load data from + * @param realityDataId - The id of the reality data to load + * @param [type] - The type of this reality data + * @param [rootDocument] - The path of the root document for this reality data + */ + function createTilesetForRealityDataId( + iTwinId: string, + realityDataId: string, + type?: ITwinPlatform.RealityDataType, + rootDocument?: string, + ): Promise; + /** + * Create a data source of the correct type for the specified reality data id. + * This function only works for KML and GeoJSON type data. + * + * If the type or rootDocument are not provided this function + * will first request the full metadata for the specified reality data to fill these values. + * @param iTwinId - The id of the iTwin to load data from + * @param realityDataId - The id of the reality data to load + * @param [type] - The type of this reality data + * @param [rootDocument] - The path of the root document for this reality data + */ + function createDataSourceForRealityDataId( + iTwinId: string, + realityDataId: string, + type?: ITwinPlatform.RealityDataType, + rootDocument?: string, + ): Promise; + /** + * Load data from the Geospatial Features API as GeoJSON. + * @param iTwinId - The id of the iTwin to load data from + * @param collectionId - The id of the data collection to load + * @param [limit = 10000] - number of items per page, must be between 1 and 10,000 inclusive + */ + function loadGeospatialFeatures( + iTwinId: string, + collectionId: string, + limit?: number, + ): Promise; + } + + /** + * Properties for managing image-based lighting on tilesets and models. + * Also manages the necessary resources and textures. + *

+ * If specular environment maps are used, {@link ImageBasedLighting#destroy} must be called + * when the image-based lighting is no longer needed to clean up GPU resources properly. + * If a model or tileset creates an instance of ImageBasedLighting, it will handle this. + * Otherwise, the application is responsible for calling destroy(). + *

+ * @param [options.imageBasedLightingFactor = Cartesian2(1.0, 1.0)] - Scales diffuse and specular image-based lighting from the earth, sky, atmosphere and star skybox. + * @param [options.sphericalHarmonicCoefficients] - The third order spherical harmonic coefficients used for the diffuse color of image-based lighting. + * @param [options.specularEnvironmentMaps] - A URL to a KTX2 file that contains a cube map of the specular lighting and the convoluted specular mipmaps. + */ + export class ImageBasedLighting { + constructor(); + /** + * Cesium adds lighting from the earth, sky, atmosphere, and star skybox. + * This cartesian is used to scale the final diffuse and specular lighting + * contribution from those sources to the final color. A value of 0.0 will + * disable those light sources. + */ + imageBasedLightingFactor: Cartesian2; + /** + * The third order spherical harmonic coefficients used for the diffuse color of image-based lighting. When undefined, a diffuse irradiance + * computed from the atmosphere color is used. + *

+ * There are nine Cartesian3 coefficients. + * The order of the coefficients is: L0,0, L1,-1, L1,0, L1,1, L2,-2, L2,-1, L2,0, L2,1, L2,2 + *

+ * + * These values can be obtained by preprocessing the environment map using the cmgen tool of + * {@link https://github.com/google/filament/releases|Google's Filament project}. + * Be sure to use the --no-mirror option in cmgen. + */ + sphericalHarmonicCoefficients: Cartesian3[]; + /** + * A URL to a KTX2 file that contains a cube map of the specular lighting and the convoluted specular mipmaps. + */ + specularEnvironmentMaps: string; + } + + export namespace ImageryLayer { + /** + * A function that is called when an error occurs. + * @param err - An object holding details about the error that occurred. + */ + type ErrorEventCallback = (this: ImageryLayer, err: Error) => void; + /** + * A function that is called when the provider has been created + * @param provider - The created imagery provider. + */ + type ReadyEventCallback = ( + this: ImageryLayer, + provider: ImageryProvider, + ) => void; + /** + * Initialization options for the ImageryLayer constructor. + * @property [rectangle = imageryProvider.rectangle] - The rectangle of the layer. This rectangle + * can limit the visible portion of the imagery provider. + * @property [alpha = 1.0] - The alpha blending value of this layer, from 0.0 to 1.0. + * This can either be a simple number or a function with the signature + * function(frameState, layer, x, y, level). The function is passed the + * current frame state, this layer, and the x, y, and level coordinates of the + * imagery tile for which the alpha is required, and it is expected to return + * the alpha value to use for the tile. + * @property [nightAlpha = 1.0] - The alpha blending value of this layer on the night side of the globe, from 0.0 to 1.0. + * This can either be a simple number or a function with the signature + * function(frameState, layer, x, y, level). The function is passed the + * current frame state, this layer, and the x, y, and level coordinates of the + * imagery tile for which the alpha is required, and it is expected to return + * the alpha value to use for the tile. This only takes effect when enableLighting is true. + * @property [dayAlpha = 1.0] - The alpha blending value of this layer on the day side of the globe, from 0.0 to 1.0. + * This can either be a simple number or a function with the signature + * function(frameState, layer, x, y, level). The function is passed the + * current frame state, this layer, and the x, y, and level coordinates of the + * imagery tile for which the alpha is required, and it is expected to return + * the alpha value to use for the tile. This only takes effect when enableLighting is true. + * @property [brightness = 1.0] - The brightness of this layer. 1.0 uses the unmodified imagery + * color. Less than 1.0 makes the imagery darker while greater than 1.0 makes it brighter. + * This can either be a simple number or a function with the signature + * function(frameState, layer, x, y, level). The function is passed the + * current frame state, this layer, and the x, y, and level coordinates of the + * imagery tile for which the brightness is required, and it is expected to return + * the brightness value to use for the tile. The function is executed for every + * frame and for every tile, so it must be fast. + * @property [contrast = 1.0] - The contrast of this layer. 1.0 uses the unmodified imagery color. + * Less than 1.0 reduces the contrast while greater than 1.0 increases it. + * This can either be a simple number or a function with the signature + * function(frameState, layer, x, y, level). The function is passed the + * current frame state, this layer, and the x, y, and level coordinates of the + * imagery tile for which the contrast is required, and it is expected to return + * the contrast value to use for the tile. The function is executed for every + * frame and for every tile, so it must be fast. + * @property [hue = 0.0] - The hue of this layer. 0.0 uses the unmodified imagery color. + * This can either be a simple number or a function with the signature + * function(frameState, layer, x, y, level). The function is passed the + * current frame state, this layer, and the x, y, and level coordinates + * of the imagery tile for which the hue is required, and it is expected to return + * the contrast value to use for the tile. The function is executed for every + * frame and for every tile, so it must be fast. + * @property [saturation = 1.0] - The saturation of this layer. 1.0 uses the unmodified imagery color. + * Less than 1.0 reduces the saturation while greater than 1.0 increases it. + * This can either be a simple number or a function with the signature + * function(frameState, layer, x, y, level). The function is passed the + * current frame state, this layer, and the x, y, and level coordinates + * of the imagery tile for which the saturation is required, and it is expected to return + * the contrast value to use for the tile. The function is executed for every + * frame and for every tile, so it must be fast. + * @property [gamma = 1.0] - The gamma correction to apply to this layer. 1.0 uses the unmodified imagery color. + * This can either be a simple number or a function with the signature + * function(frameState, layer, x, y, level). The function is passed the + * current frame state, this layer, and the x, y, and level coordinates of the + * imagery tile for which the gamma is required, and it is expected to return + * the gamma value to use for the tile. The function is executed for every + * frame and for every tile, so it must be fast. + * @property [splitDirection = SplitDirection.NONE] - The {@link SplitDirection} split to apply to this layer. + * @property [minificationFilter = TextureMinificationFilter.LINEAR] - The + * texture minification filter to apply to this layer. Possible values + * are TextureMinificationFilter.LINEAR and + * TextureMinificationFilter.NEAREST. + * @property [magnificationFilter = TextureMagnificationFilter.LINEAR] - The + * texture minification filter to apply to this layer. Possible values + * are TextureMagnificationFilter.LINEAR and + * TextureMagnificationFilter.NEAREST. + * @property [show = true] - True if the layer is shown; otherwise, false. + * @property [maximumAnisotropy = maximum supported] - The maximum anisotropy level to use + * for texture filtering. If this parameter is not specified, the maximum anisotropy supported + * by the WebGL stack will be used. Larger values make the imagery look better in horizon + * views. + * @property [minimumTerrainLevel] - The minimum terrain level-of-detail at which to show this imagery layer, + * or undefined to show it at all levels. Level zero is the least-detailed level. + * @property [maximumTerrainLevel] - The maximum terrain level-of-detail at which to show this imagery layer, + * or undefined to show it at all levels. Level zero is the least-detailed level. + * @property [cutoutRectangle] - Cartographic rectangle for cutting out a portion of this ImageryLayer. + * @property [colorToAlpha] - Color to be used as alpha. + * @property [colorToAlphaThreshold = 0.004] - Threshold for color-to-alpha. + */ + type ConstructorOptions = { + rectangle?: Rectangle; + alpha?: number | ((...params: any[]) => any); + nightAlpha?: number | ((...params: any[]) => any); + dayAlpha?: number | ((...params: any[]) => any); + brightness?: number | ((...params: any[]) => any); + contrast?: number | ((...params: any[]) => any); + hue?: number | ((...params: any[]) => any); + saturation?: number | ((...params: any[]) => any); + gamma?: number | ((...params: any[]) => any); + splitDirection?: SplitDirection | ((...params: any[]) => any); + minificationFilter?: TextureMinificationFilter; + magnificationFilter?: TextureMagnificationFilter; + show?: boolean; + maximumAnisotropy?: number; + minimumTerrainLevel?: number; + maximumTerrainLevel?: number; + cutoutRectangle?: Rectangle; + colorToAlpha?: Color; + colorToAlphaThreshold?: number; + }; + /** + * Initialization options for ImageryLayer.fromWorldImagery + * @property [options.style = IonWorldImageryStyle] - The style of base imagery, only AERIAL, AERIAL_WITH_LABELS, and ROAD are currently supported. + */ + type WorldImageryConstructorOptions = ImageryLayer.ConstructorOptions; + } + + /** + * An imagery layer that displays tiled image data from a single imagery provider + * on a {@link Globe}. + * @example + * // Add an OpenStreetMaps layer + * const imageryLayer = new Cesium.ImageryLayer(new Cesium.OpenStreetMapImageryProvider({ + * url: "https://tile.openstreetmap.org/" + * })); + * scene.imageryLayers.add(imageryLayer); + * @example + * // Add Cesium ion's default world imagery layer + * const imageryLayer = Cesium.ImageryLayer.fromWorldImagery(); + * scene.imageryLayers.add(imageryLayer); + * @example + * // Add a new transparent layer from Cesium ion + * const imageryLayer = Cesium.ImageryLayer.fromProviderAsync(Cesium.IonImageryProvider.fromAssetId(3812)); + * imageryLayer.alpha = 0.5; + * scene.imageryLayers.add(imageryLayer); + * @param [imageryProvider] - The imagery provider to use. + * @param [options] - An object describing initialization options + */ + export class ImageryLayer { + constructor( + imageryProvider?: ImageryProvider, + options?: ImageryLayer.ConstructorOptions, + ); + /** + * The alpha blending value of this layer, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. + */ + alpha: number; + /** + * The alpha blending value of this layer on the night side of the globe, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. This only takes effect when {@link Globe#enableLighting} is true. + */ + nightAlpha: number; + /** + * The alpha blending value of this layer on the day side of the globe, with 0.0 representing fully transparent and + * 1.0 representing fully opaque. This only takes effect when {@link Globe#enableLighting} is true. + */ + dayAlpha: number; + /** + * The brightness of this layer. 1.0 uses the unmodified imagery color. Less than 1.0 + * makes the imagery darker while greater than 1.0 makes it brighter. + */ + brightness: number; + /** + * The contrast of this layer. 1.0 uses the unmodified imagery color. Less than 1.0 reduces + * the contrast while greater than 1.0 increases it. + */ + contrast: number; + /** + * The hue of this layer in radians. 0.0 uses the unmodified imagery color. + */ + hue: number; + /** + * The saturation of this layer. 1.0 uses the unmodified imagery color. Less than 1.0 reduces the + * saturation while greater than 1.0 increases it. + */ + saturation: number; + /** + * The gamma correction to apply to this layer. 1.0 uses the unmodified imagery color. + */ + gamma: number; + /** + * The {@link SplitDirection} to apply to this layer. + */ + splitDirection: SplitDirection; + /** + * The {@link TextureMinificationFilter} to apply to this layer. + * Possible values are {@link TextureMinificationFilter.LINEAR} (the default) + * and {@link TextureMinificationFilter.NEAREST}. + * + * To take effect, this property must be set immediately after adding the imagery layer. + * Once a texture is loaded it won't be possible to change the texture filter used. + */ + minificationFilter: TextureMinificationFilter; + /** + * The {@link TextureMagnificationFilter} to apply to this layer. + * Possible values are {@link TextureMagnificationFilter.LINEAR} (the default) + * and {@link TextureMagnificationFilter.NEAREST}. + * + * To take effect, this property must be set immediately after adding the imagery layer. + * Once a texture is loaded it won't be possible to change the texture filter used. + */ + magnificationFilter: TextureMagnificationFilter; + /** + * Determines if this layer is shown. + */ + show: boolean; + /** + * Rectangle cutout in this layer of imagery. + */ + cutoutRectangle: Rectangle; + /** + * Color value that should be set to transparent. + */ + colorToAlpha: Color; + /** + * Normalized (0-1) threshold for color-to-alpha. + */ + colorToAlphaThreshold: number; + /** + * Gets the imagery provider for this layer. This should not be called before {@link ImageryLayer#ready} returns true. + */ + readonly imageryProvider: ImageryProvider; + /** + * Returns true when the terrain provider has been successfully created. Otherwise, returns false. + */ + readonly ready: boolean; + /** + * Gets an event that is raised when the imagery provider has been successfully created. Event listeners + * are passed the created instance of {@link ImageryProvider}. + */ + readonly readyEvent: Event; + /** + * Gets the rectangle of this layer. If this rectangle is smaller than the rectangle of the + * {@link ImageryProvider}, only a portion of the imagery provider is shown. + */ + readonly rectangle: Rectangle; + /** + * This value is used as the default brightness for the imagery layer if one is not provided during construction + * or by the imagery provider. This value does not modify the brightness of the imagery. + */ + static DEFAULT_BRIGHTNESS: number; + /** + * This value is used as the default contrast for the imagery layer if one is not provided during construction + * or by the imagery provider. This value does not modify the contrast of the imagery. + */ + static DEFAULT_CONTRAST: number; + /** + * This value is used as the default hue for the imagery layer if one is not provided during construction + * or by the imagery provider. This value does not modify the hue of the imagery. + */ + static DEFAULT_HUE: number; + /** + * This value is used as the default saturation for the imagery layer if one is not provided during construction + * or by the imagery provider. This value does not modify the saturation of the imagery. + */ + static DEFAULT_SATURATION: number; + /** + * This value is used as the default gamma for the imagery layer if one is not provided during construction + * or by the imagery provider. This value does not modify the gamma of the imagery. + */ + static DEFAULT_GAMMA: number; + /** + * This value is used as the default split for the imagery layer if one is not provided during construction + * or by the imagery provider. + */ + static DEFAULT_SPLIT: SplitDirection; + /** + * This value is used as the default texture minification filter for the imagery layer if one is not provided + * during construction or by the imagery provider. + */ + static DEFAULT_MINIFICATION_FILTER: TextureMinificationFilter; + /** + * This value is used as the default texture magnification filter for the imagery layer if one is not provided + * during construction or by the imagery provider. + */ + static DEFAULT_MAGNIFICATION_FILTER: TextureMagnificationFilter; + /** + * This value is used as the default threshold for color-to-alpha if one is not provided + * during construction or by the imagery provider. + */ + static DEFAULT_APPLY_COLOR_TO_ALPHA_THRESHOLD: number; + /** + * Create a new imagery layer from an asynchronous imagery provider. The layer will handle any asynchronous loads or errors, and begin rendering the imagery layer once ready. + * @example + * // Create a new base layer + * const viewer = new Cesium.Viewer("cesiumContainer", { + * baseLayer: Cesium.ImageryLayer.fromProviderAsync(Cesium.IonImageryProvider.fromAssetId(3812)); + * }); + * @example + * // Add a new transparent layer + * const imageryLayer = Cesium.ImageryLayer.fromProviderAsync(Cesium.IonImageryProvider.fromAssetId(3812)); + * imageryLayer.alpha = 0.5; + * viewer.imageryLayers.add(imageryLayer); + * @example + * // Handle loading events + * const imageryLayer = Cesium.ImageryLayer.fromProviderAsync(Cesium.IonImageryProvider.fromAssetId(3812)); + * viewer.imageryLayers.add(imageryLayer); + * + * imageryLayer.readyEvent.addEventListener(provider => { + * imageryLayer.provider.errorEvent.addEventListener(error => { + * alert(`Encountered an error while loading imagery tiles! ${error}`); + * }); + * }); + * + * imageryLayer.errorEvent.addEventListener(error => { + * alert(`Encountered an error while creating an imagery layer! ${error}`); + * }); + * @param imageryProviderPromise - A promise which resolves to a imagery provider + * @param [options] - An object describing initialization options + * @returns The created imagery layer. + */ + static fromProviderAsync( + imageryProviderPromise: Promise, + options?: ImageryLayer.ConstructorOptions, + ): ImageryLayer; + /** + * Create a new imagery layer for ion's default global base imagery layer, currently Bing Maps. The layer will handle any asynchronous loads or errors, and begin rendering the imagery layer once ready. + * @example + * // Add a new transparent layer + * const imageryLayer = Cesium.ImageryLayer.fromWorldImagery(); + * imageryLayer.alpha = 0.5; + * viewer.imageryLayers.add(imageryLayer); + * @example + * // Handle loading events + * const imageryLayer = Cesium.ImageryLayer.fromWorldImagery(); + * viewer.imageryLayers.add(imageryLayer); + * + * imageryLayer.readyEvent.addEventListener(provider => { + * imageryLayer.provider.errorEvent.addEventListener(error => { + * alert(`Encountered an error while loading imagery tiles! ${error}`); + * }); + * }); + * + * imageryLayer.errorEvent.addEventListener(error => { + * alert(`Encountered an error while creating an imagery layer! ${error}`); + * }); + * @param options - An object describing initialization options + * @returns The created imagery layer. + * + * * @example + * // Create a new base layer + * const viewer = new Cesium.Viewer("cesiumContainer", { + * baseLayer: Cesium.ImageryLayer.fromWorldImagery(); + * }); + */ + static fromWorldImagery( + options: ImageryLayer.WorldImageryConstructorOptions, + ): ImageryLayer; + /** + * Gets a value indicating whether this layer is the base layer in the + * {@link ImageryLayerCollection}. The base layer is the one that underlies all + * others. It is special in that it is treated as if it has global rectangle, even if + * it actually does not, by stretching the texels at the edges over the entire + * globe. + * @returns true if this is the base layer; otherwise, false. + */ + isBaseLayer(): boolean; + /** + * Returns true if this object was destroyed; otherwise, false. + *

+ * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

+ * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * imageryLayer = imageryLayer && imageryLayer.destroy(); + */ + destroy(): void; + /** + * Computes the intersection of this layer's rectangle with the imagery provider's availability rectangle, + * producing the overall bounds of imagery that can be produced by this layer. + * @example + * // Zoom to an imagery layer. + * const imageryRectangle = imageryLayer.getImageryRectangle(); + * scene.camera.flyTo({ + * destination: rectangle + * }); + * @returns A rectangle which defines the overall bounds of imagery that can be produced by this layer. + */ + getImageryRectangle(): Rectangle; + } + + /** + * An ordered collection of imagery layers. + */ + export class ImageryLayerCollection { + constructor(); + /** + * An event that is raised when a layer is added to the collection. Event handlers are passed the layer that + * was added and the index at which it was added. + */ + layerAdded: Event; + /** + * An event that is raised when a layer is removed from the collection. Event handlers are passed the layer that + * was removed and the index from which it was removed. + */ + layerRemoved: Event; + /** + * An event that is raised when a layer changes position in the collection. Event handlers are passed the layer that + * was moved, its new index after the move, and its old index prior to the move. + */ + layerMoved: Event; + /** + * An event that is raised when a layer is shown or hidden by setting the + * {@link ImageryLayer#show} property. Event handlers are passed a reference to this layer, + * the index of the layer in the collection, and a flag that is true if the layer is now + * shown or false if it is now hidden. + */ + layerShownOrHidden: Event; + /** + * Gets the number of layers in this collection. + */ + length: number; + /** + * Adds a layer to the collection. + * @example + * const imageryLayer = Cesium.ImageryLayer.fromWorldImagery(); + * scene.imageryLayers.add(imageryLayer); + * @example + * const imageryLayer = Cesium.ImageryLayer.fromProviderAsync(Cesium.IonImageryProvider.fromAssetId(3812)); + * scene.imageryLayers.add(imageryLayer); + * @param layer - the layer to add. + * @param [index] - the index to add the layer at. If omitted, the layer will + * be added on top of all existing layers. + */ + add(layer: ImageryLayer, index?: number): void; + /** + * Creates a new layer using the given ImageryProvider and adds it to the collection. + * @example + * try { + * const provider = await Cesium.IonImageryProvider.fromAssetId(3812); + * scene.imageryLayers.addImageryProvider(provider); + * } catch (error) { + * console.log(`There was an error creating the imagery layer. ${error}`) + * } + * @param imageryProvider - the imagery provider to create a new layer for. + * @param [index] - the index to add the layer at. If omitted, the layer will + * added on top of all existing layers. + * @returns The newly created layer. + */ + addImageryProvider( + imageryProvider: ImageryProvider, + index?: number, + ): ImageryLayer; + /** + * Removes a layer from this collection, if present. + * @param layer - The layer to remove. + * @param [destroy = true] - whether to destroy the layers in addition to removing them. + * @returns true if the layer was in the collection and was removed, + * false if the layer was not in the collection. + */ + remove(layer: ImageryLayer, destroy?: boolean): boolean; + /** + * Removes all layers from this collection. + * @param [destroy = true] - whether to destroy the layers in addition to removing them. + */ + removeAll(destroy?: boolean): void; + /** + * Checks to see if the collection contains a given layer. + * @param layer - the layer to check for. + * @returns true if the collection contains the layer, false otherwise. + */ + contains(layer: ImageryLayer): boolean; + /** + * Determines the index of a given layer in the collection. + * @param layer - The layer to find the index of. + * @returns The index of the layer in the collection, or -1 if the layer does not exist in the collection. + */ + indexOf(layer: ImageryLayer): number; + /** + * Gets a layer by index from the collection. + * @param index - the index to retrieve. + * @returns The imagery layer at the given index. + */ + get(index: number): ImageryLayer; + /** + * Raises a layer up one position in the collection. + * @param layer - the layer to move. + */ + raise(layer: ImageryLayer): void; + /** + * Lowers a layer down one position in the collection. + * @param layer - the layer to move. + */ + lower(layer: ImageryLayer): void; + /** + * Raises a layer to the top of the collection. + * @param layer - the layer to move. + */ + raiseToTop(layer: ImageryLayer): void; + /** + * Lowers a layer to the bottom of the collection. + * @param layer - the layer to move. + */ + lowerToBottom(layer: ImageryLayer): void; + /** + * Determines the imagery layers that are intersected by a pick ray. To compute a pick ray from a + * location on the screen, use {@link Camera.getPickRay}. + * @param ray - The ray to test for intersection. + * @param scene - The scene. + * @returns An array that includes all of + * the layers that are intersected by a given pick ray. Undefined if + * no layers are selected. + */ + pickImageryLayers(ray: Ray, scene: Scene): ImageryLayer[] | undefined; + /** + * Asynchronously determines the imagery layer features that are intersected by a pick ray. The intersected imagery + * layer features are found by invoking {@link ImageryProvider#pickFeatures} for each imagery layer tile intersected + * by the pick ray. To compute a pick ray from a location on the screen, use {@link Camera.getPickRay}. + * @example + * const pickRay = viewer.camera.getPickRay(windowPosition); + * const featuresPromise = viewer.imageryLayers.pickImageryLayerFeatures(pickRay, viewer.scene); + * if (!Cesium.defined(featuresPromise)) { + * console.log('No features picked.'); + * } else { + * Promise.resolve(featuresPromise).then(function(features) { + * // This function is called asynchronously when the list if picked features is available. + * console.log(`Number of features: ${features.length}`); + * if (features.length > 0) { + * console.log(`First feature name: ${features[0].name}`); + * } + * }); + * } + * @param ray - The ray to test for intersection. + * @param scene - The scene. + * @returns A promise that resolves to an array of features intersected by the pick ray. + * If it can be quickly determined that no features are intersected (for example, + * because no active imagery providers support {@link ImageryProvider#pickFeatures} + * or because the pick ray does not intersect the surface), this function will + * return undefined. + */ + pickImageryLayerFeatures( + ray: Ray, + scene: Scene, + ): Promise | undefined; + /** + * Returns true if this object was destroyed; otherwise, false. + *

+ * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by all layers in this collection. Explicitly destroying this + * object allows for deterministic release of WebGL resources, instead of relying on the garbage + * collector. + *

+ * Once this object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * layerCollection = layerCollection && layerCollection.destroy(); + */ + destroy(): void; + } + + /** + * Describes a rasterized feature, such as a point, polygon, polyline, etc., in an imagery layer. + */ + export class ImageryLayerFeatureInfo { + constructor(); + /** + * Gets or sets the name of the feature. + */ + name: string | undefined; + /** + * Gets or sets an HTML description of the feature. The HTML is not trusted and should + * be sanitized before display to the user. + */ + description: string | undefined; + /** + * Gets or sets the position of the feature, or undefined if the position is not known. + */ + position: Cartographic | undefined; + /** + * Gets or sets the raw data describing the feature. The raw data may be in any + * number of formats, such as GeoJSON, KML, etc. + */ + data: any | undefined; + /** + * Gets or sets the image layer of the feature. + */ + imageryLayer: any | undefined; + /** + * Configures the name of this feature by selecting an appropriate property. The name will be obtained from + * one of the following sources, in this order: 1) the property with the name 'name', 2) the property with the name 'title', + * 3) the first property containing the word 'name', 4) the first property containing the word 'title'. If + * the name cannot be obtained from any of these sources, the existing name will be left unchanged. + * @param properties - An object literal containing the properties of the feature. + */ + configureNameFromProperties(properties: any): void; + /** + * Configures the description of this feature by creating an HTML table of properties and their values. + * @param properties - An object literal containing the properties of the feature. + */ + configureDescriptionFromProperties(properties: any): void; + } + + /** + * The format in which {@link ImageryProvider} methods return an image may + * vary by provider, configuration, or server settings. Most common are + * HTMLImageElement, HTMLCanvasElement, or on supported + * browsers, ImageBitmap. + * + * See the documentation for each ImageryProvider class for more information about how they return images. + */ + export type ImageryTypes = HTMLImageElement | HTMLCanvasElement | ImageBitmap; + + /** + * Provides imagery to be displayed on the surface of an ellipsoid. This type describes an + * interface and is not intended to be instantiated directly. + */ + export class ImageryProvider { + constructor(); + /** + * Gets the rectangle, in radians, of the imagery provided by the instance. + */ + readonly rectangle: Rectangle; + /** + * Gets the width of each tile, in pixels. + */ + readonly tileWidth: number; + /** + * Gets the height of each tile, in pixels. + */ + readonly tileHeight: number; + /** + * Gets the maximum level-of-detail that can be requested. + */ + readonly maximumLevel: number | undefined; + /** + * Gets the minimum level-of-detail that can be requested. Generally, + * a minimum level should only be used when the rectangle of the imagery is small + * enough that the number of tiles at the minimum level is small. An imagery + * provider with more than a few tiles at the minimum level will lead to + * rendering problems. + */ + readonly minimumLevel: number; + /** + * Gets the tiling scheme used by the provider. + */ + readonly tilingScheme: TilingScheme; + /** + * Gets the tile discard policy. If not undefined, the discard policy is responsible + * for filtering out "missing" tiles via its shouldDiscardImage function. If this function + * returns undefined, no tiles are filtered. + */ + readonly tileDiscardPolicy: TileDiscardPolicy; + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + */ + readonly errorEvent: Event; + /** + * Gets the credit to display when this imagery provider is active. Typically this is used to credit + * the source of the imagery. + */ + readonly credit: Credit; + /** + * Gets the proxy used by this provider. + */ + readonly proxy: Proxy; + /** + * Gets a value indicating whether or not the images provided by this imagery provider + * include an alpha channel. If this property is false, an alpha channel, if present, will + * be ignored. If this property is true, any images without an alpha channel will be treated + * as if their alpha is 1.0 everywhere. When this property is false, memory usage + * and texture upload time are reduced. + */ + readonly hasAlphaChannel: boolean; + /** + * Gets the credits to be displayed when a given tile is displayed. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level; + * @returns The credits to be displayed when the tile is displayed. + */ + getTileCredits(x: number, y: number, level: number): Credit[]; + /** + * Requests the image for a given tile. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param [request] - The request object. Intended for internal use only. + * @returns Returns a promise for the image that will resolve when the image is available, or + * undefined if there are too many active requests to the server, and the request should be retried later. + */ + requestImage( + x: number, + y: number, + level: number, + request?: Request, + ): Promise | undefined; + /** + * Asynchronously determines what features, if any, are located at a given longitude and latitude within + * a tile. + * This function is optional, so it may not exist on all ImageryProviders. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param longitude - The longitude at which to pick features. + * @param latitude - The latitude at which to pick features. + * @returns A promise for the picked features that will resolve when the asynchronous + * picking completes. The resolved value is an array of {@link ImageryLayerFeatureInfo} + * instances. The array may be empty if no features are found at the given location. + * It may also be undefined if picking is not supported. + */ + pickFeatures( + x: number, + y: number, + level: number, + longitude: number, + latitude: number, + ): Promise | undefined; + /** + * Loads an image from a given URL. If the server referenced by the URL already has + * too many requests pending, this function will instead return undefined, indicating + * that the request should be retried later. + * @param imageryProvider - The imagery provider for the URL. + * @param url - The URL of the image. + * @returns A promise for the image that will resolve when the image is available, or + * undefined if there are too many active requests to the server, and the request should be retried later. + */ + static loadImage( + imageryProvider: ImageryProvider, + url: Resource | string, + ): Promise | undefined; + } + + export namespace IonImageryProvider { + /** + * Initialization options for the TileMapServiceImageryProvider constructor + * @property [accessToken = Ion.defaultAccessToken] - The access token to use. + * @property [server = Ion.defaultServer] - The resource to the Cesium ion API server. + */ + type ConstructorOptions = { + accessToken?: string; + server?: string | Resource; + }; + } + + /** + *
+ * To construct a IonImageryProvider, call {@link IonImageryProvider.fromAssetId}. Do not call the constructor directly. + *
+ * + * Provides tiled imagery using the Cesium ion REST API. + * @example + * const imageryLayer = Cesium.ImageryLayer.fromProviderAsync(Cesium.IonImageryProvider.fromAssetId(3812)); + * viewer.imageryLayers.add(imageryLayer); + * @param [options] - Object describing initialization options + */ + export class IonImageryProvider { + constructor(options?: IonImageryProvider.ConstructorOptions); + /** + * Gets the rectangle, in radians, of the imagery provided by the instance. + */ + readonly rectangle: Rectangle; + /** + * Gets the width of each tile, in pixels. + */ + readonly tileWidth: number; + /** + * Gets the height of each tile, in pixels. + */ + readonly tileHeight: number; + /** + * Gets the maximum level-of-detail that can be requested. + */ + readonly maximumLevel: number | undefined; + /** + * Gets the minimum level-of-detail that can be requested. Generally, + * a minimum level should only be used when the rectangle of the imagery is small + * enough that the number of tiles at the minimum level is small. An imagery + * provider with more than a few tiles at the minimum level will lead to + * rendering problems. + */ + readonly minimumLevel: number; + /** + * Gets the tiling scheme used by the provider. + */ + readonly tilingScheme: TilingScheme; + /** + * Gets the tile discard policy. If not undefined, the discard policy is responsible + * for filtering out "missing" tiles via its shouldDiscardImage function. If this function + * returns undefined, no tiles are filtered. + */ + readonly tileDiscardPolicy: TileDiscardPolicy; + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + */ + readonly errorEvent: Event; + /** + * Gets the credit to display when this imagery provider is active. Typically this is used to credit + * the source of the imagery. + */ + readonly credit: Credit; + /** + * Gets a value indicating whether or not the images provided by this imagery provider + * include an alpha channel. If this property is false, an alpha channel, if present, will + * be ignored. If this property is true, any images without an alpha channel will be treated + * as if their alpha is 1.0 everywhere. When this property is false, memory usage + * and texture upload time are reduced. + */ + readonly hasAlphaChannel: boolean; + /** + * Gets the proxy used by this provider. + */ + readonly proxy: Proxy; + /** + * Creates a provider for tiled imagery using the Cesium ion REST API. + * @example + * const imageryLayer = Cesium.ImageryLayer.fromProviderAsync(Cesium.IonImageryProvider.fromAssetId(3812)); + * viewer.imageryLayers.add(imageryLayer); + * @param assetId - An ion imagery asset ID. + * @param [options] - Object describing initialization options. + * @returns A promise which resolves to the created IonImageryProvider. + */ + static fromAssetId( + assetId: number, + options?: IonImageryProvider.ConstructorOptions, + ): Promise; + /** + * Gets the credits to be displayed when a given tile is displayed. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level; + * @returns The credits to be displayed when the tile is displayed. + */ + getTileCredits(x: number, y: number, level: number): Credit[]; + /** + * Requests the image for a given tile. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param [request] - The request object. Intended for internal use only. + * @returns A promise for the image that will resolve when the image is available, or + * undefined if there are too many active requests to the server, and the request should be retried later. + */ + requestImage( + x: number, + y: number, + level: number, + request?: Request, + ): Promise | undefined; + /** + * Asynchronously determines what features, if any, are located at a given longitude and latitude within + * a tile. This function is optional, so it may not exist on all ImageryProviders. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param longitude - The longitude at which to pick features. + * @param latitude - The latitude at which to pick features. + * @returns A promise for the picked features that will resolve when the asynchronous + * picking completes. The resolved value is an array of {@link ImageryLayerFeatureInfo} + * instances. The array may be empty if no features are found at the given location. + * It may also be undefined if picking is not supported. + */ + pickFeatures( + x: number, + y: number, + level: number, + longitude: number, + latitude: number, + ): Promise | undefined; + } + + /** + * The types of imagery provided by {@link createWorldImagery}. + */ + export enum IonWorldImageryStyle { + /** + * Aerial imagery. + */ + AERIAL = 2, + /** + * Aerial imagery with a road overlay. + */ + AERIAL_WITH_LABELS = 3, + /** + * Roads without additional imagery. + */ + ROAD = 4, + } + + export namespace Label { + /** + * Initialization options for the Label constructor + * @property position - The cartesian position of the label. + * @property [id] - A user-defined object to return when the label is picked with {@link Scene#pick}. + * @property [show = true] - Determines if this label will be shown. + * @property [text] - A string specifying the text of the label. + * @property [font = '30px sans-serif'] - A string specifying the font used to draw this label. Fonts are specified using the same syntax as the CSS 'font' property. + * @property [style = LabelStyle.FILL] - A {@link LabelStyle} specifying the style of the label. + * @property [scale = 1.0] - A number specifying the uniform scale that is multiplied with the label size. + * @property [showBackground = false] - Determines if a background behind this label will be shown. + * @property [backgroundColor = new Color(0.165, 0.165, 0.165, 0.8)] - A {@link Color} specifying the background color of the label. + * @property [backgroundPadding = new Cartesian2(7, 5)] - A {@link Cartesian2} Specifying the horizontal and vertical background padding in pixels. + * @property [pixelOffset = Cartesian2.ZERO] - A {@link Cartesian2} specifying the pixel offset in screen space from the origin of this label. + * @property [eyeOffset = Cartesian3.ZERO] - A {@link Cartesian3} specifying the 3D Cartesian offset applied to this label in eye coordinates. + * @property [horizontalOrigin = HorizontalOrigin.LEFT] - A {@link HorizontalOrigin} specifying the horizontal origin of this label. + * @property [verticalOrigin = VerticalOrigin.BASELINE] - A {@link VerticalOrigin} specifying the vertical origin of this label. + * @property [heightReference = HeightReference.NONE] - A {@link HeightReference} specifying the height reference of this label. + * @property [fillColor = Color.WHITE] - A {@link Color} specifying the fill color of the label. + * @property [outlineColor = Color.BLACK] - A {@link Color} specifying the outline color of the label. + * @property [outlineWidth = 1.0] - A number specifying the outline width of the label. + * @property [translucencyByDistance] - A {@link NearFarScalar} specifying near and far translucency properties of the label based on the label's distance from the camera. + * @property [pixelOffsetScaleByDistance] - A {@link NearFarScalar} specifying near and far pixel offset scaling properties of the label based on the label's distance from the camera. + * @property [scaleByDistance] - A {@link NearFarScalar} specifying near and far scaling properties of the label based on the label's distance from the camera. + * @property [distanceDisplayCondition] - A {@link DistanceDisplayCondition} specifying at what distance from the camera that this label will be displayed. + * @property [disableDepthTestDistance] - A number specifying the distance from the camera at which to disable the depth test to, for example, prevent clipping against terrain. + */ + type ConstructorOptions = { + position: Cartesian3; + id?: any; + show?: boolean; + text?: string; + font?: string; + style?: LabelStyle; + scale?: number; + showBackground?: boolean; + backgroundColor?: Color; + backgroundPadding?: Cartesian2; + pixelOffset?: Cartesian2; + eyeOffset?: Cartesian3; + horizontalOrigin?: HorizontalOrigin; + verticalOrigin?: VerticalOrigin; + heightReference?: HeightReference; + fillColor?: Color; + outlineColor?: Color; + outlineWidth?: number; + translucencyByDistance?: NearFarScalar; + pixelOffsetScaleByDistance?: NearFarScalar; + scaleByDistance?: NearFarScalar; + distanceDisplayCondition?: DistanceDisplayCondition; + disableDepthTestDistance?: number; + }; + } + + /** + *
+ * Create labels by calling {@link LabelCollection#add}. Do not call the constructor directly. + *
+ * @param options - Object describing initialization options + * @param labelCollection - Instance of LabelCollection + */ + export class Label { + constructor( + options: Label.ConstructorOptions, + labelCollection: LabelCollection, + ); + /** + * Determines if this label will be shown. Use this to hide or show a label, instead + * of removing it and re-adding it to the collection. + */ + show: boolean; + /** + * Gets or sets the Cartesian position of this label. + */ + position: Cartesian3; + /** + * Gets or sets the height reference of this billboard. + */ + heightReference: HeightReference; + /** + * Gets or sets the text of this label. + */ + text: string; + /** + * Gets or sets the font used to draw this label. Fonts are specified using the same syntax as the CSS 'font' property. + */ + font: string; + /** + * Gets or sets the fill color of this label. + */ + fillColor: Color; + /** + * Gets or sets the outline color of this label. + */ + outlineColor: Color; + /** + * Gets or sets the outline width of this label. + */ + outlineWidth: number; + /** + * Determines if a background behind this label will be shown. + */ + showBackground: boolean; + /** + * Gets or sets the background color of this label. + */ + backgroundColor: Color; + /** + * Gets or sets the background padding, in pixels, of this label. The x value + * controls horizontal padding, and the y value controls vertical padding. + */ + backgroundPadding: Cartesian2; + /** + * Gets or sets the style of this label. + */ + style: LabelStyle; + /** + * Gets or sets the pixel offset in screen space from the origin of this label. This is commonly used + * to align multiple labels and billboards at the same position, e.g., an image and text. The + * screen space origin is the top, left corner of the canvas; x increases from + * left to right, and y increases from top to bottom. + *

+ *
+ * + * + * + *
default
l.pixeloffset = new Cartesian2(25, 75);
+ * The label's origin is indicated by the yellow point. + *
+ */ + pixelOffset: Cartesian2; + /** + * Gets or sets near and far translucency properties of a Label based on the Label's distance from the camera. + * A label's translucency will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the label's translucency remains clamped to the nearest bound. If undefined, + * translucencyByDistance will be disabled. + * @example + * // Example 1. + * // Set a label's translucencyByDistance to 1.0 when the + * // camera is 1500 meters from the label and disappear as + * // the camera distance approaches 8.0e6 meters. + * text.translucencyByDistance = new Cesium.NearFarScalar(1.5e2, 1.0, 8.0e6, 0.0); + * @example + * // Example 2. + * // disable translucency by distance + * text.translucencyByDistance = undefined; + */ + translucencyByDistance: NearFarScalar; + /** + * Gets or sets near and far pixel offset scaling properties of a Label based on the Label's distance from the camera. + * A label's pixel offset will be scaled between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the label's pixel offset scaling remains clamped to the nearest bound. If undefined, + * pixelOffsetScaleByDistance will be disabled. + * @example + * // Example 1. + * // Set a label's pixel offset scale to 0.0 when the + * // camera is 1500 meters from the label and scale pixel offset to 10.0 pixels + * // in the y direction the camera distance approaches 8.0e6 meters. + * text.pixelOffset = new Cesium.Cartesian2(0.0, 1.0); + * text.pixelOffsetScaleByDistance = new Cesium.NearFarScalar(1.5e2, 0.0, 8.0e6, 10.0); + * @example + * // Example 2. + * // disable pixel offset by distance + * text.pixelOffsetScaleByDistance = undefined; + */ + pixelOffsetScaleByDistance: NearFarScalar; + /** + * Gets or sets near and far scaling properties of a Label based on the label's distance from the camera. + * A label's scale will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the label's scale remains clamped to the nearest bound. If undefined, + * scaleByDistance will be disabled. + * @example + * // Example 1. + * // Set a label's scaleByDistance to scale by 1.5 when the + * // camera is 1500 meters from the label and disappear as + * // the camera distance approaches 8.0e6 meters. + * label.scaleByDistance = new Cesium.NearFarScalar(1.5e2, 1.5, 8.0e6, 0.0); + * @example + * // Example 2. + * // disable scaling by distance + * label.scaleByDistance = undefined; + */ + scaleByDistance: NearFarScalar; + /** + * Gets and sets the 3D Cartesian offset applied to this label in eye coordinates. Eye coordinates is a left-handed + * coordinate system, where x points towards the viewer's right, y points up, and + * z points into the screen. Eye coordinates use the same scale as world and model coordinates, + * which is typically meters. + *

+ * An eye offset is commonly used to arrange multiple label or objects at the same position, e.g., to + * arrange a label above its corresponding 3D model. + *

+ * Below, the label is positioned at the center of the Earth but an eye offset makes it always + * appear on top of the Earth regardless of the viewer's or Earth's orientation. + *

+ *
+ * + * + * + *
+ * l.eyeOffset = new Cartesian3(0.0, 8000000.0, 0.0);

+ *
+ */ + eyeOffset: Cartesian3; + /** + * Gets or sets the horizontal origin of this label, which determines if the label is drawn + * to the left, center, or right of its anchor position. + *

+ *
+ *
+ *
+ * @example + * // Use a top, right origin + * l.horizontalOrigin = Cesium.HorizontalOrigin.RIGHT; + * l.verticalOrigin = Cesium.VerticalOrigin.TOP; + */ + horizontalOrigin: HorizontalOrigin; + /** + * Gets or sets the vertical origin of this label, which determines if the label is + * to the above, below, or at the center of its anchor position. + *

+ *
+ *
+ *
+ * @example + * // Use a top, right origin + * l.horizontalOrigin = Cesium.HorizontalOrigin.RIGHT; + * l.verticalOrigin = Cesium.VerticalOrigin.TOP; + */ + verticalOrigin: VerticalOrigin; + /** + * Gets or sets the uniform scale that is multiplied with the label's size in pixels. + * A scale of 1.0 does not change the size of the label; a scale greater than + * 1.0 enlarges the label; a positive scale less than 1.0 shrinks + * the label. + *

+ * Applying a large scale value may pixelate the label. To make text larger without pixelation, + * use a larger font size when calling {@link Label#font} instead. + *

+ *
+ *
+ * From left to right in the above image, the scales are 0.5, 1.0, + * and 2.0. + *
+ */ + scale: number; + /** + * Gets the total scale of the label, which is the label's scale multiplied by the computed relative size + * of the desired font compared to the generated glyph size. + */ + totalScale: number; + /** + * Gets or sets the condition specifying at what distance from the camera that this label will be displayed. + */ + distanceDisplayCondition: DistanceDisplayCondition; + /** + * Gets or sets the distance from the camera at which to disable the depth test to, for example, prevent clipping against terrain. + * When set to zero, the depth test is always applied. When set to Number.POSITIVE_INFINITY, the depth test is never applied. + */ + disableDepthTestDistance: number; + /** + * Gets or sets the user-defined value returned when the label is picked. + */ + id: any; + /** + * Computes the screen-space position of the label's origin, taking into account eye and pixel offsets. + * The screen space origin is the top, left corner of the canvas; x increases from + * left to right, and y increases from top to bottom. + * @example + * console.log(l.computeScreenSpacePosition(scene).toString()); + * @param scene - The scene the label is in. + * @param [result] - The object onto which to store the result. + * @returns The screen-space position of the label. + */ + computeScreenSpacePosition(scene: Scene, result?: Cartesian2): Cartesian2; + /** + * Determines if this label equals another label. Labels are equal if all their properties + * are equal. Labels in different collections can be equal. + * @param [other] - The label to compare for equality. + * @returns true if the labels are equal; otherwise, false. + */ + equals(other?: Label): boolean; + /** + * Returns true if this object was destroyed; otherwise, false. + *

+ * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Determines whether or not run the algorithm, that match the text of the label to right-to-left languages + * @example + * // Example 1. + * // Set a label's rightToLeft before init + * Cesium.Label.enableRightToLeftDetection = true; + * const myLabelEntity = viewer.entities.add({ + * label: { + * id: 'my label', + * text: 'זה טקסט בעברית \n ועכשיו יורדים שורה', + * } + * }); + * @example + * // Example 2. + * const myLabelEntity = viewer.entities.add({ + * label: { + * id: 'my label', + * text: 'English text' + * } + * }); + * // Set a label's rightToLeft after init + * Cesium.Label.enableRightToLeftDetection = true; + * myLabelEntity.text = 'טקסט חדש'; + */ + static enableRightToLeftDetection: boolean; + } + + /** + * A renderable collection of labels. Labels are viewport-aligned text positioned in the 3D scene. + * Each label can have a different font, color, scale, etc. + *

+ *
+ *
+ * Example labels + *
+ *

+ * Labels are added and removed from the collection using {@link LabelCollection#add} + * and {@link LabelCollection#remove}. + * @example + * // Create a label collection with two labels + * const labels = scene.primitives.add(new Cesium.LabelCollection()); + * labels.add({ + * position : new Cesium.Cartesian3(1.0, 2.0, 3.0), + * text : 'A label' + * }); + * labels.add({ + * position : new Cesium.Cartesian3(4.0, 5.0, 6.0), + * text : 'Another label' + * }); + * @param [options] - Object with the following properties: + * @param [options.modelMatrix = Matrix4.IDENTITY] - The 4x4 transformation matrix that transforms each label from model to world coordinates. + * @param [options.debugShowBoundingVolume = false] - For debugging only. Determines if this primitive's commands' bounding spheres are shown. + * @param [options.scene] - Must be passed in for labels that use the height reference property or will be depth tested against the globe. + * @param [options.blendOption = BlendOption.OPAQUE_AND_TRANSLUCENT] - The label blending option. The default + * is used for rendering both opaque and translucent labels. However, if either all of the labels are completely opaque or all are completely translucent, + * setting the technique to BlendOption.OPAQUE or BlendOption.TRANSLUCENT can improve performance by up to 2x. + * @param [options.show = true] - Determines if the labels in the collection will be shown. + */ + export class LabelCollection { + constructor(options?: { + modelMatrix?: Matrix4; + debugShowBoundingVolume?: boolean; + scene?: Scene; + blendOption?: BlendOption; + show?: boolean; + }); + /** + * Determines if labels in this collection will be shown. + */ + show: boolean; + /** + * The 4x4 transformation matrix that transforms each label in this collection from model to world coordinates. + * When this is the identity matrix, the labels are drawn in world coordinates, i.e., Earth's WGS84 coordinates. + * Local reference frames can be used by providing a different transformation matrix, like that returned + * by {@link Transforms.eastNorthUpToFixedFrame}. + * @example + * const center = Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883); + * labels.modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(center); + * labels.add({ + * position : new Cesium.Cartesian3(0.0, 0.0, 0.0), + * text : 'Center' + * }); + * labels.add({ + * position : new Cesium.Cartesian3(1000000.0, 0.0, 0.0), + * text : 'East' + * }); + * labels.add({ + * position : new Cesium.Cartesian3(0.0, 1000000.0, 0.0), + * text : 'North' + * }); + * labels.add({ + * position : new Cesium.Cartesian3(0.0, 0.0, 1000000.0), + * text : 'Up' + * }); + */ + modelMatrix: Matrix4; + /** + * This property is for debugging only; it is not for production use nor is it optimized. + *

+ * Draws the bounding sphere for each draw command in the primitive. + *

+ */ + debugShowBoundingVolume: boolean; + /** + * The label blending option. The default is used for rendering both opaque and translucent labels. + * However, if either all of the labels are completely opaque or all are completely translucent, + * setting the technique to BlendOption.OPAQUE or BlendOption.TRANSLUCENT can improve + * performance by up to 2x. + */ + blendOption: BlendOption; + /** + * Returns the number of labels in this collection. This is commonly used with + * {@link LabelCollection#get} to iterate over all the labels + * in the collection. + */ + readonly length: number; + /** + * Creates and adds a label with the specified initial properties to the collection. + * The added label is returned so it can be modified or removed from the collection later. + * @example + * // Example 1: Add a label, specifying all the default values. + * const l = labels.add({ + * show : true, + * position : Cesium.Cartesian3.ZERO, + * text : '', + * font : '30px sans-serif', + * fillColor : Cesium.Color.WHITE, + * outlineColor : Cesium.Color.BLACK, + * outlineWidth : 1.0, + * showBackground : false, + * backgroundColor : new Cesium.Color(0.165, 0.165, 0.165, 0.8), + * backgroundPadding : new Cesium.Cartesian2(7, 5), + * style : Cesium.LabelStyle.FILL, + * pixelOffset : Cesium.Cartesian2.ZERO, + * eyeOffset : Cesium.Cartesian3.ZERO, + * horizontalOrigin : Cesium.HorizontalOrigin.LEFT, + * verticalOrigin : Cesium.VerticalOrigin.BASELINE, + * scale : 1.0, + * translucencyByDistance : undefined, + * pixelOffsetScaleByDistance : undefined, + * heightReference : HeightReference.NONE, + * distanceDisplayCondition : undefined + * }); + * @example + * // Example 2: Specify only the label's cartographic position, + * // text, and font. + * const l = labels.add({ + * position : Cesium.Cartesian3.fromRadians(longitude, latitude, height), + * text : 'Hello World', + * font : '24px Helvetica', + * }); + * @param [options] - A template describing the label's properties as shown in Example 1. + * @returns The label that was added to the collection. + */ + add(options?: Label.ConstructorOptions): Label; + /** + * Removes a label from the collection. Once removed, a label is no longer usable. + * @example + * const l = labels.add(...); + * labels.remove(l); // Returns true + * @param label - The label to remove. + * @returns true if the label was removed; false if the label was not found in the collection. + */ + remove(label: Label): boolean; + /** + * Removes all labels from the collection. + * @example + * labels.add(...); + * labels.add(...); + * labels.removeAll(); + */ + removeAll(): void; + /** + * Check whether this collection contains a given label. + * @param label - The label to check for. + * @returns true if this collection contains the label, false otherwise. + */ + contains(label: Label): boolean; + /** + * Returns the label in the collection at the specified index. Indices are zero-based + * and increase as labels are added. Removing a label shifts all labels after + * it to the left, changing their indices. This function is commonly used with + * {@link LabelCollection#length} to iterate over all the labels + * in the collection. + * @example + * // Toggle the show property of every label in the collection + * const len = labels.length; + * for (let i = 0; i < len; ++i) { + * const l = billboards.get(i); + * l.show = !l.show; + * } + * @param index - The zero-based index of the billboard. + * @returns The label at the specified index. + */ + get(index: number): Label; + /** + * Returns true if this object was destroyed; otherwise, false. + *

+ * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

+ * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * labels = labels && labels.destroy(); + */ + destroy(): void; + } + + /** + * Describes how to draw a label. + */ + export enum LabelStyle { + /** + * Fill the text of the label, but do not outline. + */ + FILL = 0, + /** + * Outline the text of the label, but do not fill. + */ + OUTLINE = 1, + /** + * Fill and outline the text of the label. + */ + FILL_AND_OUTLINE = 2, + } + + /** + * A light source. This type describes an interface and is not intended to be instantiated directly. Together, color and intensity produce a high-dynamic-range light color. intensity can also be used individually to dim or brighten the light without changing the hue. + */ + export class Light { + constructor(); + /** + * The color of the light. + */ + color: Color; + /** + * The intensity controls the strength of the light. intensity has a minimum value of 0.0 and no maximum value. + */ + intensity: number; + } + + /** + * Describes how the map will operate in 2D. + */ + export enum MapMode2D { + /** + * The 2D map can be rotated about the z axis. + */ + ROTATE = 0, + /** + * The 2D map can be scrolled infinitely in the horizontal direction. + */ + INFINITE_SCROLL = 1, + } + + export namespace MapboxImageryProvider { + /** + * Initialization options for the MapboxImageryProvider constructor + * @property [url = 'https://api.mapbox.com/v4/'] - The Mapbox server url. + * @property mapId - The Mapbox Map ID. + * @property accessToken - The public access token for the imagery. + * @property [format = 'png'] - The format of the image request. + * @property [ellipsoid = Ellipsoid.default] - The ellipsoid. If not specified, the default ellipsoid is used. + * @property [minimumLevel = 0] - The minimum level-of-detail supported by the imagery provider. Take care when specifying + * this that the number of tiles at the minimum level is small, such as four or less. A larger number is likely + * to result in rendering problems. + * @property [maximumLevel] - The maximum level-of-detail supported by the imagery provider, or undefined if there is no limit. + * @property [rectangle = Rectangle.MAX_VALUE] - The rectangle, in radians, covered by the image. + * @property [credit] - A credit for the data source, which is displayed on the canvas. + */ + type ConstructorOptions = { + url?: string; + mapId: string; + accessToken: string; + format?: string; + ellipsoid?: Ellipsoid; + minimumLevel?: number; + maximumLevel?: number; + rectangle?: Rectangle; + credit?: Credit | string; + }; + } + + /** + * Provides tiled imagery hosted by Mapbox. + * @example + * // Mapbox tile provider + * const mapbox = new Cesium.MapboxImageryProvider({ + * mapId: 'mapbox.mapbox-terrain-v2', + * accessToken: 'thisIsMyAccessToken' + * }); + * @param options - Object describing initialization options + */ + export class MapboxImageryProvider { + constructor(options: MapboxImageryProvider.ConstructorOptions); + /** + * Gets the URL of the Mapbox server. + */ + readonly url: string; + /** + * Gets the rectangle, in radians, of the imagery provided by the instance. + */ + readonly rectangle: Rectangle; + /** + * Gets the width of each tile, in pixels. + */ + readonly tileWidth: number; + /** + * Gets the height of each tile, in pixels. + */ + readonly tileHeight: number; + /** + * Gets the maximum level-of-detail that can be requested. + */ + readonly maximumLevel: number | undefined; + /** + * Gets the minimum level-of-detail that can be requested. Generally, + * a minimum level should only be used when the rectangle of the imagery is small + * enough that the number of tiles at the minimum level is small. An imagery + * provider with more than a few tiles at the minimum level will lead to + * rendering problems. + */ + readonly minimumLevel: number; + /** + * Gets the tiling scheme used by the provider. + */ + readonly tilingScheme: TilingScheme; + /** + * Gets the tile discard policy. If not undefined, the discard policy is responsible + * for filtering out "missing" tiles via its shouldDiscardImage function. If this function + * returns undefined, no tiles are filtered. + */ + readonly tileDiscardPolicy: TileDiscardPolicy; + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error.. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + */ + readonly errorEvent: Event; + /** + * Gets the credit to display when this imagery provider is active. Typically this is used to credit + * the source of the imagery. + */ + readonly credit: Credit; + /** + * Gets the proxy used by this provider. + */ + readonly proxy: Proxy; + /** + * Gets a value indicating whether or not the images provided by this imagery provider + * include an alpha channel. If this property is false, an alpha channel, if present, will + * be ignored. If this property is true, any images without an alpha channel will be treated + * as if their alpha is 1.0 everywhere. When this property is false, memory usage + * and texture upload time are reduced. + */ + readonly hasAlphaChannel: boolean; + /** + * Gets the credits to be displayed when a given tile is displayed. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level; + * @returns The credits to be displayed when the tile is displayed. + */ + getTileCredits(x: number, y: number, level: number): Credit[]; + /** + * Requests the image for a given tile. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param [request] - The request object. Intended for internal use only. + * @returns A promise for the image that will resolve when the image is available, or + * undefined if there are too many active requests to the server, and the request should be retried later. + */ + requestImage( + x: number, + y: number, + level: number, + request?: Request, + ): Promise | undefined; + /** + * Asynchronously determines what features, if any, are located at a given longitude and latitude within + * a tile. This function is optional, so it may not exist on all ImageryProviders. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param longitude - The longitude at which to pick features. + * @param latitude - The latitude at which to pick features. + * @returns A promise for the picked features that will resolve when the asynchronous + * picking completes. The resolved value is an array of {@link ImageryLayerFeatureInfo} + * instances. The array may be empty if no features are found at the given location. + * It may also be undefined if picking is not supported. + */ + pickFeatures( + x: number, + y: number, + level: number, + longitude: number, + latitude: number, + ): Promise | undefined; + } + + export namespace MapboxStyleImageryProvider { + /** + * Initialization options for the MapboxStyleImageryProvider constructor + * @property [url = 'https://api.mapbox.com/styles/v1/'] - The Mapbox server url. + * @property [username = 'mapbox'] - The username of the map account. + * @property styleId - The Mapbox Style ID. + * @property accessToken - The public access token for the imagery. + * @property [tilesize = 512] - The size of the image tiles. + * @property [scaleFactor] - Determines if tiles are rendered at a @2x scale factor. + * @property [ellipsoid = Ellipsoid.default] - The ellipsoid. If not specified, the default ellipsoid is used. + * @property [minimumLevel = 0] - The minimum level-of-detail supported by the imagery provider. Take care when specifying + * this that the number of tiles at the minimum level is small, such as four or less. A larger number is likely + * to result in rendering problems. + * @property [maximumLevel] - The maximum level-of-detail supported by the imagery provider, or undefined if there is no limit. + * @property [rectangle = Rectangle.MAX_VALUE] - The rectangle, in radians, covered by the image. + * @property [credit] - A credit for the data source, which is displayed on the canvas. + */ + type ConstructorOptions = { + url?: Resource | string; + username?: string; + styleId: string; + accessToken: string; + tilesize?: number; + scaleFactor?: boolean; + ellipsoid?: Ellipsoid; + minimumLevel?: number; + maximumLevel?: number; + rectangle?: Rectangle; + credit?: Credit | string; + }; + } + + /** + * Provides tiled imagery hosted by Mapbox. + * @example + * // Mapbox style provider + * const mapbox = new Cesium.MapboxStyleImageryProvider({ + * styleId: 'streets-v11', + * accessToken: 'thisIsMyAccessToken' + * }); + * @param options - Object describing initialization options + */ + export class MapboxStyleImageryProvider { + constructor(options: MapboxStyleImageryProvider.ConstructorOptions); + /** + * Gets the URL of the Mapbox server. + */ + readonly url: string; + /** + * Gets the rectangle, in radians, of the imagery provided by the instance. + */ + readonly rectangle: Rectangle; + /** + * Gets the width of each tile, in pixels. + */ + readonly tileWidth: number; + /** + * Gets the height of each tile, in pixels. + */ + readonly tileHeight: number; + /** + * Gets the maximum level-of-detail that can be requested. + */ + readonly maximumLevel: number | undefined; + /** + * Gets the minimum level-of-detail that can be requested. Generally, + * a minimum level should only be used when the rectangle of the imagery is small + * enough that the number of tiles at the minimum level is small. An imagery + * provider with more than a few tiles at the minimum level will lead to + * rendering problems. + */ + readonly minimumLevel: number; + /** + * Gets the tiling scheme used by the provider. + */ + readonly tilingScheme: TilingScheme; + /** + * Gets the tile discard policy. If not undefined, the discard policy is responsible + * for filtering out "missing" tiles via its shouldDiscardImage function. If this function + * returns undefined, no tiles are filtered. + */ + readonly tileDiscardPolicy: TileDiscardPolicy; + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error.. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + */ + readonly errorEvent: Event; + /** + * Gets the credit to display when this imagery provider is active. Typically this is used to credit + * the source of the imagery. + */ + readonly credit: Credit; + /** + * Gets the proxy used by this provider. + */ + readonly proxy: Proxy; + /** + * Gets a value indicating whether or not the images provided by this imagery provider + * include an alpha channel. If this property is false, an alpha channel, if present, will + * be ignored. If this property is true, any images without an alpha channel will be treated + * as if their alpha is 1.0 everywhere. When this property is false, memory usage + * and texture upload time are reduced. + */ + readonly hasAlphaChannel: boolean; + /** + * Gets the credits to be displayed when a given tile is displayed. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level; + * @returns The credits to be displayed when the tile is displayed. + */ + getTileCredits(x: number, y: number, level: number): Credit[]; + /** + * Requests the image for a given tile. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param [request] - The request object. Intended for internal use only. + * @returns A promise for the image that will resolve when the image is available, or + * undefined if there are too many active requests to the server, and the request should be retried later. + */ + requestImage( + x: number, + y: number, + level: number, + request?: Request, + ): Promise | undefined; + /** + * Asynchronously determines what features, if any, are located at a given longitude and latitude within + * a tile. This function is optional, so it may not exist on all ImageryProviders. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param longitude - The longitude at which to pick features. + * @param latitude - The latitude at which to pick features. + * @returns A promise for the picked features that will resolve when the asynchronous + * picking completes. The resolved value is an array of {@link ImageryLayerFeatureInfo} + * instances. The array may be empty if no features are found at the given location. + * It may also be undefined if picking is not supported. + */ + pickFeatures( + x: number, + y: number, + level: number, + longitude: number, + latitude: number, + ): Promise | undefined; + } + + /** + * A Material defines surface appearance through a combination of diffuse, specular, + * normal, emission, and alpha components. These values are specified using a + * JSON schema called Fabric which gets parsed and assembled into glsl shader code + * behind-the-scenes. Check out the {@link https://github.com/CesiumGS/cesium/wiki/Fabric|wiki page} + * for more details on Fabric. + *

+ * + * + * Base material types and their uniforms: + *
+ *
    + *
  • Color
  • + *
      + *
    • color: rgba color object.
    • + *
    + *
  • Image
  • + *
      + *
    • image: path to image.
    • + *
    • repeat: Object with x and y values specifying the number of times to repeat the image.
    • + *
    + *
  • DiffuseMap
  • + *
      + *
    • image: path to image.
    • + *
    • channels: Three character string containing any combination of r, g, b, and a for selecting the desired image channels.
    • + *
    • repeat: Object with x and y values specifying the number of times to repeat the image.
    • + *
    + *
  • AlphaMap
  • + *
      + *
    • image: path to image.
    • + *
    • channel: One character string containing r, g, b, or a for selecting the desired image channel.
    • + *
    • repeat: Object with x and y values specifying the number of times to repeat the image.
    • + *
    + *
  • SpecularMap
  • + *
      + *
    • image: path to image.
    • + *
    • channel: One character string containing r, g, b, or a for selecting the desired image channel.
    • + *
    • repeat: Object with x and y values specifying the number of times to repeat the image.
    • + *
    + *
  • EmissionMap
  • + *
      + *
    • image: path to image.
    • + *
    • channels: Three character string containing any combination of r, g, b, and a for selecting the desired image channels.
    • + *
    • repeat: Object with x and y values specifying the number of times to repeat the image.
    • + *
    + *
  • BumpMap
  • + *
      + *
    • image: path to image.
    • + *
    • channel: One character string containing r, g, b, or a for selecting the desired image channel.
    • + *
    • repeat: Object with x and y values specifying the number of times to repeat the image.
    • + *
    • strength: Bump strength value between 0.0 and 1.0 where 0.0 is small bumps and 1.0 is large bumps.
    • + *
    + *
  • NormalMap
  • + *
      + *
    • image: path to image.
    • + *
    • channels: Three character string containing any combination of r, g, b, and a for selecting the desired image channels.
    • + *
    • repeat: Object with x and y values specifying the number of times to repeat the image.
    • + *
    • strength: Bump strength value between 0.0 and 1.0 where 0.0 is small bumps and 1.0 is large bumps.
    • + *
    + *
  • Grid
  • + *
      + *
    • color: rgba color object for the whole material.
    • + *
    • cellAlpha: Alpha value for the cells between grid lines. This will be combined with color.alpha.
    • + *
    • lineCount: Object with x and y values specifying the number of columns and rows respectively.
    • + *
    • lineThickness: Object with x and y values specifying the thickness of grid lines (in pixels where available).
    • + *
    • lineOffset: Object with x and y values specifying the offset of grid lines (range is 0 to 1).
    • + *
    + *
  • Stripe
  • + *
      + *
    • horizontal: Boolean that determines if the stripes are horizontal or vertical.
    • + *
    • evenColor: rgba color object for the stripe's first color.
    • + *
    • oddColor: rgba color object for the stripe's second color.
    • + *
    • offset: Number that controls at which point into the pattern to begin drawing; with 0.0 being the beginning of the even color, 1.0 the beginning of the odd color, 2.0 being the even color again, and any multiple or fractional values being in between.
    • + *
    • repeat: Number that controls the total number of stripes, half light and half dark.
    • + *
    + *
  • Checkerboard
  • + *
      + *
    • lightColor: rgba color object for the checkerboard's light alternating color.
    • + *
    • darkColor: rgba color object for the checkerboard's dark alternating color.
    • + *
    • repeat: Object with x and y values specifying the number of columns and rows respectively.
    • + *
    + *
  • Dot
  • + *
      + *
    • lightColor: rgba color object for the dot color.
    • + *
    • darkColor: rgba color object for the background color.
    • + *
    • repeat: Object with x and y values specifying the number of columns and rows of dots respectively.
    • + *
    + *
  • Water
  • + *
      + *
    • baseWaterColor: rgba color object base color of the water.
    • + *
    • blendColor: rgba color object used when blending from water to non-water areas.
    • + *
    • specularMap: Single channel texture used to indicate areas of water.
    • + *
    • normalMap: Normal map for water normal perturbation.
    • + *
    • frequency: Number that controls the number of waves.
    • + *
    • animationSpeed: Number that controls the animations speed of the water.
    • + *
    • amplitude: Number that controls the amplitude of water waves.
    • + *
    • specularIntensity: Number that controls the intensity of specular reflections.
    • + *
    + *
  • RimLighting
  • + *
      + *
    • color: diffuse color and alpha.
    • + *
    • rimColor: diffuse color and alpha of the rim.
    • + *
    • width: Number that determines the rim's width.
    • + *
    + *
  • Fade
  • + *
      + *
    • fadeInColor: diffuse color and alpha at time
    • + *
    • fadeOutColor: diffuse color and alpha at maximumDistance from time
    • + *
    • maximumDistance: Number between 0.0 and 1.0 where the fadeInColor becomes the fadeOutColor. A value of 0.0 gives the entire material a color of fadeOutColor and a value of 1.0 gives the the entire material a color of fadeInColor
    • + *
    • repeat: true if the fade should wrap around the texture coodinates.
    • + *
    • fadeDirection: Object with x and y values specifying if the fade should be in the x and y directions.
    • + *
    • time: Object with x and y values between 0.0 and 1.0 of the fadeInColor position
    • + *
    + *
  • PolylineArrow
  • + *
      + *
    • color: diffuse color and alpha.
    • + *
    + *
  • PolylineDash
  • + *
      + *
    • color: color for the line.
    • + *
    • gapColor: color for the gaps in the line.
    • + *
    • dashLength: Dash length in pixels.
    • + *
    • dashPattern: The 16 bit stipple pattern for the line..
    • + *
    + *
  • PolylineGlow
  • + *
      + *
    • color: color and maximum alpha for the glow on the line.
    • + *
    • glowPower: strength of the glow, as a percentage of the total line width (less than 1.0).
    • + *
    • taperPower: strength of the tapering effect, as a percentage of the total line length. If 1.0 or higher, no taper effect is used.
    • + *
    + *
  • PolylineOutline
  • + *
      + *
    • color: diffuse color and alpha for the interior of the line.
    • + *
    • outlineColor: diffuse color and alpha for the outline.
    • + *
    • outlineWidth: width of the outline in pixels.
    • + *
    + *
  • ElevationContour
  • + *
      + *
    • color: color and alpha for the contour line.
    • + *
    • spacing: spacing for contour lines in meters.
    • + *
    • width: Number specifying the width of the grid lines in pixels.
    • + *
    + *
  • ElevationRamp
  • + *
      + *
    • image: color ramp image to use for coloring the terrain.
    • + *
    • minimumHeight: minimum height for the ramp.
    • + *
    • maximumHeight: maximum height for the ramp.
    • + *
    + *
  • SlopeRamp
  • + *
      + *
    • image: color ramp image to use for coloring the terrain by slope.
    • + *
    + *
  • AspectRamp
  • + *
      + *
    • image: color ramp image to use for color the terrain by aspect.
    • + *
    + *
  • ElevationBand
  • + *
      + *
    • heights: image of heights sorted from lowest to highest.
    • + *
    • colors: image of colors at the corresponding heights.
    • + *
    + *
  • WaterMask
  • + *
      + *
    • waterColor: diffuse color and alpha for the areas covered by water.
    • + *
    • landColor: diffuse color and alpha for the areas covered by land.
    • + *
    + *
+ * + *
+ * @example + * // Create a color material with fromType: + * polygon.material = Cesium.Material.fromType('Color'); + * polygon.material.uniforms.color = new Cesium.Color(1.0, 1.0, 0.0, 1.0); + * + * // Create the default material: + * polygon.material = new Cesium.Material(); + * + * // Create a color material with full Fabric notation: + * polygon.material = new Cesium.Material({ + * fabric: { + * type: 'Color', + * uniforms: { + * color: new Cesium.Color(1.0, 1.0, 0.0, 1.0) + * } + * } + * }); + * @param [options] - Object with the following properties: + * @param [options.strict = false] - Throws errors for issues that would normally be ignored, including unused uniforms or materials. + * @param [options.translucent = true] - When true or a function that returns true, the geometry + * with this material is expected to appear translucent. + * @param [options.minificationFilter = TextureMinificationFilter.LINEAR] - The {@link TextureMinificationFilter} to apply to this material's textures. + * @param [options.magnificationFilter = TextureMagnificationFilter.LINEAR] - The {@link TextureMagnificationFilter} to apply to this material's textures. + * @param options.fabric - The fabric JSON used to generate the material. + */ + export class Material { + constructor(options?: { + strict?: boolean; + translucent?: boolean | ((...params: any[]) => any); + minificationFilter?: TextureMinificationFilter; + magnificationFilter?: TextureMagnificationFilter; + fabric: any; + }); + /** + * The material type. Can be an existing type or a new type. If no type is specified in fabric, type is a GUID. + */ + type: string; + /** + * The glsl shader source for this material. + */ + shaderSource: string; + /** + * Maps sub-material names to Material objects. + */ + materials: any; + /** + * Maps uniform names to their values. + */ + uniforms: any; + /** + * When true or a function that returns true, + * the geometry is expected to appear translucent. + */ + translucent: boolean | ((...params: any[]) => any); + /** + * Creates a new material using an existing material type. + *

+ * Shorthand for: new Material({fabric : {type : type}}); + * @example + * const material = Cesium.Material.fromType('Color', { + * color: new Cesium.Color(1.0, 0.0, 0.0, 1.0) + * }); + * @param type - The base material type. + * @param [uniforms] - Overrides for the default uniforms. + * @returns New material object. + */ + static fromType(type: string, uniforms?: any): Material; + /** + * Gets whether or not this material is translucent. + * @returns true if this material is translucent, false otherwise. + */ + isTranslucent(): boolean; + /** + * Returns true if this object was destroyed; otherwise, false. + *

+ * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

+ * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * material = material && material.destroy(); + */ + destroy(): void; + /** + * Gets or sets the default texture uniform value. + */ + static DefaultImageId: string; + /** + * Gets or sets the default cube map texture uniform value. + */ + static DefaultCubeMapId: string; + /** + * Gets the name of the color material. + */ + static readonly ColorType: string; + /** + * Gets the name of the image material. + */ + static readonly ImageType: string; + /** + * Gets the name of the diffuce map material. + */ + static readonly DiffuseMapType: string; + /** + * Gets the name of the alpha map material. + */ + static readonly AlphaMapType: string; + /** + * Gets the name of the specular map material. + */ + static readonly SpecularMapType: string; + /** + * Gets the name of the emmision map material. + */ + static readonly EmissionMapType: string; + /** + * Gets the name of the bump map material. + */ + static readonly BumpMapType: string; + /** + * Gets the name of the normal map material. + */ + static readonly NormalMapType: string; + /** + * Gets the name of the grid material. + */ + static readonly GridType: string; + /** + * Gets the name of the stripe material. + */ + static readonly StripeType: string; + /** + * Gets the name of the checkerboard material. + */ + static readonly CheckerboardType: string; + /** + * Gets the name of the dot material. + */ + static readonly DotType: string; + /** + * Gets the name of the water material. + */ + static readonly WaterType: string; + /** + * Gets the name of the rim lighting material. + */ + static readonly RimLightingType: string; + /** + * Gets the name of the fade material. + */ + static readonly FadeType: string; + /** + * Gets the name of the polyline arrow material. + */ + static readonly PolylineArrowType: string; + /** + * Gets the name of the polyline glow material. + */ + static readonly PolylineDashType: string; + /** + * Gets the name of the polyline glow material. + */ + static readonly PolylineGlowType: string; + /** + * Gets the name of the polyline outline material. + */ + static readonly PolylineOutlineType: string; + /** + * Gets the name of the elevation contour material. + */ + static readonly ElevationContourType: string; + /** + * Gets the name of the elevation contour material. + */ + static readonly ElevationRampType: string; + /** + * Gets the name of the slope ramp material. + */ + static readonly SlopeRampMaterialType: string; + /** + * Gets the name of the aspect ramp material. + */ + static readonly AspectRampMaterialType: string; + /** + * Gets the name of the elevation band material. + */ + static readonly ElevationBandType: string; + /** + * Gets the name of the water mask material. + */ + static readonly WaterMaskType: string; + } + + /** + * An appearance for arbitrary geometry (as opposed to {@link EllipsoidSurfaceAppearance}, for example) + * that supports shading with materials. + * @example + * const primitive = new Cesium.Primitive({ + * geometryInstances : new Cesium.GeometryInstance({ + * geometry : new Cesium.WallGeometry({ + * materialSupport : Cesium.MaterialAppearance.MaterialSupport.BASIC.vertexFormat, + * // ... + * }) + * }), + * appearance : new Cesium.MaterialAppearance({ + * material : Cesium.Material.fromType('Color'), + * faceForward : true + * }) + * + * }); + * @param [options] - Object with the following properties: + * @param [options.flat = false] - When true, flat shading is used in the fragment shader, which means lighting is not taking into account. + * @param [options.faceForward = !options.closed] - When true, the fragment shader flips the surface normal as needed to ensure that the normal faces the viewer to avoid dark spots. This is useful when both sides of a geometry should be shaded like {@link WallGeometry}. + * @param [options.translucent = true] - When true, the geometry is expected to appear translucent so {@link MaterialAppearance#renderState} has alpha blending enabled. + * @param [options.closed = false] - When true, the geometry is expected to be closed so {@link MaterialAppearance#renderState} has backface culling enabled. + * @param [options.materialSupport = MaterialAppearance.MaterialSupport.TEXTURED] - The type of materials that will be supported. + * @param [options.material = Material.ColorType] - The material used to determine the fragment color. + * @param [options.vertexShaderSource] - Optional GLSL vertex shader source to override the default vertex shader. + * @param [options.fragmentShaderSource] - Optional GLSL fragment shader source to override the default fragment shader. + * @param [options.renderState] - Optional render state to override the default render state. + */ + export class MaterialAppearance { + constructor(options?: { + flat?: boolean; + faceForward?: boolean; + translucent?: boolean; + closed?: boolean; + materialSupport?: MaterialAppearance.MaterialSupportType; + material?: Material; + vertexShaderSource?: string; + fragmentShaderSource?: string; + renderState?: any; + }); + /** + * The material used to determine the fragment color. Unlike other {@link MaterialAppearance} + * properties, this is not read-only, so an appearance's material can change on the fly. + */ + material: Material; + /** + * When true, the geometry is expected to appear translucent. + */ + translucent: boolean; + /** + * The GLSL source code for the vertex shader. + */ + readonly vertexShaderSource: string; + /** + * The GLSL source code for the fragment shader. The full fragment shader + * source is built procedurally taking into account {@link MaterialAppearance#material}, + * {@link MaterialAppearance#flat}, and {@link MaterialAppearance#faceForward}. + * Use {@link MaterialAppearance#getFragmentShaderSource} to get the full source. + */ + readonly fragmentShaderSource: string; + /** + * The WebGL fixed-function state to use when rendering the geometry. + *

+ * The render state can be explicitly defined when constructing a {@link MaterialAppearance} + * instance, or it is set implicitly via {@link MaterialAppearance#translucent} + * and {@link MaterialAppearance#closed}. + *

+ */ + readonly renderState: any; + /** + * When true, the geometry is expected to be closed so + * {@link MaterialAppearance#renderState} has backface culling enabled. + * If the viewer enters the geometry, it will not be visible. + */ + readonly closed: boolean; + /** + * The type of materials supported by this instance. This impacts the required + * {@link VertexFormat} and the complexity of the vertex and fragment shaders. + */ + readonly materialSupport: MaterialAppearance.MaterialSupportType; + /** + * The {@link VertexFormat} that this appearance instance is compatible with. + * A geometry can have more vertex attributes and still be compatible - at a + * potential performance cost - but it can't have less. + */ + readonly vertexFormat: VertexFormat; + /** + * When true, flat shading is used in the fragment shader, + * which means lighting is not taking into account. + */ + readonly flat: boolean; + /** + * When true, the fragment shader flips the surface normal + * as needed to ensure that the normal faces the viewer to avoid + * dark spots. This is useful when both sides of a geometry should be + * shaded like {@link WallGeometry}. + */ + readonly faceForward: boolean; + /** + * Procedurally creates the full GLSL fragment shader source. For {@link MaterialAppearance}, + * this is derived from {@link MaterialAppearance#fragmentShaderSource}, {@link MaterialAppearance#material}, + * {@link MaterialAppearance#flat}, and {@link MaterialAppearance#faceForward}. + * @returns The full GLSL fragment shader source. + */ + getFragmentShaderSource(): string; + /** + * Determines if the geometry is translucent based on {@link MaterialAppearance#translucent} and {@link Material#isTranslucent}. + * @returns true if the appearance is translucent. + */ + isTranslucent(): boolean; + /** + * Creates a render state. This is not the final render state instance; instead, + * it can contain a subset of render state properties identical to the render state + * created in the context. + * @returns The render state. + */ + getRenderState(): any; + } + + export namespace MaterialAppearance { + type MaterialSupportType = { + vertexFormat: VertexFormat; + vertexShaderSource: string; + fragmentShaderSource: string; + }; + /** + * Determines the type of {@link Material} that is supported by a + * {@link MaterialAppearance} instance. This is a trade-off between + * flexibility (a wide array of materials) and memory/performance + * (required vertex format and GLSL shader complexity. + */ + namespace MaterialSupport { + /** + * Only basic materials, which require just position and + * normal vertex attributes, are supported. + */ + const BASIC: MaterialAppearance.MaterialSupportType; + /** + * Materials with textures, which require position, + * normal, and st vertex attributes, + * are supported. The vast majority of materials fall into this category. + */ + const TEXTURED: MaterialAppearance.MaterialSupportType; + /** + * All materials, including those that work in tangent space, are supported. + * This requires position, normal, st, + * tangent, and bitangent vertex attributes. + */ + const ALL: MaterialAppearance.MaterialSupportType; + } + } + + /** + * A metadata class. + * + *

+ * See the {@link https://github.com/CesiumGS/3d-tiles/tree/main/specification/Metadata|3D Metadata Specification} for 3D Tiles + *

+ * @param options - Object with the following properties: + * @param options.id - The ID of the class. + * @param [options.name] - The name of the class. + * @param [options.description] - The description of the class. + * @param [options.properties] - The class properties, where each key is the property ID. + * @param [options.extras] - Extra user-defined properties. + * @param [options.extensions] - An object containing extensions. + */ + export class MetadataClass { + constructor(options: { + id: string; + name?: string; + description?: string; + properties?: { + [key: string]: MetadataClassProperty; + }; + extras?: any; + extensions?: any; + }); + /** + * The class properties. + */ + readonly properties: { + [key: string]: MetadataClassProperty; + }; + /** + * The ID of the class. + */ + readonly id: string; + /** + * The name of the class. + */ + readonly name: string; + /** + * The description of the class. + */ + readonly description: string; + /** + * Extra user-defined properties. + */ + readonly extras: any; + /** + * An object containing extensions. + */ + readonly extensions: any; + } + + /** + * A metadata property, as part of a {@link MetadataClass}. + *

+ * See the {@link https://github.com/CesiumGS/3d-tiles/tree/main/specification/Metadata|3D Metadata Specification} for 3D Tiles + *

+ * @param options - Object with the following properties: + * @param options.id - The ID of the property. + * @param options.type - The type of the property such as SCALAR, VEC2, VEC3. + * @param [options.componentType] - The component type of the property. This includes integer (e.g. INT8 or UINT16), and floating point (FLOAT32 and FLOAT64) values. + * @param [options.enumType] - The enum type of the property. Only defined when type is ENUM. + * @param [options.isArray = false] - True if a property is an array (either fixed length or variable length), false otherwise. + * @param [options.isVariableLengthArray = false] - True if a property is a variable length array, false otherwise. + * @param [options.arrayLength] - The number of array elements. Only defined for fixed length arrays. + * @param [options.normalized = false] - Whether the property is normalized. + * @param [options.min] - A number or an array of numbers storing the minimum allowable value of this property. Only defined when type is a numeric type. + * @param [options.max] - A number or an array of numbers storing the maximum allowable value of this property. Only defined when type is a numeric type. + * @param [options.offset] - The offset to be added to property values as part of the value transform. + * @param [options.scale] - The scale to be multiplied to property values as part of the value transform. + * @param [options.noData] - The no-data sentinel value that represents null values. + * @param [options.default] - A default value to use when an entity's property value is not defined. + * @param [options.required = false] - Whether the property is required. + * @param [options.name] - The name of the property. + * @param [options.description] - The description of the property. + * @param [options.semantic] - An identifier that describes how this property should be interpreted. + * @param [options.extras] - Extra user-defined properties. + * @param [options.extensions] - An object containing extensions. + */ + export class MetadataClassProperty { + constructor(options: { + id: string; + type: MetadataType; + componentType?: MetadataComponentType; + enumType?: MetadataEnum; + isArray?: boolean; + isVariableLengthArray?: boolean; + arrayLength?: number; + normalized?: boolean; + min?: number | number[] | number[][]; + max?: number | number[] | number[][]; + offset?: number | number[] | number[][]; + scale?: number | number[] | number[][]; + noData?: boolean | number | string | any[]; + default?: boolean | number | string | any[]; + required?: boolean; + name?: string; + description?: string; + semantic?: string; + extras?: any; + extensions?: any; + }); + /** + * The ID of the property. + */ + readonly id: string; + /** + * The name of the property. + */ + readonly name: string; + /** + * The description of the property. + */ + readonly description: string; + /** + * The type of the property such as SCALAR, VEC2, VEC3 + */ + readonly type: MetadataType; + /** + * The enum type of the property. Only defined when type is ENUM. + */ + readonly enumType: MetadataEnum; + /** + * The component type of the property. This includes integer + * (e.g. INT8 or UINT16), and floating point (FLOAT32 and FLOAT64) values + */ + readonly componentType: MetadataComponentType; + /** + * True if a property is an array (either fixed length or variable length), + * false otherwise. + */ + readonly isArray: boolean; + /** + * True if a property is a variable length array, false otherwise. + */ + readonly isVariableLengthArray: boolean; + /** + * The number of array elements. Only defined for fixed-size + * arrays. + */ + readonly arrayLength: number; + /** + * Whether the property is normalized. + */ + readonly normalized: boolean; + /** + * A number or an array of numbers storing the maximum allowable value of this property. Only defined when type is a numeric type. + */ + readonly max: number | number[] | number[][]; + /** + * A number or an array of numbers storing the minimum allowable value of this property. Only defined when type is a numeric type. + */ + readonly min: number | number[] | number[][]; + /** + * The no-data sentinel value that represents null values + */ + readonly noData: boolean | number | string | any[]; + /** + * A default value to use when an entity's property value is not defined. + */ + readonly default: boolean | number | string | any[]; + /** + * Whether the property is required. + */ + readonly required: boolean; + /** + * An identifier that describes how this property should be interpreted. + */ + readonly semantic: string; + /** + * The offset to be added to property values as part of the value transform. + * + * This is always defined, even when `hasValueTransform` is `false`. If + * the class property JSON itself did not define it, then it will be + * initialized to the default value. + */ + readonly offset: number | number[] | number[][]; + /** + * The scale to be multiplied to property values as part of the value transform. + * + * This is always defined, even when `hasValueTransform` is `false`. If + * the class property JSON itself did not define it, then it will be + * initialized to the default value. + */ + readonly scale: number | number[] | number[][]; + /** + * Extra user-defined properties. + */ + readonly extras: any; + /** + * An object containing extensions. + */ + readonly extensions: any; + } + + /** + * An enum of metadata component types. + */ + export enum MetadataComponentType { + /** + * An 8-bit signed integer + */ + INT8 = "INT8", + /** + * An 8-bit unsigned integer + */ + UINT8 = "UINT8", + /** + * A 16-bit signed integer + */ + INT16 = "INT16", + /** + * A 16-bit unsigned integer + */ + UINT16 = "UINT16", + /** + * A 32-bit signed integer + */ + INT32 = "INT32", + /** + * A 32-bit unsigned integer + */ + UINT32 = "UINT32", + /** + * A 64-bit signed integer. This type requires BigInt support. + */ + INT64 = "INT64", + /** + * A 64-bit signed integer. This type requires BigInt support + */ + UINT64 = "UINT64", + /** + * A 32-bit (single precision) floating point number + */ + FLOAT32 = "FLOAT32", + /** + * A 64-bit (double precision) floating point number + */ + FLOAT64 = "FLOAT64", + } + + /** + * A metadata enum. + *

+ * See the {@link https://github.com/CesiumGS/3d-tiles/tree/main/specification/Metadata|3D Metadata Specification} for 3D Tiles + *

+ * @param options - Object with the following properties: + * @param options.id - The ID of the enum. + * @param options.values - The enum values. + * @param [options.valueType = MetadataComponentType.UINT16] - The enum value type. + * @param [options.name] - The name of the enum. + * @param [options.description] - The description of the enum. + * @param [options.extras] - Extra user-defined properties. + * @param [options.extensions] - An object containing extensions. + */ + export class MetadataEnum { + constructor(options: { + id: string; + values: MetadataEnumValue[]; + valueType?: MetadataComponentType; + name?: string; + description?: string; + extras?: any; + extensions?: any; + }); + /** + * The enum values. + */ + readonly values: MetadataEnumValue[]; + /** + * The enum value type. + */ + readonly valueType: MetadataComponentType; + /** + * The ID of the enum. + */ + readonly id: string; + /** + * The name of the enum. + */ + readonly name: string; + /** + * The description of the enum. + */ + readonly description: string; + /** + * Extra user-defined properties. + */ + readonly extras: any; + /** + * An object containing extensions. + */ + readonly extensions: any; + } + + /** + * A metadata enum value. + *

+ * See the {@link https://github.com/CesiumGS/3d-tiles/tree/main/specification/Metadata|3D Metadata Specification} for 3D Tiles + *

+ * @param options - Object with the following properties: + * @param options.value - The integer value. + * @param options.name - The name of the enum value. + * @param [options.description] - The description of the enum value. + * @param [options.extras] - Extra user-defined properties. + * @param [options.extensions] - An object containing extensions. + */ + export class MetadataEnumValue { + constructor(options: { + value: number; + name: string; + description?: string; + extras?: any; + extensions?: any; + }); + /** + * The integer value. + */ + readonly value: number; + /** + * The name of the enum value. + */ + readonly name: string; + /** + * The description of the enum value. + */ + readonly description: string; + /** + * Extra user-defined properties. + */ + readonly extras: any; + /** + * An object containing extensions. + */ + readonly extensions: any; + } + + /** + * A schema containing classes and enums. + *

+ * See the {@link https://github.com/CesiumGS/3d-tiles/tree/main/specification/Metadata|3D Metadata Specification} for 3D Tiles + *

+ * @param options - Object with the following properties: + * @param [options.id] - The ID of the schema + * @param [options.name] - The name of the schema. + * @param [options.description] - The description of the schema. + * @param [options.version] - The application-specific version of the schema. + * @param [options.classes] - Classes defined in the schema, where each key is the class ID. + * @param [options.enums] - Enums defined in the schema, where each key is the enum ID. + * @param [options.extras] - Extra user-defined properties. + * @param [options.extensions] - An object containing extensions. + */ + export class MetadataSchema { + constructor(options: { + id?: string; + name?: string; + description?: string; + version?: string; + classes?: { + [key: string]: MetadataClass; + }; + enums?: { + [key: string]: MetadataEnum; + }; + extras?: any; + extensions?: any; + }); + /** + * Classes defined in the schema. + */ + readonly classes: { + [key: string]: MetadataClass; + }; + /** + * Enums defined in the schema. + */ + readonly enums: { + [key: string]: MetadataEnum; + }; + /** + * The ID of the schema. + */ + readonly id: string; + /** + * The name of the schema. + */ + readonly name: string; + /** + * The description of the schema. + */ + readonly description: string; + /** + * The application-specific version of the schema. + */ + readonly version: string; + /** + * Extra user-defined properties. + */ + readonly extras: any; + /** + * An object containing extensions. + */ + readonly extensions: any; + } + + /** + * An instance of a metadata value.
+ *
+ * This can be one of the following types: + *
    + *
  • number for type SCALAR and numeric component types except for INT64 or UINT64
  • + *
  • bigint for type SCALAR and component type INT64 or UINT64
  • + *
  • string for type STRING or ENUM
  • + *
  • boolean for type BOOLEAN
  • + *
  • Cartesian2 for type VEC2
  • + *
  • Cartesian3 for type VEC3
  • + *
  • Cartesian4 for type VEC4
  • + *
  • Matrix2 for type MAT2
  • + *
  • Matrix3 for type MAT3
  • + *
  • Matrix4 for type MAT4
  • + *
  • Arrays of these types when the metadata value is an array
  • + *
+ */ + export type MetadataValue = + | number + | bigint + | string + | boolean + | Cartesian2 + | Cartesian3 + | Cartesian4 + | Matrix2 + | Matrix3 + | Matrix4 + | number[] + | bigint[] + | string[] + | boolean[] + | Cartesian2[] + | Cartesian3[] + | Cartesian4[] + | Matrix2[] + | Matrix3[] + | Matrix4[]; + + /** + * An enum of metadata types. These metadata types are containers containing + * one or more components of type {@link MetadataComponentType} + */ + export enum MetadataType { + /** + * A single component + */ + SCALAR = "SCALAR", + /** + * A vector with two components + */ + VEC2 = "VEC2", + /** + * A vector with three components + */ + VEC3 = "VEC3", + /** + * A vector with four components + */ + VEC4 = "VEC4", + /** + * A 2x2 matrix, stored in column-major format. + */ + MAT2 = "MAT2", + /** + * A 3x3 matrix, stored in column-major format. + */ + MAT3 = "MAT3", + /** + * A 4x4 matrix, stored in column-major format. + */ + MAT4 = "MAT4", + /** + * A boolean (true/false) value + */ + BOOLEAN = "BOOLEAN", + /** + * A UTF-8 encoded string value + */ + STRING = "STRING", + /** + * An enumerated value. This type is used in conjunction with a {@link MetadataEnum} to describe the valid values. + */ + ENUM = "ENUM", + } + + /** + * An object describing a uniform, its type, and an initial value + * @property type - The Glsl type of the uniform. + * @property value - The initial value of the uniform + */ + export type UniformSpecifier = { + type: UniformType; + value: + | boolean + | number + | Cartesian2 + | Cartesian3 + | Cartesian4 + | Matrix2 + | Matrix3 + | Matrix4 + | TextureUniform; + }; + + /** + * A user defined GLSL shader used with {@link Model} as well + * as {@link Cesium3DTileset}. + *

+ * If texture uniforms are used, additional resource management must be done: + *

+ *
    + *
  • + * The update function must be called each frame. When a + * custom shader is passed to a {@link Model} or a + * {@link Cesium3DTileset}, this step is handled automaticaly + *
  • + *
  • + * {@link CustomShader#destroy} must be called when the custom shader is + * no longer needed to clean up GPU resources properly. The application + * is responsible for calling this method. + *
  • + *
+ *

+ * See the {@link https://github.com/CesiumGS/cesium/tree/main/Documentation/CustomShaderGuide|Custom Shader Guide} for more detailed documentation. + *

+ * @example + * const customShader = new CustomShader({ + * uniforms: { + * u_colorIndex: { + * type: Cesium.UniformType.FLOAT, + * value: 1.0 + * }, + * u_normalMap: { + * type: Cesium.UniformType.SAMPLER_2D, + * value: new Cesium.TextureUniform({ + * url: "http://example.com/normal.png" + * }) + * } + * }, + * varyings: { + * v_selectedColor: Cesium.VaryingType.VEC3 + * }, + * vertexShaderText: ` + * void vertexMain(VertexInput vsInput, inout czm_modelVertexOutput vsOutput) { + * v_selectedColor = mix(vsInput.attributes.color_0, vsInput.attributes.color_1, u_colorIndex); + * vsOutput.positionMC += 0.1 * vsInput.attributes.normal; + * } + * `, + * fragmentShaderText: ` + * void fragmentMain(FragmentInput fsInput, inout czm_modelMaterial material) { + * material.normal = texture(u_normalMap, fsInput.attributes.texCoord_0); + * material.diffuse = v_selectedColor; + * } + * ` + * }); + * @param options - An object with the following options + * @param [options.mode = CustomShaderMode.MODIFY_MATERIAL] - The custom shader mode, which determines how the custom shader code is inserted into the fragment shader. + * @param [options.lightingModel] - The lighting model (e.g. PBR or unlit). If present, this overrides the default lighting for the model. + * @param [options.translucencyMode = CustomShaderTranslucencyMode.INHERIT] - The translucency mode, which determines how the custom shader will be applied. If the value is CustomShaderTransulcencyMode.OPAQUE or CustomShaderTransulcencyMode.TRANSLUCENT, the custom shader will override settings from the model's material. If the value is CustomShaderTransulcencyMode.INHERIT, the custom shader will render as either opaque or translucent depending on the primitive's material settings. + * @param [options.uniforms] - A dictionary for user-defined uniforms. The key is the uniform name that will appear in the GLSL code. The value is an object that describes the uniform type and initial value + * @param [options.varyings] - A dictionary for declaring additional GLSL varyings used in the shader. The key is the varying name that will appear in the GLSL code. The value is the data type of the varying. For each varying, the declaration will be added to the top of the shader automatically. The caller is responsible for assigning a value in the vertex shader and using the value in the fragment shader. + * @param [options.vertexShaderText] - The custom vertex shader as a string of GLSL code. It must include a GLSL function called vertexMain. See the example for the expected signature. If not specified, the custom vertex shader step will be skipped in the computed vertex shader. + * @param [options.fragmentShaderText] - The custom fragment shader as a string of GLSL code. It must include a GLSL function called fragmentMain. See the example for the expected signature. If not specified, the custom fragment shader step will be skipped in the computed fragment shader. + */ + export class CustomShader { + constructor(options: { + mode?: CustomShaderMode; + lightingModel?: LightingModel; + translucencyMode?: CustomShaderTranslucencyMode; + uniforms?: { + [key: string]: UniformSpecifier; + }; + varyings?: { + [key: string]: VaryingType; + }; + vertexShaderText?: string; + fragmentShaderText?: string; + }); + /** + * A value determining how the custom shader interacts with the overall + * fragment shader. This is used by {@link CustomShaderPipelineStage} + */ + readonly mode: CustomShaderMode; + /** + * The lighting model to use when using the custom shader. + * This is used by {@link CustomShaderPipelineStage} + */ + readonly lightingModel: LightingModel; + /** + * Additional uniforms as declared by the user. + */ + readonly uniforms: { + [key: string]: UniformSpecifier; + }; + /** + * Additional varyings as declared by the user. + * This is used by {@link CustomShaderPipelineStage} + */ + readonly varyings: { + [key: string]: VaryingType; + }; + /** + * The user-defined GLSL code for the vertex shader + */ + readonly vertexShaderText: string; + /** + * The user-defined GLSL code for the fragment shader + */ + readonly fragmentShaderText: string; + /** + * The translucency mode, which determines how the custom shader will be applied. If the value is + * CustomShaderTransulcencyMode.OPAQUE or CustomShaderTransulcencyMode.TRANSLUCENT, the custom shader + * will override settings from the model's material. If the value isCustomShaderTransulcencyMode.INHERIT, + * the custom shader will render as either opaque or translucent depending on the primitive's material settings. + */ + readonly translucencyMode: CustomShaderTranslucencyMode; + /** + * Update the value of a uniform declared in the shader + * @param uniformName - The GLSL name of the uniform. This must match one of the uniforms declared in the constructor + * @param value - The new value of the uniform. + */ + setUniform( + uniformName: string, + value: + | boolean + | number + | Cartesian2 + | Cartesian3 + | Cartesian4 + | Matrix2 + | Matrix3 + | Matrix4 + | string + | Resource + | TextureUniform, + ): void; + /** + * Returns true if this object was destroyed; otherwise, false. + *

+ * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

+ * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * customShader = customShader && customShader.destroy(); + */ + destroy(): void; + } + + /** + * An enum describing how the {@link CustomShader} will be added to the + * fragment shader. This determines how the shader interacts with the material. + */ + export enum CustomShaderMode { + /** + * The custom shader will be used to modify the results of the material stage + * before lighting is applied. + */ + MODIFY_MATERIAL = "MODIFY_MATERIAL", + /** + * The custom shader will be used instead of the material stage. This is a hint + * to optimize out the material processing code. + */ + REPLACE_MATERIAL = "REPLACE_MATERIAL", + } + + /** + * An enum for controling how {@link CustomShader} handles translucency compared with the original + * primitive. + */ + export enum CustomShaderTranslucencyMode { + /** + * Inherit translucency settings from the primitive's material. If the primitive used a + * translucent material, the custom shader will also be considered translucent. If the primitive + * used an opaque material, the custom shader will be considered opaque. + */ + INHERIT = 0, + /** + * Force the primitive to render the primitive as opaque, ignoring any material settings. + */ + OPAQUE = 1, + /** + * Force the primitive to render the primitive as translucent, ignoring any material settings. + */ + TRANSLUCENT = 2, + } + + export namespace AnchorPointDirect { + /** + * Initialization options for the AnchorPointDirect constructor + * @property position - Anchor point geographic coordinates + * @property adjustmentParams - The adjustment values in meters + */ + type ConstructorOptions = { + position: Cartesian3; + adjustmentParams: Cartesian3; + }; + } + + /** + * Metadata for one stored anchor point using direct storage. + * + * This reflects the `anchronPointDirect` definition of the + * {@link https://nsgreg.nga.mil/csmwg.jsp|NGA_gpm_local} glTF extension. + * @param options - An object describing initialization options + */ + export class AnchorPointDirect { + constructor(options: AnchorPointDirect.ConstructorOptions); + /** + * Anchor point geographic coordinates in meters as X/Easting, Y/Northing, Z/HAE + */ + readonly position: Cartesian3; + /** + * The delta-x delta-y delta-z adjustment values in meters per anchor + * point. + */ + readonly adjustmentParams: Cartesian3; + } + + export namespace AnchorPointIndirect { + /** + * Initialization options for the AnchorPointIndirect constructor + * @property position - Anchor point geographic coordinates + * @property adjustmentParams - The adjustment values in meters + * @property covarianceMatrix - The 3x3 covariance matrix + */ + type ConstructorOptions = { + position: Cartesian3; + adjustmentParams: Cartesian3; + covarianceMatrix: Matrix3; + }; + } + + /** + * Metadata for one stored anchor point. + * + * This reflects the `anchronPointIndirect` definition of the + * {@link https://nsgreg.nga.mil/csmwg.jsp|NGA_gpm_local} glTF extension. + * @param options - An object describing initialization options + */ + export class AnchorPointIndirect { + constructor(options: AnchorPointIndirect.ConstructorOptions); + /** + * Anchor point geographic coordinates in meters as X/Easting, Y/Northing, Z/HAE + */ + readonly position: Cartesian3; + /** + * The delta-x delta-y delta-z adjustment values in meters per anchor + * point. + */ + readonly adjustmentParams: Cartesian3; + /** + * The 3x3 covariance matrix. + */ + readonly covarianceMatrix: Matrix3; + } + + export namespace CorrelationGroup { + /** + * Initialization options for the CorrelationGroup constructor + * @property groupFlags - Array of 3 booleans indicating if + * parameters delta-x delta-y delta-z used in the correlation group + * @property rotationThetas - Rotations in milliradians + * about X, Y, Z axes, respectively + * @property params - Array of `Spdcf` (Strictly Positive-Definite + * Correlation Function) parameters, for the U, V, W directions, respectively + */ + type ConstructorOptions = { + groupFlags: boolean[]; + rotationThetas: Cartesian3; + params: Spdcf[]; + }; + } + + /** + * Metadata identifying parameters using same correlation modeling and + * associated correlation parameters. + * + * This reflects the `correlationGroup` definition of the + * {@link https://nsgreg.nga.mil/csmwg.jsp|NGA_gpm_local} glTF extension. + * @param options - An object describing initialization options + */ + export class CorrelationGroup { + constructor(options: CorrelationGroup.ConstructorOptions); + /** + * Array of 3 booleans indicating if parameters delta-x delta-y delta-z + * used in the correlation group + */ + readonly groupFlags: boolean[]; + /** + * Rotations in milliradians about X, Y, Z axes, respectively + */ + readonly rotationThetas: Cartesian3; + /** + * Array of 3 sets of SPDCF parameters, for the U, V, W directions, respectively + */ + readonly params: Spdcf[]; + } + + /** + * Creates a Matrix3 that describes a covariance matrix (which is + * symmetric) from the array containing the upper triangle, in + * column-major order. + * @param array - The input array + * @returns The Matrix3 + */ + export function createCovarianceMatrixFromUpperTriangle( + array: number[], + ): Matrix3; + + /** + * Creates an `AnchorPointDirect` from the given JSON representation + * @param anchorPointDirectJson - The input JSON + * @returns The direct anchor point + */ + export function createAnchorPointDirect( + anchorPointDirectJson: any, + ): AnchorPointDirect; + + /** + * Creates an `AnchorPointIndirect` from the given JSON representation + * @param anchorPointIndirectJson - The input JSON + * @returns The indirect anchor point + */ + export function createAnchorPointIndirect( + anchorPointIndirectJson: any, + ): AnchorPointIndirect; + + /** + * Creates a `CorrelationGroup` from the given JSON representation + * @param correlationGroupJson - The input JSON + * @returns The correlation group + */ + export function createCorrelationGroup( + correlationGroupJson: any, + ): CorrelationGroup; + + export namespace GltfGpmLocal { + /** + * Initialization options for the GltfGpmLocal constructor + * @property storageType - The storage type. + * This must be one of the `StorageType` constants, i.e. `Direct` or `Indirect`. + * @property [anchorPointsIndirect] - The indirect anchor points. + * This must be present if and only if the storage type is `Indirect`. + * @property [intraTileCorrelationGroups] - The intra-tile correlation groups. + * This must be present if and only if the storage type is `Indirect`. + * @property [anchorPointsDirect] - The direct anchor points. + * This must be present if and only if the storage type is `Direct`. + * @property [covarianceDirect] - The covariance of anchor point parameters. + * This must be present if and only if the storage type is `Direct`. + */ + type ConstructorOptions = { + storageType: string; + anchorPointsIndirect?: AnchorPointIndirect[] | undefined; + intraTileCorrelationGroups?: CorrelationGroup[] | undefined; + anchorPointsDirect?: AnchorPointDirect[] | undefined; + covarianceDirect?: Matrix3 | undefined; + }; + } + + /** + * The GPM metadata for a Ground-Space Indirect implementation stored + * locally (i.e. a tile and/or leaf node). + * + * This reflects the root extension object of the {@link https://nsgreg.nga.mil/csmwg.jsp|NGA_gpm_local} + * glTF extension. When a model that contains this extension was loaded, + * then an object of this type can be obtained by calling + * ``` + * const gltfGpmLocal = model.getExtension("NGA_gpm_local"); + * ``` + * + * The storage type determines the presence of the optional properties: + *
    + *
  • + * When the storage type is `StorageType.Indirect`, then the + * `anchorPointsIndirect` and `intraTileCorrelationGroups` + * are present. + *
  • + *
  • + * When the storage type is `StorageType.Direct`, then the + * `anchorPointsDirect` and `covarianceDirect` are present. + *
  • + *
+ * @param options - An object describing initialization options + */ + export class GltfGpmLocal { + constructor(options: GltfGpmLocal.ConstructorOptions); + /** + * Specifies if covariance storage is indirect or direct. + */ + readonly storageType: StorageType; + /** + * Array of stored indirect anchor points + */ + readonly anchorPointsIndirect: AnchorPointIndirect[] | undefined; + /** + * Array of stored direct anchor points + */ + readonly anchorPointsDirect: AnchorPointDirect[] | undefined; + /** + * Metadata identifying parameters using same correlation modeling and + * associated correlation parameters + */ + readonly intraTileCorrelationGroups: CorrelationGroup[] | undefined; + /** + * The full covariance of anchor point parameters + */ + readonly covarianceDirect: Matrix3 | undefined; + } + + export namespace Spdcf { + /** + * Initialization options for the Spdcf constructor + * @property A - The factor A, in (0, 1] + * @property alpha - The alpha value, in [0, 1) + * @property beta - The beta value, in [0, 10] + * @property T - the tau value, in (0, +inf) + */ + type ConstructorOptions = { + A: number; + alpha: number; + beta: number; + T: number; + }; + } + + /** + * Variables for a Strictly Positive-Definite Correlation Function. + * + * This reflects the `spdcf` definition of the + * {@link https://nsgreg.nga.mil/csmwg.jsp|NGA_gpm_local} glTF extension. + * Instances of this type are stored as the parameters within a + * `CorrelationGroup`. + * + * Parameters (A, alpha, beta, T) describe the correlation decrease + * between points as a function of delta time: + * ``` + * spdcf(delta_t) = A_t * (alpha_t + ((1 - alpha_t)(1 + beta_t)) / (beta_t + e^(delta_t/T_t))) + * ``` + * @param options - An object describing initialization options + */ + export class Spdcf { + constructor(options: Spdcf.ConstructorOptions); + /** + * In (0, 1] + */ + readonly A: number; + /** + * In [0, 1) + */ + readonly alpha: number; + /** + * In [0, 10] + */ + readonly beta: number; + /** + * In (0, +inf) + */ + readonly T: number; + } + + /** + * An enum of storage types for covariance information. + * + * This reflects the `gltfGpmLocal.storageType` definition of the + * {@link https://nsgreg.nga.mil/csmwg.jsp|NGA_gpm_local} glTF extension. + */ + export enum StorageType { + /** + * Store the full error covariance of the anchor points, to include the cross-covariance terms + */ + Direct = "Direct", + /** + * A full covariance matrix is stored for each of the anchor points. However, in this case the + * cross-covariance terms are not directly stored, but can be computed by a set of spatial + * correlation function parameters which are stored in the metadata. + */ + Indirect = "Indirect", + } + + /** + * The lighting model to use for lighting a {@link Model}. + */ + export enum LightingModel { + /** + * Use unlit shading, i.e. skip lighting calculations. The model's + * diffuse color (assumed to be linear RGB, not sRGB) is used directly + * when computing out_FragColor. The alpha mode is still + * applied. + */ + UNLIT = 0, + /** + * Use physically-based rendering lighting calculations. This includes + * both PBR metallic roughness and PBR specular glossiness. Image-based + * lighting is also applied when possible. + */ + PBR = 1, + } + + /** + *
+ * To construct a Model, call {@link Model.fromGltfAsync}. Do not call the constructor directly. + *
+ * A 3D model based on glTF, the runtime asset format for WebGL, OpenGL ES, and OpenGL. + *

+ * Cesium supports glTF assets with the following extensions: + *

    + *
  • + * {@link https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/AGI_articulations/README.md|AGI_articulations} + *
  • + *
  • + * {@link https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Vendor/CESIUM_primitive_outline|CESIUM_primitive_outline} + *
  • + *
  • + * {@link https://github.com/KhronosGroup/glTF/blob/master/extensions/1.0/Vendor/CESIUM_RTC/README.md|CESIUM_RTC} + *
  • + *
  • + * {@link https://github.com/CesiumGS/glTF/tree/3d-tiles-next/extensions/2.0/Vendor/EXT_instance_features|EXT_instance_features} + *
  • + *
  • + * {@link https://github.com/CesiumGS/glTF/tree/3d-tiles-next/extensions/2.0/Vendor/EXT_mesh_features|EXT_mesh_features} + *
  • + *
  • + * {@link https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Vendor/EXT_mesh_gpu_instancing|EXT_mesh_gpu_instancing} + *
  • + *
  • + * {@link https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Vendor/EXT_meshopt_compression|EXT_meshopt_compression} + *
  • + *
  • + * {@link https://github.com/CesiumGS/glTF/tree/3d-tiles-next/extensions/2.0/Vendor/EXT_structural_metadata|EXT_structural_metadata} + *
  • + *
  • + * {@link https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Vendor/EXT_texture_webp|EXT_texture_webp} + *
  • + *
  • + * {@link https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_draco_mesh_compression/README.md|KHR_draco_mesh_compression} + *
  • + *
  • + * {@link https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Archived/KHR_techniques_webgl/README.md|KHR_techniques_webgl} + *
  • + *
  • + * {@link https://github.com/KhronosGroup/glTF/blob/main/extensions/1.0/Khronos/KHR_materials_common/README.md|KHR_materials_common} + *
  • + *
  • + * {@link https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Archived/KHR_materials_pbrSpecularGlossiness|KHR_materials_pbrSpecularGlossiness} + *
  • + *
  • + * {@link https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit/README.md|KHR_materials_unlit} + *
  • + *
  • + * {@link https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_mesh_quantization|KHR_mesh_quantization} + *
  • + *
  • + * {@link https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_texture_basisu|KHR_texture_basisu} + *
  • + *
  • + * {@link https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_texture_transform/README.md|KHR_texture_transform} + *
  • + *
  • + * {@link https://github.com/KhronosGroup/glTF/blob/main/extensions/1.0/Vendor/WEB3D_quantized_attributes/README.md|WEB3D_quantized_attributes} + *
  • + *
  • + * {@link https://nsgreg.nga.mil/csmwg.jsp|NGA_gpm_local (experimental)} + *
  • + *
+ *

+ *

+ * Note: for models with compressed textures using the KHR_texture_basisu extension, we recommend power of 2 textures in both dimensions + * for maximum compatibility. This is because some samplers require power of 2 textures ({@link https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Tutorial/Using_textures_in_WebGL|Using textures in WebGL}) + * and KHR_texture_basisu requires multiple of 4 dimensions ({@link https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_texture_basisu/README.md#additional-requirements|KHR_texture_basisu additional requirements}). + *

+ */ + export class Model { + constructor(); + /** + * The 4x4 transformation matrix that transforms the model from model to world coordinates. + * When this is the identity matrix, the model is drawn in world coordinates, i.e., Earth's Cartesian WGS84 coordinates. + * Local reference frames can be used by providing a different transformation matrix, like that returned + * by {@link Transforms.eastNorthUpToFixedFrame}. + * @example + * const origin = Cesium.Cartesian3.fromDegrees(-95.0, 40.0, 200000.0); + * m.modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(origin); + */ + modelMatrix: Matrix4; + /** + * Whether to display the outline for models using the + * {@link https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/CESIUM_primitive_outline|CESIUM_primitive_outline} extension. + * When true, outlines are displayed. When false, outlines are not displayed. + */ + showOutline: boolean; + /** + * The color to use when rendering outlines. + */ + outlineColor: Color; + /** + * When true, this model is ready to render, i.e., the external binary, image, + * and shader files were downloaded and the WebGL resources were created. + */ + readonly ready: boolean; + /** + * Gets an event that is raised when the model encounters an asynchronous rendering error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link ModelError}. + */ + readonly errorEvent: Event; + /** + * Gets an event that is raised when the model is loaded and ready for rendering, i.e. when the external resources + * have been downloaded and the WebGL resources are created. Event listeners + * are passed an instance of the {@link Model}. + * + *

+ * If {@link Model.incrementallyLoadTextures} is true, this event will be raised before all textures are loaded and ready for rendering. Subscribe to {@link Model.texturesReadyEvent} to be notified when the textures are ready. + *

+ */ + readonly readyEvent: Event; + /** + * Gets an event that, if {@link Model.incrementallyLoadTextures} is true, is raised when the model textures are loaded and ready for rendering, i.e. when the external resources + * have been downloaded and the WebGL resources are created. Event listeners + * are passed an instance of the {@link Model}. + */ + readonly texturesReadyEvent: Event; + /** + * The currently playing glTF animations. + */ + readonly activeAnimations: ModelAnimationCollection; + /** + * Determines if the model's animations should hold a pose over frames where no keyframes are specified. + */ + clampAnimations: boolean; + /** + * Point cloud shading settings for controlling point cloud attenuation + * and lighting. For 3D Tiles, this is inherited from the + * {@link Cesium3DTileset}. + */ + pointCloudShading: PointCloudShading; + /** + * The model's custom shader, if it exists. Using custom shaders with a {@link Cesium3DTileStyle} + * may lead to undefined behavior. + */ + customShader: CustomShader; + /** + * The height reference of the model, which determines how the model is drawn + * relative to terrain. + */ + heightReference: HeightReference; + /** + * Gets or sets the distance display condition, which specifies at what distance + * from the camera this model will be displayed. + */ + distanceDisplayCondition: DistanceDisplayCondition; + /** + * A user-defined object that is returned when the model is picked. + */ + id: any; + /** + * The style to apply to the features in the model. Cannot be applied if a {@link CustomShader} is also applied. + */ + style: Cesium3DTileStyle; + /** + * The color to blend with the model's rendered color. + */ + color: Color; + /** + * Defines how the color blends with the model. + */ + colorBlendMode: Cesium3DTileColorBlendMode | ColorBlendMode; + /** + * Value used to determine the color strength when the colorBlendMode is MIX. A value of 0.0 results in the model's rendered color while a value of 1.0 results in a solid color, with any value in-between resulting in a mix of the two. + */ + colorBlendAmount: number; + /** + * The silhouette color. + */ + silhouetteColor: Color; + /** + * The size of the silhouette in pixels. + */ + silhouetteSize: number; + /** + * Gets the model's bounding sphere in world space. This does not take into account + * glTF animations, skins, or morph targets. It also does not account for + * {@link Model#minimumPixelSize}. + */ + readonly boundingSphere: BoundingSphere; + /** + * This property is for debugging only; it is not for production use nor is it optimized. + *

+ * Draws the bounding sphere for each draw command in the model. + *

+ */ + debugShowBoundingVolume: boolean; + /** + * This property is for debugging only; it is not for production use nor is it optimized. + *

+ * Draws the model in wireframe. + *

+ */ + debugWireframe: boolean; + /** + * Whether or not to render the model. + */ + show: boolean; + /** + * Label of the feature ID set to use for picking and styling. + *

+ * For EXT_mesh_features, this is the feature ID's label property, or + * "featureId_N" (where N is the index in the featureIds array) when not + * specified. EXT_feature_metadata did not have a label field, so such + * feature ID sets are always labeled "featureId_N" where N is the index in + * the list of all feature Ids, where feature ID attributes are listed before + * feature ID textures. + *

+ *

+ * If featureIdLabel is set to an integer N, it is converted to + * the string "featureId_N" automatically. If both per-primitive and + * per-instance feature IDs are present, the instance feature IDs take + * priority. + *

+ */ + featureIdLabel: string; + /** + * Label of the instance feature ID set used for picking and styling. + *

+ * If instanceFeatureIdLabel is set to an integer N, it is converted to + * the string "instanceFeatureId_N" automatically. + * If both per-primitive and per-instance feature IDs are present, the + * instance feature IDs take priority. + *

+ */ + instanceFeatureIdLabel: string; + /** + * The {@link ClippingPlaneCollection} used to selectively disable rendering the model. + */ + clippingPlanes: ClippingPlaneCollection; + /** + * The {@link ClippingPolygonCollection} used to selectively disable rendering the model. + */ + clippingPolygons: ClippingPolygonCollection; + /** + * If true, the model is exaggerated along the ellipsoid normal when {@link Scene.verticalExaggeration} is set to a value other than 1.0. + * @example + * // Exaggerate terrain by a factor of 2, but prevent model exaggeration + * scene.verticalExaggeration = 2.0; + * model.enableVerticalExaggeration = false; + */ + enableVerticalExaggeration: boolean; + /** + * The directional light color when shading the model. When undefined the scene's light color is used instead. + *

+ * Disabling additional light sources by setting + * model.imageBasedLighting.imageBasedLightingFactor = new Cartesian2(0.0, 0.0) + * will make the model much darker. Here, increasing the intensity of the light source will make the model brighter. + *

+ */ + lightColor: Cartesian3; + /** + * The properties for managing image-based lighting on this model. + */ + imageBasedLighting: ImageBasedLighting; + /** + * The properties for managing dynamic environment maps on this model. Affects lighting. + * @example + * // Change the ground color used for a model's environment map to a forest green + * const environmentMapManager = model.environmentMapManager; + * environmentMapManager.groundColor = Cesium.Color.fromCssColorString("#203b34"); + */ + readonly environmentMapManager: DynamicEnvironmentMapManager; + /** + * Whether to cull back-facing geometry. When true, back face culling is + * determined by the material's doubleSided property; when false, back face + * culling is disabled. Back faces are not culled if {@link Model#color} + * is translucent or {@link Model#silhouetteSize} is greater than 0.0. + */ + backFaceCulling: boolean; + /** + * A uniform scale applied to this model before the {@link Model#modelMatrix}. + * Values greater than 1.0 increase the size of the model; values + * less than 1.0 decrease. + */ + scale: number; + /** + * The approximate minimum pixel size of the model regardless of zoom. + * This can be used to ensure that a model is visible even when the viewer + * zooms out. When 0.0, no minimum size is enforced. + */ + minimumPixelSize: number; + /** + * The maximum scale size for a model. This can be used to give + * an upper limit to the {@link Model#minimumPixelSize}, ensuring that the model + * is never an unreasonable scale. + */ + maximumScale: number; + /** + * Determines whether the model casts or receives shadows from light sources. + */ + shadows: ShadowMode; + /** + * Gets the credit that will be displayed for the model. + */ + readonly credit: Credit; + /** + * Gets or sets whether the credits of the model will be displayed + * on the screen. + */ + showCreditsOnScreen: boolean; + /** + * The {@link SplitDirection} to apply to this model. + */ + splitDirection: SplitDirection; + /** + * Gets the model's classification type. This determines whether terrain, + * 3D Tiles, or both will be classified by this model. + *

+ * Additionally, there are a few requirements/limitations: + *

    + *
  • The glTF cannot contain morph targets, skins, or animations.
  • + *
  • The glTF cannot contain the EXT_mesh_gpu_instancing extension.
  • + *
  • Only meshes with TRIANGLES can be used to classify other assets.
  • + *
  • The meshes must be watertight.
  • + *
  • The POSITION attribute is required.
  • + *
  • If feature IDs and an index buffer are both present, all indices with the same feature id must occupy contiguous sections of the index buffer.
  • + *
  • If feature IDs are present without an index buffer, all positions with the same feature id must occupy contiguous sections of the position buffer.
  • + *
+ *

+ *

+ * The 3D Tiles or terrain receiving the classification must be opaque. + *

+ */ + readonly classificationType: ClassificationType; + /** + * Returns the node with the given name in the glTF. This is used to + * modify a node's transform for user-defined animation. + * @example + * // Apply non-uniform scale to node "Hand" + * const node = model.getNode("Hand"); + * node.matrix = Cesium.Matrix4.fromScale(new Cesium.Cartesian3(5.0, 1.0, 1.0), node.matrix); + * @param name - The name of the node in the glTF. + * @returns The node, or undefined if no node with the name exists. + */ + getNode(name: string): ModelNode; + /** + * Sets the current value of an articulation stage. After setting one or + * multiple stage values, call Model.applyArticulations() to + * cause the node matrices to be recalculated. + * @example + * // Sets the value of the stage named "MoveX" belonging to the articulation named "SampleArticulation" + * model.setArticulationStage("SampleArticulation MoveX", 50.0); + * @param articulationStageKey - The name of the articulation, a space, and the name of the stage. + * @param value - The numeric value of this stage of the articulation. + */ + setArticulationStage(articulationStageKey: string, value: number): void; + /** + * Applies any modified articulation stages to the matrix of each node that + * participates in any articulation. Note that this will overwrite any node + * transformations on participating nodes. + */ + applyArticulations(): void; + /** + * Returns the object that was created for the given extension. + * + * The given name may be the name of a glTF extension, like `"EXT_example_extension"`. + * If the specified extension was present in the root of the underlying glTF asset, + * and a loader for the specified extension has processed the extension data, then + * this will return the model representation of the extension. + * @param extensionName - The name of the extension + * @returns The object, or `undefined` + */ + getExtension(extensionName: string): any | undefined; + /** + * Marks the model's {@link Model#style} as dirty, which forces all features + * to re-evaluate the style in the next frame the model is visible. + */ + makeStyleDirty(): void; + /** + * Called when {@link Viewer} or {@link CesiumWidget} render the scene to + * get the draw commands needed to render this primitive. + *

+ * Do not call this function directly. This is documented just to + * list the exceptions that may be propagated when the scene is rendered: + *

+ */ + update(): void; + /** + * Returns true if this object was destroyed; otherwise, false. + *

+ * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

+ * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * model = model && model.destroy(); + */ + destroy(): void; + /** + *

+ * Asynchronously creates a model from a glTF asset. This function returns a promise that resolves when the model is ready to render, i.e., when the external binary, image, + * and shader files are downloaded and the WebGL resources are created. + *

+ *

+ * The model can be a traditional glTF asset with a .gltf extension or a Binary glTF using the .glb extension. + * @example + * // Load a model and add it to the scene + * try { + * const model = await Cesium.Model.fromGltfAsync({ + * url: "../../SampleData/models/CesiumMan/Cesium_Man.glb" + * }); + * viewer.scene.primitives.add(model); + * } catch (error) { + * console.log(`Failed to load model. ${error}`); + * } + * @example + * // Position a model with modelMatrix and display it with a minimum size of 128 pixels + * const position = Cesium.Cartesian3.fromDegrees( + * -123.0744619, + * 44.0503706, + * 5000.0 + * ); + * const headingPositionRoll = new Cesium.HeadingPitchRoll(); + * const fixedFrameTransform = Cesium.Transforms.localFrameToFixedFrameGenerator( + * "north", + * "west" + * ); + * try { + * const model = await Cesium.Model.fromGltfAsync({ + * url: "../../SampleData/models/CesiumAir/Cesium_Air.glb", + * modelMatrix: Cesium.Transforms.headingPitchRollToFixedFrame( + * position, + * headingPositionRoll, + * Cesium.Ellipsoid.WGS84, + * fixedFrameTransform + * ), + * minimumPixelSize: 128, + * }); + * viewer.scene.primitives.add(model); + * } catch (error) { + * console.log(`Failed to load model. ${error}`); + * } + * @example + * // Load a model and play the last animation at half speed + * let animations; + * try { + * const model = await Cesium.Model.fromGltfAsync({ + * url: "../../SampleData/models/CesiumMan/Cesium_Man.glb", + * gltfCallback: gltf => { + * animations = gltf.animations + * } + * }); + * viewer.scene.primitives.add(model); + * model.readyEvent.addEventListener(() => { + * model.activeAnimations.add({ + * index: animations.length - 1, + * loop: Cesium.ModelAnimationLoop.REPEAT, + * multiplier: 0.5, + * }); + * }); + * } catch (error) { + * console.log(`Failed to load model. ${error}`); + * } + * @param options - Object with the following properties: + * @param options.url - The url to the .gltf or .glb file. + * @param [options.basePath = ''] - The base path that paths in the glTF JSON are relative to. + * @param [options.show = true] - Whether or not to render the model. + * @param [options.modelMatrix = Matrix4.IDENTITY] - The 4x4 transformation matrix that transforms the model from model to world coordinates. + * @param [options.scale = 1.0] - A uniform scale applied to this model. + * @param [options.enableVerticalExaggeration = true] - If true, the model is exaggerated along the ellipsoid normal when {@link Scene.verticalExaggeration} is set to a value other than 1.0. + * @param [options.minimumPixelSize = 0.0] - The approximate minimum pixel size of the model regardless of zoom. + * @param [options.maximumScale] - The maximum scale size of a model. An upper limit for minimumPixelSize. + * @param [options.id] - A user-defined object to return when the model is picked with {@link Scene#pick}. + * @param [options.allowPicking = true] - When true, each primitive is pickable with {@link Scene#pick}. + * @param [options.incrementallyLoadTextures = true] - Determine if textures may continue to stream in after the model is loaded. + * @param [options.asynchronous = true] - Determines if model WebGL resource creation will be spread out over several frames or block until completion once all glTF files are loaded. + * @param [options.clampAnimations = true] - Determines if the model's animations should hold a pose over frames where no keyframes are specified. + * @param [options.shadows = ShadowMode.ENABLED] - Determines whether the model casts or receives shadows from light sources. + * @param [options.releaseGltfJson = false] - When true, the glTF JSON is released once the glTF is loaded. This is is especially useful for cases like 3D Tiles, where each .gltf model is unique and caching the glTF JSON is not effective. + * @param [options.debugShowBoundingVolume = false] - For debugging only. Draws the bounding sphere for each draw command in the model. + * @param [options.enableDebugWireframe = false] - For debugging only. This must be set to true for debugWireframe to work in WebGL1. This cannot be set after the model has loaded. + * @param [options.debugWireframe = false] - For debugging only. Draws the model in wireframe. Will only work for WebGL1 if enableDebugWireframe is set to true. + * @param [options.cull = true] - Whether or not to cull the model using frustum/horizon culling. If the model is part of a 3D Tiles tileset, this property will always be false, since the 3D Tiles culling system is used. + * @param [options.opaquePass = Pass.OPAQUE] - The pass to use in the {@link DrawCommand} for the opaque portions of the model. + * @param [options.upAxis = Axis.Y] - The up-axis of the glTF model. + * @param [options.forwardAxis = Axis.Z] - The forward-axis of the glTF model. + * @param [options.customShader] - A custom shader. This will add user-defined GLSL code to the vertex and fragment shaders. Using custom shaders with a {@link Cesium3DTileStyle} may lead to undefined behavior. + * @param [options.content] - The tile content this model belongs to. This property will be undefined if model is not loaded as part of a tileset. + * @param [options.heightReference = HeightReference.NONE] - Determines how the model is drawn relative to terrain. + * @param [options.scene] - Must be passed in for models that use the height reference property. + * @param [options.distanceDisplayCondition] - The condition specifying at what distance from the camera that this model will be displayed. + * @param [options.color] - A color that blends with the model's rendered color. + * @param [options.colorBlendMode = ColorBlendMode.HIGHLIGHT] - Defines how the color blends with the model. + * @param [options.colorBlendAmount = 0.5] - Value used to determine the color strength when the colorBlendMode is MIX. A value of 0.0 results in the model's rendered color while a value of 1.0 results in a solid color, with any value in-between resulting in a mix of the two. + * @param [options.silhouetteColor = Color.RED] - The silhouette color. If more than 256 models have silhouettes enabled, there is a small chance that overlapping models will have minor artifacts. + * @param [options.silhouetteSize = 0.0] - The size of the silhouette in pixels. + * @param [options.enableShowOutline = true] - Whether to enable outlines for models using the {@link https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/CESIUM_primitive_outline|CESIUM_primitive_outline} extension. This can be set false to avoid post-processing geometry at load time. When false, the showOutlines and outlineColor options are ignored. + * @param [options.showOutline = true] - Whether to display the outline for models using the {@link https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/CESIUM_primitive_outline|CESIUM_primitive_outline} extension. When true, outlines are displayed. When false, outlines are not displayed. + * @param [options.outlineColor = Color.BLACK] - The color to use when rendering outlines. + * @param [options.clippingPlanes] - The {@link ClippingPlaneCollection} used to selectively disable rendering the model. + * @param [options.clippingPolygons] - The {@link ClippingPolygonCollection} used to selectively disable rendering the model. + * @param [options.lightColor] - The light color when shading the model. When undefined the scene's light color is used instead. + * @param [options.imageBasedLighting] - The properties for managing image-based lighting on this model. + * @param [options.environmentMapOptions] - The properties for managing dynamic environment maps on this model. + * @param [options.backFaceCulling = true] - Whether to cull back-facing geometry. When true, back face culling is determined by the material's doubleSided property; when false, back face culling is disabled. Back faces are not culled if the model's color is translucent. + * @param [options.credit] - A credit for the data source, which is displayed on the canvas. + * @param [options.showCreditsOnScreen = false] - Whether to display the credits of this model on screen. + * @param [options.splitDirection = SplitDirection.NONE] - The {@link SplitDirection} split to apply to this model. + * @param [options.projectTo2D = false] - Whether to accurately project the model's positions in 2D. If this is true, the model will be projected accurately to 2D, but it will use more memory to do so. If this is false, the model will use less memory and will still render in 2D / CV mode, but its positions may be inaccurate. This disables minimumPixelSize and prevents future modification to the model matrix. This also cannot be set after the model has loaded. + * @param [options.enablePick = false] - Whether to allow with CPU picking with pick when not using WebGL 2 or above. If using WebGL 2 or above, this option will be ignored. If using WebGL 1 and this is true, the pick operation will work correctly, but it will use more memory to do so. If running with WebGL 1 and this is false, the model will use less memory, but pick will always return undefined. This cannot be set after the model has loaded. + * @param [options.featureIdLabel = "featureId_0"] - Label of the feature ID set to use for picking and styling. For EXT_mesh_features, this is the feature ID's label property, or "featureId_N" (where N is the index in the featureIds array) when not specified. EXT_feature_metadata did not have a label field, so such feature ID sets are always labeled "featureId_N" where N is the index in the list of all feature Ids, where feature ID attributes are listed before feature ID textures. If featureIdLabel is an integer N, it is converted to the string "featureId_N" automatically. If both per-primitive and per-instance feature IDs are present, the instance feature IDs take priority. + * @param [options.instanceFeatureIdLabel = "instanceFeatureId_0"] - Label of the instance feature ID set used for picking and styling. If instanceFeatureIdLabel is set to an integer N, it is converted to the string "instanceFeatureId_N" automatically. If both per-primitive and per-instance feature IDs are present, the instance feature IDs take priority. + * @param [options.pointCloudShading] - Options for constructing a {@link PointCloudShading} object to control point attenuation and lighting. + * @param [options.classificationType] - Determines whether terrain, 3D Tiles or both will be classified by this model. This cannot be set after the model has loaded. + * @param [options.gltfCallback] - A function that is called with the loaded gltf object once loaded. + * @returns A promise that resolves to the created model when it is ready to render. + */ + static fromGltfAsync(options: { + url: string | Resource; + basePath?: string | Resource; + show?: boolean; + modelMatrix?: Matrix4; + scale?: number; + enableVerticalExaggeration?: boolean; + minimumPixelSize?: number; + maximumScale?: number; + id?: any; + allowPicking?: boolean; + incrementallyLoadTextures?: boolean; + asynchronous?: boolean; + clampAnimations?: boolean; + shadows?: ShadowMode; + releaseGltfJson?: boolean; + debugShowBoundingVolume?: boolean; + enableDebugWireframe?: boolean; + debugWireframe?: boolean; + cull?: boolean; + opaquePass?: boolean; + upAxis?: Axis; + forwardAxis?: Axis; + customShader?: CustomShader; + content?: Cesium3DTileContent; + heightReference?: HeightReference; + scene?: Scene; + distanceDisplayCondition?: DistanceDisplayCondition; + color?: Color; + colorBlendMode?: ColorBlendMode; + colorBlendAmount?: number; + silhouetteColor?: Color; + silhouetteSize?: number; + enableShowOutline?: boolean; + showOutline?: boolean; + outlineColor?: Color; + clippingPlanes?: ClippingPlaneCollection; + clippingPolygons?: ClippingPolygonCollection; + lightColor?: Cartesian3; + imageBasedLighting?: ImageBasedLighting; + environmentMapOptions?: DynamicEnvironmentMapManager.ConstructorOptions; + backFaceCulling?: boolean; + credit?: Credit | string; + showCreditsOnScreen?: boolean; + splitDirection?: SplitDirection; + projectTo2D?: boolean; + enablePick?: boolean; + featureIdLabel?: string | number; + instanceFeatureIdLabel?: string | number; + pointCloudShading?: any; + classificationType?: ClassificationType; + gltfCallback?: Model.GltfCallback; + }): Promise; + } + + export namespace Model { + /** + * Interface for the function that is called with the loaded gltf object once loaded. + * @param gltf - The gltf object + */ + type GltfCallback = (gltf: any) => void; + } + + /** + *

+ * Create animations by calling {@link ModelAnimationCollection#add}. Do not call the constructor directly. + *
+ * + * An active animation derived from a glTF asset. An active animation is an + * animation that is either currently playing or scheduled to be played due to + * being added to a model's {@link ModelAnimationCollection}. An active animation + * is an instance of an animation; for example, there can be multiple active + * animations for the same glTF animation, each with a different start time. + */ + export class ModelAnimation { + constructor(); + /** + * When true, the animation is removed after it stops playing. + * This is slightly more efficient that not removing it, but if, for example, + * time is reversed, the animation is not played again. + */ + removeOnStop: boolean; + /** + * The event fired when this animation is started. This can be used, for + * example, to play a sound or start a particle system, when the animation starts. + *

+ * This event is fired at the end of the frame after the scene is rendered. + *

+ * @example + * animation.start.addEventListener(function(model, animation) { + * console.log(`Animation started: ${animation.name}`); + * }); + */ + start: Event; + /** + * The event fired when on each frame when this animation is updated. The + * current time of the animation, relative to the glTF animation time span, is + * passed to the event, which allows, for example, starting new animations at a + * specific time relative to a playing animation. + *

+ * This event is fired at the end of the frame after the scene is rendered. + *

+ * @example + * animation.update.addEventListener(function(model, animation, time) { + * console.log(`Animation updated: ${animation.name}. glTF animation time: ${time}`); + * }); + */ + update: Event; + /** + * The event fired when this animation is stopped. This can be used, for + * example, to play a sound or start a particle system, when the animation stops. + *

+ * This event is fired at the end of the frame after the scene is rendered. + *

+ * @example + * animation.stop.addEventListener(function(model, animation) { + * console.log(`Animation stopped: ${animation.name}`); + * }); + */ + stop: Event; + /** + * The name that identifies this animation in the model, if it exists. + */ + readonly name: string; + /** + * The scene time to start playing this animation. When this is undefined, + * the animation starts at the next frame. + */ + readonly startTime: JulianDate; + /** + * The delay, in seconds, from {@link ModelAnimation#startTime} to start playing. + */ + readonly delay: number; + /** + * The scene time to stop playing this animation. When this is undefined, + * the animation is played for its full duration and perhaps repeated depending on + * {@link ModelAnimation#loop}. + */ + readonly stopTime: JulianDate; + /** + * Values greater than 1.0 increase the speed that the animation is played relative + * to the scene clock speed; values less than 1.0 decrease the speed. A value of + * 1.0 plays the animation at the speed in the glTF animation mapped to the scene + * clock speed. For example, if the scene is played at 2x real-time, a two-second glTF animation + * will play in one second even if multiplier is 1.0. + */ + readonly multiplier: number; + /** + * When true, the animation is played in reverse. + */ + readonly reverse: boolean; + /** + * Determines if and how the animation is looped. + */ + readonly loop: ModelAnimationLoop; + /** + * If this is defined, it will be used to compute the local animation time + * instead of the scene's time. + */ + animationTime: ModelAnimation.AnimationTimeCallback; + } + + export namespace ModelAnimation { + /** + * A function used to compute the local animation time for a ModelAnimation. + * @example + * // Use real time for model animation (assuming animateWhilePaused was set to true) + * function animationTime(duration) { + * return Date.now() / 1000 / duration; + * } + * @example + * // Offset the phase of the animation, so it starts halfway through its cycle. + * function animationTime(duration, seconds) { + * return seconds / duration + 0.5; + * } + * @param duration - The animation's original duration in seconds. + * @param seconds - The seconds since the animation started, in scene time. + */ + type AnimationTimeCallback = (duration: number, seconds: number) => number; + } + + /** + *
+ * Access a model's animations {@link Model#activeAnimations}. Do not call the constructor directly + *
+ * + * A collection of active model animations. + */ + export class ModelAnimationCollection { + constructor(); + /** + * The event fired when an animation is added to the collection. This can be used, for + * example, to keep a UI in sync. + * @example + * model.activeAnimations.animationAdded.addEventListener(function(model, animation) { + * console.log(`Animation added: ${animation.name}`); + * }); + */ + animationAdded: Event; + /** + * The event fired when an animation is removed from the collection. This can be used, for + * example, to keep a UI in sync. + * @example + * model.activeAnimations.animationRemoved.addEventListener(function(model, animation) { + * console.log(`Animation removed: ${animation.name}`); + * }); + */ + animationRemoved: Event; + /** + * When true, the animation will play even when the scene time is paused. However, + * whether animation takes place will depend on the animationTime functions assigned + * to the model's animations. By default, this is based on scene time, so models using + * the default will not animate regardless of this setting. + */ + animateWhilePaused: boolean; + /** + * The number of animations in the collection. + */ + readonly length: number; + /** + * The model that owns this animation collection. + */ + readonly model: Model; + /** + * Creates and adds an animation with the specified initial properties to the collection. + *

+ * This raises the {@link ModelAnimationCollection#animationAdded} event so, for example, a UI can stay in sync. + *

+ * @example + * // Example 1. Add an animation by name + * model.activeAnimations.add({ + * name : 'animation name' + * }); + * @example + * // Example 2. Add an animation by index + * model.activeAnimations.add({ + * index : 0 + * }); + * @example + * // Example 3. Add an animation and provide all properties and events + * const startTime = Cesium.JulianDate.now(); + * + * const animation = model.activeAnimations.add({ + * name : 'another animation name', + * startTime : startTime, + * delay : 0.0, // Play at startTime (default) + * stopTime : Cesium.JulianDate.addSeconds(startTime, 4.0, new Cesium.JulianDate()), + * removeOnStop : false, // Do not remove when animation stops (default) + * multiplier : 2.0, // Play at double speed + * reverse : true, // Play in reverse + * loop : Cesium.ModelAnimationLoop.REPEAT // Loop the animation + * }); + * + * animation.start.addEventListener(function(model, animation) { + * console.log(`Animation started: ${animation.name}`); + * }); + * animation.update.addEventListener(function(model, animation, time) { + * console.log(`Animation updated: ${animation.name}. glTF animation time: ${time}`); + * }); + * animation.stop.addEventListener(function(model, animation) { + * console.log(`Animation stopped: ${animation.name}`); + * }); + * @param options - Object with the following properties: + * @param [options.name] - The glTF animation name that identifies the animation. Must be defined if options.index is undefined. + * @param [options.index] - The glTF animation index that identifies the animation. Must be defined if options.name is undefined. + * @param [options.startTime] - The scene time to start playing the animation. When this is undefined, the animation starts at the next frame. + * @param [options.delay = 0.0] - The delay, in seconds, from startTime to start playing. This will only affect the animation if options.loop is ModelAnimationLoop.NONE. + * @param [options.stopTime] - The scene time to stop playing the animation. When this is undefined, the animation is played for its full duration. + * @param [options.removeOnStop = false] - When true, the animation is removed after it stops playing. This will only affect the animation if options.loop is ModelAnimationLoop.NONE. + * @param [options.multiplier = 1.0] - Values greater than 1.0 increase the speed that the animation is played relative to the scene clock speed; values less than 1.0 decrease the speed. + * @param [options.reverse = false] - When true, the animation is played in reverse. + * @param [options.loop = ModelAnimationLoop.NONE] - Determines if and how the animation is looped. + * @param [options.animationTime] - If defined, computes the local animation time for this animation. + * @returns The animation that was added to the collection. + */ + add(options: { + name?: string; + index?: number; + startTime?: JulianDate; + delay?: number; + stopTime?: JulianDate; + removeOnStop?: boolean; + multiplier?: number; + reverse?: boolean; + loop?: ModelAnimationLoop; + animationTime?: ModelAnimation.AnimationTimeCallback; + }): ModelAnimation; + /** + * Creates and adds animations with the specified initial properties to the collection + * for all animations in the model. + *

+ * This raises the {@link ModelAnimationCollection#animationAdded} event for each model so, for example, a UI can stay in sync. + *

+ * @example + * model.activeAnimations.addAll({ + * multiplier : 0.5, // Play at half-speed + * loop : Cesium.ModelAnimationLoop.REPEAT // Loop the animations + * }); + * @param [options] - Object with the following properties: + * @param [options.startTime] - The scene time to start playing the animations. When this is undefined, the animations starts at the next frame. + * @param [options.delay = 0.0] - The delay, in seconds, from startTime to start playing. This will only affect the animation if options.loop is ModelAnimationLoop.NONE. + * @param [options.stopTime] - The scene time to stop playing the animations. When this is undefined, the animations are played for its full duration. + * @param [options.removeOnStop = false] - When true, the animations are removed after they stop playing. This will only affect the animation if options.loop is ModelAnimationLoop.NONE. + * @param [options.multiplier = 1.0] - Values greater than 1.0 increase the speed that the animations play relative to the scene clock speed; values less than 1.0 decrease the speed. + * @param [options.reverse = false] - When true, the animations are played in reverse. + * @param [options.loop = ModelAnimationLoop.NONE] - Determines if and how the animations are looped. + * @param [options.animationTime] - If defined, computes the local animation time for all of the animations. + * @returns An array of {@link ModelAnimation} objects, one for each animation added to the collection. If there are no glTF animations, the array is empty. + */ + addAll(options?: { + startTime?: JulianDate; + delay?: number; + stopTime?: JulianDate; + removeOnStop?: boolean; + multiplier?: number; + reverse?: boolean; + loop?: ModelAnimationLoop; + animationTime?: ModelAnimation.AnimationTimeCallback; + }): ModelAnimation[]; + /** + * Removes an animation from the collection. + *

+ * This raises the {@link ModelAnimationCollection#animationRemoved} event so, for example, a UI can stay in sync. + *

+ *

+ * An animation can also be implicitly removed from the collection by setting {@link ModelAnimationCollection#removeOnStop} to + * true. The {@link ModelAnimationCollection#animationRemoved} event is still fired when the animation is removed. + *

+ * @example + * const a = model.activeAnimations.add({ + * name : 'animation name' + * }); + * model.activeAnimations.remove(a); // Returns true + * @param runtimeAnimation - The runtime animation to remove. + * @returns true if the animation was removed; false if the animation was not found in the collection. + */ + remove(runtimeAnimation: ModelAnimation): boolean; + /** + * Removes all animations from the collection. + *

+ * This raises the {@link ModelAnimationCollection#animationRemoved} event for each + * animation so, for example, a UI can stay in sync. + *

+ */ + removeAll(): void; + /** + * Determines whether this collection contains a given animation. + * @param runtimeAnimation - The runtime animation to check for. + * @returns true if this collection contains the animation, false otherwise. + */ + contains(runtimeAnimation: ModelAnimation): boolean; + /** + * Returns the animation in the collection at the specified index. Indices are zero-based + * and increase as animations are added. Removing an animation shifts all animations after + * it to the left, changing their indices. This function is commonly used to iterate over + * all the animations in the collection. + * @example + * // Output the names of all the animations in the collection. + * const animations = model.activeAnimations; + * const length = animations.length; + * for (let i = 0; i < length; ++i) { + * console.log(animations.get(i).name); + * } + * @param index - The zero-based index of the animation. + * @returns The runtime animation at the specified index. + */ + get(index: number): ModelAnimation; + } + + /** + * A feature of a {@link Model}. + *

+ * Provides access to a feature's properties stored in the model's feature table. + *

+ *

+ * Modifications to a ModelFeature object have the lifetime of the model. + *

+ *

+ * Do not construct this directly. Access it through picking using {@link Scene#pick}. + *

+ * @example + * // On mouse over, display all the properties for a feature in the console log. + * handler.setInputAction(function(movement) { + * const feature = scene.pick(movement.endPosition); + * if (feature instanceof Cesium.ModelFeature) { + * console.log(feature); + * } + * }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); + * @param options - Object with the following properties: + * @param options.model - The model the feature belongs to. + * @param options.featureId - The unique integral identifier for this feature. + */ + export class ModelFeature { + constructor(options: { model: Model; featureId: number }); + /** + * Gets or sets if the feature will be shown. This is set for all features + * when a style's show is evaluated. + */ + show: boolean; + /** + * Gets or sets the highlight color multiplied with the feature's color. When + * this is white, the feature's color is not changed. This is set for all features + * when a style's color is evaluated. + */ + color: Color; + /** + * Get the feature ID associated with this feature. For 3D Tiles 1.0, the + * batch ID is returned. For EXT_mesh_features, this is the feature ID from + * the selected feature ID set. + */ + readonly featureId: number; + /** + * Returns whether the feature contains this property. + * @param name - The case-sensitive name of the property. + * @returns Whether the feature contains this property. + */ + hasProperty(name: string): boolean; + /** + * Returns a copy of the value of the feature's property with the given name. + * @example + * // Display all the properties for a feature in the console log. + * const propertyIds = feature.getPropertyIds(); + * const length = propertyIds.length; + * for (let i = 0; i < length; ++i) { + * const propertyId = propertyIds[i]; + * console.log(propertyId + ': ' + feature.getProperty(propertyId)); + * } + * @param name - The case-sensitive name of the property. + * @returns The value of the property or undefined if the feature does not have this property. + */ + getProperty(name: string): any; + /** + * Returns a copy of the feature's property with the given name, examining all + * the metadata from the EXT_structural_metadata and legacy EXT_feature_metadata glTF + * extensions. Metadata is checked against name from most specific to most + * general and the first match is returned. Metadata is checked in this order: + *
    + *
  1. structural metadata property by semantic
  2. + *
  3. structural metadata property by property ID
  4. + *
+ *

+ * See the {@link https://github.com/CesiumGS/glTF/tree/3d-tiles-next/extensions/2.0/Vendor/EXT_structural_metadata|EXT_structural_metadata Extension} as well as the + * previous {@link https://github.com/CesiumGS/glTF/tree/3d-tiles-next/extensions/2.0/Vendor/EXT_feature_metadata|EXT_feature_metadata Extension} for glTF. + *

+ * @param name - The semantic or property ID of the feature. Semantics are checked before property IDs in each granularity of metadata. + * @returns The value of the property or undefined if the feature does not have this property. + */ + getPropertyInherited(name: string): any; + /** + * Returns an array of property IDs for the feature. + * @param [results] - An array into which to store the results. + * @returns The IDs of the feature's properties. + */ + getPropertyIds(results?: string[]): string[]; + /** + * Sets the value of the feature's property with the given name. + * @example + * const height = feature.getProperty('Height'); // e.g., the height of a building + * @example + * const name = 'clicked'; + * if (feature.getProperty(name)) { + * console.log('already clicked'); + * } else { + * feature.setProperty(name, true); + * console.log('first click'); + * } + * @param name - The case-sensitive name of the property. + * @param value - The value of the property that will be copied. + * @returns true if the property was set, false otherwise. + */ + setProperty(name: string, value: any): boolean; + } + + /** + *
+ * Use {@link Model#getNode} to get a node from a loaded model. Do not call the constructor directly. + *
+ * + * A model node with a modifiable transform to allow users to define their + * own animations. While a model's asset can contain animations that target + * a node's transform, this class allows users to change a node's transform + * externally. In this way, animation can be driven by another source, not + * just by the model's asset. + * @example + * const node = model.getNode("Hand"); + * node.matrix = Cesium.Matrix4.fromScale(new Cesium.Cartesian3(5.0, 1.0, 1.0), node.matrix); + */ + export class ModelNode { + constructor(); + /** + * The value of the name property of this node. + */ + readonly name: string; + /** + * The index of the node in the glTF. + */ + readonly id: number; + /** + * Determines if this node and its children will be shown. + */ + show: boolean; + /** + * The node's 4x4 matrix transform from its local coordinates to + * its parent's. Setting the matrix to undefined will restore the + * node's original transform, and allow the node to be animated by + * any animations in the model again. + *

+ * For changes to take effect, this property must be assigned to; + * setting individual elements of the matrix will not work. + *

+ */ + matrix: Matrix4; + /** + * Gets the node's original 4x4 matrix transform from its local + * coordinates to its parent's, without any node transformations + * or articulations applied. + */ + originalMatrix: Matrix4; + } + + /** + * A simple struct that serves as a value of a sampler2D-valued + * uniform. This is used with {@link CustomShader} and {@link TextureManager} + * @param options - An object with the following properties: + * @param [options.typedArray] - A typed array storing the contents of a texture. Values are stored in row-major order. Since WebGL uses a y-up convention for textures, rows are listed from bottom to top. + * @param [options.width] - The width of the image. Required when options.typedArray is present + * @param [options.height] - The height of the image. Required when options.typedArray is present. + * @param [options.url] - A URL string or resource pointing to a texture image. + * @param [options.repeat = true] - When defined, the texture sampler will be set to wrap in both directions + * @param [options.pixelFormat = PixelFormat.RGBA] - When options.typedArray is defined, this is used to determine the pixel format of the texture + * @param [options.pixelDatatype = PixelDatatype.UNSIGNED_BYTE] - When options.typedArray is defined, this is the data type of pixel values in the typed array. + * @param [options.minificationFilter = TextureMinificationFilter.LINEAR] - The minification filter of the texture sampler. + * @param [options.magnificationFilter = TextureMagnificationFilter.LINEAR] - The magnification filter of the texture sampler. + * @param [options.maximumAnisotropy = 1.0] - The maximum anisotropy of the texture sampler + */ + export class TextureUniform { + constructor(options: { + typedArray?: Uint8Array; + width?: number; + height?: number; + url?: string | Resource; + repeat?: boolean; + pixelFormat?: PixelFormat; + pixelDatatype?: PixelDatatype; + minificationFilter?: TextureMinificationFilter; + magnificationFilter?: TextureMagnificationFilter; + maximumAnisotropy?: number; + }); + } + + /** + * An enum of the basic GLSL uniform types. These can be used with + * {@link CustomShader} to declare user-defined uniforms. + */ + export enum UniformType { + /** + * A single floating point value. + */ + FLOAT = "float", + /** + * A vector of 2 floating point values. + */ + VEC2 = "vec2", + /** + * A vector of 3 floating point values. + */ + VEC3 = "vec3", + /** + * A vector of 4 floating point values. + */ + VEC4 = "vec4", + /** + * A single integer value + */ + INT = "int", + /** + * A vector of 2 integer values. + */ + INT_VEC2 = "ivec2", + /** + * A vector of 3 integer values. + */ + INT_VEC3 = "ivec3", + /** + * A vector of 4 integer values. + */ + INT_VEC4 = "ivec4", + /** + * A single boolean value. + */ + BOOL = "bool", + /** + * A vector of 2 boolean values. + */ + BOOL_VEC2 = "bvec2", + /** + * A vector of 3 boolean values. + */ + BOOL_VEC3 = "bvec3", + /** + * A vector of 4 boolean values. + */ + BOOL_VEC4 = "bvec4", + /** + * A 2x2 matrix of floating point values. + */ + MAT2 = "mat2", + /** + * A 3x3 matrix of floating point values. + */ + MAT3 = "mat3", + /** + * A 3x3 matrix of floating point values. + */ + MAT4 = "mat4", + /** + * A 2D sampled texture. + */ + SAMPLER_2D = "sampler2D", + SAMPLER_CUBE = "samplerCube", + } + + /** + * An enum for the GLSL varying types. These can be used for declaring varyings + * in {@link CustomShader} + */ + export enum VaryingType { + /** + * A single floating point value. + */ + FLOAT = "float", + /** + * A vector of 2 floating point values. + */ + VEC2 = "vec2", + /** + * A vector of 3 floating point values. + */ + VEC3 = "vec3", + /** + * A vector of 4 floating point values. + */ + VEC4 = "vec4", + /** + * A 2x2 matrix of floating point values. + */ + MAT2 = "mat2", + /** + * A 3x3 matrix of floating point values. + */ + MAT3 = "mat2", + /** + * A 3x3 matrix of floating point values. + */ + MAT4 = "mat4", + } + + /** + * Determines if and how a glTF animation is looped. + */ + export enum ModelAnimationLoop { + /** + * Play the animation once; do not loop it. + */ + NONE = 0, + /** + * Loop the animation playing it from the start immediately after it stops. + */ + REPEAT = 1, + /** + * Loop the animation. First, playing it forward, then in reverse, then forward, and so on. + */ + MIRRORED_REPEAT = 2, + } + + /** + * Draws the Moon in 3D. + * @example + * scene.moon = new Cesium.Moon(); + * @param [options] - Object with the following properties: + * @param [options.show = true] - Determines whether the moon will be rendered. + * @param [options.textureUrl = buildModuleUrl('Assets/Textures/moonSmall.jpg')] - The moon texture. + * @param [options.ellipsoid = Ellipsoid.MOON] - The moon ellipsoid. + * @param [options.onlySunLighting = true] - Use the sun as the only light source. + */ + export class Moon { + constructor(options?: { + show?: boolean; + textureUrl?: string; + ellipsoid?: Ellipsoid; + onlySunLighting?: boolean; + }); + /** + * Determines if the moon will be shown. + */ + show: boolean; + /** + * The moon texture. + */ + textureUrl: string; + /** + * Use the sun as the only light source. + */ + onlySunLighting: boolean; + /** + * Get the ellipsoid that defines the shape of the moon. + */ + readonly ellipsoid: Ellipsoid; + /** + * Returns true if this object was destroyed; otherwise, false. + *

+ * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

+ * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * moon = moon && moon.destroy(); + */ + destroy(): void; + } + + /** + * A {@link TileDiscardPolicy} specifying that tile images should never be discard. + */ + export class NeverTileDiscardPolicy { + constructor(); + /** + * Determines if the discard policy is ready to process images. + * @returns True if the discard policy is ready to process images; otherwise, false. + */ + isReady(): boolean; + /** + * Given a tile image, decide whether to discard that image. + * @param image - An image to test. + * @returns True if the image should be discarded; otherwise, false. + */ + shouldDiscardImage(image: HTMLImageElement): boolean; + } + + export namespace OpenStreetMapImageryProvider { + /** + * Initialization options for the OpenStreetMapImageryProvider constructor + * @property [url = 'https://tile.openstreetmap.org'] - The OpenStreetMap server url. + * @property [fileExtension = 'png'] - The file extension for images on the server. + * @property [retinaTiles = false] - When true, request tiles at the 2x resolution for retina displays. + * @property [rectangle = Rectangle.MAX_VALUE] - The rectangle of the layer. + * @property [minimumLevel = 0] - The minimum level-of-detail supported by the imagery provider. + * @property [maximumLevel] - The maximum level-of-detail supported by the imagery provider, or undefined if there is no limit. + * @property [ellipsoid] - The ellipsoid. If not specified, the WGS84 ellipsoid is used. + * @property [credit = 'MapQuest, Open Street Map and contributors, CC-BY-SA'] - A credit for the data source, which is displayed on the canvas. + */ + type ConstructorOptions = { + url?: string; + fileExtension?: string; + retinaTiles?: boolean; + rectangle?: Rectangle; + minimumLevel?: number; + maximumLevel?: number; + ellipsoid?: Ellipsoid; + credit?: Credit | string; + }; + } + + /** + * An imagery provider that provides tiled imagery hosted by OpenStreetMap + * or another provider of Slippy tiles. The default url connects to OpenStreetMap's volunteer-run + * servers, so you must conform to their + * {@link http://wiki.openstreetmap.org/wiki/Tile_usage_policy|Tile Usage Policy}. + * @example + * const osm = new Cesium.OpenStreetMapImageryProvider({ + * url : 'https://tile.openstreetmap.org/' + * }); + * @param options - Object describing initialization options + */ + export class OpenStreetMapImageryProvider extends UrlTemplateImageryProvider { + constructor(options: OpenStreetMapImageryProvider.ConstructorOptions); + } + + /** + * A particle emitted by a {@link ParticleSystem}. + * @param options - An object with the following properties: + * @param [options.mass = 1.0] - The mass of the particle in kilograms. + * @param [options.position = Cartesian3.ZERO] - The initial position of the particle in world coordinates. + * @param [options.velocity = Cartesian3.ZERO] - The velocity vector of the particle in world coordinates. + * @param [options.life = Number.MAX_VALUE] - The life of the particle in seconds. + * @param [options.image] - The URI, HTMLImageElement, or HTMLCanvasElement to use for the billboard. + * @param [options.startColor = Color.WHITE] - The color of a particle when it is born. + * @param [options.endColor = Color.WHITE] - The color of a particle when it dies. + * @param [options.startScale = 1.0] - The scale of the particle when it is born. + * @param [options.endScale = 1.0] - The scale of the particle when it dies. + * @param [options.imageSize = new Cartesian2(1.0, 1.0)] - The dimensions, width by height, to scale the particle image in pixels. + */ + export class Particle { + constructor(options: { + mass?: number; + position?: Cartesian3; + velocity?: Cartesian3; + life?: number; + image?: any; + startColor?: Color; + endColor?: Color; + startScale?: number; + endScale?: number; + imageSize?: Cartesian2; + }); + /** + * The mass of the particle in kilograms. + */ + mass: number; + /** + * The positon of the particle in world coordinates. + */ + position: Cartesian3; + /** + * The velocity of the particle in world coordinates. + */ + velocity: Cartesian3; + /** + * The life of the particle in seconds. + */ + life: number; + /** + * The image to use for the particle. + */ + image: any; + /** + * The color of the particle when it is born. + */ + startColor: Color; + /** + * The color of the particle when it dies. + */ + endColor: Color; + /** + * the scale of the particle when it is born. + */ + startScale: number; + /** + * The scale of the particle when it dies. + */ + endScale: number; + /** + * The dimensions, width by height, to scale the particle image in pixels. + */ + imageSize: Cartesian2; + /** + * Gets the age of the particle in seconds. + */ + age: number; + /** + * Gets the age normalized to a value in the range [0.0, 1.0]. + */ + normalizedAge: number; + } + + /** + * Represents a burst of {@link Particle}s from a {@link ParticleSystem} at a given time in the systems lifetime. + * @param [options] - An object with the following properties: + * @param [options.time = 0.0] - The time in seconds after the beginning of the particle system's lifetime that the burst will occur. + * @param [options.minimum = 0.0] - The minimum number of particles emmitted in the burst. + * @param [options.maximum = 50.0] - The maximum number of particles emitted in the burst. + */ + export class ParticleBurst { + constructor(options?: { + time?: number; + minimum?: number; + maximum?: number; + }); + /** + * The time in seconds after the beginning of the particle system's lifetime that the burst will occur. + */ + time: number; + /** + * The minimum number of particles emitted. + */ + minimum: number; + /** + * The maximum number of particles emitted. + */ + maximum: number; + /** + * true if the burst has been completed; false otherwise. + */ + complete: boolean; + } + + /** + *

+ * An object that initializes a {@link Particle} from a {@link ParticleSystem}. + *

+ *

+ * This type describes an interface and is not intended to be instantiated directly. + *

+ */ + export class ParticleEmitter { + constructor(); + } + + /** + * A ParticleSystem manages the updating and display of a collection of particles. + * @param [options] - Object with the following properties: + * @param [options.show = true] - Whether to display the particle system. + * @param [options.updateCallback] - The callback function to be called each frame to update a particle. + * @param [options.emitter = new CircleEmitter(0.5)] - The particle emitter for this system. + * @param [options.modelMatrix = Matrix4.IDENTITY] - The 4x4 transformation matrix that transforms the particle system from model to world coordinates. + * @param [options.emitterModelMatrix = Matrix4.IDENTITY] - The 4x4 transformation matrix that transforms the particle system emitter within the particle systems local coordinate system. + * @param [options.emissionRate = 5] - The number of particles to emit per second. + * @param [options.bursts] - An array of {@link ParticleBurst}, emitting bursts of particles at periodic times. + * @param [options.loop = true] - Whether the particle system should loop its bursts when it is complete. + * @param [options.scale = 1.0] - Sets the scale to apply to the image of the particle for the duration of its particleLife. + * @param [options.startScale] - The initial scale to apply to the image of the particle at the beginning of its life. + * @param [options.endScale] - The final scale to apply to the image of the particle at the end of its life. + * @param [options.color = Color.WHITE] - Sets the color of a particle for the duration of its particleLife. + * @param [options.startColor] - The color of the particle at the beginning of its life. + * @param [options.endColor] - The color of the particle at the end of its life. + * @param [options.image] - The URI, HTMLImageElement, or HTMLCanvasElement to use for the billboard. + * @param [options.imageSize = new Cartesian2(1.0, 1.0)] - If set, overrides the minimumImageSize and maximumImageSize inputs that scale the particle image's dimensions in pixels. + * @param [options.minimumImageSize] - Sets the minimum bound, width by height, above which to randomly scale the particle image's dimensions in pixels. + * @param [options.maximumImageSize] - Sets the maximum bound, width by height, below which to randomly scale the particle image's dimensions in pixels. + * @param [options.sizeInMeters] - Sets if the size of particles is in meters or pixels. true to size the particles in meters; otherwise, the size is in pixels. + * @param [options.speed = 1.0] - If set, overrides the minimumSpeed and maximumSpeed inputs with this value. + * @param [options.minimumSpeed] - Sets the minimum bound in meters per second above which a particle's actual speed will be randomly chosen. + * @param [options.maximumSpeed] - Sets the maximum bound in meters per second below which a particle's actual speed will be randomly chosen. + * @param [options.lifetime = Number.MAX_VALUE] - How long the particle system will emit particles, in seconds. + * @param [options.particleLife = 5.0] - If set, overrides the minimumParticleLife and maximumParticleLife inputs with this value. + * @param [options.minimumParticleLife] - Sets the minimum bound in seconds for the possible duration of a particle's life above which a particle's actual life will be randomly chosen. + * @param [options.maximumParticleLife] - Sets the maximum bound in seconds for the possible duration of a particle's life below which a particle's actual life will be randomly chosen. + * @param [options.mass = 1.0] - Sets the minimum and maximum mass of particles in kilograms. + * @param [options.minimumMass] - Sets the minimum bound for the mass of a particle in kilograms. A particle's actual mass will be chosen as a random amount above this value. + * @param [options.maximumMass] - Sets the maximum mass of particles in kilograms. A particle's actual mass will be chosen as a random amount below this value. + */ + export class ParticleSystem { + constructor(options?: { + show?: boolean; + updateCallback?: ParticleSystem.updateCallback; + emitter?: ParticleEmitter; + modelMatrix?: Matrix4; + emitterModelMatrix?: Matrix4; + emissionRate?: number; + bursts?: ParticleBurst[]; + loop?: boolean; + scale?: number; + startScale?: number; + endScale?: number; + color?: Color; + startColor?: Color; + endColor?: Color; + image?: any; + imageSize?: Cartesian2; + minimumImageSize?: Cartesian2; + maximumImageSize?: Cartesian2; + sizeInMeters?: boolean; + speed?: number; + minimumSpeed?: number; + maximumSpeed?: number; + lifetime?: number; + particleLife?: number; + minimumParticleLife?: number; + maximumParticleLife?: number; + mass?: number; + minimumMass?: number; + maximumMass?: number; + }); + /** + * Whether to display the particle system. + */ + show: boolean; + /** + * An array of force callbacks. The callback is passed a {@link Particle} and the difference from the last time + */ + updateCallback: ParticleSystem.updateCallback; + /** + * Whether the particle system should loop it's bursts when it is complete. + */ + loop: boolean; + /** + * The URI, HTMLImageElement, or HTMLCanvasElement to use for the billboard. + */ + image: any; + /** + * The particle emitter for this + */ + emitter: ParticleEmitter; + /** + * An array of {@link ParticleBurst}, emitting bursts of particles at periodic times. + */ + bursts: ParticleBurst[]; + /** + * The 4x4 transformation matrix that transforms the particle system from model to world coordinates. + */ + modelMatrix: Matrix4; + /** + * The 4x4 transformation matrix that transforms the particle system emitter within the particle systems local coordinate system. + */ + emitterModelMatrix: Matrix4; + /** + * The color of the particle at the beginning of its life. + */ + startColor: Color; + /** + * The color of the particle at the end of its life. + */ + endColor: Color; + /** + * The initial scale to apply to the image of the particle at the beginning of its life. + */ + startScale: number; + /** + * The final scale to apply to the image of the particle at the end of its life. + */ + endScale: number; + /** + * The number of particles to emit per second. + */ + emissionRate: number; + /** + * Sets the minimum bound in meters per second above which a particle's actual speed will be randomly chosen. + */ + minimumSpeed: number; + /** + * Sets the maximum bound in meters per second below which a particle's actual speed will be randomly chosen. + */ + maximumSpeed: number; + /** + * Sets the minimum bound in seconds for the possible duration of a particle's life above which a particle's actual life will be randomly chosen. + */ + minimumParticleLife: number; + /** + * Sets the maximum bound in seconds for the possible duration of a particle's life below which a particle's actual life will be randomly chosen. + */ + maximumParticleLife: number; + /** + * Sets the minimum mass of particles in kilograms. + */ + minimumMass: number; + /** + * Sets the maximum mass of particles in kilograms. + */ + maximumMass: number; + /** + * Sets the minimum bound, width by height, above which to randomly scale the particle image's dimensions in pixels. + */ + minimumImageSize: Cartesian2; + /** + * Sets the maximum bound, width by height, below which to randomly scale the particle image's dimensions in pixels. + */ + maximumImageSize: Cartesian2; + /** + * Gets or sets if the particle size is in meters or pixels. true to size particles in meters; otherwise, the size is in pixels. + */ + sizeInMeters: boolean; + /** + * How long the particle system will emit particles, in seconds. + */ + lifetime: number; + /** + * Fires an event when the particle system has reached the end of its lifetime. + */ + complete: Event; + /** + * When true, the particle system has reached the end of its lifetime; false otherwise. + */ + isComplete: boolean; + /** + * Returns true if this object was destroyed; otherwise, false. + *

+ * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

+ * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + */ + destroy(): void; + } + + export namespace ParticleSystem { + /** + * A function used to modify attributes of the particle at each time step. This can include force modifications, + * color, sizing, etc. + * @example + * function applyGravity(particle, dt) { + * const position = particle.position; + * const gravityVector = Cesium.Cartesian3.normalize(position, new Cesium.Cartesian3()); + * Cesium.Cartesian3.multiplyByScalar(gravityVector, GRAVITATIONAL_CONSTANT * dt, gravityVector); + * particle.velocity = Cesium.Cartesian3.add(particle.velocity, gravityVector, particle.velocity); + * } + * @param particle - The particle being updated. + * @param dt - The time in seconds since the last update. + */ + type updateCallback = (particle: Particle, dt: number) => void; + } + + /** + * An appearance for {@link GeometryInstance} instances with color attributes. + * This allows several geometry instances, each with a different color, to + * be drawn with the same {@link Primitive} as shown in the second example below. + * @example + * // A solid white line segment + * const primitive = new Cesium.Primitive({ + * geometryInstances : new Cesium.GeometryInstance({ + * geometry : new Cesium.SimplePolylineGeometry({ + * positions : Cesium.Cartesian3.fromDegreesArray([ + * 0.0, 0.0, + * 5.0, 0.0 + * ]) + * }), + * attributes : { + * color : Cesium.ColorGeometryInstanceAttribute.fromColor(new Cesium.Color(1.0, 1.0, 1.0, 1.0)) + * } + * }), + * appearance : new Cesium.PerInstanceColorAppearance({ + * flat : true, + * translucent : false + * }) + * }); + * + * // Two rectangles in a primitive, each with a different color + * const instance = new Cesium.GeometryInstance({ + * geometry : new Cesium.RectangleGeometry({ + * rectangle : Cesium.Rectangle.fromDegrees(0.0, 20.0, 10.0, 30.0) + * }), + * attributes : { + * color : new Cesium.ColorGeometryInstanceAttribute(1.0, 0.0, 0.0, 0.5) + * } + * }); + * + * const anotherInstance = new Cesium.GeometryInstance({ + * geometry : new Cesium.RectangleGeometry({ + * rectangle : Cesium.Rectangle.fromDegrees(0.0, 40.0, 10.0, 50.0) + * }), + * attributes : { + * color : new Cesium.ColorGeometryInstanceAttribute(0.0, 0.0, 1.0, 0.5) + * } + * }); + * + * const rectanglePrimitive = new Cesium.Primitive({ + * geometryInstances : [instance, anotherInstance], + * appearance : new Cesium.PerInstanceColorAppearance() + * }); + * @param [options] - Object with the following properties: + * @param [options.flat = false] - When true, flat shading is used in the fragment shader, which means lighting is not taking into account. + * @param [options.faceForward = !options.closed] - When true, the fragment shader flips the surface normal as needed to ensure that the normal faces the viewer to avoid dark spots. This is useful when both sides of a geometry should be shaded like {@link WallGeometry}. + * @param [options.translucent = true] - When true, the geometry is expected to appear translucent so {@link PerInstanceColorAppearance#renderState} has alpha blending enabled. + * @param [options.closed = false] - When true, the geometry is expected to be closed so {@link PerInstanceColorAppearance#renderState} has backface culling enabled. + * @param [options.vertexShaderSource] - Optional GLSL vertex shader source to override the default vertex shader. + * @param [options.fragmentShaderSource] - Optional GLSL fragment shader source to override the default fragment shader. + * @param [options.renderState] - Optional render state to override the default render state. + */ + export class PerInstanceColorAppearance { + constructor(options?: { + flat?: boolean; + faceForward?: boolean; + translucent?: boolean; + closed?: boolean; + vertexShaderSource?: string; + fragmentShaderSource?: string; + renderState?: any; + }); + /** + * This property is part of the {@link Appearance} interface, but is not + * used by {@link PerInstanceColorAppearance} since a fully custom fragment shader is used. + */ + material: Material; + /** + * When true, the geometry is expected to appear translucent so + * {@link PerInstanceColorAppearance#renderState} has alpha blending enabled. + */ + translucent: boolean; + /** + * The GLSL source code for the vertex shader. + */ + readonly vertexShaderSource: string; + /** + * The GLSL source code for the fragment shader. + */ + readonly fragmentShaderSource: string; + /** + * The WebGL fixed-function state to use when rendering the geometry. + *

+ * The render state can be explicitly defined when constructing a {@link PerInstanceColorAppearance} + * instance, or it is set implicitly via {@link PerInstanceColorAppearance#translucent} + * and {@link PerInstanceColorAppearance#closed}. + *

+ */ + readonly renderState: any; + /** + * When true, the geometry is expected to be closed so + * {@link PerInstanceColorAppearance#renderState} has backface culling enabled. + * If the viewer enters the geometry, it will not be visible. + */ + readonly closed: boolean; + /** + * The {@link VertexFormat} that this appearance instance is compatible with. + * A geometry can have more vertex attributes and still be compatible - at a + * potential performance cost - but it can't have less. + */ + readonly vertexFormat: VertexFormat; + /** + * When true, flat shading is used in the fragment shader, + * which means lighting is not taking into account. + */ + readonly flat: boolean; + /** + * When true, the fragment shader flips the surface normal + * as needed to ensure that the normal faces the viewer to avoid + * dark spots. This is useful when both sides of a geometry should be + * shaded like {@link WallGeometry}. + */ + readonly faceForward: boolean; + /** + * The {@link VertexFormat} that all {@link PerInstanceColorAppearance} instances + * are compatible with. This requires only position and normal + * attributes. + */ + static readonly VERTEX_FORMAT: VertexFormat; + /** + * The {@link VertexFormat} that all {@link PerInstanceColorAppearance} instances + * are compatible with when {@link PerInstanceColorAppearance#flat} is true. + * This requires only a position attribute. + */ + static readonly FLAT_VERTEX_FORMAT: VertexFormat; + /** + * Procedurally creates the full GLSL fragment shader source. For {@link PerInstanceColorAppearance}, + * this is derived from {@link PerInstanceColorAppearance#fragmentShaderSource}, {@link PerInstanceColorAppearance#flat}, + * and {@link PerInstanceColorAppearance#faceForward}. + * @returns The full GLSL fragment shader source. + */ + getFragmentShaderSource(): string; + /** + * Determines if the geometry is translucent based on {@link PerInstanceColorAppearance#translucent}. + * @returns true if the appearance is translucent. + */ + isTranslucent(): boolean; + /** + * Creates a render state. This is not the final render state instance; instead, + * it can contain a subset of render state properties identical to the render state + * created in the context. + * @returns The render state. + */ + getRenderState(): any; + } + + /** + * The optional ID of the metadata schema + */ + export var schemaId: string | undefined; + + /** + * The name of the metadata class + */ + export var className: string; + + /** + * The name of the metadata property + */ + export var propertyName: string; + + /** + * The the `MetadataClassProperty` that is described by this + * structure, as obtained from the `MetadataSchema` + */ + export var classProperty: MetadataClassProperty; + + /** + * The `PropertyTextureProperty` or `PropertyAttributeProperty` that + * is described by this structure, as obtained from the property texture + * or property attribute of the `StructuralMetadata` that matches the + * class name and property name. + */ + export var metadataProperty: any; + + /** + * Compute the rectangle that describes the part of the drawing buffer + * that is relevant for picking. + * @param drawingBufferHeight - The height of the drawing buffer + * @param position - The position inside the drawing buffer + * @param width - The width of the rectangle, assumed to + * be an odd integer number, default : 3.0 + * @param height - The height of the rectangle. If unspecified, + * height will default to the value of width + * @param result - The result rectangle + * @returns The result rectangle + */ + export function computePickingDrawingBufferRectangle( + drawingBufferHeight: number, + position: Cartesian2, + width: number | undefined, + height: number | undefined, + result: BoundingRectangle, + ): BoundingRectangle; + + /** + * Information about metadata that is supposed to be picked + * @property schemaId - The optional ID of the metadata schema + * @property className - The name of the metadata class + * @property propertyName - The name of the metadata property + * @property classProperty - The metadata class property + */ + export type PickedMetadataInfo = { + schemaId: string | undefined; + className: string; + propertyName: string; + classProperty: MetadataClassProperty; + }; + + /** + * Options for performing point attenuation based on geometric error when rendering + * point clouds using 3D Tiles. + * @param [options] - Object with the following properties: + * @param [options.attenuation = false] - Perform point attenuation based on geometric error. + * @param [options.geometricErrorScale = 1.0] - Scale to be applied to each tile's geometric error. + * @param [options.maximumAttenuation] - Maximum attenuation in pixels. Defaults to the Cesium3DTileset's maximumScreenSpaceError. + * @param [options.baseResolution] - Average base resolution for the dataset in meters. Substitute for Geometric Error when not available. + * @param [options.eyeDomeLighting = true] - When true, use eye dome lighting when drawing with point attenuation. + * @param [options.eyeDomeLightingStrength = 1.0] - Increasing this value increases contrast on slopes and edges. + * @param [options.eyeDomeLightingRadius = 1.0] - Increase the thickness of contours from eye dome lighting. + * @param [options.backFaceCulling = false] - Determines whether back-facing points are hidden. This option works only if data has normals included. + * @param [options.normalShading = true] - Determines whether a point cloud that contains normals is shaded by the scene's light source. + */ + export class PointCloudShading { + constructor(options?: { + attenuation?: boolean; + geometricErrorScale?: number; + maximumAttenuation?: number; + baseResolution?: number; + eyeDomeLighting?: boolean; + eyeDomeLightingStrength?: number; + eyeDomeLightingRadius?: number; + backFaceCulling?: boolean; + normalShading?: boolean; + }); + /** + * Perform point attenuation based on geometric error. + */ + attenuation: boolean; + /** + * Scale to be applied to the geometric error before computing attenuation. + */ + geometricErrorScale: number; + /** + * Maximum point attenuation in pixels. If undefined, the Cesium3DTileset's maximumScreenSpaceError will be used. + */ + maximumAttenuation: number; + /** + * Average base resolution for the dataset in meters. + * Used in place of geometric error when geometric error is 0. + * If undefined, an approximation will be computed for each tile that has geometric error of 0. + */ + baseResolution: number; + /** + * Use eye dome lighting when drawing with point attenuation + * Requires support for EXT_frag_depth, OES_texture_float, and WEBGL_draw_buffers extensions in WebGL 1.0, + * otherwise eye dome lighting is ignored. + */ + eyeDomeLighting: boolean; + /** + * Eye dome lighting strength (apparent contrast) + */ + eyeDomeLightingStrength: number; + /** + * Thickness of contours from eye dome lighting + */ + eyeDomeLightingRadius: number; + /** + * Determines whether back-facing points are hidden. + * This option works only if data has normals included. + */ + backFaceCulling: boolean; + /** + * Determines whether a point cloud that contains normals is shaded by the scene's light source. + */ + normalShading: boolean; + /** + * Determines if point cloud shading is supported. + * @param scene - The scene. + * @returns true if point cloud shading is supported; otherwise, returns false + */ + static isSupported(scene: Scene): boolean; + } + + /** + *
+ * A point is created and its initial properties are set by calling {@link PointPrimitiveCollection#add}. Do not call the constructor directly. + *
+ * A graphical point positioned in the 3D scene, that is created + * and rendered using a {@link PointPrimitiveCollection}. + */ + export class PointPrimitive { + constructor(); + /** + * Determines if this point will be shown. Use this to hide or show a point, instead + * of removing it and re-adding it to the collection. + */ + show: boolean; + /** + * Gets or sets the Cartesian position of this point. + */ + position: Cartesian3; + /** + * Gets or sets near and far scaling properties of a point based on the point's distance from the camera. + * A point's scale will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the point's scale remains clamped to the nearest bound. This scale + * multiplies the pixelSize and outlineWidth to affect the total size of the point. If undefined, + * scaleByDistance will be disabled. + * @example + * // Example 1. + * // Set a pointPrimitive's scaleByDistance to scale to 15 when the + * // camera is 1500 meters from the pointPrimitive and disappear as + * // the camera distance approaches 8.0e6 meters. + * p.scaleByDistance = new Cesium.NearFarScalar(1.5e2, 15, 8.0e6, 0.0); + * @example + * // Example 2. + * // disable scaling by distance + * p.scaleByDistance = undefined; + */ + scaleByDistance: NearFarScalar; + /** + * Gets or sets near and far translucency properties of a point based on the point's distance from the camera. + * A point's translucency will interpolate between the {@link NearFarScalar#nearValue} and + * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds + * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. + * Outside of these ranges the point's translucency remains clamped to the nearest bound. If undefined, + * translucencyByDistance will be disabled. + * @example + * // Example 1. + * // Set a point's translucency to 1.0 when the + * // camera is 1500 meters from the point and disappear as + * // the camera distance approaches 8.0e6 meters. + * p.translucencyByDistance = new Cesium.NearFarScalar(1.5e2, 1.0, 8.0e6, 0.0); + * @example + * // Example 2. + * // disable translucency by distance + * p.translucencyByDistance = undefined; + */ + translucencyByDistance: NearFarScalar; + /** + * Gets or sets the inner size of the point in pixels. + */ + pixelSize: number; + /** + * Gets or sets the inner color of the point. + * The red, green, blue, and alpha values are indicated by value's red, green, + * blue, and alpha properties as shown in Example 1. These components range from 0.0 + * (no intensity) to 1.0 (full intensity). + * @example + * // Example 1. Assign yellow. + * p.color = Cesium.Color.YELLOW; + * @example + * // Example 2. Make a pointPrimitive 50% translucent. + * p.color = new Cesium.Color(1.0, 1.0, 1.0, 0.5); + */ + color: Color; + /** + * Gets or sets the outline color of the point. + */ + outlineColor: Color; + /** + * Gets or sets the outline width in pixels. This width adds to pixelSize, + * increasing the total size of the point. + */ + outlineWidth: number; + /** + * Gets or sets the condition specifying at what distance from the camera that this point will be displayed. + */ + distanceDisplayCondition: DistanceDisplayCondition; + /** + * Gets or sets the distance from the camera at which to disable the depth test to, for example, prevent clipping against terrain. + * When set to zero, the depth test is always applied. When set to Number.POSITIVE_INFINITY, the depth test is never applied. + */ + disableDepthTestDistance: number; + /** + * Gets or sets the user-defined value returned when the point is picked. + */ + id: any; + /** + * The {@link SplitDirection} to apply to this point. + */ + splitDirection: SplitDirection; + /** + * Computes the screen-space position of the point's origin. + * The screen space origin is the top, left corner of the canvas; x increases from + * left to right, and y increases from top to bottom. + * @example + * console.log(p.computeScreenSpacePosition(scene).toString()); + * @param scene - The scene. + * @param [result] - The object onto which to store the result. + * @returns The screen-space position of the point. + */ + computeScreenSpacePosition(scene: Scene, result?: Cartesian2): Cartesian2; + /** + * Determines if this point equals another point. Points are equal if all their properties + * are equal. Points in different collections can be equal. + * @param [other] - The point to compare for equality. + * @returns true if the points are equal; otherwise, false. + */ + equals(other?: PointPrimitive): boolean; + } + + /** + * A renderable collection of points. + *

+ * Points are added and removed from the collection using {@link PointPrimitiveCollection#add} + * and {@link PointPrimitiveCollection#remove}. + * @example + * // Create a pointPrimitive collection with two points + * const points = scene.primitives.add(new Cesium.PointPrimitiveCollection()); + * points.add({ + * position : new Cesium.Cartesian3(1.0, 2.0, 3.0), + * color : Cesium.Color.YELLOW + * }); + * points.add({ + * position : new Cesium.Cartesian3(4.0, 5.0, 6.0), + * color : Cesium.Color.CYAN + * }); + * @param [options] - Object with the following properties: + * @param [options.modelMatrix = Matrix4.IDENTITY] - The 4x4 transformation matrix that transforms each point from model to world coordinates. + * @param [options.debugShowBoundingVolume = false] - For debugging only. Determines if this primitive's commands' bounding spheres are shown. + * @param [options.blendOption = BlendOption.OPAQUE_AND_TRANSLUCENT] - The point blending option. The default + * is used for rendering both opaque and translucent points. However, if either all of the points are completely opaque or all are completely translucent, + * setting the technique to BlendOption.OPAQUE or BlendOption.TRANSLUCENT can improve performance by up to 2x. + * @param [options.show = true] - Determines if the primitives in the collection will be shown. + */ + export class PointPrimitiveCollection { + constructor(options?: { + modelMatrix?: Matrix4; + debugShowBoundingVolume?: boolean; + blendOption?: BlendOption; + show?: boolean; + }); + /** + * Determines if primitives in this collection will be shown. + */ + show: boolean; + /** + * The 4x4 transformation matrix that transforms each point in this collection from model to world coordinates. + * When this is the identity matrix, the pointPrimitives are drawn in world coordinates, i.e., Earth's WGS84 coordinates. + * Local reference frames can be used by providing a different transformation matrix, like that returned + * by {@link Transforms.eastNorthUpToFixedFrame}. + * @example + * const center = Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883); + * pointPrimitives.modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(center); + * pointPrimitives.add({ + * color : Cesium.Color.ORANGE, + * position : new Cesium.Cartesian3(0.0, 0.0, 0.0) // center + * }); + * pointPrimitives.add({ + * color : Cesium.Color.YELLOW, + * position : new Cesium.Cartesian3(1000000.0, 0.0, 0.0) // east + * }); + * pointPrimitives.add({ + * color : Cesium.Color.GREEN, + * position : new Cesium.Cartesian3(0.0, 1000000.0, 0.0) // north + * }); + * pointPrimitives.add({ + * color : Cesium.Color.CYAN, + * position : new Cesium.Cartesian3(0.0, 0.0, 1000000.0) // up + * }); + */ + modelMatrix: Matrix4; + /** + * This property is for debugging only; it is not for production use nor is it optimized. + *

+ * Draws the bounding sphere for each draw command in the primitive. + *

+ */ + debugShowBoundingVolume: boolean; + /** + * The point blending option. The default is used for rendering both opaque and translucent points. + * However, if either all of the points are completely opaque or all are completely translucent, + * setting the technique to BlendOption.OPAQUE or BlendOption.TRANSLUCENT can improve + * performance by up to 2x. + */ + blendOption: BlendOption; + /** + * Returns the number of points in this collection. This is commonly used with + * {@link PointPrimitiveCollection#get} to iterate over all the points + * in the collection. + */ + length: number; + /** + * Creates and adds a point with the specified initial properties to the collection. + * The added point is returned so it can be modified or removed from the collection later. + * @example + * // Example 1: Add a point, specifying all the default values. + * const p = pointPrimitives.add({ + * show : true, + * position : Cesium.Cartesian3.ZERO, + * pixelSize : 10.0, + * color : Cesium.Color.WHITE, + * outlineColor : Cesium.Color.TRANSPARENT, + * outlineWidth : 0.0, + * id : undefined + * }); + * @example + * // Example 2: Specify only the point's cartographic position. + * const p = pointPrimitives.add({ + * position : Cesium.Cartesian3.fromDegrees(longitude, latitude, height) + * }); + * @param [options] - A template describing the point's properties as shown in Example 1. + * @returns The point that was added to the collection. + */ + add(options?: any): PointPrimitive; + /** + * Removes a point from the collection. + * @example + * const p = pointPrimitives.add(...); + * pointPrimitives.remove(p); // Returns true + * @param pointPrimitive - The point to remove. + * @returns true if the point was removed; false if the point was not found in the collection. + */ + remove(pointPrimitive: PointPrimitive): boolean; + /** + * Removes all points from the collection. + * @example + * pointPrimitives.add(...); + * pointPrimitives.add(...); + * pointPrimitives.removeAll(); + */ + removeAll(): void; + /** + * Check whether this collection contains a given point. + * @param [pointPrimitive] - The point to check for. + * @returns true if this collection contains the point, false otherwise. + */ + contains(pointPrimitive?: PointPrimitive): boolean; + /** + * Returns the point in the collection at the specified index. Indices are zero-based + * and increase as points are added. Removing a point shifts all points after + * it to the left, changing their indices. This function is commonly used with + * {@link PointPrimitiveCollection#length} to iterate over all the points + * in the collection. + * @example + * // Toggle the show property of every point in the collection + * const len = pointPrimitives.length; + * for (let i = 0; i < len; ++i) { + * const p = pointPrimitives.get(i); + * p.show = !p.show; + * } + * @param index - The zero-based index of the point. + * @returns The point at the specified index. + */ + get(index: number): PointPrimitive; + /** + * Returns true if this object was destroyed; otherwise, false. + *

+ * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

+ * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * pointPrimitives = pointPrimitives && pointPrimitives.destroy(); + */ + destroy(): void; + } + + /** + *
+ * Create this by calling {@link PolylineCollection#add}. Do not call the constructor directly. + *
+ * + * A renderable polyline. + */ + export class Polyline { + constructor(); + /** + * Determines if this polyline will be shown. Use this to hide or show a polyline, instead + * of removing it and re-adding it to the collection. + */ + show: boolean; + /** + * Gets or sets the positions of the polyline. + * @example + * polyline.positions = Cesium.Cartesian3.fromDegreesArray([ + * 0.0, 0.0, + * 10.0, 0.0, + * 0.0, 20.0 + * ]); + */ + positions: Cartesian3[]; + /** + * Gets or sets the surface appearance of the polyline. This can be one of several built-in {@link Material} objects or a custom material, scripted with + * {@link https://github.com/CesiumGS/cesium/wiki/Fabric|Fabric}. + */ + material: Material; + /** + * Gets or sets the width of the polyline. + */ + width: number; + /** + * Gets or sets whether a line segment will be added between the first and last polyline positions. + */ + loop: boolean; + /** + * Gets or sets the user-defined value returned when the polyline is picked. + */ + id: any; + /** + * Gets or sets the condition specifying at what distance from the camera that this polyline will be displayed. + */ + distanceDisplayCondition: DistanceDisplayCondition; + } + + /** + * A renderable collection of polylines. + *

+ *
+ *
+ * Example polylines + *
+ *

+ * Polylines are added and removed from the collection using {@link PolylineCollection#add} + * and {@link PolylineCollection#remove}. + * @example + * // Create a polyline collection with two polylines + * const polylines = new Cesium.PolylineCollection(); + * polylines.add({ + * positions : Cesium.Cartesian3.fromDegreesArray([ + * -75.10, 39.57, + * -77.02, 38.53, + * -80.50, 35.14, + * -80.12, 25.46]), + * width : 2 + * }); + * + * polylines.add({ + * positions : Cesium.Cartesian3.fromDegreesArray([ + * -73.10, 37.57, + * -75.02, 36.53, + * -78.50, 33.14, + * -78.12, 23.46]), + * width : 4 + * }); + * @param [options] - Object with the following properties: + * @param [options.modelMatrix = Matrix4.IDENTITY] - The 4x4 transformation matrix that transforms each polyline from model to world coordinates. + * @param [options.debugShowBoundingVolume = false] - For debugging only. Determines if this primitive's commands' bounding spheres are shown. + * @param [options.show = true] - Determines if the polylines in the collection will be shown. + */ + export class PolylineCollection { + constructor(options?: { + modelMatrix?: Matrix4; + debugShowBoundingVolume?: boolean; + show?: boolean; + }); + /** + * Determines if polylines in this collection will be shown. + */ + show: boolean; + /** + * The 4x4 transformation matrix that transforms each polyline in this collection from model to world coordinates. + * When this is the identity matrix, the polylines are drawn in world coordinates, i.e., Earth's WGS84 coordinates. + * Local reference frames can be used by providing a different transformation matrix, like that returned + * by {@link Transforms.eastNorthUpToFixedFrame}. + */ + modelMatrix: Matrix4; + /** + * This property is for debugging only; it is not for production use nor is it optimized. + *

+ * Draws the bounding sphere for each draw command in the primitive. + *

+ */ + debugShowBoundingVolume: boolean; + /** + * Returns the number of polylines in this collection. This is commonly used with + * {@link PolylineCollection#get} to iterate over all the polylines + * in the collection. + */ + length: number; + /** + * Creates and adds a polyline with the specified initial properties to the collection. + * The added polyline is returned so it can be modified or removed from the collection later. + * @example + * // Example 1: Add a polyline, specifying all the default values. + * const p = polylines.add({ + * show : true, + * positions : ellipsoid.cartographicArrayToCartesianArray([ + * Cesium.Cartographic.fromDegrees(-75.10, 39.57), + * Cesium.Cartographic.fromDegrees(-77.02, 38.53)]), + * width : 1 + * }); + * @param [options] - A template describing the polyline's properties as shown in Example 1. + * @returns The polyline that was added to the collection. + */ + add(options?: any): Polyline; + /** + * Removes a polyline from the collection. + * @example + * const p = polylines.add(...); + * polylines.remove(p); // Returns true + * @param polyline - The polyline to remove. + * @returns true if the polyline was removed; false if the polyline was not found in the collection. + */ + remove(polyline: Polyline): boolean; + /** + * Removes all polylines from the collection. + * @example + * polylines.add(...); + * polylines.add(...); + * polylines.removeAll(); + */ + removeAll(): void; + /** + * Determines if this collection contains the specified polyline. + * @param polyline - The polyline to check for. + * @returns true if this collection contains the polyline, false otherwise. + */ + contains(polyline: Polyline): boolean; + /** + * Returns the polyline in the collection at the specified index. Indices are zero-based + * and increase as polylines are added. Removing a polyline shifts all polylines after + * it to the left, changing their indices. This function is commonly used with + * {@link PolylineCollection#length} to iterate over all the polylines + * in the collection. + * @example + * // Toggle the show property of every polyline in the collection + * const len = polylines.length; + * for (let i = 0; i < len; ++i) { + * const p = polylines.get(i); + * p.show = !p.show; + * } + * @param index - The zero-based index of the polyline. + * @returns The polyline at the specified index. + */ + get(index: number): Polyline; + /** + * Called when {@link Viewer} or {@link CesiumWidget} render the scene to + * get the draw commands needed to render this primitive. + *

+ * Do not call this function directly. This is documented just to + * list the exceptions that may be propagated when the scene is rendered: + *

+ */ + update(): void; + /** + * Returns true if this object was destroyed; otherwise, false. + *

+ * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

+ * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * polylines = polylines && polylines.destroy(); + */ + destroy(): void; + } + + /** + * An appearance for {@link GeometryInstance} instances with color attributes and + * {@link PolylineGeometry} or {@link GroundPolylineGeometry}. + * This allows several geometry instances, each with a different color, to + * be drawn with the same {@link Primitive}. + * @example + * // A solid white line segment + * const primitive = new Cesium.Primitive({ + * geometryInstances : new Cesium.GeometryInstance({ + * geometry : new Cesium.PolylineGeometry({ + * positions : Cesium.Cartesian3.fromDegreesArray([ + * 0.0, 0.0, + * 5.0, 0.0 + * ]), + * width : 10.0, + * vertexFormat : Cesium.PolylineColorAppearance.VERTEX_FORMAT + * }), + * attributes : { + * color : Cesium.ColorGeometryInstanceAttribute.fromColor(new Cesium.Color(1.0, 1.0, 1.0, 1.0)) + * } + * }), + * appearance : new Cesium.PolylineColorAppearance({ + * translucent : false + * }) + * }); + * @param [options] - Object with the following properties: + * @param [options.translucent = true] - When true, the geometry is expected to appear translucent so {@link PolylineColorAppearance#renderState} has alpha blending enabled. + * @param [options.vertexShaderSource] - Optional GLSL vertex shader source to override the default vertex shader. + * @param [options.fragmentShaderSource] - Optional GLSL fragment shader source to override the default fragment shader. + * @param [options.renderState] - Optional render state to override the default render state. + */ + export class PolylineColorAppearance { + constructor(options?: { + translucent?: boolean; + vertexShaderSource?: string; + fragmentShaderSource?: string; + renderState?: any; + }); + /** + * This property is part of the {@link Appearance} interface, but is not + * used by {@link PolylineColorAppearance} since a fully custom fragment shader is used. + */ + material: Material; + /** + * When true, the geometry is expected to appear translucent so + * {@link PolylineColorAppearance#renderState} has alpha blending enabled. + */ + translucent: boolean; + /** + * The GLSL source code for the vertex shader. + */ + readonly vertexShaderSource: string; + /** + * The GLSL source code for the fragment shader. + */ + readonly fragmentShaderSource: string; + /** + * The WebGL fixed-function state to use when rendering the geometry. + *

+ * The render state can be explicitly defined when constructing a {@link PolylineColorAppearance} + * instance, or it is set implicitly via {@link PolylineColorAppearance#translucent}. + *

+ */ + readonly renderState: any; + /** + * When true, the geometry is expected to be closed so + * {@link PolylineColorAppearance#renderState} has backface culling enabled. + * This is always false for PolylineColorAppearance. + */ + readonly closed: boolean; + /** + * The {@link VertexFormat} that this appearance instance is compatible with. + * A geometry can have more vertex attributes and still be compatible - at a + * potential performance cost - but it can't have less. + */ + readonly vertexFormat: VertexFormat; + /** + * The {@link VertexFormat} that all {@link PolylineColorAppearance} instances + * are compatible with. This requires only a position attribute. + */ + static readonly VERTEX_FORMAT: VertexFormat; + /** + * Procedurally creates the full GLSL fragment shader source. + * @returns The full GLSL fragment shader source. + */ + getFragmentShaderSource(): string; + /** + * Determines if the geometry is translucent based on {@link PolylineColorAppearance#translucent}. + * @returns true if the appearance is translucent. + */ + isTranslucent(): boolean; + /** + * Creates a render state. This is not the final render state instance; instead, + * it can contain a subset of render state properties identical to the render state + * created in the context. + * @returns The render state. + */ + getRenderState(): any; + } + + /** + * An appearance for {@link PolylineGeometry} that supports shading with materials. + * @example + * const primitive = new Cesium.Primitive({ + * geometryInstances : new Cesium.GeometryInstance({ + * geometry : new Cesium.PolylineGeometry({ + * positions : Cesium.Cartesian3.fromDegreesArray([ + * 0.0, 0.0, + * 5.0, 0.0 + * ]), + * width : 10.0, + * vertexFormat : Cesium.PolylineMaterialAppearance.VERTEX_FORMAT + * }) + * }), + * appearance : new Cesium.PolylineMaterialAppearance({ + * material : Cesium.Material.fromType('Color') + * }) + * }); + * @param [options] - Object with the following properties: + * @param [options.translucent = true] - When true, the geometry is expected to appear translucent so {@link PolylineMaterialAppearance#renderState} has alpha blending enabled. + * @param [options.material = Material.ColorType] - The material used to determine the fragment color. + * @param [options.vertexShaderSource] - Optional GLSL vertex shader source to override the default vertex shader. + * @param [options.fragmentShaderSource] - Optional GLSL fragment shader source to override the default fragment shader. + * @param [options.renderState] - Optional render state to override the default render state. + */ + export class PolylineMaterialAppearance { + constructor(options?: { + translucent?: boolean; + material?: Material; + vertexShaderSource?: string; + fragmentShaderSource?: string; + renderState?: any; + }); + /** + * The material used to determine the fragment color. Unlike other {@link PolylineMaterialAppearance} + * properties, this is not read-only, so an appearance's material can change on the fly. + */ + material: Material; + /** + * When true, the geometry is expected to appear translucent so + * {@link PolylineMaterialAppearance#renderState} has alpha blending enabled. + */ + translucent: boolean; + /** + * The GLSL source code for the vertex shader. + */ + readonly vertexShaderSource: string; + /** + * The GLSL source code for the fragment shader. + */ + readonly fragmentShaderSource: string; + /** + * The WebGL fixed-function state to use when rendering the geometry. + *

+ * The render state can be explicitly defined when constructing a {@link PolylineMaterialAppearance} + * instance, or it is set implicitly via {@link PolylineMaterialAppearance#translucent} + * and {@link PolylineMaterialAppearance#closed}. + *

+ */ + readonly renderState: any; + /** + * When true, the geometry is expected to be closed so + * {@link PolylineMaterialAppearance#renderState} has backface culling enabled. + * This is always false for PolylineMaterialAppearance. + */ + readonly closed: boolean; + /** + * The {@link VertexFormat} that this appearance instance is compatible with. + * A geometry can have more vertex attributes and still be compatible - at a + * potential performance cost - but it can't have less. + */ + readonly vertexFormat: VertexFormat; + /** + * The {@link VertexFormat} that all {@link PolylineMaterialAppearance} instances + * are compatible with. This requires position and st attributes. + */ + static readonly VERTEX_FORMAT: VertexFormat; + /** + * Procedurally creates the full GLSL fragment shader source. For {@link PolylineMaterialAppearance}, + * this is derived from {@link PolylineMaterialAppearance#fragmentShaderSource} and {@link PolylineMaterialAppearance#material}. + * @returns The full GLSL fragment shader source. + */ + getFragmentShaderSource(): string; + /** + * Determines if the geometry is translucent based on {@link PolylineMaterialAppearance#translucent} and {@link Material#isTranslucent}. + * @returns true if the appearance is translucent. + */ + isTranslucent(): boolean; + /** + * Creates a render state. This is not the final render state instance; instead, + * it can contain a subset of render state properties identical to the render state + * created in the context. + * @returns The render state. + */ + getRenderState(): any; + } + + /** + * Runs a post-process stage on either the texture rendered by the scene or the output of a previous post-process stage. + * @example + * // Simple stage to change the color + * const fs =` + * uniform sampler2D colorTexture; + * in vec2 v_textureCoordinates; + * uniform float scale; + * uniform vec3 offset; + * void main() { + * vec4 color = texture(colorTexture, v_textureCoordinates); + * out_FragColor = vec4(color.rgb * scale + offset, 1.0); + * }`; + * scene.postProcessStages.add(new Cesium.PostProcessStage({ + * fragmentShader : fs, + * uniforms : { + * scale : 1.1, + * offset : function() { + * return new Cesium.Cartesian3(0.1, 0.2, 0.3); + * } + * } + * })); + * @example + * // Simple stage to change the color of what is selected. + * // If czm_selected returns true, the current fragment belongs to geometry in the selected array. + * const fs =` + * uniform sampler2D colorTexture; + * in vec2 v_textureCoordinates; + * uniform vec4 highlight; + * void main() { + * vec4 color = texture(colorTexture, v_textureCoordinates); + * if (czm_selected()) { + * vec3 highlighted = highlight.a * highlight.rgb + (1.0 - highlight.a) * color.rgb; + * out_FragColor = vec4(highlighted, 1.0); + * } else { + * out_FragColor = color; + * } + * }`; + * const stage = scene.postProcessStages.add(new Cesium.PostProcessStage({ + * fragmentShader : fs, + * uniforms : { + * highlight : function() { + * return new Cesium.Color(1.0, 0.0, 0.0, 0.5); + * } + * } + * })); + * stage.selected = [cesium3DTileFeature]; + * @param options - An object with the following properties: + * @param options.fragmentShader - The fragment shader to use. The default sampler2D uniforms are colorTexture and depthTexture. The color texture is the output of rendering the scene or the previous stage. The depth texture is the output from rendering the scene. The shader should contain one or both uniforms. There is also a vec2 varying named v_textureCoordinates that can be used to sample the textures. + * @param [options.uniforms] - An object whose properties will be used to set the shaders uniforms. The properties can be constant values or a function. A constant value can also be a URI, data URI, or HTML element to use as a texture. + * @param [options.textureScale = 1.0] - A number in the range (0.0, 1.0] used to scale the texture dimensions. A scale of 1.0 will render this post-process stage to a texture the size of the viewport. + * @param [options.forcePowerOfTwo = false] - Whether or not to force the texture dimensions to be both equal powers of two. The power of two will be the next power of two of the minimum of the dimensions. + * @param [options.sampleMode = PostProcessStageSampleMode.NEAREST] - How to sample the input color texture. + * @param [options.pixelFormat = PixelFormat.RGBA] - The color pixel format of the output texture. + * @param [options.pixelDatatype = PixelDatatype.UNSIGNED_BYTE] - The pixel data type of the output texture. + * @param [options.clearColor = Color.BLACK] - The color to clear the output texture to. + * @param [options.scissorRectangle] - The rectangle to use for the scissor test. + * @param [options.name = createGuid()] - The unique name of this post-process stage for reference by other stages in a composite. If a name is not supplied, a GUID will be generated. + */ + export class PostProcessStage { + constructor(options: { + fragmentShader: string; + uniforms?: any; + textureScale?: number; + forcePowerOfTwo?: boolean; + sampleMode?: PostProcessStageSampleMode; + pixelFormat?: PixelFormat; + pixelDatatype?: PixelDatatype; + clearColor?: Color; + scissorRectangle?: BoundingRectangle; + name?: string; + }); + /** + * Whether or not to execute this post-process stage when ready. + */ + enabled: boolean; + /** + * Determines if this post-process stage is ready to be executed. A stage is only executed when both ready + * and {@link PostProcessStage#enabled} are true. A stage will not be ready while it is waiting on textures + * to load. + */ + readonly ready: boolean; + /** + * The unique name of this post-process stage for reference by other stages in a {@link PostProcessStageComposite}. + */ + readonly name: string; + /** + * The fragment shader to use when execute this post-process stage. + *

+ * The shader must contain a sampler uniform declaration for colorTexture, depthTexture, + * or both. + *

+ *

+ * The shader must contain a vec2 varying declaration for v_textureCoordinates for sampling + * the texture uniforms. + *

+ */ + readonly fragmentShader: string; + /** + * An object whose properties are used to set the uniforms of the fragment shader. + *

+ * The object property values can be either a constant or a function. The function will be called + * each frame before the post-process stage is executed. + *

+ *

+ * A constant value can also be a URI to an image, a data URI, or an HTML element that can be used as a texture, such as HTMLImageElement or HTMLCanvasElement. + *

+ *

+ * If this post-process stage is part of a {@link PostProcessStageComposite} that does not execute in series, the constant value can also be + * the name of another stage in a composite. This will set the uniform to the output texture the stage with that name. + *

+ */ + readonly uniforms: any; + /** + * A number in the range (0.0, 1.0] used to scale the output texture dimensions. A scale of 1.0 will render this post-process stage to a texture the size of the viewport. + */ + readonly textureScale: number; + /** + * Whether or not to force the output texture dimensions to be both equal powers of two. The power of two will be the next power of two of the minimum of the dimensions. + */ + readonly forcePowerOfTwo: number; + /** + * How to sample the input color texture. + */ + readonly sampleMode: PostProcessStageSampleMode; + /** + * The color pixel format of the output texture. + */ + readonly pixelFormat: PixelFormat; + /** + * The pixel data type of the output texture. + */ + readonly pixelDatatype: PixelDatatype; + /** + * The color to clear the output texture to. + */ + readonly clearColor: Color; + /** + * The {@link BoundingRectangle} to use for the scissor test. A default bounding rectangle will disable the scissor test. + */ + readonly scissorRectangle: BoundingRectangle; + /** + * The features selected for applying the post-process. + *

+ * In the fragment shader, use czm_selected to determine whether or not to apply the post-process + * stage to that fragment. For example: + * + * if (czm_selected(v_textureCoordinates)) { + * // apply post-process stage + * } else { + * out_FragColor = texture(colorTexture, v_textureCoordinates); + * } + * + *

+ */ + selected: any[]; + /** + * Returns true if this object was destroyed; otherwise, false. + *

+ * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + *

+ * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

+ * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + *

+ */ + destroy(): void; + } + + /** + * A collection of {@link PostProcessStage}s and/or {@link PostProcessStageComposite}s. + *

+ * The input texture for each post-process stage is the texture rendered to by the scene or the texture rendered + * to by the previous stage in the collection. + *

+ *

+ * If the ambient occlusion or bloom stages are enabled, they will execute before all other stages. + *

+ *

+ * If the FXAA stage is enabled, it will execute after all other stages. + *

+ */ + export class PostProcessStageCollection { + constructor(); + /** + * Determines if all of the post-process stages in the collection are ready to be executed. + */ + readonly ready: boolean; + /** + * A post-process stage for Fast Approximate Anti-aliasing. + *

+ * When enabled, this stage will execute after all others. + *

+ */ + readonly fxaa: PostProcessStage; + /** + * A post-process stage that applies Horizon-based Ambient Occlusion (HBAO) to the input texture. + *

+ * Ambient occlusion simulates shadows from ambient light. These shadows would always be present when the + * surface receives light and regardless of the light's position. + *

+ *

+ * The uniforms have the following properties: + *

    + *
  • intensity is a scalar value used to lighten or darken the shadows exponentially. Higher values make the shadows darker. The default value is 3.0.
  • + *
  • bias is a scalar value representing an angle in radians. If the dot product between the normal of the sample and the vector to the camera is less than this value, + * sampling stops in the current direction. This is used to remove shadows from near planar edges. The default value is 0.1.
  • + *
  • lengthCap is a scalar value representing a length in meters. If the distance from the current sample to first sample is greater than this value, + * sampling stops in the current direction. The default value is 0.26.
  • + *
  • directionCount is the number of directions along which the ray marching will search for occluders. The default value is 8.
  • + *
  • stepCount is the number of steps the ray marching will take along each direction. The default value is 32.
  • + *
  • randomTexture is a texture where the red channel is a random value in [0.0, 1.0]. The default value is undefined. This texture needs to be set.
  • + *
  • ambientOcclusionOnly is a boolean value. When true, only the shadows generated are written to the output. When false, the input texture is modulated + * with the ambient occlusion. This is a useful debug option for seeing the effects of changing the uniform values. The default value is false.
  • + *
+ *

+ * When enabled, this stage will execute before all others. + *

+ */ + readonly ambientOcclusion: PostProcessStageComposite; + /** + * A post-process stage for a bloom effect. + *

+ * A bloom effect adds glow effect, makes bright areas brighter, and dark areas darker. + *

+ *

+ * This stage has the following uniforms: contrast, brightness, glowOnly, + * delta, sigma, and stepSize. + *

+ *
    + *
  • contrast is a scalar value in the range [-255.0, 255.0] and affects the contract of the effect. The default value is 128.0.
  • + * + *
  • brightness is a scalar value. The input texture RGB value is converted to hue, saturation, and brightness (HSB) then this value is + * added to the brightness. The default value is -0.3.
  • + * + *
  • glowOnly is a boolean value. When true, only the glow effect will be shown. When false, the glow will be added to the input texture. + * The default value is false. This is a debug option for viewing the effects when changing the other uniform values.
  • + *
+ *

+ * delta, sigma, and stepSize are the same properties as {@link PostProcessStageLibrary#createBlurStage}. + * The blur is applied to the shadows generated from the image to make them smoother. + *

+ *

+ * When enabled, this stage will execute before all others. + *

+ */ + readonly bloom: PostProcessStageComposite; + /** + * The number of post-process stages in this collection. + */ + readonly length: number; + /** + * Specifies the tonemapping algorithm used when rendering with high dynamic range. + * {@link https://sandcastle.cesium.com/?src=High%20Dynamic%20Range.html|Sandcastle Demo} + * @example + * viewer.scene.postProcessStages.tonemapper = Cesium.Tonemapper.ACES; + */ + tonemapper: Tonemapper; + /** + * Control the exposure when HDR is on. Less than 1.0 makes the tonemapping darker while greater than 1.0 makes it brighter. + * @example + * viewer.scene.postProcessStages.exposure = 1.0; + */ + exposure: number; + /** + * Adds the post-process stage to the collection. + * @param stage - The post-process stage to add to the collection. + * @returns The post-process stage that was added to the collection. + */ + add( + stage: PostProcessStage | PostProcessStageComposite, + ): PostProcessStage | PostProcessStageComposite; + /** + * Removes a post-process stage from the collection and destroys it. + * @param stage - The post-process stage to remove from the collection. + * @returns Whether the post-process stage was removed. + */ + remove(stage: PostProcessStage | PostProcessStageComposite): boolean; + /** + * Returns whether the collection contains a post-process stage. + * @param stage - The post-process stage. + * @returns Whether the collection contains the post-process stage. + */ + contains(stage: PostProcessStage | PostProcessStageComposite): boolean; + /** + * Gets the post-process stage at index. + * @param index - The index of the post-process stage. + * @returns The post-process stage at index. + */ + get(index: number): PostProcessStage | PostProcessStageComposite; + /** + * Removes all post-process stages from the collection and destroys them. + */ + removeAll(): void; + /** + * Returns true if this object was destroyed; otherwise, false. + *

+ * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + *

+ * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

+ * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + *

+ */ + destroy(): void; + } + + /** + * A collection of {@link PostProcessStage}s or other post-process composite stages that execute together logically. + *

+ * All stages are executed in the order of the array. The input texture changes based on the value of inputPreviousStageTexture. + * If inputPreviousStageTexture is true, the input to each stage is the output texture rendered to by the scene or of the stage that executed before it. + * If inputPreviousStageTexture is false, the input texture is the same for each stage in the composite. The input texture is the texture rendered to by the scene + * or the output texture of the previous stage. + *

+ * @example + * // Example 1: separable blur filter + * // The input to blurXDirection is the texture rendered to by the scene or the output of the previous stage. + * // The input to blurYDirection is the texture rendered to by blurXDirection. + * scene.postProcessStages.add(new Cesium.PostProcessStageComposite({ + * stages : [blurXDirection, blurYDirection] + * })); + * @example + * // Example 2: referencing the output of another post-process stage + * scene.postProcessStages.add(new Cesium.PostProcessStageComposite({ + * inputPreviousStageTexture : false, + * stages : [ + * // The same as Example 1. + * new Cesium.PostProcessStageComposite({ + * inputPreviousStageTexture : true + * stages : [blurXDirection, blurYDirection], + * name : 'blur' + * }), + * // The input texture for this stage is the same input texture to blurXDirection since inputPreviousStageTexture is false + * new Cesium.PostProcessStage({ + * fragmentShader : compositeShader, + * uniforms : { + * blurTexture : 'blur' // The output of the composite with name 'blur' (the texture that blurYDirection rendered to). + * } + * }) + * ] + * }); + * @example + * // Example 3: create a uniform alias + * const uniforms = {}; + * Cesium.defineProperties(uniforms, { + * filterSize : { + * get : function() { + * return blurXDirection.uniforms.filterSize; + * }, + * set : function(value) { + * blurXDirection.uniforms.filterSize = blurYDirection.uniforms.filterSize = value; + * } + * } + * }); + * scene.postProcessStages.add(new Cesium.PostProcessStageComposite({ + * stages : [blurXDirection, blurYDirection], + * uniforms : uniforms + * })); + * @param options - An object with the following properties: + * @param options.stages - An array of {@link PostProcessStage}s or composites to be executed in order. + * @param [options.inputPreviousStageTexture = true] - Whether to execute each post-process stage where the input to one stage is the output of the previous. Otherwise, the input to each contained stage is the output of the stage that executed before the composite. + * @param [options.name = createGuid()] - The unique name of this post-process stage for reference by other composites. If a name is not supplied, a GUID will be generated. + * @param [options.uniforms] - An alias to the uniforms of post-process stages. + */ + export class PostProcessStageComposite { + constructor(options: { + stages: any[]; + inputPreviousStageTexture?: boolean; + name?: string; + uniforms?: any; + }); + /** + * Determines if this post-process stage is ready to be executed. + */ + readonly ready: boolean; + /** + * The unique name of this post-process stage for reference by other stages in a PostProcessStageComposite. + */ + readonly name: string; + /** + * Whether or not to execute this post-process stage when ready. + */ + enabled: boolean; + /** + * An alias to the uniform values of the post-process stages. May be undefined; in which case, get each stage to set uniform values. + */ + uniforms: any; + /** + * All post-process stages are executed in the order of the array. The input texture changes based on the value of inputPreviousStageTexture. + * If inputPreviousStageTexture is true, the input to each stage is the output texture rendered to by the scene or of the stage that executed before it. + * If inputPreviousStageTexture is false, the input texture is the same for each stage in the composite. The input texture is the texture rendered to by the scene + * or the output texture of the previous stage. + */ + readonly inputPreviousStageTexture: boolean; + /** + * The number of post-process stages in this composite. + */ + readonly length: number; + /** + * The features selected for applying the post-process. + */ + selected: any[]; + /** + * Gets the post-process stage at index + * @param index - The index of the post-process stage or composite. + * @returns The post-process stage or composite at index. + */ + get(index: number): PostProcessStage | PostProcessStageComposite; + /** + * Returns true if this object was destroyed; otherwise, false. + *

+ * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + *

+ * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

+ * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + *

+ */ + destroy(): void; + } + + /** + * Contains functions for creating common post-process stages. + */ + export namespace PostProcessStageLibrary { + /** + * Creates a post-process stage that applies a Gaussian blur to the input texture. This stage is usually applied in conjunction with another stage. + *

+ * This stage has the following uniforms: delta, sigma, and stepSize. + *

+ *

+ * delta and sigma are used to compute the weights of a Gaussian filter. The equation is exp((-0.5 * delta * delta) / (sigma * sigma)). + * The default value for delta is 1.0. The default value for sigma is 2.0. + * stepSize is the distance to the next texel. The default is 1.0. + *

+ * @returns A post-process stage that applies a Gaussian blur to the input texture. + */ + function createBlurStage(): PostProcessStageComposite; + /** + * Creates a post-process stage that applies a depth of field effect. + *

+ * Depth of field simulates camera focus. Objects in the scene that are in focus + * will be clear whereas objects not in focus will be blurred. + *

+ *

+ * This stage has the following uniforms: focalDistance, delta, sigma, and stepSize. + *

+ *

+ * focalDistance is the distance in meters from the camera to set the camera focus. + *

+ *

+ * delta, sigma, and stepSize are the same properties as {@link PostProcessStageLibrary#createBlurStage}. + * The blur is applied to the areas out of focus. + *

+ * @returns A post-process stage that applies a depth of field effect. + */ + function createDepthOfFieldStage(): PostProcessStageComposite; + /** + * Whether or not a depth of field stage is supported. + *

+ * This stage requires the WEBGL_depth_texture extension. + *

+ * @param scene - The scene. + * @returns Whether this post process stage is supported. + */ + function isDepthOfFieldSupported(scene: Scene): boolean; + /** + * Creates a post-process stage that detects edges. + *

+ * Writes the color to the output texture with alpha set to 1.0 when it is on an edge. + *

+ *

+ * This stage has the following uniforms: color and length + *

+ *
    + *
  • color is the color of the highlighted edge. The default is {@link Color#BLACK}.
  • + *
  • length is the length of the edges in pixels. The default is 0.5.
  • + *
+ *

+ * This stage is not supported in 2D. + *

+ * @example + * // multiple silhouette effects + * const yellowEdge = Cesium.PostProcessStageLibrary.createEdgeDetectionStage(); + * yellowEdge.uniforms.color = Cesium.Color.YELLOW; + * yellowEdge.selected = [feature0]; + * + * const greenEdge = Cesium.PostProcessStageLibrary.createEdgeDetectionStage(); + * greenEdge.uniforms.color = Cesium.Color.LIME; + * greenEdge.selected = [feature1]; + * + * // draw edges around feature0 and feature1 + * postProcessStages.add(Cesium.PostProcessStageLibrary.createSilhouetteStage([yellowEdge, greenEdge]); + * @returns A post-process stage that applies an edge detection effect. + */ + function createEdgeDetectionStage(): PostProcessStage; + /** + * Whether or not an edge detection stage is supported. + *

+ * This stage requires the WEBGL_depth_texture extension. + *

+ * @param scene - The scene. + * @returns Whether this post process stage is supported. + */ + function isEdgeDetectionSupported(scene: Scene): boolean; + /** + * Creates a post-process stage that applies a silhouette effect. + *

+ * A silhouette effect composites the color from the edge detection pass with input color texture. + *

+ *

+ * This stage has the following uniforms when edgeDetectionStages is undefined: color and length + *

+ *

+ * color is the color of the highlighted edge. The default is {@link Color#BLACK}. + * length is the length of the edges in pixels. The default is 0.5. + *

+ * @param [edgeDetectionStages] - An array of edge detection post process stages. + * @returns A post-process stage that applies a silhouette effect. + */ + function createSilhouetteStage( + edgeDetectionStages?: PostProcessStage[], + ): PostProcessStageComposite; + /** + * Whether or not a silhouette stage is supported. + *

+ * This stage requires the WEBGL_depth_texture extension. + *

+ * @param scene - The scene. + * @returns Whether this post process stage is supported. + */ + function isSilhouetteSupported(scene: Scene): boolean; + /** + * Whether or not an ambient occlusion stage is supported. + *

+ * This stage requires the WEBGL_depth_texture extension. + *

+ * @param scene - The scene. + * @returns Whether this post process stage is supported. + */ + function isAmbientOcclusionSupported(scene: Scene): boolean; + /** + * Creates a post-process stage that renders the input texture with black and white gradations. + *

+ * This stage has one uniform value, gradations, which scales the luminance of each pixel. + *

+ * @returns A post-process stage that renders the input texture with black and white gradations. + */ + function createBlackAndWhiteStage(): PostProcessStage; + /** + * Creates a post-process stage that saturates the input texture. + *

+ * This stage has one uniform value, brightness, which scales the saturation of each pixel. + *

+ * @returns A post-process stage that saturates the input texture. + */ + function createBrightnessStage(): PostProcessStage; + /** + * Creates a post-process stage that adds a night vision effect to the input texture. + * @returns A post-process stage that adds a night vision effect to the input texture. + */ + function createNightVisionStage(): PostProcessStage; + /** + * Creates a post-process stage that applies an effect simulating light flaring a camera lens. + *

+ * This stage has the following uniforms: dirtTexture, starTexture, intensity, distortion, ghostDispersal, + * haloWidth, dirtAmount, and earthRadius. + *

    + *
  • dirtTexture is a texture sampled to simulate dirt on the lens.
  • + *
  • starTexture is the texture sampled for the star pattern of the flare.
  • + *
  • intensity is a scalar multiplied by the result of the lens flare. The default value is 2.0.
  • + *
  • distortion is a scalar value that affects the chromatic effect distortion. The default value is 10.0.
  • + *
  • ghostDispersal is a scalar indicating how far the halo effect is from the center of the texture. The default value is 0.4.
  • + *
  • haloWidth is a scalar representing the width of the halo from the ghost dispersal. The default value is 0.4.
  • + *
  • dirtAmount is a scalar representing the amount of dirt on the lens. The default value is 0.4.
  • + *
  • earthRadius is the maximum radius of the earth. The default value is Ellipsoid.WGS84.maximumRadius.
  • + *
+ *

+ * @returns A post-process stage for applying a lens flare effect. + */ + function createLensFlareStage(): PostProcessStage; + } + + /** + * Determines how input texture to a {@link PostProcessStage} is sampled. + */ + export enum PostProcessStageSampleMode { + /** + * Samples the texture by returning the closest texel. + */ + NEAREST = 0, + /** + * Samples the texture through bi-linear interpolation of the four nearest texels. + */ + LINEAR = 1, + } + + /** + * A primitive represents geometry in the {@link Scene}. The geometry can be from a single {@link GeometryInstance} + * as shown in example 1 below, or from an array of instances, even if the geometry is from different + * geometry types, e.g., an {@link RectangleGeometry} and an {@link EllipsoidGeometry} as shown in Code Example 2. + *

+ * A primitive combines geometry instances with an {@link Appearance} that describes the full shading, including + * {@link Material} and {@link RenderState}. Roughly, the geometry instance defines the structure and placement, + * and the appearance defines the visual characteristics. Decoupling geometry and appearance allows us to mix + * and match most of them and add a new geometry or appearance independently of each other. + *

+ *

+ * Combining multiple instances into one primitive is called batching, and significantly improves performance for static data. + * Instances can be individually picked; {@link Scene#pick} returns their {@link GeometryInstance#id}. Using + * per-instance appearances like {@link PerInstanceColorAppearance}, each instance can also have a unique color. + *

+ *

+ * {@link Geometry} can either be created and batched on a web worker or the main thread. The first two examples + * show geometry that will be created on a web worker by using the descriptions of the geometry. The third example + * shows how to create the geometry on the main thread by explicitly calling the createGeometry method. + *

+ * @example + * // 1. Draw a translucent ellipse on the surface with a checkerboard pattern + * const instance = new Cesium.GeometryInstance({ + * geometry : new Cesium.EllipseGeometry({ + * center : Cesium.Cartesian3.fromDegrees(-100.0, 20.0), + * semiMinorAxis : 500000.0, + * semiMajorAxis : 1000000.0, + * rotation : Cesium.Math.PI_OVER_FOUR, + * vertexFormat : Cesium.VertexFormat.POSITION_AND_ST + * }), + * id : 'object returned when this instance is picked and to get/set per-instance attributes' + * }); + * scene.primitives.add(new Cesium.Primitive({ + * geometryInstances : instance, + * appearance : new Cesium.EllipsoidSurfaceAppearance({ + * material : Cesium.Material.fromType('Checkerboard') + * }) + * })); + * @example + * // 2. Draw different instances each with a unique color + * const rectangleInstance = new Cesium.GeometryInstance({ + * geometry : new Cesium.RectangleGeometry({ + * rectangle : Cesium.Rectangle.fromDegrees(-140.0, 30.0, -100.0, 40.0), + * vertexFormat : Cesium.PerInstanceColorAppearance.VERTEX_FORMAT + * }), + * id : 'rectangle', + * attributes : { + * color : new Cesium.ColorGeometryInstanceAttribute(0.0, 1.0, 1.0, 0.5) + * } + * }); + * const ellipsoidInstance = new Cesium.GeometryInstance({ + * geometry : new Cesium.EllipsoidGeometry({ + * radii : new Cesium.Cartesian3(500000.0, 500000.0, 1000000.0), + * vertexFormat : Cesium.VertexFormat.POSITION_AND_NORMAL + * }), + * modelMatrix : Cesium.Matrix4.multiplyByTranslation(Cesium.Transforms.eastNorthUpToFixedFrame( + * Cesium.Cartesian3.fromDegrees(-95.59777, 40.03883)), new Cesium.Cartesian3(0.0, 0.0, 500000.0), new Cesium.Matrix4()), + * id : 'ellipsoid', + * attributes : { + * color : Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.AQUA) + * } + * }); + * scene.primitives.add(new Cesium.Primitive({ + * geometryInstances : [rectangleInstance, ellipsoidInstance], + * appearance : new Cesium.PerInstanceColorAppearance() + * })); + * @example + * // 3. Create the geometry on the main thread. + * scene.primitives.add(new Cesium.Primitive({ + * geometryInstances : new Cesium.GeometryInstance({ + * geometry : Cesium.EllipsoidGeometry.createGeometry(new Cesium.EllipsoidGeometry({ + * radii : new Cesium.Cartesian3(500000.0, 500000.0, 1000000.0), + * vertexFormat : Cesium.VertexFormat.POSITION_AND_NORMAL + * })), + * modelMatrix : Cesium.Matrix4.multiplyByTranslation(Cesium.Transforms.eastNorthUpToFixedFrame( + * Cesium.Cartesian3.fromDegrees(-95.59777, 40.03883)), new Cesium.Cartesian3(0.0, 0.0, 500000.0), new Cesium.Matrix4()), + * id : 'ellipsoid', + * attributes : { + * color : Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.AQUA) + * } + * }), + * appearance : new Cesium.PerInstanceColorAppearance(), + * asynchronous : false + * })); + * @param [options] - Object with the following properties: + * @param [options.geometryInstances] - The geometry instances - or a single geometry instance - to render. + * @param [options.appearance] - The appearance used to render the primitive. + * @param [options.depthFailAppearance] - The appearance used to shade this primitive when it fails the depth test. + * @param [options.show = true] - Determines if this primitive will be shown. + * @param [options.modelMatrix = Matrix4.IDENTITY] - The 4x4 transformation matrix that transforms the primitive (all geometry instances) from model to world coordinates. + * @param [options.vertexCacheOptimize = false] - When true, geometry vertices are optimized for the pre and post-vertex-shader caches. + * @param [options.interleave = false] - When true, geometry vertex attributes are interleaved, which can slightly improve rendering performance but increases load time. + * @param [options.compressVertices = true] - When true, the geometry vertices are compressed, which will save memory. + * @param [options.releaseGeometryInstances = true] - When true, the primitive does not keep a reference to the input geometryInstances to save memory. + * @param [options.allowPicking = true] - When true, each geometry instance will only be pickable with {@link Scene#pick}. When false, GPU memory is saved. + * @param [options.cull = true] - When true, the renderer frustum culls and horizon culls the primitive's commands based on their bounding volume. Set this to false for a small performance gain if you are manually culling the primitive. + * @param [options.asynchronous = true] - Determines if the primitive will be created asynchronously or block until ready. + * @param [options.debugShowBoundingVolume = false] - For debugging only. Determines if this primitive's commands' bounding spheres are shown. + * @param [options.shadows = ShadowMode.DISABLED] - Determines whether this primitive casts or receives shadows from light sources. + */ + export class Primitive { + constructor(options?: { + geometryInstances?: GeometryInstance[] | GeometryInstance; + appearance?: Appearance; + depthFailAppearance?: Appearance; + show?: boolean; + modelMatrix?: Matrix4; + vertexCacheOptimize?: boolean; + interleave?: boolean; + compressVertices?: boolean; + releaseGeometryInstances?: boolean; + allowPicking?: boolean; + cull?: boolean; + asynchronous?: boolean; + debugShowBoundingVolume?: boolean; + shadows?: ShadowMode; + }); + /** + * The geometry instances rendered with this primitive. This may + * be undefined if options.releaseGeometryInstances + * is true when the primitive is constructed. + *

+ * Changing this property after the primitive is rendered has no effect. + *

+ */ + readonly geometryInstances: GeometryInstance[] | GeometryInstance; + /** + * The {@link Appearance} used to shade this primitive. Each geometry + * instance is shaded with the same appearance. Some appearances, like + * {@link PerInstanceColorAppearance} allow giving each instance unique + * properties. + */ + appearance: Appearance; + /** + * The {@link Appearance} used to shade this primitive when it fails the depth test. Each geometry + * instance is shaded with the same appearance. Some appearances, like + * {@link PerInstanceColorAppearance} allow giving each instance unique + * properties. + * + *

+ * When using an appearance that requires a color attribute, like PerInstanceColorAppearance, + * add a depthFailColor per-instance attribute instead. + *

+ * + *

+ * Requires the EXT_frag_depth WebGL extension to render properly. If the extension is not supported, + * there may be artifacts. + *

+ */ + depthFailAppearance: Appearance; + /** + * The 4x4 transformation matrix that transforms the primitive (all geometry instances) from model to world coordinates. + * When this is the identity matrix, the primitive is drawn in world coordinates, i.e., Earth's WGS84 coordinates. + * Local reference frames can be used by providing a different transformation matrix, like that returned + * by {@link Transforms.eastNorthUpToFixedFrame}. + * + *

+ * This property is only supported in 3D mode. + *

+ * @example + * const origin = Cesium.Cartesian3.fromDegrees(-95.0, 40.0, 200000.0); + * p.modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(origin); + */ + modelMatrix: Matrix4; + /** + * Determines if the primitive will be shown. This affects all geometry + * instances in the primitive. + */ + show: boolean; + /** + * When true, the renderer frustum culls and horizon culls the primitive's commands + * based on their bounding volume. Set this to false for a small performance gain + * if you are manually culling the primitive. + */ + cull: boolean; + /** + * This property is for debugging only; it is not for production use nor is it optimized. + *

+ * Draws the bounding sphere for each draw command in the primitive. + *

+ */ + debugShowBoundingVolume: boolean; + /** + * Determines whether this primitive casts or receives shadows from light sources. + */ + shadows: ShadowMode; + /** + * When true, geometry vertices are optimized for the pre and post-vertex-shader caches. + */ + readonly vertexCacheOptimize: boolean; + /** + * Determines if geometry vertex attributes are interleaved, which can slightly improve rendering performance. + */ + readonly interleave: boolean; + /** + * When true, the primitive does not keep a reference to the input geometryInstances to save memory. + */ + readonly releaseGeometryInstances: boolean; + /** + * When true, each geometry instance will only be pickable with {@link Scene#pick}. When false, GPU memory is saved. * + */ + readonly allowPicking: boolean; + /** + * Determines if the geometry instances will be created and batched on a web worker. + */ + readonly asynchronous: boolean; + /** + * When true, geometry vertices are compressed, which will save memory. + */ + readonly compressVertices: boolean; + /** + * Determines if the primitive is complete and ready to render. If this property is + * true, the primitive will be rendered the next time that {@link Primitive#update} + * is called. + * @example + * // Wait for a primitive to become ready before accessing attributes + * const removeListener = scene.postRender.addEventListener(() => { + * if (!frustumPrimitive.ready) { + * return; + * } + * + * const attributes = primitive.getGeometryInstanceAttributes('an id'); + * attributes.color = Cesium.ColorGeometryInstanceAttribute.toValue(Cesium.Color.AQUA); + * + * removeListener(); + * }); + */ + readonly ready: boolean; + /** + * Called when {@link Viewer} or {@link CesiumWidget} render the scene to + * get the draw commands needed to render this primitive. + *

+ * Do not call this function directly. This is documented just to + * list the exceptions that may be propagated when the scene is rendered: + *

+ */ + update(): void; + /** + * Returns the modifiable per-instance attributes for a {@link GeometryInstance}. + * @example + * const attributes = primitive.getGeometryInstanceAttributes('an id'); + * attributes.color = Cesium.ColorGeometryInstanceAttribute.toValue(Cesium.Color.AQUA); + * attributes.show = Cesium.ShowGeometryInstanceAttribute.toValue(true); + * attributes.distanceDisplayCondition = Cesium.DistanceDisplayConditionGeometryInstanceAttribute.toValue(100.0, 10000.0); + * attributes.offset = Cesium.OffsetGeometryInstanceAttribute.toValue(Cartesian3.IDENTITY); + * @param id - The id of the {@link GeometryInstance}. + * @returns The typed array in the attribute's format or undefined if the is no instance with id. + */ + getGeometryInstanceAttributes(id: any): any; + /** + * Returns true if this object was destroyed; otherwise, false. + *

+ * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + *

+ * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

+ * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + *

+ * @example + * e = e && e.destroy(); + */ + destroy(): void; + } + + /** + * A collection of primitives. This is most often used with {@link Scene#primitives}, + * but PrimitiveCollection is also a primitive itself so collections can + * be added to collections forming a hierarchy. + * @example + * const billboards = new Cesium.BillboardCollection(); + * const labels = new Cesium.LabelCollection(); + * + * const collection = new Cesium.PrimitiveCollection(); + * collection.add(billboards); + * + * scene.primitives.add(collection); // Add collection + * scene.primitives.add(labels); // Add regular primitive + * @param [options] - Object with the following properties: + * @param [options.show = true] - Determines if the primitives in the collection will be shown. + * @param [options.destroyPrimitives = true] - Determines if primitives in the collection are destroyed when they are removed. + */ + export class PrimitiveCollection { + constructor(options?: { show?: boolean; destroyPrimitives?: boolean }); + /** + * Determines if primitives in this collection will be shown. + */ + show: boolean; + /** + * Determines if primitives in the collection are destroyed when they are removed by + * {@link PrimitiveCollection#destroy} or {@link PrimitiveCollection#remove} or implicitly + * by {@link PrimitiveCollection#removeAll}. + * @example + * // Example 1. Primitives are destroyed by default. + * const primitives = new Cesium.PrimitiveCollection(); + * const labels = primitives.add(new Cesium.LabelCollection()); + * primitives = primitives.destroy(); + * const b = labels.isDestroyed(); // true + * @example + * // Example 2. Do not destroy primitives in a collection. + * const primitives = new Cesium.PrimitiveCollection(); + * primitives.destroyPrimitives = false; + * const labels = primitives.add(new Cesium.LabelCollection()); + * primitives = primitives.destroy(); + * const b = labels.isDestroyed(); // false + * labels = labels.destroy(); // explicitly destroy + */ + destroyPrimitives: boolean; + /** + * Gets the number of primitives in the collection. + */ + readonly length: number; + /** + * An event that is raised when a primitive is added to the collection. + * Event handlers are passed the primitive that was added. + */ + readonly primitiveAdded: Event; + /** + * An event that is raised when a primitive is removed from the collection. + * Event handlers are passed the primitive that was removed. + *

+ * Note: Depending on the destroyPrimitives constructor option, the primitive may already be destroyed. + *

+ */ + readonly primitiveRemoved: Event; + /** + * Adds a primitive to the collection. + * @example + * const billboards = scene.primitives.add(new Cesium.BillboardCollection()); + * @param primitive - The primitive to add. + * @param [index] - The index to add the layer at. If omitted, the primitive will be added at the bottom of all existing primitives. + * @returns The primitive added to the collection. + */ + add(primitive: any, index?: number): any; + /** + * Removes a primitive from the collection. + * @example + * const billboards = scene.primitives.add(new Cesium.BillboardCollection()); + * scene.primitives.remove(billboards); // Returns true + * @param [primitive] - The primitive to remove. + * @returns true if the primitive was removed; false if the primitive is undefined or was not found in the collection. + */ + remove(primitive?: any): boolean; + /** + * Removes all primitives in the collection. + */ + removeAll(): void; + /** + * Determines if this collection contains a primitive. + * @param [primitive] - The primitive to check for. + * @returns true if the primitive is in the collection; false if the primitive is undefined or was not found in the collection. + */ + contains(primitive?: any): boolean; + /** + * Raises a primitive "up one" in the collection. If all primitives in the collection are drawn + * on the globe surface, this visually moves the primitive up one. + * @param [primitive] - The primitive to raise. + */ + raise(primitive?: any): void; + /** + * Raises a primitive to the "top" of the collection. If all primitives in the collection are drawn + * on the globe surface, this visually moves the primitive to the top. + * @param [primitive] - The primitive to raise the top. + */ + raiseToTop(primitive?: any): void; + /** + * Lowers a primitive "down one" in the collection. If all primitives in the collection are drawn + * on the globe surface, this visually moves the primitive down one. + * @param [primitive] - The primitive to lower. + */ + lower(primitive?: any): void; + /** + * Lowers a primitive to the "bottom" of the collection. If all primitives in the collection are drawn + * on the globe surface, this visually moves the primitive to the bottom. + * @param [primitive] - The primitive to lower to the bottom. + */ + lowerToBottom(primitive?: any): void; + /** + * Returns the primitive in the collection at the specified index. + * @example + * // Toggle the show property of every primitive in the collection. + * const primitives = scene.primitives; + * const length = primitives.length; + * for (let i = 0; i < length; ++i) { + * const p = primitives.get(i); + * p.show = !p.show; + * } + * @param index - The zero-based index of the primitive to return. + * @returns The primitive at the index. + */ + get(index: number): any; + /** + * Returns true if this object was destroyed; otherwise, false. + *

+ * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by each primitive in this collection. Explicitly destroying this + * collection allows for deterministic release of WebGL resources, instead of relying on the garbage + * collector to destroy this collection. + *

+ * Since destroying a collection destroys all the contained primitives, only destroy a collection + * when you are sure no other code is still using any of the contained primitives. + *

+ * Once this collection is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * primitives = primitives && primitives.destroy(); + */ + destroy(): void; + } + + /** + * The container for all 3D graphical objects and state in a Cesium virtual scene. Generally, + * a scene is not created directly; instead, it is implicitly created by {@link CesiumWidget}. + * @example + * // Create scene without anisotropic texture filtering + * const scene = new Cesium.Scene({ + * canvas : canvas, + * contextOptions : { + * allowTextureFilterAnisotropic : false + * } + * }); + * @param options - Object with the following properties: + * @param options.canvas - The HTML canvas element to create the scene for. + * @param [options.contextOptions] - Context and WebGL creation properties. + * @param [options.creditContainer] - The HTML element in which the credits will be displayed. + * @param [options.creditViewport] - The HTML element in which to display the credit popup. If not specified, the viewport will be a added as a sibling of the canvas. + * @param [options.ellipsoid = Ellipsoid.default] - The default ellipsoid. If not specified, the default ellipsoid is used. + * @param [options.mapProjection = new GeographicProjection(options.ellipsoid)] - The map projection to use in 2D and Columbus View modes. + * @param [options.orderIndependentTranslucency = true] - If true and the configuration supports it, use order independent translucency. + * @param [options.scene3DOnly = false] - If true, optimizes memory use and performance for 3D mode but disables the ability to use 2D or Columbus View. + * @param [options.shadows = false] - Determines if shadows are cast by light sources. + * @param [options.mapMode2D = MapMode2D.INFINITE_SCROLL] - Determines if the 2D map is rotatable or can be scrolled infinitely in the horizontal direction. + * @param [options.requestRenderMode = false] - If true, rendering a frame will only occur when needed as determined by changes within the scene. Enabling improves performance of the application, but requires using {@link Scene#requestRender} to render a new frame explicitly in this mode. This will be necessary in many cases after making changes to the scene in other parts of the API. See {@link https://cesium.com/blog/2018/01/24/cesium-scene-rendering-performance/|Improving Performance with Explicit Rendering}. + * @param [options.maximumRenderTimeChange = 0.0] - If requestRenderMode is true, this value defines the maximum change in simulation time allowed before a render is requested. See {@link https://cesium.com/blog/2018/01/24/cesium-scene-rendering-performance/|Improving Performance with Explicit Rendering}. + * @param [options.depthPlaneEllipsoidOffset = 0.0] - Adjust the DepthPlane to address rendering artefacts below ellipsoid zero elevation. + * @param [options.msaaSamples = 4] - If provided, this value controls the rate of multisample antialiasing. Typical multisampling rates are 2, 4, and sometimes 8 samples per pixel. Higher sampling rates of MSAA may impact performance in exchange for improved visual quality. This value only applies to WebGL2 contexts that support multisample render targets. Set to 1 to disable MSAA. + */ + export class Scene { + constructor(options: { + canvas: HTMLCanvasElement; + contextOptions?: ContextOptions; + creditContainer?: Element; + creditViewport?: Element; + ellipsoid?: Ellipsoid; + mapProjection?: MapProjection; + orderIndependentTranslucency?: boolean; + scene3DOnly?: boolean; + shadows?: boolean; + mapMode2D?: MapMode2D; + requestRenderMode?: boolean; + maximumRenderTimeChange?: number; + depthPlaneEllipsoidOffset?: number; + msaaSamples?: number; + }); + /** + * Exceptions occurring in render are always caught in order to raise the + * renderError event. If this property is true, the error is rethrown + * after the event is raised. If this property is false, the render function + * returns normally after raising the event. + */ + rethrowRenderErrors: boolean; + /** + * Determines whether or not to instantly complete the + * scene transition animation on user input. + */ + completeMorphOnUserInput: boolean; + /** + * The event fired at the beginning of a scene transition. + */ + morphStart: Event; + /** + * The event fired at the completion of a scene transition. + */ + morphComplete: Event; + /** + * The {@link SkyBox} used to draw the stars. + */ + skyBox: SkyBox; + /** + * The sky atmosphere drawn around the globe. + */ + skyAtmosphere: SkyAtmosphere; + /** + * The {@link Sun}. + */ + sun: Sun; + /** + * Uses a bloom filter on the sun when enabled. + */ + sunBloom: boolean; + /** + * The {@link Moon} + */ + moon: Moon; + /** + * The background color, which is only visible if there is no sky box, i.e., {@link Scene#skyBox} is undefined. + */ + backgroundColor: Color; + /** + * The current morph transition time between 2D/Columbus View and 3D, + * with 0.0 being 2D or Columbus View and 1.0 being 3D. + */ + morphTime: number; + /** + * The far-to-near ratio of the multi-frustum when using a normal depth buffer. + *

+ * This value is used to create the near and far values for each frustum of the multi-frustum. It is only used + * when {@link Scene#logarithmicDepthBuffer} is false. When logarithmicDepthBuffer is + * true, use {@link Scene#logarithmicDepthFarToNearRatio}. + *

+ */ + farToNearRatio: number; + /** + * The far-to-near ratio of the multi-frustum when using a logarithmic depth buffer. + *

+ * This value is used to create the near and far values for each frustum of the multi-frustum. It is only used + * when {@link Scene#logarithmicDepthBuffer} is true. When logarithmicDepthBuffer is + * false, use {@link Scene#farToNearRatio}. + *

+ */ + logarithmicDepthFarToNearRatio: number; + /** + * Determines the uniform depth size in meters of each frustum of the multifrustum in 2D. If a primitive or model close + * to the surface shows z-fighting, decreasing this will eliminate the artifact, but decrease performance. On the + * other hand, increasing this will increase performance but may cause z-fighting among primitives close to the surface. + */ + nearToFarDistance2D: number; + /** + * The vertical exaggeration of the scene. + * When set to 1.0, no exaggeration is applied. + */ + verticalExaggeration: number; + /** + * The reference height for vertical exaggeration of the scene. + * When set to 0.0, the exaggeration is applied relative to the ellipsoid surface. + */ + verticalExaggerationRelativeHeight: number; + /** + * This property is for debugging only; it is not for production use. + *

+ * A function that determines what commands are executed. As shown in the examples below, + * the function receives the command's owner as an argument, and returns a boolean indicating if the + * command should be executed. + *

+ *

+ * The default is undefined, indicating that all commands are executed. + *

+ * @example + * // Do not execute any commands. + * scene.debugCommandFilter = function(command) { + * return false; + * }; + * + * // Execute only the billboard's commands. That is, only draw the billboard. + * const billboards = new Cesium.BillboardCollection(); + * scene.debugCommandFilter = function(command) { + * return command.owner === billboards; + * }; + */ + debugCommandFilter: (...params: any[]) => any; + /** + * This property is for debugging only; it is not for production use. + *

+ * When true, commands are randomly shaded. This is useful + * for performance analysis to see what parts of a scene or model are + * command-dense and could benefit from batching. + *

+ */ + debugShowCommands: boolean; + /** + * This property is for debugging only; it is not for production use. + *

+ * When true, commands are shaded based on the frustums they + * overlap. Commands in the closest frustum are tinted red, commands in + * the next closest are green, and commands in the farthest frustum are + * blue. If a command overlaps more than one frustum, the color components + * are combined, e.g., a command overlapping the first two frustums is tinted + * yellow. + *

+ */ + debugShowFrustums: boolean; + /** + * This property is for debugging only; it is not for production use. + *

+ * Displays frames per second and time between frames. + *

+ */ + debugShowFramesPerSecond: boolean; + /** + * This property is for debugging only; it is not for production use. + *

+ * Indicates which frustum will have depth information displayed. + *

+ */ + debugShowDepthFrustum: number; + /** + * This property is for debugging only; it is not for production use. + *

+ * When true, draws outlines to show the boundaries of the camera frustums + *

+ */ + debugShowFrustumPlanes: boolean; + /** + * When true, enables picking using the depth buffer. + */ + useDepthPicking: boolean; + /** + * When true, enables picking translucent geometry using the depth buffer. Note that {@link Scene#useDepthPicking} must also be true for enabling this to work. + * + *

+ * There is a decrease in performance when enabled. There are extra draw calls to write depth for + * translucent geometry. + *

+ * @example + * // picking the position of a translucent primitive + * viewer.screenSpaceEventHandler.setInputAction(function onLeftClick(movement) { + * const pickedFeature = viewer.scene.pick(movement.position); + * if (!Cesium.defined(pickedFeature)) { + * // nothing picked + * return; + * } + * const worldPosition = viewer.scene.pickPosition(movement.position); + * }, Cesium.ScreenSpaceEventType.LEFT_CLICK); + */ + pickTranslucentDepth: boolean; + /** + * Settings for atmosphere lighting effects affecting 3D Tiles and model rendering. This is not to be confused with + * {@link Scene#skyAtmosphere} which is responsible for rendering the sky. + */ + atmosphere: Atmosphere; + /** + * Blends the atmosphere to geometry far from the camera for horizon views. Allows for additional + * performance improvements by rendering less geometry and dispatching less terrain requests. + * + * Disbaled by default if an ellipsoid other than WGS84 is used. + */ + fog: Fog; + /** + * The shadow map for the scene's light source. When enabled, models, primitives, and the globe may cast and receive shadows. + */ + shadowMap: ShadowMap; + /** + * When false, 3D Tiles will render normally. When true, classified 3D Tile geometry will render normally and + * unclassified 3D Tile geometry will render with the color multiplied by {@link Scene#invertClassificationColor}. + */ + invertClassification: boolean; + /** + * The highlight color of unclassified 3D Tile geometry when {@link Scene#invertClassification} is true. + *

When the color's alpha is less than 1.0, the unclassified portions of the 3D Tiles will not blend correctly with the classified positions of the 3D Tiles.

+ *

Also, when the color's alpha is less than 1.0, the WEBGL_depth_texture and EXT_frag_depth WebGL extensions must be supported.

+ */ + invertClassificationColor: Color; + /** + * The focal length for use when with cardboard or WebVR. + */ + focalLength: number; + /** + * The eye separation distance in meters for use with cardboard or WebVR. + */ + eyeSeparation: number; + /** + * Post processing effects applied to the final render. + */ + postProcessStages: PostProcessStageCollection; + /** + * When true, rendering a frame will only occur when needed as determined by changes within the scene. + * Enabling improves performance of the application, but requires using {@link Scene#requestRender} + * to render a new frame explicitly in this mode. This will be necessary in many cases after making changes + * to the scene in other parts of the API. + */ + requestRenderMode: boolean; + /** + * If {@link Scene#requestRenderMode} is true, this value defines the maximum change in + * simulation time allowed before a render is requested. Lower values increase the number of frames rendered + * and higher values decrease the number of frames rendered. If undefined, changes to + * the simulation time will never request a render. + * This value impacts the rate of rendering for changes in the scene like lighting, entity property updates, + * and animations. + */ + maximumRenderTimeChange: number; + /** + * The spherical harmonic coefficients for image-based lighting of PBR models. + */ + sphericalHarmonicCoefficients: Cartesian3[]; + /** + * The url to the KTX2 file containing the specular environment map and convoluted mipmaps for image-based lighting of PBR models. + */ + specularEnvironmentMaps: string; + /** + * The light source for shading. Defaults to a directional light from the Sun. + */ + light: Light; + /** + * Use this to set the default value for {@link Scene#logarithmicDepthBuffer} in newly constructed Scenes + * This property relies on fragmentDepth being supported. + */ + static defaultLogDepthBuffer: any; + /** + * Gets the canvas element to which this scene is bound. + */ + readonly canvas: HTMLCanvasElement; + /** + * The drawingBufferHeight of the underlying GL context. + */ + readonly drawingBufferHeight: number; + /** + * The drawingBufferWidth of the underlying GL context. + */ + readonly drawingBufferWidth: number; + /** + * The maximum aliased line width, in pixels, supported by this WebGL implementation. It will be at least one. + */ + readonly maximumAliasedLineWidth: number; + /** + * The maximum length in pixels of one edge of a cube map, supported by this WebGL implementation. It will be at least 16. + */ + readonly maximumCubeMapSize: number; + /** + * Returns true if the {@link Scene#pickPosition} function is supported. + */ + readonly pickPositionSupported: boolean; + /** + * Returns true if the {@link Scene#sampleHeight} and {@link Scene#sampleHeightMostDetailed} functions are supported. + */ + readonly sampleHeightSupported: boolean; + /** + * Returns true if the {@link Scene#clampToHeight} and {@link Scene#clampToHeightMostDetailed} functions are supported. + */ + readonly clampToHeightSupported: boolean; + /** + * Returns true if the {@link Scene#invertClassification} is supported. + */ + readonly invertClassificationSupported: boolean; + /** + * Returns true if specular environment maps are supported. + */ + readonly specularEnvironmentMapsSupported: boolean; + /** + * The ellipsoid. If not specified, the default ellipsoid is used. + */ + readonly ellipsoid: Ellipsoid; + /** + * Gets or sets the depth-test ellipsoid. + */ + globe: Globe; + /** + * Gets the collection of primitives. + */ + readonly primitives: PrimitiveCollection; + /** + * Gets the collection of ground primitives. + */ + readonly groundPrimitives: PrimitiveCollection; + /** + * Gets or sets the camera. + */ + readonly camera: Camera; + /** + * Gets the controller for camera input handling. + */ + readonly screenSpaceCameraController: ScreenSpaceCameraController; + /** + * Get the map projection to use in 2D and Columbus View modes. + */ + readonly mapProjection: MapProjection; + /** + * Gets the collection of image layers that will be rendered on the globe. + */ + readonly imageryLayers: ImageryLayerCollection; + /** + * The terrain provider providing surface geometry for the globe. + */ + terrainProvider: TerrainProvider; + /** + * Gets an event that's raised when the terrain provider is changed + */ + readonly terrainProviderChanged: Event; + /** + * Gets the event that will be raised before the scene is updated or rendered. Subscribers to the event + * receive the Scene instance as the first parameter and the current time as the second parameter. + */ + readonly preUpdate: Event; + /** + * Gets the event that will be raised immediately after the scene is updated and before the scene is rendered. + * Subscribers to the event receive the Scene instance as the first parameter and the current time as the second + * parameter. + */ + readonly postUpdate: Event; + /** + * Gets the event that will be raised when an error is thrown inside the render function. + * The Scene instance and the thrown error are the only two parameters passed to the event handler. + * By default, errors are not rethrown after this event is raised, but that can be changed by setting + * the rethrowRenderErrors property. + */ + readonly renderError: Event; + /** + * Gets the event that will be raised after the scene is updated and immediately before the scene is rendered. + * Subscribers to the event receive the Scene instance as the first parameter and the current time as the second + * parameter. + */ + readonly preRender: Event; + /** + * Gets the event that will be raised immediately after the scene is rendered. Subscribers to the event + * receive the Scene instance as the first parameter and the current time as the second parameter. + */ + readonly postRender: Event; + /** + * Gets the simulation time when the scene was last rendered. Returns undefined if the scene has not yet been + * rendered. + */ + readonly lastRenderTime: JulianDate; + /** + * This property is for debugging only; it is not for production use. + *

+ * When {@link Scene.debugShowFrustums} is true, this contains + * properties with statistics about the number of command execute per frustum. + * totalCommands is the total number of commands executed, ignoring + * overlap. commandsInFrustums is an array with the number of times + * commands are executed redundantly, e.g., how many commands overlap two or + * three frustums. + *

+ */ + readonly debugFrustumStatistics: any; + /** + * Gets whether or not the scene is optimized for 3D only viewing. + */ + readonly scene3DOnly: boolean; + /** + * Gets whether or not the scene has order independent translucency enabled. + * Note that this only reflects the original construction option, and there are + * other factors that could prevent OIT from functioning on a given system configuration. + */ + readonly orderIndependentTranslucency: boolean; + /** + * Gets the unique identifier for this scene. + */ + readonly id: string; + /** + * Gets or sets the current mode of the scene. + */ + mode: SceneMode; + /** + * When true, splits the scene into two viewports with steroscopic views for the left and right eyes. + * Used for cardboard and WebVR. + */ + useWebVR: boolean; + /** + * Determines if the 2D map is rotatable or can be scrolled infinitely in the horizontal direction. + */ + readonly mapMode2D: MapMode2D; + /** + * Gets or sets the position of the splitter within the viewport. Valid values are between 0.0 and 1.0. + */ + splitPosition: number; + /** + * The distance from the camera at which to disable the depth test of billboards, labels and points + * to, for example, prevent clipping against terrain. When set to zero, the depth test should always + * be applied. When less than zero, the depth test should never be applied. Setting the disableDepthTestDistance + * property of a billboard, label or point will override this value. + */ + minimumDisableDepthTestDistance: number; + /** + * Whether or not to use a logarithmic depth buffer. Enabling this option will allow for less frustums in the multi-frustum, + * increasing performance. This property relies on fragmentDepth being supported. + */ + logarithmicDepthBuffer: boolean; + /** + * The value used for gamma correction. This is only used when rendering with high dynamic range. + */ + gamma: number; + /** + * Whether or not to use high dynamic range rendering. + */ + highDynamicRange: boolean; + /** + * Whether or not high dynamic range rendering is supported. + */ + readonly highDynamicRangeSupported: boolean; + /** + * Whether or not the camera is underneath the globe. + */ + readonly cameraUnderground: boolean; + /** + * The sample rate of multisample antialiasing (values greater than 1 enable MSAA). + */ + msaaSamples: number; + /** + * Returns true if the Scene's context supports MSAA. + */ + readonly msaaSupported: boolean; + /** + * Determines if a compressed texture format is supported. + * @param format - The texture format. May be the name of the format or the WebGL extension name, e.g. s3tc or WEBGL_compressed_texture_s3tc. + * @returns Whether or not the format is supported. + */ + getCompressedTextureFormatSupported(format: string): boolean; + /** + * Update and render the scene. It is usually not necessary to call this function + * directly because {@link CesiumWidget} will do it automatically. + * @param [time] - The simulation time at which to render. + */ + render(time?: JulianDate): void; + /** + * Requests a new rendered frame when {@link Scene#requestRenderMode} is set to true. + * The render rate will not exceed the {@link CesiumWidget#targetFrameRate}. + */ + requestRender(): void; + /** + * Returns an object with a `primitive` property that contains the first (top) primitive in the scene + * at a particular window coordinate or undefined if nothing is at the location. Other properties may + * potentially be set depending on the type of primitive and may be used to further identify the picked object. + *

+ * When a feature of a 3D Tiles tileset is picked, pick returns a {@link Cesium3DTileFeature} object. + *

+ * @example + * // On mouse over, color the feature yellow. + * handler.setInputAction(function(movement) { + * const feature = scene.pick(movement.endPosition); + * if (feature instanceof Cesium.Cesium3DTileFeature) { + * feature.color = Cesium.Color.YELLOW; + * } + * }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); + * @param windowPosition - Window coordinates to perform picking on. + * @param [width = 3] - Width of the pick rectangle. + * @param [height = 3] - Height of the pick rectangle. + * @returns Object containing the picked primitive. + */ + pick(windowPosition: Cartesian2, width?: number, height?: number): any; + /** + * Returns a {@link VoxelCell} for the voxel sample rendered at a particular window coordinate, + * or undefined if no voxel is rendered at that position. + * @example + * On left click, report the value of the "color" property at that voxel sample. + * handler.setInputAction(function(movement) { + * const voxelCell = scene.pickVoxel(movement.position); + * if (defined(voxelCell)) { + * console.log(voxelCell.getProperty("color")); + * } + * }, Cesium.ScreenSpaceEventType.LEFT_CLICK); + * @param windowPosition - Window coordinates to perform picking on. + * @param [width = 3] - Width of the pick rectangle. + * @param [height = 3] - Height of the pick rectangle. + * @returns Information about the voxel cell rendered at the picked position. + */ + pickVoxel( + windowPosition: Cartesian2, + width?: number, + height?: number, + ): VoxelCell | undefined; + /** + * Pick a metadata value at the given window position. + * @param windowPosition - Window coordinates to perform picking on. + * @param schemaId - The ID of the metadata schema to pick values + * from. If this is `undefined`, then it will pick the values from the object + * that match the given class- and property name, regardless of the schema ID. + * @param className - The name of the metadata class to pick + * values from + * @param propertyName - The name of the metadata property to pick + * values from + * @returns The metadata value, or `undefined` when + * no matching metadata was found at the given position + */ + pickMetadata( + windowPosition: Cartesian2, + schemaId: string | undefined, + className: string, + propertyName: string, + ): MetadataValue | undefined; + /** + * Pick the schema of the metadata of the object at the given position + * @param windowPosition - Window coordinates to perform picking on. + * @returns The metadata schema, or `undefined` if there is no object with + * associated metadata at the given position. + */ + pickMetadataSchema(windowPosition: Cartesian2): MetadataSchema; + /** + * Returns the cartesian position reconstructed from the depth buffer and window position. + *

+ * The position reconstructed from the depth buffer in 2D may be slightly different from those + * reconstructed in 3D and Columbus view. This is caused by the difference in the distribution + * of depth values of perspective and orthographic projection. + *

+ *

+ * Set {@link Scene#pickTranslucentDepth} to true to include the depth of + * translucent primitives; otherwise, this essentially picks through translucent primitives. + *

+ * @param windowPosition - Window coordinates to perform picking on. + * @param [result] - The object on which to restore the result. + * @returns The cartesian position. + */ + pickPosition(windowPosition: Cartesian2, result?: Cartesian3): Cartesian3; + /** + * Returns a list of objects, each containing a `primitive` property, for all primitives at + * a particular window coordinate position. Other properties may also be set depending on the + * type of primitive and may be used to further identify the picked object. The primitives in + * the list are ordered by their visual order in the scene (front to back). + * @example + * const pickedObjects = scene.drillPick(new Cesium.Cartesian2(100.0, 200.0)); + * @param windowPosition - Window coordinates to perform picking on. + * @param [limit] - If supplied, stop drilling after collecting this many picks. + * @param [width = 3] - Width of the pick rectangle. + * @param [height = 3] - Height of the pick rectangle. + * @returns Array of objects, each containing 1 picked primitives. + */ + drillPick( + windowPosition: Cartesian2, + limit?: number, + width?: number, + height?: number, + ): any[]; + /** + * Returns the height of scene geometry at the given cartographic position or undefined if there was no + * scene geometry to sample height from. The height of the input position is ignored. May be used to clamp objects to + * the globe, 3D Tiles, or primitives in the scene. + *

+ * This function only samples height from globe tiles and 3D Tiles that are rendered in the current view. Samples height + * from all other primitives regardless of their visibility. + *

+ * @example + * const position = new Cesium.Cartographic(-1.31968, 0.698874); + * const height = viewer.scene.sampleHeight(position); + * console.log(height); + * @param position - The cartographic position to sample height from. + * @param [objectsToExclude] - A list of primitives, entities, or 3D Tiles features to not sample height from. + * @param [width = 0.1] - Width of the intersection volume in meters. + * @returns The height. This may be undefined if there was no scene geometry to sample height from. + */ + sampleHeight( + position: Cartographic, + objectsToExclude?: object[], + width?: number, + ): number; + /** + * Clamps the given cartesian position to the scene geometry along the geodetic surface normal. Returns the + * clamped position or undefined if there was no scene geometry to clamp to. May be used to clamp + * objects to the globe, 3D Tiles, or primitives in the scene. + *

+ * This function only clamps to globe tiles and 3D Tiles that are rendered in the current view. Clamps to + * all other primitives regardless of their visibility. + *

+ * @example + * // Clamp an entity to the underlying scene geometry + * const position = entity.position.getValue(Cesium.JulianDate.now()); + * entity.position = viewer.scene.clampToHeight(position); + * @param cartesian - The cartesian position. + * @param [objectsToExclude] - A list of primitives, entities, or 3D Tiles features to not clamp to. + * @param [width = 0.1] - Width of the intersection volume in meters. + * @param [result] - An optional object to return the clamped position. + * @returns The modified result parameter or a new Cartesian3 instance if one was not provided. This may be undefined if there was no scene geometry to clamp to. + */ + clampToHeight( + cartesian: Cartesian3, + objectsToExclude?: object[], + width?: number, + result?: Cartesian3, + ): Cartesian3; + /** + * Initiates an asynchronous {@link Scene#sampleHeight} query for an array of {@link Cartographic} positions + * using the maximum level of detail for 3D Tilesets in the scene. The height of the input positions is ignored. + * Returns a promise that is resolved when the query completes. Each point height is modified in place. + * If a height cannot be determined because no geometry can be sampled at that location, or another error occurs, + * the height is set to undefined. + * @example + * const positions = [ + * new Cesium.Cartographic(-1.31968, 0.69887), + * new Cesium.Cartographic(-1.10489, 0.83923) + * ]; + * const promise = viewer.scene.sampleHeightMostDetailed(positions); + * promise.then(function(updatedPosition) { + * // positions[0].height and positions[1].height have been updated. + * // updatedPositions is just a reference to positions. + * } + * @param positions - The cartographic positions to update with sampled heights. + * @param [objectsToExclude] - A list of primitives, entities, or 3D Tiles features to not sample height from. + * @param [width = 0.1] - Width of the intersection volume in meters. + * @returns A promise that resolves to the provided list of positions when the query has completed. + */ + sampleHeightMostDetailed( + positions: Cartographic[], + objectsToExclude?: object[], + width?: number, + ): Promise; + /** + * Initiates an asynchronous {@link Scene#clampToHeight} query for an array of {@link Cartesian3} positions + * using the maximum level of detail for 3D Tilesets in the scene. Returns a promise that is resolved when + * the query completes. Each position is modified in place. If a position cannot be clamped because no geometry + * can be sampled at that location, or another error occurs, the element in the array is set to undefined. + * @example + * const cartesians = [ + * entities[0].position.getValue(Cesium.JulianDate.now()), + * entities[1].position.getValue(Cesium.JulianDate.now()) + * ]; + * const promise = viewer.scene.clampToHeightMostDetailed(cartesians); + * promise.then(function(updatedCartesians) { + * entities[0].position = updatedCartesians[0]; + * entities[1].position = updatedCartesians[1]; + * } + * @param cartesians - The cartesian positions to update with clamped positions. + * @param [objectsToExclude] - A list of primitives, entities, or 3D Tiles features to not clamp to. + * @param [width = 0.1] - Width of the intersection volume in meters. + * @returns A promise that resolves to the provided list of positions when the query has completed. + */ + clampToHeightMostDetailed( + cartesians: Cartesian3[], + objectsToExclude?: object[], + width?: number, + ): Promise; + /** + * Transforms a position in cartesian coordinates to canvas coordinates. This is commonly used to place an + * HTML element at the same screen position as an object in the scene. + * @example + * // Output the canvas position of longitude/latitude (0, 0) every time the mouse moves. + * const scene = widget.scene; + * const position = Cesium.Cartesian3.fromDegrees(0.0, 0.0); + * const handler = new Cesium.ScreenSpaceEventHandler(scene.canvas); + * handler.setInputAction(function(movement) { + * console.log(scene.cartesianToCanvasCoordinates(position)); + * }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); + * @param position - The position in cartesian coordinates. + * @param [result] - An optional object to return the input position transformed to canvas coordinates. + * @returns The modified result parameter or a new Cartesian2 instance if one was not provided. This may be undefined if the input position is near the center of the ellipsoid. + */ + cartesianToCanvasCoordinates( + position: Cartesian3, + result?: Cartesian2, + ): Cartesian2; + /** + * Instantly completes an active transition. + */ + completeMorph(): void; + /** + * Asynchronously transitions the scene to 2D. + * @param [duration = 2.0] - The amount of time, in seconds, for transition animations to complete. + */ + morphTo2D(duration?: number): void; + /** + * Asynchronously transitions the scene to Columbus View. + * @param [duration = 2.0] - The amount of time, in seconds, for transition animations to complete. + */ + morphToColumbusView(duration?: number): void; + /** + * Asynchronously transitions the scene to 3D. + * @param [duration = 2.0] - The amount of time, in seconds, for transition animations to complete. + */ + morphTo3D(duration?: number): void; + /** + * Update the terrain providing surface geometry for the globe. + * @example + * // Use Cesium World Terrain + * scene.setTerrain(Cesium.Terrain.fromWorldTerrain()); + * @example + * // Use a custom terrain provider + * const terrain = new Cesium.Terrain(Cesium.CesiumTerrainProvider.fromUrl("https://myTestTerrain.com")); + * scene.setTerrain(terrain); + * + * terrain.errorEvent.addEventListener(error => { + * alert(`Encountered an error while creating terrain! ${error}`); + * }); + * @param terrain - The terrain provider async helper + * @returns terrain The terrain provider async helper + */ + setTerrain(terrain: Terrain): Terrain; + /** + * Returns true if this object was destroyed; otherwise, false. + *

+ * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

+ * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * scene = scene && scene.destroy(); + */ + destroy(): void; + } + + /** + * Determine how translucent surfaces will be handled. + * + * When OIT is enabled, then this will delegate to OIT.executeCommands. + * Otherwise, it will just be executeTranslucentCommandsBackToFront + * for render passes, or executeTranslucentCommandsFrontToBack for + * other passes. + * @param scene - The scene. + * @returns A function to execute translucent commands. + */ + export function obtainTranslucentCommandExecutionFunction( + scene: Scene, + ): (...params: any[]) => any; + + /** + * Indicates if the scene is viewed in 3D, 2D, or 2.5D Columbus view. + */ + export enum SceneMode { + /** + * Morphing between mode, e.g., 3D to 2D. + */ + MORPHING = 0, + /** + * Columbus View mode. A 2.5D perspective view where the map is laid out + * flat and objects with non-zero height are drawn above it. + */ + COLUMBUS_VIEW = 1, + /** + * 2D mode. The map is viewed top-down with an orthographic projection. + */ + SCENE2D = 2, + /** + * 3D mode. A traditional 3D perspective view of the globe. + */ + SCENE3D = 3, + } + + /** + * Functions that do scene-dependent transforms between rendering-related coordinate systems. + */ + export namespace SceneTransforms { + /** + * Transforms a position in world (WGS84 or alternative ellipsoid) coordinates to window coordinates. This is commonly used to place an + * HTML element at the same screen position as an object in the scene. + * @example + * // Output the window position of longitude/latitude (0, 0) every time the mouse moves. + * const position = Cesium.Cartesian3.fromDegrees(0.0, 0.0); + * const handler = new Cesium.ScreenSpaceEventHandler(scene.canvas); + * handler.setInputAction(function(movement) { + * console.log(Cesium.SceneTransforms.worldToWindowCoordinates(scene, position)); + * }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); + * @param scene - The scene. + * @param position - The position in world (WGS84 or alternative ellipsoid) coordinates. + * @param [result] - An optional object to return the input position transformed to window coordinates. + * @returns The modified result parameter or a new Cartesian2 instance if one was not provided. This may be undefined if the input position is near the center of the ellipsoid. + */ + function worldToWindowCoordinates( + scene: Scene, + position: Cartesian3, + result?: Cartesian2, + ): Cartesian2 | undefined; + /** + * Transforms a position in world coordinates to drawing buffer coordinates. This may produce different + * results from SceneTransforms.worldToWindowCoordinates when the browser zoom is not 100%, or on high-DPI displays. + * @example + * // Output the window position of longitude/latitude (0, 0) every time the mouse moves. + * const position = Cesium.Cartesian3.fromDegrees(0.0, 0.0); + * const handler = new Cesium.ScreenSpaceEventHandler(scene.canvas); + * handler.setInputAction(function(movement) { + * console.log(Cesium.SceneTransforms.worldToDrawingBufferCoordinates(scene, position)); + * }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); + * @param scene - The scene. + * @param position - The position in world (WGS84 or alternative ellipsoid) coordinates. + * @param [result] - An optional object to return the input position transformed to window coordinates. + * @returns The modified result parameter or a new Cartesian2 instance if one was not provided. This may be undefined if the input position is near the center of the ellipsoid. + */ + function worldToDrawingBufferCoordinates( + scene: Scene, + position: Cartesian3, + result?: Cartesian2, + ): Cartesian2 | undefined; + } + + /** + * Modifies the camera position and orientation based on mouse input to a canvas. + * @param scene - The scene. + */ + export class ScreenSpaceCameraController { + constructor(scene: Scene); + /** + * If true, inputs are allowed conditionally with the flags enableTranslate, enableZoom, + * enableRotate, enableTilt, and enableLook. If false, all inputs are disabled. + * + * NOTE: This setting is for temporary use cases, such as camera flights and + * drag-selection of regions (see Picking demo). It is typically set to false at the + * start of such events, and set true on completion. To keep inputs disabled + * past the end of camera flights, you must use the other booleans (enableTranslate, + * enableZoom, enableRotate, enableTilt, and enableLook). + */ + enableInputs: boolean; + /** + * If true, allows the user to pan around the map. If false, the camera stays locked at the current position. + * This flag only applies in 2D and Columbus view modes. + */ + enableTranslate: boolean; + /** + * If true, allows the user to zoom in and out. If false, the camera is locked to the current distance from the ellipsoid. + */ + enableZoom: boolean; + /** + * If true, allows the user to rotate the world which translates the user's position. + * This flag only applies in 2D and 3D. + */ + enableRotate: boolean; + /** + * If true, allows the user to tilt the camera. If false, the camera is locked to the current heading. + * This flag only applies in 3D and Columbus view. + */ + enableTilt: boolean; + /** + * If true, allows the user to use free-look. If false, the camera view direction can only be changed through translating + * or rotating. This flag only applies in 3D and Columbus view modes. + */ + enableLook: boolean; + /** + * A parameter in the range [0, 1) used to determine how long + * the camera will continue to spin because of inertia. + * With value of zero, the camera will have no inertia. + */ + inertiaSpin: number; + /** + * A parameter in the range [0, 1) used to determine how long + * the camera will continue to translate because of inertia. + * With value of zero, the camera will have no inertia. + */ + inertiaTranslate: number; + /** + * A parameter in the range [0, 1) used to determine how long + * the camera will continue to zoom because of inertia. + * With value of zero, the camera will have no inertia. + */ + inertiaZoom: number; + /** + * A parameter in the range [0, 1) used to limit the range + * of various user inputs to a percentage of the window width/height per animation frame. + * This helps keep the camera under control in low-frame-rate situations. + */ + maximumMovementRatio: number; + /** + * Sets the duration, in seconds, of the bounce back animations in 2D and Columbus view. + */ + bounceAnimationTime: number; + /** + * The minimum magnitude, in meters, of the camera position when zooming. Defaults to 1.0. + */ + minimumZoomDistance: number; + /** + * The maximum magnitude, in meters, of the camera position when zooming. Defaults to positive infinity. + */ + maximumZoomDistance: number; + /** + * A multiplier for the speed at which the camera will zoom. + */ + zoomFactor: number; + /** + * The input that allows the user to pan around the map. This only applies in 2D and Columbus view modes. + *

+ * The type can be a {@link CameraEventType}, undefined, an object with eventType + * and modifier properties with types CameraEventType and {@link KeyboardEventModifier}, + * or an array of any of the preceding. + *

+ */ + translateEventTypes: CameraEventType | any[] | undefined; + /** + * The input that allows the user to zoom in/out. + *

+ * The type can be a {@link CameraEventType}, undefined, an object with eventType + * and modifier properties with types CameraEventType and {@link KeyboardEventModifier}, + * or an array of any of the preceding. + *

+ */ + zoomEventTypes: CameraEventType | any[] | undefined; + /** + * The input that allows the user to rotate around the globe or another object. This only applies in 3D and Columbus view modes. + *

+ * The type can be a {@link CameraEventType}, undefined, an object with eventType + * and modifier properties with types CameraEventType and {@link KeyboardEventModifier}, + * or an array of any of the preceding. + *

+ */ + rotateEventTypes: CameraEventType | any[] | undefined; + /** + * The input that allows the user to tilt in 3D and Columbus view or twist in 2D. + *

+ * The type can be a {@link CameraEventType}, undefined, an object with eventType + * and modifier properties with types CameraEventType and {@link KeyboardEventModifier}, + * or an array of any of the preceding. + *

+ */ + tiltEventTypes: CameraEventType | any[] | undefined; + /** + * The input that allows the user to change the direction the camera is viewing. This only applies in 3D and Columbus view modes. + *

+ * The type can be a {@link CameraEventType}, undefined, an object with eventType + * and modifier properties with types CameraEventType and {@link KeyboardEventModifier}, + * or an array of any of the preceding. + *

+ */ + lookEventTypes: CameraEventType | any[] | undefined; + /** + * The minimum height the camera must be before picking the terrain or scene content instead of the ellipsoid. Defaults to scene.ellipsoid.minimumRadius * 0.025 when another ellipsoid than WGS84 is used. + */ + minimumPickingTerrainHeight: number; + /** + * The minimum distance the camera must be before testing for collision with terrain when zoom with inertia. Default to scene.ellipsoid.minimumRadius * 0.00063 when another ellipsoid than WGS84 is used. + */ + minimumPickingTerrainDistanceWithInertia: number; + /** + * The minimum height the camera must be before testing for collision with terrain. Default to scene.ellipsoid.minimumRadius * 0.0025 when another ellipsoid than WGS84 is used. + */ + minimumCollisionTerrainHeight: number; + /** + * The minimum height the camera must be before switching from rotating a track ball to + * free look when clicks originate on the sky or in space. Defaults to ellipsoid.minimumRadius * 1.175 when another ellipsoid than WGS84 is used. + */ + minimumTrackBallHeight: number; + /** + * When disabled, the values of maximumZoomDistance and minimumZoomDistance are ignored. + */ + enableCollisionDetection: boolean; + /** + * The angle, relative to the ellipsoid normal, restricting the maximum amount that the user can tilt the camera. If undefined, the angle of the camera tilt is unrestricted. + * @example + * // Prevent the camera from tilting below the ellipsoid surface + * viewer.scene.screenSpaceCameraController.maximumTiltAngle = Math.PI / 2.0; + */ + maximumTiltAngle: number | undefined; + /** + * Returns true if this object was destroyed; otherwise, false. + *

+ * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Removes mouse listeners held by this object. + *

+ * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * controller = controller && controller.destroy(); + */ + destroy(): void; + } + + /** + * Constants used to indicated what part of the sensor volume to display. + */ + export enum SensorVolumePortionToDisplay { + /** + * 0x0000. Display the complete sensor volume. + */ + COMPLETE = 0, + /** + * 0x0001. Display the portion of the sensor volume that lies below the true horizon of the ellipsoid. + */ + BELOW_ELLIPSOID_HORIZON = 1, + /** + * 0x0002. Display the portion of the sensor volume that lies above the true horizon of the ellipsoid. + */ + ABOVE_ELLIPSOID_HORIZON = 2, + } + + /** + *
+ * Use {@link Viewer#shadowMap} to get the scene's shadow map. Do not construct this directly. + *
+ * + *

+ * The normalOffset bias pushes the shadows forward slightly, and may be disabled + * for applications that require ultra precise shadows. + *

+ */ + export class ShadowMap { + constructor(); + /** + * Determines the darkness of the shadows. + */ + darkness: number; + /** + * Determines whether shadows start to fade out once the light gets closer to the horizon. + */ + fadingEnabled: boolean; + /** + * Determines the maximum distance of the shadow map. Only applicable for cascaded shadows. Larger distances may result in lower quality shadows. + */ + maximumDistance: number; + /** + * Determines if the shadow map will be shown. + */ + enabled: boolean; + /** + * Determines if a normal bias will be applied to shadows. + */ + normalOffset: boolean; + /** + * Determines if soft shadows are enabled. Uses pcf filtering which requires more texture reads and may hurt performance. + */ + softShadows: boolean; + /** + * The width and height, in pixels, of each shadow map. + */ + size: number; + } + + /** + * Specifies whether the object casts or receives shadows from light sources when + * shadows are enabled. + */ + export enum ShadowMode { + /** + * The object does not cast or receive shadows. + */ + DISABLED = 0, + /** + * The object casts and receives shadows. + */ + ENABLED = 1, + /** + * The object casts shadows only. + */ + CAST_ONLY = 2, + /** + * The object receives shadows only. + */ + RECEIVE_ONLY = 3, + } + + export namespace SingleTileImageryProvider { + /** + * Initialization options for the SingleTileImageryProvider constructor + * @property url - The url for the tile. + * @property [tileWidth] - The width of the tile, in pixels. + * @property [tileHeight] - The height of the tile, in pixels. + * @property [rectangle = Rectangle.MAX_VALUE] - The rectangle, in radians, covered by the image. + * @property [credit] - A credit for the data source, which is displayed on the canvas. + * @property [ellipsoid] - The ellipsoid. If not specified, the WGS84 ellipsoid is used. + */ + type ConstructorOptions = { + url: Resource | string; + tileWidth?: number; + tileHeight?: number; + rectangle?: Rectangle; + credit?: Credit | string; + ellipsoid?: Ellipsoid; + }; + /** + * Initialization options for the SingleTileImageryProvider constructor when using SingleTileImageryProvider.fromUrl + * @property [rectangle = Rectangle.MAX_VALUE] - The rectangle, in radians, covered by the image. + * @property [credit] - A credit for the data source, which is displayed on the canvas. + * @property [ellipsoid] - The ellipsoid. If not specified, the WGS84 ellipsoid is used. + */ + type fromUrlOptions = { + rectangle?: Rectangle; + credit?: Credit | string; + ellipsoid?: Ellipsoid; + }; + } + + /** + * Provides a single, top-level imagery tile. The single image is assumed to be in + * the Geographic projection (i.e. WGS84 / EPSG:4326), + * and will be rendered using a {@link GeographicTilingScheme}. + * @param options - Object describing initialization options + */ + export class SingleTileImageryProvider { + constructor(options: SingleTileImageryProvider.ConstructorOptions); + /** + * Gets the URL of the single, top-level imagery tile. + */ + readonly url: string; + /** + * Gets the proxy used by this provider. + */ + readonly proxy: Proxy; + /** + * Gets the width of each tile, in pixels. + */ + readonly tileWidth: number; + /** + * Gets the height of each tile, in pixels. + */ + readonly tileHeight: number; + /** + * Gets the maximum level-of-detail that can be requested. + */ + readonly maximumLevel: number | undefined; + /** + * Gets the minimum level-of-detail that can be requested. + */ + readonly minimumLevel: number; + /** + * Gets the tiling scheme used by this provider. + */ + readonly tilingScheme: TilingScheme; + /** + * Gets the rectangle, in radians, of the imagery provided by this instance. + */ + readonly rectangle: Rectangle; + /** + * Gets the tile discard policy. If not undefined, the discard policy is responsible + * for filtering out "missing" tiles via its shouldDiscardImage function. If this function + * returns undefined, no tiles are filtered. + */ + readonly tileDiscardPolicy: TileDiscardPolicy; + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + */ + readonly errorEvent: Event; + /** + * Gets the credit to display when this imagery provider is active. Typically this is used to credit + * the source of the imagery. + */ + readonly credit: Credit; + /** + * Gets a value indicating whether or not the images provided by this imagery provider + * include an alpha channel. If this property is false, an alpha channel, if present, will + * be ignored. If this property is true, any images without an alpha channel will be treated + * as if their alpha is 1.0 everywhere. When this property is false, memory usage + * and texture upload time are reduced. + */ + readonly hasAlphaChannel: boolean; + /** + * Creates a provider for a single, top-level imagery tile. The single image is assumed to use a + * @example + * const provider = await SingleTileImageryProvider.fromUrl("https://yoururl.com/image.png"); + * @param url - The url for the tile + * @param [options] - Object describing initialization options. + * @returns The resolved SingleTileImageryProvider. + */ + static fromUrl( + url: Resource | string, + options?: SingleTileImageryProvider.fromUrlOptions, + ): Promise; + /** + * Gets the credits to be displayed when a given tile is displayed. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level; + * @returns The credits to be displayed when the tile is displayed. + */ + getTileCredits(x: number, y: number, level: number): Credit[]; + /** + * Requests the image for a given tile. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param [request] - The request object. Intended for internal use only. + * @returns The resolved image + */ + requestImage( + x: number, + y: number, + level: number, + request?: Request, + ): Promise | undefined; + /** + * Picking features is not currently supported by this imagery provider, so this function simply returns + * undefined. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param longitude - The longitude at which to pick features. + * @param latitude - The latitude at which to pick features. + * @returns Undefined since picking is not supported. + */ + pickFeatures( + x: number, + y: number, + level: number, + longitude: number, + latitude: number, + ): undefined; + } + + /** + * An atmosphere drawn around the limb of the provided ellipsoid. Based on + * {@link http://nishitalab.org/user/nis/cdrom/sig93_nis.pdf|Display of The Earth Taking Into Account Atmospheric Scattering}. + *

+ * This is only supported in 3D. Atmosphere is faded out when morphing to 2D or Columbus view. + *

+ * @example + * scene.skyAtmosphere = new Cesium.SkyAtmosphere(); + * @param [ellipsoid = Ellipsoid.WGS84] - The ellipsoid that the atmosphere is drawn around. + */ + export class SkyAtmosphere { + constructor(ellipsoid?: Ellipsoid); + /** + * Determines if the atmosphere is shown. + */ + show: boolean; + /** + * Compute atmosphere per-fragment instead of per-vertex. + * This produces better looking atmosphere with a slight performance penalty. + */ + perFragmentAtmosphere: boolean; + /** + * The intensity of the light that is used for computing the sky atmosphere color. + */ + atmosphereLightIntensity: number; + /** + * The Rayleigh scattering coefficient used in the atmospheric scattering equations for the sky atmosphere. + */ + atmosphereRayleighCoefficient: Cartesian3; + /** + * The Mie scattering coefficient used in the atmospheric scattering equations for the sky atmosphere. + */ + atmosphereMieCoefficient: Cartesian3; + /** + * The Rayleigh scale height used in the atmospheric scattering equations for the sky atmosphere, in meters. + */ + atmosphereRayleighScaleHeight: number; + /** + * The Mie scale height used in the atmospheric scattering equations for the sky atmosphere, in meters. + */ + atmosphereMieScaleHeight: number; + /** + * The anisotropy of the medium to consider for Mie scattering. + *

+ * Valid values are between -1.0 and 1.0. + *

+ */ + atmosphereMieAnisotropy: number; + /** + * The hue shift to apply to the atmosphere. Defaults to 0.0 (no shift). + * A hue shift of 1.0 indicates a complete rotation of the hues available. + */ + hueShift: number; + /** + * The saturation shift to apply to the atmosphere. Defaults to 0.0 (no shift). + * A saturation shift of -1.0 is monochrome. + */ + saturationShift: number; + /** + * The brightness shift to apply to the atmosphere. Defaults to 0.0 (no shift). + * A brightness shift of -1.0 is complete darkness, which will let space show through. + */ + brightnessShift: number; + /** + * Gets the ellipsoid the atmosphere is drawn around. + */ + readonly ellipsoid: Ellipsoid; + /** + * Returns true if this object was destroyed; otherwise, false. + *

+ * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

+ * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * skyAtmosphere = skyAtmosphere && skyAtmosphere.destroy(); + */ + destroy(): void; + } + + /** + * A sky box around the scene to draw stars. The sky box is defined using the True Equator Mean Equinox (TEME) axes. + *

+ * This is only supported in 3D. The sky box is faded out when morphing to 2D or Columbus view. The size of + * the sky box must not exceed {@link Scene#maximumCubeMapSize}. + *

+ * @example + * scene.skyBox = new Cesium.SkyBox({ + * sources : { + * positiveX : 'skybox_px.png', + * negativeX : 'skybox_nx.png', + * positiveY : 'skybox_py.png', + * negativeY : 'skybox_ny.png', + * positiveZ : 'skybox_pz.png', + * negativeZ : 'skybox_nz.png' + * } + * }); + * @param options - Object with the following properties: + * @param [options.sources] - The source URL or Image object for each of the six cube map faces. See the example below. + * @param [options.show = true] - Determines if this primitive will be shown. + */ + export class SkyBox { + constructor(options: { sources?: any; show?: boolean }); + /** + * The sources used to create the cube map faces: an object + * with positiveX, negativeX, positiveY, + * negativeY, positiveZ, and negativeZ properties. + * These can be either URLs or Image objects. + */ + sources: any; + /** + * Determines if the sky box will be shown. + */ + show: boolean; + /** + * Called when {@link Viewer} or {@link CesiumWidget} render the scene to + * get the draw commands needed to render this primitive. + *

+ * Do not call this function directly. This is documented just to + * list the exceptions that may be propagated when the scene is rendered: + *

+ */ + update(): void; + /** + * Returns true if this object was destroyed; otherwise, false. + *

+ * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

+ * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * skyBox = skyBox && skyBox.destroy(); + */ + destroy(): void; + /** + * Creates a skybox instance with the default starmap for the Earth. + * @example + * viewer.scene.skyBox = Cesium.SkyBox.createEarthSkyBox(); + * @returns The default skybox for the Earth + */ + static createEarthSkyBox(): SkyBox; + } + + /** + * A ParticleEmitter that emits particles within a sphere. + * Particles will be positioned randomly within the sphere and have initial velocities emanating from the center of the sphere. + * @param [radius = 1.0] - The radius of the sphere in meters. + */ + export class SphereEmitter { + constructor(radius?: number); + /** + * The radius of the sphere in meters. + */ + radius: number; + } + + /** + * The direction to display a primitive or ImageryLayer relative to the {@link Scene#splitPosition}. + */ + export enum SplitDirection { + /** + * Display the primitive or ImageryLayer to the left of the {@link Scene#splitPosition}. + */ + LEFT = -1, + /** + * Always display the primitive or ImageryLayer. + */ + NONE = 0, + /** + * Display the primitive or ImageryLayer to the right of the {@link Scene#splitPosition}. + */ + RIGHT = 1, + } + + /** + * Determines the function used to compare stencil values for the stencil test. + */ + export enum StencilFunction { + /** + * The stencil test never passes. + */ + NEVER = WebGLConstants.NEVER, + /** + * The stencil test passes when the masked reference value is less than the masked stencil value. + */ + LESS = WebGLConstants.LESS, + /** + * The stencil test passes when the masked reference value is equal to the masked stencil value. + */ + EQUAL = WebGLConstants.EQUAL, + /** + * The stencil test passes when the masked reference value is less than or equal to the masked stencil value. + */ + LESS_OR_EQUAL = WebGLConstants.LEQUAL, + /** + * The stencil test passes when the masked reference value is greater than the masked stencil value. + */ + GREATER = WebGLConstants.GREATER, + /** + * The stencil test passes when the masked reference value is not equal to the masked stencil value. + */ + NOT_EQUAL = WebGLConstants.NOTEQUAL, + /** + * The stencil test passes when the masked reference value is greater than or equal to the masked stencil value. + */ + GREATER_OR_EQUAL = WebGLConstants.GEQUAL, + /** + * The stencil test always passes. + */ + ALWAYS = WebGLConstants.ALWAYS, + } + + /** + * Determines the action taken based on the result of the stencil test. + */ + export enum StencilOperation { + /** + * Sets the stencil buffer value to zero. + */ + ZERO = WebGLConstants.ZERO, + /** + * Does not change the stencil buffer. + */ + KEEP = WebGLConstants.KEEP, + /** + * Replaces the stencil buffer value with the reference value. + */ + REPLACE = WebGLConstants.REPLACE, + /** + * Increments the stencil buffer value, clamping to unsigned byte. + */ + INCREMENT = WebGLConstants.INCR, + /** + * Decrements the stencil buffer value, clamping to zero. + */ + DECREMENT = WebGLConstants.DECR, + /** + * Bitwise inverts the existing stencil buffer value. + */ + INVERT = WebGLConstants.INVERT, + /** + * Increments the stencil buffer value, wrapping to zero when exceeding the unsigned byte range. + */ + INCREMENT_WRAP = WebGLConstants.INCR_WRAP, + /** + * Decrements the stencil buffer value, wrapping to the maximum unsigned byte instead of going below zero. + */ + DECREMENT_WRAP = WebGLConstants.DECR_WRAP, + } + + /** + * An expression for a style applied to a {@link Cesium3DTileset}. + *

+ * Derived classes of this interface evaluate expressions in the + * {@link https://github.com/CesiumGS/3d-tiles/tree/main/specification/Styling|3D Tiles Styling language}. + *

+ *

+ * This type describes an interface and is not intended to be instantiated directly. + *

+ */ + export class StyleExpression { + constructor(); + /** + * Evaluates the result of an expression, optionally using the provided feature's properties. If the result of + * the expression in the + * {@link https://github.com/CesiumGS/3d-tiles/tree/main/specification/Styling|3D Tiles Styling language} + * is of type Boolean, Number, or String, the corresponding JavaScript + * primitive type will be returned. If the result is a RegExp, a Javascript RegExp + * object will be returned. If the result is a Cartesian2, Cartesian3, or Cartesian4, + * a {@link Cartesian2}, {@link Cartesian3}, or {@link Cartesian4} object will be returned. If the result argument is + * a {@link Color}, the {@link Cartesian4} value is converted to a {@link Color} and then returned. + * @param feature - The feature whose properties may be used as variables in the expression. + * @param [result] - The object onto which to store the result. + * @returns The result of evaluating the expression. + */ + evaluate( + feature: Cesium3DTileFeature, + result?: any, + ): + | boolean + | number + | string + | RegExp + | Cartesian2 + | Cartesian3 + | Cartesian4 + | Color; + /** + * Evaluates the result of a Color expression, optionally using the provided feature's properties. + *

+ * This is equivalent to {@link StyleExpression#evaluate} but always returns a {@link Color} object. + *

+ * @param feature - The feature whose properties may be used as variables in the expression. + * @param [result] - The object in which to store the result. + * @returns The modified result parameter or a new Color instance if one was not provided. + */ + evaluateColor(feature: Cesium3DTileFeature, result?: Color): Color; + } + + /** + * Draws a sun billboard. + *

This is only supported in 3D and Columbus view.

+ * @example + * scene.sun = new Cesium.Sun(); + */ + export class Sun { + constructor(); + /** + * Determines if the sun will be shown. + */ + show: boolean; + /** + * Gets or sets a number that controls how "bright" the Sun's lens flare appears + * to be. Zero shows just the Sun's disc without any flare. + * Use larger values for a more pronounced flare around the Sun. + */ + glowFactor: number; + /** + * Returns true if this object was destroyed; otherwise, false. + *

+ * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

+ * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * sun = sun && sun.destroy(); + * + * + */ + destroy(): void; + } + + /** + * A directional light source that originates from the Sun. + * @param [options] - Object with the following properties: + * @param [options.color = Color.WHITE] - The light's color. + * @param [options.intensity = 2.0] - The light's intensity. + */ + export class SunLight { + constructor(options?: { color?: Color; intensity?: number }); + /** + * The color of the light. + */ + color: Color; + /** + * The intensity of the light. + */ + intensity: number; + } + + export namespace Terrain { + /** + * A function that is called when an error occurs. + * @param err - An object holding details about the error that occurred. + */ + type ErrorEventCallback = (this: Terrain, err: Error) => void; + /** + * A function that is called when the provider has been created + * @param provider - The created terrain provider. + */ + type ReadyEventCallback = ( + this: Terrain, + provider: TerrainProvider, + ) => void; + } + + /** + * A helper to manage async operations of a terrain provider. + * @example + * // Create + * const viewer = new Cesium.Viewer("cesiumContainer", { + * terrain: new Cesium.Terrain(Cesium.CesiumTerrainProvider.fromUrl("https://myTestTerrain.com")); + * }); + * @example + * // Handle loading events + * const terrain = new Cesium.Terrain(Cesium.CesiumTerrainProvider.fromUrl("https://myTestTerrain.com")); + * + * scene.setTerrain(terrain); + * + * terrain.readyEvent.addEventListener(provider => { + * scene.globe.enableLighting = true; + * + * terrain.provider.errorEvent.addEventListener(error => { + * alert(`Encountered an error while loading terrain tiles! ${error}`); + * }); + * }); + * + * terrain.errorEvent.addEventListener(error => { + * alert(`Encountered an error while creating terrain! ${error}`); + * }); + * @param terrainProviderPromise - A promise which resolves to a terrain provider + */ + export class Terrain { + constructor(terrainProviderPromise: Promise); + /** + * Gets an event that is raised when the terrain provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of the thrown error. + */ + readonly errorEvent: Event; + /** + * Gets an event that is raised when the terrain provider has been successfully created. Event listeners + * are passed the created instance of {@link TerrainProvider}. + */ + readonly readyEvent: Event; + /** + * Returns true when the terrain provider has been successfully created. Otherwise, returns false. + */ + readonly ready: boolean; + /** + * The terrain provider providing surface geometry to a globe. Do not use until {@link Terrain.readyEvent} is raised. + */ + readonly provider: TerrainProvider; + /** + * Creates a {@link Terrain} instance for {@link https://cesium.com/content/#cesium-world-terrain|Cesium World Terrain}. + * @example + * // Create Cesium World Terrain with default settings + * const viewer = new Cesium.Viewer("cesiumContainer", { + * terrain: Cesium.Terrain.fromWorldTerrain() + * }); + * @example + * // Create Cesium World Terrain with water and normals. + * const viewer1 = new Cesium.Viewer("cesiumContainer", { + * terrain: Cesium.Terrain.fromWorldTerrain({ + * requestWaterMask: true, + * requestVertexNormals: true + * }); + * }); + * @example + * // Handle loading events + * const terrain = Cesium.Terrain.fromWorldTerrain(); + * + * scene.setTerrain(terrain); + * + * terrain.readyEvent.addEventListener(provider => { + * scene.globe.enableLighting = true; + * + * terrain.provider.errorEvent.addEventListener(error => { + * alert(`Encountered an error while loading terrain tiles! ${error}`); + * }); + * }); + * + * terrain.errorEvent.addEventListener(error => { + * alert(`Encountered an error while creating terrain! ${error}`); + * }); + * @param [options] - Object with the following properties: + * @param [options.requestVertexNormals = false] - Flag that indicates if the client should request additional lighting information from the server if available. + * @param [options.requestWaterMask = false] - Flag that indicates if the client should request per tile water masks from the server if available. + * @returns An asynchronous helper object for a CesiumTerrainProvider + */ + static fromWorldTerrain(options?: { + requestVertexNormals?: boolean; + requestWaterMask?: boolean; + }): Terrain; + /** + * Creates a {@link Terrain} instance for {@link https://cesium.com/content/#cesium-world-bathymetry|Cesium World Bathymetry}. + * @example + * // Create Cesium World Bathymetry with default settings + * const viewer = new Cesium.Viewer("cesiumContainer", { + * terrain: Cesium.Terrain.fromWorldBathymetry) + * }); + * @example + * // Create Cesium World Terrain with normals. + * const viewer1 = new Cesium.Viewer("cesiumContainer", { + * terrain: Cesium.Terrain.fromWorldBathymetry({ + * requestVertexNormals: true + * }); + * }); + * @example + * // Handle loading events + * const bathymetry = Cesium.Terrain.fromWorldBathymetry(); + * + * scene.setTerrain(bathymetry); + * + * bathymetry.readyEvent.addEventListener(provider => { + * scene.globe.enableLighting = true; + * + * bathymetry.provider.errorEvent.addEventListener(error => { + * alert(`Encountered an error while loading bathymetric terrain tiles! ${error}`); + * }); + * }); + * + * bathymetry.errorEvent.addEventListener(error => { + * alert(`Encountered an error while creating bathymetric terrain! ${error}`); + * }); + * @param [options] - Object with the following properties: + * @param [options.requestVertexNormals = false] - Flag that indicates if the client should request additional lighting information from the server if available. + * @returns An asynchronous helper object for a CesiumTerrainProvider + */ + static fromWorldBathymetry(options?: { + requestVertexNormals?: boolean; + }): Terrain; + } + + export namespace TileCoordinatesImageryProvider { + /** + * Initialization options for the TileCoordinatesImageryProvider constructor + * @property [tilingScheme = new GeographicTilingScheme()] - The tiling scheme for which to draw tiles. + * @property [ellipsoid] - The ellipsoid. If the tilingScheme is specified, + * this parameter is ignored and the tiling scheme's ellipsoid is used instead. If neither + * parameter is specified, the WGS84 ellipsoid is used. + * @property [color = Color.YELLOW] - The color to draw the tile box and label. + * @property [tileWidth = 256] - The width of the tile for level-of-detail selection purposes. + * @property [tileHeight = 256] - The height of the tile for level-of-detail selection purposes. + */ + type ConstructorOptions = { + tilingScheme?: TilingScheme; + ellipsoid?: Ellipsoid; + color?: Color; + tileWidth?: number; + tileHeight?: number; + }; + } + + /** + * An {@link ImageryProvider} that draws a box around every rendered tile in the tiling scheme, and draws + * a label inside it indicating the X, Y, Level coordinates of the tile. This is mostly useful for + * debugging terrain and imagery rendering problems. + * @param [options] - Object describing initialization options + */ + export class TileCoordinatesImageryProvider { + constructor(options?: TileCoordinatesImageryProvider.ConstructorOptions); + /** + * Gets the proxy used by this provider. + */ + readonly proxy: Proxy; + /** + * Gets the width of each tile, in pixels. + */ + readonly tileWidth: number; + /** + * Gets the height of each tile, in pixels. + */ + readonly tileHeight: number; + /** + * Gets the maximum level-of-detail that can be requested. + */ + readonly maximumLevel: number | undefined; + /** + * Gets the minimum level-of-detail that can be requested. + */ + readonly minimumLevel: number; + /** + * Gets the tiling scheme used by this provider. + */ + readonly tilingScheme: TilingScheme; + /** + * Gets the rectangle, in radians, of the imagery provided by this instance. + */ + readonly rectangle: Rectangle; + /** + * Gets the tile discard policy. If not undefined, the discard policy is responsible + * for filtering out "missing" tiles via its shouldDiscardImage function. If this function + * returns undefined, no tiles are filtered. + */ + readonly tileDiscardPolicy: TileDiscardPolicy; + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + */ + readonly errorEvent: Event; + /** + * Gets the credit to display when this imagery provider is active. Typically this is used to credit + * the source of the imagery. + */ + readonly credit: Credit; + /** + * Gets a value indicating whether or not the images provided by this imagery provider + * include an alpha channel. If this property is false, an alpha channel, if present, will + * be ignored. If this property is true, any images without an alpha channel will be treated + * as if their alpha is 1.0 everywhere. Setting this property to false reduces memory usage + * and texture upload time. + */ + readonly hasAlphaChannel: boolean; + /** + * Gets the credits to be displayed when a given tile is displayed. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level; + * @returns The credits to be displayed when the tile is displayed. + */ + getTileCredits(x: number, y: number, level: number): Credit[]; + /** + * Requests the image for a given tile. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param [request] - The request object. Intended for internal use only. + * @returns The resolved image as a Canvas DOM object. + */ + requestImage( + x: number, + y: number, + level: number, + request?: Request, + ): Promise; + /** + * Picking features is not currently supported by this imagery provider, so this function simply returns + * undefined. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param longitude - The longitude at which to pick features. + * @param latitude - The latitude at which to pick features. + * @returns Undefined since picking is not supported. + */ + pickFeatures( + x: number, + y: number, + level: number, + longitude: number, + latitude: number, + ): undefined; + } + + /** + * A policy for discarding tile images according to some criteria. This type describes an + * interface and is not intended to be instantiated directly. + */ + export class TileDiscardPolicy { + constructor(); + /** + * Determines if the discard policy is ready to process images. + * @returns True if the discard policy is ready to process images; otherwise, false. + */ + isReady(): boolean; + /** + * Given a tile image, decide whether to discard that image. + * @param image - An image to test. + * @returns True if the image should be discarded; otherwise, false. + */ + shouldDiscardImage(image: HTMLImageElement): boolean; + } + + export namespace TileMapServiceImageryProvider { + /** + * Initialization options for the TileMapServiceImageryProvider constructor + * @property [fileExtension = 'png'] - The file extension for images on the server. + * @property [credit = ''] - A credit for the data source, which is displayed on the canvas. + * @property [minimumLevel = 0] - The minimum level-of-detail supported by the imagery provider. Take care when specifying + * this that the number of tiles at the minimum level is small, such as four or less. A larger number is likely + * to result in rendering problems. + * @property [maximumLevel] - The maximum level-of-detail supported by the imagery provider, or undefined if there is no limit. + * @property [rectangle = Rectangle.MAX_VALUE] - The rectangle, in radians, covered by the image. + * @property [tilingScheme] - The tiling scheme specifying how the ellipsoidal + * surface is broken into tiles. If this parameter is not provided, a {@link WebMercatorTilingScheme} + * is used. + * @property [ellipsoid] - The ellipsoid. If the tilingScheme is specified, + * this parameter is ignored and the tiling scheme's ellipsoid is used instead. If neither + * parameter is specified, the WGS84 ellipsoid is used. + * @property [tileWidth = 256] - Pixel width of image tiles. + * @property [tileHeight = 256] - Pixel height of image tiles. + * @property [flipXY] - Older versions of gdal2tiles.py flipped X and Y values in tilemapresource.xml. + * @property [tileDiscardPolicy] - A policy for discarding tile images according to some criteria + * Specifying this option will do the same, allowing for loading of these incorrect tilesets. + */ + type ConstructorOptions = { + fileExtension?: string; + credit?: Credit | string; + minimumLevel?: number; + maximumLevel?: number; + rectangle?: Rectangle; + tilingScheme?: TilingScheme; + ellipsoid?: Ellipsoid; + tileWidth?: number; + tileHeight?: number; + flipXY?: boolean; + tileDiscardPolicy?: TileDiscardPolicy; + }; + } + + /** + *
+ * To construct a TileMapServiceImageryProvider, call {@link TileMapServiceImageryProvider.fromUrl}. Do not call the constructor directly. + *
+ * + * An imagery provider that provides tiled imagery as generated by + * {@link http://www.maptiler.org/|MapTiler}, {@link http://www.klokan.cz/projects/gdal2tiles/|GDAL2Tiles}, etc. + * @example + * const tms = await Cesium.TileMapServiceImageryProvider.fromUrl( + * "../images/cesium_maptiler/Cesium_Logo_Color", { + * fileExtension: 'png', + * maximumLevel: 4, + * rectangle: new Cesium.Rectangle( + * Cesium.Math.toRadians(-120.0), + * Cesium.Math.toRadians(20.0), + * Cesium.Math.toRadians(-60.0), + * Cesium.Math.toRadians(40.0)) + * }); + * @param [options] - Object describing initialization options + */ + export class TileMapServiceImageryProvider extends UrlTemplateImageryProvider { + constructor(options?: TileMapServiceImageryProvider.ConstructorOptions); + /** + * Creates a TileMapServiceImageryProvider from the specified url. + * @example + * const tms = await Cesium.TileMapServiceImageryProvider.fromUrl( + * '../images/cesium_maptiler/Cesium_Logo_Color', { + * fileExtension: 'png', + * maximumLevel: 4, + * rectangle: new Cesium.Rectangle( + * Cesium.Math.toRadians(-120.0), + * Cesium.Math.toRadians(20.0), + * Cesium.Math.toRadians(-60.0), + * Cesium.Math.toRadians(40.0)) + * }); + * @param url - Path to image tiles on server. + * @param [options] - Object describing initialization options. + * @returns A promise that resolves to the created TileMapServiceImageryProvider. + */ + static fromUrl( + url: Resource | string, + options?: TileMapServiceImageryProvider.ConstructorOptions, + ): Promise; + } + + /** + * Provides functionality for ImageryProviders that have time dynamic imagery + * @param options - Object with the following properties: + * @param options.clock - A Clock instance that is used when determining the value for the time dimension. Required when options.times is specified. + * @param options.times - TimeIntervalCollection with its data property being an object containing time dynamic dimension and their values. + * @param options.requestImageFunction - A function that will request imagery tiles. + * @param options.reloadFunction - A function that will be called when all imagery tiles need to be reloaded. + */ + export class TimeDynamicImagery { + constructor(options: { + clock: Clock; + times: TimeIntervalCollection; + requestImageFunction: (...params: any[]) => any; + reloadFunction: (...params: any[]) => any; + }); + /** + * Gets or sets a clock that is used to get keep the time used for time dynamic parameters. + */ + clock: Clock; + /** + * Gets or sets a time interval collection. + */ + times: TimeIntervalCollection; + /** + * Gets the current interval. + */ + currentInterval: TimeInterval; + /** + * Gets the tile from the cache if its available. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param [request] - The request object. Intended for internal use only. + * @returns A promise for the image that will resolve when the image is available, or + * undefined if the tile is not in the cache. + */ + getFromCache( + x: number, + y: number, + level: number, + request?: Request, + ): Promise | undefined; + /** + * Checks if the next interval is approaching and will start preload the tile if necessary. Otherwise it will + * just add the tile to a list to preload when we approach the next interval. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param [request] - The request object. Intended for internal use only. + */ + checkApproachingInterval( + x: number, + y: number, + level: number, + request?: Request, + ): void; + } + + /** + * Provides playback of time-dynamic point cloud data. + *

+ * Point cloud frames are prefetched in intervals determined by the average frame load time and the current clock speed. + * If intermediate frames cannot be loaded in time to meet playback speed, they will be skipped. If frames are sufficiently + * small or the clock is sufficiently slow then no frames will be skipped. + *

+ * @param options - Object with the following properties: + * @param options.clock - A {@link Clock} instance that is used when determining the value for the time dimension. + * @param options.intervals - A {@link TimeIntervalCollection} with its data property being an object containing a uri to a 3D Tiles Point Cloud tile and an optional transform. + * @param [options.show = true] - Determines if the point cloud will be shown. + * @param [options.modelMatrix = Matrix4.IDENTITY] - A 4x4 transformation matrix that transforms the point cloud. + * @param [options.shadows = ShadowMode.ENABLED] - Determines whether the point cloud casts or receives shadows from light sources. + * @param [options.maximumMemoryUsage = 256] - The maximum amount of memory in MB that can be used by the point cloud. + * @param [options.shading] - Options for constructing a {@link PointCloudShading} object to control point attenuation and eye dome lighting. + * @param [options.style] - The style, defined using the {@link https://github.com/CesiumGS/3d-tiles/tree/main/specification/Styling|3D Tiles Styling language}, applied to each point in the point cloud. + * @param [options.clippingPlanes] - The {@link ClippingPlaneCollection} used to selectively disable rendering the point cloud. + */ + export class TimeDynamicPointCloud { + constructor(options: { + clock: Clock; + intervals: TimeIntervalCollection; + show?: boolean; + modelMatrix?: Matrix4; + shadows?: ShadowMode; + maximumMemoryUsage?: number; + shading?: any; + style?: Cesium3DTileStyle; + clippingPlanes?: ClippingPlaneCollection; + }); + /** + * Determines if the point cloud will be shown. + */ + show: boolean; + /** + * A 4x4 transformation matrix that transforms the point cloud. + */ + modelMatrix: Matrix4; + /** + * Determines whether the point cloud casts or receives shadows from light sources. + *

+ * Enabling shadows has a performance impact. A point cloud that casts shadows must be rendered twice, once from the camera and again from the light's point of view. + *

+ *

+ * Shadows are rendered only when {@link Viewer#shadows} is true. + *

+ */ + shadows: ShadowMode; + /** + * The maximum amount of GPU memory (in MB) that may be used to cache point cloud frames. + *

+ * Frames that are not being loaded or rendered are unloaded to enforce this. + *

+ *

+ * If decreasing this value results in unloading tiles, the tiles are unloaded the next frame. + *

+ */ + maximumMemoryUsage: number; + /** + * Options for controlling point size based on geometric error and eye dome lighting. + */ + shading: PointCloudShading; + /** + * The style, defined using the + * {@link https://github.com/CesiumGS/3d-tiles/tree/main/specification/Styling|3D Tiles Styling language}, + * applied to each point in the point cloud. + *

+ * Assign undefined to remove the style, which will restore the visual + * appearance of the point cloud to its default when no style was applied. + *

+ * @example + * pointCloud.style = new Cesium.Cesium3DTileStyle({ + * color : { + * conditions : [ + * ['${Classification} === 0', 'color("purple", 0.5)'], + * ['${Classification} === 1', 'color("red")'], + * ['true', '${COLOR}'] + * ] + * }, + * show : '${Classification} !== 2' + * }); + */ + style: Cesium3DTileStyle; + /** + * The event fired to indicate that a frame failed to load. A frame may fail to load if the + * request for its uri fails or processing fails due to invalid content. + *

+ * If there are no event listeners, error messages will be logged to the console. + *

+ *

+ * The error object passed to the listener contains two properties: + *

    + *
  • uri: the uri of the failed frame.
  • + *
  • message: the error message.
  • + *
+ * @example + * pointCloud.frameFailed.addEventListener(function(error) { + * console.log(`An error occurred loading frame: ${error.uri}`); + * console.log(`Error: ${error.message}`); + * }); + */ + frameFailed: Event; + /** + * The event fired to indicate that a new frame was rendered. + *

+ * The time dynamic point cloud {@link TimeDynamicPointCloud} is passed to the event listener. + *

+ * @example + * pointCloud.frameChanged.addEventListener(function(timeDynamicPointCloud) { + * viewer.camera.viewBoundingSphere(timeDynamicPointCloud.boundingSphere); + * }); + */ + frameChanged: Event; + /** + * The {@link ClippingPlaneCollection} used to selectively disable rendering the point cloud. + */ + clippingPlanes: ClippingPlaneCollection; + /** + * The total amount of GPU memory in bytes used by the point cloud. + */ + readonly totalMemoryUsageInBytes: number; + /** + * The bounding sphere of the frame being rendered. Returns undefined if no frame is being rendered. + */ + readonly boundingSphere: BoundingSphere; + /** + * Marks the point cloud's {@link TimeDynamicPointCloud#style} as dirty, which forces all + * points to re-evaluate the style in the next frame. + */ + makeStyleDirty(): void; + /** + * Returns true if this object was destroyed; otherwise, false. + *

+ * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

+ * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * pointCloud = pointCloud && pointCloud.destroy(); + */ + destroy(): void; + } + + /** + * A tonemapping algorithm when rendering with high dynamic range. + */ + export enum Tonemapper { + /** + * Use the Reinhard tonemapping. + */ + REINHARD = "REINHARD", + /** + * Use the modified Reinhard tonemapping. + */ + MODIFIED_REINHARD = "MODIFIED_REINHARD", + /** + * Use the Filmic tonemapping. + */ + FILMIC = "FILMIC", + /** + * Use the ACES tonemapping. + */ + ACES = "ACES", + /** + * Use the PBR Neutral tonemapping {@link https://github.com/KhronosGroup/ToneMapping/tree/main/PBR_Neutral|from Khronos}. + */ + PBR_NEUTRAL = "PBR_NEUTRAL", + } + + export namespace UrlTemplateImageryProvider { + /** + * Initialization options for the UrlTemplateImageryProvider constructor + * @property url - The URL template to use to request tiles. It has the following keywords: + *
    + *
  • {z}: The level of the tile in the tiling scheme. Level zero is the root of the quadtree pyramid.
  • + *
  • {x}: The tile X coordinate in the tiling scheme, where 0 is the Westernmost tile.
  • + *
  • {y}: The tile Y coordinate in the tiling scheme, where 0 is the Northernmost tile.
  • + *
  • {s}: One of the available subdomains, used to overcome browser limits on the number of simultaneous requests per host.
  • + *
  • {reverseX}: The tile X coordinate in the tiling scheme, where 0 is the Easternmost tile.
  • + *
  • {reverseY}: The tile Y coordinate in the tiling scheme, where 0 is the Southernmost tile.
  • + *
  • {reverseZ}: The level of the tile in the tiling scheme, where level zero is the maximum level of the quadtree pyramid. In order to use reverseZ, maximumLevel must be defined.
  • + *
  • {westDegrees}: The Western edge of the tile in geodetic degrees.
  • + *
  • {southDegrees}: The Southern edge of the tile in geodetic degrees.
  • + *
  • {eastDegrees}: The Eastern edge of the tile in geodetic degrees.
  • + *
  • {northDegrees}: The Northern edge of the tile in geodetic degrees.
  • + *
  • {westProjected}: The Western edge of the tile in projected coordinates of the tiling scheme.
  • + *
  • {southProjected}: The Southern edge of the tile in projected coordinates of the tiling scheme.
  • + *
  • {eastProjected}: The Eastern edge of the tile in projected coordinates of the tiling scheme.
  • + *
  • {northProjected}: The Northern edge of the tile in projected coordinates of the tiling scheme.
  • + *
  • {width}: The width of each tile in pixels.
  • + *
  • {height}: The height of each tile in pixels.
  • + *
+ * @property [pickFeaturesUrl] - The URL template to use to pick features. If this property is not specified, + * {@link UrlTemplateImageryProvider#pickFeatures} will immediately returned undefined, indicating no + * features picked. The URL template supports all of the keywords supported by the url + * parameter, plus the following: + *
    + *
  • {i}: The pixel column (horizontal coordinate) of the picked position, where the Westernmost pixel is 0.
  • + *
  • {j}: The pixel row (vertical coordinate) of the picked position, where the Northernmost pixel is 0.
  • + *
  • {reverseI}: The pixel column (horizontal coordinate) of the picked position, where the Easternmost pixel is 0.
  • + *
  • {reverseJ}: The pixel row (vertical coordinate) of the picked position, where the Southernmost pixel is 0.
  • + *
  • {longitudeDegrees}: The longitude of the picked position in degrees.
  • + *
  • {latitudeDegrees}: The latitude of the picked position in degrees.
  • + *
  • {longitudeProjected}: The longitude of the picked position in the projected coordinates of the tiling scheme.
  • + *
  • {latitudeProjected}: The latitude of the picked position in the projected coordinates of the tiling scheme.
  • + *
  • {format}: The format in which to get feature information, as specified in the {@link GetFeatureInfoFormat}.
  • + *
+ * @property [urlSchemeZeroPadding] - Gets the URL scheme zero padding for each tile coordinate. The format is '000' where + * each coordinate will be padded on the left with zeros to match the width of the passed string of zeros. e.g. Setting: + * urlSchemeZeroPadding : { '{x}' : '0000'} + * will cause an 'x' value of 12 to return the string '0012' for {x} in the generated URL. + * It the passed object has the following keywords: + *
    + *
  • {z}: The zero padding for the level of the tile in the tiling scheme.
  • + *
  • {x}: The zero padding for the tile X coordinate in the tiling scheme.
  • + *
  • {y}: The zero padding for the the tile Y coordinate in the tiling scheme.
  • + *
  • {reverseX}: The zero padding for the tile reverseX coordinate in the tiling scheme.
  • + *
  • {reverseY}: The zero padding for the tile reverseY coordinate in the tiling scheme.
  • + *
  • {reverseZ}: The zero padding for the reverseZ coordinate of the tile in the tiling scheme.
  • + *
+ * @property [subdomains = 'abc'] - The subdomains to use for the {s} placeholder in the URL template. + * If this parameter is a single string, each character in the string is a subdomain. If it is + * an array, each element in the array is a subdomain. + * @property [credit = ''] - A credit for the data source, which is displayed on the canvas. + * @property [minimumLevel = 0] - The minimum level-of-detail supported by the imagery provider. Take care when specifying + * this that the number of tiles at the minimum level is small, such as four or less. A larger number is likely + * to result in rendering problems. + * @property [maximumLevel] - The maximum level-of-detail supported by the imagery provider, or undefined if there is no limit. + * @property [rectangle = Rectangle.MAX_VALUE] - The rectangle, in radians, covered by the image. + * @property [tilingScheme = WebMercatorTilingScheme] - The tiling scheme specifying how the ellipsoidal + * surface is broken into tiles. If this parameter is not provided, a {@link WebMercatorTilingScheme} + * is used. + * @property [ellipsoid] - The ellipsoid. If the tilingScheme is specified, + * this parameter is ignored and the tiling scheme's ellipsoid is used instead. If neither + * parameter is specified, the WGS84 ellipsoid is used. + * @property [tileWidth = 256] - Pixel width of image tiles. + * @property [tileHeight = 256] - Pixel height of image tiles. + * @property [hasAlphaChannel = true] - true if the images provided by this imagery provider + * include an alpha channel; otherwise, false. If this property is false, an alpha channel, if + * present, will be ignored. If this property is true, any images without an alpha channel will + * be treated as if their alpha is 1.0 everywhere. When this property is false, memory usage + * and texture upload time are potentially reduced. + * @property [getFeatureInfoFormats] - The formats in which to get feature information at a + * specific location when {@link UrlTemplateImageryProvider#pickFeatures} is invoked. If this + * parameter is not specified, feature picking is disabled. + * @property [enablePickFeatures = true] - If true, {@link UrlTemplateImageryProvider#pickFeatures} will + * request the pickFeaturesUrl and attempt to interpret the features included in the response. If false, + * {@link UrlTemplateImageryProvider#pickFeatures} will immediately return undefined (indicating no pickable + * features) without communicating with the server. Set this property to false if you know your data + * source does not support picking features or if you don't want this provider's features to be pickable. Note + * that this can be dynamically overridden by modifying the {@link UriTemplateImageryProvider#enablePickFeatures} + * property. + * @property [tileDiscardPolicy] - A policy for discarding tile images according to some criteria + * @property [customTags] - Allow to replace custom keywords in the URL template. The object must have strings as keys and functions as values. + */ + type ConstructorOptions = { + url: Resource | string; + pickFeaturesUrl?: Resource | string; + urlSchemeZeroPadding?: any; + subdomains?: string | string[]; + credit?: Credit | string; + minimumLevel?: number; + maximumLevel?: number; + rectangle?: Rectangle; + tilingScheme?: TilingScheme; + ellipsoid?: Ellipsoid; + tileWidth?: number; + tileHeight?: number; + hasAlphaChannel?: boolean; + getFeatureInfoFormats?: GetFeatureInfoFormat[]; + enablePickFeatures?: boolean; + tileDiscardPolicy?: TileDiscardPolicy; + customTags?: any; + }; + } + + /** + * Provides imagery by requesting tiles using a specified URL template. + * @example + * // Access Natural Earth II imagery, which uses a TMS tiling scheme and Geographic (EPSG:4326) project + * const tms = new Cesium.UrlTemplateImageryProvider({ + * url : Cesium.buildModuleUrl('Assets/Textures/NaturalEarthII') + '/{z}/{x}/{reverseY}.jpg', + * tilingScheme : new Cesium.GeographicTilingScheme(), + * maximumLevel : 5 + * }); + * // Access the CartoDB Positron basemap, which uses an OpenStreetMap-like tiling scheme. + * const positron = new Cesium.UrlTemplateImageryProvider({ + * url : 'http://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png', + * credit : 'Map tiles by CartoDB, under CC BY 3.0. Data by OpenStreetMap, under ODbL.' + * }); + * // Access a Web Map Service (WMS) server. + * const wms = new Cesium.UrlTemplateImageryProvider({ + * url : 'https://services.ga.gov.au/gis/services/NM_Hydrology_and_Marine_Points/MapServer/WMSServer?' + + * 'tiled=true&transparent=true&format=image%2Fpng&exceptions=application%2Fvnd.ogc.se_xml&' + + * 'styles=&service=WMS&version=1.3.0&request=GetMap&' + + * 'layers=Bores&crs=EPSG%3A3857&' + + * 'bbox={westProjected}%2C{southProjected}%2C{eastProjected}%2C{northProjected}&' + + * 'width=256&height=256', + * rectangle : Cesium.Rectangle.fromDegrees(95.0, -55.0, 170.0, -1.0) // From GetCapabilities EX_GeographicBoundingBox + * }); + * // Using custom tags in your template url. + * const custom = new Cesium.UrlTemplateImageryProvider({ + * url : 'https://yoururl/{Time}/{z}/{y}/{x}.png', + * customTags : { + * Time: function(imageryProvider, x, y, level) { + * return '20171231' + * } + * } + * }); + * @param options - Object describing initialization options + */ + export class UrlTemplateImageryProvider { + constructor(options: UrlTemplateImageryProvider.ConstructorOptions); + /** + * Gets or sets a value indicating whether feature picking is enabled. If true, {@link UrlTemplateImageryProvider#pickFeatures} will + * request the options.pickFeaturesUrl and attempt to interpret the features included in the response. If false, + * {@link UrlTemplateImageryProvider#pickFeatures} will immediately return undefined (indicating no pickable + * features) without communicating with the server. Set this property to false if you know your data + * source does not support picking features or if you don't want this provider's features to be pickable. + */ + enablePickFeatures: boolean; + /** + * Gets the URL template to use to request tiles. It has the following keywords: + *
    + *
  • {z}: The level of the tile in the tiling scheme. Level zero is the root of the quadtree pyramid.
  • + *
  • {x}: The tile X coordinate in the tiling scheme, where 0 is the Westernmost tile.
  • + *
  • {y}: The tile Y coordinate in the tiling scheme, where 0 is the Northernmost tile.
  • + *
  • {s}: One of the available subdomains, used to overcome browser limits on the number of simultaneous requests per host.
  • + *
  • {reverseX}: The tile X coordinate in the tiling scheme, where 0 is the Easternmost tile.
  • + *
  • {reverseY}: The tile Y coordinate in the tiling scheme, where 0 is the Southernmost tile.
  • + *
  • {reverseZ}: The level of the tile in the tiling scheme, where level zero is the maximum level of the quadtree pyramid. In order to use reverseZ, maximumLevel must be defined.
  • + *
  • {westDegrees}: The Western edge of the tile in geodetic degrees.
  • + *
  • {southDegrees}: The Southern edge of the tile in geodetic degrees.
  • + *
  • {eastDegrees}: The Eastern edge of the tile in geodetic degrees.
  • + *
  • {northDegrees}: The Northern edge of the tile in geodetic degrees.
  • + *
  • {westProjected}: The Western edge of the tile in projected coordinates of the tiling scheme.
  • + *
  • {southProjected}: The Southern edge of the tile in projected coordinates of the tiling scheme.
  • + *
  • {eastProjected}: The Eastern edge of the tile in projected coordinates of the tiling scheme.
  • + *
  • {northProjected}: The Northern edge of the tile in projected coordinates of the tiling scheme.
  • + *
  • {width}: The width of each tile in pixels.
  • + *
  • {height}: The height of each tile in pixels.
  • + *
+ */ + readonly url: string; + /** + * Gets the URL scheme zero padding for each tile coordinate. The format is '000' where each coordinate will be padded on + * the left with zeros to match the width of the passed string of zeros. e.g. Setting: + * urlSchemeZeroPadding : { '{x}' : '0000'} + * will cause an 'x' value of 12 to return the string '0012' for {x} in the generated URL. + * It has the following keywords: + *
    + *
  • {z}: The zero padding for the level of the tile in the tiling scheme.
  • + *
  • {x}: The zero padding for the tile X coordinate in the tiling scheme.
  • + *
  • {y}: The zero padding for the the tile Y coordinate in the tiling scheme.
  • + *
  • {reverseX}: The zero padding for the tile reverseX coordinate in the tiling scheme.
  • + *
  • {reverseY}: The zero padding for the tile reverseY coordinate in the tiling scheme.
  • + *
  • {reverseZ}: The zero padding for the reverseZ coordinate of the tile in the tiling scheme.
  • + *
+ */ + readonly urlSchemeZeroPadding: any; + /** + * Gets the URL template to use to use to pick features. If this property is not specified, + * {@link UrlTemplateImageryProvider#pickFeatures} will immediately return undefined, indicating no + * features picked. The URL template supports all of the keywords supported by the + * {@link UrlTemplateImageryProvider#url} property, plus the following: + *
    + *
  • {i}: The pixel column (horizontal coordinate) of the picked position, where the Westernmost pixel is 0.
  • + *
  • {j}: The pixel row (vertical coordinate) of the picked position, where the Northernmost pixel is 0.
  • + *
  • {reverseI}: The pixel column (horizontal coordinate) of the picked position, where the Easternmost pixel is 0.
  • + *
  • {reverseJ}: The pixel row (vertical coordinate) of the picked position, where the Southernmost pixel is 0.
  • + *
  • {longitudeDegrees}: The longitude of the picked position in degrees.
  • + *
  • {latitudeDegrees}: The latitude of the picked position in degrees.
  • + *
  • {longitudeProjected}: The longitude of the picked position in the projected coordinates of the tiling scheme.
  • + *
  • {latitudeProjected}: The latitude of the picked position in the projected coordinates of the tiling scheme.
  • + *
  • {format}: The format in which to get feature information, as specified in the {@link GetFeatureInfoFormat}.
  • + *
+ */ + readonly pickFeaturesUrl: string; + /** + * Gets the proxy used by this provider. + */ + readonly proxy: Proxy; + /** + * Gets the width of each tile, in pixels. + */ + readonly tileWidth: number; + /** + * Gets the height of each tile, in pixels. + */ + readonly tileHeight: number; + /** + * Gets the maximum level-of-detail that can be requested, or undefined if there is no limit. + */ + readonly maximumLevel: number | undefined; + /** + * Gets the minimum level-of-detail that can be requested. + */ + readonly minimumLevel: number; + /** + * Gets the tiling scheme used by this provider. + */ + readonly tilingScheme: TilingScheme; + /** + * Gets the rectangle, in radians, of the imagery provided by this instance. + */ + readonly rectangle: Rectangle; + /** + * Gets the tile discard policy. If not undefined, the discard policy is responsible + * for filtering out "missing" tiles via its shouldDiscardImage function. If this function + * returns undefined, no tiles are filtered. + */ + readonly tileDiscardPolicy: TileDiscardPolicy; + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + */ + readonly errorEvent: Event; + /** + * Gets the credit to display when this imagery provider is active. Typically this is used to credit + * the source of the imagery. + */ + readonly credit: Credit; + /** + * Gets a value indicating whether or not the images provided by this imagery provider + * include an alpha channel. If this property is false, an alpha channel, if present, will + * be ignored. If this property is true, any images without an alpha channel will be treated + * as if their alpha is 1.0 everywhere. When this property is false, memory usage + * and texture upload time are reduced. + */ + readonly hasAlphaChannel: boolean; + /** + * Gets the credits to be displayed when a given tile is displayed. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level; + * @returns The credits to be displayed when the tile is displayed. + */ + getTileCredits(x: number, y: number, level: number): Credit[]; + /** + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param [request] - The request object. Intended for internal use only. + * @returns A promise for the image that will resolve when the image is available, or + * undefined if there are too many active requests to the server, and the request should be retried later. + */ + requestImage( + x: number, + y: number, + level: number, + request?: Request, + ): Promise | undefined; + /** + * Asynchronously determines what features, if any, are located at a given longitude and latitude within + * a tile. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param longitude - The longitude at which to pick features. + * @param latitude - The latitude at which to pick features. + * @returns A promise for the picked features that will resolve when the asynchronous + * picking completes. The resolved value is an array of {@link ImageryLayerFeatureInfo} + * instances. The array may be empty if no features are found at the given location. + * It may also be undefined if picking is not supported. + */ + pickFeatures( + x: number, + y: number, + level: number, + longitude: number, + latitude: number, + ): Promise | undefined; + } + + /** + * The vertical location of an origin relative to an object, e.g., a {@link Billboard} + * or {@link Label}. For example, setting the vertical origin to TOP + * or BOTTOM will display a billboard above or below (in screen space) + * the anchor position. + *

+ *
+ *
+ *
+ */ + export enum VerticalOrigin { + /** + * The origin is at the vertical center between BASELINE and TOP. + */ + CENTER = 0, + /** + * The origin is at the bottom of the object. + */ + BOTTOM = 1, + /** + * If the object contains text, the origin is at the baseline of the text, else the origin is at the bottom of the object. + */ + BASELINE = 2, + /** + * The origin is at the top of the object. + */ + TOP = -1, + } + + /** + * A viewport aligned quad. + * @example + * const viewportQuad = new Cesium.ViewportQuad(new Cesium.BoundingRectangle(0, 0, 80, 40)); + * viewportQuad.material.uniforms.color = new Cesium.Color(1.0, 0.0, 0.0, 1.0); + * @param [rectangle] - The {@link BoundingRectangle} defining the quad's position within the viewport. + * @param [material] - The {@link Material} defining the surface appearance of the viewport quad. + */ + export class ViewportQuad { + constructor(rectangle?: BoundingRectangle, material?: Material); + /** + * Determines if the viewport quad primitive will be shown. + */ + show: boolean; + /** + * The BoundingRectangle defining the quad's position within the viewport. + * @example + * viewportQuad.rectangle = new Cesium.BoundingRectangle(0, 0, 80, 40); + */ + rectangle: BoundingRectangle; + /** + * The surface appearance of the viewport quad. This can be one of several built-in {@link Material} objects or a custom material, scripted with + * {@link https://github.com/CesiumGS/cesium/wiki/Fabric|Fabric}. + *

+ * The default material is Material.ColorType. + *

+ * @example + * // 1. Change the color of the default material to yellow + * viewportQuad.material.uniforms.color = new Cesium.Color(1.0, 1.0, 0.0, 1.0); + * + * // 2. Change material to horizontal stripes + * viewportQuad.material = Cesium.Material.fromType(Cesium.Material.StripeType); + */ + material: Material; + /** + * Called when {@link Viewer} or {@link CesiumWidget} render the scene to + * get the draw commands needed to render this primitive. + *

+ * Do not call this function directly. This is documented just to + * list the exceptions that may be propagated when the scene is rendered: + *

+ */ + update(): void; + /** + * Returns true if this object was destroyed; otherwise, false. + *

+ * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns True if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

+ * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * quad = quad && quad.destroy(); + */ + destroy(): void; + } + + /** + * A cell from a {@link VoxelPrimitive}. + *

+ * Provides access to properties associated with one cell of a voxel primitive. + *

+ *

+ * Do not construct this directly. Access it through picking using {@link Scene#pickVoxel}. + *

+ * @example + * // On left click, display all the properties for a voxel cell in the console log. + * handler.setInputAction(function(movement) { + * const voxelCell = scene.pickVoxel(movement.position); + * if (voxelCell instanceof Cesium.VoxelCell) { + * const propertyIds = voxelCell.getPropertyIds(); + * const length = propertyIds.length; + * for (let i = 0; i < length; ++i) { + * const propertyId = propertyIds[i]; + * console.log(`{propertyId}: ${voxelCell.getProperty(propertyId)}`); + * } + * } + * }, Cesium.ScreenSpaceEventType.LEFT_CLICK); + * @param primitive - The voxel primitive containing the cell + * @param tileIndex - The index of the tile + * @param sampleIndex - The index of the sample within the tile, containing metadata for this cell + */ + export class VoxelCell { + constructor( + primitive: VoxelPrimitive, + tileIndex: number, + sampleIndex: number, + ); + /** + * All objects returned by {@link Scene#pick} have a primitive property. This returns + * the VoxelPrimitive containing the cell. + */ + readonly primitive: VoxelPrimitive; + /** + * Get the sample index of the cell. + */ + readonly sampleIndex: number; + /** + * Get the index of the tile containing the cell. + */ + readonly tileIndex: number; + /** + * Get a copy of the oriented bounding box containing the cell. + */ + readonly orientedBoundingBox: OrientedBoundingBox; + /** + * Returns true if the feature contains this property. + * @param name - The case-sensitive name of the property. + * @returns Whether the feature contains this property. + */ + hasProperty(name: string): boolean; + /** + * Returns an array of metadata property names for the feature. + * @returns The IDs of the feature's properties. + */ + getNames(): string[]; + /** + * Returns a copy of the value of the metadata in the cell with the given name. + * @example + * // Display all the properties for a voxel cell in the console log. + * const names = voxelCell.getNames(); + * for (let i = 0; i < names.length; ++i) { + * const name = names[i]; + * console.log(`{name}: ${voxelCell.getProperty(name)}`); + * } + * @param name - The case-sensitive name of the property. + * @returns The value of the property or undefined if the feature does not have this property. + */ + getProperty(name: string): any; + } + + /** + *
+ * To construct a VoxelContent, call {@link VoxelContent.fromMetadataArray} or {@link VoxelContent.fromGltf}. Do not call the constructor directly. + *
+ * An object representing voxel content for a {@link Cesium3DTilesVoxelProvider}. + */ + export class VoxelContent { + constructor(); + /** + * Constructs a VoxelContent from an array of metadata. + * @param metadata - The metadata to use for this voxel content. + * @returns A VoxelContent containing the specified metadata. + */ + static fromMetadataArray( + metadata: + | Int8Array[] + | Uint8Array[] + | Int16Array[] + | Uint16Array[] + | Int32Array[] + | Uint32Array[] + | Float32Array[] + | Float64Array[], + ): VoxelContent; + } + + /** + * The metadata for this voxel content. + * The metadata is an array of typed arrays, one for each field. + * The data for one field is a flattened 3D array ordered by X, then Y, then Z. + */ + export const metadata: + | Int8Array[] + | Uint8Array[] + | Int16Array[] + | Uint16Array[] + | Int32Array[] + | Uint32Array[] + | Float32Array[] + | Float64Array[]; + + /** + * Metadata ordering for voxel content. + * In all cases, x data is contiguous in strides along the y axis, + * and each group of y strides represents a z slice. + * However, the orientation of the axes follows different conventions. + */ + export enum VoxelMetadataOrder { + XYZ = 0, + GLTF = 1, + } + + /** + * A primitive that renders voxel data from a {@link VoxelProvider}. + * @param [options] - Object with the following properties: + * @param [options.provider] - The voxel provider that supplies the primitive with tile data. + * @param [options.modelMatrix = Matrix4.IDENTITY] - The model matrix used to transform the primitive. + * @param [options.customShader] - The custom shader used to style the primitive. + * @param [options.clock] - The clock used to control time dynamic behavior. + * @param [options.calculateStatistics] - Generate statistics for performance profile. + */ + export class VoxelPrimitive { + constructor(options?: { + provider?: VoxelProvider; + modelMatrix?: Matrix4; + customShader?: CustomShader; + clock?: Clock; + calculateStatistics?: boolean; + }); + /** + * The event fired to indicate that a tile's content was loaded. + *

+ * This event is fired during the tileset traversal while the frame is being rendered + * so that updates to the tile take effect in the same frame. Do not create or modify + * Cesium entities or primitives during the event listener. + *

+ * @example + * voxelPrimitive.tileLoad.addEventListener(function() { + * console.log('A tile was loaded.'); + * }); + */ + tileLoad: Event; + /** + * This event fires once for each visible tile in a frame. + *

+ * This event is fired during the traversal while the frame is being rendered. + * @example + * voxelPrimitive.tileVisible.addEventListener(function() { + * console.log('A tile is visible.'); + * }); + */ + tileVisible: Event; + /** + * The event fired to indicate that a tile's content failed to load. + * @example + * voxelPrimitive.tileFailed.addEventListener(function() { + * console.log('An error occurred loading tile.'); + * }); + */ + tileFailed: Event; + /** + * The event fired to indicate that a tile's content was unloaded. + * @example + * voxelPrimitive.tileUnload.addEventListener(function() { + * console.log('A tile was unloaded from the cache.'); + * }); + */ + tileUnload: Event; + /** + * The event fired to indicate progress of loading new tiles. This event is fired when a new tile + * is requested, when a requested tile is finished downloading, and when a downloaded tile has been + * processed and is ready to render. + *

+ * The number of pending tile requests, numberOfPendingRequests, and number of tiles + * processing, numberOfTilesProcessing are passed to the event listener. + *

+ *

+ * This event is fired at the end of the frame after the scene is rendered. + *

+ * @example + * voxelPrimitive.loadProgress.addEventListener(function(numberOfPendingRequests, numberOfTilesProcessing) { + * if ((numberOfPendingRequests === 0) && (numberOfTilesProcessing === 0)) { + * console.log('Finished loading'); + * return; + * } + * + * console.log(`Loading: requests: ${numberOfPendingRequests}, processing: ${numberOfTilesProcessing}`); + * }); + */ + loadProgress: Event; + /** + * The event fired to indicate that all tiles that meet the screen space error this frame are loaded. The voxel + * primitive is completely loaded for this view. + *

+ * This event is fired at the end of the frame after the scene is rendered. + *

+ * @example + * voxelPrimitive.allTilesLoaded.addEventListener(function() { + * console.log('All tiles are loaded'); + * }); + */ + allTilesLoaded: Event; + /** + * The event fired to indicate that all tiles that meet the screen space error this frame are loaded. This event + * is fired once when all tiles in the initial view are loaded. + *

+ * This event is fired at the end of the frame after the scene is rendered. + *

+ * @example + * voxelPrimitive.initialTilesLoaded.addEventListener(function() { + * console.log('Initial tiles are loaded'); + * }); + */ + initialTilesLoaded: Event; + /** + * Gets a value indicating whether or not the primitive is ready for use. + */ + readonly ready: boolean; + /** + * Gets the {@link VoxelProvider} associated with this primitive. + */ + readonly provider: VoxelProvider; + /** + * Gets the bounding sphere. + */ + readonly boundingSphere: BoundingSphere; + /** + * Gets the oriented bounding box. + */ + readonly orientedBoundingBox: OrientedBoundingBox; + /** + * Gets the model matrix. + */ + readonly modelMatrix: Matrix4; + /** + * Gets the shape type. + */ + readonly shape: VoxelShapeType; + /** + * Gets the dimensions of each voxel tile, in z-up orientation. + * Does not include padding. + */ + readonly dimensions: Cartesian3; + /** + * Gets the dimensions of one tile of the input voxel data, in the input orientation. + * Includes padding. + */ + readonly inputDimensions: Cartesian3; + /** + * Gets the padding before the voxel data. + */ + readonly paddingBefore: Cartesian3; + /** + * Gets the padding after the voxel data. + */ + readonly paddingAfter: Cartesian3; + /** + * Gets the minimum value per channel of the voxel data. + */ + readonly minimumValues: number[][]; + /** + * Gets the maximum value per channel of the voxel data. + */ + readonly maximumValues: number[][]; + /** + * Gets or sets whether or not this primitive should be displayed. + */ + show: boolean; + /** + * Gets or sets whether or not the primitive should update when the view changes. + */ + disableUpdate: boolean; + /** + * Gets or sets whether or not to render debug visualizations. + */ + debugDraw: boolean; + /** + * Gets or sets whether or not to test against depth when rendering. + */ + depthTest: boolean; + /** + * Gets or sets the nearest sampling. + */ + nearestSampling: boolean; + /** + * Gets or sets the screen space error in pixels. If the screen space size + * of a voxel is greater than the screen space error, the tile is subdivided. + * Lower screen space error corresponds with higher detail rendering, but could + * result in worse performance and higher memory consumption. + */ + screenSpaceError: number; + /** + * Gets or sets the step size multiplier used during raymarching. + * The lower the value, the higher the rendering quality, but + * also the worse the performance. + */ + stepSize: number; + /** + * Gets or sets the minimum bounds in the shape's local coordinate system. + * Voxel data is stretched or squashed to fit the bounds. + */ + minBounds: Cartesian3; + /** + * Gets or sets the maximum bounds in the shape's local coordinate system. + * Voxel data is stretched or squashed to fit the bounds. + */ + maxBounds: Cartesian3; + /** + * Gets or sets the minimum clipping location in the shape's local coordinate system. + * Any voxel content outside the range is clipped. + */ + minClippingBounds: Cartesian3; + /** + * Gets or sets the maximum clipping location in the shape's local coordinate system. + * Any voxel content outside the range is clipped. + */ + maxClippingBounds: Cartesian3; + /** + * The {@link ClippingPlaneCollection} used to selectively disable rendering the primitive. + */ + clippingPlanes: ClippingPlaneCollection; + /** + * Gets or sets the custom shader. If undefined, {@link VoxelPrimitive.DefaultCustomShader} is set. + */ + customShader: CustomShader; + /** + * Gets an event that is raised whenever a custom shader is compiled. + */ + readonly customShaderCompilationEvent: Event; + /** + * Returns true if this object was destroyed; otherwise, false. + *

+ * If this object was destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. + * @returns true if this object was destroyed; otherwise, false. + */ + isDestroyed(): boolean; + /** + * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic + * release of WebGL resources, instead of relying on the garbage collector to destroy this object. + *

+ * Once an object is destroyed, it should not be used; calling any function other than + * isDestroyed will result in a {@link DeveloperError} exception. Therefore, + * assign the return value (undefined) to the object as done in the example. + * @example + * voxelPrimitive = voxelPrimitive && voxelPrimitive.destroy(); + */ + destroy(): void; + } + + /** + * Provides voxel data. Intended to be used with {@link VoxelPrimitive}. + * This type describes an interface and is not intended to be instantiated directly. + */ + export class VoxelProvider { + constructor(); + /** + * A transform from local space to global space. + */ + readonly globalTransform: Matrix4; + /** + * A transform from shape space to local space. + */ + readonly shapeTransform: Matrix4; + /** + * Gets the {@link VoxelShapeType} + */ + readonly shape: VoxelShapeType; + /** + * Gets the minimum bounds. + * If undefined, the shape's default minimum bounds will be used instead. + */ + readonly minBounds: Cartesian3 | undefined; + /** + * Gets the maximum bounds. + * If undefined, the shape's default maximum bounds will be used instead. + */ + readonly maxBounds: Cartesian3 | undefined; + /** + * Gets the number of voxels per dimension of a tile. This is the same for all tiles in the dataset. + */ + readonly dimensions: Cartesian3; + /** + * Gets the number of padding voxels before the tile. This improves rendering quality when sampling the edge of a tile, but it increases memory usage. + */ + readonly paddingBefore: Cartesian3; + /** + * Gets the number of padding voxels after the tile. This improves rendering quality when sampling the edge of a tile, but it increases memory usage. + */ + readonly paddingAfter: Cartesian3; + /** + * Gets the metadata names. + */ + readonly names: string[]; + /** + * Gets the metadata types. + */ + readonly types: MetadataType[]; + /** + * Gets the metadata component types. + */ + readonly componentTypes: MetadataComponentType[]; + /** + * Gets the ordering of the metadata in the buffers. + */ + readonly metadataOrder: VoxelMetadataOrder; + /** + * Gets the metadata minimum values. + */ + readonly minimumValues: number[][] | undefined; + /** + * Gets the metadata maximum values. + */ + readonly maximumValues: number[][] | undefined; + /** + * The maximum number of tiles that exist for this provider. + * This value is used as a hint to the voxel renderer to allocate an appropriate amount of GPU memory. + * If this value is not known it can be undefined. + */ + readonly maximumTileCount: number | undefined; + /** + * Requests the data for a given tile. + * @param [options] - Object with the following properties: + * @param [options.tileLevel = 0] - The tile's level. + * @param [options.tileX = 0] - The tile's X coordinate. + * @param [options.tileY = 0] - The tile's Y coordinate. + * @param [options.tileZ = 0] - The tile's Z coordinate. + * @returns A promise resolving to a VoxelContent containing the data for the tile, or undefined if the request could not be scheduled this frame. + */ + requestData(options?: { + tileLevel?: number; + tileX?: number; + tileY?: number; + tileZ?: number; + }): Promise | undefined; + } + + /** + * The number of levels of detail containing available tiles in the tileset. + */ + export const availableLevels: number | undefined; + + /** + * An enum of voxel shapes. The shape controls how the voxel grid is mapped to 3D space. + */ + export enum VoxelShapeType { + /** + * A box shape. + */ + BOX = "BOX", + /** + * An ellipsoid shape. + */ + ELLIPSOID = "ELLIPSOID", + /** + * A cylinder shape. + */ + CYLINDER = "CYLINDER", + } + + /** + * EPSG codes known to include reverse axis orders, but are not within 4000-5000. + */ + export const includesReverseAxis: number[]; + + /** + * EPSG codes known to not include reverse axis orders, and are within 4000-5000. + */ + export const excludesReverseAxis: number[]; + + export namespace WebMapServiceImageryProvider { + /** + * Initialization options for the WebMapServiceImageryProvider constructor + * @property url - The URL of the WMS service. The URL supports the same keywords as the {@link UrlTemplateImageryProvider}. + * @property layers - The layers to include, separated by commas. + * @property [parameters = WebMapServiceImageryProvider.DefaultParameters] - Additional parameters to pass to the WMS server in the GetMap URL. + * @property [getFeatureInfoParameters = WebMapServiceImageryProvider.GetFeatureInfoDefaultParameters] - Additional parameters to pass to the WMS server in the GetFeatureInfo URL. + * @property [enablePickFeatures = true] - If true, {@link WebMapServiceImageryProvider#pickFeatures} will invoke + * the GetFeatureInfo operation on the WMS server and return the features included in the response. If false, + * {@link WebMapServiceImageryProvider#pickFeatures} will immediately return undefined (indicating no pickable features) + * without communicating with the server. Set this property to false if you know your WMS server does not support + * GetFeatureInfo or if you don't want this provider's features to be pickable. Note that this can be dynamically + * overridden by modifying the WebMapServiceImageryProvider#enablePickFeatures property. + * @property [getFeatureInfoFormats = WebMapServiceImageryProvider.DefaultGetFeatureInfoFormats] - The formats + * in which to try WMS GetFeatureInfo requests. + * @property [rectangle = Rectangle.MAX_VALUE] - The rectangle of the layer. + * @property [tilingScheme = new GeographicTilingScheme()] - The tiling scheme to use to divide the world into tiles. + * @property [ellipsoid] - The ellipsoid. If the tilingScheme is specified, + * this parameter is ignored and the tiling scheme's ellipsoid is used instead. If neither + * parameter is specified, the WGS84 ellipsoid is used. + * @property [tileWidth = 256] - The width of each tile in pixels. + * @property [tileHeight = 256] - The height of each tile in pixels. + * @property [minimumLevel = 0] - The minimum level-of-detail supported by the imagery provider. Take care when + * specifying this that the number of tiles at the minimum level is small, such as four or less. A larger number is + * likely to result in rendering problems. + * @property [maximumLevel] - The maximum level-of-detail supported by the imagery provider, or undefined if there is no limit. + * If not specified, there is no limit. + * @property [crs] - CRS specification, for use with WMS specification >= 1.3.0. + * @property [srs] - SRS specification, for use with WMS specification 1.1.0 or 1.1.1 + * @property [credit] - A credit for the data source, which is displayed on the canvas. + * @property [subdomains = 'abc'] - The subdomains to use for the {s} placeholder in the URL template. + * If this parameter is a single string, each character in the string is a subdomain. If it is + * an array, each element in the array is a subdomain. + * @property [clock] - A Clock instance that is used when determining the value for the time dimension. Required when `times` is specified. + * @property [times] - TimeIntervalCollection with its data property being an object containing time dynamic dimension and their values. + * @property [getFeatureInfoUrl] - The getFeatureInfo URL of the WMS service. If the property is not defined then we use the property value of url. + */ + type ConstructorOptions = { + url: Resource | string; + layers: string; + parameters?: any; + getFeatureInfoParameters?: any; + enablePickFeatures?: boolean; + getFeatureInfoFormats?: GetFeatureInfoFormat[]; + rectangle?: Rectangle; + tilingScheme?: TilingScheme; + ellipsoid?: Ellipsoid; + tileWidth?: number; + tileHeight?: number; + minimumLevel?: number; + maximumLevel?: number; + crs?: string; + srs?: string; + credit?: Credit | string; + subdomains?: string | string[]; + clock?: Clock; + times?: TimeIntervalCollection; + getFeatureInfoUrl?: Resource | string; + }; + } + + /** + * Provides tiled imagery hosted by a Web Map Service (WMS) server. + * @example + * const provider = new Cesium.WebMapServiceImageryProvider({ + * url : 'https://sampleserver1.arcgisonline.com/ArcGIS/services/Specialty/ESRI_StatesCitiesRivers_USA/MapServer/WMSServer', + * layers : '0', + * proxy: new Cesium.DefaultProxy('/proxy/') + * }); + * const imageryLayer = new Cesium.ImageryLayer(provider); + * viewer.imageryLayers.add(imageryLayer); + * @param options - Object describing initialization options + */ + export class WebMapServiceImageryProvider { + constructor(options: WebMapServiceImageryProvider.ConstructorOptions); + /** + * Gets the URL of the WMS server. + */ + readonly url: string; + /** + * Gets the proxy used by this provider. + */ + readonly proxy: Proxy; + /** + * Gets the names of the WMS layers, separated by commas. + */ + readonly layers: string; + /** + * Gets the width of each tile, in pixels. + */ + readonly tileWidth: number; + /** + * Gets the height of each tile, in pixels. + */ + readonly tileHeight: number; + /** + * Gets the maximum level-of-detail that can be requested. + */ + readonly maximumLevel: number | undefined; + /** + * Gets the minimum level-of-detail that can be requested. + */ + readonly minimumLevel: number; + /** + * Gets the tiling scheme used by this provider. + */ + readonly tilingScheme: TilingScheme; + /** + * Gets the rectangle, in radians, of the imagery provided by this instance. + */ + readonly rectangle: Rectangle; + /** + * Gets the tile discard policy. If not undefined, the discard policy is responsible + * for filtering out "missing" tiles via its shouldDiscardImage function. If this function + * returns undefined, no tiles are filtered. + */ + readonly tileDiscardPolicy: TileDiscardPolicy; + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + */ + readonly errorEvent: Event; + /** + * Gets the credit to display when this imagery provider is active. Typically this is used to credit + * the source of the imagery. + */ + readonly credit: Credit; + /** + * Gets a value indicating whether or not the images provided by this imagery provider + * include an alpha channel. If this property is false, an alpha channel, if present, will + * be ignored. If this property is true, any images without an alpha channel will be treated + * as if their alpha is 1.0 everywhere. When this property is false, memory usage + * and texture upload time are reduced. + */ + readonly hasAlphaChannel: boolean; + /** + * Gets or sets a value indicating whether feature picking is enabled. If true, {@link WebMapServiceImageryProvider#pickFeatures} will + * invoke the GetFeatureInfo service on the WMS server and attempt to interpret the features included in the response. If false, + * {@link WebMapServiceImageryProvider#pickFeatures} will immediately return undefined (indicating no pickable + * features) without communicating with the server. Set this property to false if you know your data + * source does not support picking features or if you don't want this provider's features to be pickable. + */ + enablePickFeatures: boolean; + /** + * Gets or sets a clock that is used to get keep the time used for time dynamic parameters. + */ + clock: Clock; + /** + * Gets or sets a time interval collection that is used to get time dynamic parameters. The data of each + * TimeInterval is an object containing the keys and values of the properties that are used during + * tile requests. + */ + times: TimeIntervalCollection; + /** + * Gets the getFeatureInfo URL of the WMS server. + */ + readonly getFeatureInfoUrl: Resource | string; + /** + * Gets the credits to be displayed when a given tile is displayed. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level; + * @returns The credits to be displayed when the tile is displayed. + */ + getTileCredits(x: number, y: number, level: number): Credit[]; + /** + * Requests the image for a given tile. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param [request] - The request object. Intended for internal use only. + * @returns A promise for the image that will resolve when the image is available, or + * undefined if there are too many active requests to the server, and the request should be retried later. + */ + requestImage( + x: number, + y: number, + level: number, + request?: Request, + ): Promise | undefined; + /** + * Asynchronously determines what features, if any, are located at a given longitude and latitude within + * a tile. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param longitude - The longitude at which to pick features. + * @param latitude - The latitude at which to pick features. + * @returns A promise for the picked features that will resolve when the asynchronous + * picking completes. The resolved value is an array of {@link ImageryLayerFeatureInfo} + * instances. The array may be empty if no features are found at the given location. + */ + pickFeatures( + x: number, + y: number, + level: number, + longitude: number, + latitude: number, + ): Promise | undefined; + /** + * The default parameters to include in the WMS URL to obtain images. The values are as follows: + * service=WMS + * version=1.1.1 + * request=GetMap + * styles= + * format=image/jpeg + */ + static readonly DefaultParameters: any; + /** + * The default parameters to include in the WMS URL to get feature information. The values are as follows: + * service=WMS + * version=1.1.1 + * request=GetFeatureInfo + */ + static readonly GetFeatureInfoDefaultParameters: any; + } + + export namespace WebMapTileServiceImageryProvider { + /** + * Initialization options for the WebMapTileServiceImageryProvider constructor + * @property url - The base URL for the WMTS GetTile operation (for KVP-encoded requests) or the tile-URL template (for RESTful requests). The tile-URL template should contain the following variables: {style}, {TileMatrixSet}, {TileMatrix}, {TileRow}, {TileCol}. The first two are optional if actual values are hardcoded or not required by the server. The {s} keyword may be used to specify subdomains. + * @property [format = 'image/jpeg'] - The MIME type for images to retrieve from the server. + * @property layer - The layer name for WMTS requests. + * @property style - The style name for WMTS requests. + * @property tileMatrixSetID - The identifier of the TileMatrixSet to use for WMTS requests. + * @property [tileMatrixLabels] - A list of identifiers in the TileMatrix to use for WMTS requests, one per TileMatrix level. + * @property [clock] - A Clock instance that is used when determining the value for the time dimension. Required when `times` is specified. + * @property [times] - TimeIntervalCollection with its data property being an object containing time dynamic dimension and their values. + * @property [dimensions] - A object containing static dimensions and their values. + * @property [tileWidth = 256] - The tile width in pixels. + * @property [tileHeight = 256] - The tile height in pixels. + * @property [tilingScheme] - The tiling scheme corresponding to the organization of the tiles in the TileMatrixSet. + * @property [rectangle = Rectangle.MAX_VALUE] - The rectangle covered by the layer. + * @property [minimumLevel = 0] - The minimum level-of-detail supported by the imagery provider. + * @property [maximumLevel] - The maximum level-of-detail supported by the imagery provider, or undefined if there is no limit. + * @property [ellipsoid] - The ellipsoid. If not specified, the WGS84 ellipsoid is used. + * @property [credit] - A credit for the data source, which is displayed on the canvas. + * @property [subdomains = 'abc'] - The subdomains to use for the {s} placeholder in the URL template. + * If this parameter is a single string, each character in the string is a subdomain. If it is + * an array, each element in the array is a subdomain. + */ + type ConstructorOptions = { + url: Resource | string; + format?: string; + layer: string; + style: string; + tileMatrixSetID: string; + tileMatrixLabels?: any[]; + clock?: Clock; + times?: TimeIntervalCollection; + dimensions?: any; + tileWidth?: number; + tileHeight?: number; + tilingScheme?: TilingScheme; + rectangle?: Rectangle; + minimumLevel?: number; + maximumLevel?: number; + ellipsoid?: Ellipsoid; + credit?: Credit | string; + subdomains?: string | string[]; + }; + } + + /** + * Provides tiled imagery served by {@link http://www.opengeospatial.org/standards/wmts|WMTS 1.0.0} compliant servers. + * This provider supports HTTP KVP-encoded and RESTful GetTile requests, but does not yet support the SOAP encoding. + * @example + * // Example 1. USGS shaded relief tiles (KVP) + * const shadedRelief1 = new Cesium.WebMapTileServiceImageryProvider({ + * url : 'https://basemap.nationalmap.gov/arcgis/rest/services/USGSShadedReliefOnly/MapServer/WMTS', + * layer : 'USGSShadedReliefOnly', + * style : 'default', + * format : 'image/jpeg', + * tileMatrixSetID : 'default028mm', + * // tileMatrixLabels : ['default028mm:0', 'default028mm:1', 'default028mm:2' ...], + * maximumLevel: 19, + * credit : new Cesium.Credit('U. S. Geological Survey') + * }); + * viewer.imageryLayers.addImageryProvider(shadedRelief1); + * @example + * // Example 2. USGS shaded relief tiles (RESTful) + * const shadedRelief2 = new Cesium.WebMapTileServiceImageryProvider({ + * url : 'https://basemap.nationalmap.gov/arcgis/rest/services/USGSShadedReliefOnly/MapServer/WMTS/tile/1.0.0/USGSShadedReliefOnly/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpg', + * layer : 'USGSShadedReliefOnly', + * style : 'default', + * format : 'image/jpeg', + * tileMatrixSetID : 'default028mm', + * maximumLevel: 19, + * credit : new Cesium.Credit('U. S. Geological Survey') + * }); + * viewer.imageryLayers.addImageryProvider(shadedRelief2); + * @example + * // Example 3. NASA time dynamic weather data (RESTful) + * const times = Cesium.TimeIntervalCollection.fromIso8601({ + * iso8601: '2015-07-30/2017-06-16/P1D', + * dataCallback: function dataCallback(interval, index) { + * return { + * Time: Cesium.JulianDate.toIso8601(interval.start) + * }; + * } + * }); + * const weather = new Cesium.WebMapTileServiceImageryProvider({ + * url : 'https://gibs.earthdata.nasa.gov/wmts/epsg4326/best/AMSR2_Snow_Water_Equivalent/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png', + * layer : 'AMSR2_Snow_Water_Equivalent', + * style : 'default', + * tileMatrixSetID : '2km', + * maximumLevel : 5, + * format : 'image/png', + * clock: clock, + * times: times, + * credit : new Cesium.Credit('NASA Global Imagery Browse Services for EOSDIS') + * }); + * viewer.imageryLayers.addImageryProvider(weather); + * @param options - Object describing initialization options + */ + export class WebMapTileServiceImageryProvider { + constructor(options: WebMapTileServiceImageryProvider.ConstructorOptions); + /** + * Gets the URL of the service hosting the imagery. + */ + readonly url: string; + /** + * Gets the proxy used by this provider. + */ + readonly proxy: Proxy; + /** + * Gets the width of each tile, in pixels. + */ + readonly tileWidth: number; + /** + * Gets the height of each tile, in pixels. + */ + readonly tileHeight: number; + /** + * Gets the maximum level-of-detail that can be requested. + */ + readonly maximumLevel: number | undefined; + /** + * Gets the minimum level-of-detail that can be requested. + */ + readonly minimumLevel: number; + /** + * Gets the tiling scheme used by this provider. + */ + readonly tilingScheme: TilingScheme; + /** + * Gets the rectangle, in radians, of the imagery provided by this instance. + */ + readonly rectangle: Rectangle; + /** + * Gets the tile discard policy. If not undefined, the discard policy is responsible + * for filtering out "missing" tiles via its shouldDiscardImage function. If this function + * returns undefined, no tiles are filtered. + */ + readonly tileDiscardPolicy: TileDiscardPolicy; + /** + * Gets an event that is raised when the imagery provider encounters an asynchronous error. By subscribing + * to the event, you will be notified of the error and can potentially recover from it. Event listeners + * are passed an instance of {@link TileProviderError}. + */ + readonly errorEvent: Event; + /** + * Gets the mime type of images returned by this imagery provider. + */ + readonly format: string; + /** + * Gets the credit to display when this imagery provider is active. Typically this is used to credit + * the source of the imagery. + */ + readonly credit: Credit; + /** + * Gets a value indicating whether or not the images provided by this imagery provider + * include an alpha channel. If this property is false, an alpha channel, if present, will + * be ignored. If this property is true, any images without an alpha channel will be treated + * as if their alpha is 1.0 everywhere. When this property is false, memory usage + * and texture upload time are reduced. + */ + readonly hasAlphaChannel: boolean; + /** + * Gets or sets a clock that is used to get keep the time used for time dynamic parameters. + */ + clock: Clock; + /** + * Gets or sets a time interval collection that is used to get time dynamic parameters. The data of each + * TimeInterval is an object containing the keys and values of the properties that are used during + * tile requests. + */ + times: TimeIntervalCollection; + /** + * Gets or sets an object that contains static dimensions and their values. + */ + dimensions: any; + /** + * Gets the credits to be displayed when a given tile is displayed. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level; + * @returns The credits to be displayed when the tile is displayed. + */ + getTileCredits(x: number, y: number, level: number): Credit[]; + /** + * Requests the image for a given tile. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param [request] - The request object. Intended for internal use only. + * @returns A promise for the image that will resolve when the image is available, or + * undefined if there are too many active requests to the server, and the request should be retried later. + */ + requestImage( + x: number, + y: number, + level: number, + request?: Request, + ): Promise | undefined; + /** + * Picking features is not currently supported by this imagery provider, so this function simply returns + * undefined. + * @param x - The tile X coordinate. + * @param y - The tile Y coordinate. + * @param level - The tile level. + * @param longitude - The longitude at which to pick features. + * @param latitude - The latitude at which to pick features. + * @returns Undefined since picking is not supported. + */ + pickFeatures( + x: number, + y: number, + level: number, + longitude: number, + latitude: number, + ): undefined; + } + + /** + * @property height - The height. + * @property color - The color at this height. + */ + export type createElevationBandMaterialEntry = { + height: number; + color: Color; + }; + + /** + * @property entries - A list of elevation entries. They will automatically be sorted from lowest to highest. If there is only one entry and extendsDownards and extendUpwards are both false, they will both be set to true. + * @property [extendDownwards = false] - If true, the band's minimum elevation color will extend infinitely downwards. + * @property [extendUpwards = false] - If true, the band's maximum elevation color will extend infinitely upwards. + */ + export type createElevationBandMaterialBand = { + entries: createElevationBandMaterialEntry[]; + extendDownwards?: boolean; + extendUpwards?: boolean; + }; + + /** + * Creates a {@link Material} that combines multiple layers of color/gradient bands and maps them to terrain heights. + * + * The shader does a binary search over all the heights to find out which colors are above and below a given height, and + * interpolates between them for the final color. This material supports hundreds of entries relatively cheaply. + * @example + * scene.globe.material = Cesium.createElevationBandMaterial({ + * scene : scene, + * layers : [{ + * entries : [{ + * height : 4200.0, + * color : new Cesium.Color(0.0, 0.0, 0.0, 1.0) + * }, { + * height : 8848.0, + * color : new Cesium.Color(1.0, 1.0, 1.0, 1.0) + * }], + * extendDownwards : true, + * extendUpwards : true, + * }, { + * entries : [{ + * height : 7000.0, + * color : new Cesium.Color(1.0, 0.0, 0.0, 0.5) + * }, { + * height : 7100.0, + * color : new Cesium.Color(1.0, 0.0, 0.0, 0.5) + * }] + * }] + * }); + * @param options - Object with the following properties: + * @param options.scene - The scene where the visualization is taking place. + * @param options.layers - A list of bands ordered from lowest to highest precedence. + * @returns A new {@link Material} instance. + */ + export function createElevationBandMaterial(options: { + scene: Scene; + layers: createElevationBandMaterialBand[]; + }): Material; + + /** + * Creates a {@link Cesium3DTileset} instance for the Google Photorealistic 3D + * Tiles tileset. + * + * Google Photorealistic 3D Tiles can only be used with the Google geocoder. To + * confirm that you are aware of this restriction pass + * `usingOnlyWithGoogleGeocoder: true` to the apiOptions. Otherwise a one time + * warning will be displayed when this function is called. + * @example + * const viewer = new Cesium.Viewer("cesiumContainer", { + * geocoder: Cesium.IonGeocodeProviderType.GOOGLE + * }); + * + * try { + * const tileset = await Cesium.createGooglePhotorealistic3DTileset({ + * onlyUsingWithGoogleGeocoder: true, + * }); + * viewer.scene.primitives.add(tileset)); + * } catch (error) { + * console.log(`Error creating tileset: ${error}`); + * } + * @example + * // Use your own Google Maps API key + * Cesium.GoogleMaps.defaultApiKey = "your-api-key"; + * + * const viewer = new Cesium.Viewer("cesiumContainer". { + * geocoder: Cesium.IonGeocodeProviderType.GOOGLE + * }); + * + * try { + * const tileset = await Cesium.createGooglePhotorealistic3DTileset({ + * onlyUsingWithGoogleGeocoder: true, + * }); + * viewer.scene.primitives.add(tileset)); + * } catch (error) { + * console.log(`Error creating tileset: ${error}`); + * } + * @param [apiOptions.key = GoogleMaps.defaultApiKey] - Your API key to access Google Photorealistic 3D Tiles. See {@link https://developers.google.com/maps/documentation/javascript/get-api-key} for instructions on how to create your own key. + * @param [apiOptions.onlyUsingWithGoogleGeocoder] - Confirmation that this tileset will only be used with the Google geocoder. + * @param [tilesetOptions] - An object describing initialization options. + */ + export function createGooglePhotorealistic3DTileset( + apiOptions?: { + key?: string; + onlyUsingWithGoogleGeocoder?: true; + }, + tilesetOptions?: Cesium3DTileset.ConstructorOptions, + ): Promise; + + /** + * Creates a {@link Cesium3DTileset} instance for the + * {@link https://cesium.com/content/cesium-osm-buildings/|Cesium OSM Buildings} + * tileset. + * @example + * // Create Cesium OSM Buildings with default styling + * const viewer = new Cesium.Viewer("cesiumContainer"); + * try { + * const tileset = await Cesium.createOsmBuildingsAsync(); + * viewer.scene.primitives.add(tileset)); + * } catch (error) { + * console.log(`Error creating tileset: ${error}`); + * } + * @example + * // Create Cesium OSM Buildings with a custom style highlighting + * // schools and hospitals. + * const viewer = new Cesium.Viewer("cesiumContainer"); + * try { + * const tileset = await Cesium.createOsmBuildingsAsync({ + * style: new Cesium.Cesium3DTileStyle({ + * color: { + * conditions: [ + * ["${feature['building']} === 'hospital'", "color('#0000FF')"], + * ["${feature['building']} === 'school'", "color('#00FF00')"], + * [true, "color('#ffffff')"] + * ] + * } + * }) + * }); + * viewer.scene.primitives.add(tileset)); + * } catch (error) { + * console.log(`Error creating tileset: ${error}`); + * } + * @param [options] - Construction options. Any options allowed by the {@link Cesium3DTileset} constructor + * may be specified here. In addition to those, the following properties are supported: + * @param [options.defaultColor = Color.WHITE] - The default color to use for buildings + * that do not have a color. This parameter is ignored if options.style is specified. + * @param [options.style] - The style to use with the tileset. If not + * specified, a default style is used which gives each building or building part a + * color inferred from its OpenStreetMap tags. If no color can be inferred, + * options.defaultColor is used. + * @param [options.enableShowOutline = true] - If true, enable rendering outlines. This can be set to false to avoid the additional processing of geometry at load time. + * @param [options.showOutline = true] - Whether to show outlines around buildings. When true, + * outlines are displayed. When false, outlines are not displayed. + */ + export function createOsmBuildingsAsync(options?: { + defaultColor?: Color; + style?: Cesium3DTileStyle; + enableShowOutline?: boolean; + showOutline?: boolean; + }): Promise; + + /** + * Creates a {@link Primitive} to visualize well-known vector vertex attributes: + * normal, tangent, and bitangent. Normal + * is red; tangent is green; and bitangent is blue. If an attribute is not + * present, it is not drawn. + * @example + * scene.primitives.add(Cesium.createTangentSpaceDebugPrimitive({ + * geometry : instance.geometry, + * length : 100000.0, + * modelMatrix : instance.modelMatrix + * })); + * @param options - Object with the following properties: + * @param options.geometry - The Geometry instance with the attribute. + * @param [options.length = 10000.0] - The length of each line segment in meters. This can be negative to point the vector in the opposite direction. + * @param [options.modelMatrix = Matrix4.IDENTITY] - The model matrix that transforms to transform the geometry from model to world coordinates. + * @returns A new Primitive instance with geometry for the vectors. + */ + export function createTangentSpaceDebugPrimitive(options: { + geometry: Geometry; + length?: number; + modelMatrix?: Matrix4; + }): Primitive; + + /** + * Creates an {@link IonImageryProvider} instance for ion's default global base imagery layer, currently Bing Maps. + * @example + * // Create a Cesium World Imagery base layer with default settings + * try { + * const imageryProvider = await Cesium.createWorldImageryAsync(); + * } catch (error) { + * console.log(`There was an error creating world imagery: ${error}`); + * } + * @example + * // Create Cesium World Imagery with different style + * try { + * const imageryProvider = await Cesium.createWorldImageryAsync({ + * style: Cesium.IonWorldImageryStyle.AERIAL_WITH_LABELS + * }); + * } catch (error) { + * console.log(`There was an error creating world imagery: ${error}`); + * } + * @param [options] - Object with the following properties: + * @param [options.style = IonWorldImageryStyle] - The style of base imagery, only AERIAL, AERIAL_WITH_LABELS, and ROAD are currently supported. + */ + export function createWorldImageryAsync(options?: { + style?: IonWorldImageryStyle; + }): Promise; + + /** + * A widget containing a Cesium scene. + * @example + * // For each example, include a link to CesiumWidget.css stylesheet in HTML head, + * // and in the body, include:
+ * + * // Widget with no terrain and default Bing Maps imagery provider. + * const widget = new Cesium.CesiumWidget("cesiumContainer"); + * + * // Widget with ion imagery and Cesium World Terrain. + * const widget2 = new Cesium.CesiumWidget("cesiumContainer", { + * baseLayer: Cesium.ImageryLayer.fromWorldTerrain(), + * terrain: Cesium.Terrain.fromWorldTerrain() + * skyBox: new Cesium.SkyBox({ + * sources: { + * positiveX: "stars/TychoSkymapII.t3_08192x04096_80_px.jpg", + * negativeX: "stars/TychoSkymapII.t3_08192x04096_80_mx.jpg", + * positiveY: "stars/TychoSkymapII.t3_08192x04096_80_py.jpg", + * negativeY: "stars/TychoSkymapII.t3_08192x04096_80_my.jpg", + * positiveZ: "stars/TychoSkymapII.t3_08192x04096_80_pz.jpg", + * negativeZ: "stars/TychoSkymapII.t3_08192x04096_80_mz.jpg" + * } + * }), + * // Show Columbus View map with Web Mercator projection + * sceneMode: Cesium.SceneMode.COLUMBUS_VIEW, + * mapProjection: new Cesium.WebMercatorProjection() + * }); + * @param container - The DOM element or ID that will contain the widget. + * @param [options] - Object with the following properties: + * @param [options.clock = new Clock()] - The clock to use to control current time. + * @param [options.shouldAnimate = false] - true if the clock should attempt to advance simulation time by default, false otherwise. + * @param [options.ellipsoid = Ellipsoid.default] - The default ellipsoid. + * @param [options.baseLayer = ImageryLayer.fromWorldImagery()] - The bottommost imagery layer applied to the globe. If set to false, no imagery provider will be added. + * @param [options.terrainProvider = new EllipsoidTerrainProvider(options.ellipsoid)] - The terrain provider. + * @param [options.terrain] - A terrain object which handles asynchronous terrain provider. Can only specify if options.terrainProvider is undefined. + * @param [options.skyBox] - The skybox used to render the stars. When undefined and the WGS84 ellipsoid used, the default stars are used. If set to false, no skyBox, Sun, or Moon will be added. + * @param [options.skyAtmosphere] - Blue sky, and the glow around the Earth's limb. Enabled when the default ellipsoid used. Set to false to turn it off. + * @param [options.sceneMode = SceneMode.SCENE3D] - The initial scene mode. + * @param [options.scene3DOnly = false] - When true, each geometry instance will only be rendered in 3D to save GPU memory. + * @param [options.orderIndependentTranslucency = true] - If true and the configuration supports it, use order independent translucency. + * @param [options.mapProjection = new GeographicProjection(options.ellipsoid)] - The map projection to use in 2D and Columbus View modes. + * @param [options.globe = new Globe(options.ellipsoid)] - The globe to use in the scene. If set to false, no globe will be added and the sky atmosphere will be hidden by default. + * @param [options.useDefaultRenderLoop = true] - True if this widget should control the render loop, false otherwise. + * @param [options.useBrowserRecommendedResolution = true] - If true, render at the browser's recommended resolution and ignore window.devicePixelRatio. + * @param [options.targetFrameRate] - The target frame rate when using the default render loop. + * @param [options.showRenderLoopErrors = true] - If true, this widget will automatically display an HTML panel to the user containing the error, if a render loop error occurs. + * @param [options.automaticallyTrackDataSourceClocks = true] - If true, this widget will automatically track the clock settings of newly added DataSources, updating if the DataSource's clock changes. Set this to false if you want to configure the clock independently. + * @param [options.contextOptions] - Context and WebGL creation properties passed to {@link Scene}. + * @param [options.creditContainer] - The DOM element or ID that will contain the {@link CreditDisplay}. If not specified, the credits are added + * to the bottom of the widget itself. + * @param [options.creditViewport] - The DOM element or ID that will contain the credit pop up created by the {@link CreditDisplay}. If not specified, it will appear over the widget itself. + * @param [options.dataSources = new DataSourceCollection()] - The collection of data sources visualized by the widget. If this parameter is provided, + * the instance is assumed to be owned by the caller and will not be destroyed when the widget is destroyed. + * @param [options.shadows = false] - Determines if shadows are cast by light sources. + * @param [options.terrainShadows = ShadowMode.RECEIVE_ONLY] - Determines if the terrain casts or receives shadows from light sources. + * @param [options.mapMode2D = MapMode2D.INFINITE_SCROLL] - Determines if the 2D map is rotatable or can be scrolled infinitely in the horizontal direction. + * @param [options.blurActiveElementOnCanvasFocus = true] - If true, the active element will blur when the widget's canvas is clicked. Setting this to false is useful for cases when the canvas is clicked only for retrieving position or an entity data without actually meaning to set the canvas to be the active element. + * @param [options.requestRenderMode = false] - If true, rendering a frame will only occur when needed as determined by changes within the scene. Enabling improves performance of the application, but requires using {@link Scene#requestRender} to render a new frame explicitly in this mode. This will be necessary in many cases after making changes to the scene in other parts of the API. See {@link https://cesium.com/blog/2018/01/24/cesium-scene-rendering-performance/|Improving Performance with Explicit Rendering}. + * @param [options.maximumRenderTimeChange = 0.0] - If requestRenderMode is true, this value defines the maximum change in simulation time allowed before a render is requested. See {@link https://cesium.com/blog/2018/01/24/cesium-scene-rendering-performance/|Improving Performance with Explicit Rendering}. + * @param [options.msaaSamples = 4] - If provided, this value controls the rate of multisample antialiasing. Typical multisampling rates are 2, 4, and sometimes 8 samples per pixel. Higher sampling rates of MSAA may impact performance in exchange for improved visual quality. This value only applies to WebGL2 contexts that support multisample render targets. Set to 1 to disable MSAA. + */ + export class CesiumWidget { + constructor( + container: Element | string, + options?: { + clock?: Clock; + shouldAnimate?: boolean; + ellipsoid?: Ellipsoid; + baseLayer?: ImageryLayer | false; + terrainProvider?: TerrainProvider; + terrain?: Terrain; + skyBox?: SkyBox | false; + skyAtmosphere?: SkyAtmosphere | false; + sceneMode?: SceneMode; + scene3DOnly?: boolean; + orderIndependentTranslucency?: boolean; + mapProjection?: MapProjection; + globe?: Globe | false; + useDefaultRenderLoop?: boolean; + useBrowserRecommendedResolution?: boolean; + targetFrameRate?: number; + showRenderLoopErrors?: boolean; + automaticallyTrackDataSourceClocks?: boolean; + contextOptions?: ContextOptions; + creditContainer?: Element | string; + creditViewport?: Element | string; + dataSources?: DataSourceCollection; + shadows?: boolean; + terrainShadows?: ShadowMode; + mapMode2D?: MapMode2D; + blurActiveElementOnCanvasFocus?: boolean; + requestRenderMode?: boolean; + maximumRenderTimeChange?: number; + msaaSamples?: number; + }, + ); + /** + * Gets the parent container. + */ + readonly container: Element; + /** + * Gets the canvas. + */ + readonly canvas: HTMLCanvasElement; + /** + * Gets the credit container. + */ + readonly creditContainer: Element; + /** + * Gets the credit viewport + */ + readonly creditViewport: Element; + /** + * Gets the scene. + */ + readonly scene: Scene; + /** + * Gets the collection of image layers that will be rendered on the globe. + */ + readonly imageryLayers: ImageryLayerCollection; + /** + * The terrain provider providing surface geometry for the globe. + */ + terrainProvider: TerrainProvider; + /** + * Manages the list of credits to display on screen and in the lightbox. + */ + creditDisplay: CreditDisplay; + /** + * Gets the display used for {@link DataSource} visualization. + */ + readonly dataSourceDisplay: DataSourceDisplay; + /** + * Gets the collection of entities not tied to a particular data source. + * This is a shortcut to [dataSourceDisplay.defaultDataSource.entities]{@link CesiumWidget#dataSourceDisplay}. + */ + readonly entities: EntityCollection; + /** + * Gets the set of {@link DataSource} instances to be visualized. + */ + readonly dataSources: DataSourceCollection; + /** + * Gets the camera. + */ + readonly camera: Camera; + /** + * Gets the default ellipsoid for the scene. + */ + readonly ellipsoid: Ellipsoid; + /** + * Gets the clock. + */ + readonly clock: Clock; + /** + * Gets the screen space event handler. + */ + readonly screenSpaceEventHandler: ScreenSpaceEventHandler; + /** + * Gets or sets the target frame rate of the widget when useDefaultRenderLoop + * is true. If undefined, the browser's requestAnimationFrame implementation + * determines the frame rate. If defined, this value must be greater than 0. A value higher + * than the underlying requestAnimationFrame implementation will have no effect. + */ + targetFrameRate: number; + /** + * Gets or sets whether or not this widget should control the render loop. + * If true the widget will use requestAnimationFrame to + * perform rendering and resizing of the widget, as well as drive the + * simulation clock. If set to false, you must manually call the + * resize, render methods as part of a custom + * render loop. If an error occurs during rendering, {@link Scene}'s + * renderError event will be raised and this property + * will be set to false. It must be set back to true to continue rendering + * after the error. + */ + useDefaultRenderLoop: boolean; + /** + * Gets or sets a scaling factor for rendering resolution. Values less than 1.0 can improve + * performance on less powerful devices while values greater than 1.0 will render at a higher + * resolution and then scale down, resulting in improved visual fidelity. + * For example, if the widget is laid out at a size of 640x480, setting this value to 0.5 + * will cause the scene to be rendered at 320x240 and then scaled up while setting + * it to 2.0 will cause the scene to be rendered at 1280x960 and then scaled down. + */ + resolutionScale: number; + /** + * Boolean flag indicating if the browser's recommended resolution is used. + * If true, the browser's device pixel ratio is ignored and 1.0 is used instead, + * effectively rendering based on CSS pixels instead of device pixels. This can improve + * performance on less powerful devices that have high pixel density. When false, rendering + * will be in device pixels. {@link CesiumWidget#resolutionScale} will still take effect whether + * this flag is true or false. + */ + useBrowserRecommendedResolution: boolean; + /** + * Gets or sets whether or not data sources can temporarily pause + * animation in order to avoid showing an incomplete picture to the user. + * For example, if asynchronous primitives are being processed in the + * background, the clock will not advance until the geometry is ready. + */ + allowDataSourcesToSuspendAnimation: boolean; + /** + * Gets or sets the Entity instance currently being tracked by the camera. + */ + trackedEntity: Entity | undefined; + /** + * Gets the event that is raised when the tracked entity changes. + */ + readonly trackedEntityChanged: Event; + /** + * Gets or sets the data source to track with the widget's clock. + */ + clockTrackedDataSource: DataSource; + /** + * Show an error panel to the user containing a title and a longer error message, + * which can be dismissed using an OK button. This panel is displayed automatically + * when a render loop error occurs, if showRenderLoopErrors was not false when the + * widget was constructed. + * @param title - The title to be displayed on the error panel. This string is interpreted as text. + * @param [message] - A helpful, user-facing message to display prior to the detailed error information. This string is interpreted as HTML. + * @param [error] - The error to be displayed on the error panel. This string is formatted using {@link formatError} and then displayed as text. + */ + showErrorPanel(title: string, message?: string, error?: string): void; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the widget. Should be called if permanently + * removing the widget from layout. + */ + destroy(): void; + /** + * Updates the canvas size, camera aspect ratio, and viewport size. + * This function is called automatically as needed unless + * useDefaultRenderLoop is set to false. + */ + resize(): void; + /** + * Renders the scene. This function is called automatically + * unless useDefaultRenderLoop is set to false; + */ + render(): void; + /** + * Asynchronously sets the camera to view the provided entity, entities, or data source. + * If the data source is still in the process of loading or the visualization is otherwise still loading, + * this method waits for the data to be ready before performing the zoom. + * + *

The offset is heading/pitch/range in the local east-north-up reference frame centered at the center of the bounding sphere. + * The heading and the pitch angles are defined in the local east-north-up reference frame. + * The heading is the angle from y axis and increasing towards the x axis. Pitch is the rotation from the xy-plane. Positive pitch + * angles are above the plane. Negative pitch angles are below the plane. The range is the distance from the center. If the range is + * zero, a range will be computed such that the whole bounding sphere is visible.

+ * + *

In 2D, there must be a top down view. The camera will be placed above the target looking down. The height above the + * target will be the range. The heading will be determined from the offset. If the heading cannot be + * determined from the offset, the heading will be north.

+ * @param target - The entity, array of entities, entity collection, data source, Cesium3DTileset, point cloud, or imagery layer to view. You can also pass a promise that resolves to one of the previously mentioned types. + * @param [offset] - The offset from the center of the entity in the local east-north-up reference frame. + * @returns A Promise that resolves to true if the zoom was successful or false if the target is not currently visualized in the scene or the zoom was cancelled. + */ + zoomTo( + target: + | Entity + | Entity[] + | EntityCollection + | DataSource + | ImageryLayer + | Cesium3DTileset + | TimeDynamicPointCloud + | Promise< + | Entity + | Entity[] + | EntityCollection + | DataSource + | ImageryLayer + | Cesium3DTileset + | TimeDynamicPointCloud + | VoxelPrimitive + >, + offset?: HeadingPitchRange, + ): Promise; + /** + * Flies the camera to the provided entity, entities, or data source. + * If the data source is still in the process of loading or the visualization is otherwise still loading, + * this method waits for the data to be ready before performing the flight. + * + *

The offset is heading/pitch/range in the local east-north-up reference frame centered at the center of the bounding sphere. + * The heading and the pitch angles are defined in the local east-north-up reference frame. + * The heading is the angle from y axis and increasing towards the x axis. Pitch is the rotation from the xy-plane. Positive pitch + * angles are above the plane. Negative pitch angles are below the plane. The range is the distance from the center. If the range is + * zero, a range will be computed such that the whole bounding sphere is visible.

+ * + *

In 2D, there must be a top down view. The camera will be placed above the target looking down. The height above the + * target will be the range. The heading will be determined from the offset. If the heading cannot be + * determined from the offset, the heading will be north.

+ * @param target - The entity, array of entities, entity collection, data source, Cesium3DTileset, point cloud, or imagery layer to view. You can also pass a promise that resolves to one of the previously mentioned types. + * @param [options] - Object with the following properties: + * @param [options.duration = 3.0] - The duration of the flight in seconds. + * @param [options.maximumHeight] - The maximum height at the peak of the flight. + * @param [options.offset] - The offset from the target in the local east-north-up reference frame centered at the target. + * @returns A Promise that resolves to true if the flight was successful or false if the target is not currently visualized in the scene or the flight was cancelled. //TODO: Cleanup entity mentions + */ + flyTo( + target: + | Entity + | Entity[] + | EntityCollection + | DataSource + | ImageryLayer + | Cesium3DTileset + | TimeDynamicPointCloud + | Promise< + | Entity + | Entity[] + | EntityCollection + | DataSource + | ImageryLayer + | Cesium3DTileset + | TimeDynamicPointCloud + | VoxelPrimitive + >, + options?: { + duration?: number; + maximumHeight?: number; + offset?: HeadingPitchRange; + }, + ): Promise; + } + + /** + * + * + *
Animation widget + *
+ *

+ * The Animation widget provides buttons for play, pause, and reverse, along with the + * current time and date, surrounded by a "shuttle ring" for controlling the speed of animation. + *

+ * The "shuttle ring" concept is borrowed from video editing, where typically a + * "jog wheel" can be rotated to move past individual animation frames very slowly, and + * a surrounding shuttle ring can be twisted to control direction and speed of fast playback. + * Cesium typically treats time as continuous (not broken into pre-defined animation frames), + * so this widget offers no jog wheel. Instead, the shuttle ring is capable of both fast and + * very slow playback. Click and drag the shuttle ring pointer itself (shown above in green), + * or click in the rest of the ring area to nudge the pointer to the next preset speed in that direction. + *

+ * The Animation widget also provides a "realtime" button (in the upper-left) that keeps + * animation time in sync with the end user's system clock, typically displaying + * "today" or "right now." This mode is not available in {@link ClockRange.CLAMPED} or + * {@link ClockRange.LOOP_STOP} mode if the current time is outside of {@link Clock}'s startTime and endTime. + * @example + * // In HTML head, include a link to Animation.css stylesheet, + * // and in the body, include:
+ * + * const clock = new Cesium.Clock(); + * const clockViewModel = new Cesium.ClockViewModel(clock); + * const viewModel = new Cesium.AnimationViewModel(clockViewModel); + * const widget = new Cesium.Animation('animationContainer', viewModel); + * + * function tick() { + * clock.tick(); + * requestAnimationFrame(tick); + * } + * requestAnimationFrame(tick); + * @param container - The DOM element or ID that will contain the widget. + * @param viewModel - The view model used by this widget. + */ + export class Animation { + constructor(container: Element | string, viewModel: AnimationViewModel); + /** + * Gets the parent container. + */ + readonly container: Element; + /** + * Gets the view model. + */ + readonly viewModel: AnimationViewModel; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the animation widget. Should be called if permanently + * removing the widget from layout. + */ + destroy(): void; + /** + * Resizes the widget to match the container size. + * This function should be called whenever the container size is changed. + */ + resize(): void; + /** + * Updates the widget to reflect any modified CSS rules for theming. + * @example + * //Switch to the cesium-lighter theme. + * document.body.className = 'cesium-lighter'; + * animation.applyThemeChanges(); + */ + applyThemeChanges(): void; + } + + /** + * The view model for the {@link Animation} widget. + * @param clockViewModel - The ClockViewModel instance to use. + */ + export class AnimationViewModel { + constructor(clockViewModel: ClockViewModel); + /** + * Gets or sets whether the shuttle ring is currently being dragged. This property is observable. + */ + shuttleRingDragging: boolean; + /** + * Gets or sets whether dragging the shuttle ring should cause the multiplier + * to snap to the defined tick values rather than interpolating between them. + * This property is observable. + */ + snapToTicks: boolean; + /** + * Gets the string representation of the current time. This property is observable. + */ + timeLabel: string; + /** + * Gets the string representation of the current date. This property is observable. + */ + dateLabel: string; + /** + * Gets the string representation of the current multiplier. This property is observable. + */ + multiplierLabel: string; + /** + * Gets or sets the current shuttle ring angle. This property is observable. + */ + shuttleRingAngle: number; + /** + * Gets or sets the default date formatter used by new instances. + */ + static defaultDateFormatter: AnimationViewModel.DateFormatter; + /** + * Gets or sets the default array of known clock multipliers associated with new instances of the shuttle ring. + */ + static defaultTicks: number[]; + /** + * Gets or sets the default time formatter used by new instances. + */ + static defaultTimeFormatter: AnimationViewModel.TimeFormatter; + /** + * Gets a copy of the array of positive known clock multipliers to associate with the shuttle ring. + * @returns The array of known clock multipliers associated with the shuttle ring. + */ + getShuttleRingTicks(): number[]; + /** + * Sets the array of positive known clock multipliers to associate with the shuttle ring. + * These values will have negative equivalents created for them and sets both the minimum + * and maximum range of values for the shuttle ring as well as the values that are snapped + * to when a single click is made. The values need not be in order, as they will be sorted + * automatically, and duplicate values will be removed. + * @param positiveTicks - The list of known positive clock multipliers to associate with the shuttle ring. + */ + setShuttleRingTicks(positiveTicks: number[]): void; + /** + * Gets a command that decreases the speed of animation. + */ + slower: Command; + /** + * Gets a command that increases the speed of animation. + */ + faster: Command; + /** + * Gets the clock view model. + */ + clockViewModel: ClockViewModel; + /** + * Gets the pause toggle button view model. + */ + pauseViewModel: ToggleButtonViewModel; + /** + * Gets the reverse toggle button view model. + */ + playReverseViewModel: ToggleButtonViewModel; + /** + * Gets the play toggle button view model. + */ + playForwardViewModel: ToggleButtonViewModel; + /** + * Gets the realtime toggle button view model. + */ + playRealtimeViewModel: ToggleButtonViewModel; + /** + * Gets or sets the function which formats a date for display. + */ + dateFormatter: AnimationViewModel.DateFormatter; + /** + * Gets or sets the function which formats a time for display. + */ + timeFormatter: AnimationViewModel.TimeFormatter; + } + + export namespace AnimationViewModel { + /** + * A function that formats a date for display. + * @param date - The date to be formatted + * @param viewModel - The AnimationViewModel instance requesting formatting. + */ + type DateFormatter = ( + date: JulianDate, + viewModel: AnimationViewModel, + ) => string; + /** + * A function that formats a time for display. + * @param date - The date to be formatted + * @param viewModel - The AnimationViewModel instance requesting formatting. + */ + type TimeFormatter = ( + date: JulianDate, + viewModel: AnimationViewModel, + ) => string; + } + + /** + * + * BaseLayerPicker + *
BaseLayerPicker with its drop-panel open. + *
+ *

+ * The BaseLayerPicker is a single button widget that displays a panel of available imagery and + * terrain providers. When imagery is selected, the corresponding imagery layer is created and inserted + * as the base layer of the imagery collection; removing the existing base. When terrain is selected, + * it replaces the current terrain provider. Each item in the available providers list contains a name, + * a representative icon, and a tooltip to display more information when hovered. The list is initially + * empty, and must be configured before use, as illustrated in the below example. + *

+ * By default, the BaseLayerPicker uses a default list of example providers for demonstration purposes. + * Notably some of these providers, such as Esri ArcGIS and Stadia Maps, have seperate terms of service and require authentication for production use. + * @example + * // In HTML head, include a link to the BaseLayerPicker.css stylesheet, + * // and in the body, include:
+ * + * //Create the list of available providers we would like the user to select from. + * //This example uses 3, OpenStreetMap, The Black Marble, and a single, non-streaming world image. + * const imageryViewModels = []; + * imageryViewModels.push(new Cesium.ProviderViewModel({ + * name: "Open\u00adStreet\u00adMap", + * iconUrl: Cesium.buildModuleUrl("Widgets/Images/ImageryProviders/openStreetMap.png"), + * tooltip: "OpenStreetMap (OSM) is a collaborative project to create a free editable \ + * map of the world.\nhttp://www.openstreetmap.org", + * creationFunction: function() { + * return new Cesium.OpenStreetMapImageryProvider({ + * url: "https://tile.openstreetmap.org/" + * }); + * } + * })); + * + * imageryViewModels.push(new Cesium.ProviderViewModel({ + * name: "Earth at Night", + * iconUrl: Cesium.buildModuleUrl("Widgets/Images/ImageryProviders/blackMarble.png"), + * tooltip: "The lights of cities and villages trace the outlines of civilization \ + * in this global view of the Earth at night as seen by NASA/NOAA's Suomi NPP satellite.", + * creationFunction: function() { + * return Cesium.IonImageryProvider.fromAssetId(3812); + * } + * })); + * + * imageryViewModels.push(new Cesium.ProviderViewModel({ + * name: "Natural Earth\u00a0II", + * iconUrl: Cesium.buildModuleUrl("Widgets/Images/ImageryProviders/naturalEarthII.png"), + * tooltip: "Natural Earth II, darkened for contrast.\nhttp://www.naturalearthdata.com/", + * creationFunction: function() { + * return Cesium.TileMapServiceImageryProvider.fromUrl( + * Cesium.buildModuleUrl("Assets/Textures/NaturalEarthII") + * ); + * } + * })); + * + * //Create a CesiumWidget without imagery, if you haven't already done so. + * const cesiumWidget = new Cesium.CesiumWidget("cesiumContainer", { baseLayer: false }); + * + * //Finally, create the baseLayerPicker widget using our view models. + * const layers = cesiumWidget.imageryLayers; + * const baseLayerPicker = new Cesium.BaseLayerPicker("baseLayerPickerContainer", { + * globe: cesiumWidget.scene.globe, + * imageryProviderViewModels: imageryViewModels + * }); + * @param container - The parent HTML container node or ID for this widget. + * @param options - Object with the following properties: + * @param options.globe - The Globe to use. + * @param [options.imageryProviderViewModels = []] - The array of ProviderViewModel instances to use for imagery. + * @param [options.selectedImageryProviderViewModel] - The view model for the current base imagery layer, if not supplied the first available imagery layer is used. + * @param [options.terrainProviderViewModels = []] - The array of ProviderViewModel instances to use for terrain. + * @param [options.selectedTerrainProviderViewModel] - The view model for the current base terrain layer, if not supplied the first available terrain layer is used. + */ + export class BaseLayerPicker { + constructor( + container: Element | string, + options: { + globe: Globe; + imageryProviderViewModels?: ProviderViewModel[]; + selectedImageryProviderViewModel?: ProviderViewModel; + terrainProviderViewModels?: ProviderViewModel[]; + selectedTerrainProviderViewModel?: ProviderViewModel; + }, + ); + /** + * Gets the parent container. + */ + container: Element; + /** + * Gets the view model. + */ + viewModel: BaseLayerPickerViewModel; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the widget. Should be called if permanently + * removing the widget from layout. + */ + destroy(): void; + } + + /** + * The view model for {@link BaseLayerPicker}. + * @param options - Object with the following properties: + * @param options.globe - The Globe to use. + * @param [options.imageryProviderViewModels = []] - The array of ProviderViewModel instances to use for imagery. + * @param [options.selectedImageryProviderViewModel] - The view model for the current base imagery layer, if not supplied the first available imagery layer is used. + * @param [options.terrainProviderViewModels = []] - The array of ProviderViewModel instances to use for terrain. + * @param [options.selectedTerrainProviderViewModel] - The view model for the current base terrain layer, if not supplied the first available terrain layer is used. + */ + export class BaseLayerPickerViewModel { + constructor(options: { + globe: Globe; + imageryProviderViewModels?: ProviderViewModel[]; + selectedImageryProviderViewModel?: ProviderViewModel; + terrainProviderViewModels?: ProviderViewModel[]; + selectedTerrainProviderViewModel?: ProviderViewModel; + }); + /** + * Gets or sets an array of ProviderViewModel instances available for imagery selection. + * This property is observable. + */ + imageryProviderViewModels: ProviderViewModel[]; + /** + * Gets or sets an array of ProviderViewModel instances available for terrain selection. + * This property is observable. + */ + terrainProviderViewModels: ProviderViewModel[]; + /** + * Gets or sets whether the imagery selection drop-down is currently visible. + */ + dropDownVisible: boolean; + /** + * Gets the button tooltip. This property is observable. + */ + buttonTooltip: string; + /** + * Gets the button background image. This property is observable. + */ + buttonImageUrl: string; + /** + * Gets or sets the currently selected imagery. This property is observable. + */ + selectedImagery: ProviderViewModel; + /** + * Gets or sets the currently selected terrain. This property is observable. + */ + selectedTerrain: ProviderViewModel; + /** + * Gets the command to toggle the visibility of the drop down. + */ + toggleDropDown: Command; + /** + * Gets the globe. + */ + globe: Globe; + } + + /** + * A view model that represents each item in the {@link BaseLayerPicker}. + * @param options - The object containing all parameters. + * @param options.name - The name of the layer. + * @param options.tooltip - The tooltip to show when the item is moused over. + * @param options.iconUrl - An icon representing the layer. + * @param [options.category] - A category for the layer. + * @param options.creationFunction - A function or Command + * that creates one or more providers which will be added to the globe when this item is selected. + */ + export class ProviderViewModel { + constructor(options: { + name: string; + tooltip: string; + iconUrl: string; + category?: string; + creationFunction: ProviderViewModel.CreationFunction | Command; + }); + /** + * Gets the display name. This property is observable. + */ + name: string; + /** + * Gets the tooltip. This property is observable. + */ + tooltip: string; + /** + * Gets the icon. This property is observable. + */ + iconUrl: string; + /** + * Gets the Command that creates one or more providers which will be added to + * the globe when this item is selected. + */ + readonly creationCommand: Command; + /** + * Gets the category + */ + readonly category: string; + } + + export namespace ProviderViewModel { + /** + * A function which creates one or more providers. + */ + type CreationFunction = () => + | ImageryProvider + | TerrainProvider + | ImageryProvider[] + | TerrainProvider[] + | Promise + | Promise + | Promise + | Promise; + } + + /** + * Inspector widget to aid in debugging 3D Tiles + * @param container - The DOM element or ID that will contain the widget. + * @param scene - the Scene instance to use. + */ + export class Cesium3DTilesInspector { + constructor(container: Element | string, scene: Scene); + /** + * Gets the parent container. + */ + container: Element; + /** + * Gets the view model. + */ + viewModel: Cesium3DTilesInspectorViewModel; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the widget. Should be called if permanently + * removing the widget from layout. + */ + destroy(): void; + } + + /** + * The view model for {@link Cesium3DTilesInspector}. + * @param scene - The scene instance to use. + * @param performanceContainer - The container for the performance display + */ + export class Cesium3DTilesInspectorViewModel { + constructor(scene: Scene, performanceContainer: HTMLElement); + /** + * Gets or sets the flag to enable performance display. This property is observable. + */ + performance: boolean; + /** + * Gets or sets the flag to show statistics. This property is observable. + */ + showStatistics: boolean; + /** + * Gets or sets the flag to show pick statistics. This property is observable. + */ + showPickStatistics: boolean; + /** + * Gets or sets the flag to show resource cache statistics. This property is + * observable. + */ + showResourceCacheStatistics: boolean; + /** + * Gets or sets the flag to show the inspector. This property is observable. + */ + inspectorVisible: boolean; + /** + * Gets or sets the flag to show the tileset section. This property is observable. + */ + tilesetVisible: boolean; + /** + * Gets or sets the flag to show the display section. This property is observable. + */ + displayVisible: boolean; + /** + * Gets or sets the flag to show the update section. This property is observable. + */ + updateVisible: boolean; + /** + * Gets or sets the flag to show the logging section. This property is observable. + */ + loggingVisible: boolean; + /** + * Gets or sets the flag to show the style section. This property is observable. + */ + styleVisible: boolean; + /** + * Gets or sets the flag to show the tile info section. This property is observable. + */ + tileDebugLabelsVisible: boolean; + /** + * Gets or sets the flag to show the optimization info section. This property is observable. + */ + optimizationVisible: boolean; + /** + * Gets or sets the JSON for the tileset style. This property is observable. + */ + styleString: string; + /** + * Gets or sets the JSON for the tileset enableDebugWireframe attribute. This property is observable. + */ + hasEnabledWireframe: boolean; + /** + * Gets the names of the properties in the tileset. This property is observable. + */ + readonly properties: string[]; + /** + * Gets or sets the flag to enable dynamic screen space error. This property is observable. + */ + dynamicScreenSpaceError: boolean; + /** + * Gets or sets the color blend mode. This property is observable. + */ + colorBlendMode: Cesium3DTileColorBlendMode; + /** + * Gets or sets the flag to enable picking. This property is observable. + */ + picking: boolean; + /** + * Gets or sets the flag to colorize tiles. This property is observable. + */ + colorize: boolean; + /** + * Gets or sets the flag to draw with wireframe. This property is observable. + */ + wireframe: boolean; + /** + * Gets or sets the flag to show bounding volumes. This property is observable. + */ + showBoundingVolumes: boolean; + /** + * Gets or sets the flag to show content volumes. This property is observable. + */ + showContentBoundingVolumes: boolean; + /** + * Gets or sets the flag to show request volumes. This property is observable. + */ + showRequestVolumes: boolean; + /** + * Gets or sets the flag to suspend updates. This property is observable. + */ + freezeFrame: boolean; + /** + * Gets or sets the flag to show debug labels only for the currently picked tile. This property is observable. + */ + showOnlyPickedTileDebugLabel: boolean; + /** + * Gets or sets the flag to show tile geometric error. This property is observable. + */ + showGeometricError: boolean; + /** + * Displays the number of commands, points, triangles and features used per tile. This property is observable. + */ + showRenderingStatistics: boolean; + /** + * Displays the memory used per tile. This property is observable. + */ + showMemoryUsage: boolean; + /** + * Gets or sets the flag to show the tile url. This property is observable. + */ + showUrl: boolean; + /** + * Gets or sets the maximum screen space error. This property is observable. + */ + maximumScreenSpaceError: number; + /** + * Gets or sets the dynamic screen space error density. This property is observable. + */ + dynamicScreenSpaceErrorDensity: number; + /** + * Gets or sets the dynamic screen space error density slider value. + * This allows the slider to be exponential because values tend to be closer to 0 than 1. + * This property is observable. + */ + dynamicScreenSpaceErrorDensitySliderValue: number; + /** + * Gets or sets the dynamic screen space error factor. This property is observable. + */ + dynamicScreenSpaceErrorFactor: number; + /** + * Gets or sets the flag to enable point cloud shading. This property is observable. + */ + pointCloudShading: boolean; + /** + * Gets or sets the geometric error scale. This property is observable. + */ + geometricErrorScale: number; + /** + * Gets or sets the maximum attenuation. This property is observable. + */ + maximumAttenuation: number; + /** + * Gets or sets the base resolution. This property is observable. + */ + baseResolution: number; + /** + * Gets or sets the flag to enable eye dome lighting. This property is observable. + */ + eyeDomeLighting: boolean; + /** + * Gets or sets the eye dome lighting strength. This property is observable. + */ + eyeDomeLightingStrength: number; + /** + * Gets or sets the eye dome lighting radius. This property is observable. + */ + eyeDomeLightingRadius: number; + /** + * Gets or sets the pick state + */ + pickActive: boolean; + /** + * Gets or sets the flag to determine if level of detail skipping should be applied during the traversal. + * This property is observable. + */ + skipLevelOfDetail: boolean; + /** + * Gets or sets the multiplier defining the minimum screen space error to skip. This property is observable. + */ + skipScreenSpaceErrorFactor: number; + /** + * Gets or sets the screen space error that must be reached before skipping levels of detail. This property is observable. + */ + baseScreenSpaceError: number; + /** + * Gets or sets the constant defining the minimum number of levels to skip when loading tiles. This property is observable. + */ + skipLevels: number; + /** + * Gets or sets the flag which, when true, only tiles that meet the maximum screen space error will ever be downloaded. + * This property is observable. + */ + immediatelyLoadDesiredLevelOfDetail: boolean; + /** + * Gets or sets the flag which determines whether siblings of visible tiles are always downloaded during traversal. + * This property is observable + */ + loadSiblings: boolean; + /** + * Gets the scene + */ + readonly scene: Scene; + /** + * Gets the performance container + */ + readonly performanceContainer: HTMLElement; + /** + * Gets the statistics text. This property is observable. + */ + readonly statisticsText: string; + /** + * Gets the pick statistics text. This property is observable. + */ + readonly pickStatisticsText: string; + /** + * Gets the resource cache statistics text. This property is observable. + */ + readonly resourceCacheStatisticsText: string; + /** + * Gets the available blend modes + */ + readonly colorBlendModes: object[]; + /** + * Gets the editor error message + */ + readonly editorError: string; + /** + * Gets or sets the tileset of the view model. + */ + tileset: Cesium3DTileset; + /** + * Gets the current feature of the view model. + */ + feature: Cesium3DTileFeature; + /** + * Gets the current tile of the view model + */ + tile: Cesium3DTile; + /** + * Toggles the pick tileset mode + */ + togglePickTileset(): void; + /** + * Toggles the inspector visibility + */ + toggleInspector(): void; + /** + * Toggles the visibility of the tileset section + */ + toggleTileset(): void; + /** + * Toggles the visibility of the display section + */ + toggleDisplay(): void; + /** + * Toggles the visibility of the update section + */ + toggleUpdate(): void; + /** + * Toggles the visibility of the logging section + */ + toggleLogging(): void; + /** + * Toggles the visibility of the style section + */ + toggleStyle(): void; + /** + * Toggles the visibility of the tile Debug Info section + */ + toggleTileDebugLabels(): void; + /** + * Toggles the visibility of the optimization section + */ + toggleOptimization(): void; + /** + * Trims tile cache + */ + trimTilesCache(): void; + /** + * Compiles the style in the style editor. + */ + compileStyle(): void; + /** + * Handles key press events on the style editor. + */ + styleEditorKeyPress(): void; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the widget. Should be called if permanently + * removing the widget from layout. + */ + destroy(): void; + /** + * Generates an HTML string of the statistics + * @param tileset - The tileset + * @param isPick - Whether this is getting the statistics for the pick pass + * @returns The formatted statistics + */ + static getStatistics(tileset: Cesium3DTileset, isPick: boolean): string; + } + + /** + * Inspector widget to aid in debugging + * @param container - The DOM element or ID that will contain the widget. + * @param scene - The Scene instance to use. + */ + export class CesiumInspector { + constructor(container: Element | string, scene: Scene); + /** + * Gets the parent container. + */ + container: Element; + /** + * Gets the view model. + */ + viewModel: CesiumInspectorViewModel; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the widget. Should be called if permanently + * removing the widget from layout. + */ + destroy(): void; + } + + /** + * The view model for {@link CesiumInspector}. + * @param scene - The scene instance to use. + * @param performanceContainer - The instance to use for performance container. + */ + export class CesiumInspectorViewModel { + constructor(scene: Scene, performanceContainer: Element); + /** + * Gets or sets the show frustums state. This property is observable. + */ + frustums: boolean; + /** + * Gets or sets the show frustum planes state. This property is observable. + */ + frustumPlanes: boolean; + /** + * Gets or sets the show performance display state. This property is observable. + */ + performance: boolean; + /** + * Gets or sets the shader cache text. This property is observable. + */ + shaderCacheText: string; + /** + * Gets or sets the show primitive bounding sphere state. This property is observable. + */ + primitiveBoundingSphere: boolean; + /** + * Gets or sets the show primitive reference frame state. This property is observable. + */ + primitiveReferenceFrame: boolean; + /** + * Gets or sets the filter primitive state. This property is observable. + */ + filterPrimitive: boolean; + /** + * Gets or sets the show tile bounding sphere state. This property is observable. + */ + tileBoundingSphere: boolean; + /** + * Gets or sets the filter tile state. This property is observable. + */ + filterTile: boolean; + /** + * Gets or sets the show wireframe state. This property is observable. + */ + wireframe: boolean; + /** + * Gets or sets the index of the depth frustum to display. This property is observable. + */ + depthFrustum: number; + /** + * Gets or sets the suspend updates state. This property is observable. + */ + suspendUpdates: boolean; + /** + * Gets or sets the show tile coordinates state. This property is observable. + */ + tileCoordinates: boolean; + /** + * Gets or sets the frustum statistic text. This property is observable. + */ + frustumStatisticText: string; + /** + * Gets or sets the selected tile information text. This property is observable. + */ + tileText: string; + /** + * Gets if a primitive has been selected. This property is observable. + */ + hasPickedPrimitive: boolean; + /** + * Gets if a tile has been selected. This property is observable + */ + hasPickedTile: boolean; + /** + * Gets if the picking primitive command is active. This property is observable. + */ + pickPrimitiveActive: boolean; + /** + * Gets if the picking tile command is active. This property is observable. + */ + pickTileActive: boolean; + /** + * Gets or sets if the cesium inspector drop down is visible. This property is observable. + */ + dropDownVisible: boolean; + /** + * Gets or sets if the general section is visible. This property is observable. + */ + generalVisible: boolean; + /** + * Gets or sets if the primitive section is visible. This property is observable. + */ + primitivesVisible: boolean; + /** + * Gets or sets if the terrain section is visible. This property is observable. + */ + terrainVisible: boolean; + /** + * Gets or sets the index of the depth frustum text. This property is observable. + */ + depthFrustumText: string; + /** + * Gets the scene to control. + */ + scene: Scene; + /** + * Gets the container of the PerformanceDisplay + */ + performanceContainer: Element; + /** + * Gets the command to toggle the visibility of the drop down. + */ + toggleDropDown: Command; + /** + * Gets the command to toggle the visibility of a BoundingSphere for a primitive + */ + showPrimitiveBoundingSphere: Command; + /** + * Gets the command to toggle the visibility of a {@link DebugModelMatrixPrimitive} for the model matrix of a primitive + */ + showPrimitiveReferenceFrame: Command; + /** + * Gets the command to toggle a filter that renders only a selected primitive + */ + doFilterPrimitive: Command; + /** + * Gets the command to increment the depth frustum index to be shown + */ + incrementDepthFrustum: Command; + /** + * Gets the command to decrement the depth frustum index to be shown + */ + decrementDepthFrustum: Command; + /** + * Gets the command to toggle the visibility of tile coordinates + */ + showTileCoordinates: Command; + /** + * Gets the command to toggle the visibility of a BoundingSphere for a selected tile + */ + showTileBoundingSphere: Command; + /** + * Gets the command to toggle a filter that renders only a selected tile + */ + doFilterTile: Command; + /** + * Gets the command to expand and collapse the general section + */ + toggleGeneral: Command; + /** + * Gets the command to expand and collapse the primitives section + */ + togglePrimitives: Command; + /** + * Gets the command to expand and collapse the terrain section + */ + toggleTerrain: Command; + /** + * Gets the command to pick a primitive + */ + pickPrimitive: Command; + /** + * Gets the command to pick a tile + */ + pickTile: Command; + /** + * Gets the command to pick a tile + */ + selectParent: Command; + /** + * Gets the command to pick a tile + */ + selectNW: Command; + /** + * Gets the command to pick a tile + */ + selectNE: Command; + /** + * Gets the command to pick a tile + */ + selectSW: Command; + /** + * Gets the command to pick a tile + */ + selectSE: Command; + /** + * Gets or sets the current selected primitive + */ + primitive: Command; + /** + * Gets or sets the current selected tile + */ + tile: Command; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the widget. Should be called if permanently + * removing the widget from layout. + */ + destroy(): void; + } + + /** + * A view model which exposes a {@link Clock} for user interfaces. + * @param [clock] - The clock object wrapped by this view model, if undefined a new instance will be created. + */ + export class ClockViewModel { + constructor(clock?: Clock); + /** + * Gets the current system time. + * This property is observable. + */ + systemTime: JulianDate; + /** + * Gets or sets the start time of the clock. + * See {@link Clock#startTime}. + * This property is observable. + */ + startTime: JulianDate; + /** + * Gets or sets the stop time of the clock. + * See {@link Clock#stopTime}. + * This property is observable. + */ + stopTime: JulianDate; + /** + * Gets or sets the current time. + * See {@link Clock#currentTime}. + * This property is observable. + */ + currentTime: JulianDate; + /** + * Gets or sets the clock multiplier. + * See {@link Clock#multiplier}. + * This property is observable. + */ + multiplier: number; + /** + * Gets or sets the clock step setting. + * See {@link Clock#clockStep}. + * This property is observable. + */ + clockStep: ClockStep; + /** + * Gets or sets the clock range setting. + * See {@link Clock#clockRange}. + * This property is observable. + */ + clockRange: ClockRange; + /** + * Gets or sets whether the clock can animate. + * See {@link Clock#canAnimate}. + * This property is observable. + */ + canAnimate: boolean; + /** + * Gets or sets whether the clock should animate. + * See {@link Clock#shouldAnimate}. + * This property is observable. + */ + shouldAnimate: boolean; + /** + * Gets the underlying Clock. + */ + clock: Clock; + /** + * Updates the view model with the contents of the underlying clock. + * Can be called to force an update of the viewModel if the underlying + * clock has changed and Clock.tick has not yet been called. + */ + synchronize(): void; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the view model. Should be called to + * properly clean up the view model when it is no longer needed. + */ + destroy(): void; + } + + /** + * A Command is a function with an extra canExecute observable property to determine + * whether the command can be executed. When executed, a Command function will check the + * value of canExecute and throw if false. + * + * This type describes an interface and is not intended to be instantiated directly. + * See {@link createCommand} to create a command from a function. + */ + export class Command { + constructor(); + /** + * Gets whether this command can currently be executed. This property is observable. + */ + canExecute: boolean; + /** + * Gets an event which is raised before the command executes, the event + * is raised with an object containing two properties: a cancel property, + * which if set to false by the listener will prevent the command from being executed, and + * an args property, which is the array of arguments being passed to the command. + */ + beforeExecute: Event; + /** + * Gets an event which is raised after the command executes, the event + * is raised with the return value of the command as its only parameter. + */ + afterExecute: Event; + } + + /** + * A single button widget for toggling fullscreen mode. + * @param container - The DOM element or ID that will contain the widget. + * @param [fullscreenElement = document.body] - The element or id to be placed into fullscreen mode. + */ + export class FullscreenButton { + constructor( + container: Element | string, + fullscreenElement?: Element | string, + ); + /** + * Gets the parent container. + */ + container: Element; + /** + * Gets the view model. + */ + viewModel: FullscreenButtonViewModel; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the widget. Should be called if permanently + * removing the widget from layout. + */ + destroy(): void; + } + + /** + * The view model for {@link FullscreenButton}. + * @param [fullscreenElement = document.body] - The element or id to be placed into fullscreen mode. + * @param [container] - The DOM element or ID that will contain the widget. + */ + export class FullscreenButtonViewModel { + constructor( + fullscreenElement?: Element | string, + container?: Element | string, + ); + /** + * Gets whether or not fullscreen mode is active. This property is observable. + */ + isFullscreen: boolean; + /** + * Gets or sets whether or not fullscreen functionality should be enabled. This property is observable. + */ + isFullscreenEnabled: boolean; + /** + * Gets the tooltip. This property is observable. + */ + tooltip: string; + /** + * Gets or sets the HTML element to place into fullscreen mode when the + * corresponding button is pressed. + */ + fullscreenElement: Element; + /** + * Gets the Command to toggle fullscreen mode. + */ + command: Command; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the view model. Should be called to + * properly clean up the view model when it is no longer needed. + */ + destroy(): void; + } + + /** + * A widget for finding addresses and landmarks, and flying the camera to them. Geocoding is + * performed using {@link https://cesium.com/cesium-ion/|Cesium ion}. + * @param options - Object with the following properties: + * @param options.container - The DOM element or ID that will contain the widget. + * @param options.scene - The Scene instance to use. + * @param [options.geocoderServices] - The geocoder services to be used + * @param [options.autoComplete = true] - True if the geocoder should query as the user types to autocomplete + * @param [options.flightDuration = 1.5] - The duration of the camera flight to an entered location, in seconds. + * @param [options.destinationFound = GeocoderViewModel.flyToDestination] - A callback function that is called after a successful geocode. If not supplied, the default behavior is to fly the camera to the result destination. + */ + export class Geocoder { + constructor(options: { + container: Element | string; + scene: Scene; + geocoderServices?: GeocoderService[]; + autoComplete?: boolean; + flightDuration?: number; + destinationFound?: Geocoder.DestinationFoundFunction; + }); + /** + * Gets the parent container. + */ + container: Element; + /** + * Gets the parent container. + */ + searchSuggestionsContainer: Element; + /** + * Gets the view model. + */ + viewModel: GeocoderViewModel; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the widget. Should be called if permanently + * removing the widget from layout. + */ + destroy(): void; + } + + export namespace Geocoder { + /** + * A function that handles the result of a successful geocode. + * @param viewModel - The view model. + * @param destination - The destination result of the geocode. + */ + type DestinationFoundFunction = ( + viewModel: GeocoderViewModel, + destination: Cartesian3 | Rectangle, + ) => void; + } + + /** + * The view model for the {@link Geocoder} widget. + * @param options - Object with the following properties: + * @param options.scene - The Scene instance to use. + * @param [options.geocoderServices] - Geocoder services to use for geocoding queries. + * If more than one are supplied, suggestions will be gathered for the geocoders that support it, + * and if no suggestion is selected the result from the first geocoder service wil be used. + * @param [options.flightDuration] - The duration of the camera flight to an entered location, in seconds. + * @param [options.destinationFound = GeocoderViewModel.flyToDestination] - A callback function that is called after a successful geocode. If not supplied, the default behavior is to fly the camera to the result destination. + */ + export class GeocoderViewModel { + constructor(options: { + scene: Scene; + geocoderServices?: GeocoderService[]; + flightDuration?: number; + destinationFound?: Geocoder.DestinationFoundFunction; + }); + /** + * Gets or sets a value indicating if this instance should always show its text input field. + */ + keepExpanded: boolean; + /** + * True if the geocoder should query as the user types to autocomplete + */ + autoComplete: boolean; + /** + * Gets and sets the command called when a geocode destination is found + */ + destinationFound: Geocoder.DestinationFoundFunction; + /** + * Gets a value indicating whether a search is currently in progress. This property is observable. + */ + isSearchInProgress: boolean; + /** + * Gets or sets the text to search for. The text can be an address, or longitude, latitude, + * and optional height, where longitude and latitude are in degrees and height is in meters. + */ + searchText: string; + /** + * Gets or sets the the duration of the camera flight in seconds. + * A value of zero causes the camera to instantly switch to the geocoding location. + * The duration will be computed based on the distance when undefined. + */ + flightDuration: number | undefined; + /** + * Gets the event triggered on flight completion. + */ + complete: Event; + /** + * Gets the scene to control. + */ + scene: Scene; + /** + * Gets the Command that is executed when the button is clicked. + */ + search: Command; + /** + * Gets the currently selected geocoder search suggestion + */ + selectedSuggestion: any; + /** + * Gets the list of geocoder search suggestions + */ + suggestions: object[]; + /** + * Destroys the widget. Should be called if permanently + * removing the widget from layout. + */ + destroy(): void; + /** + * A function to fly to the destination found by a successful geocode. + */ + static flyToDestination: Geocoder.DestinationFoundFunction; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the widget. Should be called if permanently + * removing the widget from layout. + */ + destroy(): void; + } + + /** + * A single button widget for returning to the default camera view of the current scene. + * @param container - The DOM element or ID that will contain the widget. + * @param scene - The Scene instance to use. + * @param [duration] - The time, in seconds, it takes to complete the camera flight home. + */ + export class HomeButton { + constructor(container: Element | string, scene: Scene, duration?: number); + /** + * Gets the parent container. + */ + container: Element; + /** + * Gets the view model. + */ + viewModel: HomeButtonViewModel; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the widget. Should be called if permanently + * removing the widget from layout. + */ + destroy(): void; + } + + /** + * The view model for {@link HomeButton}. + * @param scene - The scene instance to use. + * @param [duration] - The duration of the camera flight in seconds. + */ + export class HomeButtonViewModel { + constructor(scene: Scene, duration?: number); + /** + * Gets or sets the tooltip. This property is observable. + */ + tooltip: string; + /** + * Gets the scene to control. + */ + scene: Scene; + /** + * Gets the Command that is executed when the button is clicked. + */ + command: Command; + /** + * Gets or sets the the duration of the camera flight in seconds. + * A value of zero causes the camera to instantly switch to home view. + * The duration will be computed based on the distance when undefined. + */ + duration: number | undefined; + } + + /** + * I3S Building Scene Layer widget + * @param containerId - The DOM element ID that will contain the widget. + * @param i3sProvider - I3S Data provider instance. + */ + export class I3SBuildingSceneLayerExplorer { + constructor(containerId: string, i3sProvider: I3SDataProvider); + } + + /** + * The view model for {@link I3SBuildingSceneLayerExplorer}. + * @param i3sProvider - I3S Data provider instance. + */ + export class I3sBslExplorerViewModel { + constructor(i3sProvider: I3SDataProvider); + } + + /** + * A widget for displaying information or a description. + * @param container - The DOM element or ID that will contain the widget. + */ + export class InfoBox { + constructor(container: Element | string); + /** + * Gets the parent container. + */ + container: Element; + /** + * Gets the view model. + */ + viewModel: InfoBoxViewModel; + /** + * Gets the iframe used to display the description. + */ + frame: HTMLIFrameElement; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the widget. Should be called if permanently + * removing the widget from layout. + */ + destroy(): void; + } + + /** + * The view model for {@link InfoBox}. + */ + export class InfoBoxViewModel { + constructor(); + /** + * Gets or sets the maximum height of the info box in pixels. This property is observable. + */ + maxHeight: number; + /** + * Gets or sets whether the camera tracking icon is enabled. + */ + enableCamera: boolean; + /** + * Gets or sets the status of current camera tracking of the selected object. + */ + isCameraTracking: boolean; + /** + * Gets or sets the visibility of the info box. + */ + showInfo: boolean; + /** + * Gets or sets the title text in the info box. + */ + titleText: string; + /** + * Gets or sets the description HTML for the info box. + */ + description: string; + /** + * Gets the SVG path of the camera icon, which can change to be "crossed out" or not. + */ + cameraIconPath: string; + /** + * Gets the maximum height of sections within the info box, minus an offset, in CSS-ready form. + * @param offset - The offset in pixels. + */ + maxHeightOffset(offset: number): string; + /** + * Gets an {@link Event} that is fired when the user clicks the camera icon. + */ + cameraClicked: Event; + /** + * Gets an {@link Event} that is fired when the user closes the info box. + */ + closeClicked: Event; + } + + /** + *

The NavigationHelpButton is a single button widget for displaying instructions for + * navigating the globe with the mouse.


+ * @example + * // In HTML head, include a link to the NavigationHelpButton.css stylesheet, + * // and in the body, include: + * + * const navigationHelpButton = new Cesium.NavigationHelpButton({ + * container : 'navigationHelpButtonContainer' + * }); + * @param options - Object with the following properties: + * @param options.container - The DOM element or ID that will contain the widget. + * @param [options.instructionsInitiallyVisible = false] - True if the navigation instructions should initially be visible; otherwise, false. + */ + export class NavigationHelpButton { + constructor(options: { + container: Element | string; + instructionsInitiallyVisible?: boolean; + }); + /** + * Gets the parent container. + */ + container: Element; + /** + * Gets the view model. + */ + viewModel: NavigationHelpButtonViewModel; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the widget. Should be called if permanently + * removing the widget from layout. + */ + destroy(): void; + } + + /** + * The view model for {@link NavigationHelpButton}. + */ + export class NavigationHelpButtonViewModel { + constructor(); + /** + * Gets or sets whether the instructions are currently shown. This property is observable. + */ + showInstructions: boolean; + /** + * Gets or sets the tooltip. This property is observable. + */ + tooltip: string; + /** + * Gets the Command that is executed when the button is clicked. + */ + command: Command; + /** + * Gets the Command that is executed when the mouse instructions should be shown. + */ + showClick: Command; + /** + * Gets the Command that is executed when the touch instructions should be shown. + */ + showTouch: Command; + } + + /** + * Monitors performance of the application and displays a message if poor performance is detected. + * @param [options] - Object with the following properties: + * @param options.container - The DOM element or ID that will contain the widget. + * @param options.scene - The {@link Scene} for which to monitor performance. + * @param [options.lowFrameRateMessage = 'This application appears to be performing poorly on your system. Please try using a different web browser or updating your video drivers.'] - The + * message to display when a low frame rate is detected. The message is interpeted as HTML, so make sure + * it comes from a trusted source so that your application is not vulnerable to cross-site scripting attacks. + */ + export class PerformanceWatchdog { + constructor(options?: { + container: Element | string; + scene: Scene; + lowFrameRateMessage?: string; + }); + /** + * Gets the parent container. + */ + container: Element; + /** + * Gets the view model. + */ + viewModel: PerformanceWatchdogViewModel; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the widget. Should be called if permanently + * removing the widget from layout. + */ + destroy(): void; + } + + /** + * The view model for {@link PerformanceWatchdog}. + * @param [options] - Object with the following properties: + * @param options.scene - The Scene instance for which to monitor performance. + * @param [options.lowFrameRateMessage = 'This application appears to be performing poorly on your system. Please try using a different web browser or updating your video drivers.'] - The + * message to display when a low frame rate is detected. The message is interpeted as HTML, so make sure + * it comes from a trusted source so that your application is not vulnerable to cross-site scripting attacks. + */ + export class PerformanceWatchdogViewModel { + constructor(options?: { scene: Scene; lowFrameRateMessage?: string }); + /** + * Gets or sets the message to display when a low frame rate is detected. This string will be interpreted as HTML. + */ + lowFrameRateMessage: string; + /** + * Gets or sets a value indicating whether the low frame rate message has previously been dismissed by the user. If it has + * been dismissed, the message will not be redisplayed, no matter the frame rate. + */ + lowFrameRateMessageDismissed: boolean; + /** + * Gets or sets a value indicating whether the low frame rate message is currently being displayed. + */ + showingLowFrameRateMessage: boolean; + /** + * Gets the {@link Scene} instance for which to monitor performance. + */ + scene: Scene; + /** + * Gets a command that dismisses the low frame rate message. Once it is dismissed, the message + * will not be redisplayed. + */ + dismissMessage: Command; + } + + /** + * The ProjectionPicker is a single button widget for switching between perspective and orthographic projections. + * @example + * // In HTML head, include a link to the ProjectionPicker.css stylesheet, + * // and in the body, include:
+ * // Note: This code assumes you already have a Scene instance. + * + * const projectionPicker = new Cesium.ProjectionPicker('projectionPickerContainer', scene); + * @param container - The DOM element or ID that will contain the widget. + * @param scene - The Scene instance to use. + */ + export class ProjectionPicker { + constructor(container: Element | string, scene: Scene); + /** + * Gets the parent container. + */ + container: Element; + /** + * Gets the view model. + */ + viewModel: ProjectionPickerViewModel; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the widget. Should be called if permanently + * removing the widget from layout. + */ + destroy(): void; + } + + /** + * The view model for {@link ProjectionPicker}. + * @param scene - The Scene to switch projections. + */ + export class ProjectionPickerViewModel { + constructor(scene: Scene); + /** + * Gets or sets whether the button drop-down is currently visible. This property is observable. + */ + dropDownVisible: boolean; + /** + * Gets or sets the perspective projection tooltip. This property is observable. + */ + tooltipPerspective: string; + /** + * Gets or sets the orthographic projection tooltip. This property is observable. + */ + tooltipOrthographic: string; + /** + * Gets the currently active tooltip. This property is observable. + */ + selectedTooltip: string; + /** + * Gets or sets the current SceneMode. This property is observable. + */ + sceneMode: SceneMode; + /** + * Gets the scene + */ + scene: Scene; + /** + * Gets the command to toggle the drop down box. + */ + toggleDropDown: Command; + /** + * Gets the command to switch to a perspective projection. + */ + switchToPerspective: Command; + /** + * Gets the command to switch to orthographic projection. + */ + switchToOrthographic: Command; + /** + * Gets whether the scene is currently using an orthographic projection. + */ + isOrthographicProjection: Command; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the view model. + */ + destroy(): void; + } + + /** + * + *

The SceneModePicker is a single button widget for switching between scene modes; + * shown to the left in its expanded state. Programatic switching of scene modes will + * be automatically reflected in the widget as long as the specified Scene + * is used to perform the change.


+ * @example + * // In HTML head, include a link to the SceneModePicker.css stylesheet, + * // and in the body, include:
+ * // Note: This code assumes you already have a Scene instance. + * + * const sceneModePicker = new Cesium.SceneModePicker('sceneModePickerContainer', scene); + * @param container - The DOM element or ID that will contain the widget. + * @param scene - The Scene instance to use. + * @param [duration = 2.0] - The time, in seconds, it takes for the scene to transition. + */ + export class SceneModePicker { + constructor(container: Element | string, scene: Scene, duration?: number); + /** + * Gets the parent container. + */ + container: Element; + /** + * Gets the view model. + */ + viewModel: SceneModePickerViewModel; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the widget. Should be called if permanently + * removing the widget from layout. + */ + destroy(): void; + } + + /** + * The view model for {@link SceneModePicker}. + * @param scene - The Scene to morph + * @param [duration = 2.0] - The duration of scene morph animations, in seconds + */ + export class SceneModePickerViewModel { + constructor(scene: Scene, duration?: number); + /** + * Gets or sets the current SceneMode. This property is observable. + */ + sceneMode: SceneMode; + /** + * Gets or sets whether the button drop-down is currently visible. This property is observable. + */ + dropDownVisible: boolean; + /** + * Gets or sets the 2D tooltip. This property is observable. + */ + tooltip2D: string; + /** + * Gets or sets the 3D tooltip. This property is observable. + */ + tooltip3D: string; + /** + * Gets or sets the Columbus View tooltip. This property is observable. + */ + tooltipColumbusView: string; + /** + * Gets the currently active tooltip. This property is observable. + */ + selectedTooltip: string; + /** + * Gets the scene + */ + scene: Scene; + /** + * Gets or sets the the duration of scene mode transition animations in seconds. + * A value of zero causes the scene to instantly change modes. + */ + duration: number; + /** + * Gets the command to toggle the drop down box. + */ + toggleDropDown: Command; + /** + * Gets the command to morph to 2D. + */ + morphTo2D: Command; + /** + * Gets the command to morph to 3D. + */ + morphTo3D: Command; + /** + * Gets the command to morph to Columbus View. + */ + morphToColumbusView: Command; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the view model. + */ + destroy(): void; + } + + /** + * A widget for displaying an indicator on a selected object. + * @param container - The DOM element or ID that will contain the widget. + * @param scene - The Scene instance to use. + */ + export class SelectionIndicator { + constructor(container: Element | string, scene: Scene); + /** + * Gets the parent container. + */ + container: Element; + /** + * Gets the view model. + */ + viewModel: SelectionIndicatorViewModel; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the widget. Should be called if permanently + * removing the widget from layout. + */ + destroy(): void; + } + + /** + * The view model for {@link SelectionIndicator}. + * @param scene - The scene instance to use for screen-space coordinate conversion. + * @param selectionIndicatorElement - The element containing all elements that make up the selection indicator. + * @param container - The DOM element that contains the widget. + */ + export class SelectionIndicatorViewModel { + constructor( + scene: Scene, + selectionIndicatorElement: Element, + container: Element, + ); + /** + * Gets or sets the world position of the object for which to display the selection indicator. + */ + position: Cartesian3; + /** + * Gets or sets the visibility of the selection indicator. + */ + showSelection: boolean; + /** + * Gets the visibility of the position indicator. This can be false even if an + * object is selected, when the selected object has no position. + */ + isVisible: boolean; + /** + * Gets or sets the function for converting the world position of the object to the screen space position. + * @example + * selectionIndicatorViewModel.computeScreenSpacePosition = function(position, result) { + * return Cesium.SceneTransforms.worldToWindowCoordinates(scene, position, result); + * }; + */ + computeScreenSpacePosition: SelectionIndicatorViewModel.ComputeScreenSpacePosition; + /** + * Updates the view of the selection indicator to match the position and content properties of the view model. + * This function should be called as part of the render loop. + */ + update(): void; + /** + * Animate the indicator to draw attention to the selection. + */ + animateAppear(): void; + /** + * Animate the indicator to release the selection. + */ + animateDepart(): void; + /** + * Gets the HTML element containing the selection indicator. + */ + container: Element; + /** + * Gets the HTML element that holds the selection indicator. + */ + selectionIndicatorElement: Element; + /** + * Gets the scene being used. + */ + scene: Scene; + } + + export namespace SelectionIndicatorViewModel { + /** + * A function that converts the world position of an object to a screen space position. + * @param position - The position in WGS84 (world) coordinates. + * @param result - An object to return the input position transformed to window coordinates. + */ + type ComputeScreenSpacePosition = ( + position: Cartesian3, + result: Cartesian2, + ) => Cartesian2; + } + + /** + * A Knockout binding handler that creates a DOM element for a single SVG path. + * This binding handler will be registered as cesiumSvgPath. + * + *

+ * The parameter to this binding is an object with the following properties: + *

+ * + *
    + *
  • path: The SVG path as a string.
  • + *
  • width: The width of the SVG path with no transformations applied.
  • + *
  • height: The height of the SVG path with no transformations applied.
  • + *
  • css: Optional. A string containing additional CSS classes to apply to the SVG. 'cesium-svgPath-svg' is always applied.
  • + *
+ * @example + * // Create an SVG as a child of a div + *
+ * + * // parameters can be observable from the view model + *
+ * + * // or the whole object can be observable from the view model + *
+ */ + export namespace SvgPathBindingHandler { + function register(): void; + } + + /** + * The Timeline is a widget for displaying and controlling the current scene time. + * @param container - The parent HTML container node for this widget. + * @param clock - The clock to use. + */ + export class Timeline { + constructor(container: Element, clock: Clock); + /** + * Gets the parent container. + */ + container: Element; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the widget. Should be called if permanently + * removing the widget from layout. + */ + destroy(): void; + /** + * Sets the view to the provided times. + * @param startTime - The start time. + * @param stopTime - The stop time. + */ + zoomTo(startTime: JulianDate, stopTime: JulianDate): void; + /** + * Resizes the widget to match the container size. + */ + resize(): void; + } + + /** + * A view model which exposes the properties of a toggle button. + * @param command - The command which will be executed when the button is toggled. + * @param [options] - Object with the following properties: + * @param [options.toggled = false] - A boolean indicating whether the button should be initially toggled. + * @param [options.tooltip = ''] - A string containing the button's tooltip. + */ + export class ToggleButtonViewModel { + constructor( + command: Command, + options?: { + toggled?: boolean; + tooltip?: string; + }, + ); + /** + * Gets or sets whether the button is currently toggled. This property is observable. + */ + toggled: boolean; + /** + * Gets or sets the button's tooltip. This property is observable. + */ + tooltip: string; + /** + * Gets the command which will be executed when the button is toggled. + */ + command: Command; + } + + /** + * A single button widget for toggling vr mode. + * @param container - The DOM element or ID that will contain the widget. + * @param scene - The scene. + * @param [vrElement = document.body] - The element or id to be placed into vr mode. + */ + export class VRButton { + constructor( + container: Element | string, + scene: Scene, + vrElement?: Element | string, + ); + /** + * Gets the parent container. + */ + container: Element; + /** + * Gets the view model. + */ + viewModel: VRButtonViewModel; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the widget. Should be called if permanently + * removing the widget from layout. + */ + destroy(): void; + } + + /** + * The view model for {@link VRButton}. + * @param scene - The scene. + * @param [vrElement = document.body] - The element or id to be placed into VR mode. + */ + export class VRButtonViewModel { + constructor(scene: Scene, vrElement?: Element | string); + /** + * Gets whether or not VR mode is active. + */ + isVRMode: boolean; + /** + * Gets or sets whether or not VR functionality should be enabled. + */ + isVREnabled: boolean; + /** + * Gets the tooltip. This property is observable. + */ + tooltip: string; + /** + * Gets or sets the HTML element to place into VR mode when the + * corresponding button is pressed. + */ + vrElement: Element; + /** + * Gets the Command to toggle VR mode. + */ + command: Command; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the view model. Should be called to + * properly clean up the view model when it is no longer needed. + */ + destroy(): void; + } + + export namespace Viewer { + /** + * Initialization options for the Viewer constructor + * @property [animation = true] - If set to false, the Animation widget will not be created. + * @property [baseLayerPicker = true] - If set to false, the BaseLayerPicker widget will not be created. + * @property [fullscreenButton = true] - If set to false, the FullscreenButton widget will not be created. + * @property [vrButton = false] - If set to true, the VRButton widget will be created. + * @property [geocoder = IonGeocodeProviderType.DEFAULT] - The geocoding service or services to use when searching with the Geocoder widget. If set to false, the Geocoder widget will not be created. + * @property [homeButton = true] - If set to false, the HomeButton widget will not be created. + * @property [infoBox = true] - If set to false, the InfoBox widget will not be created. + * @property [sceneModePicker = true] - If set to false, the SceneModePicker widget will not be created. + * @property [selectionIndicator = true] - If set to false, the SelectionIndicator widget will not be created. + * @property [timeline = true] - If set to false, the Timeline widget will not be created. + * @property [navigationHelpButton = true] - If set to false, the navigation help button will not be created. + * @property [navigationInstructionsInitiallyVisible = true] - True if the navigation instructions should initially be visible, or false if the should not be shown until the user explicitly clicks the button. + * @property [scene3DOnly = false] - When true, each geometry instance will only be rendered in 3D to save GPU memory. + * @property [shouldAnimate = false] - true if the clock should attempt to advance simulation time by default, false otherwise. This option takes precedence over setting {@link Viewer#clockViewModel}. + * @property [clockViewModel = new ClockViewModel(clock)] - The clock view model to use to control current time. + * @property [selectedImageryProviderViewModel] - The view model for the current base imagery layer, if not supplied the first available base layer is used. This value is only valid if `baseLayerPicker` is set to true. + * @property [imageryProviderViewModels = createDefaultImageryProviderViewModels()] - The array of ProviderViewModels to be selectable from the BaseLayerPicker. This value is only valid if `baseLayerPicker` is set to true. + * @property [selectedTerrainProviderViewModel] - The view model for the current base terrain layer, if not supplied the first available base layer is used. This value is only valid if `baseLayerPicker` is set to true. + * @property [terrainProviderViewModels = createDefaultTerrainProviderViewModels()] - The array of ProviderViewModels to be selectable from the BaseLayerPicker. This value is only valid if `baseLayerPicker` is set to true. + * @property [baseLayer = ImageryLayer.fromWorldImagery()] - The bottommost imagery layer applied to the globe. If set to false, no imagery provider will be added. This value is only valid if `baseLayerPicker` is set to false. Cannot be used when `globe` is set to false. + * @property [ellipsoid = Ellipsoid.default] - The default ellipsoid. + * @property [terrainProvider = new EllipsoidTerrainProvider()] - The terrain provider to use + * @property [terrain] - A terrain object which handles asynchronous terrain provider. Can only specify if options.terrainProvider is undefined. + * @property [skyBox] - The skybox used to render the stars. When undefined and the WGS84 ellipsoid used, the default stars are used. If set to false, no skyBox, Sun, or Moon will be added. + * @property [skyAtmosphere] - Blue sky, and the glow around the Earth's limb. Enabled when the WGS84 ellipsoid used. Set to false to turn it off. + * @property [fullscreenElement = document.body] - The element or id to be placed into fullscreen mode when the full screen button is pressed. + * @property [useDefaultRenderLoop = true] - True if this widget should control the render loop, false otherwise. + * @property [targetFrameRate] - The target frame rate when using the default render loop. + * @property [showRenderLoopErrors = true] - If true, this widget will automatically display an HTML panel to the user containing the error, if a render loop error occurs. + * @property [useBrowserRecommendedResolution = true] - If true, render at the browser's recommended resolution and ignore window.devicePixelRatio. + * @property [automaticallyTrackDataSourceClocks = true] - If true, this widget will automatically track the clock settings of newly added DataSources, updating if the DataSource's clock changes. Set this to false if you want to configure the clock independently. + * @property [contextOptions] - Context and WebGL creation properties passed to {@link Scene}. + * @property [sceneMode = SceneMode.SCENE3D] - The initial scene mode. + * @property [mapProjection = new GeographicProjection(options.ellipsoid)] - The map projection to use in 2D and Columbus View modes. + * @property [globe = new Globe(options.ellipsoid)] - The globe to use in the scene. If set to false, no globe will be added and the sky atmosphere will be hidden by default. + * @property [orderIndependentTranslucency = true] - If true and the configuration supports it, use order independent translucency. + * @property [creditContainer] - The DOM element or ID that will contain the {@link CreditDisplay}. If not specified, the credits are added to the bottom of the widget itself. + * @property [creditViewport] - The DOM element or ID that will contain the credit pop up created by the {@link CreditDisplay}. If not specified, it will appear over the widget itself. + * @property [dataSources = new DataSourceCollection()] - The collection of data sources visualized by the widget. If this parameter is provided, + * the instance is assumed to be owned by the caller and will not be destroyed when the viewer is destroyed. + * @property [shadows = false] - Determines if shadows are cast by light sources. + * @property [terrainShadows = ShadowMode.RECEIVE_ONLY] - Determines if the terrain casts or receives shadows from light sources. + * @property [mapMode2D = MapMode2D.INFINITE_SCROLL] - Determines if the 2D map is rotatable or can be scrolled infinitely in the horizontal direction. + * @property [projectionPicker = false] - If set to true, the ProjectionPicker widget will be created. + * @property [blurActiveElementOnCanvasFocus = true] - If true, the active element will blur when the viewer's canvas is clicked. Setting this to false is useful for cases when the canvas is clicked only for retrieving position or an entity data without actually meaning to set the canvas to be the active element. + * @property [requestRenderMode = false] - If true, rendering a frame will only occur when needed as determined by changes within the scene. Enabling reduces the CPU/GPU usage of your application and uses less battery on mobile, but requires using {@link Scene#requestRender} to render a new frame explicitly in this mode. This will be necessary in many cases after making changes to the scene in other parts of the API. See {@link https://cesium.com/blog/2018/01/24/cesium-scene-rendering-performance/|Improving Performance with Explicit Rendering}. + * @property [maximumRenderTimeChange = 0.0] - If requestRenderMode is true, this value defines the maximum change in simulation time allowed before a render is requested. See {@link https://cesium.com/blog/2018/01/24/cesium-scene-rendering-performance/|Improving Performance with Explicit Rendering}. + * @property [depthPlaneEllipsoidOffset = 0.0] - Adjust the DepthPlane to address rendering artefacts below ellipsoid zero elevation. + * @property [msaaSamples = 4] - If provided, this value controls the rate of multisample antialiasing. Typical multisampling rates are 2, 4, and sometimes 8 samples per pixel. Higher sampling rates of MSAA may impact performance in exchange for improved visual quality. This value only applies to WebGL2 contexts that support multisample render targets. Set to 1 to disable MSAA. + */ + type ConstructorOptions = { + animation?: boolean; + baseLayerPicker?: boolean; + fullscreenButton?: boolean; + vrButton?: boolean; + geocoder?: boolean | IonGeocodeProviderType | GeocoderService[]; + homeButton?: boolean; + infoBox?: boolean; + sceneModePicker?: boolean; + selectionIndicator?: boolean; + timeline?: boolean; + navigationHelpButton?: boolean; + navigationInstructionsInitiallyVisible?: boolean; + scene3DOnly?: boolean; + shouldAnimate?: boolean; + clockViewModel?: ClockViewModel; + selectedImageryProviderViewModel?: ProviderViewModel; + imageryProviderViewModels?: ProviderViewModel[]; + selectedTerrainProviderViewModel?: ProviderViewModel; + terrainProviderViewModels?: ProviderViewModel[]; + baseLayer?: ImageryLayer | false; + ellipsoid?: Ellipsoid; + terrainProvider?: TerrainProvider; + terrain?: Terrain; + skyBox?: SkyBox | false; + skyAtmosphere?: SkyAtmosphere | false; + fullscreenElement?: Element | string; + useDefaultRenderLoop?: boolean; + targetFrameRate?: number; + showRenderLoopErrors?: boolean; + useBrowserRecommendedResolution?: boolean; + automaticallyTrackDataSourceClocks?: boolean; + contextOptions?: ContextOptions; + sceneMode?: SceneMode; + mapProjection?: MapProjection; + globe?: Globe | false; + orderIndependentTranslucency?: boolean; + creditContainer?: Element | string; + creditViewport?: Element | string; + dataSources?: DataSourceCollection; + shadows?: boolean; + terrainShadows?: ShadowMode; + mapMode2D?: MapMode2D; + projectionPicker?: boolean; + blurActiveElementOnCanvasFocus?: boolean; + requestRenderMode?: boolean; + maximumRenderTimeChange?: number; + depthPlaneEllipsoidOffset?: number; + msaaSamples?: number; + }; + /** + * A function that augments a Viewer instance with additional functionality. + * @param viewer - The viewer instance. + * @param options - Options object to be passed to the mixin function. + */ + type ViewerMixin = (viewer: Viewer, options: any) => void; + } + + /** + * A base widget for building applications. It composites all of the standard Cesium widgets into one reusable package. + * The widget can always be extended by using mixins, which add functionality useful for a variety of applications. + * @example + * // Initialize the viewer widget with several custom options and mixins. + * try { + * const viewer = new Cesium.Viewer("cesiumContainer", { + * // Start in Columbus Viewer + * sceneMode: Cesium.SceneMode.COLUMBUS_VIEW, + * // Use Cesium World Terrain + * terrain: Cesium.Terrain.fromWorldTerrain(), + * // Hide the base layer picker + * baseLayerPicker: false, + * // Use OpenStreetMaps + * baseLayer: new Cesium.ImageryLayer(new Cesium.OpenStreetMapImageryProvider({ + * url: "https://tile.openstreetmap.org/" + * })), + * skyBox: new Cesium.SkyBox({ + * sources: { + * positiveX: "stars/TychoSkymapII.t3_08192x04096_80_px.jpg", + * negativeX: "stars/TychoSkymapII.t3_08192x04096_80_mx.jpg", + * positiveY: "stars/TychoSkymapII.t3_08192x04096_80_py.jpg", + * negativeY: "stars/TychoSkymapII.t3_08192x04096_80_my.jpg", + * positiveZ: "stars/TychoSkymapII.t3_08192x04096_80_pz.jpg", + * negativeZ: "stars/TychoSkymapII.t3_08192x04096_80_mz.jpg" + * } + * }), + * // Show Columbus View map with Web Mercator projection + * mapProjection: new Cesium.WebMercatorProjection() + * }); + * } catch (error) { + * console.log(error); + * } + * + * // Add basic drag and drop functionality + * viewer.extend(Cesium.viewerDragDropMixin); + * + * // Show a pop-up alert if we encounter an error when processing a dropped file + * viewer.dropError.addEventListener(function(dropHandler, name, error) { + * console.log(error); + * window.alert(error); + * }); + * @param container - The DOM element or ID that will contain the widget. + * @param [options] - Object describing initialization options + */ + export class Viewer { + constructor( + container: Element | string, + options?: Viewer.ConstructorOptions, + ); + /** + * Gets the parent container. + */ + readonly container: Element; + /** + * Manages the list of credits to display on screen and in the lightbox. + */ + creditDisplay: CreditDisplay; + /** + * Gets the DOM element for the area at the bottom of the window containing the + * {@link CreditDisplay} and potentially other things. + */ + readonly bottomContainer: Element; + /** + * Gets the CesiumWidget. + */ + readonly cesiumWidget: CesiumWidget; + /** + * Gets the selection indicator. + */ + readonly selectionIndicator: SelectionIndicator; + /** + * Gets the info box. + */ + readonly infoBox: InfoBox; + /** + * Gets the Geocoder. + */ + readonly geocoder: Geocoder; + /** + * Gets the HomeButton. + */ + readonly homeButton: HomeButton; + /** + * Gets the SceneModePicker. + */ + readonly sceneModePicker: SceneModePicker; + /** + * Gets the ProjectionPicker. + */ + readonly projectionPicker: ProjectionPicker; + /** + * Gets the BaseLayerPicker. + */ + readonly baseLayerPicker: BaseLayerPicker; + /** + * Gets the NavigationHelpButton. + */ + readonly navigationHelpButton: NavigationHelpButton; + /** + * Gets the Animation widget. + */ + readonly animation: Animation; + /** + * Gets the Timeline widget. + */ + readonly timeline: Timeline; + /** + * Gets the FullscreenButton. + */ + readonly fullscreenButton: FullscreenButton; + /** + * Gets the VRButton. + */ + readonly vrButton: VRButton; + /** + * Gets the display used for {@link DataSource} visualization. + */ + readonly dataSourceDisplay: DataSourceDisplay; + /** + * Gets the collection of entities not tied to a particular data source. + * This is a shortcut to [dataSourceDisplay.defaultDataSource.entities]{@link Viewer#dataSourceDisplay}. + */ + readonly entities: EntityCollection; + /** + * Gets the set of {@link DataSource} instances to be visualized. + */ + readonly dataSources: DataSourceCollection; + /** + * Gets the canvas. + */ + readonly canvas: HTMLCanvasElement; + /** + * Gets the scene. + */ + readonly scene: Scene; + /** + * Determines if shadows are cast by light sources. + */ + shadows: boolean; + /** + * Determines if the terrain casts or shadows from light sources. + */ + terrainShadows: ShadowMode; + /** + * Get the scene's shadow map + */ + readonly shadowMap: ShadowMap; + /** + * Gets the collection of image layers that will be rendered on the globe. + */ + readonly imageryLayers: ImageryLayerCollection; + /** + * The terrain provider providing surface geometry for the globe. + */ + terrainProvider: TerrainProvider; + /** + * Gets the camera. + */ + readonly camera: Camera; + /** + * Gets the default ellipsoid for the scene. + */ + readonly ellipsoid: Ellipsoid; + /** + * Gets the post-process stages. + */ + readonly postProcessStages: PostProcessStageCollection; + /** + * Gets the clock. + */ + readonly clock: Clock; + /** + * Gets the clock view model. + */ + readonly clockViewModel: ClockViewModel; + /** + * Gets the screen space event handler. + */ + readonly screenSpaceEventHandler: ScreenSpaceEventHandler; + /** + * Gets or sets the target frame rate of the widget when useDefaultRenderLoop + * is true. If undefined, the browser's requestAnimationFrame implementation + * determines the frame rate. If defined, this value must be greater than 0. A value higher + * than the underlying requestAnimationFrame implementation will have no effect. + */ + targetFrameRate: number; + /** + * Gets or sets whether or not this widget should control the render loop. + * If true the widget will use requestAnimationFrame to + * perform rendering and resizing of the widget, as well as drive the + * simulation clock. If set to false, you must manually call the + * resize, render methods + * as part of a custom render loop. If an error occurs during rendering, {@link Scene}'s + * renderError event will be raised and this property + * will be set to false. It must be set back to true to continue rendering + * after the error. + */ + useDefaultRenderLoop: boolean; + /** + * Gets or sets a scaling factor for rendering resolution. Values less than 1.0 can improve + * performance on less powerful devices while values greater than 1.0 will render at a higher + * resolution and then scale down, resulting in improved visual fidelity. + * For example, if the widget is laid out at a size of 640x480, setting this value to 0.5 + * will cause the scene to be rendered at 320x240 and then scaled up while setting + * it to 2.0 will cause the scene to be rendered at 1280x960 and then scaled down. + */ + resolutionScale: number; + /** + * Boolean flag indicating if the browser's recommended resolution is used. + * If true, the browser's device pixel ratio is ignored and 1.0 is used instead, + * effectively rendering based on CSS pixels instead of device pixels. This can improve + * performance on less powerful devices that have high pixel density. When false, rendering + * will be in device pixels. {@link Viewer#resolutionScale} will still take effect whether + * this flag is true or false. + */ + useBrowserRecommendedResolution: boolean; + /** + * Gets or sets whether or not data sources can temporarily pause + * animation in order to avoid showing an incomplete picture to the user. + * For example, if asynchronous primitives are being processed in the + * background, the clock will not advance until the geometry is ready. + */ + allowDataSourcesToSuspendAnimation: boolean; + /** + * Gets or sets the Entity instance currently being tracked by the camera. + */ + trackedEntity: Entity | undefined; + /** + * Gets or sets the object instance for which to display a selection indicator. + * + * If a user interactively picks a Cesium3DTilesFeature instance, then this property + * will contain a transient Entity instance with a property named "feature" that is + * the instance that was picked. + */ + selectedEntity: Entity | undefined; + /** + * Gets the event that is raised when the selected entity changes. + */ + readonly selectedEntityChanged: Event; + /** + * Gets the event that is raised when the tracked entity changes. + */ + readonly trackedEntityChanged: Event; + /** + * Gets or sets the data source to track with the viewer's clock. + */ + clockTrackedDataSource: DataSource; + /** + * Extends the base viewer functionality with the provided mixin. + * A mixin may add additional properties, functions, or other behavior + * to the provided viewer instance. + * @param mixin - The Viewer mixin to add to this instance. + * @param [options] - The options object to be passed to the mixin function. + */ + extend(mixin: Viewer.ViewerMixin, options?: any): void; + /** + * Resizes the widget to match the container size. + * This function is called automatically as needed unless + * useDefaultRenderLoop is set to false. + */ + resize(): void; + /** + * This forces the widget to re-think its layout, including + * widget sizes and credit placement. + */ + forceResize(): void; + /** + * Renders the scene. This function is called automatically + * unless useDefaultRenderLoop is set to false; + */ + render(): void; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the widget. Should be called if permanently + * removing the widget from layout. + */ + destroy(): void; + /** + * Asynchronously sets the camera to view the provided entity, entities, or data source. + * If the data source is still in the process of loading or the visualization is otherwise still loading, + * this method waits for the data to be ready before performing the zoom. + * + *

The offset is heading/pitch/range in the local east-north-up reference frame centered at the center of the bounding sphere. + * The heading and the pitch angles are defined in the local east-north-up reference frame. + * The heading is the angle from y axis and increasing towards the x axis. Pitch is the rotation from the xy-plane. Positive pitch + * angles are above the plane. Negative pitch angles are below the plane. The range is the distance from the center. If the range is + * zero, a range will be computed such that the whole bounding sphere is visible.

+ * + *

In 2D, there must be a top down view. The camera will be placed above the target looking down. The height above the + * target will be the range. The heading will be determined from the offset. If the heading cannot be + * determined from the offset, the heading will be north.

+ * @param target - The entity, array of entities, entity collection, data source, Cesium3DTileset, point cloud, or imagery layer to view. You can also pass a promise that resolves to one of the previously mentioned types. + * @param [offset] - The offset from the center of the entity in the local east-north-up reference frame. + * @returns A Promise that resolves to true if the zoom was successful or false if the target is not currently visualized in the scene or the zoom was cancelled. + */ + zoomTo( + target: + | Entity + | Entity[] + | EntityCollection + | DataSource + | ImageryLayer + | Cesium3DTileset + | TimeDynamicPointCloud + | Promise< + | Entity + | Entity[] + | EntityCollection + | DataSource + | ImageryLayer + | Cesium3DTileset + | TimeDynamicPointCloud + | VoxelPrimitive + >, + offset?: HeadingPitchRange, + ): Promise; + /** + * Flies the camera to the provided entity, entities, or data source. + * If the data source is still in the process of loading or the visualization is otherwise still loading, + * this method waits for the data to be ready before performing the flight. + * + *

The offset is heading/pitch/range in the local east-north-up reference frame centered at the center of the bounding sphere. + * The heading and the pitch angles are defined in the local east-north-up reference frame. + * The heading is the angle from y axis and increasing towards the x axis. Pitch is the rotation from the xy-plane. Positive pitch + * angles are above the plane. Negative pitch angles are below the plane. The range is the distance from the center. If the range is + * zero, a range will be computed such that the whole bounding sphere is visible.

+ * + *

In 2D, there must be a top down view. The camera will be placed above the target looking down. The height above the + * target will be the range. The heading will be determined from the offset. If the heading cannot be + * determined from the offset, the heading will be north.

+ * @param target - The entity, array of entities, entity collection, data source, Cesium3DTileset, point cloud, or imagery layer to view. You can also pass a promise that resolves to one of the previously mentioned types. + * @param [options] - Object with the following properties: + * @param [options.duration = 3.0] - The duration of the flight in seconds. + * @param [options.maximumHeight] - The maximum height at the peak of the flight. + * @param [options.offset] - The offset from the target in the local east-north-up reference frame centered at the target. + * @returns A Promise that resolves to true if the flight was successful or false if the target is not currently visualized in the scene or the flight was cancelled. //TODO: Cleanup entity mentions + */ + flyTo( + target: + | Entity + | Entity[] + | EntityCollection + | DataSource + | ImageryLayer + | Cesium3DTileset + | TimeDynamicPointCloud + | Promise< + | Entity + | Entity[] + | EntityCollection + | DataSource + | ImageryLayer + | Cesium3DTileset + | TimeDynamicPointCloud + | VoxelPrimitive + >, + options?: { + duration?: number; + maximumHeight?: number; + offset?: HeadingPitchRange; + }, + ): Promise; + } + + /** + * A mixin which adds the {@link Cesium3DTilesInspector} widget to the {@link Viewer} widget. + * Rather than being called directly, this function is normally passed as + * a parameter to {@link Viewer#extend}, as shown in the example below. + * @example + * const viewer = new Cesium.Viewer('cesiumContainer'); + * viewer.extend(Cesium.viewerCesium3DTilesInspectorMixin); + * @param viewer - The viewer instance. + */ + export function viewerCesium3DTilesInspectorMixin(viewer: Viewer): void; + + /** + * A mixin which adds the CesiumInspector widget to the Viewer widget. + * Rather than being called directly, this function is normally passed as + * a parameter to {@link Viewer#extend}, as shown in the example below. + * @example + * const viewer = new Cesium.Viewer('cesiumContainer'); + * viewer.extend(Cesium.viewerCesiumInspectorMixin); + * @param viewer - The viewer instance. + */ + export function viewerCesiumInspectorMixin(viewer: Viewer): void; + + /** + * A mixin which adds default drag and drop support for CZML files to the Viewer widget. + * Rather than being called directly, this function is normally passed as + * a parameter to {@link Viewer#extend}, as shown in the example below. + * @example + * // Add basic drag and drop support and pop up an alert window on error. + * const viewer = new Cesium.Viewer('cesiumContainer'); + * viewer.extend(Cesium.viewerDragDropMixin); + * viewer.dropError.addEventListener(function(viewerArg, source, error) { + * window.alert('Error processing ' + source + ':' + error); + * }); + * @param viewer - The viewer instance. + * @param [options] - Object with the following properties: + * @param [options.dropTarget = viewer.container] - The DOM element which will serve as the drop target. + * @param [options.clearOnDrop = true] - When true, dropping files will clear all existing data sources first, when false, new data sources will be loaded after the existing ones. + * @param [options.flyToOnDrop = true] - When true, dropping files will fly to the data source once it is loaded. + * @param [options.clampToGround = true] - When true, datasources are clamped to the ground. + * @param [options.proxy] - The proxy to be used for KML network links. + */ + export function viewerDragDropMixin( + viewer: Viewer, + options?: { + dropTarget?: Element | string; + clearOnDrop?: boolean; + flyToOnDrop?: boolean; + clampToGround?: boolean; + proxy?: Proxy; + }, + ): void; + + /** + * A mixin which adds the {@link PerformanceWatchdog} widget to the {@link Viewer} widget. + * Rather than being called directly, this function is normally passed as + * a parameter to {@link Viewer#extend}, as shown in the example below. + * @example + * const viewer = new Cesium.Viewer('cesiumContainer'); + * viewer.extend(Cesium.viewerPerformanceWatchdogMixin, { + * lowFrameRateMessage : 'Why is this going so slowly?' + * }); + * @param viewer - The viewer instance. + * @param [options] - An object with properties. + * @param [options.lowFrameRateMessage = 'This application appears to be performing poorly on your system. Please try using a different web browser or updating your video drivers.'] - The + * message to display when a low frame rate is detected. The message is interpeted as HTML, so make sure + * it comes from a trusted source so that your application is not vulnerable to cross-site scripting attacks. + */ + export function viewerPerformanceWatchdogMixin( + viewer: Viewer, + options?: { + lowFrameRateMessage?: string; + }, + ): void; + + /** + * A mixin which adds the {@link VoxelInspector} widget to the {@link Viewer} widget. + * Rather than being called directly, this function is normally passed as + * a parameter to {@link Viewer#extend}, as shown in the example below. + * @example + * var viewer = new Cesium.Viewer('cesiumContainer'); + * viewer.extend(Cesium.viewerVoxelInspectorMixin); + * @param viewer - The viewer instance. + */ + export function viewerVoxelInspectorMixin(viewer: Viewer): void; + + /** + * Inspector widget to aid in debugging voxels + * @param container - The DOM element or ID that will contain the widget. + * @param scene - the Scene instance to use. + */ + export class VoxelInspector { + constructor(container: Element | string, scene: Scene); + /** + * Gets the parent container. + */ + container: Element; + /** + * Gets the view model. + */ + viewModel: VoxelInspectorViewModel; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the widget. Should be called if permanently + * removing the widget from layout. + */ + destroy(): void; + } + + /** + * The view model for {@link VoxelInspector}. + * @param scene - The scene instance to use. + */ + export class VoxelInspectorViewModel { + constructor(scene: Scene); + /** + * Gets the scene + */ + readonly scene: Scene; + /** + * Gets or sets the primitive of the view model. + */ + voxelPrimitive: VoxelPrimitive; + /** + * Toggles the inspector visibility + */ + toggleInspector(): void; + /** + * Toggles the visibility of the display section + */ + toggleDisplay(): void; + /** + * Toggles the visibility of the transform section + */ + toggleTransform(): void; + /** + * Toggles the visibility of the bounds section + */ + toggleBounds(): void; + /** + * Toggles the visibility of the clipping section + */ + toggleClipping(): void; + /** + * Toggles the visibility of the shader section + */ + toggleShader(): void; + /** + * Compiles the shader in the shader editor. + */ + compileShader(): void; + /** + * Handles key press events on the shader editor. + */ + shaderEditorKeyPress(): void; + /** + * @returns true if the object has been destroyed, false otherwise. + */ + isDestroyed(): boolean; + /** + * Destroys the widget. Should be called if permanently + * removing the widget from layout. + */ + destroy(): void; + } + + /** + * Create a Command from a given function, for use with ViewModels. + * + * A Command is a function with an extra canExecute observable property to determine + * whether the command can be executed. When executed, a Command function will check the + * value of canExecute and throw if false. It also provides events for when + * a command has been or is about to be executed. + * @param func - The function to execute. + * @param [canExecute = true] - A boolean indicating whether the function can currently be executed. + */ + export function createCommand( + func: (...params: any[]) => any, + canExecute?: boolean, + ): void; +} diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Batched/BatchedColors/batchedColors.b3dm b/packages/sandcastle/public/SampleData/Cesium3DTiles/Batched/BatchedColors/batchedColors.b3dm new file mode 100644 index 0000000000000000000000000000000000000000..d877294f27f67dfa2c9cff689e3cf357ed78790a GIT binary patch literal 13320 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 literal 0 HcmV?d00001 diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Batched/BatchedColors/tileset.json b/packages/sandcastle/public/SampleData/Cesium3DTiles/Batched/BatchedColors/tileset.json new file mode 100644 index 000000000000..cbcfce0a85d9 --- /dev/null +++ b/packages/sandcastle/public/SampleData/Cesium3DTiles/Batched/BatchedColors/tileset.json @@ -0,0 +1,41 @@ +{ + "asset": { + "version": "1.0" + }, + "properties": { + "id": { + "minimum": 0, + "maximum": 9 + }, + "Longitude": { + "minimum": -1.3196959060375169, + "maximum": -1.3196607462778132 + }, + "Latitude": { + "minimum": 0.6988590050687061, + "maximum": 0.6988864387845588 + }, + "Height": { + "minimum": 6.1022464875131845, + "maximum": 13.410263679921627 + } + }, + "geometricError": 70, + "root": { + "refine": "ADD", + "boundingVolume": { + "region": [ + -1.3197004795898053, + 0.6988582109, + -1.3196595204101946, + 0.6988897891, + 0, + 20 + ] + }, + "geometricError": 0, + "content": { + "uri": "batchedColors.b3dm" + } + } +} diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Batched/BatchedTranslucent/batchedTranslucent.b3dm b/packages/sandcastle/public/SampleData/Cesium3DTiles/Batched/BatchedTranslucent/batchedTranslucent.b3dm new file mode 100644 index 0000000000000000000000000000000000000000..fddc903f85f44066cfc4d99ea8082154e7a9165d GIT binary patch literal 9672 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 literal 0 HcmV?d00001 diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Batched/BatchedTranslucent/tileset.json b/packages/sandcastle/public/SampleData/Cesium3DTiles/Batched/BatchedTranslucent/tileset.json new file mode 100644 index 000000000000..036bb25c81f5 --- /dev/null +++ b/packages/sandcastle/public/SampleData/Cesium3DTiles/Batched/BatchedTranslucent/tileset.json @@ -0,0 +1,41 @@ +{ + "asset": { + "version": "1.0" + }, + "properties": { + "id": { + "minimum": 0, + "maximum": 9 + }, + "Longitude": { + "minimum": -1.3196959060375169, + "maximum": -1.3196607462778132 + }, + "Latitude": { + "minimum": 0.6988590050687061, + "maximum": 0.6988864387845588 + }, + "Height": { + "minimum": 6.1022464875131845, + "maximum": 13.410263679921627 + } + }, + "geometricError": 70, + "root": { + "refine": "ADD", + "boundingVolume": { + "region": [ + -1.3197004795898053, + 0.6988582109, + -1.3196595204101946, + 0.6988897891, + 0, + 20 + ] + }, + "geometricError": 0, + "content": { + "uri": "batchedTranslucent.b3dm" + } + } +} diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Batched/BatchedTranslucentOpaqueMix/batchedTranslucentOpaqueMix.b3dm b/packages/sandcastle/public/SampleData/Cesium3DTiles/Batched/BatchedTranslucentOpaqueMix/batchedTranslucentOpaqueMix.b3dm new file mode 100644 index 0000000000000000000000000000000000000000..db421f7a7f585257e212037b2360aeb60cc2820a GIT binary patch literal 10024 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 literal 0 HcmV?d00001 diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Batched/BatchedTranslucentOpaqueMix/tileset.json b/packages/sandcastle/public/SampleData/Cesium3DTiles/Batched/BatchedTranslucentOpaqueMix/tileset.json new file mode 100644 index 000000000000..37b5733fbf78 --- /dev/null +++ b/packages/sandcastle/public/SampleData/Cesium3DTiles/Batched/BatchedTranslucentOpaqueMix/tileset.json @@ -0,0 +1,41 @@ +{ + "asset": { + "version": "1.0" + }, + "properties": { + "id": { + "minimum": 0, + "maximum": 9 + }, + "Longitude": { + "minimum": -1.3196959060375169, + "maximum": -1.3196607462778132 + }, + "Latitude": { + "minimum": 0.6988590050687061, + "maximum": 0.6988864387845588 + }, + "Height": { + "minimum": 6.1022464875131845, + "maximum": 13.410263679921627 + } + }, + "geometricError": 70, + "root": { + "refine": "ADD", + "boundingVolume": { + "region": [ + -1.3197004795898053, + 0.6988582109, + -1.3196595204101946, + 0.6988897891, + 0, + 20 + ] + }, + "geometricError": 0, + "content": { + "uri": "batchedTranslucentOpaqueMix.b3dm" + } + } +} diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Batched/BatchedWithBatchTable/batchedWithBatchTable.b3dm b/packages/sandcastle/public/SampleData/Cesium3DTiles/Batched/BatchedWithBatchTable/batchedWithBatchTable.b3dm new file mode 100644 index 0000000000000000000000000000000000000000..b867b67f266fae303ad7824193230f880d006eef GIT binary patch literal 10304 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 literal 0 HcmV?d00001 diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Classification/Photogrammetry/tileset.json b/packages/sandcastle/public/SampleData/Cesium3DTiles/Classification/Photogrammetry/tileset.json new file mode 100644 index 000000000000..08431cdce1a8 --- /dev/null +++ b/packages/sandcastle/public/SampleData/Cesium3DTiles/Classification/Photogrammetry/tileset.json @@ -0,0 +1,31 @@ +{ + "asset": { + "version": "1.0", + "tilesetVersion": "1.0" + }, + "properties": { + "Longitude": { + "minimum": -1.3194245623155147, + "maximum": -1.3194092552469474 + }, + "Latitude": { + "minimum": 0.6988049305192636, + "maximum": 0.6988185175658763 + }, + "Height": { + "minimum": 73.0000006258161, + "maximum": 102.999890661765747 + } + }, + "geometricError": 1000.0, + "root": { + "boundingVolume": { + "region": [-1.3194315762936881, 0.6987998244450816, -1.3194015908860113, 0.6988235397748883, 73.0000006258161, 102.999890661765747] + }, + "geometricError": 0, + "refine": "ADD", + "content": { + "uri": "content.b3dm" + } + } +} diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Classification/PointCloud/content.geom b/packages/sandcastle/public/SampleData/Cesium3DTiles/Classification/PointCloud/content.geom new file mode 100644 index 0000000000000000000000000000000000000000..3a318f52f972b03ea964bef2aa662ddf5c1f0c14 GIT binary patch literal 856 zcmYdK&Cg|IU|@(~W?)DF(o>ii7(9S92vjRM`A4`0$NRYYxrcZtSsCj<1eC0*m69q; zQvK7?ic?FJtPE;(l$;}dJpEi;gHTk%1<`dF8ClfUDljlSaDd!vnfy~f7DK$-z&CXk5?aEJH# z_}Py8GZ_vPF*`Yc!j}=K?Lm1!WE_yO4~WfK7#Lpgd=CThVd54Q5P6VV5Eg*)&jLB+ zK=m3>^)T@aH1!Tp{w1J#kog^#Am+iuXP~Jsfbwra)o*~Rhl!s+Q@;Spe*{(k;&MP_ zwNhq^l2x=)Nq%{1kyCz2Nq(-Ok`9C$l3xH~7v<-t!Du6xoH2}Hq7+-Jpr8N%{$`@- literal 0 HcmV?d00001 diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Classification/PointCloud/tileset.json b/packages/sandcastle/public/SampleData/Cesium3DTiles/Classification/PointCloud/tileset.json new file mode 100644 index 000000000000..759d1cf7012c --- /dev/null +++ b/packages/sandcastle/public/SampleData/Cesium3DTiles/Classification/PointCloud/tileset.json @@ -0,0 +1,41 @@ +{ + "asset": { + "version": "1.0" + }, + "geometricError": 1000, + "root": { + "boundingVolume": { + "region": [ + 0.05106109590840974, + 0.8096200283483475, + 0.05108367303398731, + 0.809642605473925, + 313.24, + 513.24 + ] + }, + "transform": [ + -0.05105018459701556, + 0.9986960892346634, + 0, + 0, + -0.7230889943688711, + -0.036962021820761914, + 0.6897652609152887, + 0, + 0.6888658685660259, + 0.03521264389833409, + 0.7240330688818458, + 0, + 4401696.395347578, + 225000.79448064446, + 4595435.890447363, + 1 + ], + "geometricError": 0, + "refine": "REPLACE", + "content": { + "uri": "content.geom" + } + } +} diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Composite/Composite/composite.cmpt b/packages/sandcastle/public/SampleData/Cesium3DTiles/Composite/Composite/composite.cmpt new file mode 100644 index 0000000000000000000000000000000000000000..4564fa268abfa05df9a0fa909ea81040678b362f GIT binary patch literal 13472 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 QuBuGe;5A(r|Kg_7{}S@|!~g&Q literal 0 HcmV?d00001 diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tileset.json b/packages/sandcastle/public/SampleData/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tileset.json new file mode 100644 index 000000000000..b58514642f34 --- /dev/null +++ b/packages/sandcastle/public/SampleData/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tileset.json @@ -0,0 +1,53 @@ +{ + "asset": { + "version": "1.0" + }, + "geometricError": 70, + "root": { + "transform": [ + 0.9686356343768792, + 0.24848542777253735, + 0, + 0, + -0.15986460744966327, + 0.623177611820219, + 0.765567091384559, + 0, + 0.19023226619126932, + -0.7415555652213445, + 0.6433560667227647, + 0, + 1215011.9317263428, + -4736309.3434217675, + 4081602.0044800863, + 1 + ], + "refine": "ADD", + "boundingVolume": { + "box": [ + 0, + 0, + 10, + 50, + 0, + 0, + 0, + 50, + 0, + 0, + 0, + 10 + ] + }, + "geometricError": 0, + "content": { + "uri": "tile.b3dm" + } + }, + "extensionsUsed": [ + "3DTILES_batch_table_hierarchy" + ], + "extensionsRequired": [ + "3DTILES_batch_table_hierarchy" + ] +} diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Instanced/InstancedOrientation/instancedOrientation.i3dm b/packages/sandcastle/public/SampleData/Cesium3DTiles/Instanced/InstancedOrientation/instancedOrientation.i3dm new file mode 100644 index 0000000000000000000000000000000000000000..b06894dee449bda665393772cc9e593f319de751 GIT binary patch literal 4432 zcmb_eeNYtV8GivKgjlJGAJdsA+jZJ-x?JuHIDvcL90cSTJiZQNtCTEvdv`1M)xA3e zDUN9~jGswlFsABgY&%U&tLfCHPSe1aNhZ}~#!05N5ogk=b&^S{wI(%Aj8^)*`*F8` zE&S1i-TUqPJkRg>dOudQ2ckI$p_WAm^}+9sJcKsDFTLpa0PFF#``q5zy7sQ7I`3Lv z16ye;}4wl*zW$6&>RdVg%n$98RS@RbK5$1Q&&gJbfMj15Vv{OHu$D% zl!L|~1DC0J#4~^Qb8nZf=x^+58S#9&OU3(JM?4>B_?@;9&sh!U_(nXhYWSvi#PdhM zFM%xwwz7u1!S?4GegSL`X!u-?~nt__TiuXx)i^EC`Gsx zTkv7)HgctRsCxJZ*Iju}J>wEg4svADK`sTpMQTI!u9_qHXky!&5E$t1kUKxilXrf!A3sp)C3FuMU>gK66o!?((PrWPPyd~ROeo^3&jtQJ zEkMXJ5242PX72#Y`~5;P8JCja4)&FFFepgtMPUnDY3HVHGaT!WM-%aw5KH;`69QXV zX0?HiKc0?3toCw_O)0}{d#$_4-NtfkREz#J1IB)b8&oC&ffU+3%!GDUELi8B3JJytI-rG}>7=Q_8wfzsSifN%L z+(t4xO+3n{1WDv0YTAizX`PVbBN5Tx7Eg!5F_`-FJdA3C^}JuHHH0PUa(&DSk@HER zHXeyf`q)NjnA$Xs6{2D?DfS8(nT3Nt+RR8I%&&{ngxKa5cWXx-bTAN4cSnSFNHf4z z1|dE{iB?F41uaxbjEX7XQ(yTM)TBF|qOSvnPXUNZJ^P{8Fb~97K!o+I6kbnVeNp_w zT%c}Z@S@U2!6C@$VA2nBP0>}5D%UkFU`Ia^b`&5~_89$GCraUGi#CQ75sLF?@GjzuvFu*s={7g>K9`nRnVIe)YVoM&ahHR zXV_$h<6;035Mw31fK1FlAwy{$40vN)GqYk=DdLiBIGojNF;!7BLm*%Z1m?c}tyB_< zbhT)~E1c6S0i>XgGx-thZJ(NG1e-I>Jj?fieZ4Jjt*a6X^y&QK zrBJuhEjlsv!MU*M1y^$`nA5uQ2)JPpA bs>4hmW}eeyGV|a&-DO<3kjY>nJ#zj7F_VpP literal 0 HcmV?d00001 diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Instanced/InstancedOrientation/tileset.json b/packages/sandcastle/public/SampleData/Cesium3DTiles/Instanced/InstancedOrientation/tileset.json new file mode 100644 index 000000000000..00c6d0c89b9f --- /dev/null +++ b/packages/sandcastle/public/SampleData/Cesium3DTiles/Instanced/InstancedOrientation/tileset.json @@ -0,0 +1,29 @@ +{ + "asset": { + "version": "1.0" + }, + "properties": { + "Height": { + "minimum": 20, + "maximum": 20 + } + }, + "geometricError": 70, + "root": { + "refine": "ADD", + "boundingVolume": { + "region": [ + -1.3197004795898053, + 0.6988582109, + -1.3196595204101946, + 0.6988897891, + 0, + 30 + ] + }, + "geometricError": 0, + "content": { + "uri": "instancedOrientation.i3dm" + } + } +} diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Instanced/InstancedWithBatchTable/instancedWithBatchTable.i3dm b/packages/sandcastle/public/SampleData/Cesium3DTiles/Instanced/InstancedWithBatchTable/instancedWithBatchTable.i3dm new file mode 100644 index 0000000000000000000000000000000000000000..82f7fc972b123deba0ac362dbc7842554e33509f GIT binary patch literal 3784 zcmb_eO>Y}T7@m~26jKTmXm512Cx>p$+Uq2)BS3CQ8b_&}#%_hwM%Kn2+l$t_*6!M^ z8(Hds10O=FP!LFP;lzP6=c+0@B2LO*UaoX zR--dR2)TcPkX1ZQ4Bo?&{n-4DUMy9rh0@Y;rMA9Yx>#M+^O-qAUoKRtwNiPrx>~!k zq35HZM-6?WTq#zI<&vJ?(YFT?EjODXjr6=Z9L|<^i$^}W^Ygja2Wz#B-QrFZQ zyTw1G{LAKU@h2(IRCkNtOZo58Zt*wB-vVm@dsoWaz4a^M@-nEQr{7?T|L#^djR}O*y z_v7gGVM5j_<{%VXGd>Qj|O(+2YOyFUs%grT(7R6uzebYj*sH% znUskDW#42EvHjMm*NWQMujyQt5sv#B?=!ZiD8Dk#ntS>&pUsWapE6IUEi@#)-P7ir z`4qt10?HD%hyTb9TI{5-vghZe_evBv4J@#9<|$kYdqU;haWab~-mxPZIJPU&?rsN{ zXk@#tQ{VJ^t+t1y&rYn4oLsT%yw(USPM zfQ!jTr7h!OwsGu}Y#2sfoGWe<=a0u0m*Y0^*#0Yi<%`+IZQ@vVjuUeGu6Q0;euses z=Jq}^*9%i}5SjCWd&Iks%wvZQ!yQD1CI1~X=NZD@MTf{U|l9$NKy~EMx_*eQ z>U)ccz8wr4uO$@ykz#piF)@V_q*IvDwC^;Kfa4|mkY=@=gvMyI8oX(5O=qRO!PUue zI7T{U&Mq=oED%6Jkh(dz#WXFqwjqP(oO>$)QdkQP5g0d%*8?WDEYM}B&NrN9vlr5-d2zV13ai#iK-i`Ao@)nV1z!RvPuO-mhaK?Kswl9%uxkg@ zs}H8?k9>JESjcoBi)TMB=Qwl; z-zTmKtFxnGWLPo8ZOrJx?Ve((#V<=NoGBV84Ncu_i(W)Mtf2ugjMhvU*hDvydt7L3;lqfp)mhG`nD&WTnT;HdI$viW zDbppvBI5i)jatasus)&&@k%kOk(qJ?8zu74CXCdgnV3|I24{rW@gp2go|V9E@y{s{ dX*MYwjsi*9hKea=!*{P1-?+$Rm|(A*e*q5VbT9w_ literal 0 HcmV?d00001 diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Instanced/InstancedWithBatchTable/tileset.json b/packages/sandcastle/public/SampleData/Cesium3DTiles/Instanced/InstancedWithBatchTable/tileset.json new file mode 100644 index 000000000000..93ce14f601fa --- /dev/null +++ b/packages/sandcastle/public/SampleData/Cesium3DTiles/Instanced/InstancedWithBatchTable/tileset.json @@ -0,0 +1,29 @@ +{ + "asset": { + "version": "1.0" + }, + "properties": { + "Height": { + "minimum": 20, + "maximum": 20 + } + }, + "geometricError": 70, + "root": { + "refine": "ADD", + "boundingVolume": { + "region": [ + -1.3197004795898053, + 0.6988582109, + -1.3196595204101946, + 0.6988897891, + 0, + 30 + ] + }, + "geometricError": 0, + "content": { + "uri": "instancedWithBatchTable.i3dm" + } + } +} diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/PointCloud/PointCloudBatched/pointCloudBatched.pnts b/packages/sandcastle/public/SampleData/Cesium3DTiles/PointCloud/PointCloudBatched/pointCloudBatched.pnts new file mode 100644 index 0000000000000000000000000000000000000000..cad09d4544be9448611a283bdee9fb6c8cee4af6 GIT binary patch literal 25632 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

3DWCU3YtY z?mmMysjg*4=`n2X4@H!7_s6gOc|K-%28*3#Rjax`mrSCZX~m|Yqm2DYY8-U-B7q+ zKT6o!Z7}2?7nnZtD<3!`kA8HR@MAcEpEC@=HGA~`dOzpkE|iPWuVm-pw@&rk0ER({-Su zc@6=y#7_w&oV?#y^uA^eQ{2;N(Dw=!`>d0Rmzd(7CCb$Kt(_kfl}ldD;h-j343^TS z?6iFbK6(BP79Q>9m%f}z)#`p2(shtK@2i3*dk*o;(FHRm8(`EKKdQQ@f@h9M@Wz#= z>;vCBLf7tmn%u}y^Z`?9^s3;TB(I39dt>p}{5P;?Mlv?+Oye@{USN;ZGWpTG1%G}* z0q(9I35vF7*h!OQI(q3nQ*iJ?G4b1QQ@4oC^EJWU`$l8`makmgTWyjF^q{0K*)&3S zI@lXZ!B4GH7&lRz?)3O!$M<~tmGptnStbQZiVW5)PsRIBrMVCHY_a;B5j%#KG{d%# z-G5_%ays^S$t03C3HSDf?;Fd>uwVv7vLat;W?FyDgDN|)~&D2B*HU^X~j1c10 zNZ*{6)Pk-Lj-R1H_g>~eo9kFMQ8E)9s+O>C`qp&q>`2U)X@s?#+nGV@1iDtN$gaio zFwvo@wATF|cos0Gr9P1ys~55*PA+ums~Q#7O`(HprRd$sGERHvTspt2Sd_be5Xkx# zv&(<3gV}^Ayb>8h=|=ll@wdHfsl6S2HqgPcFO{G^&X<+F{{vblr=aHm9gNU*#Q`M_ zP!#+dd<<7W{)iyDaXdk|*X&>;JCbQ;&V0V%XcnvL&7lnOqilpmJnpS3gDchhH`Z`E3HpEpsM`7`>9n8vS6lMzh+&~#^s+cxZE^+l ze?A1qeK`Y?W1KKVaXGK$tdHL7T=8nyaPHAvVgvP4NovAsm?S$MU+4<)lDEXhn{+|Y zU2m%1AV(X7f2974pOB&63Wd3w*u&6JTAzCuQrp#Wkla{oes2j45&*}JX^843$pLb z#d*m?xY@D&;P;+j`grSQ?RIl1B%>~#uQtYg!vI_T?u!(^hme8lK)N-16`Ny{MPf3G zxy}k*?wa3hJoPFNzI2A;p^$H|Z_Phy66mYf zUYMx4f(<(Rm`_{QT>CC=9;H|ou;7$cJb2_#tF0D3c)tqvUl!r>v|C(qw==GmFu)nV z#Zj_B7pYozY5(STC@{~x+B5`J=1j|^r}De6KaA+tGL17Ko9g<^NIKNH^Og;h?Y^S*zMV$VB@68)cnAW z)m91hmDW>mUE>^#toY$*DXs@s?XoHOqCX_+ID%I{XV^Giff~$xh5F@m956x+w0c*v z8=6B=Df1oscil+Ru(?@#s%jpEO}@%Uy$WZ)Cr_lyuLfYa!UIv`k8s?i*q?@Wi%7G2 z9a}J66Q`U}WOq*=XFW=(w9)w^%Mxw{8-Lmk9d|DWM`?XLJ@z-hU&jZN>{W5tvv7$0o=3rj+Z@N|j-%vHF>pjpg~AT% zVxHIr<{WNE&06YsVzwmNC}>dl6J3VybWpC*6>mKj7iG&P(2;~T_G76R#+VPIT^rAE zR_+tfAbcn#R2FfiSsHZV#~o0cV?i2^ySe3`=91(gQ!ZjeB0k8{fOD%Zu`SKfsMy&C ziN?;51xdKR)rJ46c@38AFM`~o9PJyRL-oHq*vFSQYY&ISV$Gy`tVXb}dE(6vj2psK zm(Rt=fens{b+37z4`q`R1&;Y%Hl<%KfI_R&{5Z`X{_`HQnrh>D$ST9gs6L$qhP(xn znnd#B@3KW2UA4otCCS8O03J#)$IBrF{4_TO`e7-=PaX+(s{K|7p7!W=N5l?W&!&xB zGw(a*Dh!DmKrffMkjt(TsAvaX_G}h;SI5A%0tq;skV6KMidcDSFK7A9A0twSlU~qr z&b!tFhx9IHzKSL|;p!-SsJaw(pg!#ovnMO*S*+-{Bl`T(!`oGv5EwX)My^msm&McI zsk#-`@3ca{$1B))+aP*!`WL&j?ZJ@#y|5ga?oJ-CSgL;3^;PMQNf(kx-e#|<)rbb{oa8|ZyJhGSGKUEjTxlA?P;x9K_!>6#Dpq%z@vtXpjYezeE1kl z;w4S2`PN9wO2v!kPZkjp#8 zN^k#Qe{N)8TG{-{d?O3lWeP2sX&`Bzg)S?F_k3a{oCQa8N^roFryub5g3bTCBSTjCdRAtXPPO{L zx~e9?NWE+fsH|ouHgH&9D39N4N(JszgdZMh;UMWaX6=-PbH3QKshVk2x%UJxzoq<^ z6K~kG&x%krBpTiFl!@vNGWS~?{cf2Gc0sX}cH{=r@Eu5_=LbRlj36v(7z^Iz!)Ve7 zcT)Ijf;IILDBUB4R_6WboL(??-n55%%8{t3@e?XEtZSVt_j0k8s^q%RmudqRa9a&W z(-?hQTGyIO&bPF=!tNCIyY4=39O^;u%5~_T@Xu^+@WDz~W%kahiY>b?0kTV5E7(MD6?((rCbO;V+@{cE8<%87D*=wcmc z;pX(uu&68vo?#}AS?SK49-d)4)@akiQ#O?UnP)>A4d`ZqDZ=Gs61O?RzQqG`30%$| zPR=H)m#U76#?Ron*cgmflA+y+ns92n6`ESv;x&&Ec&GU}`}lD)-?ZMWFJ3K6vROes^zk;9C1 zBl;yPMlHfU*Z4yrr=o9+#Xnp5>gD-pQ=|z}DGu~o;LZApc5!WX%S2DUE23;^0G{;x z47v@jI7gzLwV5QKT)sY}OJ8L=9}hTMPE4S&o)6jG=quc1b!k*cn1lzi2MGP#-0A#| zI;JR^g}tlx!dHzPZu-qCI6kb41wRX*S=(ahbi*A^XVe=Ol9z^Vjf=Rjwqp=*Lx`nYqXxcqP_%?H)7t0{#iz)3k zw?Y?#82aa23H!I=JUraw&)mkuV8N~XaHUlaE|$!}2dM}6g)6ezli3EiGk7evxygZ} z*bvm-8Hh8h?AaYdB~+N?gKIR@$e_au8<*-r=c6hZe8e9W%)c?C2~rsL*qf}|SF;^X zQZQj`IV`-9j$2PT;`;RpEOV?WzNoOkjh2qs^0ueuXTdn$-cSvf7y9CajY&|gV@i5M z$IyNMqcvb7@YheLqiWs=UgP5m(0!GK6C&5blJ}kLUG^l5Onb}eILswV=K1gwsZcda zl07+*jlN-lX!M$6z1@TG{oq?nd{r2Iklzjmp1M=Y?MetN68PfJv#PhG;bFWT+ z5{-$@;M>v)DB%@{|9q+y$*viRMf=~um0oFzkQznJr!-*a(cvUj;7a2DIT+wFA3D!P za2Xn++iCz6;THLQ0n3@ zXJ^xwi@8i@kP{{j9!wv9H!y2ICpy?^jIX@&M79fMxR?c@oXng8dhGK9>Q+5rGxs{v zdA}z3%1U5ra5PG9+RO*l8=+U66Mos%#Pn`VLB}furZE$7T=*f_>HVDTuoyy>4!gL8 zD<-0%*mV5tULx?1+n7i6Yv#K3x9EdI9CE4ds2d{2rX12ilQXjHm1sE5N^?VZnh&Rs zzhw>0-P9zFE#;$gXP|ryjf4ukvCmQW2AYuRx(fb3xMgk>2 zf5D!XUSh9Ook%TP5;M#7$a9A~+Qqfi`ensYu~s{Ky5j~P*>ss5=-pJiQ#_gW**xY$ z?JRL>sXgLS8}xDb1*J|B6jSsOYRU$o&G%8*sqqn_*dq31Suph^oo8+5=5w3#QZTjJ zN%S({EnD9ji;vXCljOajWE0P^7PnqVQnSOZe|~~|juhQoIEjYLQ(!r5J?zETy02K*;~ zizNP&{{P9}qQCXrr}wv>`}F#3{}%Px{w?}j&wYA->$y*_&-QOopY7kGf&YovfAY6T z{67&U8}#e$Ck^)Mxv*C|_?zbgD4L zAxtkLJ~nfD+6*f_v;PaN`=Cu99MuO$_d(k}IHnKU=?Rl5;-;s@&&Uv5XZ+8B62kC{ z|2a&;!)Jo?M8QGk|DG)|+1+)No-mSPdfflC9Xsa#H~xQ-oc&C7s2mL4cuvY9sc_k`U^`;SObLh-`61_ LtbxLk6xRO&oiILy literal 0 HcmV?d00001 diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/PointCloud/PointCloudBatched/tileset.json b/packages/sandcastle/public/SampleData/Cesium3DTiles/PointCloud/PointCloudBatched/tileset.json new file mode 100644 index 000000000000..2b2b44d568f3 --- /dev/null +++ b/packages/sandcastle/public/SampleData/Cesium3DTiles/PointCloud/PointCloudBatched/tileset.json @@ -0,0 +1,21 @@ +{ + "asset": { + "version": "1.0" + }, + "geometricError": 17.32, + "root": { + "refine": "ADD", + "boundingVolume": { + "sphere": [ + 1215012.8828876738, + -4736313.051199594, + 4081605.22126042, + 5 + ] + }, + "geometricError": 0, + "content": { + "uri": "pointCloudBatched.pnts" + } + } +} diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/PointCloud/PointCloudConstantColor/pointCloudConstantColor.pnts b/packages/sandcastle/public/SampleData/Cesium3DTiles/PointCloud/PointCloudConstantColor/pointCloudConstantColor.pnts new file mode 100644 index 0000000000000000000000000000000000000000..8ae19e39755d2ecf0b8e03b823997dac97cb02a8 GIT binary patch literal 12184 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 IkZGs?4}r@cp#T5? literal 0 HcmV?d00001 diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/PointCloud/PointCloudConstantColor/tileset.json b/packages/sandcastle/public/SampleData/Cesium3DTiles/PointCloud/PointCloudConstantColor/tileset.json new file mode 100644 index 000000000000..0b76d7c655a0 --- /dev/null +++ b/packages/sandcastle/public/SampleData/Cesium3DTiles/PointCloud/PointCloudConstantColor/tileset.json @@ -0,0 +1,21 @@ +{ + "asset": { + "version": "1.0" + }, + "geometricError": 17.32, + "root": { + "refine": "ADD", + "boundingVolume": { + "sphere": [ + 1215012.8828876738, + -4736313.051199594, + 4081605.22126042, + 5 + ] + }, + "geometricError": 0, + "content": { + "uri": "pointCloudConstantColor.pnts" + } + } +} diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/PointCloud/PointCloudDraco/pointCloudDraco.pnts b/packages/sandcastle/public/SampleData/Cesium3DTiles/PointCloud/PointCloudDraco/pointCloudDraco.pnts new file mode 100644 index 0000000000000000000000000000000000000000..d12ab7de59e0e46e5b2acc7405713e940be86670 GIT binary patch literal 15968 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⧁fHe!T_%gQX;t2p<*I&@~utP!Uv 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

*YS?1Amo+uagZpci{(NqqdrzMH+?si9 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 literal 0 HcmV?d00001 diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/PointCloud/PointCloudRGB/tileset.json b/packages/sandcastle/public/SampleData/Cesium3DTiles/PointCloud/PointCloudRGB/tileset.json new file mode 100644 index 000000000000..fc39bf5c86ab --- /dev/null +++ b/packages/sandcastle/public/SampleData/Cesium3DTiles/PointCloud/PointCloudRGB/tileset.json @@ -0,0 +1,21 @@ +{ + "asset": { + "version": "1.0" + }, + "geometricError": 17.32, + "root": { + "refine": "ADD", + "boundingVolume": { + "sphere": [ + 1215012.8828876738, + -4736313.051199594, + 4081605.22126042, + 5 + ] + }, + "geometricError": 0, + "content": { + "uri": "pointCloudRGB.pnts" + } + } +} diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/PointCloud/PointCloudTimeDynamic/0.pnts b/packages/sandcastle/public/SampleData/Cesium3DTiles/PointCloud/PointCloudTimeDynamic/0.pnts new file mode 100644 index 0000000000000000000000000000000000000000..46dc632a2e16e2c816d7b65e5154a2ec56279e5b GIT binary patch literal 33404 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

{u{j$_~Vo1tZo>5o;EV7&Jo+ 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 literal 0 HcmV?d00001 diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/PointCloud/PointCloudTimeDynamic/1.pnts b/packages/sandcastle/public/SampleData/Cesium3DTiles/PointCloud/PointCloudTimeDynamic/1.pnts new file mode 100644 index 0000000000000000000000000000000000000000..5a1c21cbbe581acc4b47e4e4056538cbdf7414d8 GIT binary patch literal 33404 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 literal 0 HcmV?d00001 diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/PointCloud/PointCloudTimeDynamic/2.pnts b/packages/sandcastle/public/SampleData/Cesium3DTiles/PointCloud/PointCloudTimeDynamic/2.pnts new file mode 100644 index 0000000000000000000000000000000000000000..6bef4d11e0def3d93789c2866fe02d30b12c12f8 GIT binary patch literal 33404 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 Z{je<5eoyw?!@j^&U3ci9oSvi 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%0DtEi}`(xpp#czAevdWM9Abm`J%=FFL^R;@}( zN^0G@b&VP|{{0pLrAn2mR;^mIX3b(^V(QhahnjtSe7wB8@TaJN}9$P#Y>o&oTUjgoFbJ4w$C- zKW77Tg@0*)8JIeC>gv_27c5vXbm&kFyi%n~`SRtzh%akcorAn3BwQHjsb5fu{fn2$AWzU`+tz$V*3C4xV!4&=L z628S(kjWx`@K?0eym@m>CWeD@{5DUXJopezpd?+obXZNa3(0>KV!RnLWWd)YN|a!X zVWOHeX@WU)c6P>8K^_y1ZexljO`3#1F&xOFHv9RYR(a~5?USSWQ8>j*Gpu?Cn^cPz`<$Ms1YR5IyM*v z2tXe&Q8><6WgK2i1%`~{iFS(>D~4ZTqA<@mXqaa-gdZ^U12zEqfWM*%^cFLW4x=^< z6K4b`1#^gUw1R#@5<|d9F&0c0&Mzv*?4d0Hsv0li6C586c!(Fg2&G=za;!=M9LYs@fq7xWL>TC-*i z4m-{@Rs{2aRxlR)7WEGwK79G|Oa*E{KmYxpGZ=FH z`t{qlZ;!rVCh--HEn1I{k4N7|j2MB*LQtL#CrDZiShnhO{_Sk5hKC?(H113oYDHfAM^q6Z{E-%rX4#R>H>QJi-?|MZu|D_ zJ96YmoQr>p1+jm#gz5UXT`_zN^WQ{at+C2bJ~&Fa{;16^e<%W<#~u(r5_R8G494j}p`XK%em~dB6N0UU0ph4)&p-fm z{yT#hCVtQpR01^xeTcFAJFrlX*!(!}7$ejLP6w*O4<-jQhKA59Ofr5jb_n1HqrkUl z8Zu}aKj;;@SgzI_g^KLdDM?W%maFh zLhQqTGmO8Y5=;n`237|QVeIyQGMFp$9}^DkfoVZ2_$y`ubApA#ipafz&i{YR281zW z3>@8t`bBM+eC$>9sl>gjm5u!ZQrYB?_RMTWBWH8(i^|` zsTy4;yrEAipZ@>;+8`o4I=sFQ{{3vfj_rHJc4*soNJOt5z54#|nkwKx{Qp+gxJpEM ztE#RY{`cqj7q$Pd?;F)_5LK;qmB`i&s@JLi|L7I|>FuQ00(4rwU&PrlpOg+SKtfNh zC3hB$p(j?PV+GQ}S#U@j=J_z1U7vA)hSW`>uk96Swx=m%>*^!KCu2K0u*@YId>|*g z`@JX&dG5|$_u;hM@HsT=wjerV{{eET%K`HFWgvaObUMwjVJG!GY^NKquB4^<=BM2P zGSg3&u8_HXOtK_71AX_U3XNXWi>`0ghwj+eh`L7m()~B8(&5+A$nHX3VU?d;CMjJg z9dU9neZ6BGZ9KLcty4CT&T0LWv}u!$b&S|f$K-uU0t+o8hgVmmF~54yO_9Ut!Rig@ zti7+vH22dsr*##X{{bhqVp3b`9$3g0n&Alwk`1Xp&5#uC^g5E!&VIv-cB+{TBJ$d^bII zu_|r%aHVa>*<|u}=6Q1O=?;>oV*<%=lacFdl5J$sK--`W&g`kSf*#~1vBwu8=krV^ zqqYtsTGUTlpra*;zFLwN$T*Vz_?V6H3R~#-S`Ucl!RfZ3Wm(Cx45MsEmM$jKPQ}sb zGau85!(7>p2gtws(3vhT_{(;53L~8sKep}qk&S$qT$gUh_=-9m319=JRc3h~#n7+C zGLT8X50FzgPmvSbeMz?VBT3xK1Ulob8!O=)!N|6n>_YK#G-~X8s&6kx%hzs1e3P!( z7Gzv!v)>#`v^G_#^RJcEyke(Eo?fGEQkK(ni>lJINk>SFbp=V&oWE>uW=$gFxBJq3 z^^<7#e*3B4t7Y{0uaWfegHYNee|oyC@+wjz^KDy;6&=F%%;`X4Hb&92E0$8%b#65D zT>(0(U|HJYP^996$3-51_lRHKd#F z6{a6929s+Qdy~{#38Y`&o3<6(9uS{r<>@$IcTF<;q=|AY&2?LR`Tp?chYIW zX5!}EjPShYY|C?xr?)R}B<0=akp`(ct-WD4IbF4pZQ;35HSi2zcwRT0#d_zF27EuOpT+fU!SIfE4`vG`vlTx-_N$EJ13C(@zaP; z?oYN-&A-|T#gwPdGMu7$i{xSJz87QO3wGG1mfb-P$9*TOyjPOBKhN3LXQ)A{8f|E+ zPA}=wuf2xe+;`dzo}ZdQQyjhI0ln|9G12NqMWw}t6KV_|5` zA6d!E#j8ntjdrxxxB4Vg;{tS&>vlSM*d6NC?*JtoLut+rf5JXCSxq*adl2@t4<|Vu zZYKJBXZmc;S{gd&0$u37ks8Yi(S`fh+jb?MCQ}+uCzD5x0WMd_k&i?KFvbY#LyC?2Y8zX@ zi}p)hLF>l7p>IAovFnplX_tr=G~n4nTOGgCBwPF}lDNtwCBHa`>#51MUUrzoY|!W< zA>lm#^yOG9qf7sm5_qKUusTr2=EK?=>`SGDYuQVZX zBf_Y|FPV-Xd7OIPon=d1yMuhc`HF<)4wx{hsM>|4@od;?lPeGOWw*&1@R`EoL>+F(-V;$h;qVhU{< zcAR>|I_UgL{b^w6T2ii9wy=VkKG`l*&OkTz*Jvj*kTy8}mTv3m!%ki=$nKASM(5HF zH0e_>Qu^mvTcs1*327TZV~^FQ$zR>slbY37p15%K%*&0Xo1Z|BO&&%1C2p{JcJ&D> zvacA`-i6T6#H_65{>to4dmD?Nnt^?7HImMJ7ilxjyd>wdxY39%mq_<2>FE1AH|UMa zo-E>JE|$CAC3@pPVOp*3dJ@)WAkDaZHg&{*wuSzTBYlUDptfEq)KMjc?y5hA#{ca| z+U)nEIfA!RQtK9ttrTy2KEcP9D|idJl;4}SD_D}cU4BJag&koJR)*0Fty5^}n9uab z<}J3VId3J&}CBT-sLb%@Oh< zsXVRUrz{!)aiMF|zn}x0RV#zn&(OEwx(bFgIkx^|U$*i`?q(+J6bf$B5>hs=- z-I*B5u6ClVcAs2q+UPYj$A;tNSY;P-DR+G`BV8SuHsc#PJ^nWxN<-Kd&BmS#$j%zi zOQdxdFAnRNR+l>Uo$>c%r+*oTH98!Z`+5MQlKT()@t$J*$S#U0iI2cO~>%DB{lPi%^HFuKB z$=yiRs5xY1hpE(d>m}_pXOSws&_EJs@$ z541JfH>8f<35{pMHp(O^OVhP4y2qY0Spwv{G6M zz2@1Kj&JgwTr8SO*7hz>ulA`$&;OoIUf174=XB4+3Pj{&$T==gPru6nsWMzHLS)*P1{E7Eh#IcBIf7tpn)YJa=rX zBb(8il}^%}e;?B>HFi>$=WmGjuIkkL@K?GerWo6J#Fh35zd(+r3nfOK%5>4@1o~^j zU>Z9#fpo~&mTKoRvi2DwScQSd$+OV()N|exQvci?o4Ggxoz<4ooAxv^y~!z3X8tMq zCci&R&QX)hJ+g_c+?+_dK0jf*i1)?Ty$0=>vkjf!;|l4x+>I`-aF*t^Wng{3o}js% z>eJ4BP7I@?tX|wIMt%LnvbRZwvDCH;kD`7mrgWc*98*q9Y~+Yt)Sm~UL?g9#*n3AFN+9MomsL)($NWo_9T7bGbqJZZ*>>1|abi__}H4BG0>8*19z zSJ|ldnEJHmkV7Oq!$Di+QO9ga!)uU@Zw8Qc?*^0QN8N4T_juCSKPTt_bA)Z8^KMeo z+(jrWLW)Mmhh}@#&{n+bQx2z4KjpQZ%7A$L6&lWU%o zbf{a5^yz$r6zDyWCcb(==g;ya*%xVaMu8%@($3oeD-UHZlrJ=&ed&s|MF9eO~Gg=(G?R#&HF zPD6U7wT-?jScv8g>`To{cd6ULf-J+tV(hm28_MtJrI|;$F?d+S&-x=Cl9TgPlzg^u zQ^`AOdr5AvqJ`u^BQi@K@kGg2PrFY4tN-5ef>NelGhfM@&mNI7v6=5n9?*E6WLwP+ zQvPnuF66&D7i=FW%NOE~|F67neO2f9#80w(lGk?3AbAG=EahXm=aA(d z`A*96XCHgW^2(VSOKv`FhU{B8zER3w@4a1?&wHcBo^|6oClzZX>nxaY zfaK~y)gmUOJZVarlxf3TNq#g=t^10BuChG)>-loM z&VODl%Uk9zAnS~Y%qz=lZ}*nvA#3rj{l7o$-{zO)4<8(rlRcd0U1%2e7`LUKR_Kgq8) zmsIQ&AlsS{+eGrd)_Wv}r+1e8t&}0Zy*z5UEI+j%pDd5Y+vvZ!n%g5;a<^}4U4FLD zFZX-4A<)2QEly&9{ zRNwl3Qv1C3mN8PkU~#oqqs%w5d}`*8l6Te^D!Jtnr6*sV@R8+>vu%>x((R$_|BRGU zvOg8m7ndB_WrdW#Ix36g?>#uRKjpQsJ-^zYE20F=d=PXLUc?5Nk zbrw%m_f(TV>b$fyi2Sy!eWmPwo47*q+qZrXWn1oN5+w&7Q*ABr|03n{Wm0Ew>(aSW zepAISlE?Xdl=69_%gR1%JEzv@Zl|`gyqcHVGsALpm*q!V$H{t@y2Qx(Z&oQMWkR-Q zmwehyotIXFTFG*s2TD(#s;TC4&PSzhTWszo!nPKr#)qP z;d0YtKL_VqDfwn}UOE3=ZYe!;U}Y2eZTc@RQoh0_b#I2WRrX2lj!HgL=~+^K_hdE3 zadX0Cx&M~al6U*&k!|gY&mwv5-c_=1eou=_`EEfCrOb#Xc3D3C_WZE_bk3Dexn+5~ zcy(9CT~cc?oKBW9g^E{@b#4k$cT>QQBq{T|p0ab^rrwd|zWYW>4oVD{^|-;m^k08E zo;@XHvL$-R@?-5fO7L9;Ovnd;_&)O(u`>k&gDP^)Ysw>&!<|SGGStqroNoh*Y{G6`N)Vx!p zq}^EER*G3_bK^tzJp|2CVa#H&1dpzwPzyNSCZu!?knAUy0Iq9D~!%4`RT#_ zl5b@1A=^#3T~wCWDW%qHLb@ALhICUl#vGfvE3Xw+_ei#|#d6=4-1Sa=>)d65KyquQnqyEVAY3tCz_p0@c zFJqVGA!+K2EUdCi*4aBk?c1vn>YV;`QTu$*{!Fr-k|F9|evn1oFXUY@*=MuaDp~)7 zhqonfnb}Tqu5s#&3}2I7mgg*|?#JM=$7Q=){gvHS?!_?KmPaFXcDmGzm-QTIS6j-| z8LI5z%z;WL%xbL8(ZPtbvaS0sl>HXmUg_k(b~|PL@z;Z8{XN6ge(1e(lq~`M_M+Pj3&^*0F$^vOj&JUQ7A7=#G-pJ#H;!-d@})%dc)z<4T#M?1zE7 zm987pP@Rje4o_Ln#I8=V|7nY=%knv^)!n^MS2{T;Z$T+@t!{1kZTL~8PdvVsT)da8XXUktQs!PMwf`SpS2h3w8d82rxY{#KoRxlSSkaI&)zZ}Zo_(%t zfbcy_Wm{JtDt)-(k-7(;3~wf7sy}Efx%dh74sE+my^*i|Z7pRw98zmB^SnB1%lmBEEa(6CmY$N+@^qGbtNUFkf9L3T z$-7soc^EfI-Q6=H)Y`55tj^%pE(hheR|=@REW-=6x640pm1A@(c}ni{&&Qj~^3wY! z$-cesPG$L)S8Ary5G1gfvnz;jPqusNGrZb7P9SciMhYI{fDN5wfkfZIwQ! zUg|Ai4plylkzC#H&Y8Q&Z_8a8FXtgH&P{T3sdaL^gZFlmVXfc&=cn6I*}%$r+E zzVaeU$~+j~SMr$;YCdD~hRO1P7HU3MIjeI~W0A5;`^Pqy^^eY{{1|7~I?H-`OnNV6 z7KL7t>)4`%+CQ24HIy>0?ea@*(_76|%Twt8C zb$d2dcSqwBr=*OFj~YuquHMcKiYdEj_a^mzY;>ZY{PuhOT#|phP= zaxdp@DPQfTvL%X{z2!QN9{gRc-794SIEShE>AqHR)|JYBF5O(6!KNFOPH1;Sz0L8T zrj>0CZ>jE%>UGtgth6k*l<9UYRQ7*h_&`}6QCi(8EoaS^CHHHz^Y^FPAJYNQO#owMglKKmKGAsR4E~2NDU-(b2 zR*#cDoFO}v4vHk9zlIDD^+yBLV6T^)u94xX!@(vJd-4syFY*&Xr}IA#Kk} zK8rk}|Mr`6zOQocwc4TVXP<0pjN96skTNcB&&zsd?^SbkW{+#9&P4&$psV6NFL#tEc-cYlJZ5o7^B{6=lZKU zPo7izyoR?r`>E@do_C+F?1ur@n#=kdy;Wyns#!_S=cNf96g^q*SvzVGrJ#pA?vK1pmf^Knl5twC%jZP*ws1@ zrTo}j%AT)YRoUU~{AWm+JulU~os3swKfbAftbgSwrQ2x-b=C^pReQeM)2(uh<8P=~ zbL(%#Wj$SERevT;Z6NzFyQ$JenVu1@@7raa`8H&fJpV+L+=X9SD|v z_>^1SBR#mfM`lI;l;1X4xLC^PZl~TUZ7(VN&Guc{y%qB;mft?iuKW_WZn(=nl&yS4 z%Jf*Q^i}5?fwJ5qQrW0QnyLL+;d*x2AHT)QHrUnbw*1z=uR2qM64l-a+*w4*ys4Z? z_D8SoF3at`)S3oIC?BJHVPy|bcUA97mrv>Bw|=J5V<+8C%JTD*mCn&q`^$EJ{*V69 zrA*3i80Rc`WcSWezH$X+pWF@3EX$vMNRe|=^PM`61M+s2GK0>lHS&19PRbWKr_S<% zCu$F5X|MF{+5}~vxYbg3!N$&9*3-Y2>gSQjo3j7IR+p81_!;#$5+VUq73A0X@5+ayw!*XU4GmbXh+NY+#LzVdf% zNmYCJeS+GbQT=1(x20yNd0Tp4ll9wcC>@)}Pp$Rtq!vHNw*Y0<5)?B~yQ>fXPdP5HY@9;++sbj_{&HdBZ?BYyo3 z%Jm)bw~&-CR6)&o(qHAL@=ve&oZM@){C3GX;XjbJ9Cw-OvtW!hXaY@aa z$#(0cQ~sG=-IPzbT4}Xjk4LHX+Fawa?8Ea9Dh81w@{#OA)Qa7bSI;>ixy9jlxi_l# zDZ3(J6Ol44yQ+KPQ6FXd)reBMCG-D?p9U0Dx+Tr&jO<(XkNM;ntN&I0x@((HN}02B zVx-LH!Row!pP>9vJ#8JOe3L5b9DS&`O_mRBsP^!*JALI?rq{|Z>#zT!vE+~;8RWO_ z`_s$vxm!oc`MKXzy{Gag+>&*+Z=v*Ok8TOFo;ux>?&|tS*;7XO{~|LPxqrMaxOh?jjRUs(B_vW!)CrB9Vwvi@&tlVpFER85rM_6Z&&%UAwU z`}XO4fBEf)H_A5q{dJg>uN9^AgJXco2l!Y`+5e4VmHlvOp|S(Z`6&I6d|tij(rZd* zdS_94toyf_vfau_N(bh8SV8u)`!Ad1f?bsD;ri~e{I=(O6_?5AI#|lz_EBq8_1!)x zzv7g#sp2Ln9ay5TP0nE*FCyzX8l=u$#2cme3isJA>%9A3>B-g0m442*Gfv8sj2bTM zOh53jET5QF_4(c)Wz%k7ukPjc$sOglm9EW|-_kegecJDn+E)jgs6Ftl^C&6*&fZmW z!zU`2@9Q#U?=A16?t-hK%8uQezL)&=PP09d*UVCOLMk~b%X4PvCFgVL|Hxx8v#Gm& zhi96U>9$wdIeljomgBuKT-nuYHDy0@ceRIqEmG&&T&cLDr?Ttj;J?ZH-&xM$tsQg34)K2TV{B~NVr&2!mCbbsTA1##SJ@b zAr_gX-*fVo^_(rF&f_ujsw~eRsLs*u-s*n&x>wcv)dwNe=hH@ zY^tI&Rl9R`w3K6P&XnJ#=m2%kYK^kUw(gu#cVEst>Kt7@uJ}iQdUvEYR=TLuCS@00 zxpzU1D{q^TvJY1qx0h`V9Iehsht6t!HBHx?v~-%YmR@twGH4mKOq#2fS##5}Xj!#v zT6QgmmQ!=ra%s7>Jer5*spZwYw0xSkmR~EN71Ro8g*6|oh*nhd)rx6;T5-)^E1{Lt zN@=CFGFpIERx76kYUQ;GT96j3Rn$VXN?NEErr9*2Q5+>h3)d=Z5n7~HMXRb+)2eGx zS`DqH7OmCNYHM}0x>`N0zScl%s5R0WYfZGKS~IP=)<2_t=3L!uXWHm zYMr#sS{JRW)=lfK_0W21v05*!x7J7NtM$|RYXh`_+8}MPHbfh$4bz5eBeap)C~dSh zMjNZeY2&nbZM-%?o2X6FCTj`W6m6FIQ5J-zOtXV5e1nRHh@v+ky6 z(X;B=^z3>LJ*V!j=hAcQd2|omQ_rh=>G^bTJ-=Q+FQ^yN3+q055xuDHs~6M#^y0d| zUP3Ram(ok?W%K~OtX@tJ)XVD?^dLQ0uc(LUmGn?OOtN9d7y6}_rn zO|Py;={5A4dbD0kudUb7>+1FN`g#Msq25SutT)k{>do}#dJDa!-b#s|D&dN;kh-b3%H$LhWG-g+Osuij7ZuMf}%>Vx#b`Vf7nK1?63kI+Zz zqx8}G7=5fBr;pR)_3`=yeWE@|pR6b7Q}n6&G<~|BsL#-6>Ph-6eYQSFpR3Q)=j#jf zh590WvA#rKsxQ-*>nrq?`YL_3o~*CY*Xrx^_4)>VqrOSstZ&h`>f7|~`VM`kzDwV& z@6q?_`}F<#0X;>x>kggkrhZUAq#xFg=tuQq`f>e)eo{ZBpVrUlXZ3Ucr=hdz8iEP{ z*tr|sNOvjHAl(fjAkrzRba#W4f&$Vd-6-8iD2;S?cQ;BX`2C3OaSKPn(Qqsr4=2LO za4MV*XTsTVE}Rb+!o_eYTn<;l)o?9b4>!Wia4Xyncf#FpFWe6g!o%<=JPuF7)9@@j z4==*Y@GATr{t2(coA5Tg3;%}y!u#+c0{#$@=a5K5CJIrBMs#8jlUT$i4snS`d_E!p z2}wj^l8}^SBqs$aNkwYXkd}0$Cj%ez2^sm6Ok^etS;h zL}7|hlwuU81SKg&Y06NRa+K$DD)0prsYGSIqzYeAm1@2zu3#vawBUYBRs_ zTbtX$mbS9BZER~h+uOm8cCxcw>}of=+rysrvbTNgYd`xtz=3|}AO}0dp$_wVe{i@X z{L!Br=_p70vtu0VILAA|iB58|Q=IBFe{s4qoaroQJIA@sbG{2)=pq-p#9#f*r7m;1 zD_rR+SG&fwu5-N`+~_8Mce7jE>NfxIPq(|no$hkCd)(_j|8lK@*nypx*j?Cyo!EK`$81z=MKRFR z!WO$bp5GqdbLRfs@AH0M{y49%!`hQ;*37K6^cpl^XsoIz%GgPYvK;@ryoRD=&W( z-Mmx7I*sZ@NBGpJf>Ovw*XmTOPNV2L&3tOKt5UT}VC5=R142TohJ*wM1y>8HP_cS& zwV-NMss&UItWqU3G%&P!h3b_r=eE%*+ z_WAGZ6pZs^`{yoNfQS zB1zHdoNIK6qZO4b&iiVn(?i>zaV}KAUJq~eo%8lZL58|6o_Z9{VXuAMjady6ICty* zkQMy0jq~$KYuMVv6wVK7R%8B+E^5-eIMF=i>jM-4t;cl z`j21qnt2nWQVZ40D`F_do%=f&io8>X|0DHdPiSyl~o!RaYZk)5;?X(V!^5X1O zwgCw(<;(foYzzJUwIb)weo6HB#URcD9iP$Z8z^U|_4SNr5e|CREN2!~+1J=v+?Dfu zW@8Nb=)rmOYJ&xzEy=n4$Pw)4T7S-0`rNXn4XetzUcYQ@T7xjoV=np92Hv$fA3C#) z=KIo+bLH)~>9zAMIQut=G6DyC>1CRKO6_;AobkP`FX!X|xeewO!1>9Kb8O1{AkO`Z z#IwlLl=HK}b}a9j2+l3Nw^^>lHs$=w&6O^XY|D9M-`TW7iEfo{4l@y-}R^zD}oy^G@WP_>AVp{Dsiur~t(J6A>_3{xPPWOk$kIN< zSSexf^9v8{^;$t7h_*l8lwl>_<%AH-0E19;uw;MqIP*d!SOY zd|~KU?Nq2QXWz4B>8<$@oM+cfpl_b`=0Uw46hFu%3&E@uQZUO}=? zzhiZha~UmvWpget;Vfg<+^AW;eDzdzr9v=gGE!wvC%5HXbGx1PV?_dg$bP3dG$&yOt$}(Py9?0b5c0xnK_A8SaOkbeBV>_pq|Y+ zu8f1O!#A?z0m)d$e7})&%e89QH1Nm3^4b z+53pQb?@9P&Mo}U5KE05&Z}DupeG-H=NyqIg>Hd;FzfF;LecxfKA7AkAk0`XbvuoD z<;6Cn7B)&(N#&f8@RIGieUWp^!<$*i^lZ*YcGh9Xs=epzxqYB@(;HPczipkolJre? z;#^{7D_VJ_8)wJe$@J48FV2(Zf1>}uKA7@xcXXrr^(=a$l5RcGuef2In8P{m*Doxh z;t$SC3hiUP`#I>QOmLs}ETE<<=NXMQT0eLc=6rZSdvf?yNzUu<>U7+3f6ix{Y@{_| zAIxuSReer#!9JM0ZgyRxmz$0LzC|o~ShTcJA;*cc-*(k_XLaLzb*PmcTP7^ZVgT~ zW#TuL(yb4zn#nc(co?}CMzJcx3LD?OUa*ff%5k0;wuxmwbl~i|za~rYJY_XyVo!9l z4(c1nd3(}&;{EAKs#$(|aa;N`Plmo`iB;08r zF}ePYS~Q}XmGhblo9N*|Hq#hk)svOXi--_>$M5HSfA17pzT8R9Z5N-R2d-steqJM&PGKL+wzB$EH-0VZPhD?K zvKIZG- z-a3S)kABa&Xpoiq!9JMvpPi-ZFP}Ma{^D7~NGOs-cV<*1HMV*frB3eW{A18_wsY`F z&XeYCWWmL5a4yh3oTZ)4;XJN;M{9$jKR9o0zJWZS=b)SQoP61iCiigVd^>9|9R~Yg zmbWrLH!7$Dpi>{)svuktC`k76yc8TJ=V79YS7Sm zIaag&{C&#l;{%g8Cx_)X)=gQ-LYJt#p=2hOh&htave(ygZa+r5mQUo)O_V0|0?%ajMHX8F5+O6yxLW?M|Y z^t_Pa9Mh2_6vN-`9;<%diI?=HD&g;_tfu3gm89^^f6{Et!|x_OxecdKkUIXuT+!EXZ*t| z)jqG8-2GNx7BfDUnEa^n32XcQ24|aX#mTWbw$v<-?O%mne^iEZwdJen^RW7ycZ_;K ze=qFMdC^Wc-4XV|l&|#F&xm|okyKf;(K;mF-e|aSHRrw+PqJanA8~%yU?RI1SCE=A z*<0UPA7q7ab{iD0eGX{P`BQQc>NITv=Z~Qa>AV38IQK7_MLl63%x`0V=h2hW_j7Kv zxuS8(%Z_F&yreA%ayD+o`f=Vi>oR+Dwm#>|+h#Lcp8=c)EO2GBQl@hropB_kV9W~6 zBR<;FwQf5&AGkG*`mk-EVMy@qIWw;rg8O zn~nx;1p8ptUwxg8-VgS{`C#`4`OD7_X-FE1`+__W)>xopHUw!^{7d3Vnw7PL2m zb6+Qo86EC(&Mp>Zt?&4O^QX@{NT0Sgx>-+u(wSDO?94e?IY2+!yL0w`@Qoh1<;8jD zeqvNrPSG~)lIh!8UPj9H8=QM>`oQY8dd~UviCyfH%}>rbC!4d1Sq{1>|1#HN>-!z9 zoZtNzPYz8g%=yj4NIJH)H|N2LTWNSeInK`~zorg$)i~!qV`p5O|C6nLWp6A^KEWD1 ze$F{`%>%p5ok5TdVDSaDelgZN+G*;0>HlA6!HeW-a7gbNLPGnjOda zPD)^IWM2-7dIiG8lIYk4oRJ&UcJ+gF^${Bm}1PG9E2R%r<;)&+%JnwC|5~oY!=;)u*ng&beKNuYUEbSE?z~^Ljxe4;je33N&TS z&plz^o;2Y6Z_ax5cwSk~Y58if%OUoh!-B)DqmLiAn(`6P_mU0eMsqF{(v5Cebu-m0 zpEB+seH(0}nf$xs58Ci~MPhPT$&z}bq}80KO)YBNTvdogcR6ic=>MM0ob|+NvS-9j z*7eR>&h$bP7Td8Z=N0aAt#fj_rEf(ij{n7`mcEv1a_dcpS#Vir&E(V>y;#RG zm5Iqq=Nz@RN?XHu&D%<3!obIzi?Bd?HE$tm$~dI0rO$eVa-NX*i2h7z&-rJXyPg~N z!IVjVSjHG%;hHwQ^b3+Z*3OvsegrXjncWFCX!9}7mb&BF`E7R8EMMr5W6f5}a&GWz ztM;*V1J0{#O3>WN12~`Rx|q(joxxeJeUlc3eK5bhQ@~YEY`cT=qlFcW>2sctU9nwh zSsy3k#_B@U`($kGlU_z`1zc+;q*BB+k?A zX3(AI$pgYF0JAK5anfZ`(}kU3N8G=s?Z|)Ba`o8qDCl z>fREz;`0j5b$)uY(uq4bFFTu-x+}`cnYukBA>T4MFKjr59@}uA^Rf72v|*DEoY(BP z)nAOW(ap9>y$d#$)?P>>i{7QZ;tCoi-zIU6F7bqITX}%q2)X7X4v_;SsXY_%h51i3AioS71pDFsx8Dr5g7S0%>jxln^*bR)`z}Ok) zgkesY$(SpKx#EmDv|pJDHFhD~6w37laotgscPok@ia zA+RBwVOuC{3uo9I3Y%lvpH$c)3R`5_pH$c=9X86eGpVp$25gsUCkbpCgH7WMTgPDQ zOxs9c0~u@}XV^w7Y@=x>32Y{T%{1*Kfi0!5rKW8pu(1?2mNRTGh3(}Go24F$Ix-d;EcP6fx8FAJx9l# z#K4_|Gwv!3cNNaK!!X=oIOA@^aJS)%J5MU^Je+YCBDf22#vO^`j>H*vCyKihXWXfD z+^IO@uElWIGH_30xPvj=!8qe?#&9>|j60hZcQ($r%Msk=IOC2-amV9~yC22fkD2x0 zPDpVl|UxWiN2;W^`OPjR>Bj5|NYou4z_0y^FTobg7`@kZc`w}XMV z1H;=P6>kcLHw9c!O}p+r)ym31_@nDBdib@s^=@%W%dUhvJRH8E+pQ zZy(Nh6X|#pamHK8z*~vo-9+$)Vt7Mw#@mYFZN(XHE`~Q3XS~Hy@fPEZHyXhkjWgbE z6mK`qc+*k5>8xg*cv6^#P{$jPGv0;<-i8csLy9*e!<&&a-jWP&NzQmg5$;tgxQXDQyc6mMJeJxlTC)$!&v->?*KVFPbr z^W9DHMrL>;bH>}5;q7d`yD8q(3~y@Acxzkn*5-^iIKdk{#gxI@oZ@Y+nT$6(#hcxH zcT>FODcV2Ld|mcSTy)pIK%fs;d|i>pA3ahhBJIM6uuhH@Zsq2 z;c$j;$AE8#z|W(@=VQRQ{Bd~P~?Zk*wZ)8UKb3?H2iA00E>g71#OcW1x{$l%js@ab`euaCjk z#~D6AD|~>Q;Tt6I4RVIhkiuuk8NNgcUm|Dt7%6;=@QW8_@IC7AJ#vOmQio5HGklc{ zzDfhWN-KPr3_eWG@NF{qHaWxRX@$>|Gkl>0zEEb$!$(TtBjpU=DTVKpGkmHPK2^@} zwd(M-a)u99hYyxBe6t38vj+UM1U_2^pDkzjav6NN%q)kG*9spmXZU^ze7~IG6Q=M9 zbB3>&!dJ{0K4c0XGH3Xfb@-M!!{@BS=gb+tXal}z246IVkD9?p%^ALH2H!Pj__VF? zX>*3JTZ6BgGko9_K5)+PjZ^r>Im2g8;WOv_qrQs{Upi;_*md~WIm7pE!1vDJho|t# zGx+2=!&lGXtLF?KK7$XRGkp80@a=Pk&!52O&l#}*idX<=#0V&21e_5&&=EVZn)M^5 zpd+Th8LTPW_*Vt)RVqO$6FKU(} z7Df>Z~59 z`68)^IdVoUk|Gw#88J$V7$s-KE-7M{oDtL15!2+1Sf`FyCuhV!b;Lk9BR0wq8#NGz zwIXK95HsbBSSmv-l`~?jR>W92Blb!Vd*zInEJaL~Gh($Av0BcE;p&Ltaz<=dM{Jif zV!k?JzMK&YW{3qFhy@eGh#6wUoDn-_h#hlAOxcQ|RIgo-<o*YVr^o?d$N}Jt z+yI8$0A`jWXTXY_0nW%JAjl=)j2r`s90ShCJ)p=v;EbFEikt+_$W_phtH2pK3_5Zc zI3u^gKyCv=ZUaTm14GUOXXHXK{S(2<+L895s|ayB?4m%~6V2SZ*5MUDqUjt6JtelX;Ia7IoDLrw^1kgLWSIczD& zVdIS4Hj3Of&d7PA$a&+8TsVqcIL^qC(~%>`8M$*ha_2ZBr%p#s9cSd)G344A$m^rX z!DGn5{?a`^~y`8XrTk0Qs9GjjhZa{o9ZCs0RDAZO$X>c|!3 zj2uE8IfR^%TgZ@GXdqvaBIl4H=a4gU5gBq3IU`5WiX27G$Xz7JUF3|MMv9z9&d7D7 z$aUn597u{BNY2QO)R7y>%=(ctsUv5SGjb^zaw!euUQ*;(GUQltM(!m;?j>jBWLlAv z$r-tt1i6}=k;6%m!^zBVk=sd;+sPR@pAd2vG$f4zo+**d*TF%J1wIb)1Gjee?J&NZW?s6E+;xiFbu$-TM^3wroOaG5MvUmxsgtH@#fumB z^z;l34IMgkXmWCLW@hGz6DKxo*f4S8#AeN!`TP49Em{=0^=;d>oi=S+Vq)U5Wy=;W zTo@Z0Td!Wd(xpomE?n5h$0s;AxN+mgUAuNgowaM%u2G`~J}kz6N|h>Arc9X%6)FS; z1)&v`yScg9+uP$qUteGR5&uOE5W~-m88ce7YUSnSl{ar*bj;h^8+GK*pWnvDCU@@K z$B!SMJb5zOvbD8!=0B>cLZ)urx~*Hc&dA7^I(2IG>eW#>{&Infi%XR%Rr>VlvwHRF zojZ4~Teq%x^X4ebmoFa#P%TEZapT5Yw{G3Lcdvf^`nhuDLO;uuD~G0$|KF=uuYLRW z-M@c7D=X{oY&31!v~1b3MT!)uSg|5H86O|NZQHgjTeciJbZG9}xoz6C!5Hyd%n7Bm zXV0FqXU|@`bm`*7i-!yu5*ZnZn$akRhGAmbyLIa}YSbu{6GAY(_${Ua^MGlAK&@J} zI(F=cuG-nzVg6BbwQAKMgO!3n`SRuQ6^4uw2L}hVh!TADcVaPiObaFomFLNm2Zi_q zbBLxZT-7E9HtRRaP7AcH<&;8+WM2*84dgoI$Z zv0eatizP$fCQZWMEKx8_6ru*K4(f#dp#H$XKui=S2g9#asS-ZK3_wXRE%*eQP_SS@ zs4E774r4@U7XW=j%~;1eb?Ts9i~=){=1?K#3KQP0UAtMcX02GU0&0j(Vu7GDU`!WA zhhL?orJX%{*3ZumV-E`pgAAI3u0l^%ty+a&rKhJu2e1k##IG<*SVa7w5=?KGE?ru* zXn_wg3Fr^nMLC)Vw`|!G`i5SiQFIuc#Dri|pdNgPI@hdOgJnf0QQo_EZ>S$;08kO>G6ZFP>6LwB^WHa*P%lP%pN+1SwbOx3#CQP7(2T0_rDks^bO00 zo?vpY^q4(-1%1F68#HKu8NhGBm>F!DdGqE$9@`T`_^XzfcFY?Ju{Cz=*a01eN?;W* zI_xiu0;7hJfhMe7yLR~S;pj7_2t)g;Do`7UVH6lXEF@G26=G@d6~0A>0T>Q`P>9jN z2w+xWNU=LGlNbeLFf~nDl40u55dMo!!b)TN zKnF0-&@NFSwgYO$*ii$7Q6T{JlMyN&dT!P(S*K6-QgB7Uh_$`Sa&vr$hZv zg8789VaNdV0S0sT?%gwI&cuZOT^cMOzQsJlRzUw@OvaBN4 zQ3znsF;S=!tw0#chJAq*#B9S(V#t`N_U+rl?ELKpn#0ik+SR{WhXq21(QRl2^dB{2 z&KosqG;Z8D95mR)_yqE(4IRc9(Jq?9%s^GJ#85eOc=YJe&_lG2rcnuc2rB_iMsHCS z4kMiGSS&0qY$N)KX+fO;EFunftJR7P4wHhmAcl!TLoke}4J!`2F=4_4Xc24$hK${W zc|$q00t*xk*!@A>-P#!b{8GHyO#2+z0{1FQWz@WfT11v7=Gk#!R zAc@&SAsB$qvF@;A*!55e3=K2zSAijer9q#gqN1QSs14o5YQnzZ(19ezf<9o>I9V`h z7#DOKCgs?%V;BqO?eEsZrbch^TXX<>8D|+73FwuW^9D0r(qI=K~m;#8Q2@DGJ1Eoc^m;}gRuFwj8h3252m?Cr) zE#g-Yz^r0QF$CCZbN~avFrjrQ!31LUp)FVu=q<($rA5zC5A^M?#m48T1iykL8pTNQ zA-aSXF^vEy6}AIvKsi+OuLfe?FtMl#2Is(m16Xd%F#d=!qKD8cG%aQW+rLSZCa{g@ zIaMHE1mag% zVhE#GFb)vF5}=bPL5mnEdW9CzG5is~f&yTAajg6;hveTygz3Xh!PKF}v17+#fzSjh z!MFc!-S|7||F7AAO5g`yLA}vK^z+D(BiNg;1Nd-^&(I$I2lW`zW$3UWJ^uIKjm6)9 z?KZIgpn(H=3>X?cY7l`4N<Q8}esy57PEt z8FHw@3hh*@y_QkRY3*kBf@I8&GNepOAyTM-Be}fEh15^WOXy8UI=6o^2`}_O`;p#5 zi`3p}52Ngf{q$Gb?H+SA<(Xp1JnyWXSXP_ft7u1GwC_N^c*j^0TUxYDd5QLR-qf&R z?d?g$^Rvn9Lwks0LKAwRsRPY5BbrPNI%0{~STStuo=C0VxH=>_`8w$pQ=E3{9Y8ym z@us#jwvdm-8f&5Lr)npM{$m;1C`WUCb%5lFEJJ%1Z%@~*=uA`Xmy##d6wPmTQR3}c zp12nopp8hhCDjgIBHLG1r*&+)(#4Nk(fLnG)4cCgdiY@yX@ACtJnNIGd5sGpEl%zx zyUOLJZ8FNy8{5j#`UOI0oTDo(leL%39ao*~x4o`)o=|`+^%+O{jk!ohRLVn#yeUK* z^eISZhCd-OJrS>bi>PIp;?;_H!$Y^4}u{ODE zU!L^#^dn6+JCj)Ll-6jY3n3ZP$noB(q%@tVwXeR|QvKk+TGYNOB&Bi`@!V04Oze3{ z`@KI+TOJfZ64s9<>zD2!3)@#91s|Tb*i3UH%SKcp8K3f!A)nT2lgI70IF&L&14`}> zn>5OfYMmC7UM`)q+HtG2O<8H0-P7sXll3z!V_KFX*2~LD>9~XBa<~J1yKfp9aQU0% zpL{d4p&c7&(+`fb*zOM`<)_~uI(n8jC5YA^vxO`x60d#D|3X{Yz=b6L7@|%3vR->q zbsJe#zYNy1D=j>+4>i{!|387mJAMjjS~Hy35AUf>`C?0yh)h!Vd5y?BWAg!(aOZ>KMCJP=7B`vQsAR}&ukvq2wks?KM zwBK!`NYw2N(mY=w8kOCcl$=+O{FBj@G`7qkO&c#EuP1dSmEZi*PQ(_$UfoK1?Xsb} zXMYVH@1CyJCEZBBkDJMvS;-{6z(mq|>3dBZwokiQss)*KV-G1XA|J_KFw@d?q)swh zEG6Dy3B>(QbCMOgR=Zw!UufFIWXs9mZQ9fmy~*eWG1}{S54C$oYm*Vf!^qi}_q77W z%3A2-BBX>{96293i)@Ptd=lLA)8z6)ovE3Z|SWTAkWSnA`LG))3_c* zY5tW#+LzWZv|+ufk@B7@@q_QTZpATLMEFc{|DH4LwzVd`wxR)bxadXvx=$gFQwHMi z@xIh5`W~ziKf-}r>#&bFE-Oa6Eowm5Wz?Y?>YO4YrpJ@Rc^pWyb-lu@Uo$m}LjWo5 zP>BTWr`pBM!Q^qR6J%?V?IdvG0CL5vFj;*4ftI;+zjpI*pmsQ{hb89n6Yc)AT_p5O zUh49)5qWpB3d#MT7CHBEJo)x%4k^5#GwGg`iv+j?k@0S)NxkF6@ox&u(E8piKytav zC6At5A;+daAzvo$B~L!rCJSQAk)G~5$gd1%>Q?!DSpDFFB(T>$k~PVej-BR6Z|}K4 z(!bOvKR#w@)7!Qnj=NIHRQKFkztuM6+4C*r)#wkTaO@ZIdSEiS+PW~=FyfA-mP385 z`~ydFYC%2Cx#@B(>{$#M{&N%A_%?}Lc+;AAh7Hp)_9ba$`xGY^u9P5S7QPLmofc^h zUki~dORAG9M~aZ^4(qhi?b~Ywiu5J5dLJj9-S3iu0cqNy5LXiQA{S{qZLjwDSTU{j zf{hlND&C}ljg>?_%tK!n@}w`yg_1)HbW){ejus!@$TER-(&|Ut)G7?@L!REaNwPBw z(p?J+(ZsKIq`S4bc0%{DY%Y09JGiV9v6kCP;yb30$R_cmXn4BCci$i~B>0r(*|?)t z>t&qw>FqwP=#$ynk%zOw;@;2Jx|YliYyBdceCz#y|v8%a{a3X+)o zlSt)T56Sn|7H$2W@+7_geR4LwH0@HZA}!O$p0>A{P3E3{thu}{Lb3`jCIioSY6(+{ zlc<2}__)Z0^loO@r@azDHb z32&A}sy{wK3f?=cZ6OP^pmFoGRi~zCtG7gJ?~k6hG_Wkxmi(MV^iA0$yrwPP_%2gB zF(6LU2Kk3I9@1LN^<|-!t8kolX8TKRYwek&gX3LNVD(oLcmIY~BL7eAtn)2xZk!j{ z=Q5uxE_R9dg*_&@@prSmzXy<8g=T3k%j2}gX)U#E=ed?KgC}X_uYI=U&DBY(Hc}zV zuT1T2@ebO(a#Ki4`_|gyrM8;=#tP(1sb$2y)mGBweH@9N_(ki{eWd1ks08V~X)`Gs zut@7#=wGd8!EIzwhAl0%C?9 zssG%{G&0ngCMGT?BPXBG>c_RwTF9B|5Izyuq&yVZzL%{(~snAa|zR$btV;^|0Pj@j`Ylisg}+!A6Xji++Abp z{vhqVb+Pt+dbC#MRuir8`LSe!;~TO%(~}Op`aMjKoTRl}y;~bqW4-44uDYiEcC-Y> zmeHPM6H>R^F|ujCO6|rak&GQP$mZGA$h`SwNwq7}$iV81cqd*bFJ?1R>D&N99bB|h z88wJo2bJU=dcxAN-!}`%Toq<1kfc4mo}ak4%S+Z@cGR?cF62x9bK0-vFGDXU+mH~a zzGTDhII_fzlKMloY91?(S@ySGtL1Iio_xH)v|R1yX@f(jk#n}0NXLZc zq}Gsa+N$I0wXD=?WSw`8rqtM?wQ9YM91pdlJ+Haa)q9?h_vJ^E=qt^%)mOc=5^Gyq zz6?934Ja0;ZC$^bEa>-xj2e}jZp(LtWOk}XV&1RQ5_6`Ih{K6wSdT?o%hm&HOna!2 zh?w1Ekb64WqRt~4h$r1JU^3n(M4(W&DGk$UWS$s9&L%Jk%#Oa(TEJa;6ctU zan(joTtn7W@t`F;)}hn3W^2dhR3O1WK5O%T-muJUJxPn5xmmlsK(ZIH~Plg}g}5)`nelwj8;zOk0-LP3t~5RSWXoO13|7rnCAebVoY=je_t7 zWY-XtWX%mBbt=pt5q8_i__dqKm)4z$(%4R0a%wV}V&hIaB<{0#Sua{nE$?WVpRi85 ze8!o~o0yB-{Cd|CSFIQsHaSr%*Ep}1Imd>C;_r=QRVhivKe(WUQdJxAYlbD)#tT~A z+f&KD&raIltJk$rFT0TuZI_V#b(WIx5j_cMtdbc{bG1idH?(p;dXW2V=4!8P)@v&o zj3EES>?N<~9wim0EF`X(u4MCt!Xf?NOx7v~|Fm?ueOcSG_+VIp7S%|A!zvOvaTlq) zWeS;AW1&`aYZ+2w!G1F6#lNImR$j7jezul4;)*47xIcL?AeK!2Vj-1F=e88vv5Yia zTaeoM)}q?}Na#?1GO?H&8GKK%?3nXZOPi9581@w`8(eXBomrB0&EJ(eejiF^4qHYX zZ;T@8J$`9Bv+`@ZZsaF}e;w1x4zwW~9iNlcTWZqu$L-1SUXzJ$WOq`jj{|XhV5^;+ z(SUUBI)SV^^Fhn?)SEo0`;xqWnwNSHx03XrO2ljFdM$6AE83PmRfzAeiR96ug=F;k zNYb~GtHnE_2YKnaRvQ%g#PT56T`RF+sbxXd2CY=4BN;sQx7K8{YB~916uDZ)N4u3% zoZNmu$-5nHq*A{mt*y@*OJeF4OXqE!EW;j@CHZYHlBE}I$j42wjW}nLTdk#SX}ZI* z@#t*JjSKU&@+4df56Q8dEdES;(7QZ&G@u&kyXKpAwtTU$PySWOpIRHp^+{>u%$*=| z_hC8Gp&LXzd!#{|g44X+D{a2EmHAa#ftv_i| zrTw*mn?1-(^{f^=KqWowo|8j~HR-9_bBJHYdQ!Z}Eb{47G178Nls3pdj!Zkdk{Hef z$lWSBXspS9r;@Gwq-@%wdA;WO;YO5401oG7l~1>XdfYbKJ@>@4Q7U=?I-6aD~tWn z&b&XYm3+}u8+6Xy@@?U1E%to~nH1lWbdPc)WuE@f9Bejf4asjy-3T{r-Gc*~?c71y z@WQ(^uOSJ*3E`HD^UG^q>ZoMEa z+f^o?V28|k{&^`$yL&JFTk z{rA?F5Hd~M_zK>2;e?PG;G8XZSj**tEe*O0`MV8bwEyZ{v3IyAUzspV$PZ~I>zp?K zqbMK0tGmXGHna5B)@WO~;mk+m2Zv`c{SQ5b`$$ z?G@$AU(2!QUBA)t-&o4dOcC;n%Cr!5mdHI!a717|!Nm@{3i;wkI*M{9tK_58MvL;a zvG0ZamL&~E`MBIsf*tC;6f(BNUX&ldB-_n%uA(Tv9r|93tLvB$QGVxgDZ%<5cfr-q z6%h3|Sl}qiGp`L6oLIf4;D49NJ`{R#L$tN9(N$4T+88;mYq9a7{MiK}IG}o6QRnte z7Qr)S=Lnh3tb^c(Q{=iQ4tEme`CcW6^~(6PQIxkYR$SECv9_luZ?xA-l!t8TCd#|L zDJIGv+)o$fqY~si?9JCp$ef%NAoxb7Cqlk&{=q?8J}s*%>Y32| zoS4rayM_ynsWVc@gzhOPxKedL!7q1}muyo>v=u*~mEa?t4hasow-fxef-b(jGGVIm_mj|N%3sNeG{sh~X6w2<$HEESn|IsaC(`e(9oX;@irpNuvLqCzll8zVUk? z+HyNTUvSlvvaL1#pM`u;N4W=+*De$CJA*$9p5pgG$a^-dEc&qLqFkf9J-dkVdPStp zjLF|ul%MD{S=6)Ep`)n(-#S%`&NWHz^aeO~|x+(qEK&SD7pNIkISy;C~x>iusSZCGE`7q*mfv`_B$S zzWPpiZiaM`_mhG>q`YIr#X|nzOgY9WOT$FD|L${w5Be4oZ5^1JNAR-48${pyo|F~x zeFCF}%(zymqI}-%gs}hY)zyy$MS0h$@~oVkDc52wnJHvSmaQ)8+!-j(rb_!337KC_ z{#9+wGnU3y$ND`Z^fdkC46U3&;FGNFLr7W3uVJ$Ybv@okPp z-oe^GmA0ZpVR<&KdG$!h(_fDTYrEu~aNT6NkKFQC6YbXi@k;2=mPmQ`+t#kOkjdMk ziC~X^Ge!LuY~-3Q%8_>F$2_^GmYBIW+tv{C9z z?QNk#CRet!z2{mgqP%)sZoyB|h6=u!ub*gl*6q@wym1A&Uh%d!g^bom-Z7S1%?45b{Rg)N?_Stdu=^CbN5*c>C&~*{k>_Jjc}@-6A?IgVqTKIGlck<~i0)obF4#`gbGV+g1ASjoArpSNmXL97EbkcZdk2g1t=TmMfA}N!;~pmOofYkTClQkKg5!|;RB)=i9-`=YnCu&8HxZyVA7oK+E`eCbAcb{|ot zO%C)dA!M#MX(YZ4PnY(@P#y;Y2TuQbx~)%9J#(1p2<5v_@T9;t!odYJxqKk&%wuI+X$J6`z-~RJuTm% zUAD?M^7TKRgiQBiaxE5S$h}srxhDE{ee_cy-?!Kg!2`NTd)wt+j3}=dBJT;dVUtAp z;N82#{QuhBUvN&LUV?A+y({GJq<<59FiFnClo|5uUQkP}UD7AH2a{vc#J5+A%d;%k zbE(_a?mLMwx|BaF^!(GQwxYb^KQlz%-t{G-eD_Pa){C8_AL(O#X-`60NSW{sQXd-i zl6tPsmgi2F&(enfJ8hh3>rEGF&q)#a7BEIjpT>A5&v!fL81ZeD%xPjCCQo(|+_1t{ zG2W4f`-t))zBR?SOLoh7u76YB=X*?-=S7$Qac3yq%vXH-VWqq~-Lz~H^)F-5Lgt*a zv{4`JyhXWEHYVghd+yj%+7RCzQU~_unJwx(b5-7*&NuuY{;rK(MV)Otr2a2`F3tzM&64K?v(Gx z7N?sE`ESkK1%H1o&zi{(q>UQA<&PN4y#fb?e7%3=U80OJNUUSr$ZvA(UdlUwU6`Do zzFQ>cO_KNLif!c{Y`tCDgswN`+Z_Kit!Qg(dwF(5G?6+Px~`y*>2tk?=>PEW;i9}& zMR}&QU%W(&EB?ts!I>+E3-<0J?Osk#d5;Y#GEvk&aM?65_FOctXe;qkf5F?jc?g-! z6UvM7pW!V8pZ+870CvB|i1OEDzUYsou+)d|#if2u{}n1^zJH%2`W8~bR@4));j56T zwA@{km(WHF?yySQflXcIo9KJEwDT28?G*L=*&xr~;r?=-A396>Q>9jaA;0pMtaF}& zv{y@8yN5RA?jD z+O7OpA^-8^M3Dziyl&d^n@_OCLz!w;4jF#3A|a%T?ijyhkd@Gt^I) zZ{fznn~6Rg886?w<9pQ;5SL)5e6 zu$-&&hvfZD&oAfJ_0?`6U+bGZQx<%XdTZ}4?+h_(<#@mN$#_b?_lHD1%EE1eOUybi zcwFI4qMwUrNMFSBiSoU6aj2~G%tfi^^}XcY&)O#KyxTl^e;9VXt*F1n8@U(e7@=bR zGvm7p9Sf-uCOB|GZXt8Jw$#ar?^lZc2aGBtxR|ZHKa9SeDB4}yG)~BzpLj@=-|i#r zUUO%8mVF!{zGLFsMJ42! ze(`9!=v&{InL_5D(vt=EPjV2PZ-#uE1YGJWzRmn7{Z6I&$~B#rDbK#P)#W|2@3H5i z&YH8NP21nVLCk;r3wZ~-*7$*tpX4s@^AUCBJ-n;`0wHtgg`BrDQ{~uC?QAaUPnsZY zJLxX>TJgJ5=leWK7Gs=tQ^uM*eJv~M={-R9XU3f7q7O@2OIzglRNBKzcCvgq0S zD^tX`uQvt>9@JglyJ&%VqCcQ%q0DEFu>@2I8PNd2sSBcJGx-)ea`IMCs? z_||`j+*2dwOWmltzm$-9UDHwYM~!e3<*5VZng-R9K1Mfhc^{tVB;S<|A8p0AeulJT zXI##R@{F0%=BQaiMY})#M}Np#D&)6Mu@gMLZ!aNVv%0*W+zoOT_%@d7}2eqW@zy zRu+Bu5&2$}4=7Sil%J26S>ZK{aw4Wqz=EECG|6M=m7C;g#~in)@CcB{?z)?#uoCEYkhE0 zJ0WxAywuMsp0b{8tEK*Fo@`D3d*_iwvO ze^>dFO+=ke1*P9+wkG$8Uu>FK-*JCR3i*=N<(x12BmGqV_Oj2L2F8hR*IbmowX`BP zMc>l%N`JUEMB2~B_2n72sBIh3Zev^NpBdOk`h@FMl+NlYd_Pyn~@Nlra`_+$>w#E5>#7`@gk+vnr z=Dg@zz7Iu3{SkkpzwY|3GeYLV(vCvr(@44Bzr{;`RDVkkA>XQw+(++&_lWY*(Nc%! z-WejsGB2u_sK43smV!e@5ZjO;4vxiUrChkA)JAER(jdBi@cBk?7Bwy7R@igM&th@}%EVZ=WRii*Mh*mUpvXU&aXes7PratixnJz=wMB{@-GN zygy{Fl=r|YKGHsH%8+k5dqvtzuRK!6`hHy~+O4@r+CcXQ)kQ!1{@x8${a zpT>TadX?5n>cH1t6NLQR)ZT)lAIn_6FYDxeZ~b6-7F??#@3DvN2a0d+v^gYr^I~~V z$kNh9d4XI5#eA;)A9*Z>t32!X70wYdeGbce&X5J(V!SuU%6s(|Mc$v8o7CZ-tK_~m zk|g&iEbnzo@o)0}x0myH$$ep+94q=e&$`_blt{BHG>M zAkUp9xupGHvS*Nx*|13JaLKB=C_lUVjIh0JJ*tWF13e3ic9)$WA<9GSq)#Bvg7Ko< zy+)wm3N4D1cDo|)BsL*(4^D2qSmZBpb~ zG)W&V+S++Q#z!_d$@%QFO5Q)$50!VS(hFs~OZT-GV{A*M-=_31dCn>=@`$$XoRw!^ zfkJX0T{$KBdnNhq$Z9EVQO}+7UUc=|B{43~&f`TNuC?qY+8Q1w_el3%a(xv=RcsVn z#ZIwT9F$y2ZpBe?Qk)eRC6AImrYR_Z8qm3m5q5~WYQR$>~R=Ox%m2OIRrH9f}>7~Rdy_G&nU!|YYUm2hbR0b)7l_5&3GE^C+ z3|B@dBb8CgXl0BtRvD*^S0*TN%0y+7GFh3TOjV{S@yc{%hB8x`rOa05D07v0%6w&k zvQSy1ELN5%OO<8#|MN~zRwyf#Rmy5*jj~o*r>s{Jl_X_@vQgQjY*w}?Ta|6fc4ddM zQ`x2LR+5!H%3fukvR^r%98?Y|hm|ABKgv-hMM+hx3R4UvO*y6tTgq+aj&fJIhyP#k`^p35q4G$1 ztUOVk;;-4~D9@D_%1h;y@>+SLyj9*Q@0AbAN9B|9S^1)TRlX_Tl^@Da<(KkX`Ge)h zKLMfIs&=Zq>Y(OQbE}T3lj^LxsCm@9s;in$&94?v-BfqApjt@vPz$S`Y7w=l>ZKM_ zi>oEnlB&1rqn1)jtG;R()lV&}`m5#C@@fUOq8gx9QY))f)T(MVwYnOp2C2bnh#IQa zP{UMbZMBYCSFNW;sF7-YwSn4DjZzz_jnyVE)n00h+FR|T_Er0-{nY{LKy{EhSRJCq zszcRb>Tq?0I#L~_j#kI0W7To$cy)prr%qHSsguQr@_8m~@QXQ(sPS?X+cjyhMJ zr_NUws0-Ca>SA??x>Q}JE>{!O73xZLmAYD8qpnrgsq585HA&r|Zd5m^o7FAqR&|@Y zUEQJXRClSn)ns*#x>wz&?pF_}2h~IBVfBdmk9t&1QBzf`%2Y#5Q;(^~)e~yEdQ$yA z6`f@p2xb5PpZAVwrcKv0!*p$GV$(Gf)26%4bZ^s4w@n+GInQ%6o3+Kaya4}p8m&28CHCzkV z!;Nq=+zPkDop3kY3-`l=@Gv|IkHeGjG&~E>!;A1Tyb7{$x2T_=}aSVl``6%R1JxfsK5a zg0qRuY+)*>T;VF$ zxXul3a*NyC;V$>M&jTLvh{rtPDbIM$3tsYy*Zj*H-tvz3AJiY@Lq8^h5&g(WMmCC3 zjb?OX7}HpOY;5Bg*LcP^feB6ICnh$DNlj*QQ<&0JrZ$af{nT`(H-j0?WM;FN)ogxd zc5|51&&_3S^O)Cs=C^f0neH<^tKJ(K9yOEaIL>}4#|=@n zn;ki>PSyJL=eTGyKVNsBA%n+wx%mtjGSJM?wtM&PT~x-w?nB&teasxA&Bo1(3iX{Z zVPkPTRT;+m>ARl{l{^pr^sjZlOLso+n&#(91svd`KkTtlf*~G zn6S!6Nm$jFvMMHJ)pcj$11-^mmN4iN23^9StHzix=n@89!m5@s=n^~VlDUD6Ftmh0 zmoVt6F(wSUgjFqN&?R=zRpV0-m&}_mTqg`IVbE1$Ojy+_34<2jrQstSi}NU5TL|@qw1GtSkA*x+Es(N-XOV zhCEAa4s;2FE@4$mSrr5FEcrt`!q5^1UBYsn$(n{d6NYs~bqRwmVU;gs&?R=zB@FQh zLrWNR3B!EV81@m>C9Jv*dq=W^E@9ABW7tQ;2lk7^5SuWxgh5x0p>9a~S!F9F47!9t zmoVt6G2APuFU*&)JSP&9+U4t#UB##11Ddj~#Iml$vaZCkE@5enKtEZR^aU-6Ro5uX zx{_V(x};0=L6@Z)#pi5ZJvlL&&QoSO&&<7ZF39I^123=x@IT41~grOx2 zx`aVjjbT60wN6-dy_7KM5(Zs0hMY-# z9p+2ys+Kb752{LrYlY1Mx{;%CfFxmvsqC z^@`|1e_;3!23^9c*iyZM>!3sI&=OW%qb%oHiYe!rFsy5dRX(66F~lXTibolAiCvzb zJ`zI z$0X?z23^9StHx5jBD%y5x`aW8Ftlnc)hl^U(tZYpSSlZBkIA|c%esW6dIi^2ABZp6 zWnGD7U5RB~!cx70zA7K-0}Q(GU5-gv&a-4!u~e^QA0_bzUBarCGUyUJj1e@5E@5a1 zlW{-`y2K8;gjLs+gjFqN&?R=zRby%1L>F54kn7|-X+c+wrFtcQR}wqu5(ZtupsU7G zy@KzM0}>Z>3BxtQ(5kUiujE)tVh3Hqpi3BZ)mW-mYP!-KWL-KRmA}N$PmQH|rKU^z zf|kUxuEeq~VaT(T3z#oq&?QXbLJPXYF2^Q$gjQmhFJaInEazGBQL$97RM(_D%YCH# zOBk*Z23<9VbtT1t*o2`a47!9tSB<55MReuyfews=#H0+m#18W%47!9NHeqN9gRUA& z^@`}qxsY@T!!^R7tHx5jg6p75?4U~+bO=MM#!|hK=K=Ah^$qhSEbB^kS(mU>ufQhj zlD?oNv8*dGXc9ZLs%z4EftIkGXR?l{os17!)kmsVL|3gZSk8yUvaZB(Kf=%wABZop ztShmsE3vFgSgKbL4|K`6L6>Mpt4KrOxBfH)|FV+B~0p-bf4Aw zf|leX>q-oo#15_MTB$0Yq)Qld3Cnqwd_b4jNgrrcK9Enz2j)vy)lvpsVh3H&ATbC- zOBi$sgRUCGx{~^WE@4$m8FYyqbk&&DD`~!<0b_vcgrOx2x@rvbq`HJbmoVrO23<9V z+@Az3IR_HUe# zR>gyLMYK+;G5AS#&?F2kVbCQEx@t`7m847ZqPhJ_X3QkSG05FgMX46PbV^-3Nu#Fy^3tShmsOV$DC5|-)} z^p$lIOIXgcWCvYhm-8&y26bP0nlVbE1$sa~n+N^2A5tMZXp)|D9g z5j(VmWnI!2v?P{wC6;vwOKXkjLJJ=`&l0P?mlC@w-bpoN{wW{Ye@6 z5j(VmRbzwrq%UPzSF+2xgr#~#bfG^m=n{tc5>~~Q>J|8a4zWW^7_JeP^DM=b^GsM; zhzUy2M9)enf{{BQ59>23<9l>J@wkT{S<-piAtatHx5jg1(?j>~btg z4{XE^x@s)dE2675Ca4wC_&}F1=&G?)uZS+O!*{}uNq7B3a-n#WN(0$ z#Iml$(2v-mC9Lv+_@pmoSy!^lx`d^AMRcJ*Fx&^ipi5X4TdG$i9zLY_i*kOKzAs%693CnYk;)5=+t617ka9#B&m0RdX8FYyqbk$hO z8GI-604A}CA8A2Xjiq`ee}`HjT?1Xhpi3BZ)mW-m&=+)x9drr9HNw!Uu~e_*?+{-a zhpa2HtShmsOIWH`&{x(aeL+iNSyy84BX($2*FX>E3Hg*5bP0nlVL8u|kBTAB5`!*b zm@i>fOPOdu3%c^$BwfPL5(ZtupsU7Gy@EKPOYEwaGUyUJ_^C1MBRXHgaGfx;gh5x0 zrFunli5+wagDzp&PtsDcRIk7Wxq-OApi3C~5r$TcrFtdDgIYoQQU+aO2R}8I>Xn+V zv_@rJiDg}hp`YqQSgKcQx}+~?Ni6G1Eb9`6JS&MVVL8u|9dwBubk!L0One}p63cle zF{z!54_eg+))n!A^+WnnR>h+Xy2J

    M#)LrWOuOBnRj81@m>C9Jv*dq=W^E@9AB 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 IiO0i2wiq literal 0 HcmV?d00001 diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/PointCloud/PointCloudWithPerPointProperties/tileset.json b/packages/sandcastle/public/SampleData/Cesium3DTiles/PointCloud/PointCloudWithPerPointProperties/tileset.json new file mode 100644 index 000000000000..4b2412af5253 --- /dev/null +++ b/packages/sandcastle/public/SampleData/Cesium3DTiles/PointCloud/PointCloudWithPerPointProperties/tileset.json @@ -0,0 +1,39 @@ +{ + "asset": { + "version": "1.0" + }, + "geometricError": 17.32, + "root": { + "transform": [ + 0.968635634376879, + 0.24848542777253735, + 0, + 0, + -0.15986460794399626, + 0.6231776137472074, + 0.7655670897127491, + 0, + 0.190232265775849, + -0.7415555636019701, + 0.6433560687121489, + 0, + 1215012.8828876738, + -4736313.051199594, + 4081605.22126042, + 1 + ], + "refine": "ADD", + "boundingVolume": { + "sphere": [ + 0, + 0, + 0, + 5 + ] + }, + "geometricError": 0, + "content": { + "uri": "pointCloudWithPerPointProperties.pnts" + } + } +} diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Tilesets/Tileset/ll.b3dm b/packages/sandcastle/public/SampleData/Cesium3DTiles/Tilesets/Tileset/ll.b3dm new file mode 100644 index 0000000000000000000000000000000000000000..804719378b62080a62a46b30be0ae497f60bb949 GIT binary patch literal 9704 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 UpOD{=PjL{Rk^KyxQzrxe25rW#-T(jq literal 0 HcmV?d00001 diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Tilesets/Tileset/lr.b3dm b/packages/sandcastle/public/SampleData/Cesium3DTiles/Tilesets/Tileset/lr.b3dm new file mode 100644 index 0000000000000000000000000000000000000000..e273cb03a764ef7af934058e48d3feb44a809cd8 GIT binary patch literal 9704 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 Bm16(^ literal 0 HcmV?d00001 diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Tilesets/Tileset/parent.b3dm b/packages/sandcastle/public/SampleData/Cesium3DTiles/Tilesets/Tileset/parent.b3dm new file mode 100644 index 0000000000000000000000000000000000000000..8cb958955234e1ecaac3837ecbf0162b8fd47bf8 GIT binary patch literal 9680 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 literal 0 HcmV?d00001 diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Tilesets/Tileset/ur.b3dm b/packages/sandcastle/public/SampleData/Cesium3DTiles/Tilesets/Tileset/ur.b3dm new file mode 100644 index 0000000000000000000000000000000000000000..9ae74c7b0534d9e965355d8307a483d7127d5b63 GIT binary patch literal 9688 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 literal 0 HcmV?d00001 diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Tilesets/TilesetWithViewerRequestVolume/ll.b3dm b/packages/sandcastle/public/SampleData/Cesium3DTiles/Tilesets/TilesetWithViewerRequestVolume/ll.b3dm new file mode 100644 index 0000000000000000000000000000000000000000..5e29867c967e3184bafc5df5dab64f42e54d0a65 GIT binary patch literal 9688 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 NFUWp@FR7D(e*=u8s-*w` literal 0 HcmV?d00001 diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Tilesets/TilesetWithViewerRequestVolume/lr.b3dm b/packages/sandcastle/public/SampleData/Cesium3DTiles/Tilesets/TilesetWithViewerRequestVolume/lr.b3dm new file mode 100644 index 0000000000000000000000000000000000000000..ebb24758d31f22e191700241a078cc47d500dd9e GIT binary patch literal 9688 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 literal 0 HcmV?d00001 diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Tilesets/TilesetWithViewerRequestVolume/points.pnts b/packages/sandcastle/public/SampleData/Cesium3DTiles/Tilesets/TilesetWithViewerRequestVolume/points.pnts new file mode 100644 index 0000000000000000000000000000000000000000..acdbdaf527d0638cf514768c5f89107257e76b35 GIT binary patch literal 15136 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 literal 0 HcmV?d00001 diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Tilesets/TilesetWithViewerRequestVolume/tileset.json b/packages/sandcastle/public/SampleData/Cesium3DTiles/Tilesets/TilesetWithViewerRequestVolume/tileset.json new file mode 100644 index 000000000000..7117c51d0c5d --- /dev/null +++ b/packages/sandcastle/public/SampleData/Cesium3DTiles/Tilesets/TilesetWithViewerRequestVolume/tileset.json @@ -0,0 +1,126 @@ +{ + "asset": { + "version": "1.0" + }, + "geometricError": 240, + "root": { + "boundingVolume": { + "region": [ + -1.3197209591796106, + 0.6988424218, + -1.3196390408203893, + 0.6989055782, + 0, + 20 + ] + }, + "geometricError": 70, + "refine": "ADD", + "children": [ + { + "boundingVolume": { + "region": [ + -1.3197209591796106, + 0.6988424218, + -1.31968, + 0.698874, + 0, + 20 + ] + }, + "geometricError": 0, + "content": { + "uri": "ll.b3dm" + } + }, + { + "boundingVolume": { + "region": [ + -1.31968, + 0.6988424218, + -1.3196390408203893, + 0.698874, + 0, + 20 + ] + }, + "geometricError": 0, + "content": { + "uri": "lr.b3dm" + } + }, + { + "boundingVolume": { + "region": [ + -1.31968, + 0.698874, + -1.3196390408203893, + 0.6989055782, + 0, + 20 + ] + }, + "geometricError": 0, + "content": { + "uri": "ur.b3dm" + } + }, + { + "boundingVolume": { + "region": [ + -1.3197209591796106, + 0.698874, + -1.31968, + 0.6989055782, + 0, + 20 + ] + }, + "geometricError": 0, + "content": { + "uri": "ul.b3dm" + } + }, + { + "transform": [ + 0.9686356343768793, + 0.24848542777253738, + 0, + 0, + -0.1598646089326599, + 0.6231776176011753, + 0.7655670863691378, + 0, + 0.19023226494501025, + -0.7415555603632288, + 0.643356072690908, + 0, + 1215014.7852103356, + -4736320.466755246, + 4081611.654821087, + 1 + ], + "viewerRequestVolume": { + "sphere": [ + 0, + 0, + 0, + 1000 + ] + }, + "boundingVolume": { + "sphere": [ + 0, + 0, + 0, + 10 + ] + }, + "geometricError": 0, + "content": { + "uri": "points.pnts" + } + } + ] + } +} diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Tilesets/TilesetWithViewerRequestVolume/ul.b3dm b/packages/sandcastle/public/SampleData/Cesium3DTiles/Tilesets/TilesetWithViewerRequestVolume/ul.b3dm new file mode 100644 index 0000000000000000000000000000000000000000..5ef968378ef9fad63d16e15e1bd9fb60c6722122 GIT binary patch literal 9672 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 literal 0 HcmV?d00001 diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Tilesets/TilesetWithViewerRequestVolume/ur.b3dm b/packages/sandcastle/public/SampleData/Cesium3DTiles/Tilesets/TilesetWithViewerRequestVolume/ur.b3dm new file mode 100644 index 0000000000000000000000000000000000000000..7dd42a0fdf4bef6e9779f53b49c8550efffc1186 GIT binary patch literal 9672 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 literal 0 HcmV?d00001 diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelBox3DTiles/subtrees/0/0/0/0.json b/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelBox3DTiles/subtrees/0/0/0/0.json new file mode 100755 index 000000000000..401dca6a1bb6 --- /dev/null +++ b/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelBox3DTiles/subtrees/0/0/0/0.json @@ -0,0 +1,11 @@ +{ + "tileAvailability": { + "constant": 1 + }, + "contentAvailability": [{ + "constant": 1 + }], + "childSubtreeAvailability": { + "constant": 0 + } +} diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelBox3DTiles/tiles/0/0/0/0.gltf b/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelBox3DTiles/tiles/0/0/0/0.gltf new file mode 100755 index 000000000000..e0d66886449c --- /dev/null +++ b/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelBox3DTiles/tiles/0/0/0/0.gltf @@ -0,0 +1,105 @@ +{ + "asset": { + "version": "2.0" + }, + "extensionsUsed": [ + "EXT_primitive_voxels", + "EXT_structural_metadata" + ], + "extensionsRequired": [ + "EXT_primitive_voxels", + "EXT_structural_metadata" + ], + "extensions": { + "EXT_structural_metadata": { + "schema": { + "classes": { + "voxel": { + "properties": { + "a": { + "type": "VEC4", + "componentType": "FLOAT32" + } + } + } + } + }, + "propertyAttributes": [ + { + "class": "voxel", + "properties": { + "a": { + "attribute": "_DATA" + } + } + } + ] + } + }, + "scene": 0, + "scenes": [ + { + "nodes": [ + 0 + ] + } + ], + "nodes": [ + { + "mesh": 0 + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "_DATA": 0 + }, + "mode": 2147483647, + "extensions": { + "EXT_primitive_voxels": { + "shape": 0, + "dimensions": [ + 2, + 2, + 2 + ] + }, + "EXT_structural_metadata": { + "propertyAttributes": [0] + } + } + } + ] + } + ], + "accessors": [ + { + "bufferView": 0, + "byteOffset": 0, + "componentType": 5126, + "count": 8, + "max": [ + 1.0, 1.0, 1.0, 1.0 + ], + "min": [ + 0.0, 0.0, 0.0, 0.0 + ], + "type": "VEC4" + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteOffset": 0, + "byteLength": 128 + } + ], + "buffers": [ + { + "uri": "a.bin", + "byteLength": 128 + } + ] +} diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelBox3DTiles/tiles/0/0/0/a.bin b/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelBox3DTiles/tiles/0/0/0/a.bin new file mode 100644 index 0000000000000000000000000000000000000000..bb831e003543507e52d70ed63194b067e88b99fb GIT binary patch literal 128 kcmZQzfPn^k1_l@gi6OJm)gbec)xz{3(=d4$4U>cL0bMx`?EnA( literal 0 HcmV?d00001 diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelBox3DTiles/tileset.json b/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelBox3DTiles/tileset.json new file mode 100755 index 000000000000..189d07111844 --- /dev/null +++ b/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelBox3DTiles/tileset.json @@ -0,0 +1,97 @@ +{ + "asset": { + "version": "1.1" + }, + "schema": { + "id": "voxel", + "classes": { + "voxel": { + "properties": { + "a": { + "type": "VEC4", + "componentType": "FLOAT32" + } + } + } + } + }, + "statistics": { + "classes": { + "voxel": { + "count": 8, + "properties": { + "a": { + "min": 0.0, + "max": 1.0 + } + } + } + } + }, + "geometricError": 0.0, + "root": { + "boundingVolume": { + "box": [ + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 1.0 + ] + }, + "geometricError": 16.0, + "refine": "REPLACE", + "content": { + "uri": "tiles/{level}/{x}/{y}/{z}.gltf", + "extensions": { + "3DTILES_content_voxels": { + "dimensions": [ + 2, + 2, + 2 + ], + "class": "voxel" + } + } + }, + "implicitTiling": { + "subdivisionScheme": "OCTREE", + "subtreeLevels": 1, + "availableLevels": 1, + "subtrees": { + "uri": "subtrees/{level}/{x}/{y}/{z}.json" + } + }, + "transform": [ + 6378137.0, + 0.0, + 0.0, + 0.0, + 0.0, + 6378137.0, + 0.0, + 0.0, + 0.0, + 0.0, + 6378137.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0 + ] + }, + "extensionsUsed": [ + "3DTILES_content_voxels" + ], + "extensionsRequired": [ + "3DTILES_content_voxels" + ] +} diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/subtrees/0.0.0.subtree b/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/subtrees/0.0.0.subtree new file mode 100755 index 0000000000000000000000000000000000000000..1cdc0b74bcf56359c79f309f0db41b682abc9bde GIT binary patch literal 144 zcmXReO)6nzU|^^KVq{RQRFavK>R6VTnUk25nUh&ksbp2Hl$@VeT#}eqqGV-Qs{`Vd hq~?{NDvCx`6$@0Bk(rYc478^x6_0@iwY3UB006NBErb97 literal 0 HcmV?d00001 diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/subtrees/0/0/0/0.json b/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/subtrees/0/0/0/0.json new file mode 100755 index 000000000000..401dca6a1bb6 --- /dev/null +++ b/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/subtrees/0/0/0/0.json @@ -0,0 +1,11 @@ +{ + "tileAvailability": { + "constant": 1 + }, + "contentAvailability": [{ + "constant": 1 + }], + "childSubtreeAvailability": { + "constant": 0 + } +} diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/0/0/0/0.gltf b/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/0/0/0/0.gltf new file mode 100755 index 000000000000..6365aa598e1f --- /dev/null +++ b/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/0/0/0/0.gltf @@ -0,0 +1,122 @@ +{ + "asset": { + "version": "2.0" + }, + "extensionsUsed": [ + "KHR_implicit_shapes", + "EXT_implicit_cylinder_region", + "EXT_primitive_voxels", + "EXT_structural_metadata" + ], + "extensionsRequired": [ + "KHR_implicit_shapes", + "EXT_implicit_cylinder_region", + "EXT_primitive_voxels" + ], + "extensions": { + "KHR_implicit_shapes": { + "shapes": [ + { + "type": "cylinder region", + "extensions": { + "EXT_implicit_cylinder_region": { + "minRadius": 0, + "maxRadius": 1, + "height": 2 + } + } + } + ] + }, + "EXT_structural_metadata": { + "schema": { + "classes": { + "voxel": { + "properties": { + "a": { + "type": "VEC4", + "componentType": "FLOAT32" + } + } + } + } + }, + "propertyAttributes": [ + { + "class": "voxel", + "properties": { + "a": { + "attribute": "_DATA" + } + } + } + ] + } + }, + "scene": 0, + "scenes": [ + { + "nodes": [ + 0 + ] + } + ], + "nodes": [ + { + "mesh": 0 + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "_DATA": 0 + }, + "mode": 2147483647, + "extensions": { + "EXT_primitive_voxels": { + "shape": 0, + "dimensions": [ + 2, + 2, + 2 + ] + }, + "EXT_structural_metadata": { + "propertyAttributes": [0] + } + } + } + ] + } + ], + "accessors": [ + { + "bufferView": 0, + "byteOffset": 0, + "componentType": 5126, + "count": 8, + "max": [ + 1.0, 1.0, 1.0, 1.0 + ], + "min": [ + 0.0, 0.0, 0.0, 0.0 + ], + "type": "VEC4" + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteOffset": 0, + "byteLength": 128 + } + ], + "buffers": [ + { + "uri": "a.bin", + "byteLength": 128 + } + ] +} \ No newline at end of file diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/0/0/0/a.bin b/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/0/0/0/a.bin new file mode 100644 index 0000000000000000000000000000000000000000..42df0b6cbb702760c700fc678064798be74e5f5a GIT binary patch literal 128 lcmZQz0D%U3Fa@STY-B!69wv@XLv*6*hl#<=K{o@z2LQae4($K{ literal 0 HcmV?d00001 diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/0/0/0.gltf b/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/0/0/0.gltf new file mode 100755 index 000000000000..ade7ac5840d8 --- /dev/null +++ b/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/0/0/0.gltf @@ -0,0 +1,130 @@ +{ + "asset": { + "version": "2.0" + }, + "extensionsUsed": [ + "KHR_implicit_shapes", + "EXT_implicit_cylinder_region", + "EXT_primitive_voxels", + "EXT_structural_metadata" + ], + "extensionsRequired": [ + "KHR_implicit_shapes", + "EXT_implicit_cylinder_region", + "EXT_primitive_voxels" + ], + "extensions": { + "KHR_implicit_shapes": { + "shapes": [ + { + "type": "cylinder region", + "extensions": { + "EXT_implicit_cylinder_region": { + "minRadius": 0, + "maxRadius": 0.5, + "height": 1, + "minAngle": -3.14159265359, + "maxAngle": 0 + } + } + } + ] + }, + "EXT_structural_metadata": { + "schema": { + "classes": { + "voxel": { + "properties": { + "a": { + "type": "VEC4", + "componentType": "FLOAT32" + } + } + } + } + }, + "propertyAttributes": [ + { + "class": "voxel", + "properties": { + "a": { + "attribute": "_DATA" + } + } + } + ] + } + }, + "scene": 0, + "scenes": [ + { + "nodes": [ + 0 + ] + } + ], + "nodes": [ + { + "mesh": 0, + "matrix": [ + 1.0, 0.0, 0.0, 0.0, + 0.0, 1.0, 0.0, 0.0, + 0.0, 0.0, 1.0, 0.0, + 0.0, -0.5, 0.0, 1.0 + ] + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "_DATA": 0 + }, + "mode": 2147483647, + "extensions": { + "EXT_primitive_voxels": { + "shape": 0, + "dimensions": [ + 2, + 2, + 2 + ] + }, + "EXT_structural_metadata": { + "propertyAttributes": [0] + } + } + } + ] + } + ], + "accessors": [ + { + "bufferView": 0, + "byteOffset": 0, + "componentType": 5126, + "count": 8, + "max": [ + 1.0, 1.0, 1.0, 1.0 + ], + "min": [ + 0.0, 0.0, 0.0, 0.0 + ], + "type": "VEC4" + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteOffset": 0, + "byteLength": 128 + } + ], + "buffers": [ + { + "uri": "a0.bin", + "byteLength": 128 + } + ] +} \ No newline at end of file diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/0/0/1.gltf b/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/0/0/1.gltf new file mode 100755 index 000000000000..ea2aef7b37bd --- /dev/null +++ b/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/0/0/1.gltf @@ -0,0 +1,130 @@ +{ + "asset": { + "version": "2.0" + }, + "extensionsUsed": [ + "KHR_implicit_shapes", + "EXT_implicit_cylinder_region", + "EXT_primitive_voxels", + "EXT_structural_metadata" + ], + "extensionsRequired": [ + "KHR_implicit_shapes", + "EXT_implicit_cylinder_region", + "EXT_primitive_voxels" + ], + "extensions": { + "KHR_implicit_shapes": { + "shapes": [ + { + "type": "cylinder region", + "extensions": { + "EXT_implicit_cylinder_region": { + "minRadius": 0, + "maxRadius": 0.5, + "height": 1, + "minAngle": -3.14159265359, + "maxAngle": 0 + } + } + } + ] + }, + "EXT_structural_metadata": { + "schema": { + "classes": { + "voxel": { + "properties": { + "a": { + "type": "VEC4", + "componentType": "FLOAT32" + } + } + } + } + }, + "propertyAttributes": [ + { + "class": "voxel", + "properties": { + "a": { + "attribute": "_DATA" + } + } + } + ] + } + }, + "scene": 0, + "scenes": [ + { + "nodes": [ + 0 + ] + } + ], + "nodes": [ + { + "mesh": 0, + "matrix": [ + 1.0, 0.0, 0.0, 0.0, + 0.0, 1.0, 0.0, 0.0, + 0.0, 0.0, 1.0, 0.0, + 0.0, 0.5, 0.0, 1.0 + ] + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "_DATA": 0 + }, + "mode": 2147483647, + "extensions": { + "EXT_primitive_voxels": { + "shape": 0, + "dimensions": [ + 2, + 2, + 2 + ] + }, + "EXT_structural_metadata": { + "propertyAttributes": [0] + } + } + } + ] + } + ], + "accessors": [ + { + "bufferView": 0, + "byteOffset": 0, + "componentType": 5126, + "count": 8, + "max": [ + 1.0, 1.0, 1.0, 1.0 + ], + "min": [ + 0.0, 0.0, 0.0, 0.0 + ], + "type": "VEC4" + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteOffset": 0, + "byteLength": 128 + } + ], + "buffers": [ + { + "uri": "a1.bin", + "byteLength": 128 + } + ] +} \ No newline at end of file diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/0/0/a0.bin b/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/0/0/a0.bin new file mode 100644 index 0000000000000000000000000000000000000000..9b62614195f025a7042a641d0b84b22639cd4837 GIT binary patch literal 128 ucmZQzKn4x=t5>bELx?ok!`KjUgglH7l1J!)$RqP%@-X!v8ipAd8tegOf*{oZ literal 0 HcmV?d00001 diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/0/0/a1.bin b/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/0/0/a1.bin new file mode 100644 index 0000000000000000000000000000000000000000..15c34c59029138f34fb6a2722034cdb20afe18d8 GIT binary patch literal 128 zcmZQzfPmGjwCoue8thlET4e_kf$^czK&k;n9>#~LU1bMT57H085c6R2F!eBb7#{#} Cks;Lp literal 0 HcmV?d00001 diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/0/1/0.gltf b/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/0/1/0.gltf new file mode 100755 index 000000000000..83bb477fd689 --- /dev/null +++ b/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/0/1/0.gltf @@ -0,0 +1,130 @@ +{ + "asset": { + "version": "2.0" + }, + "extensionsUsed": [ + "KHR_implicit_shapes", + "EXT_implicit_cylinder_region", + "EXT_primitive_voxels", + "EXT_structural_metadata" + ], + "extensionsRequired": [ + "KHR_implicit_shapes", + "EXT_implicit_cylinder_region", + "EXT_primitive_voxels" + ], + "extensions": { + "KHR_implicit_shapes": { + "shapes": [ + { + "type": "cylinder region", + "extensions": { + "EXT_implicit_cylinder_region": { + "minRadius": 0, + "maxRadius": 0.5, + "height": 1, + "minAngle": 0, + "maxAngle": 3.14159265359 + } + } + } + ] + }, + "EXT_structural_metadata": { + "schema": { + "classes": { + "voxel": { + "properties": { + "a": { + "type": "VEC4", + "componentType": "FLOAT32" + } + } + } + } + }, + "propertyAttributes": [ + { + "class": "voxel", + "properties": { + "a": { + "attribute": "_DATA" + } + } + } + ] + } + }, + "scene": 0, + "scenes": [ + { + "nodes": [ + 0 + ] + } + ], + "nodes": [ + { + "mesh": 0, + "matrix": [ + 1.0, 0.0, 0.0, 0.0, + 0.0, 1.0, 0.0, 0.0, + 0.0, 0.0, 1.0, 0.0, + 0.0, -0.5, 0.0, 1.0 + ] + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "_DATA": 0 + }, + "mode": 2147483647, + "extensions": { + "EXT_primitive_voxels": { + "shape": 0, + "dimensions": [ + 2, + 2, + 2 + ] + }, + "EXT_structural_metadata": { + "propertyAttributes": [0] + } + } + } + ] + } + ], + "accessors": [ + { + "bufferView": 0, + "byteOffset": 0, + "componentType": 5126, + "count": 8, + "max": [ + 1.0, 1.0, 1.0, 1.0 + ], + "min": [ + 0.0, 0.0, 0.0, 0.0 + ], + "type": "VEC4" + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteOffset": 0, + "byteLength": 128 + } + ], + "buffers": [ + { + "uri": "a0.bin", + "byteLength": 128 + } + ] +} \ No newline at end of file diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/0/1/1.gltf b/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/0/1/1.gltf new file mode 100755 index 000000000000..cf75ad271127 --- /dev/null +++ b/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/0/1/1.gltf @@ -0,0 +1,130 @@ +{ + "asset": { + "version": "2.0" + }, + "extensionsUsed": [ + "KHR_implicit_shapes", + "EXT_implicit_cylinder_region", + "EXT_primitive_voxels", + "EXT_structural_metadata" + ], + "extensionsRequired": [ + "KHR_implicit_shapes", + "EXT_implicit_cylinder_region", + "EXT_primitive_voxels" + ], + "extensions": { + "KHR_implicit_shapes": { + "shapes": [ + { + "type": "cylinder region", + "extensions": { + "EXT_implicit_cylinder_region": { + "minRadius": 0, + "maxRadius": 0.5, + "height": 1, + "minAngle": 0, + "maxAngle": 3.14159265359 + } + } + } + ] + }, + "EXT_structural_metadata": { + "schema": { + "classes": { + "voxel": { + "properties": { + "a": { + "type": "VEC4", + "componentType": "FLOAT32" + } + } + } + } + }, + "propertyAttributes": [ + { + "class": "voxel", + "properties": { + "a": { + "attribute": "_DATA" + } + } + } + ] + } + }, + "scene": 0, + "scenes": [ + { + "nodes": [ + 0 + ] + } + ], + "nodes": [ + { + "mesh": 0, + "matrix": [ + 1.0, 0.0, 0.0, 0.0, + 0.0, 1.0, 0.0, 0.0, + 0.0, 0.0, 1.0, 0.0, + 0.0, 0.5, 0.0, 1.0 + ] + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "_DATA": 0 + }, + "mode": 2147483647, + "extensions": { + "EXT_primitive_voxels": { + "shape": 0, + "dimensions": [ + 2, + 2, + 2 + ] + }, + "EXT_structural_metadata": { + "propertyAttributes": [0] + } + } + } + ] + } + ], + "accessors": [ + { + "bufferView": 0, + "byteOffset": 0, + "componentType": 5126, + "count": 8, + "max": [ + 1.0, 1.0, 1.0, 1.0 + ], + "min": [ + 0.0, 0.0, 0.0, 0.0 + ], + "type": "VEC4" + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteOffset": 0, + "byteLength": 128 + } + ], + "buffers": [ + { + "uri": "a1.bin", + "byteLength": 128 + } + ] +} \ No newline at end of file diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/0/1/a0.bin b/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/0/1/a0.bin new file mode 100644 index 0000000000000000000000000000000000000000..c9a426a68618a50bcff07c4eb0372701124e7f07 GIT binary patch literal 128 vcmZQzU|?9iO3NNd0YQWP>Q$@kkoh1{5FaFtEDz&@^& BA=Ll? literal 0 HcmV?d00001 diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/1/0/a1.bin b/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/1/0/a1.bin new file mode 100644 index 0000000000000000000000000000000000000000..5fa7eec22893563450ec14d08f296074b0286b94 GIT binary patch literal 128 zcmZ3zO3R)B2v&pX1|S=R5qyX^NCYMak%#d?@~c;^vP0I7%!kRt)Prb{Jd6(j9v~vs literal 0 HcmV?d00001 diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/1/1/0.gltf b/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/1/1/0.gltf new file mode 100755 index 000000000000..9514ece23738 --- /dev/null +++ b/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/1/1/0.gltf @@ -0,0 +1,130 @@ +{ + "asset": { + "version": "2.0" + }, + "extensionsUsed": [ + "KHR_implicit_shapes", + "EXT_implicit_cylinder_region", + "EXT_primitive_voxels", + "EXT_structural_metadata" + ], + "extensionsRequired": [ + "KHR_implicit_shapes", + "EXT_implicit_cylinder_region", + "EXT_primitive_voxels" + ], + "extensions": { + "KHR_implicit_shapes": { + "shapes": [ + { + "type": "cylinder region", + "extensions": { + "EXT_implicit_cylinder_region": { + "minRadius": 0.5, + "maxRadius": 1, + "height": 1, + "minAngle": 0, + "maxAngle": 3.14159265359 + } + } + } + ] + }, + "EXT_structural_metadata": { + "schema": { + "classes": { + "voxel": { + "properties": { + "a": { + "type": "VEC4", + "componentType": "FLOAT32" + } + } + } + } + }, + "propertyAttributes": [ + { + "class": "voxel", + "properties": { + "a": { + "attribute": "_DATA" + } + } + } + ] + } + }, + "scene": 0, + "scenes": [ + { + "nodes": [ + 0 + ] + } + ], + "nodes": [ + { + "mesh": 0, + "matrix": [ + 1.0, 0.0, 0.0, 0.0, + 0.0, 1.0, 0.0, 0.0, + 0.0, 0.0, 1.0, 0.0, + 0.0, -0.5, 0.0, 1.0 + ] + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "_DATA": 0 + }, + "mode": 2147483647, + "extensions": { + "EXT_primitive_voxels": { + "shape": 0, + "dimensions": [ + 2, + 2, + 2 + ] + }, + "EXT_structural_metadata": { + "propertyAttributes": [0] + } + } + } + ] + } + ], + "accessors": [ + { + "bufferView": 0, + "byteOffset": 0, + "componentType": 5126, + "count": 8, + "max": [ + 1.0, 1.0, 1.0, 1.0 + ], + "min": [ + 0.0, 0.0, 0.0, 0.0 + ], + "type": "VEC4" + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteOffset": 0, + "byteLength": 128 + } + ], + "buffers": [ + { + "uri": "a0.bin", + "byteLength": 128 + } + ] +} \ No newline at end of file diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/1/1/1.gltf b/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/1/1/1.gltf new file mode 100755 index 000000000000..443eae1748d4 --- /dev/null +++ b/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/1/1/1.gltf @@ -0,0 +1,130 @@ +{ + "asset": { + "version": "2.0" + }, + "extensionsUsed": [ + "KHR_implicit_shapes", + "EXT_implicit_cylinder_region", + "EXT_primitive_voxels", + "EXT_structural_metadata" + ], + "extensionsRequired": [ + "KHR_implicit_shapes", + "EXT_implicit_cylinder_region", + "EXT_primitive_voxels" + ], + "extensions": { + "KHR_implicit_shapes": { + "shapes": [ + { + "type": "cylinder region", + "extensions": { + "EXT_implicit_cylinder_region": { + "minRadius": 0.5, + "maxRadius": 1, + "height": 1, + "minAngle": 0, + "maxAngle": 3.14159265359 + } + } + } + ] + }, + "EXT_structural_metadata": { + "schema": { + "classes": { + "voxel": { + "properties": { + "a": { + "type": "VEC4", + "componentType": "FLOAT32" + } + } + } + } + }, + "propertyAttributes": [ + { + "class": "voxel", + "properties": { + "a": { + "attribute": "_DATA" + } + } + } + ] + } + }, + "scene": 0, + "scenes": [ + { + "nodes": [ + 0 + ] + } + ], + "nodes": [ + { + "mesh": 0, + "matrix": [ + 1.0, 0.0, 0.0, 0.0, + 0.0, 1.0, 0.0, 0.0, + 0.0, 0.0, 1.0, 0.0, + 0.0, 0.5, 0.0, 1.0 + ] + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "_DATA": 0 + }, + "mode": 2147483647, + "extensions": { + "EXT_primitive_voxels": { + "shape": 0, + "dimensions": [ + 2, + 2, + 2 + ] + }, + "EXT_structural_metadata": { + "propertyAttributes": [0] + } + } + } + ] + } + ], + "accessors": [ + { + "bufferView": 0, + "byteOffset": 0, + "componentType": 5126, + "count": 8, + "max": [ + 1.0, 1.0, 1.0, 1.0 + ], + "min": [ + 0.0, 0.0, 0.0, 0.0 + ], + "type": "VEC4" + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteOffset": 0, + "byteLength": 128 + } + ], + "buffers": [ + { + "uri": "a1.bin", + "byteLength": 128 + } + ] +} \ No newline at end of file diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/1/1/a0.bin b/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/1/1/a0.bin new file mode 100644 index 0000000000000000000000000000000000000000..6db851c2f37a515ade7fe5f7c6630275a60abf64 GIT binary patch literal 128 zcmZ3zO3QvV5Ho;51CVY&;e+HLc$FPU4ko{P6@(Ab3lawbh&+Ub@L}>W^)NLsJ^=9` BBGmu@ literal 0 HcmV?d00001 diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/1/1/a1.bin b/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tiles/1/1/1/a1.bin new file mode 100644 index 0000000000000000000000000000000000000000..49740eef9e00c6d8583d9ee3ebdfcc12e93b5278 GIT binary patch literal 128 mcmZ3zO3QvV6f-b1*n==KADN9TkIn|EgNeb+K&Fx9kl6tJFC*0e literal 0 HcmV?d00001 diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tileset.json b/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tileset.json new file mode 100755 index 000000000000..d389995205c0 --- /dev/null +++ b/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelCylinder3DTiles/tileset.json @@ -0,0 +1,92 @@ +{ + "asset": { + "version": "1.1" + }, + "schema": { + "id": "voxel", + "classes": { + "voxel": { + "properties": { + "a": { + "type": "VEC4", + "componentType": "FLOAT32" + } + } + } + } + }, + "statistics": { + "classes": { + "voxel": { + "count": 8, + "properties": { + "a": { + "min": 0.0, + "max": 1.0 + } + } + } + } + }, + "geometricError": 240, + "root": { + "boundingVolume": { + "extensions": { + "3DTILES_bounding_volume_cylinder": { + "height": 2.0, + "minRadius": 0.0, + "maxRadius": 1.0 + } + } + }, + "geometricError": 16.0, + "refine": "REPLACE", + "content": { + "uri": "tiles/{level}/{x}/{y}/{z}.gltf", + "extensions": { + "3DTILES_content_voxels": { + "dimensions": [ + 2, + 2, + 2 + ], + "class": "voxel" + } + } + }, + "implicitTiling": { + "subdivisionScheme": "OCTREE", + "subtreeLevels": 2, + "availableLevels": 2, + "subtrees": { + "uri": "subtrees/{level}/{x}/{y}/{z}.json" + } + }, + "transform": [ + 6378137.0, + 0.0, + 0.0, + 0.0, + 0.0, + 6378137.0, + 0.0, + 0.0, + 0.0, + 0.0, + 6378137.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0 + ] + }, + "extensionsUsed": [ + "3DTILES_bounding_volume_cylinder", + "3DTILES_content_voxels" + ], + "extensionsRequired": [ + "3DTILES_bounding_volume_cylinder", + "3DTILES_content_voxels" + ] +} diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelEllipsoid3DTiles/schema.json b/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelEllipsoid3DTiles/schema.json new file mode 100644 index 000000000000..43c7cd03f778 --- /dev/null +++ b/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelEllipsoid3DTiles/schema.json @@ -0,0 +1,14 @@ +{ + "id": "voxel", + "classes": { + "voxel": { + "properties": { + "a": { + "type": "SCALAR", + "componentType": "FLOAT32", + "required": false + } + } + } + } +} diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelEllipsoid3DTiles/subtrees/0/0/0/0.json b/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelEllipsoid3DTiles/subtrees/0/0/0/0.json new file mode 100644 index 000000000000..abc8af15e8b3 --- /dev/null +++ b/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelEllipsoid3DTiles/subtrees/0/0/0/0.json @@ -0,0 +1,14 @@ +{ + "tileAvailability": { + "availableCount": 1, + "constant": 1 + }, + "contentAvailability": { + "availableCount": 1, + "constant": 1 + }, + "childSubtreeAvailability": { + "availableCount": 0, + "constant": 0 + } +} diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelEllipsoid3DTiles/tiles/0/0/0/0.gltf b/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelEllipsoid3DTiles/tiles/0/0/0/0.gltf new file mode 100644 index 000000000000..5a1815f6d105 --- /dev/null +++ b/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelEllipsoid3DTiles/tiles/0/0/0/0.gltf @@ -0,0 +1,100 @@ +{ + "asset": { + "version": "2.0" + }, + "scene": 0, + "scenes": [ + { + "nodes": [ + 0 + ] + } + ], + "nodes": [ + { + "mesh": 0 + } + ], + "meshes": [ + { + "primitives": [ + { + "mode": 2147483649, + "attributes": { + "_a": 0 + }, + "extensions": { + "EXT_primitive_voxels": { + "dimensions": [ + 2, + 2, + 2 + ], + "bounds": { + "min": [ + 0.0, + 0.0, + -1.0 + ], + "max": [ + 1.0, + 1.0, + 0.0 + ] + } + } + } + } + ] + } + ], + "extensionsUsed": [ + "EXT_primitive_voxels", + "EXT_structural_metadata" + ], + "extensionsRequired": [ + "EXT_primitive_voxels", + "EXT_structural_metadata" + ], + "extensions": { + "EXT_structural_metadata": { + "schemaUri": "../../../../schema.json", + "propertyAttributes": [ + { + "class": "voxel", + "properties": { + "a": { + "attribute": "_a" + } + } + } + ] + } + }, + "accessors": [ + { + "bufferView": 0, + "type": "SCALAR", + "componentType": 5126, + "min": [ + 0.0 + ], + "max": [ + 1.0 + ], + "count": 8 + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteLength": 32 + } + ], + "buffers": [ + { + "uri": "a.bin", + "byteLength": 32 + } + ] +} \ No newline at end of file diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelEllipsoid3DTiles/tiles/0/0/0/a.bin b/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelEllipsoid3DTiles/tiles/0/0/0/a.bin new file mode 100644 index 0000000000000000000000000000000000000000..6eac4f3e1f1fcfd58880ad428efeb0df90514357 GIT binary patch literal 32 QcmZQzKnD%>3=9Yi02c%T{Qv*} literal 0 HcmV?d00001 diff --git a/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelEllipsoid3DTiles/tileset.json b/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelEllipsoid3DTiles/tileset.json new file mode 100644 index 000000000000..fa43b62f031a --- /dev/null +++ b/packages/sandcastle/public/SampleData/Cesium3DTiles/Voxel/VoxelEllipsoid3DTiles/tileset.json @@ -0,0 +1,61 @@ +{ + "asset": { + "version": "1.1" + }, + "schemaUri": "schema.json", + "statistics": { + "classes": { + "voxel": { + "count": 8, + "properties": { + "a": { + "min": 0.0, + "max": 1.0 + } + } + } + } + }, + "geometricError": 0.0, + "root": { + "boundingVolume": { + "region": [ + 0.0, + 0.0, + 1.0, + 1.0, + -1.0, + 500000.0 + ] + }, + "geometricError": 0.0, + "refine": "REPLACE", + "content": { + "uri": "tiles/{level}/{x}/{y}/{z}.gltf", + "extensions": { + "3DTILES_content_voxels": { + "dimensions": [ + 2, + 2, + 2 + ], + "class": "voxel" + } + } + }, + "implicitTiling": { + "subdivisionScheme": "OCTREE", + "subtreeLevels": 3, + "availableLevels": 1, + "subtrees": { + "uri": "subtrees/{level}/{x}/{y}/{z}.json" + } + } + }, + "extensionsUsed": [ + "3DTILES_content_voxels" + ], + "extensionsRequired": [ + "3DTILES_content_voxels" + ] +} diff --git a/packages/sandcastle/public/SampleData/ClampToGround.czml b/packages/sandcastle/public/SampleData/ClampToGround.czml new file mode 100644 index 000000000000..44734a3de77e --- /dev/null +++ b/packages/sandcastle/public/SampleData/ClampToGround.czml @@ -0,0 +1,80 @@ +[ + { + "id": "document", + "version": "1.0", + "clock": { + "interval": "2018-07-19T15:18:00Z/2018-07-19T15:18:30Z", + "currentTime": "2018-07-19T15:18:00Z", + "multiplier": 2, + "range": "LOOP_STOP", + "step": "SYSTEM_CLOCK_MULTIPLIER" + } + }, + { + "id": "CesiumMilkTruck", + "model": { + "gltf": "models/CesiumMilkTruck/CesiumMilkTruck.glb" + }, + "position": { + "interpolationAlgorithm": "LINEAR", + "forwardExtrapolationType": "HOLD", + "cartesian": [ + "2018-07-19T15:18:00Z", + 1216327.3893347275, + -4736164.778028102, + 4081507.5209477833, + "2018-07-19T15:18:10Z", + 1216369.543258349, + -4736201.237448179, + 4081447.3732212726, + "2018-07-19T15:18:20Z", + 1216434.7507773656, + -4736241.372142024, + 4081386.1802605274, + "2018-07-19T15:18:30Z", + 1216525.7792628652, + -4736271.927759278, + 4081319.744558958 + ] + }, + "orientation": { + "unitQuaternion": [ + 0.3084011337938999, + 0.3210181022701266, + -0.45850421987074924, + 0.7686388857813198 + ] + } + }, + { + "id": "Polyline", + "polyline": { + "positions": { + "cartesian": [ + 1216327.3893347275, + -4736164.778028102, + 4081507.5209477833, + 1216369.543258349, + -4736201.237448179, + 4081447.3732212726, + 1216434.7507773656, + -4736241.372142024, + 4081386.1802605274, + 1216525.7792628652, + -4736271.927759278, + 4081319.744558958 + ] + }, + "material": { + "polylineOutline": { + "color": { + "rgba": [100, 149, 237, 140] + }, + "outlineWidth": 0 + } + }, + "width": 12, + "clampToGround": true + } + } +] diff --git a/packages/sandcastle/public/SampleData/MultipartVehicle_part1.czml b/packages/sandcastle/public/SampleData/MultipartVehicle_part1.czml new file mode 100644 index 000000000000..c9f1d359fd37 --- /dev/null +++ b/packages/sandcastle/public/SampleData/MultipartVehicle_part1.czml @@ -0,0 +1,244 @@ +[ + { + "id":"document", + "version":"1.0" + }, + { + "id":"Vehicle", + "availability":"2012-08-04T16:00:00Z/2012-08-04T17:04:54.9962195740191Z", + "label":{ + "fillColor":[ + { + "interval":"2012-08-04T16:00:00Z/2012-08-04T18:00:00Z", + "rgba":[ + 255,255,0,255 + ] + } + ], + "font":"bold 10pt Segoe UI Semibold", + "horizontalOrigin":"CENTER", + "outlineColor":{ + "rgba":[ + 0,0,0,255 + ] + }, + "pixelOffset":{ + "cartesian2":[ + 0.0,20.0 + ] + }, + "scale":1.0, + "show":[ + { + "interval":"2012-08-04T16:00:00Z/2012-08-04T18:00:00Z", + "boolean":true + } + ], + "style":"FILL", + "text":"Test Vehicle", + "verticalOrigin":"CENTER" + }, + "model":{ + "gltf":"models/CesiumMilkTruck/CesiumMilkTruck.glb", + "minimumPixelSize":100, + "maximumScale":50 + }, + "orientation" : { + "velocityReference": "#position" + }, + "viewFrom": { + "cartesian": [ -2080, -1715, 779 ] + }, + "properties" : { + "fuel_remaining" : { + "epoch":"2012-08-04T16:00:00Z", + "number": [ + 0, 22.5, + 1500, 21.2 + ] + } + }, + "path":{ + "material":{ + "solidColor":{ + "color":{ + "interval":"2012-08-04T16:00:00Z/2012-08-04T18:00:00Z", + "rgba":[ + 255,255,0,255 + ] + } + } + }, + "width":[ + { + "interval":"2012-08-04T16:00:00Z/2012-08-04T18:00:00Z", + "number":5.0 + } + ], + "show":[ + { + "interval":"2012-08-04T16:00:00Z/2012-08-04T18:00:00Z", + "boolean":true + } + ] + }, + "position":{ + "interpolationAlgorithm":"LAGRANGE", + "interpolationDegree":1, + "epoch":"2012-08-04T16:00:00Z", + "cartesian":[ + 0.0,-2379754.6637012,-4665332.88013588,3628133.68924173, + 10.0,-2379510.08905552,-4665419.64840452,3628182.20006795, + 20.0,-2379568.4769522,-4665555.3441867,3627970.83323261, + 30.0,-2379638.93786855,-4665691.63561896,3627750.82085873, + 40.0,-2379709.29834665,-4665827.9679646,3627530.80187124, + 50.0,-2379837.28064915,-4665847.7494347,3627422.12874017, + 60.0,-2379624.98289073,-4665907.50853722,3627484.1191848, + 70.0,-2379386.12743523,-4666029.54174431,3627483.83297459, + 80.0,-2379147.26777171,-4666151.56669944,3627483.5403492, + 90.0,-2378908.40390057,-4666273.58340244,3627483.24130864, + 1e2,-2378663.69301645,-4666379.62408751,3627507.14485116, + 110.0,-2378416.29648478,-4666444.93145547,3627584.82610021, + 120.0,-2378184.75115833,-4666458.05260387,3627718.84628509, + 130.0,-2377958.22637221,-4666461.11592729,3627862.42864636, + 140.0,-2377733.79758374,-4666460.508441,3628009.31669747, + 150.0,-2377509.36460154,-4666459.89268533,3628156.19830638, + 160.0,-2377284.92742603,-4666459.26866028,3628303.07347284, + 170.0,-2377060.48605759,-4666458.63636585,3628449.9421966, + 180.0,-2376835.38472681,-4666459.12413084,3628595.78980713, + 190.0,-2376609.71084875,-4666460.58154837,3628740.75156098, + 2e2,-2376384.03277903,-4666462.03069678,3628885.70687201, + 210.0,-2376158.35051806,-4666463.47157605,3629030.65573998, + 220.0,-2375928.48736859,-4666473.69575712,3629167.08552075, + 230.0,-2375685.23921682,-4666516.66377513,3629270.3788586, + 240.0,-2375437.34307768,-4666580.50029931,3629350.0215939, + 250.0,-2375189.01133306,-4666646.99320452,3629426.53515423, + 260.0,-2374940.52675783,-4666719.29042452,3629495.71527129, + 270.0,-2374695.15633549,-4666818.94185605,3629527.91579302, + 280.0,-2374469.42323533,-4666959.02687352,3629495.69349509, + 290.0,-2374249.06659405,-4667105.51477438,3629451.77975513, + 3e2,-2374028.70574724,-4667251.99442379,3629407.85959417, + 310.0,-2373808.3406953,-4667398.46582147,3629363.9330123, + 320.0,-2373585.10773309,-4667542.05948567,3629325.52597676, + 330.0,-2373360.83645524,-4667684.60869937,3629289.10800226, + 340.0,-2373136.5609746,-4667827.1496603,3629252.68360778, + 350.0,-2372912.28129155,-4667969.68236819,3629216.25279339, + 360.0,-2372687.9974065,-4668112.20682281,3629179.81555915, + 370.0,-2372463.70931983,-4668254.72302389,3629143.37190511, + 380.0,-2372239.41703195,-4668397.2309712,3629106.92183136, + 390.0,-2372018.7615611,-4668543.12509124,3629063.76398058, + 4e2,-2371803.72586004,-4668694.25404103,3629010.24868951, + 410.0,-2371587.17705087,-4668844.01756398,3628959.44085712, + 420.0,-2371365.33472237,-4668989.01539779,3628918.13984128, + 430.0,-2371134.7547923,-4669122.83460485,3628896.77687771, + 440.0,-2370898.14635373,-4669248.94021679,3628889.16522147, + 450.0,-2370660.31892949,-4669372.89697404,3628885.07134974, + 460.0,-2370422.47459187,-4669496.82305927,3628881.00796265, + 470.0,-2370184.62606153,-4669620.7408867,3628876.93815788, + 480.0,-2369946.77333888,-4669744.65045611,3628872.86193545, + 490.0,-2369708.91642433,-4669868.55176729,3628868.77929537, + 5e2,-2369471.05531832,-4669992.44482001,3628864.69023764, + 510.0,-2369233.19002126,-4670116.32961405,3628860.59476226, + 520.0,-2368989.65950726,-4670225.94237244,3628878.39787596, + 530.0,-2368742.64810033,-4670324.93393451,3628912.01606989, + 540.0,-2368494.95906007,-4670419.65546435,3628951.51257903, + 550.0,-2368248.2848424,-4670519.53079746,3628983.74302284, + 560.0,-2368001.37437725,-4670618.8319301,3629016.84097985, + 570.0,-2367753.95809484,-4670715.82368808,3629053.19940679, + 580.0,-2367506.53762994,-4670812.80718267,3629089.55141416, + 590.0,-2367259.11298298,-4670909.78241366,3629125.89700192, + 6e2,-2367011.6841544,-4671006.74938092,3629162.23617, + 610.0,-2366764.25114462,-4671103.70808425,3629198.56891833, + 620.0,-2366516.81395411,-4671200.6585235,3629234.89524684, + 630.0,-2366269.37258329,-4671297.60069848,3629271.21515549, + 640.0,-2366021.9270326,-4671394.53460904,3629307.52864419, + 650.0,-2365774.47730247,-4671491.460255,3629343.8357129, + 660.0,-2365527.02339333,-4671588.37763618,3629380.13636155, + 670.0,-2365279.56530564,-4671685.28675242,3629416.43059006, + 680.0,-2365032.10303983,-4671782.18760355,3629452.71839837, + 690.0,-2364784.63659633,-4671879.0801894,3629488.99978644, + 7e2,-2364537.16597558,-4671975.96450979,3629525.27475418, + 710.0,-2364289.69117801,-4672072.84056456,3629561.54330154, + 720.0,-2364042.21220407,-4672169.70835353,3629597.80542845, + 730.0,-2363794.72905419,-4672266.56787654,3629634.06113485, + 740.0,-2363547.2417288,-4672363.41913342,3629670.31042068, + 750.0,-2363299.75022835,-4672460.26212398,3629706.55328587, + 760.0,-2363052.25455328,-4672557.09684808,3629742.78973036, + 770.0,-2362805.96213832,-4672658.44235501,3629772.46055, + 780.0,-2362566.28756432,-4672777.84646024,3629774.74120741, + 790.0,-2362330.01543718,-4672904.47715606,3629765.56158533, + 8e2,-2362093.73913086,-4673031.09958839,3629756.37554393, + 810.0,-2361857.4586458,-4673157.71375702,3629747.18308323, + 820.0,-2361621.17398239,-4673284.31966172,3629737.98420324, + 830.0,-2361379.13396171,-4673398.62592987,3629748.21496888, + 840.0,-2361130.58722369,-4673488.59963461,3629793.74986512, + 850.0,-2360881.58098042,-4673573.14384665,3629846.50583809, + 860.0,-2360632.51954154,-4673657.07225834,3629900.06533886, + 870.0,-2360383.45393477,-4673740.99239963,3629953.61841672, + 880.0,-2360134.38416057,-4673824.90427038,3630007.16507155, + 890.0,-2359885.31021938,-4673908.80787044,3630060.70530326, + 9e2,-2359636.23211162,-4673992.70319966,3630114.23911177, + 910.0,-2359387.14983775,-4674076.5902579,3630167.76649697, + 920.0,-2359138.06339821,-4674160.469045,3630221.28745878, + 930.0,-2358889.14548278,-4674246.80164025,3630271.54165003, + 940.0,-2358640.17887385,-4674332.39488805,3630322.75317441, + 950.0,-2358391.03374684,-4674415.32432296,3630377.46713032, + 960.0,-2358141.88445605,-4674498.24548602,3630432.17466229, + 970.0,-2357892.7310019,-4674581.15837706,3630486.87577026, + 980.0,-2357643.59031994,-4674664.39449658,3630541.13554932, + 990.0,-2357394.48770584,-4674748.44899573,3630594.30439711, + 1e3,-2357145.38092955,-4674832.4952226,3630647.46682079, + 1010.0,-2356896.26999152,-4674916.53317705,3630700.62282028, + 1020.0,-2356647.15489217,-4675000.56285892,3630753.77239547, + 1030.0,-2356398.03563196,-4675084.58426807,3630806.91554629, + 1040.0,-2356148.91221132,-4675168.59740435,3630860.05227262, + 1050.0,-2355899.78463069,-4675252.60226762,3630913.18257437, + 1060.0,-2355650.65289051,-4675336.59885772,3630966.30645147, + 1070.0,-2355401.51699122,-4675420.58717452,3631019.42390381, + 1080.0,-2355152.37693328,-4675504.56721785,3631072.5349313, + 1090.0,-2354903.2327171,-4675588.53898758,3631125.63953384, + 1.1e3,-2354654.08434313,-4675672.50248355,3631178.73771134, + 1110.0,-2354404.86337217,-4675754.50046618,3631234.37690825, + 1120.0,-2354155.84214723,-4675830.29554952,3631297.80148619, + 1130.0,-2353909.99308372,-4675880.61174319,3631391.75187422, + 1140.0,-2353667.55938687,-4675917.7532863,3631500.33400567, + 1150.0,-2353425.14548842,-4675954.80919402,3631608.99321685, + 1160.0,-2353182.7274392,-4675991.85682064,3631717.64599126, + 1170.0,-2352940.30523964,-4676028.89616608,3631826.29232871, + 1180.0,-2352697.87889015,-4676065.92723028,3631934.93222899, + 1190.0,-2352455.44839119,-4676102.95001317,3632043.56569193, + 1.2e3,-2352213.01374317,-4676139.9645147,3632152.19271733, + 1210.0,-2351970.57494653,-4676176.97073479,3632260.81330501, + 1220.0,-2351728.13200169,-4676213.96867339,3632369.42745476, + 1230.0,-2351485.68490907,-4676250.95833043,3632478.03516641, + 1240.0,-2351243.23366913,-4676287.93970586,3632586.63643975, + 1250.0,-2351000.77828228,-4676324.91279958,3632695.2312746, + 1260.0,-2350758.31874895,-4676361.87761156,3632803.81967077, + 1270.0,-2350515.85506957,-4676398.83414172,3632912.40162807, + 1280.0,-2350273.38724458,-4676435.78239001,3633020.9771463, + 1290.0,-2350029.47875804,-4676477.3914753,3633124.49944636, + 1.3e3,-2349785.42349382,-4676519.45587927,3633227.51421022, + 1310.0,-2349541.36408501,-4676561.51200187,3633330.52253589, + 1320.0,-2349297.30053206,-4676603.55984302,3633433.52442318, + 1330.0,-2349053.2328354,-4676645.59940266,3633536.51987191, + 1340.0,-2348809.16099546,-4676687.63068071,3633639.50888189, + 1350.0,-2348565.08501267,-4676729.65367709,3633742.49145297, + 1360.0,-2348321.00488746,-4676771.66839174,3633845.46758493, + 1370.0,-2348076.92062027,-4676813.67482458,3633948.43727762, + 1380.0,-2347832.83221153,-4676855.67297554,3634051.40053084, + 1390.0,-2347588.73966167,-4676897.66284454,3634154.35734442, + 1.4e3,-2347344.64297113,-4676939.64443151,3634257.30771818, + 1410.0,-2347101.04731466,-4676979.96034855,3634362.04616856, + 1420.0,-2346858.26575513,-4677017.5834931,3634469.6847769, + 1430.0,-2346614.99348312,-4677056.89461847,3634575.46081166, + 1440.0,-2346369.55744615,-4677103.7262244,3634672.99207759, + 1450.0,-2346124.8248997,-4677147.9423086,3634773.39569376, + 1460.0,-2345880.74403986,-4677189.73374292,3634876.46090671, + 1470.0,-2345636.65904236,-4677231.51689469,3634979.51967852, + 1480.0,-2345392.56990766,-4677273.29176384,3635082.57200902, + 1490.0,-2345148.47663614,-4677315.05835029,3635185.61789803, + 1.5e3,-2344904.37922829,-4677356.81665397,3635288.65734536 + ] + } + } +] diff --git a/packages/sandcastle/public/SampleData/MultipartVehicle_part2.czml b/packages/sandcastle/public/SampleData/MultipartVehicle_part2.czml new file mode 100644 index 000000000000..a1a7f69045b5 --- /dev/null +++ b/packages/sandcastle/public/SampleData/MultipartVehicle_part2.czml @@ -0,0 +1,174 @@ +[ + { + "id":"document", + "version":"1.0" + }, + { + "id":"Vehicle", + "properties" : { + "fuel_remaining" : { + "epoch":"2012-08-04T16:00:00Z", + "number": [ + 3000, 19.9 + ] + } + }, + "position":{ + "interpolationAlgorithm":"LAGRANGE", + "interpolationDegree":1, + "epoch":"2012-08-04T16:00:00Z", + "cartesian":[ + 1510.0,-2344660.2776845,-4677398.56667482,3635391.69035084, + 1520.0,-2344416.17200522,-4677440.30841274,3635494.71691428, + 1530.0,-2344172.06219089,-4677482.04186768,3635597.7370355, + 1540.0,-2343927.94824192,-4677523.76703957,3635700.75071434, + 1550.0,-2343683.83015876,-4677565.48392832,3635803.75795058, + 1560.0,-2343439.70794184,-4677607.19253388,3635906.75874406, + 1570.0,-2343195.58159159,-4677648.89285615,3636009.75309461, + 1580.0,-2342951.45110844,-4677690.58489508,3636112.74100204, + 1590.0,-2342707.31649283,-4677732.2686506,3636215.72246616, + 1.6e3,-2342463.17774519,-4677773.94412263,3636318.6974868, + 1610.0,-2342219.03486595,-4677815.61131108,3636421.66606378, + 1620.0,-2341974.88785554,-4677857.2702159,3636524.6281969, + 1630.0,-2341730.7367144,-4677898.92083702,3636627.583886, + 1640.0,-2341486.58144295,-4677940.56317435,3636730.5331309, + 1650.0,-2341242.42204163,-4677982.19722784,3636833.4759314, + 1660.0,-2340998.25851088,-4678023.8229974,3636936.41228734, + 1670.0,-2340754.09085112,-4678065.44048297,3637039.34219853, + 1680.0,-2340509.91906279,-4678107.04968447,3637142.26566479, + 1690.0,-2340265.74314632,-4678148.65060182,3637245.18268593, + 1.7e3,-2340021.56310214,-4678190.24323497,3637348.09326179, + 1710.0,-2339777.37893069,-4678231.82758383,3637450.99739218, + 1720.0,-2339533.1906324,-4678273.40364834,3637553.8950769, + 1730.0,-2339288.99820769,-4678314.97142841,3637656.7863158, + 1740.0,-2339044.80165702,-4678356.530924,3637759.67110868, + 1750.0,-2338800.60098079,-4678398.082135,3637862.54945536, + 1760.0,-2338554.70615885,-4678446.63979812,3637957.53985359, + 1770.0,-2338307.34044549,-4678501.27725608,3638045.68346556, + 1780.0,-2338059.970607,-4678555.90643107,3638133.82063425, + 1790.0,-2337812.5966438,-4678610.527323,3638221.9513595, + 1.8e3,-2337565.21855632,-4678665.13993177,3638310.07564116, + 1810.0,-2337317.836345,-4678719.74425728,3638398.19347906, + 1820.0,-2337070.45001029,-4678774.34029945,3638486.30487305, + 1830.0,-2336823.05955262,-4678828.92805817,3638574.40982299, + 1840.0,-2336575.66497242,-4678883.50753334,3638662.50832871, + 1850.0,-2336327.1545835,-4678945.50581105,3638741.82308353, + 1860.0,-2336079.08419082,-4679004.31007705,3638824.91716907, + 1870.0,-2335832.84388937,-4679053.5438294,3638919.0484984, + 1880.0,-2335586.22540763,-4679104.36395041,3639011.37515412, + 1890.0,-2335339.10405755,-4679157.40812923,3639101.16216049, + 1.9e3,-2335091.77487812,-4679211.48259624,3639189.74611699, + 1910.0,-2334844.32516034,-4679266.14231747,3639277.63977539, + 1920.0,-2334596.87132354,-4679320.79375442,3639365.52698836, + 1930.0,-2334349.41336814,-4679375.436907,3639453.40775576, + 1940.0,-2334101.95129458,-4679430.07177509,3639541.28207743, + 1950.0,-2333854.48510331,-4679484.69835863,3639629.14995324, + 1960.0,-2333607.01479475,-4679539.31665749,3639717.011383, + 1970.0,-2333359.54036938,-4679593.9266716,3639804.86636658, + 1980.0,-2333112.06182757,-4679648.52840084,3639892.71490381, + 1990.0,-2332864.57916982,-4679703.12184515,3639980.55699455, + 2e3,-2332617.09239653,-4679757.70700441,3640068.39263865, + 2010.0,-2332369.60150815,-4679812.28387853,3640156.22183593, + 2020.0,-2332122.10650513,-4679866.85246742,3640244.04458626, + 2030.0,-2331874.6073879,-4679921.41277097,3640331.86088948, + 2040.0,-2331627.10415689,-4679975.96478911,3640419.67074542, + 2050.0,-2331379.59681254,-4680030.50852172,3640507.47415395, + 2060.0,-2331132.08535529,-4680085.04396871,3640595.27111491, + 2070.0,-2330884.56978558,-4680139.57113,3640683.06162813, + 2080.0,-2330637.7285141,-4680190.9395453,3640774.43710409, + 2090.0,-2330396.40663506,-4680225.151778,3640884.18994119, + 2.1e3,-2330163.10529565,-4680238.35673454,3641015.64723137, + 2110.0,-2329932.54342047,-4680245.95830447,3641152.4979079, + 2120.0,-2329701.97743661,-4680253.55158212,3641289.34212236, + 2130.0,-2329471.40734447,-4680261.13656747,3641426.1798745, + 2140.0,-2329240.83314447,-4680268.71326052,3641563.01116407, + 2150.0,-2329010.25483703,-4680276.28166125,3641699.83599085, + 2160.0,-2328779.67242253,-4680283.84176964,3641836.65435457, + 2170.0,-2328549.08590139,-4680291.3935857,3641973.46625501, + 2180.0,-2328318.49527404,-4680298.9371094,3642110.27169193, + 2190.0,-2328087.90054086,-4680306.47234074,3642247.07066509, + 2.2e3,-2327857.30170227,-4680313.99927971,3642383.86317423, + 2210.0,-2327626.69875869,-4680321.51792628,3642520.64921913, + 2220.0,-2327396.09171053,-4680329.02828045,3642657.42879954, + 2230.0,-2327165.48055818,-4680336.53034222,3642794.20191522, + 2240.0,-2326934.86530206,-4680344.02411158,3642930.96856595, + 2250.0,-2326704.24594258,-4680351.50958849,3643067.72875145, + 2260.0,-2326473.62248015,-4680358.98677296,3643204.48247151, + 2270.0,-2326242.99491518,-4680366.45566498,3643341.22972587, + 2280.0,-2326012.36324808,-4680373.91626453,3643477.97051431, + 2290.0,-2325781.72747925,-4680381.36857161,3643614.70483658, + 2.3e3,-2325551.08760911,-4680388.8125862,3643751.43269243, + 2310.0,-2325320.44363806,-4680396.24830829,3643888.15408163, + 2320.0,-2325089.79556653,-4680403.67573787,3644024.86900394, + 2330.0,-2324859.14339491,-4680411.09487493,3644161.57745912, + 2340.0,-2324628.48712361,-4680418.50571946,3644298.27944692, + 2350.0,-2324397.82675305,-4680425.90827145,3644434.97496711, + 2360.0,-2324167.16228363,-4680433.30253088,3644571.66401943, + 2370.0,-2323936.49371575,-4680440.68849774,3644708.34660367, + 2380.0,-2323705.82104985,-4680448.06617203,3644845.02271957, + 2390.0,-2323469.56457492,-4680467.5014928,3644969.83533712, + 2.4e3,-2323221.0622471,-4680536.92026793,3645038.62868541, + 2410.0,-2322977.80807152,-4680647.84474283,3645051.13992706, + 2420.0,-2322736.38267079,-4680764.64879631,3645054.97445125, + 2430.0,-2322494.9531628,-4680881.44457147,3645058.80252916, + 2440.0,-2322246.73779559,-4680970.18567741,3645102.6916578, + 2450.0,-2322002.53536924,-4681011.67497706,3645204.29544116, + 2460.0,-2321760.17882828,-4681045.91276755,3645313.96140727, + 2470.0,-2321513.45780318,-4681097.83227119,3645403.81543108, + 2480.0,-2321264.12028187,-4681176.5278287,3645461.15182806, + 2490.0,-2321016.67956395,-4681275.07588805,3645491.94679701, + 2.5e3,-2320769.58665668,-4681375.58594799,3645519.99961511, + 2510.0,-2320522.489649,-4681476.08772649,3645548.04598517, + 2520.0,-2320275.38854134,-4681576.5812234,3645576.08590716, + 2530.0,-2320027.79132447,-4681674.92626117,3645607.16040563, + 2540.0,-2319780.10642819,-4681772.89945148,3645638.74505341, + 2550.0,-2319532.41743371,-4681870.86435933,3645670.32325269, + 2560.0,-2319284.72434146,-4681968.82098454,3645701.89500342, + 2570.0,-2319037.02715189,-4682066.76932694,3645733.46030553, + 2580.0,-2318789.32586542,-4682164.70938637,3645765.01915898, + 2590.0,-2318542.12778997,-4682264.83612099,3645793.45100625, + 2.6e3,-2318295.04606153,-4682365.47569326,3645821.1355313, + 2610.0,-2318047.960237,-4682466.10698239,3645848.81360781, + 2620.0,-2317814.2136072,-4682593.27748455,3645834.19098143, + 2630.0,-2317595.23970305,-4682740.17783799,3645785.0493345, + 2640.0,-2317367.51895524,-4682877.20966947,3645754.00173306, + 2650.0,-2317125.45200646,-4682991.24847734,3645761.32874791, + 2660.0,-2316877.25477931,-4683085.09280115,3645798.27256564, + 2670.0,-2316627.76750724,-4683171.42599527,3645845.59470414, + 2680.0,-2316378.41358519,-4683244.04371304,3645910.31301292, + 2690.0,-2316132.23045195,-4683290.83587254,3646005.96208532, + 2.7e3,-2315886.04323336,-4683337.61973972,3646101.60469867, + 2710.0,-2315639.85192986,-4683384.3953145,3646197.24085278, + 2720.0,-2315393.65654188,-4683431.1625968,3646292.8705475, + 2730.0,-2315147.45706986,-4683477.92158654,3646388.49378265, + 2740.0,-2314901.25351424,-4683524.67228364,3646484.11055807, + 2750.0,-2314655.04587545,-4683571.41468801,3646579.72087358, + 2760.0,-2314408.83415392,-4683618.14879957,3646675.32472902, + 2770.0,-2314160.70351457,-4683675.04338742,3646759.15642247, + 2780.0,-2313911.58484161,-4683762.87653752,3646804.12173857, + 2790.0,-2313665.46479966,-4683867.13714076,3646826.2202591, + 2.8e3,-2313419.44574948,-4683971.81359651,3646847.70500867, + 2810.0,-2313173.422611,-4684076.48176683,3646869.18330826, + 2820.0,-2312927.39538468,-4684181.14165156,3646890.65515782, + 2830.0,-2312681.36407094,-4684285.79325049,3646912.12055732, + 2840.0,-2312435.3286702,-4684390.43656345,3646933.57950672, + 2850.0,-2312188.68106177,-4684492.14732495,3646959.14603188, + 2860.0,-2311939.2573735,-4684576.69232926,3647008.34294359, + 2870.0,-2311690.53184969,-4684637.85664359,3647086.91208669, + 2880.0,-2311447.74208361,-4684672.93987918,3647195.00103929, + 2890.0,-2311210.79617263,-4684692.62730813,3647319.03447912, + 2.9e3,-2310974.46339778,-4684710.81501905,3647444.57574765, + 2910.0,-2310738.12654788,-4684728.99443131,3647570.11054652, + 2920.0,-2310501.78562334,-4684747.16554491,3647695.63887553, + 2930.0,-2310265.44062458,-4684765.3283598,3647821.16073445, + 2940.0,-2310029.09155203,-4684783.48287596,3647946.67612307, + 2950.0,-2309792.7384061,-4684801.62909336,3648072.18504115, + 2960.0,-2309556.38118721,-4684819.76701196,3648197.6874885, + 2970.0,-2309320.01989578,-4684837.89663174,3648323.18346488, + 2980.0,-2309083.65453223,-4684856.01795267,3648448.67297006, + 2990.0,-2308847.28509697,-4684874.13097471,3648574.15600382, + 3e3,-2308612.03960687,-4684889.78192809,3648702.05314508 + ] + } + } +] diff --git a/packages/sandcastle/public/SampleData/MultipartVehicle_part3.czml b/packages/sandcastle/public/SampleData/MultipartVehicle_part3.czml new file mode 100644 index 000000000000..610d6cb8ea15 --- /dev/null +++ b/packages/sandcastle/public/SampleData/MultipartVehicle_part3.czml @@ -0,0 +1,114 @@ +[ + { + "id":"document", + "version":"1.0" + }, + { + "id":"Vehicle", + "properties" : { + "fuel_remaining" : { + "epoch":"2012-08-04T16:00:00Z", + "number": [ + 4500, 18.6 + ] + } + }, + "position":{ + "interpolationAlgorithm":"LAGRANGE", + "interpolationDegree":1, + "epoch":"2012-08-04T16:00:00Z", + "cartesian":[ + 3010.0,-2308376.92124893,-4684905.13917681,3648830.22535859, + 3020.0,-2308141.79882057,-4684920.48812622,3648958.39109918, + 3030.0,-2307906.6723222,-4684935.82877629,3649086.55036665, + 3040.0,-2307671.54175424,-4684951.161127,3649214.70316074, + 3050.0,-2307436.40711711,-4684966.48517831,3649342.84948124, + 3060.0,-2307201.26841123,-4684981.80093021,3649470.98932793, + 3070.0,-2306966.87575715,-4684995.59988061,3649600.57521538, + 3080.0,-2306740.26452813,-4684994.89962227,3649743.74372413, + 3090.0,-2306534.08725296,-4684964.25689728,3649912.24261594, + 3.1e3,-2306334.50436505,-4684925.31923873,3650087.15846994, + 3110.0,-2306134.91740775,-4684886.37327513,3650262.06783161, + 3120.0,-2305935.32638143,-4684847.41900655,3650436.97070063, + 3130.0,-2305735.73128644,-4684808.45643306,3650611.86707671, + 3140.0,-2305536.13212312,-4684769.48555472,3650786.75695952, + 3150.0,-2305336.52889186,-4684730.50637162,3650961.64034877, + 3160.0,-2305136.92159298,-4684691.51888382,3651136.51724414, + 3170.0,-2304937.31022685,-4684652.5230914,3651311.38764532, + 3180.0,-2304737.69479383,-4684613.51899443,3651486.25155201, + 3190.0,-2304538.07529427,-4684574.50659297,3651661.1089639, + 3.2e3,-2304338.45172854,-4684535.48588711,3651835.95988067, + 3210.0,-2304138.82409697,-4684496.45687691,3652010.80430203, + 3220.0,-2303939.19239993,-4684457.41956245,3652185.64222766, + 3230.0,-2303739.55663778,-4684418.37394379,3652360.47365726, + 3240.0,-2303539.91681086,-4684379.32002102,3652535.29859051, + 3250.0,-2303340.27291955,-4684340.25779419,3652710.11702711, + 3260.0,-2303140.62496419,-4684301.18726339,3652884.92896676, + 3270.0,-2302940.97294513,-4684262.10842868,3653059.73440913, + 3280.0,-2302741.31686273,-4684223.02129014,3653234.53335393, + 3290.0,-2302541.65671735,-4684183.92584784,3653409.32580085, + 3.3e3,-2302341.99250935,-4684144.82210185,3653584.11174957, + 3310.0,-2302142.32423908,-4684105.71005224,3653758.8911998, + 3320.0,-2301942.65190688,-4684066.5896991,3653933.66415121, + 3330.0,-2301742.97551314,-4684027.46104248,3654108.43060351, + 3340.0,-2301543.29505819,-4683988.32408245,3654283.19055638, + 3350.0,-2301343.61054239,-4683949.1788191,3654457.94400952, + 3360.0,-2301143.6827542,-4683910.31378064,3654632.47326169, + 3370.0,-2300935.59009252,-4683881.78114292,3654798.93579703, + 3380.0,-2300718.00641879,-4683866.2483759,3654954.7652541, + 3390.0,-2300494.16379595,-4683860.19477673,3655102.42228967, + 3.4e3,-2300270.31711639,-4683854.13287765,3655250.07283467, + 3410.0,-2300043.34951879,-4683853.58162531,3655392.64057225, + 3420.0,-2299798.57046824,-4683898.20991075,3655488.81767963, + 3430.0,-2299550.24237985,-4683986.73183877,3655531.32743747, + 3440.0,-2299302.19677383,-4684083.86163291,3655562.68543478, + 3450.0,-2299054.1471058,-4684180.98314055,3655594.03696606, + 3460.0,-2298806.09337623,-4684278.0963615,3655625.38203125, + 3470.0,-2298558.03558554,-4684375.2012956,3655656.7206303, + 3480.0,-2298309.97373417,-4684472.29794267,3655688.05276314, + 3490.0,-2298061.90782256,-4684569.38630254,3655719.37842974, + 3.5e3,-2297812.62950649,-4684659.16576897,3655760.74476938, + 3510.0,-2297564.67551281,-4684714.88851845,3655844.61445788, + 3520.0,-2297325.87128825,-4684739.27586645,3655962.6382433, + 3530.0,-2297109.10378606,-4684723.02803401,3656118.60908182, + 3540.0,-2296920.05504158,-4684672.53835408,3656300.84320686, + 3550.0,-2296752.93245501,-4684599.85791996,3656497.61758286, + 3560.0,-2296586.9421969,-4684526.13410832,3656694.99365465, + 3570.0,-2296420.94788222,-4684452.40199052,3656892.36321221, + 3580.0,-2296254.94951125,-4684378.66156669,3657089.72625519, + 3590.0,-2296088.9470843,-4684304.91283696,3657287.08278322, + 3.6e3,-2295922.94060166,-4684231.15580147,3657484.43279599, + 3610.0,-2295756.93006363,-4684157.39046036,3657681.77629313, + 3620.0,-2295590.91547051,-4684083.61681375,3657879.11327429, + 3630.0,-2295424.89682259,-4684009.83486178,3658076.44373913, + 3640.0,-2295258.87412016,-4683936.04460459,3658273.7676873, + 3650.0,-2295092.84736354,-4683862.24604231,3658471.08511845, + 3660.0,-2294926.816553,-4683788.43917507,3658668.39603222, + 3670.0,-2294760.78168886,-4683714.62400301,3658865.70042829, + 3680.0,-2294594.74277139,-4683640.80052626,3659062.99830628, + 3690.0,-2294428.69980091,-4683566.96874495,3659260.28966586, + 3.7e3,-2294262.65277771,-4683493.12865923,3659457.57450667, + 3710.0,-2294096.43623008,-4683419.42772878,3659654.7684149, + 3720.0,-2293929.99691308,-4683345.91340302,3659851.84422781, + 3730.0,-2293763.5535443,-4683272.39077326,3660048.91352102, + 3740.0,-2293597.10612405,-4683198.85983962,3660245.97629416, + 3750.0,-2293430.65465261,-4683125.32060225,3660443.03254689, + 3760.0,-2293260.27703319,-4683055.37159052,3660637.95010862, + 3770.0,-2293061.03795256,-4683015.37278429,3660812.74893793, + 3780.0,-2292840.33611906,-4683005.33804065,3660962.80786551, + 3790.0,-2292608.06534954,-4683013.68106842,3661096.69339637, + 3.8e3,-2292375.79053761,-4683022.01579957,3661230.57243073, + 3810.0,-2292143.51168366,-4683030.3422341,3661364.44496835, + 3820.0,-2291911.22878812,-4683038.66037197,3661498.311009, + 3830.0,-2291675.19260926,-4683056.38281492,3661622.54366342, + 3840.0,-2291444.11976688,-4683176.79169794,3661613.21949622, + 3850.0,-2291484.73184242,-4683029.11180042,3661775.58481802, + 3860.0,-2291570.38402198,-4682848.00432402,3661952.40110212, + 3870.0,-2291504.75912943,-4682707.90868127,3662171.13586741, + 3880.0,-2291437.4576409,-4682568.41526623,3662390.12822003, + 3890.0,-2291370.1520906,-4682428.91355119,3662609.11403735, + 3894.996219574019,-2291336.52323822,-4682359.21232197,3662718.52171165 + ] + } + } +] diff --git a/packages/sandcastle/public/SampleData/Vehicle.czml b/packages/sandcastle/public/SampleData/Vehicle.czml new file mode 100644 index 000000000000..712cd18f94bf --- /dev/null +++ b/packages/sandcastle/public/SampleData/Vehicle.czml @@ -0,0 +1,487 @@ + +[ + { + "id":"document", + "version":"1.0" + }, + { + "id":"Vehicle", + "availability":"2012-08-04T16:00:00Z/2012-08-04T17:04:54.9962195740191Z", + "billboard":{ + "eyeOffset":{ + "cartesian":[ + 0.0,0.0,0.0 + ] + }, + "horizontalOrigin":"CENTER", + "image":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAEISURBVEhLvVXBDYQwDOuojHKj8LhBbpTbpBCEkZsmIVTXq1RVQGrHiWlLmTTqPiZBlyLgy/KSZQ5JSHDQ/mCYCsC8106kDU0AdwRnvYZArWRcAl0dcYJq1hWCb3hBrumbDAVMwAC82WoRvgMnVMDBnB0nYZFTbE6BBvdUGqVqCbjBIk3PyFFR/NU7EKzru+qZsau3ryPwwCRLKYOzutZuCL6fUmWeJGzNzL/RxAMrUmASSCkkAayk2IxPlwhAAYGpsiHQjbLccfdOY5gKkCXAMi7SscAwbQpAnKyctWyUZ6z8ja3OGMepwD8asz+9FnSvbhU8uVOHFIwQsI3/p0CfhuqCSQuxLqsN6mu8SS+N42MAAAAASUVORK5CYII=", + "pixelOffset":{ + "cartesian2":[ + 0.0,0.0 + ] + }, + "scale":0.8333333333333334, + "show":[ + { + "interval":"2012-08-04T16:00:00Z/2012-08-04T18:00:00Z", + "boolean":true + } + ], + "verticalOrigin":"BOTTOM" + }, + "label":{ + "fillColor":[ + { + "interval":"2012-08-04T16:00:00Z/2012-08-04T18:00:00Z", + "rgba":[ + 255,255,0,255 + ] + } + ], + "font":"bold 10pt Segoe UI Semibold", + "horizontalOrigin":"LEFT", + "outlineColor":{ + "rgba":[ + 0,0,0,255 + ] + }, + "pixelOffset":{ + "cartesian2":[ + 10.0,0.0 + ] + }, + "scale":1.0, + "show":[ + { + "interval":"2012-08-04T16:00:00Z/2012-08-04T18:00:00Z", + "boolean":true + } + ], + "style":"FILL", + "text":"Vehicle", + "verticalOrigin":"CENTER" + }, + "path":{ + "material":{ + "solidColor":{ + "color":{ + "interval":"2012-08-04T16:00:00Z/2012-08-04T18:00:00Z", + "rgba":[ + 255,255,0,255 + ] + } + } + }, + "width":[ + { + "interval":"2012-08-04T16:00:00Z/2012-08-04T18:00:00Z", + "number":5.0 + } + ], + "show":[ + { + "interval":"2012-08-04T16:00:00Z/2012-08-04T18:00:00Z", + "boolean":true + } + ] + }, + "position":{ + "interpolationAlgorithm":"LAGRANGE", + "interpolationDegree":1, + "epoch":"2012-08-04T16:00:00Z", + "cartesian":[ + 0.0,-2379754.6637012,-4665332.88013588,3628133.68924173, + 10.0,-2379510.08905552,-4665419.64840452,3628182.20006795, + 20.0,-2379568.4769522,-4665555.3441867,3627970.83323261, + 30.0,-2379638.93786855,-4665691.63561896,3627750.82085873, + 40.0,-2379709.29834665,-4665827.9679646,3627530.80187124, + 50.0,-2379837.28064915,-4665847.7494347,3627422.12874017, + 60.0,-2379624.98289073,-4665907.50853722,3627484.1191848, + 70.0,-2379386.12743523,-4666029.54174431,3627483.83297459, + 80.0,-2379147.26777171,-4666151.56669944,3627483.5403492, + 90.0,-2378908.40390057,-4666273.58340244,3627483.24130864, + 1e2,-2378663.69301645,-4666379.62408751,3627507.14485116, + 110.0,-2378416.29648478,-4666444.93145547,3627584.82610021, + 120.0,-2378184.75115833,-4666458.05260387,3627718.84628509, + 130.0,-2377958.22637221,-4666461.11592729,3627862.42864636, + 140.0,-2377733.79758374,-4666460.508441,3628009.31669747, + 150.0,-2377509.36460154,-4666459.89268533,3628156.19830638, + 160.0,-2377284.92742603,-4666459.26866028,3628303.07347284, + 170.0,-2377060.48605759,-4666458.63636585,3628449.9421966, + 180.0,-2376835.38472681,-4666459.12413084,3628595.78980713, + 190.0,-2376609.71084875,-4666460.58154837,3628740.75156098, + 2e2,-2376384.03277903,-4666462.03069678,3628885.70687201, + 210.0,-2376158.35051806,-4666463.47157605,3629030.65573998, + 220.0,-2375928.48736859,-4666473.69575712,3629167.08552075, + 230.0,-2375685.23921682,-4666516.66377513,3629270.3788586, + 240.0,-2375437.34307768,-4666580.50029931,3629350.0215939, + 250.0,-2375189.01133306,-4666646.99320452,3629426.53515423, + 260.0,-2374940.52675783,-4666719.29042452,3629495.71527129, + 270.0,-2374695.15633549,-4666818.94185605,3629527.91579302, + 280.0,-2374469.42323533,-4666959.02687352,3629495.69349509, + 290.0,-2374249.06659405,-4667105.51477438,3629451.77975513, + 3e2,-2374028.70574724,-4667251.99442379,3629407.85959417, + 310.0,-2373808.3406953,-4667398.46582147,3629363.9330123, + 320.0,-2373585.10773309,-4667542.05948567,3629325.52597676, + 330.0,-2373360.83645524,-4667684.60869937,3629289.10800226, + 340.0,-2373136.5609746,-4667827.1496603,3629252.68360778, + 350.0,-2372912.28129155,-4667969.68236819,3629216.25279339, + 360.0,-2372687.9974065,-4668112.20682281,3629179.81555915, + 370.0,-2372463.70931983,-4668254.72302389,3629143.37190511, + 380.0,-2372239.41703195,-4668397.2309712,3629106.92183136, + 390.0,-2372018.7615611,-4668543.12509124,3629063.76398058, + 4e2,-2371803.72586004,-4668694.25404103,3629010.24868951, + 410.0,-2371587.17705087,-4668844.01756398,3628959.44085712, + 420.0,-2371365.33472237,-4668989.01539779,3628918.13984128, + 430.0,-2371134.7547923,-4669122.83460485,3628896.77687771, + 440.0,-2370898.14635373,-4669248.94021679,3628889.16522147, + 450.0,-2370660.31892949,-4669372.89697404,3628885.07134974, + 460.0,-2370422.47459187,-4669496.82305927,3628881.00796265, + 470.0,-2370184.62606153,-4669620.7408867,3628876.93815788, + 480.0,-2369946.77333888,-4669744.65045611,3628872.86193545, + 490.0,-2369708.91642433,-4669868.55176729,3628868.77929537, + 5e2,-2369471.05531832,-4669992.44482001,3628864.69023764, + 510.0,-2369233.19002126,-4670116.32961405,3628860.59476226, + 520.0,-2368989.65950726,-4670225.94237244,3628878.39787596, + 530.0,-2368742.64810033,-4670324.93393451,3628912.01606989, + 540.0,-2368494.95906007,-4670419.65546435,3628951.51257903, + 550.0,-2368248.2848424,-4670519.53079746,3628983.74302284, + 560.0,-2368001.37437725,-4670618.8319301,3629016.84097985, + 570.0,-2367753.95809484,-4670715.82368808,3629053.19940679, + 580.0,-2367506.53762994,-4670812.80718267,3629089.55141416, + 590.0,-2367259.11298298,-4670909.78241366,3629125.89700192, + 6e2,-2367011.6841544,-4671006.74938092,3629162.23617, + 610.0,-2366764.25114462,-4671103.70808425,3629198.56891833, + 620.0,-2366516.81395411,-4671200.6585235,3629234.89524684, + 630.0,-2366269.37258329,-4671297.60069848,3629271.21515549, + 640.0,-2366021.9270326,-4671394.53460904,3629307.52864419, + 650.0,-2365774.47730247,-4671491.460255,3629343.8357129, + 660.0,-2365527.02339333,-4671588.37763618,3629380.13636155, + 670.0,-2365279.56530564,-4671685.28675242,3629416.43059006, + 680.0,-2365032.10303983,-4671782.18760355,3629452.71839837, + 690.0,-2364784.63659633,-4671879.0801894,3629488.99978644, + 7e2,-2364537.16597558,-4671975.96450979,3629525.27475418, + 710.0,-2364289.69117801,-4672072.84056456,3629561.54330154, + 720.0,-2364042.21220407,-4672169.70835353,3629597.80542845, + 730.0,-2363794.72905419,-4672266.56787654,3629634.06113485, + 740.0,-2363547.2417288,-4672363.41913342,3629670.31042068, + 750.0,-2363299.75022835,-4672460.26212398,3629706.55328587, + 760.0,-2363052.25455328,-4672557.09684808,3629742.78973036, + 770.0,-2362805.96213832,-4672658.44235501,3629772.46055, + 780.0,-2362566.28756432,-4672777.84646024,3629774.74120741, + 790.0,-2362330.01543718,-4672904.47715606,3629765.56158533, + 8e2,-2362093.73913086,-4673031.09958839,3629756.37554393, + 810.0,-2361857.4586458,-4673157.71375702,3629747.18308323, + 820.0,-2361621.17398239,-4673284.31966172,3629737.98420324, + 830.0,-2361379.13396171,-4673398.62592987,3629748.21496888, + 840.0,-2361130.58722369,-4673488.59963461,3629793.74986512, + 850.0,-2360881.58098042,-4673573.14384665,3629846.50583809, + 860.0,-2360632.51954154,-4673657.07225834,3629900.06533886, + 870.0,-2360383.45393477,-4673740.99239963,3629953.61841672, + 880.0,-2360134.38416057,-4673824.90427038,3630007.16507155, + 890.0,-2359885.31021938,-4673908.80787044,3630060.70530326, + 9e2,-2359636.23211162,-4673992.70319966,3630114.23911177, + 910.0,-2359387.14983775,-4674076.5902579,3630167.76649697, + 920.0,-2359138.06339821,-4674160.469045,3630221.28745878, + 930.0,-2358889.14548278,-4674246.80164025,3630271.54165003, + 940.0,-2358640.17887385,-4674332.39488805,3630322.75317441, + 950.0,-2358391.03374684,-4674415.32432296,3630377.46713032, + 960.0,-2358141.88445605,-4674498.24548602,3630432.17466229, + 970.0,-2357892.7310019,-4674581.15837706,3630486.87577026, + 980.0,-2357643.59031994,-4674664.39449658,3630541.13554932, + 990.0,-2357394.48770584,-4674748.44899573,3630594.30439711, + 1e3,-2357145.38092955,-4674832.4952226,3630647.46682079, + 1010.0,-2356896.26999152,-4674916.53317705,3630700.62282028, + 1020.0,-2356647.15489217,-4675000.56285892,3630753.77239547, + 1030.0,-2356398.03563196,-4675084.58426807,3630806.91554629, + 1040.0,-2356148.91221132,-4675168.59740435,3630860.05227262, + 1050.0,-2355899.78463069,-4675252.60226762,3630913.18257437, + 1060.0,-2355650.65289051,-4675336.59885772,3630966.30645147, + 1070.0,-2355401.51699122,-4675420.58717452,3631019.42390381, + 1080.0,-2355152.37693328,-4675504.56721785,3631072.5349313, + 1090.0,-2354903.2327171,-4675588.53898758,3631125.63953384, + 1.1e3,-2354654.08434313,-4675672.50248355,3631178.73771134, + 1110.0,-2354404.86337217,-4675754.50046618,3631234.37690825, + 1120.0,-2354155.84214723,-4675830.29554952,3631297.80148619, + 1130.0,-2353909.99308372,-4675880.61174319,3631391.75187422, + 1140.0,-2353667.55938687,-4675917.7532863,3631500.33400567, + 1150.0,-2353425.14548842,-4675954.80919402,3631608.99321685, + 1160.0,-2353182.7274392,-4675991.85682064,3631717.64599126, + 1170.0,-2352940.30523964,-4676028.89616608,3631826.29232871, + 1180.0,-2352697.87889015,-4676065.92723028,3631934.93222899, + 1190.0,-2352455.44839119,-4676102.95001317,3632043.56569193, + 1.2e3,-2352213.01374317,-4676139.9645147,3632152.19271733, + 1210.0,-2351970.57494653,-4676176.97073479,3632260.81330501, + 1220.0,-2351728.13200169,-4676213.96867339,3632369.42745476, + 1230.0,-2351485.68490907,-4676250.95833043,3632478.03516641, + 1240.0,-2351243.23366913,-4676287.93970586,3632586.63643975, + 1250.0,-2351000.77828228,-4676324.91279958,3632695.2312746, + 1260.0,-2350758.31874895,-4676361.87761156,3632803.81967077, + 1270.0,-2350515.85506957,-4676398.83414172,3632912.40162807, + 1280.0,-2350273.38724458,-4676435.78239001,3633020.9771463, + 1290.0,-2350029.47875804,-4676477.3914753,3633124.49944636, + 1.3e3,-2349785.42349382,-4676519.45587927,3633227.51421022, + 1310.0,-2349541.36408501,-4676561.51200187,3633330.52253589, + 1320.0,-2349297.30053206,-4676603.55984302,3633433.52442318, + 1330.0,-2349053.2328354,-4676645.59940266,3633536.51987191, + 1340.0,-2348809.16099546,-4676687.63068071,3633639.50888189, + 1350.0,-2348565.08501267,-4676729.65367709,3633742.49145297, + 1360.0,-2348321.00488746,-4676771.66839174,3633845.46758493, + 1370.0,-2348076.92062027,-4676813.67482458,3633948.43727762, + 1380.0,-2347832.83221153,-4676855.67297554,3634051.40053084, + 1390.0,-2347588.73966167,-4676897.66284454,3634154.35734442, + 1.4e3,-2347344.64297113,-4676939.64443151,3634257.30771818, + 1410.0,-2347101.04731466,-4676979.96034855,3634362.04616856, + 1420.0,-2346858.26575513,-4677017.5834931,3634469.6847769, + 1430.0,-2346614.99348312,-4677056.89461847,3634575.46081166, + 1440.0,-2346369.55744615,-4677103.7262244,3634672.99207759, + 1450.0,-2346124.8248997,-4677147.9423086,3634773.39569376, + 1460.0,-2345880.74403986,-4677189.73374292,3634876.46090671, + 1470.0,-2345636.65904236,-4677231.51689469,3634979.51967852, + 1480.0,-2345392.56990766,-4677273.29176384,3635082.57200902, + 1490.0,-2345148.47663614,-4677315.05835029,3635185.61789803, + 1.5e3,-2344904.37922829,-4677356.81665397,3635288.65734536, + 1510.0,-2344660.2776845,-4677398.56667482,3635391.69035084, + 1520.0,-2344416.17200522,-4677440.30841274,3635494.71691428, + 1530.0,-2344172.06219089,-4677482.04186768,3635597.7370355, + 1540.0,-2343927.94824192,-4677523.76703957,3635700.75071434, + 1550.0,-2343683.83015876,-4677565.48392832,3635803.75795058, + 1560.0,-2343439.70794184,-4677607.19253388,3635906.75874406, + 1570.0,-2343195.58159159,-4677648.89285615,3636009.75309461, + 1580.0,-2342951.45110844,-4677690.58489508,3636112.74100204, + 1590.0,-2342707.31649283,-4677732.2686506,3636215.72246616, + 1.6e3,-2342463.17774519,-4677773.94412263,3636318.6974868, + 1610.0,-2342219.03486595,-4677815.61131108,3636421.66606378, + 1620.0,-2341974.88785554,-4677857.2702159,3636524.6281969, + 1630.0,-2341730.7367144,-4677898.92083702,3636627.583886, + 1640.0,-2341486.58144295,-4677940.56317435,3636730.5331309, + 1650.0,-2341242.42204163,-4677982.19722784,3636833.4759314, + 1660.0,-2340998.25851088,-4678023.8229974,3636936.41228734, + 1670.0,-2340754.09085112,-4678065.44048297,3637039.34219853, + 1680.0,-2340509.91906279,-4678107.04968447,3637142.26566479, + 1690.0,-2340265.74314632,-4678148.65060182,3637245.18268593, + 1.7e3,-2340021.56310214,-4678190.24323497,3637348.09326179, + 1710.0,-2339777.37893069,-4678231.82758383,3637450.99739218, + 1720.0,-2339533.1906324,-4678273.40364834,3637553.8950769, + 1730.0,-2339288.99820769,-4678314.97142841,3637656.7863158, + 1740.0,-2339044.80165702,-4678356.530924,3637759.67110868, + 1750.0,-2338800.60098079,-4678398.082135,3637862.54945536, + 1760.0,-2338554.70615885,-4678446.63979812,3637957.53985359, + 1770.0,-2338307.34044549,-4678501.27725608,3638045.68346556, + 1780.0,-2338059.970607,-4678555.90643107,3638133.82063425, + 1790.0,-2337812.5966438,-4678610.527323,3638221.9513595, + 1.8e3,-2337565.21855632,-4678665.13993177,3638310.07564116, + 1810.0,-2337317.836345,-4678719.74425728,3638398.19347906, + 1820.0,-2337070.45001029,-4678774.34029945,3638486.30487305, + 1830.0,-2336823.05955262,-4678828.92805817,3638574.40982299, + 1840.0,-2336575.66497242,-4678883.50753334,3638662.50832871, + 1850.0,-2336327.1545835,-4678945.50581105,3638741.82308353, + 1860.0,-2336079.08419082,-4679004.31007705,3638824.91716907, + 1870.0,-2335832.84388937,-4679053.5438294,3638919.0484984, + 1880.0,-2335586.22540763,-4679104.36395041,3639011.37515412, + 1890.0,-2335339.10405755,-4679157.40812923,3639101.16216049, + 1.9e3,-2335091.77487812,-4679211.48259624,3639189.74611699, + 1910.0,-2334844.32516034,-4679266.14231747,3639277.63977539, + 1920.0,-2334596.87132354,-4679320.79375442,3639365.52698836, + 1930.0,-2334349.41336814,-4679375.436907,3639453.40775576, + 1940.0,-2334101.95129458,-4679430.07177509,3639541.28207743, + 1950.0,-2333854.48510331,-4679484.69835863,3639629.14995324, + 1960.0,-2333607.01479475,-4679539.31665749,3639717.011383, + 1970.0,-2333359.54036938,-4679593.9266716,3639804.86636658, + 1980.0,-2333112.06182757,-4679648.52840084,3639892.71490381, + 1990.0,-2332864.57916982,-4679703.12184515,3639980.55699455, + 2e3,-2332617.09239653,-4679757.70700441,3640068.39263865, + 2010.0,-2332369.60150815,-4679812.28387853,3640156.22183593, + 2020.0,-2332122.10650513,-4679866.85246742,3640244.04458626, + 2030.0,-2331874.6073879,-4679921.41277097,3640331.86088948, + 2040.0,-2331627.10415689,-4679975.96478911,3640419.67074542, + 2050.0,-2331379.59681254,-4680030.50852172,3640507.47415395, + 2060.0,-2331132.08535529,-4680085.04396871,3640595.27111491, + 2070.0,-2330884.56978558,-4680139.57113,3640683.06162813, + 2080.0,-2330637.7285141,-4680190.9395453,3640774.43710409, + 2090.0,-2330396.40663506,-4680225.151778,3640884.18994119, + 2.1e3,-2330163.10529565,-4680238.35673454,3641015.64723137, + 2110.0,-2329932.54342047,-4680245.95830447,3641152.4979079, + 2120.0,-2329701.97743661,-4680253.55158212,3641289.34212236, + 2130.0,-2329471.40734447,-4680261.13656747,3641426.1798745, + 2140.0,-2329240.83314447,-4680268.71326052,3641563.01116407, + 2150.0,-2329010.25483703,-4680276.28166125,3641699.83599085, + 2160.0,-2328779.67242253,-4680283.84176964,3641836.65435457, + 2170.0,-2328549.08590139,-4680291.3935857,3641973.46625501, + 2180.0,-2328318.49527404,-4680298.9371094,3642110.27169193, + 2190.0,-2328087.90054086,-4680306.47234074,3642247.07066509, + 2.2e3,-2327857.30170227,-4680313.99927971,3642383.86317423, + 2210.0,-2327626.69875869,-4680321.51792628,3642520.64921913, + 2220.0,-2327396.09171053,-4680329.02828045,3642657.42879954, + 2230.0,-2327165.48055818,-4680336.53034222,3642794.20191522, + 2240.0,-2326934.86530206,-4680344.02411158,3642930.96856595, + 2250.0,-2326704.24594258,-4680351.50958849,3643067.72875145, + 2260.0,-2326473.62248015,-4680358.98677296,3643204.48247151, + 2270.0,-2326242.99491518,-4680366.45566498,3643341.22972587, + 2280.0,-2326012.36324808,-4680373.91626453,3643477.97051431, + 2290.0,-2325781.72747925,-4680381.36857161,3643614.70483658, + 2.3e3,-2325551.08760911,-4680388.8125862,3643751.43269243, + 2310.0,-2325320.44363806,-4680396.24830829,3643888.15408163, + 2320.0,-2325089.79556653,-4680403.67573787,3644024.86900394, + 2330.0,-2324859.14339491,-4680411.09487493,3644161.57745912, + 2340.0,-2324628.48712361,-4680418.50571946,3644298.27944692, + 2350.0,-2324397.82675305,-4680425.90827145,3644434.97496711, + 2360.0,-2324167.16228363,-4680433.30253088,3644571.66401943, + 2370.0,-2323936.49371575,-4680440.68849774,3644708.34660367, + 2380.0,-2323705.82104985,-4680448.06617203,3644845.02271957, + 2390.0,-2323469.56457492,-4680467.5014928,3644969.83533712, + 2.4e3,-2323221.0622471,-4680536.92026793,3645038.62868541, + 2410.0,-2322977.80807152,-4680647.84474283,3645051.13992706, + 2420.0,-2322736.38267079,-4680764.64879631,3645054.97445125, + 2430.0,-2322494.9531628,-4680881.44457147,3645058.80252916, + 2440.0,-2322246.73779559,-4680970.18567741,3645102.6916578, + 2450.0,-2322002.53536924,-4681011.67497706,3645204.29544116, + 2460.0,-2321760.17882828,-4681045.91276755,3645313.96140727, + 2470.0,-2321513.45780318,-4681097.83227119,3645403.81543108, + 2480.0,-2321264.12028187,-4681176.5278287,3645461.15182806, + 2490.0,-2321016.67956395,-4681275.07588805,3645491.94679701, + 2.5e3,-2320769.58665668,-4681375.58594799,3645519.99961511, + 2510.0,-2320522.489649,-4681476.08772649,3645548.04598517, + 2520.0,-2320275.38854134,-4681576.5812234,3645576.08590716, + 2530.0,-2320027.79132447,-4681674.92626117,3645607.16040563, + 2540.0,-2319780.10642819,-4681772.89945148,3645638.74505341, + 2550.0,-2319532.41743371,-4681870.86435933,3645670.32325269, + 2560.0,-2319284.72434146,-4681968.82098454,3645701.89500342, + 2570.0,-2319037.02715189,-4682066.76932694,3645733.46030553, + 2580.0,-2318789.32586542,-4682164.70938637,3645765.01915898, + 2590.0,-2318542.12778997,-4682264.83612099,3645793.45100625, + 2.6e3,-2318295.04606153,-4682365.47569326,3645821.1355313, + 2610.0,-2318047.960237,-4682466.10698239,3645848.81360781, + 2620.0,-2317814.2136072,-4682593.27748455,3645834.19098143, + 2630.0,-2317595.23970305,-4682740.17783799,3645785.0493345, + 2640.0,-2317367.51895524,-4682877.20966947,3645754.00173306, + 2650.0,-2317125.45200646,-4682991.24847734,3645761.32874791, + 2660.0,-2316877.25477931,-4683085.09280115,3645798.27256564, + 2670.0,-2316627.76750724,-4683171.42599527,3645845.59470414, + 2680.0,-2316378.41358519,-4683244.04371304,3645910.31301292, + 2690.0,-2316132.23045195,-4683290.83587254,3646005.96208532, + 2.7e3,-2315886.04323336,-4683337.61973972,3646101.60469867, + 2710.0,-2315639.85192986,-4683384.3953145,3646197.24085278, + 2720.0,-2315393.65654188,-4683431.1625968,3646292.8705475, + 2730.0,-2315147.45706986,-4683477.92158654,3646388.49378265, + 2740.0,-2314901.25351424,-4683524.67228364,3646484.11055807, + 2750.0,-2314655.04587545,-4683571.41468801,3646579.72087358, + 2760.0,-2314408.83415392,-4683618.14879957,3646675.32472902, + 2770.0,-2314160.70351457,-4683675.04338742,3646759.15642247, + 2780.0,-2313911.58484161,-4683762.87653752,3646804.12173857, + 2790.0,-2313665.46479966,-4683867.13714076,3646826.2202591, + 2.8e3,-2313419.44574948,-4683971.81359651,3646847.70500867, + 2810.0,-2313173.422611,-4684076.48176683,3646869.18330826, + 2820.0,-2312927.39538468,-4684181.14165156,3646890.65515782, + 2830.0,-2312681.36407094,-4684285.79325049,3646912.12055732, + 2840.0,-2312435.3286702,-4684390.43656345,3646933.57950672, + 2850.0,-2312188.68106177,-4684492.14732495,3646959.14603188, + 2860.0,-2311939.2573735,-4684576.69232926,3647008.34294359, + 2870.0,-2311690.53184969,-4684637.85664359,3647086.91208669, + 2880.0,-2311447.74208361,-4684672.93987918,3647195.00103929, + 2890.0,-2311210.79617263,-4684692.62730813,3647319.03447912, + 2.9e3,-2310974.46339778,-4684710.81501905,3647444.57574765, + 2910.0,-2310738.12654788,-4684728.99443131,3647570.11054652, + 2920.0,-2310501.78562334,-4684747.16554491,3647695.63887553, + 2930.0,-2310265.44062458,-4684765.3283598,3647821.16073445, + 2940.0,-2310029.09155203,-4684783.48287596,3647946.67612307, + 2950.0,-2309792.7384061,-4684801.62909336,3648072.18504115, + 2960.0,-2309556.38118721,-4684819.76701196,3648197.6874885, + 2970.0,-2309320.01989578,-4684837.89663174,3648323.18346488, + 2980.0,-2309083.65453223,-4684856.01795267,3648448.67297006, + 2990.0,-2308847.28509697,-4684874.13097471,3648574.15600382, + 3e3,-2308612.03960687,-4684889.78192809,3648702.05314508, + 3010.0,-2308376.92124893,-4684905.13917681,3648830.22535859, + 3020.0,-2308141.79882057,-4684920.48812622,3648958.39109918, + 3030.0,-2307906.6723222,-4684935.82877629,3649086.55036665, + 3040.0,-2307671.54175424,-4684951.161127,3649214.70316074, + 3050.0,-2307436.40711711,-4684966.48517831,3649342.84948124, + 3060.0,-2307201.26841123,-4684981.80093021,3649470.98932793, + 3070.0,-2306966.87575715,-4684995.59988061,3649600.57521538, + 3080.0,-2306740.26452813,-4684994.89962227,3649743.74372413, + 3090.0,-2306534.08725296,-4684964.25689728,3649912.24261594, + 3.1e3,-2306334.50436505,-4684925.31923873,3650087.15846994, + 3110.0,-2306134.91740775,-4684886.37327513,3650262.06783161, + 3120.0,-2305935.32638143,-4684847.41900655,3650436.97070063, + 3130.0,-2305735.73128644,-4684808.45643306,3650611.86707671, + 3140.0,-2305536.13212312,-4684769.48555472,3650786.75695952, + 3150.0,-2305336.52889186,-4684730.50637162,3650961.64034877, + 3160.0,-2305136.92159298,-4684691.51888382,3651136.51724414, + 3170.0,-2304937.31022685,-4684652.5230914,3651311.38764532, + 3180.0,-2304737.69479383,-4684613.51899443,3651486.25155201, + 3190.0,-2304538.07529427,-4684574.50659297,3651661.1089639, + 3.2e3,-2304338.45172854,-4684535.48588711,3651835.95988067, + 3210.0,-2304138.82409697,-4684496.45687691,3652010.80430203, + 3220.0,-2303939.19239993,-4684457.41956245,3652185.64222766, + 3230.0,-2303739.55663778,-4684418.37394379,3652360.47365726, + 3240.0,-2303539.91681086,-4684379.32002102,3652535.29859051, + 3250.0,-2303340.27291955,-4684340.25779419,3652710.11702711, + 3260.0,-2303140.62496419,-4684301.18726339,3652884.92896676, + 3270.0,-2302940.97294513,-4684262.10842868,3653059.73440913, + 3280.0,-2302741.31686273,-4684223.02129014,3653234.53335393, + 3290.0,-2302541.65671735,-4684183.92584784,3653409.32580085, + 3.3e3,-2302341.99250935,-4684144.82210185,3653584.11174957, + 3310.0,-2302142.32423908,-4684105.71005224,3653758.8911998, + 3320.0,-2301942.65190688,-4684066.5896991,3653933.66415121, + 3330.0,-2301742.97551314,-4684027.46104248,3654108.43060351, + 3340.0,-2301543.29505819,-4683988.32408245,3654283.19055638, + 3350.0,-2301343.61054239,-4683949.1788191,3654457.94400952, + 3360.0,-2301143.6827542,-4683910.31378064,3654632.47326169, + 3370.0,-2300935.59009252,-4683881.78114292,3654798.93579703, + 3380.0,-2300718.00641879,-4683866.2483759,3654954.7652541, + 3390.0,-2300494.16379595,-4683860.19477673,3655102.42228967, + 3.4e3,-2300270.31711639,-4683854.13287765,3655250.07283467, + 3410.0,-2300043.34951879,-4683853.58162531,3655392.64057225, + 3420.0,-2299798.57046824,-4683898.20991075,3655488.81767963, + 3430.0,-2299550.24237985,-4683986.73183877,3655531.32743747, + 3440.0,-2299302.19677383,-4684083.86163291,3655562.68543478, + 3450.0,-2299054.1471058,-4684180.98314055,3655594.03696606, + 3460.0,-2298806.09337623,-4684278.0963615,3655625.38203125, + 3470.0,-2298558.03558554,-4684375.2012956,3655656.7206303, + 3480.0,-2298309.97373417,-4684472.29794267,3655688.05276314, + 3490.0,-2298061.90782256,-4684569.38630254,3655719.37842974, + 3.5e3,-2297812.62950649,-4684659.16576897,3655760.74476938, + 3510.0,-2297564.67551281,-4684714.88851845,3655844.61445788, + 3520.0,-2297325.87128825,-4684739.27586645,3655962.6382433, + 3530.0,-2297109.10378606,-4684723.02803401,3656118.60908182, + 3540.0,-2296920.05504158,-4684672.53835408,3656300.84320686, + 3550.0,-2296752.93245501,-4684599.85791996,3656497.61758286, + 3560.0,-2296586.9421969,-4684526.13410832,3656694.99365465, + 3570.0,-2296420.94788222,-4684452.40199052,3656892.36321221, + 3580.0,-2296254.94951125,-4684378.66156669,3657089.72625519, + 3590.0,-2296088.9470843,-4684304.91283696,3657287.08278322, + 3.6e3,-2295922.94060166,-4684231.15580147,3657484.43279599, + 3610.0,-2295756.93006363,-4684157.39046036,3657681.77629313, + 3620.0,-2295590.91547051,-4684083.61681375,3657879.11327429, + 3630.0,-2295424.89682259,-4684009.83486178,3658076.44373913, + 3640.0,-2295258.87412016,-4683936.04460459,3658273.7676873, + 3650.0,-2295092.84736354,-4683862.24604231,3658471.08511845, + 3660.0,-2294926.816553,-4683788.43917507,3658668.39603222, + 3670.0,-2294760.78168886,-4683714.62400301,3658865.70042829, + 3680.0,-2294594.74277139,-4683640.80052626,3659062.99830628, + 3690.0,-2294428.69980091,-4683566.96874495,3659260.28966586, + 3.7e3,-2294262.65277771,-4683493.12865923,3659457.57450667, + 3710.0,-2294096.43623008,-4683419.42772878,3659654.7684149, + 3720.0,-2293929.99691308,-4683345.91340302,3659851.84422781, + 3730.0,-2293763.5535443,-4683272.39077326,3660048.91352102, + 3740.0,-2293597.10612405,-4683198.85983962,3660245.97629416, + 3750.0,-2293430.65465261,-4683125.32060225,3660443.03254689, + 3760.0,-2293260.27703319,-4683055.37159052,3660637.95010862, + 3770.0,-2293061.03795256,-4683015.37278429,3660812.74893793, + 3780.0,-2292840.33611906,-4683005.33804065,3660962.80786551, + 3790.0,-2292608.06534954,-4683013.68106842,3661096.69339637, + 3.8e3,-2292375.79053761,-4683022.01579957,3661230.57243073, + 3810.0,-2292143.51168366,-4683030.3422341,3661364.44496835, + 3820.0,-2291911.22878812,-4683038.66037197,3661498.311009, + 3830.0,-2291675.19260926,-4683056.38281492,3661622.54366342, + 3840.0,-2291444.11976688,-4683176.79169794,3661613.21949622, + 3850.0,-2291484.73184242,-4683029.11180042,3661775.58481802, + 3860.0,-2291570.38402198,-4682848.00432402,3661952.40110212, + 3870.0,-2291504.75912943,-4682707.90868127,3662171.13586741, + 3880.0,-2291437.4576409,-4682568.41526623,3662390.12822003, + 3890.0,-2291370.1520906,-4682428.91355119,3662609.11403735, + 3894.996219574019,-2291336.52323822,-4682359.21232197,3662718.52171165 + ] + } + } +] \ No newline at end of file diff --git a/packages/sandcastle/public/SampleData/cesium_stripes.png b/packages/sandcastle/public/SampleData/cesium_stripes.png new file mode 100644 index 0000000000000000000000000000000000000000..973f49ca254a60674165bc5fa668e5e62b242381 GIT binary patch literal 18714 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 BB}o7P literal 0 HcmV?d00001 diff --git a/packages/sandcastle/public/SampleData/circular_particle.png b/packages/sandcastle/public/SampleData/circular_particle.png new file mode 100644 index 0000000000000000000000000000000000000000..ca1cc10d6b2d40cfd2125b8d37050cbd55f3a645 GIT binary patch literal 975 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmUKs7M+SzC{oH>NS%G}c0*}aI z1_r)EAj~ML;ne^Xlq_+LC<)F_D=AMbN@XZW%*-p%%S$a$Fwry6Gqk*NZBq&Z1GA5( zi(^QH``hcb{k@J7$3EWOnr+U)DYSm>bS}pq3?(97QmU+WO)Y%_y7w74@0xK%Nv&mK z6`gvav%_ND{gbw{C)d82_gG|i*W4%beV*-mmpyOh&h&Hdjzs-_AHDv1wolti1KG4g zIWx4s^mbmn@a^-lyt50=TxI6yu3EC{DwGR z>*I$h5ShLhxyAJ^!r_ai=5SdbZY)rm!}t79Yr)0~=4x)v+U|P&7ws3d&ye61#877_>w1UAudtoeji6rzW0m z7C&F-t8PHr$wsk56JZ|6Qv3f;)G*Qc>TwOIZ?j zocf1%f6%Pqyw6peoMf`4=*g!CM<;(z@x7kQX{8>&YLe*W&s&y;9sS|_Luz09{D)AV z0{ye6;?ulUFL&uW@^>yOoEx%bQPH|>*IxO2P@eJSyHXD@n82>`zjxU*cDw3|02_^W zTe6pK5}p2e>(MYvi^}X~c}I}X`QvOV&tECIJ8gmb)z!}u3%AGWi>^B{XY*R1cy{ib zwlJtwYe81M-?jYe>t~IH$77ABuDfyT)$}ZclVgBRZc>ff${+DnIiThC;RHcDKCV~A z5?eVkpPrD_ak_U}EOB?+@8;FTx;7m8hkhHpGF>uNc{;oPJm>X^)g628%kf8-8}IO2 zf9QAu)9Ni()mrx%8cIc37FB+DWcfu=s-}ydExyk34zE9R^6Je;&qZ!@ghfw9?-!B7 z{Kt+xV1MFaA-yM!XYHwLR`IUOF2N&zPX*s!!>rv4B+T3QK8#36G2M1$rh~o<7kR1P!;86UcF)Jx!}N+Z*CuyZHK!;>K}WjTgaCF4_~)ku+&m}wr*;tjR7

    Mg71%R53gy?)|X9kC}5Cb{4DUX(Z2Ip2>f60V<^Ru!-(YhKt3Y2n2S wr(U)%?zub5ac1P%Q-6{-T?+^^4-|N8YQYJYeVCG}+boFyt=akR{006MTC;$Ke literal 0 HcmV?d00001 diff --git a/packages/sandcastle/public/SampleData/fire.png b/packages/sandcastle/public/SampleData/fire.png new file mode 100644 index 0000000000000000000000000000000000000000..077e7b858c979c832b4921939661e65f091f4c0e GIT binary patch literal 104016 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 z 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
    &7fpGCxUghy>a z`CY^;dL1hBI$hvk-oz{UlXCf&v+IRLsRm1YI?%&u6HL_Ap;u&i8}VDRVvjsq9NYgv zxB*oDhy7N+cYk&GpO5>O@wk2&V4^<=r$CWeqN8QoIli@`; z%rR4U282jgf9WLiTB|5^!_~=fj{8LHx^Vc{^3|-6GYGK8>B5C-C3&u+Kt!z+C(`B4 zkPInncOeE17CYvABA$7l`EKWo?}q3V72Q#I5aUb0%8#4P=27fZxbrz2e#FhmtNGz10|63=B%y*mLm~(OX_&*63Mr(sp}veDk4_UNFQ#h9N3Vhq-iLphce{@%-2dz3)2`~E$qjU}l&5p0tvEO(F%Fx4 znSAQJr-Y}C#YyQ*&c^xEy1P0Ka5L#!fsCpiMfWiwOZJ9HX3h=%pI@ya=XWc{27^wV zyOVfCL4(NeWkj2gL!F)A5Wx=aU~ zT-{;`NlSb(9()gAO!|#I;s7us0g;Y4#}L3QZ?SCrmudXCeKLSrMpb+5d(EWIUqr=1 zBqF2lfmXF*A*HWt#evn}LpV`c*(_+q0jc4MDi&ZOneiv z{Nx#6DY(>qQ=AeLl_5_+w@6-KF7ayaNjfe#F;*@P5{a9j+S@LVV72@JXl=DsBNhjd zrpybOTq1hU4KxvY9XP>D{G;yJdH)c_HNvet;hb#K9&S&7> zTUl|!i$lrV+?3saY#$cRG<%i6h@G`*WgbT`8y_HF|NB|EZQjp$j;^<1iicFJR&$ti zoAkCaHps*$=;~^zkax!^eiShf5Ev)}Xi|`vf~$lou9>|dj`Uihvd_4=*-?_cs@65GiczvS1q1UW}6#KZ!#k1L~ z=rQy3Kp$kf3dLO=TP4ax2TB-(vWW?< z1`(}r(7nXF67}+UytuAKrnoBPP=A{-zFY>K6aMMF{@|PA^|`f*#Iv`_n>a?F0oBAj z3xOe%u4I^zk7s>@V0j<6(u#iq5Fp`*7g><_2MLo^%{5ip{FDfnI^?x}To5W{71Dth z$W_Rez@5YvCrJwi)d}LziNJgis1P{tQDwBtdl?%fQt5csIywP)-E=KY#gpk&VEN_Z z_|@tMK+N6_aGheVvcxIdd`*aCnKL6mQU3UqlRo*YtYRQviG6uD=hJ^0MVo%3AgqpF zrYW3 z_oAHN+3B~OS^8dp+^(9_@i9eBPn;U3&^TPkX$NIuO&d{Yq8o073JZ5af{LTOBlYd= zXhZHVQ4kXC2k_e~F!@$qo6oBSb>qb=3rn^z?jbNy$B!|ph5RGaA+mto@eX$gJCz{b0bSU3!5 z)L#$-LeViRBjM%m*wgwruM9dtf^vYPaVUf=w?aaTisNp~=gGfxO8M1$F7dB2-UvR} z<8O=t4}~2pv=abc+sA|Il6VDR?sCE)BvcRac$a7g7_F4lz{+F_<_Y8fV0no`r%E^~AUAhhnUgAw}79 z<4`Oj1%2qp^Ysj%Vw zC9)<_(?}LH$TW`TxUYg0@`wdd55X2^0(`n;aVjqWUY{pgCHHPDl$Cg8HaE5a3et{< zI*N%Fyh`JlQ9~T*aUC)vq(n%4cL!F$qA>wWg^`H^x%jgis3(a>Q2fX7)1cfFW(Ztm zoT~J>+&#YQnxC{@xB2L;$e z+_P{z6z=kBV{7f)VwmuHKJzHf*1;rpwj#)U>}T+zG8Z*-~XZ;&n^v|g6E+bZoKQ8$BF z1r+&X{{G?Yda<<{Y6bPzuh$C-OaWZ_+0vUMaOBMhE4)aZW zVSV<-v)c|%!y@-4*VbX)ccPA@4~SO`5>8kT+_1{@_LfWE)c)lk{q5?ZIV79ZXVllH z-_Kvtb);KFFDhLrbqf^>HrL|P^=dJSbXGbn!+F+uUxc7My9` zN(fRHSj%00q=yN~F`+6bbyDS0qWd1z+INNIPo{ja}~hGl|N&GHEJqv_n}k}Ws#1nJXI*Ss*f`BQsGuy<6auc zgX!9{L=--qhcc-vcP~J~WK40z1%8fBa+Jwt*iSk2-G;y$Kg;cdsc!wTQq*-M>lb(p--P74Dls^0e*UeK2b-5SW8o)UzIrb zbXufI9HbYu!8LEff+x(XWL!!<00qKAMj|5F(_f0}EfR);|Ane(Y0-=cnD`V7K3*18LPN)P&k&CnrS$Eq7n zW&Z1a#6qVE*vN#xB|*x4G#|O?zkD#igF*moHH0iGj6wo_TiZegX(`0?rW90&ZZOor z91{u*sc@VG)nQfg2!d>($N&d3R-b8WDM@c8o`+NPC?Rukqy}dXd&c7i}rD757 zR@V?H$YAd1{Ia+C|N1u{_IJAYF@A>Q#Sf{3E>CnMUZK3uI5zOwdvpT<5bRj%dYvm zx5jdt+)e_YE)3xYwfQ{?p)s^Z31v3brM3pM2^qa2@7;L-fQ?`08H9&HhP!DO?xQnU z4}G+FJDvSqxYb4C+f@~%fuxRt|J~8JM((F&_eQ0jFV}A<()>6dlv#g=GSUUS3j-9) z)fdE?R7X8cI06oXFTNT2AlBB)a7`j1U_cE}P5F2Sbk^;m!u*-h=}APcpN_k8tHjMu zsT1*%_~zKi08}aS#JH=7U|*lEFVzpiA{GFi4rZmbP5l=q&dn}>9KL?Fz9f?BH?Bm} zJZpo`9Q3^O_SR0E0$$w5Hd#eT$}g2l8sgVvcqmcKyci@gMmTx$ME|O9gewny!g(Ra z1o%a)l%-EKjkckgw_1ytIFVFg4BKefTD@CYBgY9;C=iICQiR&3s zK^V{Shm7DQc@*J?GgUd^u4E=Zj(-a)SuwZ&>*Cs7+D!z}24Vb!ZN~e>dmc8+tqOZ^ z1`{An&)cA~xC$yzjY%4-67Geo03LoCr121~j2q!dU#+`HL8Fl(Txj-1xXqW2Ra{0X z4#%V$-A#JmwHL*AWPU$eHcI2il%Y|?ez@MT*PxGhViD&RM zjy{AVNe6%c9(_q(M3R#rmy_X8b{s2dAW`j0@bvWh@~2nbCDCi*6fB6ksZ7nx@vpDC zmH2ita*&$-`};ey1Lc^Zp+dO)2sAF8rjj1CJWp3!j zVqHh3sAnoxX8%$A0>pg*Gfu2R+6&Pkmpr5qA98A|IW$N_ycJjbbeMRx<7w_?WROpK zQ@Bpmt(-7%3%CkBrhd*HG4hP_fd@U6xL~Pb1_5d?AO<20UWj?7Pdp2g4`cu{;7(k~ zf|!FVcQA-xixbzRs2b-&B$e*Pg3N^O7>z0$ahVgnEZIu5I_y49~062vQ!diMVBKJV^79A<;f;URYcV&W(dkP%_zNbH2{@`MaOItMq;sHQaccZcoo z`6Z2bxaMwvKcZY6LJi>VrF}^|hYXL;ua_Itzc_<-1JahKFHPfB4N;apfjBPKxkgYR z5TwF&Co3c%uc-?}D-Eb_Vzg1FzG?`n0GU+3PxaAW@0>K#W9c#~;~k>wQ(RD88JJoLfD{(Tx;LH(Oy#VQa7q4?1Q>X*{ zqvjWhufeQ@knquNzkRwIO`%pY7;LOf9tQzNVVBW$P+XNH?#XZ3y{5it0b~HMDzCEA z2H+u}L3UJ#v?y(oB%>5mkw+0kUJv$q^S;$s1*wNPmJ=z@a-kqh|8KvVKX6{qzkl67 zdlBUxARMIpDSja)p#H}Pvs-6D{G9;JPC;bXJr2?VUKi0u->7%!Mfd69YzLx!f9^xO z>#GKcfSOo}V?7OrQjWYD=dX;aoGTd>aQd!kvLDqtvoVNNGER*b1%4PeW_neoTe;wDDgD!qlhWK+{DiXU?XwV zqxW>gk=>MOn;y1qNVhjg@DOu$qF^kZIh&(W6ip+)2lb zV%s>7%Aspn^Jb9bY4Ck?b}%1ikmI9+*|xBxDZqgMRw1D92GL-mfblL@Z7`y_w{>?( zRvd_~PzHtM1u&S*=@b9~IxHgMJv{7pW~*WCJXHBwo>JR9W$2bU6BUD&f^cp~$I8{f_l{U}0)p+4r z@{LC|6tc?5%n5u|k8lwXLOcLhvk-5~s=6BPoE+^ei`H75l4 zjj#TYMq2OUa+E#qliw(=B@zm$P5@T@b%Bm=@mfAp*SPWG+?zC24*bc7+l=JLz4?jL zGMe)J#WUCP*$i(^Sj(f`H?PhrYe=B+tZNiQOLk0_x^x)xb`o1OyJniUbca$bjn1ym zArkh2)h<+-Ff4Dn4bhp<5 zD!skxqbu}PUPH*#a}~s|1)s`KkDB*yX>yC1JEl^v5xfgtZmxWfKQtM;{?2A znS`VeSe_9l6Sb1oZ^8xq*5Rpo~j~aHtFZVRa(a}N8%9VVpc4hn#-do$QZXoz}C@L_5PeVCUybJorq^91fRU=-pU`K zfUgmF#zE52I1VKi(5hG{buFH>Dj~0S zgt(#Tr_1gQWDpO4`MwF4DI`ig)W;+)vC-U={22ythE%z91^Fod+3EGdX8+oo;>u~0 zIDk?9xR?cg>TRTmY1$`E69XY-?meSO?h!FZWF_`7T9j2T0SPQ%mA)AVa2Z?)hYv>{ zb|L}1N}a^5GGv@`y?c~4|EY>U?|IFG{Ng$!zsR`DG%TUVkEe& zUZ~|D-VL6*iYG0&Y1~M-xNh=vi5q`@<%H*5)VQwuAMEQI6r8jUT>t<807*qoM6N<$ Ef + 1374Vista Ridge TrailheadTrail Head + 1777Wy'East Basin + 1823Dollar Lake + 2394Barrett SpurSummit + + Barrett Spur 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Barrett Spur 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/sandcastle/public/SampleData/gpx/lamina.gpx b/packages/sandcastle/public/SampleData/gpx/lamina.gpx new file mode 100644 index 000000000000..f219b40d8368 --- /dev/null +++ b/packages/sandcastle/public/SampleData/gpx/lamina.gpx @@ -0,0 +1,60712 @@ + + + + + + + PuroPirinero - La Mina + 1 + + + 1666.4 + + + + 16 + 84 + + + + + 1666.4 + + + + 16 + 85 + + + + + 1665.6 + + + + 16 + 87 + + + + + 1665.8 + + + + 16 + 87 + + + + + 1665.8 + + + + 16 + 87 + + + + + 1665.6 + + + + 16 + 87 + + + + + 1665.6 + + + + 16 + 88 + + + + + 1665.6 + + + + 16 + 88 + + + + + 1665.8 + + + + 16 + 89 + + + + + 1665.8 + + + + 16 + 89 + + + + + 1665.8 + + + + 16 + 91 + + + + + 1665.8 + + + + 16 + 92 + + + + + 1665.8 + + + + 16 + 93 + + + + + 1665.8 + + + + 16 + 95 + + + + + 1665.8 + + + + 16 + 97 + + + + + 1665.8 + + + + 16 + 99 + + + + + 1665.8 + + + + 16 + 100 + + + + + 1665.8 + + + + 16 + 101 + + + + + 1666.0 + + + + 16 + 103 + + + + + 1666.0 + + + + 16 + 104 + + + + + 1666.0 + + + + 16 + 105 + + + + + 1666.0 + + + + 16 + 106 + + + + + 1666.2 + + + + 16 + 107 + + + + + 1666.2 + + + + 16 + 109 + + + + + 1666.4 + + + + 16 + 110 + + + + + 1666.4 + + + + 16 + 111 + + + + + 1666.6 + + + + 16 + 112 + + + + + 1666.6 + + + + 16 + 113 + + + + + 1666.8 + + + + 16 + 114 + + + + + 1667.0 + + + + 16 + 115 + + + + + 1667.2 + + + + 16 + 117 + + + + + 1667.4 + + + + 16 + 118 + + + + + 1667.6 + + + + 16 + 119 + + + + + 1667.6 + + + + 16 + 119 + + + + + 1667.8 + + + + 16 + 120 + + + + + 1667.8 + + + + 16 + 120 + + + + + 1668.0 + + + + 16 + 121 + + + + + 1668.0 + + + + 16 + 121 + + + + + 1668.4 + + + + 16 + 122 + + + + + 1668.6 + + + + 16 + 123 + + + + + 1668.8 + + + + 16 + 123 + + + + + 1669.0 + + + + 16 + 123 + + + + + 1669.0 + + + + 16 + 123 + + + + + 1669.2 + + + + 16 + 123 + + + + + 1669.2 + + + + 16 + 123 + + + + + 1669.2 + + + + 16 + 124 + + + + + 1669.4 + + + + 16 + 124 + + + + + 1669.6 + + + + 16 + 124 + + + + + 1669.8 + + + + 16 + 124 + + + + + 1669.8 + + + + 16 + 124 + + + + + 1669.8 + + + + 16 + 124 + + + + + 1670.0 + + + + 16 + 124 + + + + + 1670.2 + + + + 16 + 124 + + + + + 1670.2 + + + + 16 + 125 + + + + + 1670.4 + + + + 16 + 125 + + + + + 1670.6 + + + + 16 + 125 + + + + + 1670.6 + + + + 16 + 125 + + + + + 1670.6 + + + + 16 + 125 + + + + + 1670.8 + + + + 16 + 125 + + + + + 1671.0 + + + + 16 + 125 + + + + + 1671.2 + + + + 16 + 126 + + + + + 1671.4 + + + + 16 + 126 + + + + + 1671.4 + + + + 16 + 126 + + + + + 1671.6 + + + + 16 + 127 + + + + + 1671.6 + + + + 16 + 127 + + + + + 1671.8 + + + + 16 + 128 + + + + + 1672.0 + + + + 16 + 128 + + + + + 1672.0 + + + + 16 + 128 + + + + + 1672.2 + + + + 16 + 129 + + + + + 1672.4 + + + + 16 + 129 + + + + + 1672.8 + + + + 16 + 129 + + + + + 1672.8 + + + + 16 + 129 + + + + + 1673.2 + + + + 16 + 129 + + + + + 1673.4 + + + + 16 + 128 + + + + + 1673.4 + + + + 16 + 128 + + + + + 1673.6 + + + + 16 + 128 + + + + + 1673.8 + + + + 16 + 128 + + + + + 1673.8 + + + + 16 + 128 + + + + + 1674.0 + + + + 16 + 127 + + + + + 1674.2 + + + + 16 + 128 + + + + + 1674.2 + + + + 16 + 128 + + + + + 1674.4 + + + + 17 + 127 + + + + + 1674.6 + + + + 17 + 128 + + + + + 1674.8 + + + + 17 + 128 + + + + + 1674.8 + + + + 17 + 128 + + + + + 1675.0 + + + + 17 + 128 + + + + + 1675.0 + + + + 17 + 129 + + + + + 1675.2 + + + + 17 + 129 + + + + + 1675.2 + + + + 17 + 130 + + + + + 1675.4 + + + + 17 + 130 + + + + + 1675.6 + + + + 17 + 131 + + + + + 1675.8 + + + + 17 + 131 + + + + + 1676.0 + + + + 17 + 131 + + + + + 1676.0 + + + + 17 + 131 + + + + + 1676.0 + + + + 17 + 130 + + + + + 1676.2 + + + + 17 + 131 + + + + + 1676.2 + + + + 17 + 131 + + + + + 1676.4 + + + + 17 + 131 + + + + + 1676.6 + + + + 17 + 131 + + + + + 1676.6 + + + + 17 + 131 + + + + + 1676.8 + + + + 17 + 131 + + + + + 1677.0 + + + + 17 + 131 + + + + + 1677.0 + + + + 17 + 132 + + + + + 1677.2 + + + + 17 + 131 + + + + + 1677.2 + + + + 17 + 131 + + + + + 1677.6 + + + + 17 + 131 + + + + + 1677.6 + + + + 17 + 131 + + + + + 1677.6 + + + + 17 + 131 + + + + + 1677.8 + + + + 17 + 130 + + + + + 1677.8 + + + + 17 + 130 + + + + + 1678.0 + + + + 17 + 130 + + + + + 1678.2 + + + + 17 + 130 + + + + + 1678.4 + + + + 17 + 130 + + + + + 1678.4 + + + + 17 + 131 + + + + + 1678.6 + + + + 17 + 131 + + + + + 1678.8 + + + + 17 + 131 + + + + + 1678.8 + + + + 17 + 131 + + + + + 1679.0 + + + + 17 + 130 + + + + + 1679.2 + + + + 17 + 130 + + + + + 1679.4 + + + + 17 + 130 + + + + + 1679.4 + + + + 17 + 130 + + + + + 1679.6 + + + + 17 + 130 + + + + + 1679.6 + + + + 17 + 130 + + + + + 1679.8 + + + + 17 + 130 + + + + + 1679.8 + + + + 17 + 130 + + + + + 1680.0 + + + + 17 + 130 + + + + + 1680.2 + + + + 17 + 130 + + + + + 1680.2 + + + + 17 + 130 + + + + + 1680.2 + + + + 17 + 131 + + + + + 1680.4 + + + + 17 + 131 + + + + + 1680.6 + + + + 17 + 131 + + + + + 1680.6 + + + + 17 + 130 + + + + + 1680.8 + + + + 17 + 131 + + + + + 1680.8 + + + + 17 + 131 + + + + + 1681.0 + + + + 17 + 131 + + + + + 1681.2 + + + + 17 + 132 + + + + + 1681.6 + + + + 17 + 131 + + + + + 1681.8 + + + + 17 + 132 + + + + + 1681.8 + + + + 17 + 132 + + + + + 1682.2 + + + + 17 + 131 + + + + + 1682.4 + + + + 17 + 132 + + + + + 1682.6 + + + + 17 + 132 + + + + + 1682.8 + + + + 17 + 131 + + + + + 1683.0 + + + + 17 + 132 + + + + + 1683.2 + + + + 17 + 131 + + + + + 1683.4 + + + + 17 + 132 + + + + + 1683.4 + + + + 17 + 132 + + + + + 1683.6 + + + + 17 + 131 + + + + + 1683.8 + + + + 17 + 132 + + + + + 1684.0 + + + + 17 + 132 + + + + + 1684.2 + + + + 17 + 132 + + + + + 1684.2 + + + + 17 + 132 + + + + + 1684.4 + + + + 17 + 132 + + + + + 1684.6 + + + + 17 + 132 + + + + + 1684.6 + + + + 17 + 132 + + + + + 1684.8 + + + + 17 + 132 + + + + + 1684.8 + + + + 17 + 132 + + + + + 1685.0 + + + + 17 + 132 + + + + + 1685.2 + + + + 17 + 131 + + + + + 1685.4 + + + + 17 + 132 + + + + + 1685.6 + + + + 17 + 131 + + + + + 1685.6 + + + + 17 + 131 + + + + + 1685.8 + + + + 17 + 131 + + + + + 1685.8 + + + + 17 + 131 + + + + + 1686.0 + + + + 17 + 131 + + + + + 1686.0 + + + + 17 + 130 + + + + + 1686.0 + + + + 17 + 130 + + + + + 1686.2 + + + + 17 + 130 + + + + + 1686.4 + + + + 17 + 130 + + + + + 1686.6 + + + + 17 + 131 + + + + + 1686.8 + + + + 17 + 131 + + + + + 1687.0 + + + + 17 + 131 + + + + + 1687.0 + + + + 17 + 131 + + + + + 1687.4 + + + + 17 + 131 + + + + + 1687.4 + + + + 17 + 132 + + + + + 1687.6 + + + + 17 + 132 + + + + + 1687.6 + + + + 17 + 132 + + + + + 1687.8 + + + + 17 + 132 + + + + + 1688.0 + + + + 16 + 132 + + + + + 1688.0 + + + + 16 + 133 + + + + + 1688.2 + + + + 16 + 133 + + + + + 1688.2 + + + + 16 + 133 + + + + + 1688.4 + + + + 16 + 133 + + + + + 1688.4 + + + + 16 + 134 + + + + + 1688.6 + + + + 16 + 134 + + + + + 1688.6 + + + + 16 + 134 + + + + + 1688.8 + + + + 16 + 134 + + + + + 1688.8 + + + + 16 + 134 + + + + + 1689.0 + + + + 16 + 134 + + + + + 1689.2 + + + + 16 + 134 + + + + + 1689.4 + + + + 16 + 134 + + + + + 1689.4 + + + + 16 + 133 + + + + + 1689.4 + + + + 16 + 133 + + + + + 1689.6 + + + + 16 + 134 + + + + + 1689.6 + + + + 16 + 133 + + + + + 1689.6 + + + + 17 + 133 + + + + + 1689.8 + + + + 17 + 134 + + + + + 1690.0 + + + + 17 + 133 + + + + + 1690.2 + + + + 17 + 133 + + + + + 1690.2 + + + + 17 + 133 + + + + + 1690.2 + + + + 17 + 133 + + + + + 1690.4 + + + + 17 + 133 + + + + + 1690.6 + + + + 17 + 133 + + + + + 1690.6 + + + + 17 + 134 + + + + + 1690.8 + + + + 17 + 133 + + + + + 1691.0 + + + + 17 + 134 + + + + + 1691.2 + + + + 16 + 133 + + + + + 1691.4 + + + + 16 + 134 + + + + + 1691.4 + + + + 16 + 133 + + + + + 1691.6 + + + + 16 + 134 + + + + + 1691.6 + + + + 16 + 134 + + + + + 1691.6 + + + + 16 + 134 + + + + + 1691.8 + + + + 16 + 135 + + + + + 1692.0 + + + + 16 + 135 + + + + + 1692.2 + + + + 16 + 135 + + + + + 1692.4 + + + + 16 + 135 + + + + + 1692.6 + + + + 16 + 134 + + + + + 1692.6 + + + + 16 + 135 + + + + + 1692.8 + + + + 16 + 135 + + + + + 1692.8 + + + + 16 + 135 + + + + + 1693.0 + + + + 16 + 135 + + + + + 1693.0 + + + + 16 + 135 + + + + + 1693.2 + + + + 16 + 134 + + + + + 1693.2 + + + + 16 + 134 + + + + + 1693.4 + + + + 16 + 133 + + + + + 1693.6 + + + + 16 + 133 + + + + + 1693.8 + + + + 16 + 133 + + + + + 1693.8 + + + + 16 + 133 + + + + + 1694.0 + + + + 16 + 132 + + + + + 1694.2 + + + + 16 + 132 + + + + + 1694.4 + + + + 16 + 131 + + + + + 1694.6 + + + + 16 + 132 + + + + + 1694.8 + + + + 16 + 131 + + + + + 1694.8 + + + + 16 + 131 + + + + + 1695.0 + + + + 16 + 131 + + + + + 1695.2 + + + + 16 + 131 + + + + + 1695.4 + + + + 16 + 131 + + + + + 1695.6 + + + + 16 + 131 + + + + + 1695.6 + + + + 16 + 130 + + + + + 1695.8 + + + + 16 + 131 + + + + + 1696.0 + + + + 16 + 131 + + + + + 1696.2 + + + + 16 + 131 + + + + + 1696.4 + + + + 16 + 131 + + + + + 1696.6 + + + + 16 + 131 + + + + + 1696.6 + + + + 16 + 131 + + + + + 1696.8 + + + + 16 + 131 + + + + + 1696.8 + + + + 16 + 132 + + + + + 1696.8 + + + + 16 + 131 + + + + + 1697.0 + + + + 16 + 131 + + + + + 1697.2 + + + + 16 + 131 + + + + + 1697.2 + + + + 16 + 131 + + + + + 1697.4 + + + + 16 + 131 + + + + + 1697.6 + + + + 16 + 131 + + + + + 1697.6 + + + + 16 + 131 + + + + + 1697.8 + + + + 16 + 131 + + + + + 1697.8 + + + + 16 + 131 + + + + + 1697.8 + + + + 16 + 132 + + + + + 1698.0 + + + + 16 + 132 + + + + + 1698.0 + + + + 16 + 132 + + + + + 1698.2 + + + + 16 + 132 + + + + + 1698.2 + + + + 16 + 132 + + + + + 1698.6 + + + + 16 + 132 + + + + + 1698.8 + + + + 16 + 131 + + + + + 1699.0 + + + + 16 + 131 + + + + + 1699.0 + + + + 16 + 131 + + + + + 1699.2 + + + + 16 + 131 + + + + + 1699.4 + + + + 16 + 130 + + + + + 1699.4 + + + + 16 + 129 + + + + + 1699.6 + + + + 16 + 129 + + + + + 1699.6 + + + + 16 + 128 + + + + + 1699.6 + + + + 16 + 128 + + + + + 1699.8 + + + + 16 + 128 + + + + + 1699.8 + + + + 16 + 127 + + + + + 1699.8 + + + + 16 + 126 + + + + + 1699.8 + + + + 16 + 126 + + + + + 1699.8 + + + + 16 + 125 + + + + + 1699.8 + + + + 16 + 124 + + + + + 1699.8 + + + + 16 + 124 + + + + + 1699.8 + + + + 16 + 123 + + + + + 1700.0 + + + + 16 + 123 + + + + + 1700.0 + + + + 16 + 122 + + + + + 1700.0 + + + + 16 + 122 + + + + + 1700.2 + + + + 16 + 121 + + + + + 1700.4 + + + + 16 + 121 + + + + + 1700.4 + + + + 16 + 121 + + + + + 1700.6 + + + + 16 + 121 + + + + + 1700.8 + + + + 16 + 120 + + + + + 1701.4 + + + + 16 + 102 + + + + + 1701.4 + + + + 16 + 102 + + + + + 1701.4 + + + + 16 + 101 + + + + + 1701.4 + + + + 16 + 101 + + + + + 1701.4 + + + + 16 + 101 + + + + + 1701.4 + + + + 16 + 100 + + + + + 1701.4 + + + + 16 + 100 + + + + + 1701.4 + + + + 16 + 99 + + + + + 1701.4 + + + + 16 + 100 + + + + + 1701.4 + + + + 16 + 100 + + + + + 1701.4 + + + + 16 + 100 + + + + + 1701.6 + + + + 16 + 100 + + + + + 1701.6 + + + + 16 + 99 + + + + + 1701.6 + + + + 16 + 98 + + + + + 1701.6 + + + + 16 + 98 + + + + + 1701.6 + + + + 16 + 99 + + + + + 1701.6 + + + + 16 + 99 + + + + + 1701.8 + + + + 16 + 98 + + + + + 1702.0 + + + + 16 + 98 + + + + + 1702.0 + + + + 16 + 98 + + + + + 1702.0 + + + + 16 + 98 + + + + + 1702.0 + + + + 16 + 98 + + + + + 1702.2 + + + + 16 + 98 + + + + + 1702.2 + + + + 16 + 99 + + + + + 1702.4 + + + + 16 + 100 + + + + + 1702.4 + + + + 16 + 101 + + + + + 1702.6 + + + + 16 + 101 + + + + + 1702.6 + + + + 16 + 102 + + + + + 1702.8 + + + + 16 + 102 + + + + + 1702.8 + + + + 16 + 102 + + + + + 1703.0 + + + + 16 + 103 + + + + + 1703.0 + + + + 16 + 103 + + + + + 1703.2 + + + + 16 + 103 + + + + + 1703.2 + + + + 16 + 104 + + + + + 1703.4 + + + + 16 + 106 + + + + + 1703.4 + + + + 16 + 107 + + + + + 1703.4 + + + + 16 + 108 + + + + + 1703.4 + + + + 16 + 109 + + + + + 1703.6 + + + + 16 + 110 + + + + + 1703.6 + + + + 16 + 112 + + + + + 1703.6 + + + + 16 + 113 + + + + + 1703.8 + + + + 16 + 115 + + + + + 1703.8 + + + + 16 + 117 + + + + + 1704.0 + + + + 16 + 119 + + + + + 1704.2 + + + + 16 + 121 + + + + + 1704.4 + + + + 16 + 123 + + + + + 1704.6 + + + + 16 + 125 + + + + + 1704.8 + + + + 16 + 128 + + + + + 1705.0 + + + + 16 + 129 + + + + + 1705.2 + + + + 16 + 131 + + + + + 1705.4 + + + + 16 + 133 + + + + + 1705.6 + + + + 16 + 135 + + + + + 1705.8 + + + + 16 + 136 + + + + + 1706.0 + + + + 16 + 137 + + + + + 1706.4 + + + + 16 + 138 + + + + + 1706.4 + + + + 16 + 138 + + + + + 1706.8 + + + + 16 + 138 + + + + + 1707.2 + + + + 16 + 139 + + + + + 1707.4 + + + + 16 + 138 + + + + + 1707.8 + + + + 16 + 138 + + + + + 1708.0 + + + + 16 + 138 + + + + + 1708.0 + + + + 16 + 137 + + + + + 1708.2 + + + + 16 + 137 + + + + + 1708.4 + + + + 16 + 136 + + + + + 1708.4 + + + + 16 + 136 + + + + + 1708.6 + + + + 16 + 135 + + + + + 1708.6 + + + + 16 + 135 + + + + + 1708.6 + + + + 16 + 134 + + + + + 1708.8 + + + + 16 + 134 + + + + + 1708.8 + + + + 16 + 134 + + + + + 1708.8 + + + + 16 + 134 + + + + + 1708.8 + + + + 16 + 134 + + + + + 1708.8 + + + + 16 + 134 + + + + + 1708.8 + + + + 16 + 135 + + + + + 1709.0 + + + + 16 + 135 + + + + + 1709.0 + + + + 16 + 136 + + + + + 1709.2 + + + + 16 + 136 + + + + + 1709.2 + + + + 16 + 137 + + + + + 1709.2 + + + + 16 + 138 + + + + + 1709.4 + + + + 16 + 138 + + + + + 1709.4 + + + + 16 + 138 + + + + + 1709.4 + + + + 16 + 139 + + + + + 1709.8 + + + + 16 + 139 + + + + + 1710.0 + + + + 16 + 139 + + + + + 1710.0 + + + + 16 + 139 + + + + + 1710.4 + + + + 16 + 139 + + + + + 1710.2 + + + + 15 + 139 + + + + + 1710.4 + + + + 15 + 139 + + + + + 1710.6 + + + + 15 + 138 + + + + + 1710.6 + + + + 15 + 138 + + + + + 1711.0 + + + + 15 + 138 + + + + + 1711.2 + + + + 15 + 137 + + + + + 1711.2 + + + + 15 + 137 + + + + + 1711.4 + + + + 15 + 136 + + + + + 1711.4 + + + + 15 + 136 + + + + + 1711.4 + + + + 15 + 136 + + + + + 1711.6 + + + + 15 + 136 + + + + + 1711.6 + + + + 15 + 136 + + + + + 1711.8 + + + + 15 + 137 + + + + + 1712.0 + + + + 15 + 137 + + + + + 1712.0 + + + + 15 + 137 + + + + + 1712.2 + + + + 15 + 138 + + + + + 1712.2 + + + + 15 + 138 + + + + + 1712.4 + + + + 15 + 138 + + + + + 1712.6 + + + + 15 + 139 + + + + + 1712.8 + + + + 15 + 139 + + + + + 1712.8 + + + + 15 + 139 + + + + + 1712.8 + + + + 15 + 139 + + + + + 1713.0 + + + + 15 + 140 + + + + + 1713.0 + + + + 15 + 140 + + + + + 1713.4 + + + + 15 + 140 + + + + + 1713.4 + + + + 15 + 140 + + + + + 1713.6 + + + + 15 + 140 + + + + + 1713.8 + + + + 15 + 141 + + + + + 1713.8 + + + + 15 + 141 + + + + + 1714.0 + + + + 15 + 141 + + + + + 1714.2 + + + + 15 + 141 + + + + + 1714.4 + + + + 15 + 141 + + + + + 1714.6 + + + + 15 + 142 + + + + + 1714.8 + + + + 15 + 142 + + + + + 1714.8 + + + + 15 + 143 + + + + + 1715.0 + + + + 15 + 143 + + + + + 1715.2 + + + + 15 + 143 + + + + + 1715.4 + + + + 15 + 144 + + + + + 1715.6 + + + + 15 + 144 + + + + + 1715.8 + + + + 15 + 145 + + + + + 1716.0 + + + + 15 + 145 + + + + + 1716.2 + + + + 15 + 145 + + + + + 1716.4 + + + + 15 + 146 + + + + + 1716.6 + + + + 15 + 146 + + + + + 1716.8 + + + + 15 + 146 + + + + + 1717.0 + + + + 15 + 146 + + + + + 1717.2 + + + + 15 + 146 + + + + + 1717.4 + + + + 15 + 146 + + + + + 1717.6 + + + + 15 + 146 + + + + + 1717.8 + + + + 15 + 145 + + + + + 1717.8 + + + + 15 + 144 + + + + + 1718.0 + + + + 15 + 143 + + + + + 1718.2 + + + + 15 + 142 + + + + + 1718.4 + + + + 16 + 142 + + + + + 1718.6 + + + + 16 + 142 + + + + + 1718.8 + + + + 16 + 141 + + + + + 1718.8 + + + + 16 + 141 + + + + + 1719.0 + + + + 16 + 141 + + + + + 1719.0 + + + + 16 + 141 + + + + + 1719.0 + + + + 16 + 141 + + + + + 1719.0 + + + + 16 + 140 + + + + + 1719.0 + + + + 16 + 140 + + + + + 1719.0 + + + + 16 + 140 + + + + + 1719.0 + + + + 16 + 139 + + + + + 1719.0 + + + + 16 + 139 + + + + + 1719.0 + + + + 16 + 139 + + + + + 1719.0 + + + + 16 + 139 + + + + + 1719.0 + + + + 16 + 137 + + + + + 1718.8 + + + + 16 + 135 + + + + + 1718.8 + + + + 16 + 133 + + + + + 1718.6 + + + + 16 + 133 + + + + + 1718.2 + + + + 16 + 132 + + + + + 1718.0 + + + + 16 + 132 + + + + + 1718.0 + + + + 16 + 131 + + + + + 1718.0 + + + + 16 + 131 + + + + + 1717.8 + + + + 16 + 130 + + + + + 1717.6 + + + + 16 + 129 + + + + + 1717.6 + + + + 16 + 128 + + + + + 1717.2 + + + + 16 + 127 + + + + + 1717.0 + + + + 16 + 127 + + + + + 1716.6 + + + + 16 + 126 + + + + + 1716.2 + + + + 16 + 125 + + + + + 1716.2 + + + + 16 + 123 + + + + + 1716.0 + + + + 16 + 122 + + + + + 1716.0 + + + + 16 + 122 + + + + + 1715.8 + + + + 16 + 122 + + + + + 1715.8 + + + + 16 + 121 + + + + + 1715.8 + + + + 16 + 120 + + + + + 1715.8 + + + + 16 + 120 + + + + + 1715.8 + + + + 16 + 120 + + + + + 1715.8 + + + + 16 + 121 + + + + + 1715.8 + + + + 16 + 121 + + + + + 1716.0 + + + + 16 + 121 + + + + + 1716.0 + + + + 16 + 121 + + + + + 1716.0 + + + + 16 + 121 + + + + + 1716.2 + + + + 16 + 123 + + + + + 1716.2 + + + + 16 + 124 + + + + + 1716.4 + + + + 16 + 125 + + + + + 1716.4 + + + + 16 + 126 + + + + + 1716.6 + + + + 16 + 127 + + + + + 1716.8 + + + + 16 + 129 + + + + + 1717.0 + + + + 16 + 130 + + + + + 1717.0 + + + + 16 + 132 + + + + + 1717.2 + + + + 16 + 133 + + + + + 1717.6 + + + + 16 + 134 + + + + + 1718.4 + + + + 16 + 136 + + + + + 1718.6 + + + + 16 + 137 + + + + + 1719.0 + + + + 16 + 139 + + + + + 1719.2 + + + + 16 + 139 + + + + + 1719.4 + + + + 16 + 140 + + + + + 1719.4 + + + + 16 + 140 + + + + + 1719.6 + + + + 16 + 140 + + + + + 1719.6 + + + + 16 + 140 + + + + + 1719.6 + + + + 16 + 140 + + + + + 1719.8 + + + + 16 + 140 + + + + + 1719.8 + + + + 16 + 140 + + + + + 1719.8 + + + + 16 + 140 + + + + + 1720.0 + + + + 16 + 140 + + + + + 1720.2 + + + + 16 + 140 + + + + + 1720.4 + + + + 16 + 140 + + + + + 1720.4 + + + + 16 + 140 + + + + + 1720.6 + + + + 16 + 141 + + + + + 1720.8 + + + + 16 + 141 + + + + + 1720.8 + + + + 16 + 142 + + + + + 1721.0 + + + + 16 + 143 + + + + + 1721.2 + + + + 16 + 143 + + + + + 1721.4 + + + + 16 + 143 + + + + + 1721.4 + + + + 16 + 143 + + + + + 1721.6 + + + + 16 + 143 + + + + + 1721.6 + + + + 16 + 143 + + + + + 1721.6 + + + + 16 + 143 + + + + + 1721.6 + + + + 16 + 142 + + + + + 1721.6 + + + + 16 + 142 + + + + + 1721.6 + + + + 16 + 142 + + + + + 1721.6 + + + + 16 + 141 + + + + + 1721.6 + + + + 16 + 141 + + + + + 1721.6 + + + + 16 + 140 + + + + + 1721.6 + + + + 16 + 140 + + + + + 1721.2 + + + + 16 + 139 + + + + + 1720.8 + + + + 16 + 138 + + + + + 1720.6 + + + + 16 + 138 + + + + + 1720.6 + + + + 16 + 136 + + + + + 1720.2 + + + + 16 + 135 + + + + + 1720.2 + + + + 16 + 133 + + + + + 1720.0 + + + + 16 + 133 + + + + + 1720.0 + + + + 16 + 131 + + + + + 1720.0 + + + + 16 + 131 + + + + + 1720.0 + + + + 16 + 130 + + + + + 1719.8 + + + + 16 + 129 + + + + + 1719.4 + + + + 16 + 128 + + + + + 1719.2 + + + + 16 + 126 + + + + + 1719.4 + + + + 16 + 125 + + + + + 1719.2 + + + + 16 + 124 + + + + + 1719.2 + + + + 16 + 122 + + + + + 1719.2 + + + + 16 + 122 + + + + + 1719.0 + + + + 16 + 118 + + + + + 1718.8 + + + + 16 + 117 + + + + + 1718.8 + + + + 16 + 115 + + + + + 1718.8 + + + + 16 + 113 + + + + + 1718.6 + + + + 16 + 111 + + + + + 1718.6 + + + + 16 + 110 + + + + + 1718.6 + + + + 16 + 109 + + + + + 1718.6 + + + + 16 + 108 + + + + + 1718.2 + + + + 16 + 107 + + + + + 1717.6 + + + + 16 + 107 + + + + + 1717.2 + + + + 16 + 107 + + + + + 1717.2 + + + + 16 + 108 + + + + + 1717.0 + + + + 16 + 109 + + + + + 1717.0 + + + + 16 + 110 + + + + + 1717.0 + + + + 16 + 111 + + + + + 1717.0 + + + + 16 + 112 + + + + + 1717.0 + + + + 16 + 111 + + + + + 1717.0 + + + + 16 + 111 + + + + + 1717.0 + + + + 16 + 111 + + + + + 1717.2 + + + + 16 + 111 + + + + + 1717.4 + + + + 16 + 111 + + + + + 1717.6 + + + + 16 + 111 + + + + + 1717.8 + + + + 16 + 111 + + + + + 1718.2 + + + + 16 + 111 + + + + + 1718.6 + + + + 16 + 111 + + + + + 1718.8 + + + + 16 + 111 + + + + + 1719.0 + + + + 16 + 110 + + + + + 1719.0 + + + + 16 + 110 + + + + + 1719.0 + + + + 16 + 109 + + + + + 1719.0 + + + + 16 + 108 + + + + + 1719.0 + + + + 16 + 108 + + + + + 1719.0 + + + + 16 + 108 + + + + + 1719.0 + + + + 16 + 106 + + + + + 1719.0 + + + + 16 + 107 + + + + + 1719.0 + + + + 16 + 108 + + + + + 1719.0 + + + + 16 + 109 + + + + + 1719.0 + + + + 16 + 110 + + + + + 1719.0 + + + + 16 + 112 + + + + + 1719.0 + + + + 16 + 114 + + + + + 1719.0 + + + + 16 + 115 + + + + + 1719.2 + + + + 16 + 116 + + + + + 1719.2 + + + + 16 + 117 + + + + + 1719.2 + + + + 16 + 118 + + + + + 1719.2 + + + + 16 + 119 + + + + + 1719.2 + + + + 16 + 119 + + + + + 1719.4 + + + + 16 + 120 + + + + + 1719.6 + + + + 16 + 120 + + + + + 1719.8 + + + + 16 + 120 + + + + + 1720.2 + + + + 16 + 121 + + + + + 1720.4 + + + + 16 + 121 + + + + + 1720.6 + + + + 16 + 122 + + + + + 1721.2 + + + + 16 + 122 + + + + + 1721.4 + + + + 16 + 122 + + + + + 1721.4 + + + + 16 + 123 + + + + + 1721.6 + + + + 16 + 123 + + + + + 1721.8 + + + + 16 + 124 + + + + + 1722.0 + + + + 16 + 124 + + + + + 1722.0 + + + + 16 + 125 + + + + + 1722.2 + + + + 16 + 124 + + + + + 1722.2 + + + + 16 + 125 + + + + + 1722.4 + + + + 16 + 125 + + + + + 1722.4 + + + + 16 + 125 + + + + + 1722.4 + + + + 15 + 124 + + + + + 1722.6 + + + + 15 + 124 + + + + + 1722.6 + + + + 15 + 124 + + + + + 1722.6 + + + + 15 + 124 + + + + + 1722.6 + + + + 15 + 124 + + + + + 1722.6 + + + + 15 + 124 + + + + + 1722.6 + + + + 15 + 125 + + + + + 1722.6 + + + + 15 + 125 + + + + + 1722.6 + + + + 15 + 127 + + + + + 1722.6 + + + + 16 + 127 + + + + + 1722.6 + + + + 16 + 129 + + + + + 1722.6 + + + + 16 + 131 + + + + + 1722.6 + + + + 16 + 133 + + + + + 1722.6 + + + + 16 + 134 + + + + + 1722.6 + + + + 16 + 135 + + + + + 1722.6 + + + + 16 + 137 + + + + + 1722.6 + + + + 16 + 139 + + + + + 1722.8 + + + + 16 + 141 + + + + + 1723.0 + + + + 16 + 142 + + + + + 1723.0 + + + + 16 + 143 + + + + + 1723.2 + + + + 16 + 146 + + + + + 1723.4 + + + + 16 + 147 + + + + + 1724.2 + + + + 16 + 149 + + + + + 1724.6 + + + + 16 + 150 + + + + + 1724.8 + + + + 16 + 151 + + + + + 1725.0 + + + + 16 + 152 + + + + + 1725.2 + + + + 16 + 153 + + + + + 1725.4 + + + + 16 + 154 + + + + + 1725.6 + + + + 16 + 155 + + + + + 1730.4 + + + + 16 + 155 + + + + + 1730.6 + + + + 16 + 155 + + + + + 1730.8 + + + + 16 + 155 + + + + + 1730.8 + + + + 16 + 155 + + + + + 1731.0 + + + + 16 + 155 + + + + + 1731.2 + + + + 16 + 155 + + + + + 1731.4 + + + + 16 + 155 + + + + + 1731.6 + + + + 16 + 155 + + + + + 1731.6 + + + + 16 + 155 + + + + + 1731.8 + + + + 16 + 154 + + + + + 1731.8 + + + + 16 + 154 + + + + + 1731.8 + + + + 16 + 154 + + + + + 1731.8 + + + + 16 + 153 + + + + + 1732.0 + + + + 16 + 153 + + + + + 1732.2 + + + + 16 + 153 + + + + + 1732.4 + + + + 16 + 153 + + + + + 1732.4 + + + + 16 + 152 + + + + + 1732.6 + + + + 16 + 152 + + + + + 1732.6 + + + + 16 + 152 + + + + + 1732.8 + + + + 16 + 151 + + + + + 1732.8 + + + + 16 + 151 + + + + + 1732.8 + + + + 16 + 151 + + + + + 1732.8 + + + + 16 + 151 + + + + + 1733.0 + + + + 16 + 151 + + + + + 1733.0 + + + + 16 + 151 + + + + + 1733.2 + + + + 16 + 151 + + + + + 1733.2 + + + + 16 + 151 + + + + + 1733.4 + + + + 16 + 151 + + + + + 1733.4 + + + + 16 + 151 + + + + + 1733.6 + + + + 16 + 151 + + + + + 1733.6 + + + + 16 + 151 + + + + + 1733.8 + + + + 16 + 151 + + + + + 1733.8 + + + + 16 + 150 + + + + + 1734.2 + + + + 16 + 150 + + + + + 1734.2 + + + + 16 + 150 + + + + + 1734.4 + + + + 16 + 150 + + + + + 1734.6 + + + + 16 + 149 + + + + + 1734.6 + + + + 16 + 149 + + + + + 1734.6 + + + + 16 + 149 + + + + + 1734.6 + + + + 16 + 149 + + + + + 1734.6 + + + + 16 + 149 + + + + + 1734.6 + + + + 16 + 149 + + + + + 1734.6 + + + + 16 + 149 + + + + + 1734.6 + + + + 16 + 149 + + + + + 1734.6 + + + + 16 + 149 + + + + + 1734.4 + + + + 16 + 149 + + + + + 1734.2 + + + + 16 + 149 + + + + + 1734.0 + + + + 16 + 149 + + + + + 1733.8 + + + + 16 + 148 + + + + + 1734.0 + + + + 16 + 148 + + + + + 1733.6 + + + + 16 + 148 + + + + + 1733.6 + + + + 16 + 148 + + + + + 1733.8 + + + + 16 + 147 + + + + + 1733.6 + + + + 16 + 147 + + + + + 1733.8 + + + + 16 + 146 + + + + + 1733.6 + + + + 16 + 146 + + + + + 1733.6 + + + + 16 + 146 + + + + + 1733.4 + + + + 16 + 144 + + + + + 1733.4 + + + + 16 + 144 + + + + + 1733.2 + + + + 16 + 144 + + + + + 1733.2 + + + + 16 + 143 + + + + + 1733.2 + + + + 16 + 142 + + + + + 1732.8 + + + + 16 + 141 + + + + + 1732.2 + + + + 16 + 141 + + + + + 1731.8 + + + + 16 + 140 + + + + + 1731.6 + + + + 16 + 140 + + + + + 1731.4 + + + + 16 + 141 + + + + + 1731.4 + + + + 16 + 141 + + + + + 1731.2 + + + + 16 + 141 + + + + + 1731.2 + + + + 16 + 141 + + + + + 1731.2 + + + + 16 + 142 + + + + + 1731.2 + + + + 16 + 142 + + + + + 1731.2 + + + + 16 + 144 + + + + + 1731.0 + + + + 16 + 144 + + + + + 1731.2 + + + + 16 + 145 + + + + + 1731.2 + + + + 16 + 146 + + + + + 1731.4 + + + + 16 + 147 + + + + + 1731.6 + + + + 16 + 148 + + + + + 1732.0 + + + + 16 + 149 + + + + + 1732.4 + + + + 16 + 150 + + + + + 1732.4 + + + + 16 + 150 + + + + + 1733.0 + + + + 16 + 151 + + + + + 1733.4 + + + + 16 + 152 + + + + + 1733.6 + + + + 16 + 152 + + + + + 1734.0 + + + + 16 + 153 + + + + + 1734.4 + + + + 16 + 153 + + + + + 1734.6 + + + + 16 + 154 + + + + + 1734.8 + + + + 16 + 154 + + + + + 1735.0 + + + + 16 + 155 + + + + + 1735.2 + + + + 16 + 155 + + + + + 1737.0 + + + + 16 + 157 + + + + + 1737.2 + + + + 16 + 158 + + + + + 1737.2 + + + + 16 + 158 + + + + + 1737.4 + + + + 16 + 158 + + + + + 1737.4 + + + + 16 + 158 + + + + + 1737.4 + + + + 16 + 158 + + + + + 1737.4 + + + + 16 + 157 + + + + + 1737.4 + + + + 16 + 157 + + + + + 1737.4 + + + + 16 + 157 + + + + + 1737.4 + + + + 16 + 156 + + + + + 1737.2 + + + + 16 + 156 + + + + + 1737.0 + + + + 16 + 155 + + + + + 1737.0 + + + + 16 + 155 + + + + + 1737.0 + + + + 16 + 154 + + + + + 1737.0 + + + + 16 + 154 + + + + + 1737.0 + + + + 16 + 154 + + + + + 1737.0 + + + + 16 + 153 + + + + + 1737.0 + + + + 16 + 153 + + + + + 1737.0 + + + + 16 + 153 + + + + + 1737.0 + + + + 16 + 153 + + + + + 1737.0 + + + + 16 + 152 + + + + + 1737.2 + + + + 16 + 152 + + + + + 1737.4 + + + + 16 + 152 + + + + + 1737.8 + + + + 16 + 152 + + + + + 1737.8 + + + + 16 + 152 + + + + + 1738.0 + + + + 16 + 152 + + + + + 1738.2 + + + + 16 + 152 + + + + + 1738.6 + + + + 16 + 152 + + + + + 1738.8 + + + + 16 + 152 + + + + + 1739.0 + + + + 16 + 153 + + + + + 1739.2 + + + + 16 + 153 + + + + + 1739.2 + + + + 16 + 153 + + + + + 1739.4 + + + + 16 + 153 + + + + + 1739.8 + + + + 16 + 153 + + + + + 1740.0 + + + + 16 + 153 + + + + + 1740.0 + + + + 16 + 153 + + + + + 1740.2 + + + + 16 + 154 + + + + + 1740.4 + + + + 16 + 153 + + + + + 1740.4 + + + + 16 + 153 + + + + + 1740.6 + + + + 16 + 153 + + + + + 1740.6 + + + + 16 + 153 + + + + + 1740.8 + + + + 16 + 154 + + + + + 1741.0 + + + + 16 + 154 + + + + + 1741.2 + + + + 16 + 153 + + + + + 1741.6 + + + + 17 + 154 + + + + + 1741.6 + + + + 17 + 154 + + + + + 1741.8 + + + + 17 + 154 + + + + + 1742.0 + + + + 17 + 154 + + + + + 1742.4 + + + + 17 + 153 + + + + + 1742.6 + + + + 17 + 153 + + + + + 1742.8 + + + + 17 + 153 + + + + + 1742.8 + + + + 17 + 153 + + + + + 1742.8 + + + + 17 + 152 + + + + + 1743.0 + + + + 17 + 152 + + + + + 1743.0 + + + + 17 + 151 + + + + + 1743.0 + + + + 17 + 151 + + + + + 1743.0 + + + + 17 + 151 + + + + + 1743.2 + + + + 17 + 150 + + + + + 1743.2 + + + + 17 + 149 + + + + + 1743.2 + + + + 17 + 149 + + + + + 1743.2 + + + + 17 + 147 + + + + + 1743.2 + + + + 17 + 146 + + + + + 1743.2 + + + + 17 + 145 + + + + + 1743.0 + + + + 17 + 143 + + + + + 1742.6 + + + + 17 + 142 + + + + + 1742.2 + + + + 17 + 141 + + + + + 1741.6 + + + + 17 + 140 + + + + + 1741.0 + + + + 17 + 140 + + + + + 1740.4 + + + + 17 + 140 + + + + + 1739.8 + + + + 17 + 140 + + + + + 1739.4 + + + + 17 + 140 + + + + + 1739.2 + + + + 17 + 140 + + + + + 1739.4 + + + + 17 + 140 + + + + + 1739.2 + + + + 17 + 140 + + + + + 1739.2 + + + + 17 + 140 + + + + + 1739.2 + + + + 17 + 139 + + + + + 1739.2 + + + + 17 + 139 + + + + + 1739.2 + + + + 17 + 138 + + + + + 1739.4 + + + + 17 + 138 + + + + + 1739.6 + + + + 17 + 137 + + + + + 1739.6 + + + + 17 + 136 + + + + + 1739.8 + + + + 17 + 136 + + + + + 1739.8 + + + + 17 + 134 + + + + + 1739.8 + + + + 17 + 133 + + + + + 1739.8 + + + + 17 + 132 + + + + + 1739.8 + + + + 17 + 131 + + + + + 1739.8 + + + + 17 + 130 + + + + + 1739.8 + + + + 17 + 129 + + + + + 1739.8 + + + + 17 + 129 + + + + + 1739.8 + + + + 17 + 129 + + + + + 1739.8 + + + + 17 + 130 + + + + + 1739.6 + + + + 17 + 130 + + + + + 1739.4 + + + + 17 + 130 + + + + + 1739.4 + + + + 17 + 130 + + + + + 1739.4 + + + + 17 + 130 + + + + + 1739.2 + + + + 17 + 130 + + + + + 1739.2 + + + + 17 + 130 + + + + + 1739.2 + + + + 17 + 130 + + + + + 1739.2 + + + + 17 + 130 + + + + + 1739.2 + + + + 17 + 131 + + + + + 1739.2 + + + + 17 + 130 + + + + + 1739.4 + + + + 17 + 131 + + + + + 1739.6 + + + + 17 + 131 + + + + + 1739.8 + + + + 17 + 131 + + + + + 1740.0 + + + + 17 + 131 + + + + + 1740.0 + + + + 17 + 132 + + + + + 1740.2 + + + + 17 + 132 + + + + + 1740.2 + + + + 17 + 132 + + + + + 1740.4 + + + + 17 + 133 + + + + + 1740.6 + + + + 17 + 133 + + + + + 1740.8 + + + + 17 + 133 + + + + + 1741.0 + + + + 17 + 134 + + + + + 1741.2 + + + + 17 + 133 + + + + + 1741.2 + + + + 17 + 134 + + + + + 1741.4 + + + + 17 + 134 + + + + + 1741.6 + + + + 17 + 133 + + + + + 1741.8 + + + + 17 + 134 + + + + + 1741.8 + + + + 17 + 134 + + + + + 1742.0 + + + + 17 + 134 + + + + + 1742.2 + + + + 17 + 134 + + + + + 1742.4 + + + + 17 + 135 + + + + + 1742.4 + + + + 17 + 135 + + + + + 1742.4 + + + + 17 + 135 + + + + + 1742.4 + + + + 17 + 135 + + + + + 1742.6 + + + + 17 + 136 + + + + + 1742.6 + + + + 17 + 136 + + + + + 1742.6 + + + + 17 + 137 + + + + + 1742.8 + + + + 17 + 137 + + + + + 1742.8 + + + + 17 + 138 + + + + + 1743.0 + + + + 17 + 138 + + + + + 1743.2 + + + + 17 + 139 + + + + + 1743.4 + + + + 17 + 140 + + + + + 1743.6 + + + + 17 + 141 + + + + + 1743.6 + + + + 17 + 142 + + + + + 1743.8 + + + + 17 + 143 + + + + + 1743.8 + + + + 17 + 144 + + + + + 1744.0 + + + + 17 + 145 + + + + + 1744.0 + + + + 17 + 145 + + + + + 1744.2 + + + + 17 + 147 + + + + + 1744.2 + + + + 17 + 147 + + + + + 1744.4 + + + + 17 + 148 + + + + + 1744.4 + + + + 17 + 148 + + + + + 1744.6 + + + + 17 + 148 + + + + + 1744.8 + + + + 17 + 148 + + + + + 1745.0 + + + + 17 + 148 + + + + + 1745.4 + + + + 17 + 148 + + + + + 1745.4 + + + + 17 + 148 + + + + + 1745.6 + + + + 17 + 148 + + + + + 1745.6 + + + + 17 + 148 + + + + + 1745.8 + + + + 17 + 147 + + + + + 1746.0 + + + + 17 + 148 + + + + + 1746.2 + + + + 17 + 147 + + + + + 1746.2 + + + + 17 + 147 + + + + + 1746.4 + + + + 17 + 147 + + + + + 1746.4 + + + + 17 + 147 + + + + + 1746.4 + + + + 17 + 147 + + + + + 1746.4 + + + + 17 + 148 + + + + + 1746.6 + + + + 17 + 148 + + + + + 1746.6 + + + + 17 + 148 + + + + + 1746.6 + + + + 17 + 148 + + + + + 1746.8 + + + + 17 + 149 + + + + + 1746.8 + + + + 17 + 149 + + + + + 1746.8 + + + + 17 + 150 + + + + + 1747.0 + + + + 17 + 151 + + + + + 1747.2 + + + + 17 + 151 + + + + + 1747.4 + + + + 17 + 152 + + + + + 1747.6 + + + + 17 + 152 + + + + + 1747.6 + + + + 17 + 153 + + + + + 1747.8 + + + + 17 + 153 + + + + + 1747.8 + + + + 17 + 153 + + + + + 1747.8 + + + + 17 + 154 + + + + + 1748.0 + + + + 17 + 154 + + + + + 1748.0 + + + + 17 + 154 + + + + + 1748.2 + + + + 17 + 155 + + + + + 1748.2 + + + + 17 + 155 + + + + + 1748.4 + + + + 17 + 155 + + + + + 1748.4 + + + + 17 + 155 + + + + + 1748.4 + + + + 17 + 155 + + + + + 1748.6 + + + + 17 + 155 + + + + + 1748.8 + + + + 17 + 156 + + + + + 1748.8 + + + + 17 + 155 + + + + + 1749.0 + + + + 17 + 156 + + + + + 1749.2 + + + + 17 + 156 + + + + + 1749.4 + + + + 17 + 157 + + + + + 1749.6 + + + + 17 + 157 + + + + + 1749.8 + + + + 17 + 157 + + + + + 1750.0 + + + + 17 + 157 + + + + + 1750.2 + + + + 17 + 157 + + + + + 1750.6 + + + + 17 + 157 + + + + + 1751.0 + + + + 17 + 158 + + + + + 1751.2 + + + + 17 + 157 + + + + + 1751.4 + + + + 17 + 158 + + + + + 1751.6 + + + + 17 + 158 + + + + + 1751.8 + + + + 17 + 158 + + + + + 1752.0 + + + + 17 + 158 + + + + + 1752.0 + + + + 17 + 158 + + + + + 1752.2 + + + + 17 + 158 + + + + + 1752.4 + + + + 17 + 157 + + + + + 1752.6 + + + + 17 + 158 + + + + + 1752.8 + + + + 17 + 158 + + + + + 1752.8 + + + + 17 + 157 + + + + + 1753.0 + + + + 17 + 157 + + + + + 1753.0 + + + + 17 + 157 + + + + + 1753.2 + + + + 17 + 157 + + + + + 1753.2 + + + + 17 + 156 + + + + + 1753.4 + + + + 17 + 156 + + + + + 1753.4 + + + + 17 + 156 + + + + + 1753.6 + + + + 17 + 155 + + + + + 1753.6 + + + + 17 + 155 + + + + + 1753.6 + + + + 17 + 154 + + + + + 1753.8 + + + + 17 + 154 + + + + + 1753.8 + + + + 17 + 154 + + + + + 1754.0 + + + + 17 + 154 + + + + + 1754.0 + + + + 17 + 154 + + + + + 1754.2 + + + + 17 + 153 + + + + + 1754.4 + + + + 17 + 153 + + + + + 1754.4 + + + + 17 + 154 + + + + + 1754.4 + + + + 17 + 153 + + + + + 1754.6 + + + + 17 + 154 + + + + + 1754.6 + + + + 17 + 153 + + + + + 1754.8 + + + + 17 + 153 + + + + + 1755.0 + + + + 17 + 153 + + + + + 1755.2 + + + + 17 + 153 + + + + + 1755.2 + + + + 17 + 153 + + + + + 1755.4 + + + + 17 + 153 + + + + + 1755.4 + + + + 17 + 153 + + + + + 1755.6 + + + + 17 + 153 + + + + + 1755.8 + + + + 17 + 153 + + + + + 1755.8 + + + + 17 + 152 + + + + + 1756.0 + + + + 17 + 152 + + + + + 1756.0 + + + + 17 + 152 + + + + + 1756.0 + + + + 17 + 153 + + + + + 1756.0 + + + + 17 + 152 + + + + + 1756.0 + + + + 17 + 152 + + + + + 1756.2 + + + + 17 + 153 + + + + + 1756.2 + + + + 17 + 153 + + + + + 1756.4 + + + + 17 + 153 + + + + + 1763.0 + + + + 17 + 152 + + + + + 1763.0 + + + + 17 + 151 + + + + + 1763.2 + + + + 17 + 151 + + + + + 1763.2 + + + + 17 + 151 + + + + + 1763.2 + + + + 17 + 150 + + + + + 1763.2 + + + + 17 + 150 + + + + + 1763.2 + + + + 17 + 150 + + + + + 1763.2 + + + + 17 + 150 + + + + + 1763.2 + + + + 17 + 151 + + + + + 1763.2 + + + + 17 + 151 + + + + + 1763.2 + + + + 17 + 152 + + + + + 1763.2 + + + + 17 + 152 + + + + + 1763.2 + + + + 17 + 153 + + + + + 1763.2 + + + + 17 + 154 + + + + + 1763.2 + + + + 17 + 154 + + + + + 1763.4 + + + + 17 + 155 + + + + + 1763.4 + + + + 17 + 155 + + + + + 1763.6 + + + + 17 + 156 + + + + + 1764.0 + + + + 17 + 156 + + + + + 1764.4 + + + + 17 + 156 + + + + + 1764.6 + + + + 17 + 157 + + + + + 1764.8 + + + + 17 + 157 + + + + + 1764.8 + + + + 17 + 157 + + + + + 1765.0 + + + + 17 + 157 + + + + + 1765.0 + + + + 17 + 157 + + + + + 1765.2 + + + + 17 + 157 + + + + + 1765.4 + + + + 17 + 157 + + + + + 1765.6 + + + + 17 + 156 + + + + + 1765.6 + + + + 17 + 157 + + + + + 1765.8 + + + + 17 + 156 + + + + + 1765.8 + + + + 17 + 156 + + + + + 1765.8 + + + + 17 + 156 + + + + + 1766.0 + + + + 17 + 156 + + + + + 1766.0 + + + + 17 + 155 + + + + + 1766.0 + + + + 17 + 155 + + + + + 1766.2 + + + + 17 + 154 + + + + + 1766.2 + + + + 17 + 154 + + + + + 1766.4 + + + + 17 + 154 + + + + + 1766.4 + + + + 17 + 154 + + + + + 1766.4 + + + + 17 + 154 + + + + + 1766.4 + + + + 17 + 153 + + + + + 1766.4 + + + + 17 + 153 + + + + + 1766.6 + + + + 17 + 152 + + + + + 1766.8 + + + + 17 + 152 + + + + + 1767.0 + + + + 17 + 152 + + + + + 1767.4 + + + + 17 + 151 + + + + + 1767.6 + + + + 17 + 151 + + + + + 1767.8 + + + + 17 + 151 + + + + + 1767.8 + + + + 17 + 150 + + + + + 1768.0 + + + + 17 + 150 + + + + + 1768.0 + + + + 17 + 150 + + + + + 1768.0 + + + + 17 + 150 + + + + + 1768.0 + + + + 17 + 149 + + + + + 1768.2 + + + + 17 + 150 + + + + + 1768.2 + + + + 17 + 150 + + + + + 1768.2 + + + + 17 + 150 + + + + + 1768.2 + + + + 17 + 151 + + + + + 1768.4 + + + + 17 + 152 + + + + + 1768.4 + + + + 17 + 152 + + + + + 1768.8 + + + + 17 + 153 + + + + + 1769.2 + + + + 17 + 154 + + + + + 1769.4 + + + + 17 + 155 + + + + + 1769.6 + + + + 17 + 155 + + + + + 1769.8 + + + + 17 + 156 + + + + + 1770.0 + + + + 17 + 157 + + + + + 1770.2 + + + + 17 + 157 + + + + + 1770.4 + + + + 17 + 158 + + + + + 1770.8 + + + + 17 + 159 + + + + + 1771.0 + + + + 17 + 159 + + + + + 1771.2 + + + + 17 + 160 + + + + + 1771.6 + + + + 17 + 160 + + + + + 1771.8 + + + + 17 + 160 + + + + + 1772.2 + + + + 17 + 160 + + + + + 1772.4 + + + + 17 + 161 + + + + + 1772.4 + + + + 17 + 161 + + + + + 1772.6 + + + + 17 + 161 + + + + + 1772.8 + + + + 17 + 162 + + + + + 1772.8 + + + + 17 + 162 + + + + + 1773.0 + + + + 17 + 161 + + + + + 1773.0 + + + + 17 + 161 + + + + + 1773.0 + + + + 17 + 161 + + + + + 1773.0 + + + + 17 + 160 + + + + + 1773.0 + + + + 17 + 160 + + + + + 1773.0 + + + + 17 + 160 + + + + + 1773.0 + + + + 17 + 159 + + + + + 1773.0 + + + + 17 + 158 + + + + + 1773.0 + + + + 17 + 158 + + + + + 1773.0 + + + + 17 + 157 + + + + + 1773.2 + + + + 17 + 156 + + + + + 1773.2 + + + + 17 + 155 + + + + + 1773.4 + + + + 17 + 149 + + + + + 1773.4 + + + + 17 + 148 + + + + + 1773.4 + + + + 17 + 148 + + + + + 1773.4 + + + + 17 + 147 + + + + + 1773.4 + + + + 17 + 147 + + + + + 1773.4 + + + + 17 + 147 + + + + + 1773.4 + + + + 17 + 146 + + + + + 1773.6 + + + + 17 + 146 + + + + + 1773.6 + + + + 17 + 146 + + + + + 1773.6 + + + + 17 + 146 + + + + + 1773.6 + + + + 17 + 145 + + + + + 1773.6 + + + + 17 + 145 + + + + + 1773.8 + + + + 17 + 145 + + + + + 1773.8 + + + + 17 + 145 + + + + + 1773.8 + + + + 17 + 145 + + + + + 1774.0 + + + + 17 + 145 + + + + + 1774.2 + + + + 17 + 146 + + + + + 1774.2 + + + + 17 + 146 + + + + + 1774.4 + + + + 17 + 146 + + + + + 1774.6 + + + + 17 + 146 + + + + + 1774.8 + + + + 17 + 147 + + + + + 1775.0 + + + + 17 + 147 + + + + + 1775.0 + + + + 17 + 148 + + + + + 1775.2 + + + + 17 + 148 + + + + + 1775.2 + + + + 17 + 149 + + + + + 1775.4 + + + + 17 + 149 + + + + + 1775.4 + + + + 17 + 150 + + + + + 1775.6 + + + + 17 + 150 + + + + + 1775.6 + + + + 17 + 151 + + + + + 1775.8 + + + + 17 + 151 + + + + + 1776.6 + + + + 17 + 152 + + + + + 1776.8 + + + + 17 + 153 + + + + + 1777.0 + + + + 17 + 153 + + + + + 1777.0 + + + + 17 + 154 + + + + + 1777.4 + + + + 17 + 154 + + + + + 1777.6 + + + + 17 + 154 + + + + + 1778.0 + + + + 17 + 154 + + + + + 1778.2 + + + + 17 + 155 + + + + + 1778.4 + + + + 17 + 154 + + + + + 1778.4 + + + + 17 + 154 + + + + + 1778.4 + + + + 17 + 153 + + + + + 1778.6 + + + + 17 + 153 + + + + + 1778.8 + + + + 17 + 153 + + + + + 1778.8 + + + + 17 + 153 + + + + + 1779.0 + + + + 17 + 153 + + + + + 1779.0 + + + + 17 + 152 + + + + + 1779.0 + + + + 17 + 152 + + + + + 1779.0 + + + + 17 + 152 + + + + + 1779.0 + + + + 17 + 152 + + + + + 1779.2 + + + + 17 + 152 + + + + + 1779.2 + + + + 17 + 152 + + + + + 1779.4 + + + + 17 + 152 + + + + + 1779.4 + + + + 17 + 152 + + + + + 1779.6 + + + + 17 + 151 + + + + + 1779.8 + + + + 17 + 152 + + + + + 1779.8 + + + + 17 + 152 + + + + + 1780.0 + + + + 17 + 153 + + + + + 1780.0 + + + + 17 + 153 + + + + + 1780.2 + + + + 17 + 153 + + + + + 1780.4 + + + + 17 + 154 + + + + + 1780.6 + + + + 17 + 154 + + + + + 1780.8 + + + + 17 + 154 + + + + + 1780.8 + + + + 17 + 155 + + + + + 1781.2 + + + + 17 + 155 + + + + + 1781.4 + + + + 17 + 155 + + + + + 1781.4 + + + + 17 + 155 + + + + + 1781.4 + + + + 17 + 155 + + + + + 1781.4 + + + + 17 + 155 + + + + + 1781.4 + + + + 17 + 155 + + + + + 1781.6 + + + + 17 + 155 + + + + + 1781.8 + + + + 17 + 155 + + + + + 1781.8 + + + + 17 + 155 + + + + + 1782.0 + + + + 17 + 155 + + + + + 1782.0 + + + + 17 + 154 + + + + + 1782.2 + + + + 17 + 154 + + + + + 1782.2 + + + + 17 + 154 + + + + + 1782.2 + + + + 17 + 154 + + + + + 1782.4 + + + + 17 + 154 + + + + + 1782.4 + + + + 17 + 154 + + + + + 1782.6 + + + + 17 + 154 + + + + + 1782.8 + + + + 17 + 154 + + + + + 1783.0 + + + + 17 + 154 + + + + + 1783.2 + + + + 17 + 154 + + + + + 1783.4 + + + + 17 + 154 + + + + + 1784.4 + + + + 17 + 155 + + + + + 1784.4 + + + + 17 + 154 + + + + + 1784.4 + + + + 17 + 154 + + + + + 1784.6 + + + + 17 + 154 + + + + + 1784.6 + + + + 17 + 153 + + + + + 1784.8 + + + + 17 + 153 + + + + + 1784.8 + + + + 17 + 153 + + + + + 1785.0 + + + + 17 + 152 + + + + + 1785.0 + + + + 17 + 152 + + + + + 1785.0 + + + + 17 + 151 + + + + + 1785.2 + + + + 17 + 151 + + + + + 1785.2 + + + + 17 + 150 + + + + + 1785.2 + + + + 17 + 150 + + + + + 1785.4 + + + + 17 + 149 + + + + + 1785.4 + + + + 17 + 149 + + + + + 1785.6 + + + + 17 + 149 + + + + + 1785.8 + + + + 17 + 149 + + + + + 1786.0 + + + + 17 + 149 + + + + + 1786.2 + + + + 17 + 150 + + + + + 1786.4 + + + + 17 + 150 + + + + + 1786.6 + + + + 17 + 151 + + + + + 1786.8 + + + + 17 + 151 + + + + + 1787.0 + + + + 17 + 152 + + + + + 1787.2 + + + + 17 + 153 + + + + + 1787.4 + + + + 17 + 154 + + + + + 1787.4 + + + + 17 + 155 + + + + + 1787.8 + + + + 17 + 156 + + + + + 1788.0 + + + + 17 + 157 + + + + + 1788.2 + + + + 17 + 157 + + + + + 1788.6 + + + + 17 + 158 + + + + + 1788.6 + + + + 17 + 158 + + + + + 1788.8 + + + + 17 + 159 + + + + + 1789.0 + + + + 17 + 159 + + + + + 1789.0 + + + + 17 + 159 + + + + + 1789.2 + + + + 17 + 159 + + + + + 1789.2 + + + + 17 + 160 + + + + + 1789.2 + + + + 17 + 159 + + + + + 1789.2 + + + + 17 + 159 + + + + + 1789.4 + + + + 16 + 159 + + + + + 1791.4 + + + + 16 + 158 + + + + + 1791.4 + + + + 16 + 157 + + + + + 1791.4 + + + + 16 + 157 + + + + + 1791.6 + + + + 16 + 158 + + + + + 1791.6 + + + + 16 + 158 + + + + + 1791.6 + + + + 16 + 158 + + + + + 1791.8 + + + + 16 + 158 + + + + + 1791.8 + + + + 16 + 157 + + + + + 1791.8 + + + + 16 + 157 + + + + + 1792.0 + + + + 16 + 157 + + + + + 1792.2 + + + + 16 + 158 + + + + + 1792.4 + + + + 16 + 157 + + + + + 1792.4 + + + + 16 + 157 + + + + + 1792.6 + + + + 16 + 157 + + + + + 1792.6 + + + + 16 + 157 + + + + + 1792.8 + + + + 16 + 157 + + + + + 1793.0 + + + + 16 + 156 + + + + + 1793.0 + + + + 16 + 156 + + + + + 1793.0 + + + + 16 + 156 + + + + + 1793.0 + + + + 16 + 156 + + + + + 1793.2 + + + + 16 + 155 + + + + + 1793.2 + + + + 16 + 155 + + + + + 1793.2 + + + + 16 + 155 + + + + + 1793.4 + + + + 16 + 155 + + + + + 1793.6 + + + + 16 + 154 + + + + + 1793.6 + + + + 16 + 155 + + + + + 1793.8 + + + + 16 + 155 + + + + + 1794.0 + + + + 16 + 155 + + + + + 1794.0 + + + + 16 + 155 + + + + + 1794.2 + + + + 16 + 155 + + + + + 1794.2 + + + + 16 + 155 + + + + + 1794.4 + + + + 16 + 155 + + + + + 1794.6 + + + + 16 + 155 + + + + + 1794.6 + + + + 16 + 155 + + + + + 1794.8 + + + + 16 + 155 + + + + + 1795.2 + + + + 16 + 154 + + + + + 1795.4 + + + + 16 + 154 + + + + + 1795.4 + + + + 16 + 155 + + + + + 1795.8 + + + + 16 + 154 + + + + + 1795.8 + + + + 16 + 154 + + + + + 1796.0 + + + + 16 + 154 + + + + + 1796.2 + + + + 16 + 154 + + + + + 1796.4 + + + + 16 + 154 + + + + + 1796.6 + + + + 16 + 154 + + + + + 1796.6 + + + + 16 + 154 + + + + + 1796.6 + + + + 16 + 154 + + + + + 1796.8 + + + + 16 + 154 + + + + + 1796.8 + + + + 16 + 154 + + + + + 1796.8 + + + + 16 + 154 + + + + + 1796.8 + + + + 16 + 154 + + + + + 1796.8 + + + + 16 + 154 + + + + + 1796.8 + + + + 16 + 153 + + + + + 1796.8 + + + + 16 + 153 + + + + + 1796.8 + + + + 16 + 152 + + + + + 1796.8 + + + + 16 + 152 + + + + + 1796.8 + + + + 16 + 151 + + + + + 1796.8 + + + + 16 + 151 + + + + + 1796.8 + + + + 16 + 150 + + + + + 1796.8 + + + + 16 + 150 + + + + + 1796.8 + + + + 16 + 149 + + + + + 1796.8 + + + + 16 + 149 + + + + + 1797.0 + + + + 16 + 148 + + + + + 1798.0 + + + + 16 + 146 + + + + + 1798.0 + + + + 16 + 145 + + + + + 1798.0 + + + + 16 + 146 + + + + + 1798.2 + + + + 16 + 146 + + + + + 1798.2 + + + + 16 + 146 + + + + + 1798.4 + + + + 16 + 146 + + + + + 1798.4 + + + + 16 + 147 + + + + + 1798.4 + + + + 16 + 147 + + + + + 1798.6 + + + + 16 + 148 + + + + + 1798.6 + + + + 16 + 149 + + + + + 1798.8 + + + + 16 + 149 + + + + + 1798.8 + + + + 16 + 150 + + + + + 1799.0 + + + + 16 + 150 + + + + + 1799.0 + + + + 16 + 151 + + + + + 1799.2 + + + + 16 + 152 + + + + + 1799.2 + + + + 16 + 151 + + + + + 1799.4 + + + + 16 + 152 + + + + + 1799.6 + + + + 16 + 152 + + + + + 1799.6 + + + + 16 + 152 + + + + + 1799.8 + + + + 16 + 152 + + + + + 1799.8 + + + + 16 + 152 + + + + + 1799.8 + + + + 16 + 153 + + + + + 1799.8 + + + + 16 + 153 + + + + + 1799.8 + + + + 16 + 153 + + + + + 1799.8 + + + + 16 + 153 + + + + + 1799.8 + + + + 16 + 154 + + + + + 1800.0 + + + + 16 + 153 + + + + + 1800.0 + + + + 16 + 153 + + + + + 1800.0 + + + + 16 + 154 + + + + + 1800.0 + + + + 16 + 153 + + + + + 1800.0 + + + + 16 + 153 + + + + + 1800.0 + + + + 16 + 153 + + + + + 1800.0 + + + + 16 + 153 + + + + + 1800.0 + + + + 16 + 152 + + + + + 1800.0 + + + + 16 + 152 + + + + + 1800.0 + + + + 16 + 152 + + + + + 1800.0 + + + + 16 + 152 + + + + + 1800.0 + + + + 16 + 152 + + + + + 1800.2 + + + + 16 + 151 + + + + + 1800.2 + + + + 16 + 151 + + + + + 1800.2 + + + + 16 + 151 + + + + + 1800.2 + + + + 16 + 151 + + + + + 1800.2 + + + + 16 + 151 + + + + + 1800.4 + + + + 16 + 151 + + + + + 1800.4 + + + + 16 + 151 + + + + + 1800.6 + + + + 16 + 151 + + + + + 1800.8 + + + + 16 + 150 + + + + + 1800.8 + + + + 16 + 151 + + + + + 1801.0 + + + + 16 + 151 + + + + + 1801.0 + + + + 16 + 151 + + + + + 1801.0 + + + + 16 + 152 + + + + + 1801.2 + + + + 16 + 152 + + + + + 1801.4 + + + + 16 + 152 + + + + + 1801.4 + + + + 16 + 153 + + + + + 1801.4 + + + + 16 + 153 + + + + + 1801.6 + + + + 16 + 153 + + + + + 1801.6 + + + + 16 + 154 + + + + + 1801.8 + + + + 16 + 155 + + + + + 1802.0 + + + + 16 + 155 + + + + + 1802.2 + + + + 16 + 155 + + + + + 1802.4 + + + + 16 + 156 + + + + + 1802.6 + + + + 16 + 156 + + + + + 1802.8 + + + + 16 + 157 + + + + + 1803.0 + + + + 16 + 157 + + + + + 1803.2 + + + + 16 + 158 + + + + + 1803.4 + + + + 16 + 158 + + + + + 1803.6 + + + + 16 + 159 + + + + + 1803.8 + + + + 16 + 160 + + + + + 1804.0 + + + + 16 + 160 + + + + + 1804.2 + + + + 16 + 161 + + + + + 1804.2 + + + + 16 + 161 + + + + + 1804.4 + + + + 16 + 161 + + + + + 1805.0 + + + + 16 + 161 + + + + + 1805.4 + + + + 16 + 161 + + + + + 1805.8 + + + + 16 + 161 + + + + + 1806.0 + + + + 16 + 161 + + + + + 1806.2 + + + + 16 + 161 + + + + + 1806.4 + + + + 16 + 161 + + + + + 1806.6 + + + + 16 + 161 + + + + + 1806.8 + + + + 16 + 160 + + + + + 1806.8 + + + + 16 + 160 + + + + + 1807.0 + + + + 16 + 160 + + + + + 1807.0 + + + + 16 + 159 + + + + + 1807.2 + + + + 16 + 159 + + + + + 1807.2 + + + + 16 + 158 + + + + + 1807.4 + + + + 16 + 158 + + + + + 1807.4 + + + + 16 + 157 + + + + + 1807.4 + + + + 16 + 157 + + + + + 1807.4 + + + + 16 + 156 + + + + + 1807.4 + + + + 16 + 156 + + + + + 1807.4 + + + + 16 + 156 + + + + + 1807.6 + + + + 16 + 156 + + + + + 1807.6 + + + + 16 + 156 + + + + + 1807.8 + + + + 16 + 156 + + + + + 1807.8 + + + + 16 + 157 + + + + + 1807.8 + + + + 16 + 157 + + + + + 1808.0 + + + + 16 + 157 + + + + + 1808.2 + + + + 16 + 157 + + + + + 1808.4 + + + + 16 + 158 + + + + + 1808.4 + + + + 16 + 158 + + + + + 1808.6 + + + + 16 + 158 + + + + + 1808.8 + + + + 16 + 158 + + + + + 1809.0 + + + + 16 + 158 + + + + + 1809.0 + + + + 16 + 158 + + + + + 1809.2 + + + + 16 + 159 + + + + + 1809.4 + + + + 16 + 159 + + + + + 1809.8 + + + + 16 + 158 + + + + + 1810.0 + + + + 16 + 158 + + + + + 1810.2 + + + + 16 + 158 + + + + + 1810.2 + + + + 16 + 158 + + + + + 1810.4 + + + + 16 + 157 + + + + + 1810.6 + + + + 16 + 158 + + + + + 1810.6 + + + + 16 + 157 + + + + + 1810.8 + + + + 16 + 157 + + + + + 1810.8 + + + + 16 + 157 + + + + + 1811.0 + + + + 16 + 156 + + + + + 1811.0 + + + + 16 + 156 + + + + + 1811.2 + + + + 16 + 155 + + + + + 1811.2 + + + + 16 + 155 + + + + + 1811.2 + + + + 16 + 155 + + + + + 1811.2 + + + + 16 + 155 + + + + + 1811.4 + + + + 16 + 155 + + + + + 1811.6 + + + + 16 + 155 + + + + + 1811.6 + + + + 16 + 155 + + + + + 1811.8 + + + + 16 + 155 + + + + + 1811.8 + + + + 16 + 155 + + + + + 1812.0 + + + + 16 + 155 + + + + + 1812.0 + + + + 16 + 156 + + + + + 1812.2 + + + + 16 + 155 + + + + + 1812.2 + + + + 16 + 156 + + + + + 1812.4 + + + + 16 + 156 + + + + + 1812.6 + + + + 16 + 156 + + + + + 1812.8 + + + + 16 + 157 + + + + + 1813.0 + + + + 16 + 157 + + + + + 1813.2 + + + + 16 + 157 + + + + + 1813.4 + + + + 16 + 157 + + + + + 1813.4 + + + + 16 + 158 + + + + + 1813.6 + + + + 16 + 157 + + + + + 1813.6 + + + + 16 + 158 + + + + + 1813.8 + + + + 16 + 157 + + + + + 1814.0 + + + + 16 + 157 + + + + + 1814.4 + + + + 16 + 157 + + + + + 1814.6 + + + + 16 + 157 + + + + + 1814.8 + + + + 16 + 157 + + + + + 1815.0 + + + + 16 + 157 + + + + + 1815.4 + + + + 16 + 157 + + + + + 1815.8 + + + + 16 + 157 + + + + + 1816.0 + + + + 16 + 157 + + + + + 1816.0 + + + + 16 + 157 + + + + + 1816.2 + + + + 16 + 157 + + + + + 1816.6 + + + + 16 + 156 + + + + + 1816.6 + + + + 16 + 156 + + + + + 1816.8 + + + + 16 + 156 + + + + + 1817.0 + + + + 16 + 156 + + + + + 1817.2 + + + + 16 + 155 + + + + + 1817.2 + + + + 16 + 155 + + + + + 1817.4 + + + + 16 + 155 + + + + + 1817.6 + + + + 16 + 155 + + + + + 1817.6 + + + + 16 + 155 + + + + + 1817.8 + + + + 16 + 155 + + + + + 1818.0 + + + + 16 + 154 + + + + + 1818.2 + + + + 16 + 154 + + + + + 1818.2 + + + + 16 + 154 + + + + + 1818.4 + + + + 16 + 155 + + + + + 1818.4 + + + + 16 + 155 + + + + + 1818.6 + + + + 16 + 154 + + + + + 1818.8 + + + + 16 + 155 + + + + + 1818.8 + + + + 16 + 154 + + + + + 1819.0 + + + + 16 + 154 + + + + + 1819.2 + + + + 16 + 154 + + + + + 1819.4 + + + + 16 + 155 + + + + + 1819.4 + + + + 16 + 154 + + + + + 1819.8 + + + + 16 + 154 + + + + + 1820.0 + + + + 16 + 155 + + + + + 1820.0 + + + + 16 + 154 + + + + + 1820.2 + + + + 16 + 154 + + + + + 1820.4 + + + + 16 + 154 + + + + + 1820.6 + + + + 16 + 154 + + + + + 1820.6 + + + + 16 + 153 + + + + + 1820.8 + + + + 16 + 153 + + + + + 1820.8 + + + + 16 + 153 + + + + + 1821.0 + + + + 16 + 152 + + + + + 1821.0 + + + + 16 + 152 + + + + + 1821.0 + + + + 16 + 152 + + + + + 1821.0 + + + + 16 + 152 + + + + + 1821.2 + + + + 16 + 151 + + + + + 1821.4 + + + + 16 + 151 + + + + + 1821.6 + + + + 16 + 151 + + + + + 1821.8 + + + + 16 + 150 + + + + + 1821.8 + + + + 16 + 151 + + + + + 1821.8 + + + + 16 + 150 + + + + + 1821.8 + + + + 16 + 150 + + + + + 1821.8 + + + + 16 + 150 + + + + + 1822.0 + + + + 16 + 150 + + + + + 1822.0 + + + + 16 + 150 + + + + + 1822.0 + + + + 16 + 150 + + + + + 1822.0 + + + + 16 + 151 + + + + + 1822.0 + + + + 16 + 151 + + + + + 1822.0 + + + + 16 + 150 + + + + + 1822.0 + + + + 16 + 151 + + + + + 1822.0 + + + + 16 + 151 + + + + + 1822.2 + + + + 16 + 151 + + + + + 1822.6 + + + + 16 + 151 + + + + + 1822.8 + + + + 16 + 151 + + + + + 1823.0 + + + + 16 + 152 + + + + + 1823.4 + + + + 16 + 152 + + + + + 1823.8 + + + + 16 + 153 + + + + + 1824.0 + + + + 16 + 153 + + + + + 1824.0 + + + + 16 + 153 + + + + + 1824.4 + + + + 16 + 154 + + + + + 1824.6 + + + + 16 + 154 + + + + + 1824.8 + + + + 16 + 154 + + + + + 1824.8 + + + + 16 + 154 + + + + + 1825.0 + + + + 16 + 154 + + + + + 1825.2 + + + + 16 + 155 + + + + + 1825.4 + + + + 16 + 155 + + + + + 1827.0 + + + + 17 + 154 + + + + + 1827.0 + + + + 17 + 153 + + + + + 1827.0 + + + + 17 + 153 + + + + + 1827.0 + + + + 17 + 152 + + + + + 1827.0 + + + + 17 + 151 + + + + + 1826.8 + + + + 17 + 150 + + + + + 1826.8 + + + + 17 + 150 + + + + + 1826.8 + + + + 17 + 149 + + + + + 1826.8 + + + + 17 + 149 + + + + + 1826.6 + + + + 17 + 147 + + + + + 1826.6 + + + + 17 + 146 + + + + + 1826.6 + + + + 17 + 145 + + + + + 1826.6 + + + + 17 + 143 + + + + + 1826.6 + + + + 17 + 142 + + + + + 1826.6 + + + + 17 + 141 + + + + + 1826.6 + + + + 17 + 141 + + + + + 1826.6 + + + + 17 + 140 + + + + + 1826.6 + + + + 17 + 139 + + + + + 1826.6 + + + + 17 + 138 + + + + + 1826.6 + + + + 17 + 137 + + + + + 1826.6 + + + + 17 + 136 + + + + + 1826.6 + + + + 17 + 136 + + + + + 1826.8 + + + + 17 + 136 + + + + + 1826.8 + + + + 17 + 135 + + + + + 1827.0 + + + + 17 + 134 + + + + + 1827.0 + + + + 17 + 133 + + + + + 1827.2 + + + + 17 + 132 + + + + + 1827.2 + + + + 17 + 131 + + + + + 1827.2 + + + + 17 + 130 + + + + + 1827.2 + + + + 17 + 129 + + + + + 1827.2 + + + + 17 + 128 + + + + + 1827.2 + + + + 17 + 128 + + + + + 1827.4 + + + + 17 + 127 + + + + + 1827.4 + + + + 17 + 127 + + + + + 1827.4 + + + + 17 + 126 + + + + + 1827.6 + + + + 17 + 126 + + + + + 1827.6 + + + + 17 + 126 + + + + + 1827.6 + + + + 17 + 125 + + + + + 1828.0 + + + + 17 + 126 + + + + + 1827.8 + + + + 17 + 125 + + + + + 1828.0 + + + + 17 + 125 + + + + + 1828.2 + + + + 17 + 125 + + + + + 1828.2 + + + + 17 + 124 + + + + + 1828.2 + + + + 17 + 124 + + + + + 1828.4 + + + + 17 + 124 + + + + + 1828.4 + + + + 17 + 123 + + + + + 1828.4 + + + + 17 + 123 + + + + + 1828.4 + + + + 17 + 123 + + + + + 1828.6 + + + + 17 + 123 + + + + + 1828.6 + + + + 17 + 124 + + + + + 1828.6 + + + + 17 + 125 + + + + + 1828.6 + + + + 17 + 126 + + + + + 1828.6 + + + + 16 + 127 + + + + + 1828.6 + + + + 16 + 127 + + + + + 1828.8 + + + + 16 + 128 + + + + + 1828.8 + + + + 16 + 130 + + + + + 1828.8 + + + + 16 + 131 + + + + + 1828.8 + + + + 16 + 133 + + + + + 1828.8 + + + + 16 + 134 + + + + + 1829.0 + + + + 16 + 135 + + + + + 1829.2 + + + + 16 + 137 + + + + + 1829.4 + + + + 16 + 138 + + + + + 1829.8 + + + + 16 + 140 + + + + + 1830.0 + + + + 16 + 141 + + + + + 1830.4 + + + + 16 + 143 + + + + + 1830.6 + + + + 16 + 144 + + + + + 1830.8 + + + + 16 + 145 + + + + + 1831.0 + + + + 16 + 146 + + + + + 1831.2 + + + + 16 + 147 + + + + + 1831.6 + + + + 16 + 147 + + + + + 1831.8 + + + + 16 + 148 + + + + + 1832.0 + + + + 16 + 148 + + + + + 1832.2 + + + + 16 + 149 + + + + + 1832.2 + + + + 16 + 150 + + + + + 1832.4 + + + + 16 + 150 + + + + + 1832.6 + + + + 16 + 150 + + + + + 1832.6 + + + + 16 + 150 + + + + + 1832.8 + + + + 16 + 150 + + + + + 1833.0 + + + + 16 + 151 + + + + + 1833.2 + + + + 16 + 151 + + + + + 1833.4 + + + + 16 + 151 + + + + + 1833.6 + + + + 16 + 150 + + + + + 1833.8 + + + + 16 + 151 + + + + + 1834.0 + + + + 16 + 151 + + + + + 1834.0 + + + + 16 + 151 + + + + + 1834.2 + + + + 16 + 150 + + + + + 1834.2 + + + + 16 + 150 + + + + + 1834.4 + + + + 16 + 150 + + + + + 1834.6 + + + + 16 + 150 + + + + + 1834.8 + + + + 16 + 150 + + + + + 1835.0 + + + + 16 + 150 + + + + + 1835.0 + + + + 16 + 150 + + + + + 1835.2 + + + + 16 + 151 + + + + + 1835.2 + + + + 16 + 151 + + + + + 1835.4 + + + + 16 + 151 + + + + + 1835.8 + + + + 16 + 151 + + + + + 1836.0 + + + + 16 + 151 + + + + + 1836.4 + + + + 16 + 152 + + + + + 1836.4 + + + + 16 + 152 + + + + + 1836.8 + + + + 16 + 152 + + + + + 1836.8 + + + + 16 + 152 + + + + + 1837.2 + + + + 16 + 153 + + + + + 1837.4 + + + + 16 + 153 + + + + + 1837.4 + + + + 16 + 153 + + + + + 1837.6 + + + + 16 + 152 + + + + + 1837.6 + + + + 16 + 153 + + + + + 1837.8 + + + + 16 + 152 + + + + + 1838.0 + + + + 16 + 152 + + + + + 1838.2 + + + + 16 + 152 + + + + + 1838.4 + + + + 16 + 153 + + + + + 1838.6 + + + + 16 + 152 + + + + + 1838.6 + + + + 16 + 152 + + + + + 1838.8 + + + + 16 + 152 + + + + + 1838.8 + + + + 16 + 152 + + + + + 1839.0 + + + + 16 + 152 + + + + + 1839.0 + + + + 16 + 152 + + + + + 1839.0 + + + + 16 + 152 + + + + + 1839.0 + + + + 16 + 151 + + + + + 1839.2 + + + + 16 + 151 + + + + + 1839.4 + + + + 16 + 151 + + + + + 1839.4 + + + + 16 + 151 + + + + + 1839.6 + + + + 16 + 151 + + + + + 1839.8 + + + + 16 + 150 + + + + + 1840.0 + + + + 16 + 150 + + + + + 1840.0 + + + + 16 + 150 + + + + + 1840.2 + + + + 16 + 149 + + + + + 1840.4 + + + + 16 + 149 + + + + + 1840.4 + + + + 16 + 149 + + + + + 1840.6 + + + + 16 + 148 + + + + + 1840.6 + + + + 16 + 148 + + + + + 1840.8 + + + + 16 + 147 + + + + + 1841.0 + + + + 16 + 147 + + + + + 1841.0 + + + + 16 + 147 + + + + + 1841.2 + + + + 16 + 146 + + + + + 1841.4 + + + + 16 + 146 + + + + + 1841.4 + + + + 16 + 146 + + + + + 1841.6 + + + + 16 + 146 + + + + + 1841.6 + + + + 16 + 146 + + + + + 1841.8 + + + + 16 + 146 + + + + + 1842.0 + + + + 16 + 146 + + + + + 1842.2 + + + + 16 + 146 + + + + + 1842.2 + + + + 16 + 146 + + + + + 1842.4 + + + + 16 + 147 + + + + + 1842.4 + + + + 16 + 146 + + + + + 1842.6 + + + + 16 + 147 + + + + + 1842.8 + + + + 16 + 147 + + + + + 1843.0 + + + + 16 + 148 + + + + + 1843.0 + + + + 16 + 148 + + + + + 1843.0 + + + + 16 + 149 + + + + + 1843.2 + + + + 15 + 149 + + + + + 1843.4 + + + + 15 + 149 + + + + + 1843.6 + + + + 15 + 149 + + + + + 1843.8 + + + + 15 + 149 + + + + + 1844.0 + + + + 15 + 149 + + + + + 1844.0 + + + + 15 + 150 + + + + + 1844.2 + + + + 15 + 149 + + + + + 1844.4 + + + + 15 + 149 + + + + + 1844.6 + + + + 15 + 149 + + + + + 1844.6 + + + + 15 + 149 + + + + + 1844.8 + + + + 15 + 150 + + + + + 1845.0 + + + + 15 + 149 + + + + + 1845.4 + + + + 15 + 149 + + + + + 1845.4 + + + + 15 + 150 + + + + + 1845.6 + + + + 15 + 149 + + + + + 1845.6 + + + + 15 + 149 + + + + + 1845.8 + + + + 15 + 149 + + + + + 1845.8 + + + + 15 + 149 + + + + + 1845.8 + + + + 15 + 149 + + + + + 1846.0 + + + + 15 + 149 + + + + + 1846.2 + + + + 15 + 149 + + + + + 1846.4 + + + + 15 + 149 + + + + + 1846.6 + + + + 15 + 149 + + + + + 1846.8 + + + + 15 + 149 + + + + + 1846.8 + + + + 15 + 149 + + + + + 1847.0 + + + + 15 + 149 + + + + + 1847.2 + + + + 15 + 149 + + + + + 1847.2 + + + + 15 + 148 + + + + + 1847.4 + + + + 15 + 148 + + + + + 1847.6 + + + + 15 + 148 + + + + + 1847.8 + + + + 15 + 148 + + + + + 1848.0 + + + + 15 + 148 + + + + + 1848.2 + + + + 15 + 148 + + + + + 1848.2 + + + + 15 + 149 + + + + + 1848.4 + + + + 15 + 149 + + + + + 1848.4 + + + + 15 + 149 + + + + + 1848.6 + + + + 15 + 150 + + + + + 1848.8 + + + + 15 + 150 + + + + + 1849.0 + + + + 15 + 150 + + + + + 1849.0 + + + + 15 + 150 + + + + + 1849.2 + + + + 15 + 149 + + + + + 1849.4 + + + + 15 + 150 + + + + + 1849.6 + + + + 15 + 149 + + + + + 1849.8 + + + + 15 + 150 + + + + + 1850.0 + + + + 15 + 149 + + + + + 1850.0 + + + + 15 + 149 + + + + + 1850.2 + + + + 15 + 149 + + + + + 1850.2 + + + + 15 + 148 + + + + + 1850.4 + + + + 15 + 148 + + + + + 1850.4 + + + + 15 + 148 + + + + + 1850.6 + + + + 15 + 148 + + + + + 1850.8 + + + + 15 + 147 + + + + + 1851.0 + + + + 15 + 147 + + + + + 1851.2 + + + + 15 + 147 + + + + + 1851.2 + + + + 15 + 146 + + + + + 1851.2 + + + + 15 + 146 + + + + + 1851.4 + + + + 15 + 146 + + + + + 1851.4 + + + + 15 + 145 + + + + + 1851.6 + + + + 15 + 145 + + + + + 1851.8 + + + + 15 + 145 + + + + + 1852.0 + + + + 15 + 145 + + + + + 1852.0 + + + + 15 + 145 + + + + + 1852.0 + + + + 15 + 145 + + + + + 1852.2 + + + + 15 + 145 + + + + + 1852.2 + + + + 15 + 145 + + + + + 1852.4 + + + + 15 + 145 + + + + + 1852.4 + + + + 15 + 145 + + + + + 1852.6 + + + + 15 + 145 + + + + + 1852.6 + + + + 15 + 144 + + + + + 1852.8 + + + + 15 + 144 + + + + + 1853.0 + + + + 15 + 144 + + + + + 1853.2 + + + + 15 + 144 + + + + + 1853.2 + + + + 15 + 144 + + + + + 1853.4 + + + + 15 + 143 + + + + + 1853.4 + + + + 15 + 143 + + + + + 1853.4 + + + + 15 + 142 + + + + + 1853.6 + + + + 15 + 142 + + + + + 1853.6 + + + + 15 + 142 + + + + + 1853.6 + + + + 15 + 142 + + + + + 1853.8 + + + + 15 + 141 + + + + + 1853.8 + + + + 15 + 140 + + + + + 1854.0 + + + + 15 + 140 + + + + + 1854.0 + + + + 15 + 140 + + + + + 1854.2 + + + + 15 + 140 + + + + + 1854.2 + + + + 15 + 140 + + + + + 1854.4 + + + + 15 + 140 + + + + + 1854.4 + + + + 15 + 140 + + + + + 1854.4 + + + + 15 + 140 + + + + + 1854.6 + + + + 15 + 140 + + + + + 1854.6 + + + + 15 + 140 + + + + + 1854.8 + + + + 15 + 140 + + + + + 1855.0 + + + + 15 + 140 + + + + + 1855.0 + + + + 15 + 140 + + + + + 1855.0 + + + + 15 + 140 + + + + + 1855.2 + + + + 15 + 140 + + + + + 1855.4 + + + + 15 + 141 + + + + + 1855.8 + + + + 15 + 141 + + + + + 1855.8 + + + + 15 + 141 + + + + + 1856.0 + + + + 15 + 141 + + + + + 1856.0 + + + + 15 + 141 + + + + + 1856.0 + + + + 15 + 142 + + + + + 1856.2 + + + + 15 + 141 + + + + + 1856.4 + + + + 15 + 141 + + + + + 1856.4 + + + + 15 + 142 + + + + + 1856.6 + + + + 15 + 142 + + + + + 1856.8 + + + + 15 + 142 + + + + + 1857.0 + + + + 15 + 142 + + + + + 1857.2 + + + + 15 + 143 + + + + + 1857.2 + + + + 15 + 143 + + + + + 1857.4 + + + + 15 + 143 + + + + + 1857.6 + + + + 15 + 144 + + + + + 1857.6 + + + + 15 + 144 + + + + + 1857.8 + + + + 15 + 144 + + + + + 1858.0 + + + + 15 + 145 + + + + + 1858.2 + + + + 15 + 145 + + + + + 1858.4 + + + + 15 + 146 + + + + + 1858.4 + + + + 15 + 146 + + + + + 1858.8 + + + + 15 + 147 + + + + + 1859.0 + + + + 15 + 147 + + + + + 1859.0 + + + + 15 + 146 + + + + + 1859.2 + + + + 15 + 147 + + + + + 1859.4 + + + + 15 + 147 + + + + + 1859.6 + + + + 15 + 146 + + + + + 1859.6 + + + + 15 + 146 + + + + + 1859.8 + + + + 15 + 146 + + + + + 1860.0 + + + + 15 + 146 + + + + + 1860.0 + + + + 15 + 145 + + + + + 1860.2 + + + + 15 + 145 + + + + + 1860.2 + + + + 15 + 145 + + + + + 1860.4 + + + + 15 + 145 + + + + + 1860.6 + + + + 15 + 144 + + + + + 1860.6 + + + + 15 + 144 + + + + + 1860.6 + + + + 15 + 144 + + + + + 1860.6 + + + + 15 + 144 + + + + + 1860.8 + + + + 15 + 144 + + + + + 1860.8 + + + + 15 + 144 + + + + + 1861.0 + + + + 15 + 143 + + + + + 1861.2 + + + + 15 + 143 + + + + + 1861.4 + + + + 15 + 143 + + + + + 1861.6 + + + + 15 + 143 + + + + + 1861.6 + + + + 15 + 142 + + + + + 1861.6 + + + + 16 + 142 + + + + + 1861.8 + + + + 16 + 143 + + + + + 1861.8 + + + + 16 + 143 + + + + + 1862.0 + + + + 16 + 143 + + + + + 1862.0 + + + + 16 + 142 + + + + + 1862.2 + + + + 16 + 142 + + + + + 1862.4 + + + + 16 + 142 + + + + + 1862.4 + + + + 16 + 142 + + + + + 1862.6 + + + + 16 + 142 + + + + + 1862.8 + + + + 16 + 141 + + + + + 1863.0 + + + + 16 + 141 + + + + + 1863.2 + + + + 16 + 141 + + + + + 1863.4 + + + + 16 + 141 + + + + + 1863.4 + + + + 16 + 141 + + + + + 1863.6 + + + + 16 + 141 + + + + + 1863.8 + + + + 16 + 141 + + + + + 1864.0 + + + + 16 + 141 + + + + + 1864.4 + + + + 16 + 141 + + + + + 1864.4 + + + + 16 + 141 + + + + + 1864.6 + + + + 16 + 141 + + + + + 1864.6 + + + + 16 + 141 + + + + + 1864.6 + + + + 16 + 141 + + + + + 1865.2 + + + + 16 + 142 + + + + + 1865.2 + + + + 16 + 141 + + + + + 1865.4 + + + + 16 + 141 + + + + + 1865.4 + + + + 16 + 141 + + + + + 1865.6 + + + + 16 + 141 + + + + + 1865.8 + + + + 16 + 141 + + + + + 1866.0 + + + + 16 + 141 + + + + + 1866.0 + + + + 16 + 141 + + + + + 1866.2 + + + + 16 + 141 + + + + + 1866.2 + + + + 16 + 141 + + + + + 1866.4 + + + + 16 + 141 + + + + + 1866.4 + + + + 16 + 142 + + + + + 1866.6 + + + + 16 + 142 + + + + + 1866.8 + + + + 16 + 142 + + + + + 1867.0 + + + + 16 + 142 + + + + + 1867.0 + + + + 16 + 141 + + + + + 1867.2 + + + + 16 + 142 + + + + + 1867.4 + + + + 16 + 142 + + + + + 1867.4 + + + + 16 + 142 + + + + + 1867.8 + + + + 16 + 142 + + + + + 1867.8 + + + + 16 + 142 + + + + + 1868.0 + + + + 16 + 142 + + + + + 1868.0 + + + + 16 + 142 + + + + + 1868.0 + + + + 16 + 143 + + + + + 1868.2 + + + + 16 + 143 + + + + + 1868.2 + + + + 16 + 142 + + + + + 1868.4 + + + + 16 + 143 + + + + + 1868.6 + + + + 16 + 143 + + + + + 1868.6 + + + + 16 + 143 + + + + + 1868.8 + + + + 16 + 143 + + + + + 1868.8 + + + + 16 + 143 + + + + + 1868.8 + + + + 16 + 144 + + + + + 1869.0 + + + + 16 + 143 + + + + + 1869.2 + + + + 16 + 144 + + + + + 1869.2 + + + + 16 + 144 + + + + + 1869.4 + + + + 16 + 144 + + + + + 1869.4 + + + + 16 + 144 + + + + + 1869.4 + + + + 16 + 144 + + + + + 1869.6 + + + + 16 + 144 + + + + + 1869.8 + + + + 16 + 145 + + + + + 1869.8 + + + + 16 + 145 + + + + + 1870.0 + + + + 16 + 145 + + + + + 1870.0 + + + + 16 + 145 + + + + + 1870.2 + + + + 16 + 146 + + + + + 1870.4 + + + + 16 + 146 + + + + + 1870.6 + + + + 16 + 146 + + + + + 1870.6 + + + + 16 + 146 + + + + + 1870.8 + + + + 16 + 146 + + + + + 1871.0 + + + + 16 + 146 + + + + + 1871.2 + + + + 16 + 146 + + + + + 1871.2 + + + + 16 + 146 + + + + + 1871.4 + + + + 16 + 146 + + + + + 1871.6 + + + + 16 + 146 + + + + + 1872.0 + + + + 16 + 146 + + + + + 1872.2 + + + + 16 + 146 + + + + + 1872.4 + + + + 16 + 146 + + + + + 1872.6 + + + + 16 + 146 + + + + + 1872.8 + + + + 16 + 146 + + + + + 1872.8 + + + + 16 + 146 + + + + + 1872.8 + + + + 16 + 147 + + + + + 1873.0 + + + + 16 + 146 + + + + + 1873.0 + + + + 16 + 146 + + + + + 1873.0 + + + + 16 + 146 + + + + + 1873.2 + + + + 16 + 146 + + + + + 1873.2 + + + + 16 + 146 + + + + + 1873.4 + + + + 16 + 146 + + + + + 1873.6 + + + + 16 + 145 + + + + + 1873.6 + + + + 16 + 145 + + + + + 1873.8 + + + + 16 + 145 + + + + + 1873.8 + + + + 16 + 145 + + + + + 1873.8 + + + + 16 + 145 + + + + + 1873.8 + + + + 16 + 145 + + + + + 1874.0 + + + + 16 + 145 + + + + + 1874.2 + + + + 16 + 145 + + + + + 1874.2 + + + + 16 + 144 + + + + + 1874.2 + + + + 16 + 145 + + + + + 1874.4 + + + + 16 + 144 + + + + + 1874.6 + + + + 16 + 144 + + + + + 1874.8 + + + + 16 + 144 + + + + + 1875.0 + + + + 16 + 143 + + + + + 1875.2 + + + + 16 + 144 + + + + + 1875.2 + + + + 16 + 142 + + + + + 1875.2 + + + + 16 + 142 + + + + + 1875.2 + + + + 16 + 141 + + + + + 1875.2 + + + + 16 + 141 + + + + + 1875.2 + + + + 16 + 141 + + + + + 1875.2 + + + + 16 + 140 + + + + + 1875.2 + + + + 16 + 139 + + + + + 1875.2 + + + + 16 + 139 + + + + + 1875.2 + + + + 16 + 138 + + + + + 1875.2 + + + + 16 + 137 + + + + + 1875.2 + + + + 16 + 137 + + + + + 1875.2 + + + + 16 + 136 + + + + + 1875.0 + + + + 16 + 135 + + + + + 1875.0 + + + + 16 + 134 + + + + + 1874.4 + + + + 16 + 133 + + + + + 1874.0 + + + + 16 + 133 + + + + + 1873.4 + + + + 16 + 132 + + + + + 1872.8 + + + + 16 + 131 + + + + + 1871.6 + + + + 16 + 129 + + + + + 1870.4 + + + + 16 + 129 + + + + + 1868.2 + + + + 16 + 128 + + + + + 1867.2 + + + + 16 + 127 + + + + + 1866.0 + + + + 16 + 126 + + + + + 1864.8 + + + + 16 + 125 + + + + + 1864.0 + + + + 16 + 124 + + + + + 1863.4 + + + + 16 + 123 + + + + + 1863.2 + + + + 16 + 123 + + + + + 1863.0 + + + + 16 + 122 + + + + + 1863.0 + + + + 16 + 121 + + + + + 1863.0 + + + + 16 + 121 + + + + + 1863.0 + + + + 16 + 121 + + + + + 1863.0 + + + + 16 + 121 + + + + + 1863.0 + + + + 16 + 121 + + + + + 1863.0 + + + + 17 + 121 + + + + + 1863.4 + + + + 17 + 121 + + + + + 1864.0 + + + + 17 + 121 + + + + + 1864.4 + + + + 17 + 121 + + + + + 1865.0 + + + + 17 + 122 + + + + + 1865.4 + + + + 17 + 122 + + + + + 1865.8 + + + + 17 + 123 + + + + + 1866.0 + + + + 17 + 124 + + + + + 1866.2 + + + + 17 + 124 + + + + + 1866.6 + + + + 17 + 124 + + + + + 1866.8 + + + + 17 + 124 + + + + + 1867.0 + + + + 17 + 124 + + + + + 1867.2 + + + + 17 + 124 + + + + + 1867.4 + + + + 17 + 124 + + + + + 1867.6 + + + + 17 + 124 + + + + + 1867.8 + + + + 17 + 124 + + + + + 1868.0 + + + + 17 + 124 + + + + + 1868.2 + + + + 17 + 125 + + + + + 1868.2 + + + + 17 + 125 + + + + + 1868.4 + + + + 17 + 126 + + + + + 1868.8 + + + + 17 + 126 + + + + + 1869.0 + + + + 17 + 127 + + + + + 1869.0 + + + + 17 + 128 + + + + + 1869.2 + + + + 17 + 128 + + + + + 1869.4 + + + + 17 + 128 + + + + + 1869.6 + + + + 17 + 129 + + + + + 1869.8 + + + + 17 + 130 + + + + + 1870.0 + + + + 17 + 131 + + + + + 1870.2 + + + + 17 + 131 + + + + + 1870.2 + + + + 17 + 132 + + + + + 1870.4 + + + + 17 + 133 + + + + + 1870.6 + + + + 17 + 134 + + + + + 1870.8 + + + + 17 + 134 + + + + + 1870.8 + + + + 17 + 135 + + + + + 1871.0 + + + + 17 + 135 + + + + + 1871.0 + + + + 17 + 136 + + + + + 1871.2 + + + + 17 + 136 + + + + + 1871.2 + + + + 17 + 136 + + + + + 1871.4 + + + + 17 + 137 + + + + + 1871.6 + + + + 17 + 137 + + + + + 1871.8 + + + + 17 + 137 + + + + + 1872.0 + + + + 17 + 138 + + + + + 1872.0 + + + + 17 + 138 + + + + + 1872.2 + + + + 17 + 138 + + + + + 1872.4 + + + + 17 + 138 + + + + + 1872.4 + + + + 17 + 138 + + + + + 1872.6 + + + + 17 + 138 + + + + + 1872.8 + + + + 17 + 139 + + + + + 1873.0 + + + + 17 + 139 + + + + + 1873.2 + + + + 17 + 139 + + + + + 1873.4 + + + + 17 + 139 + + + + + 1873.6 + + + + 17 + 139 + + + + + 1873.6 + + + + 17 + 139 + + + + + 1873.8 + + + + 17 + 140 + + + + + 1874.0 + + + + 17 + 140 + + + + + 1874.2 + + + + 17 + 140 + + + + + 1874.2 + + + + 17 + 140 + + + + + 1874.4 + + + + 17 + 140 + + + + + 1874.4 + + + + 17 + 141 + + + + + 1874.4 + + + + 17 + 140 + + + + + 1874.6 + + + + 17 + 141 + + + + + 1874.8 + + + + 17 + 141 + + + + + 1875.0 + + + + 17 + 141 + + + + + 1875.0 + + + + 17 + 140 + + + + + 1875.2 + + + + 17 + 141 + + + + + 1875.2 + + + + 17 + 140 + + + + + 1875.4 + + + + 17 + 141 + + + + + 1875.6 + + + + 17 + 140 + + + + + 1875.8 + + + + 17 + 140 + + + + + 1875.8 + + + + 17 + 140 + + + + + 1876.0 + + + + 17 + 139 + + + + + 1876.2 + + + + 17 + 139 + + + + + 1876.2 + + + + 17 + 139 + + + + + 1876.4 + + + + 17 + 139 + + + + + 1876.6 + + + + 17 + 139 + + + + + 1876.6 + + + + 17 + 139 + + + + + 1876.8 + + + + 17 + 139 + + + + + 1877.0 + + + + 17 + 139 + + + + + 1877.0 + + + + 17 + 139 + + + + + 1877.2 + + + + 17 + 139 + + + + + 1877.2 + + + + 17 + 139 + + + + + 1877.4 + + + + 17 + 139 + + + + + 1877.6 + + + + 17 + 139 + + + + + 1877.8 + + + + 17 + 139 + + + + + 1878.0 + + + + 17 + 139 + + + + + 1878.2 + + + + 17 + 139 + + + + + 1878.4 + + + + 17 + 139 + + + + + 1878.6 + + + + 17 + 139 + + + + + 1878.8 + + + + 17 + 139 + + + + + 1878.8 + + + + 17 + 139 + + + + + 1879.0 + + + + 17 + 140 + + + + + 1879.2 + + + + 17 + 140 + + + + + 1879.4 + + + + 17 + 140 + + + + + 1879.4 + + + + 17 + 140 + + + + + 1879.6 + + + + 17 + 140 + + + + + 1879.8 + + + + 17 + 141 + + + + + 1879.8 + + + + 17 + 140 + + + + + 1879.8 + + + + 17 + 141 + + + + + 1880.0 + + + + 17 + 141 + + + + + 1880.0 + + + + 17 + 141 + + + + + 1880.2 + + + + 17 + 141 + + + + + 1880.4 + + + + 17 + 142 + + + + + 1880.6 + + + + 17 + 142 + + + + + 1880.8 + + + + 17 + 142 + + + + + 1880.8 + + + + 17 + 143 + + + + + 1881.0 + + + + 17 + 143 + + + + + 1880.8 + + + + 17 + 143 + + + + + 1881.0 + + + + 17 + 143 + + + + + 1881.2 + + + + 17 + 143 + + + + + 1881.2 + + + + 17 + 144 + + + + + 1881.4 + + + + 17 + 144 + + + + + 1881.6 + + + + 17 + 144 + + + + + 1881.8 + + + + 17 + 144 + + + + + 1881.8 + + + + 17 + 144 + + + + + 1882.0 + + + + 17 + 144 + + + + + 1882.2 + + + + 17 + 145 + + + + + 1882.4 + + + + 17 + 144 + + + + + 1882.4 + + + + 17 + 144 + + + + + 1882.6 + + + + 17 + 144 + + + + + 1882.8 + + + + 17 + 144 + + + + + 1883.0 + + + + 17 + 144 + + + + + 1883.2 + + + + 17 + 144 + + + + + 1883.4 + + + + 17 + 143 + + + + + 1883.4 + + + + 17 + 144 + + + + + 1883.6 + + + + 17 + 143 + + + + + 1883.8 + + + + 17 + 143 + + + + + 1884.0 + + + + 17 + 143 + + + + + 1884.4 + + + + 17 + 143 + + + + + 1884.4 + + + + 17 + 143 + + + + + 1884.6 + + + + 18 + 143 + + + + + 1884.8 + + + + 18 + 143 + + + + + 1884.8 + + + + 18 + 143 + + + + + 1885.0 + + + + 18 + 142 + + + + + 1885.0 + + + + 18 + 143 + + + + + 1885.2 + + + + 18 + 143 + + + + + 1885.2 + + + + 18 + 143 + + + + + 1885.2 + + + + 18 + 143 + + + + + 1885.4 + + + + 18 + 142 + + + + + 1885.6 + + + + 18 + 143 + + + + + 1885.6 + + + + 18 + 143 + + + + + 1885.8 + + + + 18 + 143 + + + + + 1886.0 + + + + 18 + 143 + + + + + 1886.2 + + + + 18 + 143 + + + + + 1886.2 + + + + 18 + 142 + + + + + 1886.4 + + + + 18 + 143 + + + + + 1886.6 + + + + 18 + 143 + + + + + 1886.8 + + + + 18 + 143 + + + + + 1887.0 + + + + 18 + 143 + + + + + 1887.2 + + + + 18 + 143 + + + + + 1887.4 + + + + 18 + 143 + + + + + 1887.6 + + + + 18 + 144 + + + + + 1887.8 + + + + 18 + 144 + + + + + 1887.8 + + + + 18 + 145 + + + + + 1888.0 + + + + 18 + 145 + + + + + 1888.2 + + + + 18 + 145 + + + + + 1888.2 + + + + 18 + 145 + + + + + 1888.4 + + + + 18 + 145 + + + + + 1888.6 + + + + 18 + 146 + + + + + 1888.8 + + + + 18 + 145 + + + + + 1889.0 + + + + 18 + 146 + + + + + 1889.0 + + + + 18 + 145 + + + + + 1889.2 + + + + 18 + 146 + + + + + 1889.4 + + + + 18 + 146 + + + + + 1889.4 + + + + 18 + 146 + + + + + 1889.6 + + + + 18 + 146 + + + + + 1889.6 + + + + 18 + 146 + + + + + 1889.8 + + + + 18 + 146 + + + + + 1890.0 + + + + 18 + 146 + + + + + 1890.4 + + + + 18 + 147 + + + + + 1890.8 + + + + 18 + 146 + + + + + 1891.2 + + + + 18 + 147 + + + + + 1891.4 + + + + 18 + 147 + + + + + 1891.6 + + + + 18 + 148 + + + + + 1891.8 + + + + 18 + 147 + + + + + 1892.0 + + + + 18 + 148 + + + + + 1892.0 + + + + 18 + 148 + + + + + 1892.2 + + + + 18 + 148 + + + + + 1892.2 + + + + 18 + 148 + + + + + 1892.4 + + + + 18 + 148 + + + + + 1892.6 + + + + 18 + 147 + + + + + 1892.6 + + + + 18 + 148 + + + + + 1892.8 + + + + 18 + 147 + + + + + 1892.8 + + + + 18 + 148 + + + + + 1893.0 + + + + 18 + 147 + + + + + 1893.2 + + + + 18 + 147 + + + + + 1893.4 + + + + 18 + 147 + + + + + 1893.6 + + + + 18 + 148 + + + + + 1894.0 + + + + 18 + 147 + + + + + 1894.2 + + + + 18 + 148 + + + + + 1894.2 + + + + 18 + 147 + + + + + 1894.4 + + + + 18 + 148 + + + + + 1894.6 + + + + 18 + 148 + + + + + 1894.8 + + + + 18 + 147 + + + + + 1894.8 + + + + 18 + 147 + + + + + 1894.8 + + + + 18 + 147 + + + + + 1895.2 + + + + 18 + 147 + + + + + 1895.2 + + + + 18 + 147 + + + + + 1895.2 + + + + 18 + 146 + + + + + 1895.4 + + + + 18 + 146 + + + + + 1895.4 + + + + 18 + 146 + + + + + 1895.6 + + + + 18 + 146 + + + + + 1895.6 + + + + 18 + 146 + + + + + 1895.6 + + + + 18 + 146 + + + + + 1895.8 + + + + 18 + 145 + + + + + 1896.0 + + + + 18 + 146 + + + + + 1896.0 + + + + 18 + 145 + + + + + 1896.2 + + + + 18 + 145 + + + + + 1896.4 + + + + 18 + 145 + + + + + 1896.6 + + + + 18 + 146 + + + + + 1896.8 + + + + 18 + 145 + + + + + 1896.8 + + + + 18 + 145 + + + + + 1897.0 + + + + 18 + 145 + + + + + 1897.2 + + + + 18 + 145 + + + + + 1897.4 + + + + 18 + 145 + + + + + 1897.6 + + + + 18 + 145 + + + + + 1897.8 + + + + 18 + 145 + + + + + 1897.8 + + + + 18 + 145 + + + + + 1898.0 + + + + 18 + 145 + + + + + 1898.2 + + + + 18 + 145 + + + + + 1898.2 + + + + 18 + 145 + + + + + 1898.4 + + + + 18 + 145 + + + + + 1898.8 + + + + 18 + 145 + + + + + 1899.0 + + + + 18 + 146 + + + + + 1899.0 + + + + 18 + 146 + + + + + 1899.2 + + + + 18 + 146 + + + + + 1899.4 + + + + 18 + 146 + + + + + 1899.4 + + + + 18 + 146 + + + + + 1899.6 + + + + 18 + 146 + + + + + 1899.8 + + + + 18 + 146 + + + + + 1899.8 + + + + 18 + 147 + + + + + 1900.0 + + + + 18 + 146 + + + + + 1900.0 + + + + 18 + 146 + + + + + 1900.2 + + + + 18 + 146 + + + + + 1900.4 + + + + 18 + 145 + + + + + 1900.4 + + + + 18 + 145 + + + + + 1900.6 + + + + 18 + 145 + + + + + 1900.8 + + + + 18 + 145 + + + + + 1900.8 + + + + 18 + 145 + + + + + 1901.0 + + + + 18 + 145 + + + + + 1901.0 + + + + 18 + 145 + + + + + 1901.2 + + + + 18 + 146 + + + + + 1901.2 + + + + 18 + 146 + + + + + 1901.2 + + + + 18 + 146 + + + + + 1901.4 + + + + 18 + 146 + + + + + 1901.4 + + + + 18 + 147 + + + + + 1901.6 + + + + 18 + 147 + + + + + 1901.6 + + + + 18 + 147 + + + + + 1901.8 + + + + 18 + 147 + + + + + 1902.0 + + + + 18 + 146 + + + + + 1902.0 + + + + 18 + 146 + + + + + 1902.2 + + + + 18 + 146 + + + + + 1902.2 + + + + 18 + 147 + + + + + 1902.4 + + + + 18 + 146 + + + + + 1902.6 + + + + 18 + 146 + + + + + 1902.8 + + + + 18 + 147 + + + + + 1903.0 + + + + 18 + 146 + + + + + 1903.2 + + + + 18 + 146 + + + + + 1903.2 + + + + 18 + 146 + + + + + 1903.4 + + + + 18 + 146 + + + + + 1903.6 + + + + 18 + 146 + + + + + 1903.6 + + + + 18 + 146 + + + + + 1903.8 + + + + 18 + 146 + + + + + 1904.0 + + + + 18 + 146 + + + + + 1904.0 + + + + 18 + 146 + + + + + 1904.2 + + + + 18 + 146 + + + + + 1904.4 + + + + 18 + 145 + + + + + 1904.6 + + + + 18 + 146 + + + + + 1904.8 + + + + 18 + 146 + + + + + 1905.0 + + + + 18 + 146 + + + + + 1905.0 + + + + 18 + 147 + + + + + 1905.4 + + + + 18 + 146 + + + + + 1905.4 + + + + 18 + 146 + + + + + 1905.6 + + + + 18 + 146 + + + + + 1905.8 + + + + 18 + 146 + + + + + 1906.0 + + + + 18 + 146 + + + + + 1906.0 + + + + 18 + 145 + + + + + 1906.2 + + + + 18 + 145 + + + + + 1906.4 + + + + 18 + 145 + + + + + 1906.4 + + + + 18 + 145 + + + + + 1906.6 + + + + 18 + 145 + + + + + 1906.8 + + + + 18 + 145 + + + + + 1907.0 + + + + 18 + 145 + + + + + 1907.0 + + + + 18 + 145 + + + + + 1907.2 + + + + 18 + 144 + + + + + 1907.2 + + + + 18 + 144 + + + + + 1907.4 + + + + 18 + 144 + + + + + 1907.6 + + + + 18 + 143 + + + + + 1907.8 + + + + 18 + 144 + + + + + 1908.2 + + + + 18 + 143 + + + + + 1908.2 + + + + 18 + 143 + + + + + 1908.4 + + + + 18 + 143 + + + + + 1908.4 + + + + 18 + 143 + + + + + 1908.6 + + + + 18 + 142 + + + + + 1908.6 + + + + 18 + 143 + + + + + 1908.8 + + + + 18 + 142 + + + + + 1908.8 + + + + 19 + 142 + + + + + 1908.8 + + + + 19 + 142 + + + + + 1909.0 + + + + 19 + 142 + + + + + 1909.2 + + + + 19 + 142 + + + + + 1909.4 + + + + 19 + 142 + + + + + 1909.4 + + + + 19 + 142 + + + + + 1909.4 + + + + 19 + 142 + + + + + 1909.6 + + + + 19 + 143 + + + + + 1909.8 + + + + 19 + 142 + + + + + 1909.8 + + + + 19 + 142 + + + + + 1909.8 + + + + 19 + 142 + + + + + 1910.0 + + + + 19 + 142 + + + + + 1910.2 + + + + 19 + 142 + + + + + 1910.4 + + + + 19 + 142 + + + + + 1910.4 + + + + 19 + 142 + + + + + 1910.6 + + + + 19 + 142 + + + + + 1910.6 + + + + 19 + 141 + + + + + 1910.6 + + + + 19 + 141 + + + + + 1910.8 + + + + 19 + 141 + + + + + 1911.0 + + + + 19 + 141 + + + + + 1911.2 + + + + 19 + 141 + + + + + 1911.4 + + + + 19 + 141 + + + + + 1911.6 + + + + 19 + 141 + + + + + 1911.8 + + + + 19 + 140 + + + + + 1912.0 + + + + 19 + 140 + + + + + 1912.2 + + + + 19 + 140 + + + + + 1912.6 + + + + 19 + 140 + + + + + 1912.6 + + + + 19 + 141 + + + + + 1912.8 + + + + 19 + 141 + + + + + 1913.0 + + + + 19 + 140 + + + + + 1913.0 + + + + 19 + 141 + + + + + 1913.2 + + + + 19 + 140 + + + + + 1913.2 + + + + 19 + 141 + + + + + 1913.4 + + + + 19 + 141 + + + + + 1913.4 + + + + 19 + 141 + + + + + 1913.6 + + + + 19 + 142 + + + + + 1913.6 + + + + 19 + 142 + + + + + 1913.8 + + + + 19 + 142 + + + + + 1914.0 + + + + 19 + 142 + + + + + 1914.0 + + + + 19 + 142 + + + + + 1914.2 + + + + 19 + 143 + + + + + 1914.4 + + + + 19 + 143 + + + + + 1914.6 + + + + 19 + 142 + + + + + 1914.6 + + + + 19 + 143 + + + + + 1914.8 + + + + 19 + 142 + + + + + 1914.8 + + + + 19 + 142 + + + + + 1915.0 + + + + 19 + 142 + + + + + 1915.0 + + + + 19 + 142 + + + + + 1915.2 + + + + 19 + 141 + + + + + 1915.4 + + + + 19 + 141 + + + + + 1915.6 + + + + 19 + 141 + + + + + 1915.6 + + + + 19 + 141 + + + + + 1915.8 + + + + 19 + 140 + + + + + 1916.0 + + + + 19 + 140 + + + + + 1916.0 + + + + 19 + 141 + + + + + 1916.2 + + + + 19 + 141 + + + + + 1916.2 + + + + 19 + 141 + + + + + 1916.6 + + + + 19 + 141 + + + + + 1916.6 + + + + 19 + 141 + + + + + 1916.8 + + + + 19 + 141 + + + + + 1917.2 + + + + 19 + 141 + + + + + 1917.4 + + + + 19 + 141 + + + + + 1917.6 + + + + 19 + 141 + + + + + 1917.8 + + + + 19 + 141 + + + + + 1918.0 + + + + 19 + 141 + + + + + 1918.0 + + + + 19 + 142 + + + + + 1918.2 + + + + 19 + 142 + + + + + 1918.2 + + + + 19 + 141 + + + + + 1918.4 + + + + 19 + 141 + + + + + 1918.4 + + + + 19 + 141 + + + + + 1918.6 + + + + 19 + 141 + + + + + 1918.6 + + + + 19 + 142 + + + + + 1918.8 + + + + 19 + 142 + + + + + 1918.8 + + + + 19 + 141 + + + + + 1918.8 + + + + 19 + 142 + + + + + 1919.0 + + + + 19 + 142 + + + + + 1919.0 + + + + 19 + 141 + + + + + 1919.2 + + + + 19 + 142 + + + + + 1919.4 + + + + 19 + 142 + + + + + 1919.2 + + + + 19 + 141 + + + + + 1919.4 + + + + 19 + 142 + + + + + 1919.6 + + + + 19 + 142 + + + + + 1919.8 + + + + 19 + 142 + + + + + 1920.0 + + + + 19 + 142 + + + + + 1920.2 + + + + 19 + 142 + + + + + 1920.4 + + + + 19 + 142 + + + + + 1920.4 + + + + 19 + 142 + + + + + 1920.6 + + + + 19 + 142 + + + + + 1920.6 + + + + 19 + 142 + + + + + 1920.8 + + + + 19 + 143 + + + + + 1921.0 + + + + 19 + 143 + + + + + 1921.0 + + + + 19 + 142 + + + + + 1921.2 + + + + 19 + 143 + + + + + 1921.4 + + + + 19 + 142 + + + + + 1921.6 + + + + 19 + 143 + + + + + 1921.8 + + + + 19 + 142 + + + + + 1922.0 + + + + 19 + 143 + + + + + 1922.2 + + + + 19 + 143 + + + + + 1922.4 + + + + 19 + 143 + + + + + 1922.6 + + + + 19 + 143 + + + + + 1922.6 + + + + 19 + 143 + + + + + 1922.8 + + + + 19 + 143 + + + + + 1923.0 + + + + 19 + 143 + + + + + 1923.2 + + + + 19 + 143 + + + + + 1923.2 + + + + 19 + 143 + + + + + 1923.4 + + + + 19 + 143 + + + + + 1923.4 + + + + 19 + 143 + + + + + 1923.6 + + + + 19 + 144 + + + + + 1923.8 + + + + 19 + 143 + + + + + 1924.0 + + + + 19 + 144 + + + + + 1924.2 + + + + 19 + 143 + + + + + 1924.2 + + + + 19 + 143 + + + + + 1924.4 + + + + 19 + 143 + + + + + 1924.6 + + + + 19 + 143 + + + + + 1924.8 + + + + 19 + 143 + + + + + 1925.0 + + + + 19 + 143 + + + + + 1925.0 + + + + 19 + 143 + + + + + 1925.2 + + + + 19 + 143 + + + + + 1925.2 + + + + 19 + 143 + + + + + 1925.4 + + + + 19 + 143 + + + + + 1925.6 + + + + 19 + 143 + + + + + 1925.8 + + + + 19 + 142 + + + + + 1925.8 + + + + 19 + 142 + + + + + 1926.0 + + + + 19 + 142 + + + + + 1926.0 + + + + 19 + 142 + + + + + 1926.2 + + + + 19 + 143 + + + + + 1926.4 + + + + 19 + 142 + + + + + 1926.4 + + + + 19 + 142 + + + + + 1926.6 + + + + 19 + 142 + + + + + 1926.8 + + + + 19 + 142 + + + + + 1927.0 + + + + 19 + 141 + + + + + 1927.0 + + + + 19 + 141 + + + + + 1927.2 + + + + 19 + 141 + + + + + 1927.4 + + + + 19 + 140 + + + + + 1927.6 + + + + 19 + 140 + + + + + 1927.8 + + + + 19 + 140 + + + + + 1928.0 + + + + 19 + 140 + + + + + 1928.2 + + + + 19 + 140 + + + + + 1928.4 + + + + 19 + 140 + + + + + 1928.4 + + + + 19 + 140 + + + + + 1928.6 + + + + 19 + 140 + + + + + 1928.6 + + + + 19 + 139 + + + + + 1928.8 + + + + 19 + 140 + + + + + 1928.8 + + + + 19 + 140 + + + + + 1929.0 + + + + 19 + 141 + + + + + 1929.0 + + + + 19 + 140 + + + + + 1929.0 + + + + 19 + 140 + + + + + 1929.2 + + + + 19 + 141 + + + + + 1929.4 + + + + 19 + 141 + + + + + 1929.4 + + + + 19 + 141 + + + + + 1929.6 + + + + 19 + 141 + + + + + 1929.8 + + + + 19 + 141 + + + + + 1929.8 + + + + 19 + 142 + + + + + 1930.0 + + + + 19 + 142 + + + + + 1930.0 + + + + 19 + 142 + + + + + 1930.0 + + + + 19 + 142 + + + + + 1930.2 + + + + 19 + 143 + + + + + 1930.2 + + + + 19 + 143 + + + + + 1930.2 + + + + 19 + 143 + + + + + 1930.4 + + + + 19 + 143 + + + + + 1930.4 + + + + 19 + 143 + + + + + 1930.6 + + + + 19 + 143 + + + + + 1930.8 + + + + 19 + 143 + + + + + 1931.2 + + + + 19 + 143 + + + + + 1931.2 + + + + 19 + 144 + + + + + 1931.4 + + + + 19 + 144 + + + + + 1931.6 + + + + 19 + 144 + + + + + 1931.6 + + + + 20 + 144 + + + + + 1931.8 + + + + 20 + 144 + + + + + 1932.0 + + + + 20 + 144 + + + + + 1932.2 + + + + 20 + 144 + + + + + 1932.4 + + + + 20 + 144 + + + + + 1932.6 + + + + 20 + 144 + + + + + 1933.0 + + + + 20 + 144 + + + + + 1933.2 + + + + 20 + 144 + + + + + 1933.4 + + + + 20 + 144 + + + + + 1933.6 + + + + 20 + 144 + + + + + 1933.8 + + + + 20 + 144 + + + + + 1934.0 + + + + 20 + 145 + + + + + 1934.2 + + + + 20 + 144 + + + + + 1934.4 + + + + 20 + 144 + + + + + 1934.4 + + + + 20 + 144 + + + + + 1934.6 + + + + 20 + 144 + + + + + 1934.8 + + + + 20 + 144 + + + + + 1934.8 + + + + 20 + 144 + + + + + 1935.0 + + + + 20 + 144 + + + + + 1935.2 + + + + 20 + 144 + + + + + 1935.2 + + + + 20 + 144 + + + + + 1935.4 + + + + 20 + 144 + + + + + 1935.6 + + + + 20 + 144 + + + + + 1935.6 + + + + 20 + 144 + + + + + 1935.8 + + + + 20 + 144 + + + + + 1936.0 + + + + 20 + 144 + + + + + 1936.2 + + + + 20 + 144 + + + + + 1936.2 + + + + 20 + 144 + + + + + 1936.2 + + + + 20 + 144 + + + + + 1936.4 + + + + 20 + 144 + + + + + 1936.6 + + + + 20 + 144 + + + + + 1936.8 + + + + 20 + 144 + + + + + 1936.8 + + + + 20 + 144 + + + + + 1937.0 + + + + 20 + 144 + + + + + 1937.2 + + + + 20 + 144 + + + + + 1937.4 + + + + 20 + 143 + + + + + 1937.4 + + + + 20 + 143 + + + + + 1937.6 + + + + 20 + 143 + + + + + 1937.8 + + + + 20 + 143 + + + + + 1938.0 + + + + 20 + 142 + + + + + 1938.2 + + + + 20 + 143 + + + + + 1938.4 + + + + 20 + 143 + + + + + 1938.6 + + + + 20 + 143 + + + + + 1938.8 + + + + 20 + 143 + + + + + 1938.8 + + + + 20 + 143 + + + + + 1939.0 + + + + 20 + 143 + + + + + 1939.0 + + + + 20 + 144 + + + + + 1939.2 + + + + 20 + 144 + + + + + 1939.2 + + + + 20 + 144 + + + + + 1939.4 + + + + 20 + 144 + + + + + 1939.4 + + + + 20 + 144 + + + + + 1939.6 + + + + 20 + 145 + + + + + 1939.8 + + + + 20 + 145 + + + + + 1939.8 + + + + 20 + 145 + + + + + 1940.0 + + + + 20 + 146 + + + + + 1940.2 + + + + 20 + 146 + + + + + 1940.4 + + + + 20 + 147 + + + + + 1940.6 + + + + 20 + 147 + + + + + 1940.8 + + + + 20 + 147 + + + + + 1940.8 + + + + 20 + 148 + + + + + 1941.0 + + + + 20 + 148 + + + + + 1941.0 + + + + 20 + 148 + + + + + 1941.2 + + + + 20 + 148 + + + + + 1941.4 + + + + 20 + 148 + + + + + 1941.6 + + + + 20 + 148 + + + + + 1941.8 + + + + 20 + 149 + + + + + 1942.0 + + + + 20 + 149 + + + + + 1942.0 + + + + 20 + 148 + + + + + 1942.2 + + + + 20 + 149 + + + + + 1942.4 + + + + 20 + 149 + + + + + 1942.6 + + + + 20 + 149 + + + + + 1942.8 + + + + 20 + 149 + + + + + 1942.8 + + + + 20 + 149 + + + + + 1943.0 + + + + 20 + 149 + + + + + 1943.0 + + + + 20 + 149 + + + + + 1943.2 + + + + 20 + 148 + + + + + 1943.2 + + + + 20 + 149 + + + + + 1943.4 + + + + 20 + 149 + + + + + 1943.4 + + + + 20 + 149 + + + + + 1943.6 + + + + 20 + 149 + + + + + 1943.8 + + + + 20 + 149 + + + + + 1944.0 + + + + 20 + 149 + + + + + 1944.2 + + + + 20 + 149 + + + + + 1944.4 + + + + 20 + 149 + + + + + 1944.4 + + + + 20 + 149 + + + + + 1944.6 + + + + 20 + 149 + + + + + 1944.8 + + + + 20 + 149 + + + + + 1944.8 + + + + 20 + 148 + + + + + 1945.0 + + + + 20 + 148 + + + + + 1945.2 + + + + 20 + 148 + + + + + 1945.4 + + + + 20 + 148 + + + + + 1945.4 + + + + 20 + 147 + + + + + 1945.6 + + + + 20 + 147 + + + + + 1945.8 + + + + 20 + 147 + + + + + 1946.0 + + + + 20 + 147 + + + + + 1946.0 + + + + 20 + 146 + + + + + 1946.4 + + + + 20 + 147 + + + + + 1946.4 + + + + 20 + 147 + + + + + 1946.6 + + + + 20 + 147 + + + + + 1946.8 + + + + 20 + 147 + + + + + 1947.0 + + + + 20 + 147 + + + + + 1947.2 + + + + 20 + 147 + + + + + 1947.2 + + + + 20 + 148 + + + + + 1947.4 + + + + 20 + 148 + + + + + 1947.6 + + + + 20 + 148 + + + + + 1947.8 + + + + 20 + 149 + + + + + 1947.8 + + + + 20 + 149 + + + + + 1948.0 + + + + 20 + 149 + + + + + 1948.2 + + + + 20 + 150 + + + + + 1948.2 + + + + 20 + 150 + + + + + 1948.4 + + + + 20 + 150 + + + + + 1948.6 + + + + 21 + 149 + + + + + 1948.8 + + + + 21 + 150 + + + + + 1949.0 + + + + 21 + 150 + + + + + 1949.2 + + + + 21 + 149 + + + + + 1949.2 + + + + 21 + 150 + + + + + 1949.2 + + + + 21 + 149 + + + + + 1949.4 + + + + 21 + 149 + + + + + 1949.4 + + + + 21 + 148 + + + + + 1949.4 + + + + 21 + 148 + + + + + 1949.6 + + + + 21 + 148 + + + + + 1949.6 + + + + 21 + 148 + + + + + 1949.8 + + + + 21 + 148 + + + + + 1949.8 + + + + 21 + 148 + + + + + 1950.0 + + + + 21 + 147 + + + + + 1950.0 + + + + 21 + 147 + + + + + 1950.0 + + + + 21 + 147 + + + + + 1950.4 + + + + 21 + 147 + + + + + 1950.6 + + + + 21 + 147 + + + + + 1950.8 + + + + 21 + 147 + + + + + 1951.2 + + + + 21 + 147 + + + + + 1951.4 + + + + 21 + 146 + + + + + 1951.4 + + + + 21 + 146 + + + + + 1951.6 + + + + 21 + 146 + + + + + 1951.8 + + + + 21 + 146 + + + + + 1952.0 + + + + 21 + 146 + + + + + 1952.2 + + + + 21 + 146 + + + + + 1952.2 + + + + 21 + 145 + + + + + 1952.6 + + + + 21 + 146 + + + + + 1952.8 + + + + 21 + 145 + + + + + 1953.0 + + + + 21 + 145 + + + + + 1953.0 + + + + 21 + 146 + + + + + 1953.2 + + + + 21 + 145 + + + + + 1953.4 + + + + 21 + 145 + + + + + 1953.4 + + + + 21 + 146 + + + + + 1953.6 + + + + 21 + 145 + + + + + 1953.6 + + + + 21 + 145 + + + + + 1953.8 + + + + 21 + 146 + + + + + 1954.0 + + + + 21 + 145 + + + + + 1954.2 + + + + 21 + 146 + + + + + 1954.2 + + + + 21 + 145 + + + + + 1954.4 + + + + 21 + 145 + + + + + 1954.6 + + + + 21 + 146 + + + + + 1954.8 + + + + 21 + 145 + + + + + 1955.0 + + + + 21 + 145 + + + + + 1955.0 + + + + 21 + 146 + + + + + 1955.2 + + + + 21 + 145 + + + + + 1955.4 + + + + 21 + 146 + + + + + 1955.6 + + + + 21 + 145 + + + + + 1955.8 + + + + 21 + 145 + + + + + 1955.8 + + + + 21 + 145 + + + + + 1955.8 + + + + 21 + 144 + + + + + 1956.0 + + + + 21 + 144 + + + + + 1956.4 + + + + 21 + 144 + + + + + 1956.4 + + + + 21 + 144 + + + + + 1956.6 + + + + 21 + 143 + + + + + 1956.8 + + + + 21 + 143 + + + + + 1957.0 + + + + 21 + 143 + + + + + 1957.0 + + + + 21 + 144 + + + + + 1957.2 + + + + 21 + 144 + + + + + 1957.2 + + + + 21 + 144 + + + + + 1957.4 + + + + 21 + 144 + + + + + 1957.6 + + + + 21 + 144 + + + + + 1957.6 + + + + 21 + 144 + + + + + 1957.8 + + + + 21 + 144 + + + + + 1958.0 + + + + 21 + 143 + + + + + 1958.0 + + + + 21 + 144 + + + + + 1958.2 + + + + 21 + 143 + + + + + 1958.2 + + + + 21 + 143 + + + + + 1958.4 + + + + 21 + 143 + + + + + 1958.6 + + + + 21 + 143 + + + + + 1958.6 + + + + 21 + 143 + + + + + 1958.8 + + + + 21 + 143 + + + + + 1958.8 + + + + 21 + 143 + + + + + 1959.0 + + + + 21 + 143 + + + + + 1959.0 + + + + 21 + 143 + + + + + 1959.2 + + + + 21 + 143 + + + + + 1959.4 + + + + 21 + 143 + + + + + 1959.6 + + + + 21 + 142 + + + + + 1959.8 + + + + 21 + 143 + + + + + 1960.0 + + + + 21 + 143 + + + + + 1960.2 + + + + 21 + 142 + + + + + 1960.4 + + + + 21 + 143 + + + + + 1960.4 + + + + 21 + 143 + + + + + 1960.6 + + + + 21 + 143 + + + + + 1960.6 + + + + 21 + 143 + + + + + 1960.8 + + + + 21 + 143 + + + + + 1961.0 + + + + 21 + 143 + + + + + 1961.2 + + + + 21 + 143 + + + + + 1961.2 + + + + 21 + 144 + + + + + 1961.4 + + + + 21 + 144 + + + + + 1961.4 + + + + 21 + 144 + + + + + 1961.4 + + + + 21 + 145 + + + + + 1961.4 + + + + 21 + 145 + + + + + 1961.4 + + + + 21 + 145 + + + + + 1961.6 + + + + 21 + 146 + + + + + 1962.0 + + + + 21 + 146 + + + + + 1962.0 + + + + 21 + 146 + + + + + 1962.2 + + + + 21 + 146 + + + + + 1962.4 + + + + 21 + 147 + + + + + 1962.6 + + + + 21 + 147 + + + + + 1963.0 + + + + 21 + 147 + + + + + 1963.2 + + + + 21 + 147 + + + + + 1963.4 + + + + 21 + 147 + + + + + 1963.4 + + + + 21 + 147 + + + + + 1963.6 + + + + 21 + 147 + + + + + 1963.6 + + + + 21 + 147 + + + + + 1963.8 + + + + 21 + 148 + + + + + 1964.0 + + + + 21 + 147 + + + + + 1964.2 + + + + 21 + 148 + + + + + 1964.4 + + + + 21 + 148 + + + + + 1964.6 + + + + 21 + 148 + + + + + 1964.8 + + + + 21 + 148 + + + + + 1965.0 + + + + 21 + 148 + + + + + 1965.2 + + + + 21 + 148 + + + + + 1965.4 + + + + 21 + 148 + + + + + 1965.6 + + + + 21 + 147 + + + + + 1965.6 + + + + 21 + 147 + + + + + 1965.8 + + + + 21 + 147 + + + + + 1966.0 + + + + 21 + 147 + + + + + 1966.4 + + + + 21 + 146 + + + + + 1966.4 + + + + 21 + 147 + + + + + 1966.6 + + + + 21 + 146 + + + + + 1966.8 + + + + 21 + 147 + + + + + 1966.8 + + + + 21 + 147 + + + + + 1967.0 + + + + 21 + 147 + + + + + 1967.0 + + + + 21 + 147 + + + + + 1967.2 + + + + 21 + 147 + + + + + 1967.6 + + + + 21 + 147 + + + + + 1967.8 + + + + 21 + 148 + + + + + 1967.8 + + + + 21 + 148 + + + + + 1968.0 + + + + 21 + 148 + + + + + 1968.2 + + + + 21 + 148 + + + + + 1968.4 + + + + 21 + 148 + + + + + 1968.4 + + + + 21 + 148 + + + + + 1968.6 + + + + 21 + 149 + + + + + 1968.6 + + + + 21 + 149 + + + + + 1968.8 + + + + 21 + 149 + + + + + 1969.0 + + + + 21 + 149 + + + + + 1969.2 + + + + 21 + 149 + + + + + 1969.4 + + + + 21 + 150 + + + + + 1969.6 + + + + 21 + 150 + + + + + 1969.8 + + + + 21 + 150 + + + + + 1969.8 + + + + 21 + 150 + + + + + 1970.0 + + + + 21 + 151 + + + + + 1970.2 + + + + 21 + 150 + + + + + 1970.2 + + + + 21 + 151 + + + + + 1970.4 + + + + 21 + 150 + + + + + 1970.6 + + + + 21 + 150 + + + + + 1970.8 + + + + 21 + 150 + + + + + 1971.0 + + + + 21 + 150 + + + + + 1971.0 + + + + 21 + 150 + + + + + 1971.2 + + + + 21 + 150 + + + + + 1971.4 + + + + 21 + 150 + + + + + 1971.4 + + + + 21 + 150 + + + + + 1971.6 + + + + 21 + 150 + + + + + 1971.8 + + + + 21 + 149 + + + + + 1972.0 + + + + 21 + 149 + + + + + 1972.0 + + + + 21 + 149 + + + + + 1972.2 + + + + 21 + 149 + + + + + 1972.4 + + + + 21 + 149 + + + + + 1972.4 + + + + 21 + 150 + + + + + 1972.6 + + + + 21 + 149 + + + + + 1972.8 + + + + 21 + 149 + + + + + 1972.6 + + + + 21 + 150 + + + + + 1972.8 + + + + 21 + 150 + + + + + 1973.0 + + + + 21 + 150 + + + + + 1973.4 + + + + 21 + 150 + + + + + 1973.6 + + + + 21 + 150 + + + + + 1974.0 + + + + 21 + 150 + + + + + 1974.2 + + + + 21 + 150 + + + + + 1974.4 + + + + 21 + 150 + + + + + 1974.4 + + + + 21 + 151 + + + + + 1974.6 + + + + 21 + 151 + + + + + 1974.8 + + + + 21 + 151 + + + + + 1975.0 + + + + 21 + 151 + + + + + 1975.2 + + + + 21 + 151 + + + + + 1975.4 + + + + 21 + 151 + + + + + 1975.4 + + + + 21 + 151 + + + + + 1975.6 + + + + 21 + 152 + + + + + 1975.8 + + + + 21 + 152 + + + + + 1975.8 + + + + 21 + 151 + + + + + 1976.0 + + + + 21 + 151 + + + + + 1976.2 + + + + 21 + 151 + + + + + 1976.4 + + + + 21 + 151 + + + + + 1976.6 + + + + 21 + 151 + + + + + 1976.6 + + + + 21 + 151 + + + + + 1976.8 + + + + 21 + 150 + + + + + 1977.0 + + + + 21 + 150 + + + + + 1977.0 + + + + 21 + 150 + + + + + 1977.2 + + + + 21 + 150 + + + + + 1977.4 + + + + 21 + 149 + + + + + 1977.4 + + + + 21 + 149 + + + + + 1977.4 + + + + 21 + 148 + + + + + 1977.4 + + + + 21 + 148 + + + + + 1977.4 + + + + 21 + 148 + + + + + 1977.6 + + + + 21 + 147 + + + + + 1977.6 + + + + 21 + 146 + + + + + 1977.6 + + + + 21 + 146 + + + + + 1977.6 + + + + 21 + 145 + + + + + 1977.8 + + + + 21 + 145 + + + + + 1977.8 + + + + 21 + 144 + + + + + 1977.8 + + + + 21 + 143 + + + + + 1977.8 + + + + 22 + 143 + + + + + 1978.0 + + + + 22 + 142 + + + + + 1978.0 + + + + 21 + 142 + + + + + 1978.0 + + + + 22 + 141 + + + + + 1978.0 + + + + 22 + 141 + + + + + 1978.2 + + + + 22 + 140 + + + + + 1978.2 + + + + 22 + 140 + + + + + 1978.2 + + + + 22 + 139 + + + + + 1978.2 + + + + 22 + 139 + + + + + 1978.2 + + + + 22 + 139 + + + + + 1978.2 + + + + 22 + 140 + + + + + 1978.4 + + + + 22 + 139 + + + + + 1978.4 + + + + 22 + 139 + + + + + 1978.4 + + + + 22 + 138 + + + + + 1978.6 + + + + 22 + 138 + + + + + 1978.6 + + + + 22 + 138 + + + + + 1978.6 + + + + 22 + 138 + + + + + 1978.8 + + + + 22 + 138 + + + + + 1978.8 + + + + 22 + 137 + + + + + 1979.0 + + + + 22 + 138 + + + + + 1979.0 + + + + 22 + 138 + + + + + 1979.2 + + + + 22 + 139 + + + + + 1979.2 + + + + 22 + 139 + + + + + 1979.4 + + + + 21 + 140 + + + + + 1979.4 + + + + 22 + 140 + + + + + 1979.6 + + + + 22 + 140 + + + + + 1979.6 + + + + 22 + 141 + + + + + 1979.8 + + + + 22 + 140 + + + + + 1979.8 + + + + 21 + 141 + + + + + 1980.0 + + + + 21 + 141 + + + + + 1980.0 + + + + 21 + 140 + + + + + 1980.2 + + + + 21 + 140 + + + + + 1980.2 + + + + 21 + 140 + + + + + 1980.4 + + + + 21 + 140 + + + + + 1980.6 + + + + 21 + 140 + + + + + 1980.6 + + + + 21 + 140 + + + + + 1980.8 + + + + 21 + 140 + + + + + 1981.0 + + + + 21 + 139 + + + + + 1981.2 + + + + 21 + 139 + + + + + 1981.2 + + + + 21 + 139 + + + + + 1981.4 + + + + 21 + 138 + + + + + 1981.6 + + + + 21 + 139 + + + + + 1981.8 + + + + 21 + 138 + + + + + 1982.0 + + + + 21 + 138 + + + + + 1982.0 + + + + 21 + 138 + + + + + 1982.2 + + + + 21 + 138 + + + + + 1982.2 + + + + 21 + 137 + + + + + 1982.2 + + + + 21 + 137 + + + + + 1982.4 + + + + 21 + 137 + + + + + 1982.4 + + + + 21 + 137 + + + + + 1982.6 + + + + 21 + 137 + + + + + 1982.8 + + + + 21 + 136 + + + + + 1983.0 + + + + 21 + 137 + + + + + 1983.0 + + + + 21 + 137 + + + + + 1983.0 + + + + 21 + 137 + + + + + 1983.2 + + + + 21 + 136 + + + + + 1983.2 + + + + 21 + 136 + + + + + 1983.2 + + + + 21 + 136 + + + + + 1983.4 + + + + 21 + 135 + + + + + 1983.4 + + + + 21 + 135 + + + + + 1983.4 + + + + 21 + 135 + + + + + 1983.4 + + + + 21 + 134 + + + + + 1983.4 + + + + 21 + 134 + + + + + 1983.6 + + + + 21 + 134 + + + + + 1983.6 + + + + 21 + 134 + + + + + 1983.6 + + + + 21 + 134 + + + + + 1983.8 + + + + 21 + 135 + + + + + 1983.8 + + + + 21 + 134 + + + + + 1984.0 + + + + 21 + 135 + + + + + 1984.0 + + + + 21 + 135 + + + + + 1984.2 + + + + 21 + 135 + + + + + 1984.2 + + + + 21 + 135 + + + + + 1984.4 + + + + 21 + 135 + + + + + 1984.4 + + + + 21 + 136 + + + + + 1984.6 + + + + 21 + 136 + + + + + 1984.6 + + + + 21 + 136 + + + + + 1984.8 + + + + 21 + 135 + + + + + 1985.0 + + + + 21 + 135 + + + + + 1985.2 + + + + 21 + 135 + + + + + 1985.4 + + + + 21 + 135 + + + + + 1985.6 + + + + 21 + 134 + + + + + 1985.6 + + + + 21 + 135 + + + + + 1985.8 + + + + 21 + 134 + + + + + 1986.0 + + + + 21 + 134 + + + + + 1986.2 + + + + 21 + 134 + + + + + 1986.2 + + + + 21 + 134 + + + + + 1986.4 + + + + 21 + 133 + + + + + 1986.4 + + + + 21 + 134 + + + + + 1986.6 + + + + 21 + 134 + + + + + 1986.6 + + + + 21 + 134 + + + + + 1986.6 + + + + 21 + 134 + + + + + 1986.8 + + + + 21 + 135 + + + + + 1986.8 + + + + 21 + 135 + + + + + 1987.0 + + + + 21 + 135 + + + + + 1987.2 + + + + 21 + 136 + + + + + 1987.4 + + + + 21 + 136 + + + + + 1987.6 + + + + 21 + 136 + + + + + 1987.6 + + + + 21 + 137 + + + + + 1987.8 + + + + 21 + 137 + + + + + 1987.8 + + + + 21 + 136 + + + + + 1988.0 + + + + 21 + 136 + + + + + 1988.2 + + + + 21 + 137 + + + + + 1988.4 + + + + 21 + 137 + + + + + 1988.4 + + + + 21 + 136 + + + + + 1988.6 + + + + 21 + 137 + + + + + 1988.6 + + + + 21 + 137 + + + + + 1988.8 + + + + 21 + 137 + + + + + 1989.0 + + + + 21 + 138 + + + + + 1989.2 + + + + 21 + 138 + + + + + 1989.4 + + + + 21 + 138 + + + + + 1989.4 + + + + 21 + 139 + + + + + 1989.6 + + + + 21 + 139 + + + + + 1989.6 + + + + 21 + 139 + + + + + 1989.6 + + + + 21 + 140 + + + + + 1989.8 + + + + 21 + 140 + + + + + 1990.0 + + + + 21 + 141 + + + + + 1990.2 + + + + 21 + 142 + + + + + 1990.4 + + + + 21 + 142 + + + + + 1990.4 + + + + 21 + 143 + + + + + 1990.6 + + + + 21 + 143 + + + + + 1990.6 + + + + 21 + 143 + + + + + 1991.2 + + + + 21 + 144 + + + + + 1991.4 + + + + 21 + 144 + + + + + 1991.6 + + + + 21 + 144 + + + + + 1991.6 + + + + 21 + 144 + + + + + 1991.8 + + + + 21 + 144 + + + + + 1992.0 + + + + 21 + 144 + + + + + 1992.2 + + + + 21 + 144 + + + + + 1992.2 + + + + 21 + 143 + + + + + 1992.4 + + + + 21 + 143 + + + + + 1992.6 + + + + 21 + 143 + + + + + 1992.4 + + + + 21 + 143 + + + + + 1992.6 + + + + 21 + 143 + + + + + 1992.6 + + + + 21 + 143 + + + + + 1992.6 + + + + 21 + 143 + + + + + 1992.6 + + + + 21 + 143 + + + + + 1992.6 + + + + 21 + 143 + + + + + 1992.6 + + + + 21 + 143 + + + + + 1992.8 + + + + 21 + 143 + + + + + 1992.8 + + + + 21 + 142 + + + + + 1992.8 + + + + 21 + 143 + + + + + 1992.8 + + + + 21 + 143 + + + + + 1992.8 + + + + 21 + 143 + + + + + 1993.0 + + + + 21 + 142 + + + + + 1993.0 + + + + 21 + 143 + + + + + 1993.0 + + + + 21 + 143 + + + + + 1993.0 + + + + 21 + 142 + + + + + 1993.4 + + + + 21 + 142 + + + + + 1993.6 + + + + 21 + 142 + + + + + 1994.0 + + + + 21 + 142 + + + + + 1994.0 + + + + 21 + 142 + + + + + 1994.0 + + + + 21 + 141 + + + + + 1994.2 + + + + 21 + 141 + + + + + 1994.2 + + + + 21 + 141 + + + + + 1994.2 + + + + 21 + 141 + + + + + 1994.4 + + + + 21 + 140 + + + + + 1994.4 + + + + 21 + 140 + + + + + 1994.4 + + + + 21 + 140 + + + + + 1994.6 + + + + 21 + 140 + + + + + 1994.6 + + + + 21 + 140 + + + + + 1994.8 + + + + 21 + 140 + + + + + 1994.8 + + + + 21 + 140 + + + + + 1995.0 + + + + 21 + 141 + + + + + 1995.0 + + + + 21 + 141 + + + + + 1995.2 + + + + 21 + 141 + + + + + 1995.4 + + + + 21 + 142 + + + + + 1995.8 + + + + 21 + 142 + + + + + 1996.0 + + + + 21 + 143 + + + + + 1996.0 + + + + 21 + 143 + + + + + 1996.2 + + + + 21 + 143 + + + + + 1996.2 + + + + 21 + 144 + + + + + 1996.4 + + + + 21 + 144 + + + + + 1996.6 + + + + 21 + 144 + + + + + 1996.6 + + + + 21 + 144 + + + + + 1996.8 + + + + 21 + 144 + + + + + 1996.8 + + + + 21 + 145 + + + + + 1997.0 + + + + 21 + 145 + + + + + 1997.2 + + + + 21 + 145 + + + + + 1997.4 + + + + 21 + 145 + + + + + 1997.6 + + + + 21 + 145 + + + + + 1997.8 + + + + 21 + 145 + + + + + 1998.0 + + + + 21 + 145 + + + + + 1998.2 + + + + 21 + 145 + + + + + 1998.2 + + + + 21 + 146 + + + + + 1998.4 + + + + 21 + 146 + + + + + 1998.6 + + + + 21 + 146 + + + + + 1998.8 + + + + 21 + 146 + + + + + 1998.8 + + + + 21 + 146 + + + + + 1999.2 + + + + 21 + 147 + + + + + 1999.4 + + + + 21 + 147 + + + + + 1999.6 + + + + 21 + 147 + + + + + 1999.8 + + + + 21 + 148 + + + + + 2000.0 + + + + 21 + 148 + + + + + 2000.0 + + + + 21 + 148 + + + + + 2000.2 + + + + 21 + 148 + + + + + 2000.2 + + + + 21 + 148 + + + + + 2000.6 + + + + 21 + 149 + + + + + 2000.8 + + + + 21 + 149 + + + + + 2000.8 + + + + 21 + 149 + + + + + 2001.0 + + + + 21 + 149 + + + + + 2001.2 + + + + 21 + 149 + + + + + 2001.6 + + + + 21 + 149 + + + + + 2001.8 + + + + 21 + 150 + + + + + 2002.0 + + + + 21 + 149 + + + + + 2002.2 + + + + 21 + 150 + + + + + 2002.4 + + + + 21 + 150 + + + + + 2002.6 + + + + 21 + 149 + + + + + 2002.8 + + + + 21 + 149 + + + + + 2002.8 + + + + 21 + 150 + + + + + 2002.8 + + + + 21 + 149 + + + + + 2003.0 + + + + 21 + 149 + + + + + 2003.0 + + + + 21 + 149 + + + + + 2003.0 + + + + 21 + 149 + + + + + 2003.2 + + + + 21 + 148 + + + + + 2003.4 + + + + 21 + 148 + + + + + 2003.4 + + + + 21 + 148 + + + + + 2003.6 + + + + 21 + 147 + + + + + 2003.6 + + + + 21 + 147 + + + + + 2003.6 + + + + 21 + 148 + + + + + 2003.8 + + + + 21 + 147 + + + + + 2003.8 + + + + 21 + 148 + + + + + 2004.2 + + + + 21 + 147 + + + + + 2004.4 + + + + 21 + 147 + + + + + 2004.6 + + + + 21 + 146 + + + + + 2004.6 + + + + 21 + 146 + + + + + 2004.8 + + + + 21 + 146 + + + + + 2005.0 + + + + 21 + 145 + + + + + 2005.2 + + + + 21 + 145 + + + + + 2005.2 + + + + 21 + 145 + + + + + 2005.4 + + + + 21 + 145 + + + + + 2005.4 + + + + 21 + 145 + + + + + 2005.6 + + + + 21 + 144 + + + + + 2005.6 + + + + 21 + 145 + + + + + 2006.0 + + + + 21 + 145 + + + + + 2006.0 + + + + 21 + 144 + + + + + 2006.2 + + + + 21 + 144 + + + + + 2006.2 + + + + 21 + 145 + + + + + 2006.4 + + + + 21 + 144 + + + + + 2006.4 + + + + 21 + 144 + + + + + 2006.6 + + + + 21 + 145 + + + + + 2006.6 + + + + 21 + 145 + + + + + 2006.8 + + + + 21 + 145 + + + + + 2007.0 + + + + 21 + 145 + + + + + 2007.0 + + + + 21 + 145 + + + + + 2007.2 + + + + 21 + 145 + + + + + 2007.4 + + + + 21 + 145 + + + + + 2007.6 + + + + 21 + 146 + + + + + 2007.6 + + + + 21 + 146 + + + + + 2007.8 + + + + 21 + 147 + + + + + 2007.8 + + + + 21 + 147 + + + + + 2008.0 + + + + 21 + 148 + + + + + 2008.0 + + + + 21 + 149 + + + + + 2008.2 + + + + 21 + 149 + + + + + 2008.4 + + + + 21 + 149 + + + + + 2008.6 + + + + 21 + 150 + + + + + 2008.6 + + + + 21 + 151 + + + + + 2008.8 + + + + 21 + 151 + + + + + 2009.0 + + + + 21 + 152 + + + + + 2009.2 + + + + 21 + 152 + + + + + 2009.4 + + + + 21 + 153 + + + + + 2009.6 + + + + 21 + 153 + + + + + 2009.8 + + + + 21 + 153 + + + + + 2010.0 + + + + 21 + 153 + + + + + 2010.2 + + + + 21 + 153 + + + + + 2010.4 + + + + 21 + 154 + + + + + 2010.8 + + + + 21 + 153 + + + + + 2011.0 + + + + 21 + 154 + + + + + 2011.2 + + + + 21 + 154 + + + + + 2011.4 + + + + 21 + 153 + + + + + 2011.6 + + + + 21 + 154 + + + + + 2011.8 + + + + 21 + 153 + + + + + 2011.8 + + + + 21 + 154 + + + + + 2012.0 + + + + 21 + 154 + + + + + 2012.0 + + + + 21 + 153 + + + + + 2012.2 + + + + 21 + 154 + + + + + 2012.4 + + + + 21 + 153 + + + + + 2012.6 + + + + 21 + 153 + + + + + 2012.6 + + + + 21 + 154 + + + + + 2012.8 + + + + 21 + 153 + + + + + 2013.0 + + + + 21 + 154 + + + + + 2013.0 + + + + 21 + 153 + + + + + 2013.2 + + + + 21 + 154 + + + + + 2013.4 + + + + 21 + 153 + + + + + 2013.6 + + + + 21 + 153 + + + + + 2013.6 + + + + 21 + 154 + + + + + 2013.6 + + + + 21 + 153 + + + + + 2013.8 + + + + 21 + 153 + + + + + 2014.0 + + + + 21 + 154 + + + + + 2014.2 + + + + 21 + 153 + + + + + 2014.4 + + + + 21 + 153 + + + + + 2014.4 + + + + 21 + 153 + + + + + 2014.6 + + + + 21 + 153 + + + + + 2014.6 + + + + 21 + 153 + + + + + 2014.8 + + + + 21 + 153 + + + + + 2014.8 + + + + 21 + 152 + + + + + 2015.0 + + + + 21 + 152 + + + + + 2015.0 + + + + 21 + 153 + + + + + 2015.2 + + + + 21 + 152 + + + + + 2015.2 + + + + 21 + 153 + + + + + 2015.4 + + + + 21 + 153 + + + + + 2015.6 + + + + 21 + 153 + + + + + 2015.8 + + + + 21 + 153 + + + + + 2015.8 + + + + 21 + 153 + + + + + 2015.8 + + + + 21 + 152 + + + + + 2016.2 + + + + 21 + 153 + + + + + 2016.4 + + + + 21 + 152 + + + + + 2016.6 + + + + 21 + 153 + + + + + 2016.8 + + + + 21 + 153 + + + + + 2017.0 + + + + 21 + 153 + + + + + 2017.2 + + + + 21 + 153 + + + + + 2017.2 + + + + 21 + 153 + + + + + 2017.4 + + + + 21 + 154 + + + + + 2017.6 + + + + 21 + 153 + + + + + 2017.6 + + + + 21 + 153 + + + + + 2017.8 + + + + 21 + 153 + + + + + 2017.8 + + + + 21 + 153 + + + + + 2018.0 + + + + 21 + 153 + + + + + 2018.0 + + + + 21 + 153 + + + + + 2018.4 + + + + 21 + 153 + + + + + 2019.0 + + + + 20 + 153 + + + + + 2019.4 + + + + 20 + 152 + + + + + 2019.8 + + + + 20 + 153 + + + + + 2020.0 + + + + 20 + 152 + + + + + 2020.0 + + + + 20 + 152 + + + + + 2020.0 + + + + 20 + 151 + + + + + 2020.0 + + + + 20 + 151 + + + + + 2020.0 + + + + 20 + 150 + + + + + 2020.2 + + + + 20 + 149 + + + + + 2020.2 + + + + 20 + 148 + + + + + 2020.2 + + + + 20 + 148 + + + + + 2020.4 + + + + 20 + 147 + + + + + 2020.6 + + + + 20 + 147 + + + + + 2020.4 + + + + 20 + 146 + + + + + 2020.8 + + + + 20 + 146 + + + + + 2020.8 + + + + 20 + 145 + + + + + 2021.0 + + + + 20 + 145 + + + + + 2021.0 + + + + 20 + 145 + + + + + 2021.2 + + + + 20 + 145 + + + + + 2021.4 + + + + 20 + 145 + + + + + 2021.6 + + + + 20 + 146 + + + + + 2021.6 + + + + 20 + 145 + + + + + 2021.8 + + + + 20 + 146 + + + + + 2021.8 + + + + 20 + 146 + + + + + 2022.0 + + + + 20 + 146 + + + + + 2022.0 + + + + 20 + 145 + + + + + 2022.2 + + + + 20 + 146 + + + + + 2022.4 + + + + 20 + 145 + + + + + 2022.4 + + + + 20 + 145 + + + + + 2022.6 + + + + 20 + 144 + + + + + 2022.6 + + + + 20 + 144 + + + + + 2022.8 + + + + 20 + 144 + + + + + 2023.0 + + + + 20 + 144 + + + + + 2023.2 + + + + 20 + 144 + + + + + 2023.4 + + + + 20 + 144 + + + + + 2023.4 + + + + 20 + 144 + + + + + 2023.8 + + + + 20 + 144 + + + + + 2023.8 + + + + 20 + 144 + + + + + 2024.0 + + + + 20 + 144 + + + + + 2024.2 + + + + 20 + 144 + + + + + 2024.2 + + + + 20 + 144 + + + + + 2024.4 + + + + 20 + 144 + + + + + 2024.4 + + + + 20 + 144 + + + + + 2024.6 + + + + 20 + 144 + + + + + 2024.6 + + + + 20 + 144 + + + + + 2024.8 + + + + 20 + 144 + + + + + 2024.8 + + + + 20 + 144 + + + + + 2025.0 + + + + 20 + 144 + + + + + 2025.2 + + + + 20 + 143 + + + + + 2025.2 + + + + 20 + 143 + + + + + 2025.4 + + + + 20 + 144 + + + + + 2025.4 + + + + 20 + 143 + + + + + 2025.6 + + + + 20 + 144 + + + + + 2025.8 + + + + 19 + 144 + + + + + 2026.0 + + + + 19 + 144 + + + + + 2026.2 + + + + 19 + 144 + + + + + 2026.6 + + + + 19 + 144 + + + + + 2026.6 + + + + 19 + 143 + + + + + 2026.8 + + + + 19 + 143 + + + + + 2026.8 + + + + 19 + 143 + + + + + 2027.0 + + + + 19 + 143 + + + + + 2027.0 + + + + 19 + 143 + + + + + 2027.2 + + + + 19 + 142 + + + + + 2027.4 + + + + 19 + 143 + + + + + 2027.4 + + + + 19 + 142 + + + + + 2027.4 + + + + 19 + 142 + + + + + 2027.6 + + + + 19 + 143 + + + + + 2027.8 + + + + 19 + 143 + + + + + 2028.0 + + + + 19 + 142 + + + + + 2028.2 + + + + 19 + 143 + + + + + 2028.4 + + + + 19 + 143 + + + + + 2028.6 + + + + 19 + 143 + + + + + 2028.8 + + + + 19 + 143 + + + + + 2029.0 + + + + 19 + 143 + + + + + 2029.2 + + + + 19 + 144 + + + + + 2029.2 + + + + 19 + 144 + + + + + 2029.4 + + + + 19 + 144 + + + + + 2029.4 + + + + 19 + 144 + + + + + 2029.6 + + + + 19 + 144 + + + + + 2029.8 + + + + 19 + 144 + + + + + 2029.8 + + + + 19 + 145 + + + + + 2030.0 + + + + 19 + 145 + + + + + 2030.0 + + + + 19 + 146 + + + + + 2030.4 + + + + 19 + 145 + + + + + 2030.4 + + + + 19 + 146 + + + + + 2030.6 + + + + 19 + 146 + + + + + 2030.8 + + + + 19 + 145 + + + + + 2031.2 + + + + 19 + 145 + + + + + 2031.2 + + + + 19 + 146 + + + + + 2031.4 + + + + 19 + 146 + + + + + 2031.4 + + + + 19 + 146 + + + + + 2031.6 + + + + 19 + 146 + + + + + 2031.8 + + + + 19 + 146 + + + + + 2032.0 + + + + 19 + 146 + + + + + 2032.4 + + + + 19 + 147 + + + + + 2032.4 + + + + 19 + 147 + + + + + 2032.6 + + + + 19 + 147 + + + + + 2032.6 + + + + 19 + 148 + + + + + 2033.0 + + + + 19 + 149 + + + + + 2033.2 + + + + 18 + 149 + + + + + 2033.4 + + + + 18 + 149 + + + + + 2033.6 + + + + 18 + 150 + + + + + 2033.8 + + + + 18 + 150 + + + + + 2033.8 + + + + 18 + 150 + + + + + 2034.0 + + + + 18 + 150 + + + + + 2034.2 + + + + 18 + 151 + + + + + 2034.6 + + + + 18 + 150 + + + + + 2034.8 + + + + 18 + 150 + + + + + 2034.8 + + + + 18 + 150 + + + + + 2035.0 + + + + 18 + 150 + + + + + 2035.0 + + + + 18 + 150 + + + + + 2035.2 + + + + 18 + 149 + + + + + 2035.4 + + + + 18 + 149 + + + + + 2035.6 + + + + 18 + 148 + + + + + 2035.8 + + + + 18 + 148 + + + + + 2035.8 + + + + 18 + 148 + + + + + 2036.0 + + + + 18 + 147 + + + + + 2036.0 + + + + 18 + 146 + + + + + 2036.0 + + + + 18 + 146 + + + + + 2036.2 + + + + 18 + 145 + + + + + 2036.2 + + + + 18 + 145 + + + + + 2036.2 + + + + 18 + 144 + + + + + 2036.4 + + + + 18 + 144 + + + + + 2036.6 + + + + 18 + 144 + + + + + 2036.8 + + + + 18 + 144 + + + + + 2036.8 + + + + 18 + 144 + + + + + 2036.8 + + + + 18 + 142 + + + + + 2036.8 + + + + 18 + 142 + + + + + 2036.8 + + + + 18 + 141 + + + + + 2037.0 + + + + 18 + 141 + + + + + 2037.0 + + + + 18 + 140 + + + + + 2037.0 + + + + 18 + 139 + + + + + 2037.0 + + + + 18 + 139 + + + + + 2037.0 + + + + 18 + 138 + + + + + 2037.0 + + + + 18 + 138 + + + + + 2037.0 + + + + 18 + 138 + + + + + 2037.0 + + + + 18 + 138 + + + + + 2037.2 + + + + 18 + 137 + + + + + 2037.2 + + + + 18 + 137 + + + + + 2037.4 + + + + 18 + 137 + + + + + 2037.6 + + + + 18 + 137 + + + + + 2037.6 + + + + 18 + 137 + + + + + 2037.8 + + + + 18 + 138 + + + + + 2037.8 + + + + 18 + 138 + + + + + 2038.0 + + + + 18 + 138 + + + + + 2038.0 + + + + 18 + 138 + + + + + 2038.2 + + + + 18 + 138 + + + + + 2038.2 + + + + 18 + 138 + + + + + 2038.4 + + + + 18 + 138 + + + + + 2038.6 + + + + 18 + 138 + + + + + 2038.8 + + + + 18 + 138 + + + + + 2039.0 + + + + 18 + 138 + + + + + 2039.0 + + + + 18 + 138 + + + + + 2039.2 + + + + 18 + 138 + + + + + 2039.2 + + + + 18 + 138 + + + + + 2039.4 + + + + 18 + 139 + + + + + 2039.4 + + + + 18 + 139 + + + + + 2039.6 + + + + 18 + 140 + + + + + 2039.6 + + + + 18 + 140 + + + + + 2039.8 + + + + 18 + 141 + + + + + 2040.0 + + + + 18 + 141 + + + + + 2040.2 + + + + 18 + 141 + + + + + 2040.0 + + + + 18 + 142 + + + + + 2040.2 + + + + 18 + 142 + + + + + 2040.2 + + + + 18 + 141 + + + + + 2040.4 + + + + 18 + 140 + + + + + 2040.6 + + + + 18 + 140 + + + + + 2040.8 + + + + 18 + 140 + + + + + 2040.8 + + + + 18 + 140 + + + + + 2041.0 + + + + 18 + 139 + + + + + 2041.2 + + + + 18 + 139 + + + + + 2041.2 + + + + 18 + 139 + + + + + 2041.4 + + + + 18 + 139 + + + + + 2041.4 + + + + 18 + 138 + + + + + 2041.6 + + + + 18 + 138 + + + + + 2041.6 + + + + 18 + 138 + + + + + 2041.8 + + + + 18 + 138 + + + + + 2041.8 + + + + 18 + 138 + + + + + 2042.0 + + + + 18 + 138 + + + + + 2042.2 + + + + 17 + 138 + + + + + 2042.2 + + + + 17 + 138 + + + + + 2042.2 + + + + 17 + 137 + + + + + 2042.4 + + + + 17 + 137 + + + + + 2042.4 + + + + 17 + 137 + + + + + 2042.6 + + + + 17 + 137 + + + + + 2042.6 + + + + 17 + 137 + + + + + 2042.6 + + + + 17 + 137 + + + + + 2042.6 + + + + 17 + 137 + + + + + 2042.6 + + + + 17 + 138 + + + + + 2043.0 + + + + 17 + 138 + + + + + 2043.0 + + + + 17 + 138 + + + + + 2043.4 + + + + 17 + 139 + + + + + 2043.4 + + + + 17 + 139 + + + + + 2043.6 + + + + 17 + 140 + + + + + 2043.6 + + + + 17 + 140 + + + + + 2043.8 + + + + 17 + 139 + + + + + 2043.8 + + + + 17 + 140 + + + + + 2044.0 + + + + 17 + 139 + + + + + 2044.0 + + + + 17 + 139 + + + + + 2044.2 + + + + 17 + 140 + + + + + 2044.2 + + + + 17 + 139 + + + + + 2044.4 + + + + 17 + 139 + + + + + 2044.6 + + + + 17 + 139 + + + + + 2044.6 + + + + 17 + 138 + + + + + 2044.6 + + + + 17 + 138 + + + + + 2044.8 + + + + 17 + 137 + + + + + 2045.0 + + + + 17 + 137 + + + + + 2045.2 + + + + 17 + 137 + + + + + 2045.2 + + + + 17 + 137 + + + + + 2045.4 + + + + 17 + 136 + + + + + 2045.4 + + + + 17 + 137 + + + + + 2045.6 + + + + 17 + 136 + + + + + 2045.8 + + + + 17 + 136 + + + + + 2046.0 + + + + 17 + 137 + + + + + 2046.0 + + + + 17 + 136 + + + + + 2046.0 + + + + 16 + 136 + + + + + 2046.2 + + + + 16 + 136 + + + + + 2046.2 + + + + 16 + 136 + + + + + 2046.2 + + + + 16 + 136 + + + + + 2046.4 + + + + 16 + 136 + + + + + 2046.4 + + + + 16 + 136 + + + + + 2046.4 + + + + 16 + 136 + + + + + 2046.6 + + + + 16 + 136 + + + + + 2046.6 + + + + 16 + 137 + + + + + 2046.8 + + + + 16 + 136 + + + + + 2047.0 + + + + 16 + 136 + + + + + 2047.2 + + + + 16 + 136 + + + + + 2047.4 + + + + 16 + 135 + + + + + 2047.4 + + + + 16 + 136 + + + + + 2047.6 + + + + 16 + 136 + + + + + 2047.8 + + + + 16 + 136 + + + + + 2047.8 + + + + 16 + 137 + + + + + 2048.0 + + + + 16 + 137 + + + + + 2048.0 + + + + 16 + 138 + + + + + 2048.2 + + + + 16 + 138 + + + + + 2048.4 + + + + 16 + 138 + + + + + 2048.6 + + + + 16 + 138 + + + + + 2048.8 + + + + 16 + 138 + + + + + 2048.8 + + + + 16 + 137 + + + + + 2049.0 + + + + 16 + 137 + + + + + 2049.0 + + + + 16 + 137 + + + + + 2049.2 + + + + 16 + 137 + + + + + 2049.4 + + + + 16 + 136 + + + + + 2049.4 + + + + 16 + 136 + + + + + 2048.6 + + + + 13 + 109 + + + + + 2048.8 + + + + 13 + 109 + + + + + 2048.8 + + + + 13 + 110 + + + + + 2048.8 + + + + 13 + 110 + + + + + 2048.8 + + + + 13 + 110 + + + + + 2049.0 + + + + 13 + 110 + + + + + 2049.0 + + + + 13 + 110 + + + + + 2049.0 + + + + 13 + 110 + + + + + 2049.0 + + + + 13 + 110 + + + + + 2049.0 + + + + 13 + 110 + + + + + 2049.0 + + + + 13 + 109 + + + + + 2049.0 + + + + 13 + 109 + + + + + 2049.2 + + + + 13 + 109 + + + + + 2049.2 + + + + 13 + 110 + + + + + 2049.2 + + + + 13 + 110 + + + + + 2049.2 + + + + 13 + 111 + + + + + 2049.2 + + + + 13 + 112 + + + + + 2049.2 + + + + 13 + 112 + + + + + 2049.4 + + + + 13 + 113 + + + + + 2049.4 + + + + 13 + 114 + + + + + 2049.4 + + + + 13 + 115 + + + + + 2049.4 + + + + 13 + 116 + + + + + 2049.6 + + + + 13 + 117 + + + + + 2049.6 + + + + 13 + 118 + + + + + 2049.6 + + + + 13 + 118 + + + + + 2049.6 + + + + 13 + 119 + + + + + 2049.6 + + + + 13 + 120 + + + + + 2049.8 + + + + 13 + 120 + + + + + 2049.8 + + + + 13 + 120 + + + + + 2050.0 + + + + 13 + 120 + + + + + 2050.2 + + + + 13 + 122 + + + + + 2050.4 + + + + 13 + 123 + + + + + 2050.4 + + + + 13 + 124 + + + + + 2050.4 + + + + 13 + 125 + + + + + 2050.6 + + + + 13 + 126 + + + + + 2050.6 + + + + 13 + 127 + + + + + 2050.8 + + + + 13 + 127 + + + + + 2051.0 + + + + 13 + 128 + + + + + 2050.8 + + + + 13 + 128 + + + + + 2050.8 + + + + 13 + 129 + + + + + 2051.0 + + + + 13 + 129 + + + + + 2051.0 + + + + 13 + 129 + + + + + 2051.0 + + + + 13 + 129 + + + + + 2051.2 + + + + 13 + 129 + + + + + 2051.2 + + + + 13 + 128 + + + + + 2051.2 + + + + 13 + 128 + + + + + 2051.4 + + + + 13 + 127 + + + + + 2051.6 + + + + 13 + 126 + + + + + 2051.6 + + + + 13 + 126 + + + + + 2051.8 + + + + 13 + 125 + + + + + 2051.8 + + + + 13 + 125 + + + + + 2052.0 + + + + 13 + 124 + + + + + 2052.0 + + + + 13 + 124 + + + + + 2052.0 + + + + 13 + 123 + + + + + 2052.2 + + + + 13 + 123 + + + + + 2052.2 + + + + 13 + 122 + + + + + 2052.4 + + + + 13 + 122 + + + + + 2052.6 + + + + 13 + 122 + + + + + 2052.6 + + + + 13 + 122 + + + + + 2052.8 + + + + 13 + 122 + + + + + 2053.0 + + + + 13 + 122 + + + + + 2053.0 + + + + 13 + 122 + + + + + 2053.2 + + + + 13 + 122 + + + + + 2053.4 + + + + 13 + 122 + + + + + 2053.6 + + + + 13 + 123 + + + + + 2053.8 + + + + 13 + 123 + + + + + 2053.8 + + + + 13 + 124 + + + + + 2054.0 + + + + 13 + 125 + + + + + 2054.0 + + + + 13 + 125 + + + + + 2054.0 + + + + 13 + 126 + + + + + 2054.2 + + + + 13 + 126 + + + + + 2054.2 + + + + 13 + 127 + + + + + 2054.4 + + + + 13 + 128 + + + + + 2054.6 + + + + 13 + 128 + + + + + 2054.8 + + + + 13 + 128 + + + + + 2055.0 + + + + 13 + 129 + + + + + 2055.2 + + + + 13 + 130 + + + + + 2055.2 + + + + 13 + 130 + + + + + 2055.4 + + + + 13 + 130 + + + + + 2055.4 + + + + 13 + 130 + + + + + 2055.6 + + + + 13 + 130 + + + + + 2055.8 + + + + 13 + 130 + + + + + 2055.8 + + + + 13 + 130 + + + + + 2055.8 + + + + 13 + 130 + + + + + 2055.8 + + + + 13 + 130 + + + + + 2056.0 + + + + 13 + 131 + + + + + 2056.0 + + + + 13 + 130 + + + + + 2056.2 + + + + 13 + 131 + + + + + 2056.4 + + + + 13 + 131 + + + + + 2056.6 + + + + 13 + 131 + + + + + 2056.8 + + + + 13 + 131 + + + + + 2057.0 + + + + 13 + 132 + + + + + 2057.0 + + + + 13 + 132 + + + + + 2057.2 + + + + 13 + 132 + + + + + 2057.4 + + + + 13 + 133 + + + + + 2057.4 + + + + 13 + 133 + + + + + 2057.8 + + + + 13 + 134 + + + + + 2058.0 + + + + 13 + 134 + + + + + 2058.2 + + + + 13 + 135 + + + + + 2058.2 + + + + 13 + 136 + + + + + 2058.2 + + + + 13 + 136 + + + + + 2058.4 + + + + 13 + 136 + + + + + 2058.6 + + + + 13 + 137 + + + + + 2058.8 + + + + 13 + 137 + + + + + 2059.0 + + + + 13 + 137 + + + + + 2059.2 + + + + 13 + 138 + + + + + 2059.4 + + + + 13 + 138 + + + + + 2059.6 + + + + 13 + 138 + + + + + 2059.8 + + + + 13 + 139 + + + + + 2059.8 + + + + 13 + 139 + + + + + 2060.0 + + + + 13 + 139 + + + + + 2060.2 + + + + 13 + 139 + + + + + 2060.2 + + + + 13 + 139 + + + + + 2060.4 + + + + 13 + 139 + + + + + 2060.6 + + + + 13 + 139 + + + + + 2060.8 + + + + 13 + 139 + + + + + 2061.0 + + + + 13 + 139 + + + + + 2061.2 + + + + 13 + 138 + + + + + 2061.4 + + + + 13 + 138 + + + + + 2061.6 + + + + 13 + 138 + + + + + 2061.6 + + + + 13 + 137 + + + + + 2061.8 + + + + 13 + 137 + + + + + 2062.0 + + + + 13 + 137 + + + + + 2062.0 + + + + 13 + 137 + + + + + 2062.2 + + + + 13 + 137 + + + + + 2062.2 + + + + 13 + 137 + + + + + 2062.4 + + + + 13 + 137 + + + + + 2062.4 + + + + 13 + 137 + + + + + 2062.6 + + + + 13 + 137 + + + + + 2062.6 + + + + 13 + 137 + + + + + 2062.6 + + + + 13 + 137 + + + + + 2062.8 + + + + 13 + 137 + + + + + 2063.0 + + + + 13 + 137 + + + + + 2063.2 + + + + 13 + 138 + + + + + 2063.4 + + + + 13 + 138 + + + + + 2063.4 + + + + 13 + 137 + + + + + 2063.6 + + + + 13 + 137 + + + + + 2063.6 + + + + 13 + 137 + + + + + 2063.8 + + + + 13 + 137 + + + + + 2064.0 + + + + 13 + 137 + + + + + 2064.0 + + + + 13 + 137 + + + + + 2064.2 + + + + 13 + 137 + + + + + 2064.2 + + + + 13 + 136 + + + + + 2064.4 + + + + 13 + 137 + + + + + 2064.4 + + + + 13 + 136 + + + + + 2064.4 + + + + 13 + 135 + + + + + 2064.6 + + + + 13 + 135 + + + + + 2064.6 + + + + 13 + 134 + + + + + 2064.8 + + + + 13 + 135 + + + + + 2064.8 + + + + 13 + 134 + + + + + 2064.8 + + + + 13 + 134 + + + + + 2064.8 + + + + 13 + 133 + + + + + 2065.0 + + + + 13 + 132 + + + + + 2065.2 + + + + 13 + 131 + + + + + 2065.2 + + + + 13 + 130 + + + + + 2065.2 + + + + 13 + 129 + + + + + 2065.2 + + + + 13 + 129 + + + + + 2065.4 + + + + 13 + 128 + + + + + 2065.6 + + + + 13 + 128 + + + + + 2065.6 + + + + 13 + 127 + + + + + 2065.6 + + + + 13 + 126 + + + + + 2065.6 + + + + 13 + 125 + + + + + 2065.6 + + + + 13 + 124 + + + + + 2065.6 + + + + 13 + 124 + + + + + 2065.8 + + + + 13 + 123 + + + + + 2065.8 + + + + 13 + 121 + + + + + 2065.8 + + + + 13 + 122 + + + + + 2065.8 + + + + 13 + 121 + + + + + 2065.8 + + + + 13 + 120 + + + + + 2065.8 + + + + 13 + 119 + + + + + 2065.8 + + + + 13 + 118 + + + + + 2065.8 + + + + 13 + 117 + + + + + 2065.8 + + + + 13 + 116 + + + + + 2065.8 + + + + 13 + 115 + + + + + 2065.8 + + + + 13 + 115 + + + + + 2065.8 + + + + 13 + 114 + + + + + 2065.8 + + + + 13 + 114 + + + + + 2065.8 + + + + 13 + 114 + + + + + 2065.8 + + + + 13 + 113 + + + + + 2065.8 + + + + 13 + 113 + + + + + 2065.8 + + + + 13 + 112 + + + + + 2065.8 + + + + 13 + 112 + + + + + 2066.0 + + + + 13 + 112 + + + + + 2066.0 + + + + 12 + 111 + + + + + 2066.0 + + + + 12 + 111 + + + + + 2066.0 + + + + 12 + 111 + + + + + 2066.0 + + + + 12 + 111 + + + + + 2066.0 + + + + 12 + 111 + + + + + 2066.0 + + + + 12 + 111 + + + + + 2066.0 + + + + 12 + 110 + + + + + 2066.0 + + + + 12 + 110 + + + + + 2066.0 + + + + 12 + 110 + + + + + 2066.0 + + + + 12 + 110 + + + + + 2066.0 + + + + 12 + 110 + + + + + 2066.0 + + + + 12 + 109 + + + + + 2066.0 + + + + 12 + 109 + + + + + 2066.0 + + + + 12 + 108 + + + + + 2066.0 + + + + 12 + 108 + + + + + 2066.0 + + + + 12 + 108 + + + + + 2066.0 + + + + 12 + 108 + + + + + 2066.0 + + + + 12 + 107 + + + + + 2065.8 + + + + 12 + 106 + + + + + 2065.8 + + + + 12 + 105 + + + + + 2065.8 + + + + 12 + 105 + + + + + 2065.8 + + + + 12 + 104 + + + + + 2065.6 + + + + 12 + 105 + + + + + 2065.6 + + + + 12 + 105 + + + + + 2065.4 + + + + 12 + 105 + + + + + 2065.4 + + + + 12 + 105 + + + + + 2065.2 + + + + 12 + 104 + + + + + 2065.2 + + + + 12 + 104 + + + + + 2065.2 + + + + 12 + 103 + + + + + 2065.2 + + + + 12 + 103 + + + + + 2065.2 + + + + 12 + 103 + + + + + 2065.2 + + + + 12 + 103 + + + + + 2065.2 + + + + 12 + 103 + + + + + 2065.2 + + + + 12 + 103 + + + + + 2065.2 + + + + 12 + 102 + + + + + 2065.2 + + + + 12 + 101 + + + + + 2065.2 + + + + 12 + 99 + + + + + 2065.2 + + + + 12 + 99 + + + + + 2065.2 + + + + 12 + 98 + + + + + 2065.4 + + + + 12 + 98 + + + + + 2065.4 + + + + 12 + 97 + + + + + 2065.4 + + + + 12 + 97 + + + + + 2065.4 + + + + 12 + 97 + + + + + 2065.4 + + + + 12 + 97 + + + + + 2065.4 + + + + 12 + 97 + + + + + 2065.6 + + + + 12 + 98 + + + + + 2065.6 + + + + 12 + 112 + + + + + 2065.6 + + + + 12 + 113 + + + + + 2065.6 + + + + 12 + 113 + + + + + 2065.8 + + + + 12 + 114 + + + + + 2065.8 + + + + 12 + 114 + + + + + 2065.8 + + + + 12 + 115 + + + + + 2065.8 + + + + 12 + 116 + + + + + 2065.8 + + + + 12 + 117 + + + + + 2066.2 + + + + 12 + 118 + + + + + 2066.2 + + + + 12 + 118 + + + + + 2066.2 + + + + 12 + 119 + + + + + 2066.2 + + + + 12 + 119 + + + + + 2066.4 + + + + 13 + 120 + + + + + 2066.6 + + + + 13 + 120 + + + + + 2066.8 + + + + 13 + 121 + + + + + 2066.8 + + + + 13 + 122 + + + + + 2067.0 + + + + 13 + 123 + + + + + 2067.0 + + + + 13 + 124 + + + + + 2067.2 + + + + 13 + 125 + + + + + 2067.4 + + + + 13 + 126 + + + + + 2067.4 + + + + 13 + 127 + + + + + 2067.6 + + + + 13 + 127 + + + + + 2067.6 + + + + 13 + 129 + + + + + 2067.8 + + + + 13 + 129 + + + + + 2067.8 + + + + 13 + 130 + + + + + 2068.0 + + + + 13 + 131 + + + + + 2068.0 + + + + 13 + 132 + + + + + 2068.2 + + + + 13 + 132 + + + + + 2068.4 + + + + 13 + 132 + + + + + 2068.6 + + + + 13 + 133 + + + + + 2068.8 + + + + 13 + 133 + + + + + 2068.8 + + + + 13 + 133 + + + + + 2069.0 + + + + 13 + 133 + + + + + 2069.0 + + + + 13 + 133 + + + + + 2069.0 + + + + 13 + 133 + + + + + 2069.2 + + + + 13 + 133 + + + + + 2069.2 + + + + 13 + 133 + + + + + 2069.4 + + + + 13 + 132 + + + + + 2069.4 + + + + 13 + 132 + + + + + 2069.4 + + + + 13 + 132 + + + + + 2069.6 + + + + 13 + 132 + + + + + 2069.6 + + + + 13 + 132 + + + + + 2069.6 + + + + 13 + 132 + + + + + 2070.0 + + + + 13 + 132 + + + + + 2070.2 + + + + 13 + 132 + + + + + 2070.4 + + + + 13 + 132 + + + + + 2070.6 + + + + 13 + 132 + + + + + 2070.6 + + + + 13 + 132 + + + + + 2070.8 + + + + 13 + 132 + + + + + 2070.8 + + + + 13 + 132 + + + + + 2071.0 + + + + 13 + 133 + + + + + 2071.2 + + + + 13 + 132 + + + + + 2071.4 + + + + 13 + 133 + + + + + 2071.4 + + + + 13 + 133 + + + + + 2071.4 + + + + 13 + 134 + + + + + 2071.6 + + + + 13 + 134 + + + + + 2071.8 + + + + 13 + 134 + + + + + 2071.8 + + + + 13 + 134 + + + + + 2071.8 + + + + 13 + 134 + + + + + 2072.0 + + + + 13 + 134 + + + + + 2072.0 + + + + 13 + 134 + + + + + 2072.0 + + + + 13 + 134 + + + + + 2072.2 + + + + 13 + 134 + + + + + 2072.4 + + + + 13 + 134 + + + + + 2072.4 + + + + 13 + 133 + + + + + 2072.6 + + + + 13 + 133 + + + + + 2072.6 + + + + 13 + 133 + + + + + 2072.8 + + + + 13 + 133 + + + + + 2072.8 + + + + 13 + 133 + + + + + 2073.0 + + + + 13 + 132 + + + + + 2073.0 + + + + 13 + 132 + + + + + 2073.2 + + + + 13 + 131 + + + + + 2073.2 + + + + 13 + 130 + + + + + 2073.2 + + + + 13 + 129 + + + + + 2073.4 + + + + 13 + 129 + + + + + 2073.4 + + + + 13 + 128 + + + + + 2073.6 + + + + 13 + 128 + + + + + 2073.6 + + + + 13 + 127 + + + + + 2073.6 + + + + 13 + 126 + + + + + 2073.6 + + + + 13 + 126 + + + + + 2073.8 + + + + 13 + 125 + + + + + 2073.8 + + + + 13 + 125 + + + + + 2073.8 + + + + 13 + 124 + + + + + 2073.8 + + + + 13 + 124 + + + + + 2074.0 + + + + 13 + 124 + + + + + 2074.0 + + + + 13 + 124 + + + + + 2074.0 + + + + 13 + 124 + + + + + 2074.0 + + + + 13 + 124 + + + + + 2074.2 + + + + 13 + 123 + + + + + 2074.2 + + + + 13 + 123 + + + + + 2074.4 + + + + 13 + 122 + + + + + 2074.4 + + + + 13 + 121 + + + + + 2074.6 + + + + 13 + 121 + + + + + 2074.6 + + + + 13 + 120 + + + + + 2074.6 + + + + 13 + 120 + + + + + 2074.6 + + + + 13 + 119 + + + + + 2074.8 + + + + 13 + 119 + + + + + 2074.8 + + + + 13 + 119 + + + + + 2074.8 + + + + 13 + 120 + + + + + 2075.0 + + + + 13 + 119 + + + + + 2075.0 + + + + 13 + 119 + + + + + 2075.2 + + + + 13 + 118 + + + + + 2075.2 + + + + 13 + 118 + + + + + 2075.2 + + + + 13 + 119 + + + + + 2075.4 + + + + 13 + 118 + + + + + 2075.4 + + + + 13 + 119 + + + + + 2075.4 + + + + 13 + 119 + + + + + 2075.4 + + + + 13 + 120 + + + + + 2075.6 + + + + 13 + 120 + + + + + 2075.8 + + + + 13 + 120 + + + + + 2076.0 + + + + 13 + 120 + + + + + 2076.0 + + + + 13 + 120 + + + + + 2076.2 + + + + 13 + 121 + + + + + 2076.2 + + + + 13 + 121 + + + + + 2076.4 + + + + 13 + 122 + + + + + 2076.6 + + + + 14 + 122 + + + + + 2076.8 + + + + 14 + 123 + + + + + 2076.8 + + + + 14 + 124 + + + + + 2077.0 + + + + 14 + 124 + + + + + 2077.0 + + + + 14 + 125 + + + + + 2077.2 + + + + 14 + 125 + + + + + 2077.2 + + + + 14 + 125 + + + + + 2077.4 + + + + 14 + 125 + + + + + 2077.6 + + + + 14 + 125 + + + + + 2077.8 + + + + 14 + 125 + + + + + 2077.8 + + + + 14 + 126 + + + + + 2078.0 + + + + 14 + 126 + + + + + 2078.0 + + + + 14 + 126 + + + + + 2078.2 + + + + 14 + 126 + + + + + 2078.2 + + + + 14 + 126 + + + + + 2078.4 + + + + 14 + 126 + + + + + 2078.6 + + + + 14 + 126 + + + + + 2078.6 + + + + 14 + 127 + + + + + 2078.8 + + + + 14 + 127 + + + + + 2079.0 + + + + 14 + 127 + + + + + 2079.2 + + + + 14 + 127 + + + + + 2079.4 + + + + 14 + 127 + + + + + 2079.4 + + + + 14 + 128 + + + + + 2079.6 + + + + 14 + 128 + + + + + 2079.6 + + + + 14 + 128 + + + + + 2079.6 + + + + 14 + 128 + + + + + 2079.8 + + + + 14 + 129 + + + + + 2080.0 + + + + 14 + 129 + + + + + 2080.2 + + + + 14 + 129 + + + + + 2080.4 + + + + 14 + 129 + + + + + 2080.6 + + + + 14 + 129 + + + + + 2080.8 + + + + 14 + 128 + + + + + 2080.8 + + + + 14 + 129 + + + + + 2081.0 + + + + 14 + 129 + + + + + 2081.0 + + + + 14 + 130 + + + + + 2081.0 + + + + 14 + 130 + + + + + 2081.2 + + + + 14 + 130 + + + + + 2081.2 + + + + 14 + 130 + + + + + 2081.4 + + + + 14 + 131 + + + + + 2081.4 + + + + 14 + 131 + + + + + 2081.6 + + + + 14 + 131 + + + + + 2081.8 + + + + 14 + 131 + + + + + 2081.8 + + + + 14 + 130 + + + + + 2081.8 + + + + 14 + 130 + + + + + 2082.0 + + + + 14 + 130 + + + + + 2082.0 + + + + 14 + 130 + + + + + 2082.2 + + + + 14 + 129 + + + + + 2082.4 + + + + 14 + 129 + + + + + 2082.6 + + + + 14 + 128 + + + + + 2082.6 + + + + 14 + 127 + + + + + 2082.6 + + + + 14 + 127 + + + + + 2082.8 + + + + 14 + 126 + + + + + 2082.8 + + + + 14 + 125 + + + + + 2082.8 + + + + 14 + 124 + + + + + 2083.0 + + + + 14 + 124 + + + + + 2083.0 + + + + 14 + 123 + + + + + 2083.2 + + + + 14 + 123 + + + + + 2083.2 + + + + 14 + 123 + + + + + 2083.4 + + + + 14 + 123 + + + + + 2083.4 + + + + 14 + 122 + + + + + 2083.4 + + + + 14 + 122 + + + + + 2083.4 + + + + 14 + 121 + + + + + 2083.6 + + + + 14 + 121 + + + + + 2083.6 + + + + 14 + 120 + + + + + 2083.8 + + + + 14 + 120 + + + + + 2083.8 + + + + 14 + 119 + + + + + 2083.8 + + + + 14 + 119 + + + + + 2083.8 + + + + 14 + 118 + + + + + 2083.8 + + + + 14 + 117 + + + + + 2084.0 + + + + 14 + 117 + + + + + 2084.2 + + + + 14 + 116 + + + + + 2084.2 + + + + 14 + 116 + + + + + 2084.4 + + + + 14 + 116 + + + + + 2084.4 + + + + 14 + 116 + + + + + 2084.4 + + + + 14 + 117 + + + + + 2084.4 + + + + 14 + 117 + + + + + 2084.4 + + + + 14 + 118 + + + + + 2084.6 + + + + 14 + 118 + + + + + 2084.6 + + + + 14 + 118 + + + + + 2084.6 + + + + 14 + 119 + + + + + 2084.6 + + + + 14 + 119 + + + + + 2084.6 + + + + 14 + 120 + + + + + 2084.6 + + + + 14 + 121 + + + + + 2084.8 + + + + 14 + 121 + + + + + 2084.8 + + + + 14 + 122 + + + + + 2085.0 + + + + 14 + 122 + + + + + 2085.0 + + + + 14 + 123 + + + + + 2085.2 + + + + 14 + 124 + + + + + 2085.2 + + + + 14 + 125 + + + + + 2085.4 + + + + 14 + 126 + + + + + 2085.4 + + + + 14 + 127 + + + + + 2085.6 + + + + 14 + 127 + + + + + 2085.8 + + + + 14 + 128 + + + + + 2085.8 + + + + 14 + 128 + + + + + 2086.0 + + + + 14 + 129 + + + + + 2086.2 + + + + 14 + 129 + + + + + 2086.4 + + + + 14 + 129 + + + + + 2086.6 + + + + 14 + 129 + + + + + 2086.6 + + + + 14 + 130 + + + + + 2087.2 + + + + 14 + 130 + + + + + 2087.2 + + + + 14 + 130 + + + + + 2087.4 + + + + 14 + 130 + + + + + 2087.6 + + + + 14 + 131 + + + + + 2087.6 + + + + 14 + 130 + + + + + 2087.8 + + + + 14 + 131 + + + + + 2088.0 + + + + 14 + 131 + + + + + 2088.2 + + + + 14 + 131 + + + + + 2088.2 + + + + 14 + 131 + + + + + 2088.4 + + + + 14 + 131 + + + + + 2088.4 + + + + 15 + 130 + + + + + 2088.6 + + + + 15 + 130 + + + + + 2088.6 + + + + 15 + 130 + + + + + 2088.6 + + + + 15 + 130 + + + + + 2088.8 + + + + 15 + 130 + + + + + 2088.8 + + + + 15 + 130 + + + + + 2089.0 + + + + 15 + 130 + + + + + 2089.0 + + + + 15 + 130 + + + + + 2089.0 + + + + 15 + 129 + + + + + 2089.2 + + + + 15 + 129 + + + + + 2089.2 + + + + 15 + 129 + + + + + 2089.2 + + + + 15 + 128 + + + + + 2089.2 + + + + 15 + 128 + + + + + 2089.2 + + + + 15 + 127 + + + + + 2089.4 + + + + 15 + 127 + + + + + 2089.4 + + + + 15 + 127 + + + + + 2089.2 + + + + 15 + 127 + + + + + 2089.4 + + + + 15 + 126 + + + + + 2089.6 + + + + 15 + 126 + + + + + 2089.6 + + + + 15 + 126 + + + + + 2089.6 + + + + 15 + 126 + + + + + 2089.8 + + + + 15 + 126 + + + + + 2089.8 + + + + 15 + 125 + + + + + 2089.8 + + + + 15 + 124 + + + + + 2090.0 + + + + 15 + 124 + + + + + 2090.0 + + + + 15 + 124 + + + + + 2090.2 + + + + 15 + 123 + + + + + 2090.2 + + + + 15 + 123 + + + + + 2090.2 + + + + 15 + 123 + + + + + 2090.4 + + + + 15 + 122 + + + + + 2090.4 + + + + 15 + 122 + + + + + 2090.4 + + + + 15 + 122 + + + + + 2090.6 + + + + 15 + 121 + + + + + 2090.6 + + + + 15 + 120 + + + + + 2090.6 + + + + 15 + 120 + + + + + 2090.8 + + + + 15 + 119 + + + + + 2090.8 + + + + 15 + 118 + + + + + 2091.0 + + + + 15 + 118 + + + + + 2091.0 + + + + 15 + 117 + + + + + 2091.2 + + + + 15 + 116 + + + + + 2091.2 + + + + 15 + 115 + + + + + 2091.2 + + + + 15 + 115 + + + + + 2091.2 + + + + 15 + 114 + + + + + 2091.4 + + + + 15 + 114 + + + + + 2091.4 + + + + 15 + 114 + + + + + 2091.4 + + + + 15 + 114 + + + + + 2091.4 + + + + 15 + 114 + + + + + 2091.4 + + + + 15 + 114 + + + + + 2091.4 + + + + 15 + 114 + + + + + 2091.4 + + + + 15 + 114 + + + + + 2091.4 + + + + 15 + 115 + + + + + 2091.4 + + + + 15 + 115 + + + + + 2091.4 + + + + 15 + 115 + + + + + 2091.6 + + + + 15 + 115 + + + + + 2091.6 + + + + 15 + 115 + + + + + 2091.6 + + + + 15 + 115 + + + + + 2091.6 + + + + 15 + 115 + + + + + 2091.6 + + + + 15 + 115 + + + + + 2091.6 + + + + 15 + 116 + + + + + 2091.8 + + + + 15 + 116 + + + + + 2091.8 + + + + 15 + 117 + + + + + 2091.8 + + + + 15 + 117 + + + + + 2091.8 + + + + 15 + 117 + + + + + 2091.8 + + + + 15 + 116 + + + + + 2092.0 + + + + 15 + 116 + + + + + 2092.2 + + + + 15 + 115 + + + + + 2092.0 + + + + 15 + 115 + + + + + 2092.2 + + + + 15 + 114 + + + + + 2092.4 + + + + 15 + 114 + + + + + 2092.4 + + + + 15 + 114 + + + + + 2092.4 + + + + 15 + 114 + + + + + 2092.4 + + + + 15 + 115 + + + + + 2092.4 + + + + 15 + 115 + + + + + 2092.6 + + + + 15 + 115 + + + + + 2092.6 + + + + 15 + 115 + + + + + 2092.8 + + + + 15 + 115 + + + + + 2092.8 + + + + 15 + 116 + + + + + 2092.8 + + + + 15 + 116 + + + + + 2093.0 + + + + 15 + 116 + + + + + 2093.0 + + + + 15 + 117 + + + + + 2093.0 + + + + 15 + 117 + + + + + 2093.2 + + + + 15 + 118 + + + + + 2093.2 + + + + 15 + 117 + + + + + 2093.2 + + + + 15 + 117 + + + + + 2093.2 + + + + 15 + 116 + + + + + 2093.4 + + + + 15 + 116 + + + + + 2093.4 + + + + 15 + 116 + + + + + 2093.4 + + + + 15 + 117 + + + + + 2093.4 + + + + 15 + 117 + + + + + 2093.6 + + + + 15 + 116 + + + + + 2093.8 + + + + 15 + 117 + + + + + 2093.8 + + + + 15 + 116 + + + + + 2094.0 + + + + 15 + 116 + + + + + 2094.4 + + + + 15 + 116 + + + + + 2094.4 + + + + 15 + 115 + + + + + 2094.4 + + + + 15 + 115 + + + + + 2094.6 + + + + 15 + 115 + + + + + 2094.6 + + + + 15 + 115 + + + + + 2094.6 + + + + 15 + 115 + + + + + 2094.6 + + + + 15 + 115 + + + + + 2094.8 + + + + 15 + 115 + + + + + 2094.8 + + + + 15 + 116 + + + + + 2094.8 + + + + 16 + 115 + + + + + 2094.8 + + + + 16 + 115 + + + + + 2094.8 + + + + 16 + 114 + + + + + 2094.8 + + + + 16 + 114 + + + + + 2095.0 + + + + 16 + 114 + + + + + 2095.0 + + + + 16 + 113 + + + + + 2095.0 + + + + 16 + 113 + + + + + 2095.0 + + + + 16 + 113 + + + + + 2095.2 + + + + 16 + 112 + + + + + 2095.2 + + + + 16 + 112 + + + + + 2095.2 + + + + 16 + 112 + + + + + 2095.4 + + + + 16 + 111 + + + + + 2095.4 + + + + 16 + 110 + + + + + 2095.4 + + + + 16 + 110 + + + + + 2095.4 + + + + 16 + 110 + + + + + 2095.4 + + + + 16 + 110 + + + + + 2095.6 + + + + 16 + 110 + + + + + 2095.6 + + + + 16 + 110 + + + + + 2095.6 + + + + 16 + 111 + + + + + 2095.6 + + + + 16 + 111 + + + + + 2095.6 + + + + 16 + 112 + + + + + 2095.6 + + + + 16 + 112 + + + + + 2095.8 + + + + 16 + 113 + + + + + 2095.8 + + + + 16 + 113 + + + + + 2095.8 + + + + 16 + 113 + + + + + 2095.8 + + + + 16 + 113 + + + + + 2096.0 + + + + 16 + 113 + + + + + 2096.0 + + + + 16 + 113 + + + + + 2096.0 + + + + 16 + 113 + + + + + 2096.0 + + + + 16 + 113 + + + + + 2096.2 + + + + 16 + 113 + + + + + 2096.2 + + + + 16 + 112 + + + + + 2096.2 + + + + 16 + 113 + + + + + 2096.2 + + + + 16 + 112 + + + + + 2096.4 + + + + 16 + 113 + + + + + 2096.4 + + + + 16 + 113 + + + + + 2096.6 + + + + 16 + 113 + + + + + 2096.6 + + + + 16 + 114 + + + + + 2096.8 + + + + 16 + 114 + + + + + 2096.8 + + + + 16 + 115 + + + + + 2097.0 + + + + 16 + 116 + + + + + 2097.0 + + + + 16 + 116 + + + + + 2097.0 + + + + 16 + 115 + + + + + 2097.2 + + + + 16 + 115 + + + + + 2097.2 + + + + 16 + 115 + + + + + 2097.2 + + + + 16 + 114 + + + + + 2097.4 + + + + 16 + 114 + + + + + 2097.6 + + + + 16 + 114 + + + + + 2097.6 + + + + 16 + 114 + + + + + 2097.8 + + + + 16 + 114 + + + + + 2097.8 + + + + 16 + 114 + + + + + 2097.8 + + + + 16 + 113 + + + + + 2097.8 + + + + 16 + 112 + + + + + 2098.0 + + + + 16 + 112 + + + + + 2098.0 + + + + 16 + 111 + + + + + 2098.2 + + + + 16 + 110 + + + + + 2098.2 + + + + 16 + 109 + + + + + 2098.2 + + + + 16 + 107 + + + + + 2098.2 + + + + 16 + 107 + + + + + 2098.2 + + + + 16 + 107 + + + + + 2098.2 + + + + 16 + 108 + + + + + 2098.2 + + + + 16 + 109 + + + + + 2098.4 + + + + 16 + 109 + + + + + 2098.4 + + + + 16 + 110 + + + + + 2098.4 + + + + 16 + 109 + + + + + 2098.4 + + + + 16 + 109 + + + + + 2098.4 + + + + 16 + 108 + + + + + 2098.6 + + + + 16 + 107 + + + + + 2098.6 + + + + 16 + 107 + + + + + 2098.6 + + + + 16 + 107 + + + + + 2098.6 + + + + 16 + 108 + + + + + 2098.6 + + + + 16 + 108 + + + + + 2098.8 + + + + 16 + 110 + + + + + 2098.8 + + + + 16 + 111 + + + + + 2099.0 + + + + 16 + 112 + + + + + 2099.0 + + + + 16 + 114 + + + + + 2099.2 + + + + 16 + 116 + + + + + 2099.2 + + + + 16 + 117 + + + + + 2099.4 + + + + 16 + 118 + + + + + 2099.6 + + + + 16 + 119 + + + + + 2099.8 + + + + 16 + 120 + + + + + 2100.0 + + + + 16 + 121 + + + + + 2100.0 + + + + 16 + 122 + + + + + 2100.2 + + + + 16 + 122 + + + + + 2100.4 + + + + 16 + 123 + + + + + 2100.4 + + + + 16 + 124 + + + + + 2100.8 + + + + 16 + 125 + + + + + 2101.0 + + + + 16 + 125 + + + + + 2101.0 + + + + 16 + 126 + + + + + 2101.2 + + + + 16 + 126 + + + + + 2101.2 + + + + 16 + 127 + + + + + 2101.2 + + + + 16 + 127 + + + + + 2101.6 + + + + 16 + 128 + + + + + 2101.4 + + + + 16 + 128 + + + + + 2101.6 + + + + 16 + 128 + + + + + 2101.8 + + + + 16 + 129 + + + + + 2101.8 + + + + 16 + 128 + + + + + 2101.8 + + + + 16 + 128 + + + + + 2102.0 + + + + 16 + 128 + + + + + 2102.0 + + + + 16 + 128 + + + + + 2102.2 + + + + 16 + 128 + + + + + 2102.4 + + + + 16 + 127 + + + + + 2102.6 + + + + 16 + 127 + + + + + 2102.8 + + + + 16 + 126 + + + + + 2103.0 + + + + 16 + 126 + + + + + 2103.0 + + + + 16 + 125 + + + + + 2103.2 + + + + 16 + 125 + + + + + 2103.2 + + + + 16 + 125 + + + + + 2103.2 + + + + 16 + 124 + + + + + 2103.2 + + + + 16 + 124 + + + + + 2103.4 + + + + 16 + 123 + + + + + 2103.4 + + + + 16 + 123 + + + + + 2103.4 + + + + 16 + 124 + + + + + 2103.6 + + + + 16 + 123 + + + + + 2103.6 + + + + 16 + 124 + + + + + 2103.6 + + + + 16 + 124 + + + + + 2103.6 + + + + 16 + 124 + + + + + 2103.6 + + + + 16 + 124 + + + + + 2103.8 + + + + 16 + 125 + + + + + 2103.8 + + + + 16 + 126 + + + + + 2104.0 + + + + 16 + 126 + + + + + 2104.2 + + + + 16 + 126 + + + + + 2104.4 + + + + 16 + 127 + + + + + 2104.4 + + + + 16 + 128 + + + + + 2104.6 + + + + 16 + 128 + + + + + 2104.8 + + + + 16 + 129 + + + + + 2105.0 + + + + 16 + 129 + + + + + 2105.0 + + + + 16 + 130 + + + + + 2105.0 + + + + 16 + 130 + + + + + 2105.4 + + + + 16 + 130 + + + + + 2105.4 + + + + 16 + 130 + + + + + 2105.6 + + + + 16 + 131 + + + + + 2105.6 + + + + 16 + 131 + + + + + 2105.8 + + + + 16 + 132 + + + + + 2105.8 + + + + 16 + 132 + + + + + 2106.0 + + + + 16 + 132 + + + + + 2106.2 + + + + 16 + 132 + + + + + 2106.4 + + + + 16 + 133 + + + + + 2106.6 + + + + 16 + 133 + + + + + 2106.8 + + + + 16 + 133 + + + + + 2107.0 + + + + 16 + 134 + + + + + 2107.2 + + + + 16 + 134 + + + + + 2107.4 + + + + 16 + 134 + + + + + 2107.6 + + + + 16 + 135 + + + + + 2107.6 + + + + 16 + 135 + + + + + 2107.8 + + + + 16 + 135 + + + + + 2107.8 + + + + 16 + 136 + + + + + 2108.0 + + + + 16 + 136 + + + + + 2108.2 + + + + 16 + 136 + + + + + 2108.2 + + + + 16 + 137 + + + + + 2108.4 + + + + 16 + 137 + + + + + 2108.4 + + + + 16 + 136 + + + + + 2108.6 + + + + 16 + 136 + + + + + 2108.6 + + + + 16 + 137 + + + + + 2108.8 + + + + 16 + 137 + + + + + 2108.8 + + + + 16 + 137 + + + + + 2109.0 + + + + 15 + 137 + + + + + 2109.2 + + + + 15 + 137 + + + + + 2109.4 + + + + 15 + 137 + + + + + 2109.6 + + + + 15 + 138 + + + + + 2109.8 + + + + 15 + 138 + + + + + 2109.8 + + + + 15 + 138 + + + + + 2110.0 + + + + 15 + 138 + + + + + 2110.2 + + + + 15 + 139 + + + + + 2110.6 + + + + 15 + 138 + + + + + 2110.8 + + + + 15 + 139 + + + + + 2111.0 + + + + 15 + 139 + + + + + 2111.2 + + + + 15 + 139 + + + + + 2111.2 + + + + 15 + 139 + + + + + 2111.4 + + + + 15 + 139 + + + + + 2111.4 + + + + 15 + 139 + + + + + 2111.6 + + + + 15 + 139 + + + + + 2111.6 + + + + 15 + 140 + + + + + 2111.6 + + + + 15 + 140 + + + + + 2111.8 + + + + 15 + 140 + + + + + 2112.0 + + + + 15 + 141 + + + + + 2112.4 + + + + 15 + 141 + + + + + 2112.8 + + + + 15 + 142 + + + + + 2113.0 + + + + 15 + 142 + + + + + 2113.0 + + + + 15 + 142 + + + + + 2113.2 + + + + 15 + 143 + + + + + 2113.2 + + + + 15 + 143 + + + + + 2113.4 + + + + 15 + 144 + + + + + 2113.4 + + + + 15 + 143 + + + + + 2113.6 + + + + 15 + 144 + + + + + 2113.8 + + + + 15 + 144 + + + + + 2113.8 + + + + 15 + 144 + + + + + 2114.2 + + + + 15 + 144 + + + + + 2114.2 + + + + 15 + 144 + + + + + 2114.4 + + + + 15 + 143 + + + + + 2114.4 + + + + 15 + 143 + + + + + 2114.6 + + + + 15 + 143 + + + + + 2114.8 + + + + 15 + 143 + + + + + 2114.8 + + + + 15 + 143 + + + + + 2115.0 + + + + 15 + 143 + + + + + 2115.2 + + + + 15 + 143 + + + + + 2115.2 + + + + 15 + 143 + + + + + 2115.4 + + + + 15 + 142 + + + + + 2115.6 + + + + 15 + 142 + + + + + 2115.8 + + + + 15 + 142 + + + + + 2115.8 + + + + 15 + 142 + + + + + 2116.0 + + + + 15 + 141 + + + + + 2116.2 + + + + 15 + 141 + + + + + 2116.4 + + + + 15 + 141 + + + + + 2116.6 + + + + 15 + 140 + + + + + 2116.8 + + + + 15 + 140 + + + + + 2116.8 + + + + 15 + 140 + + + + + 2117.0 + + + + 15 + 140 + + + + + 2117.0 + + + + 15 + 140 + + + + + 2117.2 + + + + 15 + 140 + + + + + 2117.4 + + + + 15 + 140 + + + + + 2117.4 + + + + 15 + 140 + + + + + 2117.6 + + + + 15 + 140 + + + + + 2117.8 + + + + 15 + 139 + + + + + 2117.8 + + + + 15 + 139 + + + + + 2118.0 + + + + 15 + 139 + + + + + 2118.0 + + + + 15 + 138 + + + + + 2118.2 + + + + 15 + 137 + + + + + 2118.2 + + + + 15 + 137 + + + + + 2118.4 + + + + 15 + 136 + + + + + 2118.4 + + + + 15 + 136 + + + + + 2118.4 + + + + 15 + 136 + + + + + 2118.6 + + + + 15 + 136 + + + + + 2118.8 + + + + 15 + 136 + + + + + 2119.0 + + + + 15 + 136 + + + + + 2119.0 + + + + 15 + 135 + + + + + 2119.0 + + + + 15 + 135 + + + + + 2119.2 + + + + 15 + 135 + + + + + 2119.0 + + + + 15 + 136 + + + + + 2119.2 + + + + 15 + 136 + + + + + 2119.2 + + + + 15 + 136 + + + + + 2119.4 + + + + 15 + 136 + + + + + 2119.4 + + + + 15 + 136 + + + + + 2119.6 + + + + 15 + 137 + + + + + 2120.0 + + + + 15 + 137 + + + + + 2120.0 + + + + 15 + 136 + + + + + 2120.0 + + + + 15 + 137 + + + + + 2120.2 + + + + 15 + 137 + + + + + 2120.4 + + + + 15 + 137 + + + + + 2120.4 + + + + 15 + 138 + + + + + 2120.6 + + + + 15 + 138 + + + + + 2120.6 + + + + 15 + 138 + + + + + 2120.8 + + + + 15 + 139 + + + + + 2120.8 + + + + 15 + 139 + + + + + 2121.0 + + + + 15 + 140 + + + + + 2121.2 + + + + 15 + 141 + + + + + 2121.4 + + + + 15 + 141 + + + + + 2121.6 + + + + 15 + 142 + + + + + 2121.8 + + + + 15 + 142 + + + + + 2122.0 + + + + 15 + 142 + + + + + 2122.0 + + + + 15 + 143 + + + + + 2122.4 + + + + 15 + 143 + + + + + 2122.6 + + + + 15 + 143 + + + + + 2122.6 + + + + 15 + 143 + + + + + 2123.0 + + + + 15 + 143 + + + + + 2123.2 + + + + 15 + 143 + + + + + 2123.4 + + + + 15 + 144 + + + + + 2123.6 + + + + 15 + 144 + + + + + 2123.8 + + + + 15 + 143 + + + + + 2124.0 + + + + 15 + 144 + + + + + 2124.2 + + + + 15 + 144 + + + + + 2124.2 + + + + 15 + 144 + + + + + 2124.4 + + + + 15 + 144 + + + + + 2124.6 + + + + 15 + 144 + + + + + 2124.8 + + + + 15 + 144 + + + + + 2125.0 + + + + 15 + 145 + + + + + 2125.2 + + + + 15 + 145 + + + + + 2125.2 + + + + 15 + 146 + + + + + 2125.2 + + + + 15 + 146 + + + + + 2125.4 + + + + 15 + 146 + + + + + 2125.4 + + + + 15 + 146 + + + + + 2125.6 + + + + 15 + 146 + + + + + 2125.8 + + + + 15 + 146 + + + + + 2125.8 + + + + 15 + 146 + + + + + 2126.0 + + + + 15 + 146 + + + + + 2126.2 + + + + 15 + 146 + + + + + 2126.4 + + + + 15 + 146 + + + + + 2126.6 + + + + 15 + 146 + + + + + 2126.6 + + + + 15 + 146 + + + + + 2126.8 + + + + 15 + 146 + + + + + 2127.0 + + + + 15 + 146 + + + + + 2127.2 + + + + 15 + 145 + + + + + 2127.4 + + + + 15 + 145 + + + + + 2127.6 + + + + 15 + 145 + + + + + 2127.8 + + + + 15 + 145 + + + + + 2127.8 + + + + 15 + 145 + + + + + 2128.0 + + + + 15 + 144 + + + + + 2128.0 + + + + 15 + 144 + + + + + 2128.2 + + + + 15 + 144 + + + + + 2128.2 + + + + 15 + 144 + + + + + 2128.4 + + + + 15 + 143 + + + + + 2128.4 + + + + 15 + 143 + + + + + 2128.6 + + + + 15 + 143 + + + + + 2128.6 + + + + 15 + 143 + + + + + 2128.8 + + + + 15 + 143 + + + + + 2129.0 + + + + 15 + 142 + + + + + 2129.2 + + + + 15 + 142 + + + + + 2129.2 + + + + 15 + 142 + + + + + 2129.4 + + + + 15 + 142 + + + + + 2129.4 + + + + 15 + 142 + + + + + 2129.4 + + + + 15 + 142 + + + + + 2129.6 + + + + 15 + 142 + + + + + 2129.8 + + + + 15 + 142 + + + + + 2130.2 + + + + 15 + 142 + + + + + 2130.2 + + + + 15 + 142 + + + + + 2130.4 + + + + 15 + 142 + + + + + 2130.6 + + + + 15 + 141 + + + + + 2130.8 + + + + 15 + 141 + + + + + 2131.0 + + + + 15 + 142 + + + + + 2131.0 + + + + 15 + 141 + + + + + 2131.2 + + + + 15 + 142 + + + + + 2131.4 + + + + 15 + 142 + + + + + 2131.4 + + + + 15 + 141 + + + + + 2131.6 + + + + 15 + 141 + + + + + 2131.8 + + + + 15 + 141 + + + + + 2132.0 + + + + 15 + 141 + + + + + 2132.0 + + + + 15 + 141 + + + + + 2132.2 + + + + 15 + 141 + + + + + 2132.2 + + + + 15 + 141 + + + + + 2132.4 + + + + 15 + 141 + + + + + 2132.8 + + + + 15 + 141 + + + + + 2132.8 + + + + 15 + 141 + + + + + 2133.0 + + + + 15 + 141 + + + + + 2133.2 + + + + 15 + 142 + + + + + 2133.2 + + + + 15 + 142 + + + + + 2133.4 + + + + 15 + 143 + + + + + 2133.4 + + + + 15 + 143 + + + + + 2133.8 + + + + 15 + 143 + + + + + 2133.8 + + + + 15 + 144 + + + + + 2134.0 + + + + 15 + 144 + + + + + 2134.2 + + + + 15 + 145 + + + + + 2134.4 + + + + 15 + 146 + + + + + 2134.6 + + + + 15 + 146 + + + + + 2134.8 + + + + 15 + 147 + + + + + 2135.2 + + + + 15 + 147 + + + + + 2135.4 + + + + 15 + 148 + + + + + 2135.6 + + + + 15 + 148 + + + + + 2136.0 + + + + 15 + 148 + + + + + 2136.2 + + + + 15 + 148 + + + + + 2136.2 + + + + 15 + 148 + + + + + 2136.6 + + + + 15 + 148 + + + + + 2136.8 + + + + 15 + 148 + + + + + 2137.0 + + + + 15 + 148 + + + + + 2137.2 + + + + 15 + 148 + + + + + 2137.6 + + + + 15 + 148 + + + + + 2137.8 + + + + 15 + 147 + + + + + 2138.0 + + + + 15 + 148 + + + + + 2138.2 + + + + 15 + 147 + + + + + 2138.2 + + + + 15 + 147 + + + + + 2138.4 + + + + 15 + 147 + + + + + 2138.4 + + + + 15 + 146 + + + + + 2138.6 + + + + 15 + 146 + + + + + 2138.6 + + + + 15 + 145 + + + + + 2138.6 + + + + 15 + 145 + + + + + 2138.8 + + + + 16 + 98 + + + + + 2138.8 + + + + 16 + 98 + + + + + 2138.4 + + + + 16 + 98 + + + + + 2138.4 + + + + 16 + 99 + + + + + 2138.4 + + + + 16 + 98 + + + + + 2138.4 + + + + 16 + 98 + + + + + 2138.4 + + + + 16 + 98 + + + + + 2138.4 + + + + 16 + 99 + + + + + 2138.2 + + + + 16 + 99 + + + + + 2138.2 + + + + 16 + 99 + + + + + 2138.2 + + + + 16 + 100 + + + + + 2138.2 + + + + 16 + 101 + + + + + 2138.2 + + + + 16 + 102 + + + + + 2138.2 + + + + 16 + 103 + + + + + 2138.2 + + + + 16 + 103 + + + + + 2138.2 + + + + 16 + 104 + + + + + 2138.2 + + + + 16 + 105 + + + + + 2138.4 + + + + 16 + 106 + + + + + 2138.6 + + + + 16 + 107 + + + + + 2138.6 + + + + 16 + 108 + + + + + 2138.8 + + + + 16 + 109 + + + + + 2138.8 + + + + 16 + 110 + + + + + 2138.8 + + + + 16 + 111 + + + + + 2138.8 + + + + 16 + 112 + + + + + 2139.0 + + + + 16 + 113 + + + + + 2139.0 + + + + 17 + 114 + + + + + 2139.2 + + + + 17 + 115 + + + + + 2139.0 + + + + 17 + 116 + + + + + 2139.2 + + + + 17 + 117 + + + + + 2139.2 + + + + 17 + 117 + + + + + 2139.4 + + + + 17 + 118 + + + + + 2139.4 + + + + 17 + 118 + + + + + 2139.6 + + + + 17 + 119 + + + + + 2139.6 + + + + 17 + 120 + + + + + 2139.8 + + + + 17 + 120 + + + + + 2139.8 + + + + 17 + 121 + + + + + 2140.0 + + + + 17 + 121 + + + + + 2140.2 + + + + 17 + 121 + + + + + 2140.2 + + + + 17 + 122 + + + + + 2140.4 + + + + 17 + 122 + + + + + 2140.4 + + + + 17 + 122 + + + + + 2140.6 + + + + 17 + 122 + + + + + 2140.8 + + + + 17 + 123 + + + + + 2141.0 + + + + 17 + 123 + + + + + 2141.2 + + + + 17 + 124 + + + + + 2141.4 + + + + 17 + 124 + + + + + 2141.6 + + + + 17 + 124 + + + + + 2141.6 + + + + 17 + 124 + + + + + 2141.8 + + + + 17 + 125 + + + + + 2141.8 + + + + 17 + 125 + + + + + 2142.0 + + + + 17 + 126 + + + + + 2142.2 + + + + 17 + 127 + + + + + 2142.4 + + + + 17 + 127 + + + + + 2142.4 + + + + 17 + 128 + + + + + 2142.4 + + + + 17 + 128 + + + + + 2142.4 + + + + 17 + 128 + + + + + 2142.6 + + + + 17 + 128 + + + + + 2142.6 + + + + 17 + 129 + + + + + 2142.8 + + + + 17 + 129 + + + + + 2143.0 + + + + 17 + 129 + + + + + 2143.0 + + + + 17 + 129 + + + + + 2143.2 + + + + 17 + 129 + + + + + 2143.2 + + + + 17 + 129 + + + + + 2143.4 + + + + 17 + 129 + + + + + 2143.6 + + + + 17 + 129 + + + + + 2143.8 + + + + 17 + 128 + + + + + 2144.0 + + + + 17 + 128 + + + + + 2144.0 + + + + 17 + 127 + + + + + 2144.2 + + + + 17 + 127 + + + + + 2144.4 + + + + 17 + 127 + + + + + 2144.6 + + + + 17 + 127 + + + + + 2144.8 + + + + 17 + 126 + + + + + 2144.8 + + + + 17 + 126 + + + + + 2144.8 + + + + 17 + 126 + + + + + 2145.0 + + + + 17 + 126 + + + + + 2145.0 + + + + 17 + 126 + + + + + 2145.0 + + + + 17 + 127 + + + + + 2145.0 + + + + 17 + 127 + + + + + 2145.2 + + + + 17 + 127 + + + + + 2145.2 + + + + 17 + 127 + + + + + 2145.4 + + + + 17 + 127 + + + + + 2145.4 + + + + 17 + 127 + + + + + 2145.6 + + + + 17 + 126 + + + + + 2145.6 + + + + 17 + 127 + + + + + 2145.6 + + + + 17 + 127 + + + + + 2145.8 + + + + 17 + 127 + + + + + 2145.8 + + + + 18 + 127 + + + + + 2146.0 + + + + 18 + 128 + + + + + 2146.2 + + + + 18 + 128 + + + + + 2146.4 + + + + 18 + 128 + + + + + 2146.4 + + + + 18 + 128 + + + + + 2146.6 + + + + 18 + 128 + + + + + 2146.6 + + + + 18 + 128 + + + + + 2146.6 + + + + 18 + 128 + + + + + 2146.8 + + + + 18 + 128 + + + + + 2146.8 + + + + 18 + 127 + + + + + 2146.8 + + + + 18 + 127 + + + + + 2147.0 + + + + 18 + 127 + + + + + 2147.0 + + + + 18 + 126 + + + + + 2147.2 + + + + 18 + 126 + + + + + 2147.2 + + + + 18 + 126 + + + + + 2147.4 + + + + 18 + 125 + + + + + 2147.2 + + + + 18 + 125 + + + + + 2147.4 + + + + 18 + 124 + + + + + 2147.4 + + + + 18 + 123 + + + + + 2147.4 + + + + 18 + 123 + + + + + 2147.4 + + + + 18 + 122 + + + + + 2147.4 + + + + 18 + 121 + + + + + 2147.6 + + + + 18 + 121 + + + + + 2147.6 + + + + 18 + 119 + + + + + 2147.6 + + + + 18 + 118 + + + + + 2147.6 + + + + 18 + 116 + + + + + 2147.6 + + + + 18 + 115 + + + + + 2147.6 + + + + 18 + 114 + + + + + 2147.8 + + + + 18 + 113 + + + + + 2147.8 + + + + 18 + 112 + + + + + 2147.8 + + + + 18 + 113 + + + + + 2148.0 + + + + 18 + 113 + + + + + 2148.0 + + + + 18 + 113 + + + + + 2148.2 + + + + 18 + 114 + + + + + 2148.2 + + + + 18 + 115 + + + + + 2148.2 + + + + 18 + 116 + + + + + 2148.4 + + + + 18 + 117 + + + + + 2148.4 + + + + 18 + 118 + + + + + 2148.4 + + + + 18 + 119 + + + + + 2148.4 + + + + 18 + 120 + + + + + 2148.6 + + + + 18 + 121 + + + + + 2148.6 + + + + 18 + 121 + + + + + 2148.8 + + + + 18 + 122 + + + + + 2148.8 + + + + 18 + 123 + + + + + 2149.0 + + + + 18 + 123 + + + + + 2149.2 + + + + 18 + 124 + + + + + 2149.4 + + + + 18 + 124 + + + + + 2149.6 + + + + 18 + 125 + + + + + 2150.2 + + + + 18 + 125 + + + + + 2150.4 + + + + 18 + 126 + + + + + 2150.6 + + + + 18 + 127 + + + + + 2150.8 + + + + 18 + 127 + + + + + 2150.8 + + + + 18 + 128 + + + + + 2150.8 + + + + 18 + 129 + + + + + 2151.0 + + + + 18 + 130 + + + + + 2151.2 + + + + 18 + 131 + + + + + 2151.4 + + + + 18 + 132 + + + + + 2151.6 + + + + 18 + 132 + + + + + 2151.6 + + + + 18 + 133 + + + + + 2151.8 + + + + 18 + 134 + + + + + 2152.0 + + + + 18 + 135 + + + + + 2152.4 + + + + 18 + 135 + + + + + 2152.6 + + + + 18 + 136 + + + + + 2152.8 + + + + 18 + 135 + + + + + 2153.0 + + + + 18 + 136 + + + + + 2153.2 + + + + 18 + 135 + + + + + 2153.4 + + + + 18 + 135 + + + + + 2153.6 + + + + 18 + 135 + + + + + 2153.6 + + + + 18 + 135 + + + + + 2153.6 + + + + 18 + 134 + + + + + 2153.8 + + + + 18 + 134 + + + + + 2153.8 + + + + 18 + 134 + + + + + 2153.8 + + + + 18 + 133 + + + + + 2153.8 + + + + 18 + 132 + + + + + 2153.8 + + + + 18 + 131 + + + + + 2153.8 + + + + 18 + 130 + + + + + 2153.8 + + + + 18 + 129 + + + + + 2153.8 + + + + 18 + 128 + + + + + 2153.8 + + + + 18 + 127 + + + + + 2153.6 + + + + 18 + 126 + + + + + 2153.6 + + + + 18 + 124 + + + + + 2153.0 + + + + 18 + 124 + + + + + 2152.4 + + + + 18 + 122 + + + + + 2151.4 + + + + 18 + 119 + + + + + 2150.8 + + + + 18 + 118 + + + + + 2150.4 + + + + 18 + 118 + + + + + 2150.0 + + + + 18 + 118 + + + + + 2149.8 + + + + 18 + 117 + + + + + 2149.4 + + + + 18 + 116 + + + + + 2149.2 + + + + 18 + 115 + + + + + 2149.0 + + + + 18 + 112 + + + + + 2148.6 + + + + 18 + 112 + + + + + 2148.6 + + + + 18 + 110 + + + + + 2148.4 + + + + 18 + 110 + + + + + 2148.0 + + + + 18 + 109 + + + + + 2147.8 + + + + 18 + 109 + + + + + 2147.6 + + + + 18 + 109 + + + + + 2147.2 + + + + 18 + 108 + + + + + 2147.0 + + + + 18 + 107 + + + + + 2146.8 + + + + 18 + 107 + + + + + 2146.4 + + + + 18 + 107 + + + + + 2146.2 + + + + 18 + 107 + + + + + 2146.0 + + + + 18 + 108 + + + + + 2145.8 + + + + 18 + 110 + + + + + 2145.4 + + + + 18 + 111 + + + + + 2145.0 + + + + 18 + 113 + + + + + 2144.8 + + + + 18 + 114 + + + + + 2144.8 + + + + 18 + 115 + + + + + 2144.6 + + + + 18 + 115 + + + + + 2144.6 + + + + 18 + 116 + + + + + 2144.6 + + + + 18 + 115 + + + + + 2144.6 + + + + 18 + 115 + + + + + 2144.4 + + + + 18 + 114 + + + + + 2144.4 + + + + 18 + 112 + + + + + 2144.2 + + + + 18 + 111 + + + + + 2144.2 + + + + 18 + 110 + + + + + 2144.0 + + + + 18 + 109 + + + + + 2144.0 + + + + 18 + 110 + + + + + 2143.8 + + + + 18 + 111 + + + + + 2143.4 + + + + 18 + 113 + + + + + 2143.0 + + + + 18 + 114 + + + + + 2142.6 + + + + 18 + 116 + + + + + 2142.2 + + + + 18 + 116 + + + + + 2141.8 + + + + 18 + 117 + + + + + 2141.6 + + + + 18 + 118 + + + + + 2141.4 + + + + 18 + 119 + + + + + 2141.2 + + + + 18 + 119 + + + + + 2141.2 + + + + 18 + 119 + + + + + 2141.0 + + + + 18 + 118 + + + + + 2140.8 + + + + 18 + 118 + + + + + 2140.8 + + + + 18 + 118 + + + + + 2140.2 + + + + 18 + 118 + + + + + 2140.0 + + + + 19 + 118 + + + + + 2140.0 + + + + 19 + 118 + + + + + 2139.8 + + + + 19 + 118 + + + + + 2139.6 + + + + 19 + 118 + + + + + 2139.4 + + + + 19 + 118 + + + + + 2139.2 + + + + 19 + 117 + + + + + 2139.2 + + + + 19 + 117 + + + + + 2139.0 + + + + 19 + 117 + + + + + 2138.8 + + + + 19 + 117 + + + + + 2138.6 + + + + 19 + 115 + + + + + 2138.6 + + + + 19 + 114 + + + + + 2138.4 + + + + 19 + 113 + + + + + 2138.2 + + + + 19 + 113 + + + + + 2138.0 + + + + 19 + 113 + + + + + 2138.0 + + + + 19 + 113 + + + + + 2138.0 + + + + 19 + 114 + + + + + 2137.8 + + + + 19 + 114 + + + + + 2137.8 + + + + 19 + 114 + + + + + 2137.8 + + + + 19 + 114 + + + + + 2137.8 + + + + 19 + 112 + + + + + 2137.8 + + + + 19 + 111 + + + + + 2137.8 + + + + 19 + 111 + + + + + 2137.6 + + + + 19 + 109 + + + + + 2137.6 + + + + 19 + 107 + + + + + 2137.6 + + + + 19 + 106 + + + + + 2137.6 + + + + 19 + 105 + + + + + 2137.4 + + + + 19 + 105 + + + + + 2137.4 + + + + 19 + 104 + + + + + 2137.4 + + + + 19 + 102 + + + + + 2137.4 + + + + 19 + 102 + + + + + 2137.4 + + + + 19 + 101 + + + + + 2137.4 + + + + 19 + 100 + + + + + 2137.2 + + + + 19 + 99 + + + + + 2137.2 + + + + 19 + 99 + + + + + 2137.2 + + + + 19 + 99 + + + + + 2137.2 + + + + 19 + 99 + + + + + 2137.0 + + + + 19 + 99 + + + + + 2136.6 + + + + 19 + 100 + + + + + 2136.4 + + + + 19 + 100 + + + + + 2136.2 + + + + 19 + 100 + + + + + 2135.8 + + + + 19 + 101 + + + + + 2135.6 + + + + 19 + 102 + + + + + 2135.4 + + + + 19 + 102 + + + + + 2135.2 + + + + 19 + 103 + + + + + 2135.0 + + + + 19 + 104 + + + + + 2134.6 + + + + 19 + 105 + + + + + 2134.2 + + + + 19 + 107 + + + + + 2134.0 + + + + 19 + 109 + + + + + 2134.0 + + + + 19 + 111 + + + + + 2131.4 + + + + 19 + 119 + + + + + 2130.4 + + + + 19 + 120 + + + + + 2129.6 + + + + 19 + 120 + + + + + 2129.2 + + + + 19 + 121 + + + + + 2128.6 + + + + 19 + 119 + + + + + 2128.6 + + + + 19 + 118 + + + + + 2128.4 + + + + 19 + 117 + + + + + 2128.2 + + + + 19 + 116 + + + + + 2128.0 + + + + 19 + 116 + + + + + 2127.4 + + + + 19 + 116 + + + + + 2126.8 + + + + 19 + 116 + + + + + 2126.0 + + + + 19 + 116 + + + + + 2125.4 + + + + 19 + 117 + + + + + 2124.8 + + + + 19 + 118 + + + + + 2123.8 + + + + 19 + 119 + + + + + 2123.0 + + + + 19 + 120 + + + + + 2122.0 + + + + 19 + 122 + + + + + 2121.0 + + + + 19 + 122 + + + + + 2119.8 + + + + 19 + 123 + + + + + 2119.4 + + + + 19 + 124 + + + + + 2118.6 + + + + 19 + 125 + + + + + 2117.8 + + + + 19 + 126 + + + + + 2117.0 + + + + 19 + 127 + + + + + 2116.4 + + + + 19 + 127 + + + + + 2115.6 + + + + 19 + 128 + + + + + 2115.0 + + + + 19 + 128 + + + + + 2114.2 + + + + 19 + 128 + + + + + 2113.6 + + + + 19 + 129 + + + + + 2112.8 + + + + 19 + 130 + + + + + 2111.8 + + + + 19 + 130 + + + + + 2110.4 + + + + 19 + 131 + + + + + 2109.0 + + + + 19 + 130 + + + + + 2108.0 + + + + 19 + 129 + + + + + 2106.6 + + + + 19 + 129 + + + + + 2105.6 + + + + 19 + 128 + + + + + 2104.8 + + + + 19 + 128 + + + + + 2103.6 + + + + 19 + 127 + + + + + 2102.8 + + + + 19 + 127 + + + + + 2102.2 + + + + 19 + 126 + + + + + 2101.2 + + + + 19 + 126 + + + + + 2100.4 + + + + 19 + 126 + + + + + 2100.0 + + + + 19 + 125 + + + + + 2099.8 + + + + 19 + 125 + + + + + 2099.4 + + + + 19 + 125 + + + + + 2099.4 + + + + 19 + 125 + + + + + 2099.0 + + + + 19 + 124 + + + + + 2098.6 + + + + 19 + 124 + + + + + 2098.0 + + + + 19 + 124 + + + + + 2097.0 + + + + 19 + 125 + + + + + 2096.0 + + + + 19 + 125 + + + + + 2095.2 + + + + 19 + 125 + + + + + 2093.6 + + + + 19 + 124 + + + + + 2092.8 + + + + 19 + 124 + + + + + 2091.8 + + + + 19 + 124 + + + + + 2091.0 + + + + 19 + 123 + + + + + 2090.0 + + + + 19 + 123 + + + + + 2088.8 + + + + 19 + 123 + + + + + 2087.6 + + + + 19 + 124 + + + + + 2086.6 + + + + 19 + 124 + + + + + 2086.0 + + + + 19 + 124 + + + + + 2085.4 + + + + 19 + 124 + + + + + 2082.8 + + + + 19 + 126 + + + + + 2082.6 + + + + 19 + 126 + + + + + 2082.6 + + + + 19 + 125 + + + + + 2082.6 + + + + 19 + 124 + + + + + 2082.4 + + + + 19 + 124 + + + + + 2082.4 + + + + 19 + 124 + + + + + 2082.4 + + + + 19 + 124 + + + + + 2082.2 + + + + 19 + 123 + + + + + 2081.8 + + + + 19 + 123 + + + + + 2081.0 + + + + 19 + 123 + + + + + 2080.2 + + + + 19 + 123 + + + + + 2079.4 + + + + 19 + 123 + + + + + 2078.6 + + + + 19 + 124 + + + + + 2077.8 + + + + 19 + 124 + + + + + 2076.8 + + + + 19 + 124 + + + + + 2075.8 + + + + 19 + 125 + + + + + 2075.2 + + + + 19 + 126 + + + + + 2074.2 + + + + 19 + 126 + + + + + 2073.6 + + + + 19 + 127 + + + + + 2073.0 + + + + 19 + 127 + + + + + 2072.4 + + + + 19 + 128 + + + + + 2071.8 + + + + 19 + 128 + + + + + 2071.2 + + + + 19 + 129 + + + + + 2070.2 + + + + 19 + 129 + + + + + 2069.0 + + + + 19 + 129 + + + + + 2067.8 + + + + 19 + 129 + + + + + 2066.6 + + + + 19 + 130 + + + + + 2065.2 + + + + 19 + 129 + + + + + 2063.6 + + + + 19 + 129 + + + + + 2062.4 + + + + 19 + 130 + + + + + 2061.4 + + + + 19 + 130 + + + + + 2060.0 + + + + 19 + 130 + + + + + 2059.2 + + + + 19 + 130 + + + + + 2058.6 + + + + 19 + 129 + + + + + 2057.6 + + + + 19 + 129 + + + + + 2056.8 + + + + 19 + 128 + + + + + 2056.0 + + + + 19 + 127 + + + + + 2055.4 + + + + 19 + 127 + + + + + 2034.8 + + + + 19 + 112 + + + + + 2034.6 + + + + 19 + 113 + + + + + 2034.4 + + + + 19 + 113 + + + + + 2034.2 + + + + 19 + 113 + + + + + 2034.2 + + + + 19 + 113 + + + + + 2034.0 + + + + 19 + 113 + + + + + 2034.0 + + + + 19 + 113 + + + + + 2033.8 + + + + 19 + 113 + + + + + 2033.6 + + + + 19 + 112 + + + + + 2033.2 + + + + 19 + 112 + + + + + 2032.8 + + + + 19 + 112 + + + + + 2032.4 + + + + 19 + 113 + + + + + 2032.2 + + + + 19 + 114 + + + + + 2032.2 + + + + 19 + 114 + + + + + 2032.0 + + + + 19 + 115 + + + + + 2032.0 + + + + 19 + 115 + + + + + 2032.0 + + + + 19 + 116 + + + + + 2031.8 + + + + 19 + 116 + + + + + 2031.8 + + + + 19 + 116 + + + + + 2031.8 + + + + 19 + 117 + + + + + 2031.6 + + + + 19 + 117 + + + + + 2031.4 + + + + 19 + 117 + + + + + 2031.2 + + + + 19 + 118 + + + + + 2031.2 + + + + 19 + 118 + + + + + 2031.0 + + + + 19 + 119 + + + + + 2030.8 + + + + 19 + 120 + + + + + 2030.4 + + + + 19 + 122 + + + + + 2030.0 + + + + 19 + 123 + + + + + 2029.4 + + + + 19 + 124 + + + + + 2029.2 + + + + 19 + 125 + + + + + 2028.8 + + + + 19 + 127 + + + + + 2028.4 + + + + 19 + 128 + + + + + 2027.8 + + + + 19 + 129 + + + + + 2027.4 + + + + 19 + 130 + + + + + 2027.2 + + + + 19 + 131 + + + + + 2027.0 + + + + 19 + 133 + + + + + 2027.0 + + + + 19 + 134 + + + + + 2027.0 + + + + 19 + 135 + + + + + 2027.0 + + + + 19 + 135 + + + + + 2027.0 + + + + 19 + 136 + + + + + 2027.0 + + + + 19 + 137 + + + + + 2027.0 + + + + 19 + 137 + + + + + 2027.0 + + + + 19 + 138 + + + + + 2027.0 + + + + 19 + 138 + + + + + 2027.0 + + + + 19 + 138 + + + + + 2035.6 + + + + 19 + 149 + + + + + 2035.6 + + + + 19 + 149 + + + + + 2035.8 + + + + 19 + 148 + + + + + 2035.8 + + + + 19 + 148 + + + + + 2035.8 + + + + 19 + 148 + + + + + 2036.0 + + + + 19 + 148 + + + + + 2036.0 + + + + 19 + 148 + + + + + 2036.0 + + + + 19 + 147 + + + + + 2036.0 + + + + 19 + 146 + + + + + 2036.0 + + + + 19 + 145 + + + + + 2036.2 + + + + 19 + 144 + + + + + 2036.2 + + + + 19 + 144 + + + + + 2036.2 + + + + 19 + 144 + + + + + 2036.4 + + + + 19 + 143 + + + + + 2036.4 + + + + 19 + 142 + + + + + 2036.4 + + + + 19 + 142 + + + + + 2036.4 + + + + 19 + 141 + + + + + 2036.6 + + + + 19 + 140 + + + + + 2036.6 + + + + 19 + 140 + + + + + 2036.6 + + + + 19 + 139 + + + + + 2036.6 + + + + 19 + 139 + + + + + 2036.8 + + + + 19 + 139 + + + + + 2036.8 + + + + 19 + 139 + + + + + 2037.0 + + + + 19 + 140 + + + + + 2037.0 + + + + 19 + 140 + + + + + 2037.2 + + + + 19 + 140 + + + + + 2037.2 + + + + 19 + 140 + + + + + 2037.6 + + + + 19 + 140 + + + + + 2037.8 + + + + 19 + 140 + + + + + 2037.8 + + + + 19 + 140 + + + + + 2038.0 + + + + 19 + 141 + + + + + 2038.0 + + + + 19 + 140 + + + + + 2038.0 + + + + 19 + 139 + + + + + 2038.2 + + + + 19 + 139 + + + + + 2038.2 + + + + 19 + 139 + + + + + 2038.6 + + + + 19 + 138 + + + + + 2038.6 + + + + 19 + 139 + + + + + 2038.6 + + + + 19 + 138 + + + + + 2038.6 + + + + 19 + 138 + + + + + 2038.6 + + + + 19 + 139 + + + + + 2038.6 + + + + 19 + 139 + + + + + 2038.6 + + + + 19 + 139 + + + + + 2038.6 + + + + 19 + 139 + + + + + 2038.6 + + + + 19 + 139 + + + + + 2038.6 + + + + 19 + 139 + + + + + 2038.6 + + + + 19 + 139 + + + + + 2038.6 + + + + 19 + 139 + + + + + 2038.6 + + + + 19 + 139 + + + + + 2038.4 + + + + 19 + 138 + + + + + 2038.4 + + + + 19 + 138 + + + + + 2038.2 + + + + 19 + 137 + + + + + 2038.2 + + + + 19 + 136 + + + + + 2038.2 + + + + 19 + 135 + + + + + 2038.0 + + + + 20 + 135 + + + + + 2037.8 + + + + 20 + 136 + + + + + 2037.8 + + + + 20 + 135 + + + + + 2037.8 + + + + 20 + 135 + + + + + 2037.8 + + + + 20 + 134 + + + + + 2037.4 + + + + 20 + 132 + + + + + 2037.2 + + + + 20 + 129 + + + + + 2037.0 + + + + 20 + 127 + + + + + 2037.0 + + + + 20 + 125 + + + + + 2036.8 + + + + 20 + 125 + + + + + 2036.8 + + + + 20 + 125 + + + + + 2036.8 + + + + 20 + 123 + + + + + 2036.6 + + + + 20 + 121 + + + + + 2036.4 + + + + 20 + 119 + + + + + 2036.2 + + + + 20 + 118 + + + + + 2035.8 + + + + 20 + 116 + + + + + 2035.8 + + + + 20 + 114 + + + + + 2035.2 + + + + 20 + 112 + + + + + 2035.0 + + + + 20 + 111 + + + + + 2034.8 + + + + 20 + 111 + + + + + 2034.6 + + + + 20 + 112 + + + + + 2034.4 + + + + 20 + 112 + + + + + 2034.4 + + + + 20 + 113 + + + + + 2034.4 + + + + 20 + 114 + + + + + 2034.2 + + + + 20 + 116 + + + + + 2034.2 + + + + 20 + 116 + + + + + 2033.8 + + + + 20 + 116 + + + + + 2033.6 + + + + 20 + 116 + + + + + 2033.4 + + + + 20 + 116 + + + + + 2033.2 + + + + 20 + 117 + + + + + 2033.0 + + + + 20 + 116 + + + + + 2033.0 + + + + 20 + 117 + + + + + 2032.8 + + + + 20 + 117 + + + + + 2032.8 + + + + 20 + 118 + + + + + 2032.4 + + + + 20 + 117 + + + + + 2032.0 + + + + 20 + 116 + + + + + 2031.8 + + + + 20 + 114 + + + + + 2031.6 + + + + 20 + 112 + + + + + 2031.4 + + + + 20 + 111 + + + + + 2031.2 + + + + 20 + 112 + + + + + 2031.0 + + + + 20 + 112 + + + + + 2030.8 + + + + 20 + 113 + + + + + 2030.6 + + + + 20 + 114 + + + + + 2030.6 + + + + 20 + 115 + + + + + 2030.4 + + + + 20 + 116 + + + + + 2030.2 + + + + 20 + 117 + + + + + 2029.8 + + + + 20 + 118 + + + + + 2029.6 + + + + 20 + 117 + + + + + 2029.4 + + + + 20 + 114 + + + + + 2029.2 + + + + 20 + 111 + + + + + 2029.0 + + + + 20 + 109 + + + + + 2029.0 + + + + 20 + 108 + + + + + 2028.8 + + + + 20 + 106 + + + + + 2028.0 + + + + 20 + 110 + + + + + 2028.0 + + + + 20 + 111 + + + + + 2027.8 + + + + 20 + 111 + + + + + 2027.8 + + + + 20 + 110 + + + + + 2027.8 + + + + 20 + 110 + + + + + 2027.6 + + + + 20 + 108 + + + + + 2027.4 + + + + 20 + 108 + + + + + 2027.4 + + + + 20 + 109 + + + + + 2027.4 + + + + 20 + 109 + + + + + 2027.2 + + + + 20 + 111 + + + + + 2027.0 + + + + 20 + 112 + + + + + 2026.8 + + + + 20 + 113 + + + + + 2026.4 + + + + 20 + 113 + + + + + 2026.0 + + + + 20 + 113 + + + + + 2025.6 + + + + 20 + 113 + + + + + 2025.2 + + + + 20 + 113 + + + + + 2025.0 + + + + 20 + 111 + + + + + 2024.8 + + + + 20 + 111 + + + + + 2024.6 + + + + 20 + 110 + + + + + 2024.4 + + + + 20 + 109 + + + + + 2024.2 + + + + 20 + 109 + + + + + 2024.0 + + + + 20 + 109 + + + + + 2023.8 + + + + 20 + 109 + + + + + 2023.8 + + + + 20 + 110 + + + + + 2023.2 + + + + 20 + 111 + + + + + 2022.8 + + + + 20 + 112 + + + + + 2022.6 + + + + 20 + 112 + + + + + 2022.4 + + + + 20 + 113 + + + + + 2022.2 + + + + 20 + 114 + + + + + 2022.0 + + + + 20 + 114 + + + + + 2022.0 + + + + 20 + 115 + + + + + 2021.0 + + + + 20 + 114 + + + + + 2020.6 + + + + 20 + 114 + + + + + 2020.4 + + + + 20 + 112 + + + + + 2020.4 + + + + 20 + 112 + + + + + 2020.2 + + + + 20 + 112 + + + + + 2020.2 + + + + 20 + 108 + + + + + 2020.0 + + + + 20 + 107 + + + + + 2020.0 + + + + 20 + 106 + + + + + 2019.8 + + + + 20 + 107 + + + + + 2019.2 + + + + 20 + 108 + + + + + 2018.6 + + + + 20 + 109 + + + + + 2018.4 + + + + 20 + 110 + + + + + 2017.2 + + + + 20 + 110 + + + + + 2016.8 + + + + 20 + 111 + + + + + 2016.4 + + + + 20 + 111 + + + + + 2016.2 + + + + 20 + 111 + + + + + 2016.0 + + + + 20 + 111 + + + + + 2006.6 + + + + 20 + 111 + + + + + 2006.6 + + + + 20 + 111 + + + + + 2006.6 + + + + 20 + 111 + + + + + 2006.6 + + + + 20 + 110 + + + + + 2006.6 + + + + 20 + 110 + + + + + 2006.6 + + + + 20 + 110 + + + + + 2006.4 + + + + 20 + 110 + + + + + 2006.2 + + + + 20 + 110 + + + + + 2006.2 + + + + 20 + 110 + + + + + 2006.2 + + + + 20 + 111 + + + + + 2006.0 + + + + 20 + 112 + + + + + 2006.0 + + + + 20 + 113 + + + + + 2006.0 + + + + 20 + 114 + + + + + 2006.0 + + + + 20 + 115 + + + + + 2006.0 + + + + 20 + 116 + + + + + 2006.0 + + + + 20 + 117 + + + + + 2006.0 + + + + 20 + 119 + + + + + 2006.2 + + + + 20 + 120 + + + + + 2006.4 + + + + 20 + 120 + + + + + 2006.6 + + + + 20 + 122 + + + + + 2007.0 + + + + 20 + 123 + + + + + 2007.0 + + + + 20 + 124 + + + + + 2007.2 + + + + 20 + 125 + + + + + 2007.2 + + + + 20 + 127 + + + + + 2007.4 + + + + 20 + 128 + + + + + 2007.8 + + + + 20 + 129 + + + + + 2008.2 + + + + 20 + 130 + + + + + 2008.4 + + + + 20 + 132 + + + + + 2008.4 + + + + 20 + 134 + + + + + 2008.6 + + + + 20 + 135 + + + + + 2008.8 + + + + 20 + 137 + + + + + 2009.2 + + + + 20 + 139 + + + + + 2009.4 + + + + 20 + 140 + + + + + 2009.6 + + + + 20 + 141 + + + + + 2010.0 + + + + 20 + 142 + + + + + 2010.2 + + + + 20 + 143 + + + + + 2010.4 + + + + 20 + 145 + + + + + 2010.6 + + + + 20 + 146 + + + + + 2010.6 + + + + 20 + 147 + + + + + 2013.0 + + + + 20 + 146 + + + + + 2012.8 + + + + 20 + 145 + + + + + 2012.8 + + + + 20 + 143 + + + + + 2012.8 + + + + 20 + 142 + + + + + 2012.8 + + + + 20 + 142 + + + + + 2012.8 + + + + 20 + 141 + + + + + 2012.8 + + + + 20 + 140 + + + + + 2012.8 + + + + 20 + 140 + + + + + 2012.8 + + + + 20 + 139 + + + + + 2012.6 + + + + 21 + 138 + + + + + 2012.6 + + + + 21 + 137 + + + + + 2012.6 + + + + 21 + 136 + + + + + 2012.6 + + + + 21 + 136 + + + + + 2012.8 + + + + 21 + 135 + + + + + 2012.6 + + + + 21 + 135 + + + + + 2012.6 + + + + 21 + 134 + + + + + 2012.4 + + + + 21 + 133 + + + + + 2012.4 + + + + 21 + 133 + + + + + 2012.4 + + + + 21 + 131 + + + + + 2012.4 + + + + 21 + 130 + + + + + 2012.2 + + + + 21 + 128 + + + + + 2012.2 + + + + 21 + 127 + + + + + 2012.0 + + + + 21 + 127 + + + + + 2011.8 + + + + 21 + 127 + + + + + 2011.8 + + + + 21 + 126 + + + + + 2011.8 + + + + 21 + 126 + + + + + 2011.6 + + + + 21 + 126 + + + + + 2011.4 + + + + 21 + 125 + + + + + 2011.4 + + + + 21 + 124 + + + + + 2011.2 + + + + 21 + 124 + + + + + 2011.2 + + + + 21 + 124 + + + + + 2011.2 + + + + 21 + 124 + + + + + 2011.0 + + + + 21 + 124 + + + + + 2011.0 + + + + 21 + 124 + + + + + 2010.6 + + + + 21 + 123 + + + + + 2010.6 + + + + 21 + 122 + + + + + 2010.4 + + + + 21 + 121 + + + + + 2010.4 + + + + 21 + 120 + + + + + 2010.4 + + + + 21 + 118 + + + + + 2010.4 + + + + 21 + 116 + + + + + 2010.0 + + + + 21 + 115 + + + + + 2009.8 + + + + 21 + 113 + + + + + 2009.8 + + + + 21 + 112 + + + + + 2009.8 + + + + 21 + 111 + + + + + 2009.6 + + + + 21 + 110 + + + + + 2009.6 + + + + 21 + 110 + + + + + 2009.4 + + + + 21 + 109 + + + + + 2009.4 + + + + 21 + 108 + + + + + 2009.2 + + + + 21 + 107 + + + + + 2009.2 + + + + 21 + 107 + + + + + 2009.2 + + + + 21 + 107 + + + + + 2009.2 + + + + 21 + 107 + + + + + 2008.8 + + + + 21 + 106 + + + + + 2008.8 + + + + 21 + 106 + + + + + 2008.8 + + + + 21 + 105 + + + + + 2008.6 + + + + 21 + 105 + + + + + 2008.2 + + + + 21 + 104 + + + + + 2008.0 + + + + 21 + 103 + + + + + 2007.8 + + + + 21 + 102 + + + + + 2007.8 + + + + 21 + 103 + + + + + 2007.6 + + + + 21 + 103 + + + + + 2007.4 + + + + 21 + 104 + + + + + 2007.0 + + + + 21 + 105 + + + + + 2006.8 + + + + 21 + 106 + + + + + 2006.8 + + + + 21 + 106 + + + + + 2006.6 + + + + 21 + 107 + + + + + 2006.6 + + + + 21 + 107 + + + + + 2006.4 + + + + 21 + 106 + + + + + 2006.2 + + + + 21 + 106 + + + + + 2006.2 + + + + 21 + 104 + + + + + 2006.0 + + + + 21 + 104 + + + + + 2005.8 + + + + 21 + 104 + + + + + 2005.6 + + + + 21 + 105 + + + + + 2005.6 + + + + 21 + 106 + + + + + 2005.4 + + + + 21 + 107 + + + + + 2005.2 + + + + 21 + 109 + + + + + 2005.2 + + + + 21 + 110 + + + + + 2005.2 + + + + 21 + 111 + + + + + 2005.0 + + + + 21 + 112 + + + + + 2005.0 + + + + 21 + 112 + + + + + 2005.0 + + + + 21 + 112 + + + + + 2005.0 + + + + 21 + 112 + + + + + 2004.8 + + + + 21 + 112 + + + + + 2004.8 + + + + 21 + 112 + + + + + 2004.6 + + + + 21 + 112 + + + + + 2004.4 + + + + 21 + 112 + + + + + 2004.0 + + + + 21 + 111 + + + + + 2003.6 + + + + 21 + 111 + + + + + 2003.4 + + + + 21 + 111 + + + + + 2003.0 + + + + 21 + 110 + + + + + 2003.0 + + + + 21 + 110 + + + + + 2002.8 + + + + 21 + 109 + + + + + 2002.6 + + + + 21 + 108 + + + + + 2002.4 + + + + 21 + 108 + + + + + 2002.2 + + + + 21 + 109 + + + + + 2002.0 + + + + 21 + 109 + + + + + 2002.0 + + + + 21 + 109 + + + + + 2002.0 + + + + 21 + 110 + + + + + 2001.8 + + + + 21 + 110 + + + + + 2001.6 + + + + 21 + 110 + + + + + 2001.6 + + + + 21 + 111 + + + + + 2001.2 + + + + 21 + 111 + + + + + 2000.8 + + + + 21 + 112 + + + + + 2000.6 + + + + 21 + 112 + + + + + 2000.4 + + + + 21 + 112 + + + + + 1999.8 + + + + 21 + 112 + + + + + 1999.4 + + + + 21 + 112 + + + + + 1998.8 + + + + 21 + 112 + + + + + 1998.2 + + + + 21 + 112 + + + + + 1998.0 + + + + 21 + 112 + + + + + 1997.8 + + + + 21 + 112 + + + + + 1997.6 + + + + 21 + 112 + + + + + 1997.6 + + + + 21 + 112 + + + + + 1997.4 + + + + 21 + 113 + + + + + 1997.4 + + + + 21 + 114 + + + + + 1997.2 + + + + 21 + 114 + + + + + 1997.0 + + + + 21 + 115 + + + + + 1997.0 + + + + 21 + 116 + + + + + 1996.8 + + + + 21 + 117 + + + + + 1996.8 + + + + 21 + 117 + + + + + 1996.8 + + + + 21 + 118 + + + + + 1996.6 + + + + 21 + 118 + + + + + 1996.2 + + + + 21 + 117 + + + + + 1996.0 + + + + 21 + 116 + + + + + 1995.8 + + + + 21 + 115 + + + + + 1995.8 + + + + 20 + 114 + + + + + 1995.4 + + + + 20 + 114 + + + + + 1995.4 + + + + 20 + 114 + + + + + 1995.4 + + + + 20 + 113 + + + + + 1995.4 + + + + 20 + 112 + + + + + 1995.0 + + + + 20 + 111 + + + + + 1995.0 + + + + 20 + 112 + + + + + 1995.0 + + + + 20 + 112 + + + + + 1995.0 + + + + 20 + 113 + + + + + 1994.6 + + + + 20 + 114 + + + + + 1994.6 + + + + 20 + 115 + + + + + 1994.4 + + + + 20 + 116 + + + + + 1994.4 + + + + 20 + 117 + + + + + 1994.4 + + + + 20 + 117 + + + + + 1994.4 + + + + 20 + 117 + + + + + 1994.4 + + + + 20 + 117 + + + + + 1994.2 + + + + 20 + 116 + + + + + 1994.2 + + + + 20 + 116 + + + + + 1994.2 + + + + 20 + 115 + + + + + 1994.2 + + + + 20 + 114 + + + + + 1994.0 + + + + 20 + 113 + + + + + 1993.8 + + + + 20 + 112 + + + + + 1993.4 + + + + 20 + 112 + + + + + 1993.2 + + + + 20 + 112 + + + + + 1993.0 + + + + 20 + 112 + + + + + 1993.0 + + + + 20 + 113 + + + + + 1992.8 + + + + 20 + 114 + + + + + 1992.4 + + + + 20 + 115 + + + + + 1992.2 + + + + 20 + 116 + + + + + 1992.2 + + + + 20 + 117 + + + + + 1992.0 + + + + 20 + 117 + + + + + 1992.0 + + + + 20 + 118 + + + + + 1991.8 + + + + 20 + 118 + + + + + 1991.6 + + + + 20 + 119 + + + + + 1991.2 + + + + 20 + 118 + + + + + 1991.0 + + + + 20 + 118 + + + + + 1991.0 + + + + 20 + 116 + + + + + 1990.8 + + + + 20 + 115 + + + + + 1990.8 + + + + 20 + 114 + + + + + 1990.8 + + + + 20 + 114 + + + + + 1990.8 + + + + 20 + 113 + + + + + 1990.6 + + + + 20 + 112 + + + + + 1990.6 + + + + 20 + 111 + + + + + 1990.6 + + + + 20 + 111 + + + + + 1990.4 + + + + 20 + 111 + + + + + 1990.2 + + + + 20 + 111 + + + + + 1990.0 + + + + 20 + 111 + + + + + 1990.0 + + + + 20 + 111 + + + + + 1989.8 + + + + 20 + 110 + + + + + 1989.8 + + + + 20 + 110 + + + + + 1989.6 + + + + 20 + 109 + + + + + 1989.6 + + + + 20 + 109 + + + + + 1989.6 + + + + 20 + 108 + + + + + 1989.4 + + + + 20 + 109 + + + + + 1989.2 + + + + 20 + 110 + + + + + 1989.0 + + + + 20 + 110 + + + + + 1988.8 + + + + 20 + 111 + + + + + 1988.6 + + + + 20 + 111 + + + + + 1988.4 + + + + 20 + 111 + + + + + 1988.0 + + + + 20 + 111 + + + + + 1987.6 + + + + 20 + 111 + + + + + 1987.2 + + + + 20 + 112 + + + + + 1987.0 + + + + 20 + 112 + + + + + 1986.6 + + + + 20 + 113 + + + + + 1986.2 + + + + 20 + 114 + + + + + 1985.4 + + + + 20 + 115 + + + + + 1984.4 + + + + 20 + 116 + + + + + 1983.8 + + + + 20 + 117 + + + + + 1983.4 + + + + 20 + 117 + + + + + 1983.0 + + + + 20 + 117 + + + + + 1982.6 + + + + 20 + 116 + + + + + 1982.2 + + + + 20 + 115 + + + + + 1981.6 + + + + 20 + 115 + + + + + 1981.4 + + + + 20 + 115 + + + + + 1981.0 + + + + 20 + 115 + + + + + 1980.6 + + + + 20 + 116 + + + + + 1980.2 + + + + 20 + 117 + + + + + 1980.0 + + + + 20 + 118 + + + + + 1979.0 + + + + 19 + 129 + + + + + 1979.0 + + + + 19 + 128 + + + + + 1979.0 + + + + 19 + 128 + + + + + 1979.0 + + + + 19 + 127 + + + + + 1979.0 + + + + 19 + 127 + + + + + 1978.8 + + + + 19 + 127 + + + + + 1978.8 + + + + 19 + 127 + + + + + 1978.6 + + + + 19 + 127 + + + + + 1978.4 + + + + 19 + 127 + + + + + 1978.2 + + + + 19 + 128 + + + + + 1978.0 + + + + 19 + 128 + + + + + 1977.8 + + + + 19 + 128 + + + + + 1977.6 + + + + 19 + 128 + + + + + 1977.6 + + + + 19 + 128 + + + + + 1977.6 + + + + 19 + 129 + + + + + 1977.4 + + + + 19 + 129 + + + + + 1977.2 + + + + 19 + 129 + + + + + 1977.2 + + + + 19 + 130 + + + + + 1977.2 + + + + 19 + 130 + + + + + 1977.0 + + + + 19 + 131 + + + + + 1977.0 + + + + 19 + 132 + + + + + 1976.8 + + + + 19 + 132 + + + + + 1976.8 + + + + 19 + 133 + + + + + 1976.6 + + + + 19 + 133 + + + + + 1976.6 + + + + 19 + 133 + + + + + 1976.4 + + + + 19 + 132 + + + + + 1976.4 + + + + 19 + 132 + + + + + 1976.2 + + + + 19 + 131 + + + + + 1976.0 + + + + 19 + 130 + + + + + 1976.0 + + + + 19 + 130 + + + + + 1975.8 + + + + 19 + 129 + + + + + 1975.8 + + + + 19 + 129 + + + + + 1975.8 + + + + 19 + 128 + + + + + 1975.6 + + + + 19 + 127 + + + + + 1975.6 + + + + 19 + 126 + + + + + 1975.6 + + + + 19 + 126 + + + + + 1975.4 + + + + 19 + 124 + + + + + 1975.4 + + + + 19 + 124 + + + + + 1975.4 + + + + 19 + 124 + + + + + 1975.4 + + + + 19 + 123 + + + + + 1975.4 + + + + 19 + 123 + + + + + 1975.4 + + + + 19 + 123 + + + + + 1975.4 + + + + 19 + 123 + + + + + 1975.2 + + + + 19 + 123 + + + + + 1975.2 + + + + 19 + 123 + + + + + 1975.2 + + + + 19 + 123 + + + + + 1975.2 + + + + 19 + 124 + + + + + 1975.0 + + + + 19 + 124 + + + + + 1975.0 + + + + 19 + 124 + + + + + 1975.0 + + + + 19 + 124 + + + + + 1975.0 + + + + 19 + 124 + + + + + 1974.8 + + + + 19 + 124 + + + + + 1974.8 + + + + 19 + 124 + + + + + 1974.8 + + + + 19 + 124 + + + + + 1974.8 + + + + 19 + 124 + + + + + 1974.8 + + + + 19 + 123 + + + + + 1974.6 + + + + 19 + 124 + + + + + 1974.6 + + + + 19 + 124 + + + + + 1974.4 + + + + 19 + 123 + + + + + 1974.2 + + + + 19 + 123 + + + + + 1974.2 + + + + 19 + 122 + + + + + 1974.0 + + + + 19 + 122 + + + + + 1974.0 + + + + 19 + 122 + + + + + 1973.8 + + + + 19 + 122 + + + + + 1973.8 + + + + 19 + 122 + + + + + 1973.6 + + + + 19 + 122 + + + + + 1973.6 + + + + 19 + 122 + + + + + 1973.4 + + + + 19 + 121 + + + + + 1973.4 + + + + 19 + 120 + + + + + 1973.4 + + + + 19 + 120 + + + + + 1973.2 + + + + 19 + 120 + + + + + 1973.2 + + + + 19 + 121 + + + + + 1973.2 + + + + 19 + 121 + + + + + 1973.0 + + + + 19 + 122 + + + + + 1973.0 + + + + 19 + 122 + + + + + 1972.8 + + + + 19 + 123 + + + + + 1972.8 + + + + 19 + 124 + + + + + 1972.8 + + + + 19 + 124 + + + + + 1972.6 + + + + 19 + 124 + + + + + 1972.4 + + + + 19 + 124 + + + + + 1972.2 + + + + 19 + 124 + + + + + 1972.0 + + + + 19 + 124 + + + + + 1971.8 + + + + 19 + 124 + + + + + 1971.8 + + + + 19 + 123 + + + + + 1971.8 + + + + 19 + 123 + + + + + 1971.8 + + + + 19 + 123 + + + + + 1971.8 + + + + 18 + 123 + + + + + 1971.8 + + + + 18 + 124 + + + + + 1971.6 + + + + 18 + 124 + + + + + 1971.6 + + + + 18 + 124 + + + + + 1971.6 + + + + 18 + 124 + + + + + 1971.6 + + + + 18 + 124 + + + + + 1971.6 + + + + 18 + 125 + + + + + 1971.6 + + + + 18 + 124 + + + + + 1971.6 + + + + 18 + 124 + + + + + 1971.6 + + + + 18 + 124 + + + + + 1971.6 + + + + 18 + 123 + + + + + 1971.6 + + + + 18 + 122 + + + + + 1971.6 + + + + 18 + 121 + + + + + 1971.6 + + + + 18 + 120 + + + + + 1971.6 + + + + 18 + 119 + + + + + 1971.6 + + + + 18 + 119 + + + + + 1971.6 + + + + 18 + 119 + + + + + 1971.6 + + + + 18 + 119 + + + + + 1971.4 + + + + 18 + 120 + + + + + 1971.4 + + + + 18 + 120 + + + + + 1971.4 + + + + 18 + 120 + + + + + 1971.4 + + + + 18 + 121 + + + + + 1971.4 + + + + 18 + 123 + + + + + 1971.4 + + + + 18 + 124 + + + + + 1971.2 + + + + 18 + 125 + + + + + 1971.2 + + + + 18 + 125 + + + + + 1971.0 + + + + 18 + 125 + + + + + 1971.0 + + + + 18 + 125 + + + + + 1971.0 + + + + 18 + 126 + + + + + 1970.8 + + + + 18 + 126 + + + + + 1970.8 + + + + 18 + 126 + + + + + 1970.8 + + + + 18 + 125 + + + + + 1970.8 + + + + 18 + 125 + + + + + 1970.6 + + + + 18 + 124 + + + + + 1970.6 + + + + 18 + 124 + + + + + 1970.6 + + + + 18 + 123 + + + + + 1970.4 + + + + 18 + 123 + + + + + 1970.4 + + + + 18 + 123 + + + + + 1970.2 + + + + 18 + 123 + + + + + 1970.2 + + + + 18 + 123 + + + + + 1970.2 + + + + 18 + 122 + + + + + 1970.2 + + + + 18 + 123 + + + + + 1969.8 + + + + 18 + 123 + + + + + 1969.8 + + + + 18 + 124 + + + + + 1969.6 + + + + 18 + 124 + + + + + 1969.6 + + + + 18 + 125 + + + + + 1969.4 + + + + 18 + 125 + + + + + 1969.4 + + + + 18 + 125 + + + + + 1969.4 + + + + 18 + 125 + + + + + 1969.4 + + + + 18 + 126 + + + + + 1969.2 + + + + 18 + 126 + + + + + 1969.2 + + + + 18 + 126 + + + + + 1969.2 + + + + 18 + 126 + + + + + 1969.2 + + + + 18 + 126 + + + + + 1969.2 + + + + 18 + 126 + + + + + 1969.0 + + + + 18 + 127 + + + + + 1969.0 + + + + 18 + 126 + + + + + 1969.0 + + + + 18 + 126 + + + + + 1968.8 + + + + 18 + 126 + + + + + 1968.8 + + + + 18 + 126 + + + + + 1968.8 + + + + 18 + 126 + + + + + 1968.8 + + + + 18 + 127 + + + + + 1968.8 + + + + 18 + 127 + + + + + 1968.6 + + + + 18 + 127 + + + + + 1968.6 + + + + 18 + 127 + + + + + 1968.6 + + + + 18 + 127 + + + + + 1968.6 + + + + 18 + 128 + + + + + 1968.6 + + + + 18 + 128 + + + + + 1968.4 + + + + 18 + 128 + + + + + 1968.2 + + + + 18 + 128 + + + + + 1968.2 + + + + 18 + 129 + + + + + 1968.2 + + + + 18 + 128 + + + + + 1968.0 + + + + 18 + 128 + + + + + 1968.0 + + + + 18 + 128 + + + + + 1967.8 + + + + 18 + 128 + + + + + 1967.8 + + + + 18 + 126 + + + + + 1967.6 + + + + 18 + 125 + + + + + 1967.6 + + + + 18 + 124 + + + + + 1967.4 + + + + 18 + 123 + + + + + 1967.4 + + + + 18 + 122 + + + + + 1967.2 + + + + 18 + 121 + + + + + 1967.2 + + + + 18 + 121 + + + + + 1967.2 + + + + 18 + 120 + + + + + 1966.8 + + + + 18 + 120 + + + + + 1966.8 + + + + 18 + 120 + + + + + 1966.6 + + + + 18 + 121 + + + + + 1966.6 + + + + 18 + 121 + + + + + 1966.6 + + + + 18 + 122 + + + + + 1966.6 + + + + 18 + 123 + + + + + 1966.6 + + + + 18 + 123 + + + + + 1966.6 + + + + 18 + 123 + + + + + 1966.6 + + + + 18 + 123 + + + + + 1966.4 + + + + 18 + 122 + + + + + 1966.4 + + + + 18 + 121 + + + + + 1966.4 + + + + 18 + 121 + + + + + 1966.4 + + + + 18 + 121 + + + + + 1966.4 + + + + 18 + 121 + + + + + 1966.4 + + + + 18 + 120 + + + + + 1966.4 + + + + 18 + 120 + + + + + 1966.2 + + + + 18 + 120 + + + + + 1966.2 + + + + 18 + 120 + + + + + 1966.2 + + + + 18 + 119 + + + + + 1966.2 + + + + 18 + 119 + + + + + 1966.2 + + + + 18 + 119 + + + + + 1966.0 + + + + 18 + 118 + + + + + 1966.0 + + + + 18 + 117 + + + + + 1965.8 + + + + 18 + 117 + + + + + 1965.8 + + + + 18 + 118 + + + + + 1965.6 + + + + 18 + 117 + + + + + 1965.6 + + + + 18 + 117 + + + + + 1965.4 + + + + 18 + 117 + + + + + 1965.4 + + + + 18 + 117 + + + + + 1965.4 + + + + 18 + 116 + + + + + 1965.2 + + + + 18 + 116 + + + + + 1965.2 + + + + 18 + 116 + + + + + 1965.2 + + + + 18 + 117 + + + + + 1965.2 + + + + 18 + 118 + + + + + 1965.0 + + + + 18 + 119 + + + + + 1965.0 + + + + 18 + 120 + + + + + 1965.0 + + + + 18 + 122 + + + + + 1965.0 + + + + 18 + 123 + + + + + 1965.0 + + + + 18 + 125 + + + + + 1964.8 + + + + 18 + 126 + + + + + 1964.8 + + + + 18 + 127 + + + + + 1964.8 + + + + 18 + 128 + + + + + 1964.6 + + + + 18 + 128 + + + + + 1964.2 + + + + 18 + 127 + + + + + 1964.2 + + + + 18 + 127 + + + + + 1964.2 + + + + 18 + 127 + + + + + 1964.0 + + + + 18 + 127 + + + + + 1964.0 + + + + 18 + 127 + + + + + 1964.0 + + + + 18 + 127 + + + + + 1964.0 + + + + 18 + 127 + + + + + 1964.0 + + + + 18 + 127 + + + + + 1964.0 + + + + 18 + 127 + + + + + 1964.0 + + + + 18 + 128 + + + + + 1963.8 + + + + 18 + 129 + + + + + 1963.8 + + + + 18 + 130 + + + + + 1963.8 + + + + 18 + 130 + + + + + 1963.8 + + + + 18 + 130 + + + + + 1963.8 + + + + 18 + 131 + + + + + 1963.6 + + + + 18 + 131 + + + + + 1963.6 + + + + 18 + 130 + + + + + 1963.4 + + + + 18 + 131 + + + + + 1963.4 + + + + 18 + 131 + + + + + 1963.2 + + + + 18 + 131 + + + + + 1963.2 + + + + 18 + 131 + + + + + 1963.0 + + + + 18 + 131 + + + + + 1963.0 + + + + 18 + 131 + + + + + 1963.0 + + + + 18 + 131 + + + + + 1963.0 + + + + 18 + 130 + + + + + 1962.8 + + + + 18 + 129 + + + + + 1962.8 + + + + 18 + 128 + + + + + 1962.8 + + + + 18 + 127 + + + + + 1962.6 + + + + 18 + 126 + + + + + 1962.6 + + + + 18 + 126 + + + + + 1962.6 + + + + 18 + 125 + + + + + 1962.4 + + + + 18 + 126 + + + + + 1962.4 + + + + 18 + 126 + + + + + 1962.4 + + + + 18 + 126 + + + + + 1962.4 + + + + 18 + 126 + + + + + 1962.4 + + + + 18 + 126 + + + + + 1962.4 + + + + 18 + 126 + + + + + 1962.4 + + + + 18 + 126 + + + + + 1962.4 + + + + 18 + 127 + + + + + 1962.4 + + + + 18 + 127 + + + + + 1962.2 + + + + 18 + 127 + + + + + 1962.2 + + + + 18 + 127 + + + + + 1962.2 + + + + 18 + 127 + + + + + 1962.2 + + + + 18 + 127 + + + + + 1962.2 + + + + 18 + 127 + + + + + 1962.0 + + + + 18 + 126 + + + + + 1962.0 + + + + 18 + 125 + + + + + 1962.0 + + + + 18 + 125 + + + + + 1962.0 + + + + 18 + 125 + + + + + 1961.8 + + + + 18 + 125 + + + + + 1961.8 + + + + 19 + 125 + + + + + 1961.8 + + + + 19 + 124 + + + + + 1961.6 + + + + 19 + 124 + + + + + 1961.6 + + + + 19 + 124 + + + + + 1961.6 + + + + 19 + 124 + + + + + 1961.6 + + + + 19 + 123 + + + + + 1961.6 + + + + 19 + 123 + + + + + 1961.6 + + + + 19 + 123 + + + + + 1961.6 + + + + 19 + 123 + + + + + 1961.6 + + + + 19 + 123 + + + + + 1961.6 + + + + 19 + 122 + + + + + 1961.6 + + + + 19 + 122 + + + + + 1961.6 + + + + 19 + 120 + + + + + 1961.4 + + + + 19 + 119 + + + + + 1961.4 + + + + 19 + 118 + + + + + 1961.4 + + + + 19 + 117 + + + + + 1961.4 + + + + 19 + 117 + + + + + 1961.2 + + + + 19 + 117 + + + + + 1961.0 + + + + 19 + 117 + + + + + 1961.0 + + + + 19 + 117 + + + + + 1960.8 + + + + 19 + 117 + + + + + 1960.8 + + + + 19 + 117 + + + + + 1960.6 + + + + 19 + 116 + + + + + 1960.8 + + + + 19 + 116 + + + + + 1960.6 + + + + 19 + 115 + + + + + 1960.6 + + + + 19 + 114 + + + + + 1960.6 + + + + 19 + 113 + + + + + 1960.4 + + + + 19 + 112 + + + + + 1960.2 + + + + 19 + 112 + + + + + 1960.0 + + + + 19 + 113 + + + + + 1960.0 + + + + 19 + 114 + + + + + 1959.8 + + + + 19 + 115 + + + + + 1959.8 + + + + 19 + 116 + + + + + 1959.8 + + + + 19 + 116 + + + + + 1959.8 + + + + 19 + 117 + + + + + 1959.8 + + + + 19 + 117 + + + + + 1960.0 + + + + 19 + 115 + + + + + 1959.8 + + + + 19 + 114 + + + + + 1959.8 + + + + 19 + 114 + + + + + 1959.8 + + + + 19 + 113 + + + + + 1959.8 + + + + 19 + 111 + + + + + 1959.8 + + + + 19 + 110 + + + + + 1959.8 + + + + 19 + 110 + + + + + 1959.8 + + + + 19 + 110 + + + + + 1959.8 + + + + 19 + 110 + + + + + 1959.6 + + + + 19 + 110 + + + + + 1959.4 + + + + 19 + 109 + + + + + 1959.2 + + + + 19 + 108 + + + + + 1959.0 + + + + 19 + 108 + + + + + 1959.0 + + + + 19 + 108 + + + + + 1958.8 + + + + 19 + 107 + + + + + 1958.8 + + + + 19 + 107 + + + + + 1958.8 + + + + 19 + 107 + + + + + 1958.8 + + + + 19 + 107 + + + + + 1958.6 + + + + 19 + 107 + + + + + 1958.6 + + + + 19 + 107 + + + + + 1958.6 + + + + 19 + 107 + + + + + 1958.4 + + + + 19 + 106 + + + + + 1958.0 + + + + 19 + 106 + + + + + 1958.0 + + + + 19 + 106 + + + + + 1957.8 + + + + 19 + 107 + + + + + 1957.4 + + + + 19 + 108 + + + + + 1957.0 + + + + 19 + 109 + + + + + 1956.4 + + + + 19 + 111 + + + + + 1955.6 + + + + 19 + 112 + + + + + 1954.6 + + + + 19 + 112 + + + + + 1953.8 + + + + 19 + 113 + + + + + 1953.2 + + + + 19 + 115 + + + + + 1952.2 + + + + 19 + 115 + + + + + 1951.6 + + + + 19 + 115 + + + + + 1951.2 + + + + 19 + 113 + + + + + 1950.8 + + + + 19 + 111 + + + + + 1950.4 + + + + 19 + 111 + + + + + 1949.6 + + + + 19 + 110 + + + + + 1948.8 + + + + 19 + 111 + + + + + 1948.0 + + + + 19 + 111 + + + + + 1947.2 + + + + 19 + 112 + + + + + 1946.4 + + + + 18 + 113 + + + + + 1945.6 + + + + 18 + 114 + + + + + 1945.0 + + + + 18 + 114 + + + + + 1944.6 + + + + 18 + 115 + + + + + 1944.0 + + + + 18 + 116 + + + + + 1943.2 + + + + 18 + 117 + + + + + 1941.8 + + + + 18 + 118 + + + + + 1941.0 + + + + 18 + 117 + + + + + 1940.4 + + + + 18 + 117 + + + + + 1939.8 + + + + 18 + 116 + + + + + 1939.6 + + + + 18 + 115 + + + + + 1939.2 + + + + 18 + 114 + + + + + 1938.8 + + + + 18 + 115 + + + + + 1938.0 + + + + 18 + 115 + + + + + 1936.6 + + + + 18 + 115 + + + + + 1936.0 + + + + 18 + 115 + + + + + 1935.6 + + + + 18 + 116 + + + + + 1935.2 + + + + 18 + 117 + + + + + 1934.6 + + + + 18 + 118 + + + + + 1934.0 + + + + 18 + 119 + + + + + 1933.4 + + + + 18 + 119 + + + + + 1933.0 + + + + 18 + 118 + + + + + 1932.6 + + + + 18 + 118 + + + + + 1931.8 + + + + 18 + 117 + + + + + 1931.0 + + + + 18 + 116 + + + + + 1930.2 + + + + 18 + 116 + + + + + 1929.4 + + + + 18 + 115 + + + + + 1929.0 + + + + 18 + 115 + + + + + 1928.8 + + + + 18 + 116 + + + + + 1928.0 + + + + 18 + 116 + + + + + 1927.2 + + + + 18 + 117 + + + + + 1926.2 + + + + 18 + 118 + + + + + 1925.6 + + + + 18 + 118 + + + + + 1925.0 + + + + 18 + 119 + + + + + 1924.0 + + + + 18 + 120 + + + + + 1923.2 + + + + 18 + 121 + + + + + 1922.4 + + + + 18 + 122 + + + + + 1921.6 + + + + 18 + 123 + + + + + 1921.0 + + + + 18 + 124 + + + + + 1920.6 + + + + 18 + 124 + + + + + 1920.2 + + + + 18 + 125 + + + + + 1919.8 + + + + 18 + 125 + + + + + 1919.2 + + + + 18 + 126 + + + + + 1918.0 + + + + 18 + 126 + + + + + 1917.4 + + + + 18 + 127 + + + + + 1916.4 + + + + 18 + 127 + + + + + 1916.0 + + + + 18 + 126 + + + + + 1915.0 + + + + 18 + 126 + + + + + 1914.6 + + + + 18 + 125 + + + + + 1914.2 + + + + 18 + 125 + + + + + 1913.8 + + + + 18 + 124 + + + + + 1913.0 + + + + 18 + 124 + + + + + 1912.0 + + + + 18 + 124 + + + + + 1910.8 + + + + 18 + 124 + + + + + 1910.0 + + + + 18 + 124 + + + + + 1909.2 + + + + 18 + 125 + + + + + 1908.4 + + + + 18 + 125 + + + + + 1907.8 + + + + 18 + 125 + + + + + 1907.4 + + + + 18 + 126 + + + + + 1907.0 + + + + 18 + 126 + + + + + 1906.4 + + + + 18 + 126 + + + + + 1905.8 + + + + 18 + 126 + + + + + 1905.2 + + + + 18 + 126 + + + + + 1904.2 + + + + 18 + 126 + + + + + 1903.4 + + + + 18 + 126 + + + + + 1902.8 + + + + 18 + 126 + + + + + 1901.8 + + + + 18 + 126 + + + + + 1901.0 + + + + 18 + 126 + + + + + 1900.0 + + + + 18 + 126 + + + + + 1899.0 + + + + 18 + 127 + + + + + 1898.4 + + + + 18 + 127 + + + + + 1897.0 + + + + 18 + 128 + + + + + 1896.2 + + + + 18 + 128 + + + + + 1895.0 + + + + 18 + 127 + + + + + 1894.4 + + + + 18 + 126 + + + + + 1893.8 + + + + 18 + 125 + + + + + 1893.2 + + + + 18 + 124 + + + + + 1892.2 + + + + 18 + 123 + + + + + 1891.6 + + + + 18 + 123 + + + + + 1891.0 + + + + 18 + 122 + + + + + 1889.4 + + + + 18 + 122 + + + + + 1888.8 + + + + 18 + 123 + + + + + 1888.4 + + + + 18 + 123 + + + + + 1887.8 + + + + 18 + 123 + + + + + 1886.8 + + + + 18 + 123 + + + + + 1885.4 + + + + 18 + 123 + + + + + 1884.8 + + + + 18 + 123 + + + + + 1884.2 + + + + 18 + 122 + + + + + 1883.6 + + + + 18 + 122 + + + + + 1883.2 + + + + 18 + 122 + + + + + 1882.4 + + + + 18 + 123 + + + + + 1881.6 + + + + 18 + 123 + + + + + 1880.6 + + + + 18 + 124 + + + + + 1880.0 + + + + 18 + 123 + + + + + 1879.6 + + + + 18 + 122 + + + + + 1879.4 + + + + 18 + 122 + + + + + 1879.0 + + + + 18 + 122 + + + + + 1878.6 + + + + 18 + 122 + + + + + 1877.6 + + + + 18 + 122 + + + + + 1876.4 + + + + 18 + 122 + + + + + 1875.6 + + + + 18 + 122 + + + + + 1875.0 + + + + 18 + 122 + + + + + 1874.6 + + + + 18 + 122 + + + + + 1874.2 + + + + 18 + 121 + + + + + 1873.8 + + + + 18 + 122 + + + + + 1873.2 + + + + 18 + 122 + + + + + 1872.4 + + + + 18 + 122 + + + + + 1871.6 + + + + 18 + 123 + + + + + 1871.0 + + + + 18 + 123 + + + + + 1870.4 + + + + 18 + 123 + + + + + 1869.4 + + + + 18 + 123 + + + + + 1868.4 + + + + 18 + 123 + + + + + 1867.8 + + + + 18 + 124 + + + + + 1866.8 + + + + 18 + 124 + + + + + 1863.6 + + + + 18 + 124 + + + + + 1862.6 + + + + 18 + 124 + + + + + 1861.8 + + + + 18 + 124 + + + + + 1861.0 + + + + 18 + 123 + + + + + 1860.0 + + + + 18 + 122 + + + + + 1859.2 + + + + 18 + 121 + + + + + 1858.2 + + + + 18 + 121 + + + + + 1857.6 + + + + 18 + 121 + + + + + 1856.6 + + + + 18 + 121 + + + + + 1855.4 + + + + 18 + 122 + + + + + 1853.6 + + + + 18 + 122 + + + + + 1852.0 + + + + 17 + 123 + + + + + 1850.6 + + + + 17 + 124 + + + + + 1849.2 + + + + 17 + 124 + + + + + 1848.0 + + + + 17 + 125 + + + + + 1847.0 + + + + 17 + 126 + + + + + 1846.2 + + + + 17 + 126 + + + + + 1845.2 + + + + 17 + 127 + + + + + 1844.2 + + + + 17 + 127 + + + + + 1843.0 + + + + 17 + 128 + + + + + 1842.2 + + + + 17 + 128 + + + + + 1841.8 + + + + 17 + 128 + + + + + 1841.2 + + + + 17 + 129 + + + + + 1840.2 + + + + 17 + 128 + + + + + 1839.4 + + + + 17 + 129 + + + + + 1838.4 + + + + 17 + 129 + + + + + 1837.6 + + + + 17 + 128 + + + + + 1836.6 + + + + 17 + 127 + + + + + 1836.0 + + + + 17 + 126 + + + + + 1835.4 + + + + 17 + 126 + + + + + 1834.4 + + + + 17 + 127 + + + + + 1833.2 + + + + 17 + 126 + + + + + 1832.0 + + + + 17 + 126 + + + + + 1824.6 + + + + 17 + 122 + + + + + 1824.6 + + + + 17 + 123 + + + + + 1824.2 + + + + 17 + 124 + + + + + 1823.6 + + + + 17 + 124 + + + + + 1822.8 + + + + 17 + 122 + + + + + 1822.6 + + + + 17 + 122 + + + + + 1822.4 + + + + 17 + 120 + + + + + 1822.2 + + + + 17 + 119 + + + + + 1822.0 + + + + 17 + 118 + + + + + 1821.8 + + + + 17 + 118 + + + + + 1821.4 + + + + 17 + 118 + + + + + 1821.0 + + + + 17 + 117 + + + + + 1820.6 + + + + 17 + 115 + + + + + 1820.2 + + + + 17 + 113 + + + + + 1819.8 + + + + 17 + 113 + + + + + 1819.4 + + + + 17 + 112 + + + + + 1818.8 + + + + 17 + 112 + + + + + 1818.0 + + + + 17 + 112 + + + + + 1817.8 + + + + 17 + 112 + + + + + 1817.2 + + + + 17 + 113 + + + + + 1816.6 + + + + 17 + 114 + + + + + 1816.0 + + + + 17 + 115 + + + + + 1815.4 + + + + 17 + 117 + + + + + 1815.0 + + + + 17 + 119 + + + + + 1814.6 + + + + 17 + 121 + + + + + 1813.8 + + + + 17 + 123 + + + + + 1813.0 + + + + 17 + 124 + + + + + 1812.0 + + + + 17 + 125 + + + + + 1810.8 + + + + 17 + 126 + + + + + 1810.0 + + + + 17 + 127 + + + + + 1809.2 + + + + 17 + 128 + + + + + 1808.4 + + + + 17 + 129 + + + + + 1807.6 + + + + 17 + 129 + + + + + 1807.0 + + + + 17 + 130 + + + + + 1806.2 + + + + 17 + 130 + + + + + 1805.6 + + + + 17 + 131 + + + + + 1804.4 + + + + 17 + 132 + + + + + 1803.4 + + + + 17 + 131 + + + + + 1802.0 + + + + 17 + 130 + + + + + 1801.4 + + + + 17 + 129 + + + + + 1801.0 + + + + 17 + 127 + + + + + 1800.8 + + + + 17 + 126 + + + + + 1800.4 + + + + 17 + 125 + + + + + 1800.0 + + + + 17 + 125 + + + + + 1799.6 + + + + 17 + 124 + + + + + 1799.4 + + + + 17 + 124 + + + + + 1799.4 + + + + 17 + 123 + + + + + 1799.0 + + + + 17 + 123 + + + + + 1799.0 + + + + 17 + 121 + + + + + 1799.0 + + + + 17 + 120 + + + + + 1799.0 + + + + 17 + 120 + + + + + 1799.0 + + + + 17 + 119 + + + + + 1799.0 + + + + 17 + 118 + + + + + 1799.0 + + + + 17 + 119 + + + + + 1799.0 + + + + 17 + 119 + + + + + 1799.0 + + + + 17 + 119 + + + + + 1799.0 + + + + 17 + 118 + + + + + 1799.0 + + + + 17 + 116 + + + + + 1799.0 + + + + 17 + 116 + + + + + 1798.8 + + + + 17 + 116 + + + + + 1798.8 + + + + 17 + 116 + + + + + 1798.8 + + + + 17 + 115 + + + + + 1798.8 + + + + 17 + 115 + + + + + 1798.8 + + + + 17 + 115 + + + + + 1798.6 + + + + 17 + 115 + + + + + 1798.4 + + + + 17 + 117 + + + + + 1798.4 + + + + 17 + 116 + + + + + 1798.4 + + + + 17 + 116 + + + + + 1798.4 + + + + 17 + 117 + + + + + 1798.4 + + + + 17 + 117 + + + + + 1798.4 + + + + 17 + 117 + + + + + 1798.6 + + + + 17 + 118 + + + + + 1798.6 + + + + 17 + 118 + + + + + 1798.6 + + + + 17 + 119 + + + + + 1798.6 + + + + 17 + 120 + + + + + 1798.6 + + + + 17 + 121 + + + + + 1798.6 + + + + 17 + 122 + + + + + 1798.6 + + + + 17 + 123 + + + + + 1798.6 + + + + 17 + 124 + + + + + 1798.6 + + + + 17 + 125 + + + + + 1798.4 + + + + 17 + 127 + + + + + 1798.0 + + + + 17 + 126 + + + + + 1797.8 + + + + 17 + 125 + + + + + 1797.6 + + + + 17 + 125 + + + + + 1797.2 + + + + 17 + 124 + + + + + 1796.8 + + + + 17 + 124 + + + + + 1796.4 + + + + 17 + 124 + + + + + 1796.0 + + + + 17 + 124 + + + + + 1795.2 + + + + 17 + 124 + + + + + 1794.4 + + + + 17 + 125 + + + + + 1793.6 + + + + 17 + 125 + + + + + 1793.2 + + + + 17 + 127 + + + + + 1790.2 + + + + 17 + 117 + + + + + 1790.2 + + + + 17 + 117 + + + + + 1790.2 + + + + 17 + 117 + + + + + 1789.8 + + + + 17 + 117 + + + + + 1789.6 + + + + 17 + 118 + + + + + 1789.0 + + + + 17 + 118 + + + + + 1788.4 + + + + 17 + 118 + + + + + 1787.6 + + + + 17 + 118 + + + + + 1787.0 + + + + 17 + 119 + + + + + 1786.4 + + + + 17 + 120 + + + + + 1785.6 + + + + 17 + 121 + + + + + 1784.8 + + + + 17 + 123 + + + + + 1783.6 + + + + 17 + 124 + + + + + 1783.0 + + + + 17 + 125 + + + + + 1782.6 + + + + 17 + 125 + + + + + 1782.4 + + + + 17 + 125 + + + + + 1782.4 + + + + 17 + 125 + + + + + 1782.2 + + + + 17 + 125 + + + + + 1782.2 + + + + 17 + 125 + + + + + 1782.0 + + + + 17 + 124 + + + + + 1782.0 + + + + 17 + 123 + + + + + 1782.0 + + + + 17 + 122 + + + + + 1781.8 + + + + 17 + 121 + + + + + 1781.8 + + + + 17 + 120 + + + + + 1781.6 + + + + 17 + 119 + + + + + 1781.6 + + + + 17 + 119 + + + + + 1781.6 + + + + 17 + 119 + + + + + 1781.4 + + + + 17 + 118 + + + + + 1781.4 + + + + 17 + 119 + + + + + 1781.4 + + + + 17 + 118 + + + + + 1781.2 + + + + 17 + 118 + + + + + 1781.2 + + + + 17 + 117 + + + + + 1781.2 + + + + 17 + 117 + + + + + 1781.0 + + + + 17 + 116 + + + + + 1781.0 + + + + 17 + 117 + + + + + 1781.0 + + + + 17 + 117 + + + + + 1780.8 + + + + 17 + 118 + + + + + 1780.8 + + + + 17 + 117 + + + + + 1780.8 + + + + 17 + 117 + + + + + 1780.6 + + + + 17 + 115 + + + + + 1780.4 + + + + 17 + 114 + + + + + 1780.0 + + + + 17 + 113 + + + + + 1779.8 + + + + 17 + 112 + + + + + 1779.6 + + + + 17 + 113 + + + + + 1779.0 + + + + 17 + 112 + + + + + 1778.6 + + + + 17 + 112 + + + + + 1778.0 + + + + 17 + 110 + + + + + 1777.2 + + + + 17 + 109 + + + + + 1776.2 + + + + 17 + 108 + + + + + 1775.0 + + + + 17 + 108 + + + + + 1774.0 + + + + 17 + 107 + + + + + 1771.8 + + + + 17 + 106 + + + + + 1770.8 + + + + 17 + 106 + + + + + 1770.0 + + + + 17 + 105 + + + + + 1769.0 + + + + 17 + 104 + + + + + 1768.2 + + + + 17 + 103 + + + + + 1766.6 + + + + 18 + 103 + + + + + 1765.0 + + + + 18 + 102 + + + + + 1763.8 + + + + 18 + 101 + + + + + 1763.0 + + + + 18 + 101 + + + + + 1762.6 + + + + 18 + 101 + + + + + 1762.4 + + + + 18 + 101 + + + + + 1762.4 + + + + 18 + 101 + + + + + 1762.2 + + + + 18 + 102 + + + + + 1762.0 + + + + 18 + 104 + + + + + 1762.0 + + + + 18 + 104 + + + + + 1761.8 + + + + 18 + 104 + + + + + 1761.6 + + + + 18 + 102 + + + + + 1761.2 + + + + 18 + 101 + + + + + 1760.6 + + + + 18 + 99 + + + + + 1760.0 + + + + 18 + 97 + + + + + 1759.4 + + + + 18 + 96 + + + + + 1758.8 + + + + 18 + 95 + + + + + 1758.0 + + + + 18 + 95 + + + + + 1757.4 + + + + 18 + 95 + + + + + 1756.2 + + + + 18 + 96 + + + + + 1755.4 + + + + 18 + 96 + + + + + 1754.4 + + + + 18 + 97 + + + + + 1753.4 + + + + 18 + 98 + + + + + 1752.4 + + + + 18 + 98 + + + + + 1751.4 + + + + 18 + 97 + + + + + 1750.6 + + + + 18 + 97 + + + + + 1749.8 + + + + 18 + 97 + + + + + 1749.0 + + + + 18 + 97 + + + + + 1747.6 + + + + 18 + 98 + + + + + 1747.4 + + + + 18 + 99 + + + + + 1747.0 + + + + 18 + 100 + + + + + 1746.8 + + + + 18 + 102 + + + + + 1746.6 + + + + 18 + 103 + + + + + 1746.4 + + + + 18 + 103 + + + + + 1745.8 + + + + 18 + 102 + + + + + 1744.6 + + + + 18 + 101 + + + + + 1743.4 + + + + 18 + 100 + + + + + 1742.6 + + + + 18 + 100 + + + + + 1741.4 + + + + 18 + 100 + + + + + 1740.0 + + + + 18 + 99 + + + + + 1738.6 + + + + 18 + 99 + + + + + 1736.8 + + + + 18 + 99 + + + + + 1735.6 + + + + 18 + 100 + + + + + 1734.8 + + + + 18 + 101 + + + + + 1733.4 + + + + 18 + 103 + + + + + 1731.4 + + + + 18 + 109 + + + + + 1731.2 + + + + 18 + 111 + + + + + 1731.0 + + + + 18 + 111 + + + + + 1731.0 + + + + 18 + 111 + + + + + 1731.0 + + + + 18 + 112 + + + + + 1731.0 + + + + 18 + 111 + + + + + 1731.0 + + + + 18 + 111 + + + + + 1730.8 + + + + 18 + 110 + + + + + 1730.8 + + + + 18 + 110 + + + + + 1730.8 + + + + 18 + 110 + + + + + 1730.4 + + + + 18 + 110 + + + + + 1730.0 + + + + 18 + 110 + + + + + 1729.4 + + + + 18 + 110 + + + + + 1729.0 + + + + 18 + 111 + + + + + 1728.4 + + + + 18 + 112 + + + + + 1727.6 + + + + 18 + 113 + + + + + 1727.0 + + + + 18 + 115 + + + + + 1726.2 + + + + 18 + 116 + + + + + 1725.6 + + + + 18 + 117 + + + + + 1724.2 + + + + 18 + 119 + + + + + 1723.0 + + + + 18 + 120 + + + + + 1722.0 + + + + 18 + 120 + + + + + 1721.2 + + + + 18 + 120 + + + + + 1720.4 + + + + 18 + 121 + + + + + 1719.6 + + + + 18 + 120 + + + + + 1718.4 + + + + 18 + 120 + + + + + 1717.4 + + + + 18 + 119 + + + + + 1716.6 + + + + 18 + 117 + + + + + 1715.8 + + + + 18 + 116 + + + + + 1715.2 + + + + 18 + 115 + + + + + 1714.8 + + + + 18 + 114 + + + + + 1714.2 + + + + 18 + 112 + + + + + 1713.8 + + + + 18 + 111 + + + + + 1713.4 + + + + 18 + 111 + + + + + 1712.6 + + + + 18 + 110 + + + + + 1712.0 + + + + 18 + 111 + + + + + 1711.4 + + + + 18 + 111 + + + + + 1710.4 + + + + 18 + 112 + + + + + 1709.4 + + + + 18 + 112 + + + + + 1708.6 + + + + 18 + 113 + + + + + 1707.8 + + + + 18 + 114 + + + + + 1707.2 + + + + 18 + 115 + + + + + 1706.8 + + + + 18 + 115 + + + + + 1706.4 + + + + 18 + 115 + + + + + 1706.2 + + + + 18 + 115 + + + + + 1706.0 + + + + 18 + 115 + + + + + 1705.8 + + + + 18 + 115 + + + + + 1705.4 + + + + 18 + 115 + + + + + 1704.8 + + + + 18 + 115 + + + + + 1704.2 + + + + 18 + 116 + + + + + 1703.8 + + + + 18 + 116 + + + + + 1702.8 + + + + 18 + 117 + + + + + 1701.6 + + + + 18 + 118 + + + + + 1701.0 + + + + 18 + 120 + + + + + 1700.0 + + + + 18 + 121 + + + + + 1699.6 + + + + 18 + 122 + + + + + 1698.8 + + + + 18 + 123 + + + + + 1697.8 + + + + 18 + 124 + + + + + 1696.6 + + + + 18 + 125 + + + + + 1696.2 + + + + 18 + 126 + + + + + 1695.8 + + + + 18 + 125 + + + + + 1695.6 + + + + 18 + 125 + + + + + 1695.6 + + + + 18 + 124 + + + + + 1695.4 + + + + 18 + 124 + + + + + 1695.2 + + + + 18 + 123 + + + + + 1695.0 + + + + 18 + 122 + + + + + 1694.8 + + + + 18 + 122 + + + + + 1694.8 + + + + 18 + 121 + + + + + 1694.6 + + + + 18 + 121 + + + + + 1694.4 + + + + 18 + 122 + + + + + 1694.4 + + + + 18 + 122 + + + + + 1694.4 + + + + 18 + 123 + + + + + 1694.4 + + + + 18 + 124 + + + + + 1694.4 + + + + 18 + 125 + + + + + 1694.4 + + + + 18 + 127 + + + + + 1694.4 + + + + 18 + 128 + + + + + 1694.4 + + + + 18 + 130 + + + + + 1694.4 + + + + 18 + 132 + + + + + 1694.6 + + + + 18 + 133 + + + + + 1695.0 + + + + 18 + 134 + + + + + 1695.2 + + + + 18 + 136 + + + + + 1695.6 + + + + 18 + 137 + + + + + 1695.6 + + + + 18 + 138 + + + + + 1695.8 + + + + 18 + 140 + + + + + 1695.8 + + + + 18 + 141 + + + + + 1696.0 + + + + 18 + 142 + + + + + 1696.2 + + + + 18 + 143 + + + + + 1696.2 + + + + 18 + 144 + + + + + 1696.4 + + + + 18 + 145 + + + + + 1696.4 + + + + 18 + 145 + + + + + 1696.4 + + + + 18 + 145 + + + + + 1696.4 + + + + 18 + 145 + + + + + 1696.4 + + + + 18 + 145 + + + + + 1696.4 + + + + 18 + 144 + + + + + 1696.4 + + + + 18 + 144 + + + + + 1696.4 + + + + 18 + 143 + + + + + 1696.4 + + + + 18 + 143 + + + + + 1696.0 + + + + 18 + 143 + + + + + 1695.8 + + + + 18 + 142 + + + + + 1695.4 + + + + 18 + 142 + + + + + 1694.8 + + + + 18 + 142 + + + + + 1693.8 + + + + 18 + 142 + + + + + 1693.0 + + + + 18 + 141 + + + + + 1692.4 + + + + 18 + 141 + + + + + 1692.2 + + + + 18 + 141 + + + + + 1691.2 + + + + 18 + 141 + + + + + 1689.4 + + + + 18 + 141 + + + + + 1688.6 + + + + 18 + 141 + + + + + 1687.8 + + + + 18 + 141 + + + + + 1687.2 + + + + 18 + 140 + + + + + 1687.2 + + + + 18 + 139 + + + + + 1686.6 + + + + 18 + 138 + + + + + 1685.8 + + + + 18 + 137 + + + + + 1685.0 + + + + 18 + 135 + + + + + 1684.2 + + + + 18 + 134 + + + + + 1683.6 + + + + 18 + 133 + + + + + 1683.2 + + + + 18 + 132 + + + + + 1682.6 + + + + 18 + 131 + + + + + 1682.2 + + + + 18 + 130 + + + + + 1681.8 + + + + 18 + 129 + + + + + 1681.2 + + + + 18 + 128 + + + + + 1680.6 + + + + 18 + 128 + + + + + 1679.8 + + + + 18 + 127 + + + + + 1679.2 + + + + 18 + 125 + + + + + 1678.4 + + + + 18 + 125 + + + + + 1677.4 + + + + 18 + 125 + + + + + 1676.6 + + + + 18 + 125 + + + + + 1675.8 + + + + 18 + 124 + + + + + 1675.4 + + + + 18 + 123 + + + + + 1675.2 + + + + 18 + 122 + + + + + 1674.8 + + + + 18 + 121 + + + + + 1674.2 + + + + 18 + 120 + + + + + 1673.6 + + + + 18 + 119 + + + + + 1672.6 + + + + 18 + 118 + + + + + 1672.0 + + + + 18 + 118 + + + + + 1671.4 + + + + 18 + 117 + + + + + 1671.0 + + + + 18 + 117 + + + + + 1670.6 + + + + 18 + 117 + + + + + 1669.8 + + + + 18 + 117 + + + + + 1669.4 + + + + 18 + 118 + + + + + 1669.0 + + + + 18 + 119 + + + + + 1668.6 + + + + 18 + 120 + + + + + 1668.4 + + + + 18 + 120 + + + + + 1668.0 + + + + 18 + 121 + + + + + 1667.2 + + + + 18 + 121 + + + + + 1666.8 + + + + 18 + 121 + + + + + 1666.4 + + + + 18 + 121 + + + + + 1665.4 + + + + 18 + 121 + + + + + 1664.6 + + + + 18 + 120 + + + + + 1664.0 + + + + 18 + 120 + + + + + 1663.6 + + + + 18 + 120 + + + + + 1662.6 + + + + 18 + 119 + + + + + 1661.6 + + + + 18 + 118 + + + + + 1660.8 + + + + 18 + 116 + + + + + 1660.0 + + + + 18 + 116 + + + + + 1659.4 + + + + 18 + 115 + + + + + 1659.0 + + + + 18 + 115 + + + + + 1658.8 + + + + 18 + 113 + + + + + 1658.8 + + + + 18 + 112 + + + + + 1658.6 + + + + 18 + 112 + + + + + 1658.6 + + + + 18 + 111 + + + + + 1658.6 + + + + 18 + 111 + + + + + 1658.6 + + + + 18 + 111 + + + + + 1658.6 + + + + 18 + 111 + + + + + 1658.6 + + + + 18 + 112 + + + + + 1658.6 + + + + 18 + 114 + + + + + 1658.6 + + + + 18 + 116 + + + + + 1658.6 + + + + 18 + 118 + + + + + 1658.6 + + + + 18 + 119 + + + + + 1658.6 + + + + 18 + 120 + + + + + 1658.6 + + + + 18 + 121 + + + + + 1658.6 + + + + 18 + 122 + + + + + 1658.6 + + + + 18 + 123 + + + + + 1658.4 + + + + 18 + 123 + + + + + 1658.4 + + + + 18 + 123 + + + + + 1658.4 + + + + 18 + 123 + + + + + 1658.2 + + + + 18 + 123 + + + + + 1658.2 + + + + 18 + 123 + + + + + 1658.0 + + + + 18 + 122 + + + + + 1657.8 + + + + 18 + 121 + + + + + 1657.4 + + + + 18 + 121 + + + + + 1657.2 + + + + 18 + 121 + + + + + 1657.0 + + + + 18 + 121 + + + + + 1656.6 + + + + 18 + 120 + + + + + 1656.4 + + + + 18 + 120 + + + + + 1656.2 + + + + 18 + 119 + + + + + 1656.0 + + + + 18 + 118 + + + + + 1655.4 + + + + 18 + 116 + + + + + 1654.8 + + + + 18 + 115 + + + + + 1654.0 + + + + 18 + 114 + + + + + 1653.0 + + + + 18 + 115 + + + + + 1651.8 + + + + 18 + 115 + + + + + 1650.8 + + + + 18 + 115 + + + + + 1650.2 + + + + 18 + 115 + + + + + 1650.0 + + + + 18 + 115 + + + + + 1649.8 + + + + 18 + 114 + + + + + 1649.8 + + + + 18 + 114 + + + + + 1649.8 + + + + 18 + 114 + + + + + 1649.8 + + + + 18 + 115 + + + + + 1649.8 + + + + 18 + 115 + + + + + 1649.8 + + + + 18 + 115 + + + + + 1649.8 + + + + 18 + 115 + + + + + 1649.8 + + + + 18 + 116 + + + + + 1650.0 + + + + 18 + 116 + + + + + 1650.2 + + + + 18 + 116 + + + + + 1650.2 + + + + 18 + 116 + + + + + 1650.2 + + + + 18 + 116 + + + + + 1650.2 + + + + 18 + 116 + + + + + 1650.2 + + + + 18 + 114 + + + + + 1650.2 + + + + 18 + 113 + + + + + 1650.2 + + + + 18 + 113 + + + + + 1650.2 + + + + 18 + 112 + + + + + 1650.2 + + + + 18 + 111 + + + + + 1650.2 + + + + 18 + 109 + + + + + 1650.2 + + + + 18 + 108 + + + + + 1650.2 + + + + 18 + 106 + + + + + 1650.0 + + + + 18 + 104 + + + + + 1650.0 + + + + 18 + 102 + + + + + 1649.8 + + + + 18 + 100 + + + + + 1649.4 + + + + 18 + 99 + + + + + 1648.8 + + + + 18 + 97 + + + + + 1648.4 + + + + 18 + 97 + + + + + 1648.0 + + + + 18 + 97 + + + + + 1647.8 + + + + 18 + 97 + + + + + 1647.2 + + + + 18 + 97 + + + + + 1646.6 + + + + 18 + 98 + + + + + 1646.2 + + + + 18 + 98 + + + + + 1645.8 + + + + 18 + 98 + + + + + 1645.4 + + + + 18 + 97 + + + + + 1644.8 + + + + 18 + 96 + + + + + 1644.2 + + + + 18 + 93 + + + + + 1644.0 + + + + 18 + 92 + + + + + 1643.8 + + + + 18 + 92 + + + + + 1643.6 + + + + 18 + 91 + + + + + 1643.6 + + + + 18 + 91 + + + + + 1643.2 + + + + 18 + 92 + + + + + 1643.0 + + + + 18 + 94 + + + + + 1642.8 + + + + 18 + 96 + + + + + 1642.6 + + + + 18 + 98 + + + + + 1642.4 + + + + 18 + 98 + + + + + 1642.2 + + + + 18 + 97 + + + + + 1642.2 + + + + 18 + 97 + + + + + 1642.0 + + + + 18 + 97 + + + + + 1641.8 + + + + 18 + 97 + + + + + 1641.6 + + + + 18 + 97 + + + + + 1641.2 + + + + 18 + 97 + + + + + 1640.8 + + + + 18 + 97 + + + + + 1640.4 + + + + 18 + 96 + + + + + 1640.0 + + + + 18 + 95 + + + + + 1639.6 + + + + 18 + 96 + + + + + 1639.4 + + + + 18 + 96 + + + + + 1639.4 + + + + 18 + 95 + + + + + 1639.2 + + + + 18 + 93 + + + + + 1639.0 + + + + 18 + 91 + + + + + 1638.6 + + + + 18 + 89 + + + + + 1638.2 + + + + 18 + 88 + + + + + 1638.0 + + + + 18 + 89 + + + + + 1638.0 + + + + 18 + 89 + + + + + 1638.0 + + + + 18 + 90 + + + + + 1637.8 + + + + 18 + 91 + + + + + 1637.8 + + + + 18 + 91 + + + + + 1637.8 + + + + 18 + 92 + + + + + 1637.8 + + + + 18 + 93 + + + + + 1637.6 + + + + 18 + 92 + + + + + 1637.6 + + + + 18 + 93 + + + + + 1637.6 + + + + 18 + 93 + + + + + 1637.4 + + + + 18 + 93 + + + + + 1637.4 + + + + 18 + 95 + + + + + 1637.4 + + + + 18 + 96 + + + + + 1637.4 + + + + 18 + 97 + + + + + 1637.2 + + + + 18 + 99 + + + + + 1637.4 + + + + 18 + 100 + + + + + 1637.6 + + + + 18 + 101 + + + + + 1637.6 + + + + 18 + 102 + + + + + 1637.6 + + + + 18 + 102 + + + + + 1637.6 + + + + 18 + 103 + + + + + 1637.6 + + + + 18 + 104 + + + + + 1637.6 + + + + 18 + 106 + + + + + 1637.8 + + + + 18 + 107 + + + + + 1638.0 + + + + 18 + 107 + + + + + 1638.2 + + + + 18 + 109 + + + + + 1638.6 + + + + 18 + 110 + + + + + 1638.8 + + + + 18 + 111 + + + + + 1639.0 + + + + 18 + 112 + + + + + 1639.2 + + + + 18 + 114 + + + + + 1639.2 + + + + 18 + 115 + + + + + 1639.4 + + + + 18 + 116 + + + + + 1639.6 + + + + 18 + 118 + + + + + 1639.6 + + + + 18 + 120 + + + + + 1639.8 + + + + 18 + 121 + + + + + 1640.0 + + + + 18 + 122 + + + + + 1640.2 + + + + 18 + 123 + + + + + 1640.2 + + + + 18 + 124 + + + + + 1640.4 + + + + 18 + 124 + + + + + 1640.4 + + + + 18 + 124 + + + + + 1640.4 + + + + 18 + 125 + + + + + 1640.6 + + + + 18 + 125 + + + + + 1640.6 + + + + 18 + 126 + + + + + 1640.8 + + + + 18 + 126 + + + + + 1641.0 + + + + 18 + 127 + + + + + 1641.4 + + + + 18 + 127 + + + + + 1641.4 + + + + 18 + 127 + + + + + 1641.6 + + + + 18 + 127 + + + + + 1641.6 + + + + 18 + 128 + + + + + 1641.8 + + + + 18 + 129 + + + + + 1641.8 + + + + 18 + 130 + + + + + 1642.0 + + + + 18 + 130 + + + + + 1642.2 + + + + 18 + 131 + + + + + 1642.2 + + + + 18 + 131 + + + + + 1642.4 + + + + 18 + 132 + + + + + 1642.6 + + + + 18 + 132 + + + + + 1642.8 + + + + 18 + 133 + + + + + 1643.0 + + + + 18 + 133 + + + + + 1643.2 + + + + 18 + 133 + + + + + 1643.2 + + + + 18 + 133 + + + + + 1643.2 + + + + 18 + 133 + + + + + 1643.4 + + + + 18 + 133 + + + + + 1643.4 + + + + 18 + 133 + + + + + 1643.4 + + + + 18 + 133 + + + + + 1643.6 + + + + 18 + 133 + + + + + 1643.6 + + + + 18 + 134 + + + + + 1643.6 + + + + 18 + 134 + + + + + 1643.4 + + + + 18 + 133 + + + + + 1643.8 + + + + 18 + 134 + + + + + 1643.6 + + + + 18 + 134 + + + + + 1643.8 + + + + 18 + 134 + + + + + 1644.0 + + + + 18 + 135 + + + + + 1644.2 + + + + 18 + 135 + + + + + 1644.2 + + + + 18 + 135 + + + + + 1644.4 + + + + 18 + 136 + + + + + 1644.4 + + + + 18 + 136 + + + + + 1644.6 + + + + 18 + 137 + + + + + 1644.6 + + + + 18 + 137 + + + + + 1644.8 + + + + 18 + 138 + + + + + 1644.8 + + + + 18 + 138 + + + + + 1645.2 + + + + 18 + 139 + + + + + 1645.2 + + + + 18 + 139 + + + + + 1645.6 + + + + 18 + 139 + + + + + 1645.8 + + + + 18 + 139 + + + + + 1645.8 + + + + 18 + 139 + + + + + 1646.0 + + + + 18 + 139 + + + + + 1646.0 + + + + 18 + 139 + + + + + 1646.2 + + + + 18 + 139 + + + + + 1646.2 + + + + 18 + 139 + + + + + 1646.2 + + + + 18 + 139 + + + + + 1646.4 + + + + 18 + 139 + + + + + 1646.6 + + + + 18 + 139 + + + + + 1647.0 + + + + 18 + 140 + + + + + 1647.0 + + + + 18 + 140 + + + + + 1647.2 + + + + 18 + 140 + + + + + 1647.4 + + + + 18 + 140 + + + + + 1647.4 + + + + 18 + 140 + + + + + 1647.6 + + + + 18 + 140 + + + + + 1647.8 + + + + 18 + 139 + + + + + 1648.0 + + + + 18 + 140 + + + + + 1648.2 + + + + 18 + 140 + + + + + 1648.2 + + + + 18 + 140 + + + + + 1648.8 + + + + 18 + 141 + + + + + 1649.0 + + + + 18 + 141 + + + + + 1649.2 + + + + 18 + 141 + + + + + 1649.2 + + + + 18 + 142 + + + + + 1649.4 + + + + 18 + 142 + + + + + 1649.6 + + + + 18 + 142 + + + + + 1649.8 + + + + 18 + 143 + + + + + 1650.0 + + + + 18 + 143 + + + + + 1650.0 + + + + 18 + 143 + + + + + 1650.2 + + + + 18 + 143 + + + + + 1650.4 + + + + 18 + 144 + + + + + 1650.6 + + + + 18 + 144 + + + + + 1651.0 + + + + 18 + 145 + + + + + 1651.2 + + + + 18 + 145 + + + + + 1651.4 + + + + 18 + 145 + + + + + 1651.6 + + + + 18 + 146 + + + + + 1652.0 + + + + 18 + 146 + + + + + 1652.2 + + + + 18 + 146 + + + + + 1652.4 + + + + 18 + 147 + + + + + 1652.6 + + + + 18 + 147 + + + + + 1652.8 + + + + 18 + 147 + + + + + 1653.0 + + + + 18 + 148 + + + + + 1653.2 + + + + 18 + 148 + + + + + 1653.6 + + + + 18 + 149 + + + + + 1654.0 + + + + 18 + 149 + + + + + 1654.2 + + + + 18 + 149 + + + + + 1654.4 + + + + 18 + 149 + + + + + 1654.4 + + + + 18 + 149 + + + + + 1654.6 + + + + 18 + 149 + + + + + 1654.8 + + + + 18 + 149 + + + + + 1655.2 + + + + 18 + 149 + + + + + 1655.2 + + + + 18 + 150 + + + + + 1655.2 + + + + 18 + 149 + + + + + 1655.4 + + + + 18 + 150 + + + + + 1655.6 + + + + 18 + 150 + + + + + 1655.8 + + + + 18 + 150 + + + + + 1656.0 + + + + 18 + 150 + + + + + 1656.2 + + + + 18 + 150 + + + + + 1656.2 + + + + 18 + 151 + + + + + 1656.4 + + + + 18 + 151 + + + + + 1656.6 + + + + 18 + 151 + + + + + 1656.8 + + + + 18 + 151 + + + + + 1657.0 + + + + 18 + 151 + + + + + 1657.2 + + + + 18 + 152 + + + + + 1657.4 + + + + 18 + 152 + + + + + 1657.6 + + + + 18 + 152 + + + + + 1658.0 + + + + 18 + 152 + + + + + 1658.2 + + + + 18 + 152 + + + + + 1658.2 + + + + 18 + 152 + + + + + 1658.4 + + + + 18 + 153 + + + + + 1658.4 + + + + 18 + 152 + + + + + 1658.6 + + + + 18 + 153 + + + + + 1658.8 + + + + 18 + 153 + + + + + 1659.2 + + + + 18 + 152 + + + + + 1659.4 + + + + 18 + 153 + + + + + 1659.6 + + + + 18 + 153 + + + + + 1659.8 + + + + 19 + 153 + + + + + 1660.0 + + + + 19 + 152 + + + + + 1660.2 + + + + 19 + 152 + + + + + 1660.4 + + + + 19 + 152 + + + + + 1660.4 + + + + 19 + 151 + + + + + 1660.4 + + + + 19 + 151 + + + + + 1660.6 + + + + 19 + 151 + + + + + 1660.6 + + + + 19 + 151 + + + + + 1660.6 + + + + 19 + 151 + + + + + 1660.8 + + + + 19 + 151 + + + + + 1660.8 + + + + 19 + 150 + + + + + 1660.8 + + + + 19 + 150 + + + + + 1661.0 + + + + 19 + 150 + + + + + 1661.0 + + + + 19 + 149 + + + + + 1661.0 + + + + 19 + 149 + + + + + 1661.2 + + + + 19 + 149 + + + + + 1661.4 + + + + 19 + 149 + + + + + 1661.4 + + + + 19 + 148 + + + + + 1661.6 + + + + 19 + 148 + + + + + 1661.6 + + + + 19 + 147 + + + + + 1661.8 + + + + 19 + 147 + + + + + 1661.8 + + + + 19 + 147 + + + + + 1661.8 + + + + 19 + 147 + + + + + 1662.0 + + + + 19 + 146 + + + + + 1662.4 + + + + 19 + 146 + + + + + 1662.6 + + + + 19 + 147 + + + + + 1662.6 + + + + 19 + 146 + + + + + 1662.8 + + + + 19 + 147 + + + + + 1662.8 + + + + 19 + 147 + + + + + 1662.8 + + + + 19 + 147 + + + + + 1662.8 + + + + 19 + 147 + + + + + 1663.0 + + + + 19 + 147 + + + + + 1663.0 + + + + 19 + 147 + + + + + 1663.0 + + + + 19 + 147 + + + + + 1663.0 + + + + 19 + 146 + + + + + 1663.2 + + + + 19 + 147 + + + + + 1663.4 + + + + 19 + 146 + + + + + 1663.4 + + + + 19 + 146 + + + + + 1663.6 + + + + 19 + 146 + + + + + 1663.8 + + + + 19 + 146 + + + + + 1663.8 + + + + 19 + 146 + + + + + 1664.2 + + + + 19 + 146 + + + + + 1664.2 + + + + 19 + 145 + + + + + 1664.4 + + + + 19 + 144 + + + + + 1664.4 + + + + 19 + 143 + + + + + 1664.4 + + + + 19 + 143 + + + + + 1664.6 + + + + 19 + 142 + + + + + 1664.8 + + + + 19 + 141 + + + + + 1665.0 + + + + 19 + 141 + + + + + 1665.0 + + + + 19 + 140 + + + + + 1665.0 + + + + 19 + 139 + + + + + 1665.0 + + + + 19 + 138 + + + + + 1665.0 + + + + 19 + 138 + + + + + 1665.0 + + + + 19 + 136 + + + + + 1665.0 + + + + 19 + 136 + + + + + 1665.0 + + + + 19 + 135 + + + + + 1665.0 + + + + 19 + 133 + + + + + 1664.8 + + + + 19 + 132 + + + + + 1664.6 + + + + 19 + 131 + + + + + 1664.4 + + + + 19 + 129 + + + + + 1664.2 + + + + 19 + 127 + + + + + + diff --git a/packages/sandcastle/public/SampleData/gpx/route.gpx b/packages/sandcastle/public/SampleData/gpx/route.gpx new file mode 100644 index 000000000000..c0331bb8973d --- /dev/null +++ b/packages/sandcastle/public/SampleData/gpx/route.gpx @@ -0,0 +1,25 @@ + + + + Test file by Patrick + + + Patrick's Route + + 0.0 + Position 1 + + + 0.0 + Position 2 + + + 0.0 + Position 3 + + + 0.0 + Position 4 + + + \ No newline at end of file diff --git a/packages/sandcastle/public/SampleData/gpx/simple.gpx b/packages/sandcastle/public/SampleData/gpx/simple.gpx new file mode 100644 index 000000000000..d78090b7fa32 --- /dev/null +++ b/packages/sandcastle/public/SampleData/gpx/simple.gpx @@ -0,0 +1,10 @@ + + + + Test file by Andre + + + 0.0 + Position 1 + + diff --git a/packages/sandcastle/public/SampleData/gpx/wpt.gpx b/packages/sandcastle/public/SampleData/gpx/wpt.gpx new file mode 100644 index 000000000000..a0beced057e8 --- /dev/null +++ b/packages/sandcastle/public/SampleData/gpx/wpt.gpx @@ -0,0 +1,22 @@ + + + + Test file by Patrick + + + 0.0 + Position 1 + + + 0.0 + Position 2 + + + 0.0 + Position 3 + + + 0.0 + Position 4 + + \ No newline at end of file diff --git a/packages/sandcastle/public/SampleData/kml/bikeRide.kml b/packages/sandcastle/public/SampleData/kml/bikeRide.kml new file mode 100644 index 000000000000..8818d7bb5e02 --- /dev/null +++ b/packages/sandcastle/public/SampleData/kml/bikeRide.kml @@ -0,0 +1,10565 @@ + + + +1 +1 + + + + + + + + + + + + + + + + + + + + +2013-07-25T19:33:58.000Z +#start + +-75.300238,40.109584,-2.799999952316284 + + + + + +Activity type: biking
    +Total distance: 26.30 km (16.3 mi)
    +Total time: 1:33:41
    +Moving time: 1:32:26
    +Average speed: 16.84 km/h (10.5 mi/h)
    +Average moving speed: 17.07 km/h (10.6 mi/h)
    +Max speed: 36.90 km/h (22.9 mi/h)
    +Average pace: 3.56 min/km (5.7 min/mi)
    +Average moving pace: 3.51 min/km (5.7 min/mi)
    +Fastest pace: 1.63 min/km (2.6 min/mi)
    +Max elevation: 54 m (176 ft)
    +Min elevation: -32 m (-105 ft)
    +Elevation gain: 740 m (2429 ft)
    +Max grade: 30 %
    +Min grade: -23 %
    +Recorded: 7/25/2013 3:33pm +]]>
    +#track + + + + +absolute +1 + +2013-07-25T19:33:58.000Z +-75.300238 40.109584 -2.799999952316284 +2013-07-25T19:33:59.000Z +-75.300234 40.109597 38.0 +2013-07-25T19:34:00.000Z +-75.300214 40.109641 36.099998474121094 +2013-07-25T19:34:09.000Z +-75.300233 40.109603 20.700000762939453 +2013-07-25T19:34:10.000Z +-75.30025 40.109586 25.600000381469727 +2013-07-25T19:34:42.000Z +-75.30026 40.10963 36.5 +2013-07-25T19:34:43.000Z +-75.300268 40.109631 37.900001525878906 +2013-07-25T19:34:57.000Z +-75.300292 40.109618 39.70000076293945 +2013-07-25T19:34:58.000Z +-75.30032 40.109599 40.70000076293945 +2013-07-25T19:34:59.000Z +-75.300355 40.109574 40.70000076293945 +2013-07-25T19:35:00.000Z +-75.300391 40.109544 35.29999923706055 +2013-07-25T19:35:01.000Z +-75.300423 40.109513 33.20000076293945 +2013-07-25T19:35:02.000Z +-75.300446 40.109481 31.5 +2013-07-25T19:35:03.000Z +-75.300441 40.109397 29.100000381469727 +2013-07-25T19:35:04.000Z +-75.300476 40.109341 28.0 +2013-07-25T19:35:05.000Z +-75.300515 40.109283 26.299999237060547 +2013-07-25T19:35:06.000Z +-75.300541 40.109225 24.5 +2013-07-25T19:35:07.000Z +-75.300559 40.109158 23.600000381469727 +2013-07-25T19:35:08.000Z +-75.300542 40.10908 22.5 +2013-07-25T19:35:09.000Z +-75.300506 40.109006 21.799999237060547 +2013-07-25T19:35:10.000Z +-75.300485 40.108955 22.5 +2013-07-25T19:35:11.000Z +-75.30047 40.108896 22.0 +2013-07-25T19:35:12.000Z +-75.300473 40.108851 21.799999237060547 +2013-07-25T19:35:13.000Z +-75.300476 40.108809 21.100000381469727 +2013-07-25T19:35:14.000Z +-75.300501 40.108767 19.700000762939453 +2013-07-25T19:35:15.000Z +-75.300594 40.108757 18.799999237060547 +2013-07-25T19:35:16.000Z +-75.300664 40.108737 17.600000381469727 +2013-07-25T19:35:17.000Z +-75.300737 40.108722 17.100000381469727 +2013-07-25T19:35:18.000Z +-75.300809 40.108693 16.600000381469727 +2013-07-25T19:35:19.000Z +-75.300886 40.108666 15.800000190734863 +2013-07-25T19:35:20.000Z +-75.300979 40.108632 13.300000190734863 +2013-07-25T19:35:21.000Z +-75.301058 40.108617 12.399999618530273 +2013-07-25T19:35:22.000Z +-75.30114 40.108604 11.5 +2013-07-25T19:35:23.000Z +-75.301227 40.108588 10.600000381469727 +2013-07-25T19:35:24.000Z +-75.301324 40.108567 9.600000381469727 +2013-07-25T19:35:25.000Z +-75.30141 40.108548 9.600000381469727 +2013-07-25T19:35:26.000Z +-75.301494 40.108535 9.699999809265137 +2013-07-25T19:35:27.000Z +-75.301577 40.108513 9.600000381469727 +2013-07-25T19:35:28.000Z +-75.301661 40.10849 8.5 +2013-07-25T19:35:29.000Z +-75.301744 40.108468 7.0 +2013-07-25T19:35:30.000Z +-75.301837 40.108453 6.699999809265137 +2013-07-25T19:35:31.000Z +-75.301926 40.108432 5.900000095367432 +2013-07-25T19:35:32.000Z +-75.302012 40.108413 5.300000190734863 +2013-07-25T19:35:33.000Z +-75.302093 40.10839 5.599999904632568 +2013-07-25T19:35:34.000Z +-75.302174 40.108367 5.300000190734863 +2013-07-25T19:35:35.000Z +-75.302264 40.108336 4.699999809265137 +2013-07-25T19:35:36.000Z +-75.302351 40.108315 3.9000000953674316 +2013-07-25T19:35:37.000Z +-75.302434 40.108296 2.799999952316284 +2013-07-25T19:35:38.000Z +-75.302509 40.108282 2.700000047683716 +2013-07-25T19:35:39.000Z +-75.302582 40.108266 2.0 +2013-07-25T19:35:40.000Z +-75.302664 40.108251 1.5 +2013-07-25T19:35:41.000Z +-75.302746 40.108235 0.699999988079071 +2013-07-25T19:35:42.000Z +-75.302819 40.108224 -0.10000000149011612 +2013-07-25T19:35:43.000Z +-75.302883 40.108209 0.30000001192092896 +2013-07-25T19:35:44.000Z +-75.302943 40.108193 0.0 +2013-07-25T19:35:45.000Z +-75.303 40.108175 -0.10000000149011612 +2013-07-25T19:35:46.000Z +-75.303052 40.108173 0.5 +2013-07-25T19:35:47.000Z +-75.303106 40.108159 0.5 +2013-07-25T19:35:48.000Z +-75.303168 40.108146 0.20000000298023224 +2013-07-25T19:35:49.000Z +-75.30324 40.108138 0.10000000149011612 +2013-07-25T19:35:50.000Z +-75.303308 40.108131 0.5 +2013-07-25T19:35:51.000Z +-75.303369 40.108118 -0.6000000238418579 +2013-07-25T19:35:52.000Z +-75.303422 40.108105 0.0 +2013-07-25T19:35:53.000Z +-75.303467 40.108097 -0.6000000238418579 +2013-07-25T19:35:54.000Z +-75.303517 40.108087 -0.6000000238418579 +2013-07-25T19:35:55.000Z +-75.30356 40.10807 -1.0 +2013-07-25T19:35:56.000Z +-75.303566 40.108042 0.30000001192092896 +2013-07-25T19:35:57.000Z +-75.303556 40.108009 2.0999999046325684 +2013-07-25T19:35:58.000Z +-75.303539 40.107973 1.2999999523162842 +2013-07-25T19:35:59.000Z +-75.303525 40.107947 0.800000011920929 +2013-07-25T19:36:00.000Z +-75.303477 40.107917 0.800000011920929 +2013-07-25T19:36:01.000Z +-75.303428 40.107887 1.0 +2013-07-25T19:36:03.000Z +-75.303407 40.107857 0.5 +2013-07-25T19:36:04.000Z +-75.303369 40.107838 0.30000001192092896 +2013-07-25T19:36:05.000Z +-75.303344 40.107822 0.30000001192092896 +2013-07-25T19:36:06.000Z +-75.303317 40.107811 0.30000001192092896 +2013-07-25T19:36:07.000Z +-75.303228 40.107803 0.30000001192092896 +2013-07-25T19:36:08.000Z +-75.30308 40.107756 0.5 +2013-07-25T19:36:09.000Z +-75.303044 40.107777 0.5 +2013-07-25T19:36:10.000Z +-75.302966 40.107708 0.699999988079071 +2013-07-25T19:36:11.000Z +-75.30287 40.107664 2.5999999046325684 +2013-07-25T19:36:12.000Z +-75.302789 40.10762 6.900000095367432 +2013-07-25T19:36:13.000Z +-75.302728 40.107595 8.800000190734863 +2013-07-25T19:36:14.000Z +-75.302681 40.107562 9.100000381469727 +2013-07-25T19:36:15.000Z +-75.302644 40.107551 9.699999809265137 +2013-07-25T19:36:16.000Z +-75.302612 40.107537 9.899999618530273 +2013-07-25T19:36:17.000Z +-75.302526 40.107472 8.600000381469727 +2013-07-25T19:36:18.000Z +-75.30248 40.107439 10.600000381469727 +2013-07-25T19:36:19.000Z +-75.302437 40.107428 13.300000190734863 +2013-07-25T19:36:20.000Z +-75.302425 40.107413 17.5 +2013-07-25T19:36:21.000Z +-75.302403 40.107405 19.299999237060547 +2013-07-25T19:36:22.000Z +-75.302372 40.107387 19.5 +2013-07-25T19:36:23.000Z +-75.302347 40.107356 17.899999618530273 +2013-07-25T19:36:24.000Z +-75.302335 40.107346 19.399999618530273 +2013-07-25T19:36:26.000Z +-75.302289 40.107323 19.700000762939453 +2013-07-25T19:36:27.000Z +-75.302258 40.107305 19.600000381469727 +2013-07-25T19:36:28.000Z +-75.302242 40.107296 18.899999618530273 +2013-07-25T19:36:28.999Z +-75.302212 40.107273 18.200000762939453 +2013-07-25T19:36:30.000Z +-75.302182 40.107255 18.5 +2013-07-25T19:36:31.000Z +-75.30215 40.107239 19.0 +2013-07-25T19:36:32.000Z +-75.302116 40.107219 18.0 +2013-07-25T19:36:33.000Z +-75.302083 40.1072 17.299999237060547 +2013-07-25T19:36:34.000Z +-75.302049 40.10718 17.200000762939453 +2013-07-25T19:36:35.000Z +-75.302016 40.107162 15.100000381469727 +2013-07-25T19:36:36.000Z +-75.301981 40.107144 15.300000190734863 +2013-07-25T19:36:37.000Z +-75.301946 40.107124 15.5 +2013-07-25T19:36:38.000Z +-75.301899 40.107089 13.0 +2013-07-25T19:36:39.000Z +-75.301855 40.107063 12.5 +2013-07-25T19:36:40.000Z +-75.301819 40.10704 12.199999809265137 +2013-07-25T19:36:41.000Z +-75.301787 40.107043 12.300000190734863 +2013-07-25T19:36:42.000Z +-75.301757 40.107032 13.300000190734863 +2013-07-25T19:36:43.000Z +-75.301716 40.107013 14.0 +2013-07-25T19:36:44.000Z +-75.30168 40.106992 14.5 +2013-07-25T19:36:45.000Z +-75.30164 40.106975 14.5 +2013-07-25T19:36:46.000Z +-75.301595 40.106959 14.800000190734863 +2013-07-25T19:36:47.000Z +-75.301549 40.106946 14.800000190734863 +2013-07-25T19:36:48.000Z +-75.301494 40.106929 14.899999618530273 +2013-07-25T19:36:49.000Z +-75.301444 40.106915 15.100000381469727 +2013-07-25T19:36:50.000Z +-75.301389 40.1069 15.199999809265137 +2013-07-25T19:36:51.000Z +-75.301335 40.106887 16.600000381469727 +2013-07-25T19:36:52.000Z +-75.30127 40.106873 17.0 +2013-07-25T19:36:53.000Z +-75.301209 40.106858 17.299999237060547 +2013-07-25T19:36:54.000Z +-75.301142 40.106856 17.299999237060547 +2013-07-25T19:36:55.000Z +-75.301076 40.106847 18.200000762939453 +2013-07-25T19:36:56.000Z +-75.301009 40.106829 19.100000381469727 +2013-07-25T19:36:57.000Z +-75.300938 40.106822 19.100000381469727 +2013-07-25T19:36:58.000Z +-75.300866 40.106809 19.399999618530273 +2013-07-25T19:36:59.000Z +-75.300786 40.106801 19.799999237060547 +2013-07-25T19:37:00.000Z +-75.300722 40.106781 19.899999618530273 +2013-07-25T19:37:01.001Z +-75.300651 40.106771 19.899999618530273 +2013-07-25T19:37:02.000Z +-75.30055 40.106756 20.600000381469727 +2013-07-25T19:37:03.000Z +-75.300477 40.106744 21.100000381469727 +2013-07-25T19:37:04.000Z +-75.3004 40.106733 21.200000762939453 +2013-07-25T19:37:05.000Z +-75.300335 40.106717 22.0 +2013-07-25T19:37:06.000Z +-75.300268 40.106709 22.200000762939453 +2013-07-25T19:37:07.000Z +-75.300202 40.106702 22.700000762939453 +2013-07-25T19:37:08.000Z +-75.300144 40.106672 22.0 +2013-07-25T19:37:09.000Z +-75.300087 40.10666 22.0 +2013-07-25T19:37:10.000Z +-75.30002 40.106633 21.0 +2013-07-25T19:37:11.000Z +-75.299938 40.106605 20.399999618530273 +2013-07-25T19:37:12.000Z +-75.299934 40.10657 20.799999237060547 +2013-07-25T19:37:13.000Z +-75.299897 40.106544 20.700000762939453 +2013-07-25T19:37:14.000Z +-75.299865 40.106516 20.399999618530273 +2013-07-25T19:37:15.000Z +-75.299845 40.106498 20.5 +2013-07-25T19:37:16.000Z +-75.299821 40.10648 21.399999618530273 +2013-07-25T19:37:17.000Z +-75.299804 40.106462 22.100000381469727 +2013-07-25T19:37:19.000Z +-75.299772 40.106431 22.700000762939453 +2013-07-25T19:37:20.000Z +-75.299754 40.106413 23.799999237060547 +2013-07-25T19:37:21.000Z +-75.299737 40.106394 23.799999237060547 +2013-07-25T19:37:22.000Z +-75.299722 40.106373 23.5 +2013-07-25T19:37:23.000Z +-75.299707 40.106354 23.5 +2013-07-25T19:37:24.001Z +-75.299693 40.106331 24.100000381469727 +2013-07-25T19:37:25.000Z +-75.299681 40.106309 24.5 +2013-07-25T19:37:26.000Z +-75.299669 40.106286 25.0 +2013-07-25T19:37:27.000Z +-75.299656 40.106262 25.0 +2013-07-25T19:37:28.000Z +-75.299638 40.106239 25.200000762939453 +2013-07-25T19:37:29.000Z +-75.299621 40.106216 26.100000381469727 +2013-07-25T19:37:30.000Z +-75.299604 40.106193 26.200000762939453 +2013-07-25T19:37:31.000Z +-75.299585 40.106167 26.299999237060547 +2013-07-25T19:37:32.000Z +-75.299565 40.106139 27.600000381469727 +2013-07-25T19:37:33.000Z +-75.299546 40.106112 28.0 +2013-07-25T19:37:34.000Z +-75.299526 40.106084 28.5 +2013-07-25T19:37:35.000Z +-75.299505 40.106056 29.0 +2013-07-25T19:37:36.000Z +-75.299482 40.106026 29.399999618530273 +2013-07-25T19:37:37.000Z +-75.299459 40.105998 30.0 +2013-07-25T19:37:38.000Z +-75.299438 40.105968 30.399999618530273 +2013-07-25T19:37:39.000Z +-75.299395 40.105931 29.399999618530273 +2013-07-25T19:37:40.000Z +-75.299363 40.105889 28.399999618530273 +2013-07-25T19:37:41.000Z +-75.299342 40.10585 27.899999618530273 +2013-07-25T19:37:42.000Z +-75.299314 40.105812 27.899999618530273 +2013-07-25T19:37:43.000Z +-75.299285 40.105769 27.5 +2013-07-25T19:37:44.000Z +-75.299253 40.105727 27.399999618530273 +2013-07-25T19:37:45.000Z +-75.299219 40.105681 27.0 +2013-07-25T19:37:46.000Z +-75.299176 40.105632 26.0 +2013-07-25T19:37:47.000Z +-75.29914 40.105585 25.0 +2013-07-25T19:37:48.000Z +-75.29909 40.10554 25.0 +2013-07-25T19:37:49.000Z +-75.299043 40.105483 24.0 +2013-07-25T19:37:50.000Z +-75.29899 40.105441 23.899999618530273 +2013-07-25T19:37:51.000Z +-75.298941 40.105404 24.399999618530273 +2013-07-25T19:37:52.000Z +-75.298875 40.105366 23.5 +2013-07-25T19:37:53.000Z +-75.298811 40.105331 24.0 +2013-07-25T19:37:54.000Z +-75.298768 40.105301 24.5 +2013-07-25T19:37:55.000Z +-75.298706 40.105272 24.899999618530273 +2013-07-25T19:37:56.000Z +-75.298646 40.105239 22.100000381469727 +2013-07-25T19:37:57.000Z +-75.29858 40.105218 20.799999237060547 +2013-07-25T19:37:58.000Z +-75.298519 40.105199 20.5 +2013-07-25T19:37:59.000Z +-75.298465 40.105167 20.899999618530273 +2013-07-25T19:38:00.000Z +-75.298417 40.105138 21.0 +2013-07-25T19:38:01.000Z +-75.29836 40.105113 21.0 +2013-07-25T19:38:02.000Z +-75.298293 40.105056 21.600000381469727 +2013-07-25T19:38:03.000Z +-75.298228 40.10502 22.600000381469727 +2013-07-25T19:38:04.000Z +-75.298178 40.104979 23.299999237060547 +2013-07-25T19:38:05.000Z +-75.298144 40.104947 24.600000381469727 +2013-07-25T19:38:06.000Z +-75.298079 40.104918 24.299999237060547 +2013-07-25T19:38:07.000Z +-75.298018 40.104889 24.100000381469727 +2013-07-25T19:38:08.000Z +-75.297958 40.104866 25.5 +2013-07-25T19:38:09.000Z +-75.297911 40.104833 25.299999237060547 +2013-07-25T19:38:10.000Z +-75.297855 40.104796 25.600000381469727 +2013-07-25T19:38:11.000Z +-75.297806 40.104759 25.600000381469727 +2013-07-25T19:38:12.000Z +-75.297741 40.104719 26.600000381469727 +2013-07-25T19:38:13.000Z +-75.297689 40.104679 27.100000381469727 +2013-07-25T19:38:14.000Z +-75.297634 40.104643 27.0 +2013-07-25T19:38:15.000Z +-75.297578 40.104605 27.799999237060547 +2013-07-25T19:38:16.000Z +-75.297513 40.104571 27.899999618530273 +2013-07-25T19:38:17.000Z +-75.297453 40.104541 27.600000381469727 +2013-07-25T19:38:18.000Z +-75.297404 40.104506 27.600000381469727 +2013-07-25T19:38:19.000Z +-75.29735 40.104471 27.299999237060547 +2013-07-25T19:38:20.000Z +-75.297294 40.104426 26.200000762939453 +2013-07-25T19:38:21.000Z +-75.29724 40.10439 26.0 +2013-07-25T19:38:22.000Z +-75.297186 40.10435 25.5 +2013-07-25T19:38:23.000Z +-75.297126 40.104302 26.100000381469727 +2013-07-25T19:38:24.000Z +-75.297066 40.104251 25.5 +2013-07-25T19:38:25.000Z +-75.297006 40.104199 24.899999618530273 +2013-07-25T19:38:25.999Z +-75.29695 40.104146 24.600000381469727 +2013-07-25T19:38:27.000Z +-75.296908 40.10409 26.200000762939453 +2013-07-25T19:38:28.000Z +-75.296851 40.104024 26.100000381469727 +2013-07-25T19:38:29.000Z +-75.29681 40.10396 25.399999618530273 +2013-07-25T19:38:30.000Z +-75.296761 40.103893 25.0 +2013-07-25T19:38:31.000Z +-75.2967 40.103808 24.200000762939453 +2013-07-25T19:38:32.000Z +-75.296644 40.103736 24.200000762939453 +2013-07-25T19:38:33.000Z +-75.29661 40.103671 24.100000381469727 +2013-07-25T19:38:34.000Z +-75.29657 40.103599 23.899999618530273 +2013-07-25T19:38:35.000Z +-75.296534 40.103523 23.899999618530273 +2013-07-25T19:38:36.000Z +-75.296506 40.103452 24.299999237060547 +2013-07-25T19:38:37.000Z +-75.296477 40.103394 24.0 +2013-07-25T19:38:38.000Z +-75.296467 40.103342 23.799999237060547 +2013-07-25T19:38:39.000Z +-75.296453 40.103308 23.700000762939453 +2013-07-25T19:38:40.000Z +-75.296448 40.103278 24.600000381469727 +2013-07-25T19:38:42.000Z +-75.296431 40.103239 24.399999618530273 +2013-07-25T19:38:43.000Z +-75.296423 40.103224 24.600000381469727 +2013-07-25T19:38:46.000Z +-75.296398 40.103184 23.899999618530273 +2013-07-25T19:38:47.000Z +-75.296386 40.10318 25.200000762939453 +2013-07-25T19:38:51.000Z +-75.296373 40.103137 22.100000381469727 +2013-07-25T19:38:52.000Z +-75.296403 40.103121 21.600000381469727 +2013-07-25T19:38:53.000Z +-75.296443 40.103103 21.100000381469727 +2013-07-25T19:38:54.000Z +-75.296488 40.103083 20.799999237060547 +2013-07-25T19:38:55.000Z +-75.296534 40.103059 21.0 +2013-07-25T19:38:56.000Z +-75.296573 40.103033 21.100000381469727 +2013-07-25T19:38:57.000Z +-75.296599 40.103008 21.5 +2013-07-25T19:38:58.000Z +-75.296611 40.102987 20.200000762939453 +2013-07-25T19:39:00.000Z +-75.296586 40.102957 17.200000762939453 +2013-07-25T19:39:01.000Z +-75.296566 40.102955 17.200000762939453 +2013-07-25T19:39:03.000Z +-75.29652 40.102965 18.299999237060547 +2013-07-25T19:39:04.000Z +-75.296494 40.102971 18.200000762939453 +2013-07-25T19:39:06.000Z +-75.296445 40.102991 15.800000190734863 +2013-07-25T19:39:07.000Z +-75.296425 40.103002 15.199999809265137 +2013-07-25T19:39:12.000Z +-75.296376 40.10302 17.299999237060547 +2013-07-25T19:39:13.000Z +-75.296365 40.10302 17.0 +2013-07-25T19:39:15.000Z +-75.296332 40.103006 16.899999618530273 +2013-07-25T19:39:16.000Z +-75.296316 40.102985 16.899999618530273 +2013-07-25T19:39:17.000Z +-75.2963 40.102957 20.299999237060547 +2013-07-25T19:39:18.000Z +-75.296286 40.102924 20.100000381469727 +2013-07-25T19:39:19.000Z +-75.296262 40.102849 21.700000762939453 +2013-07-25T19:39:20.000Z +-75.296235 40.102811 23.799999237060547 +2013-07-25T19:39:21.000Z +-75.296213 40.102761 21.600000381469727 +2013-07-25T19:39:22.000Z +-75.296193 40.102712 21.899999618530273 +2013-07-25T19:39:23.000Z +-75.296165 40.102659 21.100000381469727 +2013-07-25T19:39:24.000Z +-75.296141 40.102597 20.799999237060547 +2013-07-25T19:39:25.000Z +-75.296118 40.102543 20.399999618530273 +2013-07-25T19:39:26.000Z +-75.296095 40.102484 20.899999618530273 +2013-07-25T19:39:27.000Z +-75.296064 40.102426 20.700000762939453 +2013-07-25T19:39:28.000Z +-75.29603 40.102362 20.700000762939453 +2013-07-25T19:39:29.000Z +-75.295996 40.102308 19.899999618530273 +2013-07-25T19:39:30.000Z +-75.295961 40.10225 19.700000762939453 +2013-07-25T19:39:31.000Z +-75.295928 40.102186 19.600000381469727 +2013-07-25T19:39:32.000Z +-75.295897 40.102122 20.0 +2013-07-25T19:39:33.000Z +-75.295874 40.102063 19.899999618530273 +2013-07-25T19:39:34.000Z +-75.295852 40.10201 19.700000762939453 +2013-07-25T19:39:35.000Z +-75.295833 40.101952 19.200000762939453 +2013-07-25T19:39:36.000Z +-75.295812 40.101894 19.200000762939453 +2013-07-25T19:39:37.000Z +-75.295791 40.101844 19.200000762939453 +2013-07-25T19:39:38.000Z +-75.295764 40.101788 19.899999618530273 +2013-07-25T19:39:39.000Z +-75.29573 40.101739 20.799999237060547 +2013-07-25T19:39:40.000Z +-75.295695 40.10169 21.700000762939453 +2013-07-25T19:39:41.000Z +-75.295654 40.101641 21.700000762939453 +2013-07-25T19:39:42.000Z +-75.295609 40.101592 21.899999618530273 +2013-07-25T19:39:43.000Z +-75.295584 40.101541 20.700000762939453 +2013-07-25T19:39:44.000Z +-75.295526 40.1015 20.799999237060547 +2013-07-25T19:39:45.000Z +-75.29547 40.101457 21.200000762939453 +2013-07-25T19:39:46.000Z +-75.295424 40.101409 20.899999618530273 +2013-07-25T19:39:47.000Z +-75.295364 40.101369 21.200000762939453 +2013-07-25T19:39:48.000Z +-75.295305 40.101327 21.600000381469727 +2013-07-25T19:39:48.999Z +-75.295252 40.101287 21.299999237060547 +2013-07-25T19:39:50.000Z +-75.29519 40.101248 20.899999618530273 +2013-07-25T19:39:51.000Z +-75.295132 40.101212 20.799999237060547 +2013-07-25T19:39:52.000Z +-75.295078 40.101174 20.899999618530273 +2013-07-25T19:39:53.000Z +-75.295021 40.101133 20.600000381469727 +2013-07-25T19:39:54.000Z +-75.294963 40.101094 20.799999237060547 +2013-07-25T19:39:55.000Z +-75.2949 40.101052 20.899999618530273 +2013-07-25T19:39:56.000Z +-75.294839 40.101004 20.700000762939453 +2013-07-25T19:39:57.000Z +-75.294778 40.100957 20.100000381469727 +2013-07-25T19:39:58.000Z +-75.294724 40.100915 19.399999618530273 +2013-07-25T19:39:59.000Z +-75.294655 40.100871 20.299999237060547 +2013-07-25T19:40:00.000Z +-75.29458 40.100822 19.899999618530273 +2013-07-25T19:40:01.000Z +-75.294508 40.10078 19.799999237060547 +2013-07-25T19:40:02.000Z +-75.294444 40.100744 19.200000762939453 +2013-07-25T19:40:03.000Z +-75.294387 40.100709 18.0 +2013-07-25T19:40:04.000Z +-75.294336 40.100676 17.600000381469727 +2013-07-25T19:40:05.000Z +-75.294308 40.10064 17.100000381469727 +2013-07-25T19:40:06.000Z +-75.294287 40.100603 16.399999618530273 +2013-07-25T19:40:07.000Z +-75.294272 40.100562 15.399999618530273 +2013-07-25T19:40:08.000Z +-75.294284 40.100515 14.5 +2013-07-25T19:40:09.000Z +-75.294299 40.100472 13.399999618530273 +2013-07-25T19:40:10.000Z +-75.294329 40.100427 13.399999618530273 +2013-07-25T19:40:11.000Z +-75.294366 40.100385 11.699999809265137 +2013-07-25T19:40:12.000Z +-75.294414 40.100338 11.199999809265137 +2013-07-25T19:40:13.000Z +-75.294462 40.100293 11.600000381469727 +2013-07-25T19:40:14.000Z +-75.29451 40.100259 11.100000381469727 +2013-07-25T19:40:15.000Z +-75.294553 40.100209 10.199999809265137 +2013-07-25T19:40:15.999Z +-75.294592 40.100149 8.699999809265137 +2013-07-25T19:40:17.000Z +-75.294642 40.100118 9.300000190734863 +2013-07-25T19:40:18.000Z +-75.294688 40.100078 9.0 +2013-07-25T19:40:19.000Z +-75.294734 40.100039 9.5 +2013-07-25T19:40:20.000Z +-75.294788 40.100007 10.199999809265137 +2013-07-25T19:40:21.000Z +-75.294846 40.099975 10.5 +2013-07-25T19:40:22.000Z +-75.294896 40.09995 10.5 +2013-07-25T19:40:23.000Z +-75.294959 40.099912 9.0 +2013-07-25T19:40:24.000Z +-75.295024 40.099902 8.899999618530273 +2013-07-25T19:40:25.000Z +-75.295088 40.099895 8.300000190734863 +2013-07-25T19:40:26.000Z +-75.295165 40.099884 7.5 +2013-07-25T19:40:27.000Z +-75.295239 40.099868 6.5 +2013-07-25T19:40:28.000Z +-75.295328 40.099851 4.900000095367432 +2013-07-25T19:40:29.000Z +-75.295397 40.099835 4.300000190734863 +2013-07-25T19:40:30.000Z +-75.295477 40.099822 2.9000000953674316 +2013-07-25T19:40:31.000Z +-75.29556 40.099793 2.200000047683716 +2013-07-25T19:40:32.000Z +-75.295653 40.099781 1.899999976158142 +2013-07-25T19:40:33.000Z +-75.29573 40.099773 1.399999976158142 +2013-07-25T19:40:34.000Z +-75.295808 40.099758 0.699999988079071 +2013-07-25T19:40:35.000Z +-75.295889 40.099743 0.30000001192092896 +2013-07-25T19:40:36.000Z +-75.295958 40.099734 0.4000000059604645 +2013-07-25T19:40:37.000Z +-75.296038 40.099709 -0.20000000298023224 +2013-07-25T19:40:38.000Z +-75.296121 40.099695 -1.2000000476837158 +2013-07-25T19:40:39.000Z +-75.296204 40.099698 -1.899999976158142 +2013-07-25T19:40:40.000Z +-75.296292 40.099701 -1.7000000476837158 +2013-07-25T19:40:41.000Z +-75.296374 40.099698 -1.7999999523162842 +2013-07-25T19:40:42.000Z +-75.29644 40.099686 -1.899999976158142 +2013-07-25T19:40:43.000Z +-75.296509 40.099677 -1.0 +2013-07-25T19:40:44.000Z +-75.296583 40.099674 -0.6000000238418579 +2013-07-25T19:40:45.000Z +-75.296656 40.099673 -0.699999988079071 +2013-07-25T19:40:46.000Z +-75.296718 40.099668 -0.8999999761581421 +2013-07-25T19:40:47.000Z +-75.296789 40.099667 -1.2999999523162842 +2013-07-25T19:40:48.000Z +-75.296858 40.099674 -2.299999952316284 +2013-07-25T19:40:49.000Z +-75.29693 40.099677 -2.5999999046325684 +2013-07-25T19:40:50.000Z +-75.296992 40.099681 -3.0999999046325684 +2013-07-25T19:40:51.000Z +-75.29706 40.099679 -4.0 +2013-07-25T19:40:52.000Z +-75.297144 40.099691 -5.699999809265137 +2013-07-25T19:40:53.000Z +-75.297218 40.099704 -6.300000190734863 +2013-07-25T19:40:54.000Z +-75.297275 40.099709 -6.400000095367432 +2013-07-25T19:40:55.000Z +-75.297339 40.099717 -6.800000190734863 +2013-07-25T19:40:56.000Z +-75.297404 40.099748 -6.599999904632568 +2013-07-25T19:40:57.000Z +-75.297477 40.099768 -7.699999809265137 +2013-07-25T19:40:58.000Z +-75.29755 40.099775 -7.400000095367432 +2013-07-25T19:40:59.000Z +-75.297612 40.099795 -6.800000190734863 +2013-07-25T19:41:00.000Z +-75.297677 40.099817 -5.800000190734863 +2013-07-25T19:41:01.000Z +-75.29775 40.099841 -6.199999809265137 +2013-07-25T19:41:02.000Z +-75.297806 40.09987 -6.5 +2013-07-25T19:41:03.000Z +-75.297867 40.099894 -6.900000095367432 +2013-07-25T19:41:04.000Z +-75.297941 40.099934 -7.599999904632568 +2013-07-25T19:41:05.000Z +-75.298013 40.099964 -8.300000190734863 +2013-07-25T19:41:06.000Z +-75.2981 40.099978 -8.399999618530273 +2013-07-25T19:41:07.000Z +-75.29819 40.099983 -8.600000381469727 +2013-07-25T19:41:08.000Z +-75.298278 40.099979 -8.300000190734863 +2013-07-25T19:41:09.000Z +-75.298358 40.099978 -10.100000381469727 +2013-07-25T19:41:10.000Z +-75.298443 40.099963 -10.699999809265137 +2013-07-25T19:41:11.000Z +-75.29852 40.099942 -10.100000381469727 +2013-07-25T19:41:12.000Z +-75.298613 40.099917 -9.899999618530273 +2013-07-25T19:41:13.000Z +-75.298698 40.099895 -8.5 +2013-07-25T19:41:14.000Z +-75.298789 40.099877 -7.599999904632568 +2013-07-25T19:41:15.000Z +-75.298877 40.099858 -7.0 +2013-07-25T19:41:16.000Z +-75.298967 40.09984 -7.300000190734863 +2013-07-25T19:41:17.000Z +-75.299054 40.099822 -7.699999809265137 +2013-07-25T19:41:18.000Z +-75.299143 40.09979 -8.0 +2013-07-25T19:41:19.000Z +-75.299228 40.099755 -7.800000190734863 +2013-07-25T19:41:20.000Z +-75.299304 40.099722 -6.800000190734863 +2013-07-25T19:41:21.000Z +-75.299391 40.099701 -7.300000190734863 +2013-07-25T19:41:22.000Z +-75.299476 40.099689 -8.399999618530273 +2013-07-25T19:41:23.000Z +-75.299554 40.099667 -8.100000381469727 +2013-07-25T19:41:24.000Z +-75.299637 40.09962 -9.100000381469727 +2013-07-25T19:41:25.000Z +-75.299712 40.099588 -9.199999809265137 +2013-07-25T19:41:26.000Z +-75.299784 40.099556 -9.300000190734863 +2013-07-25T19:41:27.000Z +-75.299866 40.09953 -9.300000190734863 +2013-07-25T19:41:28.000Z +-75.299942 40.099496 -8.800000190734863 +2013-07-25T19:41:29.000Z +-75.300011 40.099468 -9.600000381469727 +2013-07-25T19:41:30.000Z +-75.300094 40.09945 -9.899999618530273 +2013-07-25T19:41:31.000Z +-75.300167 40.099432 -9.0 +2013-07-25T19:41:32.000Z +-75.300235 40.099413 -8.699999809265137 +2013-07-25T19:41:33.000Z +-75.300304 40.099415 -7.699999809265137 +2013-07-25T19:41:34.000Z +-75.300395 40.099361 -7.699999809265137 +2013-07-25T19:41:35.000Z +-75.30047 40.099324 -7.800000190734863 +2013-07-25T19:41:36.000Z +-75.300556 40.09929 -6.800000190734863 +2013-07-25T19:41:37.000Z +-75.300636 40.099254 -6.400000095367432 +2013-07-25T19:41:38.000Z +-75.300704 40.099218 -6.599999904632568 +2013-07-25T19:41:39.000Z +-75.300786 40.09919 -6.099999904632568 +2013-07-25T19:41:40.000Z +-75.300872 40.099161 -6.0 +2013-07-25T19:41:41.000Z +-75.300941 40.099128 -5.699999809265137 +2013-07-25T19:41:42.000Z +-75.30102 40.099097 -5.699999809265137 +2013-07-25T19:41:43.000Z +-75.301004 40.099122 -1.7000000476837158 +2013-07-25T19:41:44.000Z +-75.301004 40.09914 0.30000001192092896 +2013-07-25T19:41:45.001Z +-75.301006 40.099157 1.7999999523162842 +2013-07-25T19:41:46.000Z +-75.301058 40.099048 -0.6000000238418579 +2013-07-25T19:41:47.000Z +-75.301178 40.099001 -0.4000000059604645 +2013-07-25T19:41:48.000Z +-75.301281 40.098976 -0.10000000149011612 +2013-07-25T19:41:49.000Z +-75.301387 40.098961 -1.7000000476837158 +2013-07-25T19:41:50.000Z +-75.301473 40.098926 -3.9000000953674316 +2013-07-25T19:41:51.000Z +-75.301554 40.098938 -2.5999999046325684 +2013-07-25T19:41:52.000Z +-75.301628 40.098934 -3.0999999046325684 +2013-07-25T19:41:53.000Z +-75.301692 40.098967 -4.800000190734863 +2013-07-25T19:41:54.000Z +-75.301757 40.099001 -5.5 +2013-07-25T19:41:55.000Z +-75.301798 40.099021 -5.300000190734863 +2013-07-25T19:41:56.000Z +-75.301806 40.099066 -7.0 +2013-07-25T19:41:57.000Z +-75.301867 40.099099 -7.300000190734863 +2013-07-25T19:41:58.000Z +-75.301921 40.09913 -7.599999904632568 +2013-07-25T19:41:59.000Z +-75.301967 40.099157 -7.300000190734863 +2013-07-25T19:42:00.000Z +-75.302004 40.099185 -7.199999809265137 +2013-07-25T19:42:01.000Z +-75.302042 40.099216 -6.300000190734863 +2013-07-25T19:42:02.000Z +-75.302083 40.099243 -5.699999809265137 +2013-07-25T19:42:03.000Z +-75.302122 40.099273 -5.099999904632568 +2013-07-25T19:42:04.000Z +-75.302155 40.099291 -5.300000190734863 +2013-07-25T19:42:05.000Z +-75.302186 40.099308 -4.900000095367432 +2013-07-25T19:42:06.000Z +-75.30226 40.099292 -1.899999976158142 +2013-07-25T19:42:07.000Z +-75.302294 40.099308 -1.5 +2013-07-25T19:42:08.000Z +-75.302318 40.099324 -1.7000000476837158 +2013-07-25T19:42:09.000Z +-75.302347 40.099332 -1.600000023841858 +2013-07-25T19:42:10.000Z +-75.302376 40.099339 -0.699999988079071 +2013-07-25T19:42:13.000Z +-75.302431 40.099348 5.199999809265137 +2013-07-25T19:42:14.000Z +-75.302446 40.099352 5.0 +2013-07-25T19:42:16.000Z +-75.302487 40.09936 3.299999952316284 +2013-07-25T19:42:17.000Z +-75.302512 40.099358 2.5999999046325684 +2013-07-25T19:42:18.000Z +-75.302541 40.099349 2.0999999046325684 +2013-07-25T19:42:19.000Z +-75.302569 40.099335 1.600000023841858 +2013-07-25T19:42:20.000Z +-75.302595 40.099319 2.9000000953674316 +2013-07-25T19:42:21.000Z +-75.302616 40.099306 3.0 +2013-07-25T19:42:23.000Z +-75.302653 40.099286 4.0 +2013-07-25T19:42:24.000Z +-75.30267 40.099278 4.900000095367432 +2013-07-25T19:42:26.000Z +-75.302705 40.099258 4.5 +2013-07-25T19:42:27.000Z +-75.302724 40.099242 4.800000190734863 +2013-07-25T19:42:28.000Z +-75.302744 40.099223 4.300000190734863 +2013-07-25T19:42:29.000Z +-75.302767 40.099197 4.0 +2013-07-25T19:42:30.000Z +-75.302792 40.099167 3.5999999046325684 +2013-07-25T19:42:31.000Z +-75.302831 40.099114 3.4000000953674316 +2013-07-25T19:42:32.000Z +-75.302871 40.099077 3.4000000953674316 +2013-07-25T19:42:33.000Z +-75.302911 40.099033 3.700000047683716 +2013-07-25T19:42:34.000Z +-75.30295 40.098987 3.4000000953674316 +2013-07-25T19:42:35.000Z +-75.303001 40.098934 2.799999952316284 +2013-07-25T19:42:36.000Z +-75.303048 40.098882 3.0 +2013-07-25T19:42:37.000Z +-75.3031 40.098832 2.4000000953674316 +2013-07-25T19:42:38.000Z +-75.303154 40.098784 2.299999952316284 +2013-07-25T19:42:39.000Z +-75.303222 40.098737 1.7999999523162842 +2013-07-25T19:42:40.000Z +-75.303297 40.098697 1.600000023841858 +2013-07-25T19:42:41.000Z +-75.303366 40.098654 1.600000023841858 +2013-07-25T19:42:42.000Z +-75.303439 40.098616 1.7999999523162842 +2013-07-25T19:42:43.000Z +-75.303524 40.098583 1.399999976158142 +2013-07-25T19:42:44.000Z +-75.303611 40.098528 0.0 +2013-07-25T19:42:45.000Z +-75.303698 40.098503 -0.10000000149011612 +2013-07-25T19:42:46.000Z +-75.303777 40.098483 -0.30000001192092896 +2013-07-25T19:42:47.000Z +-75.303852 40.098459 -0.699999988079071 +2013-07-25T19:42:48.000Z +-75.30391 40.098463 -1.5 +2013-07-25T19:42:49.000Z +-75.303986 40.098469 -0.699999988079071 +2013-07-25T19:42:50.000Z +-75.304038 40.098473 -2.0 +2013-07-25T19:42:51.000Z +-75.304076 40.098475 -2.4000000953674316 +2013-07-25T19:42:53.000Z +-75.304123 40.098471 -2.4000000953674316 +2013-07-25T19:42:54.000Z +-75.304137 40.09847 -2.5 +2013-07-25T19:42:56.000Z +-75.304176 40.098476 -2.299999952316284 +2013-07-25T19:42:57.000Z +-75.304209 40.098469 -3.5 +2013-07-25T19:42:58.000Z +-75.304247 40.098463 -4.900000095367432 +2013-07-25T19:42:59.000Z +-75.304292 40.098455 -5.800000190734863 +2013-07-25T19:43:00.000Z +-75.304346 40.098448 -6.599999904632568 +2013-07-25T19:43:01.000Z +-75.3044 40.098441 -6.900000095367432 +2013-07-25T19:43:02.000Z +-75.304458 40.098433 -6.699999809265137 +2013-07-25T19:43:03.000Z +-75.304518 40.098425 -7.0 +2013-07-25T19:43:04.000Z +-75.304598 40.098401 -7.099999904632568 +2013-07-25T19:43:05.000Z +-75.304651 40.098395 -7.699999809265137 +2013-07-25T19:43:06.000Z +-75.304712 40.098381 -8.199999809265137 +2013-07-25T19:43:07.000Z +-75.30476 40.098368 -8.100000381469727 +2013-07-25T19:43:08.000Z +-75.304814 40.098353 -7.599999904632568 +2013-07-25T19:43:09.000Z +-75.304867 40.098341 -7.099999904632568 +2013-07-25T19:43:10.000Z +-75.304916 40.09833 -6.900000095367432 +2013-07-25T19:43:11.000Z +-75.304976 40.098323 -6.900000095367432 +2013-07-25T19:43:12.000Z +-75.305024 40.098319 -6.199999809265137 +2013-07-25T19:43:13.000Z +-75.305076 40.098311 -6.800000190734863 +2013-07-25T19:43:14.000Z +-75.305123 40.098302 -7.0 +2013-07-25T19:43:15.000Z +-75.305171 40.098289 -6.699999809265137 +2013-07-25T19:43:16.000Z +-75.305218 40.098277 -6.300000190734863 +2013-07-25T19:43:17.000Z +-75.305262 40.098267 -6.699999809265137 +2013-07-25T19:43:18.000Z +-75.305305 40.098257 -6.0 +2013-07-25T19:43:19.000Z +-75.305346 40.098247 -5.599999904632568 +2013-07-25T19:43:20.000Z +-75.305384 40.098237 -5.599999904632568 +2013-07-25T19:43:21.000Z +-75.305415 40.098227 -5.199999809265137 +2013-07-25T19:43:22.000Z +-75.305448 40.098214 -5.099999904632568 +2013-07-25T19:43:23.000Z +-75.305479 40.0982 -5.0 +2013-07-25T19:43:24.000Z +-75.305512 40.098185 -4.400000095367432 +2013-07-25T19:43:25.000Z +-75.305541 40.098171 -3.9000000953674316 +2013-07-25T19:43:26.000Z +-75.305568 40.098157 -3.5 +2013-07-25T19:43:27.000Z +-75.305595 40.098142 -3.5999999046325684 +2013-07-25T19:43:28.000Z +-75.305622 40.098128 -3.5 +2013-07-25T19:43:29.000Z +-75.305648 40.098114 -3.5 +2013-07-25T19:43:30.000Z +-75.305663 40.098091 -3.9000000953674316 +2013-07-25T19:43:31.000Z +-75.305675 40.098066 -3.200000047683716 +2013-07-25T19:43:32.000Z +-75.30569 40.098042 -3.0999999046325684 +2013-07-25T19:43:33.000Z +-75.305705 40.098021 -3.0 +2013-07-25T19:43:35.000Z +-75.30574 40.097991 -2.4000000953674316 +2013-07-25T19:43:36.000Z +-75.305759 40.097976 -1.899999976158142 +2013-07-25T19:43:38.000Z +-75.305788 40.097938 -1.100000023841858 +2013-07-25T19:43:39.000Z +-75.305799 40.097918 -0.30000001192092896 +2013-07-25T19:43:41.000Z +-75.305819 40.097876 1.0 +2013-07-25T19:43:42.000Z +-75.305832 40.097852 0.699999988079071 +2013-07-25T19:43:43.000Z +-75.30585 40.097823 0.5 +2013-07-25T19:43:44.000Z +-75.305863 40.097791 2.0999999046325684 +2013-07-25T19:43:45.000Z +-75.305867 40.09776 3.299999952316284 +2013-07-25T19:43:46.000Z +-75.305867 40.097732 4.5 +2013-07-25T19:43:47.000Z +-75.305871 40.097701 4.900000095367432 +2013-07-25T19:43:48.000Z +-75.305881 40.097665 5.199999809265137 +2013-07-25T19:43:49.000Z +-75.305901 40.097629 5.0 +2013-07-25T19:43:50.000Z +-75.305921 40.097591 5.300000190734863 +2013-07-25T19:43:51.000Z +-75.305933 40.09755 6.099999904632568 +2013-07-25T19:43:52.000Z +-75.305936 40.097508 7.099999904632568 +2013-07-25T19:43:53.000Z +-75.305934 40.097468 7.5 +2013-07-25T19:43:54.000Z +-75.305937 40.09743 7.699999809265137 +2013-07-25T19:43:55.000Z +-75.305948 40.097392 7.599999904632568 +2013-07-25T19:43:56.000Z +-75.305966 40.097353 7.0 +2013-07-25T19:43:57.000Z +-75.305986 40.097317 6.699999809265137 +2013-07-25T19:43:58.000Z +-75.306006 40.097281 7.599999904632568 +2013-07-25T19:43:59.000Z +-75.306031 40.097246 6.900000095367432 +2013-07-25T19:44:00.000Z +-75.306058 40.09721 6.900000095367432 +2013-07-25T19:44:01.000Z +-75.306086 40.097176 7.099999904632568 +2013-07-25T19:44:02.000Z +-75.306116 40.097143 7.400000095367432 +2013-07-25T19:44:03.000Z +-75.306148 40.09711 7.5 +2013-07-25T19:44:04.000Z +-75.30618 40.097075 7.699999809265137 +2013-07-25T19:44:05.000Z +-75.306211 40.097042 7.5 +2013-07-25T19:44:06.000Z +-75.306241 40.097012 7.400000095367432 +2013-07-25T19:44:07.000Z +-75.306272 40.096981 7.400000095367432 +2013-07-25T19:44:08.000Z +-75.306305 40.096951 6.800000190734863 +2013-07-25T19:44:09.000Z +-75.306336 40.096923 6.699999809265137 +2013-07-25T19:44:10.000Z +-75.306368 40.096898 6.699999809265137 +2013-07-25T19:44:11.000Z +-75.3064 40.096872 6.300000190734863 +2013-07-25T19:44:12.000Z +-75.306431 40.096842 6.5 +2013-07-25T19:44:13.000Z +-75.306456 40.09681 7.0 +2013-07-25T19:44:14.000Z +-75.306476 40.096777 7.199999809265137 +2013-07-25T19:44:15.000Z +-75.306493 40.096742 7.099999904632568 +2013-07-25T19:44:16.000Z +-75.306516 40.096707 6.900000095367432 +2013-07-25T19:44:17.000Z +-75.30654 40.096677 6.599999904632568 +2013-07-25T19:44:18.000Z +-75.306566 40.096652 6.699999809265137 +2013-07-25T19:44:19.000Z +-75.306593 40.09663 7.199999809265137 +2013-07-25T19:44:20.000Z +-75.306624 40.096612 6.699999809265137 +2013-07-25T19:44:21.000Z +-75.306652 40.096596 6.699999809265137 +2013-07-25T19:44:22.000Z +-75.306678 40.096582 6.5 +2013-07-25T19:44:23.000Z +-75.306708 40.09657 5.699999809265137 +2013-07-25T19:44:24.000Z +-75.306742 40.096564 5.199999809265137 +2013-07-25T19:44:25.000Z +-75.306777 40.096557 4.599999904632568 +2013-07-25T19:44:26.000Z +-75.306811 40.096548 4.599999904632568 +2013-07-25T19:44:27.000Z +-75.306847 40.096535 4.900000095367432 +2013-07-25T19:44:28.000Z +-75.306881 40.096516 5.300000190734863 +2013-07-25T19:44:29.000Z +-75.306915 40.096492 5.300000190734863 +2013-07-25T19:44:30.000Z +-75.306948 40.096465 5.300000190734863 +2013-07-25T19:44:31.000Z +-75.307007 40.096426 4.699999809265137 +2013-07-25T19:44:32.000Z +-75.307049 40.096391 4.800000190734863 +2013-07-25T19:44:33.000Z +-75.307082 40.096355 5.5 +2013-07-25T19:44:34.000Z +-75.307116 40.096316 6.199999809265137 +2013-07-25T19:44:35.000Z +-75.307156 40.096277 6.699999809265137 +2013-07-25T19:44:36.000Z +-75.307197 40.096242 6.900000095367432 +2013-07-25T19:44:37.000Z +-75.307231 40.096195 6.300000190734863 +2013-07-25T19:44:38.000Z +-75.307276 40.096156 6.199999809265137 +2013-07-25T19:44:39.000Z +-75.307318 40.096112 6.599999904632568 +2013-07-25T19:44:40.000Z +-75.30737 40.096067 6.800000190734863 +2013-07-25T19:44:41.000Z +-75.307417 40.096019 6.699999809265137 +2013-07-25T19:44:42.000Z +-75.307469 40.09598 6.400000095367432 +2013-07-25T19:44:43.000Z +-75.307519 40.095937 6.0 +2013-07-25T19:44:44.000Z +-75.307578 40.095891 5.5 +2013-07-25T19:44:45.000Z +-75.30764 40.09584 5.400000095367432 +2013-07-25T19:44:46.000Z +-75.307696 40.095804 5.5 +2013-07-25T19:44:47.000Z +-75.307756 40.095752 5.400000095367432 +2013-07-25T19:44:48.000Z +-75.307816 40.095695 5.900000095367432 +2013-07-25T19:44:49.000Z +-75.307872 40.095644 6.199999809265137 +2013-07-25T19:44:50.000Z +-75.307924 40.095594 6.099999904632568 +2013-07-25T19:44:51.000Z +-75.307983 40.095547 6.0 +2013-07-25T19:44:52.000Z +-75.308043 40.095497 6.0 +2013-07-25T19:44:53.000Z +-75.308103 40.095452 6.599999904632568 +2013-07-25T19:44:54.000Z +-75.308163 40.095415 5.900000095367432 +2013-07-25T19:44:55.000Z +-75.308224 40.095364 4.699999809265137 +2013-07-25T19:44:56.000Z +-75.308279 40.095317 3.799999952316284 +2013-07-25T19:44:57.000Z +-75.308334 40.095275 3.799999952316284 +2013-07-25T19:44:58.000Z +-75.308389 40.095228 3.5999999046325684 +2013-07-25T19:44:59.000Z +-75.30845 40.095185 3.4000000953674316 +2013-07-25T19:45:00.000Z +-75.308509 40.095139 3.9000000953674316 +2013-07-25T19:45:01.000Z +-75.308573 40.095083 3.799999952316284 +2013-07-25T19:45:02.000Z +-75.308635 40.095032 3.299999952316284 +2013-07-25T19:45:03.000Z +-75.308704 40.09498 2.5999999046325684 +2013-07-25T19:45:04.000Z +-75.308777 40.094924 2.799999952316284 +2013-07-25T19:45:05.000Z +-75.308841 40.09487 2.200000047683716 +2013-07-25T19:45:06.000Z +-75.308896 40.09482 2.299999952316284 +2013-07-25T19:45:07.000Z +-75.30895 40.094776 2.0999999046325684 +2013-07-25T19:45:08.000Z +-75.309005 40.094722 2.0999999046325684 +2013-07-25T19:45:09.000Z +-75.30906 40.09467 1.2000000476837158 +2013-07-25T19:45:10.000Z +-75.309116 40.094615 0.800000011920929 +2013-07-25T19:45:11.000Z +-75.309173 40.09456 1.0 +2013-07-25T19:45:12.000Z +-75.309238 40.094509 1.2000000476837158 +2013-07-25T19:45:13.000Z +-75.309298 40.094458 1.100000023841858 +2013-07-25T19:45:14.000Z +-75.309359 40.094408 1.2999999523162842 +2013-07-25T19:45:15.000Z +-75.309418 40.09436 1.0 +2013-07-25T19:45:16.000Z +-75.309483 40.094313 1.0 +2013-07-25T19:45:17.000Z +-75.30955 40.094268 0.4000000059604645 +2013-07-25T19:45:18.000Z +-75.30961 40.094208 -0.20000000298023224 +2013-07-25T19:45:19.000Z +-75.30967 40.094153 -0.5 +2013-07-25T19:45:19.999Z +-75.309731 40.094101 -0.8999999761581421 +2013-07-25T19:45:21.000Z +-75.309791 40.094061 -0.20000000298023224 +2013-07-25T19:45:22.000Z +-75.309848 40.094009 -0.10000000149011612 +2013-07-25T19:45:23.000Z +-75.309908 40.093955 -0.30000001192092896 +2013-07-25T19:45:24.000Z +-75.309975 40.093906 0.0 +2013-07-25T19:45:25.000Z +-75.310041 40.093861 0.20000000298023224 +2013-07-25T19:45:26.000Z +-75.3101 40.09382 0.0 +2013-07-25T19:45:27.000Z +-75.310162 40.09378 0.0 +2013-07-25T19:45:28.000Z +-75.310224 40.093733 0.0 +2013-07-25T19:45:29.000Z +-75.310282 40.093692 -0.8999999761581421 +2013-07-25T19:45:30.000Z +-75.31034 40.093644 -1.100000023841858 +2013-07-25T19:45:31.000Z +-75.310404 40.093591 -1.2000000476837158 +2013-07-25T19:45:32.000Z +-75.310471 40.093534 -1.399999976158142 +2013-07-25T19:45:33.000Z +-75.310531 40.093479 -1.399999976158142 +2013-07-25T19:45:34.000Z +-75.310596 40.093426 -0.8999999761581421 +2013-07-25T19:45:35.000Z +-75.310648 40.093353 -1.100000023841858 +2013-07-25T19:45:36.000Z +-75.310684 40.093275 -1.899999976158142 +2013-07-25T19:45:37.000Z +-75.310713 40.093197 -2.700000047683716 +2013-07-25T19:45:38.000Z +-75.310747 40.093133 -3.200000047683716 +2013-07-25T19:45:39.000Z +-75.310773 40.093073 -2.5 +2013-07-25T19:45:40.000Z +-75.310803 40.093004 -2.5 +2013-07-25T19:45:41.000Z +-75.310837 40.092942 -2.700000047683716 +2013-07-25T19:45:42.000Z +-75.310869 40.092876 -3.200000047683716 +2013-07-25T19:45:43.000Z +-75.310891 40.092809 -3.5 +2013-07-25T19:45:44.000Z +-75.310916 40.092736 -3.700000047683716 +2013-07-25T19:45:45.000Z +-75.310931 40.092661 -4.300000190734863 +2013-07-25T19:45:46.000Z +-75.31096 40.092591 -4.699999809265137 +2013-07-25T19:45:47.000Z +-75.31098 40.092521 -5.300000190734863 +2013-07-25T19:45:48.000Z +-75.310995 40.09245 -5.400000095367432 +2013-07-25T19:45:49.000Z +-75.311 40.092396 -4.800000190734863 +2013-07-25T19:45:50.000Z +-75.311018 40.092349 -4.300000190734863 +2013-07-25T19:45:51.000Z +-75.311035 40.092322 -4.800000190734863 +2013-07-25T19:45:52.000Z +-75.311066 40.092283 -6.099999904632568 +2013-07-25T19:45:59.000Z +-75.311108 40.092253 -8.300000190734863 +2013-07-25T19:46:00.000Z +-75.311109 40.09225 -8.399999618530273 +2013-07-25T19:46:03.000Z +-75.311125 40.092246 -8.899999618530273 +2013-07-25T19:46:04.000Z +-75.311164 40.092228 -9.800000190734863 +2013-07-25T19:46:05.000Z +-75.311201 40.092228 -9.399999618530273 +2013-07-25T19:46:06.000Z +-75.311237 40.092224 -9.399999618530273 +2013-07-25T19:46:07.000Z +-75.31127 40.09222 -9.5 +2013-07-25T19:46:08.000Z +-75.311299 40.092211 -8.300000190734863 +2013-07-25T19:46:10.000Z +-75.311337 40.092189 -9.300000190734863 +2013-07-25T19:46:11.000Z +-75.311356 40.092168 -9.0 +2013-07-25T19:46:12.000Z +-75.31138 40.092143 -8.800000190734863 +2013-07-25T19:46:13.000Z +-75.311409 40.092115 -8.199999809265137 +2013-07-25T19:46:14.000Z +-75.311444 40.092092 -8.199999809265137 +2013-07-25T19:46:15.000Z +-75.311481 40.092072 -8.100000381469727 +2013-07-25T19:46:16.000Z +-75.311522 40.092053 -7.599999904632568 +2013-07-25T19:46:17.000Z +-75.311564 40.092036 -7.599999904632568 +2013-07-25T19:46:18.000Z +-75.311606 40.092016 -6.900000095367432 +2013-07-25T19:46:19.000Z +-75.311646 40.091993 -6.800000190734863 +2013-07-25T19:46:20.000Z +-75.311686 40.091967 -6.800000190734863 +2013-07-25T19:46:21.000Z +-75.311725 40.09194 -6.599999904632568 +2013-07-25T19:46:22.000Z +-75.311763 40.091915 -6.699999809265137 +2013-07-25T19:46:23.000Z +-75.311803 40.091888 -6.699999809265137 +2013-07-25T19:46:24.000Z +-75.311846 40.09186 -6.400000095367432 +2013-07-25T19:46:25.000Z +-75.311886 40.091831 -6.599999904632568 +2013-07-25T19:46:26.000Z +-75.311926 40.091801 -6.599999904632568 +2013-07-25T19:46:27.000Z +-75.311974 40.091761 -6.099999904632568 +2013-07-25T19:46:28.000Z +-75.312013 40.091726 -5.699999809265137 +2013-07-25T19:46:29.000Z +-75.312047 40.091689 -5.5 +2013-07-25T19:46:30.000Z +-75.312069 40.09165 -5.199999809265137 +2013-07-25T19:46:31.000Z +-75.312109 40.091628 -4.699999809265137 +2013-07-25T19:46:32.000Z +-75.312111 40.091578 -3.4000000953674316 +2013-07-25T19:46:33.000Z +-75.312089 40.091523 -1.7000000476837158 +2013-07-25T19:46:34.000Z +-75.312079 40.091472 -1.2000000476837158 +2013-07-25T19:46:35.000Z +-75.312082 40.091426 -1.2000000476837158 +2013-07-25T19:46:36.000Z +-75.312086 40.091373 -0.800000011920929 +2013-07-25T19:46:37.000Z +-75.312098 40.091324 -2.0 +2013-07-25T19:46:38.000Z +-75.312091 40.091276 -1.899999976158142 +2013-07-25T19:46:39.000Z +-75.312089 40.091228 -2.0999999046325684 +2013-07-25T19:46:40.000Z +-75.312087 40.091178 -2.5999999046325684 +2013-07-25T19:46:41.000Z +-75.312085 40.091123 -2.0999999046325684 +2013-07-25T19:46:42.000Z +-75.312081 40.091071 -1.899999976158142 +2013-07-25T19:46:43.000Z +-75.312071 40.091017 -1.899999976158142 +2013-07-25T19:46:44.000Z +-75.312062 40.09096 -2.4000000953674316 +2013-07-25T19:46:45.000Z +-75.312051 40.090902 -2.0999999046325684 +2013-07-25T19:46:46.000Z +-75.312044 40.09085 -1.899999976158142 +2013-07-25T19:46:47.000Z +-75.312043 40.090799 -2.0999999046325684 +2013-07-25T19:46:48.000Z +-75.312046 40.090744 -2.0999999046325684 +2013-07-25T19:46:49.000Z +-75.312047 40.090687 -2.4000000953674316 +2013-07-25T19:46:50.000Z +-75.312037 40.090631 -2.0999999046325684 +2013-07-25T19:46:51.000Z +-75.312028 40.090576 -2.299999952316284 +2013-07-25T19:46:52.001Z +-75.312016 40.090516 -2.4000000953674316 +2013-07-25T19:46:53.000Z +-75.311999 40.090458 -2.200000047683716 +2013-07-25T19:46:54.000Z +-75.311979 40.0904 -2.799999952316284 +2013-07-25T19:46:54.999Z +-75.311959 40.090341 -3.5999999046325684 +2013-07-25T19:46:56.000Z +-75.311936 40.090295 -3.0999999046325684 +2013-07-25T19:46:57.001Z +-75.311914 40.090238 -3.0 +2013-07-25T19:46:58.000Z +-75.311897 40.090185 -3.5999999046325684 +2013-07-25T19:46:59.000Z +-75.311873 40.090135 -4.800000190734863 +2013-07-25T19:47:00.000Z +-75.311859 40.090083 -5.599999904632568 +2013-07-25T19:47:01.000Z +-75.311841 40.090026 -5.900000095367432 +2013-07-25T19:47:02.000Z +-75.31182 40.089973 -6.199999809265137 +2013-07-25T19:47:03.000Z +-75.311799 40.089916 -6.5 +2013-07-25T19:47:04.000Z +-75.311764 40.089864 -4.300000190734863 +2013-07-25T19:47:05.000Z +-75.311731 40.089811 -4.199999809265137 +2013-07-25T19:47:06.000Z +-75.3117 40.089757 -4.0 +2013-07-25T19:47:07.000Z +-75.311647 40.089725 1.5 +2013-07-25T19:47:08.000Z +-75.311605 40.089671 1.899999976158142 +2013-07-25T19:47:09.000Z +-75.31156 40.089618 1.7000000476837158 +2013-07-25T19:47:10.000Z +-75.311516 40.089561 1.399999976158142 +2013-07-25T19:47:11.000Z +-75.311479 40.089494 1.2000000476837158 +2013-07-25T19:47:12.000Z +-75.31145 40.08942 3.799999952316284 +2013-07-25T19:47:13.000Z +-75.311423 40.08935 4.0 +2013-07-25T19:47:14.000Z +-75.311402 40.089285 4.400000095367432 +2013-07-25T19:47:15.000Z +-75.311378 40.089223 4.0 +2013-07-25T19:47:16.000Z +-75.311362 40.089152 3.799999952316284 +2013-07-25T19:47:17.000Z +-75.311341 40.089085 3.299999952316284 +2013-07-25T19:47:18.000Z +-75.311319 40.089019 3.200000047683716 +2013-07-25T19:47:19.000Z +-75.3113 40.088954 3.0 +2013-07-25T19:47:20.000Z +-75.311289 40.088891 1.7999999523162842 +2013-07-25T19:47:21.000Z +-75.311275 40.088825 1.5 +2013-07-25T19:47:22.000Z +-75.311262 40.088753 0.20000000298023224 +2013-07-25T19:47:23.000Z +-75.311241 40.088684 -0.30000001192092896 +2013-07-25T19:47:24.000Z +-75.311222 40.088616 -0.8999999761581421 +2013-07-25T19:47:25.000Z +-75.311203 40.088553 -1.5 +2013-07-25T19:47:26.000Z +-75.311189 40.088489 -1.5 +2013-07-25T19:47:27.000Z +-75.311175 40.088429 -2.0999999046325684 +2013-07-25T19:47:28.000Z +-75.31117 40.088363 -1.899999976158142 +2013-07-25T19:47:29.000Z +-75.311167 40.088301 -2.299999952316284 +2013-07-25T19:47:30.000Z +-75.311163 40.088239 -2.0999999046325684 +2013-07-25T19:47:31.000Z +-75.311176 40.088181 -2.299999952316284 +2013-07-25T19:47:32.000Z +-75.311186 40.088117 -1.7000000476837158 +2013-07-25T19:47:33.000Z +-75.311199 40.088055 -1.399999976158142 +2013-07-25T19:47:34.000Z +-75.311212 40.087994 -0.6000000238418579 +2013-07-25T19:47:35.000Z +-75.311226 40.087928 -0.699999988079071 +2013-07-25T19:47:36.000Z +-75.311236 40.087864 -0.6000000238418579 +2013-07-25T19:47:37.000Z +-75.311244 40.087804 -1.0 +2013-07-25T19:47:38.000Z +-75.311259 40.087743 -0.800000011920929 +2013-07-25T19:47:39.000Z +-75.311267 40.087682 -0.10000000149011612 +2013-07-25T19:47:40.000Z +-75.311274 40.087616 0.30000001192092896 +2013-07-25T19:47:41.000Z +-75.311273 40.087553 0.30000001192092896 +2013-07-25T19:47:42.000Z +-75.311271 40.087497 0.800000011920929 +2013-07-25T19:47:43.000Z +-75.311263 40.087431 0.4000000059604645 +2013-07-25T19:47:44.000Z +-75.311254 40.087367 0.30000001192092896 +2013-07-25T19:47:45.000Z +-75.31125 40.087301 0.0 +2013-07-25T19:47:46.000Z +-75.311241 40.087235 -0.30000001192092896 +2013-07-25T19:47:47.000Z +-75.311235 40.087167 0.30000001192092896 +2013-07-25T19:47:48.000Z +-75.311236 40.087102 0.4000000059604645 +2013-07-25T19:47:49.000Z +-75.311232 40.087039 -0.5 +2013-07-25T19:47:50.000Z +-75.311225 40.086969 -0.699999988079071 +2013-07-25T19:47:51.000Z +-75.311223 40.086903 -0.8999999761581421 +2013-07-25T19:47:52.000Z +-75.311215 40.086836 -1.600000023841858 +2013-07-25T19:47:53.000Z +-75.311203 40.086766 -2.9000000953674316 +2013-07-25T19:47:54.000Z +-75.311189 40.086702 -3.5999999046325684 +2013-07-25T19:47:55.000Z +-75.311179 40.086635 -3.9000000953674316 +2013-07-25T19:47:56.000Z +-75.311168 40.086561 -3.700000047683716 +2013-07-25T19:47:57.000Z +-75.311157 40.086496 -3.4000000953674316 +2013-07-25T19:47:58.000Z +-75.311146 40.08643 -3.299999952316284 +2013-07-25T19:47:59.000Z +-75.31114 40.086363 -3.4000000953674316 +2013-07-25T19:48:00.000Z +-75.31113 40.086288 -4.199999809265137 +2013-07-25T19:48:01.000Z +-75.311122 40.086226 -4.199999809265137 +2013-07-25T19:48:02.000Z +-75.311116 40.086166 -4.0 +2013-07-25T19:48:03.000Z +-75.311118 40.086094 -4.5 +2013-07-25T19:48:03.999Z +-75.311115 40.086032 -4.400000095367432 +2013-07-25T19:48:05.000Z +-75.311107 40.085966 -4.599999904632568 +2013-07-25T19:48:06.000Z +-75.311095 40.085901 -4.400000095367432 +2013-07-25T19:48:07.000Z +-75.311085 40.085855 -2.4000000953674316 +2013-07-25T19:48:08.000Z +-75.311079 40.085799 -1.5 +2013-07-25T19:48:09.000Z +-75.311078 40.085741 -1.2000000476837158 +2013-07-25T19:48:10.000Z +-75.311068 40.085682 -1.100000023841858 +2013-07-25T19:48:11.001Z +-75.311064 40.085622 -1.100000023841858 +2013-07-25T19:48:12.000Z +-75.311061 40.085565 -0.699999988079071 +2013-07-25T19:48:13.000Z +-75.311066 40.085514 -0.699999988079071 +2013-07-25T19:48:14.000Z +-75.311073 40.085451 2.0 +2013-07-25T19:48:15.000Z +-75.311076 40.085391 3.0999999046325684 +2013-07-25T19:48:16.000Z +-75.311078 40.085342 2.200000047683716 +2013-07-25T19:48:17.000Z +-75.311073 40.085283 1.399999976158142 +2013-07-25T19:48:18.000Z +-75.31107 40.085223 1.899999976158142 +2013-07-25T19:48:19.000Z +-75.31107 40.085167 2.700000047683716 +2013-07-25T19:48:20.000Z +-75.311091 40.085101 2.700000047683716 +2013-07-25T19:48:21.000Z +-75.311109 40.085039 2.200000047683716 +2013-07-25T19:48:22.000Z +-75.311123 40.08498 2.200000047683716 +2013-07-25T19:48:23.000Z +-75.311142 40.08492 1.7999999523162842 +2013-07-25T19:48:24.000Z +-75.311152 40.084854 1.7000000476837158 +2013-07-25T19:48:25.000Z +-75.311191 40.084809 0.10000000149011612 +2013-07-25T19:48:26.000Z +-75.311211 40.084753 -1.5 +2013-07-25T19:48:27.000Z +-75.31123 40.084689 -2.5 +2013-07-25T19:48:28.000Z +-75.311255 40.084626 -3.200000047683716 +2013-07-25T19:48:29.000Z +-75.311287 40.084569 -0.20000000298023224 +2013-07-25T19:48:30.000Z +-75.311309 40.084511 2.5999999046325684 +2013-07-25T19:48:31.000Z +-75.311327 40.084448 0.0 +2013-07-25T19:48:32.000Z +-75.311352 40.084402 0.10000000149011612 +2013-07-25T19:48:33.000Z +-75.311381 40.084352 0.0 +2013-07-25T19:48:34.000Z +-75.3114 40.084301 0.0 +2013-07-25T19:48:35.000Z +-75.311415 40.084211 0.0 +2013-07-25T19:48:36.000Z +-75.311439 40.084158 -0.30000001192092896 +2013-07-25T19:48:37.000Z +-75.311455 40.0841 -0.4000000059604645 +2013-07-25T19:48:38.000Z +-75.311495 40.084053 -0.699999988079071 +2013-07-25T19:48:39.000Z +-75.311518 40.083998 -0.800000011920929 +2013-07-25T19:48:40.000Z +-75.311547 40.083946 -1.2000000476837158 +2013-07-25T19:48:41.000Z +-75.311565 40.083891 -1.100000023841858 +2013-07-25T19:48:42.000Z +-75.311588 40.083835 -1.0 +2013-07-25T19:48:43.000Z +-75.311605 40.083782 -0.6000000238418579 +2013-07-25T19:48:43.999Z +-75.311622 40.083727 -0.30000001192092896 +2013-07-25T19:48:45.000Z +-75.311629 40.08367 -0.699999988079071 +2013-07-25T19:48:46.000Z +-75.311637 40.083614 -0.800000011920929 +2013-07-25T19:48:47.000Z +-75.311654 40.083563 -1.0 +2013-07-25T19:48:48.000Z +-75.31167 40.083512 -1.899999976158142 +2013-07-25T19:48:49.000Z +-75.311694 40.083453 -3.0 +2013-07-25T19:48:50.000Z +-75.311701 40.083394 -2.5 +2013-07-25T19:48:51.000Z +-75.311711 40.083337 -2.5999999046325684 +2013-07-25T19:48:52.000Z +-75.311745 40.08332 -2.5999999046325684 +2013-07-25T19:48:53.000Z +-75.311811 40.083364 -3.200000047683716 +2013-07-25T19:48:56.000Z +-75.311855 40.083348 -5.300000190734863 +2013-07-25T19:48:57.000Z +-75.311924 40.083312 -4.900000095367432 +2013-07-25T19:48:58.000Z +-75.311926 40.083224 -5.0 +2013-07-25T19:48:59.000Z +-75.311861 40.083091 -4.199999809265137 +2013-07-25T19:49:00.000Z +-75.31186 40.083005 -3.200000047683716 +2013-07-25T19:49:01.000Z +-75.311879 40.08292 -2.700000047683716 +2013-07-25T19:49:02.000Z +-75.311887 40.08287 -2.799999952316284 +2013-07-25T19:49:04.000Z +-75.311869 40.082845 -5.199999809265137 +2013-07-25T19:49:05.000Z +-75.311834 40.082827 -0.800000011920929 +2013-07-25T19:49:06.000Z +-75.311867 40.082704 1.7000000476837158 +2013-07-25T19:49:07.000Z +-75.311877 40.082622 3.4000000953674316 +2013-07-25T19:49:08.000Z +-75.311871 40.082531 3.799999952316284 +2013-07-25T19:49:09.000Z +-75.311869 40.082466 3.9000000953674316 +2013-07-25T19:49:10.000Z +-75.311858 40.08237 4.099999904632568 +2013-07-25T19:49:11.000Z +-75.311841 40.082281 5.900000095367432 +2013-07-25T19:49:12.000Z +-75.311837 40.08224 8.300000190734863 +2013-07-25T19:49:13.000Z +-75.31183 40.082164 9.0 +2013-07-25T19:49:14.000Z +-75.311842 40.082097 9.600000381469727 +2013-07-25T19:49:15.000Z +-75.311859 40.082025 10.100000381469727 +2013-07-25T19:49:16.000Z +-75.311907 40.081979 10.800000190734863 +2013-07-25T19:49:17.000Z +-75.311944 40.081923 10.800000190734863 +2013-07-25T19:49:18.000Z +-75.311967 40.081879 11.0 +2013-07-25T19:49:19.000Z +-75.311986 40.081826 10.300000190734863 +2013-07-25T19:49:20.000Z +-75.311997 40.081782 10.899999618530273 +2013-07-25T19:49:21.000Z +-75.311992 40.081714 9.600000381469727 +2013-07-25T19:49:22.000Z +-75.312008 40.081652 9.399999618530273 +2013-07-25T19:49:23.000Z +-75.312026 40.081593 8.600000381469727 +2013-07-25T19:49:24.000Z +-75.312037 40.081537 8.199999809265137 +2013-07-25T19:49:25.000Z +-75.312061 40.081499 5.400000095367432 +2013-07-25T19:49:25.999Z +-75.312079 40.081463 4.599999904632568 +2013-07-25T19:49:27.000Z +-75.312087 40.081424 3.799999952316284 +2013-07-25T19:49:28.000Z +-75.312086 40.081392 4.599999904632568 +2013-07-25T19:49:29.000Z +-75.312081 40.081341 5.099999904632568 +2013-07-25T19:49:31.000Z +-75.312092 40.081301 5.199999809265137 +2013-07-25T19:49:32.000Z +-75.312118 40.081221 5.599999904632568 +2013-07-25T19:49:33.000Z +-75.312131 40.081184 5.5 +2013-07-25T19:49:34.000Z +-75.312141 40.081127 5.599999904632568 +2013-07-25T19:49:35.000Z +-75.312142 40.081006 5.300000190734863 +2013-07-25T19:49:36.000Z +-75.312155 40.08092 5.099999904632568 +2013-07-25T19:49:37.000Z +-75.312177 40.080846 5.400000095367432 +2013-07-25T19:49:38.000Z +-75.312184 40.080769 9.100000381469727 +2013-07-25T19:49:39.000Z +-75.312194 40.080709 10.0 +2013-07-25T19:49:40.000Z +-75.312201 40.080657 10.100000381469727 +2013-07-25T19:49:41.000Z +-75.31218 40.080581 7.699999809265137 +2013-07-25T19:49:42.000Z +-75.312231 40.080532 5.699999809265137 +2013-07-25T19:49:43.000Z +-75.312277 40.080465 4.599999904632568 +2013-07-25T19:49:44.000Z +-75.312313 40.080406 5.400000095367432 +2013-07-25T19:49:45.000Z +-75.312366 40.080343 5.099999904632568 +2013-07-25T19:49:46.000Z +-75.312349 40.080259 5.900000095367432 +2013-07-25T19:49:47.000Z +-75.312348 40.080201 6.099999904632568 +2013-07-25T19:49:48.000Z +-75.312356 40.080138 6.0 +2013-07-25T19:49:49.000Z +-75.312354 40.080083 5.599999904632568 +2013-07-25T19:49:50.000Z +-75.312368 40.080039 5.099999904632568 +2013-07-25T19:49:51.000Z +-75.31254 40.080074 4.199999809265137 +2013-07-25T19:49:52.000Z +-75.312595 40.080029 3.0 +2013-07-25T19:49:53.000Z +-75.312609 40.079998 2.4000000953674316 +2013-07-25T19:49:54.000Z +-75.312634 40.079953 2.4000000953674316 +2013-07-25T19:49:55.000Z +-75.312673 40.079899 2.200000047683716 +2013-07-25T19:49:56.000Z +-75.312682 40.079853 1.2000000476837158 +2013-07-25T19:49:57.000Z +-75.312711 40.079819 0.20000000298023224 +2013-07-25T19:49:58.000Z +-75.312731 40.079747 2.5999999046325684 +2013-07-25T19:49:59.000Z +-75.31276 40.079684 1.399999976158142 +2013-07-25T19:50:00.000Z +-75.312777 40.079643 1.7999999523162842 +2013-07-25T19:50:01.000Z +-75.312788 40.079612 2.299999952316284 +2013-07-25T19:50:02.000Z +-75.31276 40.079558 2.5999999046325684 +2013-07-25T19:50:03.000Z +-75.312789 40.079474 4.400000095367432 +2013-07-25T19:50:04.000Z +-75.312811 40.079411 4.400000095367432 +2013-07-25T19:50:05.000Z +-75.312846 40.079352 3.5999999046325684 +2013-07-25T19:50:06.000Z +-75.312868 40.079275 3.9000000953674316 +2013-07-25T19:50:07.000Z +-75.312875 40.079213 2.799999952316284 +2013-07-25T19:50:08.000Z +-75.312892 40.07916 2.0999999046325684 +2013-07-25T19:50:09.000Z +-75.312925 40.0791 1.600000023841858 +2013-07-25T19:50:10.000Z +-75.312927 40.079051 1.7000000476837158 +2013-07-25T19:50:11.000Z +-75.312917 40.078985 0.10000000149011612 +2013-07-25T19:50:12.000Z +-75.312913 40.078923 0.0 +2013-07-25T19:50:13.000Z +-75.3129 40.07888 0.8999999761581421 +2013-07-25T19:50:14.000Z +-75.3129 40.078822 1.2000000476837158 +2013-07-25T19:50:15.000Z +-75.312899 40.078763 1.0 +2013-07-25T19:50:16.000Z +-75.312895 40.078704 1.0 +2013-07-25T19:50:17.000Z +-75.31287 40.078624 2.200000047683716 +2013-07-25T19:50:18.000Z +-75.312852 40.078564 3.0 +2013-07-25T19:50:19.000Z +-75.312844 40.078524 4.599999904632568 +2013-07-25T19:50:20.000Z +-75.312848 40.078464 5.599999904632568 +2013-07-25T19:50:21.000Z +-75.312855 40.078411 4.199999809265137 +2013-07-25T19:50:22.001Z +-75.312854 40.078356 3.299999952316284 +2013-07-25T19:50:23.000Z +-75.312847 40.078335 4.800000190734863 +2013-07-25T19:50:24.002Z +-75.312839 40.078292 4.800000190734863 +2013-07-25T19:50:25.000Z +-75.312842 40.078265 4.900000095367432 +2013-07-25T19:50:26.000Z +-75.312841 40.078222 5.099999904632568 +2013-07-25T19:50:29.000Z +-75.312845 40.07821 5.400000095367432 +2013-07-25T19:50:30.000Z +-75.312794 40.078182 5.400000095367432 +2013-07-25T19:50:31.000Z +-75.312812 40.078115 3.4000000953674316 +2013-07-25T19:50:32.000Z +-75.312795 40.078094 4.0 +2013-07-25T19:50:33.000Z +-75.312775 40.078068 4.800000190734863 +2013-07-25T19:50:34.000Z +-75.312768 40.078032 4.599999904632568 +2013-07-25T19:50:35.000Z +-75.312769 40.077989 4.300000190734863 +2013-07-25T19:50:36.000Z +-75.312765 40.077941 4.5 +2013-07-25T19:50:37.000Z +-75.312757 40.077891 5.400000095367432 +2013-07-25T19:50:38.000Z +-75.312737 40.07784 5.599999904632568 +2013-07-25T19:50:39.000Z +-75.312672 40.077671 6.099999904632568 +2013-07-25T19:50:40.000Z +-75.312666 40.077597 4.599999904632568 +2013-07-25T19:50:41.000Z +-75.312653 40.077538 4.800000190734863 +2013-07-25T19:50:42.000Z +-75.312654 40.077476 2.9000000953674316 +2013-07-25T19:50:43.000Z +-75.312635 40.077436 3.299999952316284 +2013-07-25T19:50:44.000Z +-75.31261 40.077393 3.5999999046325684 +2013-07-25T19:50:45.000Z +-75.312606 40.077357 3.9000000953674316 +2013-07-25T19:50:46.000Z +-75.312602 40.077317 4.0 +2013-07-25T19:50:47.000Z +-75.312572 40.077281 4.699999809265137 +2013-07-25T19:50:48.000Z +-75.312558 40.0772 7.800000190734863 +2013-07-25T19:50:49.000Z +-75.312572 40.077144 7.400000095367432 +2013-07-25T19:50:50.000Z +-75.312567 40.07709 6.5 +2013-07-25T19:50:51.000Z +-75.312533 40.077052 6.5 +2013-07-25T19:50:52.000Z +-75.31252 40.077011 4.900000095367432 +2013-07-25T19:50:53.000Z +-75.312516 40.076981 4.099999904632568 +2013-07-25T19:50:54.001Z +-75.312503 40.076956 4.300000190734863 +2013-07-25T19:50:55.000Z +-75.312485 40.076904 5.300000190734863 +2013-07-25T19:50:56.000Z +-75.312463 40.076726 3.0 +2013-07-25T19:50:57.000Z +-75.312471 40.076665 4.300000190734863 +2013-07-25T19:50:58.000Z +-75.312457 40.076628 5.300000190734863 +2013-07-25T19:50:59.000Z +-75.312472 40.076596 6.400000095367432 +2013-07-25T19:51:00.000Z +-75.312457 40.076549 5.199999809265137 +2013-07-25T19:51:01.999Z +-75.312467 40.076515 4.400000095367432 +2013-07-25T19:51:03.000Z +-75.312444 40.076477 2.0999999046325684 +2013-07-25T19:51:06.000Z +-75.312464 40.07645 -0.10000000149011612 +2013-07-25T19:51:07.000Z +-75.312478 40.076438 -1.100000023841858 +2013-07-25T19:51:13.000Z +-75.312527 40.076427 -5.0 +2013-07-25T19:51:14.000Z +-75.312535 40.076427 -4.800000190734863 +2013-07-25T19:51:17.000Z +-75.312573 40.076451 -11.199999809265137 +2013-07-25T19:51:18.000Z +-75.312584 40.076462 -11.199999809265137 +2013-07-25T19:51:21.000Z +-75.312617 40.076489 -10.199999809265137 +2013-07-25T19:51:22.000Z +-75.312633 40.076494 -11.300000190734863 +2013-07-25T19:51:25.000Z +-75.312689 40.076495 -11.699999809265137 +2013-07-25T19:51:26.000Z +-75.312705 40.076494 -11.399999618530273 +2013-07-25T19:51:29.000Z +-75.312751 40.076495 -10.100000381469727 +2013-07-25T19:51:30.000Z +-75.31277 40.076492 -9.699999809265137 +2013-07-25T19:51:32.000Z +-75.31281 40.076481 -9.600000381469727 +2013-07-25T19:51:33.000Z +-75.312828 40.076475 -10.800000190734863 +2013-07-25T19:51:35.000Z +-75.312866 40.076457 -11.899999618530273 +2013-07-25T19:51:36.000Z +-75.312885 40.076448 -10.5 +2013-07-25T19:51:38.000Z +-75.312919 40.076429 -7.099999904632568 +2013-07-25T19:51:39.000Z +-75.312931 40.076418 -6.099999904632568 +2013-07-25T19:51:42.000Z +-75.312975 40.076396 -5.5 +2013-07-25T19:51:43.000Z +-75.312996 40.076393 -6.199999809265137 +2013-07-25T19:51:45.000Z +-75.313042 40.076379 -3.799999952316284 +2013-07-25T19:51:46.000Z +-75.313065 40.07637 -2.799999952316284 +2013-07-25T19:51:47.000Z +-75.313089 40.076357 -2.200000047683716 +2013-07-25T19:51:48.000Z +-75.313119 40.076343 -0.8999999761581421 +2013-07-25T19:51:49.000Z +-75.313151 40.076335 -0.4000000059604645 +2013-07-25T19:51:50.000Z +-75.313184 40.076324 -0.800000011920929 +2013-07-25T19:51:51.000Z +-75.313218 40.076312 -1.100000023841858 +2013-07-25T19:51:52.000Z +-75.313246 40.076297 -1.100000023841858 +2013-07-25T19:51:54.000Z +-75.313274 40.076264 1.0 +2013-07-25T19:51:55.000Z +-75.313266 40.076247 1.5 +2013-07-25T19:51:56.000Z +-75.313245 40.07623 1.399999976158142 +2013-07-25T19:51:57.000Z +-75.313217 40.076216 1.0 +2013-07-25T19:51:58.000Z +-75.313186 40.076203 0.6000000238418579 +2013-07-25T19:51:59.000Z +-75.313161 40.07619 0.20000000298023224 +2013-07-25T19:52:00.000Z +-75.313123 40.07617 -1.2999999523162842 +2013-07-25T19:52:01.000Z +-75.313097 40.076154 -1.5 +2013-07-25T19:52:02.000Z +-75.313052 40.076133 -1.899999976158142 +2013-07-25T19:52:03.000Z +-75.313011 40.076113 -1.600000023841858 +2013-07-25T19:52:04.000Z +-75.312968 40.076096 0.0 +2013-07-25T19:52:05.000Z +-75.312931 40.07608 2.200000047683716 +2013-07-25T19:52:06.000Z +-75.312904 40.076065 5.199999809265137 +2013-07-25T19:52:07.000Z +-75.31288 40.076052 8.100000381469727 +2013-07-25T19:52:08.000Z +-75.312859 40.076036 10.300000190734863 +2013-07-25T19:52:09.000Z +-75.312829 40.076018 9.600000381469727 +2013-07-25T19:52:10.000Z +-75.312795 40.075999 8.300000190734863 +2013-07-25T19:52:11.000Z +-75.312763 40.075983 7.099999904632568 +2013-07-25T19:52:12.000Z +-75.312708 40.075964 6.599999904632568 +2013-07-25T19:52:13.000Z +-75.312667 40.075949 6.099999904632568 +2013-07-25T19:52:14.000Z +-75.312609 40.075924 7.699999809265137 +2013-07-25T19:52:15.000Z +-75.312555 40.075902 8.300000190734863 +2013-07-25T19:52:16.000Z +-75.312499 40.075877 7.599999904632568 +2013-07-25T19:52:17.000Z +-75.312448 40.075852 6.599999904632568 +2013-07-25T19:52:18.000Z +-75.3124 40.075829 6.099999904632568 +2013-07-25T19:52:19.000Z +-75.312349 40.075799 7.5 +2013-07-25T19:52:20.000Z +-75.312283 40.075767 8.600000381469727 +2013-07-25T19:52:21.000Z +-75.312235 40.075742 8.899999618530273 +2013-07-25T19:52:22.000Z +-75.312196 40.075725 8.199999809265137 +2013-07-25T19:52:23.000Z +-75.312176 40.075668 7.300000190734863 +2013-07-25T19:52:24.000Z +-75.312147 40.07563 7.0 +2013-07-25T19:52:25.000Z +-75.312106 40.075582 5.199999809265137 +2013-07-25T19:52:26.000Z +-75.312065 40.075547 4.400000095367432 +2013-07-25T19:52:27.000Z +-75.312038 40.075502 3.700000047683716 +2013-07-25T19:52:28.000Z +-75.312029 40.07545 3.299999952316284 +2013-07-25T19:52:29.000Z +-75.312062 40.075411 3.9000000953674316 +2013-07-25T19:52:30.002Z +-75.312082 40.075367 4.300000190734863 +2013-07-25T19:52:31.000Z +-75.312084 40.075335 4.0 +2013-07-25T19:52:32.000Z +-75.312105 40.075303 4.099999904632568 +2013-07-25T19:52:33.000Z +-75.312069 40.075272 4.0 +2013-07-25T19:52:34.000Z +-75.312031 40.075229 3.799999952316284 +2013-07-25T19:52:35.000Z +-75.311927 40.075206 4.800000190734863 +2013-07-25T19:52:36.000Z +-75.311901 40.075159 4.300000190734863 +2013-07-25T19:52:37.000Z +-75.311873 40.075114 4.099999904632568 +2013-07-25T19:52:38.000Z +-75.311848 40.075055 3.4000000953674316 +2013-07-25T19:52:39.000Z +-75.311818 40.074992 2.9000000953674316 +2013-07-25T19:52:40.000Z +-75.311802 40.074929 2.5 +2013-07-25T19:52:41.000Z +-75.311796 40.074851 1.2000000476837158 +2013-07-25T19:52:42.000Z +-75.311793 40.074785 0.20000000298023224 +2013-07-25T19:52:43.000Z +-75.311792 40.074716 -0.6000000238418579 +2013-07-25T19:52:44.000Z +-75.311812 40.074651 -0.5 +2013-07-25T19:52:45.000Z +-75.311829 40.074574 -0.800000011920929 +2013-07-25T19:52:46.000Z +-75.311826 40.074501 -1.2000000476837158 +2013-07-25T19:52:47.000Z +-75.311799 40.074429 -0.30000001192092896 +2013-07-25T19:52:48.000Z +-75.311777 40.074353 0.4000000059604645 +2013-07-25T19:52:49.000Z +-75.311744 40.074285 1.100000023841858 +2013-07-25T19:52:50.000Z +-75.311675 40.074235 1.5 +2013-07-25T19:52:51.000Z +-75.311614 40.074176 1.2999999523162842 +2013-07-25T19:52:52.000Z +-75.311568 40.074093 1.100000023841858 +2013-07-25T19:52:53.000Z +-75.311479 40.07406 1.2999999523162842 +2013-07-25T19:52:54.000Z +-75.311401 40.074002 1.2000000476837158 +2013-07-25T19:52:55.000Z +-75.311358 40.073923 0.0 +2013-07-25T19:52:56.000Z +-75.311281 40.073872 0.4000000059604645 +2013-07-25T19:52:57.000Z +-75.311206 40.073825 0.8999999761581421 +2013-07-25T19:52:58.000Z +-75.31114 40.073785 1.2000000476837158 +2013-07-25T19:52:59.000Z +-75.311074 40.073744 1.7999999523162842 +2013-07-25T19:53:00.000Z +-75.311021 40.073688 1.0 +2013-07-25T19:53:01.000Z +-75.310962 40.073654 0.699999988079071 +2013-07-25T19:53:02.000Z +-75.31091 40.073616 0.10000000149011612 +2013-07-25T19:53:03.000Z +-75.310853 40.073583 0.4000000059604645 +2013-07-25T19:53:04.000Z +-75.310786 40.073544 1.0 +2013-07-25T19:53:05.000Z +-75.310718 40.073511 1.7999999523162842 +2013-07-25T19:53:06.000Z +-75.310653 40.073475 2.299999952316284 +2013-07-25T19:53:07.000Z +-75.310595 40.073425 1.7999999523162842 +2013-07-25T19:53:08.000Z +-75.31054 40.073375 0.20000000298023224 +2013-07-25T19:53:09.000Z +-75.310479 40.07333 -0.6000000238418579 +2013-07-25T19:53:10.000Z +-75.310407 40.073293 -0.699999988079071 +2013-07-25T19:53:11.000Z +-75.310338 40.073252 -0.6000000238418579 +2013-07-25T19:53:12.000Z +-75.310269 40.073205 -1.2000000476837158 +2013-07-25T19:53:13.000Z +-75.310207 40.073153 -2.299999952316284 +2013-07-25T19:53:14.000Z +-75.310128 40.073115 -1.7999999523162842 +2013-07-25T19:53:15.000Z +-75.310054 40.073067 -2.700000047683716 +2013-07-25T19:53:16.000Z +-75.309975 40.073026 -4.400000095367432 +2013-07-25T19:53:17.000Z +-75.309895 40.072994 -4.099999904632568 +2013-07-25T19:53:18.000Z +-75.30981 40.07297 -2.5 +2013-07-25T19:53:19.000Z +-75.309738 40.072934 -1.100000023841858 +2013-07-25T19:53:20.000Z +-75.309673 40.072875 -0.699999988079071 +2013-07-25T19:53:21.000Z +-75.309607 40.072829 -0.800000011920929 +2013-07-25T19:53:22.000Z +-75.309548 40.072764 -1.899999976158142 +2013-07-25T19:53:23.000Z +-75.309489 40.072719 -1.5 +2013-07-25T19:53:24.000Z +-75.309417 40.072691 -1.600000023841858 +2013-07-25T19:53:25.000Z +-75.309347 40.072652 -1.5 +2013-07-25T19:53:26.000Z +-75.309284 40.072624 -1.100000023841858 +2013-07-25T19:53:27.000Z +-75.309219 40.072586 -1.5 +2013-07-25T19:53:28.000Z +-75.309153 40.07255 -1.899999976158142 +2013-07-25T19:53:29.000Z +-75.309089 40.072519 -1.600000023841858 +2013-07-25T19:53:30.000Z +-75.309023 40.072492 -1.7000000476837158 +2013-07-25T19:53:31.000Z +-75.308956 40.072463 -1.600000023841858 +2013-07-25T19:53:32.000Z +-75.308878 40.072433 -1.7000000476837158 +2013-07-25T19:53:33.000Z +-75.308798 40.072405 -2.0 +2013-07-25T19:53:34.000Z +-75.308732 40.072375 -2.200000047683716 +2013-07-25T19:53:35.000Z +-75.308668 40.072341 -2.200000047683716 +2013-07-25T19:53:36.000Z +-75.308599 40.07231 -2.5 +2013-07-25T19:53:37.000Z +-75.308535 40.07228 -2.5999999046325684 +2013-07-25T19:53:38.000Z +-75.308474 40.072257 -2.799999952316284 +2013-07-25T19:53:39.000Z +-75.308404 40.072232 -3.299999952316284 +2013-07-25T19:53:40.000Z +-75.308336 40.072209 -3.0 +2013-07-25T19:53:41.000Z +-75.308281 40.07219 -3.5999999046325684 +2013-07-25T19:53:42.000Z +-75.308215 40.072167 -4.0 +2013-07-25T19:53:46.000Z +-75.308174 40.072158 0.5 +2013-07-25T19:53:47.000Z +-75.308129 40.072196 1.5 +2013-07-25T19:53:48.000Z +-75.308084 40.072228 3.0 +2013-07-25T19:53:49.000Z +-75.308001 40.072179 1.7999999523162842 +2013-07-25T19:53:50.000Z +-75.30792 40.07215 1.100000023841858 +2013-07-25T19:53:51.000Z +-75.307864 40.072122 0.800000011920929 +2013-07-25T19:53:52.000Z +-75.307801 40.07209 0.30000001192092896 +2013-07-25T19:53:53.000Z +-75.307741 40.072072 1.100000023841858 +2013-07-25T19:53:54.000Z +-75.307687 40.072055 1.0 +2013-07-25T19:53:55.000Z +-75.307648 40.072046 2.200000047683716 +2013-07-25T19:53:58.000Z +-75.307595 40.072052 4.400000095367432 +2013-07-25T19:53:59.000Z +-75.307575 40.072048 4.5 +2013-07-25T19:54:00.000Z +-75.307537 40.072036 5.0 +2013-07-25T19:54:01.000Z +-75.307488 40.072019 5.699999809265137 +2013-07-25T19:54:02.000Z +-75.307437 40.072006 6.300000190734863 +2013-07-25T19:54:03.000Z +-75.30738 40.071987 8.199999809265137 +2013-07-25T19:54:04.000Z +-75.307319 40.071968 7.400000095367432 +2013-07-25T19:54:05.000Z +-75.307256 40.071942 6.199999809265137 +2013-07-25T19:54:06.000Z +-75.307197 40.071914 4.800000190734863 +2013-07-25T19:54:07.000Z +-75.307144 40.071882 3.0999999046325684 +2013-07-25T19:54:08.000Z +-75.307096 40.071845 1.7000000476837158 +2013-07-25T19:54:09.000Z +-75.307052 40.071808 2.4000000953674316 +2013-07-25T19:54:10.000Z +-75.307002 40.071775 4.199999809265137 +2013-07-25T19:54:11.000Z +-75.306953 40.071747 5.599999904632568 +2013-07-25T19:54:12.000Z +-75.306897 40.071731 5.800000190734863 +2013-07-25T19:54:13.000Z +-75.306839 40.071727 5.699999809265137 +2013-07-25T19:54:14.000Z +-75.306774 40.071729 5.400000095367432 +2013-07-25T19:54:15.000Z +-75.306711 40.071734 4.800000190734863 +2013-07-25T19:54:16.000Z +-75.306648 40.071738 5.400000095367432 +2013-07-25T19:54:17.000Z +-75.306589 40.071739 5.699999809265137 +2013-07-25T19:54:18.000Z +-75.306536 40.071739 8.100000381469727 +2013-07-25T19:54:19.000Z +-75.306487 40.071737 8.699999809265137 +2013-07-25T19:54:20.000Z +-75.30644 40.071735 9.399999618530273 +2013-07-25T19:54:21.000Z +-75.306391 40.071727 8.899999618530273 +2013-07-25T19:54:22.000Z +-75.30634 40.071719 9.0 +2013-07-25T19:54:23.000Z +-75.306286 40.071706 8.699999809265137 +2013-07-25T19:54:24.000Z +-75.30623 40.071693 8.600000381469727 +2013-07-25T19:54:25.000Z +-75.306183 40.07168 8.800000190734863 +2013-07-25T19:54:26.000Z +-75.306148 40.071669 9.300000190734863 +2013-07-25T19:54:27.000Z +-75.306111 40.071653 8.899999618530273 +2013-07-25T19:54:28.000Z +-75.306067 40.071634 9.600000381469727 +2013-07-25T19:54:29.000Z +-75.305909 40.071582 9.899999618530273 +2013-07-25T19:54:30.001Z +-75.305848 40.071567 10.199999809265137 +2013-07-25T19:54:31.000Z +-75.305768 40.071573 8.399999618530273 +2013-07-25T19:54:32.000Z +-75.30573 40.071563 8.300000190734863 +2013-07-25T19:54:33.000Z +-75.305681 40.071558 8.5 +2013-07-25T19:54:34.000Z +-75.305614 40.071543 8.5 +2013-07-25T19:54:35.000Z +-75.305571 40.071525 8.800000190734863 +2013-07-25T19:54:36.000Z +-75.305483 40.071541 8.300000190734863 +2013-07-25T19:54:37.000Z +-75.305407 40.071536 7.0 +2013-07-25T19:54:38.000Z +-75.305341 40.071545 7.0 +2013-07-25T19:54:39.000Z +-75.305285 40.071552 7.199999809265137 +2013-07-25T19:54:40.000Z +-75.305234 40.071537 7.199999809265137 +2013-07-25T19:54:41.000Z +-75.305176 40.071527 7.800000190734863 +2013-07-25T19:54:42.000Z +-75.305114 40.071511 7.699999809265137 +2013-07-25T19:54:43.000Z +-75.305051 40.071514 7.800000190734863 +2013-07-25T19:54:44.000Z +-75.305002 40.071516 8.100000381469727 +2013-07-25T19:54:45.000Z +-75.304947 40.071512 7.300000190734863 +2013-07-25T19:54:46.000Z +-75.304895 40.071524 7.199999809265137 +2013-07-25T19:54:47.000Z +-75.304848 40.071529 6.699999809265137 +2013-07-25T19:54:48.000Z +-75.304803 40.071534 6.699999809265137 +2013-07-25T19:54:49.000Z +-75.30476 40.071535 6.099999904632568 +2013-07-25T19:54:50.000Z +-75.304716 40.071532 6.900000095367432 +2013-07-25T19:54:51.000Z +-75.304671 40.071525 6.699999809265137 +2013-07-25T19:54:52.000Z +-75.304622 40.071514 5.599999904632568 +2013-07-25T19:54:53.000Z +-75.304576 40.071501 6.800000190734863 +2013-07-25T19:54:54.000Z +-75.304525 40.071495 5.0 +2013-07-25T19:54:55.000Z +-75.304474 40.071493 4.800000190734863 +2013-07-25T19:54:56.000Z +-75.304417 40.071495 4.5 +2013-07-25T19:54:57.000Z +-75.304364 40.071501 5.5 +2013-07-25T19:54:58.000Z +-75.304304 40.07151 3.799999952316284 +2013-07-25T19:54:59.000Z +-75.304187 40.071512 2.799999952316284 +2013-07-25T19:55:00.000Z +-75.304133 40.071519 2.5 +2013-07-25T19:55:01.000Z +-75.30408 40.071534 1.7999999523162842 +2013-07-25T19:55:02.000Z +-75.304005 40.071539 2.700000047683716 +2013-07-25T19:55:03.000Z +-75.303946 40.071555 1.100000023841858 +2013-07-25T19:55:04.000Z +-75.303896 40.071558 0.6000000238418579 +2013-07-25T19:55:05.000Z +-75.303857 40.07157 1.899999976158142 +2013-07-25T19:55:06.000Z +-75.303804 40.071578 2.5999999046325684 +2013-07-25T19:55:07.000Z +-75.303753 40.071602 3.5 +2013-07-25T19:55:08.000Z +-75.30367 40.07161 4.800000190734863 +2013-07-25T19:55:09.000Z +-75.303598 40.071606 5.300000190734863 +2013-07-25T19:55:10.000Z +-75.303528 40.071607 6.5 +2013-07-25T19:55:11.000Z +-75.303453 40.071615 6.800000190734863 +2013-07-25T19:55:12.000Z +-75.303388 40.071617 6.599999904632568 +2013-07-25T19:55:13.000Z +-75.303333 40.071637 5.599999904632568 +2013-07-25T19:55:14.000Z +-75.303285 40.071651 5.800000190734863 +2013-07-25T19:55:15.000Z +-75.303218 40.07164 6.400000095367432 +2013-07-25T19:55:16.000Z +-75.303186 40.071649 6.099999904632568 +2013-07-25T19:55:17.000Z +-75.30315 40.071663 6.5 +2013-07-25T19:55:18.000Z +-75.303093 40.071686 6.900000095367432 +2013-07-25T19:55:19.000Z +-75.303033 40.071687 7.400000095367432 +2013-07-25T19:55:20.000Z +-75.302952 40.071706 6.800000190734863 +2013-07-25T19:55:21.000Z +-75.302879 40.071695 6.699999809265137 +2013-07-25T19:55:22.000Z +-75.302835 40.07171 6.900000095367432 +2013-07-25T19:55:23.000Z +-75.302777 40.07172 6.699999809265137 +2013-07-25T19:55:24.000Z +-75.302715 40.071733 7.599999904632568 +2013-07-25T19:55:25.000Z +-75.302659 40.071741 8.100000381469727 +2013-07-25T19:55:26.000Z +-75.302603 40.071749 8.199999809265137 +2013-07-25T19:55:27.000Z +-75.302549 40.071758 8.699999809265137 +2013-07-25T19:55:28.000Z +-75.302494 40.071766 7.400000095367432 +2013-07-25T19:55:29.000Z +-75.302442 40.071774 5.099999904632568 +2013-07-25T19:55:30.000Z +-75.302395 40.071785 5.300000190734863 +2013-07-25T19:55:31.000Z +-75.302356 40.071801 5.099999904632568 +2013-07-25T19:55:32.000Z +-75.302321 40.071814 8.800000190734863 +2013-07-25T19:55:33.000Z +-75.302294 40.071824 11.399999618530273 +2013-07-25T19:55:34.000Z +-75.302266 40.07183 13.800000190734863 +2013-07-25T19:55:35.000Z +-75.302233 40.071821 14.300000190734863 +2013-07-25T19:55:36.000Z +-75.302202 40.071813 12.600000381469727 +2013-07-25T19:55:37.000Z +-75.302159 40.071811 12.0 +2013-07-25T19:55:38.000Z +-75.302107 40.071815 14.100000381469727 +2013-07-25T19:55:39.000Z +-75.302052 40.071824 13.399999618530273 +2013-07-25T19:55:40.000Z +-75.301989 40.071835 12.699999809265137 +2013-07-25T19:55:41.000Z +-75.301927 40.071844 12.899999618530273 +2013-07-25T19:55:42.000Z +-75.301864 40.071853 14.0 +2013-07-25T19:55:43.000Z +-75.3018 40.071859 14.100000381469727 +2013-07-25T19:55:44.000Z +-75.301738 40.071866 14.100000381469727 +2013-07-25T19:55:45.000Z +-75.30168 40.07187 14.300000190734863 +2013-07-25T19:55:46.000Z +-75.30162 40.071877 13.399999618530273 +2013-07-25T19:55:47.000Z +-75.30156 40.071886 13.300000190734863 +2013-07-25T19:55:48.000Z +-75.301495 40.071894 11.899999618530273 +2013-07-25T19:55:49.000Z +-75.301436 40.071897 13.100000381469727 +2013-07-25T19:55:50.000Z +-75.301383 40.0719 13.0 +2013-07-25T19:55:51.000Z +-75.301334 40.071906 9.800000190734863 +2013-07-25T19:55:52.000Z +-75.301295 40.071912 9.800000190734863 +2013-07-25T19:55:53.000Z +-75.301265 40.071922 9.399999618530273 +2013-07-25T19:55:54.000Z +-75.301241 40.071934 10.0 +2013-07-25T19:55:56.000Z +-75.301201 40.071958 4.900000095367432 +2013-07-25T19:55:57.000Z +-75.301182 40.071971 1.100000023841858 +2013-07-25T19:56:06.000Z +-75.301232 40.071974 -4.400000095367432 +2013-07-25T19:56:07.000Z +-75.301258 40.071966 -5.5 +2013-07-25T19:56:08.000Z +-75.301289 40.071958 -6.300000190734863 +2013-07-25T19:56:09.000Z +-75.30132 40.071953 -7.800000190734863 +2013-07-25T19:56:10.000Z +-75.301353 40.071948 -7.599999904632568 +2013-07-25T19:56:11.000Z +-75.301388 40.071941 -7.800000190734863 +2013-07-25T19:56:12.000Z +-75.301423 40.071932 -7.800000190734863 +2013-07-25T19:56:13.000Z +-75.301454 40.071923 -7.699999809265137 +2013-07-25T19:56:14.000Z +-75.301486 40.07191 -8.199999809265137 +2013-07-25T19:56:15.000Z +-75.301517 40.071899 -8.899999618530273 +2013-07-25T19:56:16.000Z +-75.301547 40.071889 -8.300000190734863 +2013-07-25T19:56:17.000Z +-75.301585 40.071882 -8.300000190734863 +2013-07-25T19:56:18.000Z +-75.301625 40.071875 -7.099999904632568 +2013-07-25T19:56:19.000Z +-75.301668 40.071869 -7.599999904632568 +2013-07-25T19:56:20.000Z +-75.301715 40.071865 -8.199999809265137 +2013-07-25T19:56:21.000Z +-75.30176 40.071864 -7.0 +2013-07-25T19:56:22.000Z +-75.301798 40.071861 -7.900000095367432 +2013-07-25T19:56:23.000Z +-75.301827 40.071854 -7.900000095367432 +2013-07-25T19:56:54.000Z +-75.301799 40.071875 -7.300000190734863 +2013-07-25T19:56:55.000Z +-75.301772 40.071875 -7.400000095367432 +2013-07-25T19:56:57.000Z +-75.301714 40.07188 -6.599999904632568 +2013-07-25T19:56:58.000Z +-75.301681 40.071884 -6.699999809265137 +2013-07-25T19:56:59.000Z +-75.301644 40.071892 -6.5 +2013-07-25T19:57:00.000Z +-75.301601 40.071901 -5.800000190734863 +2013-07-25T19:57:01.000Z +-75.301558 40.071911 -6.0 +2013-07-25T19:57:02.000Z +-75.301512 40.07192 -5.599999904632568 +2013-07-25T19:57:03.000Z +-75.301465 40.071929 -5.599999904632568 +2013-07-25T19:57:04.000Z +-75.301415 40.071936 -5.199999809265137 +2013-07-25T19:57:05.000Z +-75.301366 40.071944 -4.800000190734863 +2013-07-25T19:57:06.000Z +-75.301317 40.071954 -4.400000095367432 +2013-07-25T19:57:07.000Z +-75.301266 40.071965 -3.9000000953674316 +2013-07-25T19:57:08.000Z +-75.301212 40.071978 -3.5999999046325684 +2013-07-25T19:57:09.000Z +-75.301162 40.07199 -3.4000000953674316 +2013-07-25T19:57:10.000Z +-75.301109 40.071999 -2.9000000953674316 +2013-07-25T19:57:11.000Z +-75.301053 40.072007 -2.5 +2013-07-25T19:57:12.000Z +-75.300996 40.072013 -2.4000000953674316 +2013-07-25T19:57:13.000Z +-75.300942 40.07202 -2.200000047683716 +2013-07-25T19:57:14.000Z +-75.300876 40.072017 -0.30000001192092896 +2013-07-25T19:57:15.000Z +-75.30083 40.072031 0.0 +2013-07-25T19:57:16.000Z +-75.300771 40.072035 0.6000000238418579 +2013-07-25T19:57:17.000Z +-75.300718 40.072044 0.800000011920929 +2013-07-25T19:57:18.000Z +-75.300665 40.072053 1.399999976158142 +2013-07-25T19:57:19.000Z +-75.300611 40.072064 2.4000000953674316 +2013-07-25T19:57:20.000Z +-75.300549 40.072069 2.799999952316284 +2013-07-25T19:57:21.000Z +-75.300495 40.072077 3.0999999046325684 +2013-07-25T19:57:22.000Z +-75.300428 40.072079 3.4000000953674316 +2013-07-25T19:57:23.000Z +-75.300372 40.072091 3.0 +2013-07-25T19:57:24.000Z +-75.30032 40.072095 3.4000000953674316 +2013-07-25T19:57:25.000Z +-75.300264 40.072104 4.099999904632568 +2013-07-25T19:57:26.000Z +-75.300201 40.072114 4.900000095367432 +2013-07-25T19:57:27.000Z +-75.300135 40.072122 5.300000190734863 +2013-07-25T19:57:28.000Z +-75.300076 40.072137 5.599999904632568 +2013-07-25T19:57:29.000Z +-75.30002 40.072148 5.099999904632568 +2013-07-25T19:57:30.000Z +-75.299964 40.072171 4.800000190734863 +2013-07-25T19:57:31.000Z +-75.2999 40.072187 4.099999904632568 +2013-07-25T19:57:32.000Z +-75.299836 40.072203 4.5 +2013-07-25T19:57:33.000Z +-75.299785 40.072217 4.800000190734863 +2013-07-25T19:57:34.000Z +-75.299724 40.072232 4.5 +2013-07-25T19:57:35.000Z +-75.299673 40.07224 4.400000095367432 +2013-07-25T19:57:36.000Z +-75.29961 40.072256 4.099999904632568 +2013-07-25T19:57:37.000Z +-75.299556 40.072273 4.199999809265137 +2013-07-25T19:57:38.000Z +-75.299503 40.072284 3.799999952316284 +2013-07-25T19:57:39.000Z +-75.299445 40.072299 3.799999952316284 +2013-07-25T19:57:40.000Z +-75.299388 40.072314 4.0 +2013-07-25T19:57:41.000Z +-75.299337 40.072323 3.9000000953674316 +2013-07-25T19:57:42.000Z +-75.299293 40.072326 4.5 +2013-07-25T19:57:43.000Z +-75.299239 40.072329 4.800000190734863 +2013-07-25T19:57:44.000Z +-75.299181 40.072343 5.0 +2013-07-25T19:57:45.000Z +-75.299126 40.07235 5.400000095367432 +2013-07-25T19:57:46.000Z +-75.29907 40.072368 5.699999809265137 +2013-07-25T19:57:47.000Z +-75.299005 40.072382 4.599999904632568 +2013-07-25T19:57:48.000Z +-75.298946 40.072392 4.199999809265137 +2013-07-25T19:57:49.000Z +-75.298895 40.072401 4.099999904632568 +2013-07-25T19:57:50.000Z +-75.298851 40.072408 3.799999952316284 +2013-07-25T19:57:51.000Z +-75.298788 40.072431 4.099999904632568 +2013-07-25T19:57:52.000Z +-75.298765 40.072449 4.400000095367432 +2013-07-25T19:57:53.000Z +-75.2987 40.072459 4.699999809265137 +2013-07-25T19:57:54.000Z +-75.298647 40.072474 3.5 +2013-07-25T19:57:55.000Z +-75.298579 40.072488 3.799999952316284 +2013-07-25T19:57:56.000Z +-75.298516 40.07253 3.700000047683716 +2013-07-25T19:57:57.000Z +-75.298442 40.07254 3.700000047683716 +2013-07-25T19:57:58.000Z +-75.298371 40.072542 4.199999809265137 +2013-07-25T19:57:59.000Z +-75.298318 40.0725 4.599999904632568 +2013-07-25T19:58:00.000Z +-75.298246 40.072503 4.900000095367432 +2013-07-25T19:58:01.000Z +-75.298182 40.072514 4.5 +2013-07-25T19:58:02.000Z +-75.298118 40.072527 4.199999809265137 +2013-07-25T19:58:03.000Z +-75.298072 40.07254 4.199999809265137 +2013-07-25T19:58:03.999Z +-75.298022 40.072549 4.300000190734863 +2013-07-25T19:58:05.000Z +-75.297932 40.072559 4.400000095367432 +2013-07-25T19:58:06.000Z +-75.297871 40.07258 4.699999809265137 +2013-07-25T19:58:07.000Z +-75.297792 40.072582 3.0 +2013-07-25T19:58:08.000Z +-75.297735 40.072586 2.700000047683716 +2013-07-25T19:58:09.000Z +-75.297661 40.072592 1.399999976158142 +2013-07-25T19:58:10.000Z +-75.297585 40.072592 0.4000000059604645 +2013-07-25T19:58:11.000Z +-75.297514 40.072597 0.0 +2013-07-25T19:58:12.000Z +-75.297449 40.072606 0.699999988079071 +2013-07-25T19:58:13.000Z +-75.297392 40.072619 0.4000000059604645 +2013-07-25T19:58:14.000Z +-75.297322 40.072634 -0.10000000149011612 +2013-07-25T19:58:15.000Z +-75.29726 40.072646 0.0 +2013-07-25T19:58:16.000Z +-75.297197 40.072668 0.30000001192092896 +2013-07-25T19:58:17.000Z +-75.29713 40.072673 0.4000000059604645 +2013-07-25T19:58:18.000Z +-75.297062 40.072676 0.10000000149011612 +2013-07-25T19:58:19.000Z +-75.296991 40.072682 -0.6000000238418579 +2013-07-25T19:58:20.000Z +-75.29693 40.072704 -3.4000000953674316 +2013-07-25T19:58:21.000Z +-75.29686 40.072734 -7.5 +2013-07-25T19:58:22.000Z +-75.296792 40.072766 -10.399999618530273 +2013-07-25T19:58:23.000Z +-75.296717 40.072781 -14.199999809265137 +2013-07-25T19:58:24.000Z +-75.296646 40.072799 -16.799999237060547 +2013-07-25T19:58:25.000Z +-75.296579 40.07282 -18.200000762939453 +2013-07-25T19:58:26.000Z +-75.29652 40.072843 -22.5 +2013-07-25T19:58:27.000Z +-75.296452 40.072876 -26.399999618530273 +2013-07-25T19:58:28.000Z +-75.29637 40.072912 -29.200000762939453 +2013-07-25T19:58:29.000Z +-75.296302 40.072926 -28.799999237060547 +2013-07-25T19:58:30.000Z +-75.296231 40.072935 -28.799999237060547 +2013-07-25T19:58:31.001Z +-75.296168 40.072945 -28.700000762939453 +2013-07-25T19:58:32.000Z +-75.296109 40.072956 -30.0 +2013-07-25T19:58:33.000Z +-75.296045 40.072974 -31.600000381469727 +2013-07-25T19:58:34.000Z +-75.295981 40.072986 -32.5 +2013-07-25T19:58:35.000Z +-75.295923 40.073 -33.599998474121094 +2013-07-25T19:58:36.000Z +-75.295864 40.073007 -33.599998474121094 +2013-07-25T19:58:37.000Z +-75.295825 40.073008 -33.0 +2013-07-25T19:58:38.000Z +-75.295775 40.07303 -31.600000381469727 +2013-07-25T19:58:39.000Z +-75.295716 40.073034 -32.099998474121094 +2013-07-25T19:58:40.000Z +-75.295651 40.073038 -32.20000076293945 +2013-07-25T19:58:41.000Z +-75.295591 40.073041 -32.099998474121094 +2013-07-25T19:58:42.000Z +-75.295536 40.073052 -32.20000076293945 +2013-07-25T19:58:43.000Z +-75.295476 40.073067 -32.70000076293945 +2013-07-25T19:58:44.000Z +-75.295409 40.073074 -32.5 +2013-07-25T19:58:45.000Z +-75.295352 40.073079 -31.799999237060547 +2013-07-25T19:58:46.000Z +-75.295292 40.073087 -31.5 +2013-07-25T19:58:47.000Z +-75.295233 40.073087 -31.399999618530273 +2013-07-25T19:58:48.000Z +-75.295177 40.073084 -29.799999237060547 +2013-07-25T19:58:49.000Z +-75.295122 40.073097 -29.200000762939453 +2013-07-25T19:58:50.000Z +-75.295066 40.07311 -28.299999237060547 +2013-07-25T19:58:51.000Z +-75.295006 40.07312 -28.5 +2013-07-25T19:58:52.000Z +-75.294936 40.07313 -29.0 +2013-07-25T19:58:53.000Z +-75.29488 40.073139 -29.0 +2013-07-25T19:58:54.000Z +-75.294822 40.073147 -28.600000381469727 +2013-07-25T19:58:55.000Z +-75.294761 40.073154 -28.100000381469727 +2013-07-25T19:58:56.000Z +-75.294696 40.073161 -29.299999237060547 +2013-07-25T19:58:57.000Z +-75.294638 40.073162 -30.100000381469727 +2013-07-25T19:58:58.000Z +-75.294578 40.073166 -29.899999618530273 +2013-07-25T19:58:59.000Z +-75.294522 40.073176 -29.899999618530273 +2013-07-25T19:59:00.000Z +-75.294462 40.073189 -31.799999237060547 +2013-07-25T19:59:01.000Z +-75.2944 40.073202 -33.0 +2013-07-25T19:59:02.000Z +-75.294349 40.073215 -32.599998474121094 +2013-07-25T19:59:03.000Z +-75.294286 40.073227 -33.79999923706055 +2013-07-25T19:59:04.000Z +-75.294228 40.073238 -33.79999923706055 +2013-07-25T19:59:05.000Z +-75.29417 40.073246 -34.099998474121094 +2013-07-25T19:59:06.000Z +-75.294122 40.07326 -34.79999923706055 +2013-07-25T19:59:07.000Z +-75.294055 40.073274 -35.900001525878906 +2013-07-25T19:59:08.000Z +-75.293993 40.07329 -36.099998474121094 +2013-07-25T19:59:09.000Z +-75.293933 40.073304 -36.599998474121094 +2013-07-25T19:59:10.000Z +-75.293896 40.073305 -32.79999923706055 +2013-07-25T19:59:11.000Z +-75.293828 40.073316 -32.099998474121094 +2013-07-25T19:59:12.000Z +-75.293768 40.073319 -31.700000762939453 +2013-07-25T19:59:12.999Z +-75.293711 40.073326 -31.0 +2013-07-25T19:59:14.000Z +-75.293642 40.073332 -32.099998474121094 +2013-07-25T19:59:15.000Z +-75.293584 40.073332 -31.100000381469727 +2013-07-25T19:59:16.000Z +-75.293534 40.073332 -30.5 +2013-07-25T19:59:17.000Z +-75.293485 40.073335 -30.700000762939453 +2013-07-25T19:59:18.000Z +-75.293447 40.073336 -30.600000381469727 +2013-07-25T19:59:20.000Z +-75.293402 40.073357 -26.700000762939453 +2013-07-25T19:59:21.000Z +-75.293367 40.073353 -20.899999618530273 +2013-07-25T19:59:22.000Z +-75.293283 40.073365 -18.5 +2013-07-25T19:59:23.000Z +-75.29321 40.073375 -18.5 +2013-07-25T19:59:24.000Z +-75.293168 40.073392 -18.5 +2013-07-25T19:59:25.000Z +-75.293086 40.073405 -17.899999618530273 +2013-07-25T19:59:26.002Z +-75.293029 40.073423 -17.799999237060547 +2013-07-25T19:59:27.000Z +-75.292937 40.073434 -17.200000762939453 +2013-07-25T19:59:28.000Z +-75.292859 40.073445 -16.700000762939453 +2013-07-25T19:59:29.000Z +-75.292787 40.073452 -16.799999237060547 +2013-07-25T19:59:30.000Z +-75.292725 40.073462 -17.200000762939453 +2013-07-25T19:59:31.000Z +-75.292662 40.073469 -17.100000381469727 +2013-07-25T19:59:32.000Z +-75.292606 40.073476 -18.100000381469727 +2013-07-25T19:59:33.000Z +-75.292545 40.073484 -18.600000381469727 +2013-07-25T19:59:34.000Z +-75.29248 40.073491 -19.200000762939453 +2013-07-25T19:59:35.000Z +-75.292421 40.073507 -20.600000381469727 +2013-07-25T19:59:36.000Z +-75.292346 40.07353 -20.299999237060547 +2013-07-25T19:59:37.000Z +-75.292292 40.073528 -21.299999237060547 +2013-07-25T19:59:38.000Z +-75.292245 40.073537 -21.0 +2013-07-25T19:59:39.000Z +-75.2922 40.073545 -20.799999237060547 +2013-07-25T19:59:40.000Z +-75.292175 40.073563 -20.600000381469727 +2013-07-25T19:59:41.000Z +-75.29208 40.073576 -22.0 +2013-07-25T19:59:42.000Z +-75.292008 40.07359 -22.5 +2013-07-25T19:59:43.000Z +-75.291945 40.073608 -22.5 +2013-07-25T19:59:44.000Z +-75.291895 40.07365 -23.799999237060547 +2013-07-25T19:59:45.000Z +-75.29184 40.073677 -22.200000762939453 +2013-07-25T19:59:45.999Z +-75.291792 40.073701 -20.100000381469727 +2013-07-25T19:59:47.000Z +-75.291753 40.073711 -16.399999618530273 +2013-07-25T19:59:48.000Z +-75.291678 40.07372 -15.399999618530273 +2013-07-25T19:59:49.000Z +-75.291615 40.073727 -15.100000381469727 +2013-07-25T19:59:50.000Z +-75.291556 40.07373 -15.600000381469727 +2013-07-25T19:59:51.000Z +-75.291509 40.073743 -15.300000190734863 +2013-07-25T19:59:52.000Z +-75.291443 40.073769 -16.100000381469727 +2013-07-25T19:59:52.999Z +-75.291393 40.073785 -16.100000381469727 +2013-07-25T19:59:54.000Z +-75.291305 40.07378 -15.899999618530273 +2013-07-25T19:59:55.000Z +-75.291207 40.073787 -16.600000381469727 +2013-07-25T19:59:56.000Z +-75.291101 40.073728 -18.200000762939453 +2013-07-25T19:59:57.000Z +-75.291047 40.073734 -18.0 +2013-07-25T19:59:58.000Z +-75.290979 40.073738 -17.100000381469727 +2013-07-25T19:59:59.000Z +-75.290908 40.073744 -15.800000190734863 +2013-07-25T20:00:00.000Z +-75.290843 40.073777 -18.0 +2013-07-25T20:00:01.000Z +-75.290775 40.073774 -18.0 +2013-07-25T20:00:02.000Z +-75.29072 40.073779 -18.200000762939453 +2013-07-25T20:00:03.000Z +-75.290665 40.073796 -18.200000762939453 +2013-07-25T20:00:04.000Z +-75.290605 40.073839 -18.200000762939453 +2013-07-25T20:00:05.000Z +-75.290545 40.073844 -17.799999237060547 +2013-07-25T20:00:06.000Z +-75.290465 40.073855 -18.799999237060547 +2013-07-25T20:00:07.000Z +-75.290399 40.073862 -18.600000381469727 +2013-07-25T20:00:08.000Z +-75.290325 40.073867 -19.299999237060547 +2013-07-25T20:00:09.000Z +-75.290258 40.073868 -18.899999618530273 +2013-07-25T20:00:10.000Z +-75.29019 40.073878 -19.5 +2013-07-25T20:00:11.000Z +-75.290121 40.073896 -20.299999237060547 +2013-07-25T20:00:12.000Z +-75.290054 40.073911 -21.0 +2013-07-25T20:00:13.000Z +-75.289991 40.073917 -20.399999618530273 +2013-07-25T20:00:14.000Z +-75.289929 40.073939 -20.5 +2013-07-25T20:00:15.000Z +-75.289858 40.073944 -19.399999618530273 +2013-07-25T20:00:16.000Z +-75.289794 40.073953 -19.200000762939453 +2013-07-25T20:00:17.000Z +-75.289749 40.073966 -19.299999237060547 +2013-07-25T20:00:17.999Z +-75.289693 40.073979 -19.200000762939453 +2013-07-25T20:00:19.000Z +-75.289645 40.073977 -18.899999618530273 +2013-07-25T20:00:20.000Z +-75.289561 40.073976 -18.899999618530273 +2013-07-25T20:00:21.000Z +-75.289499 40.073986 -18.600000381469727 +2013-07-25T20:00:22.000Z +-75.289459 40.074001 -17.0 +2013-07-25T20:00:23.000Z +-75.289426 40.07402 -16.600000381469727 +2013-07-25T20:00:25.000Z +-75.289377 40.074042 -16.100000381469727 +2013-07-25T20:00:26.000Z +-75.289333 40.074059 -15.399999618530273 +2013-07-25T20:00:28.000Z +-75.289276 40.074071 -12.5 +2013-07-25T20:00:29.000Z +-75.289214 40.074099 -10.699999809265137 +2013-07-25T20:00:30.000Z +-75.289174 40.07412 -8.699999809265137 +2013-07-25T20:00:31.000Z +-75.28913 40.074132 -7.0 +2013-07-25T20:00:32.000Z +-75.289076 40.074148 -5.900000095367432 +2013-07-25T20:00:33.000Z +-75.288902 40.074121 -3.0 +2013-07-25T20:00:34.000Z +-75.288818 40.074133 -3.0999999046325684 +2013-07-25T20:00:35.000Z +-75.28875 40.074149 -4.0 +2013-07-25T20:00:36.000Z +-75.28869 40.07417 -4.300000190734863 +2013-07-25T20:00:36.999Z +-75.288651 40.074194 -4.5 +2013-07-25T20:00:38.000Z +-75.28863 40.074206 -3.0 +2013-07-25T20:00:39.000Z +-75.288565 40.074223 -2.0 +2013-07-25T20:00:40.000Z +-75.28851 40.074235 -1.2000000476837158 +2013-07-25T20:00:41.000Z +-75.288429 40.074203 -0.6000000238418579 +2013-07-25T20:00:42.000Z +-75.28833 40.074184 -4.099999904632568 +2013-07-25T20:00:43.000Z +-75.288272 40.074173 -4.0 +2013-07-25T20:00:44.000Z +-75.288205 40.074169 -3.799999952316284 +2013-07-25T20:00:45.000Z +-75.28815 40.074167 -4.099999904632568 +2013-07-25T20:00:46.000Z +-75.288124 40.074143 16.700000762939453 +2013-07-25T20:00:47.000Z +-75.288088 40.074127 17.0 +2013-07-25T20:00:48.000Z +-75.288045 40.074123 17.899999618530273 +2013-07-25T20:00:50.000Z +-75.288 40.0741 21.299999237060547 +2013-07-25T20:00:51.000Z +-75.287965 40.074093 23.100000381469727 +2013-07-25T20:00:52.000Z +-75.287927 40.07409 24.5 +2013-07-25T20:00:53.000Z +-75.287889 40.07409 24.700000762939453 +2013-07-25T20:00:54.000Z +-75.287853 40.074091 25.700000762939453 +2013-07-25T20:00:55.000Z +-75.287819 40.074094 26.600000381469727 +2013-07-25T20:00:56.000Z +-75.287784 40.074102 28.299999237060547 +2013-07-25T20:00:57.000Z +-75.287744 40.074112 29.799999237060547 +2013-07-25T20:00:58.000Z +-75.287685 40.074127 26.899999618530273 +2013-07-25T20:00:59.000Z +-75.287488 40.07418 26.5 +2013-07-25T20:01:00.000Z +-75.287418 40.074192 25.100000381469727 +2013-07-25T20:01:01.000Z +-75.287363 40.074205 23.700000762939453 +2013-07-25T20:01:02.000Z +-75.287297 40.074212 21.700000762939453 +2013-07-25T20:01:03.000Z +-75.287235 40.07423 22.100000381469727 +2013-07-25T20:01:04.000Z +-75.287166 40.074244 21.399999618530273 +2013-07-25T20:01:05.000Z +-75.287109 40.07425 19.799999237060547 +2013-07-25T20:01:06.000Z +-75.287048 40.074263 19.100000381469727 +2013-07-25T20:01:07.000Z +-75.286987 40.074266 19.0 +2013-07-25T20:01:08.000Z +-75.286917 40.074279 18.899999618530273 +2013-07-25T20:01:09.000Z +-75.286867 40.074284 18.600000381469727 +2013-07-25T20:01:10.000Z +-75.2868 40.074275 14.0 +2013-07-25T20:01:11.000Z +-75.286725 40.074276 13.600000381469727 +2013-07-25T20:01:12.000Z +-75.286637 40.074279 8.5 +2013-07-25T20:01:13.000Z +-75.286583 40.074297 7.400000095367432 +2013-07-25T20:01:14.000Z +-75.28652 40.07431 7.300000190734863 +2013-07-25T20:01:15.000Z +-75.286451 40.074298 7.300000190734863 +2013-07-25T20:01:16.000Z +-75.286376 40.0743 6.800000190734863 +2013-07-25T20:01:17.000Z +-75.286311 40.074299 7.400000095367432 +2013-07-25T20:01:18.000Z +-75.286249 40.074309 7.599999904632568 +2013-07-25T20:01:19.000Z +-75.286182 40.074316 6.099999904632568 +2013-07-25T20:01:20.000Z +-75.286117 40.074312 5.400000095367432 +2013-07-25T20:01:21.000Z +-75.286073 40.074323 6.199999809265137 +2013-07-25T20:01:22.000Z +-75.286024 40.074345 6.099999904632568 +2013-07-25T20:01:23.000Z +-75.285976 40.074356 6.099999904632568 +2013-07-25T20:01:24.000Z +-75.285897 40.074373 4.199999809265137 +2013-07-25T20:01:25.000Z +-75.285828 40.07436 4.199999809265137 +2013-07-25T20:01:26.000Z +-75.285777 40.074373 2.5 +2013-07-25T20:01:27.000Z +-75.285724 40.074382 2.299999952316284 +2013-07-25T20:01:28.000Z +-75.285649 40.07437 6.5 +2013-07-25T20:01:29.000Z +-75.285596 40.074381 7.900000095367432 +2013-07-25T20:01:30.000Z +-75.28555 40.074391 8.600000381469727 +2013-07-25T20:01:30.999Z +-75.285506 40.074403 9.399999618530273 +2013-07-25T20:01:32.000Z +-75.28547 40.074408 10.699999809265137 +2013-07-25T20:01:33.000Z +-75.285427 40.074411 12.399999618530273 +2013-07-25T20:01:34.000Z +-75.285387 40.074409 16.200000762939453 +2013-07-25T20:01:35.000Z +-75.285333 40.074406 15.899999618530273 +2013-07-25T20:01:36.000Z +-75.285256 40.074404 13.300000190734863 +2013-07-25T20:01:37.000Z +-75.285197 40.0744 13.199999809265137 +2013-07-25T20:01:38.000Z +-75.285132 40.074379 12.199999809265137 +2013-07-25T20:01:39.000Z +-75.285057 40.074364 12.0 +2013-07-25T20:01:40.000Z +-75.285003 40.074379 12.100000381469727 +2013-07-25T20:01:41.000Z +-75.284934 40.074398 10.0 +2013-07-25T20:01:42.000Z +-75.284879 40.074396 11.399999618530273 +2013-07-25T20:01:43.000Z +-75.284829 40.074391 12.399999618530273 +2013-07-25T20:01:44.000Z +-75.284768 40.074406 11.399999618530273 +2013-07-25T20:01:45.000Z +-75.284711 40.074416 11.0 +2013-07-25T20:01:46.000Z +-75.284634 40.074411 11.399999618530273 +2013-07-25T20:01:47.000Z +-75.284573 40.074406 10.399999618530273 +2013-07-25T20:01:48.000Z +-75.284505 40.074406 10.0 +2013-07-25T20:01:49.000Z +-75.284447 40.074393 10.300000190734863 +2013-07-25T20:01:50.000Z +-75.284374 40.074384 10.699999809265137 +2013-07-25T20:01:51.000Z +-75.284301 40.074377 10.699999809265137 +2013-07-25T20:01:52.000Z +-75.284223 40.07438 9.899999618530273 +2013-07-25T20:01:53.000Z +-75.284142 40.07437 10.199999809265137 +2013-07-25T20:01:54.000Z +-75.28408 40.074346 11.300000190734863 +2013-07-25T20:01:55.000Z +-75.28403 40.074356 11.100000381469727 +2013-07-25T20:01:56.000Z +-75.283943 40.074353 9.699999809265137 +2013-07-25T20:01:56.999Z +-75.28388 40.074351 9.300000190734863 +2013-07-25T20:01:58.000Z +-75.283828 40.074367 7.599999904632568 +2013-07-25T20:01:59.000Z +-75.283756 40.074383 6.699999809265137 +2013-07-25T20:02:00.000Z +-75.283681 40.074382 6.199999809265137 +2013-07-25T20:02:01.000Z +-75.283627 40.074375 6.800000190734863 +2013-07-25T20:02:02.000Z +-75.283572 40.074371 5.900000095367432 +2013-07-25T20:02:03.000Z +-75.283515 40.074368 5.900000095367432 +2013-07-25T20:02:04.000Z +-75.283448 40.074361 5.800000190734863 +2013-07-25T20:02:05.000Z +-75.283393 40.074345 6.900000095367432 +2013-07-25T20:02:06.000Z +-75.283333 40.074328 7.400000095367432 +2013-07-25T20:02:07.000Z +-75.283267 40.074318 7.199999809265137 +2013-07-25T20:02:08.000Z +-75.283199 40.074308 5.599999904632568 +2013-07-25T20:02:09.000Z +-75.28314 40.0743 5.199999809265137 +2013-07-25T20:02:10.000Z +-75.283078 40.074291 4.599999904632568 +2013-07-25T20:02:11.000Z +-75.283013 40.074271 5.0 +2013-07-25T20:02:12.000Z +-75.282949 40.07426 4.699999809265137 +2013-07-25T20:02:13.000Z +-75.282893 40.074272 4.400000095367432 +2013-07-25T20:02:14.000Z +-75.282824 40.074258 3.299999952316284 +2013-07-25T20:02:15.000Z +-75.282766 40.074242 3.0 +2013-07-25T20:02:16.000Z +-75.28271 40.074227 3.0 +2013-07-25T20:02:17.000Z +-75.282649 40.074216 2.700000047683716 +2013-07-25T20:02:18.000Z +-75.282604 40.074214 1.899999976158142 +2013-07-25T20:02:19.000Z +-75.282547 40.074202 1.0 +2013-07-25T20:02:20.000Z +-75.282485 40.074213 0.20000000298023224 +2013-07-25T20:02:21.000Z +-75.282418 40.074201 -0.699999988079071 +2013-07-25T20:02:22.000Z +-75.282361 40.074191 -1.5 +2013-07-25T20:02:23.000Z +-75.282308 40.074187 -1.899999976158142 +2013-07-25T20:02:24.000Z +-75.282252 40.074185 -1.600000023841858 +2013-07-25T20:02:25.000Z +-75.28219 40.074179 -1.7999999523162842 +2013-07-25T20:02:26.000Z +-75.282126 40.074142 -1.5 +2013-07-25T20:02:27.000Z +-75.282071 40.074119 -2.799999952316284 +2013-07-25T20:02:28.000Z +-75.282005 40.074087 -3.299999952316284 +2013-07-25T20:02:29.000Z +-75.281953 40.074065 -4.199999809265137 +2013-07-25T20:02:30.000Z +-75.281898 40.074038 -4.199999809265137 +2013-07-25T20:02:31.000Z +-75.281838 40.074015 -4.099999904632568 +2013-07-25T20:02:32.000Z +-75.28178 40.073996 -4.0 +2013-07-25T20:02:33.000Z +-75.28172 40.073973 -3.9000000953674316 +2013-07-25T20:02:34.000Z +-75.281661 40.073954 -3.9000000953674316 +2013-07-25T20:02:35.000Z +-75.281617 40.073929 -4.699999809265137 +2013-07-25T20:02:36.000Z +-75.281568 40.073909 -4.699999809265137 +2013-07-25T20:02:37.000Z +-75.281508 40.073873 -2.700000047683716 +2013-07-25T20:02:38.000Z +-75.281455 40.073865 -5.699999809265137 +2013-07-25T20:02:39.000Z +-75.281403 40.073827 -6.599999904632568 +2013-07-25T20:02:40.000Z +-75.28135 40.073802 -6.800000190734863 +2013-07-25T20:02:41.000Z +-75.281299 40.073783 -6.300000190734863 +2013-07-25T20:02:42.000Z +-75.281248 40.073772 -6.900000095367432 +2013-07-25T20:02:43.000Z +-75.281198 40.07375 -7.0 +2013-07-25T20:02:44.000Z +-75.281154 40.073723 -7.400000095367432 +2013-07-25T20:02:45.000Z +-75.281104 40.073697 -7.400000095367432 +2013-07-25T20:02:46.000Z +-75.281051 40.07368 -7.699999809265137 +2013-07-25T20:02:47.000Z +-75.281001 40.073656 -7.900000095367432 +2013-07-25T20:02:48.000Z +-75.280952 40.073633 -7.199999809265137 +2013-07-25T20:02:49.000Z +-75.280905 40.07361 -9.300000190734863 +2013-07-25T20:02:50.001Z +-75.280857 40.073588 -9.199999809265137 +2013-07-25T20:02:51.000Z +-75.280808 40.073552 -10.300000190734863 +2013-07-25T20:02:52.000Z +-75.280747 40.073554 -10.699999809265137 +2013-07-25T20:02:53.000Z +-75.280722 40.073504 -6.800000190734863 +2013-07-25T20:02:54.000Z +-75.280674 40.073487 -9.300000190734863 +2013-07-25T20:02:55.000Z +-75.280622 40.07346 -10.600000381469727 +2013-07-25T20:02:56.000Z +-75.280566 40.073428 -10.600000381469727 +2013-07-25T20:02:57.000Z +-75.280522 40.073401 -10.699999809265137 +2013-07-25T20:02:58.000Z +-75.280475 40.073379 -10.800000190734863 +2013-07-25T20:02:59.000Z +-75.280424 40.073366 -14.100000381469727 +2013-07-25T20:03:00.000Z +-75.280378 40.073351 -14.199999809265137 +2013-07-25T20:03:01.000Z +-75.280325 40.073322 -14.899999618530273 +2013-07-25T20:03:02.001Z +-75.280277 40.073295 -15.0 +2013-07-25T20:03:03.000Z +-75.280218 40.073271 -15.0 +2013-07-25T20:03:04.000Z +-75.280166 40.073242 -15.5 +2013-07-25T20:03:05.000Z +-75.280116 40.073214 -16.299999237060547 +2013-07-25T20:03:06.000Z +-75.280069 40.073183 -16.399999618530273 +2013-07-25T20:03:07.000Z +-75.280024 40.073154 -16.5 +2013-07-25T20:03:08.000Z +-75.279975 40.073128 -14.899999618530273 +2013-07-25T20:03:09.000Z +-75.279931 40.073107 -14.5 +2013-07-25T20:03:10.000Z +-75.279892 40.073087 -14.600000381469727 +2013-07-25T20:03:11.000Z +-75.279825 40.073071 -14.5 +2013-07-25T20:03:12.000Z +-75.27977 40.073046 -14.699999809265137 +2013-07-25T20:03:13.000Z +-75.279706 40.073047 -14.399999618530273 +2013-07-25T20:03:14.000Z +-75.279654 40.072999 -9.399999618530273 +2013-07-25T20:03:15.000Z +-75.279609 40.072963 -9.600000381469727 +2013-07-25T20:03:16.000Z +-75.279571 40.07293 -11.5 +2013-07-25T20:03:17.000Z +-75.279525 40.072932 -16.700000762939453 +2013-07-25T20:03:18.000Z +-75.279481 40.072924 -19.399999618530273 +2013-07-25T20:03:19.000Z +-75.279448 40.072883 -17.5 +2013-07-25T20:03:20.000Z +-75.27941 40.072852 -16.600000381469727 +2013-07-25T20:03:21.000Z +-75.279377 40.072827 -16.399999618530273 +2013-07-25T20:03:22.000Z +-75.279337 40.072812 -15.600000381469727 +2013-07-25T20:03:23.000Z +-75.279298 40.072805 -14.800000190734863 +2013-07-25T20:03:24.000Z +-75.279258 40.072793 -14.0 +2013-07-25T20:03:25.000Z +-75.279221 40.072736 -10.899999618530273 +2013-07-25T20:03:26.000Z +-75.27918 40.072704 -9.800000190734863 +2013-07-25T20:03:27.000Z +-75.279131 40.072651 -4.800000190734863 +2013-07-25T20:03:28.000Z +-75.279089 40.072603 -4.099999904632568 +2013-07-25T20:03:29.000Z +-75.279056 40.072543 -4.5 +2013-07-25T20:03:29.999Z +-75.279016 40.072508 -4.199999809265137 +2013-07-25T20:03:31.000Z +-75.27897 40.072453 -3.4000000953674316 +2013-07-25T20:03:32.000Z +-75.27893 40.072418 -3.9000000953674316 +2013-07-25T20:03:33.000Z +-75.278889 40.072395 -6.199999809265137 +2013-07-25T20:03:34.000Z +-75.278846 40.072362 -6.900000095367432 +2013-07-25T20:03:35.000Z +-75.278802 40.072323 -7.599999904632568 +2013-07-25T20:03:36.000Z +-75.278762 40.072291 -8.0 +2013-07-25T20:03:37.000Z +-75.278717 40.072297 -13.699999809265137 +2013-07-25T20:03:37.999Z +-75.278677 40.072286 -16.100000381469727 +2013-07-25T20:03:39.000Z +-75.278636 40.072283 -16.799999237060547 +2013-07-25T20:03:40.000Z +-75.278596 40.072276 -18.0 +2013-07-25T20:03:41.002Z +-75.278569 40.072262 -17.0 +2013-07-25T20:03:42.000Z +-75.278527 40.072239 -15.5 +2013-07-25T20:03:43.000Z +-75.278494 40.072219 -15.899999618530273 +2013-07-25T20:03:43.999Z +-75.278454 40.072205 -19.700000762939453 +2013-07-25T20:03:45.000Z +-75.278412 40.072182 -23.100000381469727 +2013-07-25T20:03:46.000Z +-75.278372 40.072151 -21.600000381469727 +2013-07-25T20:03:47.000Z +-75.278331 40.072112 -21.200000762939453 +2013-07-25T20:03:48.000Z +-75.278291 40.072065 -21.799999237060547 +2013-07-25T20:03:49.000Z +-75.278254 40.072036 -22.0 +2013-07-25T20:03:50.000Z +-75.27822 40.071906 -19.399999618530273 +2013-07-25T20:03:51.000Z +-75.278176 40.071856 -16.700000762939453 +2013-07-25T20:03:52.000Z +-75.278135 40.0718 -15.0 +2013-07-25T20:03:53.000Z +-75.278094 40.071763 -15.100000381469727 +2013-07-25T20:03:54.001Z +-75.278051 40.071725 -14.600000381469727 +2013-07-25T20:03:55.000Z +-75.278001 40.071673 -10.399999618530273 +2013-07-25T20:03:58.000Z +-75.277979 40.071638 -13.800000190734863 +2013-07-25T20:03:59.000Z +-75.277929 40.071609 -17.700000762939453 +2013-07-25T20:04:00.000Z +-75.277894 40.07159 -19.299999237060547 +2013-07-25T20:04:01.000Z +-75.277865 40.071554 -20.600000381469727 +2013-07-25T20:04:02.000Z +-75.27784 40.071505 -22.399999618530273 +2013-07-25T20:04:03.000Z +-75.277795 40.071484 -25.899999618530273 +2013-07-25T20:04:04.000Z +-75.277763 40.071449 -27.399999618530273 +2013-07-25T20:04:05.000Z +-75.277732 40.071415 -26.399999618530273 +2013-07-25T20:04:06.000Z +-75.277698 40.071377 -27.0 +2013-07-25T20:04:07.000Z +-75.277667 40.071339 -26.600000381469727 +2013-07-25T20:04:08.000Z +-75.27764 40.071306 -31.0 +2013-07-25T20:04:09.000Z +-75.277615 40.071273 -27.799999237060547 +2013-07-25T20:04:10.000Z +-75.277578 40.071224 -24.899999618530273 +2013-07-25T20:04:11.000Z +-75.277532 40.071193 -22.399999618530273 +2013-07-25T20:04:12.000Z +-75.277479 40.071149 -22.200000762939453 +2013-07-25T20:04:13.000Z +-75.277447 40.071133 -21.899999618530273 +2013-07-25T20:04:14.000Z +-75.277413 40.071102 -21.100000381469727 +2013-07-25T20:04:15.000Z +-75.277375 40.071059 -18.600000381469727 +2013-07-25T20:04:16.000Z +-75.27734 40.071021 -16.5 +2013-07-25T20:04:17.000Z +-75.277311 40.07098 -17.0 +2013-07-25T20:04:18.000Z +-75.27726 40.070962 -13.399999618530273 +2013-07-25T20:04:19.000Z +-75.27722 40.070918 -11.199999809265137 +2013-07-25T20:04:20.001Z +-75.277181 40.070896 -9.199999809265137 +2013-07-25T20:04:21.000Z +-75.277144 40.070856 -10.300000190734863 +2013-07-25T20:04:22.000Z +-75.277111 40.070819 -9.699999809265137 +2013-07-25T20:04:23.000Z +-75.277085 40.070731 -9.899999618530273 +2013-07-25T20:04:24.000Z +-75.277055 40.070686 -9.399999618530273 +2013-07-25T20:04:25.000Z +-75.277027 40.070637 -9.300000190734863 +2013-07-25T20:04:26.000Z +-75.276996 40.070582 -8.800000190734863 +2013-07-25T20:04:27.000Z +-75.276968 40.070506 -8.699999809265137 +2013-07-25T20:04:28.000Z +-75.276935 40.070468 -7.800000190734863 +2013-07-25T20:04:29.000Z +-75.27691 40.070419 -8.0 +2013-07-25T20:04:30.000Z +-75.276875 40.070366 -7.199999809265137 +2013-07-25T20:04:31.000Z +-75.276841 40.07032 -6.400000095367432 +2013-07-25T20:04:32.000Z +-75.276805 40.070293 -2.799999952316284 +2013-07-25T20:04:33.000Z +-75.276779 40.07024 -2.0 +2013-07-25T20:04:34.000Z +-75.276744 40.070197 -1.5 +2013-07-25T20:04:35.000Z +-75.276708 40.070152 -0.30000001192092896 +2013-07-25T20:04:36.000Z +-75.276674 40.070104 0.10000000149011612 +2013-07-25T20:04:37.000Z +-75.276643 40.070066 -0.4000000059604645 +2013-07-25T20:04:38.000Z +-75.276614 40.070021 -0.10000000149011612 +2013-07-25T20:04:39.000Z +-75.276584 40.069976 0.0 +2013-07-25T20:04:40.000Z +-75.276551 40.069933 -0.699999988079071 +2013-07-25T20:04:41.000Z +-75.27652 40.069891 -0.5 +2013-07-25T20:04:42.000Z +-75.276492 40.06985 -0.8999999761581421 +2013-07-25T20:04:43.000Z +-75.276481 40.069785 -3.0999999046325684 +2013-07-25T20:04:44.000Z +-75.276485 40.069731 -4.599999904632568 +2013-07-25T20:04:45.000Z +-75.276476 40.069684 -5.800000190734863 +2013-07-25T20:04:46.000Z +-75.27646 40.06965 -6.0 +2013-07-25T20:04:47.000Z +-75.276437 40.069608 -6.199999809265137 +2013-07-25T20:04:48.000Z +-75.276386 40.069611 -0.8999999761581421 +2013-07-25T20:04:49.000Z +-75.276369 40.06958 -0.800000011920929 +2013-07-25T20:04:50.000Z +-75.276337 40.069557 -0.699999988079071 +2013-07-25T20:04:51.000Z +-75.276322 40.06951 1.2000000476837158 +2013-07-25T20:04:52.000Z +-75.276292 40.069482 3.0 +2013-07-25T20:04:53.000Z +-75.276255 40.069424 3.0999999046325684 +2013-07-25T20:04:54.000Z +-75.276219 40.06938 3.0 +2013-07-25T20:04:55.000Z +-75.276188 40.069346 3.0 +2013-07-25T20:04:56.000Z +-75.276181 40.069293 1.2999999523162842 +2013-07-25T20:04:57.000Z +-75.276121 40.069223 1.2999999523162842 +2013-07-25T20:04:58.000Z +-75.276081 40.069177 1.2999999523162842 +2013-07-25T20:04:59.000Z +-75.276041 40.069131 1.2999999523162842 +2013-07-25T20:05:00.000Z +-75.27602 40.069071 0.0 +2013-07-25T20:05:01.000Z +-75.275978 40.069054 0.6000000238418579 +2013-07-25T20:05:02.000Z +-75.275923 40.069017 0.6000000238418579 +2013-07-25T20:05:03.000Z +-75.275921 40.068939 -0.20000000298023224 +2013-07-25T20:05:04.000Z +-75.275909 40.068889 1.2999999523162842 +2013-07-25T20:05:05.000Z +-75.275874 40.068858 1.2000000476837158 +2013-07-25T20:05:06.000Z +-75.275846 40.068832 2.5 +2013-07-25T20:05:07.000Z +-75.275853 40.068748 0.30000001192092896 +2013-07-25T20:05:08.000Z +-75.275819 40.068722 1.2999999523162842 +2013-07-25T20:05:09.000Z +-75.275799 40.068689 3.799999952316284 +2013-07-25T20:05:10.000Z +-75.275776 40.068657 4.5 +2013-07-25T20:05:11.000Z +-75.275746 40.068623 4.5 +2013-07-25T20:05:12.000Z +-75.275712 40.068583 4.5 +2013-07-25T20:05:13.000Z +-75.275679 40.068543 4.400000095367432 +2013-07-25T20:05:14.000Z +-75.275642 40.068466 4.599999904632568 +2013-07-25T20:05:15.000Z +-75.275613 40.068425 3.799999952316284 +2013-07-25T20:05:16.000Z +-75.275565 40.068379 3.0 +2013-07-25T20:05:17.000Z +-75.275543 40.068326 2.299999952316284 +2013-07-25T20:05:18.000Z +-75.275528 40.068304 5.199999809265137 +2013-07-25T20:05:19.000Z +-75.275507 40.06825 4.800000190734863 +2013-07-25T20:05:20.000Z +-75.275486 40.068212 5.099999904632568 +2013-07-25T20:05:21.000Z +-75.275448 40.06815 5.0 +2013-07-25T20:05:22.000Z +-75.275412 40.068109 5.099999904632568 +2013-07-25T20:05:23.000Z +-75.275363 40.06808 6.400000095367432 +2013-07-25T20:05:24.000Z +-75.275334 40.068016 6.199999809265137 +2013-07-25T20:05:25.000Z +-75.275301 40.067989 5.900000095367432 +2013-07-25T20:05:26.000Z +-75.275267 40.067956 5.800000190734863 +2013-07-25T20:05:27.000Z +-75.275225 40.067913 5.599999904632568 +2013-07-25T20:05:28.000Z +-75.275187 40.067875 7.800000190734863 +2013-07-25T20:05:29.000Z +-75.27515 40.067841 9.0 +2013-07-25T20:05:30.000Z +-75.275112 40.067803 10.0 +2013-07-25T20:05:31.000Z +-75.275081 40.06777 10.600000381469727 +2013-07-25T20:05:32.000Z +-75.275043 40.067737 12.300000190734863 +2013-07-25T20:05:33.000Z +-75.27501 40.067696 12.5 +2013-07-25T20:05:34.000Z +-75.274996 40.067621 10.0 +2013-07-25T20:05:35.000Z +-75.274967 40.067598 10.5 +2013-07-25T20:05:36.000Z +-75.274952 40.06753 8.899999618530273 +2013-07-25T20:05:37.000Z +-75.274923 40.067477 8.5 +2013-07-25T20:05:38.000Z +-75.274874 40.067471 10.199999809265137 +2013-07-25T20:05:39.000Z +-75.274839 40.067438 11.0 +2013-07-25T20:05:40.000Z +-75.274808 40.067398 9.399999618530273 +2013-07-25T20:05:41.000Z +-75.274783 40.067392 12.399999618530273 +2013-07-25T20:05:42.000Z +-75.274755 40.067347 12.600000381469727 +2013-07-25T20:05:43.000Z +-75.27472 40.067315 13.300000190734863 +2013-07-25T20:05:44.000Z +-75.27468 40.067295 14.5 +2013-07-25T20:05:45.000Z +-75.274663 40.067269 13.5 +2013-07-25T20:05:46.000Z +-75.274644 40.067235 14.800000190734863 +2013-07-25T20:05:47.000Z +-75.274615 40.067209 15.300000190734863 +2013-07-25T20:05:48.000Z +-75.274589 40.06718 15.899999618530273 +2013-07-25T20:05:49.000Z +-75.274565 40.067148 16.600000381469727 +2013-07-25T20:05:50.000Z +-75.274539 40.067111 16.899999618530273 +2013-07-25T20:05:51.000Z +-75.274511 40.067073 16.899999618530273 +2013-07-25T20:05:52.000Z +-75.274481 40.067028 17.100000381469727 +2013-07-25T20:05:53.000Z +-75.274453 40.066984 16.399999618530273 +2013-07-25T20:05:54.000Z +-75.274425 40.06694 16.600000381469727 +2013-07-25T20:05:55.000Z +-75.2744 40.066897 15.600000381469727 +2013-07-25T20:05:56.000Z +-75.274372 40.066857 16.700000762939453 +2013-07-25T20:05:57.000Z +-75.274344 40.066823 17.5 +2013-07-25T20:05:58.000Z +-75.274314 40.06679 18.399999618530273 +2013-07-25T20:05:59.000Z +-75.274283 40.066757 19.0 +2013-07-25T20:06:00.000Z +-75.274251 40.066718 18.600000381469727 +2013-07-25T20:06:01.000Z +-75.274225 40.066666 14.0 +2013-07-25T20:06:02.000Z +-75.274198 40.066614 13.800000190734863 +2013-07-25T20:06:03.000Z +-75.274171 40.066563 13.899999618530273 +2013-07-25T20:06:04.000Z +-75.274143 40.066513 13.5 +2013-07-25T20:06:05.000Z +-75.274116 40.066467 13.600000381469727 +2013-07-25T20:06:06.000Z +-75.274089 40.06642 13.600000381469727 +2013-07-25T20:06:07.000Z +-75.274063 40.066374 13.800000190734863 +2013-07-25T20:06:08.000Z +-75.274037 40.066327 13.699999809265137 +2013-07-25T20:06:09.000Z +-75.274012 40.066284 13.5 +2013-07-25T20:06:10.000Z +-75.273983 40.066242 13.300000190734863 +2013-07-25T20:06:11.000Z +-75.273957 40.066202 13.100000381469727 +2013-07-25T20:06:12.000Z +-75.273921 40.066187 22.299999237060547 +2013-07-25T20:06:13.000Z +-75.27389 40.066252 27.899999618530273 +2013-07-25T20:06:14.000Z +-75.27386 40.066239 32.29999923706055 +2013-07-25T20:06:15.000Z +-75.27382 40.066205 33.20000076293945 +2013-07-25T20:06:16.000Z +-75.273792 40.066161 33.5 +2013-07-25T20:06:17.000Z +-75.273766 40.066118 33.20000076293945 +2013-07-25T20:06:18.000Z +-75.273748 40.066078 34.099998474121094 +2013-07-25T20:06:19.000Z +-75.273754 40.066003 31.399999618530273 +2013-07-25T20:06:20.000Z +-75.273716 40.065965 31.899999618530273 +2013-07-25T20:06:21.000Z +-75.273712 40.065889 27.799999237060547 +2013-07-25T20:06:22.000Z +-75.273678 40.065854 27.799999237060547 +2013-07-25T20:06:23.000Z +-75.273661 40.06582 28.799999237060547 +2013-07-25T20:06:24.000Z +-75.273645 40.065751 23.799999237060547 +2013-07-25T20:06:25.000Z +-75.273626 40.065711 24.5 +2013-07-25T20:06:26.000Z +-75.273607 40.065676 25.700000762939453 +2013-07-25T20:06:27.000Z +-75.273583 40.065645 25.799999237060547 +2013-07-25T20:06:28.000Z +-75.273554 40.065613 25.5 +2013-07-25T20:06:29.000Z +-75.273518 40.065578 26.399999618530273 +2013-07-25T20:06:30.000Z +-75.27343 40.065508 26.200000762939453 +2013-07-25T20:06:31.000Z +-75.273382 40.065468 25.299999237060547 +2013-07-25T20:06:32.000Z +-75.273335 40.065425 25.200000762939453 +2013-07-25T20:06:33.000Z +-75.273294 40.065387 25.399999618530273 +2013-07-25T20:06:34.000Z +-75.273248 40.065339 24.899999618530273 +2013-07-25T20:06:35.000Z +-75.273202 40.065304 25.799999237060547 +2013-07-25T20:06:36.000Z +-75.273149 40.06528 24.399999618530273 +2013-07-25T20:06:37.000Z +-75.273098 40.06525 24.0 +2013-07-25T20:06:38.000Z +-75.27306 40.065207 24.100000381469727 +2013-07-25T20:06:39.000Z +-75.273022 40.065176 23.700000762939453 +2013-07-25T20:06:40.000Z +-75.272983 40.065137 23.799999237060547 +2013-07-25T20:06:41.000Z +-75.273009 40.064997 14.199999809265137 +2013-07-25T20:06:42.000Z +-75.272963 40.064984 14.800000190734863 +2013-07-25T20:06:43.000Z +-75.272901 40.064956 13.5 +2013-07-25T20:06:44.000Z +-75.272847 40.064942 12.600000381469727 +2013-07-25T20:06:45.000Z +-75.272845 40.064884 13.899999618530273 +2013-07-25T20:06:46.000Z +-75.272805 40.064847 13.800000190734863 +2013-07-25T20:06:47.000Z +-75.272762 40.064816 14.300000190734863 +2013-07-25T20:06:48.000Z +-75.272726 40.064782 14.699999809265137 +2013-07-25T20:06:49.000Z +-75.272723 40.064709 11.199999809265137 +2013-07-25T20:06:50.000Z +-75.272713 40.064646 7.699999809265137 +2013-07-25T20:06:51.000Z +-75.272686 40.064595 4.599999904632568 +2013-07-25T20:06:52.000Z +-75.272643 40.064558 3.299999952316284 +2013-07-25T20:06:53.000Z +-75.272607 40.06451 1.600000023841858 +2013-07-25T20:06:54.000Z +-75.272558 40.064481 1.2000000476837158 +2013-07-25T20:06:55.000Z +-75.272518 40.064434 0.0 +2013-07-25T20:06:56.000Z +-75.272473 40.064399 -0.20000000298023224 +2013-07-25T20:06:57.000Z +-75.272423 40.064367 -0.30000001192092896 +2013-07-25T20:06:58.000Z +-75.272376 40.064332 -0.20000000298023224 +2013-07-25T20:06:59.000Z +-75.272331 40.064304 -0.4000000059604645 +2013-07-25T20:07:00.000Z +-75.272286 40.064261 -1.7000000476837158 +2013-07-25T20:07:01.000Z +-75.272235 40.064232 -1.7999999523162842 +2013-07-25T20:07:02.000Z +-75.272184 40.064195 -2.4000000953674316 +2013-07-25T20:07:03.000Z +-75.272136 40.064154 -3.299999952316284 +2013-07-25T20:07:04.000Z +-75.272098 40.064125 -3.4000000953674316 +2013-07-25T20:07:05.000Z +-75.272042 40.064091 -2.299999952316284 +2013-07-25T20:07:06.000Z +-75.271996 40.064059 -1.7999999523162842 +2013-07-25T20:07:07.000Z +-75.271951 40.064021 -2.4000000953674316 +2013-07-25T20:07:08.000Z +-75.271906 40.063985 -2.9000000953674316 +2013-07-25T20:07:09.000Z +-75.271859 40.063952 -2.9000000953674316 +2013-07-25T20:07:10.000Z +-75.271813 40.063925 -2.700000047683716 +2013-07-25T20:07:11.000Z +-75.271763 40.063898 -2.9000000953674316 +2013-07-25T20:07:12.000Z +-75.271713 40.063866 -3.0 +2013-07-25T20:07:13.000Z +-75.271665 40.063832 -2.799999952316284 +2013-07-25T20:07:14.000Z +-75.271621 40.0638 -3.0 +2013-07-25T20:07:15.000Z +-75.271573 40.06377 -2.9000000953674316 +2013-07-25T20:07:16.000Z +-75.271525 40.063746 -1.7000000476837158 +2013-07-25T20:07:17.000Z +-75.271483 40.063723 -2.299999952316284 +2013-07-25T20:07:18.000Z +-75.271432 40.063689 -1.899999976158142 +2013-07-25T20:07:19.000Z +-75.271366 40.063668 -2.700000047683716 +2013-07-25T20:07:20.000Z +-75.271317 40.063628 -2.0 +2013-07-25T20:07:21.000Z +-75.271267 40.063596 -1.899999976158142 +2013-07-25T20:07:22.000Z +-75.271233 40.063557 -1.7000000476837158 +2013-07-25T20:07:23.000Z +-75.271213 40.063506 -4.099999904632568 +2013-07-25T20:07:24.000Z +-75.271191 40.063459 -6.300000190734863 +2013-07-25T20:07:25.000Z +-75.271167 40.063427 -5.300000190734863 +2013-07-25T20:07:26.000Z +-75.271133 40.063394 -4.699999809265137 +2013-07-25T20:07:27.000Z +-75.271087 40.063361 -5.400000095367432 +2013-07-25T20:07:28.000Z +-75.271048 40.063328 -5.699999809265137 +2013-07-25T20:07:29.000Z +-75.271 40.063297 -5.599999904632568 +2013-07-25T20:07:30.000Z +-75.270958 40.063266 -6.099999904632568 +2013-07-25T20:07:31.000Z +-75.270918 40.063232 -6.900000095367432 +2013-07-25T20:07:32.000Z +-75.270873 40.063199 -7.099999904632568 +2013-07-25T20:07:33.000Z +-75.270833 40.06317 -7.599999904632568 +2013-07-25T20:07:34.000Z +-75.270791 40.063139 -8.199999809265137 +2013-07-25T20:07:35.000Z +-75.270749 40.06311 -7.900000095367432 +2013-07-25T20:07:36.000Z +-75.270705 40.063082 -8.300000190734863 +2013-07-25T20:07:37.000Z +-75.270662 40.063058 -7.900000095367432 +2013-07-25T20:07:38.000Z +-75.270617 40.063036 -8.600000381469727 +2013-07-25T20:07:39.000Z +-75.27057 40.063012 -8.699999809265137 +2013-07-25T20:07:40.000Z +-75.270522 40.062984 -8.300000190734863 +2013-07-25T20:07:41.000Z +-75.270477 40.062957 -8.699999809265137 +2013-07-25T20:07:42.000Z +-75.270422 40.062917 -8.0 +2013-07-25T20:07:43.000Z +-75.270377 40.062887 -8.300000190734863 +2013-07-25T20:07:44.000Z +-75.270332 40.062858 -7.699999809265137 +2013-07-25T20:07:45.000Z +-75.270285 40.062827 -6.599999904632568 +2013-07-25T20:07:46.000Z +-75.270243 40.062797 -6.099999904632568 +2013-07-25T20:07:47.000Z +-75.270196 40.062774 -5.0 +2013-07-25T20:07:48.000Z +-75.270155 40.062741 -4.300000190734863 +2013-07-25T20:07:49.000Z +-75.270108 40.062718 -3.9000000953674316 +2013-07-25T20:07:50.000Z +-75.270086 40.062685 -3.700000047683716 +2013-07-25T20:07:51.000Z +-75.270077 40.062667 0.699999988079071 +2013-07-25T20:07:52.000Z +-75.270039 40.062639 2.0999999046325684 +2013-07-25T20:07:53.000Z +-75.270007 40.062604 2.5 +2013-07-25T20:07:54.000Z +-75.26996 40.062574 2.5 +2013-07-25T20:07:55.000Z +-75.269925 40.062552 3.700000047683716 +2013-07-25T20:07:56.000Z +-75.269883 40.062526 3.700000047683716 +2013-07-25T20:07:57.000Z +-75.269851 40.062505 7.800000190734863 +2013-07-25T20:07:58.000Z +-75.26982 40.062484 9.600000381469727 +2013-07-25T20:07:59.000Z +-75.26979 40.062464 10.899999618530273 +2013-07-25T20:08:00.000Z +-75.26976 40.062441 11.100000381469727 +2013-07-25T20:08:01.000Z +-75.269729 40.06242 12.199999809265137 +2013-07-25T20:08:02.000Z +-75.269689 40.062395 9.899999618530273 +2013-07-25T20:08:03.000Z +-75.269643 40.062371 9.5 +2013-07-25T20:08:04.000Z +-75.269544 40.062355 12.600000381469727 +2013-07-25T20:08:05.000Z +-75.269493 40.062347 13.699999809265137 +2013-07-25T20:08:06.000Z +-75.26944 40.062337 14.5 +2013-07-25T20:08:07.000Z +-75.269386 40.062298 14.5 +2013-07-25T20:08:08.000Z +-75.269328 40.062263 13.399999618530273 +2013-07-25T20:08:09.000Z +-75.269274 40.062229 12.600000381469727 +2013-07-25T20:08:10.000Z +-75.269234 40.062207 13.300000190734863 +2013-07-25T20:08:11.000Z +-75.269185 40.062177 13.600000381469727 +2013-07-25T20:08:12.000Z +-75.269129 40.062153 13.399999618530273 +2013-07-25T20:08:13.000Z +-75.269079 40.062125 13.600000381469727 +2013-07-25T20:08:14.000Z +-75.26903 40.062095 12.800000190734863 +2013-07-25T20:08:15.000Z +-75.268991 40.062057 10.899999618530273 +2013-07-25T20:08:16.000Z +-75.268935 40.062029 10.5 +2013-07-25T20:08:17.000Z +-75.268886 40.062005 9.899999618530273 +2013-07-25T20:08:18.000Z +-75.268828 40.061995 12.5 +2013-07-25T20:08:19.000Z +-75.268808 40.061962 12.699999809265137 +2013-07-25T20:08:20.000Z +-75.268798 40.061955 12.699999809265137 +2013-07-25T20:08:22.000Z +-75.268753 40.061935 12.399999618530273 +2013-07-25T20:08:23.000Z +-75.268724 40.061932 12.300000190734863 +2013-07-25T20:08:24.000Z +-75.268636 40.06188 11.899999618530273 +2013-07-25T20:08:25.000Z +-75.268578 40.061871 14.399999618530273 +2013-07-25T20:08:26.000Z +-75.268524 40.06184 14.100000381469727 +2013-07-25T20:08:27.000Z +-75.268489 40.061791 11.300000190734863 +2013-07-25T20:08:28.000Z +-75.268447 40.061762 9.699999809265137 +2013-07-25T20:08:29.000Z +-75.268408 40.061731 9.199999809265137 +2013-07-25T20:08:30.000Z +-75.268366 40.0617 8.300000190734863 +2013-07-25T20:08:31.000Z +-75.268325 40.061669 7.400000095367432 +2013-07-25T20:08:32.000Z +-75.268283 40.061636 6.599999904632568 +2013-07-25T20:08:33.000Z +-75.268243 40.061605 6.0 +2013-07-25T20:08:34.000Z +-75.268202 40.061573 5.400000095367432 +2013-07-25T20:08:35.000Z +-75.26816 40.061544 6.400000095367432 +2013-07-25T20:08:36.000Z +-75.268116 40.061512 6.0 +2013-07-25T20:08:37.000Z +-75.268075 40.06148 5.5 +2013-07-25T20:08:38.000Z +-75.268033 40.061448 5.0 +2013-07-25T20:08:39.001Z +-75.267992 40.061415 5.0 +2013-07-25T20:08:40.000Z +-75.267951 40.061385 4.5 +2013-07-25T20:08:41.000Z +-75.267904 40.061335 7.699999809265137 +2013-07-25T20:08:41.999Z +-75.26786 40.06131 10.0 +2013-07-25T20:08:43.000Z +-75.267845 40.061298 7.5 +2013-07-25T20:08:44.000Z +-75.267808 40.061284 7.0 +2013-07-25T20:08:45.000Z +-75.267773 40.061272 7.099999904632568 +2013-07-25T20:08:46.000Z +-75.267718 40.061216 8.100000381469727 +2013-07-25T20:08:47.000Z +-75.267679 40.061178 8.5 +2013-07-25T20:08:48.000Z +-75.267641 40.061145 7.699999809265137 +2013-07-25T20:08:49.000Z +-75.267601 40.061118 7.599999904632568 +2013-07-25T20:08:50.000Z +-75.267559 40.061078 7.599999904632568 +2013-07-25T20:08:51.000Z +-75.267517 40.061055 6.599999904632568 +2013-07-25T20:08:52.000Z +-75.267487 40.061034 5.5 +2013-07-25T20:08:53.000Z +-75.267447 40.061 4.400000095367432 +2013-07-25T20:08:54.000Z +-75.267408 40.060983 4.400000095367432 +2013-07-25T20:08:55.000Z +-75.267355 40.060922 5.5 +2013-07-25T20:08:56.000Z +-75.267315 40.060896 5.699999809265137 +2013-07-25T20:08:57.000Z +-75.267266 40.060842 6.099999904632568 +2013-07-25T20:08:57.998Z +-75.26722 40.060792 6.699999809265137 +2013-07-25T20:08:59.000Z +-75.267169 40.060751 6.5 +2013-07-25T20:09:00.000Z +-75.267115 40.060708 6.5 +2013-07-25T20:09:01.000Z +-75.267058 40.060675 6.800000190734863 +2013-07-25T20:09:02.000Z +-75.267 40.060636 5.900000095367432 +2013-07-25T20:09:03.000Z +-75.26697 40.06061 4.099999904632568 +2013-07-25T20:09:04.000Z +-75.266924 40.060585 3.0 +2013-07-25T20:09:05.000Z +-75.266886 40.060599 -1.2000000476837158 +2013-07-25T20:09:06.000Z +-75.266851 40.060596 -2.9000000953674316 +2013-07-25T20:09:07.000Z +-75.266805 40.060592 -3.4000000953674316 +2013-07-25T20:09:08.000Z +-75.266757 40.060614 -10.199999809265137 +2013-07-25T20:09:09.000Z +-75.266711 40.0606 -11.5 +2013-07-25T20:09:10.000Z +-75.266671 40.060572 -12.100000381469727 +2013-07-25T20:09:10.999Z +-75.266631 40.060546 -12.100000381469727 +2013-07-25T20:09:12.000Z +-75.266591 40.060514 -13.100000381469727 +2013-07-25T20:09:13.000Z +-75.266549 40.060497 -13.199999809265137 +2013-07-25T20:09:14.000Z +-75.266507 40.060479 -13.5 +2013-07-25T20:09:15.000Z +-75.266445 40.060454 -13.300000190734863 +2013-07-25T20:09:16.000Z +-75.266395 40.060425 -13.100000381469727 +2013-07-25T20:09:17.000Z +-75.266366 40.060396 -10.600000381469727 +2013-07-25T20:09:18.000Z +-75.266322 40.060373 -10.5 +2013-07-25T20:09:19.000Z +-75.266277 40.060347 -9.899999618530273 +2013-07-25T20:09:20.000Z +-75.266238 40.060321 -9.0 +2013-07-25T20:09:21.000Z +-75.2662 40.060302 -8.100000381469727 +2013-07-25T20:09:22.000Z +-75.266165 40.060287 -7.699999809265137 +2013-07-25T20:09:23.000Z +-75.26613 40.060275 -7.199999809265137 +2013-07-25T20:09:24.000Z +-75.266093 40.060264 -7.199999809265137 +2013-07-25T20:09:25.000Z +-75.26605 40.060246 -7.300000190734863 +2013-07-25T20:09:26.000Z +-75.265957 40.060177 -6.300000190734863 +2013-07-25T20:09:27.000Z +-75.2659 40.060148 -6.300000190734863 +2013-07-25T20:09:28.000Z +-75.265846 40.06011 -5.699999809265137 +2013-07-25T20:09:29.000Z +-75.265801 40.060092 -2.799999952316284 +2013-07-25T20:09:30.000Z +-75.265767 40.060058 -1.899999976158142 +2013-07-25T20:09:31.000Z +-75.265719 40.060044 -0.4000000059604645 +2013-07-25T20:09:32.000Z +-75.265675 40.060026 0.0 +2013-07-25T20:09:33.000Z +-75.265617 40.060011 0.20000000298023224 +2013-07-25T20:09:34.000Z +-75.26556 40.059979 0.30000001192092896 +2013-07-25T20:09:35.000Z +-75.265502 40.059928 1.600000023841858 +2013-07-25T20:09:36.000Z +-75.265475 40.059874 0.4000000059604645 +2013-07-25T20:09:37.000Z +-75.265433 40.059831 -0.20000000298023224 +2013-07-25T20:09:38.000Z +-75.265384 40.059797 0.5 +2013-07-25T20:09:39.000Z +-75.265339 40.059764 1.399999976158142 +2013-07-25T20:09:40.000Z +-75.265294 40.059732 2.0999999046325684 +2013-07-25T20:09:41.000Z +-75.265256 40.059692 2.0999999046325684 +2013-07-25T20:09:42.000Z +-75.265206 40.059638 1.100000023841858 +2013-07-25T20:09:43.000Z +-75.26515 40.059605 1.7999999523162842 +2013-07-25T20:09:44.000Z +-75.265114 40.05954 1.399999976158142 +2013-07-25T20:09:45.000Z +-75.26508 40.059486 1.100000023841858 +2013-07-25T20:09:46.000Z +-75.26503 40.05946 1.2000000476837158 +2013-07-25T20:09:47.000Z +-75.264991 40.059407 1.0 +2013-07-25T20:09:48.000Z +-75.264949 40.059365 -0.5 +2013-07-25T20:09:49.000Z +-75.264908 40.059324 -0.8999999761581421 +2013-07-25T20:09:50.000Z +-75.264863 40.059287 -0.5 +2013-07-25T20:09:51.000Z +-75.264834 40.05925 0.10000000149011612 +2013-07-25T20:09:52.000Z +-75.264805 40.059231 1.7999999523162842 +2013-07-25T20:09:53.000Z +-75.264753 40.059187 0.800000011920929 +2013-07-25T20:09:54.000Z +-75.264711 40.05915 1.2000000476837158 +2013-07-25T20:09:55.000Z +-75.26467 40.059111 1.2000000476837158 +2013-07-25T20:09:56.000Z +-75.264656 40.059094 1.2000000476837158 +2013-07-25T20:09:57.000Z +-75.264618 40.059025 3.0999999046325684 +2013-07-25T20:09:58.000Z +-75.26457 40.058979 3.0999999046325684 +2013-07-25T20:09:59.000Z +-75.264541 40.058915 5.199999809265137 +2013-07-25T20:10:00.000Z +-75.264496 40.058879 4.400000095367432 +2013-07-25T20:10:01.000Z +-75.264464 40.058872 4.5 +2013-07-25T20:10:01.999Z +-75.26443 40.05885 4.699999809265137 +2013-07-25T20:10:03.000Z +-75.264399 40.058762 9.100000381469727 +2013-07-25T20:10:04.000Z +-75.264356 40.058717 7.599999904632568 +2013-07-25T20:10:04.999Z +-75.264328 40.058681 8.699999809265137 +2013-07-25T20:10:06.000Z +-75.264275 40.058648 14.800000190734863 +2013-07-25T20:10:07.000Z +-75.264223 40.058634 17.0 +2013-07-25T20:10:08.000Z +-75.264194 40.058596 19.600000381469727 +2013-07-25T20:10:10.000Z +-75.26415 40.058589 19.700000762939453 +2013-07-25T20:10:11.000Z +-75.26413 40.05859 20.200000762939453 +2013-07-25T20:10:12.000Z +-75.264117 40.058575 19.700000762939453 +2013-07-25T20:10:13.000Z +-75.264082 40.058488 18.100000381469727 +2013-07-25T20:10:14.000Z +-75.26407 40.058436 17.200000762939453 +2013-07-25T20:10:14.999Z +-75.264052 40.058381 17.399999618530273 +2013-07-25T20:10:16.000Z +-75.264036 40.058362 13.800000190734863 +2013-07-25T20:10:17.000Z +-75.264026 40.058311 13.399999618530273 +2013-07-25T20:10:18.000Z +-75.264022 40.058257 12.899999618530273 +2013-07-25T20:10:20.000Z +-75.26403 40.058228 13.100000381469727 +2013-07-25T20:10:21.000Z +-75.26403 40.058193 11.600000381469727 +2013-07-25T20:10:23.000Z +-75.264022 40.058156 11.600000381469727 +2013-07-25T20:10:24.000Z +-75.263988 40.058127 9.800000190734863 +2013-07-25T20:10:25.000Z +-75.263934 40.058089 18.600000381469727 +2013-07-25T20:10:26.000Z +-75.263945 40.058041 15.899999618530273 +2013-07-25T20:10:27.000Z +-75.263955 40.058011 16.399999618530273 +2013-07-25T20:10:28.000Z +-75.263927 40.057924 17.399999618530273 +2013-07-25T20:10:29.000Z +-75.263916 40.057878 16.100000381469727 +2013-07-25T20:10:30.000Z +-75.263903 40.057824 14.699999809265137 +2013-07-25T20:10:31.000Z +-75.263896 40.057768 14.100000381469727 +2013-07-25T20:10:32.000Z +-75.263855 40.057646 16.299999237060547 +2013-07-25T20:10:33.000Z +-75.263841 40.057608 16.799999237060547 +2013-07-25T20:10:34.000Z +-75.263829 40.057545 16.0 +2013-07-25T20:10:35.000Z +-75.263823 40.057488 15.5 +2013-07-25T20:10:36.000Z +-75.263804 40.057442 15.100000381469727 +2013-07-25T20:10:37.000Z +-75.263794 40.057388 15.800000190734863 +2013-07-25T20:10:38.000Z +-75.263791 40.057307 15.100000381469727 +2013-07-25T20:10:39.000Z +-75.263767 40.05727 15.5 +2013-07-25T20:10:40.000Z +-75.26373 40.05722 14.699999809265137 +2013-07-25T20:10:41.000Z +-75.263734 40.057173 15.800000190734863 +2013-07-25T20:10:42.000Z +-75.263728 40.057112 17.799999237060547 +2013-07-25T20:10:43.000Z +-75.26374 40.057092 17.0 +2013-07-25T20:10:44.000Z +-75.263751 40.057067 17.100000381469727 +2013-07-25T20:10:45.000Z +-75.263756 40.057045 17.600000381469727 +2013-07-25T20:10:46.000Z +-75.263744 40.057006 19.200000762939453 +2013-07-25T20:10:47.000Z +-75.263737 40.056981 19.299999237060547 +2013-07-25T20:10:48.000Z +-75.263749 40.056931 18.399999618530273 +2013-07-25T20:10:49.000Z +-75.263737 40.056855 18.5 +2013-07-25T20:10:50.000Z +-75.263716 40.05682 17.799999237060547 +2013-07-25T20:10:51.000Z +-75.263683 40.056786 17.399999618530273 +2013-07-25T20:10:52.000Z +-75.263659 40.056736 17.200000762939453 +2013-07-25T20:10:53.000Z +-75.263647 40.056709 17.299999237060547 +2013-07-25T20:10:54.000Z +-75.263636 40.056625 23.200000762939453 +2013-07-25T20:10:57.000Z +-75.263595 40.056605 32.599998474121094 +2013-07-25T20:10:58.000Z +-75.26358 40.056566 32.29999923706055 +2013-07-25T20:10:59.000Z +-75.263568 40.056551 32.900001525878906 +2013-07-25T20:11:00.000Z +-75.26354 40.056434 31.899999618530273 +2013-07-25T20:11:01.000Z +-75.263527 40.056399 32.599998474121094 +2013-07-25T20:11:02.000Z +-75.26351 40.056358 32.70000076293945 +2013-07-25T20:11:03.000Z +-75.26348 40.056346 37.29999923706055 +2013-07-25T20:11:04.000Z +-75.26346 40.056305 39.20000076293945 +2013-07-25T20:11:05.000Z +-75.26344 40.056277 38.900001525878906 +2013-07-25T20:11:06.000Z +-75.263418 40.056249 39.79999923706055 +2013-07-25T20:11:07.000Z +-75.263395 40.056224 40.29999923706055 +2013-07-25T20:11:08.000Z +-75.263372 40.056201 45.70000076293945 +2013-07-25T20:11:09.000Z +-75.263347 40.056179 49.5 +2013-07-25T20:11:10.000Z +-75.263322 40.056156 51.29999923706055 +2013-07-25T20:11:11.000Z +-75.263301 40.056121 48.900001525878906 +2013-07-25T20:11:12.000Z +-75.263281 40.056082 50.0 +2013-07-25T20:11:13.000Z +-75.263261 40.056049 51.400001525878906 +2013-07-25T20:11:14.000Z +-75.263239 40.05602 51.20000076293945 +2013-07-25T20:11:15.000Z +-75.263218 40.05598 52.400001525878906 +2013-07-25T20:11:16.000Z +-75.263194 40.055933 52.599998474121094 +2013-07-25T20:11:17.000Z +-75.26317 40.055885 52.5 +2013-07-25T20:11:18.000Z +-75.263111 40.055788 56.400001525878906 +2013-07-25T20:11:19.000Z +-75.263096 40.055748 54.70000076293945 +2013-07-25T20:11:20.000Z +-75.263075 40.055688 54.099998474121094 +2013-07-25T20:11:21.000Z +-75.263043 40.055676 54.400001525878906 +2013-07-25T20:11:22.000Z +-75.26301 40.055629 55.400001525878906 +2013-07-25T20:11:23.000Z +-75.262984 40.055576 55.900001525878906 +2013-07-25T20:11:24.000Z +-75.262953 40.055536 57.400001525878906 +2013-07-25T20:11:25.000Z +-75.262922 40.055492 57.099998474121094 +2013-07-25T20:11:26.000Z +-75.262894 40.05543 57.400001525878906 +2013-07-25T20:11:27.000Z +-75.262869 40.05538 58.5 +2013-07-25T20:11:28.000Z +-75.262835 40.055327 58.599998474121094 +2013-07-25T20:11:29.000Z +-75.262825 40.055276 58.599998474121094 +2013-07-25T20:11:30.000Z +-75.262838 40.055129 50.099998474121094 +2013-07-25T20:11:31.000Z +-75.262793 40.055091 50.20000076293945 +2013-07-25T20:11:32.000Z +-75.26275 40.055013 50.0 +2013-07-25T20:11:33.000Z +-75.262738 40.054987 50.20000076293945 +2013-07-25T20:11:34.000Z +-75.262695 40.054949 50.599998474121094 +2013-07-25T20:11:35.000Z +-75.262676 40.054916 51.400001525878906 +2013-07-25T20:11:36.000Z +-75.262684 40.054845 48.29999923706055 +2013-07-25T20:11:37.000Z +-75.262681 40.054767 43.0 +2013-07-25T20:11:38.000Z +-75.262654 40.054714 42.29999923706055 +2013-07-25T20:11:39.000Z +-75.262632 40.054671 41.29999923706055 +2013-07-25T20:11:40.000Z +-75.262608 40.054623 41.70000076293945 +2013-07-25T20:11:41.000Z +-75.262582 40.054574 40.29999923706055 +2013-07-25T20:11:42.000Z +-75.262545 40.054541 40.400001525878906 +2013-07-25T20:11:43.000Z +-75.262521 40.054482 39.5 +2013-07-25T20:11:44.000Z +-75.262479 40.054439 39.70000076293945 +2013-07-25T20:11:45.000Z +-75.262448 40.054373 37.79999923706055 +2013-07-25T20:11:46.000Z +-75.262415 40.05435 38.0 +2013-07-25T20:11:47.000Z +-75.262375 40.054273 34.79999923706055 +2013-07-25T20:11:48.000Z +-75.262358 40.054233 33.29999923706055 +2013-07-25T20:11:49.000Z +-75.262349 40.054183 33.099998474121094 +2013-07-25T20:11:50.000Z +-75.262301 40.054132 32.900001525878906 +2013-07-25T20:11:51.000Z +-75.262273 40.05408 31.200000762939453 +2013-07-25T20:11:52.000Z +-75.262248 40.054011 28.5 +2013-07-25T20:11:53.000Z +-75.262208 40.053955 27.399999618530273 +2013-07-25T20:11:54.000Z +-75.262162 40.053914 26.5 +2013-07-25T20:11:55.000Z +-75.262135 40.053886 26.899999618530273 +2013-07-25T20:11:56.000Z +-75.262094 40.05385 27.399999618530273 +2013-07-25T20:11:57.000Z +-75.262036 40.053865 31.399999618530273 +2013-07-25T20:11:58.000Z +-75.261995 40.053811 29.600000381469727 +2013-07-25T20:11:59.000Z +-75.261959 40.053775 29.399999618530273 +2013-07-25T20:12:00.000Z +-75.261913 40.053736 29.200000762939453 +2013-07-25T20:12:01.000Z +-75.261872 40.053695 27.700000762939453 +2013-07-25T20:12:02.000Z +-75.261825 40.053654 25.399999618530273 +2013-07-25T20:12:03.000Z +-75.261787 40.053631 24.200000762939453 +2013-07-25T20:12:04.000Z +-75.261725 40.053612 21.100000381469727 +2013-07-25T20:12:05.000Z +-75.261685 40.053571 19.899999618530273 +2013-07-25T20:12:06.000Z +-75.261643 40.053542 19.799999237060547 +2013-07-25T20:12:07.000Z +-75.261607 40.053524 20.100000381469727 +2013-07-25T20:12:08.000Z +-75.261572 40.053501 20.5 +2013-07-25T20:12:09.000Z +-75.261537 40.053469 20.200000762939453 +2013-07-25T20:12:10.000Z +-75.261504 40.053434 19.899999618530273 +2013-07-25T20:12:11.000Z +-75.261453 40.053425 20.299999237060547 +2013-07-25T20:12:12.000Z +-75.26139 40.053357 22.0 +2013-07-25T20:12:13.000Z +-75.261344 40.053316 21.600000381469727 +2013-07-25T20:12:14.000Z +-75.26129 40.053278 21.299999237060547 +2013-07-25T20:12:15.000Z +-75.261244 40.053241 21.799999237060547 +2013-07-25T20:12:16.000Z +-75.261197 40.053209 21.600000381469727 +2013-07-25T20:12:17.000Z +-75.261145 40.053167 22.399999618530273 +2013-07-25T20:12:18.000Z +-75.261099 40.05313 22.700000762939453 +2013-07-25T20:12:19.000Z +-75.261054 40.053101 21.700000762939453 +2013-07-25T20:12:20.000Z +-75.261017 40.053069 20.100000381469727 +2013-07-25T20:12:21.000Z +-75.26097 40.053044 19.700000762939453 +2013-07-25T20:12:22.000Z +-75.260926 40.053012 19.899999618530273 +2013-07-25T20:12:23.000Z +-75.260881 40.052981 20.200000762939453 +2013-07-25T20:12:24.000Z +-75.260842 40.052943 19.5 +2013-07-25T20:12:25.000Z +-75.260794 40.052913 19.600000381469727 +2013-07-25T20:12:26.000Z +-75.260748 40.052902 21.299999237060547 +2013-07-25T20:12:27.000Z +-75.260725 40.052884 20.0 +2013-07-25T20:12:28.000Z +-75.260689 40.052865 20.200000762939453 +2013-07-25T20:12:29.000Z +-75.260614 40.052752 30.0 +2013-07-25T20:12:30.000Z +-75.260564 40.052702 32.599998474121094 +2013-07-25T20:12:31.000Z +-75.260519 40.052655 33.79999923706055 +2013-07-25T20:12:34.000Z +-75.260478 40.052636 36.099998474121094 +2013-07-25T20:12:35.000Z +-75.260402 40.052622 34.79999923706055 +2013-07-25T20:12:36.000Z +-75.260356 40.052611 36.0 +2013-07-25T20:12:37.000Z +-75.260317 40.052584 35.900001525878906 +2013-07-25T20:12:38.001Z +-75.260277 40.052575 36.5 +2013-07-25T20:12:39.000Z +-75.260242 40.052555 35.400001525878906 +2013-07-25T20:12:40.000Z +-75.260196 40.052533 34.70000076293945 +2013-07-25T20:12:41.000Z +-75.260157 40.052524 35.20000076293945 +2013-07-25T20:12:42.000Z +-75.260111 40.052444 34.599998474121094 +2013-07-25T20:12:43.001Z +-75.260073 40.052411 35.20000076293945 +2013-07-25T20:12:44.000Z +-75.260016 40.05238 35.400001525878906 +2013-07-25T20:12:45.000Z +-75.259961 40.052318 35.599998474121094 +2013-07-25T20:12:46.000Z +-75.259906 40.052315 34.70000076293945 +2013-07-25T20:12:47.000Z +-75.259863 40.052309 35.400001525878906 +2013-07-25T20:12:48.000Z +-75.259836 40.052262 31.0 +2013-07-25T20:12:49.000Z +-75.259798 40.052219 30.200000762939453 +2013-07-25T20:12:50.000Z +-75.259741 40.052157 34.099998474121094 +2013-07-25T20:12:51.000Z +-75.259688 40.05212 37.0 +2013-07-25T20:12:53.000Z +-75.259644 40.052096 33.400001525878906 +2013-07-25T20:12:54.000Z +-75.259616 40.052042 32.79999923706055 +2013-07-25T20:12:55.000Z +-75.259578 40.052016 33.5 +2013-07-25T20:12:56.000Z +-75.259514 40.051979 32.20000076293945 +2013-07-25T20:12:57.000Z +-75.259466 40.051904 32.29999923706055 +2013-07-25T20:12:58.000Z +-75.259421 40.051829 34.29999923706055 +2013-07-25T20:12:59.000Z +-75.259388 40.051848 31.600000381469727 +2013-07-25T20:12:59.999Z +-75.259348 40.051815 31.799999237060547 +2013-07-25T20:13:01.000Z +-75.259312 40.051779 29.200000762939453 +2013-07-25T20:13:02.000Z +-75.259268 40.051744 28.799999237060547 +2013-07-25T20:13:03.001Z +-75.259227 40.051713 28.5 +2013-07-25T20:13:04.000Z +-75.259184 40.05167 28.200000762939453 +2013-07-25T20:13:05.000Z +-75.259135 40.051656 29.899999618530273 +2013-07-25T20:13:06.000Z +-75.25909 40.05162 30.700000762939453 +2013-07-25T20:13:07.000Z +-75.25905 40.051596 31.299999237060547 +2013-07-25T20:13:08.000Z +-75.259003 40.051569 31.399999618530273 +2013-07-25T20:13:09.000Z +-75.258948 40.051571 36.099998474121094 +2013-07-25T20:13:10.000Z +-75.258902 40.051569 36.5 +2013-07-25T20:13:11.000Z +-75.25887 40.051525 35.29999923706055 +2013-07-25T20:13:12.000Z +-75.258828 40.051495 35.400001525878906 +2013-07-25T20:13:13.000Z +-75.258792 40.051469 35.400001525878906 +2013-07-25T20:13:14.000Z +-75.258754 40.051442 34.79999923706055 +2013-07-25T20:13:15.000Z +-75.258716 40.051416 35.29999923706055 +2013-07-25T20:13:16.000Z +-75.25867 40.051385 35.29999923706055 +2013-07-25T20:13:17.000Z +-75.258627 40.051358 34.599998474121094 +2013-07-25T20:13:18.000Z +-75.258581 40.051341 36.20000076293945 +2013-07-25T20:13:19.000Z +-75.258539 40.051312 36.0 +2013-07-25T20:13:20.000Z +-75.258502 40.051285 36.20000076293945 +2013-07-25T20:13:21.001Z +-75.258469 40.051261 36.0 +2013-07-25T20:13:22.000Z +-75.258444 40.051236 35.900001525878906 +2013-07-25T20:13:23.000Z +-75.258416 40.051211 35.79999923706055 +2013-07-25T20:13:24.000Z +-75.258381 40.051168 33.0 +2013-07-25T20:13:25.001Z +-75.258349 40.051141 33.0 +2013-07-25T20:13:26.000Z +-75.258274 40.051026 29.399999618530273 +2013-07-25T20:13:27.000Z +-75.258224 40.050997 29.200000762939453 +2013-07-25T20:13:28.000Z +-75.258178 40.05097 29.200000762939453 +2013-07-25T20:13:29.000Z +-75.258164 40.050971 27.600000381469727 +2013-07-25T20:13:30.000Z +-75.258129 40.050933 28.0 +2013-07-25T20:13:31.000Z +-75.258084 40.050894 29.799999237060547 +2013-07-25T20:13:32.000Z +-75.258057 40.050865 29.899999618530273 +2013-07-25T20:13:33.000Z +-75.258016 40.050842 30.700000762939453 +2013-07-25T20:13:34.000Z +-75.257965 40.050798 33.400001525878906 +2013-07-25T20:13:35.000Z +-75.257934 40.050765 32.0 +2013-07-25T20:13:36.000Z +-75.257899 40.050728 31.399999618530273 +2013-07-25T20:13:37.000Z +-75.257863 40.050694 32.70000076293945 +2013-07-25T20:13:38.000Z +-75.257805 40.050645 36.400001525878906 +2013-07-25T20:13:39.000Z +-75.257755 40.05061 40.900001525878906 +2013-07-25T20:13:40.000Z +-75.257718 40.050599 38.099998474121094 +2013-07-25T20:13:41.000Z +-75.25767 40.050553 39.900001525878906 +2013-07-25T20:13:42.000Z +-75.257645 40.050519 39.099998474121094 +2013-07-25T20:13:42.999Z +-75.257602 40.050485 40.79999923706055 +2013-07-25T20:13:44.000Z +-75.257539 40.050439 41.0 +2013-07-25T20:13:45.000Z +-75.257513 40.050426 39.79999923706055 +2013-07-25T20:13:46.000Z +-75.257469 40.050417 40.20000076293945 +2013-07-25T20:13:47.000Z +-75.25743 40.050404 39.5 +2013-07-25T20:13:48.000Z +-75.257404 40.050388 38.29999923706055 +2013-07-25T20:13:49.000Z +-75.25736 40.050358 39.099998474121094 +2013-07-25T20:13:50.000Z +-75.257325 40.050324 38.20000076293945 +2013-07-25T20:13:51.000Z +-75.257282 40.050291 38.70000076293945 +2013-07-25T20:13:52.000Z +-75.257214 40.050207 37.70000076293945 +2013-07-25T20:13:53.000Z +-75.257164 40.050208 36.79999923706055 +2013-07-25T20:13:54.000Z +-75.257117 40.050203 37.099998474121094 +2013-07-25T20:13:55.000Z +-75.257077 40.05013 40.099998474121094 +2013-07-25T20:13:56.000Z +-75.257054 40.050163 36.79999923706055 +2013-07-25T20:13:57.000Z +-75.257019 40.050198 35.900001525878906 +2013-07-25T20:14:01.000Z +-75.257059 40.050222 30.799999237060547 +2013-07-25T20:14:02.000Z +-75.256933 40.050103 30.200000762939453 +2013-07-25T20:14:03.000Z +-75.256893 40.05007 29.899999618530273 +2013-07-25T20:14:04.000Z +-75.256852 40.050036 29.799999237060547 +2013-07-25T20:14:05.000Z +-75.256831 40.050002 28.200000762939453 +2013-07-25T20:14:06.000Z +-75.2568 40.049972 27.100000381469727 +2013-07-25T20:14:07.000Z +-75.256766 40.049942 26.600000381469727 +2013-07-25T20:14:08.000Z +-75.256728 40.049913 26.200000762939453 +2013-07-25T20:14:09.000Z +-75.256692 40.049885 26.200000762939453 +2013-07-25T20:14:10.000Z +-75.256657 40.04986 24.200000762939453 +2013-07-25T20:14:11.000Z +-75.25662 40.049837 23.899999618530273 +2013-07-25T20:14:12.000Z +-75.25658 40.049813 24.899999618530273 +2013-07-25T20:14:13.000Z +-75.256541 40.049789 24.100000381469727 +2013-07-25T20:14:14.000Z +-75.256499 40.049758 24.100000381469727 +2013-07-25T20:14:15.000Z +-75.256459 40.049727 23.200000762939453 +2013-07-25T20:14:16.000Z +-75.256418 40.049692 22.600000381469727 +2013-07-25T20:14:17.000Z +-75.256378 40.049659 21.899999618530273 +2013-07-25T20:14:18.000Z +-75.256337 40.049626 21.600000381469727 +2013-07-25T20:14:19.000Z +-75.256296 40.049593 21.799999237060547 +2013-07-25T20:14:20.000Z +-75.256254 40.049559 21.799999237060547 +2013-07-25T20:14:21.000Z +-75.256215 40.049525 21.0 +2013-07-25T20:14:22.000Z +-75.256176 40.049489 20.700000762939453 +2013-07-25T20:14:23.000Z +-75.256137 40.049454 20.899999618530273 +2013-07-25T20:14:24.000Z +-75.256097 40.04942 20.0 +2013-07-25T20:14:25.000Z +-75.256057 40.049391 21.600000381469727 +2013-07-25T20:14:26.000Z +-75.256015 40.049362 21.399999618530273 +2013-07-25T20:14:27.000Z +-75.255976 40.049333 20.200000762939453 +2013-07-25T20:14:28.000Z +-75.255934 40.049306 19.600000381469727 +2013-07-25T20:14:29.000Z +-75.255893 40.049281 19.600000381469727 +2013-07-25T20:14:30.000Z +-75.255851 40.049252 18.700000762939453 +2013-07-25T20:14:31.000Z +-75.25581 40.049223 17.5 +2013-07-25T20:14:32.000Z +-75.25577 40.049192 17.0 +2013-07-25T20:14:33.000Z +-75.255731 40.049165 18.100000381469727 +2013-07-25T20:14:34.000Z +-75.25569 40.049141 19.100000381469727 +2013-07-25T20:14:35.000Z +-75.255648 40.049117 19.299999237060547 +2013-07-25T20:14:36.000Z +-75.255607 40.049091 19.100000381469727 +2013-07-25T20:14:37.000Z +-75.255569 40.049065 19.399999618530273 +2013-07-25T20:14:38.000Z +-75.25553 40.049038 19.0 +2013-07-25T20:14:39.000Z +-75.255491 40.049008 19.899999618530273 +2013-07-25T20:14:40.000Z +-75.255449 40.048979 19.399999618530273 +2013-07-25T20:14:41.000Z +-75.255412 40.04895 18.200000762939453 +2013-07-25T20:14:42.000Z +-75.255373 40.048919 17.299999237060547 +2013-07-25T20:14:43.000Z +-75.255334 40.048892 19.200000762939453 +2013-07-25T20:14:44.000Z +-75.255294 40.048866 21.0 +2013-07-25T20:14:45.000Z +-75.255257 40.048846 23.100000381469727 +2013-07-25T20:14:46.000Z +-75.255217 40.048824 22.700000762939453 +2013-07-25T20:14:47.000Z +-75.255181 40.0488 22.600000381469727 +2013-07-25T20:14:48.000Z +-75.255143 40.048772 22.100000381469727 +2013-07-25T20:14:49.000Z +-75.255109 40.048744 22.0 +2013-07-25T20:14:50.000Z +-75.255073 40.048714 22.100000381469727 +2013-07-25T20:14:51.000Z +-75.255035 40.048683 22.0 +2013-07-25T20:14:52.000Z +-75.254995 40.04865 21.799999237060547 +2013-07-25T20:14:53.000Z +-75.254958 40.048619 21.5 +2013-07-25T20:14:54.000Z +-75.254922 40.048585 21.299999237060547 +2013-07-25T20:14:55.000Z +-75.254887 40.048551 20.0 +2013-07-25T20:14:56.000Z +-75.254848 40.048518 20.899999618530273 +2013-07-25T20:14:57.000Z +-75.254813 40.048496 20.299999237060547 +2013-07-25T20:14:58.000Z +-75.254776 40.048477 18.899999618530273 +2013-07-25T20:14:59.000Z +-75.254737 40.048456 18.399999618530273 +2013-07-25T20:15:00.000Z +-75.254693 40.048433 18.700000762939453 +2013-07-25T20:15:01.000Z +-75.254651 40.048407 17.600000381469727 +2013-07-25T20:15:02.000Z +-75.254606 40.048376 17.100000381469727 +2013-07-25T20:15:03.000Z +-75.254562 40.048346 17.0 +2013-07-25T20:15:04.000Z +-75.254517 40.048315 16.799999237060547 +2013-07-25T20:15:05.000Z +-75.254475 40.048288 16.899999618530273 +2013-07-25T20:15:06.000Z +-75.254431 40.04826 16.100000381469727 +2013-07-25T20:15:07.000Z +-75.254387 40.048232 16.200000762939453 +2013-07-25T20:15:08.000Z +-75.254342 40.048204 16.899999618530273 +2013-07-25T20:15:09.000Z +-75.254299 40.048176 17.600000381469727 +2013-07-25T20:15:10.000Z +-75.254256 40.048146 17.200000762939453 +2013-07-25T20:15:11.000Z +-75.254215 40.048117 17.100000381469727 +2013-07-25T20:15:12.000Z +-75.254173 40.048087 16.700000762939453 +2013-07-25T20:15:13.000Z +-75.254136 40.048061 16.700000762939453 +2013-07-25T20:15:14.000Z +-75.254097 40.048035 16.399999618530273 +2013-07-25T20:15:15.000Z +-75.254058 40.048009 16.100000381469727 +2013-07-25T20:15:15.999Z +-75.254024 40.047985 15.0 +2013-07-25T20:15:17.000Z +-75.253986 40.047963 15.399999618530273 +2013-07-25T20:15:18.000Z +-75.25395 40.047939 14.199999809265137 +2013-07-25T20:15:19.000Z +-75.253916 40.047919 12.5 +2013-07-25T20:15:20.000Z +-75.253881 40.0479 10.699999809265137 +2013-07-25T20:15:21.000Z +-75.253866 40.047883 10.899999618530273 +2013-07-25T20:15:22.000Z +-75.253846 40.047861 11.0 +2013-07-25T20:15:23.000Z +-75.253825 40.047844 11.100000381469727 +2013-07-25T20:15:24.000Z +-75.253797 40.047804 10.100000381469727 +2013-07-25T20:15:25.003Z +-75.25377 40.047778 10.300000190734863 +2013-07-25T20:15:26.000Z +-75.253735 40.047742 10.5 +2013-07-25T20:15:27.000Z +-75.253691 40.047677 8.300000190734863 +2013-07-25T20:15:28.000Z +-75.253645 40.047652 8.300000190734863 +2013-07-25T20:15:29.000Z +-75.253604 40.047622 8.100000381469727 +2013-07-25T20:15:30.000Z +-75.253556 40.047595 8.399999618530273 +2013-07-25T20:15:31.000Z +-75.25352 40.047568 8.0 +2013-07-25T20:15:31.999Z +-75.25348 40.047542 8.100000381469727 +2013-07-25T20:15:33.000Z +-75.253444 40.047514 6.599999904632568 +2013-07-25T20:15:34.000Z +-75.253402 40.047496 6.599999904632568 +2013-07-25T20:15:35.000Z +-75.253356 40.047472 6.699999809265137 +2013-07-25T20:15:36.000Z +-75.253327 40.047429 7.099999904632568 +2013-07-25T20:15:37.000Z +-75.253295 40.047395 7.800000190734863 +2013-07-25T20:15:38.000Z +-75.253239 40.04734 6.199999809265137 +2013-07-25T20:15:39.000Z +-75.253197 40.047293 5.599999904632568 +2013-07-25T20:15:40.000Z +-75.253156 40.047246 5.400000095367432 +2013-07-25T20:15:41.000Z +-75.253105 40.047203 5.599999904632568 +2013-07-25T20:15:42.000Z +-75.253056 40.047162 5.199999809265137 +2013-07-25T20:15:43.000Z +-75.253004 40.047126 5.300000190734863 +2013-07-25T20:15:44.000Z +-75.252951 40.047088 5.800000190734863 +2013-07-25T20:15:45.000Z +-75.252902 40.047056 6.0 +2013-07-25T20:15:46.000Z +-75.252853 40.047032 5.800000190734863 +2013-07-25T20:15:46.999Z +-75.252805 40.047003 5.900000095367432 +2013-07-25T20:15:48.000Z +-75.252741 40.046958 5.800000190734863 +2013-07-25T20:15:49.000Z +-75.252699 40.046932 6.0 +2013-07-25T20:15:50.000Z +-75.252653 40.046896 5.900000095367432 +2013-07-25T20:15:51.000Z +-75.252585 40.046852 9.199999809265137 +2013-07-25T20:15:52.000Z +-75.25253 40.046816 9.800000190734863 +2013-07-25T20:15:53.000Z +-75.25248 40.046777 9.399999618530273 +2013-07-25T20:15:54.000Z +-75.252442 40.046755 9.199999809265137 +2013-07-25T20:15:55.000Z +-75.252395 40.046721 9.300000190734863 +2013-07-25T20:15:56.000Z +-75.252366 40.046714 8.699999809265137 +2013-07-25T20:15:57.000Z +-75.25232 40.046712 7.5 +2013-07-25T20:15:58.000Z +-75.252283 40.046693 6.400000095367432 +2013-07-25T20:15:59.000Z +-75.25224 40.046686 6.099999904632568 +2013-07-25T20:16:00.000Z +-75.25217 40.046606 8.899999618530273 +2013-07-25T20:16:01.000Z +-75.252114 40.046568 10.800000190734863 +2013-07-25T20:16:03.000Z +-75.252068 40.04656 12.800000190734863 +2013-07-25T20:16:04.000Z +-75.252037 40.04654 13.300000190734863 +2013-07-25T20:16:06.000Z +-75.251983 40.046526 13.800000190734863 +2013-07-25T20:16:07.000Z +-75.251909 40.046491 14.5 +2013-07-25T20:16:08.000Z +-75.251851 40.04649 15.100000381469727 +2013-07-25T20:16:09.001Z +-75.251803 40.046472 15.800000190734863 +2013-07-25T20:16:10.000Z +-75.251748 40.046445 14.600000381469727 +2013-07-25T20:16:11.000Z +-75.251702 40.046416 13.800000190734863 +2013-07-25T20:16:12.000Z +-75.251663 40.046359 11.199999809265137 +2013-07-25T20:16:13.000Z +-75.251612 40.046329 9.800000190734863 +2013-07-25T20:16:14.000Z +-75.251564 40.046295 9.300000190734863 +2013-07-25T20:16:15.000Z +-75.251525 40.046276 8.5 +2013-07-25T20:16:16.000Z +-75.251513 40.046259 8.899999618530273 +2013-07-25T20:16:18.001Z +-75.251462 40.046256 9.199999809265137 +2013-07-25T20:16:19.000Z +-75.25145 40.046286 9.5 +2013-07-25T20:16:20.000Z +-75.25135 40.04618 12.800000190734863 +2013-07-25T20:16:21.000Z +-75.251292 40.046189 15.300000190734863 +2013-07-25T20:16:22.000Z +-75.251237 40.04615 14.800000190734863 +2013-07-25T20:16:23.000Z +-75.251197 40.046114 15.0 +2013-07-25T20:16:24.000Z +-75.251146 40.04607 15.800000190734863 +2013-07-25T20:16:25.000Z +-75.251105 40.046004 16.399999618530273 +2013-07-25T20:16:26.000Z +-75.251058 40.045947 16.100000381469727 +2013-07-25T20:16:27.000Z +-75.251012 40.045884 16.200000762939453 +2013-07-25T20:16:28.000Z +-75.250961 40.045812 15.800000190734863 +2013-07-25T20:16:29.000Z +-75.250914 40.045744 15.5 +2013-07-25T20:16:30.000Z +-75.25086 40.045674 16.799999237060547 +2013-07-25T20:16:31.000Z +-75.250803 40.045595 17.0 +2013-07-25T20:16:32.000Z +-75.250739 40.045521 16.899999618530273 +2013-07-25T20:16:33.000Z +-75.250664 40.045402 13.100000381469727 +2013-07-25T20:16:34.000Z +-75.250573 40.045351 11.600000381469727 +2013-07-25T20:16:35.000Z +-75.250516 40.045284 9.5 +2013-07-25T20:16:36.000Z +-75.25045 40.045224 7.699999809265137 +2013-07-25T20:16:37.000Z +-75.250399 40.045181 6.0 +2013-07-25T20:16:38.000Z +-75.250353 40.045136 4.900000095367432 +2013-07-25T20:16:39.000Z +-75.250309 40.045098 4.099999904632568 +2013-07-25T20:16:40.000Z +-75.250268 40.045061 3.0 +2013-07-25T20:16:41.000Z +-75.250227 40.045025 2.200000047683716 +2013-07-25T20:16:42.000Z +-75.25018 40.044989 1.7000000476837158 +2013-07-25T20:16:43.000Z +-75.250143 40.044963 1.7000000476837158 +2013-07-25T20:16:44.000Z +-75.250117 40.044936 1.0 +2013-07-25T20:16:45.000Z +-75.250099 40.044908 0.10000000149011612 +2013-07-25T20:16:46.000Z +-75.250085 40.044889 -0.20000000298023224 +2013-07-25T20:16:47.000Z +-75.250071 40.044868 -0.8999999761581421 +2013-07-25T20:16:48.000Z +-75.250049 40.044845 -1.399999976158142 +2013-07-25T20:16:49.000Z +-75.250049 40.044809 -2.0 +2013-07-25T20:16:50.000Z +-75.250043 40.044786 -3.4000000953674316 +2013-07-25T20:16:51.000Z +-75.250017 40.044727 -5.599999904632568 +2013-07-25T20:16:54.000Z +-75.250049 40.044709 -8.300000190734863 +2013-07-25T20:16:55.000Z +-75.250086 40.044715 -8.5 +2013-07-25T20:16:56.000Z +-75.250129 40.044733 -7.800000190734863 +2013-07-25T20:16:57.000Z +-75.250175 40.044755 -7.300000190734863 +2013-07-25T20:16:58.000Z +-75.250217 40.044793 -10.0 +2013-07-25T20:16:59.000Z +-75.250253 40.044825 -9.800000190734863 +2013-07-25T20:17:00.000Z +-75.25029 40.044859 -10.399999618530273 +2013-07-25T20:17:01.000Z +-75.250324 40.04489 -9.399999618530273 +2013-07-25T20:17:02.000Z +-75.250359 40.044918 -8.800000190734863 +2013-07-25T20:17:03.000Z +-75.250394 40.044944 -8.199999809265137 +2013-07-25T20:17:04.000Z +-75.250428 40.044966 -7.800000190734863 +2013-07-25T20:17:05.000Z +-75.250459 40.044986 -7.300000190734863 +2013-07-25T20:17:06.000Z +-75.250486 40.045004 -7.800000190734863 +2013-07-25T20:17:07.000Z +-75.250511 40.045023 -7.699999809265137 +2013-07-25T20:17:08.000Z +-75.250535 40.045043 -8.199999809265137 +2013-07-25T20:17:10.000Z +-75.250574 40.045072 -6.800000190734863 +2013-07-25T20:17:11.000Z +-75.250595 40.045088 -6.900000095367432 +2013-07-25T20:17:12.000Z +-75.250617 40.045105 -7.099999904632568 +2013-07-25T20:17:13.000Z +-75.25064 40.045125 -7.900000095367432 +2013-07-25T20:17:14.000Z +-75.250668 40.045147 -7.400000095367432 +2013-07-25T20:17:15.000Z +-75.250697 40.045171 -7.300000190734863 +2013-07-25T20:17:16.000Z +-75.250727 40.045198 -7.199999809265137 +2013-07-25T20:17:17.000Z +-75.250753 40.045224 -6.699999809265137 +2013-07-25T20:17:18.000Z +-75.250774 40.045249 -5.800000190734863 +2013-07-25T20:17:19.000Z +-75.250791 40.045273 -5.599999904632568 +2013-07-25T20:17:20.000Z +-75.250804 40.045295 -5.5 +2013-07-25T20:17:21.000Z +-75.250814 40.045314 -5.5 +2013-07-25T20:17:22.000Z +-75.250825 40.045334 -5.800000190734863 +2013-07-25T20:17:23.000Z +-75.250836 40.045356 -5.0 +2013-07-25T20:17:24.000Z +-75.250847 40.045378 -5.0 +2013-07-25T20:17:25.000Z +-75.250859 40.045402 -5.699999809265137 +2013-07-25T20:17:26.000Z +-75.250871 40.045426 -6.300000190734863 +2013-07-25T20:17:27.000Z +-75.250886 40.045453 -6.599999904632568 +2013-07-25T20:17:28.000Z +-75.250903 40.045482 -6.900000095367432 +2013-07-25T20:17:29.000Z +-75.250919 40.04551 -7.599999904632568 +2013-07-25T20:17:30.000Z +-75.250936 40.045538 -7.599999904632568 +2013-07-25T20:17:31.000Z +-75.250951 40.045565 -8.399999618530273 +2013-07-25T20:17:32.000Z +-75.250965 40.045589 -8.699999809265137 +2013-07-25T20:17:33.000Z +-75.250978 40.04561 -9.300000190734863 +2013-07-25T20:17:34.000Z +-75.250991 40.04563 -8.800000190734863 +2013-07-25T20:17:35.000Z +-75.251004 40.04565 -9.100000381469727 +2013-07-25T20:17:37.000Z +-75.251027 40.045688 -9.399999618530273 +2013-07-25T20:17:38.000Z +-75.251038 40.045707 -9.600000381469727 +2013-07-25T20:17:39.000Z +-75.251049 40.045728 -8.899999618530273 +2013-07-25T20:17:40.000Z +-75.251061 40.045748 -8.5 +2013-07-25T20:17:42.000Z +-75.251079 40.045782 -8.0 +2013-07-25T20:17:43.000Z +-75.251089 40.045796 -8.199999809265137 +2013-07-25T20:17:45.000Z +-75.251113 40.045826 -8.699999809265137 +2013-07-25T20:17:46.000Z +-75.251126 40.04584 -8.5 +2013-07-25T20:17:49.000Z +-75.251169 40.04586 -4.800000190734863 +2013-07-25T20:17:50.000Z +-75.251188 40.045866 -5.0 +2013-07-25T20:17:52.000Z +-75.251224 40.04588 -2.700000047683716 +2013-07-25T20:17:53.000Z +-75.251241 40.045885 -1.600000023841858 +2013-07-25T20:17:55.000Z +-75.251275 40.045899 -0.10000000149011612 +2013-07-25T20:17:56.000Z +-75.251292 40.045909 0.5 +2013-07-25T20:17:58.000Z +-75.251324 40.045932 1.7999999523162842 +2013-07-25T20:17:59.001Z +-75.25134 40.045944 2.299999952316284 +2013-07-25T20:18:01.000Z +-75.251378 40.045974 3.200000047683716 +2013-07-25T20:18:02.000Z +-75.2514 40.04599 4.0 +2013-07-25T20:18:03.000Z +-75.251423 40.046007 4.099999904632568 +2013-07-25T20:18:04.000Z +-75.251448 40.046024 4.5 +2013-07-25T20:18:05.000Z +-75.251472 40.046043 5.0 +2013-07-25T20:18:06.000Z +-75.251498 40.046064 4.800000190734863 +2013-07-25T20:18:07.000Z +-75.251529 40.046089 4.0 +2013-07-25T20:18:08.000Z +-75.251562 40.046119 4.0 +2013-07-25T20:18:09.000Z +-75.251595 40.046145 5.0 +2013-07-25T20:18:10.000Z +-75.251631 40.046171 5.199999809265137 +2013-07-25T20:18:11.000Z +-75.251668 40.046195 5.599999904632568 +2013-07-25T20:18:12.000Z +-75.251706 40.046218 5.800000190734863 +2013-07-25T20:18:13.000Z +-75.251744 40.046243 4.800000190734863 +2013-07-25T20:18:14.000Z +-75.251782 40.046269 5.099999904632568 +2013-07-25T20:18:15.000Z +-75.251822 40.046298 3.700000047683716 +2013-07-25T20:18:16.000Z +-75.251864 40.046326 4.099999904632568 +2013-07-25T20:18:17.000Z +-75.251901 40.046353 4.699999809265137 +2013-07-25T20:18:18.000Z +-75.251946 40.046376 4.199999809265137 +2013-07-25T20:18:19.000Z +-75.251988 40.046401 4.400000095367432 +2013-07-25T20:18:20.000Z +-75.25203 40.046427 5.300000190734863 +2013-07-25T20:18:21.000Z +-75.25207 40.046453 5.699999809265137 +2013-07-25T20:18:22.000Z +-75.252107 40.046478 6.599999904632568 +2013-07-25T20:18:23.000Z +-75.252145 40.046503 7.699999809265137 +2013-07-25T20:18:24.000Z +-75.252186 40.046529 7.599999904632568 +2013-07-25T20:18:25.000Z +-75.252225 40.046553 7.800000190734863 +2013-07-25T20:18:26.000Z +-75.252266 40.046577 8.0 +2013-07-25T20:18:27.000Z +-75.252308 40.046602 8.300000190734863 +2013-07-25T20:18:28.000Z +-75.25235 40.046629 8.699999809265137 +2013-07-25T20:18:29.000Z +-75.252391 40.046655 8.899999618530273 +2013-07-25T20:18:30.000Z +-75.25243 40.046682 8.899999618530273 +2013-07-25T20:18:31.000Z +-75.252472 40.046711 8.800000190734863 +2013-07-25T20:18:32.000Z +-75.252523 40.04675 8.399999618530273 +2013-07-25T20:18:33.000Z +-75.252569 40.046783 7.699999809265137 +2013-07-25T20:18:34.000Z +-75.252614 40.046816 7.800000190734863 +2013-07-25T20:18:35.000Z +-75.252658 40.046847 7.699999809265137 +2013-07-25T20:18:36.000Z +-75.252711 40.04688 7.300000190734863 +2013-07-25T20:18:37.000Z +-75.252756 40.04691 6.800000190734863 +2013-07-25T20:18:38.000Z +-75.252801 40.04694 7.599999904632568 +2013-07-25T20:18:39.000Z +-75.252836 40.046964 8.899999618530273 +2013-07-25T20:18:40.000Z +-75.252873 40.046987 11.199999809265137 +2013-07-25T20:18:41.000Z +-75.252917 40.04701 12.100000381469727 +2013-07-25T20:18:42.000Z +-75.252956 40.047033 12.699999809265137 +2013-07-25T20:18:43.000Z +-75.253006 40.04706 13.0 +2013-07-25T20:18:44.000Z +-75.25305 40.047091 13.699999809265137 +2013-07-25T20:18:45.000Z +-75.253102 40.04713 12.300000190734863 +2013-07-25T20:18:46.000Z +-75.253144 40.047162 12.800000190734863 +2013-07-25T20:18:47.000Z +-75.253184 40.047193 13.199999809265137 +2013-07-25T20:18:48.000Z +-75.253225 40.047223 13.199999809265137 +2013-07-25T20:18:49.000Z +-75.253263 40.047251 13.0 +2013-07-25T20:18:50.000Z +-75.2533 40.047278 14.699999809265137 +2013-07-25T20:18:51.000Z +-75.253338 40.047306 14.600000381469727 +2013-07-25T20:18:52.000Z +-75.253376 40.047331 15.800000190734863 +2013-07-25T20:18:53.000Z +-75.253411 40.047354 16.299999237060547 +2013-07-25T20:18:54.000Z +-75.253448 40.047378 15.800000190734863 +2013-07-25T20:18:55.000Z +-75.253486 40.047402 15.300000190734863 +2013-07-25T20:18:56.000Z +-75.253528 40.047428 15.199999809265137 +2013-07-25T20:18:57.000Z +-75.253569 40.047453 15.600000381469727 +2013-07-25T20:18:58.000Z +-75.253611 40.047479 15.100000381469727 +2013-07-25T20:18:59.000Z +-75.253654 40.047504 14.399999618530273 +2013-07-25T20:19:00.000Z +-75.253697 40.047531 13.699999809265137 +2013-07-25T20:19:01.000Z +-75.253733 40.047557 13.5 +2013-07-25T20:19:02.000Z +-75.253768 40.047584 12.600000381469727 +2013-07-25T20:19:03.000Z +-75.253801 40.04761 12.600000381469727 +2013-07-25T20:19:04.000Z +-75.253834 40.047637 12.899999618530273 +2013-07-25T20:19:05.000Z +-75.253866 40.047661 13.0 +2013-07-25T20:19:06.000Z +-75.253901 40.047686 11.699999809265137 +2013-07-25T20:19:07.000Z +-75.253934 40.047709 11.5 +2013-07-25T20:19:08.000Z +-75.253967 40.047731 12.100000381469727 +2013-07-25T20:19:09.000Z +-75.253997 40.047751 11.199999809265137 +2013-07-25T20:19:10.000Z +-75.25403 40.047773 9.699999809265137 +2013-07-25T20:19:11.000Z +-75.254067 40.047793 7.900000095367432 +2013-07-25T20:19:12.000Z +-75.254106 40.047813 9.0 +2013-07-25T20:19:13.000Z +-75.254144 40.047832 8.5 +2013-07-25T20:19:14.000Z +-75.25418 40.047851 7.900000095367432 +2013-07-25T20:19:15.000Z +-75.254212 40.047873 8.199999809265137 +2013-07-25T20:19:16.000Z +-75.254239 40.047895 7.5 +2013-07-25T20:19:17.000Z +-75.25426 40.047912 7.699999809265137 +2013-07-25T20:19:18.000Z +-75.254278 40.047929 6.300000190734863 +2013-07-25T20:19:21.000Z +-75.25427 40.047909 5.800000190734863 +2013-07-25T20:19:22.000Z +-75.254249 40.047882 5.5 +2013-07-25T20:19:23.000Z +-75.254218 40.047852 5.300000190734863 +2013-07-25T20:19:24.000Z +-75.254184 40.047828 4.199999809265137 +2013-07-25T20:19:25.000Z +-75.254158 40.047808 4.300000190734863 +2013-07-25T20:19:26.000Z +-75.254111 40.047788 3.4000000953674316 +2013-07-25T20:19:26.999Z +-75.25408 40.047773 3.9000000953674316 +2013-07-25T20:19:28.000Z +-75.254045 40.047763 2.5 +2013-07-25T20:19:29.000Z +-75.254017 40.047748 2.9000000953674316 +2013-07-25T20:19:30.000Z +-75.253992 40.047741 2.4000000953674316 +2013-07-25T20:19:33.000Z +-75.253956 40.047776 3.299999952316284 +2013-07-25T20:19:34.000Z +-75.253966 40.047801 2.799999952316284 +2013-07-25T20:19:35.000Z +-75.253983 40.047828 1.7999999523162842 +2013-07-25T20:19:36.000Z +-75.253997 40.047856 3.9000000953674316 +2013-07-25T20:19:37.000Z +-75.254009 40.047881 4.199999809265137 +2013-07-25T20:19:38.000Z +-75.254022 40.047903 4.199999809265137 +2013-07-25T20:19:39.000Z +-75.254036 40.047922 4.0 +2013-07-25T20:19:40.000Z +-75.254053 40.047942 3.700000047683716 +2013-07-25T20:19:56.000Z +-75.254011 40.047937 1.7000000476837158 +2013-07-25T20:19:57.000Z +-75.253988 40.047915 1.600000023841858 +2013-07-25T20:19:58.000Z +-75.253968 40.047896 1.2999999523162842 +2013-07-25T20:19:59.000Z +-75.253955 40.047871 0.800000011920929 +2013-07-25T20:20:00.001Z +-75.253939 40.04785 0.20000000298023224 +2013-07-25T20:20:01.000Z +-75.25394 40.047817 -0.10000000149011612 +2013-07-25T20:20:04.000Z +-75.25397 40.04778 -2.299999952316284 +2013-07-25T20:20:05.000Z +-75.253983 40.047784 -2.0 +2013-07-25T20:20:08.000Z +-75.254016 40.047815 -0.4000000059604645 +2013-07-25T20:20:09.000Z +-75.25403 40.047827 0.30000001192092896 +2013-07-25T20:20:10.000Z +-75.254049 40.047841 0.20000000298023224 +2013-07-25T20:20:11.000Z +-75.254076 40.047857 0.20000000298023224 +2013-07-25T20:20:12.000Z +-75.254111 40.047875 -0.800000011920929 +2013-07-25T20:20:13.000Z +-75.254149 40.047896 -1.2000000476837158 +2013-07-25T20:20:14.000Z +-75.254188 40.047919 -1.100000023841858 +2013-07-25T20:20:15.000Z +-75.254224 40.047944 -0.10000000149011612 +2013-07-25T20:20:16.000Z +-75.254259 40.047971 1.100000023841858 +2013-07-25T20:20:17.000Z +-75.254291 40.047996 1.600000023841858 +2013-07-25T20:20:18.000Z +-75.254325 40.048022 1.899999976158142 +2013-07-25T20:20:19.000Z +-75.25436 40.048048 3.0999999046325684 +2013-07-25T20:20:20.000Z +-75.254397 40.048072 4.5 +2013-07-25T20:20:21.000Z +-75.254436 40.048095 6.0 +2013-07-25T20:20:22.000Z +-75.25448 40.04812 5.099999904632568 +2013-07-25T20:20:23.000Z +-75.254524 40.048147 5.0 +2013-07-25T20:20:24.000Z +-75.25457 40.048176 5.900000095367432 +2013-07-25T20:20:25.000Z +-75.254612 40.048204 6.300000190734863 +2013-07-25T20:20:26.000Z +-75.254658 40.048235 5.900000095367432 +2013-07-25T20:20:27.000Z +-75.254701 40.048265 7.5 +2013-07-25T20:20:28.000Z +-75.254743 40.048297 7.900000095367432 +2013-07-25T20:20:29.000Z +-75.25478 40.048327 7.599999904632568 +2013-07-25T20:20:30.000Z +-75.254816 40.048352 11.199999809265137 +2013-07-25T20:20:31.000Z +-75.254849 40.048374 13.699999809265137 +2013-07-25T20:20:32.000Z +-75.254886 40.048396 12.699999809265137 +2013-07-25T20:20:33.000Z +-75.254923 40.048419 12.100000381469727 +2013-07-25T20:20:34.000Z +-75.254963 40.048445 12.600000381469727 +2013-07-25T20:20:35.000Z +-75.255007 40.048474 12.699999809265137 +2013-07-25T20:20:36.000Z +-75.255075 40.048511 12.100000381469727 +2013-07-25T20:20:37.000Z +-75.255119 40.048539 12.100000381469727 +2013-07-25T20:20:38.000Z +-75.255162 40.048568 11.699999809265137 +2013-07-25T20:20:39.000Z +-75.255201 40.048598 12.199999809265137 +2013-07-25T20:20:40.000Z +-75.255243 40.048636 12.300000190734863 +2013-07-25T20:20:41.000Z +-75.255291 40.048672 12.199999809265137 +2013-07-25T20:20:42.000Z +-75.255328 40.048702 12.0 +2013-07-25T20:20:43.000Z +-75.255367 40.048722 14.300000190734863 +2013-07-25T20:20:44.000Z +-75.255404 40.048747 15.399999618530273 +2013-07-25T20:20:45.000Z +-75.255451 40.048769 15.199999809265137 +2013-07-25T20:20:46.000Z +-75.255495 40.048787 15.699999809265137 +2013-07-25T20:20:47.000Z +-75.255551 40.048817 15.399999618530273 +2013-07-25T20:20:48.000Z +-75.255602 40.048853 16.100000381469727 +2013-07-25T20:20:49.000Z +-75.255647 40.048887 16.0 +2013-07-25T20:20:50.000Z +-75.255691 40.04892 15.100000381469727 +2013-07-25T20:20:51.000Z +-75.255745 40.048958 15.100000381469727 +2013-07-25T20:20:52.000Z +-75.25579 40.048987 15.600000381469727 +2013-07-25T20:20:53.000Z +-75.255828 40.049012 15.800000190734863 +2013-07-25T20:20:54.000Z +-75.255873 40.049047 16.0 +2013-07-25T20:20:55.000Z +-75.255917 40.049079 16.299999237060547 +2013-07-25T20:20:56.000Z +-75.255964 40.049109 16.5 +2013-07-25T20:20:57.000Z +-75.256009 40.049147 14.600000381469727 +2013-07-25T20:20:58.000Z +-75.256054 40.049183 13.699999809265137 +2013-07-25T20:20:59.000Z +-75.256107 40.049224 13.399999618530273 +2013-07-25T20:21:00.000Z +-75.256146 40.049252 14.600000381469727 +2013-07-25T20:21:01.000Z +-75.256182 40.049278 15.699999809265137 +2013-07-25T20:21:02.000Z +-75.256214 40.049303 16.200000762939453 +2013-07-25T20:21:03.000Z +-75.256264 40.049337 17.100000381469727 +2013-07-25T20:21:04.000Z +-75.256315 40.049368 17.5 +2013-07-25T20:21:05.000Z +-75.256357 40.04941 17.600000381469727 +2013-07-25T20:21:06.000Z +-75.256405 40.049441 17.799999237060547 +2013-07-25T20:21:07.000Z +-75.256448 40.04947 17.600000381469727 +2013-07-25T20:21:08.000Z +-75.256496 40.049498 17.200000762939453 +2013-07-25T20:21:09.000Z +-75.256547 40.04954 16.899999618530273 +2013-07-25T20:21:10.000Z +-75.256585 40.049573 17.0 +2013-07-25T20:21:11.000Z +-75.256623 40.049589 18.299999237060547 +2013-07-25T20:21:12.000Z +-75.256672 40.049621 19.0 +2013-07-25T20:21:13.000Z +-75.256721 40.049651 19.100000381469727 +2013-07-25T20:21:14.000Z +-75.256768 40.049688 19.299999237060547 +2013-07-25T20:21:15.000Z +-75.256812 40.049723 19.200000762939453 +2013-07-25T20:21:16.000Z +-75.256852 40.049757 19.700000762939453 +2013-07-25T20:21:17.000Z +-75.256907 40.049793 19.100000381469727 +2013-07-25T20:21:17.998Z +-75.256954 40.049828 19.200000762939453 +2013-07-25T20:21:19.000Z +-75.256992 40.049864 18.899999618530273 +2013-07-25T20:21:20.000Z +-75.257048 40.049899 18.799999237060547 +2013-07-25T20:21:21.000Z +-75.257097 40.049925 18.0 +2013-07-25T20:21:22.000Z +-75.25715 40.04996 17.899999618530273 +2013-07-25T20:21:23.000Z +-75.25719 40.049997 16.700000762939453 +2013-07-25T20:21:24.000Z +-75.257274 40.050048 15.0 +2013-07-25T20:21:25.000Z +-75.257315 40.050082 15.600000381469727 +2013-07-25T20:21:26.000Z +-75.257361 40.05012 15.100000381469727 +2013-07-25T20:21:27.000Z +-75.257417 40.050167 14.100000381469727 +2013-07-25T20:21:28.000Z +-75.257455 40.050203 13.199999809265137 +2013-07-25T20:21:29.000Z +-75.257515 40.050246 12.0 +2013-07-25T20:21:30.000Z +-75.257565 40.050287 11.699999809265137 +2013-07-25T20:21:31.000Z +-75.257609 40.050317 11.600000381469727 +2013-07-25T20:21:32.000Z +-75.257652 40.050352 11.800000190734863 +2013-07-25T20:21:33.000Z +-75.25768 40.050381 12.699999809265137 +2013-07-25T20:21:34.000Z +-75.257721 40.050416 13.600000381469727 +2013-07-25T20:21:35.000Z +-75.257754 40.050437 15.800000190734863 +2013-07-25T20:21:36.000Z +-75.257812 40.050462 16.200000762939453 +2013-07-25T20:21:37.000Z +-75.257867 40.050507 14.199999809265137 +2013-07-25T20:21:38.000Z +-75.257918 40.050535 13.600000381469727 +2013-07-25T20:21:39.000Z +-75.257973 40.05058 13.100000381469727 +2013-07-25T20:21:40.000Z +-75.258009 40.050602 14.600000381469727 +2013-07-25T20:21:41.000Z +-75.25806 40.050631 14.300000190734863 +2013-07-25T20:21:42.000Z +-75.258107 40.05066 15.100000381469727 +2013-07-25T20:21:43.000Z +-75.258161 40.050696 16.200000762939453 +2013-07-25T20:21:44.000Z +-75.25822 40.050734 14.5 +2013-07-25T20:21:45.000Z +-75.258263 40.050767 15.399999618530273 +2013-07-25T20:21:46.000Z +-75.258298 40.050803 16.600000381469727 +2013-07-25T20:21:47.000Z +-75.258341 40.05084 16.700000762939453 +2013-07-25T20:21:48.000Z +-75.258391 40.050876 16.200000762939453 +2013-07-25T20:21:49.000Z +-75.258437 40.050918 15.899999618530273 +2013-07-25T20:21:50.000Z +-75.258484 40.05096 14.600000381469727 +2013-07-25T20:21:51.000Z +-75.258543 40.051005 12.5 +2013-07-25T20:21:52.000Z +-75.258589 40.051042 11.399999618530273 +2013-07-25T20:21:53.000Z +-75.258636 40.051076 11.399999618530273 +2013-07-25T20:21:54.000Z +-75.258674 40.05111 11.0 +2013-07-25T20:21:55.000Z +-75.258719 40.051139 10.5 +2013-07-25T20:21:56.000Z +-75.25876 40.051173 9.600000381469727 +2013-07-25T20:21:57.000Z +-75.258803 40.051208 9.100000381469727 +2013-07-25T20:21:58.000Z +-75.258859 40.051231 10.800000190734863 +2013-07-25T20:21:59.000Z +-75.25891 40.051264 11.800000190734863 +2013-07-25T20:22:00.000Z +-75.258946 40.051292 11.800000190734863 +2013-07-25T20:22:01.000Z +-75.259001 40.051332 10.0 +2013-07-25T20:22:02.000Z +-75.259043 40.051368 9.199999809265137 +2013-07-25T20:22:03.000Z +-75.259088 40.051403 9.699999809265137 +2013-07-25T20:22:04.000Z +-75.259141 40.051442 9.5 +2013-07-25T20:22:05.000Z +-75.259184 40.051477 9.100000381469727 +2013-07-25T20:22:06.000Z +-75.259233 40.051512 8.5 +2013-07-25T20:22:07.000Z +-75.25927 40.051544 8.800000190734863 +2013-07-25T20:22:08.000Z +-75.259317 40.051576 8.399999618530273 +2013-07-25T20:22:09.000Z +-75.259363 40.051609 8.0 +2013-07-25T20:22:10.000Z +-75.259411 40.051644 6.699999809265137 +2013-07-25T20:22:11.000Z +-75.259464 40.051682 5.599999904632568 +2013-07-25T20:22:12.000Z +-75.259516 40.051723 6.0 +2013-07-25T20:22:13.000Z +-75.259555 40.051758 5.599999904632568 +2013-07-25T20:22:14.000Z +-75.259608 40.051793 5.199999809265137 +2013-07-25T20:22:15.000Z +-75.259646 40.051834 5.5 +2013-07-25T20:22:16.000Z +-75.259689 40.051868 5.099999904632568 +2013-07-25T20:22:17.000Z +-75.259729 40.051906 5.0 +2013-07-25T20:22:18.000Z +-75.259775 40.051938 5.699999809265137 +2013-07-25T20:22:19.000Z +-75.259823 40.05197 6.5 +2013-07-25T20:22:20.000Z +-75.259886 40.052019 3.799999952316284 +2013-07-25T20:22:21.000Z +-75.25993 40.052049 3.0 +2013-07-25T20:22:22.000Z +-75.259982 40.05209 2.700000047683716 +2013-07-25T20:22:23.000Z +-75.260025 40.052126 3.0999999046325684 +2013-07-25T20:22:24.000Z +-75.260078 40.052159 2.5999999046325684 +2013-07-25T20:22:25.000Z +-75.260128 40.052193 1.7000000476837158 +2013-07-25T20:22:26.000Z +-75.260172 40.052224 0.6000000238418579 +2013-07-25T20:22:27.000Z +-75.260222 40.052262 0.20000000298023224 +2013-07-25T20:22:28.000Z +-75.260261 40.052307 0.8999999761581421 +2013-07-25T20:22:29.000Z +-75.260314 40.052345 0.20000000298023224 +2013-07-25T20:22:30.000Z +-75.260356 40.052373 0.20000000298023224 +2013-07-25T20:22:31.000Z +-75.260401 40.052404 0.4000000059604645 +2013-07-25T20:22:32.000Z +-75.260438 40.052437 0.5 +2013-07-25T20:22:33.000Z +-75.26048 40.05247 1.600000023841858 +2013-07-25T20:22:34.000Z +-75.260522 40.052503 3.4000000953674316 +2013-07-25T20:22:35.000Z +-75.260584 40.052554 1.899999976158142 +2013-07-25T20:22:36.000Z +-75.260633 40.052584 2.0 +2013-07-25T20:22:37.000Z +-75.260674 40.052611 3.4000000953674316 +2013-07-25T20:22:38.000Z +-75.260721 40.05264 4.0 +2013-07-25T20:22:39.000Z +-75.260751 40.052686 4.5 +2013-07-25T20:22:40.000Z +-75.260792 40.05272 5.699999809265137 +2013-07-25T20:22:41.000Z +-75.26084 40.05276 3.700000047683716 +2013-07-25T20:22:42.000Z +-75.260886 40.052799 3.5999999046325684 +2013-07-25T20:22:43.000Z +-75.260934 40.052846 2.5999999046325684 +2013-07-25T20:22:44.000Z +-75.260976 40.052894 2.700000047683716 +2013-07-25T20:22:45.000Z +-75.261023 40.05293 2.200000047683716 +2013-07-25T20:22:46.000Z +-75.261069 40.052967 2.299999952316284 +2013-07-25T20:22:47.000Z +-75.261125 40.053003 1.7999999523162842 +2013-07-25T20:22:48.000Z +-75.261171 40.053046 2.700000047683716 +2013-07-25T20:22:49.000Z +-75.261218 40.053077 2.299999952316284 +2013-07-25T20:22:50.000Z +-75.261272 40.053113 2.200000047683716 +2013-07-25T20:22:51.000Z +-75.261317 40.053141 4.0 +2013-07-25T20:22:52.000Z +-75.26137 40.053181 4.0 +2013-07-25T20:22:53.000Z +-75.26142 40.053217 3.299999952316284 +2013-07-25T20:22:54.000Z +-75.261469 40.053251 3.299999952316284 +2013-07-25T20:22:55.000Z +-75.261517 40.053286 3.299999952316284 +2013-07-25T20:22:56.000Z +-75.261567 40.053323 3.200000047683716 +2013-07-25T20:22:57.000Z +-75.261616 40.053355 3.9000000953674316 +2013-07-25T20:22:58.000Z +-75.261652 40.053381 5.599999904632568 +2013-07-25T20:22:59.000Z +-75.261697 40.053424 3.5999999046325684 +2013-07-25T20:23:00.000Z +-75.261744 40.053465 3.4000000953674316 +2013-07-25T20:23:01.001Z +-75.261791 40.053501 3.0 +2013-07-25T20:23:02.000Z +-75.26181 40.053527 3.200000047683716 +2013-07-25T20:23:03.000Z +-75.261868 40.053567 2.700000047683716 +2013-07-25T20:23:04.000Z +-75.261921 40.05361 2.700000047683716 +2013-07-25T20:23:05.000Z +-75.26196 40.053645 2.0999999046325684 +2013-07-25T20:23:06.000Z +-75.261992 40.053674 4.300000190734863 +2013-07-25T20:23:07.000Z +-75.262024 40.053698 6.099999904632568 +2013-07-25T20:23:08.000Z +-75.262072 40.053737 6.199999809265137 +2013-07-25T20:23:09.000Z +-75.262115 40.053771 6.599999904632568 +2013-07-25T20:23:10.000Z +-75.262151 40.053804 5.400000095367432 +2013-07-25T20:23:11.000Z +-75.26219 40.053837 5.300000190734863 +2013-07-25T20:23:12.000Z +-75.262232 40.053869 6.5 +2013-07-25T20:23:13.000Z +-75.262277 40.053893 6.400000095367432 +2013-07-25T20:23:14.000Z +-75.26232 40.053941 5.599999904632568 +2013-07-25T20:23:15.000Z +-75.262352 40.053981 4.300000190734863 +2013-07-25T20:23:16.000Z +-75.262392 40.054033 3.5999999046325684 +2013-07-25T20:23:17.000Z +-75.262426 40.054075 3.299999952316284 +2013-07-25T20:23:18.000Z +-75.262472 40.054106 3.700000047683716 +2013-07-25T20:23:19.000Z +-75.262507 40.054144 4.800000190734863 +2013-07-25T20:23:19.999Z +-75.262544 40.054179 5.800000190734863 +2013-07-25T20:23:21.000Z +-75.262571 40.054221 4.300000190734863 +2013-07-25T20:23:22.000Z +-75.262607 40.054267 4.699999809265137 +2013-07-25T20:23:23.000Z +-75.262647 40.054313 4.5 +2013-07-25T20:23:24.000Z +-75.262678 40.054347 5.0 +2013-07-25T20:23:25.000Z +-75.262707 40.054379 6.0 +2013-07-25T20:23:26.000Z +-75.262739 40.054423 5.099999904632568 +2013-07-25T20:23:27.000Z +-75.262764 40.054465 5.699999809265137 +2013-07-25T20:23:28.000Z +-75.262784 40.054494 5.800000190734863 +2013-07-25T20:23:29.000Z +-75.262838 40.054545 3.4000000953674316 +2013-07-25T20:23:30.000Z +-75.262864 40.054577 2.799999952316284 +2013-07-25T20:23:31.000Z +-75.262892 40.054614 2.5 +2013-07-25T20:23:32.000Z +-75.262924 40.054678 0.4000000059604645 +2013-07-25T20:23:33.000Z +-75.262964 40.05473 -0.6000000238418579 +2013-07-25T20:23:34.000Z +-75.262994 40.054768 -1.100000023841858 +2013-07-25T20:23:35.000Z +-75.263019 40.054806 0.0 +2013-07-25T20:23:36.000Z +-75.263052 40.054854 -0.6000000238418579 +2013-07-25T20:23:37.000Z +-75.26309 40.054898 -1.600000023841858 +2013-07-25T20:23:38.000Z +-75.263118 40.054944 -1.2999999523162842 +2013-07-25T20:23:39.000Z +-75.263149 40.054994 -1.600000023841858 +2013-07-25T20:23:40.000Z +-75.263174 40.055045 -2.0999999046325684 +2013-07-25T20:23:41.000Z +-75.263203 40.055098 -2.5999999046325684 +2013-07-25T20:23:42.000Z +-75.26323 40.055141 -2.0999999046325684 +2013-07-25T20:23:43.000Z +-75.263259 40.055188 -3.0 +2013-07-25T20:23:44.000Z +-75.263288 40.055238 -3.5 +2013-07-25T20:23:45.000Z +-75.26331 40.05528 -3.799999952316284 +2013-07-25T20:23:46.000Z +-75.263336 40.055322 -3.9000000953674316 +2013-07-25T20:23:47.000Z +-75.263364 40.055365 -4.599999904632568 +2013-07-25T20:23:48.000Z +-75.263393 40.05541 -4.900000095367432 +2013-07-25T20:23:49.000Z +-75.263398 40.055446 -3.5 +2013-07-25T20:23:50.000Z +-75.263426 40.055486 -2.9000000953674316 +2013-07-25T20:23:51.000Z +-75.263459 40.055518 -2.4000000953674316 +2013-07-25T20:23:52.000Z +-75.263468 40.055578 -2.799999952316284 +2013-07-25T20:23:53.000Z +-75.26347 40.055631 -2.5 +2013-07-25T20:23:54.000Z +-75.26349 40.055675 -2.4000000953674316 +2013-07-25T20:23:55.000Z +-75.263512 40.055726 -2.9000000953674316 +2013-07-25T20:23:56.000Z +-75.263513 40.055765 -1.600000023841858 +2013-07-25T20:23:57.000Z +-75.263534 40.055811 -2.200000047683716 +2013-07-25T20:23:58.000Z +-75.263541 40.055855 -2.4000000953674316 +2013-07-25T20:23:59.000Z +-75.263556 40.055898 -2.5999999046325684 +2013-07-25T20:24:00.000Z +-75.263568 40.055948 -4.099999904632568 +2013-07-25T20:24:01.000Z +-75.26359 40.055986 -4.099999904632568 +2013-07-25T20:24:02.000Z +-75.263608 40.056029 -4.099999904632568 +2013-07-25T20:24:03.000Z +-75.263628 40.056072 -4.800000190734863 +2013-07-25T20:24:04.000Z +-75.263635 40.05612 -4.400000095367432 +2013-07-25T20:24:05.000Z +-75.263636 40.05616 -4.599999904632568 +2013-07-25T20:24:06.000Z +-75.263647 40.0562 -4.699999809265137 +2013-07-25T20:24:07.000Z +-75.263655 40.056238 -4.800000190734863 +2013-07-25T20:24:08.000Z +-75.263664 40.056274 -4.5 +2013-07-25T20:24:09.000Z +-75.263649 40.056318 -3.799999952316284 +2013-07-25T20:24:10.000Z +-75.263653 40.05636 -3.5999999046325684 +2013-07-25T20:24:11.000Z +-75.263648 40.056406 -4.0 +2013-07-25T20:24:12.000Z +-75.26365 40.056448 -3.799999952316284 +2013-07-25T20:24:13.000Z +-75.263675 40.056491 -3.5 +2013-07-25T20:24:14.000Z +-75.263683 40.056533 -3.0999999046325684 +2013-07-25T20:24:15.000Z +-75.263686 40.056578 -2.799999952316284 +2013-07-25T20:24:16.000Z +-75.263705 40.056626 -3.4000000953674316 +2013-07-25T20:24:17.000Z +-75.263725 40.056667 -3.799999952316284 +2013-07-25T20:24:18.000Z +-75.26374 40.056706 -3.4000000953674316 +2013-07-25T20:24:19.000Z +-75.263749 40.056746 -2.9000000953674316 +2013-07-25T20:24:20.000Z +-75.263762 40.056781 -2.5 +2013-07-25T20:24:21.000Z +-75.263764 40.05682 -2.0999999046325684 +2013-07-25T20:24:22.000Z +-75.263767 40.056865 -2.0999999046325684 +2013-07-25T20:24:23.000Z +-75.263771 40.056912 -2.5 +2013-07-25T20:24:24.000Z +-75.263786 40.056962 -2.799999952316284 +2013-07-25T20:24:25.000Z +-75.263798 40.057003 -2.700000047683716 +2013-07-25T20:24:26.000Z +-75.263807 40.057047 -2.700000047683716 +2013-07-25T20:24:27.000Z +-75.26381 40.057084 -2.4000000953674316 +2013-07-25T20:24:28.000Z +-75.26381 40.057122 -1.899999976158142 +2013-07-25T20:24:29.000Z +-75.263821 40.057166 -2.5999999046325684 +2013-07-25T20:24:30.000Z +-75.263825 40.057206 -2.0999999046325684 +2013-07-25T20:24:31.000Z +-75.263832 40.057247 -2.5 +2013-07-25T20:24:32.000Z +-75.263844 40.05729 -2.5999999046325684 +2013-07-25T20:24:33.000Z +-75.263854 40.057331 -2.9000000953674316 +2013-07-25T20:24:34.000Z +-75.263861 40.057373 -2.799999952316284 +2013-07-25T20:24:35.000Z +-75.263868 40.057414 -2.799999952316284 +2013-07-25T20:24:36.000Z +-75.263875 40.057457 -2.799999952316284 +2013-07-25T20:24:37.000Z +-75.263881 40.057496 -2.299999952316284 +2013-07-25T20:24:38.000Z +-75.263889 40.057533 -2.0 +2013-07-25T20:24:39.000Z +-75.263896 40.057573 -3.0 +2013-07-25T20:24:40.000Z +-75.263903 40.057616 -3.200000047683716 +2013-07-25T20:24:41.000Z +-75.26391 40.057657 -2.9000000953674316 +2013-07-25T20:24:42.000Z +-75.263917 40.0577 -2.5999999046325684 +2013-07-25T20:24:43.000Z +-75.263925 40.057742 -2.0999999046325684 +2013-07-25T20:24:44.000Z +-75.263936 40.057783 -2.200000047683716 +2013-07-25T20:24:45.000Z +-75.26395 40.057823 -2.200000047683716 +2013-07-25T20:24:46.000Z +-75.263966 40.057862 -2.200000047683716 +2013-07-25T20:24:47.000Z +-75.263979 40.057897 -2.799999952316284 +2013-07-25T20:24:48.000Z +-75.263989 40.057934 -2.9000000953674316 +2013-07-25T20:24:49.000Z +-75.263997 40.057967 -2.0 +2013-07-25T20:24:50.000Z +-75.264004 40.058006 -1.899999976158142 +2013-07-25T20:24:51.000Z +-75.264011 40.058047 -1.899999976158142 +2013-07-25T20:24:52.000Z +-75.264021 40.05809 -1.7000000476837158 +2013-07-25T20:24:53.000Z +-75.264032 40.058129 -1.7999999523162842 +2013-07-25T20:24:54.000Z +-75.264046 40.05817 -1.899999976158142 +2013-07-25T20:24:55.000Z +-75.264064 40.058209 -2.0999999046325684 +2013-07-25T20:24:56.000Z +-75.264082 40.05825 -2.0999999046325684 +2013-07-25T20:24:57.000Z +-75.264099 40.058288 -1.7000000476837158 +2013-07-25T20:24:58.000Z +-75.264114 40.058328 -1.399999976158142 +2013-07-25T20:24:59.000Z +-75.264131 40.058368 -1.2999999523162842 +2013-07-25T20:25:00.000Z +-75.264149 40.058409 -1.399999976158142 +2013-07-25T20:25:01.000Z +-75.264168 40.058448 -1.2999999523162842 +2013-07-25T20:25:02.000Z +-75.26419 40.058488 -1.2000000476837158 +2013-07-25T20:25:03.000Z +-75.264213 40.058525 -0.6000000238418579 +2013-07-25T20:25:04.000Z +-75.264237 40.058563 -0.699999988079071 +2013-07-25T20:25:05.000Z +-75.264266 40.058598 -0.10000000149011612 +2013-07-25T20:25:06.000Z +-75.264296 40.058632 1.100000023841858 +2013-07-25T20:25:07.000Z +-75.264326 40.058668 1.7999999523162842 +2013-07-25T20:25:08.000Z +-75.264358 40.058703 2.200000047683716 +2013-07-25T20:25:09.000Z +-75.264405 40.058754 0.8999999761581421 +2013-07-25T20:25:10.000Z +-75.264436 40.0588 0.0 +2013-07-25T20:25:11.000Z +-75.26447 40.058834 0.800000011920929 +2013-07-25T20:25:12.000Z +-75.264499 40.058871 0.800000011920929 +2013-07-25T20:25:13.000Z +-75.264528 40.058905 1.5 +2013-07-25T20:25:14.000Z +-75.264568 40.058933 1.5 +2013-07-25T20:25:15.000Z +-75.2646 40.058964 2.0 +2013-07-25T20:25:16.000Z +-75.264639 40.059003 2.5 +2013-07-25T20:25:17.000Z +-75.264669 40.059037 2.700000047683716 +2013-07-25T20:25:18.000Z +-75.264729 40.05909 0.4000000059604645 +2013-07-25T20:25:19.000Z +-75.264782 40.059131 -1.2000000476837158 +2013-07-25T20:25:20.000Z +-75.264831 40.059167 -1.2000000476837158 +2013-07-25T20:25:21.000Z +-75.26486 40.059185 -0.800000011920929 +2013-07-25T20:25:22.000Z +-75.264907 40.059215 -0.5 +2013-07-25T20:25:23.000Z +-75.26494 40.059241 -0.4000000059604645 +2013-07-25T20:25:24.000Z +-75.264967 40.059272 -1.100000023841858 +2013-07-25T20:25:25.000Z +-75.265001 40.059303 -1.2999999523162842 +2013-07-25T20:25:26.000Z +-75.265042 40.059327 -0.4000000059604645 +2013-07-25T20:25:27.000Z +-75.26508 40.059351 0.10000000149011612 +2013-07-25T20:25:28.000Z +-75.265097 40.059368 2.0 +2013-07-25T20:25:29.000Z +-75.265141 40.059402 1.100000023841858 +2013-07-25T20:25:30.000Z +-75.265183 40.059427 1.100000023841858 +2013-07-25T20:25:31.000Z +-75.26522 40.059461 0.0 +2013-07-25T20:25:32.000Z +-75.265233 40.059476 3.299999952316284 +2013-07-25T20:25:33.000Z +-75.265251 40.059502 4.900000095367432 +2013-07-25T20:25:34.000Z +-75.265259 40.059528 6.699999809265137 +2013-07-25T20:25:35.000Z +-75.265282 40.05955 7.599999904632568 +2013-07-25T20:25:36.000Z +-75.265304 40.059573 7.800000190734863 +2013-07-25T20:25:37.000Z +-75.265339 40.059594 8.399999618530273 +2013-07-25T20:25:38.000Z +-75.265373 40.059616 8.399999618530273 +2013-07-25T20:25:39.000Z +-75.265395 40.059646 8.0 +2013-07-25T20:25:40.000Z +-75.265422 40.059674 11.899999618530273 +2013-07-25T20:25:41.000Z +-75.265458 40.059704 11.600000381469727 +2013-07-25T20:25:42.000Z +-75.265497 40.059733 12.0 +2013-07-25T20:25:43.000Z +-75.265541 40.059761 12.0 +2013-07-25T20:25:44.000Z +-75.265652 40.059803 3.5999999046325684 +2013-07-25T20:25:45.000Z +-75.26571 40.059829 3.0999999046325684 +2013-07-25T20:25:47.000Z +-75.265761 40.05985 12.399999618530273 +2013-07-25T20:25:48.000Z +-75.265791 40.059873 14.899999618530273 +2013-07-25T20:25:49.000Z +-75.265823 40.059894 18.899999618530273 +2013-07-25T20:25:50.000Z +-75.265871 40.059927 20.299999237060547 +2013-07-25T20:25:51.000Z +-75.265922 40.059953 20.100000381469727 +2013-07-25T20:25:52.000Z +-75.265966 40.059972 20.0 +2013-07-25T20:25:53.000Z +-75.266004 40.059994 20.299999237060547 +2013-07-25T20:25:54.000Z +-75.266026 40.060016 20.700000762939453 +2013-07-25T20:25:55.000Z +-75.266062 40.060039 21.100000381469727 +2013-07-25T20:25:56.000Z +-75.266158 40.060096 19.700000762939453 +2013-07-25T20:25:57.000Z +-75.266214 40.060137 18.299999237060547 +2013-07-25T20:25:58.000Z +-75.266267 40.060164 18.100000381469727 +2013-07-25T20:25:59.000Z +-75.266314 40.060192 18.200000762939453 +2013-07-25T20:26:00.000Z +-75.266372 40.060216 16.600000381469727 +2013-07-25T20:26:01.000Z +-75.266412 40.060252 17.399999618530273 +2013-07-25T20:26:02.000Z +-75.266467 40.060287 16.299999237060547 +2013-07-25T20:26:03.000Z +-75.266512 40.060326 15.600000381469727 +2013-07-25T20:26:04.000Z +-75.266559 40.06036 15.300000190734863 +2013-07-25T20:26:05.000Z +-75.266603 40.060401 14.699999809265137 +2013-07-25T20:26:06.000Z +-75.266647 40.060431 14.0 +2013-07-25T20:26:07.000Z +-75.266701 40.060458 13.600000381469727 +2013-07-25T20:26:08.000Z +-75.266749 40.06049 13.899999618530273 +2013-07-25T20:26:09.000Z +-75.266793 40.060517 14.699999809265137 +2013-07-25T20:26:10.000Z +-75.266839 40.060541 13.899999618530273 +2013-07-25T20:26:11.000Z +-75.266882 40.060567 14.199999809265137 +2013-07-25T20:26:12.000Z +-75.266934 40.060601 14.100000381469727 +2013-07-25T20:26:13.000Z +-75.266989 40.060631 13.600000381469727 +2013-07-25T20:26:14.000Z +-75.267037 40.06066 13.699999809265137 +2013-07-25T20:26:15.000Z +-75.267085 40.060694 13.800000190734863 +2013-07-25T20:26:16.000Z +-75.267133 40.060732 13.399999618530273 +2013-07-25T20:26:17.000Z +-75.267182 40.060763 13.199999809265137 +2013-07-25T20:26:18.000Z +-75.26723 40.060793 13.199999809265137 +2013-07-25T20:26:19.000Z +-75.267278 40.060824 13.100000381469727 +2013-07-25T20:26:20.000Z +-75.267325 40.060853 14.0 +2013-07-25T20:26:21.000Z +-75.267373 40.060878 14.199999809265137 +2013-07-25T20:26:22.000Z +-75.267423 40.060904 14.300000190734863 +2013-07-25T20:26:23.000Z +-75.267462 40.060932 15.199999809265137 +2013-07-25T20:26:24.000Z +-75.267499 40.060953 17.799999237060547 +2013-07-25T20:26:25.000Z +-75.267565 40.060997 13.600000381469727 +2013-07-25T20:26:26.000Z +-75.267603 40.061006 13.600000381469727 +2013-07-25T20:26:27.000Z +-75.267648 40.061019 13.5 +2013-07-25T20:26:28.000Z +-75.267691 40.061028 14.600000381469727 +2013-07-25T20:26:29.000Z +-75.267738 40.061041 14.399999618530273 +2013-07-25T20:26:30.000Z +-75.267781 40.061062 13.699999809265137 +2013-07-25T20:26:31.000Z +-75.267856 40.061141 11.0 +2013-07-25T20:26:32.000Z +-75.267903 40.061181 11.199999809265137 +2013-07-25T20:26:33.000Z +-75.267953 40.06121 11.800000190734863 +2013-07-25T20:26:34.000Z +-75.267989 40.061246 11.899999618530273 +2013-07-25T20:26:35.000Z +-75.268022 40.061273 12.0 +2013-07-25T20:26:36.000Z +-75.268104 40.061351 7.199999809265137 +2013-07-25T20:26:37.000Z +-75.268166 40.061385 6.699999809265137 +2013-07-25T20:26:38.000Z +-75.26822 40.061417 7.199999809265137 +2013-07-25T20:26:39.000Z +-75.268273 40.061453 7.199999809265137 +2013-07-25T20:26:40.000Z +-75.268321 40.061491 8.300000190734863 +2013-07-25T20:26:41.000Z +-75.268374 40.061523 9.100000381469727 +2013-07-25T20:26:42.000Z +-75.268426 40.061553 9.399999618530273 +2013-07-25T20:26:43.000Z +-75.268479 40.06158 9.5 +2013-07-25T20:26:44.000Z +-75.268532 40.061629 9.600000381469727 +2013-07-25T20:26:45.000Z +-75.268583 40.061668 9.0 +2013-07-25T20:26:46.000Z +-75.268637 40.0617 8.899999618530273 +2013-07-25T20:26:47.000Z +-75.268684 40.06173 8.800000190734863 +2013-07-25T20:26:48.000Z +-75.268693 40.061756 9.600000381469727 +2013-07-25T20:26:49.000Z +-75.268725 40.061785 12.600000381469727 +2013-07-25T20:26:50.000Z +-75.268793 40.061818 13.699999809265137 +2013-07-25T20:26:51.000Z +-75.268858 40.061865 15.100000381469727 +2013-07-25T20:26:52.000Z +-75.268907 40.061898 16.200000762939453 +2013-07-25T20:26:53.000Z +-75.268971 40.061926 16.399999618530273 +2013-07-25T20:26:54.000Z +-75.26903 40.061955 18.100000381469727 +2013-07-25T20:26:55.000Z +-75.269082 40.061996 17.0 +2013-07-25T20:26:56.000Z +-75.26912 40.062027 17.299999237060547 +2013-07-25T20:26:57.000Z +-75.269191 40.062064 17.5 +2013-07-25T20:26:58.000Z +-75.269243 40.0621 17.299999237060547 +2013-07-25T20:26:59.000Z +-75.269298 40.062138 17.5 +2013-07-25T20:27:00.000Z +-75.269368 40.062171 18.100000381469727 +2013-07-25T20:27:01.000Z +-75.269422 40.062206 17.899999618530273 +2013-07-25T20:27:02.000Z +-75.269467 40.062232 18.600000381469727 +2013-07-25T20:27:03.000Z +-75.269498 40.062262 19.0 +2013-07-25T20:27:04.000Z +-75.269586 40.062296 17.700000762939453 +2013-07-25T20:27:05.000Z +-75.269634 40.062321 17.700000762939453 +2013-07-25T20:27:06.000Z +-75.269655 40.062339 18.600000381469727 +2013-07-25T20:27:07.000Z +-75.269696 40.06237 19.600000381469727 +2013-07-25T20:27:08.000Z +-75.269745 40.062397 21.100000381469727 +2013-07-25T20:27:09.000Z +-75.269796 40.062429 21.5 +2013-07-25T20:27:10.000Z +-75.269873 40.06248 19.600000381469727 +2013-07-25T20:27:11.000Z +-75.269933 40.062514 19.100000381469727 +2013-07-25T20:27:12.000Z +-75.269981 40.062552 18.899999618530273 +2013-07-25T20:27:13.000Z +-75.270018 40.062602 17.600000381469727 +2013-07-25T20:27:14.000Z +-75.270045 40.062633 19.700000762939453 +2013-07-25T20:27:15.000Z +-75.270097 40.062664 20.5 +2013-07-25T20:27:16.000Z +-75.270163 40.062683 19.700000762939453 +2013-07-25T20:27:17.000Z +-75.270189 40.062716 21.899999618530273 +2013-07-25T20:27:18.000Z +-75.270239 40.062744 21.399999618530273 +2013-07-25T20:27:19.000Z +-75.270295 40.062786 21.100000381469727 +2013-07-25T20:27:20.000Z +-75.270338 40.062811 22.0 +2013-07-25T20:27:21.000Z +-75.270396 40.062848 21.5 +2013-07-25T20:27:22.000Z +-75.270434 40.062888 20.600000381469727 +2013-07-25T20:27:23.000Z +-75.270475 40.062924 20.299999237060547 +2013-07-25T20:27:24.000Z +-75.270544 40.062974 17.600000381469727 +2013-07-25T20:27:25.000Z +-75.270593 40.063014 16.100000381469727 +2013-07-25T20:27:26.000Z +-75.270649 40.063055 13.800000190734863 +2013-07-25T20:27:27.000Z +-75.270696 40.063083 13.0 +2013-07-25T20:27:28.000Z +-75.270744 40.063113 13.0 +2013-07-25T20:27:29.000Z +-75.270784 40.063148 12.899999618530273 +2013-07-25T20:27:30.000Z +-75.270844 40.063171 12.5 +2013-07-25T20:27:31.000Z +-75.270898 40.063192 12.300000190734863 +2013-07-25T20:27:32.000Z +-75.270963 40.063251 11.800000190734863 +2013-07-25T20:27:33.000Z +-75.271019 40.063299 10.899999618530273 +2013-07-25T20:27:34.000Z +-75.271064 40.063327 10.300000190734863 +2013-07-25T20:27:35.000Z +-75.271087 40.063347 10.800000190734863 +2013-07-25T20:27:36.000Z +-75.271123 40.06337 10.899999618530273 +2013-07-25T20:27:37.000Z +-75.271168 40.063402 9.600000381469727 +2013-07-25T20:27:37.999Z +-75.271202 40.063428 9.600000381469727 +2013-07-25T20:27:39.000Z +-75.271251 40.063473 9.600000381469727 +2013-07-25T20:27:40.000Z +-75.271315 40.063508 8.600000381469727 +2013-07-25T20:27:41.001Z +-75.271357 40.063538 8.199999809265137 +2013-07-25T20:27:42.000Z +-75.271389 40.063562 7.5 +2013-07-25T20:27:43.000Z +-75.271435 40.063598 4.400000095367432 +2013-07-25T20:27:44.000Z +-75.271486 40.063637 3.4000000953674316 +2013-07-25T20:27:45.000Z +-75.27153 40.063665 4.699999809265137 +2013-07-25T20:27:46.000Z +-75.271585 40.063681 9.0 +2013-07-25T20:27:47.000Z +-75.271631 40.063697 10.300000190734863 +2013-07-25T20:27:48.000Z +-75.271675 40.063713 11.399999618530273 +2013-07-25T20:27:49.000Z +-75.271731 40.063774 7.199999809265137 +2013-07-25T20:27:49.999Z +-75.271776 40.063808 5.900000095367432 +2013-07-25T20:27:51.000Z +-75.271834 40.063835 8.800000190734863 +2013-07-25T20:27:52.000Z +-75.271896 40.063874 8.100000381469727 +2013-07-25T20:27:53.000Z +-75.271939 40.063904 8.0 +2013-07-25T20:27:54.000Z +-75.272011 40.06393 8.0 +2013-07-25T20:27:55.000Z +-75.272042 40.063962 8.600000381469727 +2013-07-25T20:27:56.000Z +-75.272073 40.063987 9.300000190734863 +2013-07-25T20:27:57.000Z +-75.272156 40.064044 6.599999904632568 +2013-07-25T20:27:58.000Z +-75.272207 40.064068 7.900000095367432 +2013-07-25T20:27:59.000Z +-75.272265 40.064098 9.0 +2013-07-25T20:28:00.000Z +-75.272317 40.064123 9.5 +2013-07-25T20:28:01.000Z +-75.272354 40.064151 10.100000381469727 +2013-07-25T20:28:02.000Z +-75.272384 40.064176 10.0 +2013-07-25T20:28:03.000Z +-75.272441 40.064209 10.100000381469727 +2013-07-25T20:28:04.000Z +-75.272496 40.064257 9.399999618530273 +2013-07-25T20:28:05.000Z +-75.272539 40.064285 9.399999618530273 +2013-07-25T20:28:06.000Z +-75.272587 40.064314 9.100000381469727 +2013-07-25T20:28:07.000Z +-75.272642 40.064343 10.199999809265137 +2013-07-25T20:28:08.000Z +-75.272695 40.0644 8.699999809265137 +2013-07-25T20:28:09.000Z +-75.272753 40.064447 7.5 +2013-07-25T20:28:10.000Z +-75.272804 40.064482 7.5 +2013-07-25T20:28:11.000Z +-75.272818 40.06451 7.900000095367432 +2013-07-25T20:28:11.999Z +-75.272846 40.06454 7.900000095367432 +2013-07-25T20:28:13.000Z +-75.272913 40.064612 6.699999809265137 +2013-07-25T20:28:14.000Z +-75.272956 40.06464 7.5 +2013-07-25T20:28:15.000Z +-75.273011 40.064683 5.900000095367432 +2013-07-25T20:28:16.000Z +-75.273049 40.064713 5.699999809265137 +2013-07-25T20:28:17.000Z +-75.273105 40.06477 3.200000047683716 +2013-07-25T20:28:18.000Z +-75.273146 40.064812 3.4000000953674316 +2013-07-25T20:28:18.999Z +-75.273185 40.064853 3.0999999046325684 +2013-07-25T20:28:20.000Z +-75.273226 40.064888 3.0 +2013-07-25T20:28:21.000Z +-75.27327 40.064917 3.4000000953674316 +2013-07-25T20:28:22.000Z +-75.273309 40.064965 3.0 +2013-07-25T20:28:22.999Z +-75.273347 40.065004 3.4000000953674316 +2013-07-25T20:28:24.000Z +-75.273338 40.065017 7.0 +2013-07-25T20:28:25.000Z +-75.27335 40.065051 8.199999809265137 +2013-07-25T20:28:26.000Z +-75.273385 40.065097 8.100000381469727 +2013-07-25T20:28:26.999Z +-75.273414 40.065135 8.300000190734863 +2013-07-25T20:28:28.000Z +-75.27347 40.0652 5.5 +2013-07-25T20:28:29.000Z +-75.273526 40.065259 4.0 +2013-07-25T20:28:30.000Z +-75.27358 40.065306 3.700000047683716 +2013-07-25T20:28:31.000Z +-75.273626 40.06536 3.0 +2013-07-25T20:28:32.000Z +-75.27368 40.065407 1.399999976158142 +2013-07-25T20:28:33.000Z +-75.273717 40.065444 1.7000000476837158 +2013-07-25T20:28:34.000Z +-75.273735 40.065474 2.299999952316284 +2013-07-25T20:28:35.000Z +-75.273772 40.065505 4.0 +2013-07-25T20:28:36.000Z +-75.273807 40.065546 4.699999809265137 +2013-07-25T20:28:37.000Z +-75.273842 40.065597 4.5 +2013-07-25T20:28:38.001Z +-75.273873 40.065643 4.199999809265137 +2013-07-25T20:28:39.000Z +-75.273914 40.065688 3.5999999046325684 +2013-07-25T20:28:40.000Z +-75.273947 40.065733 3.299999952316284 +2013-07-25T20:28:41.000Z +-75.273977 40.065774 4.900000095367432 +2013-07-25T20:28:42.000Z +-75.274018 40.065821 4.0 +2013-07-25T20:28:43.001Z +-75.274052 40.065863 4.300000190734863 +2013-07-25T20:28:44.000Z +-75.27407 40.065894 3.299999952316284 +2013-07-25T20:28:45.000Z +-75.274129 40.065927 2.700000047683716 +2013-07-25T20:28:46.000Z +-75.274163 40.065966 2.5 +2013-07-25T20:28:47.000Z +-75.274186 40.066034 2.0999999046325684 +2013-07-25T20:28:48.000Z +-75.274218 40.066079 2.799999952316284 +2013-07-25T20:28:49.000Z +-75.274299 40.066132 0.699999988079071 +2013-07-25T20:28:50.000Z +-75.274357 40.066178 1.0 +2013-07-25T20:28:51.000Z +-75.27437 40.06623 1.899999976158142 +2013-07-25T20:28:52.000Z +-75.274395 40.066274 3.4000000953674316 +2013-07-25T20:28:53.000Z +-75.274409 40.066318 3.5999999046325684 +2013-07-25T20:28:54.000Z +-75.274438 40.066362 3.9000000953674316 +2013-07-25T20:28:55.000Z +-75.27447 40.066406 2.4000000953674316 +2013-07-25T20:28:56.000Z +-75.274498 40.066446 0.8999999761581421 +2013-07-25T20:28:57.000Z +-75.274518 40.066492 -0.20000000298023224 +2013-07-25T20:28:58.000Z +-75.27454 40.066525 -1.0 +2013-07-25T20:28:59.000Z +-75.274562 40.066567 -1.600000023841858 +2013-07-25T20:29:00.000Z +-75.274593 40.066617 -1.7000000476837158 +2013-07-25T20:29:01.000Z +-75.274621 40.066662 -2.5 +2013-07-25T20:29:02.000Z +-75.274651 40.066708 -2.5999999046325684 +2013-07-25T20:29:03.000Z +-75.274676 40.066758 -2.5 +2013-07-25T20:29:04.000Z +-75.27471 40.066802 -0.30000001192092896 +2013-07-25T20:29:05.000Z +-75.274743 40.066851 0.6000000238418579 +2013-07-25T20:29:05.999Z +-75.274785 40.066895 1.100000023841858 +2013-07-25T20:29:07.000Z +-75.274813 40.066942 1.0 +2013-07-25T20:29:08.001Z +-75.274843 40.066988 1.0 +2013-07-25T20:29:09.000Z +-75.274872 40.067038 0.8999999761581421 +2013-07-25T20:29:10.000Z +-75.274901 40.067082 0.6000000238418579 +2013-07-25T20:29:11.000Z +-75.27495 40.06713 2.799999952316284 +2013-07-25T20:29:12.000Z +-75.27499 40.067189 2.200000047683716 +2013-07-25T20:29:13.000Z +-75.275022 40.067236 1.899999976158142 +2013-07-25T20:29:14.000Z +-75.275054 40.067294 2.5 +2013-07-25T20:29:15.000Z +-75.275095 40.067336 2.700000047683716 +2013-07-25T20:29:16.000Z +-75.27514 40.067371 3.0 +2013-07-25T20:29:17.000Z +-75.275151 40.067436 2.0999999046325684 +2013-07-25T20:29:18.000Z +-75.275177 40.067489 3.5 +2013-07-25T20:29:19.000Z +-75.275206 40.067547 2.299999952316284 +2013-07-25T20:29:20.000Z +-75.275245 40.067597 3.0 +2013-07-25T20:29:21.000Z +-75.275289 40.06763 3.200000047683716 +2013-07-25T20:29:22.000Z +-75.275319 40.067676 4.0 +2013-07-25T20:29:23.000Z +-75.27536 40.067728 3.4000000953674316 +2013-07-25T20:29:24.000Z +-75.275404 40.067775 5.099999904632568 +2013-07-25T20:29:25.000Z +-75.275404 40.067811 5.900000095367432 +2013-07-25T20:29:26.000Z +-75.275428 40.067856 5.599999904632568 +2013-07-25T20:29:27.000Z +-75.275483 40.067906 5.099999904632568 +2013-07-25T20:29:28.000Z +-75.27553 40.067954 5.0 +2013-07-25T20:29:29.000Z +-75.275562 40.068002 5.199999809265137 +2013-07-25T20:29:30.000Z +-75.275586 40.068051 4.900000095367432 +2013-07-25T20:29:31.000Z +-75.275615 40.068103 4.800000190734863 +2013-07-25T20:29:32.000Z +-75.27566 40.068145 4.900000095367432 +2013-07-25T20:29:33.000Z +-75.275709 40.068185 5.599999904632568 +2013-07-25T20:29:34.000Z +-75.275737 40.068233 5.900000095367432 +2013-07-25T20:29:35.000Z +-75.275755 40.068284 6.0 +2013-07-25T20:29:36.000Z +-75.275796 40.068334 5.699999809265137 +2013-07-25T20:29:37.000Z +-75.275835 40.068377 5.900000095367432 +2013-07-25T20:29:38.000Z +-75.275872 40.068428 5.5 +2013-07-25T20:29:39.000Z +-75.275914 40.068472 4.800000190734863 +2013-07-25T20:29:40.000Z +-75.275963 40.068517 5.099999904632568 +2013-07-25T20:29:41.000Z +-75.275988 40.068559 5.0 +2013-07-25T20:29:42.000Z +-75.276018 40.068611 3.4000000953674316 +2013-07-25T20:29:43.000Z +-75.276047 40.068654 3.799999952316284 +2013-07-25T20:29:44.000Z +-75.276072 40.068704 3.200000047683716 +2013-07-25T20:29:45.000Z +-75.276097 40.068753 1.7000000476837158 +2013-07-25T20:29:46.000Z +-75.276132 40.068795 2.4000000953674316 +2013-07-25T20:29:47.000Z +-75.27615 40.068844 1.2999999523162842 +2013-07-25T20:29:48.000Z +-75.276176 40.068891 1.0 +2013-07-25T20:29:49.000Z +-75.276211 40.068921 1.399999976158142 +2013-07-25T20:29:50.000Z +-75.276245 40.068974 2.200000047683716 +2013-07-25T20:29:51.000Z +-75.276286 40.069018 1.7999999523162842 +2013-07-25T20:29:52.000Z +-75.276318 40.069071 1.5 +2013-07-25T20:29:53.000Z +-75.276328 40.069126 -0.20000000298023224 +2013-07-25T20:29:54.000Z +-75.276373 40.069163 -0.30000001192092896 +2013-07-25T20:29:55.000Z +-75.276419 40.069195 1.600000023841858 +2013-07-25T20:29:56.000Z +-75.27645 40.069249 1.0 +2013-07-25T20:29:57.000Z +-75.276472 40.06929 0.5 +2013-07-25T20:29:58.000Z +-75.276505 40.069332 0.0 +2013-07-25T20:29:59.000Z +-75.27654 40.069372 0.0 +2013-07-25T20:30:00.000Z +-75.276573 40.069414 0.0 +2013-07-25T20:30:01.000Z +-75.276608 40.069456 -0.10000000149011612 +2013-07-25T20:30:02.000Z +-75.276638 40.069503 -0.5 +2013-07-25T20:30:03.000Z +-75.276665 40.069548 -0.699999988079071 +2013-07-25T20:30:04.000Z +-75.276692 40.069593 -0.8999999761581421 +2013-07-25T20:30:05.000Z +-75.276728 40.069638 -1.100000023841858 +2013-07-25T20:30:06.000Z +-75.27677 40.069679 -0.6000000238418579 +2013-07-25T20:30:07.000Z +-75.276813 40.069722 2.5 +2013-07-25T20:30:08.000Z +-75.276848 40.069769 2.799999952316284 +2013-07-25T20:30:09.000Z +-75.276869 40.069812 2.0999999046325684 +2013-07-25T20:30:10.000Z +-75.2769 40.069857 2.0999999046325684 +2013-07-25T20:30:11.000Z +-75.27693 40.069898 2.200000047683716 +2013-07-25T20:30:12.000Z +-75.276968 40.069942 1.2999999523162842 +2013-07-25T20:30:13.000Z +-75.276991 40.06999 0.6000000238418579 +2013-07-25T20:30:14.000Z +-75.277025 40.070035 0.10000000149011612 +2013-07-25T20:30:15.000Z +-75.277057 40.070077 0.0 +2013-07-25T20:30:16.000Z +-75.277087 40.070117 0.4000000059604645 +2013-07-25T20:30:17.000Z +-75.277116 40.070154 0.699999988079071 +2013-07-25T20:30:18.000Z +-75.277149 40.070199 -0.10000000149011612 +2013-07-25T20:30:19.000Z +-75.277173 40.070244 -1.100000023841858 +2013-07-25T20:30:20.000Z +-75.277213 40.070282 -0.5 +2013-07-25T20:30:21.000Z +-75.277241 40.070319 -0.699999988079071 +2013-07-25T20:30:22.000Z +-75.277267 40.070364 -1.2999999523162842 +2013-07-25T20:30:23.000Z +-75.277288 40.070409 -2.5 +2013-07-25T20:30:24.000Z +-75.277316 40.070454 -1.899999976158142 +2013-07-25T20:30:25.000Z +-75.277342 40.070497 -1.899999976158142 +2013-07-25T20:30:26.000Z +-75.277371 40.070537 -2.200000047683716 +2013-07-25T20:30:27.000Z +-75.277404 40.070585 -2.4000000953674316 +2013-07-25T20:30:28.000Z +-75.277439 40.070633 -2.5 +2013-07-25T20:30:29.000Z +-75.277466 40.070671 -2.4000000953674316 +2013-07-25T20:30:30.000Z +-75.277492 40.070712 -3.0999999046325684 +2013-07-25T20:30:31.000Z +-75.277521 40.070754 -2.5999999046325684 +2013-07-25T20:30:32.000Z +-75.277549 40.0708 -2.4000000953674316 +2013-07-25T20:30:33.000Z +-75.277578 40.070842 -2.4000000953674316 +2013-07-25T20:30:34.000Z +-75.277608 40.070885 -2.299999952316284 +2013-07-25T20:30:35.000Z +-75.277633 40.070938 -3.4000000953674316 +2013-07-25T20:30:36.000Z +-75.277664 40.070982 -3.200000047683716 +2013-07-25T20:30:37.000Z +-75.2777 40.071022 -2.4000000953674316 +2013-07-25T20:30:38.000Z +-75.27773 40.071068 -2.799999952316284 +2013-07-25T20:30:39.000Z +-75.277761 40.071108 -2.9000000953674316 +2013-07-25T20:30:40.000Z +-75.277806 40.071148 -2.5999999046325684 +2013-07-25T20:30:41.000Z +-75.277843 40.071182 -2.200000047683716 +2013-07-25T20:30:42.000Z +-75.277893 40.071187 0.20000000298023224 +2013-07-25T20:30:43.000Z +-75.277929 40.071227 0.30000001192092896 +2013-07-25T20:30:44.000Z +-75.277957 40.071271 1.600000023841858 +2013-07-25T20:30:45.000Z +-75.277983 40.071308 2.299999952316284 +2013-07-25T20:30:46.000Z +-75.278019 40.071354 1.899999976158142 +2013-07-25T20:30:47.000Z +-75.278059 40.071395 1.899999976158142 +2013-07-25T20:30:48.000Z +-75.278102 40.07144 1.600000023841858 +2013-07-25T20:30:49.000Z +-75.278138 40.071475 2.0 +2013-07-25T20:30:50.000Z +-75.278174 40.071518 1.2000000476837158 +2013-07-25T20:30:51.000Z +-75.27821 40.071561 0.699999988079071 +2013-07-25T20:30:52.000Z +-75.278248 40.0716 0.20000000298023224 +2013-07-25T20:30:53.000Z +-75.27828 40.071639 0.30000001192092896 +2013-07-25T20:30:54.000Z +-75.278329 40.071673 1.0 +2013-07-25T20:30:55.000Z +-75.278368 40.071709 1.0 +2013-07-25T20:30:56.000Z +-75.278402 40.071745 1.2000000476837158 +2013-07-25T20:30:57.000Z +-75.278408 40.071741 0.30000001192092896 +2013-07-25T20:30:58.000Z +-75.278487 40.071774 3.0999999046325684 +2013-07-25T20:30:59.000Z +-75.278518 40.07182 3.5999999046325684 +2013-07-25T20:31:00.000Z +-75.278521 40.071868 2.700000047683716 +2013-07-25T20:31:01.000Z +-75.278525 40.07191 2.4000000953674316 +2013-07-25T20:31:02.000Z +-75.278565 40.071957 2.5 +2013-07-25T20:31:03.000Z +-75.278595 40.071989 2.5999999046325684 +2013-07-25T20:31:04.000Z +-75.278642 40.072026 2.5999999046325684 +2013-07-25T20:31:05.000Z +-75.278673 40.072063 2.4000000953674316 +2013-07-25T20:31:06.000Z +-75.278718 40.072103 2.4000000953674316 +2013-07-25T20:31:07.000Z +-75.278762 40.072135 2.5999999046325684 +2013-07-25T20:31:08.000Z +-75.278801 40.072169 3.0 +2013-07-25T20:31:09.000Z +-75.278841 40.072209 2.4000000953674316 +2013-07-25T20:31:10.000Z +-75.278876 40.072248 2.0999999046325684 +2013-07-25T20:31:11.000Z +-75.278919 40.072293 1.2999999523162842 +2013-07-25T20:31:12.000Z +-75.278964 40.072338 0.6000000238418579 +2013-07-25T20:31:13.000Z +-75.279012 40.072377 1.0 +2013-07-25T20:31:14.000Z +-75.279033 40.072398 2.4000000953674316 +2013-07-25T20:31:15.000Z +-75.279071 40.072423 2.4000000953674316 +2013-07-25T20:31:16.000Z +-75.279132 40.072468 1.0 +2013-07-25T20:31:17.000Z +-75.279178 40.072503 1.100000023841858 +2013-07-25T20:31:18.000Z +-75.27922 40.07253 1.399999976158142 +2013-07-25T20:31:19.000Z +-75.279264 40.072569 1.100000023841858 +2013-07-25T20:31:20.000Z +-75.279305 40.072581 4.400000095367432 +2013-07-25T20:31:21.000Z +-75.279343 40.072615 4.900000095367432 +2013-07-25T20:31:22.000Z +-75.279383 40.072635 7.300000190734863 +2013-07-25T20:31:23.000Z +-75.279425 40.072663 9.0 +2013-07-25T20:31:24.000Z +-75.279468 40.072691 9.399999618530273 +2013-07-25T20:31:25.000Z +-75.279514 40.072724 10.100000381469727 +2013-07-25T20:31:26.000Z +-75.279558 40.072753 11.600000381469727 +2013-07-25T20:31:27.000Z +-75.279604 40.072782 12.399999618530273 +2013-07-25T20:31:28.000Z +-75.279654 40.072818 12.100000381469727 +2013-07-25T20:31:29.000Z +-75.279688 40.072844 13.699999809265137 +2013-07-25T20:31:30.000Z +-75.279727 40.072873 14.0 +2013-07-25T20:31:31.000Z +-75.279775 40.072881 14.5 +2013-07-25T20:31:32.000Z +-75.279819 40.072906 14.399999618530273 +2013-07-25T20:31:33.000Z +-75.279873 40.072932 17.799999237060547 +2013-07-25T20:31:34.000Z +-75.27992 40.07296 18.899999618530273 +2013-07-25T20:31:35.000Z +-75.279968 40.072993 19.5 +2013-07-25T20:31:36.000Z +-75.280006 40.073021 19.799999237060547 +2013-07-25T20:31:37.000Z +-75.280065 40.073074 18.5 +2013-07-25T20:31:38.000Z +-75.280136 40.07312 17.399999618530273 +2013-07-25T20:31:39.000Z +-75.280188 40.073153 16.700000762939453 +2013-07-25T20:31:40.000Z +-75.280248 40.07321 15.5 +2013-07-25T20:31:41.000Z +-75.2803 40.073236 15.399999618530273 +2013-07-25T20:31:42.000Z +-75.280351 40.073266 15.100000381469727 +2013-07-25T20:31:43.000Z +-75.280405 40.073293 15.100000381469727 +2013-07-25T20:31:44.000Z +-75.280484 40.073342 12.100000381469727 +2013-07-25T20:31:45.000Z +-75.280542 40.073378 11.699999809265137 +2013-07-25T20:31:46.000Z +-75.28059 40.073402 12.199999809265137 +2013-07-25T20:31:47.000Z +-75.280649 40.073436 12.100000381469727 +2013-07-25T20:31:48.000Z +-75.280695 40.073468 12.800000190734863 +2013-07-25T20:31:49.000Z +-75.280723 40.073478 16.600000381469727 +2013-07-25T20:31:50.000Z +-75.280787 40.073516 14.899999618530273 +2013-07-25T20:31:51.000Z +-75.280855 40.07355 12.899999618530273 +2013-07-25T20:31:52.000Z +-75.28092 40.073582 12.0 +2013-07-25T20:31:53.000Z +-75.28097 40.073602 12.5 +2013-07-25T20:31:54.000Z +-75.281029 40.07363 11.5 +2013-07-25T20:31:55.000Z +-75.281081 40.073652 11.699999809265137 +2013-07-25T20:31:56.000Z +-75.281148 40.073684 10.899999618530273 +2013-07-25T20:31:57.000Z +-75.281209 40.073709 10.300000190734863 +2013-07-25T20:31:58.000Z +-75.281274 40.073734 9.699999809265137 +2013-07-25T20:31:59.000Z +-75.281331 40.073757 10.100000381469727 +2013-07-25T20:32:00.000Z +-75.281389 40.07378 10.0 +2013-07-25T20:32:01.000Z +-75.281447 40.073817 8.199999809265137 +2013-07-25T20:32:02.000Z +-75.28151 40.073841 7.400000095367432 +2013-07-25T20:32:03.000Z +-75.281581 40.073854 6.900000095367432 +2013-07-25T20:32:04.000Z +-75.281651 40.073875 6.900000095367432 +2013-07-25T20:32:05.000Z +-75.28171 40.073876 7.099999904632568 +2013-07-25T20:32:06.000Z +-75.281768 40.073893 9.399999618530273 +2013-07-25T20:32:07.000Z +-75.28184 40.073913 9.5 +2013-07-25T20:32:08.000Z +-75.2819 40.073934 10.5 +2013-07-25T20:32:09.000Z +-75.28193 40.073951 11.800000190734863 +2013-07-25T20:32:10.000Z +-75.281965 40.073966 11.899999618530273 +2013-07-25T20:32:11.000Z +-75.282002 40.073981 12.100000381469727 +2013-07-25T20:32:11.999Z +-75.282108 40.073976 12.300000190734863 +2013-07-25T20:32:13.000Z +-75.282166 40.073985 11.199999809265137 +2013-07-25T20:32:14.000Z +-75.282251 40.074016 8.800000190734863 +2013-07-25T20:32:15.000Z +-75.282336 40.07405 7.599999904632568 +2013-07-25T20:32:16.000Z +-75.282416 40.074074 6.900000095367432 +2013-07-25T20:32:17.000Z +-75.282481 40.074098 5.699999809265137 +2013-07-25T20:32:18.000Z +-75.282552 40.074126 3.799999952316284 +2013-07-25T20:32:19.000Z +-75.282622 40.074151 2.0 +2013-07-25T20:32:20.000Z +-75.282675 40.074167 1.7999999523162842 +2013-07-25T20:32:21.000Z +-75.282733 40.074194 0.6000000238418579 +2013-07-25T20:32:22.000Z +-75.282794 40.074212 1.600000023841858 +2013-07-25T20:32:23.000Z +-75.282855 40.074222 2.299999952316284 +2013-07-25T20:32:24.000Z +-75.282925 40.074247 1.2999999523162842 +2013-07-25T20:32:25.000Z +-75.282976 40.074252 1.0 +2013-07-25T20:32:26.000Z +-75.283036 40.074256 0.5 +2013-07-25T20:32:27.000Z +-75.283095 40.074261 0.0 +2013-07-25T20:32:28.000Z +-75.283156 40.074287 -0.6000000238418579 +2013-07-25T20:32:29.000Z +-75.283217 40.074301 -1.5 +2013-07-25T20:32:30.000Z +-75.283267 40.074323 -2.299999952316284 +2013-07-25T20:32:31.000Z +-75.283327 40.074323 -2.9000000953674316 +2013-07-25T20:32:32.000Z +-75.283396 40.074336 -3.0 +2013-07-25T20:32:33.000Z +-75.283445 40.074329 -3.4000000953674316 +2013-07-25T20:32:34.000Z +-75.283509 40.074344 -5.199999809265137 +2013-07-25T20:32:35.000Z +-75.283576 40.074355 -5.400000095367432 +2013-07-25T20:32:36.000Z +-75.283638 40.074365 -5.599999904632568 +2013-07-25T20:32:37.000Z +-75.283699 40.074372 -5.0 +2013-07-25T20:32:38.000Z +-75.283752 40.074381 -4.5 +2013-07-25T20:32:39.000Z +-75.2838 40.074392 -3.5999999046325684 +2013-07-25T20:32:40.000Z +-75.283855 40.074398 -3.200000047683716 +2013-07-25T20:32:41.000Z +-75.28391 40.074406 -2.5999999046325684 +2013-07-25T20:32:42.000Z +-75.283977 40.074411 -3.700000047683716 +2013-07-25T20:32:43.001Z +-75.284036 40.074413 -3.4000000953674316 +2013-07-25T20:32:44.000Z +-75.284105 40.074413 -4.0 +2013-07-25T20:32:45.000Z +-75.284164 40.074408 -4.099999904632568 +2013-07-25T20:32:46.000Z +-75.284228 40.074407 -4.599999904632568 +2013-07-25T20:32:47.000Z +-75.284277 40.074407 -4.699999809265137 +2013-07-25T20:32:48.000Z +-75.284337 40.074415 -5.400000095367432 +2013-07-25T20:32:49.000Z +-75.2844 40.074415 -5.199999809265137 +2013-07-25T20:32:50.000Z +-75.284449 40.07442 -2.9000000953674316 +2013-07-25T20:32:51.000Z +-75.284492 40.074427 -1.5 +2013-07-25T20:32:52.000Z +-75.284542 40.074439 -1.100000023841858 +2013-07-25T20:32:53.000Z +-75.284598 40.074428 -0.699999988079071 +2013-07-25T20:32:54.000Z +-75.284658 40.074433 0.10000000149011612 +2013-07-25T20:32:55.000Z +-75.284693 40.074429 2.5 +2013-07-25T20:32:56.000Z +-75.284733 40.074434 4.400000095367432 +2013-07-25T20:32:58.000Z +-75.284764 40.074405 12.399999618530273 +2013-07-25T20:32:59.000Z +-75.284815 40.074395 12.600000381469727 +2013-07-25T20:33:00.000Z +-75.284898 40.074378 12.0 +2013-07-25T20:33:01.000Z +-75.284968 40.074384 11.699999809265137 +2013-07-25T20:33:02.000Z +-75.285022 40.074395 10.0 +2013-07-25T20:33:03.000Z +-75.2851 40.07439 8.800000190734863 +2013-07-25T20:33:04.000Z +-75.285146 40.074386 9.399999618530273 +2013-07-25T20:33:05.000Z +-75.285196 40.074378 9.899999618530273 +2013-07-25T20:33:06.000Z +-75.285251 40.07437 10.600000381469727 +2013-07-25T20:33:07.000Z +-75.285281 40.074382 10.699999809265137 +2013-07-25T20:33:08.000Z +-75.285327 40.074381 9.899999618530273 +2013-07-25T20:33:09.000Z +-75.285369 40.074379 8.600000381469727 +2013-07-25T20:33:10.000Z +-75.285417 40.074373 7.300000190734863 +2013-07-25T20:33:11.000Z +-75.285466 40.074368 6.400000095367432 +2013-07-25T20:33:12.000Z +-75.285518 40.074363 5.400000095367432 +2013-07-25T20:33:13.000Z +-75.285566 40.07436 4.900000095367432 +2013-07-25T20:33:14.000Z +-75.285618 40.074358 4.900000095367432 +2013-07-25T20:33:15.000Z +-75.285673 40.074357 4.0 +2013-07-25T20:33:16.000Z +-75.285732 40.074356 3.5 +2013-07-25T20:33:17.000Z +-75.285788 40.074356 4.0 +2013-07-25T20:33:18.001Z +-75.28584 40.074353 4.199999809265137 +2013-07-25T20:33:19.000Z +-75.285907 40.074349 2.700000047683716 +2013-07-25T20:33:20.000Z +-75.285971 40.074345 1.7000000476837158 +2013-07-25T20:33:21.000Z +-75.28603 40.074341 1.2000000476837158 +2013-07-25T20:33:22.000Z +-75.286118 40.074341 -0.20000000298023224 +2013-07-25T20:33:23.000Z +-75.286184 40.074341 -1.100000023841858 +2013-07-25T20:33:24.000Z +-75.286247 40.074336 -2.0 +2013-07-25T20:33:25.000Z +-75.286313 40.07433 -2.799999952316284 +2013-07-25T20:33:26.000Z +-75.286379 40.074325 -3.0 +2013-07-25T20:33:27.000Z +-75.286436 40.074325 -2.700000047683716 +2013-07-25T20:33:28.000Z +-75.286496 40.074331 -3.0 +2013-07-25T20:33:29.000Z +-75.28656 40.074319 -3.9000000953674316 +2013-07-25T20:33:30.000Z +-75.286628 40.074322 -4.599999904632568 +2013-07-25T20:33:31.000Z +-75.286685 40.074331 -4.0 +2013-07-25T20:33:32.000Z +-75.286744 40.074328 -4.400000095367432 +2013-07-25T20:33:33.000Z +-75.2868 40.074311 -4.5 +2013-07-25T20:33:34.000Z +-75.28686 40.074299 -4.900000095367432 +2013-07-25T20:33:35.000Z +-75.286931 40.074297 -6.0 +2013-07-25T20:33:36.000Z +-75.286985 40.07429 -6.0 +2013-07-25T20:33:37.000Z +-75.287022 40.074297 -6.800000190734863 +2013-07-25T20:33:38.000Z +-75.287079 40.074282 -6.699999809265137 +2013-07-25T20:33:39.000Z +-75.287125 40.07427 -7.199999809265137 +2013-07-25T20:33:40.000Z +-75.287187 40.07427 -7.900000095367432 +2013-07-25T20:33:41.000Z +-75.287234 40.074266 -8.600000381469727 +2013-07-25T20:33:42.000Z +-75.287281 40.074254 -8.199999809265137 +2013-07-25T20:33:43.000Z +-75.287327 40.074241 -7.199999809265137 +2013-07-25T20:33:44.000Z +-75.287383 40.074228 -7.400000095367432 +2013-07-25T20:33:45.000Z +-75.287434 40.074214 -7.400000095367432 +2013-07-25T20:33:46.000Z +-75.287483 40.0742 -7.300000190734863 +2013-07-25T20:33:47.000Z +-75.287552 40.074188 -8.800000190734863 +2013-07-25T20:33:48.000Z +-75.287605 40.074176 -9.300000190734863 +2013-07-25T20:33:49.000Z +-75.287662 40.074164 -9.5 +2013-07-25T20:33:50.000Z +-75.287712 40.074152 -9.699999809265137 +2013-07-25T20:33:51.000Z +-75.287755 40.074149 -9.600000381469727 +2013-07-25T20:33:52.000Z +-75.287807 40.074147 -10.100000381469727 +2013-07-25T20:33:53.000Z +-75.287867 40.074144 -11.100000381469727 +2013-07-25T20:33:54.000Z +-75.287908 40.074141 -10.600000381469727 +2013-07-25T20:33:55.000Z +-75.287951 40.074138 -9.300000190734863 +2013-07-25T20:33:56.000Z +-75.287994 40.074137 -9.100000381469727 +2013-07-25T20:33:57.000Z +-75.288036 40.074135 -9.199999809265137 +2013-07-25T20:33:58.000Z +-75.288082 40.074137 -9.600000381469727 +2013-07-25T20:33:59.000Z +-75.288129 40.07414 -9.300000190734863 +2013-07-25T20:34:00.000Z +-75.288174 40.074141 -6.5 +2013-07-25T20:34:01.000Z +-75.288207 40.074139 -4.199999809265137 +2013-07-25T20:34:02.000Z +-75.288242 40.074133 -4.199999809265137 +2013-07-25T20:34:03.000Z +-75.288278 40.074123 -2.9000000953674316 +2013-07-25T20:34:04.000Z +-75.288312 40.074111 1.5 +2013-07-25T20:34:05.000Z +-75.288347 40.074099 2.799999952316284 +2013-07-25T20:34:06.000Z +-75.288385 40.074085 3.0999999046325684 +2013-07-25T20:34:07.000Z +-75.288426 40.074072 2.9000000953674316 +2013-07-25T20:34:08.000Z +-75.28849 40.074056 0.8999999761581421 +2013-07-25T20:34:09.000Z +-75.288549 40.074048 0.0 +2013-07-25T20:34:10.000Z +-75.288595 40.074038 0.6000000238418579 +2013-07-25T20:34:11.000Z +-75.288639 40.074032 0.0 +2013-07-25T20:34:12.000Z +-75.288669 40.074034 0.20000000298023224 +2013-07-25T20:34:13.000Z +-75.288699 40.074044 0.699999988079071 +2013-07-25T20:34:14.000Z +-75.288737 40.074055 1.600000023841858 +2013-07-25T20:34:15.000Z +-75.288784 40.074071 1.7999999523162842 +2013-07-25T20:34:17.000Z +-75.28883 40.074044 10.0 +2013-07-25T20:34:18.000Z +-75.288847 40.074046 12.199999809265137 +2013-07-25T20:34:20.000Z +-75.288891 40.074046 13.699999809265137 +2013-07-25T20:34:21.000Z +-75.288921 40.074044 15.800000190734863 +2013-07-25T20:34:22.000Z +-75.28896 40.074039 16.899999618530273 +2013-07-25T20:34:23.000Z +-75.289062 40.074037 21.899999618530273 +2013-07-25T20:34:24.000Z +-75.289127 40.074051 22.100000381469727 +2013-07-25T20:34:25.000Z +-75.289172 40.074055 21.299999237060547 +2013-07-25T20:34:26.000Z +-75.289217 40.074063 19.700000762939453 +2013-07-25T20:34:27.000Z +-75.289271 40.074071 19.299999237060547 +2013-07-25T20:34:28.000Z +-75.28934 40.074036 20.399999618530273 +2013-07-25T20:34:29.000Z +-75.289418 40.074038 20.100000381469727 +2013-07-25T20:34:30.000Z +-75.289482 40.074002 22.299999237060547 +2013-07-25T20:34:31.000Z +-75.289482 40.07396 25.899999618530273 +2013-07-25T20:34:32.000Z +-75.289533 40.073924 27.399999618530273 +2013-07-25T20:34:33.000Z +-75.28958 40.073924 26.0 +2013-07-25T20:34:34.000Z +-75.28963 40.073912 24.0 +2013-07-25T20:34:35.000Z +-75.289683 40.073897 24.100000381469727 +2013-07-25T20:34:36.000Z +-75.289746 40.073881 21.700000762939453 +2013-07-25T20:34:37.000Z +-75.289809 40.07387 20.5 +2013-07-25T20:34:38.000Z +-75.289877 40.073862 19.200000762939453 +2013-07-25T20:34:39.000Z +-75.289945 40.073857 18.0 +2013-07-25T20:34:40.000Z +-75.290064 40.073832 17.200000762939453 +2013-07-25T20:34:41.000Z +-75.290118 40.073818 16.200000762939453 +2013-07-25T20:34:42.000Z +-75.290176 40.073808 15.600000381469727 +2013-07-25T20:34:43.000Z +-75.290246 40.073831 14.5 +2013-07-25T20:34:44.000Z +-75.29033 40.073834 13.100000381469727 +2013-07-25T20:34:45.000Z +-75.290383 40.07382 12.399999618530273 +2013-07-25T20:34:46.000Z +-75.290437 40.073817 11.100000381469727 +2013-07-25T20:34:47.000Z +-75.290487 40.073805 10.800000190734863 +2013-07-25T20:34:48.000Z +-75.290524 40.073802 11.199999809265137 +2013-07-25T20:34:49.000Z +-75.290592 40.073783 9.600000381469727 +2013-07-25T20:34:50.000Z +-75.290631 40.073762 8.899999618530273 +2013-07-25T20:34:51.000Z +-75.290699 40.073752 7.900000095367432 +2013-07-25T20:34:52.000Z +-75.290763 40.073733 7.199999809265137 +2013-07-25T20:34:53.000Z +-75.290806 40.073729 6.400000095367432 +2013-07-25T20:34:54.000Z +-75.290865 40.073721 6.400000095367432 +2013-07-25T20:34:55.000Z +-75.290919 40.073705 6.400000095367432 +2013-07-25T20:34:56.000Z +-75.29096 40.073692 6.900000095367432 +2013-07-25T20:34:58.000Z +-75.291001 40.073676 12.300000190734863 +2013-07-25T20:34:59.000Z +-75.29103 40.073664 15.399999618530273 +2013-07-25T20:35:01.000Z +-75.29108 40.073643 19.200000762939453 +2013-07-25T20:35:02.000Z +-75.291107 40.073632 21.899999618530273 +2013-07-25T20:35:03.000Z +-75.29114 40.073622 22.399999618530273 +2013-07-25T20:35:04.000Z +-75.291186 40.073612 20.600000381469727 +2013-07-25T20:35:05.000Z +-75.291238 40.073605 20.0 +2013-07-25T20:35:06.000Z +-75.291288 40.073598 22.5 +2013-07-25T20:35:07.000Z +-75.291341 40.073589 23.200000762939453 +2013-07-25T20:35:08.000Z +-75.291409 40.073558 25.600000381469727 +2013-07-25T20:35:09.000Z +-75.291473 40.073535 24.5 +2013-07-25T20:35:10.000Z +-75.29154 40.073527 24.100000381469727 +2013-07-25T20:35:11.000Z +-75.291606 40.073519 22.899999618530273 +2013-07-25T20:35:12.000Z +-75.291662 40.07351 23.100000381469727 +2013-07-25T20:35:13.000Z +-75.291712 40.073504 23.0 +2013-07-25T20:35:14.000Z +-75.291785 40.073491 21.299999237060547 +2013-07-25T20:35:15.000Z +-75.291848 40.07348 21.799999237060547 +2013-07-25T20:35:16.000Z +-75.291912 40.073475 21.600000381469727 +2013-07-25T20:35:17.000Z +-75.291983 40.073473 21.700000762939453 +2013-07-25T20:35:18.000Z +-75.292048 40.073471 23.299999237060547 +2013-07-25T20:35:19.000Z +-75.292113 40.073462 22.799999237060547 +2013-07-25T20:35:20.000Z +-75.292162 40.073451 21.899999618530273 +2013-07-25T20:35:21.000Z +-75.292245 40.073442 20.100000381469727 +2013-07-25T20:35:22.000Z +-75.292321 40.073435 19.600000381469727 +2013-07-25T20:35:23.000Z +-75.292412 40.073421 16.700000762939453 +2013-07-25T20:35:24.000Z +-75.292479 40.073404 16.0 +2013-07-25T20:35:25.000Z +-75.292533 40.073398 14.800000190734863 +2013-07-25T20:35:26.000Z +-75.292625 40.073395 10.899999618530273 +2013-07-25T20:35:27.000Z +-75.292688 40.073387 9.899999618530273 +2013-07-25T20:35:28.000Z +-75.292747 40.073374 9.699999809265137 +2013-07-25T20:35:29.000Z +-75.29281 40.073366 8.699999809265137 +2013-07-25T20:35:30.000Z +-75.292866 40.073356 8.399999618530273 +2013-07-25T20:35:31.000Z +-75.292917 40.073346 9.100000381469727 +2013-07-25T20:35:32.000Z +-75.292959 40.073331 11.600000381469727 +2013-07-25T20:35:33.000Z +-75.292993 40.073332 13.199999809265137 +2013-07-25T20:35:35.000Z +-75.29304 40.073315 19.799999237060547 +2013-07-25T20:35:36.000Z +-75.293056 40.073304 24.799999237060547 +2013-07-25T20:35:37.000Z +-75.293095 40.073297 27.200000762939453 +2013-07-25T20:35:38.000Z +-75.293159 40.073295 28.600000381469727 +2013-07-25T20:35:39.000Z +-75.293201 40.073283 30.700000762939453 +2013-07-25T20:35:40.000Z +-75.293248 40.073272 31.399999618530273 +2013-07-25T20:35:41.000Z +-75.293299 40.07326 30.700000762939453 +2013-07-25T20:35:42.000Z +-75.293356 40.07325 28.899999618530273 +2013-07-25T20:35:43.000Z +-75.29342 40.073242 27.5 +2013-07-25T20:35:44.000Z +-75.293486 40.073233 27.700000762939453 +2013-07-25T20:35:45.000Z +-75.293603 40.073231 25.700000762939453 +2013-07-25T20:35:46.000Z +-75.293676 40.07321 23.399999618530273 +2013-07-25T20:35:47.000Z +-75.293727 40.073205 23.299999237060547 +2013-07-25T20:35:48.000Z +-75.293774 40.073198 23.399999618530273 +2013-07-25T20:35:49.000Z +-75.293853 40.073186 23.399999618530273 +2013-07-25T20:35:50.000Z +-75.293912 40.073171 23.700000762939453 +2013-07-25T20:35:51.000Z +-75.293993 40.073159 20.0 +2013-07-25T20:35:52.000Z +-75.294049 40.073155 18.600000381469727 +2013-07-25T20:35:53.000Z +-75.294151 40.073159 14.5 +2013-07-25T20:35:54.000Z +-75.294222 40.073164 12.699999809265137 +2013-07-25T20:35:55.000Z +-75.294302 40.073158 11.399999618530273 +2013-07-25T20:35:56.000Z +-75.294372 40.073146 10.600000381469727 +2013-07-25T20:35:57.000Z +-75.294437 40.073131 9.600000381469727 +2013-07-25T20:35:58.000Z +-75.294497 40.073113 8.300000190734863 +2013-07-25T20:35:59.000Z +-75.294572 40.073109 7.099999904632568 +2013-07-25T20:36:00.000Z +-75.294634 40.073094 6.5 +2013-07-25T20:36:01.001Z +-75.294694 40.073085 6.199999809265137 +2013-07-25T20:36:02.000Z +-75.294754 40.073083 6.099999904632568 +2013-07-25T20:36:03.000Z +-75.294832 40.073065 5.5 +2013-07-25T20:36:04.000Z +-75.294897 40.073058 4.300000190734863 +2013-07-25T20:36:05.000Z +-75.294954 40.073047 3.5 +2013-07-25T20:36:06.000Z +-75.295014 40.073034 2.700000047683716 +2013-07-25T20:36:07.000Z +-75.295082 40.073024 2.0 +2013-07-25T20:36:08.000Z +-75.295153 40.073008 1.399999976158142 +2013-07-25T20:36:09.000Z +-75.295215 40.073004 0.800000011920929 +2013-07-25T20:36:10.000Z +-75.295276 40.072987 0.4000000059604645 +2013-07-25T20:36:11.000Z +-75.295342 40.072977 0.0 +2013-07-25T20:36:12.000Z +-75.295414 40.07297 -1.0 +2013-07-25T20:36:13.000Z +-75.295476 40.072963 -1.100000023841858 +2013-07-25T20:36:14.000Z +-75.295536 40.072952 -1.2999999523162842 +2013-07-25T20:36:15.000Z +-75.29558 40.072948 -0.8999999761581421 +2013-07-25T20:36:16.000Z +-75.295651 40.072932 -1.0 +2013-07-25T20:36:17.000Z +-75.295722 40.072923 -1.5 +2013-07-25T20:36:18.000Z +-75.295798 40.072917 -3.799999952316284 +2013-07-25T20:36:19.000Z +-75.29585 40.072908 -4.5 +2013-07-25T20:36:20.000Z +-75.295916 40.072899 -4.599999904632568 +2013-07-25T20:36:21.000Z +-75.295979 40.072892 -5.0 +2013-07-25T20:36:22.000Z +-75.296046 40.072875 -5.699999809265137 +2013-07-25T20:36:23.000Z +-75.296112 40.072868 -5.599999904632568 +2013-07-25T20:36:24.000Z +-75.296185 40.072853 -6.300000190734863 +2013-07-25T20:36:25.000Z +-75.296253 40.072846 -7.5 +2013-07-25T20:36:26.000Z +-75.296322 40.072835 -8.300000190734863 +2013-07-25T20:36:27.000Z +-75.296387 40.07282 -8.899999618530273 +2013-07-25T20:36:28.000Z +-75.296455 40.072808 -9.199999809265137 +2013-07-25T20:36:29.000Z +-75.296515 40.072796 -9.699999809265137 +2013-07-25T20:36:30.000Z +-75.29658 40.072788 -9.899999618530273 +2013-07-25T20:36:31.000Z +-75.296641 40.072782 -9.699999809265137 +2013-07-25T20:36:32.000Z +-75.296713 40.07277 -9.699999809265137 +2013-07-25T20:36:33.000Z +-75.296776 40.072762 -10.100000381469727 +2013-07-25T20:36:34.000Z +-75.296839 40.072754 -10.0 +2013-07-25T20:36:35.000Z +-75.296897 40.072744 -9.600000381469727 +2013-07-25T20:36:36.000Z +-75.296961 40.072736 -10.300000190734863 +2013-07-25T20:36:37.000Z +-75.29703 40.07273 -10.100000381469727 +2013-07-25T20:36:38.000Z +-75.297097 40.072718 -10.399999618530273 +2013-07-25T20:36:39.000Z +-75.297152 40.072701 -10.5 +2013-07-25T20:36:40.000Z +-75.297209 40.072683 -10.699999809265137 +2013-07-25T20:36:41.000Z +-75.297279 40.072664 -10.800000190734863 +2013-07-25T20:36:42.000Z +-75.297346 40.072657 -11.100000381469727 +2013-07-25T20:36:43.000Z +-75.29741 40.072641 -11.899999618530273 +2013-07-25T20:36:44.000Z +-75.297482 40.072632 -12.399999618530273 +2013-07-25T20:36:45.000Z +-75.297528 40.072628 -11.800000190734863 +2013-07-25T20:36:46.000Z +-75.297587 40.072615 -12.600000381469727 +2013-07-25T20:36:47.000Z +-75.297647 40.072605 -12.399999618530273 +2013-07-25T20:36:48.000Z +-75.297712 40.072594 -12.0 +2013-07-25T20:36:49.000Z +-75.297766 40.072584 -11.600000381469727 +2013-07-25T20:36:50.000Z +-75.297838 40.072568 -11.800000190734863 +2013-07-25T20:36:51.000Z +-75.297901 40.072551 -12.5 +2013-07-25T20:36:52.000Z +-75.297961 40.07254 -12.399999618530273 +2013-07-25T20:36:53.000Z +-75.298019 40.072532 -12.899999618530273 +2013-07-25T20:36:54.000Z +-75.298084 40.072512 -12.5 +2013-07-25T20:36:55.000Z +-75.298145 40.072505 -12.100000381469727 +2013-07-25T20:36:56.000Z +-75.29821 40.072493 -11.800000190734863 +2013-07-25T20:36:57.000Z +-75.298258 40.072483 -10.199999809265137 +2013-07-25T20:36:58.000Z +-75.298295 40.072471 -7.5 +2013-07-25T20:36:59.000Z +-75.298339 40.07247 -6.800000190734863 +2013-07-25T20:37:00.000Z +-75.298381 40.072471 -7.300000190734863 +2013-07-25T20:37:01.000Z +-75.298421 40.072475 -7.199999809265137 +2013-07-25T20:37:02.000Z +-75.298519 40.072443 -10.600000381469727 +2013-07-25T20:37:03.000Z +-75.298575 40.072432 -9.800000190734863 +2013-07-25T20:37:04.000Z +-75.29864 40.072424 -10.300000190734863 +2013-07-25T20:37:05.000Z +-75.298696 40.072415 -10.600000381469727 +2013-07-25T20:37:06.000Z +-75.298749 40.072412 -10.5 +2013-07-25T20:37:07.000Z +-75.298796 40.072402 -8.5 +2013-07-25T20:37:08.000Z +-75.298833 40.072395 -6.300000190734863 +2013-07-25T20:37:09.000Z +-75.298862 40.072378 -2.799999952316284 +2013-07-25T20:37:10.000Z +-75.298935 40.072366 -4.5 +2013-07-25T20:37:11.000Z +-75.298996 40.072358 -5.800000190734863 +2013-07-25T20:37:12.000Z +-75.299058 40.072345 -6.099999904632568 +2013-07-25T20:37:13.000Z +-75.29911 40.072343 -6.699999809265137 +2013-07-25T20:37:14.000Z +-75.299166 40.072334 -6.800000190734863 +2013-07-25T20:37:15.000Z +-75.299222 40.072324 -7.0 +2013-07-25T20:37:16.000Z +-75.299286 40.072314 -7.400000095367432 +2013-07-25T20:37:17.000Z +-75.299343 40.072312 -8.800000190734863 +2013-07-25T20:37:18.000Z +-75.299415 40.07231 -10.5 +2013-07-25T20:37:19.000Z +-75.299474 40.072299 -12.300000190734863 +2013-07-25T20:37:20.000Z +-75.299539 40.072289 -11.800000190734863 +2013-07-25T20:37:21.000Z +-75.299582 40.07228 -11.5 +2013-07-25T20:37:22.000Z +-75.299643 40.072262 -11.100000381469727 +2013-07-25T20:37:23.000Z +-75.299723 40.072238 -11.5 +2013-07-25T20:37:24.000Z +-75.299787 40.072233 -12.100000381469727 +2013-07-25T20:37:25.000Z +-75.299873 40.072225 -13.300000190734863 +2013-07-25T20:37:26.000Z +-75.299943 40.072198 -14.100000381469727 +2013-07-25T20:37:27.000Z +-75.299988 40.07219 -14.699999809265137 +2013-07-25T20:37:28.000Z +-75.30004 40.072198 -14.100000381469727 +2013-07-25T20:37:29.000Z +-75.300071 40.072195 -13.699999809265137 +2013-07-25T20:37:30.000Z +-75.300118 40.072189 -13.800000190734863 +2013-07-25T20:37:31.000Z +-75.300192 40.072165 -13.800000190734863 +2013-07-25T20:37:32.000Z +-75.300256 40.072156 -12.399999618530273 +2013-07-25T20:37:33.000Z +-75.300325 40.072149 -12.399999618530273 +2013-07-25T20:37:34.000Z +-75.300393 40.072132 -13.800000190734863 +2013-07-25T20:37:35.000Z +-75.300447 40.072132 -13.199999809265137 +2013-07-25T20:37:36.000Z +-75.300509 40.07213 -11.300000190734863 +2013-07-25T20:37:37.000Z +-75.300576 40.072126 -12.399999618530273 +2013-07-25T20:37:38.000Z +-75.300627 40.072112 -12.100000381469727 +2013-07-25T20:37:39.000Z +-75.300689 40.072107 -13.100000381469727 +2013-07-25T20:37:40.000Z +-75.300766 40.072104 -14.0 +2013-07-25T20:37:41.000Z +-75.300822 40.072098 -14.199999809265137 +2013-07-25T20:37:42.000Z +-75.300876 40.07209 -14.5 +2013-07-25T20:37:43.000Z +-75.300927 40.072084 -15.100000381469727 +2013-07-25T20:37:44.000Z +-75.300984 40.072069 -15.100000381469727 +2013-07-25T20:37:45.000Z +-75.301036 40.072064 -15.100000381469727 +2013-07-25T20:37:46.000Z +-75.301089 40.072046 -15.699999809265137 +2013-07-25T20:37:47.000Z +-75.301152 40.072036 -15.399999618530273 +2013-07-25T20:37:48.000Z +-75.301204 40.072027 -15.100000381469727 +2013-07-25T20:37:49.000Z +-75.301267 40.072021 -16.0 +2013-07-25T20:37:50.000Z +-75.301319 40.072009 -16.100000381469727 +2013-07-25T20:37:51.000Z +-75.301371 40.071985 -15.899999618530273 +2013-07-25T20:37:52.000Z +-75.301419 40.071975 -15.600000381469727 +2013-07-25T20:37:53.000Z +-75.301462 40.071966 -15.899999618530273 +2013-07-25T20:37:54.000Z +-75.301513 40.071954 -16.200000762939453 +2013-07-25T20:37:55.000Z +-75.301564 40.071944 -16.0 +2013-07-25T20:37:56.000Z +-75.301616 40.071933 -15.399999618530273 +2013-07-25T20:37:57.000Z +-75.301665 40.071919 -14.300000190734863 +2013-07-25T20:37:58.000Z +-75.301716 40.071909 -15.699999809265137 +2013-07-25T20:37:59.000Z +-75.301772 40.071901 -17.100000381469727 +2013-07-25T20:38:00.000Z +-75.301832 40.071895 -17.600000381469727 +2013-07-25T20:38:01.000Z +-75.301889 40.071889 -17.600000381469727 +2013-07-25T20:38:02.000Z +-75.301941 40.071879 -16.600000381469727 +2013-07-25T20:38:03.000Z +-75.301989 40.071862 -15.699999809265137 +2013-07-25T20:38:04.000Z +-75.302036 40.071843 -15.600000381469727 +2013-07-25T20:38:05.000Z +-75.302074 40.071829 -15.5 +2013-07-25T20:38:06.000Z +-75.302111 40.071818 -15.0 +2013-07-25T20:38:07.000Z +-75.302146 40.071815 -14.5 +2013-07-25T20:38:08.000Z +-75.302179 40.071815 -13.5 +2013-07-25T20:38:09.000Z +-75.302211 40.071816 -10.300000190734863 +2013-07-25T20:38:10.000Z +-75.302255 40.071816 -11.699999809265137 +2013-07-25T20:38:11.000Z +-75.302305 40.071814 -12.199999809265137 +2013-07-25T20:38:12.000Z +-75.302363 40.071808 -12.100000381469727 +2013-07-25T20:38:13.000Z +-75.302419 40.071802 -12.0 +2013-07-25T20:38:14.000Z +-75.302475 40.0718 -11.100000381469727 +2013-07-25T20:38:15.000Z +-75.302526 40.071801 -11.199999809265137 +2013-07-25T20:38:16.000Z +-75.302573 40.071803 -11.600000381469727 +2013-07-25T20:38:17.000Z +-75.302613 40.071804 -12.5 +2013-07-25T20:38:18.000Z +-75.302654 40.071806 -11.800000190734863 +2013-07-25T20:38:19.000Z +-75.302697 40.071807 -12.199999809265137 +2013-07-25T20:38:20.000Z +-75.302745 40.071811 -12.0 +2013-07-25T20:38:21.000Z +-75.302787 40.071814 -12.100000381469727 +2013-07-25T20:38:22.000Z +-75.302834 40.071819 -11.699999809265137 +2013-07-25T20:38:23.000Z +-75.302873 40.071821 -10.300000190734863 +2013-07-25T20:38:24.000Z +-75.302912 40.071825 -10.199999809265137 +2013-07-25T20:38:25.000Z +-75.30297 40.071842 -13.699999809265137 +2013-07-25T20:38:26.000Z +-75.303032 40.071858 -16.0 +2013-07-25T20:38:27.000Z +-75.303097 40.07187 -14.300000190734863 +2013-07-25T20:38:28.000Z +-75.303168 40.071882 -14.899999618530273 +2013-07-25T20:38:29.000Z +-75.30324 40.071887 -15.300000190734863 +2013-07-25T20:38:30.000Z +-75.303401 40.071773 -10.899999618530273 +2013-07-25T20:38:31.000Z +-75.303473 40.071747 -10.100000381469727 +2013-07-25T20:38:32.000Z +-75.303537 40.071706 -7.900000095367432 +2013-07-25T20:38:33.000Z +-75.303606 40.071691 -7.800000190734863 +2013-07-25T20:38:34.000Z +-75.303677 40.071653 -7.400000095367432 +2013-07-25T20:38:35.000Z +-75.303719 40.07164 -4.800000190734863 +2013-07-25T20:38:36.000Z +-75.303768 40.07165 -4.5 +2013-07-25T20:38:37.000Z +-75.303839 40.071646 -4.400000095367432 +2013-07-25T20:38:38.000Z +-75.303885 40.071636 -3.4000000953674316 +2013-07-25T20:38:39.000Z +-75.303969 40.071633 -4.5 +2013-07-25T20:38:40.000Z +-75.304041 40.07163 -5.699999809265137 +2013-07-25T20:38:41.000Z +-75.304098 40.071626 -6.800000190734863 +2013-07-25T20:38:42.000Z +-75.304139 40.071613 -6.800000190734863 +2013-07-25T20:38:43.000Z +-75.304196 40.07161 -7.599999904632568 +2013-07-25T20:38:44.000Z +-75.304249 40.071605 -6.699999809265137 +2013-07-25T20:38:45.000Z +-75.3043 40.071602 -6.400000095367432 +2013-07-25T20:38:46.000Z +-75.304348 40.071596 -5.900000095367432 +2013-07-25T20:38:47.000Z +-75.304396 40.071591 -5.5 +2013-07-25T20:38:48.000Z +-75.304448 40.071588 -6.5 +2013-07-25T20:38:49.000Z +-75.3045 40.071585 -6.699999809265137 +2013-07-25T20:38:50.000Z +-75.304549 40.071581 -7.099999904632568 +2013-07-25T20:38:51.000Z +-75.304599 40.071578 -7.699999809265137 +2013-07-25T20:38:52.000Z +-75.304651 40.071576 -8.199999809265137 +2013-07-25T20:38:53.000Z +-75.304699 40.071576 -9.399999618530273 +2013-07-25T20:38:54.000Z +-75.304746 40.071579 -9.899999618530273 +2013-07-25T20:38:55.000Z +-75.304794 40.071582 -10.600000381469727 +2013-07-25T20:38:56.000Z +-75.304843 40.071586 -10.300000190734863 +2013-07-25T20:38:57.000Z +-75.304889 40.071586 -10.800000190734863 +2013-07-25T20:38:58.000Z +-75.304938 40.071585 -11.5 +2013-07-25T20:38:59.000Z +-75.304985 40.071583 -11.600000381469727 +2013-07-25T20:39:00.000Z +-75.305033 40.071582 -11.699999809265137 +2013-07-25T20:39:01.000Z +-75.305079 40.071582 -11.100000381469727 +2013-07-25T20:39:02.000Z +-75.305124 40.071582 -10.699999809265137 +2013-07-25T20:39:03.000Z +-75.305175 40.071583 -10.699999809265137 +2013-07-25T20:39:04.000Z +-75.305227 40.07158 -10.399999618530273 +2013-07-25T20:39:05.000Z +-75.305276 40.071578 -10.800000190734863 +2013-07-25T20:39:06.000Z +-75.305322 40.071574 -9.199999809265137 +2013-07-25T20:39:07.000Z +-75.30537 40.071572 -8.5 +2013-07-25T20:39:08.000Z +-75.305424 40.07157 -8.600000381469727 +2013-07-25T20:39:09.000Z +-75.305475 40.07157 -7.5 +2013-07-25T20:39:10.000Z +-75.305528 40.071574 -8.399999618530273 +2013-07-25T20:39:11.000Z +-75.305578 40.071577 -7.699999809265137 +2013-07-25T20:39:12.000Z +-75.305629 40.071579 -6.599999904632568 +2013-07-25T20:39:13.000Z +-75.305679 40.071585 -6.5 +2013-07-25T20:39:14.000Z +-75.305728 40.071591 -6.199999809265137 +2013-07-25T20:39:15.000Z +-75.305773 40.071596 -5.400000095367432 +2013-07-25T20:39:16.000Z +-75.305821 40.071601 -6.099999904632568 +2013-07-25T20:39:17.000Z +-75.305867 40.071606 -6.300000190734863 +2013-07-25T20:39:18.000Z +-75.305912 40.071612 -5.599999904632568 +2013-07-25T20:39:19.000Z +-75.305957 40.07162 -5.599999904632568 +2013-07-25T20:39:20.000Z +-75.306004 40.07163 -6.400000095367432 +2013-07-25T20:39:21.000Z +-75.306048 40.071642 -7.0 +2013-07-25T20:39:22.000Z +-75.306092 40.071654 -7.099999904632568 +2013-07-25T20:39:22.999Z +-75.306138 40.071663 -7.400000095367432 +2013-07-25T20:39:24.000Z +-75.306185 40.071679 -6.300000190734863 +2013-07-25T20:39:25.000Z +-75.306228 40.071691 -6.400000095367432 +2013-07-25T20:39:26.000Z +-75.306274 40.071701 -6.199999809265137 +2013-07-25T20:39:27.000Z +-75.306312 40.071717 -5.199999809265137 +2013-07-25T20:39:27.999Z +-75.306355 40.071728 -4.400000095367432 +2013-07-25T20:39:29.000Z +-75.306391 40.071744 -3.799999952316284 +2013-07-25T20:39:30.000Z +-75.306429 40.071755 -3.299999952316284 +2013-07-25T20:39:31.000Z +-75.306363 40.071733 6.900000095367432 +2013-07-25T20:39:33.000Z +-75.306374 40.071723 11.699999809265137 +2013-07-25T20:39:34.000Z +-75.306452 40.07173 10.699999809265137 +2013-07-25T20:39:35.000Z +-75.30649 40.071732 12.0 +2013-07-25T20:39:36.000Z +-75.306537 40.071738 13.100000381469727 +2013-07-25T20:39:37.000Z +-75.306599 40.071741 13.399999618530273 +2013-07-25T20:39:38.000Z +-75.306653 40.071745 14.699999809265137 +2013-07-25T20:39:39.000Z +-75.306715 40.07176 14.5 +2013-07-25T20:39:40.000Z +-75.306784 40.07176 14.199999809265137 +2013-07-25T20:39:41.000Z +-75.30683 40.071779 15.600000381469727 +2013-07-25T20:39:42.000Z +-75.306882 40.071797 16.399999618530273 +2013-07-25T20:39:43.000Z +-75.306934 40.071818 14.800000190734863 +2013-07-25T20:39:44.000Z +-75.306987 40.071844 13.100000381469727 +2013-07-25T20:39:45.000Z +-75.307042 40.071863 11.899999618530273 +2013-07-25T20:39:45.999Z +-75.307104 40.071878 11.199999809265137 +2013-07-25T20:39:47.000Z +-75.307166 40.071886 11.699999809265137 +2013-07-25T20:39:48.000Z +-75.307225 40.071892 11.5 +2013-07-25T20:39:49.000Z +-75.307282 40.071897 10.800000190734863 +2013-07-25T20:39:50.000Z +-75.307342 40.071906 9.399999618530273 +2013-07-25T20:39:51.000Z +-75.307392 40.071916 9.399999618530273 +2013-07-25T20:39:52.000Z +-75.307466 40.071932 8.600000381469727 +2013-07-25T20:39:53.000Z +-75.307524 40.071948 8.899999618530273 +2013-07-25T20:39:54.000Z +-75.307581 40.071967 7.800000190734863 +2013-07-25T20:39:55.000Z +-75.30764 40.071985 8.100000381469727 +2013-07-25T20:39:56.000Z +-75.307731 40.072012 6.900000095367432 +2013-07-25T20:39:57.000Z +-75.307789 40.072019 6.400000095367432 +2013-07-25T20:39:58.001Z +-75.307841 40.072033 6.400000095367432 +2013-07-25T20:39:59.001Z +-75.307886 40.072047 6.699999809265137 +2013-07-25T20:40:01.000Z +-75.307904 40.072075 8.5 +2013-07-25T20:40:02.000Z +-75.307979 40.072101 11.0 +2013-07-25T20:40:03.000Z +-75.308065 40.072115 11.0 +2013-07-25T20:40:04.000Z +-75.308184 40.072152 8.800000190734863 +2013-07-25T20:40:05.000Z +-75.308257 40.072173 8.199999809265137 +2013-07-25T20:40:06.000Z +-75.308306 40.072193 7.5 +2013-07-25T20:40:07.000Z +-75.308393 40.072219 6.400000095367432 +2013-07-25T20:40:08.000Z +-75.308448 40.072241 6.5 +2013-07-25T20:40:09.000Z +-75.308506 40.072272 6.5 +2013-07-25T20:40:10.000Z +-75.308557 40.072287 6.400000095367432 +2013-07-25T20:40:11.000Z +-75.308634 40.0723 6.300000190734863 +2013-07-25T20:40:12.000Z +-75.308711 40.072319 6.599999904632568 +2013-07-25T20:40:13.000Z +-75.308774 40.072336 6.5 +2013-07-25T20:40:14.000Z +-75.308829 40.072355 6.5 +2013-07-25T20:40:15.000Z +-75.308874 40.072441 -0.30000001192092896 +2013-07-25T20:40:16.000Z +-75.308923 40.072452 -1.5 +2013-07-25T20:40:17.000Z +-75.308973 40.072458 -1.7000000476837158 +2013-07-25T20:40:18.000Z +-75.30901 40.072463 -1.7999999523162842 +2013-07-25T20:40:19.000Z +-75.309049 40.072486 -3.0999999046325684 +2013-07-25T20:40:20.000Z +-75.309103 40.072524 -2.9000000953674316 +2013-07-25T20:40:21.000Z +-75.30916 40.072545 -2.799999952316284 +2013-07-25T20:40:22.000Z +-75.309205 40.072552 -0.800000011920929 +2013-07-25T20:40:23.000Z +-75.309246 40.072575 -0.6000000238418579 +2013-07-25T20:40:24.000Z +-75.309288 40.072607 -0.30000001192092896 +2013-07-25T20:40:25.000Z +-75.309338 40.072632 -1.0 +2013-07-25T20:40:26.000Z +-75.309392 40.072665 -2.0 +2013-07-25T20:40:27.000Z +-75.309441 40.072692 -2.0 +2013-07-25T20:40:28.000Z +-75.309489 40.072718 -2.0999999046325684 +2013-07-25T20:40:29.000Z +-75.309537 40.072734 -1.5 +2013-07-25T20:40:30.000Z +-75.309575 40.07275 -1.5 +2013-07-25T20:40:31.000Z +-75.309614 40.072777 -1.600000023841858 +2013-07-25T20:40:32.000Z +-75.309671 40.072799 -2.299999952316284 +2013-07-25T20:40:33.000Z +-75.309709 40.072814 -1.7999999523162842 +2013-07-25T20:40:34.000Z +-75.309749 40.072834 -1.600000023841858 +2013-07-25T20:40:35.000Z +-75.309793 40.072844 -1.600000023841858 +2013-07-25T20:40:36.000Z +-75.309836 40.072867 -2.700000047683716 +2013-07-25T20:40:37.000Z +-75.309878 40.072886 -3.0 +2013-07-25T20:40:38.000Z +-75.309922 40.072904 -1.899999976158142 +2013-07-25T20:40:39.000Z +-75.309965 40.072922 -2.200000047683716 +2013-07-25T20:40:40.000Z +-75.310007 40.072939 -1.100000023841858 +2013-07-25T20:40:41.000Z +-75.310043 40.072954 -1.2999999523162842 +2013-07-25T20:40:42.000Z +-75.310078 40.072973 -1.7000000476837158 +2013-07-25T20:40:43.000Z +-75.310111 40.072993 -1.0 +2013-07-25T20:40:44.000Z +-75.310145 40.073013 -0.30000001192092896 +2013-07-25T20:40:45.000Z +-75.310178 40.073032 0.8999999761581421 +2013-07-25T20:40:46.000Z +-75.310209 40.07305 1.7000000476837158 +2013-07-25T20:40:47.000Z +-75.310242 40.073069 1.399999976158142 +2013-07-25T20:40:48.000Z +-75.310275 40.073091 2.5 +2013-07-25T20:40:49.000Z +-75.310314 40.073114 2.700000047683716 +2013-07-25T20:40:50.000Z +-75.310355 40.073133 5.5 +2013-07-25T20:40:51.000Z +-75.310398 40.073154 4.900000095367432 +2013-07-25T20:40:52.000Z +-75.310443 40.073182 5.199999809265137 +2013-07-25T20:40:53.000Z +-75.310487 40.073211 4.800000190734863 +2013-07-25T20:40:54.000Z +-75.310532 40.073242 5.699999809265137 +2013-07-25T20:40:55.000Z +-75.310574 40.073268 7.199999809265137 +2013-07-25T20:40:56.000Z +-75.310614 40.073289 8.899999618530273 +2013-07-25T20:40:57.000Z +-75.310652 40.073309 8.300000190734863 +2013-07-25T20:40:58.000Z +-75.310687 40.07333 8.300000190734863 +2013-07-25T20:40:59.000Z +-75.31073 40.073351 8.5 +2013-07-25T20:41:00.000Z +-75.310772 40.073373 8.5 +2013-07-25T20:41:01.000Z +-75.310808 40.073396 8.5 +2013-07-25T20:41:02.000Z +-75.310845 40.073419 7.300000190734863 +2013-07-25T20:41:03.000Z +-75.310879 40.073443 7.099999904632568 +2013-07-25T20:41:04.000Z +-75.310913 40.073469 6.900000095367432 +2013-07-25T20:41:05.000Z +-75.310948 40.073489 7.699999809265137 +2013-07-25T20:41:06.000Z +-75.310981 40.073506 8.800000190734863 +2013-07-25T20:41:07.000Z +-75.311014 40.073522 10.0 +2013-07-25T20:41:08.000Z +-75.311046 40.073538 10.600000381469727 +2013-07-25T20:41:09.000Z +-75.311075 40.073554 10.699999809265137 +2013-07-25T20:41:10.000Z +-75.311108 40.073575 10.300000190734863 +2013-07-25T20:41:11.000Z +-75.311138 40.073602 9.5 +2013-07-25T20:41:12.000Z +-75.311176 40.073634 8.0 +2013-07-25T20:41:13.000Z +-75.311244 40.073687 6.900000095367432 +2013-07-25T20:41:14.000Z +-75.311296 40.073724 7.199999809265137 +2013-07-25T20:41:15.000Z +-75.311347 40.073758 6.900000095367432 +2013-07-25T20:41:16.000Z +-75.311394 40.073789 6.900000095367432 +2013-07-25T20:41:17.000Z +-75.311449 40.073828 5.900000095367432 +2013-07-25T20:41:18.000Z +-75.311497 40.073868 7.400000095367432 +2013-07-25T20:41:19.000Z +-75.311549 40.073931 4.300000190734863 +2013-07-25T20:41:20.000Z +-75.311592 40.073966 3.799999952316284 +2013-07-25T20:41:21.000Z +-75.311615 40.073987 3.9000000953674316 +2013-07-25T20:41:22.000Z +-75.311651 40.074017 3.700000047683716 +2013-07-25T20:41:23.000Z +-75.31168 40.074054 3.0 +2013-07-25T20:41:24.000Z +-75.311708 40.074085 2.0999999046325684 +2013-07-25T20:41:25.000Z +-75.311737 40.074113 1.5 +2013-07-25T20:41:26.000Z +-75.311764 40.074145 0.6000000238418579 +2013-07-25T20:41:27.000Z +-75.311781 40.074177 0.20000000298023224 +2013-07-25T20:41:28.000Z +-75.311799 40.074214 0.6000000238418579 +2013-07-25T20:41:29.000Z +-75.31181 40.074248 0.6000000238418579 +2013-07-25T20:41:30.000Z +-75.311816 40.074283 0.6000000238418579 +2013-07-25T20:41:31.000Z +-75.31182 40.074319 1.7999999523162842 +2013-07-25T20:41:32.000Z +-75.31182 40.074354 2.700000047683716 +2013-07-25T20:41:33.000Z +-75.311816 40.074387 4.0 +2013-07-25T20:41:34.000Z +-75.311814 40.074421 4.199999809265137 +2013-07-25T20:41:35.000Z +-75.311811 40.074458 4.699999809265137 +2013-07-25T20:41:36.000Z +-75.311808 40.074496 5.300000190734863 +2013-07-25T20:41:37.000Z +-75.311806 40.074531 5.900000095367432 +2013-07-25T20:41:38.000Z +-75.311804 40.074567 5.800000190734863 +2013-07-25T20:41:39.000Z +-75.311804 40.074602 5.599999904632568 +2013-07-25T20:41:40.000Z +-75.311803 40.074637 6.0 +2013-07-25T20:41:41.000Z +-75.311803 40.074666 6.199999809265137 +2013-07-25T20:41:42.000Z +-75.311804 40.074692 6.800000190734863 +2013-07-25T20:41:44.000Z +-75.311817 40.074735 8.800000190734863 +2013-07-25T20:41:45.000Z +-75.311825 40.074753 9.300000190734863 +2013-07-25T20:41:47.000Z +-75.311842 40.074794 9.600000381469727 +2013-07-25T20:41:48.000Z +-75.311851 40.074817 8.800000190734863 +2013-07-25T20:41:50.000Z +-75.311869 40.074856 9.800000190734863 +2013-07-25T20:41:51.000Z +-75.311876 40.07487 10.699999809265137 +2013-07-25T20:41:54.000Z +-75.311896 40.074905 12.199999809265137 +2013-07-25T20:41:55.000Z +-75.311905 40.074919 11.0 +2013-07-25T20:41:56.000Z +-75.311918 40.074937 11.699999809265137 +2013-07-25T20:41:57.000Z +-75.311933 40.074959 10.899999618530273 +2013-07-25T20:41:58.000Z +-75.311952 40.074985 11.199999809265137 +2013-07-25T20:41:59.000Z +-75.311969 40.075011 11.399999618530273 +2013-07-25T20:42:00.000Z +-75.311982 40.075039 12.399999618530273 +2013-07-25T20:42:01.000Z +-75.311987 40.075067 13.600000381469727 +2013-07-25T20:42:02.000Z +-75.311987 40.075096 14.100000381469727 +2013-07-25T20:42:03.000Z +-75.311976 40.075124 13.5 +2013-07-25T20:42:04.000Z +-75.311959 40.075152 13.5 +2013-07-25T20:42:05.000Z +-75.311939 40.075178 13.0 +2013-07-25T20:42:06.000Z +-75.311919 40.075204 12.899999618530273 +2013-07-25T20:42:07.000Z +-75.311904 40.075231 12.899999618530273 +2013-07-25T20:42:08.000Z +-75.3119 40.07526 12.699999809265137 +2013-07-25T20:42:09.000Z +-75.311906 40.075288 13.300000190734863 +2013-07-25T20:42:11.000Z +-75.311942 40.075318 20.100000381469727 +2013-07-25T20:42:12.000Z +-75.311965 40.075327 20.600000381469727 +2013-07-25T20:42:14.000Z +-75.312003 40.075344 22.5 +2013-07-25T20:42:15.000Z +-75.312013 40.075356 23.399999618530273 +2013-07-25T20:42:17.001Z +-75.312031 40.075384 24.299999237060547 +2013-07-25T20:42:18.000Z +-75.31203 40.075403 24.200000762939453 +2013-07-25T20:42:20.000Z +-75.312051 40.075429 25.600000381469727 +2013-07-25T20:42:21.000Z +-75.312071 40.075439 25.700000762939453 +2013-07-25T20:42:23.000Z +-75.312122 40.075458 27.200000762939453 +2013-07-25T20:42:24.000Z +-75.31215 40.075472 26.0 +2013-07-25T20:42:25.000Z +-75.312174 40.075494 23.799999237060547 +2013-07-25T20:42:26.000Z +-75.312198 40.075523 22.5 +2013-07-25T20:42:27.000Z +-75.312221 40.075552 22.299999237060547 +2013-07-25T20:42:28.000Z +-75.312247 40.075575 22.600000381469727 +2013-07-25T20:42:29.000Z +-75.312275 40.075591 22.600000381469727 +2013-07-25T20:42:30.000Z +-75.312307 40.075604 22.200000762939453 +2013-07-25T20:42:31.000Z +-75.312344 40.075617 20.5 +2013-07-25T20:42:32.000Z +-75.312381 40.075632 20.100000381469727 +2013-07-25T20:42:33.000Z +-75.312416 40.075647 19.0 +2013-07-25T20:42:34.000Z +-75.312451 40.075661 19.0 +2013-07-25T20:42:35.000Z +-75.312484 40.075677 18.399999618530273 +2013-07-25T20:42:36.000Z +-75.312511 40.075696 15.699999809265137 +2013-07-25T20:42:37.000Z +-75.312535 40.075715 14.699999809265137 +2013-07-25T20:42:38.000Z +-75.312561 40.075734 14.300000190734863 +2013-07-25T20:42:39.000Z +-75.312588 40.075753 14.399999618530273 +2013-07-25T20:42:40.000Z +-75.312622 40.075773 14.399999618530273 +2013-07-25T20:42:41.000Z +-75.312656 40.075791 14.0 +2013-07-25T20:42:42.000Z +-75.31269 40.075807 13.899999618530273 +2013-07-25T20:42:43.000Z +-75.312724 40.075823 13.5 +2013-07-25T20:42:44.000Z +-75.31276 40.075838 13.300000190734863 +2013-07-25T20:42:45.000Z +-75.312793 40.075849 14.199999809265137 +2013-07-25T20:42:46.000Z +-75.312825 40.075858 16.299999237060547 +2013-07-25T20:42:47.000Z +-75.312857 40.07587 14.399999618530273 +2013-07-25T20:42:48.000Z +-75.31289 40.075885 13.699999809265137 +2013-07-25T20:42:49.000Z +-75.312921 40.075901 14.199999809265137 +2013-07-25T20:42:50.001Z +-75.31295 40.075916 15.0 +2013-07-25T20:42:51.000Z +-75.312983 40.075936 15.899999618530273 +2013-07-25T20:42:52.000Z +-75.313011 40.075955 16.399999618530273 +2013-07-25T20:42:53.000Z +-75.313032 40.075975 16.799999237060547 +2013-07-25T20:42:54.000Z +-75.313045 40.076 16.299999237060547 +2013-07-25T20:42:56.000Z +-75.313041 40.076042 18.0 +2013-07-25T20:42:57.000Z +-75.313036 40.07606 19.600000381469727 +2013-07-25T20:42:58.000Z +-75.313011 40.076082 16.799999237060547 +2013-07-25T20:42:59.000Z +-75.312995 40.076106 16.200000762939453 +2013-07-25T20:43:00.000Z +-75.312983 40.076133 16.100000381469727 +2013-07-25T20:43:01.000Z +-75.312972 40.076158 15.600000381469727 +2013-07-25T20:43:02.000Z +-75.31296 40.076184 15.100000381469727 +2013-07-25T20:43:03.000Z +-75.312948 40.076207 15.800000190734863 +2013-07-25T20:43:04.000Z +-75.312937 40.076229 16.899999618530273 +2013-07-25T20:43:05.000Z +-75.312923 40.07625 16.200000762939453 +2013-07-25T20:43:06.000Z +-75.312907 40.076271 16.100000381469727 +2013-07-25T20:43:07.000Z +-75.312887 40.076295 16.799999237060547 +2013-07-25T20:43:08.000Z +-75.312861 40.07632 16.399999618530273 +2013-07-25T20:43:09.000Z +-75.312835 40.076341 15.5 +2013-07-25T20:43:10.000Z +-75.31281 40.076362 14.199999809265137 +2013-07-25T20:43:11.000Z +-75.312796 40.076386 14.0 +2013-07-25T20:43:12.000Z +-75.312796 40.076413 13.300000190734863 +2013-07-25T20:43:13.000Z +-75.312806 40.076436 14.0 +2013-07-25T20:43:17.000Z +-75.312778 40.076469 18.600000381469727 +2013-07-25T20:43:18.000Z +-75.312756 40.076463 18.700000762939453 +2013-07-25T20:43:19.000Z +-75.312735 40.076461 20.299999237060547 +2013-07-25T20:43:20.000Z +-75.312707 40.076432 17.5 +2013-07-25T20:43:21.000Z +-75.312682 40.076407 17.200000762939453 +2013-07-25T20:43:22.000Z +-75.312654 40.076375 16.700000762939453 +2013-07-25T20:43:23.000Z +-75.31262 40.076345 14.5 +2013-07-25T20:43:24.000Z +-75.312589 40.076318 12.5 +2013-07-25T20:43:25.000Z +-75.312528 40.0763 11.399999618530273 +2013-07-25T20:43:26.000Z +-75.312481 40.076286 10.199999809265137 +2013-07-25T20:43:26.999Z +-75.312436 40.076271 9.699999809265137 +2013-07-25T20:43:28.000Z +-75.312436 40.07633 8.800000190734863 +2013-07-25T20:43:29.000Z +-75.31244 40.076374 8.300000190734863 +2013-07-25T20:43:30.000Z +-75.312452 40.076426 7.400000095367432 +2013-07-25T20:43:31.000Z +-75.312464 40.076478 6.800000190734863 +2013-07-25T20:43:32.000Z +-75.312472 40.076527 6.400000095367432 +2013-07-25T20:43:33.000Z +-75.312478 40.07657 6.5 +2013-07-25T20:43:34.000Z +-75.312482 40.07661 6.400000095367432 +2013-07-25T20:43:35.000Z +-75.312488 40.076648 6.0 +2013-07-25T20:43:36.000Z +-75.312496 40.076685 6.300000190734863 +2013-07-25T20:43:37.000Z +-75.312498 40.076717 6.300000190734863 +2013-07-25T20:43:38.000Z +-75.312511 40.07674 6.5 +2013-07-25T20:43:40.000Z +-75.312514 40.076784 7.699999809265137 +2013-07-25T20:43:41.000Z +-75.3125 40.076791 8.300000190734863 +2013-07-25T20:43:43.000Z +-75.312486 40.076825 8.800000190734863 +2013-07-25T20:43:44.000Z +-75.312482 40.076846 8.399999618530273 +2013-07-25T20:43:45.000Z +-75.31248 40.076868 8.0 +2013-07-25T20:43:46.000Z +-75.312477 40.076893 7.599999904632568 +2013-07-25T20:43:47.000Z +-75.312471 40.076925 6.199999809265137 +2013-07-25T20:43:48.000Z +-75.312479 40.076957 7.400000095367432 +2013-07-25T20:43:49.000Z +-75.312488 40.077001 7.099999904632568 +2013-07-25T20:43:50.000Z +-75.312508 40.077051 6.400000095367432 +2013-07-25T20:43:51.000Z +-75.312539 40.077106 5.900000095367432 +2013-07-25T20:43:52.000Z +-75.312573 40.077166 7.5 +2013-07-25T20:43:53.000Z +-75.312602 40.07722 9.199999809265137 +2013-07-25T20:43:54.000Z +-75.312634 40.077273 9.300000190734863 +2013-07-25T20:43:55.000Z +-75.312664 40.077322 9.800000190734863 +2013-07-25T20:43:56.000Z +-75.312694 40.077367 9.399999618530273 +2013-07-25T20:43:57.000Z +-75.312727 40.077412 8.100000381469727 +2013-07-25T20:43:58.000Z +-75.312758 40.077455 8.399999618530273 +2013-07-25T20:43:59.000Z +-75.312788 40.077498 8.699999809265137 +2013-07-25T20:44:00.000Z +-75.312815 40.077544 9.399999618530273 +2013-07-25T20:44:01.000Z +-75.312836 40.077585 11.600000381469727 +2013-07-25T20:44:02.000Z +-75.312853 40.077626 11.699999809265137 +2013-07-25T20:44:03.000Z +-75.312868 40.077671 9.800000190734863 +2013-07-25T20:44:04.000Z +-75.312846 40.077783 2.700000047683716 +2013-07-25T20:44:05.000Z +-75.312827 40.077835 2.5 +2013-07-25T20:44:07.000Z +-75.312856 40.077866 3.4000000953674316 +2013-07-25T20:44:08.000Z +-75.31286 40.077887 3.4000000953674316 +2013-07-25T20:44:09.000Z +-75.312859 40.077906 3.700000047683716 +2013-07-25T20:44:10.000Z +-75.312864 40.077935 4.599999904632568 +2013-07-25T20:44:11.000Z +-75.312878 40.077967 5.5 +2013-07-25T20:44:12.000Z +-75.312895 40.078014 6.699999809265137 +2013-07-25T20:44:13.000Z +-75.31293 40.078085 6.099999904632568 +2013-07-25T20:44:14.000Z +-75.312957 40.078144 6.699999809265137 +2013-07-25T20:44:15.000Z +-75.312969 40.078182 8.800000190734863 +2013-07-25T20:44:16.000Z +-75.312977 40.078225 10.300000190734863 +2013-07-25T20:44:17.000Z +-75.312978 40.078264 10.100000381469727 +2013-07-25T20:44:18.000Z +-75.31298 40.078302 13.0 +2013-07-25T20:44:19.000Z +-75.31298 40.078342 13.300000190734863 +2013-07-25T20:44:20.000Z +-75.312983 40.078385 13.300000190734863 +2013-07-25T20:44:21.000Z +-75.312973 40.07846 9.600000381469727 +2013-07-25T20:44:22.000Z +-75.312972 40.078493 10.899999618530273 +2013-07-25T20:44:23.000Z +-75.31297 40.078531 11.0 +2013-07-25T20:44:24.000Z +-75.312972 40.078557 11.399999618530273 +2013-07-25T20:44:25.000Z +-75.312946 40.078596 12.600000381469727 +2013-07-25T20:44:26.000Z +-75.312942 40.078655 10.600000381469727 +2013-07-25T20:44:27.000Z +-75.312933 40.078709 8.800000190734863 +2013-07-25T20:44:28.000Z +-75.312936 40.078758 8.600000381469727 +2013-07-25T20:44:29.000Z +-75.312937 40.078804 8.800000190734863 +2013-07-25T20:44:30.000Z +-75.312958 40.078834 11.600000381469727 +2013-07-25T20:44:31.000Z +-75.312948 40.078878 12.5 +2013-07-25T20:44:32.000Z +-75.312943 40.078922 13.0 +2013-07-25T20:44:33.000Z +-75.312937 40.078968 14.399999618530273 +2013-07-25T20:44:34.000Z +-75.312936 40.079015 14.699999809265137 +2013-07-25T20:44:35.000Z +-75.312881 40.079063 12.600000381469727 +2013-07-25T20:44:36.000Z +-75.312873 40.079105 13.600000381469727 +2013-07-25T20:44:37.000Z +-75.312866 40.079142 14.100000381469727 +2013-07-25T20:44:38.000Z +-75.312843 40.079194 12.100000381469727 +2013-07-25T20:44:39.000Z +-75.312821 40.07924 11.5 +2013-07-25T20:44:40.000Z +-75.3128 40.079285 11.199999809265137 +2013-07-25T20:44:41.000Z +-75.312782 40.079329 11.100000381469727 +2013-07-25T20:44:42.000Z +-75.312769 40.079362 11.0 +2013-07-25T20:44:43.000Z +-75.312756 40.079403 11.0 +2013-07-25T20:44:44.000Z +-75.312738 40.079444 11.0 +2013-07-25T20:44:45.000Z +-75.31271 40.079502 8.5 +2013-07-25T20:44:46.000Z +-75.312694 40.079541 9.0 +2013-07-25T20:44:47.000Z +-75.312671 40.079576 10.199999809265137 +2013-07-25T20:44:48.000Z +-75.312646 40.079595 13.399999618530273 +2013-07-25T20:44:49.000Z +-75.312617 40.079621 15.0 +2013-07-25T20:44:50.000Z +-75.312592 40.079638 15.899999618530273 +2013-07-25T20:44:51.000Z +-75.312566 40.079661 16.399999618530273 +2013-07-25T20:44:52.000Z +-75.312541 40.079677 16.399999618530273 +2013-07-25T20:44:53.000Z +-75.312568 40.079722 16.799999237060547 +2013-07-25T20:44:54.000Z +-75.312519 40.079792 15.100000381469727 +2013-07-25T20:44:55.000Z +-75.312486 40.079846 12.5 +2013-07-25T20:44:56.000Z +-75.312461 40.079897 12.899999618530273 +2013-07-25T20:44:57.000Z +-75.312434 40.079945 13.300000190734863 +2013-07-25T20:44:58.000Z +-75.312419 40.079986 18.5 +2013-07-25T20:44:59.000Z +-75.312411 40.080028 18.700000762939453 +2013-07-25T20:45:00.000Z +-75.312405 40.080071 19.200000762939453 +2013-07-25T20:45:01.000Z +-75.3124 40.080112 19.200000762939453 +2013-07-25T20:45:02.000Z +-75.31239 40.080153 19.799999237060547 +2013-07-25T20:45:03.000Z +-75.312375 40.080195 20.100000381469727 +2013-07-25T20:45:04.000Z +-75.312354 40.080238 20.399999618530273 +2013-07-25T20:45:05.000Z +-75.312329 40.080278 20.0 +2013-07-25T20:45:06.000Z +-75.312301 40.080316 19.700000762939453 +2013-07-25T20:45:07.000Z +-75.312279 40.080355 21.200000762939453 +2013-07-25T20:45:08.000Z +-75.312261 40.080397 22.0 +2013-07-25T20:45:09.000Z +-75.312248 40.080439 21.899999618530273 +2013-07-25T20:45:10.000Z +-75.312224 40.080491 20.899999618530273 +2013-07-25T20:45:11.000Z +-75.312207 40.080538 20.899999618530273 +2013-07-25T20:45:12.000Z +-75.312191 40.080587 20.0 +2013-07-25T20:45:13.000Z +-75.312175 40.080635 19.100000381469727 +2013-07-25T20:45:14.000Z +-75.312157 40.080683 18.399999618530273 +2013-07-25T20:45:15.000Z +-75.31214 40.080728 17.5 +2013-07-25T20:45:16.000Z +-75.312123 40.080779 17.100000381469727 +2013-07-25T20:45:17.000Z +-75.312109 40.080825 16.5 +2013-07-25T20:45:18.000Z +-75.312097 40.080878 14.5 +2013-07-25T20:45:19.000Z +-75.312089 40.080916 14.699999809265137 +2013-07-25T20:45:20.000Z +-75.312078 40.08096 15.399999618530273 +2013-07-25T20:45:21.000Z +-75.312067 40.080997 15.600000381469727 +2013-07-25T20:45:22.000Z +-75.312054 40.081025 15.800000190734863 +2013-07-25T20:45:23.000Z +-75.312041 40.081058 15.199999809265137 +2013-07-25T20:45:24.000Z +-75.312019 40.081095 13.899999618530273 +2013-07-25T20:45:25.000Z +-75.312003 40.081132 13.5 +2013-07-25T20:45:26.000Z +-75.311988 40.081209 15.199999809265137 +2013-07-25T20:45:27.000Z +-75.311976 40.081271 13.600000381469727 +2013-07-25T20:45:28.000Z +-75.311958 40.081316 13.899999618530273 +2013-07-25T20:45:29.000Z +-75.31195 40.081358 14.199999809265137 +2013-07-25T20:45:30.000Z +-75.311926 40.081423 11.600000381469727 +2013-07-25T20:45:31.000Z +-75.311914 40.081472 11.5 +2013-07-25T20:45:32.000Z +-75.311914 40.081523 11.399999618530273 +2013-07-25T20:45:33.000Z +-75.311905 40.081581 10.300000190734863 +2013-07-25T20:45:34.000Z +-75.3119 40.081626 10.300000190734863 +2013-07-25T20:45:35.000Z +-75.311894 40.081681 9.100000381469727 +2013-07-25T20:45:36.000Z +-75.3119 40.081728 10.0 +2013-07-25T20:45:37.000Z +-75.311899 40.081779 9.399999618530273 +2013-07-25T20:45:38.000Z +-75.311891 40.081827 9.399999618530273 +2013-07-25T20:45:39.000Z +-75.31188 40.081878 8.600000381469727 +2013-07-25T20:45:40.000Z +-75.311876 40.081929 8.199999809265137 +2013-07-25T20:45:41.000Z +-75.31187 40.081977 8.199999809265137 +2013-07-25T20:45:42.000Z +-75.311865 40.082023 8.199999809265137 +2013-07-25T20:45:43.000Z +-75.311854 40.082069 8.300000190734863 +2013-07-25T20:45:44.000Z +-75.311847 40.082121 8.100000381469727 +2013-07-25T20:45:45.000Z +-75.311842 40.082171 7.5 +2013-07-25T20:45:46.000Z +-75.311839 40.082217 7.5 +2013-07-25T20:45:47.000Z +-75.311836 40.082265 7.599999904632568 +2013-07-25T20:45:48.000Z +-75.31183 40.082311 7.5 +2013-07-25T20:45:49.000Z +-75.311837 40.082345 8.399999618530273 +2013-07-25T20:45:50.000Z +-75.31183 40.082386 7.800000190734863 +2013-07-25T20:45:52.000Z +-75.311825 40.082423 7.599999904632568 +2013-07-25T20:45:53.000Z +-75.311883 40.082466 8.899999618530273 +2013-07-25T20:45:54.000Z +-75.311874 40.082525 10.699999809265137 +2013-07-25T20:45:55.000Z +-75.311848 40.082575 10.800000190734863 +2013-07-25T20:45:56.000Z +-75.311842 40.082626 11.199999809265137 +2013-07-25T20:45:57.000Z +-75.311841 40.082681 12.199999809265137 +2013-07-25T20:45:58.000Z +-75.311837 40.082723 12.100000381469727 +2013-07-25T20:45:59.000Z +-75.311826 40.082787 12.399999618530273 +2013-07-25T20:46:00.000Z +-75.311829 40.082801 13.800000190734863 +2013-07-25T20:46:01.000Z +-75.311819 40.082844 14.100000381469727 +2013-07-25T20:46:02.000Z +-75.311807 40.082881 13.800000190734863 +2013-07-25T20:46:03.000Z +-75.311797 40.0829 12.199999809265137 +2013-07-25T20:46:04.000Z +-75.311796 40.082926 11.5 +2013-07-25T20:46:05.000Z +-75.311775 40.082944 10.800000190734863 +2013-07-25T20:46:06.000Z +-75.311797 40.08297 12.300000190734863 +2013-07-25T20:46:07.000Z +-75.311822 40.08301 13.800000190734863 +2013-07-25T20:46:08.000Z +-75.311825 40.083098 15.899999618530273 +2013-07-25T20:46:09.000Z +-75.311814 40.083139 14.800000190734863 +2013-07-25T20:46:10.000Z +-75.311807 40.083188 14.600000381469727 +2013-07-25T20:46:11.000Z +-75.311797 40.083241 14.800000190734863 +2013-07-25T20:46:12.000Z +-75.311785 40.083292 14.699999809265137 +2013-07-25T20:46:13.000Z +-75.311773 40.083341 14.899999618530273 +2013-07-25T20:46:14.000Z +-75.311762 40.083387 15.199999809265137 +2013-07-25T20:46:15.000Z +-75.311751 40.083431 13.800000190734863 +2013-07-25T20:46:16.000Z +-75.311739 40.083488 15.399999618530273 +2013-07-25T20:46:17.000Z +-75.311729 40.083539 15.100000381469727 +2013-07-25T20:46:18.000Z +-75.311709 40.083588 14.699999809265137 +2013-07-25T20:46:19.000Z +-75.311693 40.083635 14.399999618530273 +2013-07-25T20:46:20.000Z +-75.311679 40.083685 14.699999809265137 +2013-07-25T20:46:21.000Z +-75.31166 40.083737 14.199999809265137 +2013-07-25T20:46:22.000Z +-75.311648 40.083782 14.0 +2013-07-25T20:46:23.000Z +-75.311637 40.083831 13.399999618530273 +2013-07-25T20:46:24.000Z +-75.311621 40.08388 13.600000381469727 +2013-07-25T20:46:25.000Z +-75.311603 40.083925 13.399999618530273 +2013-07-25T20:46:26.000Z +-75.311587 40.08397 13.199999809265137 +2013-07-25T20:46:27.000Z +-75.311573 40.084016 13.5 +2013-07-25T20:46:28.000Z +-75.311554 40.084066 13.300000190734863 +2013-07-25T20:46:29.000Z +-75.311532 40.084115 12.100000381469727 +2013-07-25T20:46:30.000Z +-75.311514 40.084161 11.899999618530273 +2013-07-25T20:46:31.000Z +-75.311526 40.084206 13.0 +2013-07-25T20:46:32.000Z +-75.311522 40.084253 13.100000381469727 +2013-07-25T20:46:33.000Z +-75.3115 40.08429 14.600000381469727 +2013-07-25T20:46:34.000Z +-75.311485 40.084337 14.699999809265137 +2013-07-25T20:46:35.000Z +-75.311474 40.084385 14.699999809265137 +2013-07-25T20:46:36.000Z +-75.31146 40.084436 13.800000190734863 +2013-07-25T20:46:37.000Z +-75.311448 40.084482 14.199999809265137 +2013-07-25T20:46:38.000Z +-75.311418 40.08453 13.100000381469727 +2013-07-25T20:46:39.000Z +-75.311403 40.084576 13.600000381469727 +2013-07-25T20:46:40.000Z +-75.311383 40.084621 13.699999809265137 +2013-07-25T20:46:41.000Z +-75.311371 40.084667 13.300000190734863 +2013-07-25T20:46:42.000Z +-75.311356 40.084712 12.800000190734863 +2013-07-25T20:46:43.000Z +-75.311341 40.084752 13.699999809265137 +2013-07-25T20:46:44.000Z +-75.311326 40.084796 12.0 +2013-07-25T20:46:45.000Z +-75.311328 40.084816 17.0 +2013-07-25T20:46:46.000Z +-75.311299 40.084864 15.199999809265137 +2013-07-25T20:46:47.000Z +-75.311292 40.0849 16.0 +2013-07-25T20:46:48.000Z +-75.311278 40.084924 18.899999618530273 +2013-07-25T20:46:49.000Z +-75.311258 40.084961 18.399999618530273 +2013-07-25T20:46:50.000Z +-75.311235 40.085018 15.199999809265137 +2013-07-25T20:46:51.000Z +-75.311209 40.085056 15.0 +2013-07-25T20:46:52.000Z +-75.311195 40.085087 18.399999618530273 +2013-07-25T20:46:53.000Z +-75.311184 40.085121 19.5 +2013-07-25T20:46:54.000Z +-75.311175 40.085152 20.200000762939453 +2013-07-25T20:46:55.000Z +-75.311173 40.085177 26.0 +2013-07-25T20:46:56.000Z +-75.311171 40.085202 28.0 +2013-07-25T20:46:58.000Z +-75.311174 40.085237 32.400001525878906 +2013-07-25T20:46:59.000Z +-75.311171 40.085259 33.0 +2013-07-25T20:47:00.000Z +-75.311169 40.085282 34.599998474121094 +2013-07-25T20:47:01.000Z +-75.311162 40.085307 35.29999923706055 +2013-07-25T20:47:02.000Z +-75.31116 40.085333 36.900001525878906 +2013-07-25T20:47:03.000Z +-75.31116 40.085361 37.5 +2013-07-25T20:47:04.000Z +-75.311152 40.085398 31.5 +2013-07-25T20:47:05.000Z +-75.311146 40.085435 31.100000381469727 +2013-07-25T20:47:06.000Z +-75.311133 40.085472 28.899999618530273 +2013-07-25T20:47:07.000Z +-75.311126 40.085518 28.0 +2013-07-25T20:47:08.000Z +-75.311121 40.085568 26.600000381469727 +2013-07-25T20:47:09.000Z +-75.311123 40.085615 26.5 +2013-07-25T20:47:10.000Z +-75.311132 40.085661 29.200000762939453 +2013-07-25T20:47:11.000Z +-75.311137 40.085705 27.799999237060547 +2013-07-25T20:47:12.000Z +-75.311138 40.085751 27.600000381469727 +2013-07-25T20:47:13.000Z +-75.311139 40.085797 26.5 +2013-07-25T20:47:14.000Z +-75.311136 40.085844 26.299999237060547 +2013-07-25T20:47:15.000Z +-75.311137 40.085893 25.5 +2013-07-25T20:47:16.000Z +-75.311142 40.085941 26.799999237060547 +2013-07-25T20:47:17.000Z +-75.311144 40.085989 25.5 +2013-07-25T20:47:18.000Z +-75.311146 40.086034 24.0 +2013-07-25T20:47:19.000Z +-75.31115 40.086079 22.799999237060547 +2013-07-25T20:47:20.000Z +-75.311155 40.086127 22.0 +2013-07-25T20:47:21.000Z +-75.311162 40.08617 23.200000762939453 +2013-07-25T20:47:22.000Z +-75.311171 40.086212 22.100000381469727 +2013-07-25T20:47:23.000Z +-75.311173 40.086257 17.0 +2013-07-25T20:47:24.000Z +-75.311174 40.086303 15.800000190734863 +2013-07-25T20:47:25.000Z +-75.311177 40.086345 15.699999809265137 +2013-07-25T20:47:26.000Z +-75.311183 40.086386 14.699999809265137 +2013-07-25T20:47:27.000Z +-75.311191 40.086427 13.5 +2013-07-25T20:47:28.000Z +-75.311198 40.086468 12.300000190734863 +2013-07-25T20:47:29.000Z +-75.311203 40.086506 11.899999618530273 +2013-07-25T20:47:30.000Z +-75.311208 40.086544 12.0 +2013-07-25T20:47:31.000Z +-75.311215 40.086578 13.199999809265137 +2013-07-25T20:47:32.000Z +-75.311222 40.086612 13.800000190734863 +2013-07-25T20:47:33.000Z +-75.311228 40.086645 12.600000381469727 +2013-07-25T20:47:34.000Z +-75.311233 40.086679 12.800000190734863 +2013-07-25T20:47:35.000Z +-75.311234 40.086716 10.600000381469727 +2013-07-25T20:47:36.000Z +-75.311234 40.086755 10.800000190734863 +2013-07-25T20:47:37.000Z +-75.311233 40.086791 10.899999618530273 +2013-07-25T20:47:38.000Z +-75.311232 40.086828 10.300000190734863 +2013-07-25T20:47:39.000Z +-75.311232 40.086863 9.600000381469727 +2013-07-25T20:47:40.000Z +-75.311232 40.0869 9.300000190734863 +2013-07-25T20:47:41.000Z +-75.311227 40.086937 5.0 +2013-07-25T20:47:42.000Z +-75.311224 40.086975 5.300000190734863 +2013-07-25T20:47:43.000Z +-75.311225 40.087012 6.699999809265137 +2013-07-25T20:47:44.000Z +-75.311227 40.08705 7.5 +2013-07-25T20:47:45.000Z +-75.311229 40.087086 6.5 +2013-07-25T20:47:46.000Z +-75.311232 40.087122 6.300000190734863 +2013-07-25T20:47:47.000Z +-75.311235 40.08716 6.400000095367432 +2013-07-25T20:47:48.000Z +-75.311237 40.087198 6.400000095367432 +2013-07-25T20:47:49.000Z +-75.311238 40.087234 5.800000190734863 +2013-07-25T20:47:50.000Z +-75.311241 40.087271 5.099999904632568 +2013-07-25T20:47:51.000Z +-75.311243 40.087307 4.400000095367432 +2013-07-25T20:47:52.000Z +-75.311245 40.087342 5.199999809265137 +2013-07-25T20:47:53.000Z +-75.311245 40.087377 4.5 +2013-07-25T20:47:54.000Z +-75.311244 40.087412 5.800000190734863 +2013-07-25T20:47:55.000Z +-75.311243 40.087448 6.599999904632568 +2013-07-25T20:47:56.000Z +-75.311242 40.087484 6.599999904632568 +2013-07-25T20:47:57.000Z +-75.31124 40.087518 6.900000095367432 +2013-07-25T20:47:58.000Z +-75.311238 40.087553 7.0 +2013-07-25T20:47:59.000Z +-75.311234 40.087587 7.400000095367432 +2013-07-25T20:48:00.000Z +-75.311228 40.087624 8.899999618530273 +2013-07-25T20:48:01.000Z +-75.311226 40.087655 11.5 +2013-07-25T20:48:02.000Z +-75.311224 40.087689 11.199999809265137 +2013-07-25T20:48:03.000Z +-75.31122 40.087723 12.0 +2013-07-25T20:48:04.000Z +-75.311215 40.087757 13.100000381469727 +2013-07-25T20:48:05.000Z +-75.311209 40.08779 13.899999618530273 +2013-07-25T20:48:06.000Z +-75.311202 40.087824 14.100000381469727 +2013-07-25T20:48:07.000Z +-75.311198 40.087858 14.800000190734863 +2013-07-25T20:48:08.000Z +-75.311195 40.087894 15.600000381469727 +2013-07-25T20:48:09.000Z +-75.311195 40.087927 16.700000762939453 +2013-07-25T20:48:10.000Z +-75.311194 40.087959 17.5 +2013-07-25T20:48:11.000Z +-75.311194 40.08799 17.899999618530273 +2013-07-25T20:48:12.000Z +-75.311194 40.088024 17.899999618530273 +2013-07-25T20:48:13.000Z +-75.311195 40.088056 17.899999618530273 +2013-07-25T20:48:14.000Z +-75.311199 40.088091 18.0 +2013-07-25T20:48:15.000Z +-75.311206 40.088125 18.5 +2013-07-25T20:48:16.000Z +-75.311211 40.088163 16.399999618530273 +2013-07-25T20:48:17.000Z +-75.311216 40.088197 16.5 +2013-07-25T20:48:18.000Z +-75.311219 40.088229 16.899999618530273 +2013-07-25T20:48:19.000Z +-75.311221 40.088261 17.700000762939453 +2013-07-25T20:48:20.000Z +-75.311226 40.088296 17.200000762939453 +2013-07-25T20:48:21.000Z +-75.311232 40.08833 16.299999237060547 +2013-07-25T20:48:22.000Z +-75.311241 40.088367 16.5 +2013-07-25T20:48:23.000Z +-75.31125 40.088404 17.5 +2013-07-25T20:48:24.000Z +-75.311259 40.088441 18.399999618530273 +2013-07-25T20:48:25.000Z +-75.311267 40.088476 18.200000762939453 +2013-07-25T20:48:26.000Z +-75.311275 40.088513 17.5 +2013-07-25T20:48:27.000Z +-75.311282 40.08855 18.200000762939453 +2013-07-25T20:48:28.000Z +-75.31129 40.088587 18.100000381469727 +2013-07-25T20:48:29.000Z +-75.311296 40.088622 16.399999618530273 +2013-07-25T20:48:30.000Z +-75.311305 40.088661 15.699999809265137 +2013-07-25T20:48:31.001Z +-75.311315 40.088697 15.899999618530273 +2013-07-25T20:48:32.000Z +-75.311327 40.088735 15.800000190734863 +2013-07-25T20:48:33.000Z +-75.311336 40.08877 14.300000190734863 +2013-07-25T20:48:34.000Z +-75.311345 40.088805 14.100000381469727 +2013-07-25T20:48:35.000Z +-75.311355 40.088841 13.600000381469727 +2013-07-25T20:48:36.000Z +-75.311365 40.08888 13.5 +2013-07-25T20:48:37.000Z +-75.311375 40.088917 13.5 +2013-07-25T20:48:38.000Z +-75.311387 40.088952 13.199999809265137 +2013-07-25T20:48:39.000Z +-75.311398 40.088987 12.699999809265137 +2013-07-25T20:48:40.000Z +-75.311411 40.089022 12.699999809265137 +2013-07-25T20:48:41.000Z +-75.311424 40.089054 12.699999809265137 +2013-07-25T20:48:42.000Z +-75.311436 40.089085 12.5 +2013-07-25T20:48:43.000Z +-75.311448 40.089119 11.5 +2013-07-25T20:48:44.000Z +-75.311461 40.089153 11.399999618530273 +2013-07-25T20:48:45.000Z +-75.311474 40.089187 11.5 +2013-07-25T20:48:46.000Z +-75.31149 40.089217 12.800000190734863 +2013-07-25T20:48:47.000Z +-75.311503 40.089249 13.5 +2013-07-25T20:48:48.000Z +-75.311518 40.089282 11.0 +2013-07-25T20:48:49.000Z +-75.311529 40.089314 8.300000190734863 +2013-07-25T20:48:50.000Z +-75.311539 40.089349 5.800000190734863 +2013-07-25T20:48:51.000Z +-75.311552 40.089385 5.800000190734863 +2013-07-25T20:48:52.000Z +-75.311563 40.089426 0.10000000149011612 +2013-07-25T20:48:53.000Z +-75.311574 40.089462 0.8999999761581421 +2013-07-25T20:48:54.000Z +-75.311588 40.089495 0.0 +2013-07-25T20:48:55.000Z +-75.311603 40.089524 0.6000000238418579 +2013-07-25T20:48:56.000Z +-75.311619 40.089551 0.6000000238418579 +2013-07-25T20:48:57.000Z +-75.311633 40.089575 -0.10000000149011612 +2013-07-25T20:48:58.000Z +-75.311644 40.089599 -0.10000000149011612 +2013-07-25T20:48:59.000Z +-75.311654 40.089621 1.7000000476837158 +2013-07-25T20:49:00.000Z +-75.311666 40.089646 2.200000047683716 +2013-07-25T20:49:01.000Z +-75.311678 40.089669 2.200000047683716 +2013-07-25T20:49:02.000Z +-75.311689 40.089693 1.600000023841858 +2013-07-25T20:49:03.000Z +-75.311701 40.089718 1.899999976158142 +2013-07-25T20:49:04.000Z +-75.311715 40.089746 1.2000000476837158 +2013-07-25T20:49:05.000Z +-75.311729 40.089774 2.0999999046325684 +2013-07-25T20:49:06.000Z +-75.311742 40.089803 2.299999952316284 +2013-07-25T20:49:07.000Z +-75.311753 40.089832 2.0 +2013-07-25T20:49:08.000Z +-75.311764 40.089859 3.0999999046325684 +2013-07-25T20:49:09.000Z +-75.311774 40.089885 3.200000047683716 +2013-07-25T20:49:10.000Z +-75.311784 40.089912 2.9000000953674316 +2013-07-25T20:49:11.000Z +-75.311792 40.089939 2.4000000953674316 +2013-07-25T20:49:12.000Z +-75.311799 40.089967 2.700000047683716 +2013-07-25T20:49:13.000Z +-75.311806 40.089993 3.0999999046325684 +2013-07-25T20:49:14.000Z +-75.311813 40.090021 2.200000047683716 +2013-07-25T20:49:15.000Z +-75.311822 40.09005 1.899999976158142 +2013-07-25T20:49:16.000Z +-75.311832 40.090081 1.899999976158142 +2013-07-25T20:49:17.000Z +-75.311843 40.090113 1.7999999523162842 +2013-07-25T20:49:18.000Z +-75.311854 40.090146 1.7999999523162842 +2013-07-25T20:49:19.000Z +-75.311864 40.090177 2.299999952316284 +2013-07-25T20:49:20.000Z +-75.311876 40.09021 2.4000000953674316 +2013-07-25T20:49:21.000Z +-75.311887 40.090244 -0.30000001192092896 +2013-07-25T20:49:22.000Z +-75.3119 40.090282 -0.4000000059604645 +2013-07-25T20:49:23.000Z +-75.31191 40.090321 -1.399999976158142 +2013-07-25T20:49:24.000Z +-75.311919 40.090361 -1.399999976158142 +2013-07-25T20:49:25.000Z +-75.311926 40.090399 -1.5 +2013-07-25T20:49:26.000Z +-75.311935 40.090436 -1.2000000476837158 +2013-07-25T20:49:27.000Z +-75.311944 40.090471 -1.0 +2013-07-25T20:49:28.000Z +-75.311953 40.090508 -1.899999976158142 +2013-07-25T20:49:29.000Z +-75.311962 40.09054 -2.0 +2013-07-25T20:49:30.000Z +-75.311969 40.090574 -2.200000047683716 +2013-07-25T20:49:31.000Z +-75.311976 40.090609 -2.799999952316284 +2013-07-25T20:49:32.000Z +-75.31198 40.090646 -2.5 +2013-07-25T20:49:33.000Z +-75.311983 40.090681 -2.5 +2013-07-25T20:49:34.000Z +-75.311986 40.090716 -1.2999999523162842 +2013-07-25T20:49:35.000Z +-75.311989 40.090751 -0.5 +2013-07-25T20:49:36.000Z +-75.31199 40.090785 -0.6000000238418579 +2013-07-25T20:49:37.000Z +-75.311991 40.090818 -1.399999976158142 +2013-07-25T20:49:38.000Z +-75.311989 40.090851 -1.5 +2013-07-25T20:49:39.000Z +-75.311989 40.090886 -2.0 +2013-07-25T20:49:40.000Z +-75.311991 40.090922 -1.899999976158142 +2013-07-25T20:49:41.000Z +-75.311994 40.090954 -1.0 +2013-07-25T20:49:42.000Z +-75.311997 40.090986 -1.899999976158142 +2013-07-25T20:49:43.000Z +-75.312003 40.091016 -1.2999999523162842 +2013-07-25T20:49:44.000Z +-75.312008 40.091047 -1.2000000476837158 +2013-07-25T20:49:45.000Z +-75.312015 40.091079 -1.7000000476837158 +2013-07-25T20:49:46.000Z +-75.31202 40.091111 -2.0 +2013-07-25T20:49:47.000Z +-75.312021 40.091144 -1.7999999523162842 +2013-07-25T20:49:48.000Z +-75.312022 40.091177 -0.8999999761581421 +2013-07-25T20:49:49.000Z +-75.312025 40.091208 0.10000000149011612 +2013-07-25T20:49:50.000Z +-75.312029 40.091241 0.0 +2013-07-25T20:49:51.000Z +-75.312035 40.091274 0.5 +2013-07-25T20:49:52.000Z +-75.312041 40.091308 1.0 +2013-07-25T20:49:53.000Z +-75.312048 40.091341 1.2999999523162842 +2013-07-25T20:49:54.000Z +-75.312055 40.091375 1.399999976158142 +2013-07-25T20:49:55.000Z +-75.312066 40.091409 1.899999976158142 +2013-07-25T20:49:56.000Z +-75.312077 40.091445 1.399999976158142 +2013-07-25T20:49:57.000Z +-75.312087 40.091478 1.100000023841858 +2013-07-25T20:49:58.000Z +-75.312093 40.091512 0.5 +2013-07-25T20:49:59.000Z +-75.31209 40.091542 -1.100000023841858 +2013-07-25T20:49:59.999Z +-75.312085 40.091572 -3.0 +2013-07-25T20:50:01.000Z +-75.31206 40.091597 -1.5 +2013-07-25T20:50:02.000Z +-75.31204 40.09162 -0.699999988079071 +2013-07-25T20:50:03.000Z +-75.312017 40.091643 0.800000011920929 +2013-07-25T20:50:04.000Z +-75.311991 40.091666 1.7999999523162842 +2013-07-25T20:50:05.000Z +-75.311962 40.091687 1.600000023841858 +2013-07-25T20:50:06.000Z +-75.31193 40.09171 1.600000023841858 +2013-07-25T20:50:07.000Z +-75.311898 40.091736 2.200000047683716 +2013-07-25T20:50:08.000Z +-75.311865 40.091763 2.200000047683716 +2013-07-25T20:50:09.000Z +-75.311835 40.091789 2.5999999046325684 +2013-07-25T20:50:10.000Z +-75.311805 40.091817 2.9000000953674316 +2013-07-25T20:50:11.000Z +-75.311776 40.091844 2.799999952316284 +2013-07-25T20:50:12.000Z +-75.311744 40.09187 3.200000047683716 +2013-07-25T20:50:13.000Z +-75.311713 40.091891 4.0 +2013-07-25T20:50:14.000Z +-75.311681 40.091912 4.800000190734863 +2013-07-25T20:50:15.000Z +-75.311651 40.091932 6.400000095367432 +2013-07-25T20:50:16.000Z +-75.311621 40.091952 8.100000381469727 +2013-07-25T20:50:17.000Z +-75.31159 40.09197 9.600000381469727 +2013-07-25T20:50:18.000Z +-75.311556 40.091985 10.600000381469727 +2013-07-25T20:50:19.001Z +-75.311522 40.092001 11.399999618530273 +2013-07-25T20:50:19.999Z +-75.311483 40.092015 11.899999618530273 +2013-07-25T20:50:21.000Z +-75.311442 40.09203 12.199999809265137 +2013-07-25T20:50:22.000Z +-75.311405 40.092046 12.5 +2013-07-25T20:50:23.000Z +-75.311368 40.092066 12.600000381469727 +2013-07-25T20:50:24.000Z +-75.311338 40.092093 11.699999809265137 +2013-07-25T20:50:25.000Z +-75.31131 40.092116 11.699999809265137 +2013-07-25T20:50:26.000Z +-75.31128 40.092139 9.199999809265137 +2013-07-25T20:50:27.000Z +-75.311243 40.092156 6.300000190734863 +2013-07-25T20:50:27.999Z +-75.31121 40.09217 6.300000190734863 +2013-07-25T20:50:29.000Z +-75.311152 40.092163 5.5 +2013-07-25T20:50:30.000Z +-75.311106 40.092157 4.400000095367432 +2013-07-25T20:50:31.000Z +-75.311061 40.09215 4.300000190734863 +2013-07-25T20:50:32.000Z +-75.311026 40.092152 4.300000190734863 +2013-07-25T20:50:34.000Z +-75.310991 40.092185 5.400000095367432 +2013-07-25T20:50:35.000Z +-75.310985 40.092214 5.800000190734863 +2013-07-25T20:50:36.000Z +-75.310981 40.092244 5.900000095367432 +2013-07-25T20:50:37.000Z +-75.310978 40.092273 6.599999904632568 +2013-07-25T20:50:38.000Z +-75.310973 40.092301 6.900000095367432 +2013-07-25T20:50:39.000Z +-75.310967 40.092326 6.5 +2013-07-25T20:50:41.000Z +-75.310962 40.092368 8.300000190734863 +2013-07-25T20:50:42.000Z +-75.310957 40.092387 9.0 +2013-07-25T20:50:44.000Z +-75.310953 40.092429 6.599999904632568 +2013-07-25T20:50:45.000Z +-75.310948 40.092452 6.699999809265137 +2013-07-25T20:50:46.000Z +-75.310944 40.092478 7.300000190734863 +2013-07-25T20:50:47.000Z +-75.310939 40.092503 7.400000095367432 +2013-07-25T20:50:48.000Z +-75.310931 40.092531 6.199999809265137 +2013-07-25T20:50:49.000Z +-75.310922 40.092556 6.099999904632568 +2013-07-25T20:50:50.000Z +-75.310914 40.092581 5.900000095367432 +2013-07-25T20:50:51.000Z +-75.310905 40.092606 5.800000190734863 +2013-07-25T20:50:52.000Z +-75.310895 40.092633 5.300000190734863 +2013-07-25T20:50:53.000Z +-75.310883 40.09266 5.0 +2013-07-25T20:50:54.000Z +-75.31087 40.09269 4.5 +2013-07-25T20:50:55.000Z +-75.310858 40.092718 6.400000095367432 +2013-07-25T20:50:56.000Z +-75.310847 40.092747 6.199999809265137 +2013-07-25T20:50:57.000Z +-75.310837 40.092773 6.599999904632568 +2013-07-25T20:50:58.000Z +-75.310827 40.092801 6.400000095367432 +2013-07-25T20:50:59.000Z +-75.310817 40.092829 7.300000190734863 +2013-07-25T20:51:00.000Z +-75.310806 40.092853 8.699999809265137 +2013-07-25T20:51:01.000Z +-75.310799 40.092875 8.600000381469727 +2013-07-25T20:51:02.000Z +-75.31079 40.092897 9.100000381469727 +2013-07-25T20:51:03.000Z +-75.310779 40.092921 9.399999618530273 +2013-07-25T20:51:04.000Z +-75.310764 40.092947 9.399999618530273 +2013-07-25T20:51:05.000Z +-75.31075 40.092972 9.199999809265137 +2013-07-25T20:51:06.000Z +-75.310736 40.092996 9.100000381469727 +2013-07-25T20:51:07.000Z +-75.310723 40.093018 9.100000381469727 +2013-07-25T20:51:08.000Z +-75.310711 40.09304 9.699999809265137 +2013-07-25T20:51:09.000Z +-75.3107 40.093062 8.800000190734863 +2013-07-25T20:51:10.000Z +-75.310689 40.093085 8.800000190734863 +2013-07-25T20:51:11.000Z +-75.310676 40.093109 9.300000190734863 +2013-07-25T20:51:12.000Z +-75.310665 40.093134 9.699999809265137 +2013-07-25T20:51:13.000Z +-75.310652 40.093158 10.0 +2013-07-25T20:51:14.000Z +-75.31064 40.093184 12.100000381469727 +2013-07-25T20:51:15.000Z +-75.310622 40.093212 10.399999618530273 +2013-07-25T20:51:16.000Z +-75.310601 40.093243 10.300000190734863 +2013-07-25T20:51:17.000Z +-75.310577 40.093272 10.600000381469727 +2013-07-25T20:51:18.000Z +-75.31055 40.093302 10.600000381469727 +2013-07-25T20:51:19.000Z +-75.310522 40.09333 10.899999618530273 +2013-07-25T20:51:20.000Z +-75.310491 40.093359 10.300000190734863 +2013-07-25T20:51:21.000Z +-75.310463 40.093385 11.0 +2013-07-25T20:51:22.000Z +-75.310433 40.09341 10.699999809265137 +2013-07-25T20:51:23.000Z +-75.310406 40.093434 11.699999809265137 +2013-07-25T20:51:24.000Z +-75.310383 40.093453 12.600000381469727 +2013-07-25T20:51:25.000Z +-75.310364 40.093466 13.199999809265137 +2013-07-25T20:51:27.000Z +-75.31033 40.09349 14.0 +2013-07-25T20:51:28.000Z +-75.310313 40.093504 14.600000381469727 +2013-07-25T20:51:30.000Z +-75.310276 40.093538 13.5 +2013-07-25T20:51:31.000Z +-75.310257 40.093555 14.0 +2013-07-25T20:51:32.000Z +-75.310237 40.093572 14.300000190734863 +2013-07-25T20:51:33.000Z +-75.310217 40.093588 14.300000190734863 +2013-07-25T20:51:34.000Z +-75.310197 40.093606 13.300000190734863 +2013-07-25T20:51:35.000Z +-75.310178 40.093625 12.399999618530273 +2013-07-25T20:51:37.000Z +-75.310145 40.093662 11.699999809265137 +2013-07-25T20:51:38.000Z +-75.310127 40.093679 11.5 +2013-07-25T20:51:39.000Z +-75.310107 40.093695 12.0 +2013-07-25T20:51:40.000Z +-75.310083 40.093711 12.600000381469727 +2013-07-25T20:51:41.000Z +-75.310058 40.093727 12.600000381469727 +2013-07-25T20:51:42.000Z +-75.310032 40.093743 14.899999618530273 +2013-07-25T20:51:43.000Z +-75.31001 40.093759 17.299999237060547 +2013-07-25T20:51:43.999Z +-75.309989 40.093776 19.100000381469727 +2013-07-25T20:51:45.000Z +-75.309968 40.093802 16.399999618530273 +2013-07-25T20:51:46.000Z +-75.309944 40.093826 16.100000381469727 +2013-07-25T20:51:47.000Z +-75.309915 40.093851 17.299999237060547 +2013-07-25T20:51:48.000Z +-75.309885 40.093875 17.299999237060547 +2013-07-25T20:51:49.000Z +-75.309856 40.093895 17.5 +2013-07-25T20:51:50.000Z +-75.309828 40.093916 17.5 +2013-07-25T20:51:51.000Z +-75.3098 40.093936 18.399999618530273 +2013-07-25T20:51:52.000Z +-75.309773 40.093955 20.100000381469727 +2013-07-25T20:51:53.000Z +-75.30975 40.09397 23.299999237060547 +2013-07-25T20:51:54.000Z +-75.309723 40.093987 21.399999618530273 +2013-07-25T20:51:55.000Z +-75.309692 40.094008 19.5 +2013-07-25T20:51:56.000Z +-75.309659 40.09403 19.299999237060547 +2013-07-25T20:51:57.000Z +-75.309627 40.094053 18.600000381469727 +2013-07-25T20:51:58.000Z +-75.309591 40.094078 17.200000762939453 +2013-07-25T20:51:59.000Z +-75.30956 40.094103 18.700000762939453 +2013-07-25T20:52:00.000Z +-75.309531 40.094129 18.899999618530273 +2013-07-25T20:52:01.000Z +-75.309507 40.094153 19.100000381469727 +2013-07-25T20:52:02.000Z +-75.309485 40.094174 20.0 +2013-07-25T20:52:03.000Z +-75.309462 40.094195 19.399999618530273 +2013-07-25T20:52:04.000Z +-75.309436 40.094216 19.299999237060547 +2013-07-25T20:52:05.000Z +-75.309412 40.094234 19.700000762939453 +2013-07-25T20:52:06.000Z +-75.309384 40.094254 17.700000762939453 +2013-07-25T20:52:07.000Z +-75.309356 40.094275 17.5 +2013-07-25T20:52:08.000Z +-75.309327 40.094298 17.600000381469727 +2013-07-25T20:52:09.000Z +-75.309299 40.09432 17.399999618530273 +2013-07-25T20:52:10.000Z +-75.309273 40.094343 18.100000381469727 +2013-07-25T20:52:11.000Z +-75.309245 40.094366 17.200000762939453 +2013-07-25T20:52:12.000Z +-75.309214 40.09439 16.200000762939453 +2013-07-25T20:52:13.000Z +-75.309186 40.094412 16.5 +2013-07-25T20:52:14.000Z +-75.309158 40.094435 16.799999237060547 +2013-07-25T20:52:15.000Z +-75.30913 40.094459 17.700000762939453 +2013-07-25T20:52:16.000Z +-75.309101 40.094484 17.600000381469727 +2013-07-25T20:52:17.000Z +-75.309076 40.094507 17.899999618530273 +2013-07-25T20:52:18.000Z +-75.309048 40.094532 17.700000762939453 +2013-07-25T20:52:19.000Z +-75.30902 40.094556 17.100000381469727 +2013-07-25T20:52:20.000Z +-75.308992 40.094581 16.399999618530273 +2013-07-25T20:52:21.000Z +-75.308968 40.094603 18.200000762939453 +2013-07-25T20:52:22.000Z +-75.308948 40.09462 19.600000381469727 +2013-07-25T20:52:24.000Z +-75.308907 40.094649 19.399999618530273 +2013-07-25T20:52:25.000Z +-75.308885 40.094666 18.5 +2013-07-25T20:52:26.000Z +-75.308862 40.094682 17.899999618530273 +2013-07-25T20:52:27.000Z +-75.308838 40.094704 17.600000381469727 +2013-07-25T20:52:28.000Z +-75.308816 40.094726 17.399999618530273 +2013-07-25T20:52:29.000Z +-75.3088 40.09474 23.299999237060547 +2013-07-25T20:52:31.000Z +-75.308771 40.094766 26.600000381469727 +2013-07-25T20:52:32.000Z +-75.308749 40.094781 27.299999237060547 +2013-07-25T20:52:33.000Z +-75.308725 40.094798 29.100000381469727 +2013-07-25T20:52:34.000Z +-75.308697 40.094818 30.600000381469727 +2013-07-25T20:52:35.000Z +-75.308665 40.094843 28.799999237060547 +2013-07-25T20:52:36.000Z +-75.308629 40.094869 26.700000762939453 +2013-07-25T20:52:37.000Z +-75.308599 40.094893 27.700000762939453 +2013-07-25T20:52:38.000Z +-75.30857 40.094916 28.600000381469727 +2013-07-25T20:52:39.000Z +-75.308545 40.094936 30.0 +2013-07-25T20:52:40.000Z +-75.308519 40.094955 31.0 +2013-07-25T20:52:41.000Z +-75.308495 40.094974 31.200000762939453 +2013-07-25T20:52:42.000Z +-75.308466 40.094994 29.100000381469727 +2013-07-25T20:52:43.000Z +-75.308438 40.095014 28.799999237060547 +2013-07-25T20:52:44.000Z +-75.308411 40.095034 29.299999237060547 +2013-07-25T20:52:45.000Z +-75.308387 40.095052 29.899999618530273 +2013-07-25T20:52:46.000Z +-75.308367 40.095069 32.0 +2013-07-25T20:52:48.000Z +-75.30833 40.095101 33.70000076293945 +2013-07-25T20:52:49.000Z +-75.308311 40.095118 32.20000076293945 +2013-07-25T20:52:50.000Z +-75.308286 40.09514 29.799999237060547 +2013-07-25T20:52:51.000Z +-75.308258 40.095163 28.600000381469727 +2013-07-25T20:52:52.000Z +-75.308229 40.095188 28.399999618530273 +2013-07-25T20:52:53.000Z +-75.308198 40.095212 28.100000381469727 +2013-07-25T20:52:54.000Z +-75.308168 40.095238 28.0 +2013-07-25T20:52:55.000Z +-75.308136 40.095265 26.200000762939453 +2013-07-25T20:52:56.000Z +-75.308104 40.095292 26.700000762939453 +2013-07-25T20:52:57.000Z +-75.308076 40.095317 26.5 +2013-07-25T20:52:58.000Z +-75.308044 40.095345 25.600000381469727 +2013-07-25T20:52:59.000Z +-75.308013 40.095371 26.200000762939453 +2013-07-25T20:53:00.000Z +-75.30798 40.095399 24.799999237060547 +2013-07-25T20:53:01.000Z +-75.307951 40.095423 26.399999618530273 +2013-07-25T20:53:02.000Z +-75.307922 40.095448 25.799999237060547 +2013-07-25T20:53:03.000Z +-75.307894 40.095473 25.600000381469727 +2013-07-25T20:53:04.000Z +-75.307866 40.095498 25.5 +2013-07-25T20:53:05.000Z +-75.30784 40.095522 25.100000381469727 +2013-07-25T20:53:06.000Z +-75.307812 40.095547 24.700000762939453 +2013-07-25T20:53:07.000Z +-75.307787 40.095572 25.799999237060547 +2013-07-25T20:53:08.000Z +-75.307758 40.095599 24.399999618530273 +2013-07-25T20:53:09.000Z +-75.307733 40.095623 24.399999618530273 +2013-07-25T20:53:10.000Z +-75.307707 40.095646 24.899999618530273 +2013-07-25T20:53:11.000Z +-75.307685 40.095668 26.100000381469727 +2013-07-25T20:53:12.000Z +-75.307661 40.095688 26.399999618530273 +2013-07-25T20:53:13.000Z +-75.30764 40.095706 27.399999618530273 +2013-07-25T20:53:15.000Z +-75.307604 40.095739 28.200000762939453 +2013-07-25T20:53:16.000Z +-75.307584 40.095757 27.899999618530273 +2013-07-25T20:53:17.000Z +-75.307559 40.095777 24.799999237060547 +2013-07-25T20:53:18.000Z +-75.307532 40.095795 24.899999618530273 +2013-07-25T20:53:19.000Z +-75.307502 40.095816 23.600000381469727 +2013-07-25T20:53:20.000Z +-75.307472 40.095839 23.200000762939453 +2013-07-25T20:53:21.000Z +-75.307445 40.095863 22.600000381469727 +2013-07-25T20:53:22.000Z +-75.307421 40.095887 24.299999237060547 +2013-07-25T20:53:23.000Z +-75.307401 40.095909 25.299999237060547 +2013-07-25T20:53:23.999Z +-75.307379 40.09593 26.200000762939453 +2013-07-25T20:53:25.000Z +-75.307366 40.095953 25.799999237060547 +2013-07-25T20:53:26.000Z +-75.307352 40.095976 25.600000381469727 +2013-07-25T20:53:27.000Z +-75.307337 40.096 25.200000762939453 +2013-07-25T20:53:28.000Z +-75.30732 40.096024 24.399999618530273 +2013-07-25T20:53:29.000Z +-75.307304 40.096046 24.100000381469727 +2013-07-25T20:53:30.000Z +-75.307289 40.096066 24.0 +2013-07-25T20:53:31.000Z +-75.307274 40.096087 23.600000381469727 +2013-07-25T20:53:32.000Z +-75.30726 40.096107 23.5 +2013-07-25T20:53:34.000Z +-75.307233 40.096142 24.299999237060547 +2013-07-25T20:53:35.000Z +-75.307217 40.096159 23.299999237060547 +2013-07-25T20:53:37.000Z +-75.307183 40.096188 21.899999618530273 +2013-07-25T20:53:38.000Z +-75.307163 40.096204 22.100000381469727 +2013-07-25T20:53:39.000Z +-75.307144 40.096223 22.299999237060547 +2013-07-25T20:53:40.000Z +-75.307124 40.096245 23.600000381469727 +2013-07-25T20:53:41.000Z +-75.307103 40.09627 23.299999237060547 +2013-07-25T20:53:42.000Z +-75.30708 40.096294 24.600000381469727 +2013-07-25T20:53:43.000Z +-75.307057 40.096317 25.600000381469727 +2013-07-25T20:53:44.000Z +-75.30703 40.096341 24.899999618530273 +2013-07-25T20:53:45.000Z +-75.307001 40.096365 24.700000762939453 +2013-07-25T20:53:46.000Z +-75.306972 40.09639 24.899999618530273 +2013-07-25T20:53:47.000Z +-75.306941 40.096416 26.100000381469727 +2013-07-25T20:53:48.000Z +-75.306909 40.096441 26.799999237060547 +2013-07-25T20:53:49.000Z +-75.306878 40.096464 26.700000762939453 +2013-07-25T20:53:50.000Z +-75.306847 40.096486 27.399999618530273 +2013-07-25T20:53:51.000Z +-75.306814 40.096509 30.0 +2013-07-25T20:53:52.000Z +-75.306778 40.096535 30.0 +2013-07-25T20:53:53.000Z +-75.306744 40.096563 30.200000762939453 +2013-07-25T20:53:54.000Z +-75.306675 40.096629 26.5 +2013-07-25T20:53:55.000Z +-75.306634 40.096665 26.799999237060547 +2013-07-25T20:53:55.998Z +-75.306593 40.096699 26.899999618530273 +2013-07-25T20:53:57.000Z +-75.306549 40.096748 25.600000381469727 +2013-07-25T20:53:58.000Z +-75.306515 40.096783 25.299999237060547 +2013-07-25T20:53:59.000Z +-75.306484 40.096821 26.5 +2013-07-25T20:54:00.000Z +-75.306452 40.096862 27.600000381469727 +2013-07-25T20:54:01.000Z +-75.306424 40.096904 27.799999237060547 +2013-07-25T20:54:02.000Z +-75.306403 40.096949 28.799999237060547 +2013-07-25T20:54:03.000Z +-75.306373 40.096998 29.0 +2013-07-25T20:54:04.000Z +-75.306344 40.097048 29.0 +2013-07-25T20:54:05.000Z +-75.306317 40.097101 29.299999237060547 +2013-07-25T20:54:06.000Z +-75.306285 40.097145 29.200000762939453 +2013-07-25T20:54:07.000Z +-75.306249 40.097186 29.700000762939453 +2013-07-25T20:54:08.000Z +-75.306234 40.097227 30.600000381469727 +2013-07-25T20:54:09.000Z +-75.306216 40.097262 30.899999618530273 +2013-07-25T20:54:10.000Z +-75.306203 40.097313 31.299999237060547 +2013-07-25T20:54:11.000Z +-75.306155 40.097373 29.0 +2013-07-25T20:54:12.000Z +-75.306128 40.097429 27.799999237060547 +2013-07-25T20:54:13.000Z +-75.306107 40.097484 26.600000381469727 +2013-07-25T20:54:14.000Z +-75.306094 40.097535 26.299999237060547 +2013-07-25T20:54:15.000Z +-75.306036 40.097606 21.700000762939453 +2013-07-25T20:54:16.000Z +-75.306011 40.097659 21.5 +2013-07-25T20:54:17.000Z +-75.305972 40.097718 18.799999237060547 +2013-07-25T20:54:18.000Z +-75.305947 40.097762 18.0 +2013-07-25T20:54:19.000Z +-75.305905 40.09781 16.899999618530273 +2013-07-25T20:54:20.000Z +-75.305864 40.09786 15.600000381469727 +2013-07-25T20:54:21.000Z +-75.305819 40.097909 15.399999618530273 +2013-07-25T20:54:22.000Z +-75.305772 40.097955 14.300000190734863 +2013-07-25T20:54:23.000Z +-75.30572 40.098002 12.699999809265137 +2013-07-25T20:54:24.000Z +-75.305657 40.098055 11.199999809265137 +2013-07-25T20:54:25.000Z +-75.305602 40.098086 11.899999618530273 +2013-07-25T20:54:26.000Z +-75.305544 40.098119 11.5 +2013-07-25T20:54:27.000Z +-75.305465 40.098155 10.100000381469727 +2013-07-25T20:54:28.000Z +-75.305385 40.098183 9.899999618530273 +2013-07-25T20:54:29.000Z +-75.305308 40.098209 9.800000190734863 +2013-07-25T20:54:30.000Z +-75.305214 40.098234 8.300000190734863 +2013-07-25T20:54:31.000Z +-75.305128 40.098259 7.699999809265137 +2013-07-25T20:54:32.000Z +-75.305043 40.098256 9.600000381469727 +2013-07-25T20:54:33.000Z +-75.304963 40.098275 10.199999809265137 +2013-07-25T20:54:33.999Z +-75.304877 40.098287 11.100000381469727 +2013-07-25T20:54:35.000Z +-75.304767 40.098326 8.399999618530273 +2013-07-25T20:54:36.000Z +-75.304679 40.098346 8.5 +2013-07-25T20:54:37.000Z +-75.304586 40.098371 7.900000095367432 +2013-07-25T20:54:37.999Z +-75.304493 40.098395 7.199999809265137 +2013-07-25T20:54:39.000Z +-75.304398 40.098406 6.099999904632568 +2013-07-25T20:54:40.000Z +-75.304305 40.098415 5.800000190734863 +2013-07-25T20:54:41.000Z +-75.304237 40.098422 7.5 +2013-07-25T20:54:42.000Z +-75.30416 40.098428 7.800000190734863 +2013-07-25T20:54:43.000Z +-75.304081 40.09844 6.5 +2013-07-25T20:54:44.000Z +-75.304002 40.098449 6.300000190734863 +2013-07-25T20:54:45.000Z +-75.303937 40.098461 5.300000190734863 +2013-07-25T20:54:46.000Z +-75.303874 40.098478 5.400000095367432 +2013-07-25T20:54:47.000Z +-75.303812 40.098489 5.400000095367432 +2013-07-25T20:54:47.999Z +-75.303752 40.098501 5.0 +2013-07-25T20:54:49.000Z +-75.3037 40.09852 5.199999809265137 +2013-07-25T20:54:50.000Z +-75.303659 40.098526 5.599999904632568 +2013-07-25T20:54:51.000Z +-75.30361 40.098524 5.300000190734863 +2013-07-25T20:54:52.000Z +-75.303565 40.09854 5.099999904632568 +2013-07-25T20:54:52.999Z +-75.303524 40.098556 5.199999809265137 +2013-07-25T20:54:54.000Z +-75.303495 40.098577 5.900000095367432 +2013-07-25T20:54:55.000Z +-75.30347 40.098591 5.900000095367432 +2013-07-25T20:54:56.000Z +-75.303438 40.098608 5.800000190734863 +2013-07-25T20:54:57.999Z +-75.303393 40.098632 7.400000095367432 +2013-07-25T20:54:59.000Z +-75.303358 40.09865 6.199999809265137 +2013-07-25T20:55:00.000Z +-75.303326 40.098668 6.199999809265137 +2013-07-25T20:55:01.000Z +-75.303299 40.098684 8.5 +2013-07-25T20:55:02.000Z +-75.303271 40.098703 6.800000190734863 +2013-07-25T20:55:03.000Z +-75.303242 40.098724 6.5 +2013-07-25T20:55:04.000Z +-75.303214 40.098745 6.199999809265137 +2013-07-25T20:55:05.000Z +-75.30319 40.098766 6.0 +2013-07-25T20:55:06.000Z +-75.303167 40.098787 5.400000095367432 +2013-07-25T20:55:07.000Z +-75.303148 40.098807 7.0 +2013-07-25T20:55:08.000Z +-75.303129 40.098827 7.5 +2013-07-25T20:55:09.000Z +-75.303112 40.098846 9.100000381469727 +2013-07-25T20:55:10.000Z +-75.303093 40.098868 8.600000381469727 +2013-07-25T20:55:11.000Z +-75.303068 40.098894 6.5 +2013-07-25T20:55:12.000Z +-75.30304 40.098923 6.5 +2013-07-25T20:55:13.000Z +-75.303013 40.098953 6.0 +2013-07-25T20:55:14.000Z +-75.302984 40.098986 4.900000095367432 +2013-07-25T20:55:15.000Z +-75.302955 40.099018 5.900000095367432 +2013-07-25T20:55:16.000Z +-75.302927 40.099051 6.699999809265137 +2013-07-25T20:55:17.000Z +-75.302904 40.099077 7.599999904632568 +2013-07-25T20:55:19.000Z +-75.302872 40.099114 9.899999618530273 +2013-07-25T20:55:20.000Z +-75.302857 40.09913 9.300000190734863 +2013-07-25T20:55:22.000Z +-75.302835 40.099159 11.100000381469727 +2013-07-25T20:55:23.000Z +-75.302827 40.099174 11.899999618530273 +2013-07-25T20:55:25.000Z +-75.302812 40.099209 13.199999809265137 +2013-07-25T20:55:26.000Z +-75.302801 40.099226 13.300000190734863 +2013-07-25T20:55:28.000Z +-75.302774 40.099258 15.800000190734863 +2013-07-25T20:55:29.000Z +-75.302763 40.09927 16.700000762939453 +2013-07-25T20:55:31.000Z +-75.302733 40.099292 14.199999809265137 +2013-07-25T20:55:32.000Z +-75.302714 40.099302 14.5 +2013-07-25T20:55:34.000Z +-75.302674 40.099318 16.399999618530273 +2013-07-25T20:55:35.000Z +-75.302654 40.099326 16.0 +2013-07-25T20:55:37.000Z +-75.302607 40.099343 14.899999618530273 +2013-07-25T20:55:38.000Z +-75.302566 40.099352 15.5 +2013-07-25T20:55:39.000Z +-75.302524 40.09936 17.200000762939453 +2013-07-25T20:55:40.000Z +-75.302474 40.099369 17.899999618530273 +2013-07-25T20:55:41.001Z +-75.302432 40.099376 19.5 +2013-07-25T20:55:42.000Z +-75.302348 40.099361 19.5 +2013-07-25T20:55:43.000Z +-75.302319 40.099332 19.299999237060547 +2013-07-25T20:55:44.000Z +-75.30226 40.099302 18.899999618530273 +2013-07-25T20:55:45.001Z +-75.302209 40.09927 18.899999618530273 +2013-07-25T20:55:46.000Z +-75.302158 40.099225 18.5 +2013-07-25T20:55:47.000Z +-75.302103 40.099183 18.700000762939453 +2013-07-25T20:55:48.000Z +-75.302055 40.099127 18.600000381469727 +2013-07-25T20:55:49.000Z +-75.302004 40.099079 18.100000381469727 +2013-07-25T20:55:50.000Z +-75.301956 40.099031 18.200000762939453 +2013-07-25T20:55:51.000Z +-75.301892 40.098981 17.299999237060547 +2013-07-25T20:55:52.000Z +-75.301818 40.098933 16.799999237060547 +2013-07-25T20:55:53.000Z +-75.301734 40.098893 16.399999618530273 +2013-07-25T20:55:54.000Z +-75.30164 40.098861 15.600000381469727 +2013-07-25T20:55:55.000Z +-75.301538 40.098847 15.600000381469727 +2013-07-25T20:55:56.000Z +-75.30144 40.098835 15.600000381469727 +2013-07-25T20:55:57.000Z +-75.301362 40.098882 15.800000190734863 +2013-07-25T20:55:58.000Z +-75.301286 40.098892 16.200000762939453 +2013-07-25T20:55:59.000Z +-75.3012 40.098906 16.299999237060547 +2013-07-25T20:56:00.000Z +-75.30125 40.098877 16.5 +2013-07-25T20:56:01.000Z +-75.301258 40.098909 18.0 +2013-07-25T20:56:02.000Z +-75.301061 40.098961 17.5 +2013-07-25T20:56:03.000Z +-75.300971 40.098999 20.0 +2013-07-25T20:56:04.000Z +-75.30084 40.099045 21.299999237060547 +2013-07-25T20:56:05.000Z +-75.300786 40.099075 22.299999237060547 +2013-07-25T20:56:06.000Z +-75.300702 40.099092 21.700000762939453 +2013-07-25T20:56:06.999Z +-75.300633 40.099116 21.700000762939453 +2013-07-25T20:56:08.000Z +-75.30056 40.099147 23.299999237060547 +2013-07-25T20:56:09.000Z +-75.300487 40.099148 27.600000381469727 +2013-07-25T20:56:10.000Z +-75.300444 40.099164 30.700000762939453 +2013-07-25T20:56:11.000Z +-75.300401 40.099201 30.399999618530273 +2013-07-25T20:56:12.000Z +-75.300348 40.099226 30.799999237060547 +2013-07-25T20:56:13.000Z +-75.300297 40.09925 30.399999618530273 +2013-07-25T20:56:14.000Z +-75.300227 40.099268 30.899999618530273 +2013-07-25T20:56:15.000Z +-75.300178 40.099292 31.799999237060547 +2013-07-25T20:56:16.000Z +-75.300129 40.099315 32.400001525878906 +2013-07-25T20:56:17.000Z +-75.300089 40.099343 33.29999923706055 +2013-07-25T20:56:18.000Z +-75.300036 40.099361 34.0 +2013-07-25T20:56:19.000Z +-75.299976 40.099379 32.70000076293945 +2013-07-25T20:56:20.000Z +-75.299945 40.099394 34.70000076293945 +2013-07-25T20:56:21.000Z +-75.299907 40.099412 35.599998474121094 +2013-07-25T20:56:22.000Z +-75.299863 40.099428 36.900001525878906 +2013-07-25T20:56:23.000Z +-75.299816 40.099444 37.29999923706055 +2013-07-25T20:56:24.000Z +-75.299765 40.099461 37.900001525878906 +2013-07-25T20:56:25.000Z +-75.299721 40.09948 37.70000076293945 +2013-07-25T20:56:26.001Z +-75.299678 40.099497 37.70000076293945 +2013-07-25T20:56:27.000Z +-75.299635 40.099518 37.400001525878906 +2013-07-25T20:56:28.000Z +-75.299593 40.099537 38.70000076293945 +2013-07-25T20:56:29.000Z +-75.299549 40.099554 38.900001525878906 +2013-07-25T20:56:30.001Z +-75.299513 40.099568 39.5 +2013-07-25T20:56:31.000Z +-75.299483 40.09958 38.900001525878906 +2013-07-25T20:56:32.000Z +-75.299443 40.099593 39.29999923706055 +2013-07-25T20:56:33.000Z +-75.299402 40.099605 41.099998474121094 +2013-07-25T20:56:34.000Z +-75.299359 40.099621 41.5 +2013-07-25T20:56:35.000Z +-75.299319 40.099633 43.599998474121094 +2013-07-25T20:56:36.000Z +-75.299281 40.099638 45.79999923706055 +2013-07-25T20:56:37.000Z +-75.299251 40.099637 50.400001525878906 +2013-07-25T20:56:38.000Z +-75.299199 40.099617 51.599998474121094 +2013-07-25T20:56:39.000Z +-75.299188 40.099605 57.900001525878906 +2013-07-25T20:56:40.000Z +-75.29913 40.099616 56.900001525878906 +2013-07-25T20:56:42.000Z +-75.29909 40.099605 61.70000076293945 +2013-07-25T20:56:43.002Z +-75.299055 40.099595 62.29999923706055 +2013-07-25T20:56:44.000Z +-75.299051 40.09961 60.70000076293945 +2013-07-25T20:56:45.000Z +-75.298984 40.09962 61.29999923706055 +2013-07-25T20:56:46.000Z +-75.298947 40.099636 61.70000076293945 +2013-07-25T20:56:47.000Z +-75.298905 40.099645 61.79999923706055 +2013-07-25T20:56:48.000Z +-75.298866 40.099659 62.29999923706055 +2013-07-25T20:56:49.000Z +-75.298826 40.099673 60.400001525878906 +2013-07-25T20:56:50.000Z +-75.298785 40.099689 58.099998474121094 +2013-07-25T20:56:51.000Z +-75.298741 40.099715 49.900001525878906 +2013-07-25T20:56:52.000Z +-75.298696 40.099741 43.599998474121094 +2013-07-25T20:56:53.000Z +-75.298651 40.09977 37.29999923706055 +2013-07-25T20:56:54.000Z +-75.298609 40.099794 37.099998474121094 +2013-07-25T20:56:55.000Z +-75.298568 40.099817 34.900001525878906 +2013-07-25T20:56:56.000Z +-75.298527 40.099838 33.900001525878906 +2013-07-25T20:56:57.000Z +-75.29849 40.099858 33.29999923706055 +2013-07-25T20:56:58.000Z +-75.298456 40.099878 31.700000762939453 +2013-07-25T20:56:59.000Z +-75.298416 40.099896 29.5 +2013-07-25T20:57:00.000Z +-75.29837 40.099913 27.5 +2013-07-25T20:57:01.000Z +-75.29832 40.099925 26.600000381469727 +2013-07-25T20:57:02.000Z +-75.298267 40.099935 26.0 +2013-07-25T20:57:03.000Z +-75.298216 40.099946 25.899999618530273 +2013-07-25T20:57:04.000Z +-75.298164 40.099958 26.200000762939453 +2013-07-25T20:57:05.000Z +-75.298108 40.099959 24.700000762939453 +2013-07-25T20:57:06.000Z +-75.298049 40.099953 24.399999618530273 +2013-07-25T20:57:07.000Z +-75.297988 40.099941 23.799999237060547 +2013-07-25T20:57:08.000Z +-75.297927 40.099924 23.399999618530273 +2013-07-25T20:57:09.000Z +-75.297873 40.099909 23.399999618530273 +2013-07-25T20:57:10.000Z +-75.297827 40.099894 22.700000762939453 +2013-07-25T20:57:11.000Z +-75.297784 40.09988 22.100000381469727 +2013-07-25T20:57:12.000Z +-75.297744 40.099862 21.600000381469727 +2013-07-25T20:57:13.000Z +-75.297706 40.099845 20.799999237060547 +2013-07-25T20:57:14.000Z +-75.297671 40.099828 20.5 +2013-07-25T20:57:15.000Z +-75.29764 40.099813 20.399999618530273 +2013-07-25T20:57:16.000Z +-75.297615 40.0998 19.799999237060547 +2013-07-25T20:57:17.000Z +-75.297592 40.09979 19.299999237060547 +2013-07-25T20:57:18.000Z +-75.297563 40.09977 15.800000190734863 +2013-07-25T20:57:19.000Z +-75.297525 40.099751 15.600000381469727 +2013-07-25T20:57:20.000Z +-75.29748 40.099732 15.0 +2013-07-25T20:57:21.000Z +-75.297431 40.099715 14.699999809265137 +2013-07-25T20:57:22.000Z +-75.297383 40.099706 14.800000190734863 +2013-07-25T20:57:23.000Z +-75.297333 40.099695 13.899999618530273 +2013-07-25T20:57:24.000Z +-75.297283 40.099685 13.5 +2013-07-25T20:57:25.000Z +-75.297234 40.099675 12.899999618530273 +2013-07-25T20:57:26.000Z +-75.29719 40.099658 10.800000190734863 +2013-07-25T20:57:27.000Z +-75.297148 40.099637 9.600000381469727 +2013-07-25T20:57:28.000Z +-75.297107 40.099614 8.800000190734863 +2013-07-25T20:57:29.000Z +-75.297074 40.099586 6.300000190734863 +2013-07-25T20:57:30.000Z +-75.297043 40.099563 5.699999809265137 +2013-07-25T20:57:31.000Z +-75.29701 40.099546 6.699999809265137 +2013-07-25T20:57:32.000Z +-75.296968 40.099536 6.199999809265137 +2013-07-25T20:57:33.000Z +-75.296921 40.099536 6.300000190734863 +2013-07-25T20:57:34.000Z +-75.296879 40.099543 7.599999904632568 +2013-07-25T20:57:35.000Z +-75.296837 40.099553 8.100000381469727 +2013-07-25T20:57:36.000Z +-75.296791 40.099564 8.0 +2013-07-25T20:57:37.000Z +-75.296746 40.099575 8.5 +2013-07-25T20:57:38.000Z +-75.296696 40.099587 8.899999618530273 +2013-07-25T20:57:39.000Z +-75.296639 40.099598 9.5 +2013-07-25T20:57:40.000Z +-75.29658 40.099612 9.600000381469727 +2013-07-25T20:57:41.000Z +-75.296523 40.099627 11.300000190734863 +2013-07-25T20:57:42.000Z +-75.29647 40.099641 11.899999618530273 +2013-07-25T20:57:43.000Z +-75.296418 40.099657 12.800000190734863 +2013-07-25T20:57:44.000Z +-75.296365 40.09967 13.5 +2013-07-25T20:57:45.000Z +-75.296313 40.09968 14.199999809265137 +2013-07-25T20:57:46.000Z +-75.296261 40.099688 15.100000381469727 +2013-07-25T20:57:47.000Z +-75.296209 40.099696 15.100000381469727 +2013-07-25T20:57:48.000Z +-75.296155 40.099704 15.0 +2013-07-25T20:57:49.000Z +-75.296106 40.099713 15.899999618530273 +2013-07-25T20:57:50.000Z +-75.29606 40.099721 16.399999618530273 +2013-07-25T20:57:51.000Z +-75.296012 40.099731 16.700000762939453 +2013-07-25T20:57:52.000Z +-75.295959 40.099739 16.799999237060547 +2013-07-25T20:57:53.000Z +-75.295905 40.099747 16.799999237060547 +2013-07-25T20:57:54.000Z +-75.295852 40.099753 17.399999618530273 +2013-07-25T20:57:55.000Z +-75.295797 40.099757 18.0 +2013-07-25T20:57:56.000Z +-75.29574 40.099761 18.0 +2013-07-25T20:57:57.000Z +-75.295685 40.099762 17.399999618530273 +2013-07-25T20:57:58.000Z +-75.295631 40.099762 16.399999618530273 +2013-07-25T20:57:59.000Z +-75.295574 40.099763 15.600000381469727 +2013-07-25T20:58:00.000Z +-75.295517 40.099766 14.699999809265137 +2013-07-25T20:58:01.000Z +-75.295462 40.09977 15.0 +2013-07-25T20:58:02.000Z +-75.295411 40.099775 14.800000190734863 +2013-07-25T20:58:03.000Z +-75.295359 40.09978 14.5 +2013-07-25T20:58:04.000Z +-75.295304 40.099787 14.0 +2013-07-25T20:58:05.000Z +-75.295249 40.099791 13.399999618530273 +2013-07-25T20:58:06.000Z +-75.295199 40.099794 13.100000381469727 +2013-07-25T20:58:07.000Z +-75.295156 40.099781 10.199999809265137 +2013-07-25T20:58:08.000Z +-75.295112 40.099776 8.100000381469727 +2013-07-25T20:58:09.000Z +-75.295094 40.099735 8.199999809265137 +2013-07-25T20:58:10.000Z +-75.295078 40.099706 7.300000190734863 +2013-07-25T20:58:11.000Z +-75.295052 40.099693 8.5 +2013-07-25T20:58:12.000Z +-75.295022 40.099692 9.300000190734863 +2013-07-25T20:58:13.000Z +-75.294988 40.099705 10.699999809265137 +2013-07-25T20:58:14.000Z +-75.29495 40.099729 11.100000381469727 +2013-07-25T20:58:15.000Z +-75.294911 40.099755 12.199999809265137 +2013-07-25T20:58:16.000Z +-75.294878 40.099783 13.899999618530273 +2013-07-25T20:58:17.000Z +-75.294848 40.099812 14.399999618530273 +2013-07-25T20:58:18.000Z +-75.294825 40.099841 19.299999237060547 +2013-07-25T20:58:19.000Z +-75.294807 40.099869 22.0 +2013-07-25T20:58:20.000Z +-75.294786 40.099896 23.299999237060547 +2013-07-25T20:58:21.000Z +-75.294765 40.099919 25.299999237060547 +2013-07-25T20:58:22.000Z +-75.294741 40.099941 26.5 +2013-07-25T20:58:23.000Z +-75.294715 40.099961 27.399999618530273 +2013-07-25T20:58:24.000Z +-75.294688 40.099982 29.5 +2013-07-25T20:58:25.000Z +-75.294658 40.100006 28.100000381469727 +2013-07-25T20:58:26.000Z +-75.294624 40.100035 28.600000381469727 +2013-07-25T20:58:27.000Z +-75.294549 40.100102 26.600000381469727 +2013-07-25T20:58:28.000Z +-75.294514 40.100137 27.0 +2013-07-25T20:58:29.000Z +-75.294462 40.100179 25.799999237060547 +2013-07-25T20:58:30.000Z +-75.294435 40.100209 25.899999618530273 +2013-07-25T20:58:31.000Z +-75.294398 40.100236 25.799999237060547 +2013-07-25T20:58:32.000Z +-75.294368 40.100259 26.0 +2013-07-25T20:58:33.000Z +-75.294333 40.100285 25.100000381469727 +2013-07-25T20:58:34.000Z +-75.294257 40.100334 19.700000762939453 +2013-07-25T20:58:35.000Z +-75.294225 40.100354 19.799999237060547 +2013-07-25T20:58:36.000Z +-75.294203 40.100373 21.799999237060547 +2013-07-25T20:58:37.000Z +-75.294176 40.100393 22.600000381469727 +2013-07-25T20:58:38.000Z +-75.294151 40.100417 22.5 +2013-07-25T20:58:38.999Z +-75.294126 40.100439 22.399999618530273 +2013-07-25T20:58:40.000Z +-75.294135 40.100469 24.799999237060547 +2013-07-25T20:58:41.000Z +-75.294148 40.1005 24.200000762939453 +2013-07-25T20:58:42.000Z +-75.29417 40.100532 23.5 +2013-07-25T20:58:43.000Z +-75.294199 40.100565 23.600000381469727 +2013-07-25T20:58:44.000Z +-75.294234 40.100598 23.899999618530273 +2013-07-25T20:58:45.000Z +-75.29427 40.100626 23.799999237060547 +2013-07-25T20:58:46.000Z +-75.294306 40.100653 23.299999237060547 +2013-07-25T20:58:47.000Z +-75.294338 40.100678 22.200000762939453 +2013-07-25T20:58:48.000Z +-75.294369 40.100701 21.899999618530273 +2013-07-25T20:58:49.000Z +-75.294397 40.100723 22.799999237060547 +2013-07-25T20:58:50.000Z +-75.294424 40.100747 22.700000762939453 +2013-07-25T20:58:51.000Z +-75.294454 40.100774 22.200000762939453 +2013-07-25T20:58:52.000Z +-75.294486 40.100803 20.600000381469727 +2013-07-25T20:58:53.000Z +-75.294519 40.10083 19.899999618530273 +2013-07-25T20:58:54.000Z +-75.294555 40.100855 19.799999237060547 +2013-07-25T20:58:55.000Z +-75.294588 40.100876 20.700000762939453 +2013-07-25T20:58:56.000Z +-75.294619 40.100895 20.899999618530273 +2013-07-25T20:58:57.000Z +-75.294645 40.100914 19.700000762939453 +2013-07-25T20:58:58.000Z +-75.294668 40.100932 20.0 +2013-07-25T20:58:59.000Z +-75.294692 40.100951 20.399999618530273 +2013-07-25T20:59:00.000Z +-75.294716 40.100969 19.899999618530273 +2013-07-25T20:59:01.000Z +-75.294739 40.100986 20.600000381469727 +2013-07-25T20:59:02.000Z +-75.294762 40.101002 20.5 +2013-07-25T20:59:03.000Z +-75.294786 40.101017 20.600000381469727 +2013-07-25T20:59:04.000Z +-75.29481 40.101036 19.799999237060547 +2013-07-25T20:59:05.000Z +-75.29483 40.101054 19.0 +2013-07-25T20:59:06.000Z +-75.294852 40.101072 18.5 +2013-07-25T20:59:07.000Z +-75.294873 40.101089 18.399999618530273 +2013-07-25T20:59:08.000Z +-75.294894 40.101107 18.399999618530273 +2013-07-25T20:59:09.000Z +-75.294915 40.101123 18.700000762939453 +2013-07-25T20:59:10.000Z +-75.294938 40.101139 18.299999237060547 +2013-07-25T20:59:11.000Z +-75.294959 40.101154 18.299999237060547 +2013-07-25T20:59:12.000Z +-75.294982 40.10117 18.299999237060547 +2013-07-25T20:59:13.000Z +-75.295004 40.101186 18.399999618530273 +2013-07-25T20:59:14.000Z +-75.295026 40.101204 17.600000381469727 +2013-07-25T20:59:15.000Z +-75.295048 40.101223 17.100000381469727 +2013-07-25T20:59:16.000Z +-75.295071 40.101242 16.799999237060547 +2013-07-25T20:59:18.000Z +-75.295112 40.101272 16.799999237060547 +2013-07-25T20:59:19.000Z +-75.295132 40.101287 15.399999618530273 +2013-07-25T20:59:20.000Z +-75.295153 40.101304 15.100000381469727 +2013-07-25T20:59:21.000Z +-75.295174 40.10132 15.100000381469727 +2013-07-25T20:59:22.000Z +-75.295196 40.101336 15.5 +2013-07-25T20:59:23.000Z +-75.295218 40.101352 15.600000381469727 +2013-07-25T20:59:24.000Z +-75.295242 40.101368 15.800000190734863 +2013-07-25T20:59:25.000Z +-75.295266 40.101386 15.199999809265137 +2013-07-25T20:59:26.000Z +-75.29529 40.101404 15.5 +2013-07-25T20:59:27.000Z +-75.295315 40.101424 15.699999809265137 +2013-07-25T20:59:28.000Z +-75.295342 40.101444 15.899999618530273 +2013-07-25T20:59:29.000Z +-75.295367 40.101464 16.0 +2013-07-25T20:59:30.000Z +-75.295392 40.101484 15.5 +2013-07-25T20:59:31.000Z +-75.295418 40.101505 15.600000381469727 +2013-07-25T20:59:32.000Z +-75.295444 40.101527 15.399999618530273 +2013-07-25T20:59:33.000Z +-75.295468 40.10155 15.899999618530273 +2013-07-25T20:59:34.000Z +-75.29549 40.101571 16.799999237060547 +2013-07-25T20:59:35.000Z +-75.295514 40.101594 16.700000762939453 +2013-07-25T20:59:36.000Z +-75.295536 40.101619 15.899999618530273 +2013-07-25T20:59:37.000Z +-75.295557 40.101643 15.600000381469727 +2013-07-25T20:59:38.000Z +-75.295579 40.101669 14.699999809265137 +2013-07-25T20:59:39.000Z +-75.295598 40.101698 14.100000381469727 +2013-07-25T20:59:40.000Z +-75.295616 40.101731 14.800000190734863 +2013-07-25T20:59:41.000Z +-75.295635 40.101764 14.399999618530273 +2013-07-25T20:59:42.000Z +-75.295654 40.101797 15.899999618530273 +2013-07-25T20:59:43.000Z +-75.295673 40.101831 15.699999809265137 +2013-07-25T20:59:44.000Z +-75.295691 40.101868 14.899999618530273 +2013-07-25T20:59:45.000Z +-75.29571 40.101906 14.199999809265137 +2013-07-25T20:59:46.000Z +-75.295726 40.101945 13.800000190734863 +2013-07-25T20:59:47.000Z +-75.295741 40.101986 14.0 +2013-07-25T20:59:48.000Z +-75.295759 40.102029 14.399999618530273 +2013-07-25T20:59:49.000Z +-75.295778 40.102066 16.5 +2013-07-25T20:59:50.000Z +-75.295798 40.102102 17.700000762939453 +2013-07-25T20:59:51.000Z +-75.295817 40.10214 16.799999237060547 +2013-07-25T20:59:52.000Z +-75.295828 40.102193 15.399999618530273 +2013-07-25T20:59:53.000Z +-75.295843 40.102236 14.300000190734863 +2013-07-25T20:59:54.000Z +-75.295863 40.102278 14.300000190734863 +2013-07-25T20:59:55.001Z +-75.29588 40.102321 14.300000190734863 +2013-07-25T20:59:56.000Z +-75.295894 40.102359 14.100000381469727 +2013-07-25T20:59:57.000Z +-75.295913 40.102395 15.0 +2013-07-25T20:59:58.000Z +-75.295934 40.102435 14.899999618530273 +2013-07-25T20:59:59.000Z +-75.295951 40.10247 15.300000190734863 +2013-07-25T21:00:00.000Z +-75.295974 40.102509 14.399999618530273 +2013-07-25T21:00:01.000Z +-75.295993 40.102546 14.0 +2013-07-25T21:00:02.000Z +-75.296007 40.102577 13.800000190734863 +2013-07-25T21:00:03.000Z +-75.296019 40.102609 13.699999809265137 +2013-07-25T21:00:04.000Z +-75.296035 40.102642 13.699999809265137 +2013-07-25T21:00:05.000Z +-75.296046 40.102667 14.100000381469727 +2013-07-25T21:00:06.000Z +-75.296058 40.10269 14.600000381469727 +2013-07-25T21:00:07.000Z +-75.29607 40.102711 15.100000381469727 +2013-07-25T21:00:08.000Z +-75.296083 40.102735 15.399999618530273 +2013-07-25T21:00:09.000Z +-75.296095 40.102752 16.799999237060547 +2013-07-25T21:00:11.000Z +-75.296115 40.102792 17.799999237060547 +2013-07-25T21:00:12.000Z +-75.296124 40.102816 17.700000762939453 +2013-07-25T21:00:13.000Z +-75.296132 40.102842 17.299999237060547 +2013-07-25T21:00:14.000Z +-75.296143 40.102871 17.700000762939453 +2013-07-25T21:00:15.000Z +-75.296155 40.102901 17.600000381469727 +2013-07-25T21:00:16.000Z +-75.296169 40.10293 18.600000381469727 +2013-07-25T21:00:17.000Z +-75.296184 40.102956 19.299999237060547 +2013-07-25T21:00:18.000Z +-75.2962 40.10298 19.5 +2013-07-25T21:00:18.999Z +-75.296217 40.103004 19.899999618530273 +2013-07-25T21:00:20.000Z +-75.296237 40.103029 20.399999618530273 +2013-07-25T21:00:21.000Z +-75.296253 40.103055 19.799999237060547 +2013-07-25T21:00:22.000Z +-75.296268 40.103082 19.200000762939453 +2013-07-25T21:00:23.000Z +-75.296283 40.103108 20.0 +2013-07-25T21:00:24.000Z +-75.2963 40.103136 19.799999237060547 +2013-07-25T21:00:25.000Z +-75.296314 40.103162 19.700000762939453 +2013-07-25T21:00:26.000Z +-75.296331 40.103186 20.200000762939453 +2013-07-25T21:00:27.000Z +-75.296345 40.103212 20.100000381469727 +2013-07-25T21:00:28.000Z +-75.296359 40.103238 20.299999237060547 +2013-07-25T21:00:29.000Z +-75.29637 40.103263 20.299999237060547 +2013-07-25T21:00:30.000Z +-75.296381 40.103287 20.5 +2013-07-25T21:00:31.000Z +-75.296393 40.103312 20.100000381469727 +2013-07-25T21:00:32.000Z +-75.296408 40.103335 20.5 +2013-07-25T21:00:33.000Z +-75.296424 40.103357 20.799999237060547 +2013-07-25T21:00:34.000Z +-75.29644 40.10338 20.899999618530273 +2013-07-25T21:00:35.000Z +-75.296457 40.103404 20.0 +2013-07-25T21:00:36.000Z +-75.296474 40.103429 20.5 +2013-07-25T21:00:37.000Z +-75.296489 40.103453 20.700000762939453 +2013-07-25T21:00:38.000Z +-75.296505 40.103477 21.899999618530273 +2013-07-25T21:00:39.000Z +-75.29652 40.1035 22.100000381469727 +2013-07-25T21:00:40.000Z +-75.296535 40.103526 21.600000381469727 +2013-07-25T21:00:41.000Z +-75.296548 40.10355 21.899999618530273 +2013-07-25T21:00:42.000Z +-75.296563 40.103574 21.899999618530273 +2013-07-25T21:00:43.000Z +-75.296578 40.1036 22.100000381469727 +2013-07-25T21:00:44.000Z +-75.296595 40.103629 21.600000381469727 +2013-07-25T21:00:44.999Z +-75.296611 40.103656 21.5 +2013-07-25T21:00:46.000Z +-75.296627 40.103684 21.0 +2013-07-25T21:00:47.000Z +-75.29664 40.103713 18.700000762939453 +2013-07-25T21:00:48.000Z +-75.296653 40.103741 18.600000381469727 +2013-07-25T21:00:49.000Z +-75.296665 40.103765 18.399999618530273 +2013-07-25T21:00:50.000Z +-75.29668 40.103789 18.799999237060547 +2013-07-25T21:00:51.000Z +-75.296696 40.103811 18.899999618530273 +2013-07-25T21:00:52.000Z +-75.296711 40.103835 18.100000381469727 +2013-07-25T21:00:53.000Z +-75.296726 40.103858 18.399999618530273 +2013-07-25T21:00:54.000Z +-75.296742 40.103881 18.700000762939453 +2013-07-25T21:00:55.000Z +-75.29676 40.103905 19.0 +2013-07-25T21:00:56.000Z +-75.29678 40.103929 18.899999618530273 +2013-07-25T21:00:57.000Z +-75.2968 40.103953 18.799999237060547 +2013-07-25T21:00:58.000Z +-75.296817 40.103977 19.200000762939453 +2013-07-25T21:00:59.000Z +-75.296835 40.104001 19.399999618530273 +2013-07-25T21:01:00.001Z +-75.296851 40.104025 18.600000381469727 +2013-07-25T21:01:02.000Z +-75.296884 40.104055 20.600000381469727 +2013-07-25T21:01:03.000Z +-75.296902 40.10407 20.600000381469727 +2013-07-25T21:01:04.000Z +-75.296921 40.104088 20.799999237060547 +2013-07-25T21:01:05.000Z +-75.296939 40.104105 21.100000381469727 +2013-07-25T21:01:06.000Z +-75.296958 40.104125 20.799999237060547 +2013-07-25T21:01:07.000Z +-75.296975 40.104145 21.0 +2013-07-25T21:01:08.000Z +-75.296992 40.104167 21.200000762939453 +2013-07-25T21:01:09.000Z +-75.297008 40.10419 21.100000381469727 +2013-07-25T21:01:10.000Z +-75.297025 40.104212 21.399999618530273 +2013-07-25T21:01:11.000Z +-75.297042 40.104233 21.799999237060547 +2013-07-25T21:01:12.000Z +-75.297063 40.104256 21.799999237060547 +2013-07-25T21:01:13.000Z +-75.297085 40.104277 21.799999237060547 +2013-07-25T21:01:14.000Z +-75.29711 40.104297 22.0 +2013-07-25T21:01:15.000Z +-75.297134 40.104315 22.600000381469727 +2013-07-25T21:01:16.000Z +-75.297159 40.104332 22.899999618530273 +2013-07-25T21:01:17.000Z +-75.297183 40.104347 22.899999618530273 +2013-07-25T21:01:18.000Z +-75.297207 40.104362 23.799999237060547 +2013-07-25T21:01:19.000Z +-75.297231 40.104376 23.899999618530273 +2013-07-25T21:01:20.000Z +-75.297252 40.104394 22.0 +2013-07-25T21:01:21.000Z +-75.297273 40.104413 21.200000762939453 +2013-07-25T21:01:22.000Z +-75.297294 40.10443 21.200000762939453 +2013-07-25T21:01:23.000Z +-75.297316 40.104448 20.899999618530273 +2013-07-25T21:01:24.000Z +-75.297341 40.104464 21.799999237060547 +2013-07-25T21:01:25.000Z +-75.297366 40.104479 21.5 +2013-07-25T21:01:26.000Z +-75.297392 40.104494 21.399999618530273 +2013-07-25T21:01:27.000Z +-75.297419 40.104508 21.399999618530273 +2013-07-25T21:01:29.000Z +-75.297465 40.104533 22.700000762939453 +2013-07-25T21:01:30.000Z +-75.297487 40.104546 22.5 +2013-07-25T21:01:31.000Z +-75.29751 40.104562 22.5 +2013-07-25T21:01:32.000Z +-75.297534 40.104581 22.399999618530273 +2013-07-25T21:01:33.000Z +-75.297558 40.1046 22.700000762939453 +2013-07-25T21:01:34.000Z +-75.297583 40.10462 23.100000381469727 +2013-07-25T21:01:35.000Z +-75.29761 40.104639 22.799999237060547 +2013-07-25T21:01:36.000Z +-75.297639 40.104659 22.899999618530273 +2013-07-25T21:01:37.000Z +-75.297668 40.104678 23.299999237060547 +2013-07-25T21:01:38.000Z +-75.297699 40.104697 23.799999237060547 +2013-07-25T21:01:39.000Z +-75.297728 40.104717 23.799999237060547 +2013-07-25T21:01:40.000Z +-75.297756 40.104738 23.899999618530273 +2013-07-25T21:01:41.000Z +-75.297781 40.104759 23.600000381469727 +2013-07-25T21:01:42.000Z +-75.297806 40.104779 24.0 +2013-07-25T21:01:43.000Z +-75.297831 40.104801 23.899999618530273 +2013-07-25T21:01:44.000Z +-75.29786 40.104824 24.5 +2013-07-25T21:01:45.000Z +-75.297887 40.104845 23.700000762939453 +2013-07-25T21:01:46.000Z +-75.297919 40.104864 23.799999237060547 +2013-07-25T21:01:47.000Z +-75.297952 40.104881 23.600000381469727 +2013-07-25T21:01:48.000Z +-75.297987 40.104898 23.700000762939453 +2013-07-25T21:01:49.000Z +-75.29802 40.104914 23.899999618530273 +2013-07-25T21:01:50.000Z +-75.298052 40.104929 23.899999618530273 +2013-07-25T21:01:51.000Z +-75.298084 40.104945 23.700000762939453 +2013-07-25T21:01:52.000Z +-75.298116 40.10496 23.700000762939453 +2013-07-25T21:01:53.000Z +-75.298146 40.104975 23.700000762939453 +2013-07-25T21:01:54.000Z +-75.298178 40.10499 23.200000762939453 +2013-07-25T21:01:55.000Z +-75.298211 40.105007 22.799999237060547 +2013-07-25T21:01:56.000Z +-75.298247 40.105026 23.200000762939453 +2013-07-25T21:01:57.000Z +-75.298283 40.105044 24.0 +2013-07-25T21:01:58.000Z +-75.298318 40.10506 24.0 +2013-07-25T21:01:59.000Z +-75.298357 40.105079 23.600000381469727 +2013-07-25T21:02:00.000Z +-75.298398 40.105099 23.299999237060547 +2013-07-25T21:02:01.000Z +-75.298441 40.105119 22.799999237060547 +2013-07-25T21:02:02.000Z +-75.298484 40.105141 22.200000762939453 +2013-07-25T21:02:03.000Z +-75.29853 40.105163 22.299999237060547 +2013-07-25T21:02:04.000Z +-75.298576 40.105186 22.299999237060547 +2013-07-25T21:02:05.000Z +-75.29862 40.105207 22.0 +2013-07-25T21:02:06.000Z +-75.298664 40.10523 21.700000762939453 +2013-07-25T21:02:07.000Z +-75.298706 40.105253 21.799999237060547 +2013-07-25T21:02:08.000Z +-75.29875 40.105277 21.700000762939453 +2013-07-25T21:02:09.000Z +-75.298793 40.1053 21.799999237060547 +2013-07-25T21:02:10.000Z +-75.298835 40.105322 22.200000762939453 +2013-07-25T21:02:11.000Z +-75.298877 40.105343 22.600000381469727 +2013-07-25T21:02:12.000Z +-75.298919 40.105366 22.5 +2013-07-25T21:02:13.000Z +-75.298958 40.105388 22.700000762939453 +2013-07-25T21:02:14.000Z +-75.298994 40.105411 22.100000381469727 +2013-07-25T21:02:15.000Z +-75.299029 40.105436 20.799999237060547 +2013-07-25T21:02:16.000Z +-75.299061 40.105462 20.600000381469727 +2013-07-25T21:02:17.000Z +-75.299089 40.105486 21.600000381469727 +2013-07-25T21:02:18.000Z +-75.299117 40.105511 21.899999618530273 +2013-07-25T21:02:19.000Z +-75.299142 40.105536 22.399999618530273 +2013-07-25T21:02:20.000Z +-75.299165 40.105561 22.799999237060547 +2013-07-25T21:02:21.000Z +-75.299183 40.105583 22.700000762939453 +2013-07-25T21:02:22.000Z +-75.299198 40.105607 23.100000381469727 +2013-07-25T21:02:23.000Z +-75.299211 40.105632 22.899999618530273 +2013-07-25T21:02:24.000Z +-75.299225 40.105658 22.899999618530273 +2013-07-25T21:02:25.000Z +-75.299239 40.105684 22.799999237060547 +2013-07-25T21:02:26.000Z +-75.299256 40.105711 23.100000381469727 +2013-07-25T21:02:27.000Z +-75.299275 40.10574 23.700000762939453 +2013-07-25T21:02:28.000Z +-75.299292 40.105767 24.5 +2013-07-25T21:02:29.000Z +-75.299306 40.105792 24.299999237060547 +2013-07-25T21:02:30.000Z +-75.299322 40.105813 25.899999618530273 +2013-07-25T21:02:31.000Z +-75.29934 40.105832 27.0 +2013-07-25T21:02:32.000Z +-75.299362 40.10585 27.899999618530273 +2013-07-25T21:02:33.000Z +-75.299382 40.105866 27.600000381469727 +2013-07-25T21:02:34.000Z +-75.299404 40.105883 28.899999618530273 +2013-07-25T21:02:35.000Z +-75.299424 40.105903 29.799999237060547 +2013-07-25T21:02:36.000Z +-75.299446 40.105925 30.600000381469727 +2013-07-25T21:02:37.000Z +-75.299469 40.105946 31.100000381469727 +2013-07-25T21:02:38.000Z +-75.29949 40.10597 30.399999618530273 +2013-07-25T21:02:39.000Z +-75.299508 40.105998 29.600000381469727 +2013-07-25T21:02:40.000Z +-75.299526 40.106024 29.100000381469727 +2013-07-25T21:02:41.000Z +-75.299544 40.106059 30.100000381469727 +2013-07-25T21:02:42.000Z +-75.299563 40.106089 30.100000381469727 +2013-07-25T21:02:42.999Z +-75.299581 40.106117 30.0 +2013-07-25T21:02:44.000Z +-75.299607 40.106149 29.600000381469727 +2013-07-25T21:02:45.000Z +-75.299632 40.106176 31.299999237060547 +2013-07-25T21:02:46.000Z +-75.299658 40.106204 30.200000762939453 +2013-07-25T21:02:47.000Z +-75.299684 40.106235 29.799999237060547 +2013-07-25T21:02:48.000Z +-75.29971 40.106268 30.0 +2013-07-25T21:02:49.000Z +-75.299739 40.106302 31.5 +2013-07-25T21:02:50.000Z +-75.299766 40.106342 29.299999237060547 +2013-07-25T21:02:51.000Z +-75.299799 40.106409 29.5 +2013-07-25T21:02:52.000Z +-75.299829 40.106447 29.200000762939453 +2013-07-25T21:02:53.000Z +-75.299853 40.106503 27.200000762939453 +2013-07-25T21:02:54.000Z +-75.29988 40.106552 25.100000381469727 +2013-07-25T21:02:55.000Z +-75.299926 40.106595 24.399999618530273 +2013-07-25T21:02:56.000Z +-75.299985 40.106643 23.5 +2013-07-25T21:02:57.000Z +-75.300055 40.106684 24.0 +2013-07-25T21:02:58.000Z +-75.300112 40.106723 23.399999618530273 +2013-07-25T21:02:59.000Z +-75.300182 40.106754 22.100000381469727 +2013-07-25T21:03:00.000Z +-75.300262 40.106774 21.600000381469727 +2013-07-25T21:03:01.000Z +-75.300341 40.106792 21.700000762939453 +2013-07-25T21:03:02.000Z +-75.300425 40.106801 21.100000381469727 +2013-07-25T21:03:03.000Z +-75.300502 40.106803 20.5 +2013-07-25T21:03:04.000Z +-75.300585 40.106807 20.100000381469727 +2013-07-25T21:03:05.000Z +-75.300669 40.106815 20.399999618530273 +2013-07-25T21:03:06.000Z +-75.300755 40.106822 20.899999618530273 +2013-07-25T21:03:07.000Z +-75.300842 40.106829 21.600000381469727 +2013-07-25T21:03:08.000Z +-75.300926 40.106839 21.0 +2013-07-25T21:03:09.000Z +-75.300999 40.106848 21.100000381469727 +2013-07-25T21:03:10.000Z +-75.301068 40.106859 21.299999237060547 +2013-07-25T21:03:11.000Z +-75.301143 40.106869 21.100000381469727 +2013-07-25T21:03:12.000Z +-75.301224 40.106893 21.100000381469727 +2013-07-25T21:03:13.000Z +-75.301254 40.1069 21.200000762939453 +2013-07-25T21:03:14.000Z +-75.301323 40.106917 21.700000762939453 +2013-07-25T21:03:15.000Z +-75.301374 40.106917 21.600000381469727 +2013-07-25T21:03:16.000Z +-75.301464 40.106959 21.200000762939453 +2013-07-25T21:03:17.000Z +-75.301518 40.106974 20.600000381469727 +2013-07-25T21:03:18.000Z +-75.301587 40.106997 21.299999237060547 +2013-07-25T21:03:19.000Z +-75.301645 40.107025 22.0 +2013-07-25T21:03:20.000Z +-75.301705 40.107053 23.200000762939453 +2013-07-25T21:03:21.000Z +-75.301763 40.107075 23.700000762939453 +2013-07-25T21:03:22.000Z +-75.301805 40.107105 24.299999237060547 +2013-07-25T21:03:23.000Z +-75.301856 40.10712 26.100000381469727 +2013-07-25T21:03:24.000Z +-75.301892 40.107115 29.5 +2013-07-25T21:03:24.999Z +-75.301923 40.10711 33.0 +2013-07-25T21:03:26.000Z +-75.301985 40.107176 27.899999618530273 +2013-07-25T21:03:27.000Z +-75.302044 40.10721 27.899999618530273 +2013-07-25T21:03:28.000Z +-75.302101 40.107226 27.200000762939453 +2013-07-25T21:03:29.000Z +-75.302164 40.107279 26.5 +2013-07-25T21:03:30.000Z +-75.302245 40.107302 25.299999237060547 +2013-07-25T21:03:31.000Z +-75.302317 40.107331 24.700000762939453 +2013-07-25T21:03:32.000Z +-75.302378 40.107361 25.200000762939453 +2013-07-25T21:03:33.000Z +-75.302434 40.107393 24.5 +2013-07-25T21:03:34.000Z +-75.302499 40.107427 24.0 +2013-07-25T21:03:35.000Z +-75.302572 40.107476 22.899999618530273 +2013-07-25T21:03:36.000Z +-75.302662 40.107518 21.799999237060547 +2013-07-25T21:03:37.000Z +-75.302755 40.107559 20.600000381469727 +2013-07-25T21:03:38.000Z +-75.30286 40.107603 19.799999237060547 +2013-07-25T21:03:39.000Z +-75.302962 40.107664 19.600000381469727 +2013-07-25T21:03:40.000Z +-75.30306 40.107713 19.399999618530273 +2013-07-25T21:03:41.000Z +-75.303157 40.107756 19.399999618530273 +2013-07-25T21:03:42.000Z +-75.3032 40.107813 19.200000762939453 +2013-07-25T21:03:43.000Z +-75.303265 40.107865 19.200000762939453 +2013-07-25T21:03:44.000Z +-75.303333 40.107914 19.200000762939453 +2013-07-25T21:03:45.000Z +-75.303401 40.107965 19.299999237060547 +2013-07-25T21:03:46.000Z +-75.303449 40.107945 19.299999237060547 +2013-07-25T21:03:47.000Z +-75.30343 40.107908 18.5 +2013-07-25T21:03:48.000Z +-75.303228 40.108026 17.899999618530273 +2013-07-25T21:03:49.000Z +-75.303185 40.108035 17.5 +2013-07-25T21:03:50.000Z +-75.303156 40.108056 17.899999618530273 +2013-07-25T21:03:51.000Z +-75.303115 40.108071 17.899999618530273 +2013-07-25T21:03:52.000Z +-75.303066 40.108088 18.200000762939453 +2013-07-25T21:03:53.000Z +-75.303014 40.108101 18.100000381469727 +2013-07-25T21:03:54.000Z +-75.302965 40.108121 17.700000762939453 +2013-07-25T21:03:55.000Z +-75.30291 40.108138 17.100000381469727 +2013-07-25T21:03:56.000Z +-75.302859 40.108151 17.200000762939453 +2013-07-25T21:03:57.000Z +-75.302808 40.108162 17.299999237060547 +2013-07-25T21:03:58.000Z +-75.302759 40.108174 17.700000762939453 +2013-07-25T21:03:59.000Z +-75.302708 40.108189 18.0 +2013-07-25T21:04:00.000Z +-75.302668 40.108207 17.899999618530273 +2013-07-25T21:04:01.000Z +-75.302623 40.108216 18.899999618530273 +2013-07-25T21:04:02.000Z +-75.302578 40.108226 18.700000762939453 +2013-07-25T21:04:03.000Z +-75.30254 40.108235 19.200000762939453 +2013-07-25T21:04:04.000Z +-75.302502 40.108245 20.0 +2013-07-25T21:04:05.000Z +-75.302463 40.108256 20.0 +2013-07-25T21:04:06.000Z +-75.302421 40.108265 20.100000381469727 +2013-07-25T21:04:07.000Z +-75.302377 40.108276 18.799999237060547 +2013-07-25T21:04:08.000Z +-75.302331 40.108287 18.200000762939453 +2013-07-25T21:04:09.000Z +-75.302287 40.108297 18.299999237060547 +2013-07-25T21:04:10.000Z +-75.302248 40.108308 18.899999618530273 +2013-07-25T21:04:11.000Z +-75.30221 40.108317 19.299999237060547 +2013-07-25T21:04:12.000Z +-75.302171 40.108326 19.399999618530273 +2013-07-25T21:04:13.000Z +-75.302132 40.108336 19.5 +2013-07-25T21:04:14.000Z +-75.302091 40.108346 18.899999618530273 +2013-07-25T21:04:15.000Z +-75.302044 40.108359 18.5 +2013-07-25T21:04:16.000Z +-75.301995 40.108372 18.200000762939453 +2013-07-25T21:04:17.000Z +-75.301951 40.108387 18.799999237060547 +2013-07-25T21:04:18.000Z +-75.30191 40.108399 18.700000762939453 +2013-07-25T21:04:19.000Z +-75.301867 40.108411 19.100000381469727 +2013-07-25T21:04:20.000Z +-75.301832 40.108418 23.799999237060547 +2013-07-25T21:04:21.000Z +-75.301794 40.108424 23.399999618530273 +2013-07-25T21:04:22.000Z +-75.30176 40.108428 23.399999618530273 +2013-07-25T21:04:23.000Z +-75.301724 40.108432 23.5 +2013-07-25T21:04:24.000Z +-75.301683 40.108439 23.5 +2013-07-25T21:04:25.000Z +-75.301643 40.108447 23.5 +2013-07-25T21:04:26.000Z +-75.301604 40.108456 22.5 +2013-07-25T21:04:27.000Z +-75.301563 40.108466 22.299999237060547 +2013-07-25T21:04:28.000Z +-75.301523 40.108476 23.299999237060547 +2013-07-25T21:04:29.000Z +-75.301486 40.108485 23.399999618530273 +2013-07-25T21:04:30.000Z +-75.301447 40.108494 20.600000381469727 +2013-07-25T21:04:31.000Z +-75.301407 40.108503 21.600000381469727 +2013-07-25T21:04:32.000Z +-75.301369 40.108511 22.799999237060547 +2013-07-25T21:04:33.000Z +-75.301339 40.108523 23.5 +2013-07-25T21:04:35.000Z +-75.301295 40.108547 23.799999237060547 +2013-07-25T21:04:36.000Z +-75.301265 40.108559 24.5 +2013-07-25T21:04:37.000Z +-75.301228 40.108567 24.200000762939453 +2013-07-25T21:04:38.000Z +-75.301187 40.108573 24.399999618530273 +2013-07-25T21:04:39.000Z +-75.301147 40.108581 24.600000381469727 +2013-07-25T21:04:40.000Z +-75.301105 40.108588 24.5 +2013-07-25T21:04:41.000Z +-75.301064 40.108595 24.299999237060547 +2013-07-25T21:04:42.000Z +-75.30103 40.1086 26.5 +2013-07-25T21:04:43.000Z +-75.300999 40.108604 27.700000762939453 +2013-07-25T21:04:44.000Z +-75.300965 40.10861 26.600000381469727 +2013-07-25T21:04:45.000Z +-75.30093 40.108617 26.299999237060547 +2013-07-25T21:04:46.000Z +-75.300896 40.108626 27.0 +2013-07-25T21:04:47.000Z +-75.30086 40.108634 27.799999237060547 +2013-07-25T21:04:48.000Z +-75.300826 40.10864 28.200000762939453 +2013-07-25T21:04:49.000Z +-75.300795 40.108646 28.799999237060547 +2013-07-25T21:04:50.000Z +-75.300765 40.108651 29.200000762939453 +2013-07-25T21:04:51.000Z +-75.300734 40.108657 29.399999618530273 +2013-07-25T21:04:52.000Z +-75.300706 40.108661 31.399999618530273 +2013-07-25T21:04:54.000Z +-75.300652 40.108669 31.700000762939453 +2013-07-25T21:04:55.000Z +-75.300624 40.108674 31.799999237060547 +2013-07-25T21:04:57.000Z +-75.30058 40.108703 30.799999237060547 +2013-07-25T21:04:58.000Z +-75.300572 40.108724 30.600000381469727 +2013-07-25T21:04:59.000Z +-75.300571 40.108749 31.200000762939453 +2013-07-25T21:05:00.000Z +-75.30057 40.108777 30.399999618530273 +2013-07-25T21:05:01.000Z +-75.300569 40.108803 31.0 +2013-07-25T21:05:02.000Z +-75.300568 40.108827 29.899999618530273 +2013-07-25T21:05:03.000Z +-75.300566 40.108853 29.0 +2013-07-25T21:05:04.000Z +-75.300566 40.108881 28.200000762939453 +2013-07-25T21:05:05.000Z +-75.300568 40.10891 28.100000381469727 +2013-07-25T21:05:06.000Z +-75.300572 40.108939 27.700000762939453 +2013-07-25T21:05:07.000Z +-75.300576 40.108967 28.600000381469727 +2013-07-25T21:05:08.000Z +-75.300581 40.108991 29.799999237060547 +2013-07-25T21:05:10.000Z +-75.300597 40.109032 29.899999618530273 +2013-07-25T21:05:11.000Z +-75.300606 40.10905 30.200000762939453 +2013-07-25T21:05:13.001Z +-75.300618 40.109086 29.200000762939453 +2013-07-25T21:05:14.000Z +-75.300629 40.109097 31.0 +2013-07-25T21:05:17.000Z +-75.300655 40.109134 30.600000381469727 +2013-07-25T21:05:18.000Z +-75.300656 40.109149 31.700000762939453 +2013-07-25T21:05:20.000Z +-75.300654 40.109178 32.70000076293945 +2013-07-25T21:05:21.000Z +-75.300646 40.109199 28.899999618530273 +2013-07-25T21:05:22.000Z +-75.300632 40.109226 25.799999237060547 +2013-07-25T21:05:23.000Z +-75.300612 40.109256 25.0 +2013-07-25T21:05:24.000Z +-75.300589 40.109292 24.5 +2013-07-25T21:05:25.000Z +-75.300565 40.109328 25.200000762939453 +2013-07-25T21:05:26.000Z +-75.300475 40.109381 25.799999237060547 +2013-07-25T21:05:27.000Z +-75.300441 40.109423 24.899999618530273 +2013-07-25T21:05:28.000Z +-75.300417 40.109458 24.600000381469727 +2013-07-25T21:05:29.000Z +-75.3004 40.109496 24.700000762939453 +2013-07-25T21:05:30.000Z +-75.300397 40.109523 25.5 +2013-07-25T21:05:31.000Z +-75.300397 40.109552 26.0 +2013-07-25T21:05:33.999Z +-75.300394 40.109589 28.299999237060547 +2013-07-25T21:05:35.000Z +-75.300397 40.109601 29.100000381469727 +2013-07-25T21:05:38.000Z +-75.30039 40.10964 30.799999237060547 +2013-07-25T21:05:39.000Z +-75.300381 40.109649 32.20000076293945 +2013-07-25T21:05:47.999Z +-75.300355 40.109624 35.70000076293945 +2013-07-25T21:05:49.000Z +-75.3003 40.109628 34.099998474121094 +2013-07-25T21:06:14.000Z +-75.300243 40.109622 33.900001525878906 +2013-07-25T21:06:15.000Z +-75.300232 40.10962 34.20000076293945 +2013-07-25T21:06:59.000Z +-75.300255 40.109655 35.29999923706055 +2013-07-25T21:07:00.000Z +-75.300242 40.109664 34.70000076293945 +2013-07-25T21:07:02.000Z +-75.300212 40.109686 34.29999923706055 +2013-07-25T21:07:03.000Z +-75.300196 40.109696 34.0 +2013-07-25T21:07:06.000Z +-75.300147 40.109702 33.79999923706055 +2013-07-25T21:07:07.000Z +-75.300127 40.109701 33.599998474121094 +2013-07-25T21:07:11.000Z +-75.300071 40.10971 33.400001525878906 +2013-07-25T21:07:12.000Z +-75.300061 40.10971 33.400001525878906 +2013-07-25T21:07:25.000Z +-75.30001 40.109709 33.29999923706055 + + + + + + +
    + + +2013-07-25T21:07:25.000Z +#end + +-75.30001,40.109709,33.29999923706055 + + +
    +
    diff --git a/packages/sandcastle/public/SampleData/kml/eiffel-tower-flyto.kml b/packages/sandcastle/public/SampleData/kml/eiffel-tower-flyto.kml new file mode 100644 index 000000000000..7669803cb8b5 --- /dev/null +++ b/packages/sandcastle/public/SampleData/kml/eiffel-tower-flyto.kml @@ -0,0 +1,46 @@ + + + + Eiffel Tower Flyto + 1 + 0 + + AutoPlay + 1 + 0 + + + eiffel-tower-flyto + + + 0.2 + + + 6 + + 2.29448129999356 + 48.8583700998311 + 196.5753973788714 + 0.0 + 67.0 + 1500.0 + relativeToSeaFloor + + + + 4 + + + 6 + + 170.157 + -43.671 + 9700 + -6.333 + 33.5 + + + + + + diff --git a/packages/sandcastle/public/SampleData/kml/facilities/GroundStation.png b/packages/sandcastle/public/SampleData/kml/facilities/GroundStation.png new file mode 100644 index 0000000000000000000000000000000000000000..3d570f9b071353ef0d7b549ad7067a196958fc03 GIT binary patch literal 7043 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 literal 0 HcmV?d00001 diff --git a/packages/sandcastle/public/SampleData/kml/facilities/LaunchSite.png b/packages/sandcastle/public/SampleData/kml/facilities/LaunchSite.png new file mode 100644 index 0000000000000000000000000000000000000000..9b1b761c3fd2847e9955cb51bb46039f2be76c1c GIT binary patch literal 5655 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 literal 0 HcmV?d00001 diff --git a/packages/sandcastle/public/SampleData/kml/facilities/OpticalTrackingStation.png b/packages/sandcastle/public/SampleData/kml/facilities/OpticalTrackingStation.png new file mode 100644 index 0000000000000000000000000000000000000000..a03b407241960602233d90f0c1db937c0d32e359 GIT binary patch literal 2538 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 + + + Group 8 + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/packages/sandcastle/public/SampleData/kml/facilities/facilities.kml b/packages/sandcastle/public/SampleData/kml/facilities/facilities.kml new file mode 100644 index 000000000000..81fe52f08760 --- /dev/null +++ b/packages/sandcastle/public/SampleData/kml/facilities/facilities.kml @@ -0,0 +1 @@ +MACRES Ground Receiving Station#GroundStation102.339,3.463Ground StationActiveMalaysiaALCOR STDN KMRQ#RadarStation167.48284936,9.39859958Radar StationActiveMarshall IslandsGuiana Space Center - ZL3 (STDN KR3P)#LaunchPad-52.75178147,5.24036314Launch PadActiveFrench GuianaAsan Teleport#GroundStation127.018,36.741Ground StationActiveSouth KoreaPillar Point STDN PP2F#GroundStation-122.49668389,37.49685436Ground StationActiveUnited StatesDiego Garcia GEODSS Cam3#OpticalTrackingStation72.45237,-7.41186Optical Tracking StationActiveUnited KingdomPlesetsk Cosmodrome#LaunchSite40.6,62.9Launch SiteActiveRussiaPhillips Hill STDN WH9F#GroundStation-106.13210839,33.44521867Ground StationActiveUnited StatesSantiago Station AGO 6#GroundStation-70.6701611,-33.1506778Ground StationActiveChileTanegashima#LaunchSite130.976,30.401Launch SiteActiveJapanBaikonur Cosmodrome - LC 90-19#LaunchPad62.9144,46.0863Launch PadActiveKazakhstanMid-Atlantic Regional Spaceport#LaunchSite-75.49,37.832Launch SiteActiveUnited StatesDombarovsky Cosmodrome x44#LaunchPad59.911557,51.54739Launch PadActiveRussiaFort Bliss#LaunchSite-106.1526,32.0737Launch SiteActiveUnited StatesSemnan Launch Center - xx3#LaunchPad53.952,35.239Launch PadActiveIranEarth Observation Center#GroundStation139.348734,36.002563Ground StationActiveJapanFillmore Teleport#GroundStation-118.894041,34.405802Ground StationActiveUnited StatesDSS 23 Goldstone#GroundStation-116.87295,35.33951Ground StationInactiveUnited StatesGTSA#GroundStation144.8560742,13.6151942Ground StationActiveUnited StatesAntigua STDN AN8S#GroundStation-61.77428983,17.13662489Ground StationActiveAntigua and BarbudaLandsat Station STDN SF1S#GroundStation-96.62251461,43.73607264Ground StationActiveUnited StatesZhanyi Station#GroundStation103.82,25.6Ground StationActiveChinaWallops Island STDN WP3S#GroundStation-75.47418797,37.92836117Ground StationActiveUnited StatesRAL Station 2m#GroundStation-1.31419,51.57159Ground StationActiveUnited KingdomMaryland LSE Leolut#GroundStation-76.93,38.850333Ground StationActiveUnited StatesSemnan Launch Center xx2#LaunchPad53.921,35.2347Launch PadActiveIranBaikonur Cosmodrome LC 200-40#LaunchPad63.0379,46.0364Launch PadActiveKazakhstanNakhodka Leolut#GroundStation132.7907,42.858666Ground StationPlannedRussiaXichang Satellite Launch Center - LA 4#LaunchPad102.0232,28.2495Launch PadActiveChinaBarking Sands LC 14#LaunchPad-159.7788,22.058Launch PadActiveUnited StatesDombarovsky Cosmodrome - x24#LaunchPad59.59691,51.150886Launch PadActiveRussiaWhite Sands Space STDN WSSH#GroundStation-106.46472222,32.88027778Ground StationActiveUnited StatesFort Detrick#GroundStation-77.416,39.443Ground StationActiveUnited StatesBristow Station#GroundStation-77.5732,38.7837Ground StationActiveUnited StatesTromsoe Leolut#GroundStation18.9403,69.662333Ground StationActiveNorwayTonghae Satellite Launching Ground#LaunchSite129.665994,40.855652Launch SiteActiveNorth KoreaDombarovsky Cosmodrome - x29#LaunchPad60.765442,51.201923Launch PadActiveRussiaVandenberg AFB SLC 1E#LaunchPad-120.6263,34.7561Launch PadInactiveUnited StatesSevastopol Radar#RadarStation33.386,44.579Radar StationActiveUkraineWallops Flight Facility - LA 2#LaunchPad-75.4834,37.8376Launch PadActiveUnited StatesOkno Complex#OpticalTrackingStation69.224,38.282Optical Tracking StationActiveTajikistanKapustin Yar - xx7#LaunchPad45.716196,48.812023Launch PadActiveRussiaKwajalein STDN KMRT#GroundStation167.71852428,8.71954542Ground StationInactiveMarshall IslandsXTAR 6m 2#GroundStation-15.63057,27.76272Ground StationActiveSpainWallops Flight Facility LA 1#LaunchPad-75.4861,37.8352Launch PadActiveUnited StatesPoker Flat LEO-T STDN LE1S#GroundStation-147.462255,65.11685167Ground StationActiveUnited StatesVLBA North Liberty#GroundStation-91.574133,41.771425Ground StationActiveUnited StatesWhite Sands - SULF#LaunchPad-106.7364,33.7212Launch PadActiveUnited StatesBaikonur Cosmodrome - LC 108#LaunchPad63.815,46.046Launch PadActiveKazakhstanBaikonur Cosmodrome LC 246#LaunchPad63.4236,45.7656Launch PadActiveKazakhstanMILA STDN MILA#GroundStation-80.69275272,28.50816025Ground StationInactiveUnited StatesMeck Island#LaunchSite167.727188,9.006637Launch SiteActiveMarshall IslandsVLBA Mauna Kea#GroundStation-155.455733,19.801415Ground StationActiveUnited StatesVandenberg STDN WULY#GroundStation-120.55598472,34.65541336Ground StationActiveUnited StatesCape Canaveral AFS SLC 17B STDN B17P#LaunchPad-80.56564944,28.44579042Launch PadActiveUnited StatesGRGT STDN GWMJ#GroundStation144.84080419,13.58675639Ground StationActiveUnited StatesJicamarca Radio Observatory#RadarStation-76.874,-11.951Radar StationActivePeruCarteret Station#GroundStation-74.2166,40.58Ground StationActiveUnited StatesSomis Station#GroundStation-118.996,34.325Ground StationActiveUnited StatesEchoStar New Braunfels Station#GroundStation-98.0635,29.7599Ground StationActiveUnited StatesKashima Space Research Center, 13m B#GroundStation140.66298,35.95631Ground StationActiveJapanOttawa 1 Geolut#GroundStation-75.674,45.329Ground StationActiveCanadaSvobodny Cosmodrome x10#LaunchPad128.3323,51.877Launch PadInactiveRussiaSvalbard STDN S22S#GroundStation15.381773,78.232908Ground StationActiveNorwayCamp Parks Communications Annex#GroundStation-121.881,37.7331Ground StationActiveUnited StatesKapustin Yar PL1#LaunchPad46.2621,48.4116Launch PadActiveRussiaBaikonur Cosmodrome - xx5#LaunchPad62.932319,46.081306Launch PadActiveKazakhstanMillstone Hill Steerable Antenna#RadarStation-71.4912,42.61959Radar StationActiveUnited StatesDombarovsky Cosmodrome - xx2#LaunchPad59.791895,50.681452Launch PadActiveRussiaKamisaibara Spaceguard Center#RadarStation133.9413,35.3125Radar StationActiveJapanMauritius#GroundStation57.52,-20.17Ground StationActiveMauritiusOrbcomm San Luis B#GroundStation-65.18199,-33.83795Ground StationActiveArgentinaDombarovsky Cosmodrome - x37#LaunchPad60.728749,51.301802Launch PadActiveRussiaOverberg Test Range#LaunchSite20.28,-34.61Launch SiteActiveSouth AfricaBermuda STDN BDAA#GroundStation-64.65878961,32.35115261Ground StationInactiveBermudaSemnan Launch Center xx4#LaunchPad53.955,35.258Launch PadActiveIranBaikonur Cosmodrome LC 172#LaunchPad63.092,46.065Launch PadActiveKazakhstanCape Canaveral AFS LC 3#LaunchPad-80.5363,28.4662Launch PadInactiveUnited StatesXichang LA 3#LaunchPad102.0271,28.2455Launch PadActiveChinaNatal Station STDN NATL#LaserStation-35.16455019,-5.92780617Laser StationInactiveBrazilBaikonur Cosmodrome - LC 200-39#LaunchPad63.032,46.0399Launch PadActiveKazakhstanWallops Island STDN HR1S#GroundStation-75.46113556,37.94549917Ground StationActiveUnited StatesWoomera Test Range LA 5B#LaunchPad136.4763,-30.9711Launch PadActiveAustraliaGreen Bank#GroundStation-79.83977,38.43297Ground StationActiveUnited StatesMukachevo Radar#RadarStation22.708,48.378Radar StationActiveUkraineHolloman SLED#LaunchPad-106.1484,32.9263Launch PadActiveUnited StatesNevada Test Site Area 26#LaunchSite-116.114,36.771Launch SiteActiveUnited StatesBaikonur Cosmodrome - LC 70#LaunchPad63.0963,46.0329Launch PadActiveKazakhstanEl Arenosillo#LaunchSite-6.733,37.098Launch SiteActiveSpainBaikonur Cosmodrome - LC 81-23#LaunchPad62.9785,46.074Launch PadActiveKazakhstanKeelung (1) Leolut#GroundStation121.7573,25.135333Ground StationActiveTaiwanPushkino Phased-array Radar#RadarStation37.769,56.173Radar StationActiveRussiaAuScope VLBI Hobart#GroundStation147.4381,-42.80557Ground StationActiveAustraliaSvalsat SG 5#GroundStation15.389123,78.230127Ground StationActiveNorwayQueensland Transmitter#RadarStation144.1454,-23.658Radar StationActiveAustraliaAlice Springs BRT STDN AL2J#GroundStation133.8825985,-23.75881044Ground StationActiveAustraliaSGS Oakhanger Site Annex#GroundStation-0.899,51.1095Ground StationActiveUnited KingdomBaikonur Cosmodrome LC 110L#LaunchPad63.3049,45.9647Launch PadActiveKazakhstanBaikonur Cosmodrome LC 45-2#LaunchPad63.6532,45.9433Launch PadActiveKazakhstanJiuquan Satellite Launch Center - LA 3#LaunchPad100.78,41.0152Launch PadActiveChinaBaikonur Cosmodrome - LC 241#LaunchPad63.4558,45.8583Launch PadActiveKazakhstanGrand Bahama Island STDN GBIQ#GroundStation-78.34784006,26.615642Ground StationInactiveBahamasOrbcomm Kijal A#GroundStation103.47377,4.34888Ground StationActiveMalaysiaMisawa Air Base Security Hill#GroundStation141.3225,40.72Ground StationActiveJapanMoscow Leolut#GroundStation37.7227,55.743333Ground StationPlannedRussiaWallops Flight Facility - LA 3A#LaunchPad-75.4726,37.848Launch PadActiveUnited StatesPoker Flat STDN PFTS#GroundStation-147.46329083,65.11679308Ground StationActiveUnited StatesEtisalat Jebel Ali Teleport#GroundStation55.1247,25.0306Ground StationActiveUnited Arab EmiratesPlesetsk Cosmodrome - LC 133-1#LaunchPad40.8468,62.8868Launch PadActiveRussiaKapustin Yar xx6#LaunchPad45.8152,48.783061Launch PadActiveRussiaAnkara (2) Leolut#GroundStation32.9897,40.140666Ground StationActiveTurkeySvobodny Cosmodrome - xx7#LaunchPad128.301,51.823Launch PadInactiveRussiaOnizuka Control Node xx2#GroundStation-122.029075,37.403492Ground StationInactiveUnited StatesCSTARS_West_11m#GroundStation-80.38489,25.61403Ground StationActiveUnited StatesMaspalomas (1) Geolut#GroundStation-15.634,27.764Ground StationActiveSpainGalenki RT-70#GroundStation131.757,44.0161Ground StationActiveRussiaSugar Grove Station#GroundStation-79.28,38.516Ground StationActiveUnited StatesEnnylabegan#GroundStation167.618495,8.797797Ground StationActiveMarshall IslandsFinegayan SATCOM Site#GroundStation144.849827,13.583618Ground StationActiveUnited StatesHawley Earth Station#GroundStation-75.13,41.46417Ground StationActiveUnited StatesKapustin Yar - xx1#LaunchPad46.318006,48.484051Launch PadActiveRussiaEsrange Station KSX#GroundStation21.0556028,67.8887061Ground StationActiveSwedenVTS STDN VTSS#GroundStation-120.50184844,34.82261656Ground StationActiveUnited StatesEchoStar Gilbert Station#GroundStation-111.8142,33.3655Ground StationActiveUnited StatesTriunfo Pass Station#GroundStation-118.8964,34.0808Ground StationActiveUnited StatesSocorro GEODSS, xx2#OpticalTrackingStation-106.65962,33.81725Optical Tracking StationActiveUnited StatesSaskatoon#GroundStation-106.62587,52.139427Ground StationActiveCanadaBaikonur Cosmodrome - LC 60-7#LaunchPad64.0173,46.0181Launch PadActiveKazakhstanHolloman NATIV#LaunchPad-106.0753,32.8866Launch PadActiveUnited StatesAscension Island STDN ACN3#GroundStation-14.32710328,-7.95488247Ground StationActiveUnited KingdomDombarovsky Cosmodrome x24#LaunchPad59.59691,51.150886Launch PadActiveRussiaBaikonur Cosmodrome - LC 103#LaunchPad63.4448,45.9523Launch PadActiveKazakhstanGoonhilly Satellite Earth Station#GroundStation-5.181944,50.048056Ground StationInactiveUnited KingdomEffelsberg Radio Telescope#GroundStation6.883417,50.525Ground StationActiveGermanyWallops Flight Facility LA 5#LaunchPad-75.4681,37.8529Launch PadActiveUnited StatesSouth Point Station USHI01#GroundStation-155.6633318,19.0139525Ground StationActiveUnited StatesUchinoura Lambda Pad#LaunchPad131.079125,31.251908Launch PadActiveJapanKapustin Yar START Pioner#LaunchPad46.3009,48.6149Launch PadActiveRussiaMount Pleasant 14m#GroundStation147.44165,-42.8034Ground StationActiveAustraliaHartebeesthoek STDN HBK3#GroundStation27.7126,-25.88672778Ground StationActiveSouth AfricaLake Kickapoo Space Fence#RadarStation-98.7628,33.5464Radar StationActiveUnited StatesEsrange Rocket Range - N#LaunchPad21.1064,67.8933Launch PadActiveSwedenSantiago Station AGO 3 STDN AGU3#GroundStation-70.666403,-33.15110747Ground StationActiveChileDakar STDN DAKS#GroundStation-17.12876689,14.72476222Ground StationActiveSenegalHartebeesthoek 5m#GroundStation27.70665,-25.88649Ground StationActiveSouth AfricaPhilippine Space Comm Center#GroundStation121.294,14.585Ground StationActivePhilippinesWenchang#LaunchSite111.01,19.68Launch SitePlannedChinaMaui GEODSS, xx3#OpticalTrackingStation-156.2575,20.7081Optical Tracking StationActiveUnited StatesBochum Observatory#GroundStation7.19257,51.42697Ground StationActiveGermanyMaui GEODSS Cam1#OpticalTrackingStation-156.2578,20.7081Optical Tracking StationActiveUnited StatesOttawa 2 Geolut#GroundStation-75.674333,45.3438Ground StationActiveCanadaHartebeesthoek Ka 13m#GroundStation27.70746,-25.88813Ground StationActiveSouth AfricaSANAE IV#GroundStation-2.8403,-71.6725Ground StationActiveAntarcticaKwajalein GPS Station#GroundStation167.731327,8.723044Ground StationActiveMarshall IslandsTowi Alsaman#GroundStation55.832,25.251Ground StationActiveUnited Arab EmiratesWhite Sands STDN ST3K#GroundStation-106.61208889,32.542675Ground StationActiveUnited StatesAlcantara Launch Center#LaunchSite-44.367,-2.317Launch SiteActiveBrazilSouth Point Station USHI02 STDN U2HS#GroundStation-155.66294408,19.01379344Ground StationActiveUnited StatesVandenberg Air Force Base - SLC 1E#LaunchPad-120.6263,34.7561Launch PadInactiveUnited StatesCape Canaveral Air Force Station - SLC 37A#LaunchPad-80.568,28.534Launch PadInactiveUnited StatesPlesetsk Cosmodrome LC 35#LaunchPad40.575422,62.927806Launch PadActiveRussiaSednaya#GroundStation36.3635,33.6676Ground StationActiveSyriaDSS 16 Goldstone STDN DS16#GroundStation-116.87364975,35.34153939Ground StationInactiveUnited StatesEagle Vision 6#GroundStation-86.66,34.64Ground StationActiveUnited StatesKapustin Yar LC 107 2d#LaunchPad46.2959,48.5695Launch PadActiveRussiaVentspils#GroundStation21.857778,57.558056Ground StationActiveLatviaVandenberg Air Force Base - SLC 2W (STDN WTRP)#LaunchPad-120.62237833,34.75563222Launch PadActiveUnited StatesBaikonur Cosmodrome LC 81-24#LaunchPad62.9848,46.0709Launch PadActiveKazakhstanCape Canaveral AFS#LaunchSite-80.57,28.5Launch SiteActiveUnited StatesGuam 1 GU1 Leolut#GroundStation144.939,13.578333Ground StationActiveUnited StatesESTEC#GroundStation4.41994,52.21838Ground StationActiveNetherlandsKapustin Yar LC 107 2b#LaunchPad46.2959,48.5609Launch PadActiveRussiaSvobodny Cosmodrome#LaunchSite128.4,51.8Launch SiteInactiveRussiaPik Terskol Observatory#OpticalTrackingStation42.49939,43.27631Optical Tracking StationActiveRussiaOrroral Valley STDN ORR3#GroundStation148.95702322,-35.62789289Ground StationRelocatedAustraliaKapustin Yar LC 107 1a#LaunchPad46.298,48.5992Launch PadActiveRussiaKashima Space Research Center 13m B#GroundStation140.66298,35.95631Ground StationActiveJapanUchinoura#LaunchSite131.08,31.251Launch SiteActiveJapanAnkara Geolut#GroundStation32.99,40.1403Ground StationActiveTurkeyPlesetsk Cosmodrome LC 133-3#LaunchPad40.8504,62.887Launch PadActiveRussiaKijal Earth Station#GroundStation103.475,4.439Ground StationActiveMalaysiaPlesetsk Cosmodrome LC 32-1#LaunchPad40.7872,62.9073Launch PadActiveRussiaSantiago Station AGO 3 (STDN AGU3)#GroundStation-70.666403,-33.15110747Ground StationActiveChileQabala Phased-array Radar#RadarStation47.7955,40.8679Radar StationActiveAzerbaijanGCSB Waihopai#GroundStation173.738889,-41.576389Ground StationActiveNew ZealandGRGT STDN GWMS#GroundStation144.8409295,13.58801786Ground StationActiveUnited StatesBarreira do Inferno Launch Center#LaunchSite-35.1613,-5.9236Launch SiteActiveBrazilDiego Garcia GEODSS, xx3#OpticalTrackingStation72.45237,-7.41186Optical Tracking StationActiveUnited KingdomMichelstadt Station#GroundStation8.971934,49.711812Ground StationInactiveGermanySHAR-1#GroundStation80.19631,13.67484Ground StationActiveIndiaMt Lemmon STDN MTLS#GroundStation-110.78945064,32.44213656Ground StationActiveUnited StatesPunta Arenas Station#GroundStation-70.857,-52.938Ground StationActiveChileBermuda STDN BDAL#LaserStation-64.65610619,32.35381689Laser StationInactiveBermudaSan Nicolas Island STDN SN2F#GroundStation-119.52074281,33.247685Ground StationActiveUnited StatesLackland Air Force Base#GroundStation-98.590371,29.363209Ground StationActiveUnited StatesBaikonur Cosmodrome#LaunchSite63.3,46Launch SiteActiveKazakhstanNorth Pole Station USAK01 (STDN USAS)#GroundStation-147.50021417,64.80424111Ground StationActiveUnited StatesOoty Radio Telescope#GroundStation76.666,11.384Ground StationActiveIndiaWeilheim STDN WU2S#GroundStation11.08361889,47.88119889Ground StationActiveGermanyBaikonur Cosmodrome - LC 243#LaunchPad63.737,45.8549Launch PadActiveKazakhstanLongyearbyen EISCAT Radar#RadarStation16.0289,78.1531Radar StationActiveNorwayKapustin Yar - LC 107 2b#LaunchPad46.2959,48.5609Launch PadActiveRussiaKerguelen Island STDN KERS#GroundStation70.257282,-49.352906Ground StationActiveFranceGrand Turk Island STDN GTKL#LaserStation-71.13194483,21.46052522Laser StationActiveUnited KingdomHartebeesthoek STDN HB33#GroundStation27.70744722,-25.88642778Ground StationActiveSouth AfricaIP-1 Tracking Station#GroundStation63.334,45.908Ground StationActiveKazakhstanCSTARS#GroundStation-80.3844,25.6138Ground StationActiveUnited StatesDombarovsky Cosmodrome - x11#LaunchPad59.567713,51.020939Launch PadActiveRussiaDombarovsky Cosmodrome x28#LaunchPad59.635083,51.193164Launch PadActiveRussiaEUMETSAT Maspalomas#GroundStation-15.63295,27.76264Ground StationActiveSpainDombarovsky Cosmodrome x43#LaunchPad59.801475,51.526422Launch PadActiveRussiaCarnarvon Tracking Station#GroundStation113.721,-24.905Ground StationDemolishedAustraliaAlgonquin#GroundStation-78.0727,45.9554Ground StationActiveCanadaDSS 28 Goldstone#GroundStation-116.778711,35.23831Ground StationInactiveUnited StatesArequipa STDN AREL#LaserStation-71.49305469,-16.46570239Laser StationActivePeruKapustin Yar xx5#LaunchPad45.781879,48.781927Launch PadActiveRussiaBarking Sands - LC 42#LaunchPad-159.7727,22.0682Launch PadActiveUnited StatesDombarovsky Cosmodrome - x31#LaunchPad60.606992,51.241105Launch PadActiveRussiaMSSC 15in Aux Telescope#OpticalTrackingStation-156.2576,20.70849Optical Tracking StationActiveUnited StatesSimferopol TNA-400#GroundStation33.890256,45.052703Ground StationActiveUkraineMalabar Test Facility#OpticalTrackingStation-80.684,28.025Optical Tracking StationActiveUnited StatesEsrange Rocket Range - S#LaunchPad21.1054,67.8932Launch PadActiveSwedenGuiana Space Center - ZL3#LaunchPad-52.7685,5.2393Launch PadActiveFrench GuianaDombarovsky Cosmodrome x21#LaunchPad59.576451,51.102299Launch PadActiveRussiaPCMC Radar#RadarStation80.19886,13.67944Radar StationActiveIndiaCape Canaveral Air Force Station - LC 26B#LaunchPad-80.5712,28.4433Launch PadInactiveUnited StatesCDAS#GroundStation116.27,40.05Ground StationActiveChinaDombarovsky Cosmodrome x30#LaunchPad59.85002,51.207054Launch PadActiveRussiaDombarovsky Cosmodrome xx6#LaunchPad60.52463,50.877274Launch PadActiveRussiaGuam STDN GWM3#GroundStation144.73681531,13.31068944Ground StationDemolishedUnited StatesRAL Station 4m#GroundStation-1.43673,51.14283Ground StationActiveUnited KingdomEsrange Station ETX STDN KU1S#GroundStation21.06565472,67.88955833Ground StationActiveSwedenUniversity of Hawaii STDN HAWQ#GroundStation-157.8864,21.3161Ground StationActiveUnited StatesOrbcomm Arcade B#GroundStation-78.382119,42.524096Ground StationActiveUnited StatesKiruna Station KIR-2 13m#GroundStation20.96688,67.858428Ground StationActiveSwedenEdwards AFB STDN EA2F#GroundStation-117.93056167,34.97045389Ground StationActiveUnited StatesPoker Flat LC 5#LaunchPad-147.4832,65.1292Launch PadActiveUnited StatesNy-Alesund#GroundStation11.870967,78.929071Ground StationActiveNorwayWashington International Teleport#GroundStation-77.164891,38.794257Ground StationActiveUnited StatesVandenberg Air Force Base - SLC 8#LaunchPad-120.6324,34.5762Launch PadActiveUnited StatesMaspalomas (2) Geolut#GroundStation-15.634,27.764Ground StationActiveSpainAtlanta STDN ATDQ#GroundStation-84.10862994,33.93088417Ground StationActiveUnited StatesDongara Station AUWA01 STDN USDS#GroundStation115.348678,-29.045772Ground StationActiveAustraliaPoint Mugu LC 1#LaunchPad-119.1215,34.0996Launch PadActiveUnited StatesTromso Satellite Station#GroundStation18.9408,69.6625Ground StationActiveNorwayDombarovsky Cosmodrome x23#LaunchPad60.675969,51.146793Launch PadActiveRussiaMaui STDN MA2C#OpticalTrackingStation-156.2575,20.70057325Optical Tracking StationActiveUnited StatesWettzel STDN WETL#LaserStation12.87800803,49.14441731Laser StationActiveGermanyCape Canaveral Air Force Station#LaunchSite-80.57,28.5Launch SiteActiveUnited StatesClear AFS BMEWS#RadarStation-149.1897,64.3002Radar StationActiveUnited StatesMalaysia Space Centre#GroundStation101.508,2.784Ground StationActiveMalaysiaBaikonur Cosmodrome - LC 67-22#LaunchPad63.7073,45.9895Launch PadActiveKazakhstanIssus-Aussaguel Station#GroundStation1.497,43.429Ground StationActiveFranceWallops Flight Facility LA 4 MAST#LaunchPad-75.4702,37.8508Launch PadActiveUnited StatesPlesetsk Cosmodrome PU 11#LaunchPad40.4953,62.8978Launch PadActiveRussiaOrbcomm Albury A#GroundStation146.53351,-36.03145Ground StationActiveAustraliaBiscarosse BS#LaunchPad-1.2675,44.2882Launch PadInactiveFranceCape Canaveral Air Force Station - LC 18B#LaunchPad-80.562,28.449Launch PadInactiveUnited StatesGuiana Space Center ZL3#LaunchPad-52.7685,5.2393Launch PadActiveFrench GuianaAntigua Radar STDN ANTQ#RadarStation-61.7925125,17.14365111Radar StationActiveAntigua and BarbudaPoker Flat LC 2#LaunchPad-147.4857,65.1299Launch PadActiveUnited StatesTokai University#GroundStation130.87,32.835Ground StationActiveJapanKapustin Yar - xx3#LaunchPad46.300125,48.540529Launch PadActiveRussiaHong Kong (2) Leolut#GroundStation114.1445,22.275833Ground StationActiveChinaPaliivka Station#GroundStation30.5069,46.6339Ground StationActiveUkraineKapustin Yar - SAM#LaunchPad45.7346,48.8055Launch PadActiveRussiaDSS 14 Goldstone STDN DS14#GroundStation-116.88953822,35.42590086Ground StationActiveUnited StatesVLBA St Croix#GroundStation-64.583631,17.756578Ground StationActiveUnited StatesPoker Flat - LC 4#LaunchPad-147.4827,65.1303Launch PadActiveUnited StatesVandenberg AFB SLC 2W STDN WTRP#LaunchPad-120.62237833,34.75563222Launch PadActiveUnited StatesOrbcomm Hartebeesthoek B#GroundStation27.70568,-25.88812Ground StationActiveSouth AfricaDombarovsky Cosmodrome x18#LaunchPad59.842142,51.094496Launch PadActiveRussiaVandenberg Air Force Base - SLC 3W (STDN WT3P)#LaunchPad-120.59285703,34.64367528Launch PadActiveUnited StatesBisei Spaceguard Center#OpticalTrackingStation133.545,34.672Optical Tracking StationActiveJapanGRGT STDN GW2K#GroundStation144.84087447,13.58758828Ground StationActiveUnited StatesFinegayan SATCOM Site#GroundStation144.849827,13.583618Ground StationActiveUnited StatesKodiak Launch Complex#LaunchSite-152.3393,57.4352Launch SiteActiveUnited StatesWhite Sands STDN STGS#GroundStation-106.61208894,32.54245167Ground StationActiveUnited StatesLucknow Leolut#GroundStation80.9573,26.913333Ground StationActiveIndiaBarking Sands#LaunchSite-159.78,22.06Launch SiteActiveUnited StatesWeipa STDN KRCS#GroundStation141.93066667,-12.694Ground StationActiveAustraliaDombarovsky Cosmodrome - x26#LaunchPad59.74824,51.154839Launch PadActiveRussiaDombarovsky Cosmodrome - x12#LaunchPad59.808673,51.022624Launch PadActiveRussiaVandenberg Air Force Base - SLC 3E (STDN WTEP)#LaunchPad-120.59,34.64Launch PadActiveUnited StatesGreen Bank 85-2 Telescope#GroundStation-79.8525,38.42577Ground StationActiveUnited StatesSubmarine Launch Platform - Barents Sea#LaunchSite34.2,69.5Launch SiteActiveRussiaWettzell#GroundStation12.8772,49.145Ground StationActiveGermanyBaikonur Cosmodrome xx4#LaunchPad62.935495,46.079747Launch PadActiveKazakhstanBaikonur Cosmodrome - LC 104#LaunchPad63.4197,45.9875Launch PadActiveKazakhstanVillafranca VIL-1#GroundStation-3.951582,40.442565Ground StationInactiveSpainGreen Bank Telescope 14m#GroundStation-79.8224,38.43326Ground StationActiveUnited StatesEsrange Station ESTC STDN KU2S#GroundStation21.06044833,67.8831825Ground StationActiveSwedenHerstmonceaux STDN HERL#LaserStation0.33612414,50.86738069Laser StationActiveUnited KingdomWallops Island STDN WL3F#GroundStation-75.51143536,37.85636525Ground StationActiveUnited StatesEsrange Station ESX (STDN KIXS)#GroundStation21.063398,67.878157Ground StationActiveSwedenMU Radar#RadarStation136.1055,34.854Radar StationActiveJapanBarking Sands LC 1#LaunchPad-159.777,22.058Launch PadActiveUnited StatesSouthbury Station#GroundStation-73.2889,41.4514Ground StationActiveUnited StatesSantiago Station AGO 4 (STDN AG33)#GroundStation-70.66830756,-33.15147853Ground StationActiveChilePlesetsk Cosmodrome - LC 32-2#LaunchPad40.7895,62.9057Launch PadActiveRussiaDSS 62 Cebreros#GroundStation-4.36788,40.45311Ground StationDemolishedSpainVandenberg Air Force Base - SLC 2E#LaunchPad-120.619201,34.751617Launch PadDemolishedUnited StatesKTS#GroundStation-152.178,57.5986Ground StationDemolishedUnited StatesDombarovsky Cosmodrome x40#LaunchPad60.372543,51.379286Launch PadActiveRussiaMaspalomas 2 Geolut#GroundStation-15.634,27.764Ground StationActiveSpainBaikonur Cosmodrome LC 244#LaunchPad63.6346,45.8403Launch PadActiveKazakhstanDombarovsky Cosmodrome - x13#LaunchPad59.689541,51.030416Launch PadActiveRussiaAdour 2 Radar STDN ADRQ#RadarStation-52.74840111,5.20912725Radar StationActiveFrench GuianaOrbcomm Albury B#GroundStation146.53351,-36.03223Ground StationActiveAustraliaVTSB#GroundStation-120.505403,34.8256235Ground StationActiveUnited StatesUchinoura Space Center, 20m#GroundStation131.080567,31.256784Ground StationActiveJapanBaikonur Cosmodrome - LC 81-24#LaunchPad62.9848,46.0709Launch PadActiveKazakhstanWallops Island STDN WD4F#GroundStation-75.511439,37.85636639Ground StationActiveUnited StatesBaikonur Cosmodrome LC 109#LaunchPad63.4452,45.9525Launch PadActiveKazakhstanKeelung (2) Leolut#GroundStation121.7573,25.135333Ground StationActiveTaiwanTelkom SA Earth Station#GroundStation27.71,-25.91Ground StationActiveSouth AfricaVTSA#GroundStation-120.501852,34.8226094Ground StationActiveUnited StatesBaikonur Cosmodrome - xx3#LaunchPad63.481448,45.945516Launch PadActiveKazakhstanZimmerwald#GroundStation7.478169,46.886794Ground StationActiveSwitzerlandNHSB#GroundStation-71.630319,42.9447544Ground StationActiveUnited StatesElephant Butte Space Fence#RadarStation-106.9972,33.4431Radar StationActiveUnited StatesMid-Atlantic Regional Spaceport#LaunchSite-75.49,37.832Launch SiteActiveUnited StatesGrand Bahama Island STDN GBIY#GroundStation-78.29909119,26.62544656Ground StationActiveBahamasMoores Valley Station#GroundStation-123.2875,45.3425Ground StationDemolishedUnited StatesJiuquan xx2#LaunchPad100.305083,41.283173Launch PadActiveChinaSouth Uist Range Radar#GroundStation-7.446834,57.617444Ground StationActiveUnited KingdomKapustin Yar xx3#LaunchPad46.300125,48.540529Launch PadActiveRussiaIssus-Aussaguel Station#GroundStation1.497,43.429Ground StationActiveFranceAscension#LaunchSite-14.4147,-7.9748Launch SiteActiveUnited KingdomAyios Nikolaos Station#GroundStation33.888,35.09423Ground StationActiveCyprusAscension Island BRT STDN AC2J#GroundStation-14.39076792,-7.91791558Ground StationActiveUnited KingdomHammaguira Brigitte-A#LaunchPad-3.0081,30.8712Launch PadActiveAlgeriaHartebeesthoek STDN HBKS#GroundStation27.712,-25.887Ground StationActiveSouth AfricaGRAVES Receiver#RadarStation5.5346,44.0715Radar StationActiveFranceDSS 13 Goldstone STDN VEND#GroundStation-116.794459,35.24716425Ground StationActiveUnited StatesGalenki 32m#GroundStation131.7561,44.0204Ground StationActiveRussiaCape Canaveral AFS LC 18B#LaunchPad-80.562,28.449Launch PadInactiveUnited StatesSan Nicolas Island STDN SNIF#GroundStation-119.52009433,33.24697758Ground StationActiveUnited StatesHaystack Auxilliary Radar#RadarStation-71.4872,42.62283Radar StationActiveUnited StatesVLBA Brewster#GroundStation-119.683278,48.131228Ground StationActiveUnited StatesDombarovsky Cosmodrome - x42#LaunchPad59.972508,51.521988Launch PadActiveRussiaWallops Flight Facility LA 2 JUP#LaunchPad-75.482,37.8394Launch PadActiveUnited StatesMid-Atlantic Regional Spaceport - Launch Pad 0-A#LaunchPad-75.4882,37.8338Launch PadActiveUnited StatesGilmore Creek STDN ULA4#GroundStation-147.52128289,64.97659575Ground StationActiveUnited StatesKashima Space Research Center 26m#GroundStation140.6627,35.9541Ground StationDemolishedJapanUchinoura Space Center - Lambda Pad#LaunchPad131.079125,31.251908Launch PadActiveJapanMizusawa VLBI Observatory#GroundStation141.1326,39.1335Ground StationActiveJapanOmelek Island#LaunchSite167.743322,9.048224Launch SiteActiveMarshall IslandsBaikonur Cosmodrome LC 60-8#LaunchPad64.0183,46.0174Launch PadActiveKazakhstanHiroshima Institute of Technology#GroundStation132.3761,34.3678Ground StationActiveJapanTHEOS Control and Receiving Station#GroundStation100.932849,13.103529Ground StationActiveThailandZhongshan Station#GroundStation76.378,-69.379Ground StationActiveAntarcticaDSS 44 Honeysuckle Creek#GroundStation148.97784,-35.58319Ground StationRelocatedAustraliaDombarovsky Cosmodrome - x35#LaunchPad60.858975,51.26491Launch PadActiveRussiaDombarovsky Cosmodrome#LaunchSite60,51Launch SiteActiveRussiaBiscarosse BESA#LaunchPad-1.2335,44.3917Launch PadActiveFranceAllen Telescope Array#GroundStation-121.47,40.817Ground StationActiveUnited StatesDulles Station#GroundStation-77.42795,39.01449Ground StationActiveUnited StatesSvobodny Cosmodrome - xx1#LaunchPad128.3102,51.747Launch PadInactiveRussiaRAF Fylingdales BMEWS#RadarStation-0.6701,54.3618Radar StationActiveUnited KingdomWoomera Test Range - LA 4#LaunchPad136.5155,-30.9053Launch PadActiveAustraliaBaikonur Cosmodrome LC 163#LaunchPad63.172,46.002Launch PadActiveKazakhstanAndover Station#GroundStation-70.699,44.633Ground StationActiveUnited StatesThuraya Station#GroundStation55.8285,25.2433Ground StationActiveUnited Arab EmiratesGEROC Ikonos Station#GroundStation11.28006,48.08407Ground StationActiveGermanySuffa RT-70 Radio Telescope#GroundStation68.448,39.624Ground StationActiveUzbekistanSocorro GEODSS, xx3#OpticalTrackingStation-106.65968,33.81703Optical Tracking StationActiveUnited StatesBaikonur Cosmodrome xx5#LaunchPad62.932319,46.081306Launch PadActiveKazakhstanBiscarosse - BLB#LaunchPad-1.262,44.3659Launch PadActiveFranceAlaska 2 (AK2) Leolut#GroundStation-147.5177,64.9735Ground StationActiveUnited StatesOuargla Leolut#GroundStation5.49,31.88Ground StationActiveAlgeriaEsrange Station ESX STDN KIXS#GroundStation21.063398,67.878157Ground StationActiveSwedenMaryland 2 Geolut#GroundStation-76.93,38.8503Ground StationActiveUnited StatesBaikonur Cosmodrome LC 103#LaunchPad63.4448,45.9523Launch PadActiveKazakhstanWellington (1) Geolut#GroundStation175.5045,-41.152Ground StationActiveNew ZealandWallops Flight Facility - LA 4 ML#LaunchPad-75.4698,37.851Launch PadActiveUnited StatesJiuquan LA 3B#LaunchPad100.7803,41.1593Launch PadActiveChinaColomb-Bechar#LaunchSite-2.255,31.693Launch SiteActiveAlgeriaWallops Flight Facility LA 2 HAD#LaunchPad-75.4826,37.8383Launch PadActiveUnited StatesAnkara (1) Leolut#GroundStation32.9897,40.140833Ground StationActiveTurkeyTCSA#GroundStation-0.90636355,51.1167229Ground StationActiveUnited KingdomBiscarosse - BP#LaunchPad-1.2396,44.3755Launch PadActiveFranceNakhodka Station#GroundStation132.7906,42.8584Ground StationActiveRussiaPlesetsk Cosmodrome - LC 16-2#LaunchPad40.6834,62.96Launch PadActiveRussiaPlesetsk Cosmodrome - LC 35#LaunchPad40.575422,62.927806Launch PadActiveRussiaGilmore Creek STDN GILD#GroundStation-147.49800019,64.97850925Ground StationActiveUnited StatesKapustin Yar LC 86 4c#LaunchPad46.297,48.5481Launch PadActiveRussiaOrbcomm Maghreb A#GroundStation-7.64361,33.04828Ground StationActiveMoroccoTidbinbilla STDN RTKS#GroundStation148.98260486,-35.40474494Ground StationActiveAustraliaPrimrose Lake#LaunchSite-110.05,54.75Launch SiteActiveCanadaNetaji Station#GroundStation88.4276,22.946Ground StationActiveIndiaRobins AFB PAVE PAWS#RadarStation-83.56936,32.58115Radar StationInactiveUnited StatesSantiago Station AGO 4 STDN AG33#GroundStation-70.66830756,-33.15147853Ground StationActiveChileAscension Island STDN ASNS#GroundStation-14.33333333,-7.91666717Ground StationActiveUnited KingdomJiuquan Satellite Launch Center - xx2#LaunchPad100.305083,41.283173Launch PadActiveChinaBretagne 2 Radar STDN BREQ#RadarStation-52.30954428,4.94887892Radar StationActiveFrench GuianaVandenberg Air Force Base - SLC 10E#LaunchPad-120.6213,34.7626Launch PadInactiveUnited StatesTTSC#GroundStation-68.605031,76.5157036Ground StationActiveGreenlandWhite Sands LC 39#LaunchPad-106.2367,32.4161Launch PadActiveUnited StatesArecibo Observatory#RadarStation-66.753083,18.3435Radar StationActiveUnited StatesOrbcomm Wenatchee A#GroundStation-120.17509,47.551685Ground StationActiveUnited StatesWallops Flight Facility LA 4 HAD#LaunchPad-75.4696,37.8511Launch PadActiveUnited StatesBaikonur Cosmodrome - LC 75#LaunchPad63.1983,45.9657Launch PadActiveKazakhstanDombarovsky Cosmodrome - x46#LaunchPad60.082438,51.588487Launch PadActiveRussiaDombarovsky Cosmodrome xx3#LaunchPad59.597872,50.756297Launch PadActiveRussiaEsrange Station ESX#GroundStation21.0634472,67.8781431Ground StationActiveSwedenKumsan Station#GroundStation127.4892,36.125Ground StationActiveSouth KoreaKennedy Space Center - LC 39A (STDN A39P)#LaunchPad-80.60411653,28.60827486Launch PadActiveUnited StatesScanEx Moscow Station#GroundStation37.58411,55.73606Ground StationActiveRussiaMaiquetia 2 Leolut#GroundStation-66.9865,10.599Ground StationPlannedVenezuelaOTC Carnarvon#GroundStation113.7049,-24.8691Ground StationActiveAustraliaVandenberg AFB SLC 5#LaunchPad-120.6247,34.608Launch PadInactiveUnited StatesEglin AFB STDN EG3F#GroundStation-86.798012,30.42166558Ground StationInactiveUnited StatesVLBA Pie Town#GroundStation-108.119183,34.301003Ground StationActiveUnited StatesDombarovsky Cosmodrome xx7#LaunchPad59.73193,50.883614Launch PadActiveRussiaBaikonur Cosmodrome LC 51#LaunchPad63.3409,45.9239Launch PadActiveKazakhstanSanta Paula Station#GroundStation-119.0734,34.4021Ground StationActiveUnited StatesWallops Island STDN WLPF#GroundStation-75.48508908,37.84133972Ground StationActiveUnited StatesEagle Vision 2#GroundStation-104.71,38.82Ground StationActiveUnited StatesLibreville Station STDN LBVS#GroundStation9.67530028,0.35462978Ground StationActiveGabonGreen Bank 85-3 Telescope#GroundStation-79.84341,38.42959Ground StationActiveUnited StatesHTS STDN HTSS#GroundStation-158.24208956,21.56227219Ground StationActiveUnited StatesHyderabad#GroundStation78.188333,17.028611Ground StationActiveIndiaLAPAN Station#GroundStation119.65,-3.978Ground StationActiveIndonesiaYellowknife Site#GroundStation-114.47924,62.48044Ground StationActiveCanadaBaikonur Cosmodrome LC 191-66#LaunchPad63.1966,45.9698Launch PadActiveKazakhstanPoker Flat LC 4#LaunchPad-147.4827,65.1303Launch PadActiveUnited StatesCape Canaveral AFS LC 1#LaunchPad-80.5375,28.465Launch PadInactiveUnited StatesKunming Station#GroundStation102.79583,25.02734Ground StationActiveChinaWake Island#LaunchSite166.618,19.29Launch SiteActiveUnited StatesChangchun Station#GroundStation125.324,43.817Ground StationActiveChinaBiak#GroundStation136.1074,-1.19Ground StationActiveIndonesiaMaryland 1 Geolut#GroundStation-76.93,38.8503Ground StationActiveUnited StatesBaikonur Cosmodrome LC 67-21#LaunchPad63.705,45.9893Launch PadActiveKazakhstanJiuquan LA 2A#LaunchPad100.3165,41.3088Launch PadActiveChinaRiverside Teleport#GroundStation-117.087843,33.795862Ground StationActiveUnited StatesIrkutsk Radar#RadarStation103.259,52.877Radar StationActiveRussiaRAL Station 12m STDN RALS#GroundStation-1.31146389,51.572026Ground StationActiveUnited KingdomTehran Station#GroundStation51.408,35.78Ground StationActiveIranUchinoura 10m#GroundStation131.084654,31.255675Ground StationActiveJapanOnizuka Control Node xx1#GroundStation-122.028987,37.403778Ground StationInactiveUnited StatesSubmarine Launch Platform Barents Sea#LaunchSite34.2,69.5Launch SiteActiveRussiaMaryland (1) Geolut#GroundStation-76.93,38.8503Ground StationActiveUnited StatesPoker Flat - LC 2#LaunchPad-147.4857,65.1299Launch PadActiveUnited StatesNy-Alesund Station#GroundStation11.883535,78.927718Ground StationActiveNorwayAlcantara Launch Center MRL Pad#LaunchPad-44.3671,-2.3167Launch PadActiveBrazilSocorro GEODSS Cam2#OpticalTrackingStation-106.65962,33.81725Optical Tracking StationActiveUnited StatesWoomera Test Range LA 6A#LaunchPad136.4394,-31.074Launch PadActiveAustraliaERIS#GroundStation-88.263568,18.544696Ground StationActiveMexicoWhite Sands STDN WH3K#GroundStation-106.60855158,32.50046228Ground StationActiveUnited StatesNevada Test Site Area 26#LaunchSite-116.114,36.771Launch SiteActiveUnited StatesKapustin Yar LC 107 1b#LaunchPad46.298,48.5969Launch PadActiveRussiaJiuquan SLS 2#LaunchPad100.2983,40.9607Launch PadActiveChinaEsrange Station TTC (STDN KICS)#GroundStation21.060769,67.884232Ground StationActiveSwedenShcholkovo#GroundStation37.9576,55.9506Ground StationActiveRussiaDombarovsky Cosmodrome xx9#LaunchPad59.551097,50.972694Launch PadActiveRussiaEsrange Rocket Range#LaunchSite21.105,67.893Launch SiteActiveSwedenAlcantara Launch Center VLS Pad#LaunchPad-44.3675,-2.3184Launch PadActiveBrazilCasey Station#GroundStation110.52871,-66.28125Ground StationActiveAntarcticaNegev#LaunchSite34.9728,31.02335Launch SiteActiveIsraelDombarovsky Cosmodrome x25#LaunchPad59.524663,51.153297Launch PadActiveRussiaLannion STDN LANS#GroundStation-3.47,48.75141536Ground StationActiveFranceCape Canaveral AFS LC 30#LaunchPad-80.5803,28.4393Launch PadInactiveUnited StatesByalalu 32m#GroundStation77.36898,12.90314Ground StationActiveIndiaSeoul#GroundStation126.9997,37.5664Ground StationActiveSouth KoreaQuantico#GroundStation-77.3198,38.4912Ground StationActiveUnited StatesConcepcion#GroundStation-73.025036,-36.842772Ground StationActiveChilePlesetsk Cosmodrome LC 41-1#LaunchPad40.529,62.9405Launch PadDemolishedRussiaCape Canaveral AFS LC 9#LaunchPad-80.5594,28.4522Launch PadInactiveUnited StatesEOC Antenna 4#GroundStation139.35,36.0026Ground StationActiveJapanKwajalein STDN KMQF#RadarStation167.726622,8.72163539Radar StationActiveMarshall IslandsLuxembourg Teleport#GroundStation6.114,49.579Ground StationActiveLuxembourgNCTS Bahrain#GroundStation50.61,26.2073Ground StationActiveBahrainKapustin Yar LC 107 2h#LaunchPad46.2949,48.5617Launch PadActiveRussiaWallops Flight Facility#LaunchSite-75.48,37.85Launch SiteActiveUnited StatesCape Canaveral AFS LC 26B#LaunchPad-80.5712,28.4433Launch PadInactiveUnited StatesMerritt Island STDN MIMF#GroundStation-80.68279381,28.62594319Ground StationActiveUnited StatesSantiago Geolut#GroundStation-70.7,-33.489Ground StationActiveChileAhemad Station#GroundStation78.1042,30.1778Ground StationActiveIndiaWhite Sands STDN WHSF#GroundStation-106.36980742,32.35804211Ground StationActiveUnited StatesJeddah (2) Leolut#GroundStation39.1427,21.654833Ground StationActiveSaudi ArabiaDSS 65 Robledo STDN DS65#GroundStation-4.25069889,40.42720636Ground StationActiveSpainFirepond Laser#LaserStation-71.4923,42.61757Laser StationActiveUnited StatesPoker Flat Station PF1 STDN DX2S#GroundStation-147.4311625,65.11783389Ground StationActiveUnited StatesKapustin Yar - PL1#LaunchPad46.2621,48.4116Launch PadActiveRussiaAPL 10m#GroundStation-76.89825,39.169Ground StationActiveUnited StatesDSS 45 Tidbinbilla STDN DS45#GroundStation148.97768564,-35.39845769Ground StationActiveAustraliaKashi Ground Station#GroundStation75.929,39.505Ground StationActiveChinaCape Canaveral AFS LC 25#LaunchPad-80.575,28.431Launch PadInactiveUnited StatesCape Canaveral AFS SLC 36B STDN B36P#LaunchPad-80.54095408,28.46836775Launch PadDemolishedUnited StatesWallops Island STDN WL4F#GroundStation-75.511439,37.85636639Ground StationActiveUnited StatesGreen Bank Telescope 12m#GroundStation-79.83131,38.43724Ground StationActiveUnited StatesAlgiers Geolut#GroundStation3.381,36.7533Ground StationActiveAlgeriaNCTAMS PAC#GroundStation-157.995,21.52Ground StationActiveUnited StatesGlobus II#RadarStation31.1271,70.3671Radar StationActiveNorwayKapustin Yar xx1#LaunchPad46.318006,48.484051Launch PadActiveRussiaNenoksa Test Range#LaunchSite39.22,64.646Launch SiteActiveRussiaMSSC AEOS 3.7m#OpticalTrackingStation-156.2569,20.7081Optical Tracking StationActiveUnited StatesNanhai Station#GroundStation113.14,23.03Ground StationActiveChinaSilver Lake Space Fence#RadarStation-91.0211,33.145Radar StationActiveUnited StatesKourou Station STDN KRUP#GroundStation-52.80582497,5.25185486Ground StationActiveFrench GuianaSvobodny Cosmodrome xx9#LaunchPad128.3656,51.837Launch PadInactiveRussiaBaikonur Cosmodrome - LC 80-17#LaunchPad64.0198,46.0068Launch PadActiveKazakhstanOrbcomm St Johns A#GroundStation-109.554917,34.456282Ground StationActiveUnited StatesMSSC RAVEN#OpticalTrackingStation-156.25745,20.7085Optical Tracking StationActiveUnited StatesASF 10m#GroundStation-147.849467,64.859482Ground StationActiveUnited StatesSvobodny Cosmodrome - xx5#LaunchPad128.23218,51.80532Launch PadInactiveRussiaDombarovsky Cosmodrome - x30#LaunchPad59.85002,51.207054Launch PadActiveRussiaAtlanta STDN ATDS#GroundStation-84.10862994,33.93088417Ground StationActiveUnited StatesBaikonur Cosmodrome - xx2#LaunchPad63.462445,45.94176Launch PadActiveKazakhstanWallops Island (STDN WAPS)#GroundStation-75.4765225,37.92492556Ground StationActiveUnited StatesBlossom Point Tracking Facility#GroundStation-77.086,38.431Ground StationActiveUnited StatesCape Canaveral STDN CN2F#GroundStation-80.59056164,28.52887219Ground StationInactiveUnited StatesLackland AFB#GroundStation-98.590371,29.363209Ground StationActiveUnited StatesFranklin Station#GroundStation-74.5757,41.1167Ground StationActiveUnited StatesBaikonur Cosmodrome - LC 195#LaunchPad63.2127,45.783Launch PadActiveKazakhstanWallops Flight Facility - LA 5#LaunchPad-75.4681,37.8529Launch PadActiveUnited StatesYevpatoria North Station#GroundStation33.169,45.221Ground StationActiveUkraineCyberjaya Station#GroundStation101.6583,2.9348Ground StationActiveMalaysiaDombarovsky Cosmodrome x27#LaunchPad59.967627,51.168438Launch PadActiveRussiaHumacao Station#GroundStation-65.788,18.1494Ground StationActiveUnited StatesCombe Martin Geolut#GroundStation-4.047166,51.1675Ground StationActiveUnited KingdomDombarovsky Cosmodrome - x38#LaunchPad60.163782,51.338805Launch PadActiveRussiaMullach Sgr Radar Station#GroundStation-8.580436,57.806607Ground StationActiveUnited KingdomAtlanta STDN ATLS#GroundStation-84.10836667,33.93086667Ground StationActiveUnited StatesWestern Australian Receiver#RadarStation122.008,-28.327Radar StationActiveAustraliaProspect Harbor Naval Satellite Operations Station#GroundStation-68.013,44.404Ground StationActiveUnited StatesCape Town Leolut#GroundStation18.5,-33.88Ground StationActiveSouth AfricaLarge Millimeter Telescope#RadarStation-97.3149,18.9858Radar StationActiveMexicoAerospace Data Facility Southwest#GroundStation-106.6,32.5Ground StationActiveUnited StatesIbaraki Satellite Control Center#GroundStation140.373,36.532Ground StationActiveJapanCobra Dane Radar#RadarStation174.0914,52.7373Radar StationActiveUnited StatesKrona 30J6 Complex#OpticalTrackingStation41.226213,43.718337Optical Tracking StationActiveRussiaBaikonur Cosmodrome - xx1#LaunchPad63.462718,45.939593Launch PadActiveKazakhstanFairbanks STDN UL23#GroundStation-147.51806567,64.97240711Ground StationActiveUnited StatesBaikonur Cosmodrome - LC 90-20#LaunchPad62.9167,46.0855Launch PadActiveKazakhstanAPL 5m#GroundStation-76.89839,39.16821Ground StationActiveUnited StatesBaikonur Cosmodrome - LC 193#LaunchPad63.389,45.9532Launch PadActiveKazakhstanEagle Vision 1#GroundStation7.6,49.44Ground StationActiveGermanyTilla#LaunchSite73.29608,33.3961Launch SiteActivePakistanVandenberg AFB SLC 4E#LaunchPad-120.61059,34.632067Launch PadInactiveUnited StatesSingapore Leolut#GroundStation103.988,1.352Ground StationActiveSingaporeWallops Flight Facility LA 4 ML#LaunchPad-75.4698,37.851Launch PadActiveUnited StatesYamaguchi Station#GroundStation131.557,34.217Ground StationActiveJapanWhite Sands BRT STDN WHSJ#GroundStation-106.61196575,32.50628147Ground StationActiveUnited StatesHawaii Station STDN HAWS#GroundStation-155.663,19.01358372Ground StationActiveUnited StatesOrbcomm Curacao#GroundStation-69.1538,12.3814Ground StationActiveNetherlandsKiruna Station KIR-1 15m STDN KI2S#GroundStation20.96434169,67.85712517Ground StationActiveSwedenWhite Sands LC 38#LaunchPad-106.2796,32.4179Launch PadActiveUnited StatesHolloman#LaunchSite-106.07,32.88Launch SiteActiveUnited StatesBaikonur Cosmodrome LC 60-6#LaunchPad64.0161,46.0188Launch PadActiveKazakhstanXichang#LaunchSite102.029,28.246Launch SiteActiveChinaWeilheim 11m#GroundStation11.08538,47.88118Ground StationActiveGermanySyowa Station STDN SYOQ#GroundStation39.59015389,-69.00609644Ground StationActiveAntarcticaKorou SIGINT Station#GroundStation-52.7007,5.1664Ground StationActiveFrench GuianaGreenbelt Test BRT STDN BLTJ#GroundStation-76.83792783,39.00270353Ground StationActiveUnited StatesXichang LA 1#LaunchPad102.0292,28.2474Launch PadActiveChinaMopra Observatory#GroundStation149.0996,-31.2678Ground StationActiveAustraliaWhite Sands LC 32#LaunchPad-106.4069,32.4068Launch PadActiveUnited StatesJiamusi Station#GroundStation130.32,46.8Ground StationActiveChinaOrbcomm Rio de Janiero A#GroundStation-42.87275,-22.69619Ground StationActiveBrazilTokyo Institute of Technology#GroundStation139.68495,35.60084Ground StationActiveJapanAlcantara Launch Center - VLS Pad#LaunchPad-44.3675,-2.3184Launch PadActiveBrazilWhite Sands LC 33#LaunchPad-106.443,32.3396Launch PadActiveUnited StatesTeide Observatory#GroundStation-16.51,28.3Ground StationActiveSpainWoomera Test Range LA 9#LaunchPad136.4871,-30.9031Launch PadActiveAustraliaDombarovsky Cosmodrome - x27#LaunchPad59.967627,51.168438Launch PadActiveRussiaHammaguira Bacchus#LaunchPad-3.1241,30.8565Launch PadActiveAlgeriaUssuriysk Observatory#OpticalTrackingStation132.16583,43.69917Optical Tracking StationActiveRussiaBaikonur Cosmodrome - LC 191-66#LaunchPad63.1966,45.9698Launch PadActiveKazakhstanTTS STDN TT2S#GroundStation-68.59885831,76.51536442Ground StationActiveGreenland5N24 Argun Radar#RadarStation73.5721,45.808Radar StationActiveKazakhstanLibya Station#GroundStation13.236,32.34Ground StationActiveLibyaCanadian Forces Station Leitrim#GroundStation-75.5867,45.3377Ground StationActiveCanadaSemnan Launch Center - xx2#LaunchPad53.921,35.2347Launch PadActiveIranWallops Island STDN WPSS#GroundStation-75.47630453,37.92658986Ground StationActiveUnited StatesBiscarosse BLB#LaunchPad-1.262,44.3659Launch PadActiveFranceTelegraph Hill#GroundStation-14.3915,-7.9743Ground StationActiveUnited KingdomPoker Flat - LC 5#LaunchPad-147.4832,65.1292Launch PadActiveUnited StatesNaval SATCOM Facility Northwest#GroundStation-76.267222,36.559444Ground StationActiveUnited StatesVandenberg Air Force Base - SLC 4W#LaunchPad-120.6154,34.6331Launch PadInactiveUnited StatesKapustin Yar LC 107 2c#LaunchPad46.2949,48.5695Launch PadActiveRussiaCape Canaveral Air Force Station - SLC 36A (STDN A36P)#LaunchPad-80.53772211,28.47143831Launch PadDemolishedUnited StatesTelesat Calgary Teleport#GroundStation-114.016,51.053Ground StationActiveCanadaWallops Flight Facility - LA 2 HAD#LaunchPad-75.4826,37.8383Launch PadActiveUnited StatesEchoStar Orange Station#GroundStation-74.2203,40.784Ground StationActiveUnited StatesDSS 49 Parkes#GroundStation148.263524,-32.998278Ground StationActiveAustraliaPlesetsk Cosmodrome LC 133-1#LaunchPad40.8468,62.8868Launch PadActiveRussiaAPT Satellite Control Center#GroundStation114.188,22.453Ground StationActiveChinaTelesat Montreal Teleport#GroundStation-73.5504,45.5224Ground StationActiveCanadaWallops Flight Facility LA 2#LaunchPad-75.4834,37.8376Launch PadActiveUnited StatesMoron MOSS#OpticalTrackingStation-5.5884,37.1516Optical Tracking StationActiveSpainBaikonur Cosmodrome - LC 175-2#LaunchPad62.987,46.0512Launch PadActiveKazakhstanCape Canaveral AFS SLC 20#LaunchPad-80.5567,28.5122Launch PadActiveUnited StatesKiritimati Downrange Tracking Station#GroundStation-157.44821,2.04613Ground StationActiveKiribatiSentosa Station#GroundStation103.836,1.248Ground StationActiveSingaporePoint Mugu - LC 1#LaunchPad-119.1215,34.0996Launch PadActiveUnited StatesWhite Sands STDN WSGT#GroundStation-106.60854583,32.5013695Ground StationActiveUnited StatesKapustin Yar - xx6#LaunchPad45.8152,48.783061Launch PadActiveRussiaBrisbane Station#GroundStation153.1312,-27.5539Ground StationActiveAustraliaCape Canaveral Air Force Station - LC 14#LaunchPad-80.5471,28.4911Launch PadInactiveUnited StatesSouth Uist Missile Range#LaunchSite-7.4,57.36Launch SiteActiveUnited KingdomWallops Flight Facility LA 3B#LaunchPad-75.4725,37.8494Launch PadActiveUnited StatesBermuda STDN BDA3#GroundStation-64.65788833,32.35126753Ground StationInactiveBermudaEchoStar Monee Station#GroundStation-87.7764,41.4684Ground StationActiveUnited StatesPenteli Geolut#GroundStation23.883,38.0808Ground StationActiveGreeceDSS 43 Tidbinbilla STDN DS43#GroundStation148.98126731,-35.40242422Ground StationActiveAustraliaBaikonur Cosmodrome - LC 51#LaunchPad63.3409,45.9239Launch PadActiveKazakhstanSmolino A-35 Anti-missile Site#RadarStation36.482,55.35Radar StationActiveRussiaWallops Flight Facility - LA 1 AML#LaunchPad-75.4871,37.8352Launch PadActiveUnited StatesDombarovsky Cosmodrome x13#LaunchPad59.689541,51.030416Launch PadActiveRussiaBaikonur Cosmodrome LC 75#LaunchPad63.1983,45.9657Launch PadActiveKazakhstanGuiana Space Center - Diamant Pad#LaunchPad-52.7524,5.2325Launch PadInactiveFrench GuianaGilmore Creek STDN GLAS#GroundStation-147.51283867,64.97367197Ground StationActiveUnited StatesEik Station#GroundStation6.4675,58.5383Ground StationActiveNorwayGran Canaria Drop Zone#LaunchSite-15.3,27Launch SiteActiveSpainKashima Space Research Center 13m A#GroundStation140.66245,35.95629Ground StationActiveJapanAlaska 2 AK2 Leolut#GroundStation-147.5177,64.9735Ground StationActiveUnited StatesAnkara#GroundStation32.86,39.93Ground StationActiveTurkeyPlesetsk Cosmodrome - PU 11#LaunchPad40.4953,62.8978Launch PadActiveRussiaCamp Zama#GroundStation139.39804,35.50014Ground StationActiveJapanEagle Vision 4#GroundStation-80.8,33.92Ground StationActiveUnited StatesBaikonur Cosmodrome - LC 164#LaunchPad63.064,45.9445Launch PadActiveKazakhstanSantiago Station AGO 5 (STDN AG23)#GroundStation-70.66731169,-33.15179414Ground StationActiveChileGrimstad Ground Station#GroundStation8.35,58.33Ground StationActiveNorwayEsrange Station ETX (STDN KU1S)#GroundStation21.06565472,67.88955833Ground StationActiveSwedenSt Thomas STDN ST1F#GroundStation-64.97321647,18.35725333Ground StationActiveUnited StatesGuiana Space Center ZLV#LaunchPad-52.775,5.236Launch PadActiveFrench GuianaLongovilo Station#GroundStation-71.401,-33.956Ground StationActiveChileEsrange Station ESC#GroundStation21.0599183,67.8843522Ground StationActiveSwedenLivermore Station#GroundStation-121.799,37.7605Ground StationActiveUnited StatesYevpatoria RT-70#GroundStation33.187068,45.189096Ground StationActiveUkraineSemnan Launch Center#LaunchSite53.92,35.25Launch SiteActiveIranOrbcomm Ocilla A#GroundStation-83.199591,31.50119Ground StationActiveUnited StatesGuiana Space Center ELS#LaunchPad-52.8345,5.3047Launch PadActiveFrench GuianaDombarovsky Cosmodrome xx4#LaunchPad59.77451,50.775737Launch PadActiveRussiaTranquillon Peak STDN CALF#GroundStation-120.56157233,34.58273856Ground StationActiveUnited StatesNaval Radio Transmitter Facility#GroundStation14.44,37.117Ground StationActiveItalyCape Canaveral Air Force Station - LC 25#LaunchPad-80.575,28.431Launch PadInactiveUnited StatesGuiana Space Center#LaunchSite-52.77,5.23Launch SiteActiveFrench GuianaGreenbelt STDN GGAL#LaserStation-76.82747947,39.02026828Laser StationActiveUnited StatesCombe Martin Leolut#GroundStation-4.051,51.17Ground StationActiveUnited KingdomDombarovsky Cosmodrome x12#LaunchPad59.808673,51.022624Launch PadActiveRussiaSydney Station#GroundStation151.2115,-33.7172Ground StationActiveAustraliaBaikonur Cosmodrome LC 243#LaunchPad63.737,45.8549Launch PadActiveKazakhstanJSC Test BRT STDN JSCJ#GroundStation-95.09,29.56168961Ground StationActiveUnited StatesVandenberg AFB SLC 2E#LaunchPad-120.619201,34.751617Launch PadDemolishedUnited StatesGissar#OpticalTrackingStation68.6818,38.491Optical Tracking StationActiveTajikistanBrewster Station#GroundStation-119.692,48.147Ground StationActiveUnited StatesNanning Station#GroundStation108.37,22.82Ground StationActiveChinaTattnall Space Fence#RadarStation-81.926,32.0437Radar StationActiveUnited StatesKaneohe Omega Station#GroundStation-157.8319,21.4047Ground StationInactiveUnited StatesPlesetsk Tracking Station#GroundStation40.558672,62.9001Ground StationActiveRussiaBTA-6#OpticalTrackingStation41.440447,43.646825Optical Tracking StationActiveRussiaPoker Flat Station PF2 STDN DXAS#GroundStation-147.43350389,65.11792972Ground StationActiveUnited StatesVandenberg AFB SLC 10E#LaunchPad-120.6213,34.7626Launch PadInactiveUnited StatesMakaha Ridge#GroundStation-159.723,22.13Ground StationActiveUnited StatesGTS STDN GTSS#GroundStation144.85605225,13.61518911Ground StationActiveUnited StatesRambouillet Teleport#GroundStation1.7826,48.5494Ground StationActiveFranceDombarovsky Cosmodrome - xx8#LaunchPad60.52694,50.959329Launch PadActiveRussiaDombarovsky Cosmodrome - x28#LaunchPad59.635083,51.193164Launch PadActiveRussiaSocorro GEODSS Cam3#OpticalTrackingStation-106.65968,33.81703Optical Tracking StationActiveUnited StatesYakima Training Center#GroundStation-120.356544,46.68209Ground StationActiveUnited StatesVLBA Los Alamos#GroundStation-106.245597,35.775125Ground StationActiveUnited StatesDombarovsky Cosmodrome xx2#LaunchPad59.791895,50.681452Launch PadActiveRussiaGreenbelt#GroundStation-76.8265,39.0219Ground StationActiveUnited StatesSUPARCO Satellite Ground Station#GroundStation73.17674,33.51787Ground StationActivePakistanDombarovsky Cosmodrome x20#LaunchPad60.087307,51.096909Launch PadActiveRussiaWoomera Test Range - LA 5A#LaunchPad136.474,-30.9716Launch PadActiveAustraliaWeinan Station#GroundStation109.51,34.5Ground StationActiveChinaBaikonur Cosmodrome xx3#LaunchPad63.481448,45.945516Launch PadActiveKazakhstanKapustin Yar S#LaunchPad46.3175,48.4763Launch PadActiveRussiaSan Diego Space Fence#RadarStation-116.973,32.5774Radar StationActiveUnited StatesKalyazin Radio Astronomy Observatory#GroundStation37.9,57.222Ground StationActiveRussiaGAVRT STDN DS12#GroundStation-116.80544339,35.29993942Ground StationActiveUnited StatesXichang Satellite Launch Center - LA 1#LaunchPad102.0292,28.2474Launch PadActiveChinaKennedy Space Center LC 39B STDN B39P#LaunchPad-80.62084967,28.62716064Launch PadActiveUnited StatesXian#GroundStation109.494,34.445Ground StationActiveChinaSvobodny Cosmodrome - x11#LaunchPad128.373907,51.879783Launch PadInactiveRussiaOrlando Station#GroundStation-81.121,28.4251Ground StationActiveUnited StatesDombarovsky Cosmodrome - x47#LaunchPad59.92692,51.600688Launch PadActiveRussiaDiego Garcia GEODSS Cam1#OpticalTrackingStation72.45203,-7.41162Optical Tracking StationActiveUnited KingdomWoomera Test Range#LaunchSite136.5,-30.95Launch SiteActiveAustraliaCape Canaveral Air Force Station - LC 15#LaunchPad-80.5494,28.4963Launch PadInactiveUnited StatesCape Canaveral STDN CN5F#GroundStation-80.56341989,28.51702439Ground StationActiveUnited StatesQuicksburg Station#GroundStation-78.658,38.73Ground StationActiveUnited StatesMid-Atlantic Regional Spaceport - Launch Pad 0-B#LaunchPad-75.4913,37.8312Launch PadActiveUnited StatesStarfire Optical Range#OpticalTrackingStation-106.4639,34.9642Optical Tracking StationActiveUnited StatesCape Canaveral Air Force Station - LC 18A#LaunchPad-80.5623,28.4506Launch PadInactiveUnited StatesPoker Flat LC 1#LaunchPad-147.4879,65.1295Launch PadActiveUnited StatesCape Canaveral AFS SLC 46 STDN A46P#LaunchPad-80.52840256,28.45849161Launch PadInactiveUnited StatesKapustin Yar - LC 107 1a#LaunchPad46.298,48.5992Launch PadActiveRussiaGrand Bahama Island STDN GB2Y#GroundStation-78.29852533,26.62547128Ground StationActiveBahamasSvobodny Cosmodrome x11#LaunchPad128.373907,51.879783Launch PadInactiveRussiaEsrange Rocket Range - L#LaunchPad21.1062,67.8943Launch PadActiveSwedenEsrange Station Idun#GroundStation21.038,67.879Ground StationActiveSwedenSES ASTRA#GroundStation6.330278,49.694167Ground StationActiveLuxembourgYacolt Station#GroundStation-122.396,45.863Ground StationActiveUnited StatesLondon Inmarsat HQ#GroundStation-0.0865,51.5254Ground StationActiveUnited KingdomKiruna EISCAT Radar#RadarStation20.43395,67.86068Radar StationActiveSwedenGoose Bay Leolut#GroundStation-60.466,53.312666Ground StationActiveCanadaEOC Antenna 2#GroundStation139.34814,36.00353Ground StationActiveJapanEchoStar Spokane Station#GroundStation-117.551,47.592Ground StationActiveUnited StatesBatam Island Station#GroundStation103.9506,1.1131Ground StationActiveIndonesiaBaikonur Cosmodrome LC 175-2#LaunchPad62.987,46.0512Launch PadActiveKazakhstanBaikonur Cosmodrome LC 81-23#LaunchPad62.9785,46.074Launch PadActiveKazakhstanVandenberg Air Force Base - SLC 576-E#LaunchPad-120.6191,34.7396Launch PadActiveUnited StatesWallops Island STDN WL2S#GroundStation-75.46205786,37.94642969Ground StationActiveUnited StatesNCTAMS LANT#GroundStation-76.3088,36.9505Ground StationActiveUnited StatesWhite Sands - LC 94#LaunchPad-106.4589,34.2049Launch PadActiveUnited StatesEsrange Station ESC#GroundStation21.0599183,67.8843522Ground StationActiveSwedenHelios Station#GroundStation-15.63071,27.76343Ground StationActiveSpainGreen River Station#GroundStation-109.352,41.537Ground StationActiveUnited StatesGalenki 25m#GroundStation131.7581,44.0204Ground StationActiveRussiaCape Canaveral AFS LC 15#LaunchPad-80.5494,28.4963Launch PadInactiveUnited StatesSpitsbergen Leolut#GroundStation15.396,78.229Ground StationActiveNorwayPatrick AFB STDN RAML#LaserStation-80.60574442,28.22799675Laser StationInactiveUnited StatesSatish Dhawan Pad 2#LaunchPad80.2304,13.7199Launch PadActiveIndiaDombarovsky Cosmodrome x41#LaunchPad60.178331,51.50362Launch PadActiveRussiaRoi-Namur Super RADOT#OpticalTrackingStation167.476576,9.393608Optical Tracking StationActiveMarshall IslandsSalto di Quirra#LaunchSite9.633,39.5273Launch SiteActiveItalyWhite Sands LC 36#LaunchPad-106.322,32.417Launch PadActiveUnited StatesZimmerwald Observatory#OpticalTrackingStation7.46522,46.877229Optical Tracking StationActiveSwitzerlandDSS 55 Robledo STDN DS55#GroundStation-4.25263331,40.42429592Ground StationActiveSpainSemnan Launch Center xx3#LaunchPad53.952,35.239Launch PadActiveIranDominion Observatory#GroundStation-119.6203,49.3209Ground StationActiveCanadaHawaii 1 HI1 Leolut#GroundStation-157.9963,21.520666Ground StationActiveUnited StatesDongara Station AUWA01 STDN USPS#GroundStation115.34867764,-29.04577217Ground StationActiveAustraliaWoomera Test Range - LA 8#LaunchPad136.4629,-31.0328Launch PadActiveAustraliaYap Station#GroundStation138.0772,9.4909Ground StationActiveMicronesiaAscension Island STDN ASCQ#GroundStation-14.4025,-7.90663519Ground StationActiveUnited KingdomWhite Sands - LC 38#LaunchPad-106.2796,32.4179Launch PadActiveUnited StatesBangalore STDN BANF#GroundStation77.51,13.03Ground StationActiveIndiaAMISR Poker Flat#RadarStation-147.4707,65.1298Radar StationActiveUnited StatesWilkes-Barre Station#GroundStation-75.88268,41.24499Ground StationActiveUnited StatesBangkok 2 Leolut#GroundStation100.5432,13.717166Ground StationActiveThailandTangua Station#GroundStation-42.7837,-22.7468Ground StationActiveBrazilTanegashima Osaki Range#LaunchPad130.970274,30.39953Launch PadInactiveJapanAlcantara Launch Center - HAD Pad#LaunchPad-44.377,-2.3652Launch PadActiveBrazilHolloman A#LaunchPad-106.0714,32.8954Launch PadActiveUnited StatesKennedy Space Center LC 39A STDN A39P#LaunchPad-80.60411653,28.60827486Launch PadActiveUnited StatesKoganei xx2#GroundStation139.488122,35.710559Ground StationActiveJapanAlcantara Launch Center#LaunchSite-44.367,-2.317Launch SiteActiveBrazilOrbcomm Rio de Janiero B#GroundStation-42.87227,-22.69679Ground StationActiveBrazilUchinoura 20m#GroundStation131.080567,31.256784Ground StationActiveJapanChurchill Leolut#GroundStation-93.994,58.759Ground StationActiveCanadaPoker Flat - LC 3#LaunchPad-147.4851,65.1299Launch PadActiveUnited StatesTonghae Satellite Launching Ground#LaunchSite129.665994,40.855652Launch SiteActiveNorth KoreaCape Canaveral Air Force Station - LC 2#LaunchPad-80.5369,28.4657Launch PadInactiveUnited StatesDryden STDN DFRS#GroundStation-117.88739406,34.94979075Ground StationActiveUnited StatesMiyun Ground Station#GroundStation116.8589,40.4514Ground StationActiveChinaGRGT STDN GW3S#GroundStation144.84087494,13.58730961Ground StationActiveUnited StatesKapustin Yar - LC 107 2g#LaunchPad46.2958,48.5616Launch PadActiveRussiaMasuda USB F2#GroundStation131.01771,30.5555Ground StationActiveJapanBaikonur Cosmodrome LC 67-22#LaunchPad63.7073,45.9895Launch PadActiveKazakhstanUchinoura Space Center, 34m#GroundStation131.078495,31.254462Ground StationActiveJapanFort Buckner#GroundStation127.776,26.296Ground StationActiveJapanVandenberg Air Force Base - SLC 6 (STDN WT6P)#LaunchPad-120.62609183,34.58163228Launch PadActiveUnited StatesBear Lake RT-64#GroundStation37.951896,55.868035Ground StationActiveRussiaAberporth#LaunchSite-4.5566,52.1393Launch SiteActiveUnited KingdomMSSC 1.6m#OpticalTrackingStation-156.2574,20.70837Optical Tracking StationActiveUnited StatesWallops Island STDN WD3F#GroundStation-75.51143536,37.85636525Ground StationActiveUnited StatesKapustin Yar - LC 107 1b#LaunchPad46.298,48.5969Launch PadActiveRussiaDombarovsky Cosmodrome x11#LaunchPad59.567713,51.020939Launch PadActiveRussiaVandenberg STDN VDBF#GroundStation-120.53610972,34.77487769Ground StationActiveUnited StatesYatharagga Satellite Station#GroundStation115.3543,-29.0452Ground StationActiveAustraliaPlesetsk Cosmodrome - LC 133-3#LaunchPad40.8504,62.887Launch PadActiveRussiaPoker Flat - LC 1#LaunchPad-147.4879,65.1295Launch PadActiveUnited StatesRecife Geolut#GroundStation-34.925,-8.1383Ground StationActiveBrazilMSSC MOTIF#OpticalTrackingStation-156.2578,20.70852Optical Tracking StationActiveUnited StatesDombarovsky Cosmodrome - x43#LaunchPad59.801475,51.526422Launch PadActiveRussiaKeelung 2 Leolut#GroundStation121.7573,25.135333Ground StationActiveTaiwanTCSB#GroundStation-0.90642519,51.1178738Ground StationActiveUnited KingdomLandstuhl SATCOM Terminal#GroundStation7.534,49.402Ground StationActiveGermanyHelsinki Teleport#GroundStation24.921667,60.206389Ground StationActiveFinlandWallops Flight Facility LA 2 RAG#LaunchPad-75.4823,37.8385Launch PadActiveUnited StatesSantiago Station AGO 6#GroundStation-70.6701611,-33.1506778Ground StationActiveChileDirecTV Los Angeles Broadcast Center (LABC)#GroundStation-118.425,33.9827Ground StationActiveUnited StatesSan Nicolas Island STDN SN3F#GroundStation-119.52139117,33.24839275Ground StationActiveUnited StatesDiego Garcia GEODSS Cam2#OpticalTrackingStation72.45244,-7.41163Optical Tracking StationActiveUnited KingdomSagamihara Campus#GroundStation139.395276,35.55831Ground StationActiveJapanEsrange Rocket Range - C#LaunchPad21.1029,67.8931Launch PadActiveSwedenHolloman AFB STDN HOLF#GroundStation-106.09916956,32.90146386Ground StationActiveUnited StatesBarreira do Inferno Launch Center#LaunchSite-35.1613,-5.9236Launch SiteActiveBrazilSocorro GEODSS Cam1#OpticalTrackingStation-106.66009,33.81727Optical Tracking StationActiveUnited StatesBiscarosse BP#LaunchPad-1.2396,44.3755Launch PadActiveFranceDongara Station AUWA02#GroundStation115.3494,-29.0454Ground StationActiveAustraliaMaiquetia (2) Leolut#GroundStation-66.9865,10.599Ground StationPlannedVenezuelaOrbcomm Kitaura#GroundStation140.31,36.05Ground StationActiveJapanHammaguira - Beatrice#LaunchPad-3.0851,30.8601Launch PadActiveAlgeriaArbuckle Station#GroundStation-122.1481,38.9383Ground StationActiveUnited StatesDombarovsky Cosmodrome - x17#LaunchPad59.748227,51.079713Launch PadActiveRussiaVandenberg STDN CALT#GroundStation-120.58144669,34.6658445Ground StationActiveUnited StatesAguimes#GroundStation-15.443,27.88Ground StationActiveSpainWallops Island LEO-T STDN LE2S#GroundStation-75.47613917,37.92352944Ground StationActiveUnited StatesCat House Phased-array Radar#RadarStation37.297,55.231Radar StationActiveRussiaEsrange Rocket Range N#LaunchPad21.1064,67.8933Launch PadActiveSwedenMasuda USB F1#GroundStation131.01494,30.55581Ground StationActiveJapanTarawa Station#GroundStation173.1558,1.3645Ground StationInactiveKiribatiDiyarbakir Radar#RadarStation39.9932,37.90476Radar StationInactiveTurkeyMalindi Station STDN KENS#GroundStation40.194505,-2.9955575Ground StationActiveKenyaBiscarosse#LaunchSite-1.25,44.32Launch SiteActiveFranceOrbcomm Kijal B#GroundStation103.47409,4.34818Ground StationActiveMalaysiaGreenbelt STDN BLTD#GroundStation-76.84276675,38.9984475Ground StationInactiveUnited StatesBaikonur Cosmodrome LC 106#LaunchPad63.4971,45.9511Launch PadActiveKazakhstanPune Earth Station#GroundStation73.8657,18.6041Ground StationActiveIndiaBaikonur Cosmodrome LC 175-59#LaunchPad62.9862,46.0525Launch PadActiveKazakhstanAflenz Teleport#GroundStation15.29175,47.55456Ground StationActiveAustriaVandenberg Air Force Base - SLC 4E#LaunchPad-120.61059,34.632067Launch PadInactiveUnited StatesWoomera Test Range LA 6B#LaunchPad136.445,-31.0792Launch PadActiveAustraliaYevpatoria South Station#GroundStation33.253128,45.170314Ground StationActiveUkraineESRIN Frascati#GroundStation12.67585,41.8275Ground StationActiveItalyKwajalein Drop Zone#LaunchSite167.7,7.65Launch SiteActiveMarshall IslandsKapustin Yar xx7#LaunchPad45.716196,48.812023Launch PadActiveRussiaCape Canaveral AFS LC 19#LaunchPad-80.5542,28.5068Launch PadInactiveUnited StatesVandenberg Air Force Base - SLC 10N#LaunchPad-120.6227,34.7663Launch PadInactiveUnited StatesAMISR Resolute Bay#RadarStation-94.90624,74.72941Radar StationActiveCanadaEuropean Direct Access Facility#GroundStation11.2789,48.0862Ground StationActiveGermanySwakopmund Station#GroundStation14.547462,-22.574087Ground StationActiveNamibiaGreen River#LaunchSite-110.076,38.942Launch SiteActiveUnited StatesEmeq Haela Station#GroundStation34.9942,31.6833Ground StationActiveIsraelBITF 11m#GroundStation166.1504,-78.1296Ground StationActiveAntarcticaSouth Point Station USHI01 STDN USHS#GroundStation-155.66330125,19.0139045Ground StationActiveUnited StatesHammaguira#LaunchSite-3.06,30.88Launch SiteActiveAlgeriaKapustin Yar - V2#LaunchPad45.9074,48.5709Launch PadActiveRussiaKingston#OpticalTrackingStation-76.4675,44.231Optical Tracking StationActiveCanadaDombarovsky Cosmodrome#LaunchSite60,51Launch SiteActiveRussiaKiruna Station 15m (STDN KI2S)#GroundStation20.96434169,67.85712517Ground StationActiveSwedenSanta Ynez Peak STDN SNYC#OpticalTrackingStation-119.98584869,34.53031086Optical Tracking StationActiveUnited StatesMumbai Station#GroundStation72.8306,18.9345Ground StationActiveIndiaDombarovsky Cosmodrome - x19#LaunchPad59.844333,51.093509Launch PadActiveRussiaBaikonur Cosmodrome - LC 200-40#LaunchPad63.0379,46.0364Launch PadActiveKazakhstanSatish Dhawan#LaunchSite80.23,13.73Launch SiteActiveIndiaDombarovsky Cosmodrome x17#LaunchPad59.748227,51.079713Launch PadActiveRussiaBarking Sands LC 10#LaunchPad-159.7816,22.0569Launch PadActiveUnited StatesDombarovsky Cosmodrome x22#LaunchPad59.634472,51.11475Launch PadActiveRussiaLakhadaria Station#GroundStation3.6057,36.564Ground StationActiveAlgeriaMaidanak#OpticalTrackingStation66.89641,38.67332Optical Tracking StationActiveUzbekistanNairobi#GroundStation36.82,-1.28Ground StationActiveKenyaCape Canaveral Air Force Station - SLC 17B (STDN B17P)#LaunchPad-80.56564944,28.44579042Launch PadActiveUnited StatesEagle River Earth Station#GroundStation-149.4475,61.2995Ground StationActiveUnited StatesOklahoma Spaceport#LaunchSite-99.2,35.34Launch SitePlannedUnited StatesOsan AB#GroundStation127.03166,37.09433Ground StationActiveSouth KoreaKauai STDN HAW3#GroundStation-159.66515503,22.12627256Ground StationActiveUnited StatesMagdalena Ridge Observatory#OpticalTrackingStation-107.1894,33.98486Optical Tracking StationActiveUnited StatesCape Canaveral AFS LC 5#LaunchPad-80.5733,28.4394Launch PadInactiveUnited StatesNaval Reserve Center Station#GroundStation-121.347,37.945Ground StationInactiveUnited StatesEsrange Rocket Range - A#LaunchPad21.1018,67.8931Launch PadActiveSwedenSemnan Launch Center#LaunchSite53.92,35.25Launch SiteActiveIranAdelaide Satellite Facility#GroundStation138.572,-34.8627Ground StationActiveAustraliaDombarovsky Cosmodrome - x45#LaunchPad59.956989,51.558712Launch PadActiveRussiaAlcantara Launch Center HAD Pad#LaunchPad-44.377,-2.3652Launch PadActiveBrazilKolonicke#OpticalTrackingStation22.273858,48.935001Optical Tracking StationActiveSlovakiaAndoya Rocket Range#LaunchSite16.021,69.294Launch SiteActiveNorwayEsrange Rocket Range - MRL#LaunchPad21.103,67.8934Launch PadActiveSwedenGiant Metrewave Radio Telescope#GroundStation74.05,19.09Ground StationActiveIndiaEsrange Station ESTC (STDN KU2S)#GroundStation21.06044833,67.8831825Ground StationActiveSwedenPenteli Leolut#GroundStation23.883,38.080833Ground StationActiveGreeceHeimenschwand#GroundStation7.716108,46.831336Ground StationActiveSwitzerlandWhite Sands LC 35#LaunchPad-106.3422,32.4041Launch PadActiveUnited StatesPlesetsk Cosmodrome LC 132-2#LaunchPad40.8722,62.8834Launch PadActiveRussiaIOS STDN SEYS#GroundStation55.47782053,-4.67174811Ground StationInactiveSeychellesDombarovsky Cosmodrome x38#LaunchPad60.163782,51.338805Launch PadActiveRussiaHartebeesthoek STDN HARL#LaserStation27.68617419,-25.88970925Laser StationActiveSouth AfricaGilmore Creek STDN GLCS#GroundStation-147.50477836,64.97314211Ground StationActiveUnited StatesWeilheim#GroundStation11.078325,47.881242Ground StationInactiveGermanyWhite Sands SULF#LaunchPad-106.7364,33.7212Launch PadActiveUnited StatesCape Canaveral AFS LC 2#LaunchPad-80.5369,28.4657Launch PadInactiveUnited StatesTaiyuan North Pad#LaunchPad111.608381,38.848552Launch PadActiveChinaKapustin Yar - START R12#LaunchPad46.298,48.5807Launch PadActiveRussiaHolloman - NATIV#LaunchPad-106.0753,32.8866Launch PadActiveUnited StatesMakassar Leolut#GroundStation119.55,-5.066666Ground StationPlannedIndonesiaWellington Leolut#GroundStation175.5045,-41.152Ground StationActiveNew ZealandHartRAO#GroundStation27.685393,-25.889752Ground StationActiveSouth AfricaAbu Dhabi Geolut#GroundStation54.448,24.4312Ground StationActiveUnited Arab EmiratesKapustin Yar - xx2#LaunchPad46.297833,48.539973Launch PadActiveRussiaKapustin Yar xx4#LaunchPad46.299018,48.615791Launch PadActiveRussiaAlice Springs Transmitter#RadarStation134.4479,-22.9676Radar StationActiveAustraliaBaikonur Cosmodrome - LC 45-1#LaunchPad63.655387,45.940067Launch PadActiveKazakhstanBaikonur Cosmodrome LC 241#LaunchPad63.4558,45.8583Launch PadActiveKazakhstanPillar Point STDN PPTQ#GroundStation-122.49971472,37.49781692Ground StationActiveUnited StatesGalliot Station STDN KRUS#GroundStation-52.639872,5.098848Ground StationActiveFrench GuianaCape Canaveral AFS SLC 37B STDN B37P#LaunchPad-80.56445806,28.53121944Launch PadActiveUnited StatesNERC Satellite Receiving Station#GroundStation-2.980112,56.458105Ground StationActiveUnited KingdomWoomera Test Range - MRL#LaunchPad136.5332,-30.9573Launch PadActiveAustraliaBeijing (1) Leolut#GroundStation116.42,39.908Ground StationActiveChinaSemnan Launch Center - xx1#LaunchPad53.896,35.222Launch PadActiveIranGuiana Space Center Diamant Pad#LaunchPad-52.7524,5.2325Launch PadInactiveFrench GuianaMcMurdo STDN MC1S#GroundStation166.66708233,-77.8391295Ground StationActiveAntarcticaBangkok (1) Leolut#GroundStation100.5433,13.717166Ground StationActiveThailandMid-Atlantic Regional Spaceport 0-A#LaunchPad-75.4882,37.8338Launch PadActiveUnited StatesWhite Sands - LC 35#LaunchPad-106.3422,32.4041Launch PadActiveUnited StatesByalalu 18m#GroundStation77.36882,12.90042Ground StationActiveIndiaNew Norcia DSA 1#GroundStation116.1915,-31.048225Ground StationActiveAustraliaSvobodny Cosmodrome xx2#LaunchPad128.4085,51.7734Launch PadInactiveRussiaDombarovsky Cosmodrome x46#LaunchPad60.082438,51.588487Launch PadActiveRussiaWoomera Test Range - LA 3#LaunchPad136.5191,-30.93Launch PadActiveAustraliaJiuquan Satellite Launch Center - SLS#LaunchPad100.2915,40.958Launch PadActiveChinaUchinoura Space Center - Mu Pad#LaunchPad131.08223,31.251028Launch PadActiveJapanUS Naval Observatory#GroundStation-77.067,38.921Ground StationActiveUnited StatesNenoksa Test Range#LaunchSite39.22,64.646Launch SiteActiveRussiaVandenberg AFB SLC 10N#LaunchPad-120.6227,34.7663Launch PadInactiveUnited StatesHawkinsville Space Fence#RadarStation-83.5361,32.2889Radar StationActiveUnited StatesPoint Mugu - LC 2#LaunchPad-119.121,34.0992Launch PadActiveUnited StatesBaikonur Cosmodrome - LC 131#LaunchPad62.9562,46.0716Launch PadActiveKazakhstanDubai#GroundStation55.267,25.267Ground StationActiveUnited Arab EmiratesKarachi Station#GroundStation67.03,24.89Ground StationActivePakistanHartebeesthoek Europ Star#GroundStation27.70793,-25.88549Ground StationActiveSouth AfricaRiyadh SLR#LaserStation46.40037,24.91067Laser StationActiveSaudi ArabiaSvobodny Cosmodrome#LaunchSite128.4,51.8Launch SiteInactiveRussiaJeddah 2 Leolut#GroundStation39.1427,21.654833Ground StationActiveSaudi ArabiaTanum Teleport#GroundStation11.377,58.704Ground StationInactiveSwedenWoomera Test Range LA 5A#LaunchPad136.474,-30.9716Launch PadActiveAustraliaMonument Peak STDN MNPL#LaserStation-116.42267108,32.89173831Laser StationActiveUnited StatesFort Greely#LaunchSite-145.73,63.95Launch SiteActiveUnited StatesMelbourne Station#GroundStation-80.63638,28.08647Ground StationActiveUnited StatesChantilly STDN CHAS#GroundStation-77.44216667,38.89033333Ground StationInactiveUnited StatesJAXA Maspalomas#GroundStation-15.6348,27.76505Ground StationActiveSpainRoi-Namur Island#LaunchSite167.4652,9.4012Launch SiteActiveMarshall IslandsMoscow Teleport#GroundStation37.626,55.843Ground StationActiveRussiaCape Canaveral Air Force Station - LC 19#LaunchPad-80.5542,28.5068Launch PadInactiveUnited StatesALMA#GroundStation-67.755,-23.028Ground StationPlannedChileCape Canaveral STDN CN4F#GroundStation-80.58311147,28.46316792Ground StationActiveUnited StatesVLBA Owens Valley#GroundStation-118.277047,37.231653Ground StationActiveUnited StatesTTS STDN TTSS#GroundStation-68.59997228,76.51593456Ground StationActiveGreenlandPerth International Telecom Centre#GroundStation115.88785,-31.80485Ground StationActiveAustraliaAlamo Peak STDN ALAY#GroundStation-105.81237947,32.87253311Ground StationActiveUnited StatesPunta Arenas Leolut#GroundStation-70.847,-53.006Ground StationActiveChileCape Canaveral Air Force Station - LC 16#LaunchPad-80.5518,28.5016Launch PadInactiveUnited StatesSvobodny Cosmodrome - xx8#LaunchPad128.2764,51.8357Launch PadInactiveRussiaNorman Station#GroundStation-97.5658,35.1798Ground StationActiveUnited StatesGreen River - Pad 2#LaunchPad-110.0753,38.9413Launch PadActiveUnited StatesEsrange Station SfinX#GroundStation21.0525247,67.8882281Ground StationActiveSwedenHTSB#GroundStation-158.262297,21.5689783Ground StationActiveUnited StatesBaikonur Cosmodrome - LC 106#LaunchPad63.4971,45.9511Launch PadActiveKazakhstanGuam 2 GU2 Leolut#GroundStation144.9392,13.578333Ground StationActiveUnited StatesWallops Island STDN WPDA#GroundStation-75.47495275,37.92737297Ground StationActiveUnited StatesGuiana Space Center ZL3 STDN KR3P#LaunchPad-52.75178147,5.24036314Launch PadActiveFrench GuianaWallops Flight Facility LA 3#LaunchPad-75.4725,37.8506Launch PadActiveUnited StatesMt Hopkins STDN HOPL#LaserStation-110.87806108,31.68424706Laser StationInactiveUnited StatesDSS 24 Goldstone STDN DS24#GroundStation-116.87479442,35.33989283Ground StationActiveUnited StatesWellington 2 Geolut#GroundStation175.5045,-41.152Ground StationActiveNew ZealandStaten Island Teleport#GroundStation-74.1784,40.6028Ground StationActiveUnited StatesThornton Station#GroundStation-104.9839,39.9158Ground StationActiveUnited StatesToulouse MultiMission Station#GroundStation1.487456,43.554442Ground StationActiveFranceAustralia Telescope Compact Array#GroundStation149.565,-30.313Ground StationActiveAustraliaSatish Dhawan Space Centre - Pad 1#LaunchPad80.2346,13.7334Launch PadActiveIndiaUchinoura Space Center, 10m#GroundStation131.084654,31.255675Ground StationActiveJapanWallops Island STDN WL4S#GroundStation-75.46059947,37.94631331Ground StationActiveUnited StatesNanshan Station#GroundStation87.17837,43.47153Ground StationActiveChinaWhite Sands STDN WH6K#GroundStation-106.60923475,32.50146197Ground StationActiveUnited StatesTaiyuan Satellite Launch Center - North Pad#LaunchPad111.608381,38.848552Launch PadActiveChinaEareckson#LaunchSite174.07,52.72Launch SiteActiveUnited StatesHartebeesthoek 11m#GroundStation27.70692,-25.8855Ground StationActiveSouth AfricaSvobodny Cosmodrome xx5#LaunchPad128.23218,51.80532Launch PadInactiveRussiaPoker Flat STDN PFTQ#GroundStation-147.46329083,65.11679308Ground StationActiveUnited StatesStockholm Teleport#GroundStation18.083866,59.211779Ground StationActiveSwedenDombarovsky Cosmodrome - x39#LaunchPad60.472701,51.346817Launch PadActiveRussiaKashima Space Research Center 11m#GroundStation140.65745,35.95558Ground StationActiveJapanCape Canaveral Air Force Station - LC 26A#LaunchPad-80.5705,28.4446Launch PadInactiveUnited StatesSatish Dhawan Space Centre - Pad 2#LaunchPad80.2304,13.7199Launch PadActiveIndiaDombarovsky Cosmodrome - xx4#LaunchPad59.77451,50.775737Launch PadActiveRussiaWhite Sands - LC 37#LaunchPad-106.2911,32.4155Launch PadActiveUnited StatesSatish Dhawan Space Centre - Sounding Rocket Pad#LaunchPad80.2404,13.759Launch PadActiveIndiaBaikonur Cosmodrome LC 107#LaunchPad63.81,46.046Launch PadActiveKazakhstanBaikonur Cosmodrome LC 131#LaunchPad62.9562,46.0716Launch PadActiveKazakhstanDSS 46 Tidbinbilla STDN DS46#GroundStation148.98308169,-35.40501064Ground StationInactiveAustraliaHammaguira - Bacchus#LaunchPad-3.1241,30.8565Launch PadActiveAlgeriaVandenberg AFB SLC 8#LaunchPad-120.6324,34.5762Launch PadActiveUnited StatesHong Kong 1 Leolut#GroundStation114.1445,22.275833Ground StationActiveChinaSheshan Station#GroundStation121.1995,31.0992Ground StationActiveChinaMaiquetia 1 Leolut#GroundStation-66.982,10.598Ground StationPlannedVenezuelaLatefia#GroundStation44.2079,33.7224Ground StationActiveIraqComcast Los Angeles Station#GroundStation-118.4566,34.0312Ground StationActiveUnited StatesBaikonur Cosmodrome - LC 163#LaunchPad63.172,46.002Launch PadActiveKazakhstanEdwards AFB STDN EAFF#GroundStation-117.91155094,34.96065983Ground StationActiveUnited StatesDSS 26 Goldstone STDN D26D#GroundStation-116.8730165,35.33568922Ground StationActiveUnited StatesAscension Island STDN AS2Q#GroundStation-14.40095086,-7.97280625Ground StationActiveUnited KingdomWallops Flight Facility LA 2 MLS#LaunchPad-75.4835,37.8375Launch PadActiveUnited StatesFlorida 2 (FL2) Leolut#GroundStation-80.3838,25.616333Ground StationActiveUnited StatesDombarovsky Cosmodrome x26#LaunchPad59.74824,51.154839Launch PadActiveRussiaPrince Albert xx2#GroundStation-105.92615,53.21206Ground StationActiveCanadaWhite Sands BRT STDN WH2J#GroundStation-106.61196575,32.50628147Ground StationActiveUnited StatesMaryland (LSE) Leolut#GroundStation-76.93,38.850333Ground StationActiveUnited StatesMaiquetia Geolut#GroundStation-66.982,10.598Ground StationPlannedVenezuelaSpace Surveillance Telescope#OpticalTrackingStation-106.3644,33.7395Optical Tracking StationActiveUnited StatesSintra Station#GroundStation-9.2817,38.8692Ground StationActivePortugalKapustin Yar xx2#LaunchPad46.297833,48.539973Launch PadActiveRussiaERMEXS#GroundStation-99.12879,19.32263Ground StationActiveMexicoAerospace Data Facility East#GroundStation-77.1583,38.7361Ground StationActiveUnited StatesHammaguira Brigitte#LaunchPad-3.0357,30.8935Launch PadActiveAlgeriaSvobodny Cosmodrome - x12#LaunchPad128.252,51.8818Launch PadInactiveRussiaCalifornia 1 (CA1) Leolut#GroundStation-120.5515,34.6625Ground StationActiveUnited StatesOrbcomm Almaty B#GroundStation76.78226,44.49652Ground StationActiveKazakhstanAuckland Station#GroundStation174.6959,-36.7482Ground StationActiveNew ZealandTVB City#GroundStation114.2723,22.2778Ground StationActiveChinaTaejon#GroundStation127.4333,36.3269Ground StationActiveSouth KoreaWhite Sands LC 37#LaunchPad-106.2911,32.4155Launch PadActiveUnited StatesWhite Sands STDN WHSS#GroundStation-106.60855189,32.50026978Ground StationActiveUnited StatesSondrestrom Rocket Range#LaunchSite-50.6,67.024Launch SiteActiveGreenlandKapustin Yar SAM#LaunchPad45.7346,48.8055Launch PadActiveRussiaKapustin Yar - xx5#LaunchPad45.781879,48.781927Launch PadActiveRussiaWhite Sands STDN STSS#GroundStation-106.61209906,32.54171675Ground StationActiveUnited StatesBaikonur Cosmodrome LC 110R#LaunchPad63.3102,45.9622Launch PadActiveKazakhstanKitab#OpticalTrackingStation66.8863,39.1337Optical Tracking StationActiveUzbekistanAPL STDN MDLS#GroundStation-76.89877778,39.16736111Ground StationActiveUnited StatesBerkeley STDN BRKS#GroundStation-122.24278381,37.87937658Ground StationActiveUnited StatesTorrejon Air Base xx1#GroundStation-3.4469,40.4805Ground StationActiveSpainVandenberg Air Force Base - SLC 10W#LaunchPad-120.6244,34.7636Launch PadInactiveUnited StatesMaryland Point#GroundStation-77.23068,38.3742Ground StationActiveUnited StatesEsrange Station TTC STDN KICS#GroundStation21.060769,67.884232Ground StationActiveSwedenGreen River Pad 3#LaunchPad-110.0741,38.9426Launch PadActiveUnited StatesTanegashima Space Center - Yoshinobu LC, Pad 1#LaunchPad130.977582,30.400975Launch PadActiveJapanJPL#GroundStation-118.1726,34.2031Ground StationActiveUnited StatesBITF 7m#GroundStation166.1504,-78.1296Ground StationActiveAntarcticaGRGT STDN GWMK#GroundStation144.8409295,13.58801786Ground StationActiveUnited StatesCape Cod AFS PAVE PAWS#RadarStation-70.5386,41.7524Radar StationActiveUnited StatesKronogard#LaunchSite19.32,66.3922Launch SiteInactiveSwedenTTSA#GroundStation-68.5956028,76.5151944Ground StationActiveGreenlandEagle Vision 5#GroundStation-157.92,21.32Ground StationActiveUnited StatesAlcantara Ground Station#GroundStation-44.404167,-2.338333Ground StationActiveBrazilRAL Station 12m#GroundStation-1.31268,51.57215Ground StationActiveUnited KingdomOttawa Leolut#GroundStation-75.6745,45.328666Ground StationActiveCanadaCape Canaveral Air Force Station - SLC 36B (STDN B36P)#LaunchPad-80.54095408,28.46836775Launch PadDemolishedUnited StatesCocos Island STDN COCS#GroundStation96.85,-12.2Ground StationActiveAustraliaQingdao Station#GroundStation120.383,36.066Ground StationActiveChinaWoomera Test Range LA 8#LaunchPad136.4629,-31.0328Launch PadActiveAustraliaTutuila BRT STDN AM2J#GroundStation-170.71941667,-14.33144444Ground StationActiveUnited StatesAlcantara Launch Center - UL Pad#LaunchPad-44.367,-2.316Launch PadActiveBrazilOverberg Earth Station 10m#GroundStation20.226,-34.616Ground StationActiveSouth AfricaKapustin Yar - LC 107 2a#LaunchPad46.2949,48.5609Launch PadActiveRussiaBatelco Teleport#GroundStation50.6114,26.0714Ground StationActiveBahrainMcMurdo STDN MCMS#GroundStation166.4,-77.8Ground StationActiveAntarcticaBarking Sands - LC 14#LaunchPad-159.7788,22.058Launch PadActiveUnited StatesGreenbelt Geolut#GroundStation-76.840666,38.999Ground StationActiveUnited StatesEsrange Rocket Range A#LaunchPad21.1018,67.8931Launch PadActiveSwedenOrbcomm San Luis A#GroundStation-65.18131,-33.8374Ground StationActiveArgentinaStanley Earth Station#GroundStation114.221,22.197Ground StationActiveChinaPARTNeR STDN DS61#GroundStation-4.24892803,40.42874444Ground StationActiveSpainKennedy Space Center - LC 39B (STDN B39P)#LaunchPad-80.62084967,28.62716064Launch PadActiveUnited StatesDoral Station#GroundStation-80.3525,25.81Ground StationActiveUnited StatesCape D-Aguilar Station#GroundStation114.2492,22.2167Ground StationActiveChinaDombarovsky Cosmodrome x29#LaunchPad60.765442,51.201923Launch PadActiveRussiaChilbolton Observatory#GroundStation-1.43842,51.14502Ground StationActiveUnited KingdomMojave Air and Space Port#LaunchSite-118.15,35.06Launch SitePlannedUnited StatesEsrange Rocket Range MRL#LaunchPad21.103,67.8934Launch PadActiveSwedenCape Canaveral Air Force Station - LC 31#LaunchPad-80.5563,28.4519Launch PadInactiveUnited StatesWoomera Test Range LA 2#LaunchPad136.521,-30.9433Launch PadActiveAustraliaWoomera Test Range - HAD#LaunchPad136.5322,-30.9553Launch PadActiveAustraliaDSS 53 Robledo#GroundStation-4.24964,40.42744Ground StationInactiveSpainRio Grande Leolut#GroundStation-67.7053,-53.779166Ground StationActiveArgentinaKapustin Yar START R12#LaunchPad46.298,48.5807Launch PadActiveRussiaBaikonur Cosmodrome - LC 67-21#LaunchPad63.705,45.9893Launch PadActiveKazakhstanBundaberg Leolut#GroundStation152.4128,-24.758333Ground StationActiveAustraliaMiyun Deep Space Station#GroundStation116.976,40.558Ground StationActiveChinaSan Marco Launch Platform#LaunchSite40.2125,-2.9383Launch SiteInactiveKenyaBlack Island STDN BLKQ#GroundStation166.15043278,-78.12957889Ground StationActiveAntarcticaTDC Herstedvester Teleport#GroundStation12.355,55.68Ground StationActiveDenmarkSvalsat SG 3 STDN SG3S#GroundStation15.40809583,78.229735Ground StationActiveNorwayAlice Springs BRT STDN ALSJ#GroundStation133.8825985,-23.75881044Ground StationActiveAustraliaTai Po Earth Station#GroundStation114.19,22.453Ground StationActiveChinaKashima Space Research Center 34m#GroundStation140.66006,35.95589Ground StationActiveJapanWallops Flight Facility LA 2 AML-2#LaunchPad-75.483,37.8379Launch PadActiveUnited StatesXichang Satellite Launch Center - LA 2#LaunchPad102.0271,28.2455Launch PadActiveChinaKwajalein STDN KMPF#RadarStation167.72649006,8.72167692Radar StationActiveMarshall IslandsGuam 2 (GU2) Leolut#GroundStation144.9392,13.578333Ground StationActiveUnited StatesBaikonur Cosmodrome xx2#LaunchPad63.462445,45.94176Launch PadActiveKazakhstanDefford Site#GroundStation-2.147,52.097Ground StationActiveUnited KingdomWhite Sands - LC 33#LaunchPad-106.443,32.3396Launch PadActiveUnited StatesWallops Flight Facility LA 2 AML-1#LaunchPad-75.4828,37.8381Launch PadActiveUnited StatesSantiago Station AGO 3 STDN AGO3#GroundStation-70.666403,-33.15110747Ground StationActiveChileKapustin Yar - LC 107 2h#LaunchPad46.2949,48.5617Launch PadActiveRussiaWhite Sands STDN STGK#GroundStation-106.61208894,32.54327958Ground StationActiveUnited StatesBangalore#GroundStation77.5116,13.0344Ground StationActiveIndiaLasham Satellite Ground Station#GroundStation-1.044,51.184Ground StationDemolishedUnited KingdomOtay Mt STDN SNDL#LaserStation-116.84080406,32.60073169Laser StationInactiveUnited StatesBaikonur Cosmodrome - LC 172#LaunchPad63.092,46.065Launch PadActiveKazakhstanHolloman - SLED#LaunchPad-106.1484,32.9263Launch PadActiveUnited StatesVandenberg STDN VDB3#GroundStation-120.50161731,34.56562592Ground StationActiveUnited StatesPerth STDN PRTS#GroundStation115.885,-31.802Ground StationActiveAustraliaMadley Communications Centre#GroundStation-2.84049,52.03198Ground StationActiveUnited KingdomIllegini Island#LaunchSite167.4754,9.0856Launch SiteActiveMarshall IslandsEsrange Station SSC-CNES#GroundStation21.0309,67.88225Ground StationActiveSwedenAlcantara Launch Center - MRL Pad#LaunchPad-44.3671,-2.3167Launch PadActiveBrazilRed River Space Fence#RadarStation-93.5503,33.33Radar StationActiveUnited StatesRedu Station#GroundStation5.145344,50.000456Ground StationActiveBelgiumWallops Flight Facility - LA 2 ARC#LaunchPad-75.4841,37.838Launch PadActiveUnited StatesVandenberg STDN VD2F#GroundStation-120.62712139,34.75823183Ground StationActiveUnited StatesFort Wingate#LaunchSite-108.5994,35.44868Launch SiteActiveUnited StatesAnkara 2 Leolut#GroundStation32.9897,40.140666Ground StationActiveTurkeyBaikonur Cosmodrome LC 195#LaunchPad63.2127,45.783Launch PadActiveKazakhstanChilworth Station#GroundStation-1.4274,50.9608Ground StationActiveUnited KingdomSvobodny Cosmodrome - xx6#LaunchPad128.467,51.8054Launch PadInactiveRussiaBiscarosse CE#LaunchPad-1.2325,44.3917Launch PadActiveFranceRATAN-600 Radio Telescope#GroundStation41.587,43.826Ground StationActiveRussiaDSTO Adelaide#GroundStation138.65,-34.731Ground StationActiveAustraliaZhuklino A-35 Anti-missile Site#RadarStation38.579,56.244Radar StationActiveRussiaTanegashima Yoshinobu LC Pad 1#LaunchPad130.977582,30.400975Launch PadActiveJapanWhite Sands STDN WH7F#GroundStation-106.65901447,33.81307828Ground StationActiveUnited StatesJiuquan Satellite Launch Center - LA 2A#LaunchPad100.3165,41.3088Launch PadActiveChinaDombarovsky Cosmodrome xx1#LaunchPad59.655376,50.658373Launch PadActiveRussiaVandenberg Air Force Base - SLC 1W#LaunchPad-120.6303,34.7571Launch PadInactiveUnited StatesJiuquan Satellite Launch Center - xx1#LaunchPad100.304946,41.280432Launch PadActiveChinaDGSA#GroundStation72.37002305,-7.2700227Ground StationActiveUnited KingdomHetian Station#GroundStation79.922,37.114Ground StationActiveChinaElfordstown Station#GroundStation-8.1758,51.9533Ground StationActiveIrelandBaikonur Cosmodrome LC 164#LaunchPad63.064,45.9445Launch PadActiveKazakhstanEsrange Rocket Range L#LaunchPad21.1062,67.8943Launch PadActiveSwedenWoodbine Teleport#GroundStation-77.081,39.3763Ground StationActiveUnited StatesCape Canaveral AFS LC 11#LaunchPad-80.5395,28.4753Launch PadInactiveUnited StatesDSS 42 Tidbinbilla STDN DS42#GroundStation148.98124419,-35.40068386Ground StationDemolishedAustraliaEdmonton Leolut#GroundStation-113.3162,53.678166Ground StationActiveCanadaCarpentersville Station#GroundStation-75.1911,40.6444Ground StationActiveUnited StatesBaikonur Cosmodrome LC 160#LaunchPad62.9423,46.0783Launch PadActiveKazakhstanPoker Flat STDN WT1S#GroundStation-147.45906028,65.11723692Ground StationInactiveUnited StatesUchinoura 34m#GroundStation131.078495,31.254462Ground StationActiveJapanWoomera Test Range - LA 6B#LaunchPad136.445,-31.0792Launch PadActiveAustraliaEagle Vision 3#GroundStation-117.16202,32.83818Ground StationActiveUnited StatesEchoStar Cheyenne Station#GroundStation-104.736,41.132Ground StationActiveUnited StatesYarragadee STDN YARL#LaserStation115.34674628,-29.04649844Laser StationActiveAustraliaO-Higgins#GroundStation-57.901241,-63.321128Ground StationActiveAntarcticaOrbcomm Matera A#GroundStation16.70751,40.64922Ground StationActiveItalyEOC Antenna 3#GroundStation139.3478,36.00235Ground StationActiveJapanOverberg Test Range - xx1#LaunchPad20.30271,-34.60276Launch PadActiveSouth AfricaMatera STDN MROL#LaserStation16.70460944,40.64867006Laser StationActiveItalyDombarovsky Cosmodrome - x36#LaunchPad60.301504,51.270092Launch PadActiveRussiaGrasse STDN GRAL#LaserStation6.92157186,43.75463183Laser StationActiveFranceVillafranca VIL-2#GroundStation-3.95257,40.44558Ground StationActiveSpainDombarovsky Cosmodrome - xx9#LaunchPad59.551097,50.972694Launch PadActiveRussiaSGS Colerne Site#GroundStation-2.2771,51.444Ground StationActiveUnited KingdomXichang Satellite Launch Center - LA 3#LaunchPad102.0271,28.2455Launch PadActiveChinaAlbright Station#GroundStation-79.579,39.5686Ground StationActiveUnited StatesCape Canaveral AFS LC 22#LaunchPad-80.5398,28.461Launch PadInactiveUnited StatesGilmore Creek STDN GILE#GroundStation-147.49800047,64.97850711Ground StationActiveUnited StatesDSS 34 Tidbinbilla STDN DS34#GroundStation148.98196442,-35.39847883Ground StationActiveAustraliaFairbanks STDN ULA3#GroundStation-147.51338883,64.97214025Ground StationInactiveUnited StatesSvobodny Cosmodrome xx4#LaunchPad128.3386,51.7938Launch PadInactiveRussiaFGAN Radar#RadarStation7.129822,50.616569Radar StationActiveGermanyWallops Flight Facility - LA 4 HAD#LaunchPad-75.4696,37.8511Launch PadActiveUnited StatesAlaska 1 (AK1) Leolut#GroundStation-147.5173,64.973666Ground StationActiveUnited StatesKwajalein Phased Array Radar#RadarStation167.715317,8.725601Radar StationActiveMarshall IslandsBaikonur Cosmodrome LC 194#LaunchPad63.301,45.854Launch PadActiveKazakhstanLucknow#GroundStation80.957329,26.913182Ground StationActiveIndiaEOC Antenna 1#GroundStation139.3488,36.00386Ground StationActiveJapanCallao Leolut#GroundStation-77.1298,-12.030666Ground StationActivePeruTranquillon Peak STDN CALC#OpticalTrackingStation-120.56243417,34.58238614Optical Tracking StationActiveUnited StatesDSS 17 Goldstone STDN DS17#GroundStation-116.87345528,35.34222994Ground StationDemolishedUnited StatesKaena Point Radar STDN KPTQ#RadarStation-158.26658533,21.57211972Radar StationActiveUnited StatesSvalsat EUM 2#GroundStation15.3884,78.229Ground StationActiveNorwayMid-Atlantic Regional Spaceport 0-B#LaunchPad-75.4913,37.8312Launch PadActiveUnited StatesEsrange Rocket Range#LaunchSite21.105,67.893Launch SiteActiveSwedenTaiyuan#LaunchSite111.61,38.84Launch SiteActiveChinaBaikonur Cosmodrome LC 60-7#LaunchPad64.0173,46.0181Launch PadActiveKazakhstanTRADEX Radar STDN KMRF#RadarStation167.48214819,9.39874711Radar StationActiveMarshall IslandsOrbcomm Maghreb B#GroundStation-7.64393,33.04755Ground StationActiveMoroccoGuiana Space Center ZL2 STDN KR2P#LaunchPad-52.77567156,5.23240672Launch PadInactiveFrench GuianaTaeduk Radio Astronomy Observatory#GroundStation127.3752,36.3976Ground StationActiveSouth KoreaCar Nicobar Station#GroundStation92.82765,9.1548Ground StationActiveIndiaSatish Dhawan Sounding Rocket Pad#LaunchPad80.2404,13.759Launch PadActiveIndiaWallops Island STDN WAPS#GroundStation-75.4765225,37.92492556Ground StationActiveUnited StatesHai Phong Station#GroundStation106.7104,20.8005Ground StationActiveVietnamPlesetsk Cosmodrome - LC 41-1#LaunchPad40.529,62.9405Launch PadDemolishedRussiaPatrick AFB STDN PATQ#GroundStation-80.59927636,28.22640242Ground StationActiveUnited StatesAtom Peak STDN ATMY#GroundStation-106.36455683,33.73962981Ground StationActiveUnited StatesWoomera Test Range - LA 1#LaunchPad136.5037,-30.9587Launch PadActiveAustraliaWellington (2) Geolut#GroundStation175.5045,-41.152Ground StationActiveNew ZealandDSS 63 Robledo STDN DS63#GroundStation-4.24800856,40.43120975Ground StationActiveSpainEdwards AFB STDN FRCF#GroundStation-117.91149608,34.96080469Ground StationActiveUnited StatesBukit Timah Satellite Earth Station#GroundStation103.7911,1.3514Ground StationActiveSingaporeFort Meade SATCOM Terminal#GroundStation-76.757,39.104Ground StationActiveUnited StatesWhite Sands STDN ST2K#GroundStation-106.61208894,32.54297736Ground StationActiveUnited StatesAuScope VLBI Katherine#GroundStation132.1524,-14.3755Ground StationActiveAustraliaPlesetsk Cosmodrome LC 32-2#LaunchPad40.7895,62.9057Launch PadActiveRussiaCape Canaveral Air Force Station - LC 4#LaunchPad-80.5356,28.4669Launch PadInactiveUnited StatesWallops Island STDN WPSA#GroundStation-75.47498581,37.92727767Ground StationInactiveUnited StatesThule BMEWS#RadarStation-68.2992,76.5703Radar StationActiveGreenlandFauske Geolut#GroundStation15.302,67.237Ground StationActiveNorwayCape Canaveral Air Force Station - LC 6#LaunchPad-80.5726,28.4407Launch PadInactiveUnited StatesMILA Test BRT STDN MILJ#GroundStation-80.69301289,28.50598947Ground StationInactiveUnited StatesEsrange Station KSX#GroundStation21.0556028,67.8887061Ground StationActiveSwedenNeustrelitz STDN NSGS#GroundStation13.07,53.32972222Ground StationActiveGermanyQueensland Receiver#RadarStation143.1936,-24.2871Radar StationActiveAustraliaMcDonald Observatory STDN MLRL#LaserStation-104.01519731,30.68026717Laser StationActiveUnited StatesMidway Research Center#GroundStation-77.373,38.498Ground StationActiveUnited StatesAlaska 1 AK1 Leolut#GroundStation-147.5173,64.973666Ground StationActiveUnited StatesTromso EISCAT Dish Radar#RadarStation19.22637,69.58648Radar StationActiveNorwayOrbcomm St Johns B#GroundStation-109.554917,34.455501Ground StationActiveUnited StatesBretagne 1 Radar STDN KRUF#RadarStation-52.64498992,5.11400642Radar StationActiveFrench GuianaNauchny#OpticalTrackingStation34.01567,44.72785Optical Tracking StationActiveUkraineSocorro GEODSS, xx1#OpticalTrackingStation-106.66009,33.81727Optical Tracking StationActiveUnited StatesKuantan Station#GroundStation103.36,3.866Ground StationActiveMalaysiaOttawa (2) Geolut#GroundStation-75.674333,45.3438Ground StationActiveCanadaDombarovsky Cosmodrome x37#LaunchPad60.728749,51.301802Launch PadActiveRussiaNHS STDN NH2S#GroundStation-71.63032172,42.94474167Ground StationActiveUnited StatesVostochny Cosmodrome#LaunchSite128.25,51.817Launch SitePlannedRussiaPsary Station#GroundStation20.8542,50.9336Ground StationActivePolandCape Canaveral AFS SLC 17A STDN A17P#LaunchPad-80.56492617,28.44716106Launch PadActiveUnited StatesMiramar Station#GroundStation-80.2833,25.9756Ground StationActiveUnited StatesHolloman - A#LaunchPad-106.0714,32.8954Launch PadActiveUnited StatesCheia Station#GroundStation25.9465,45.4567Ground StationActiveRomaniaTularosa STDN TULF#GroundStation-106.15915417,33.09616153Ground StationActiveUnited StatesCSTARS_East_11m#GroundStation-80.3837,25.61336Ground StationActiveUnited StatesPillar Point STDN PPTY#GroundStation-122.49918072,37.49777411Ground StationActiveUnited StatesDongara Station AUWA01 STDN AUWS#GroundStation115.34866806,-29.04576808Ground StationActiveAustraliaGSE Geolut#GroundStation-76.93,38.8503Ground StationActiveUnited StatesOrbcomm Chong Ho Won#GroundStation127.66,37.14Ground StationActiveSouth KoreaWallops Flight Facility - LA 4#LaunchPad-75.4701,37.8508Launch PadActiveUnited StatesKapustin Yar - LC 86 4a#LaunchPad46.295,48.5508Launch PadActiveRussiaPoint Mugu LC 2#LaunchPad-119.121,34.0992Launch PadActiveUnited StatesGreenbelt STDN STAL#LaserStation-76.82777092,39.02029483Laser StationInactiveUnited StatesBeijing 2 Leolut#GroundStation116.42,39.908Ground StationActiveChinaEglin AFB AN-FPS 85 PAR STDN EG2F#RadarStation-86.21471742,30.57252794Radar StationActiveUnited StatesRas Al Khaimah Spaceport#LaunchSite55.941,25.617Launch SitePlannedUnited Arab EmiratesPatrick AFB STDN PA2Q#GroundStation-80.60609819,28.22732817Ground StationActiveUnited StatesSvobodny Cosmodrome xx1#LaunchPad128.3102,51.747Launch PadInactiveRussiaNOAA STDN SOCA#GroundStation-76.93222222,38.85002611Ground StationActiveUnited StatesSpaceport Singapore#LaunchSite103.99,1.36Launch SitePlannedSingaporeSpaceport America#LaunchSite-106.98,32.99Launch SitePlannedUnited StatesJiuquan#LaunchSite100.5,41.1Launch SiteActiveChinaJamesburg Earth Station#GroundStation-121.64704,36.40313Ground StationActiveUnited StatesWestford Radio Telescope#GroundStation-71.49377,42.61293Ground StationActiveUnited StatesAnkara 1 Leolut#GroundStation32.9897,40.140833Ground StationActiveTurkeyKapustin Yar - LC 107 2d#LaunchPad46.2959,48.5695Launch PadActiveRussiaBaikonur Cosmodrome - LC 45-2#LaunchPad63.6532,45.9433Launch PadActiveKazakhstanJiuquan SLS#LaunchPad100.2915,40.958Launch PadActiveChinaWhite Sands LC 50#LaunchPad-106.3488,32.4064Launch PadActiveUnited StatesSvobodny Cosmodrome xx3#LaunchPad128.185,51.792Launch PadInactiveRussiaVillafranca VIL-4#GroundStation-3.95173,40.44451Ground StationActiveSpainKwajalein BC-4 Cameras#OpticalTrackingStation167.719465,8.72304Optical Tracking StationActiveMarshall IslandsADSCGS#GroundStation114.842,-28.695Ground StationActiveAustraliaSvobodny Cosmodrome xx8#LaunchPad128.2764,51.8357Launch PadInactiveRussiaIncheon Leolut#GroundStation126.649,37.393Ground StationActiveSouth KoreaWoomera Test Range - LA 9#LaunchPad136.4871,-30.9031Launch PadActiveAustraliaWestern Australian Transmitter#RadarStation122.8435,-28.3174Radar StationActiveAustraliaWallops Island STDN WTDS#GroundStation-75.47746889,37.92306592Ground StationActiveUnited StatesHauppauge Station#GroundStation-73.264,40.8202Ground StationActiveUnited StatesKeelung 1 Leolut#GroundStation121.7573,25.135333Ground StationActiveTaiwanSPTR-2#GroundStation0,-90Ground StationActiveAntarcticaBaikonur Cosmodrome LC 105#LaunchPad63.4962,45.9503Launch PadActiveKazakhstanBaikonur Cosmodrome - LC 110R#LaunchPad63.3102,45.9622Launch PadActiveKazakhstanYarragedee STDN YARZ#GroundStation115.34666667,-29.04664553Ground StationActiveAustraliaResolute Bay#LaunchSite-94.8962,74.687Launch SiteInactiveCanadaMaui GEODSS Cam3#OpticalTrackingStation-156.2575,20.7085Optical Tracking StationActiveUnited StatesAntigua Island STDN ANRQ#GroundStation-61.77522336,17.13728994Ground StationActiveAntigua and BarbudaCape Canaveral AFS LC 34#LaunchPad-80.5611,28.5218Launch PadInactiveUnited StatesCebreros DSA 2#GroundStation-4.367549,40.45269Ground StationActiveSpainBaikonur Cosmodrome - LC 109#LaunchPad63.4452,45.9525Launch PadActiveKazakhstanEsrange Station ELS#GroundStation21.062325,67.8765153Ground StationActiveSwedenAntigua STDN AN3S#GroundStation-61.77435,17.13695083Ground StationActiveAntigua and BarbudaWallops Flight Facility - LA 4 MAST#LaunchPad-75.4702,37.8508Launch PadActiveUnited StatesJoint Defense Facility Pine Gap#GroundStation133.737,-23.799Ground StationActiveAustraliaKarachi Leolut#GroundStation67.136,24.946Ground StationActivePakistanDarwin Station#GroundStation130.9812,-12.4765Ground StationActiveAustraliaBaikonur Cosmodrome - LC 110L#LaunchPad63.3049,45.9647Launch PadActiveKazakhstanSvalsat EUM 1#GroundStation15.4014,78.2286Ground StationActiveNorwayTidbinbilla STDN RGTS#GroundStation148.98241831,-35.40453633Ground StationActiveAustraliaSvalsat SG 4 STDN SG4S#GroundStation15.4097095,78.22801361Ground StationActiveNorwayTianshan Station#GroundStation120.09,43.874Ground StationActiveChinaMMW Radar#RadarStation167.48123,9.39731Radar StationActiveMarshall IslandsCTS STDN CTSS#GroundStation-104.52846914,38.80598842Ground StationActiveUnited StatesTromso EISCAT Cylinder Radar#RadarStation19.2219,69.5867Radar StationActiveNorwayKodiak Launch Complex#LaunchSite-152.3393,57.4352Launch SiteActiveUnited StatesEchoStar Mt Jackson Station#GroundStation-78.667,38.723Ground StationActiveUnited StatesItapetinga Radio Observatory#GroundStation-46.55823,-23.18524Ground StationActiveBrazilVostochny Cosmodrome#LaunchSite128.25,51.817Launch SitePlannedRussiaWallops Island STDN WLPQ#GroundStation-75.50929556,37.86026147Ground StationActiveUnited StatesHawaii 1 (HI1) Leolut#GroundStation-157.9963,21.520666Ground StationActiveUnited StatesKapustin Yar LC 107 2a#LaunchPad46.2949,48.5609Launch PadActiveRussiaDombarovsky Cosmodrome x36#LaunchPad60.301504,51.270092Launch PadActiveRussiaWallops Island STDN WL53#GroundStation-75.4601,37.9468Ground StationActiveUnited StatesSvobodny Cosmodrome xx6#LaunchPad128.467,51.8054Launch PadInactiveRussiaDehmandro Station#GroundStation67.0992,25.1933Ground StationActivePakistanXTAR 16m#GroundStation-15.63132,27.76271Ground StationActiveSpainBaikonur Cosmodrome LC 1#LaunchPad63.3422,45.9203Launch PadActiveKazakhstanMakassar Leolut#GroundStation119.55,-5.066666Ground StationPlannedIndonesiaVandenberg AFB SLC 10W#LaunchPad-120.6244,34.7636Launch PadInactiveUnited StatesBiscarosse - CE#LaunchPad-1.2325,44.3917Launch PadActiveFranceBaikonur Cosmodrome LC 104#LaunchPad63.4197,45.9875Launch PadActiveKazakhstanBaikonur Cosmodrome LC 161-35#LaunchPad63.063,46.0335Launch PadActiveKazakhstanWallops Island STDN WPS8#GroundStation-75.47583319,37.92735903Ground StationActiveUnited StatesAnderson Peak STDN ANPC#OpticalTrackingStation-121.64434508,36.18052364Optical Tracking StationActiveUnited StatesCape Canaveral Air Force Station - SLC 46 (STDN A46P)#LaunchPad-80.52840256,28.45849161Launch PadInactiveUnited StatesPoint Mugu#LaunchSite-119.121,34.099Launch SiteActiveUnited StatesChilca#LaunchSite-76.799,-12.505Launch SiteActivePeruKueijen#GroundStation120.28,22.97Ground StationActiveTaiwanZimmerwald STDN ZIML#LaserStation7.46521981,46.87722883Laser StationActiveSwitzerlandFresnedillas Monitoring Station#GroundStation-4.1697,40.4555Ground StationActiveSpainDombarovsky Cosmodrome - x23#LaunchPad60.675969,51.146793Launch PadActiveRussiaHagerstown Teleport#GroundStation-77.757011,39.599906Ground StationActiveUnited StatesNapa Teleport#GroundStation-122.279965,38.245535Ground StationActiveUnited StatesDombarovsky Cosmodrome xx5#LaunchPad59.595072,50.837656Launch PadActiveRussiaDSS 25 Goldstone STDN DS25#GroundStation-116.87536319,35.33761197Ground StationActiveUnited StatesCape Canaveral Air Force Station - LC 22#LaunchPad-80.5398,28.461Launch PadInactiveUnited StatesEglin AFB Launch Site#LaunchSite-85.34588,29.67729Launch SiteActiveUnited StatesHolloman ZEL#LaunchPad-106.06,32.88Launch PadActiveUnited StatesOgasawara Downrange Station#GroundStation142.215439,27.079017Ground StationActiveJapanInuvik Station INU#GroundStation-133.54391,68.31788Ground StationActiveCanadaToulouse 1 Leolut#GroundStation1.4808,43.560666Ground StationActiveFranceBaikonur Cosmodrome - LC 165#LaunchPad62.9185,45.9912Launch PadActiveKazakhstanJiuquan LA 2B#LaunchPad100.3132,41.3061Launch PadActiveChinaPort Hedland STDN SWNS#GroundStation118.635,-20.38Ground StationActiveAustraliaTsukuba Space Center#GroundStation140.126716,36.071299Ground StationActiveJapanDSS 27 Goldstone STDN D27D#GroundStation-116.77665044,35.23827178Ground StationActiveUnited StatesTrivandrum#GroundStation76.8731,8.5365Ground StationActiveIndiaMaryland (2) Geolut#GroundStation-76.93,38.8503Ground StationActiveUnited StatesEsrange Station SfinX#GroundStation21.0525247,67.8882281Ground StationActiveSwedenTranquillon Peak STDN CA2F#GroundStation-120.56111489,34.58302833Ground StationActiveUnited StatesWhite Sands STDN WH2K#GroundStation-106.60855172,32.50073719Ground StationActiveUnited StatesBaikonur Cosmodrome - LC 161-35#LaunchPad63.063,46.0335Launch PadActiveKazakhstanBaikonur Cosmodrome LC 45-1#LaunchPad63.655387,45.940067Launch PadActiveKazakhstanASF 11m STDN ASFS#GroundStation-147.85817536,64.85880858Ground StationActiveUnited StatesBaikonur Cosmodrome - LC 41-3#LaunchPad63.6598,45.9754Launch PadActiveKazakhstanDSS 17 Goldstone STDN GDSA#GroundStation-116.87300133,35.34154264Ground StationDemolishedUnited StatesKodiak Ranging Site#GroundStation-152.3737,57.4554Ground StationActiveUnited StatesToulouse (2) Leolut#GroundStation1.4808,43.5605Ground StationActiveFranceDSS 15 Goldstone STDN DS15#GroundStation-116.88719511,35.42185328Ground StationActiveUnited StatesDomme SIGINT Station#GroundStation1.2381,44.7864Ground StationActiveFranceMullach Mor Radar Station#GroundStation-8.584962,57.819175Ground StationActiveUnited KingdomTula Peak STDN TULS#GroundStation-106.139091,33.02694489Ground StationInactiveUnited StatesESA Space Debris Telescope#OpticalTrackingStation-16.51189,28.30095Optical Tracking StationActiveSpainBaikonur Cosmodrome - LC 175-59#LaunchPad62.9862,46.0525Launch PadActiveKazakhstanCTSA#GroundStation-104.52848,38.8059353Ground StationActiveUnited StatesPanamsat Long Beach Operations Center#GroundStation-118.2112,33.8292Ground StationActiveUnited StatesDombarovsky Cosmodrome x34#LaunchPad60.461524,51.259129Launch PadActiveRussiaESRIN Maspalomas#GroundStation-15.63377,27.76433Ground StationActiveSpainBaikonur Cosmodrome - LC 60-8#LaunchPad64.0183,46.0174Launch PadActiveKazakhstanSary Shagan#LaunchSite73.562,45.812Launch SiteActiveKazakhstanNiles Canyon Station#GroundStation-121.944,37.6Ground StationActiveUnited StatesComcast Titan Station#GroundStation-105.025,39.514Ground StationActiveUnited StatesPrince Albert xx1#GroundStation-105.93291,53.21266Ground StationActiveCanadaTidbinbilla STDN CANS#GroundStation148.983058,-35.40466667Ground StationActiveAustraliaNATO Missile Firing Installation#LaunchSite24.175,35.573Launch SiteActiveCreteEldorado AFS PAVE PAWS#RadarStation-100.5529,30.9783Radar StationInactiveUnited StatesSanta Maria Station#GroundStation-25.136103,36.99694Ground StationActivePortugalBaikonur Cosmodrome - LC 1#LaunchPad63.3422,45.9203Launch PadActiveKazakhstanWallops Flight Facility - LA 2 AML-2#LaunchPad-75.483,37.8379Launch PadActiveUnited StatesTokyo STDN KA2S#GroundStation139.49177778,35.70876186Ground StationActiveJapanWallops Island STDN WP2Y#GroundStation-75.47685742,37.92558517Ground StationActiveUnited StatesFort Huachuca STDN FT2F#GroundStation-110.43817333,31.55676686Ground StationActiveUnited StatesGatineau xx1#GroundStation-75.80933,45.5858Ground StationActiveCanadaWallops Island Drop Zone#LaunchSite-75,37.5Launch SiteActiveUnited StatesHAARP#RadarStation-145.151,62.393Radar StationActiveUnited StatesDombarovsky Cosmodrome x35#LaunchPad60.858975,51.26491Launch PadActiveRussiaNatal Station STDN NATC#OpticalTrackingStation-35.16434436,-5.92780506Optical Tracking StationActiveBrazilCape Canaveral AFS SLC 36A STDN A36P#LaunchPad-80.53772211,28.47143831Launch PadDemolishedUnited StatesTrollSat Ground Station#GroundStation2.53838,-72.0117Ground StationActiveAntarcticaMount Pleasant STDN TSMF#GroundStation147.439,-42.805Ground StationActiveAustraliaDGS STDN DGIS#GroundStation72.36999861,-7.27003056Ground StationActiveUnited KingdomVela Antenna#GroundStation147.44165,-42.8034Ground StationActiveAustraliaWhite Sands STDN STWS#GroundStation-106.60856383,32.49950678Ground StationActiveUnited StatesEsrange Station Balder#GroundStation21.038,67.879Ground StationActiveSwedenBaikonur Cosmodrome - LC 192#LaunchPad63.2995,46.0243Launch PadActiveKazakhstanMerritt Island STDN MLAQ#GroundStation-80.66438767,28.42471119Ground StationActiveUnited StatesNCTS Naples#GroundStation14.049,40.929Ground StationActiveItalyKennedy Space Center#LaunchSite-80.62,28.62Launch SiteActiveUnited StatesRAF Menwith Hill#GroundStation-1.689492,54.008692Ground StationActiveUnited KingdomVLBA Kitt Peak#GroundStation-111.611992,31.956316Ground StationActiveUnited StatesDiego Garcia GEODSS, xx2#OpticalTrackingStation72.45244,-7.41163Optical Tracking StationActiveUnited KingdomBaikonur Cosmodrome LC 41-3#LaunchPad63.6598,45.9754Launch PadActiveKazakhstanLustbuhel Observatory#LaserStation15.4934,47.06714Laser StationActiveAustriaWoomera Test Range MRL#LaunchPad136.5332,-30.9573Launch PadActiveAustraliaCape Canaveral Air Force Station - SLC 37B (STDN B37P)#LaunchPad-80.56445806,28.53121944Launch PadActiveUnited StatesDombarovsky Cosmodrome - xx7#LaunchPad59.73193,50.883614Launch PadActiveRussiaKunia Station#GroundStation-158.055314,21.473136Ground StationActiveUnited StatesGRGT STDN GW2S#GroundStation144.84087447,13.58758828Ground StationActiveUnited StatesJohnston Island#LaunchSite-169.53,16.733Launch SiteActiveUnited StatesFort Churchill#LaunchSite-93.820278,58.734167Launch SiteActiveCanadaHolloman - ZEL#LaunchPad-106.06,32.88Launch PadActiveUnited StatesNHSA#GroundStation-71.626559,42.9478333Ground StationActiveUnited StatesSondrestrom Rocket Range#LaunchSite-50.6,67.024Launch SiteActiveGreenlandWoomera Test Range HAD#LaunchPad136.5322,-30.9553Launch PadActiveAustraliaOrbcomm Wenatchee B#GroundStation-120.175247,47.550924Ground StationActiveUnited StatesHong Kong (1) Leolut#GroundStation114.1445,22.275833Ground StationActiveChinaCape Canaveral Air Force Station - LC 5#LaunchPad-80.5733,28.4394Launch PadInactiveUnited StatesTTSB#GroundStation-68.5988147,76.5153639Ground StationActiveGreenlandScanEx Magadan Station#GroundStation150.81308,59.55632Ground StationActiveRussiaNemea Station#GroundStation22.6222,37.8461Ground StationActiveGreeceRoaring Creek Station#GroundStation-76.4393,40.8935Ground StationActiveUnited StatesBaikonur Cosmodrome - LC 244#LaunchPad63.6346,45.8403Launch PadActiveKazakhstanRas Al Khaimah Station#GroundStation56.0408,25.7927Ground StationActiveUnited Arab EmiratesNaro Space Center#LaunchSite127.53507,34.43187Launch SiteActiveSouth KoreaFlorida 2 FL2 Leolut#GroundStation-80.3838,25.616333Ground StationActiveUnited StatesCape Canaveral Air Force Station - SLC 41 (STDN A41P)#LaunchPad-80.58287267,28.58345786Launch PadActiveUnited StatesCachoeira Paulista#GroundStation-45.000214,-22.68211Ground StationActiveBrazilGreen River Pad 1#LaunchPad-110.0775,38.9416Launch PadActiveUnited StatesEsrange Station ESX#GroundStation21.0634472,67.8781431Ground StationActiveSwedenToulouse 2 Leolut#GroundStation1.4808,43.5605Ground StationActiveFranceWallops Island STDN WP2Z#GroundStation-75.47375114,37.92891233Ground StationActiveUnited StatesGellinam#GroundStation167.727855,9.099416Ground StationActiveMarshall IslandsGreat Wall Station#GroundStation-58.9626,-62.2166Ground StationActiveAntarcticaBarking Sands - LC 19#LaunchPad-159.7813,22.0619Launch PadActiveUnited StatesThule STDN TH2S#GroundStation-68.59881472,76.51536389Ground StationActiveGreenlandOrbcomm Ocilla B#GroundStation-83.199585,31.500413Ground StationActiveUnited StatesWallops Island STDN HR2S#GroundStation-75.46209,37.94542583Ground StationActiveUnited StatesOhr Station#GroundStation9.33,52.06Ground StationActiveGermanyRozhen#OpticalTrackingStation24.744,41.693Optical Tracking StationActiveBulgariaOrroral Valley#GroundStation148.95713,-35.62982Ground StationRelocatedAustraliaBaikonur Cosmodrome - LC 242#LaunchPad63.4626,45.9407Launch PadActiveKazakhstanCape Canaveral Air Force Station - LC 9#LaunchPad-80.5594,28.4522Launch PadInactiveUnited StatesGCHQ Bude#GroundStation-4.5537,50.8862Ground StationActiveUnited KingdomVandenberg AFB SLC 576-E#LaunchPad-120.6191,34.7396Launch PadActiveUnited StatesDombarovsky Cosmodrome - xx3#LaunchPad59.597872,50.756297Launch PadActiveRussiaPomonkey STDN PMKS#GroundStation-77.05774122,38.55771053Ground StationInactiveUnited StatesEaster Island Leolut#GroundStation-109.437,-27.150166Ground StationActiveChilePoint Mugu STDN PM3F#GroundStation-119.15476742,34.12288772Ground StationActiveUnited StatesCape Canaveral AFS LC 16#LaunchPad-80.5518,28.5016Launch PadInactiveUnited StatesAmman#GroundStation35.837,32.0808Ground StationActiveJordanBaikonur Cosmodrome LC 90-19#LaunchPad62.9144,46.0863Launch PadActiveKazakhstanKapustin Yar V2#LaunchPad45.9074,48.5709Launch PadActiveRussiaBarking Sands LC 42#LaunchPad-159.7727,22.0682Launch PadActiveUnited StatesCape Canaveral AFS SLC 37A#LaunchPad-80.568,28.534Launch PadInactiveUnited StatesBermuda STDN BDDQ#GroundStation-64.65344947,32.34794319Ground StationInactiveBermudaSouth Uist Range Control Unit#GroundStation-7.355771,57.340814Ground StationActiveUnited KingdomSvobodny Cosmodrome - x10#LaunchPad128.3323,51.877Launch PadInactiveRussiaWallops Flight Facility LA 3A#LaunchPad-75.4726,37.848Launch PadActiveUnited StatesKapustin Yar - LC 107 2c#LaunchPad46.2949,48.5695Launch PadActiveRussiaWhite Sands STDN WHSX#GroundStation-106.60801708,32.50094139Ground StationActiveUnited StatesTonopah Test Range#LaunchSite-116.77,37.8Launch SiteActiveUnited StatesWhite Sands STDN WH4K#GroundStation-106.60855389,32.50138961Ground StationActiveUnited StatesVandenberg AFB#LaunchSite-120.6,34.7Launch SiteActiveUnited StatesKapustin Yar#LaunchSite46.1,48.5Launch SiteActiveRussiaEl Palomar Geolut#GroundStation-58.6,-34.6Ground StationActiveArgentinaBiscarosse - BS#LaunchPad-1.2675,44.2882Launch PadInactiveFranceBad Aibling Station#GroundStation11.984444,47.879444Ground StationInactiveGermanyPlesetsk Cosmodrome#LaunchSite40.6,62.9Launch SiteActiveRussiaSHAR-2#GroundStation80.19633,13.67394Ground StationActiveIndiaMayaguez#GroundStation-67.1368,18.2111Ground StationActiveUnited StatesWallops Flight Facility LA 1 AML#LaunchPad-75.4871,37.8352Launch PadActiveUnited StatesBaikonur Cosmodrome LC 162-36#LaunchPad63.0668,46.0323Launch PadActiveKazakhstanValcartier#OpticalTrackingStation-71.47075,46.87545Optical Tracking StationActiveCanadaGRAVES Transmitter#RadarStation5.515,47.348Radar StationActiveFranceGuam 1 (GU1) Leolut#GroundStation144.939,13.578333Ground StationActiveUnited StatesSpaceport Sweden#LaunchSite20.331,67.822Launch SitePlannedSwedenKapustin Yar - LC 86 4c#LaunchPad46.297,48.5481Launch PadActiveRussiaSan Clemente#LaunchSite-118.48698,32.91771Launch SiteActiveUnited StatesMayport Drop Zone#LaunchSite-78.5,29Launch SiteActiveUnited StatesYokohama Satellite Control Center#GroundStation139.5145,35.5055Ground StationActiveJapanEsrange Station SSC-CNES#GroundStation21.0309,67.88225Ground StationActiveSwedenWallops Island STDN WL2F#GroundStation-75.46422336,37.94409914Ground StationActiveUnited StatesSuffield#OpticalTrackingStation-111.10471,50.29301Optical Tracking StationActiveCanadaBarking Sands - LC 12#LaunchPad-159.7819,22.0593Launch PadActiveUnited StatesBarking Sands - Kokole Point#LaunchPad-159.7627,21.988Launch PadActiveUnited StatesMedicina Radio Observatory#GroundStation11.646944,44.520833Ground StationActiveItalyVandenberg STDN CALY#GroundStation-120.50101308,34.56562375Ground StationActiveUnited StatesSemnan Launch Center xx1#LaunchPad53.896,35.222Launch PadActiveIranWallops Island STDN WP3Z#GroundStation-75.47589722,37.92820833Ground StationActiveUnited StatesNATO Missile Firing Installation#LaunchSite24.175,35.573Launch SiteActiveCreteYorii#GroundStation139.2,36.12Ground StationActiveJapanUsuda Deep Space Center#GroundStation138.3627,36.1325Ground StationActiveJapanEsrange Station ELS#GroundStation21.062325,67.8765153Ground StationActiveSwedenCorn Ranch#LaunchSite-104.7589,31.4233Launch SiteActiveUnited StatesWallops Flight Facility LA 2 ARC#LaunchPad-75.4841,37.838Launch PadActiveUnited StatesPennant Point Station#GroundStation-63.6133,44.4648Ground StationActiveCanadaSodankyla EISCAT Radar#RadarStation26.63043,67.36383Radar StationActiveFinlandWallops Island STDN WT3S#GroundStation-75.47746889,37.92306592Ground StationActiveUnited StatesOttawa Leolut#GroundStation-75.6745,45.328666Ground StationActiveCanadaBiscarosse SUD#LaunchPad-1.276,44.295Launch PadActiveFranceTorrejon Air Base xx2#GroundStation-3.44474,40.48276Ground StationActiveSpainSPTR-1#GroundStation0,-90Ground StationInactiveAntarcticaPlesetsk Cosmodrome - LC 132-1#LaunchPad40.8686,62.8833Launch PadActiveRussiaEsrange Station ESSEX#GroundStation21.0630978,67.8904339Ground StationActiveSwedenDirecTV LA Broadcast Center LABC#GroundStation-118.425,33.9827Ground StationActiveUnited StatesYatharagga STDN ATFS#GroundStation115.35126589,-29.04494003Ground StationActiveAustraliaWhite Sands - LC 32#LaunchPad-106.4069,32.4068Launch PadActiveUnited StatesFairbanks STDN UL33#GroundStation-147.51806617,64.97681389Ground StationActiveUnited StatesCalifornia 1 CA1 Leolut#GroundStation-120.5515,34.6625Ground StationActiveUnited StatesESRIN#GroundStation12.67585,41.8275Ground StationActiveItalyDSS 16 Goldstone STDN GD28#GroundStation-116.87360467,35.34154264Ground StationInactiveUnited StatesUchinoura Mu Pad#LaunchPad131.08223,31.251028Launch PadActiveJapanPort Blair#GroundStation92.71247,11.63727Ground StationActiveIndiaAndrushevka#OpticalTrackingStation28.997306,50.000556Optical Tracking StationActiveUkraineMatera Station#GroundStation16.704079,40.649536Ground StationActiveItalyCape Canaveral AFS SLC 40 STDN A40P#LaunchPad-80.57719364,28.56198939Launch PadActiveUnited StatesEllenwood Teleport#GroundStation-84.272016,33.664202Ground StationActiveUnited StatesEdmonton Geolut#GroundStation-113.316166,53.6782Ground StationActiveCanadaCalifornia 2 CA2 Leolut#GroundStation-120.5517,34.662333Ground StationActiveUnited StatesPalmachim AFB#LaunchSite34.69,31.89Launch SiteActiveIsraelDombarovsky Cosmodrome x31#LaunchPad60.606992,51.241105Launch PadActiveRussiaGuiana Space Center - ELS#LaunchPad-52.8345,5.3047Launch PadActiveFrench GuianaVLBA Hancock#GroundStation-71.986581,42.933608Ground StationActiveUnited StatesEsrange Station ELS (STDN KILS)#GroundStation21.062337,67.876532Ground StationActiveSwedenClewiston Station#GroundStation-81.049,26.747Ground StationActiveUnited StatesEutelsat Paris#GroundStation2.277808,48.840264Ground StationActiveFrancePalmachim AFB Shavit Pad#LaunchPad34.6802,31.8848Launch PadActiveIsraelWhite Sands STDN WS1S#GroundStation-106.61209953,32.54075494Ground StationActiveUnited StatesBrasilia Leolut#GroundStation-47.9027,-15.857166Ground StationActiveBrazilCape Canaveral Air Force Station - LC 13#LaunchPad-80.5446,28.4859Launch PadInactiveUnited StatesOttawa (1) Geolut#GroundStation-75.674,45.329Ground StationActiveCanadaEsrange Station Balder#GroundStation21.038,67.879Ground StationActiveSwedenHaiphong Leolut#GroundStation106.71,20.801166Ground StationActiveVietnamFucino#GroundStation13.6018,41.9793Ground StationActiveItalyFuchsstadt Station#GroundStation9.924176,50.118315Ground StationActiveGermanySouth Point Station USHI01 STDN HWIS#GroundStation-155.66330125,19.0139045Ground StationActiveUnited StatesWhite Sands STDN WH2S#GroundStation-106.60855389,32.50129656Ground StationActiveUnited StatesPulantat Station#GroundStation144.75,13.42Ground StationActiveUnited StatesDombarovsky Cosmodrome xx8#LaunchPad60.52694,50.959329Launch PadActiveRussiaRAF Feltwell#GroundStation0.5205,52.4806Ground StationActiveUnited KingdomMondy#OpticalTrackingStation100.918792,51.621694Optical Tracking StationActiveRussiaNeu Golm Station#GroundStation14.0867,52.3137Ground StationActiveGermanyCape Canaveral AFS LC 4#LaunchPad-80.5356,28.4669Launch PadInactiveUnited StatesMerritt Island STDN MMTF#GroundStation-80.67478864,28.47857681Ground StationActiveUnited StatesVandenberg AFB SLC 4W#LaunchPad-120.6154,34.6331Launch PadInactiveUnited StatesPongdong-ri#LaunchSite124.705265,39.659987Launch SiteActiveNorth KoreaDombarovsky Cosmodrome x10#LaunchPad60.649859,50.985518Launch PadActiveRussiaJiuquan LA 3#LaunchPad100.78,41.0152Launch PadActiveChinaCape Canaveral STDN CNVF#GroundStation-80.57650917,28.48160589Ground StationActiveUnited StatesBaikonur Cosmodrome - LC 41-15#LaunchPad63.6687,45.9763Launch PadActiveKazakhstanKapustin Yar - S#LaunchPad46.3175,48.4763Launch PadActiveRussiaDombarovsky Cosmodrome x42#LaunchPad59.972508,51.521988Launch PadActiveRussiaPlesetsk Cosmodrome - LC 132-2#LaunchPad40.8722,62.8834Launch PadActiveRussiaMountain Horse Station#GroundStation-121.5933,37.7502Ground StationActiveUnited StatesBarking Sands LC 12#LaunchPad-159.7819,22.0593Launch PadActiveUnited StatesLethbridge Station#GroundStation-112.873188,49.681208Ground StationActiveCanadaBaikonur Cosmodrome LC 41-15#LaunchPad63.6687,45.9763Launch PadActiveKazakhstanCape Canaveral AFS LC 21#LaunchPad-80.5403,28.4606Launch PadInactiveUnited StatesVandenberg Air Force Base - SLC 5#LaunchPad-120.6247,34.608Launch PadInactiveUnited StatesCSTARS_20m#GroundStation-80.38477,25.61375Ground StationActiveUnited StatesAlice Springs Receiver#RadarStation133.6792,-23.5213Radar StationActiveAustraliaBarking Sands Kokole Point#LaunchPad-159.7627,21.988Launch PadActiveUnited StatesBaikonur Cosmodrome LC 200-39#LaunchPad63.032,46.0399Launch PadActiveKazakhstanCotopaxi Station#GroundStation-78.578,-0.623Ground StationActiveEcuadorBaikonur Cosmodrome LC 245#LaunchPad63.5271,45.8175Launch PadActiveKazakhstanOuargla Leolut#GroundStation5.49,31.88Ground StationActiveAlgeriaDombarovsky Cosmodrome x14#LaunchPad59.958431,51.036288Launch PadActiveRussiaAbu Dhabi Leolut#GroundStation54.4478,24.4315Ground StationActiveUnited Arab EmiratesCape Canaveral AFS SLC 41 STDN A41P#LaunchPad-80.58287267,28.58345786Launch PadActiveUnited StatesHammaguira - Brigitte-A#LaunchPad-3.0081,30.8712Launch PadActiveAlgeriaSemnan Launch Center - xx4#LaunchPad53.955,35.258Launch PadActiveIranSvobodny Cosmodrome - xx4#LaunchPad128.3386,51.7938Launch PadInactiveRussiaFlorida 1 (FL1) Leolut#GroundStation-80.3838,25.616Ground StationActiveUnited StatesDongfeng Station#GroundStation125.53,42.68Ground StationActiveChinaGreen River - Pad 3#LaunchPad-110.0741,38.9426Launch PadActiveUnited StatesBaikonur Cosmodrome LC 193#LaunchPad63.389,45.9532Launch PadActiveKazakhstanBeijing Station#GroundStation116.2275,40.1172Ground StationActiveChinaBaikonur Cosmodrome LC 41-4#LaunchPad63.6649,45.9759Launch PadActiveKazakhstanBrunei#GroundStation114.929,4.946Ground StationActiveBruneiMatagorda Island#LaunchSite-96.46,28.32Launch SiteActiveUnited StatesDombarovsky Cosmodrome - x41#LaunchPad60.178331,51.50362Launch PadActiveRussiaMaiquetia (1) Leolut#GroundStation-66.982,10.598Ground StationPlannedVenezuelaBaikonur Cosmodrome - LC 250#LaunchPad63.3049,46.0083Launch PadActiveKazakhstanProspect Harbor Naval Sat Station#GroundStation-68.013,44.404Ground StationActiveUnited StatesGISTDA Ground Receiving Station#GroundStation100.788982,13.730775Ground StationActiveThailandKoganei xx1#GroundStation139.488503,35.711393Ground StationActiveJapanTanegashima Space Center - Sounding Rocket Pad#LaunchPad130.962691,30.376847Launch PadActiveJapanGatineau xx2#GroundStation-75.80811,45.58435Ground StationActiveCanadaGreen Bank Telescope 20m#GroundStation-79.82551,38.43684Ground StationActiveUnited StatesWest Freugh Ground Station#GroundStation-4.946,54.846Ground StationActiveUnited KingdomCUHK Station#GroundStation114.206591,22.421278Ground StationActiveChinaBaikonur Cosmodrome - LC 196#LaunchPad63.1477,45.8283Launch PadActiveKazakhstanMaspalomas 1 Geolut#GroundStation-15.634,27.764Ground StationActiveSpainKatsuura USB F2#GroundStation140.29975,35.20592Ground StationActiveJapanOrroral Valley STDN ORRL#LaserStation148.95480464,-35.62492722Laser StationActiveAustraliaBiscarosse BE#LaunchPad-1.2727,44.2742Launch PadActiveFranceKapustin Yar LC 107 2g#LaunchPad46.2958,48.5616Launch PadActiveRussiaDombarovsky Cosmodrome - x32#LaunchPad60.607974,51.241789Launch PadActiveRussiaWallops Flight Facility - LA 2 RAG#LaunchPad-75.4823,37.8385Launch PadActiveUnited StatesNorth Pole Station USAK01 STDN USAS#GroundStation-147.50021417,64.80424111Ground StationActiveUnited StatesDkhila Mateur#GroundStation9.714,36.88Ground StationActiveTunisiaCavalier AFS PARCS#RadarStation-97.8998,48.7246Radar StationActiveUnited StatesGreen River Pad 2#LaunchPad-110.0753,38.9413Launch PadActiveUnited StatesPoker Flat Station PF1 (STDN DX2S)#GroundStation-147.4311625,65.11783389Ground StationActiveUnited StatesHammaguira - Brigitte#LaunchPad-3.0357,30.8935Launch PadActiveAlgeriaBangkok (2) Leolut#GroundStation100.5432,13.717166Ground StationActiveThailandEglin AFB AN-FPS 85 PAR (STDN EG2F)#RadarStation-86.21471742,30.57252794Radar StationActiveUnited StatesPalmer Station#GroundStation-64.05107,-64.77413Ground StationActiveAntarcticaBaikonur Cosmodrome - LC 160#LaunchPad62.9423,46.0783Launch PadActiveKazakhstanOverberg Test Range xx2#LaunchPad20.25879,-34.61745Launch PadActiveSouth AfricaBarking Sands - LC 1#LaunchPad-159.777,22.058Launch PadActiveUnited StatesPonce de Leon STDN PDLS#GroundStation-80.91302136,29.06664839Ground StationActiveUnited StatesJiuquan Satellite Launch Center - SLS 2#LaunchPad100.2983,40.9607Launch PadActiveChinaCape Canaveral AFS LC 6#LaunchPad-80.5726,28.4407Launch PadInactiveUnited StatesOlenegorsk Radar#RadarStation33.9107,68.1137Radar StationActiveRussiaNHS STDN NHSS#GroundStation-71.62656253,42.94782133Ground StationActiveUnited StatesFort Huachuca STDN FTHF#GroundStation-110.37079797,31.57102425Ground StationActiveUnited StatesSvobodny Cosmodrome x12#LaunchPad128.252,51.8818Launch PadInactiveRussiaMount Stromlo SLR Station STDN MTSL#LaserStation149.00987869,-35.31614697Laser StationActiveAustraliaEuropean Direct Access Facility#GroundStation11.2789,48.0862Ground StationActiveGermanyWhite Sands - LC 50#LaunchPad-106.3488,32.4064Launch PadActiveUnited StatesGreen River - Pad 1#LaunchPad-110.0775,38.9416Launch PadActiveUnited StatesBaikonur Cosmodrome LC 90-20#LaunchPad62.9167,46.0855Launch PadActiveKazakhstanOrbcomm Matera B#GroundStation16.70869,40.64935Ground StationActiveItalyPulkovo#OpticalTrackingStation30.32737,59.77186Optical Tracking StationActiveRussiaTERSS#GroundStation147.42215,-42.92417Ground StationActiveAustraliaRaisting Station#GroundStation11.1126,47.8978Ground StationActiveGermanyYevpatoria 32m#GroundStation33.25016,45.17031Ground StationActiveUkraineAlcantara Launch Center UL Pad#LaunchPad-44.367,-2.316Launch PadActiveBrazilDombarovsky Cosmodrome - x25#LaunchPad59.524663,51.153297Launch PadActiveRussiaSeaMobile Holmdel Teleport#GroundStation-74.1732,40.3945Ground StationActiveUnited StatesIssus-Aussaguel STDN AUSS#GroundStation1.499412,43.428696Ground StationActiveFranceAlbany Leolut#GroundStation117.899,-35.12Ground StationActiveAustraliaVLBA Fort Davis#GroundStation-103.944817,30.635031Ground StationActiveUnited StatesBiscarosse - BE#LaunchPad-1.2727,44.2742Launch PadActiveFranceKwajalein RADOT#OpticalTrackingStation167.719221,8.723176Optical Tracking StationActiveMarshall IslandsPoker Flat - LC 6#LaunchPad-147.4621,65.1169Launch PadActiveUnited StatesLeuk#GroundStation7.645278,46.318056Ground StationActiveSwitzerlandGilmore Creek STDN GLBS#GroundStation-147.50869853,64.97348203Ground StationActiveUnited StatesWhite Sands STDN WH6F#GroundStation-106.65901228,33.81386394Ground StationActiveUnited StatesManaus Leolut#GroundStation-60.054,-3.023166Ground StationActiveBrazilAuScope VLBI Yarragadee#GroundStation115.3456,-29.0471Ground StationActiveAustraliaWallops Island STDN WL6S#GroundStation-75.4611,37.9456Ground StationActiveUnited StatesCape Canaveral ROCC#GroundStation-80.5949,28.4311Ground StationActiveUnited StatesPoint Mugu STDN PM2F#GroundStation-119.15379856,34.12250292Ground StationActiveUnited StatesXichang LA 2#LaunchPad102.0271,28.2455Launch PadActiveChinaNorth Pole Station USAK02#GroundStation-147.5003,64.8048Ground StationActiveUnited StatesBiscarosse - SUD#LaunchPad-1.276,44.295Launch PadActiveFranceDombarovsky Cosmodrome x33#LaunchPad60.142215,51.248931Launch PadActiveRussiaCayenne Station#GroundStation-52.30968,4.94777Ground StationActiveFrench GuianaMillstone Hill Radar#RadarStation-71.491,42.6174Radar StationActiveUnited StatesTranquillon Peak STDN VD4F#GroundStation-120.56111494,34.58304294Ground StationActiveUnited StatesEtam Earth Station#GroundStation-79.736,39.281Ground StationActiveUnited StatesCalifornia 2 (CA2) Leolut#GroundStation-120.5517,34.662333Ground StationActiveUnited StatesFort Meade#GroundStation-76.765,39.102Ground StationActiveUnited StatesInmarsat Station Pune#GroundStation73.957,19.151Ground StationActiveIndiaXiamen Station#GroundStation118.09,24.48Ground StationActiveChinaPlesetsk Cosmodrome - LC 43-3#LaunchPad40.4501,62.9273Launch PadActiveRussiaKapustin Yar - START Pioner#LaunchPad46.3009,48.6149Launch PadActiveRussiaBaikonur Cosmodrome - LC 31#LaunchPad63.5643,45.9961Launch PadActiveKazakhstanKaneohe Omega Transmitter#GroundStation-157.8307,21.4048Ground StationInactiveUnited StatesMerritt Island STDN EULY#GroundStation-80.65301219,28.46356408Ground StationActiveUnited StatesMt Lemmon STDN MTLF#GroundStation-110.78880306,32.44166322Ground StationActiveUnited StatesNakhodka Krona Complex#RadarStation132.577073,42.935333Radar StationActiveRussiaVTS STDN VT2S#GroundStation-120.50539767,34.82564078Ground StationActiveUnited StatesThermopylae Station#GroundStation22.6866,38.8231Ground StationActiveGreeceGrand Turk Island STDN GTKQ#GroundStation-71.13208822,21.46263161Ground StationActiveUnited KingdomFort Monmouth#GroundStation-74.036,40.321Ground StationActiveUnited StatesJonathan Dickinson STDN JDIY#GroundStation-80.10874725,26.98380394Ground StationActiveUnited StatesBaikonur Cosmodrome - LC 41-4#LaunchPad63.6649,45.9759Launch PadActiveKazakhstanOverberg Test Range - xx2#LaunchPad20.25879,-34.61745Launch PadActiveSouth AfricaDombarovsky Cosmodrome x45#LaunchPad59.956989,51.558712Launch PadActiveRussiaFairbanks STDN ULAE#GroundStation-147.51806617,64.97681389Ground StationActiveUnited StatesCape Canaveral Air Force Station - LC 3#LaunchPad-80.5363,28.4662Launch PadInactiveUnited StatesDombarovsky Cosmodrome - x34#LaunchPad60.461524,51.259129Launch PadActiveRussiaDombarovsky Cosmodrome - x40#LaunchPad60.372543,51.379286Launch PadActiveRussiaGunma Leolut#GroundStation138.955,36.426Ground StationActiveJapanOverberg Test Range xx1#LaunchPad20.30271,-34.60276Launch PadActiveSouth AfricaSatish Dhawan Pad 1#LaunchPad80.2346,13.7334Launch PadActiveIndiaCape Canaveral Air Force Station - LC 1#LaunchPad-80.5375,28.465Launch PadInactiveUnited StatesDSS 65 Robledo prior to 2005#GroundStation-4.25141796,40.42718512Ground StationRelocatedSpainSturup Station#GroundStation13.349467,55.541122Ground StationActiveSwedenBaikonur Cosmodrome LC 196#LaunchPad63.1477,45.8283Launch PadActiveKazakhstanMSSC Beam Director Tracker#OpticalTrackingStation-156.2576,20.70855Optical Tracking StationActiveUnited StatesPaumalu Teleport#GroundStation-158.034,21.67Ground StationActiveUnited StatesBaikonur Cosmodrome LC 242#LaunchPad63.4626,45.9407Launch PadActiveKazakhstanKerguelen Island STDN KGLQ#GroundStation70.25598389,-49.35191544Ground StationActiveFranceSantiago Leolut#GroundStation-70.7,-33.489Ground StationActiveChileDombarovsky Cosmodrome x16#LaunchPad59.484369,51.06922Launch PadActiveRussiaBaikonur Cosmodrome - LC 107#LaunchPad63.81,46.046Launch PadActiveKazakhstanPoint Mugu STDN PM4F#GroundStation-119.15283014,34.12211825Ground StationActiveUnited StatesVandenberg AFB SLC 1W#LaunchPad-120.6303,34.7571Launch PadInactiveUnited StatesSan Marco Launch Platform#LaunchSite40.2125,-2.9383Launch SiteInactiveKenyaEsrange Station ELS STDN KILS#GroundStation21.062337,67.876532Ground StationActiveSwedenGTS STDN GT2S#GroundStation144.85543775,13.61588064Ground StationActiveUnited StatesCold Lake#LaunchSite-110.28,54.41Launch SiteActiveCanadaSvobodny Cosmodrome - xx3#LaunchPad128.185,51.792Launch PadInactiveRussiaLabuan Teleport#GroundStation115.198261,5.33198Ground StationActiveMalaysiaFrance Sud#GroundStation2.12416,43.27977Ground StationActiveFranceBaikonur Cosmodrome#LaunchSite63.3,46Launch SiteActiveKazakhstanBaikonur Cosmodrome xx1#LaunchPad63.462718,45.939593Launch PadActiveKazakhstanCape Canaveral Air Force Station - LC 11#LaunchPad-80.5395,28.4753Launch PadInactiveUnited StatesWoomera Test Range#LaunchSite136.5,-30.95Launch SiteActiveAustraliaObninsk#GroundStation36.62,55.08Ground StationActiveRussiaPoker Flat#LaunchSite-147.485,65.129Launch SiteActiveUnited StatesHaystack Radar#RadarStation-71.4881,42.62329Radar StationActiveUnited StatesAlcantara Launch Center RAG Pad#LaunchPad-44.367,-2.3148Launch PadActiveBrazilMickelsen Safeguard Complex#RadarStation-98.3565,48.5895Radar StationInactiveUnited StatesXichang LA 4#LaunchPad102.0232,28.2495Launch PadActiveChinaBaikonur Cosmodrome LC 31#LaunchPad63.5643,45.9961Launch PadActiveKazakhstanFresnedillas STDN MAD8#GroundStation-4.16838497,40.45544939Ground StationRelocatedSpainCape Canaveral Air Force Station - LC 34#LaunchPad-80.5611,28.5218Launch PadInactiveUnited StatesKrona 20J6 Complex#RadarStation41.342745,43.825373Radar StationActiveRussiaBangalore Leolut#GroundStation77.5117,13.034833Ground StationActiveIndiaBaikonur Cosmodrome - LC 105#LaunchPad63.4962,45.9503Launch PadActiveKazakhstanGreenbelt STDN BLT3#GroundStation-76.84276675,38.9984475Ground StationInactiveUnited StatesRiyadh#GroundStation46.5865,24.4259Ground StationActiveSaudi ArabiaBaikonur Cosmodrome - LC 246#LaunchPad63.4236,45.7656Launch PadActiveKazakhstanAscent Media Northvale#GroundStation-73.9414,41.0161Ground StationActiveUnited StatesHTSA#GroundStation-158.242109,21.56228Ground StationActiveUnited StatesCordoba#GroundStation-64.4636,-31.5242Ground StationActiveArgentinaOnsala Observatory 20m#GroundStation11.92632,57.39582Ground StationActiveSwedenPoker Flat Station PF2 (STDN DXAS)#GroundStation-147.43350389,65.11792972Ground StationActiveUnited StatesGreen Bank 85-1 Telescope#GroundStation-79.82817,38.43586Ground StationActiveUnited StatesOkinawa USB F2#GroundStation127.90353,26.49976Ground StationActiveJapanCape Canaveral AFS LC 26A#LaunchPad-80.5705,28.4446Launch PadInactiveUnited StatesNoto Radio Observatory#GroundStation14.989031,36.87605Ground StationActiveItalyGTSB#GroundStation144.8554464,13.6158802Ground StationActiveUnited StatesPalmachim Air Force Base - Arrow II Launcher#LaunchPad34.7023,31.8859Launch PadActiveIsraelCamp Roberts#GroundStation-120.754,35.736Ground StationActiveUnited StatesWoomera Test Range - LA 6A#LaunchPad136.4394,-31.074Launch PadActiveAustraliaHartebeesthoek STDN HB4S#GroundStation27.71260331,-25.88672544Ground StationActiveSouth AfricaDSS 66 Robledo STDN DS66#GroundStation-4.25141764,40.42997486Ground StationActiveSpainMojave Air and Space Port#LaunchSite-118.15,35.06Launch SitePlannedUnited StatesOrbcomm Almaty A#GroundStation76.78235,44.49732Ground StationActiveKazakhstanArabsat Amman Station#GroundStation35.9315,31.9053Ground StationActiveJordanAGS STDN AG1S#GroundStation-147.46120417,65.11670028Ground StationActiveUnited StatesWallops Island STDN WTDQ#GroundStation-75.47746889,37.92306592Ground StationActiveUnited StatesDSS 13 Goldstone legacy#GroundStation-116.79488,35.24773Ground StationInactiveUnited StatesDocklands Teleport#GroundStation0.058858,51.49939Ground StationActiveUnited KingdomJiuquan xx1#LaunchPad100.304946,41.280432Launch PadActiveChinaPoint Arguello Drop Zone#LaunchSite-123,36Launch SiteActiveUnited StatesKatsuura USB F1#GroundStation140.29886,35.21086Ground StationActiveJapanLandsat Station STDN SF2S#GroundStation-96.61943778,43.73428667Ground StationActiveUnited StatesCeduna Observatory#GroundStation133.80968,-31.86772Ground StationActiveAustraliaInuvik Station IVK#GroundStation-133.53816,68.31762Ground StationActiveCanadaAbuja Leolut#GroundStation7.493,9.076Ground StationActiveNigeriaTanegashima Space Center - Osaki Range#LaunchPad130.970274,30.39953Launch PadInactiveJapanJeddah (1) Leolut#GroundStation39.1427,21.654833Ground StationActiveSaudi ArabiaWhite Sands LC 94#LaunchPad-106.4589,34.2049Launch PadActiveUnited StatesAerospace Data Facility Colorado#GroundStation-104.7765,39.7173Ground StationActiveUnited StatesMaspalomas STDN MPLS#GroundStation-15.6338,27.762892Ground StationActiveSpainAdelaide Satellite Facility#GroundStation138.572,-34.8627Ground StationActiveAustraliaGagan Super RADOT#OpticalTrackingStation167.5376,9.286663Optical Tracking StationActiveMarshall IslandsLasham Satellite Ground Station#GroundStation-1.044,51.184Ground StationDemolishedUnited KingdomDSS 11 Goldstone STDN PIOD#GroundStation-116.84937706,35.38951828Ground StationInactiveUnited StatesBaikonur Cosmodrome LC 70#LaunchPad63.0963,46.0329Launch PadActiveKazakhstanKapustin Yar LC 107 2f#LaunchPad46.2958,48.5688Launch PadActiveRussiaKootwijk STDN KOOL#LaserStation5.80976658,52.1783975Laser StationActiveNetherlandsOkinawa USB F1#GroundStation127.90179,26.49815Ground StationActiveJapanIP-5 Tracking Station#GroundStation63.34,45.704Ground StationActiveKazakhstanDombarovsky Cosmodrome x19#LaunchPad59.844333,51.093509Launch PadActiveRussiaTonopah Test Range#LaunchSite-116.77,37.8Launch SiteActiveUnited StatesOverberg Earth Station 4m#GroundStation20.2206,-34.6202Ground StationActiveSouth AfricaKapustin Yar LC 107 2e#LaunchPad46.2949,48.5688Launch PadActiveRussiaGila River Space Fence#RadarStation-112.031,33.113Radar StationActiveUnited StatesAtlantic Test Range#GroundStation-76.378,38.296Ground StationActiveUnited StatesCape Canaveral AFS LC 12#LaunchPad-80.5421,28.4806Launch PadInactiveUnited StatesTranquillon Peak STDN VD3F#GroundStation-120.56111494,34.58304294Ground StationActiveUnited StatesEdwards AFB STDN FR2F#GroundStation-117.91187492,34.95773825Ground StationActiveUnited StatesBigen Island#LaunchSite171.0428,8.3646Launch SiteActiveMarshall IslandsLovell Telescope#GroundStation-2.308724,53.236548Ground StationActiveUnited KingdomSonmiani#LaunchSite66.75,25.2Launch SiteActivePakistanSt Hubert#GroundStation-73.39675,45.518836Ground StationActiveCanadaHartebeesthoek, Europ Star#GroundStation27.70793,-25.88549Ground StationActiveSouth AfricaSanta Ana#OpticalTrackingStation-64.624,-21.5963Optical Tracking StationActiveBoliviaPlesetsk Cosmodrome - LC 32-1#LaunchPad40.7872,62.9073Launch PadActiveRussiaDombarovsky Cosmodrome - x10#LaunchPad60.649859,50.985518Launch PadActiveRussiaCuiaba Station#GroundStation-56.0734,-15.5525Ground StationActiveBrazilPlesetsk Cosmodrome LC 43-4#LaunchPad40.4572,62.9288Launch PadActiveRussiaKapustin Yar LC 86 4a#LaunchPad46.295,48.5508Launch PadActiveRussiaEVCF STDN EVCS#GroundStation-80.576,28.486Ground StationActiveUnited StatesPoker Flat LC 6#LaunchPad-147.4621,65.1169Launch PadActiveUnited StatesCape Canaveral AFS LC 32#LaunchPad-80.5556,28.4537Launch PadInactiveUnited StatesBarking Sands - LC 10#LaunchPad-159.7816,22.0569Launch PadActiveUnited StatesSvobodny Cosmodrome - xx2#LaunchPad128.4085,51.7734Launch PadInactiveRussiaBangkok 1 Leolut#GroundStation100.5433,13.717166Ground StationActiveThailandEdwards AFB STDN EA3F#GroundStation-118.09132969,34.93811433Ground StationActiveUnited StatesStellenbosch University#GroundStation18.86608,-33.92826Ground StationActiveSouth AfricaBeale AFB PAVE PAWS#RadarStation-121.3506,39.1361Radar StationActiveUnited StatesKourou Station#GroundStation-52.80466242,5.25143694Ground StationActiveFrench GuianaOnsala Observatory 25m#GroundStation11.9178,57.39307Ground StationActiveSwedenSvalsat SG 1 STDN SG1S#GroundStation15.38969589,78.23072231Ground StationActiveNorwayTVF1#GroundStation-80.575793,28.4858933Ground StationActiveUnited StatesWoomera Test Range LA 4#LaunchPad136.5155,-30.9053Launch PadActiveAustraliaHawaii 2 HI2 Leolut#GroundStation-157.9963,21.520666Ground StationActiveUnited StatesUsingen Station#GroundStation8.48,50.333Ground StationActiveGermanyWallops Flight Facility - LA 2 MLS#LaunchPad-75.4835,37.8375Launch PadActiveUnited StatesLegan Super RADOT#OpticalTrackingStation167.578487,8.981922Optical Tracking StationActiveMarshall IslandsAscension AAF Radar#RadarStation-14.412,-7.951Radar StationActiveUnited KingdomDSS 41 Island Lagoon#GroundStation136.8875,-31.382Ground StationDemolishedAustraliaLushan Station#GroundStation116,29.7Ground StationActiveChinaEsrange Rocket Range C#LaunchPad21.1029,67.8931Launch PadActiveSwedenRota SATCOM Terminal#GroundStation-6.367,36.63747Ground StationActiveSpainWoomera Test Range LA 1#LaunchPad136.5037,-30.9587Launch PadActiveAustraliaWhite Sands STDN WH5K#GroundStation-106.60855361,32.50124183Ground StationActiveUnited StatesJordan Lake Space Fence#RadarStation-86.2636,32.6588Radar StationActiveUnited StatesTaiyuan Satellite Launch Center - South Pad#LaunchPad111.60666,38.83538Launch PadActiveChinaTanegashima Space Center - Yoshinobu LC, Pad 2#LaunchPad130.975497,30.400919Launch PadActiveJapanBaikonur Cosmodrome - LC 60-6#LaunchPad64.0161,46.0188Launch PadActiveKazakhstanTanegashima Sounding Rocket Pad#LaunchPad130.962691,30.376847Launch PadActiveJapanWallops Flight Facility - LA 3B#LaunchPad-75.4725,37.8494Launch PadActiveUnited StatesDombarovsky Cosmodrome - x15#LaunchPad60.492582,51.053644Launch PadActiveRussiaOverberg Test Range#LaunchSite20.28,-34.61Launch SiteActiveSouth AfricaDubna Teleport#GroundStation37.251,56.738Ground StationActiveRussiaDombarovsky Cosmodrome x32#LaunchPad60.607974,51.241789Launch PadActiveRussiaJiuquan Satellite Launch Center - LA 3B#LaunchPad100.7803,41.1593Launch PadActiveChinaTel Aviv#GroundStation34.9,32Ground StationActiveIsraelJoint Defense Facility Nurrungar#GroundStation136.776545,-31.323342Ground StationInactiveAustraliaCroughton Station#GroundStation-1.187,51.987Ground StationActiveUnited KingdomBermuda STDN BDAQ#GroundStation-64.65344947,32.34794319Ground StationInactiveBermudaOrbcomm Hartebeesthoek A#GroundStation27.70566,-25.88736Ground StationActiveSouth AfricaCape Canaveral Air Force Station - LC 30#LaunchPad-80.5803,28.4393Launch PadInactiveUnited StatesNobeyama Radio Observatory#GroundStation138.472609,35.944518Ground StationActiveJapanJeddah 1 Leolut#GroundStation39.1427,21.654833Ground StationActiveSaudi ArabiaDombarovsky Cosmodrome - x18#LaunchPad59.842142,51.094496Launch PadActiveRussiaNorth Pole Station USAK02#GroundStation-147.5003,64.8048Ground StationActiveUnited StatesRecife Leolut#GroundStation-34.925,-8.138333Ground StationActiveBrazilWoomera Test Range LA 3#LaunchPad136.5191,-30.93Launch PadActiveAustraliaSea Launch Mobile Platform#LaunchSite-154,0Launch SiteActiveInternationalPillar Point STDN PPTF#GroundStation-122.49869897,37.49769667Ground StationActiveUnited StatesSea Launch Mobile Platform#LaunchSite-154,0Launch SiteActiveInternationalBaikonur Cosmodrome - LC 194#LaunchPad63.301,45.854Launch PadActiveKazakhstanBurum Station#GroundStation6.2143,53.2842Ground StationActiveNetherlandsBarking Sands LC 19#LaunchPad-159.7813,22.0619Launch PadActiveUnited StatesWallops Flight Facility#LaunchSite-75.48,37.85Launch SiteActiveUnited StatesVernon Valley Teleport#GroundStation-74.5269,41.2018Ground StationActiveUnited StatesWoomera Test Range - LA 5B#LaunchPad136.4763,-30.9711Launch PadActiveAustraliaPalmachim Air Force Base - Shavit Pad#LaunchPad34.6802,31.8848Launch PadActiveIsraelCape Canaveral AFS LC 18A#LaunchPad-80.5623,28.4506Launch PadInactiveUnited StatesSouth Uist Missile Range#LaunchSite-7.4,57.36Launch SiteActiveUnited KingdomBrasilia Geolut#GroundStation-47.902666,-15.8572Ground StationActiveBrazilToulouse (1) Leolut#GroundStation1.4808,43.560666Ground StationActiveFranceGreen Bank Telescope 43m#GroundStation-79.83585,38.43773Ground StationActiveUnited StatesIstanbul ITU Station#GroundStation29.02729,41.1015Ground StationActiveTurkeyNashville Station#GroundStation-86.756,36.235Ground StationActiveUnited StatesCastle Rock Teleport#GroundStation-104.807303,39.276772Ground StationActiveUnited StatesRas Al Khaimah Spaceport#LaunchSite55.941,25.617Launch SitePlannedUnited Arab EmiratesBaikonur Cosmodrome LC 165#LaunchPad62.9185,45.9912Launch PadActiveKazakhstanBaikonur Cosmodrome LC 80-17#LaunchPad64.0198,46.0068Launch PadActiveKazakhstanL-3 Integrated Systems Test Range#GroundStation-96.056,33.07Ground StationActiveUnited StatesVandenberg AFB SLC 3E STDN WTEP#LaunchPad-120.59,34.64Launch PadActiveUnited StatesAndoya Rocket Range#LaunchSite16.021,69.294Launch SiteActiveNorwayAbastumani#OpticalTrackingStation42.82311,41.75444Optical Tracking StationActiveGeorgiaDombarovsky Cosmodrome x47#LaunchPad59.92692,51.600688Launch PadActiveRussiaThule STDN THUS#GroundStation-68.59901778,76.51629306Ground StationActiveGreenlandGuiana Space Center - ZL2 (STDN KR2P)#LaunchPad-52.77567156,5.23240672Launch PadInactiveFrench GuianaGreenbelt STDN BLTA#GroundStation-76.84193894,38.9982475Ground StationActiveUnited StatesIstana Station#GroundStation114.9231,4.8717Ground StationActiveBruneiWallops Flight Facility - LA 1#LaunchPad-75.4861,37.8352Launch PadActiveUnited StatesCape Canaveral AFS LC 14#LaunchPad-80.5471,28.4911Launch PadInactiveUnited StatesSGS Oakhanger Site STDN OTSS#GroundStation-0.89489706,51.11411733Ground StationActiveUnited KingdomALTAIR STDN KM2F#RadarStation167.47928833,9.39542881Radar StationActiveMarshall IslandsBangalore Geolut#GroundStation77.511666,13.0348Ground StationActiveIndiaLaurentides Station#GroundStation-74.5333,45.9444Ground StationActiveCanadaReach Stanley Station#GroundStation114.2722,22.2778Ground StationActiveChinaGagan#GroundStation167.53753,9.28686Ground StationActiveMarshall IslandsKapustin Yar - LC 107 2e#LaunchPad46.2949,48.5688Launch PadActiveRussiaHammaguira Beatrice#LaunchPad-3.0851,30.8601Launch PadActiveAlgeriaWoomera Test Range - LA 2#LaunchPad136.521,-30.9433Launch PadActiveAustraliaTRY ADD Radar#RadarStation73.573,45.8108Radar StationActiveKazakhstanKapustin Yar - LC 86 4b#LaunchPad46.295,48.5487Launch PadActiveRussiaBaikonur Cosmodrome LC 192#LaunchPad63.2995,46.0243Launch PadActiveKazakhstanPalmachim AFB Arrow II Launcher#LaunchPad34.7023,31.8859Launch PadActiveIsraelPoker Flat STDN WT2S#GroundStation-147.46154869,65.11673325Ground StationInactiveUnited StatesMaui GEODSS Cam2#OpticalTrackingStation-156.2575,20.7081Optical Tracking StationActiveUnited StatesVandenberg AFB SLC 6 STDN WT6P#LaunchPad-120.62609183,34.58163228Launch PadActiveUnited StatesAlcantara Launch Center - RAG Pad#LaunchPad-44.367,-2.3148Launch PadActiveBrazilPlesetsk Cosmodrome - LC 43-4#LaunchPad40.4572,62.9288Launch PadActiveRussiaDombarovsky Cosmodrome - x20#LaunchPad60.087307,51.096909Launch PadActiveRussiaDongara Station AUWA03#GroundStation115.3493,-29.04607Ground StationActiveAustraliaWhite Sands - LC 39#LaunchPad-106.2367,32.4161Launch PadActiveUnited StatesDombarovsky Cosmodrome - xx6#LaunchPad60.52463,50.877274Launch PadActiveRussiaSATCOM Ground Terminal Facility#GroundStation-75.890866,45.349824Ground StationActiveCanadaDombarovsky Cosmodrome - xx5#LaunchPad59.595072,50.837656Launch PadActiveRussiaBoa Vista Station#GroundStation-60.67,2.82Ground StationActiveBrazilMalargue DSA 3#GroundStation-69.3983,-35.776Ground StationPlannedArgentinaGuiana Space Center - ZLV#LaunchPad-52.775,5.236Launch PadActiveFrench GuianaBeijing (2) Leolut#GroundStation116.42,39.908Ground StationActiveChinaScanEx Irkutsk Station#GroundStation104.30864,52.275261Ground StationActiveRussiaPleumeur-Bodou Station#GroundStation-3.521,48.786Ground StationInactiveFranceSolna#GroundStation17.96916,59.35483Ground StationActiveSwedenCape Canaveral AFS LC 29#LaunchPad-80.5778,28.4285Launch PadInactiveUnited StatesMILA STDN MIL3#GroundStation-80.69339994,28.50812389Ground StationInactiveUnited StatesMaspalomas Leolut#GroundStation-15.634,27.764Ground StationActiveSpainWellington 1 Geolut#GroundStation175.5045,-41.152Ground StationActiveNew ZealandTanegashima Yoshinobu LC Pad 2#LaunchPad130.975497,30.400919Launch PadActiveJapanNARSS Aswan Station#GroundStation32.91,24.07Ground StationActiveEgyptMojave Apollo Station#GroundStation-116.88759,35.33163Ground StationActiveUnited StatesEsrange Station ESSEX#GroundStation21.0630978,67.8904339Ground StationActiveSwedenWallops Flight Facility - LA 2 AML-1#LaunchPad-75.4828,37.8381Launch PadActiveUnited StatesWallops Island STDN DS87#GroundStation-75.47630453,37.92658986Ground StationActiveUnited StatesHartebeesthoek STDN HB5S#GroundStation27.70667183,-25.8869335Ground StationActiveSouth AfricaRecife Station#GroundStation-34.9,-8.04Ground StationActiveBrazilVery Large Array#GroundStation-107.618283,34.078749Ground StationActiveUnited StatesClear AFS PAVE PAWS#RadarStation-149.189444,64.288611Radar StationActiveUnited StatesWallops Flight Facility - LA 2 JUP#LaunchPad-75.482,37.8394Launch PadActiveUnited StatesXTAR 6m 1#GroundStation-15.63075,27.76268Ground StationActiveSpainCape Canaveral AFS LC 13#LaunchPad-80.5446,28.4859Launch PadInactiveUnited StatesBari Leolut#GroundStation16.8477,41.137666Ground StationActiveItalyDombarovsky Cosmodrome x39#LaunchPad60.472701,51.346817Launch PadActiveRussiaPlesetsk Cosmodrome LC 16-2#LaunchPad40.6834,62.96Launch PadActiveRussiaEglin AFB Launch Site#LaunchSite-85.34588,29.67729Launch SiteActiveUnited StatesFlorida 1 FL1 Leolut#GroundStation-80.3838,25.616Ground StationActiveUnited StatesNudol Station#GroundStation36.5033,56.15Ground StationActiveRussiaGEROC Ikonos Station#GroundStation11.28006,48.08407Ground StationActiveGermanyBaikonur Cosmodrome - LC 245#LaunchPad63.5271,45.8175Launch PadActiveKazakhstanSwedish-ESO Submillimetre Telescope#GroundStation-70.73234,-29.26345Ground StationInactiveChileSantiago Station AGO 5 STDN AG23#GroundStation-70.66731169,-33.15179414Ground StationActiveChileSylmar Station#GroundStation-118.4875,34.3152Ground StationActiveUnited StatesCape Canaveral Air Force Station - SLC 40 (STDN A40P)#LaunchPad-80.57719364,28.56198939Launch PadActiveUnited StatesBaikonur Cosmodrome - xx4#LaunchPad62.935495,46.079747Launch PadActiveKazakhstanVikram Sarabhai#LaunchSite76.869836,8.530116Launch SiteActiveIndiaWallops Island STDN WP2S#GroundStation-75.47441625,37.92806697Ground StationActiveUnited StatesWhite Sands - LC 36#LaunchPad-106.322,32.417Launch PadActiveUnited StatesLake Cowichan Station#GroundStation-124.07536,48.843501Ground StationActiveCanadaTutuila BRT STDN AMSJ#GroundStation-170.71941667,-14.33144444Ground StationActiveUnited StatesOffutt AFB SATCOM Terminal#GroundStation-95.911,41.1086Ground StationActiveUnited StatesCape Canaveral AFS LC 31#LaunchPad-80.5563,28.4519Launch PadInactiveUnited StatesCape Canaveral Air Force Station - SLC 20#LaunchPad-80.5567,28.5122Launch PadActiveUnited StatesMaadi Earth Station#GroundStation31.275,29.967Ground StationActiveEgyptDombarovsky Cosmodrome - x44#LaunchPad59.911557,51.54739Launch PadActiveRussiaZenith Antenna#RadarStation-71.49122,42.619Radar StationActiveUnited StatesSaipan STDN SIPQ#GroundStation145.79621667,15.24914583Ground StationActiveUnited StatesDSS 54 Robledo STDN DS54#GroundStation-4.25409683,40.42562167Ground StationActiveSpainCape Canaveral Air Force Station - LC 32#LaunchPad-80.5556,28.4537Launch PadInactiveUnited StatesBaikonur Cosmodrome LC 108#LaunchPad63.815,46.046Launch PadActiveKazakhstanBACC#GroundStation116.257092,40.071989Ground StationActiveChinaWhite Sands STDN WHSK#GroundStation-106.60855172,32.50101206Ground StationActiveUnited StatesDombarovsky Cosmodrome x15#LaunchPad60.492582,51.053644Launch PadActiveRussiaPlesetsk Cosmodrome LC 132-1#LaunchPad40.8686,62.8833Launch PadActiveRussiaCape Canaveral Air Force Station - LC 21#LaunchPad-80.5403,28.4606Launch PadInactiveUnited StatesPoker Flat LC 3#LaunchPad-147.4851,65.1299Launch PadActiveUnited StatesPlesetsk Cosmodrome LC 43-3#LaunchPad40.4501,62.9273Launch PadActiveRussiaWeilheim STDN WU1S#GroundStation11.0853025,47.88006944Ground StationActiveGermanyKoganei STDN KOGL#LaserStation139.48827494,35.71027478Laser StationActiveJapanEsrange Rocket Range S#LaunchPad21.1054,67.8932Launch PadActiveSwedenSvalsat SG 2 STDN KLMS#GroundStation15.39813814,78.23022167Ground StationActiveNorwayNCTS Diego Garcia#GroundStation72.363,-7.266Ground StationActiveUnited KingdomNortheastern Space Radio Observatory#GroundStation-38.42599,-3.87812Ground StationActiveBrazilHTS STDN HT2S#GroundStation-158.26227883,21.56897181Ground StationActiveUnited StatesGreenbelt Leolut#GroundStation-76.841,38.998666Ground StationActiveUnited StatesDombarovsky Cosmodrome - x22#LaunchPad59.634472,51.11475Launch PadActiveRussiaWallops Island STDN WL3S#GroundStation-75.46043669,37.94579497Ground StationActiveUnited StatesWallops Flight Facility - LA 3#LaunchPad-75.4725,37.8506Launch PadActiveUnited StatesMartlesham Heath Station#GroundStation1.2874,52.0597Ground StationActiveUnited KingdomHawaii 2 (HI2) Leolut#GroundStation-157.9963,21.520666Ground StationActiveUnited StatesMaui GEODSS, xx1#OpticalTrackingStation-156.2575,20.7085Optical Tracking StationActiveUnited StatesHartebeesthoek Ku 13m#GroundStation27.70745,-25.88547Ground StationActiveSouth AfricaDombarovsky Cosmodrome - xx1#LaunchPad59.655376,50.658373Launch PadActiveRussiaSanya Ground Station#GroundStation109.311,18.313Ground StationActiveChinaClarksburg Teleport#GroundStation-77.270401,39.218075Ground StationActiveUnited StatesToulouse Geolut#GroundStation1.480833,43.5587Ground StationActiveFranceSvobodny Cosmodrome - xx9#LaunchPad128.3656,51.837Launch PadInactiveRussiaDombarovsky Cosmodrome - x16#LaunchPad59.484369,51.06922Launch PadActiveRussiaBaikonur Cosmodrome - LC 162-36#LaunchPad63.0668,46.0323Launch PadActiveKazakhstanHong Kong 2 Leolut#GroundStation114.1445,22.275833Ground StationActiveChinaDiego Garcia GEODSS, xx1#OpticalTrackingStation72.45203,-7.41162Optical Tracking StationActiveUnited KingdomBeijing 1 Leolut#GroundStation116.42,39.908Ground StationActiveChinaKapustin Yar - LC 107 2f#LaunchPad46.2958,48.5688Launch PadActiveRussiaFort Belvoir SATCOM Terminal#GroundStation-77.145,38.726Ground StationActiveUnited StatesCape Canaveral Air Force Station - LC 12#LaunchPad-80.5421,28.4806Launch PadInactiveUnited StatesBaikonur Cosmodrome LC 250#LaunchPad63.3049,46.0083Launch PadActiveKazakhstanDSS 33 Tidbinbilla#GroundStation148.98304,-35.400549Ground StationDemolishedAustraliaAscension Island BRT STDN ACNJ#GroundStation-14.39076792,-7.91791558Ground StationActiveUnited KingdomJonathan Dickinson STDN JDIQ#GroundStation-80.10820406,26.98299969Ground StationActiveUnited StatesKiruna Station 13m#GroundStation20.96688,67.858428Ground StationActiveSwedenKennedy Space Center#LaunchSite-80.62,28.62Launch SiteActiveUnited StatesJakarta Leolut#GroundStation106.656,-6.126166Ground StationActiveIndonesiaVandenberg AFB SLC 3W STDN WT3P#LaunchPad-120.59285703,34.64367528Launch PadActiveUnited StatesKapustin Yar LC 86 4b#LaunchPad46.295,48.5487Launch PadActiveRussiaWallops Flight Facility LA 4#LaunchPad-75.4701,37.8508Launch PadActiveUnited StatesSan Nicolas#LaunchSite-119.52208,33.27981Launch SiteActiveUnited StatesDombarovsky Cosmodrome - x14#LaunchPad59.958431,51.036288Launch PadActiveRussiaAnhueng#LaunchSite126.47,36.7Launch SiteActiveSouth KoreaBlaavand Station#GroundStation8.1137,55.5571Ground StationActiveDenmarkBari Geolut#GroundStation16.847,41.137Ground StationActiveItalyChung-Li Station#GroundStation121.18705,24.96783Ground StationActiveTaiwanCape Canaveral Air Force Station - LC 29#LaunchPad-80.5778,28.4285Launch PadInactiveUnited StatesDish Antenna Facility#GroundStation-122.179604,37.40854Ground StationActiveUnited StatesOrbcomm Arcade A#GroundStation-78.382119,42.524867Ground StationActiveUnited StatesGerman Space Operations Center#GroundStation11.28123,48.08716Ground StationActiveGermanyCRISP Station#GroundStation103.774,1.2977Ground StationActiveSingaporeDombarovsky Cosmodrome - x33#LaunchPad60.142215,51.248931Launch PadActiveRussiaKACST Station#GroundStation46.642,24.71Ground StationActiveSaudi ArabiaUsuda#GroundStation138.3627,36.1325Ground StationActiveJapanCape Canaveral Air Force Station - SLC 17A (STDN A17P)#LaunchPad-80.56492617,28.44716106Launch PadActiveUnited StatesJiuquan Satellite Launch Center - LA 2B#LaunchPad100.3132,41.3061Launch PadActiveChinaMaui GEODSS, xx2#OpticalTrackingStation-156.2578,20.7081Optical Tracking StationActiveUnited StatesComcast Denver Station#GroundStation-104.9386,39.5793Ground StationActiveUnited StatesSvobodny Cosmodrome xx7#LaunchPad128.301,51.823Launch PadInactiveRussiaDombarovsky Cosmodrome - x21#LaunchPad59.576451,51.102299Launch PadActiveRussiaTaiyuan South Pad#LaunchPad111.60666,38.83538Launch PadActiveChinaKapustin Yar - xx4#LaunchPad46.299018,48.615791Launch PadActiveRussiaSondrestrom Radar Facility#RadarStation-50.9459,66.9856Radar StationActiveGreenlandAlgiers Leolut#GroundStation3.381,36.753333Ground StationActiveAlgeriaBiscarosse - BESA#LaunchPad-1.2335,44.3917Launch PadActiveFranceSedlec-Prcice Station#GroundStation14.5247,49.5919Ground StationActiveCzech RepublicJonathan Dickinson STDN JD2Y#GroundStation-80.10756081,26.98222986Ground StationActiveUnited StatesSvalRak#LaunchSite11.850278,78.931389Launch SiteActiveNorwayWhite Sands#LaunchSite-106.3,32.4Launch SiteActiveUnited StatesSantiago Station AGO 3 (STDN AGO3)#GroundStation-70.666403,-33.15110747Ground StationActiveChileKwajalein X-band Radar#RadarStation167.733133,8.724319Radar StationActiveMarshall IslandsEl Palomar Leolut#GroundStation-58.6,-34.6Ground StationActiveArgentinaSary Shagan Radar#RadarStation74.52,46.62Radar StationActiveKazakhstan \ No newline at end of file diff --git a/packages/sandcastle/public/SampleData/kml/gdpPerCapita2008.kmz b/packages/sandcastle/public/SampleData/kml/gdpPerCapita2008.kmz new file mode 100644 index 0000000000000000000000000000000000000000..95dd00ee6d047aeae791a8cb26cbb8abfcd0504b GIT binary patch literal 382584 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 z

    s6&Mx7U??akq^jws-i0iw44a=1L~i3ge2uixq6 z!Oy=l{h_`L*TR&~WlTgJi$SKa+pXlJ9#0??HB+2yqLoOXW(rpnOe&R2VbmozU|K1h z$sjdfr;aUM*1kOK=CJE%mR}o5}z*s#G$jmV3 z$5qP8itU07enJmLK$AQI zNyOR|is7)*x+){ z=*q6v^T8uYF22O}FhZS0G4w16bTKguYvxi(FrO^;bdK)xLl{IhcW6{xhZ7+Ip9)(H zEU;U82%r6v=Xf4%T9auh4VMl-794jntO}=!KA1p-uKH^b`qYZY&;6XUXlM{&$QT;F;){O^DOmpBh9X-CPa}JpHa3FTS)JBqKD* zGc*EcawFzBqWmOv45RrDI>)}^O*KhmW`Hfrw~?9IC;>68J?EZAdr~ApCI~W_eO95P z5si)_0u6?bN(^5+(B?lGM0H0t*(J0Yg$GfSeNZEkbkP2+?)q}m+($EWWNS_0Io6H4 zbV~`jUvby_{tSHjnW?w%r_bfq{FFFC|M`d@569`Ju> zqomTOxgJ9oxG?4SOXQ9#tK{n2Hks- zJj#;WeT#Eaif7uv^Wzrj+b^U}5Hm0V1dJ&6w=zHPrQY`_pMF%Dh8jmrS%3c}rPlJ| z|G6&x-)aFWfUA@~_lXv`oN(4~VutPlYJs~Gz~;kggN;x9VDpj0g-3u{JX}szi@e^m zkmnq{=8k5|>9Q$)GOHC|_S&0Qsla>ZuEU?Bs^X)!gRj3UfHe;?2?@0fH;9Z-;bp0=yC37wu^Rcv!n{bPV{cJJ(b1*pcf|A#u* z=iynHOS%^Zru#6_iC6+Uc}YciVj+sX^O&|PrDk~*LN=jPQWe2`VlF|hl*HFWgfvPd zS!4Jt9r0?qR9rD{DT^~r-&YM3-$va2KrqTh^V)EtfIk3Df(B{*Bam;t_>q((7W`r= zFv@ITK6@RQPm=eeP4DN9UR7>oN^7TeQTt7*9ZJ}+huYFEIw6)&d;kY3svDA6q9ip2CMM#Ev`1^bnaFGm zdkI-QZFWu$5*O1+tqyZqb`FL_$x;HiH%`rjM)pRiY{;w$xx?T3oI>|^($4MRP81*8X}g6y-WZ&s z@f78TWflZ3Nwpn~@pKqrbC=8&gG0(H$Z?pkU6BE~zd>lBkb!cQg-Rx#E#9r0&oCj(sIU zfMV&Z<2H{&xq&=mFlR)*V3K?9M#$AD-{S`2<6eS_4m{Usq3jau#Y zTj&r;xs#Dme%Zb4I<00t$oLmnGHNlB+>p{xa({IRCvCxC=S~rDemRqXvH)LP zVJ}0@?K*tqJ^eievq@$(l`PyMWex2`&vM$aH~l&t2bwFP>01dAugmv0dyJg{-Jxc* z)1=##2RiqojZf`;^L)m8i%eQ3*vj8HFmcUz|6sD8NKtyf*Rl}B-SUKKcQ4AyR_?Q# zE3c!o#1U-UYGriZWj5?N?!ww+yJ>~M$9UEkfjV_Vw%>o|rAwZ{I|pEHcPc5emCp5D zZ6;H&n+JN!r`KO*4>ux^mI?)ex!=yp6?_v4u-~OtnSGaJ+V_DYqRpb;c=LE1GvoUs zFWOfqL4!&(w_Kmy&YmccVmJ_uX}|wopF!pOePvaA#}7AHl3t6?GHnB`YbkV`9!@Q0;hL%wiyYCuJM zq1Z)jas*wf{X$sHxC3z>*=^;yVtzixM`wDGy!cPG$#RT0UVh$)ciiIJ%O7n$2!_x1 zKL_R=Ju>2a_Xg42t4g;c1-+62t54zS$Eh@2lF#g32QQzAM|$&}NUJmO5t6x6P0noj zzZRHBfym@?`@8FFbN=uRyW~w|{?IYrr}s6Y!BQMi?-%H=?aJN7&5Ly4D|lFcdu7}F z&2tO1D}e^uZ&nTvCGwCqBWeg(Bqv`l0v$`BOgsMc1}NO}SL=b=#|uQnubBzF%CWGp z5Fn^PS)l>K!4M_^kj!=<0%Pyi+U>5S`C`RJ8xFb9?t?J^?fl%-AFx-heb@y`Gfi_H zpw=7G^A#!7p){f)7KA=~iW6Cpl#-Sek(s={ecUqA={X!@o|~bqXJMM}1{Ah2wK;m8 zVNFmgDlUDm$NbTucEh7nY$B#2_VUlF4P}iT+$lI!q!c}|c{l}Zh#6$)pD5{8dIFds z3pSJF(lDpeKna7FK&1xMhCnA)B2pXheF82|5shfiqEx7?H&BWK6_coLYBPv7KE3kM zW7=>QnHUxQ!0=3yXbL!|wzQdx%5avdNnM=E7-CP3AR?F(_*)0*EULs#`dLhNxUdJgcA;4fT;Nxp#ahQ+QB7HVZ#nv^p6a; z4vu{W%5>Jd#4vPH)JK5=otNQ}p+p$CmrMXA*|Hao-TuNJhLwiwqk1Q+VJaSt>hO9s ziIXbWVminC+Z3yCI~>Gqw$ddD8iI$zAUmn*0>eU}r^g?x56I%Xp6MWlo?RBpB(sx? z#2%Q+#D-&{TPX(a=Zf5TAuUswBpyPMU(C#1d$JceTl?QlY!nO>xCef}`plmL0~1DO z1tDL^7zd+Ix0{4u>wPf^#lPS+4I?s&qzWT(LN<*c=R!7%M2?p=3!=|wG>K+r-ZTqi z?YA+C<$5M#9@n-PY3?9&QK<_G`bUT9dDeOzH=xjcSbyKde^Ti_RMUV;7kH=vu`RH1 z0qZib;Q%!*;B5w^xPX}%c;o?-Gq9}zZ!_R?e%H_gY*t{$1JB^^2k<|Q^Z(5+|9nUx zzbOCh2d%x6{kOe-WbuJ#TKm8=#RYh#y-Yc(XWa5nm1}ekcxUDudrY?Z6_wLXBc(wu zlnFJ#k-4gYGGw28^86>?;5nH>0)60uOwfHmAfE`sShtv@c!SWeR2c+E-gGxKTvT*8 z955yZf|}PeR2(>XOgJQD&O9UtI1hxXuH>2ykK5^kh=!6Eh^|yE+@Fpy7Y<3BaO+W+ z5vuJ%PK4l=q$3U|RmyG(A_pP{LdJ1$LrPbDFg8>V(qZGM4V4H{huG+iRuFj+1+Xd; zkOMjxtb+Tsl4ar~Hy&{UnN|nb5(u)0xRlBrj#W^$s-8JL zBrpGz_!g6%&?XdwJ~+9Ou*Ix#Eq5Rv8L!XmAxsz2#JzCPpoXhhgQ6&Xh>VRRL!8AM z45!PBYQgJqiyr5JlIGiPYLb4olwViOSM1xCxL)5jI?nUW!;!tw*>5Q>=SBK%zdZ=+ z8SOuOATswi6A#SHSO2`t+x(&DjQh6_#Bk@G4UVl|ShjW&iFG_Sd$Ne{Bx%C1M{*oF zUY+ieqisSyo_Y-{Z#z*=`gUzwj=VaRItp*?9@%HmqHP@+cVb2Dn$AzuLwkOUZV=5`^_R3As$B)48@T;8$S`3{c7>rv*abK~k zRne)J3DGe82wpYeMDP2$7^-Q!kcMHsOGqmB=(_nUjRwVr2!REDD}qJIQs*oU&Yd&q z%i>>arw^VG9U8OKzO^#Wvntv_LGH9O4t)b=WA@3Cuv{Xm_f<*r$8Z+Rbw5&0Z5_42 z2V7ni=K^|$_c>x>$0cv{;F=7`jR(1PN72g)P>*Hu%)6VwEsIwuPEoC;C&R_mcoSvZ z%PPw%*Y#G0q6-A4uC<|A$uirrc-pL#Jv6-&S{9Zq3Wr=&m>NSPeC{kGI59_O=w0-^ z@wyaCi5%qvHiw5sx9<&To^*E1-kZdYV{0^5_f*}UHV%cX>k5oT~baB9Zw zMbpsSN`s_VH?9Y*jdRwJVf6eD=o3CfWs_Ny1L^voM)IMGkoZgtC5;v75 z)A7v&2^JetRJjJwa@~c-#_xm?d%A!Y#r@>(^deVk3*SWv)if9J{UZEigZ&)>q?iYV zu@!y#M$uY31iI7fI?CkrLBO%=3{TO%uG1o&GpF;-ni~~6M{1_H;jw5i;J>E)ZW{Au zkrYimzdUtcavw#xY?=P+j#ERLlaO|!2wcaz)W=KW!o=UTcm*GcUsB3s9>qVq>lMGQ z>u{wRzFMn$M0CepWRiDtp&!;JYx-E9BZq`ZH6FIhOIUg9EQB(2RJOyr?DWGfV*~n3 z7(`Pu#zE-~+BheC+s@kBM)GxjsE|>8CSqZ&}gJXG+mYz+?5f7}}QCZ_80w*8Z+`oW?MyloqM7NfGefP3-# zi)(vW#o_6B_sF_uWZma4_b-!LMrU_ZiU&6K-ps8YmbXmjR*z-6^=FukFE%_Lpn(4u%m!ex#K1>q=B6R% zBIFgPWS5l3V-{s#RaaD$)mI=PW`bLr${RZ~QGM~jxM&4Q7`P|{LnA#I-81Q^U>cOV z(Ix!h`OLYkR3w^?SOm<3ef)#n)Sa_L2pAoN5|4-!4?%(;UcG;t^DPN|gou@-5h~8} z6qOLpKy#3yDiD*6K;X+?JC1Wb3}hyj@Q;9?56*Yd_s?=Z^Tt9j->rm7xy+ zK|HL#KUIIyjXdxvfhl2J!StW;tnAvQeO46Ckt6JW;xIIRGc6=1Xe=CJ~(R)8o9Fk1n5D*$E%P^|!l6(FvPI<*2I zU4YOEuvzzEDFB8QpsxbVRshdB0gDIFs~4BI0HGBCwgTu?fZ_`9TLGvm0A>Y{y8yNo zfVu*}R-kMIfUN+_72w7K2v>m33ZPv91}lJ71(2)&n-zex0?1ULas-&I0Q?jHtpXHO zz)}YwP(NPX0tnQy*0nEp-&l=m05Y0n*eAPK&-Y7?#AR#0k~BFvy zJS)I&1!%1=Q%3-_D?oY$?0x_f768Qpj8}ja8|hPd{N@t?iUn}40Fo7evHqsAK6Pjj zuxSFIv;dnG0Kx)bR)7EtU|!jbYn%GF{gp!iGOW$Z&YwSj0if95I3=KB0Se*YrO01u zjDIs*D?{ARW?v$nt~q`&+xqlF2zG?`vejET-0#9T=i8q5r?0vDHBIx=Li+R0BQ9#WJY;07B8HsiozQ)6GV+zLEFuYnRGM zg|_7LS=CH(15s;{yH*zVN!3c^*)(WSL7|H{rL}`&k#>ueNH|1ZXU7So zh!D`Ta3ZNO60$q@5E*ZQ6nP{KHCM>vH)1-C#3rcgU{Y4c<6eV(yfMDg#0MC!^ z-8eyDSLtr#`y0kl|xgu74&iK+I6vV@S{Mpd>FS6x;|ly+5P zmh)?A%|-Wz_V*V(m*YG2(C7ZmR`SWEILPJ3JT$iQUJe>Via%DbqL8!~Y2`_LE;FeT zv1Ps+sV1lnOGAE`m_*>N8K@T$f=@zVNIx`PrRZ{Vi`N((8JD9_)IDtDQKx08Mn`bp zd?3VU)C|v@EXPy}{DFQXC&Eykhsp7h z=ko@x(gmOPSK%jP*v#0#7C)N%{(i5q6u%?M5+D?RP z#{px#%tXxzH-Sg`ax89uR)o2iQowu?gm7UKB=f7E6aJA7JcfRu0a(BUq5XUi*&jR9 ztR5Dw#d7yzZngdz&;iup%;GA=HM!GZ5a zFoMn^@Vysd&(RB+gppj%%G& z>l(}WFJ|i-ITZ(s<3|%y0JAkKTZJn&C;@~~>Gz#!G1x7s5K*aeLwOP6DTJ?v9spzp z;w?q#-7paJRZ2g>MUlq8D51otl9iEP?x)f$VvO6A)0keytZOafY*Ud@_|0tnK6xhn zLI@}C(@n**A8(b-UEzI*KUc~=Fk7qZGsbVKu3VWlE11`+o~=D5JgCs>0GO?Iyp`f> zj5;HBOHIkoi>;p4NFe+pg(FytP2nX3$Q1miBFg3udD?l3kNylW8+^Iqq1r;n)QqW@ zm0muHFR!n6`^2zY(k{Z2;w*bTpnkn?IY75IyVh;hR~@bB4OLQYo1Hi<>h8Z~kA5WHqN2 z(Ud`-6;vpgD`*f;_cm6y?#|kz6?qr<)ukZgaSN=}quFn)pp3DfVg&b}jcuPz2IxPh z+*x#}-O-A}W7aCt$4DfZY?%%njXq=jngoSJdMV?sEHx~94@ihO=u5f%)UlDQ+_N7q)8apK5S%qWj!JCgCMaj}s z(=b3-;y3 z#jCWN@!drZyynZRvNAth`qQ&~v-GS(3T0ohEf_6s*=YApyi5(_z>U))jj!$B+g|&S zYM(DTrgtfI|EZdj?M$JyUqAi=uY86&AThkdGIOQVIC6cC!DJH$4Y9RL!G0HvM`$wE zY?U;em~NwY=s6H%eDf1Gm)Y*ouI?@YXm00B*F5B6^IW}6ZshZ&b@G#8rLEnpK!I5H z}n)j`@xJAkUJ zEi&kue!IQ4 zly$tE3&T8tpRakcE5VniVgklHT4Cx9xJUjzvKsIGtK{tx#4QQ1LKtbDGO%loeR{?B zyeCeHx;n)&iEY-~a;Lo6LpGzQn%~)FYJ+V+WI=hYfC!Iq4soQs%X{mOcV>qWCt1#LV!|?I15J>$dPkNNO%rxBn z#ybz5^4}s8kJo)KuYch_y`Z2j*rZ49rjW~Mc|DGHUJ1ZOll)vQUvPYMR84I#>@Hz8 za_HF+t3$BZ*e?CnaFx3C5!>#os&WHYKyv8|g!y@JL*ME<3UxFqj#nFz0iCSYRqok_ zoakNYU1HqvKYUhA++hTa-jgP$MN?qQ(BIbw z{mUvgE8@O>C3^31_@0I?Am%h*zJ&8<3vA-q634t0`2maMTckk?d^&EzlsBK!6d9-% zD}FRwyT_VUxKJ31*7jX_7v3nzzVIUxPATF~XPV{uVJVdJV)o|6r0)r?o~P5W0nqmSRE$rpdcb2~5wEaVl+i(V4eD`bGk@li8>ApW)A5h5u| zv;*|}AJ*S1Q_ugZdLE_=#UK!HR|lqkzX`m+UHw0Eg1_9@|Iqaz6bk$%$^P#Uyut?$ z2;M)KkrbwXAb0_iETGN#Ka*sq;DY|E;}3@aZ`b0_I{s2%Fjo0z9X}u(1`xb}j=z6k z;9vCE|9Y-{&uFswfUb|~KRZ9R<`4ggx`ekXxGo^*%emJM^K)+LIq6(^f+cnOc{a)! z8>@QV>Fm7jS?%yb(!n?p#Y}RD;yBn$N$4)5D0q+<>^6EzA`Gl}1H4ti8dE7Vo^Ox+ zDfYj8|AgwMv0@iJ$YcT;3@Ra3(RLestt%i0p=KNVEJ3;b(eT&#b&lgqMD&)(R>iyV zAoDVV0FT!e(-4GOafG7^H~Xh7MpKuwl4kqj4B8l!B#9=o)t|oczx7AZFmc0uJ8}SH zr?#AKw~*109vp&FCK?SP>|l&`T)!;R-}Z$c3SwpEqUh%5^3Ze<6misUVVBdVplga! ztL2`WP2RH%i{7D6xUGCAP4BE1$)uZNkK@+1w8x{Z;a7vHU^mEXBxdAz-unf6KghOd z(Y*)xgdS1&4RLqYO3q-}m&;B6BN{k~yWXCG=i(_VNMBQ(FP`Ewg*S#Az0l*;cv9W4 zE-UIkI!PhtwGktBtRXjfwENnxERGBele zxHhSKiYjU%v1MqQpb%R;^|;{N71WOpewL@r*Z3hfu6eCG34QI==ZgUD`ji(0Kfaj< z%JqyhChClz6t=p3C*ZjWBbvjV2)cRs*X?$o(TUywY@3Jmx9w(Y@!#$CAZSYhfq>=) z(3bfhisC;6Z}70#gsPcythvnA?Uf5^h>HzZ3ffgzIZKL<&+ zzXwTxENlhfx`^hS_hgypC=%=G&n#yk&A>9YpWG{OJ|C zMtBE{0I5i!Lq4gG`r`mYRzihKJ~a2uqQH`DyEC;8-$sg+{nsAG28&y+(t482V>zCl zr@PAX4TYV1I?jxkC^c@I6{?e;HXc_T*HMUGuoJ$qP|f{j@to|u)E=fEl1b(#T(5lDY+QT|o5Gmt&8+AiJtkg`lNvi4SfDtCz(;$Ltb>NKjyB205!h&l))y4w zwt`HSK!v4`HHS>oGiX*Oy*DC4GmIxAEKE!h%MaIiz_D4 z?LBlWO0#PZRvajcijIEM|?acK)P?8xn(^_HN2FUcW8_(_{4C)4pn?Ig&^C zpfY=zaZmlY7BtQEizk*Eu~Da-%AqU>`&_*l{UoD8dF zYleBFemsF*pK~dU6Ch=oKqqQtj-3&$=(wv5E5S)u#F zahlrI8^Em4^q#)`>5!~Xw+Ci3IpFNIUoE4V%CHSGvN5KYsCZTqv=V|TaX}$vgJIOt zB;mI}?x>i_u%R7$j})LDpWvoeuHj1YtZla3`RA^XHn!=jWc0y#(Z8O!t0C1^D!?oK zVg3EYb^7m#s{s;t80d%=`3)Ydemj~0Nm#rrYQj=>6m^S+7Wu0Lq&lZn6m*UnN99xK zz2LA4diCc0$Lr4ni<=3xJqtUB4WsjmXRp4$-MsCOcJ9jkTxkv*+gC9hpkUSi+>(G_ z{&G=z_)H)UmXiKoaj>kmw*Qt-%xnVk36r`9`NR`IJ~7Lbvsn3>>0zM5id}Oq)OSF} zuNWRTbI842V`RVM#3I6;w^H;)7?0-czv%=o35fqS(22pq1K8QgSr3r?1S~WJNJ%j| zYCdo^O292aK_LdCf)OFeST$YU$#odmC}3PLGA0TR0&>sv3l zQ;mv%hKhoSj(~uUfsS{CzI&dBjE;qa0XhAGfryC;$-MZP)ILhwXx#v`P4z^TK zl?8!k#AsBZK(aalwJP-^S13FRF|$#x&EQ}#GP2MtS7U17U{w;DzBnfoCf4VM_^6lU z0Q6cMX_9&RhL2dobAzc(0Di6KELf z`~}Yt;EELrl>53rzu#=JfAuU+9Qp5}`G~8Gp=AK#^RWK@^!;g^=nN8k82mhn;rI7c z{c-ilzAD&G4ZE;vQsgNQIlJYzlhzyq<#uys-`?ysyB^oLXn0<$^3dugvdy6 zHSLqy>R9v{k`l5iV(A9P)t(lT*s`%U0#de$T+YM}@+2V=o>5hi%{k0wmNG23k(QE6H6st``iAEe|B89EeSeY)k5jeck9 zkdi-C-?k{Ond}|bWanMAzWt_Wc=P1-$FQWXtMoh-lkC?rns?LlB)R<43kN4cvcwtu zz`cj0kpFQR|5bWE-Lt?<6{?drm)Cp_>S?C>Fu;(H2>QKr5#bt$=S?N@N8wYsGwPthFj}#8W`XNa8C0-pQLdMnp=@ zN03WCz{gyK2kA@SaD8nN6*;c&b3$neMlJp)aZ&C)glvkIi8(3OPk9^wX=77Mhg!L9 zeftvNNh1v9Cv(v_(=?&xaZ4=juy>23QgAZRU|=kgbX5_fabfUnjF%`kbT-5-q@xst ziayd(b~dvOO=+d26%G(2^zV*OjR`2nWhkMb4>rc{ZBLVZ9#mmVIli(k!sqQSMxtRD zl+Hk@pW-Tws$l0j%?)5891T`awOQ; zB0O;%ogW?gN4W^#aX@_oIf)(2`PmrMnD`9L%&os}?f@cD(qysg>uWkGs^B1Zbq#GJ z12sT@8K^I3sT)e>pfR#JS4zlKOT^kq%5cmk0vwhMA|Zb{9Uu0@gFOsK;8Ld1B#{Pi zXlhPQ7Id&-Q&C@bG!~0<`~=@bo>dh75itQE6DczT)e(KsxlRfIHoqa}6;fG&QjW&= zvE8@oQFw5wwVR5%%M{6UQby8h%cYD-C31$+KFh78kHFI5)jXTY6^hyXuJ3NPudP+< zzbqE;=NJ0=vb!7;kBf%gj%dNb1eek38LL< zM5%lukhf}S<@WQ!O=NM4X_+1o3lOyuyV%M^%r(0%|@iM!^wU<+HkLlN6fg)OdiBmQS#&2vxaA&z_ zC{L0O-Qd7jqSLhrS%xB}vU`WG)x2ARr1E{vp7T+9NLg^D?FPE`2Rfh&e zX}l97cx5>caqu9lNd_;UupNdXsDtnF)ar=6@hn>DY)HM)yHiKagwN@YWGD?1r3k5L zJ(19`SuYphwM$hqWL2^@OR&u+U#F?Cc6TPnn&rJn4}N#WgNGyLKrabrABR5<(YARa zgS}-SHbz!Bm?#BtzvG@j)dq1wWi6e;t;CEnZ7Ykgg-k|^y%kTA%(=gYfXHJ=OtaJ? z$fG6IsKS~s2tXFW(x{pSO|l41I`G4&PO3q06^-M+rs-Uo*R!>v>M^cH!8V~y3RNY8 zAP}4Ot{{xC?#MjSUi0&FP2n_Yz%aeiPDDt%YL(+CNW)7-r^q+y5{5`LxeO&-QFVnU zVBvv=6N(%RY8cE1;*a9WZSwVpp6J-Jy{xp_iO|WqA)-~pvwHkj#tVQ3ANYr18M$b zk1Sg|wrxdN8`;5n7HSjW{MQv63#thp+%05@c1Q7g<0xGT^`HkKgmMzt!$>wHq>@q2 zNonq@4hW=Zx^nocA0sKi5)k5#t8j4OY3MIX1~5sahxYc-nu)z^Vzg(c3@&OC%aCX^ zJ|d#7Vg`&51^arC7Xd`cfJ~cq--#_6Z~EnJg^Y3{f@*8M`cbRziOhRd%GX$Ul_m8; zwWc=35CUv;RXAdzI}dl5jAkwxl6ry_-{=A8b+d*jgu!8xTq0!(Zw@ZmOrRB@IP zt9TdJ8JA6oFX{b@v@|zcPe@HL zel;o+G|@b!b(^3!gMx4@Hgj|#NYUFNMF^FhQuzi=aRN1B_$fA-fuT==%(%>b%z`Cf zlDfpb3eLghy9QH^pMdyb2#U#2&iJ4N2ARvrN9T;=ACoL$W>X3{e3nomI~op!%4nIN z$uwe`!=R^fc(U8cG(U;setg|{Tpd%NyOE`OGpTerZ1>X zgO82WL#Za&XuLb4aG39956@hmc7BgU7;O|tgi63yp3$eyrVk`1PMJ*NSKLkNVzYLx zVEzP!f!ySu1jOW``V9>@zp9H*l42DrLcWLnL zA`z(t2H`SfL&%bBNHh*7*W3FgvHS%<)Ha2|JgqPcf0Gc><;Dc7MJQRsVu)VBMz)>Z zGOr2-wOP$(HWlk@P$?*a6jd#nXEF$5%0z-hvk;2_|LAe4?3n#J-eaUSg{lIkVLUH> zfy((M3S7G?ZOtC_&0oq;4B^EfRLP+z!o&kKTALx3?nQXA4^WIKM&u~mZ^`iB8@nI7 zF^p2Uq2d>`>~vKZicKuItY8q?_em(F6LyepA|-s#B#cQ92jm}o!lCIog{%2Cb!7|n z1!7Cu7V6g|QPN|?g~>sB{7W-y=-U{?P_GX@J&g$_jq|*ZhmbRxQN_+9*8ad=~5Von6oVPJ7hX zmqH2kyNEc!Cx#l{e#SR||9&fVl}^i2__1fD;4o5CQ%sz_8Gr%`FlJcyzWg0S2Us-#7ZqUV0OoIi_X==v0EUf_$#lTW0Zd^4!v-*g0dCEp zfB*dD?)>nXKxg6L-<^g3Q&5*YjgE>|FjGu-daIs8=IEa9l=Y4GY9|O3-f`#x;@ST+ zUe1=W0tfbX@dZ74>=Ni2Cc85wZ-o zx`4QUdT_LU`eu9KaBuNw35WCx>E|zac(-`?w{RDS?4gnk8__)Rd5`Ct7EQQg(66La>=# zESXJV>u~5IHT~Lp@ZefSV~)F?Zm$h6E|<;bUOEEe|6=d0gR4xsw%;A!aaZE*?z)o@ zcO&j0#E2)viMtzdcMov^;_k$axGNDL32^QVGtV>fe&2ikJf~`?-NjH)vnzM6?q2um zYyGbLW?OCkcA=n&jc#oE$qPuE=1w;WNG4~Qbjlk|e%YMdUFi0R`0b}{(I59ByW1Tu zsy2o~2-oZ9_2}oMq6imX;6M}p5HXYVdqjVT|NV{j1_%lboVND*frB3uh|E~F5^ygf zyWyw!9l;bHkF_<|j4bf$W++zZ5V;AAg$|{OV)jseB!v;Zc?4Gb0c9w<@I^i}3~%b*hF1@$vou&QEoRD4Dm0Hg+5r^3M3-`YNAMt z6u+7FJ!N<^2nH#SHj2F2nl>wP9Fa26-PtP7jOZ&Jd9HKDx6-V@&m{*1(Y!|oh4Ipi zhegTHYz~XlEGrI6vfPgjOY=e*kIITtZH~&zN-B;js+y0ED(eOqkEGlghu@kOFt0Ve!A) zkpANiG*oor4>!$Q)|9jr)6g#8T6G94tWO{{EVLY4Py`$XjGSA9H@X}+1})wj9>XgU z1NjXPRDJ0IXeuC`tr?L$^kY9?vWPDA0p2y-z*DD0M#B+qrSwwOLiud@ri#bzKudw1rpkp{ zvB*dgg=TvH2CI)1hNI2ZD=m&Iq5lwCztxQ0=L7=aar`|9{)S^J0D*qlQUDI0z|{V_ z)c!S}f0?{r*V$iW+gHyhM&y`qX^zLeUz@a|JQ{f-de~J))Fn-Dx3%-*pUav{(w`JY^T9} zK5rji8W-aLsvzFiCSehgQ7>X*Lv+GKlHwBrVrA1MQ?ruQQepFR?DNucib^WWBMRiJ zD$*P3N}Ge~CE9#D#NWO8Akgj9t5DnCI{bb#v885mWID4kzTak$bL{a6W3)V4eB1*0t{5(t+F2!rj`}cbE9+8^Qrr;2-t-u(_n}o2xfLU+Df} zYnY~!1r`S$?&J9T19ty!IsJFNKxL@-V=d2}+uwqHr$PJIV+Nk_|L}l+f*V(V)C|d0 zHqinPSX-4IOWRu6sKRFBfb&IkHTS~%nkogi+%^7b<^5x*p!obM9U)4p5$vQrpPqt} z!wMT3Qw2TTg*&(~k?j}XoTXn$9_xB1NduUp6(LWVU0rWl(7gq#B>|ClDSHDDO8jI|&p>eL;T|0SD6JP(3_gl}d*FkAODBhO_Gj zp7rDS`}6*-lm1u!sQznL!_1UdY<$(#)pa#A2E3eHe7z#e*XrGyW-T?@{Cr^36;r&_ zF>|seQf;f>9@zM4z;hry^<(X?jctOQqtOMeP2Hjj64h80qyNA zz=AWep!VS5>*hCt_HS<&_Z-jm>-JEtK~n4&9GGxZ-gP&Op+ zZ*HJOG7<%kZlF>rtmY%vU>Cp*l*i%7HQl9jGD+k$5*(px*>sFl9HVbrqqTggYPz&r zhHJ%S#WOdvaT^yV?R29LpZ{qcIut>qbOg-zM1ivs}1kke}Nf^iQ1XmcX7;zZr#0)HGVCxf0%goHqHBkV; z78XKBX_v~PR#qaY<_W?yG`v!55eRKBM5~6@BtCIu|R-(QemGGI!gq>EHt6Y>B zSkCN}dCv>=X+vR~XLm1gQ~Hqm_$2&H@`CI0mEVoT7f#R}28}lzi)@L%Zz~B@DEkDv zD_j7?iXI_Af(nGj>slNw2Nek)o$V5;>b9fgMo?1@V!XjA}N;VM|r|Yoc5DOkv^M=BN9D}q{4H`D@PAg{ViP)rs z=BPXBVsptxg%Z=N(Uo@F%g~68u8_wbq&JQj{~$jq)6xa-z=1%I40DWVgrZ=KvDv{TmbR#t2rEq4Ios2K5!r~fXD&tgV{icG9WY| z5DLI~0H90&y8yUJ0Kf=V`f$KCh@1#)j+h3(Isooch6WJczXxKf7Qh;0q`|%G449bs z0I(n$;!+1|8v&vMG6)(lAWlSovf>yDm=w3<7FD3L0j|U)#`YgfTr0iMva?Kmys2Vi z9ako&0efPgBONd=t|+IbLx&4RC-Cz#$w6ny&UTVvm#+daT~HA>ng(W zlEMQX$DMTzb~Z3YYGy!G7mx`~jMtf=V}^+-OS8ZOZpd}27T#hCJrI3E1FXsl$#@a$ zR5E@&Qd9|2u!ES~@u$t22$VcUY`{8MnG`81l8Or*K}!Uo_H{%yI*B|wN|p$2tJCY& zyy7Y+Utkj~q!6mBtE;Ls>+bIUUsupy7S3-*HUQ6o4IC7t?HcyWIo{P7u$zf?2o4H# zOV5CTb${eJ6ciSaix!oY7r`N9WCYdJAi`BNl~K_UH+SSi!`Ih>yE35QJIl$*b14-m z^xAW%2nWkhVS3ZSFQFFGk+Wy>327{;XelWvh-uXY`1Lmns@BqZT%i%K-7ujqb6qGP zt3ytb5}3qvp^f~T=SfiZYwt-uKi$x40ih9D#$!nIgv61V%JR?EQHn(8&33AFA}(el&MxesI@p6yVq@0lEqks{pP#2_6by-x zO=MHZP)}nwg+sN`tIx*?!A)lKMfhoS_IBg>APN(EmaJ+|2ohVtH5T!61-dz5FL?OU zEhkG!L{c1HS4aT-7;D8Ef3c0w2+=zzR2vRoNWnx&T1=!<_4G}pyJe#>!OSKkmE`r8TI9fk>VDCWv0T@LLAy9ZZ zW8t|kQTweFeCqRx0^u`;*inCmr$;QtlSmkqm@Bdnpst5S+EDKl~9@zT34YLuM}Lur*1HLzbN0&$p<0;uRn{IjZK^P7gPDej)@BNV9XgSW~!ub%pglp9sOCaluA_K`Kt z!i5U`7q}C%1)Lw5Kh-#lQU%)@n^9-U7+v|r3QLk=ddl$ZDM?Mw9J=0--920YG;4u= zQ++b`TTqohDQJ;eWcE{#IdyKdmKm>uG?-Y;+E72VWXMSCo=*Bw!x+(Y+|n&KT8`S^ z*s7SdKk&U39`dlfnB|+^=$D_Kahtq#VC(57MSQn@rL2I6IABp^Dy24CBAqp;q}dti zA*;N=asUOYW642%Ku~-$^;6z>?g-o8u-x;AL5P%SJ$Y;Hq+9Vo_RG4TfBfhxycVC! zYIpvopcSj&X`F9wI|*2F81dUyHu!4dAnp$H($3m@bUhBi7z9M9F@ZZjkVr}KaXvpK zgikj^-GsHbNam!WCH6`HQ!R+X$ibJxaag>&{;F7RgPN?ZQ$5QTI*&b95IORY(V}uB z50Th@l0&hJ8*cORNx`8x#?<{87k+Nx6j`YTH`R&S1V6Vx1HTZ8U@R6}fETh@0_z@8 z!=%i_9cylDJ?R53F95wu1QNZ#bhp>=-p7>VpRj8r5%Q^ z>}_B}RghuHVJe=)Rf?hPK>X`q>eJP4b$y{UH@5*EX0EN-?^6)UM>iU8we3b5?4yvM zrnqQ(y3g+(@3iT2*HP=!xUs=@wzXG6YYdNZH!0d^7=3e;JS7|MoGPDH>1Z%l-e1x_ zzw)@Q8Akt7Q3{jk@s5u*PBS>X{^7@xFful?vZ+}4Xi=2C3lZ_Ebz2mdJ@ZSeK2Hh} z)(*`CY7;aUHk#~?JuAhmp{zm8CUtehEpP-)qL^8(#)zv4El#y<-6_oJ-YjfTHq*m9 zr!u*07jhNLGp~ylON6aR{U7{Q*o;`Dj#@MBVC(XPpq{7A*v0(h>(}i^!U|7j3c>uk$(+6iB>YLyv zC(xV8eEUMV;`CCtay4<6 zl4|o>(aMa*=N7H)1)cTY4ezy^Mc(!44v2LJ^$zQy&U~Dmn}r{b#DJe)TmQ7NIfKLo zSjz2LKU&J2ox`4=9euvJy@3TiGOd5yS^xM2)P=LgV*CxL8zu=4$&#%vkfOk1vsoSD zpaK*VBwi?TZ!MlC(JPdqfxF%o1Cj~dk_ezmI-bc-xGE{*P&%25u?3Y)Xxm_02-JjWU}fn^JBvHaXz(%!Xr=T zK6|A#;&!Xn_pB%OE>5|fP)pt5N*UdINZ5|Z$hM#A^pYo{4B1H8QF17qUbbrMTgIz= zxY7Yq6g86_?7W`kJZ-snEV)a7*h0eX@Qt=0FcaarTaHWEIa*QxfyB zFsfOQ{fM3+vbz#5QB5S%;lxv&8(RT_OVF0eyLzqpA1oc@0~)BnXq{ELhD7Z>p_F5+KY#Q&#p5&u=u z*qD7uT>>sT9>?F`5C7DF{JX8d?%~yOT_?L*j%&pG77+R)rWj%fyeRhce6aFwZ*2Jx zoYFZ3QSVCwT#oyJ3y%N5b^rHQ!{7eJU(S->Z3RpoZ3PmC3&>@T-#e}fqMAS23J5&f z3SiI^fJh(T4>jSz36IzI%3+JlMSyL<2bD?>;^~Ztf!Yj0+K%FV{#Qye&7aP`dKwvj zx-|E)^zk)O^|uJr3l33w9j+Cr8y%w%7q6WtnVcf`CQU6P(>mKOEKjpQBC9wzuR^>k zyC$v9%CK0uw9K(t^leIG{QD0@Z8;sC&-=P!dcynk2L{n6{inx6<~0NV8{b&G?JH2Y| zm*RJoUrO9y##p&pOQkCt>IGY4RaASsp-2lxvK>Ndbl;J}D#$RUU|W5}ldYEs)ou`^)QG;By(lg$6mb44~!)4f~Hcu>I|BV?4oDB@sY|lSQ|NOYIaFfaxU)@LZ`P zdAcGSVH@`fc*B}FZCUQ8hFF>GDGHzvDHCrCRIRJ}IQ4g-6J};Zte-dIS<;p$ju zjaX-2YC1iOnHQ_WPBn&$LV@pH*uWSbd(FUt5!ElU)mwV9PXQiTZxPqf`h1&pNFiB< z5Zp^%pJ(8tIJT9$HXUA~Bqhq{M3a8!o1KFPA4I`J_WV%Y9*d8(KD(;MWi=!#Zt_qd zTC0{~VWg0uqYn8TyUmyMbxm+~ZY~)ZRuRpXo5&ZO2nC8_L+*MF|4rz@_|4C`Pjn!{ zl&ECJ8&9SDW?5|mXK@F1BW9lTQRdxwq?O{4iqZIY?E{<418KE}44E=a{e8wQ%$eHZ z5Sx8&-Zaw{Zg4XDv!v#e05~Nz@6!IhrV8Go-sO?4j}G+umi^So=aKAI*HN4(ezG`B zIEm(tn{br!?N0)I??rF6_iM|CJ+i$;H--~9tMn2Xzlc|dh*g!Rl%w**MPd_53K(I= zsi3aV(k#R8V`IPEkF{L2GtN{iE3a1U$iBDY;OY=Ki_c|j{H$3I>r<{`yLpYh^Dxl9 zZcC`;!BR5_6}>}4xEw1~BWiB;9GbCOsFZ{*QYdMSp|Jbw*nwH{tN9a=vy#9cMQ25b zO~R(5*HyQtwFZtqbUMz*(=xu)u)ws5^377xb5m|eC@q{Vf9HfQ-tTJfq{=tiyT!Il z&QF-t&paGiD}K6v9btKQ^MMguq5S!9$V0pP$eNvYp64g?52aW;hAay!CSx+^D7=dA z)aR+UZIqGJpFbkU&mU&azKAZJB#u^+q3!O*KX1@BF=HmU@R;~cIzBQ2;c`k6hdZ(z zYDE2{NHk=o>_DJOce03{*<^CM{#2^Pa;iL~q<-(@yK1hb ziOw(hi@iU->8Pu-E;vK>|2Cm z#sX73+lULvVHoqpx*bBKZ27S`JFfbp@cm7_tf(t`5FA(<+dvdl?qpZyPwjyb4`KM9!t!=9ggVxrh$vr3unnvgvOCzm%fEwhK$vl| zkptZ+nxP%UAIh@CyfSpNNrBOeB=Ev3!v!0ER zTeSNmx5lH8*{FT}?Bl_P4JDi|RF0mdJeRK3hTq#tq|7(OkahMB+&rc{C?g^9Qq&Pc z372@+IEU?6^|Yvvi3Z)~@~M+A0w1TIv%y!0K#O*9#wz-y2P!wLP9P6vM!Cc$5oLd# ze&^8;bjJ1e2P&#KHm*6}IAbbInr!`5$hzxTnEtk7N*kX9qa=HS(AThTuM}%mrCQg~ zEMzK`rX0R6b2&vBq0}+e#@WG+zVZ(p9cMqd#qJu{65ch#;iAhh^*LD^#7{QYTP`XvuPq)h81#b)o>S|(S+_EeP6S^&pq85 z*XPDMc&3)-wMxWoK~B-SZPN7WHTOaOl%}wBk(C&Uxq?b--lPoIYrj)XO_@brhy9b_ z0>g+N7Y_*J`fi= zH^_T+B=73L>9g~%f7W@p?UYs`R3Q1Hv)wPSvK-Ty=sVl3AX8l!#&)hP7-o>-CMk)l zm6NwQLbOnp2txkxC*Oz1B}gFRgl-9xMIXoCaw^+D)!c1=)!cy$>X%Lc&;tNc0YD@G z)ZBk*k^yZ1pbGekpAvuMcfSUrK}cL9md zxqdPLv1KL-7%XyTK;g_)E#s1}Mk}4Kx(!|PYFex1zhlgtJZJ=~TX%f=Lp0=5oPYk< z^X!cs91{Bby*hw{!N$S|ESlc@2M2=>$}b8n0&p+|73ol51Sfbn*s7-H$`*WdXm>cM zwywOwW++4_;D)`idn}{33ToI13G56FGrp8MSux;@2I~Un_Y|bTl#tC_MZ>rN7 zF&W);^t@}o=+GIQytzj|gl}g|@8CRSXo4UE68EiICWZu8V?jMdUe@%{8Qm!L$Hk(* z*6bRGjcpd*_R6@B?iyBxGHGM*e_P0y>bUwcgWSPV=^3LCYP>lpw>a8~_(2o5@ncp@ zszpygJGZ8WvichP)a+zTZ$(*+{o6MU>i#iMB>|{U92kocQ5dI+f>pPdHO%-@X63DG zpXwPRtka~tN}7e^h!c=qk?tDm&Ox$`oG*b)@*^f11}T2UdoGMp=6pt-o@6YDL>fm+ z5)BDxMa3mB{9b-7BUxa*FhBl8`+N=riwN*3(Q~(klIR@rO4_dWpOZ(YE7PFd97|Q1 ze>#&C`f@JN8APTcDeU=qZ!$;)utd4PU1SLUi<0dzDE}`-P1}Eqn*SCx|7G9;JMX_m z&3_rV|1xm@W#InHz|FphE*1X&BLnv_*P%WylAs6pw|xI(;M)Gy8kmysO@H(eg!aj> z+PazBR{oe>v3ksz`bpFfCQCwN-7W?1e7t#EGnP^^*tYoXTyyiXplg*}2`SL|YzeJ~rf$Mwn*=BFp4}}?H zQOQ@YmUxzyYYjW_NHa^A+2Li18=ID`uT!49%2{U}eJ)L$)4Bnv$4f~rsQ}^dyn5PY zRu1o>mBYmpa4+|nzHn8%9Fo)BmVP_xqDzGu(OY?(k>syHI>EQH&?X<1^MO&4sf%o| zEl0NTQ+7B#*iBHuy;{{okv2&>V1DqtIc=mgtdD_iLd((VX8*Zn>R0ku*AWqu=c^Q$ zvE+0@rJ-AlT*`)JY^rStdSl)DEVf@rG%+cM@r)hDo+RicMTIWy_&P15&htDC8*DL8i02eF(_m_Oz3D?h0C zuf^kpC!!Y-3nw#*Wx4NIIjei^U1IAp3@S6eO({)z@i}&9uX47aA!OMu=8Sqtt9X(U zA$~13sE7zcDtSp(%sN`264<@U@bU)>J6ZeCM_Qbo6CsB?4?Nx+>hy8*)sB<$`fS6r zSgXQYqa1zpr}&r6BGIkxoBWs&voFXKs@1a0ja*_C1g#Z+BsJk{kgOIeY|I7jsSnbD zL%hCQ(h%GqzbMD2U}$B;Gv?19zuR#S?Z}sj4H)S-1uIi<39UFthmMQB(O=<`lR+7M zHuGBE;R1b+U&R9FWaj#~CI`A+IP6ROI9$A-=lnoD&Uw%0a+w0s!oZIuibU;3%YG;s zuRSE3ZPr&=Rr;U+yLgIHuN)Lhy|9B7mM2^j-UZ3=fc5p^`Rns$C4;ZcOfEs1XeTEObEBbkU;$651h}?iM;m$0ehu= z0!{j==?P@eAPNJN2D6~PSGlEORj46S#{K*vGDWYxD_5Xi(oX)C;Un#e(? zW-t}(eqz*R=6`uHOY4$VX~?b;2}!&VKhpAZC6te6rw_p^M6)HYVg*A2hquTLvvLuN zaP2l^H#z7h?7)WZ%?td_euP7>$m^=5Gx13{E!c$jH0&?8bd(bONE=7mi?fz$G)VB? z@ld91N#CH%Qt@`mSg6?XEKmyjWfT05 z6Aa3GDo>cyZlrYF*yzpr{Fb^aQAt_4%fi;X*n{^0iI*ALGe{T|sZA1Q&F}T{VD1E8 zDC-Ji@d!*uI*wv;GWHkk<`TJu!RPhd7l$Ty+hRsJ<0*C> zUgv8$_~@43I%vznHu+R0MvU2=E@`P#O&%&DbhYxld;>ey=3I;>AH3#Dq=9lsGSdTEUv7BSxSx48~auO$$v zgHJyTZf4vEC8SfgUn-Bx!8NMb6TBk5a+<#2$xl&3ZRr!A!J~rke){=dFnHkLiEK7m z1(8$xI4>)^0V|Bj0NJB1=$AJ6@mPsnhZijb?nk))+5chtTZ`*l!o9WvfL1?$*U_=U z+`Kq_$zK|iF@>C-aFXCG*iR`CSw-MZK%++RvT5de@tJp{dS<6hRT>`VNBP0X4C>n1 zV7Y?MQGuNcNJ-BQ4#+XUetv#}*|DR$w>LL)v$O03 zC}?3xX=!OWIRJr^HECG%H3?HD5fN@`N2K=Qtk#zj{O`m+ENEaGxwdiyM3W7D$cH-D zj|L-__1DIg?pLSReps34$Fut=O@Dd6@FId~EJlRo%r0Ut)<5ShgAS*T%XVS^Jln@o zW*mNm51Mmsm6kPVM#hZSOZI&qTdkWc8y)CgXzRV-Em?Mzv9}VoO&E(9Equz?eDj87 zf0SvN8E=%uMA_uT8Uz{`91Qr0JwotMyZ&gg>`#baJv5YT@tkZjA!lfOG;JuA2?@9r zX)4jtr!-d6tNEDA$jF4C>L`^$6f>92(EnD4GblZVGk?^!(Fz+``iK#7ky`$?NIa+| zPaF)#onlUo4+1>>Zs<4NL7apgjo)c;oKNK|@fuOk#5bN!mFIwjjxdKxUV?}7wiK*6 z(pElX>}{ms51T}=qyoJ)QV?B;ut3Wz@dw%cz|Q5-(*Cz2)30dJy|u?T-I)vc`L!v# zm6T%L4wyL0mzC)RovB|{loC+=2sSR=$3(9b`C7=_K;iWn$Nk~$Pz@u(VBb$HJ zugl>FgLB~0S7I5WFSuc3nuBw-TE{__%;}svbm|^7G$F=U-G^vuQ#&hBJg#3&yYYrD z+m4(=W|(^RbKLPWG=&8R$d*`cwed6U>Lu5WvrgX>@T!QOI3K$8O&+G*edDz%i{ps% zL8C>KSV&&}kc|pDl*8ufSq{?f#quys_H7UI)_X1arIHTS-|Q!^OMTN)RC2b` z8na5A+B}PWSCrx1GDxvab;2msHOihn2wM1;S5(k+^j^4W)xq1*(0x@5l<7|bkKbUV z#!XezSU%sGkkF=>7?u3&PKP#= zP!#j$zP4}7VY6?(^K!lapq8HEg@vvDlqybmZHp=>A(X@!kAnSNx-u}Tz$1w$WzDCKb|<#H(JQp*<5$mP=lANhQGg*-;ZT(`*1_d^>b z;t5pJ$uzR5G_onQa;bFksSJu~jEZT@$~jC*X)G$)tg6{8%IT~s8LTSlY-(9-su}F+ zne1vA9O_vdYFV5bnOvG#TpC&2TG_nMa`?1!1axzS^z(%E^F<8u#f%EX3=1H}1rjEO zlBPvc=EXA4OBAfi6s^jXY=B$I3KiRO4f`rB$7)T7Dt)(F!&i0YJ`J`(E#C1T{F1r@ zQ+r}^2h+;NYdaSkJ}eJR?u^auO)ebpYo`h8rK;IihGz6tw#~QptpTP{t6OIWC)bzP z-y}>Ev>d{X-GVu-L%3{%S#5&3Y=gM$g1GDhx$FbDUIuW-nsdjPI|g}i$C`2{7<0#) za3>m5zR{vf(`3ldWJuR!OxI)r{v%VJIYW~rQ-d{AlQmO=ElYzXM~x#(gDYE|J4c;6 zTb(yYoj+Hdr$Ct}UqvuaO|(EwqEJ<`NL8vxRi;=)p;TG9Oj)g5S*ub>r%Fk;L{+z1 zQNKpfs8+$SM$x2P#iUljv_jdePQkoF*|J{2vP$`RrLuRVyLE%SZHkvRe`}J!TtrIi8X=o6~W;J;ek2f z={14r6~W0R;gwCkrBD3xYXWr*dY^Wc44| zPO8#v|2I@9(L-jTc_W$p*z=c?R!Z41Y(WFW@x{^OS+Z*LhuGt|*?b<<@Y#&cpf>@8 zNj7t7()fH9!Lzd2@+tmcHv9&A!%=o+3g6G|FV)QvD3>}Yxku>4kpx?>&QSjYPci=Y=)LJgwA*5?U%QX(rc&U1L_M_g35dwW{)4W=!QL zNjsmrVX#?@d&34m8P5!y>CnXx@z@=Z4BgP0m70cb1IvjQL?)bM;7|5L#raR4v~rDhAt|diYCvR>cP-dy_7_*+HHb+ ziU?G!UV-q*Mk0bHU;m{v%?!#joAQfU=Yc2IUxTMA*z)VT;Te1cDiujA zLu?rjyI|Jd7IO|MaR*{lCXyi3Bu=#6&K9DxM*6FdkhQA`f!xVWS}Iu`-7*khkHr9$CjGdiu}6~qHs3?@TQWnD@Hy;xQ1!s%b@Y;tathbs1yej z(ECqJf<|0L?iHVbd0kbXqI2{?8qJUm094sM^GibEwJhjink1jMvBHy!KgAp5-O8Y% zTiujlkSPPNq1+eQJP#Y-#OTGPaHNasZVeF#8pe6T#u8CQ3jt3*x>y6}2&#GuL)i+l z=>T}<&qEE$Y>}`(LW%uIxp5K5@>F{e-b@aOqibw<^dWU4z)8SwL?=zMg;_YuGgbLO z4}UBXni=M!@lwB$3Aox+5Lg`IlqIr%Fr)!<%3?f4f6^K+>_AopfyILQdIgI?OkV

    OH_FQL!^U{|3(J{Rtbm3igkoR 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 U_joD?R1UbEKu_}nX+L=W4|Nxx*Z=?k literal 0 HcmV?d00001 diff --git a/packages/sandcastle/public/SampleData/models/BoxInstanced/BoxInstanced.gltf b/packages/sandcastle/public/SampleData/models/BoxInstanced/BoxInstanced.gltf new file mode 100644 index 000000000000..311af0c25bab --- /dev/null +++ b/packages/sandcastle/public/SampleData/models/BoxInstanced/BoxInstanced.gltf @@ -0,0 +1,292 @@ +{ + "asset": { + "version": "2.0" + }, + "extensionsUsed": [ + "EXT_instance_features", + "EXT_structural_metadata", + "EXT_mesh_gpu_instancing" + ], + "extensionsRequired": [ + "EXT_mesh_gpu_instancing" + ], + "extensions": { + "EXT_structural_metadata": { + "schema": { + "classes": { + "box": { + "properties": { + "name": { + "type": "STRING" + }, + "volume": { + "type": "SCALAR", + "componentType": "FLOAT32" + } + } + }, + "section": { + "properties": { + "name": { + "type": "STRING" + }, + "id": { + "type": "SCALAR", + "componentType": "UINT16" + } + } + } + } + }, + "propertyTables": [ + { + "name": "Box", + "class": "box", + "count": 4, + "properties": { + "name": { + "stringOffsetType": "UINT16", + "values": 7, + "stringOffsets": 8 + }, + "volume": { + "values": 9 + } + } + }, + { + "name": "Section", + "class": "section", + "count": 2, + "properties": { + "name": { + "stringOffsetType": "UINT16", + "values": 10, + "stringOffsets": 11 + }, + "id": { + "values": 12 + } + } + } + ] + } + }, + "scene": 0, + "scenes": [ + { + "nodes": [ + 0 + ] + } + ], + "nodes": [ + { + "mesh": 0, + "extensions": { + "EXT_mesh_gpu_instancing": { + "attributes": { + "TRANSLATION": 3, + "ROTATION": 4, + "SCALE": 5, + "_FEATURE_ID_0": 6 + } + }, + "EXT_instance_features": { + "featureIds": [ + { + "label": "perInstance", + "propertyTable": 0, + "featureCount": 4 + }, + { + "label": "section", + "propertyTable": 1, + "attribute": 0, + "featureCount": 2 + } + ] + } + } + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "POSITION": 0, + "NORMAL": 1 + }, + "indices": 2, + "mode": 4 + } + ] + } + ], + "accessors": [ + { + "name": "Positions", + "bufferView": 0, + "byteOffset": 0, + "componentType": 5126, + "count": 24, + "max": [ + 0.5, + 0.5, + 0.5 + ], + "min": [ + -0.5, + -0.5, + -0.5 + ], + "type": "VEC3" + }, + { + "name": "Normals", + "bufferView": 1, + "byteOffset": 0, + "componentType": 5126, + "count": 24, + "type": "VEC3" + }, + { + "name": "Indices", + "bufferView": 2, + "byteOffset": 0, + "componentType": 5123, + "count": 36, + "type": "SCALAR" + }, + { + "name": "Instance Translations", + "bufferView": 3, + "byteOffset": 0, + "componentType": 5126, + "count": 4, + "type": "VEC3" + }, + { + "name": "Instance Rotations", + "bufferView": 4, + "byteOffset": 0, + "componentType": 5126, + "count": 4, + "type": "VEC4" + }, + { + "name": "Instance Scales", + "bufferView": 5, + "byteOffset": 0, + "componentType": 5126, + "count": 4, + "type": "VEC3" + }, + { + "name": "Instance Feature IDs", + "bufferView": 6, + "byteOffset": 0, + "componentType": 5126, + "count": 4, + "type": "SCALAR" + } + ], + "bufferViews": [ + { + "name": "Positions", + "buffer": 0, + "byteLength": 288, + "byteOffset": 0 + }, + { + "name": "Normals", + "buffer": 0, + "byteLength": 288, + "byteOffset": 288 + }, + { + "name": "Indices", + "buffer": 0, + "byteLength": 72, + "byteOffset": 576 + }, + { + "name": "Instance Translations", + "buffer": 1, + "byteLength": 48, + "byteOffset": 0 + }, + { + "name": "Instance Rotations", + "buffer": 1, + "byteLength": 64, + "byteOffset": 48 + }, + { + "name": "Instance Scales", + "buffer": 1, + "byteLength": 48, + "byteOffset": 112 + }, + { + "name": "Instance Feature IDs", + "buffer": 1, + "byteLength": 16, + "byteOffset": 160 + }, + { + "name": "Box Names", + "buffer": 2, + "byteLength": 40, + "byteOffset": 0 + }, + { + "name": "Box Name Offsets", + "buffer": 2, + "byteLength": 10, + "byteOffset": 40 + }, + { + "name": "Box Volumes", + "buffer": 2, + "byteLength": 16, + "byteOffset": 56 + }, + { + "name": "Section Name", + "buffer": 2, + "byteLength": 9, + "byteOffset": 72 + }, + { + "name": "Section Name Offsets", + "buffer": 2, + "byteLength": 6, + "byteOffset": 88 + }, + { + "name": "Section IDs", + "buffer": 2, + "byteLength": 4, + "byteOffset": 96 + } + ], + "buffers": [ + { + "name": "Geometry Buffer", + "byteLength": 648, + "uri": "geometry.bin" + }, + { + "name": "Instances Buffer", + "byteLength": 176, + "uri": "instances.bin" + }, + { + "name": "Metadata Buffer", + "byteLength": 104, + "uri": "metadata.bin" + } + ] +} diff --git a/packages/sandcastle/public/SampleData/models/BoxInstanced/geometry.bin b/packages/sandcastle/public/SampleData/models/BoxInstanced/geometry.bin new file mode 100644 index 0000000000000000000000000000000000000000..999f962cf186e3dd7d49fdd4d6f3afc19de1cb85 GIT binary patch literal 648 zcmcJIYYu`i5QIMg6%iF*cpR_h&A6I7(Mg((A^fq)cAo756Q6koYNXALr6=xDUh=G! zWzSkz&Xl^+*>gW<^4-lmYxO+Nq|J@?BGP%u|DHu$@7 likb~;8n%HAEjzlnJN6to&~pmxxo~FS8aQy{&KUQ|gEyr^JvjgX literal 0 HcmV?d00001 diff --git a/packages/sandcastle/public/SampleData/models/BoxInstanced/instances.bin b/packages/sandcastle/public/SampleData/models/BoxInstanced/instances.bin new file mode 100644 index 0000000000000000000000000000000000000000..0f4b2a8dc8f62c66aec9ea7884fa7e90505430ac GIT binary patch literal 176 zcmZQzU^u|Qz~BJHAaDSRL2L&!Hi*w4^8TO1Vbst literal 0 HcmV?d00001 diff --git a/packages/sandcastle/public/SampleData/models/BoxInstanced/metadata.bin b/packages/sandcastle/public/SampleData/models/BoxInstanced/metadata.bin new file mode 100644 index 0000000000000000000000000000000000000000..1dffc7779929e4cfcd4b849927021595eb2c6f55 GIT binary patch literal 104 zcmXTPFHp!yO)E*tFDc2-MP?Rdre^@f3KYN$1_llWVFq~y4F(9X<+^SMWZBP}In!2J Y|E?X#45&h=3Kj-VAj?#v`x;090FYN2;s5{u literal 0 HcmV?d00001 diff --git a/packages/sandcastle/public/SampleData/models/BoxUnlit/BoxUnlit.gltf b/packages/sandcastle/public/SampleData/models/BoxUnlit/BoxUnlit.gltf new file mode 100644 index 000000000000..f4bda300552c --- /dev/null +++ b/packages/sandcastle/public/SampleData/models/BoxUnlit/BoxUnlit.gltf @@ -0,0 +1,151 @@ +{ + "asset": { + "generator": "COLLADA2GLTF", + "version": "2.0" + }, + "extensionsUsed": [ + "KHR_materials_unlit" + ], + "extensionsRequired": [ + "KHR_materials_unlit" + ], + "scene": 0, + "scenes": [ + { + "nodes": [ + 0 + ] + } + ], + "nodes": [ + { + "children": [ + 1 + ], + "matrix": [ + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -1.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0 + ] + }, + { + "mesh": 0 + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "NORMAL": 1, + "POSITION": 2 + }, + "indices": 0, + "mode": 4, + "material": 0 + } + ], + "name": "Mesh" + } + ], + "accessors": [ + { + "bufferView": 0, + "byteOffset": 0, + "componentType": 5123, + "count": 36, + "max": [ + 23 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 0, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 288, + "componentType": 5126, + "count": 24, + "max": [ + 0.5, + 0.5, + 0.5 + ], + "min": [ + -0.5, + -0.5, + -0.5 + ], + "type": "VEC3" + } + ], + "materials": [ + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.0, + 1.0, + 0.0, + 1.0 + ], + "metallicFactor": 1.0 + }, + "name": "Unlit Green", + "extensions": { + "KHR_materials_unlit": {} + } + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteOffset": 576, + "byteLength": 72, + "target": 34963 + }, + { + "buffer": 0, + "byteOffset": 0, + "byteLength": 576, + "byteStride": 12, + "target": 34962 + } + ], + "buffers": [ + { + "byteLength": 648, + "uri": "data:application/octet-stream;base64,AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAvwAAAL8AAAA/AAAAPwAAAL8AAAA/AAAAvwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAL8AAAA/AAAAvwAAAL8AAAA/AAAAPwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAPwAAAD8AAAA/AAAAPwAAAL8AAAA/AAAAPwAAAD8AAAC/AAAAPwAAAL8AAAC/AAAAvwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAvwAAAD8AAAC/AAAAPwAAAD8AAAC/AAAAvwAAAL8AAAA/AAAAvwAAAD8AAAA/AAAAvwAAAL8AAAC/AAAAvwAAAD8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAD8AAAC/AAAAPwAAAL8AAAC/AAAAPwAAAD8AAAC/AAABAAIAAwACAAEABAAFAAYABwAGAAUACAAJAAoACwAKAAkADAANAA4ADwAOAA0AEAARABIAEwASABEAFAAVABYAFwAWABUA" + } + ] +} diff --git a/packages/sandcastle/public/SampleData/models/CesiumAir/Cesium_Air.glb b/packages/sandcastle/public/SampleData/models/CesiumAir/Cesium_Air.glb new file mode 100644 index 0000000000000000000000000000000000000000..f4b70f77e7303863bcf4c5efe8de614168d9e7d0 GIT binary patch literal 586652 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

    ^82Iox%I7D`F&Q- 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 z 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
  1. (DPqo&{B^OAyljjWA$X!*Id|dl;n@^m% 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%0D?&YME0K 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%0D7#T2IIBe_5RTA$z_mX*0zLY2)vD_V9oA^Y~rx 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

    rS-OCS}!dLy$p7f&k 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

    $g70G1118>8XM)He(cSi7NjZ1&; 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 literal 0 HcmV?d00001 diff --git a/packages/sandcastle/public/SampleData/models/CesiumBalloonKTX2/CesiumBalloonKTX2.glb b/packages/sandcastle/public/SampleData/models/CesiumBalloonKTX2/CesiumBalloonKTX2.glb new file mode 100644 index 0000000000000000000000000000000000000000..4b7580f05979d4ba1f998f59fb262bcf5635402f GIT binary patch literal 453512 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

    *=qi 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≤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≧1$ zEQ0qxBGg&Sk-qi>^M1g5rg+74^_b;UVZY$u^8J9n$`TXwnYlP|`$5{Bg1WvHEE@00 z>m+KoMw5=#w#!}COC~H9S>1pfcqP6w;NfN1Nm~gYN{IL{)^G{GoYMT=iRvd=_NFHH zr9)T#Qx`XO__}h*TDv<<1MC-VtD-MXEWKqrPq3@cXj%PG5BOf3*LG1?*!y_etE^3c zF2pN@SzHw6)4$cU?|q!khZ7VHMi0aC(`~QVJ}7Yb4O~3~`XU~S^o>`HcZzT5iKF6Y zTw*0pAI=E7OA^l+XYb7s)ulQsLEif&=WyD6O8|%`uEUn=bp%VRo0y7nfLBn*c5zQ) z7cWb8P*&GWs>*IR`ADJY_<{eBr>KiEX`x$e{{(lmp0|AnLH=cDKQkh0X(|Zz(YV)o zcttx6-jSJ93C4ANdzDNufgF&{GeHi8*LEZI3eK<%JjQfDe)W3~AKQir&gg67-wU|H z$`i)BoI9=M|Hf-2cJ_FoE1At-VY6wWqB2kj$SBs-WKr@-z~I$5J&V-_FZU z=eFT|aeIfXKYdFiO$TPkmcP}JS7V@fP_zuvag-zCG9 zhMoqgIv2W_1O~lC&bu^X!I@}xcS?UWbSJ#tt0Gz}#T&42p=^^TERR}|nfG-L9_giu zun`5*r$$$U$0V10Sz9Qhl2BGi_~?rpKi|=l>XjVN*n0*a_WJ&lEt^3}mt20c3m}Q( zTv>NV+%8JX$jUEeY?6_(nx9$@0bXd#DqXL+`e@p4!0@)=T^j6Se4t6tYLEttRJWkA z98Tmt6sh#Ap1N__Ehr%9e9*jkNa^L+!~`{C-yQ@he$mMN+Z7@_t)Y;2Ie8!cU;_)m z^$PN3Mi7raf)`%E&GmfBuDIN69*V05;?#nL`Naqrt)sWQYqh7R@ZQsJjPYDkZvNd< zx^&Nbov}lOa~9@htEKL+ehcG>XjnfRS&f9RQdtk}CAThst*=R4mlR%;`YNg8kPJ5f zm(sY^VzuVR!#0(cg@^&BAuR$bdOx)BMjSAvNG8X3#NS={RYGn|%X=EMY4crLRnKsX zRq#1QbM9Y_F)*j-1g`}_C{4Sls*V_r z_uVQkj?@L&*ecZ!&TrMjxr=bvbDo!-GLONB_#fM!Sify3}ka!6U?ur`i zi^Ub%W?*C@5Uh-oj%VWVWUq-vk!ahs>M3j=tD!x%XZ+kv$?kV)z=_DnqANS|<=TcAmC>GI zhi|@$%oRgAv&-uWvmY*<^gbXjpgtyMMR{jCiiX^m7qeTYy@7?hJUf)P71MWnRuy+Bnsj;7}27+ zDBQ&aV&a=#;0v(6)|7ZiLuv_9)nWJF#XfEV+vXUbG+1H8?O5a?ShSfH@wf95h1H-^ z+Km*>WImTh!UwUfepUPD(^A*D&el@1@g*sN{~qn%+xPEbZ#NkX`{p(|Z~gae|J>F8 z-jCd{p=m|s#lQdT$46dmla>0Cdg|XxUwbF;5f1PaE(Sf4{{G?rj#93tA$3m2Xv6w3 z|NW&_NnUE8?D|hXj`{Ct)L)bOGrw2n$1(r;`&S=psjKA8zx;Cn|8taSU^PbhDgNIH z|KA<{zKZ@oEeX@@h>cQGn;M*KZT|Sb_59x>*Ytl6;98LRzYw<;#{X|geBXEeZ%O?B eYe~$SXEK_+T5}0;QoxUsor`Vh@jq_>zy3cR56Z~^ literal 0 HcmV?d00001 diff --git a/packages/sandcastle/public/SampleData/models/CesiumBalloon/CesiumBalloon.glb b/packages/sandcastle/public/SampleData/models/CesiumBalloon/CesiumBalloon.glb new file mode 100644 index 0000000000000000000000000000000000000000..b494975d143632c1493e9f77c3d0259f8a423f37 GIT binary patch literal 712168 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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 z zFbkifc{VfL!quGR&TDBc3?ISsn+ki?&unWCv7NTCdMeLpeg~`7`%8FEGmkZU=bKVm zi)Z#$_x&-?v)8p|@BTc`KHTDn2%ZnkZq44$c%J>_I|+g?1L?yJ;ZZx9@gy5J|4Zl z#og{@Q|Ozl*}DPHvoEk_fC4=4R??ci)27X;pSEU+Cp_=wVa?vda=7UM*6fin^<5#Y z*}D-cdZye#n~Z zhVq=+8f*66&-3iR!hX+zk9n4Dt2H+^R-TdkGZ$6jnY%gQ=NNR4++F;{pV{dS&+(PBu(TV`NDg8a@ubN2E4@&s$nS;jMxe`b=~JdZrU!t?N7GetpbZt2N0%YWvO%RGbJ z(&9}!&vO33)e=!7wf`Ts?{)8{x$=VIR`t7I;`z`&eA-}pHt~le4zClMD|ZyKc($Z( z2F;ZtwppC}k>^tX@a%1#U0rSQ@8PZcZLZw$ha>jq@wB;eM-po$&$w`&*4moMZ}9x= zAMQ9W>v(Byk z+4IoE(oYJplccbvvFu@Q$p%Zq*~DHH8yb$9+Y7T7Wss%GoMq2R6H9MN<=a=gVQDzt z>_rilhBJ=6D4i_LXEu9Ox>*{LWbcaI(vvBV}SYOEOCrI>)Y+!j`tbDLj!F zX=(c*?9^&yY5RxSskPM7tlqH)<}BL2(r|*Peen>?1b--Ml7gDkynJ-czfpWk54QRQv_>fV+HxQksnNznF{ zh7-U}Enl=mrQu9uCy&k2_6M+2>$;^qvRg}EW@-DE*{OBe(letoOw#M2?W@^x(z>yF zEV`&V!zN2NKo7CB{hjR8Dq?A>?AFqApzSLShi7s0-e|Mxd|iQk8XqiezX?0F)}YNQ z4JVX+8b5MoH0SWW?9^&tY0jzGn^72TUuih^*r}Bq%~|OQCD^U8675>)50%)PG27CO z*{!7)Lt9q*fIE9p8lp=p&4JxoVu7Uzmt?=kOG{gxz+Mzj^jmelKFJP{36=)JZY|v# zjaQw)*{!ALMYB~i`E&N7?6!2>kL)jch_0*V^IGgh8Ea{oxNPT>s)cz((WdZb8($38lrcpYn%9;m!8Pd!7iS6(@&u3sd^Zj z>-k^v#yCsU8^fL)*LlO=(*HlO_vQ)uzp8;Q?8Yf=X?^VF`fCnxojs8rP%Kn^Z z_ywvSvau(}!_xgSu+PL5!^c{F1beweUP}*r$bJ=nOEav?PL&Fl$5EbLE1{N7DA})K zx3s~f>{MxBX@(y&XAq+;ovR9rb?1^$TA7(Lj#G7kSm>5zWxds%IHRSVh2wFR$A zeP$#3xLjvf*Z%Egd2^{cuhM5(ejGcx{_15{9H@oIr*NP>yY>zV!QMQmd{m>-EsXa&v8rgwR$){m+}Q}vLmi%+sUT3 zbA}ypwJo2zHGAY-u`VM%rouX&JNye9gYi8THZEb`pevT1v3%03QH}LCrG9&7+1M}l zec*3Tjc3<%S4^H{`K^h^dg`vYUElI^y%*%yH{-jho~p(^x**Hjoyktc_XB?Wzl+(y z_|o#1)0Ql*M_T^!1NK8kS$=US`xqZtUhpJ#Fs8Nq1o($nb^wIg|IU@h2_7OU^k{`?cbTYMeI!WwLE>bW7CgJo${Aou`_wPl?_Y91v`^hlO<68aus%acCs>czU)kXWaSgaunY87`0q?z19m3+S~-U|$4=>`cC9vN6hE=Gi!XnU$&g&d%gjU4Lh3cs5SoU}bM&*!4G;9E-}U%x7m{O)K{@ ziM@^uth~*5b^vxJucCZOp3l?oT3MGG>~&mXWlJWqxA3~<;r3>)V=F6vGM`5Y@~5*wMPq@`abN*RdcO66Ha!V$bSCG9k+QYs+58 zL*z!3KN!R=)-2>YRG(gBhw5`H?-9;!)j{MpluwtH{f&36j0ewg>I=wtC@+uaKJ}DV z9;3*Fq59W^FjG7I#eURK%OB@?R{gA%2T0EzPS;tYC3ygKzxJ|+({+|;VfpMKcgN|c z@ZZ&S`*F9me%{InoM%6$>x}W7oPe4oc&_)a86%aIBVtFFzQ@WDwVjhvUuWe9wzId> zb@p(bH^QwfL1XrIJ|;_`@VO-W5?%56n3Zd4&fd;8WC;{j|I2-lzQ^z6veeJN$WF*~WEj-zr|gP!omXA^ZUb3X)pv(O&*~$|uc}^4_U7nc zJ?PrM8LixAZT52KBipI6PpjG8J-6lWtn3PQp?`j#+^o0wD>w9uJAY?5AF`u64>?bj zRVc|GZ&$3S7M0J`lh?3c-4$EDjmT?a%U1TWyJFF5E8qKSVYKeB@}C{q@7>qRh^ign zu9&vW$_YY~@1L-tWOyE>!LP z9&2SsSFs!16>kSy8RqNksCUKWv{n|nFT3t<<@lYE_F)IUD~1oT^3_M!pWl^ywc>(@ z72WiFRvtTqefy7%-&yPK?9!iQWwXQCy?pfaJNyHz9QY*m{2#Ki z?O-OQeI*S+PFt-R~Ihv)vZ@KFp^6l+jYAV0fD|6?+_K@cwzp66Z8(R7PwF7)3`Bjy5 z+?UQ*pGA&TdDgYq6W-3s#I|7Pc?B}tDnH}TPX2P_T2=ODb@C*787o7(v+;C&7MX38 zrJTl2{-a}h2$fw_d)If8*;W}L2Rr#A$?mFrquR~hoXob$D|Tcj|3vb@s;^&8JEupH z*;bjxW9;PbZDoe%vlD)$l|5Fw<@Z{dWVLht1leqrKa}j=Pif_x)gJpHRyKP&yZ0}> znQr!)+I9c0mCaVW_q&j_R{f}U>36Z7eb~a^ws_s~vH3mA^S1+Xa>h`+-<7|W;5rW! zv9k1c`CAFD^FVv@>gso|%-uB0e?!4_P6!|~ zulRjvkGA+X!_0fsguk0Gg6zGT6Fm6a3a;~m>&$S2?7g~=Dfrt8Pb-C*_v;paLt&Sd z^;NsvU9tU3heBqa_9J`gt5{iOwTphDl}{eR{`qh#x15r_^sUG$t4y-mMgP#sCogCJ z{A_Z|>it~or7vh@jEAv9-jzFgkzrP!*~pIiI#!0cZ>dA#|Jp_WwevPD_3<`hK;S+t zTZ$#NtfhL1wP)?xusqv>itUDb7PyIl+9z%OkGdi*a)UN~(oKyVeCIx=BeV-+ei-T7wh{U5bM4E$t2=&m zA1zk;3fs}~UXCrjM~PF%FWGt&&oBFasUiw&+wB;bGLziL@0D)hC!2_SY`Ae9>e*^( z>vN}&+1G@Kl=fBHlo!{GMAaLJZOe{o>7TjDGWQFMxkcPX-GEz0rS86>@QUn${b2G< zgS*<)v=v0^laGv#fzPy+=Yz%73GUM4M-8pqull0*`zJ=+!Y111ORYt0X*b#8bqZVA zYt2Qx{eiK$Q(oJR^qoZ3Qc2|8pj(c2yIP1%`{Rs0FJc_c8+H;eQ-3kG)C@OnUu-P$ z47hA;IWWe!f1|BvT<3+c?Au9W-|kw%``HQO*WBYq^6HJny8U;IXSI{aDX}*3*26F= zBuXM1C#o)0UCX zqo25a=&|wqMj_cVOHPrRpEJl=ME2?EBdY%VX3PpNEbCp&D6+brGrIIECKnIz65g%T z%L6rY%8>&yh&vC58L7vVke^GsTsQomPaeG(^ zd17@1akBkXqpvf+Oj)ji`0}%#ac){(>Gjek#&*hLr0!5m?im*#<|Q3$bS#-ox<9Qd zp3co_v|OB5CZAkITx>Vi__8U9e9@zUm}B=gY{A*&(rUFt&Gl1^64y@{hf9ZvLk=wIx#y#k+K`l7t>>ky?Sq9*4Z{-MQO_SGsWxwy*kR%M$cV`w|l-%Gx_>U#Q7^Puhs|?*}@j^L^UyXfG};Tz{VwAmL%`aXi0v!pPsLyXcgnjO_+BTx~=T z5&GeyEz$RrM!5>z#MNm5woqy~SwJfh8vfDtf!c2A-$FFYyw35B`+mD{OVMWF0!L?R zqw3H)LjTsvmWy6_vAL#sf|ml{)5xcxKU zagutQxv!e2R-(DXL4EE#W)mem4%voM^W8i(ap6~x_LN@O(JN564@sr9qvqGW3K0Kw z>!%H&7b?6dCt|>voyTSshUxn z*E>Qg2z_h;M?}>^GHgO6(X?A%ZBs5!nY?JQXu8FwwV~I#*RL%0HC?K$ryn~s2ogDb z4r^(Dq?7e;28jxdmjqp|pI;_qt}3?W9&4=N=gc@zPV8QsL~iHj)CtTZl6>@*+4+3t z#_l3!M}%>P&--X)#n{NcQITM2T#@^>vrxqL0Yje4WvPd)=pVH<5E@gmIDk zxbIqP(W`xb6QlYEb`axR4m0xDZaK2=9wgpOS#MmVW^PXFEAIF_HF8i7O%AmX=L*Cb z_o;_+PwR>+^LiTI@hNN%;)jR=PgfcD+vl|v9@$S^`yNW4*3eEz4HWLX7Z_OMiu*@y0mn^TdYs;_04v;~@3<))poLA0#$1HoU8ixzIu6+t(`X+M&^ljZ*aQjFE+eGrF9X9e#P~`9k}) za-Jg#oYf?=LrWh%-&hYPZme=!E7c~(aMJsG<2}ToDoMp#xHT-%an0LtKzj|h4m-9* zE81j7fG1p;?fn$nl!ySw4erH1xzE}nx&{X&hfmA>2n=LVi0ume80p(s>)I|bC@*|E zJnwXS;=(H(HR01=rQX^Ciq$rbz{>+CEzu6WY;T<5^L^H44$3uag^`W#7V)%^Rxn$9 zl;UW=Nq^4zNer9=CFrce#cOQ&!Wud;7_9+>6Ym z7HZoLdCAJ$iyIG)Xvfo3lOEi=ovoj1Ne27Nblki7aqi-7_qy^RHIT1;S~1RDmoLGw zakKJLhjnEGxb@xRtRlxPU7qfk*S0ZDVUhQ9Em;#>8XD*!E|$>b9k?}1zarxP?O>^D zxcsB6;@g?>GMpOrD&iwntqYKQ;nw%X(u*9ueB~|bdGC@uqS>#K@)h_qZE-SjB_Y48 z2`(KRmRSUxEiCJUGY3z<*An;6B~ybxpB|+YAs>BY065cl_g&2+!c(>ce>SvBBucz3 zC|`jm1GQ)^dPH_P7@Wzm_qn#$zqlL;o}^2%RolBEm+TDAJnwQ%D-#tc57Wz){g!KC z_HRa7aOOZlY7qra^rGKi$aC5(-!Fz8?E3d)dhw~m1(RF%bMBek!%cPuf8zG07kSPm zlBdDCJ>@;b@X$*}R=9Ov?mXhm$z-w*_!;5vCEkpWGaAFK1CA6FIcuhoKfze9bwz}G zt;a@HxV3Pj;zAtFDl@{Z$M^dS_X!`2Byj8SFXhCkZMkJNdb!>QP0WiOD}ET^ybnc#l)V>spW>?CR(zB^~74QZ-yVeHhij^*u3bw zF%)k7p429CrieB?>BlOo_i0|9XN|A?E|n)&7Uz@9GXl7G#!EP2X)EI~_w;1b#-c&M z1S1>w&i`4kn3q{MTBv)vw5FIo-D&jY`t<#`yolVo&p5<2?5X>SOTm4N=G;?}PKYNF zUWSc(-BGJ5cAgF~MsrUm#8nU#7TtAx;9lp`g!rf7CgUjgDAv2ESXgtF@pE(ux#LC= zaiDx2qb>J3=zT@8v{pOESZbg{SzWXZs~WYD`+jkJEwQBc2S-=#wa=ESqRhrs#&GWG zTi-IGPorgyt>E@>G^moH(`=c*ZQqp*#o!jP#yL3XLC5@J`m5`PgmPT}>berd$uLzj#~)KkWRc|^C~h7k(a z@WuC7U$OAp4C5xe@bPJR5j`idT+jPeb7c_q{r%+*zE7ndPAx;pnkJ7-jv1>p*1ijY&S|6q{03 zGd_Tg(XHG?*-AHU=irwb`!b1<1^w)q!O~SFzH5~@-{s&ebE9xN5%jc?c@D}yYlS9O z?=y;1^C#V+wUwV5Xdl4sT)Q7@?ng4)70ySzY_F}Kw8V%6|GO8ftsSUx+gJeycY2T)JTj|tpnX>9w~os2$gaXGZH`?*QAzo{ zF)P^aDACx6<>$9pxy&&-v%^RWkDOdN&$jF67ULJ+VV2{7QTqK9hvF~KqdN{3$bHsf zhdVYM53towblmXdcbQ%#sl1iztFf2gx5cYfM%ElJ%yU`5@p8tj%$_nI*Qc(VhfyFl zqg3azwg1H0d$rf4Klh^G+0%iKGgp+=xaMarKDSM~&_RA=20n8?vF6pSl}y6D+p@Qd zb~0+9d_xT+{}HPFy471cR1NG}pxuujB2O{vo|@NF%Qdo}Ov$;d?bB77$L>Kg5p&C! zmcz6Q)B4J;)Lylz>$MQkM~g{;W+hPusS%rfdSv%*~=}C7uP#OyJMlfC(BnA~o>j zZiJT>lupRj;LMfaK3XwN$k*UWrG0dsN<{V#3I>C^TDOCeE+$bVb!X2|~uF?u@sVX~zCx!ZauwC^oDkH(A?F~0++a~3b z*Ep9I^Sz+G^erO?fHR#ouF|^ce)7DUleg~Ew&%_x)4&}&LN94O{w**60UQ6F?$m}J zDJa#s?CkhBt;*!eGRbD?a;+ic?_NO1)?2Xq-#MPEl;Es1Q+{LL4?PYCx)>b@T z^RPFRPv8zXMBE+IM!tbNF64Wpb=}=a&gWd##w(pjKBJbLLZ4QBauOY*kStF>t{J^p zYkd8?QG|Y(^0cDni1(03n87l%iP1`}DV@_<8!hdA`ndwy>D*?OSNPJ^GIL#V#=XQTIS&FvMwBP`_NM@W7mSRKCcJ$Hnj4& zGRTea!o@j>#oB}v@;3Ni%t$BF-1L>pczBaZyR(qNw z&9n0I9G`FYZHBhC)LO?nuwujZrM4q!E6569a&hleV)^-CnVG)+dg76m_;PDmlCyyS z`zMF|;LPIODa65LM~$!G@Vpn-wABkfIUL|puaudDHvWT&vG4P=*Zyr@T&i>W z(UfDg?zUP+O7Ph??y-g@Wn=~erKV;ZXSoto|q6E=Td@BjkryDQv#O^BJ?sjF#(}^ItZd?&x`ExGct;U!qYa!>!gR zc@wO@KBK#1K$(HEGgzJFW-?>cpuut)SiNL%b%$1=o4gBFC;RZx5i+8Oi~+0jr6}WQ z?cYKwo#Dl}kB+1Pt)$W)wCMqk4>M~^rJ-qClA)i~l_|jLuL-Rj<;PT&I=!5GKn|mN zm+G9 z0~!R$BlPc!CQFTuUjk(+usYF1FWW!$EAyPWmu$Y-W^6rXlM+l=TC%zA=;{hG7OZ~q zG?VsjQ?Tq$j~6U|F$gWgob%iF9dFw~?3_6Rh69y}Z_H{z!QmtPXi-xAnNvPc{Xs3;0*k(2Qguu=@6_eYSLmhsvg3FF0E5 zucqDXI#hbmcRLoYwLN(>Opfi4%a#yPUF)=?y;K@n>30KdmnIC9erRapn^(~yUX+)m z>9sS(P6y5U*hY3`j_TRTPrJ0hO%?*fbLQM;&z5(9Im`XJx>&oEzLP9ZZKQNO&>CH9 zE-zCv>r1_zkJE}_Z+ZL`*^sg^x=1$=s!n` zztL9Cp=Oc{xUBhIYAjb#OP5l8(LAa*mglIM#LrG>dw188tEi)X*sj-kfx zXE(HQS#rt*YH!$~$6DtJWu=pv$=|52mVdaPIRngnI856*z)SX|_M%gs)50!hlryPG zub>lxR86{k)ka;G~a>c(g&X_s}I$th=A9J5V0P|oC$9l6J91+}s!k4)PUp|zM$Nv?%QWOxBv zilV{t0N-a@*S<#Un?W)^-)B?7!^VfqRpoVfWMIQ3_SxW4MsVq6`zWm_xbz)d3dYkw zOOR~6C+ncCpqcgOZ4xDrzead^y4G?@j3oUZThr4eVX0V zFb>d+?}LAWUn14aru-8xdNT!>@5DdpPv7+h^Yh`K46^#S2mZ-fF#kH3 zAB=yZ`f&vPSPlQg1AI6NK3x9Q&)5OxX9V-R;Gg^gL)0uf0skZ^nBM}-FE}r!@f=+G z2rk9rpDY0Lm9{ew|KvW{l??3Kv2Kdd6wLn_lSC%PKY0Tl)&vhH`_D1l!Td&Gz61Xx zIhgqh%*=^@(gw`m3g%bvuVg43z7OUnxwhCy3+8tM^Lyc+^kCMi2j*YFKT()J5X^sv zf1>8GFfhM{=Nv;}ehDyt7XHaH<}0P`Ji-U>{A3Gau6V^<5q+?umYDhBBlE+tbh~W(m@9mkD?T0#&~Cv&>G(be z@J19*<>WiZ;C0Mqu2_NQ?1vvxmU*M!%M`XL!}4j#nJcnWV?Snew@qQ*$bc>}sD37` zJ>1s~&H2B3c1Jq+u{76eIbO#^=8d}4-n>QCZ3CG@+EJ4p_#rizHL%;N@T3qf&SsNti?GQj=@(Ls~JPe56)CjQeOy%^afi#;OUe zYzfRKt*O=Vo0Dl(;QB7y_Xxa^*~|mVfAwkS7f*L;7KZn+p`9x_} zx3e9x;d983)UXG>#}?*|LvV+G$>xr3%p}RE&)|t(j;+?*a&=HDtq$|d3~GB4uU2VA(I^xK{^%DQ zbO?Rp6LbE2bp5Kwwix%pTl5g^8Jfv;@VwN@Wwu6WGRiBThc+LLCbJyw@WvlVA024w z@R?@?2Q{_ylO+dt1gy6-nV`ynK{0-B9aX{qC^Y^i2l59c0oyCqh>yBy{MLLnpz)7I zBg)Qq&WpysFrk6=l<$xMU4Q)d-#Sm-v11&KIcIGE^Sf?e>NtnKlm^T{S~#7|Qst)Y zD8E;oeVOE#;(qo_T!+=@`Z=Sb9BIJ(w4Zaz3TRfJ`F&5J>pw*wD+=b1M%O=!4yN?{ zo#^^=(bEK&e+*rJCVHCkE0dw?D_w36m>)+iPeYgcM4t{t*UyfQ7l4lUxmjJg0Uhrr zI$ln6eFu8rDf;eBLM>UPUlG}fIe!znes^@m+4NT=y1orvaTa}d8(kkAU+$y7l&*gW zjWL$K%Yd%mnzQ^T`e-1!{(jE*mFcfIbp3jq<-_Qs`sn(%Ipb%cztW=XSL4iHk$$O* zuCLDW^}zhx==wgK*_EDO6qwD*i$tcXvgsy)U?KCTx zUk+V=GMbFS{Ab|nDD>4JaBKm(eju7mCounCbp0!6q$k1rQ|S8j(PaJu^CQvq>!G9i zpy&5S*UyS3^8(DjhpvAYUGyuOOzH#PvLl*Ia`gO;==yWePWyw~o6+?@qJ>UC3q6}T zwVZ}ts`QzE(DmOWwaNKl{vLGw8fcro^x8qUXv09OImS$t4Bu=#dXA0HZ^v_+Z|Q_@ zl6z>+&;ykQ`|qXaj^XHp1*yr~@u#D5pa-U+_Ac)2VzfXfY)MTHf0Wp$h(^?a@3Z&u zN#hneQUQ43A|BvVbi!}c&x>&sN3H@q4yl@py@(}uAT55H})b&REu0irNHQc4mFe428P-#m(&E&8FNg=y54}!#JrnUXN~1SsrM5fZdu&ICY(~wu%Ay;U&>NLkwGDrx z9Xh0{`2j1uj2>u!XW@|E{yV-$LG;N_^g@e;cO7NXA$w8t z{qQ#$qfe^b$fD48j;-jBDj(7f59A)Y(={-^D}Kc{^u}(~b}0VFNi--2_$WmB*bl_j+Rl zT9fj)hc#U0D2o26ymIe89~{TfNEK%_US2f{??ft1Y;B!swyRIen`eiR?=y@FXj$9% zIWc%0qtMXS@^eD`{iV{-Qt|opcpbCRxZ>d#U%ZY+mcISscz{FU%NOoNbMWQ__)?pD z6b;^>8_LXF|L0'zOm*Z&CEGZ&n?#XbE7ZhZ_%BY$x3bb1#(QFi0rEu+7G_Vkr1 zFL4z-t4!a1pf=9X$I0>Il%_h0KK7)yE7Rku*O!Bdv#6_?VB|S4aV+~#qkh90L5 z-+`%1!O+pvXCpB64w%~o>HV;gKqTZXK-adyrO#iI6N~7yii(PIQTIGyl4Y%q{DC7t}q2` zaW7a;dc#$pSBHp(_$?RUDwSvZ2kxo_w<(`xY2}-?D7Y;(9JjxOpZy5@mk}O}f)6Xe zoyymE4ws$+gA^8(1CxT`(R1)=yUz`@)`bxOH zu;s1CFUudKTYh@tPbcjDmR~k5puyi03=>V!qha@^?-kH}k>-D<{y3dOXJb@s2s9A@j&=W)wB6Y-DCBf1;e0 zjNkW#=L;i%3J;HfivnD0M1SoD=Q@LTiqjSTEylN1=eX|RTr7Ck5ZtQ*{@EAYb$kKG z3V>(Jz_qd9+eC0KUF~*`Dd1QO@N5LQ)&YFOx0SaRRgF>@qOjy2a83Cv+rhby__iIv znL^;rMzHcAn5q1hd~o?aIDIYL?g`!v0{6aye>*LIxffWw0xnO*}Ze9dO_kgR*k%wtU-(`mzcf+qG>90BPZ5`&_^3;E6 z=HD-^V~iNM_yC-opIPJr9I=Vn#FN>mDc5rgvr;fKQ+cj)A7-c+W~1?3&-=_u{>)52 z&FdU(tY+3x*JlB<&n)I4H?HAU=A-|ZnZmfv0nAVnn5C3IE}5=rbbf6!}sf?a91?Y6xnADfbV z?CYqxL0!qvJ_keE;31^THrwF@qt>Gvbz6Ggu?CEaMZ4ORwS@gEncIosmjYLlr~OHu zHr`h_PE8pbSP&45 z8|+ch)__s1(7lY}aX~6aGy|U@qm?VWi_h=@U2Gi~wF8~3I=b5)ey<0S8w>+|Eh`u` z1ikGA`dvCOY8iUo`w>Glb?yj2&$~<>vH%#>7Y#3(oMaFf^$Bgy7S&P9$Bb7PJzyv~ z$+Ymxx0o;)&iUVl4sZ}Xpf|d}Pxwgb1ewV_O1Q5C=l)!r|4ZNn&qNQX-zbw-8;t7C zxqlqz|DRx#@)?eEo^K3B{lodbjlIAmvvyrZ_OliRP4{%tgD(oWygEKhk$R*vuS=uAnrgRAAITG^ZA54V}QKYG@BR z(3sS@LupP;&@WVuNa-0_9NtDia5kwlr|)PSHWefykz$Ha%iYLho<8J zrYWD{DH>DCj=4;qAq<^pHkcNMZZr{%sWe)X(wt(@bN#`$W$3$I(3l1>KTJn+%AWIg z9{vm(Z~_{x(sFB|>Fz|6Qu9Ux8r4j6PnAz7gnw8XeN(6QN~3pveCj4kQjty}(3I4w zKl`vap5b5|TXXasubH+0eF=%eq+Dwj;{W%ERPYl$9LgmVXZX1Qr!oDoi~E<_*w zj86IwHM|Vn^hN*6hRQ9xMIYUSPI{IaE{|^78jUXr*FVvbp3;sEsPw?Q=z?$2NiS2w zN;mbl^5;(U)XU_uw;{JGqSwy3<1_h^l$(I1tUk?3hvSqA-7&AnyN zQ!ApYD$VKvI%{9_(>B!hIrP*YV{aQ(sreJ=tau(q4E3fo&g6~y8Y-*M7fm!j|875O zz6Uz%N%Yo7^uiGI*DWc}8S31z2c0#Yl~?bI{(1;qRq=8jbk@UYOgF&)X=qN{&`*0( z+ZoVPJ!3D~@2t{KW1^z3|>AaQKU5FOd4ZW!-To8@^RBCcHLwVn;(43YwJLXWY z=YW<(qlq-9~}2pTO7^c(iZ9Qa`YCDgN#=aM%aG z_ac7q18}wxVxd}RafSOs_JOU~OiTHMhtV|BaYf?u6}1|%&JXID5s z7@W^HYiyL_j{a~*&3gBPLg9{~aL2{WC4v;!)PQSd9Ncd>LcrTlJzT?gDOOA2)=&j(p3GiJQKE2YcKEjC&@#7P7 z9V)}2Tk!SO^BrIDD`w;C|Kj)E2v;T}A5fe=T}z*~Bp;y86b0$uP;v$t=+pi5X_}Ld zG!OcBA^qEUqPv*OeEZ^OeR+?}!5z5c27P)8f3XOl6Yv*%ks}JG z?+)NQri+hp)TJLE;3KxS`fhRm%bLnjr;BYX>)|6Vfjc7UuQd3Jhv_>{`tC7);amFa zANnhmr=jWeT}}Ef2ES0{h@$AD+4zV`6V69}t;82BO&_hHk4EDcDsNi#SDM3*HRV&( zqhGS(N2&~}>Z1nue~LRA(=T7}1-sKn5%iG_FHm`c-Kf?7@D7z`@x zR~z=#cF~)|=*>EK(zoD_Q*g&V{K7u;S6ce3H2$T^5#^wlFW^a=IU=~@Bpzp1@F6ky z&#ThZrv2^2HX)3E_od+roDkX+Q1#t@oR&@ zF6CFe$CFmxbYi%pEuQXR@bC+GSfN}c?L6F38}6utPdtw2JIa8WQ}Cpd!5zx4xK0*C zafix=BwbNmd)FzK?Gb)OHS!{T!0K~g^*TK1F`O%J!X0tsKgz)cOW=b3c+&kW?iiM* zy;hoDtHzvmnasxtxT8AUv7q?rAf<8fe21LVKFY{VO>SYHsdw4e%ng2HZZT@lHoU3H z!OSyFR(*10wC0xHQ60@pdlBZDmw4oVxGZSVTH8Z(wmA6iI5~-B)MRqzncUAKGL4%00>kzn^w1^ z`px{i)ciN*r9Ck-9qO!6i@9i3{~U($HEhgFr^!GZr{0tY^47PxO+DYSgV|m`pF!Vvec{&ZzT<@<3kWZ7a=cD%>%w?8Tsg z)VA_B*5h;UhdbuO9na?{1dfC|=D`d zV`?n1--8QY!v#a}%M}OBfrAd>({JPF)P#cqKYEKqeEvxzcll#`gr+`U8Lrv1yKkV% z8r@?KPf9MZ3;&kN3GQjM%%(ENDyvm2bebbQ|8FVIEM3VFekYUW;GFA0Mo{@XKRCng zA$O>*VMWfxJ^!m3=-_)E;ar?R-fIot=Y6cN%=dkUc8h=a2Irl;rrnz&=A&;(M(Sr7Dq#vNk&sWL)QZhK`d#dB~ZiX&>v2c?^K?` zLG*`4?fYvH)cgSSiV!l952@{{lPk-Cnnda-XLG)v1w2^saRnIcx@vM!^KvwlM z{d)r~rS8I>TKjh?Y*A=0ANRy-Yr(@;=m0&*Tn5my#n1}8$h^))lPQEI6HzQ)ivkng zqYu0%TlorXbVt*RA%8g!{H%ti_v34*_WoN9?JYV_Cvvn-FehnTZyE3?vDN_IY=bWJ zirlT@&8$indUrZ7KbSTG9Vt0k%o1Q}NwkF)`5$Rx!P`CP4+)o^+myca5Pj(w8BGnG z9Es*|jm&f?xcUuGAePK@4(9d;_y+xwdl-4Z&y{Fa83xAM)w4N;(X3R4Smif%p>Yi- zL#$>Yp20B|kTX^pwtnbfhsh|bxu`iB+N&oOwUS_UTQrTw_5;RGOHb?f-!g|f&u&L^ zt3qb_5HrtMG`(tMrX!enR-@^a?;LD*W9BLJGcf8$`CSK9&N(sqTip)rRl9f6aJ7;ORR)14xlYN$?I>X z4vX|FB9D^$pF-WXLW_Pt?q7Ky0cg=G>%WH{Nlx}Z4bK2L>4mfC+Y`vzD!;o1`uQ_5 zxFPh^8uasEvbGBUXQP?p&xthj<72e+&SYxU%##hR$%m|MTl#t~8WjGVcm~e<BA75`C=X3S`{|}*Pp)`>_MWU=(!t42@NJ&h~M9NYTl?tU4*-B|pLn)MK zp)s;X3NuexB1>cor6wg33faT&aX-uJ^Q_zV{rl@&*Y&*4d7b6Du5-?HopWCA>Fn%4 z+4+a$Q<{-gCS<>Sp?pn>&xOS4ZkB&(z0T1-Bzw3*{-s-Vb{3nAPpP=h&R!~e_=F#9`?dA7-SZA;MY3SdmyL&(Y-?X;Tm-RF6gL!{y@IH5xUp3 zO#NI@{=Cn1uj#brl-K0{TdX@v_#9r7KksMVQ6cWrL;kr|x@Uqv?F;$a)Yl>Nh|U#9 z({$g7d7+_vtG{)*GGu>uhx~kRe_b?OBAY)<{>4c5oeFC%cvZet#jrx=f>rX%&d@!a ze3}b%Ha<6BjXL3D`rWGX%TCdKtve(?SIL*TSofwr*LYnmALoI&djsOUtK`c(s(W8| zN)9V3hVzf^eQ}oW$m3TG++1Vib}69Qp~4Yt7hR6%?o!a=2Kkv zwMuJV*sGY&wYt;wn&ySWiush+-MoioD|Tz0_Vnu&Lhjm(Qp|_De9dKB7AWR3UU&Jp zQ*-#4y3x`aZv~}fi{4Vq=fi8Ng?%NrV-)i_btVXlNuGaK%xA0a1maiWEWxOZLSbXc zbGl+ag$pFYM>Q{GD(18IsR95lEoX4A{^A!tpmvXM=g_jib$<}?&$(k2RD&{lw#VZ$aH?yD4W4v7I>&BPJ zhBwk#iv~4DEaFa0cb(sOx7NV~=l60I^QpVMkvZc%LFYZj=?*7nyi4nR$St}rT2l2{ zt^1?HbQknH)!}8ue5U^SYT^o&d3WxthA*Xllh`cX+^LvjrtXfO(!4NHF`s>9P6pG| z-e(l^*{nOL_)+g)Q7;&;yR6(fs&a10pr-D!9#j9!>a)G^qq-B@Kx6U6ud5gC)ScK{ z)#t?(^BJK#w0|nrvu|g<+;X}@d!EK_tYYY2=`Jqkw9B4um3#7sC&K+2>rBPUf7RXH z(g)8?OjpdOtnTh!qrGqk#e8(9CY+`9$!NuV*69v#BgtX9Vm`O%F7ZIg?PA4zbf+fd z%%1Ml^&{L-k_Mz zJ-UOJDVuh>W#^pwx|_#d_+iC-HtRm#N3vH#yEb2Vz3$_+m92YFah@`|Q#V*P>RrVR z`sh9$e*T%dpSSMriXriZj}>Pqt^0MUvWssko}f5&$ohZ1;t4nDu3aej0>u+f>VDm) zvTqX=H>jbze1$Z>ysucnce-nLT()k8?%s9R{lg8iMXxAcq_t!CxNOA>iV-Q+A0B4z zP+aJ8-J?DxTXBuzLb_iQvc|heX9@CjFZxyKcw@zamS;T}ek@&Xqgc>Z-E&6Qep4*y zeBFP3nYEeXKd27mX>B0oXf4HmswdRhCbq3=p-OpU8n9=Qu9o7F_ z=UX**j8oicpze|0t-bsP#jFO@oSfi%Q9Ye6x>I*wIVVs<@t+~O@A{nj`CY|!p3yrI z52`;K%TJ~=#vylA7R!HjsqUh4hrO`;WEJ(UM2c+n5&82<>dlB=vel2vhd1x(@?lqv z(Q^6!UeY@hb2Ua4S_!hH6m<`Mh}}fLPUTdoC{I?tj|Q@;Th|=Pir6 zI_IWy+F={X*qiceR?vGEIU287@@4kWI~oHdW5;za^h>?F!QP>!&XMk}Un^uDxm7;V zgx=<09w{nc=~I`M4*ybLeJ&s8lX`c9y8}h!*L-?=BK$-0|A&08cj=7}?zA3}PjrFa z1Q{cJkq;@iY>V`eJ;f>cZV%{<4Ca^B^2?su-Q27Ynog1$A`npl82(R>gT3?cW;AjmQ%>~62TjO1iucR;EDuz%chK|eMgTK}`4__B^+@cfKmTEzlk&t`Xqhd=Ba zd^@I4$Qtt8%V#uRTd!Vtq`TrB7uE>I>b;U1WGk+`cJ-nfs~-r9>O8=tQpXa!Kf)Q^ z{))YnzVo^8p*QbQUFRg^s|xqYXLUfan%iq@|J0*G;_&VfiJp3AllMEYU%4j%3Mpr79NGPH&53&mWZg>7}Zpb>{YNy&-Zib4Bib z{p%#I(Ay&GC97GAHFeb+BJZBb7o|3Dq$B?Kh1~D^=#nWp*K1$1xO-}pZ&rtdVprh< zvZW6_GbX3T!!5$)8QMEcd_D2H-UnGF{cWw-*LNj?a9r*+QK4VIOtk)~VVL<`wW#a$ z=Lho3g!pHME1s6~UA?f;dsU(iIurY(-r$%fTlBEvZ@l-xI`-&m#}*dSn;o1-x?JaA zC-e(L?n+cp{9)Da4a0JpBXlPs_oG`Igg0wm7_Kno2A$M3_T6{yI zliqWwD!cLQj|GDM>hptaf6T-do`;+3V8_1Rtqy2g;7kEO~#Tw%%K*D_d7p z@2~Xk-XbjbTKVXwT_Y2^Cl&6KeVe0r<`<=cFmK5<(Wb=W#Bb--4`)A8CAy|#@8HM7 z4a59Bt3|2xiUdnF?qe1V%KhWA7KxU6YX-l13%xzF=e7aiV|&-+yfWdDL{+_6vs-K0 zwu;&)W zuonGC@#LxBJP?+UZAlN0CWh$!opWU$s_H$S;*IKs#~!O5?i^D+Sf;nJI7`z?@#?E9 z6$oFs<<9W&wta(6D=G(Pq~rY+)Ba0uY_(j~G5k4wMzATPU*d}%1H(N-zi+%uZ>bRL zAN5C%g&T_33U)rAb4Q=-4{lQZN2vaX`c}*xskeCU(c1er`EK*8jbpT4nm+o`oQKu+ zjWv|M0+D>uk4b;I=l+HK%^Re%*UAph z88zRd`lP1fOYf=e=g2l5Q#^_{#duq+Ynd5~ z-juE2+-7gx=jy1wIv1ae;!Z18^iPzM4J_Gd$D;mvQ;hS{>lK4~Lw%K_zN+#^k4Ec$ zIJ1B|Ec3>+SkyvqjjfS=OV{1T&u^K$hMh&I`zK%Bzq9dh z*+$M~jaU5Y7ujd-zt`5?%tH%u&DpA6x>K1h8_wCPF^WM=ZM)H&!S1GemoI!idJ*+` zO7}D`b+)>~*_#tPR&GpiU#9+J#2BDGdD+6Ry=CY!ViKA z)o+Uxk9tRQ4QCh@C?1uqxruja3Mn3ys<|nl{(oKZs3n>QYiPV`DIWEv=DX`OUZ-{M z^~jk!!Vwzx<}Vixf6@D52Q}^s6pz}!<=*fo#f4kfDHMLHd3L1c*%69I)zO@OnPetg z@u;4fyGKiwS|}d%tKJu5?S0_<6TvdQFUB3oIlAxmwbl}C?OGxzueHQfttE;m9@R%{ z56)Q~P(11utvwpaCR9{BYLeD4_(>DQH4Jg6Ns33krFBj{>3*bm)Hhle@fOo- zibvg}warh`{d$T=bpEhl7bzZ9 zQtLo`@|AWy9}LvGkvozXD<0KfYql@6HhWU>sMT86ZPU8$DaE5M(OQvnR{a!@s-*Q8 z_vx-sJc{?l3Ta)Jr+CykdS8sUK6)u0r8|=0J+hzIDIQh0$DQGR%@>Unk9tqGl>6+* z7hVzQzD&s3>G6t3b(UTIU3RsZ;!$U`UgGR-SH+{w?szzSS?iw<6pu+_p~m$l|;FI~G@@hILGdqQiN3l)!A zuXPURA@5Z@YO~fkRpkqPLh-0ftx33>R=V)uV1n#f|sljFdb~)}7f> znp^+S+`4P=+{9+hr<_B}R@~;y4fluXl828K+qqYB2Y!#LFCNLcNOM6U$-@-IaCBG2 z`0fhmE-iB|?|1EcdQ4)B=Gi40mv)NV+}^E)@x5f}F0EoYT8oy8I_i#XPrb>7oHWs0 z+IgBgc$@1v#c*b7P0qL6EF~1HDW`qPMwP!!cOGBT{^dRW?jMTnOm%C67K$Bh z(3+vF)(l+~Ut-^VR&&Qkddq@0v(`)ZE6A_^jrQ7grSJDCCUCj-;P1!|=v}Vhi1zP$ z<-=bfUw(ldPlWwtL;A{>FTa0ytxjn78!2|LGG?p!TMn3*i-R}>p z$re?g-z|7begn?B{JCs(qw?B6a&EA=eEd1uSKcofZXzH5Zut|M$)=T*kN-*SD_crd z*T~0TPClHQB&*NL$1k6L*h=!eSw8-EAdEL_T@z1Q$*!b$p>YbC{kG`6?n7JvMwIJ2`aE9q! zlt1*Y7HjXX^)5=G1y?TO4$dojM`i72#T#>8x0BvonIoSP`+}?FXQQ`h(-{*Xw_C6&a|AiH6HD*5DE+7Bd zg$onh!6~A5V{Vm?i}M?s`4jv z_-~b8^e@?mVe;`$kzbVa3_BhD z9+$``%)QGJ^5uUj-}1SdM?O=$agzMEPs^r#CBHszX{Bi%`A2?q-N6a}kew_eAAf!M zY`KH;lVW;HxtryieO3FW=M)pDCg1D~%_B<`yW1^4DtGPADn9VMd^PPgk2EWP zQTV2Ot-Pr;jtO=USkHma&iDHH? z$VbQdu`zo0=63n+x@z3B^&ZYt`RMv;eAg+SIk?e7VVcJM9mPMZ$REXf0!I|v#80(P z{SYb^`nh~}ysxrS@zN#o>79~198w%r@8OtnpRQQzRQdGqja;1CBzR8#t{&=JVyC*3 zV&;o^irKc3PmlB4y%fuRO1?hki+dHD9Vwq4^TnHr<<^j|kGon~WAYN~<^Sg_nf(93 zRQdlo8}_PV+I8gXdqi@wf;hH(fSfm8sCRW1$?vyZGBa*<^G4Un@5g!L+Y~1+qIkiB zl837m10N*6-^a4yw<>0i?+%~U--?;@4i|SDA5=_xrTl@M6IiX7b}jh~vHzVF1OG)a z4(>TVtT=WF`3WzVJs+cZ(Y5jovIlIc*!Vf}8Qvne^pZUR?{KjP+^D#EzTfMIn>9!D z(t9a)DL(Rv=(7}q8lm_Ld(4DlRxd05Qc(3Nr@;;F4CBOFWvo6Iy_2adRFh_9afC*9L*#1We;XZ|HsM> zBxDbkOJ2)MPVSTZ){;yg(zt&w8UIaha{VEDQcE$1OJzr1(A+dzcIA87om|kTKX|mdh(3)Ww!KYpltDE+2kv3{642>^?!oHnu8ituhn?3-sC#2 zecyE1@0(=nFOtpAmF@poy2Re6x^%07?EVJX|3?*1NZ~VH!E^7K{ zGZS|>@=v2iD<{62ga2oQ=DHd0y^$!b`gGRZ__t!*M^%TH6i>Ll%PbSK)}4_=ITz!5 zR&qhCypZOgA(~f5Xs+e%{{+pw%U0Gi_hEljJfWlJX5LlcZOj^qzq6OAp?E^y?W-GA zS3k2ZXsI{3h}|5}{9pN(e8D9em%&;`4A$9z%QY^g6;IguPpe?JWI%UD!e_Pq_)}wj z=7%T3eOkwy(p#WbxbwM%r#oq{LiWyZbe65*?tg39o)zMtEU2DM$rJKjKHax1iXQbw!s+xrJkM+RLof`f;z`;W|fpN^Idqtp$lG z6w=!8d#&xZ$v3-OYrUyj{}Eq!P3yt&TL1OYI`AB=2b*iHR#*DcP;0ky6{r4IbI>f! zMW=4PApA@9Z>G6)lhz8%9l2UNjL;h5w8pWX))a-bR>-IEI;pioO|2n#2l!X5DHKl) zc>{;}xuWK5?!|wqIlQLU5bQ}uX-#pj))x4wYJaM?1GI)@;sJ4-N2cKTrTmSF|i=d0Ha4rXX=!5x-JYmKF{Cmiq2)>KP1+4Sn~?!#|~+p(LI-dcOZ4oG92vAFci}q^{LLH@HW&rdIPqE zdAO+&vT5Vwr>QEx4F0hi z^3!C=k8`Q?;@Gk`xarg{5!;;-KNc4`5yU@ChDAX3)$p(@-r>Gq(!2L_73@K zgo(pCBVDLd$1p?jge;v`xhIkjfrhKD0nqS_Rue7XuqqCV`?tCuH->+hBe#uM?`CL!R z$9hOIgU_|q-IwIvCHd5SpRm}QkLD2P;+^xhI`8_VY5uGKOy^bTt1I!yCQ!ow%XU| z>~UCs^k<2;wGQkpANDT!!rEwEcS^po>N@AVK{2Br<%iy^_rk_$FQd0)!pG&CenqLcM<7_A2CF7#IDq*V$+k@5`uixe4tX1IIfcI5SDvtX7nce~YbCrCGBk^f! zymZDsd`Z5}8XCvh@_k;Y@}JUp^_Guw%a^|eKWH2W$oKh)e3a}#`pRcHL+9!lBb}=c zbKKecPv!e8Djz845W31I`uqJw!>=@^Q{)G|Rld&qHIC29_xXo>nw*0zA|K~4`Hw!6 zZGTMuB*n|a!m{mpqbqz>z9-JpzA0bSZ26w%XkHj6U({9dJ#kjKk$h2w#~o|LoI;#x zsC-G>dDK0Z@Lu_tIG0O2>a%vs6P#7vDgV}2@UsImc$*8q+NbWUvhJ;fkLs*4ZwTv+uCQHtPFQSVn?zRjf^hu;n+{6dpGZkrY;eAN zyyxh165xxK!cUr#^10z7g>RPVox7it10N}LpTgfReV+S1&*TTUzdOg^v$E%y@A*<@ zB~$W&dp_z5&hKT3pA>xYjZFjaHA=x3oE~EEMM}YcTspzvJC%Zup8C1L-&6{IS^xD0 zFQpW`;fH@1oD{t4`}sr4Ck4-cD%Iem;KA8y1}6n?pVq?Qq~JdeyxZWU;JtcvHaIEx z*hF`Y$Gjxn2Tne4J8lb1`Q+nw`EGxIvHQK8 zka2_Gj^hG@!*A=G4Q6Px4#2nQl^WD>u{4xWaG8G27(lyOpEqCIz>0GTq5jwv&@=Qx4yew|42%llH*c zi)@2azRz#%UAD7ZS>}66N|yOCQe)Pqv?an5A+^DGz%{K5O5U-{JgjyY$KC zJE_NQz7L$8`@rR!luT`TlboIVz}0V(tN#bCo|8;Hv$8*M`ZLM(!v`i!NttB&gYWb& zxb4>uObX68@tqXBrm=G$nDGKGzEtnr!-?akuh0IVoS(u1+_& zZhUI(^mNk>zI)uy52Wz>)Y|{)rhnl7_q;LP*^O-1Z_|@{Z1p|M(5W{#<&x4q|NSXr zPqIT&=r)~h>;u1N?ac><&iLAVlaeX?UY^>ePcU*t>gC9%)=o@tayZ`EiSbE3YbPco z<<<841ZOA48+umu_@w;WahQ;lfApO1&`EuM<{NOnr=*N^{9}`PV(rI-q@G#5osiT+ z^ppJ7u8cQ)v=6<9ZuNJp;~#6j&k`NIhtJxHvB}h~hsL(|k)-!t9#jCTE; z>Beca)2B=`UgWpqnrY-6-0EYdlk?FgO-ac#^38Xv&za6nj5aCX?L0Wzq~LFB{!2?A zlcZaFFvjtZHS~7+?&-GNvF1B;YoEqCy&B`{HP+DiZtFeP>FF5PuCa#BcWWoc8ag;~ ziQHKE9pn0KtfBMW%HbH(@8EX*GuDm6c=tOKTs^E^MJ{YTy9Qm)7Ut-oUpo%TV8kCb*;zOhd4$2+?)#-$TX z%I{eFF*=#re3>qPW|Gh9ftAO0=_6ggjZDfRa>@AH`Ff=5zYHh88A(2?uOpN4ZuKF< z=|M*Lxmj0^bo!KG^d%)_nByO2%H?;^C+cDKab!}@sOPNg41;GWwR$(qeOG=n-w!k8 zw@V-D${A{Y2b}y_*+ZNj4{`YhB~x48Ag9MeoE{Hy^&jHuImonwa%fLV${^PdLre;e zedD|Bw?R&ihd6m1lTtopjfS!CB8xE_86K$HUxwG}QIWu<#PIuNmt4ZJ5*Jp{`$t89Mpxd@;<>!I3-U!Ol}7 zU3u1iB1e>qT=Bc`fs;}%zT5g)dkSvr@9k-Z!Qr>-hmo$m*1p1T?S;3m83u>n+KZ8{ z|E#@*-`WdrZ!_F@Ww?GH>Bh<0UvGEGhn=8YJANaRdTjN2n6nqd3>`jeFNQk4Va^U@ zn3R6A>xq%h4p@7D99g?D#N`{5OznEY>ch0`=S{zpdOh$ddfzs^kNHjt9X{r1aK5Lc z^mO{vGnpU#n=U@|c&1Wom#luaS3Yp^!&gB0!SgG%df(HOJ3aeR^L?69eh1v<>uUJg zrFV7tI-4|KN@v4QYU|zAq~OR^y7)=KX$LqdIP(iQDLDELP701Zf|G(Hci_k&IP2iH z!jV64Eq-&EMJ3v$NY9JxWhcH+oO%^$0!VyT`5Gw>SC;pPh%(O#YOVG{e_cbo6+-@>#u4 zGb!KE|7qDR4W6x({G{vkJL&1oUAc-;EB~3ZVKTM9qq}X6k2EEviIc15CIz>8-`vSx z6C-DoYvrwpkuz{BZ%vF`fm``%;`F|`oA;U+Iclr#RzI3JxoPg?sfp8j#k{5W{Jxcw z=1zW^7&)PQD=$rqTu`2smnKfXb$-{#M-!*#Ee#z$D<>@-f12T=|E%7(bmgX*@ARXU z+cZN5xAjUhba1N&X-@BTM!?MXX@<^st5<1;4sQD;&FOth*KcWt&Uf3dX@(AN^*+te z!I2xr-HuDTNs&M3$Q5*OQgF%xCq=$|YVAsU^E-U^IQ0W3h2N*x1Ii=iJM9AZ_8WT+ zKR7Ax^(%UuUv#VA=_ZA4^}l^Gwf3UDDUaW!T++DyBWJdp=C0f(?t2qM&o6%T5&5S5 z+1U+~sg*Y?_k5?{($nj@eyZ#GrD2lJ_mq^H<~ym+&p1%7l}D?G;EW&T+Huvp4#Fwl z^FwbdoRspc{MJmCW96iwlUr*KDA&rZw-C84dVJz1^_#+c0T& ztew=oD%mCM7WRsIt~d6ou9NqM&c4-kcC)7AuVKE!Pd`&XYyWDvey?frWo1`&->W*i zS=E(a$$Y;vy^{HU`fPcZzr6dM3eIlozcEey%DdmIlY{!E z!RQO$t=+8P>|-ToH!CGZIw``wy`o-IBr=T%L8 z!D$EMZ|y==XHTk{_VeBLOU)#Xyg;{ht*Yziny#Pgy5DK&>S5;z#@)8h&J)N3I4O34 z@76xpc>}$$?QCdL^nmtF7oXK{tHc7%?&s_5>{3qNQk{IJCgsfPNhyP$k(}E3zm${TRD+*6Th!zuMbGX` zPc`zKrE<}W)1q7bC~ERe$u8o)7cu#>grj$NrWZ8d)0D!0^z7My^n_A=mz4UX>pT3X zh4Xvhq~LbmDrm+HoN=XGYd=z)UKDiWpW^hQpwo*KrxyjCUZfZ~qI|0tDNZj6I=x77 zdQs5nMT*mlf=)hDjJ&i}eybNLW`9a~R&G+9{1lzlht{7Blqe>Mu{X zz86qe~OrX<2&}7 zakF-|sG(Cn{m*ykd}mz1?YN}6@7A6nchIpfq~La(ygf@bc)H}t&I_g7xLNxKznw?C zeM>bs{B}K2%8jG7ckp}rMhc%#t(_?4`p4Qo_^~VhXa7>&c&EDlEam#!+C%ug{UfD( zpEBNjx8rW@Be=B>);_{-@nU9t+X}aKpqR4*sm=}*ae7?L=y7}TS^Y2K(o!a!uJW-L z)0AR&Xa{M2rPhvEJJ3$@XzfHnL(iX*;=ZRCx}TrY(vJk_-G|wGjUG->%J_P{yi4Cb zj=sXr{sDfgzdxD$C(iz4_}&#A{k~Ovq=!Yf`u>y2cXRq?gQqFADUN$O-vL!SQ2(BQM}~K3Qc_aOC1H z^$Yar;`6xmf8`l^dwutG%1uehGv$%b+KD{#d*F6IooDFa)c>@`1NjH1UEt6e57rIf z(D`olFwfAzZNL3w=~;Nl z#PzqGAINXV!_E)z+wtG)#^;C`f68Y(+lt@X1v_8BZ}B`czSD&>&IL5S==Ch&q>Ml5 zxuT=rb44fZAi7PDn6$mhhmYT(9DbMdzjk1*r<=WrLHu>j@A6#)4lkXg*lnYKjv`ru5es7GSQ@+)M zNhZBZ-@!@Yze~Sk`#amo|2*@ZdY~74kL#t^U+Cxwe2n`P{f^b^>|{RZ{66XFvlGpC zQePf+f^v{2Z%4qbK3O|MxyU6ce0;a^n(g##lCe9KOL^4C%K1E#dV5Ab^a9-4yKJW? z>K~&g^OAIH2PZoIiOF)%OUm(fll51caOMHZ#V&uSdP1kZ@ZGNO*!_vZt=*sK_$Qk0 z?}~2i{yb;DCp!B*(b@em23I`P+5Iu5{E68a&hBTJ?_19fH0eI2{0^y|pE67ePJKR9 zK2mV{0i5<87Eb?wlY-Na*}_S|ZNFy(oWBCc-t(RGgm7#3Gt4;g-Hv~TNx`jrWSA6w zLoqhl(J$yEFau6oVqrc%p&nbs~ z2PXxmKgo}MAcc?b(CH7-6DrrrV`#>Ye8?|+UXB?za8j=alm|}Ac|*Q)ZUo%wN9gn- zH05}Gg3s#{`Zi8DDc{jU@?#H3;p02@Knr5?oqn+Vq4{20bnL+h@sa+d@1*;bl5eQS z3w*Rv${(kc{9$^k`CeNo-*e8MO^~iu3g0fJ@ZGHMq~O#CoD>{;08R?dIZtr<1su5t zrys%T?^eRcDg~$C`A({N)AT>z8CSmB@lQ454~~5BofI57AwMZN^2c{laOChV;Z}}Q zoF1e)IZrYA!*}#zuKESN(0;(A@;8|DBBj`YZt7?BWr6s>;j{XaV))Kg{lU=>ejk0Y za$MEa7o7HxTDh(2I`tvHmnX_Y@5zsx z!3Pc>`S|YX*oi!~i}4}lJNf8u_(;K#Yj9F<snGepUghzfa{2D{7e4gAgwnWvKdXG;uP8;&UspbG%7LGh za-Yz+fe%m$o=^&3+3f7b&`(dzZVax#Mq}zjNho*q-VuPS}>)__3#x<8FW23*Z7Q2s&w2 z_DOf1|74Pn`taS?i~4|*!VjI)-V;bM_2av*C-nxm=f6)HI{fIDZwKG0H>s~TID9^} z^y5jKa#K={JO1OQd~kkO{vPMQJ!1T`;I^DYhMtvu$l&=>{z|5l4^Fv!r@r8n2TlrZ z+kMES;I{pTObTxM@sQc?gVX=yXWYT*cW_d0c?^Od*IZI@6-p}>eF#U z2e*20+|a?T+#NS`aC@KRxS@kvIXZ6o4cy9|e&5LH5qGZkxS{ji%9-TA$s@mq9MP}H z7b&>cbKAcs4UT+Kf4LP~zVL&x5cj}*H9Zt2I3e}w-3Tlp9_`~8qf8EoBxnW;q&=P`EKpR zerG54C*{-2sqO#$PQLd#JFz#($2g^>?@#K1)swvj&&u9w#+C1$ZuNhU8{a*qT`A8Zr={<5-*-8?vCEae z)7guijz2G%+TY1b@?kIJ*L1(P)1=_Gy*r)U=DGgZ>Dry=`g5m?C*(PMvD4TK@>_ec z)1=_mUhH&wmFMJmr<3nIBga|UJDoh|IeW3w$#b5w7dxH&<~e(@)5&k1vkN<&yyiJO zuq#Qoa=Xj%?=kdt>OW7nda=ipOTSusvB%kqU9MhxoW0oP>b=L%;kWi;kD-HGd$Gsa zi(SrM>@jq{TYIs`$?q=Huh8jtQfnXfIQy{Im9yWZ$eXnf`_1oxTl=s#nOgg>-_(!q z9{2W_6#26DVXtfFev`s)?S=Hl*<)*;_qu-HYx)npz%Ib=Q`?{WO}|pUwFmo?`ix#9 z$Iwa9fB2v?9{#)4`@K%@ce!-GN%=kdeP=SY`SMJ8$eXth=#Q7bwDcXWA9t93f^O}r zl~=x7x!rE~va+`)zgs)A!;Pbt|LxA6Y&+<90Xx+mrm(uIw=S3%|7=+nqjdPv-Y@tM6MK|JG!=^h-PauI-<#$rOIY z6AVu3acj3WxZm4gzUNC>pG?_DfO|f>4q5MhZ-YtsZs$9dqxOQ^b;t&jg0rs7%HH7C zA?ux8*f?aEds$D5t~*zD%1%}!3Xn*M{|%GFjw2e)=*tBDsQ-_|bdaP_cu7*){bm7dQbbX1B@3bCGoIvU z9Qlqvh}7rzbUV%~-T8o(<~#YU{a9;KaP+pF%C+`jt?N+e#jc%8oZQ;`-+Z_0u*I&w zmY9@s>^^3R=~r;Ok6GgE_F^|qOPn70``t_2cr7;LMfp|_7aP3*M^7lv&X-G^e)#*_ zOPoH~``YkZeOT=5#1bd>_Fgspf*!zU?ZgKdo~0Tx(LkTYIrKXeJ&Dx8#CWZgsc6Y7m7x=7wSo<$MrybTFtaR&& zRpvYOx9fwI&JL_{c3`jU#7H#{yN|e)2Zy6Ta z7B!w-C0h4L`RMq{tgUA9H5_LYs!9ah}%Up}o? zRQ;*~hMu*kO4RqMD$&XbTcZ&lRf*njQzaVw;MVA_zO|w`FO`q#RoWKq+*>wkb54zD zW6IX(?YF8#Pk&uK`g`Sf(PQbgqOL=$MBNr{jXv95HfmgqONn zeHUFbT>mrOtxk03p)Jw22DPG@uau9Ttg%i1MSF47N#AZ?zBM`|_{1B1$!Romp}M(?)Y(*-^0)!bmi2}%gcrSkIF1|pllSjoBc1?=Y6nZ z0n^?Ib8DG0sn3C&D$&8)^irYv=IMK5gH99?s5t*BX*VNEk!nRK?J5VPo+2T9X55BKxyXOJ+JizN7tRH<} zc8lIixj5Q%NB!uf%eF+N^U6k>96iooM}6{(`>nNCF32t6ehYZB@;!aX6SteZ$OEwdtrrFR-vajS0`~2S^K>hDD97i0Sa4U#8)bHl(XZ@YHpiC( z{~Xu$t3>x@LiaqCME7ISU33q}>i~~0r{qVMCVbu!f~ikM$?fHWJx{rRHYVsR>Q+#B zeLYKwr=07nF8VDGpCg{~j^02#p1-`x@#Ryd=ebs}=gBwas=)IAd!GD)FIOENmR(8| zzQ@q1PrD-b1h+{a(Ls2=mc5!Gd-Zd{dxCnhbxmdKrsW?P)Rn!0Ubfi4V7{|UmCmLI zzK#6Wm(Ct8+dUxIB71mD_OL|x%%HIBUQgM{nN2c-EN9G9fr79Umke zPwT0efU}3k7YqoxJNtI%aC+eTIYqza;j(JGAICU+nflF-T^z0)8{aa@>-DRa_&r=i zJibhRtEscAlXj;EcRM>gXI3zgkTW9-?fN(jj9_@i zi|2q~c-o8SwO@)QJe|Bx)YukX);2TvQ#`;W1oyhGK>*J?%KN(becq9RJF}Hq{eID_bvR)1PEg*f1$&+>l~4W8SN+NB;Z@2zPV@^z zCoko6aOFV15c<}VA@D^GhNq)=t`?nozNg>1@ArBk^v6U8_ViAI$y-!;4_%p-63Sm(L4) z{mDN1uiI_WQmwsx-JsW8HaNUq_Gi1+)g6xX37cq++obh;B`43HY2AKR?%?oA%~{uL zZ9n^uJ_atPb^D)ZyO=WH*Sh_JIfKKan&S#-%|H74KH*ogZ@slH-8o@!I8bxh{aUXM zJ>A9p*4tXs4m{B%?5eeTzrr^}8^7)oeyjC-yKjSN-YbK{L$Z@Uy%9u5)#vEu9<6(U zk?rO4YnlE;e+z5YoRlE<*=~{{ry?Q|4ZkS>4%$KOF4KgwAh$rQf>V z*(iAGIGaN`(2>tAMQ=9P6j5ghhLVh!>;nXz@DGH z=R1C2&vW6g)(*oD?D@%y-KNeLi0yu4%y0R;z@7(w zZ1O?%Eq#K0qo3(F4{s1ZJb#LQ$k}uF*XVbBUSMD5rEdP>cZ<7uZNKUX-Sb2Db!Oj0 z-PjXBr|sXV|7n+p;emgZ+Sp7m^zX$J2&O;VssG9AVe$gE6}_a^oa_z1R^G1VwTG3g z4wkHz&^*q5^Eb)o{wIo?eP{>CZB4hf>2+NYwRUTmo*Z;P=wbN_2C$#sp zYm&63O`@%Ctx}@2rI+fpF}hLZcfF{d$xE5_i|K!3wEqpu+!STJbhX(7&OFdOx~@xc zvq!Go`=+Q#f%0abSn9)@qjF^mn0<7qzk=v8^$Ghy`i=f!zf6BVc6kA_XS{C0O@@bk z;=pM)nSL(e;2TO7Fnhp(&082A_J%LFZ4o`(skqsDb|~7y@Nai?#>M9a_ViU6BTonR z^ou0tUPpl88K63#3!V-Py}#)2kawu+fNXm@JkVcsbPuDmm$|&a+Z+!v@9DsvjvavB zPrn6>j;E{NfZ-XU^08^22iVi$!JceX-$M6!fjzzGkuKpP`8O`rxb!&KCHz2p_R8x2 zZ~yEP4$)rw8TIq_xqZU^+SlK$zD--$C%jfZkn1$QqxuXE(eaA;*0C)mp999d9PX5F;Ze!?wWTw{6I#PR zB01l>{N?ad`5%6j|6xtXjPNzB`A^JGMAZ(wZ0vt4`EVYYnql%5mtW%kLa&%P;zjv+ z2JFo+Hvb{{aGt*86*Di)kPoN7TLUmp`8f`FjGOD32QR5K-1I|D`FZNy@S5p|bonmY z-1wU5Tlh0B9&YBBk@6SqDf^n~hl=tCwB9|^^uxFE1+^M6(zN%e{3I32j5O_fMf$b5 z)a$107fPpYn)ABppV9J}Tr_1w__g*d!=+Onc6%+%)V|ENr6j4*Hm>0Q-jBf~$n zNBB+p3;!nR@3+!l_)AJR;rU|r>xND_4L-^YyZo{-;&*?!D$|V174p>-?ldZ_QEgL1 z-Lf9ZG-G;!d^JOV85KU-byKui^}k?5rWyB(kO36wzq47 zowb>VS)2Jf^c3C0aXNWVyWj0D9{;HZ3Oo8=e5@Lbk@C|9%^0P z+SMPr=V86==|8F*4@38B={U@q-17kUmTY&?JaW$8=|M5c?Lz7AZ0)13(;BRf)?nA4 zP1k>{*mc?=`5f9wN0w_HRe0fm;0mq5p3oX>ll%$y98^Yp^3) zgO!n=VVYZ~&6S@aPiwFNT7#v_pRh%GI!Ah%ElI`_y z57}N1v&Uq){z8e(d}#(b>hl-jjb2O&ohh+tSYi+PWYub)?W(9RL zw_YdPyJ^gKX9Z7c9(+Nz`kAAj1-EMc?Jt|$L;q(> z9hjSroSYR<2M-gZtr>R{%qO?~DE@BnWVJY4-lUU+~#5BKf7iE~ zcj{}-JtDu;e9aLXHFtRa5}G?cl&`6h=9dGSUtX0Ds;=gahctKaTTL`iU8Q+^xcpcB zG`G^07v-0`P4gXXDJvh^FwKeUC7&zgyZcRZVl~O+so;Nmu>XI!%el$ zd{K2iDH#~$*0=eU*ZTwUV|(}|%_APhpYQ#L!0a8^cMuQq@co+ayl*Z{2q?Sl86^HclC+G%Qg3Teqs$bJ04;Um$}~p_OS+F z&ofwUFXMQC*SUI9=AW_;zMj7P|F$t+AJ+fdBm>`;ZE4o_GqpCzu5Dqz&c9YR@IlE# z)1PjQ;(LKIvYGuq+z?f0(#qtW{PBjUK-*SkFYr+ep5e-*Z`T!DAAS1c?Pl*5hdn<$ zEk9cmZTO|NDRaH!r_Z6U6TO6F=IWB8mC#raSG|76y6B7Jx7m2~yKAD){%B?P`*+;E z!Sn+$*+R$G89K4=2dA!ymhZkjTBsP%iN{x(aVLIV`HH1ReuzKvyPG739aIPEOdX&D zBe&3}K0eLRX(RBtuI<2|sDFroUi8nTBpnz!{Q%Fa>Ice!PWhD6>)SC&eqi{g>v!Sb zsNV&KzS+U#g-$upDd&jddhnw=#{^SnVCe7<6x>0rJj!c_jLSS-nJB${{fzFRUiCL z-j2cJZ4`8G)9~X#|3+hhuMhrN8Vh*5ZNyLFVf-7wQ#HQuQ_eY(pSaH??pKNXL-3C= zpW>g1`$K?znfOfL@qQBMAM3ZE``>~;4*NPo_icec4tpMajPzAMjS)P+&j~J~ws<-` zz7Nk8oqpc0aeqm4595c7!=4|%1bt@O-0j znW1r^91p`o-nAM#cs|rvq-ZRl!!zCSLuZW0%f6fb{I9Rc(-O+HdgZ*KKTZkzdCFFg2%V(koK7GX}WyK%Wrb@nhk!22{_UqBQ#hqo7b7hn9J8h7ir_RPVC3`*- zd#*kBRVs&m7_PPP)tWDQXuiNV)kbqcQOyPTrZ#Ktpnvc?_0arMO7jaor9qn48f#v| zr!-x2Us=t4#9yc<<4#Nmn6V~C1B}eTL%Tc=u;&4WhrQCrvXk@!F)U!{#Luv#;!uI zrZI${--Z6X`t7NA9}PRqza=^>8KazgyWeW~sSiBV2mX4wHyeK9kI)$xV15@E{;3Z& zGyM2};K?ujeNH^%hTj;?bo|sGet5_W59QEaPlpFOJkWvh9YIHzfuVbta)8;39TpG% zWMJsPw~L?pz%xo^?yb<&l$rn4;o*Rkrcs^Cv@Q}4urCLGUk-F%&X9|mBzc;JVUmaX zz=OYz@dBovz?2CcS%QwQ57^U@Jx>SrbY$MsfuWNZefiLp2|QS3;s=HYyN7=mIxv3V zo3)-?sr4j&(ZyP4;tz+1--3t!2liu1-GJc%_B^!3j}b8RsoD!asWmNrb^Nr$wC=@! zew+61Z%thnjn+CDUvV?7jq#;-*WQ1F*34IE&Ad(ix7s__MRT>D{6&7b0$Mj>e~5t| z(Y^qiGhhCP)7lGQbMW&&ul*5r2Ak|{J3fE>w5!xc=*$K58+O&h|9`One7QHsUJ(nx zhm5_7#{%&4x6%5RIui@P|4h5^?T^xap@a4d)#UfUUp-X&h%4mlNYkDIc$0h=%d~eO zUV!hKJ|T{Pe;Xd+1#!Q3+#eqIlgHx@ald*zPQls_o5R|VeeN;AtoM#*^!=#d zgXo1|_<`Z)eBD3dVXX^4Ye?3d(BXm3x)=I9$wo)P@B_0}hYkKvd@q2Jq zwn&M_5xxufeO`FtXJ6yzY~yEfpID}I1JXy%Cr@vEgYgM)J~@6yw_8R7v)|_&@3zH_ zB76v(e;yq+GJb3r#$(X%d;dVo+(u?!ykGG?%Eu?rTQR|ZK4@(A!guzq6*b6An7!~tV{1icL?5iR z)c`L?@x{g5k8jH`*bE@ree=p*KOCil%6jH z5k49Ed411BgujLJ-n)y15&j%}Xft0)MEHE*>E-wt3qMA{vm6ibz z;3G~3fIXeF$LG7Tj`OS#-Iod7^Fa4?fZoT|=Nr*|o#Swv2S21QlX5&ibYBiW%sH+t z&^-@y&x6m?(;pG+`Qv%v@%&YE=JOBNpTHNm_QLOBe#`ey9EQjD6?6~B>HL<@3+&5` z)31*G?)id!ouT_OIh*QX&aC<}Qw4iEXFff>ieUd+&^>&q_E+`#D+XNE^RUE>_`P$%b{-JR#!Mc$vBJ>eX0J7?24Pg~55J3P-i z8^xJh-?z}?=V^UEL;qiAYv(xo#yQ^jIol_kedDZe{LJkY&USH@_-$wFIAi>Yvvr&w zzQfrf&Q726p|wApscz(K8fTAFM92Pcrn-@{OPt51d~6qIlIb^mfSk*v-|*dWPMhDw zAIRBV`WgQr@jk`{pWYzFOzA^>jKursXMB%uDaJ%U<7-M&%<);t6>zFzj`RaQ(h7N3A25D4VA=>w8Ul~q^xp+<)qG8v8x&gvh6i}NV0cywzC`7))|#$z$O}x~ zFZ8>>{O+aVVGYJ_!2=A>0o9XosOR&l8~oIbwm`pKZ2{(YY1g0PhX?+KvIFoOoP3pm z;Q{_w{P2($9$@HGMdx>+CqxH^{+G&R4LM9@P7@C>Jp2|s{1*JsJwNMA&kx*6{M4WI zE%m2N){{eAnZP%T=LPWq!$bd2=B?@2UCAw@&fNt-c*ejFy#YNAK)|M0fy%?(OHW^r_R9C86IGG zN{NScrsn~M=d5^uJx}3pv~E&4(DyeD44uBB9NINVF#JUX^IJ{(B}_So)z9$I&!1@Q zfa&LhqQeiJv7^p=HP*ni3pfxAKQMXWCvPY^u%~ysB#|uhNX3LH6P}$HBn%IAyQEpd z)a{|iZiq&A3!-DM%?Wm>pDAa#`WEv(zzo}@Z6SF$$nJSVkg@I1pr_dKkTJRKg-&w9zz;qm;e>-?Gr*z>@Dy{iLsUk+=< ztDG(3uA=9Gp6zT`w$3?IK5gXg9_0gb29>oda{>4DSl=>taJP|i&}+(>sJy`B^>pgs zVR(SC37$^*ak_`m3(o@#oi?H)&^_$w=!>TVdpff8pyLPjbjH-vfuS>|jJu};A9Zx( zou!P&H`};5w7Sk=#^ampFIW$h)>%#V1=RCiodrE8TLC;sXGEz#?V|p` zv}=c8+Gy;*+DJbbd#JX<0}Kyk!cUpNlmiUEv6+q^7=HQ?8Ss4w{h-R9p)#TSGNIq+ z%H+3zcd0(`z~5WtVDl-5v4fwng9kc1?~4vUba*Jo%RjJ}H}ZNIeh+(@Brh;|k!>%N zln;D~=zH|Lz=!m^@Ob%z2iWrf!xNX)55$AqdLH1v#RDDt3H^7Ke_ZwxI(fZ3(+`)* zey&wN0FxJ({%j^YPk#bK2c9jMIsn5D3_tr3csi(`fiKjY0!&`o1wVB784L14Cog5v zKb{9VJn%#JFntSrNU{gdi;_KHcsxw`!1#{f@je!KfZ?Z}p8t^MJI@ato(J4K(j&9k zzkE=X>3ubnLw(2__k*#IKpvo@Bgl#8flm4V^^YO{_{!i1_WbAq=K-JtdpddtJ$}yN zpgZ@1?o2f$)Fh^1|LgQCxLa@AJ!*$(cf z-`eYZmF-0T-NF51b!aXBfUm+g3r6x>qh9FUECTBBa6vlGB) z#2>$V?)k4%`TqVmcg#J^opjINMdRrCxj*iIm%F-N4zJ70``7upxDDCk>U>1<8P|7j zAFu=dEFW(L#Lx11_#xFHuKRJD5Z4i3AM|3L>;Gkfy^gm%-am2q^zEe|;&K>oyXT=#eEqR?zE6PTcCxQ)%kwHTZgb-GjMpLl zyYV{5&r>y#zPzJ3lsHcO98~;wnu9%VeA9#Wi3H_<86=k3A*X~q=euLwN`;2`Ok8BO&8o65LbkC4Os@csyKEzw6=4 z1;3&-7(83V8pe$HjSj>~ymmi%19937vRv-?EO4 zk8gb3<1!!T@oTN8)Q6sj^{QXvu`Z3vLtLJ{Y_R_HFzZIo!y5JfCFg$JX`>$_WFroH zp8v`QV;Ao?Ki1IcL&n$lA$fu0HZ5*56}6GbkBoqa25-CE&Ud@-SfoxJrDdxB>$er!{o(Q`*J+Jqv~)#dI6oifG-F5 z|8+Jm&L2OUS5?1zw|onf1CNJaTwFcua(P;kzNADO17D~5_}?Y3hu5p0eLdF*KI+;M zZ`UI~6-<^N|6Rt~_YXSASa1e4u4{1}jO%Y)2jl!6W^d?uu;FptjO(n2+0(`Cc3e+A z%%0Bku!oAPD>x z{F$rx+91BJD5W)q=ka?<-h_$wn}@M=@&55J`&r+g?2D-~+ z;rr0T(0yEK7)<6(GOxV+43 zFS@aV&V0)J1^t#7kDqfX$Ip+z-iA{j50jU%j*mO-rF`bW_}MMS+MnZ!k9%Am7;DcH zANOrqTY7qF@!TUjz&h}I(UWkYRsRQz9u=@Wahn{s+wnCpb^hFpA**M+!V0Q)tk*99-PUSFVlT>y^jf`^eA&jak~@pU6~^o8={>qB543-dCD zT+O}Xb|c$y8H>waT;Ae5alMGkSX}nL*S^f}q2hb1xLn0$FD@r>xr)nPJa2q`5}zM| zS*tKt#@8*}z2)vt(LsyM{d9j1mwW3Tj^D|J4u5g+19Lwpr^VvnY26{+s`Jdv?pqX8 zR+*m89d^$jzt7H{cj%X@oP2`eU!roViy!z)!5Qi+&jUa8;a>c!qI-VsymO|Sa)yiU zc^(s;`!bZdT>1!4s(65*FBSd2_vQUPbnd5neqhfZzqcO0=MD`2Why^@7arKt_g`tx ze!~;L7aza#-d_Ct)?(GIn>!zVtNN3?(3goGzYAZ`oh`qw{9>8$Vsl5H``xL<7XItLHh1B<-<>+?i+|ne<{o`(okv|- zKF8d(|3_!tSA3dl?$L9Hz1q0>!DgM4ucdSHo!*avA9YUt9G#QDruCQR-hHOdpU+>t zAgILq6*|)eowqMK>5k8_B1?mZbl(13o#~?dwz}{0t>V9Z+AJ||XdG2sesk(Fb1%NN z&UEp+J$0{Vlj6m+@mk#jx>9lc=I<;EUeP_E$~x0UKU}2yK94De+ev-(tnLoflP(-n zKh)G65a6XNmIWrZmy0_lU%kSR#=FHr0X5RnS@5!oX zKT^APb;%R8J^n4Hg$r@`1xId!rvby5%I@4e z!+w{Xe9D<*IkwH8DE=+0<^Ujf!^EaTBlS4W6kV8EOfuG@9NgRQ;t~*NLc)>5u zsSd&~^4XRg%E_mkaiE-WASVBt8hHd<_ZQwH_Eq*D_P6`Myt5`T@A}PyoNalhZ!FsK+sF5g z{hyfkQmK=e_gghQi6E{RkDMDw%=rWHJIE(v zUcr0K#N@E;?|2qD#QT6bhmo8~;PXy2<($t@{uXV$fhiY|Ck9_~>R}!wIh<2T4(CxS zmYkxfxiJ!V%0lri`+zz{A8?nXAii;|Q`8=FfIsog>VvvQ0k~U{9^b_Ls7>($-)JYk zl^SYR^u)J5BffFDQO9@`#=u?}1HYgKLNa`#3*uYM8py0okrCg!il~doyC(*|#obXu zBMI&rSHd`%7Bw-7;vVr?jHR@bce;a+3xCws{tfp&j$-_zUs6urB~Ak0iOt{>^G^3* z&(Klp& zAeQ}#{Y1sG?~x-hIkJBig?{20=&R&N`9att<+Pb=jMKsC0>32Ah&T{WgS;H#AaQ-f zP~v95GCsu-bIPZJPfYnB_>~9uw(0;+#k&?TD~rg6dpG^??K^`y2@fzYVqUs|!?xtJ zE!RaSLQi+diTk%#i-Wk_e4D{_-cdZO8xVq$AZ;6Ba z_mT1SG}vcGyX$pyLf`AyTVSKWANW zp8ZRU{#?ynGlcJjdfr|=C%@8Nt3<qpB8;yJ(JHm=RB*Q7xTSz-Q#Pg z@Lf>P=d(sSYp`s`oR+oFS?6;+=6iPLcxIaj_6W^mQxT{9|2ICSjbMyi@5%SC5 z>^{hE401}$+&x8Ga@e*j_>_~M56_~U&w2(9<>aVm_49*6IXUXNef4}e+j337fwtrm zr*rf9+dtvCadIe60}e5N;}i32Ie*LZJTrAtZg=aXJPA0Ia~?uDG4&94hhN0c;TJJE z5>pTHUc`hP8)CvZ&`!pIa&n>}Pl6bdBV$MoV@NqUl#~Az`pM^e#5E;=rW64RHlkoQDeVz%`GhiiJ2_l2Cem)izn zZ#*jwb`sN0a=7M3PIA~oOio4UA*P-NxD#4wPfhV{P`u8c>uQLe;5(s*9O_})NZdbV z+a8D^>x;T|hFb=~({@B8j|aoCoeLg)`%+hMNN z^X-&VkCYR$pA>zr5c z-Fb=lkfW}7CS046>s0Dm)<}H6WLtIpO5M{@*R0faCv`oF`!f7p!x|B-4$iZ##`=a@ zk5po=pRj&uIeotM6y{MXCP%hq{Zfg^ku^mrmzcFiC5Kq*{D-#K_mOT)w;3Bpx$3~M4*XgBJXg&D*3?z&!KyW2pZUyl)hOtMd&g=W+L5c~ zy6Oh7#_xI0`L6l~to^IjuvP2aJ~%$dRZoDmg4LP;YOMgZhJadcVI0;pSZjrKjA;++ zw6JbGZD73x)+ko%FsOAK=nHGMupY8nBf@Ag*Ht^B2+r^`R;&ZVy7Y_*>%C;b8GhEa z;CzfVD41*F;W(?zII}(sYuYoXl(U92`wVddoV#YsS%0P@)03got`COh0Wm{tEA%~b}*NLfz_$@H)CuUn> zwrzv9#BAFdn7+II#{@XUFDJSOtlE{dd z5Hlv^tSg0kd1y;{STl=DPMgW04b)jTtHsrpa_XmCV(BC8k(hS6&f&ZLm2$RKvE;C= zie3K$#oboL{ATgFvTwH2IeeGx68oO-03wy`bq&b8~_xZ_DaF>CEo&Sz0h+qlL~Ir}p) z$o@D3=`8 zT9@aGBallD<0d)eOO7h%97*ztC7&E=1N)xjJOSo7!+8`raxSE{<(!J&KKiT9 zuc$}LIj5316k`Q3*KIiFd_>&%O_Z45DT(=QQZeUg_Q*!8|iY1@# zqblb(!|w>^=K-)s&W(eCrJQ|3%86xuRm?sn`NWdLdj3*Q%=5iIV{>fVX^10+lOg(2XCmfD-RMzlUYhOzaZIE*EC06CMU&_`0S-`%k*4FmI zT=X5*X<4sZt*zY`^U0A|gXRASc!W7H_flEwTdlc$7V}K*pR&&XP|S_F_sTlt$qGkV z3u6v>3AI5q%oUeo-SsW%ij=~9G7HxI4xm0m5^%U@>OdWgSD1@(kCp#lfc$%yTY90M z18v|QEB{}>89a-7vix5IX%SEErSg9Yl!pD>OJ#j^+R43F)>qdNXYRf7{|KB!Jh{ip z+U)AyqPj1c0l8!UFNAyaWzc7co8mrxGt7C2_u>vd$2ww;b>y?p7XhD`{g!RXAtr~I zSKL+EUK8 z)I&b;YjF6zBc}!A#FVowG4+tc?;|0Fp}o;4Qp`KSKdT)yyG+`pq=v_b9z$~`!BPmq{#AV=M2SNG!8y?e%=?+*Q9 zUWl0^bswMO3C~*aeX`(!{=fSF3)C|V>e&YQ z9u3C0N=)D7Jd>Db>?vm)iN3vMuGRPB}NGTw*>;V#?**TXOhKxr$u# zHxz%1Eko}3Ta5KFxTeP%EOM<+o*m^{y2M=Lm1okp4yy6|SC**UTQ*wx9%?G(YsjeBSYl-h?38&YT zCcC5LB{Dd$?Ex~{0MH>&6G z)w(^5Ki6hu?wDVRnMa=2m3dLI%#qBs%taJ(DzSQRg;IS02@T{VI>l9oK<*FYH%&RORY&uo*Uwk1bBQ%XML&)mIR6Tc=;%rn@O^S!I( z#(W&Ub2>yPputKERw#cgu+vBWvAQ@T%p=>%n6QQzeShtaj~Wwo+>r5MTgmy)+~F#ZvnbLp zo9{dJA6;2oS1v`I)BI5 z%Wogg3#sRVDCb%e<(?R4B&QHCzniY}MZl87vqt~M0hS!~+)=`_NorfJgYkSF&oWUi zF?A9bf=-TUeC|HjM*Z}K_DFd%_{FmalsmzpoLEDAq&yf{#vvPGMa))HOzxullaqsoJle8&NsL z@(hV;TSA-pe(^o!bD3*tvuZyve`mc1hcV~xGRc?ghxALu|4fhcmu;z&{9ol-?KA58 z7>qtcza}AHs*kGg>iHR!(;P98XKB>9sb_4+;kg=~w~;;Hq zu3Zx+92?~rrH+&8xT=mt>KLnHb<9!6YIR&vW2N>h6UHJrE>%YVkywpSEy#I)nd6n( z2h`ZIpUCr9DyJ3t49_gdKEv2D&N8+t=DVZz6LQFxv1K14mVJ-!2sxB9FN`_Y;$)8a z9?7z>Sx~7w%lK%J?ziin^5~Fzeh5^>NigP7O3%8a})PWjuGc~Ntu=1x63r*eqpS-6Dx;@X{Dn<8fX zWgcam)qKgEN{-~St>jBRGGB~2`OJm72Slu%NmkD-tKWT|rI&L6VmUWZ-zoLIQ@`~U z@Ew=2RpYGYQO&QK$A-x1XZXc@#o~LdV$RhmuZY|+FC4?w9I1Jvyea0)GIuf;YL3+N zifX=yqjC3>=NQ%eGM)+7BsuO;uC65#%XgOR&k`qWEBgRB607T+l*?SpJj$G^dwIm_ zyYs7gpc-2>M`|u|Aa{%{$1yd|Y96a0{*0}Rzl^h*3vvwH`zGfx?t@Fds#A@5Kb%*r zm#e|QU>h|&+430?avL+&t-pBW3J{!jg|N8`1MuhMUAK0&(*xB@n;OxzNGdsVtG!3 z9ErLAB4e(`UyU=z9C=QISgz-@t(0@@RnK@3t9RDa*s3w-ZwZjG-Dgxlh5pJYqF&vhS(=P{vTbqo?|! z`l$MnkVC(CH%j$O^|v5==RH2jk^bg{@9b~VciHz;e;E@gpM$l*d{`T#?+JaBzB4A= zE8(7t%8^)}`C;57W*?LNLCVP|KI#5uk;5}WloJnf?-M2LW3qp$a$@e8GHxob<#HasPffZH$mQchLd?$pG7|9d@gZTtTz%%A7$L6 z{oD&C=3cPce^mYIb5;E+XAJ5rb;P%l_Ne>Is($G&ePr9;QHzOuRgY?eS{qrdZ>;{m zEs6O*#APj0);d=I-#7Z-@m(OF^+;78)%v39b5+|^xmtHrwN0(Ls@58nwL@u}T4z<- ztk#n4h;cx*Q?*~MJF0RdW(`%)EQcMpYZsTBE8BYVAk$ zS*mTST&+8*##612s@4>hab^tFnzR!0oB;QfSu>gQf7O186V~5WeNlZ>Yh$V$wH~JG zm-@f3)%vAs-BGozs#C2+DeE4yzOlrthb-%+Qm*n0T_)CH`-j?hmI_EOxjnL0!O()i}Q*9vT9xnHn)!L7$J!(BG)i%{0 ziPd^>v`s!s)@9_Mqa|~v z#zdYakhx>57#}qzteYq6q^Z%wXGTxVtM9DJ!hr* zoA5ja<3QgjSI^QAt922{QDZ{P{=hRZ>@)1E@|+UoJeMLlQqK6ub4om~BF~<2kBL~G zRbV{Tn2dm5^30MNAJt#=ER%X3Nj{^eA62ZzM{P@gxt1c&U#Y%R zPT#qANnhl-6d4EUyOgUwlB1rj;@K7Y$UeYxI0=2HT%Oxe&r?ah>?i8E9eE~-@sU`@ zE#dhbu4&L0^(<3DEYCivZ5bb~53sEoEA>1N<3r!oILNa)YTQ&GWvtki@`UGJ)L4bV#4X@j&=+OOJ^@VU}{DVJw97;|~1h;}l+T}h-*I(_|%k?Yi3*UWWDW|`*nf`KLM*1r; z<=k&2NA8U#^pP=_eCcmO4&~fGRrg8N{e5-MRNW6%_t#Y4)%d7;WNNI`eJ(Xt>V8?m zeN4tj`l9+SSvJ_qo*lNA*lpJIn{<`66{MSnWS* ztkk`&U&Tt@+fw&`>7$H8!uW74RK`d8C3CIriOW4%xeuOje^&0ps&=Y-LuyV{JJr1* zHILl)td061+}}*N2byr-jeGs{QSST5zD>Ez7wsoU?omoP_a)W+vV{3!-(Y^#Juh`H zM)f!0{-E5?Ree-(9sKUl@w*`H~@x^Kw!Tgtgt zsP4C_dxGlTlgd%|V$_(Zdw*)))mW)=b$?LZ6IA(G-M=ZgpQ!3r95*1)V(2M={q^}oon^#-jM1$_XXtsks1e;ulla;<*ELv zaZ~wwun+hrmwQZV9MpI+hB7|tevld;ww3#I>OPw4yBZT!4>9M}jE~w@#z)<^l30zK>Z6Q_ zjHmQn#z&0_vD|}Wd>9Arx&Jdc_u5pO)qN|~epRl0h!>)_Zh|6dP9c za8?hUWSDjj5yLy@*Y#qPjG`Y0i`G-N>D_v!Gg?d-C33Xx=DajzlJWWS5OMuo59hl2 zkBl?-JBkxUit3Sh9vLgsb`%x%+4bLgOx8X7M2czE>N*zxmd?02Wt4ayT-)Il_RQJo zUZlt|x4xtJjbhF!-y+4s7L6QhhCFlbf_&!Q$3D6GP1d`iZOf`BeVTg|cP;{FPKi%G z&4R}VKKL0aPDSW}i(Q%(VoEU2HnKT&V#A1=lu^)$j}K5%Z@ z7%rZ)@-zmoPHRlBJ3>r~@HBEgpJ==oH&A>lU&MGH@X$y$qMeA?SHdutEiRJus3cw3qoMMc{Iny6?iYi!(GT>Oy>b#Eq@(YLmGWaQ4?N$eXx$hmIiBxCfoA!6zNI*zuG zf6LcNB(K=S@oaTEBlA@JkKOw7e7dceWE8$WM5K<{R(?g3M@Cq|PU1+O+qQG3i;Kif zg2m_ZtsGy@6c?Xs28&WzBAutN78mbp~ zBN;d+#-_EcT$Rqq51Us6UM+vCZ+!0hBX=*{cvJtbK6Qu2=QjfRZ7?hzd+pEfvvP1e z4(vb0X9)P+k@tvM*LO8a5ubMpa$4zgG3R3RfyB{QeM(P^&wG31{oA&G?*rXd#N*D8 zn>WYfYhQNTo+gUd6SiiLPw0qe&YkFEvsa(++0uWq-WkvOy~;@+3;fCn`@1%n=Tj8E zmw{i0_iQWQ#N7{@Ci%^0&Y)+`-Dvwe>`$LOUS~j~FFw26er>%w%jXv2kOz8pLeDX` zFP{EsebPW@Iq2*gyRCd%a0-Hxt>HYMc}>wDkc*l7`t42vYy}P*E=(!h{K?=~bK6iG z@r;I@St#~`H-98z-p-w)PSC%8V?3t=_rM7?_N2r+P3jAiEY2hPYF5n}U!J(j!m(i(GTgp1C%V=MzQ zr8RtZ4j1=A%WHYS7YjxTulMD&7B|xxlUs}u$G#S|EbX4oh#NmjEX^^<+0+ z#qoY^#QW6_?^}b5#K^eSn{Wt zWE8tNSlm7oXK6QJqOs}u0Ffbyua>9#c;m*A9->OarCNzfX^r=R{YA-6%e3#SZyQHC zg^4mdmS|~i{$b=?Q$tL9_)Kf_W{mM$g=S*LlXu#ti4TkdPumKQqZPEZZyy@jA9oPr z#vHJ0srATMf3u_L*vs3Jz4arbL^h09ZAY6ow0vX~&fiHC60L#;V%%`R{+CU<1f|7T zR2sD|R~Fmk|MqNgk+}xyKb)9gHg*;lTXO`9>$NIaqLLREts7Pnj~bk`JbqV1bb4qJ zUxPI5c1!`0?PCSepvH17@<~>a>TYTAH1kt!e2!G&R;mIb<)F;g!K*G9VZo)v^`iN$ zuMVd(n*3}fV#a;aR;3tg#GUlR*jmC`vD0MzVwr)$tNAkR{>=N%G0DTl{=Vh4UV)y@ zL9Zi3(D7J{@5PjkTZbb>m4l@$J~`i*ilR@x+ce4?^0I{O2jn4VN?8IYFWSxinFRf_ zR*y#}%Bw)WC?da$pJ?+abDE|DY?4!RL~|FXX#&o;>v>%AT96lP{lYZsZG?DHX0Ijx z=Ik!~23T_1DQ!Q%9?9|W`gcwZaHKpD~f5?e~R` z5}#0T8epma3-m~i%FhCheAZj#S=AL^%EGp>?l`oET_@xUijUNt5CEvLD}_efE9ZW7;8r*oLQVxDthTDW<5L{9Tbj6e4h zw+!00DxQA={6GEAn|nTq6o=2G^3A#?zHMi;jp^URGHZUMczH0JZ$QO(&Sh}EFVL_=fJ+aJf6d`uj-tXHQcs6j2m)m?-W`1Jv1ui?dNzg**nGHRQ{1clF_vm4< z0C%g>G$`w!9+nxvV=~_LJ(Tf@Wghsw)0XzF5gw*R`;QQLPn0ut92KUm0d88mo^QUu zcpI)v-r`$5ARZ5$-@^BW+s=2ev#;C!uCRZ!I}Q_Om-SsXV5DP$J3dJ!$NPQ?zK2bV z$J1-V>5s(HeF`?-C;3g2_VubHs(K%W)9Y23ai85!zZzF!Z^9Qbkq zHavtcjLAUw(iHZuh5Zd-|9AMc3D^htci^qS$#yODeFMLGAf6wgKhmw|JoHpv8=s3_ z@TK4Kcw7beYlV2zrnK$2!6rU}9oQ}~s%@@!=3wLYeus`l@ zsWCHB+^*Tv`Q^|V^YXosBJ^T@{pO_{=E5J)wq8HygU#J6_Ri?@9rNj>FP$=tm|qiW{(gBk8RSU2AndF-WD!=dwLoVL^q2T7A}U@_cUJ4 z$!cDKIqk&yTlA3QSKGRs$^Jm~p z%zKYx-W#6rTVQCeNU?m?7ClYpL_r7fZtkqy-zjd7jJu8g)+_o-;5>I9V~*rp+KIXJ zvd)EEbL=*lV^3LL%(ekKcT6a#J4TfCCEg7Da-`XZ^YDV;EE`$e)Em$GZS59)%bLO_ za-zZ6bu5WXPg8KVTf9ttoZ%wFPftVQNFxchq3g9c_vbby;hqf|4J?XnUR?UHB+r8jNeH!ZWy#eH5rYiV76DhhP zwldCV6m(L1?&U*(|x%5{CzI1QWzr|eg!@!rmPle6Wwl%bE z$`@byo(aCoIOhk>^zhYg#-|DR8&?d8?gdT&tWl;xF^Xwht!Ho&V+vB~&J--=7iS##&CRcpK^$eLs z!xNK@dRH`&s8L=~%Ik*F*t4z};{3yyvoXCGRjjCZe<7Lp*7TV%vPc^7Xt=KkJ$cvg z_h})X@1Jf=Ymig?yx=XGI4>EVg$jwr%L2q*&sj!HY<}S=np~ug$RLiYu?;1UO<}?~yt|A(DFDPa`d*`fMv$Hr};jWRj+9Lhb*lHrGi)=6GO6l zivCTFnDtq!i>hTj1>63Kwk6QEALKhA4}g3&M=!#C*w%FM*9A-vN2MoY~Evk(cJkOSYwX%{9Ar z7QTpoT%w}p^svDw?kN^ddtlz2w7NKp*fxl|W)2JKENW7!AyKT!4~uPbRgvXoLE+WqttGG4QRF^)*GL-KN=w=&SlHU;$M4T)mS?F4 zi8D`U8vf~;X+3hc6;tltF~%);Y$=~~q-eXPu+cMpGi_>YU(x;LEF;CKN0zbuMv2Xy zTl9z3!?f)?hKS>i;>PX5k1dv>5u#sD)W&QSrg>O~iydut>0?ekwj8e;A&Rx?;hdP| ziNzn^#7~9mI+9Kf)Ass}5G8vxaOA_cegnRD9X%JB0tSU?FT6*HPo?`gFAR*;;tux_ zbFYkcIy%Q{j&prP*xI&^R&~O(w@F8c&G!oFAI8LLf!v&}aWwM}aM+PJQ$QhS9_?Q}}(gUgM?k|mXm3IRK` z+I^ac!aHso1pQjHT4u55 zbdYe4NMt?#HnT`}t%xX+IluMemE59%!$b6M>}^f7sE8Ocdk6keM`~-SIZegG85i_c ziz`@%<}4+8RcL19_fKQJIyzLG46CG{tPo^PQo4-D*Xoh}s%{!5%V*d_8a<;3;Uk0&Tq~ z+%pve{tNgb^sK9t#_Dr6R7BUhXc~j(E)Dh)&Ys6(e1KmAzr}NJ!G_wfA?Ml4F`keo z27U^8Zs0V)kAQzb&nM_~LT7QvzoG35$TQ$s&mlhyc{<2*f&T#Vldx?KY#R*Qo}z6s z*su$nxsY#%eB1J(re(lefjfgE`=kYPu&ea3?J29s1!0^utY#Zb8FOJhl`- z-#%7;h`HL}FwGPFwqroJIm`X-mW4ASMTfwl=DcC&%&+fYZLswSbA?=wEollwh?o|| zEh83pvvg}4DW-NVZh61sjJZH`q^SS3gr!8M?B>;2i&*Si%JQ&vSIeH+c&C!@u{@l8 z%Dm}LgeY@;kLBKhu9l;FMvC(_%4==bKC*P`gt_r=K3d+nk1Vz7juJh?Vl4+-WHrCS z@6ea0VlBz1pEQ?B6E3Wy%WK-iuYn`*+i*h3y_N<3KLhXM_hzm`r7WlOWiiL)2p6fo zm)GQPx8(Tk)^pD1z%P*ZEAOKfaQ~)zj^C2UUiz9c<_s4;K0aErYiUiHfJ*?^1x^P% z5je~(FOWdK^YRVfF?$AzfL+V9zXrT_;Xq*7b}aaRj+fGyxVAb$;f1M)wCe*o_U?(y!ZzkedLxW3QJ+8a18@JHa- z0~2i@!8zvUl!W{-OrNy{)vlR8zYIeE@v^RNl+}C>wgoR=rp=AIXs$cEt>}~e zvlh7fv^nMGfnrnmGHs9E)8bPH{b9y3Ek~b(x!5u7lXht3Gs~Mft%aESS(}wPTC20By_hz8wN@vxnbt2o z)~m1kYnJ(&wLuN)i*?#ZZO*)xTEE0WV%C-)TGD_$nmv0DQO_Byd3{W5om!x_I5%UP zcG)wR^{*G%#M`84txul6)1oS+5nZB46` z)*m?+M*O+3^`RH!}492t_vdOa>wj2sqaUg(>~+HGj47}%t)#lSb^`|(iG^!n%^ z^C+`5vY40HGH0E+QH0rAuA-N?VxAdvIt1hMwK8J)l=hbHX@jiKK9&|k?tQj2oR!)- zzHL*{Z{}UgW$ZHs)GR69{p_wa8NXiBFP0apgNs-vn;W98T17E3Zz*g2B(E(Eb_a^; z)5};7r@*{rRglOu$jjOZd2fik>&W|uwCNq)&`%=KPi_w_<*f2ONIVc;){Tub8e4J% ziY@8OSd&~SF2>gl7JuG8=>G|8gXgd|`1$zmm?Rg9i|Y-7#frFt{vELvS`2HUF>7}0 zwt5e@dw7f%r+@zR`4#r?C}<)lv4@B6|E)NBLZ%q{I16$372f+I$hq%Db`iU;o_N?N zuVd!>>==LQ;eX0zbL=cyU3lg26rr)n^_ADNi~JkwiF)Zx&SRMChUD`UFIrV{2A)4) z3>x1{1Y9fNX!PcQF=}itk^gx%(~GwUjMl&%?vytD_>f(shR(M7Yty$mZH$21!?7Rc zVOk5U0ha>5$h!kZBk)&#%H}s^@Lhd+j|efjho@uW%r=HUI9L4A`&}AxSDyrVkI5w* zU*?7A<+eqNrRUH1W?dDcw+4PP=aOmQx)8lNaLVCD9hN?K^?u-|zE<5i_Wm6`x@&|8 zDNx&4^=@7L<3{X#ZYkwBeJjd&<{kF=dRKA24QgYU@vM?P(&+a7t&Py*!$qAT>Gar{ zxAm{JB1EU@sq|{24;Xa@^b);>tLPPGPcf-WPGiQCD&k&)f}*o1V01s7O)QV8BYqy4Z0L_Q(a(}sM5ml% z^clxtohu=0H)X?kwll1>T~pPYO{x*KFsuX3fRBiYdhA2ZJ1cwP`LI*9jEG5)W{+ zi}Du1ZPpkyKMZhOT|Pj>fn)Q(ZJXYOi`G?Q*7A>?j zhF8v6&LWEkh*q~&8(*TT>t#C(5TCD>F=|B2a<;35wVR?|Myg8#9S`bGxKT5@kQH(~~c&sZYF$b-ipG^i&h)I7{Tg+S!y1 zdVXW5<5uBF(W8Wy(XM@u=n4(O#m{*g^w4D2O_m~&A{pd`ArFH5G<*!&zdE`LeB2D* z{rWbtFM#h?Aum~TQ*zT-?h@F+P=DgPz6UzuVp2 z-WU8a;CIMvvhM`{KAxLlP-!1NH}U)p`iU;nZNwhHjXU13g@@|IRnNgKU$IFSMG`- z&aPD>9j(EsTO*UcKOo#u1NvJyGwO+s&2x4=i8a$+8T5f=>gd@gMT+rt>N=0tjB+M_ z6)Cb^ION;+1u)k4H&$3|^Vm0O4|RG$e*0CFGa2M-DX%--B_G_Sx?kbf@$$d^I&b?q zc&tmVg_QD3x;8{_iLs^B7;nD{Zk@)k^``w8$1E5(u03C6x;5yoJ`-ck!oG`4W{hbe z7}KtOi8gs)?3xPstBV&+qrtBPep`%?}iXZ{9svvYioTzSbKpOP5yaWNac@vMPWBjiP{cVt!xj5h_#sQ~2(EO-wl=Dx#cT0b_Iu51uh>3+fWLuE=YU(n6(O)CQ`RPIC zpxTiRKi~(uJS>Cn&vU-Nh;{rDKg})c)zLf5iWFUr&$O)fuBBJZgmG-c3`^mrw{-Ex zC=s+Vy_P<*rar$s_Rc@0({^OJtylOkQVd%^%QEaE#^)xHVpx%J+L=mq^-hI`in0gB zYNO6S&{v!vEYg(DpuKuC+xfcxD6y&8IIXYGJZGX#L&bG*O{;%8RNs}UtEiacnwB>1 zt)6O0XJL5EwwN~zb2MrV8(L@3Y@>!aGLIM~s+3G*Sw14%@eF67R;8S62@6}ddoMUC z!MXIhaP(AgM8!mwO{4zU-To%xu*2#&*?O0qamWOD-@r;H%Fk>GGRLjX>Way5ht<(4 z+g3kvrh>EYX-^wDgSQ5m$A^rtGj3}j-|g0U6wj^Xe(qM_hHktWxUm~Mz~AiV2O$18 z3wztBN42?sKqAZBPaSOS@T^^EThHCL$Ic-0*oJ?)`0s&_I6u1ZWALvZG26*s1b!Pg zf0oVac#|U9W&b?ny+xLI+#C4*z^gX;)mgzEb_ALIKlF3y?5fCz!_FtA+nH$R)F%Fp z53?WG1llGFOl0X$yr1j2OIFP@$DYgV*AnA)sytQAew$wHt_OaqRI@FArO0KEMJ~3~ zNMZRa>e6oOpOKcZ`weX$YGg?u06Pk~owC}3@M?x6pS1vSMi;4t8&z|+8K z-0Q9BIXIy;CuxV4`un_ofZw0S2JQLwiKa(?^%tqZNe(?}26h!g(6$NM?nGPaZ0*)L z!EsXypIpTELX|G!Q>jAM0qH;3D?X?$HiF|fQIDAn{ygA`*=#Y3fy+T>&MZ4jiJ|i> zJ-Zphp0yK& z=I6E^89&H)ytA^nRd0;8Zb3WaZKeL=*txXY?hUPthW&;L-!0QE1@5;pMzt6&a&>rb zUODrCF=i;f3kRlIuCzK})cn>{49Z^4JnP~C;~;(?oi3I+$d2DuM=-WW)-GdS_$s>y z1paU|O;F<^)y1ux@!#$kd>2;ZyHF%kQL{(E>Y`{aPw{fp1G9h1>LN0;r?7^;GM~Gf zUF6+TPv{+|SazMtE?O6_C+7SdXPIEDCgvY6B<|)&t^JsGz*vx>hv-x}nbsgGyBOc3 zuIM~txOV#8eq&TvC()sF53N)7Y(lfu5cl$*)_Oj~_vKC#F*r+R>w%)jjmTyd#rLqP z)){j~8>33)5G5iiSZfTsWc0|ML6l3I-x~QSw|Ke3L!|DT$l5s zvxwXkB!Y*v(&kSH7Lir*izhd?Yn!^`_dtQ1qHg^kmNWCKif*?G3eRRC&dZ78=b3qx zxnFI}MZ4b1XXhN!7r5o?`Zi*J@UwTQZ0B5YHs-g#nVq&E%x|Az&N;7UUKd|Lt{2>0 zo^pT8dq3AtVGF>#cRKJO%*p+MuVBtxYN|7ubK?$}SNHq6+%^pJ>KefJ_w9)e2d)Kv zUGUlV0_NM{3p?1uG2h+}JhShM=y|}ks|AV;M>qQSS>`S309S}T5z`CUt45#*|8^{< z&k}Fpjrsi6_-a zojt+N0nU@}Ep6k$vB0)6w^Q3`+fMkq@Re^g{oU4UyZ$(}fAnp9Hxn)EVg%1!VH??N zxM<$a*O*nPPxO}5;bLK{ochTf?9rV6-{{lA*?U6DXfMPzd&>}K zElWRFoYNvNn`*7|<2?Vzq!K}cesAROn)9F9;^^AgX3qtAEBwBjiQhQ&VB5r+8;#7r zt&4thxWAYJUlzj0E%2rAt5l+M=$+`>8=DCY@i~0rL`*Bh=g{*YQKe<#3b!wLiN9+d zX3igtMCJ0C#Eh369mft97kgR-i{z(TIxMlpMfPquk2-p)7hn96i%#L$gthJvacxNhnSOhum~pL={&nLN=e!{}8&%(`znNM=PrE2W&1haBB6A7`|m zzcf0xdSfH|XZVt%L?h!xgu`|O9RE4N`su!Y zeqrEb1IH77eFNt-p4<2PahJ|dGlTW#PdnME#}gd?X@%`a(e~}^V146((e|I%=vtjRZ8+vDI%OZXBDUv%Kw!1YRJv=4*tIpKS0_+AIN zCGf#b1EUZAUR+#g8!WPAITCYvPjN8>aqEM)H9!oL1BU?*2R{e+WzcpvbdHBkf9P)q zxf$|z&~pm%FNkwX$iKkO~uosMCcg+JxQRmCU7U<4rp5uZNH%H1lW+OU9czw z8#+Vo2f3+t8~b+XT!Lp+I#DJj2Dmq{8Tvm!e8oZatq#j4@lVErU;jSrE+lzWDA%wL8J7tJ%n8Sc zF~yUBlKzWL#N|>x3FtPZhJOphd|qU*o~O}>pp%%Jj!!eg*`?~JpaAUY&De8EzcP5H zIS+o1Wx7;JzqMwzIWh889`C~0Z-av-Od272Tx@7`>p0y!xX}o4HdjL<@d3@^-84d6 z8+B1na<7u*=Ab^JOy)RaP}*tcYw&A*p+?5hhy8;NRp}!_#a?5>e2b+I#3y?^uzazIixoAk zXtjExYy!>zwXlYq414e3_cs7*lUCzRF(Xw8weNQ}60x z(3vzM?;mTlb`uAS5{v5_VI68~rK=AYMFSfcN1vRt9NdNdqK-CWSgnhe z6g&Ee9v3d?E86VRhMpK9qIynpW)XF@{TQ!&vrTbs9C69A{77H%y+M%v=h`*6uJB73O#cIJ|v?_?_L`tr@h&01#t zM9I|F6hj(`^y}&x4~M0+o;_Jw%&S$~`25`8sy8Srn%%po-;D~e-Y!^6TrZACvwxNr8PYt}>>jB^ zra}coxqg|g5!t;(fxkPt4f{6}o11oV z`2FIi4(#=V)0)0|gsSGBz99Vu2=ta_s0DwfwzBgN{$)1BLL&o!q*pKqC| zpJS|Tu6YOaWLiGP9=5!i&wTFMZu5_E2@GS;32Iy1wD)rAY#Jn zy`ZPjm>;&;@Z~YuK6E~behEEy@!Z4SH*8PgR~~RK8xGq$aQ1^Upk<)F6!hE*{Ba6W=dcM#7hRnX=f{9-M0)0o=XsU$*1N=9y00vMMd)!(YQo_nHE9{cknbIm&;57@ZN_HAkWv)UC&YaiXzE0(dnQuwNE$Fg{SlS)}^ z;RoiL17ZKq;i>IwJuX|wS=)Z6Z7$+Zds^1cYl}KM*Bk^+m9-h|Q^8?;rj^a^`vCE| z2fVg)uJtnQ#A`S)dRi-PKz$Pe7=LDL4M)dRC@);AH%j5MGn|{!Tv+w z3{RH9UJUuI2F~!tSM3?Wc>vBU+fw^laF&Dfbb88|&ftV}?uBr`0j7HPvd9tR9GGRQ z?Gkc9dA4-dO(osATf=^$mv!}%MqiOfk9a&_L^i+C2fST;`^LPNGkqh! zm5Ln)oev=2IBl-EunlW@)$`l_Odj7KQeXXUOEjr)?3-m+(>$HWmiYcfOGNT&BBo!S zn2du8TW2B87pKqmUyj&r$yr`lANP)Ve!ZeA{(-}e#4!Hn!5N7hwE=#QZ`tjbYH9RD9;Uf^+`GH#32P|IA443bA1!{ zC3zHZvRG-C+!vh7mr}Uewp;i(VA8GEuC}+quTZG4AD^`|^`ijGlEN;2Ch%9buVg=r z@9BMfmn)=ZoE@%&k&$TM)d(?8WT zC*M1dfP%4F@`tgjkc$fir#U@S2k2>F=gL(59PbxRb5?Lh3emH-$#uhLFZLiim89jQVTfav^n}^4~XxFp;AHs}D z&Tfx(!{va*h~d~X*=&jS2I!2>-f4Gi4K`16c03UwdY|zp+`5 zdKGA#=-ppzeQ;SnGk2A7VD13XIHjf+dbrBCd$N_NP~?W5&GWnAxF06Ik7;Z)nf=Ac zn<+qq4ZfofUR+i*NZ~IA>7mB=Go{7g#BGFgUuAvU!SBYp9|59Dl^VJ>#9M?^X(KY` zo9?`R|GTlrH&BeR%yJG{=`D5~A0T?ane6;Tcm(ao{WYqjyMZW~dzav#Ty zN8gRAn?{OOyYl!7+{-^_}Jk4w=hrJX~dx#IIok0*_MH0 zKQ};lTw7z?S9-PK0KWNjwQU(N`Cq}egHN3+ix;-l1wRh*Ek~b3ukChNXZ%gSzc&?t z{t$4+|JB|81Tj1hJq@%#dnV}7flp-|VVeg`{#_%+lsz^;kAV9}h9jph#)U*T+CI%mJi4%#&9P;glYOA}(zNzn?V?@l{&j#e#MxY! z@|~;W<#R@^w4Et!4`AD8lb73`pl`5kp_E&8{(NI|$=`XTwA;4EKi4NHul)^dBj;q} zex_BgqFtO37fac$pe^J1I$v$uJNQcupDV`1zni-!6tv}8AFs!fx~y$6^o+rCCqSNT z&@|_Jw4GkFkZox|eA}t-KAV2B51)<@nVNap%7q_t_0`9*yG+#)^FeVV#i?S2ZBaD? zjhcvU-LNRXHi&;PaC`e)`+ML$h~c{M!uC0c;daD1uI>`kQ^dJ#!GWUb=R&p>4Obe~ z!QZpDoZk%aH-gjLf1o`B_NbZPhS$5BHsDzS;GBJ#$G+MT^B3E^MHcX{W!~$b4g9fwfnr~!IRBE6_XYp#{h7AO;5UYR`>-wkEg|m; z`EMzM?Q0>==N~8@?(FZlxy4(YXjWDXzZq@J9A4yaTRZx@)}a2S=l|}rRsYKGzw-NE z)d!}$ujJ2pXAPWP{1yJYY&+Yat?OBh@T_0qzw255()0JeQyr6eI4f<9-0krLdp#ce ze82ttxtslF_vlWxyZ9UBBQL&kor6t{{Qe66pP83`_gD4(UpT%G{LjVV|CF=SSO@qI zf1Cf0_LKiA-~Thd{ELHr{hwNsxi=}+Z;pFB{1tv#XPoQX*B)czuke3nY;4rv53Ci9 z7LRZa|5x}wqvzM0|Ej$I$L~&8CCR0C7MO|avd&KQm`2V#v^Zz=3 z|E|3Mf7f#&_ijJDm#*I(zru`9GR)JWZuSPm1xI>(=ut{J(mfzohu`EBwFO zhX3{Y|KoRDec%5P|L+{r{{Cm}RQlMj@ZS~x9q3CZJ}!6NQ~eeGyPowcJvB~daJ0>k zMm&8PYOVY(onvSwvq-ta%eo?NmA_{evlzV1%c_kl<@_^^S>)R3W%Yc%&OQnJM6W`v zHBaZVe=fDt7|^Dl_0icfPQSEi#F^)z)+OCDIDSH29dgHqW96rS?*abB-w(xjXEO`) z7B6f1&&SHIfcy=f`?y)!Xpho6jsD<&sy)Qk6K$shSO0XZ{6cU(fWx*XwDm{Z>|tr6 z?|?G|oVj0)mEQ`^V{k5k;}4DroZR5t1ZOBXKf&1v&I53~Ain_laL5~MKNM34J`RD8 zO@M0x*8%?Hr_?4KH3F zE8iOOyzo81FL}@^;KShbwj~Mbk2vQ*oPYMrYmQ8A7S0&lh0mDE^a9TsglE|U^P4vy zo&hgHtxt|73%U$>W5_$zx@PY6BS=K8^0I#Xkk9-e(@x_=+kV!7a|ViMqsv&ow101TpCXMo{(BSaoxp}#vHTT9UyoAO0ui4q`z!DK zZ|uEyd{tG`_Z^D#5~>h70@7Q~2?3I`jub(PASx;&>f}nIMB4R>N zb4ox!nurRBf=E-a(3C3eo$t;b+z(gIMXvYuzTf-vd7r<2GqYyRnwi!1-fNvCP^#mL zW<<7;vE@Er8<=|fC3A4#lb);<^T^-$ZEv2M_E&7%w#@?#Jj2b(&xXf-+_YK1w|Rs) zy{W6G(VHIzvd-vZrq8?<+vJ7M{om~yW!8)t5nHR*R{yB>qs_ykdwCY;cqlObfkEc+ z`0KF^yVUa+*d1q<#Egoa`awPam(AnNdzJfmhQ0TNf7BmCO@YU5#Qs({!M7l6w3+r{ zTx{1P3BCd&;?3xBeLS(N-Tt#ThnbZ-`gp>QCHjWBhMRUPZp7}*(JA$woTJT8ZAQo5 zSon0RYfQXp&}NHgcJv|tmUsG^U*>J`MEK;c=Jzj{h;E;G_MYt!D7xl(^VMaar^D)` zz^m<_F?4Fx#VtJbMwc!3!a|c@&@O0 zscXh1EcZNjprQQ+d zlkgbRvh0w+q<$66Hz{5-`RlO2lHQd~kEp_?`rNbr(l^_g-Pa47-IqJ~`_z8KL>6sg zX6NkTKmS-2^KR)P=H>Nse2WG>V#Y4m;%U@ovTsbeex^l45$XGc)b3*+F){6$nC9}^ zimnPwAuY zME*$Gyz7UGeDYJHW258iCr^<6dS7(BZ*{SBR$e_GGy7QQ)YzZn&8cd~W7sW^9BGnQmyhW>W1D~b#?j`- zLifewKkoAH@x_}OX_aEKr;YVRU5GcihgXhi+M;V}^Xu_uc99b?`!^Sgd`sGD^5p2) zp9;l9P85G$5&1W^e6INRX89)~@xQ6)yfONIOJ~&F$}!VE&%ORVu~TDq<(SAJIU=Du zNZkP)7P_!m?}?tNNAGJBHTPD$$v&WGYLnh+Zs-r@RgP)%O3ozotBOvMGGmjGHxjzd zxdSd}uh^+Pc8FzXgXnj)?bmhaoO@ehd9bYI!}aHSrWV})f@OcJLw}Um*=xu0ThS9S zM@znygm2%>uN+fp@fsIC)R(x6 zVl5xGaV8>>36TtgKauS^na|o+REn| zkfHAwFBhF6BJVBov7$3b;>z-C5f^dg6P;04K5?xToryAEVvg)dDX^xB z=_#~Z=qRBJi4XgB_D#m;F(Usk*Ow{9MP6Lw3Qm_d67xG2ANLM)*|tlIXJz^4o?>MCy{T~dck!6>1EI1k&_}n*)z;cZ&}PN zeCtf)%FFFciPKHZysl^6mo`^216|oXAN|oja?kNNv!&{|*nzpKMfMsRZ}rzqdpr-2 zvElk+zSZyTww;Ob%`F^x|A~0BS;l#zYx%4(7HF0jlWWV_^&2k7oAEN9H@=j#p0S!$ z#^mJ2GpupDwAgd0`DYi4dROG0?6qPxyi+peDH&rsueJO1iE*tD#%_|XT( z`Pzw{2R7tsymhGCKPDJ&p6`;YvG1Pk{vMx=HlF=7DRn$JJ}o(LlN90X}&TH!o6ng7|=7BsSuOxH>TW5#V zoo3hlM(C%69x8Tgfi<6Ad%o4=u~ldtFb%eTM#=l<&}N1LfTi>96*?Doe=Uu^GF-*^6y%U{nIZ#FDi zmsBvp?O!DFRYHFx^g^NgW}B3Jb9B1A;mJ>ui?$x;8zg_uBNX1M4H3CA$6Z zivIDYTauQwN!R%@`-J42w#`>+Z%In90Mi&G4Ph%N2x;pX7|fj@pGYVXPVG?ZF;`=*3Pb*HZ_>s-1c)o<+-k5)B88NdMn;M zQa(I6-q+8fhowZjzg(Oy&l*)WDa)Jb^!MTSCdY41*U35dp`?v_(&Y(a=j4)f`Dmf< z|1q5&EA$gR(&=}^hvK#mul?Mt(Sz?LH2PE8{eDjI)bBjwd=E(ump(zA5s>A|L8*eIPndSd{=PvhBkiF+F zHOllVS2B=PcC@edy>TY*hUtNqp04NjRU2&F&87#sr)~4EsyE0id;i|RgB!N^r(GUt zUdVnqFk()W|LpnaOuYe@0$+^&(w}g=v#Am`Bk<+uc;A|igH67kwS&cu?e!l>Y-oP2 zP$$@2?#VCh)X1!@dO2|Ok+HrFRlAsPBhaZ=vp}Atmrc7>_XfX<4hwd8wSwv2VM<_6 zo;88dqn|gm&;AhT_(9g-{bfC-aMuZe;aPJ9Z@3>ev(t(P)@*AU==jnwv!ma1|B};N z{Mqi8c{KlhMV=`1@vWPqW(d7X z>fY08fP1ObJt8*8RIBf9A^N>Ur(*e(l=nqvkkHFp1ft#*I$m@p{5sLq4VywY9@0VzY$!Ghb{j6P-~#%ekMx=DjllJ2wn=y(;p6=ydga+>3;6 zCwZtlEUT4=7li&ctgLH=#5hgpqpw}8w_NC}w`ThL%?@|JCppP2@&iMMxmJt(l*m7o zTp@S22=jkmWR>fCnIrurhZTN4>>`JwME-Jt`z`r$(LZ79M>cT#o-6iU67%R8(K)lQ zilvhx@=1*jSn}1)!~A=jHcMjOwGsJ;-<+?H{%bN%SGW7rny1WJ-=&X}nX|)Bv~OJD zTsr;bmG+JMUHEuC@(odLUk`a3rLJFeZj5hX$sd!s{PF$oTJqOr4BSY)<)W=s;{W8n zx!lXd|DrCpuixUwt@-}E=oC)4mW<9!Y4^EzYgu*2vjm zN?RAiPWzfelUWB24$0x4`t82@YYxR5BRQNEH6WR>R9om@4yUPi zV7$33ee_VTXWet9kFNevHn9KO1NBz^G|F6F+$PYe+%;F8{Ub~X>C;}v&bnra&Kc?J z5l3eyH1^sQnjL6!a_mPdR}V7hs?`fNbH5k$+|Fq8PkrO< zwP|(g)19&W=-cn`zzbbYS{#vr-?By8CTAg@n%ga4q>e97m&Sihi~B zrvuN6{;Oi=ubk<2?h|=ik+&J2#T_pC`9#09{6=D;=-je(1`0h{+O2i5fV;ftKPmc+ zKN#wc7kRYEtB5~O4T&?)d{Z!Rwb53xX{&J#!)qRUoe;*uY61Nu&eE7*bsU15FF_m__78p@wKpIaff;b#w89i4?Hm` zFf%zU(0XzM^Fr0?!FOvt5h!8mn81gXf~Uu=4eaaH-h{t*G_Y;a#=yz!WzE|^M+EPe zzlH1X)xd1+zb_EppkQ!rR5Nq*vxGq3HunZ+eObmF8kQwc;^KqBAICpr&OeefP|qC^ z%+{}$d4Fo2K;nB}2IiLOYS#B2ANVx?uE4>UBg}^H2LBj&XIaaccF{|Hf4tr@SiM_obFuCFzU5s?1sgZ)V_u9L;xGKeo%iylwtg|G^*PP2zaJZ`Jfv z-$&!(%}Zq$rfz*=g#YmAc=L6w#i<*+`g}dd$D5x#;jTL3-?B6DWOOq=Vq}`s{aj*SG5bVPn*qZE zDH8khPraSoE&i*(2SWd}sIq&a(4EE3yR}9|wiG*QqMz8Uh$~g}KYG5k={%-t^1K11 zg7t5eHNTj&lvzt!2HOk0s9!K;l+a&`&Y~)(T`!ByR-rro+$S<#=!-YYnkTA$7PUom z3W@&iuh*u0AoP3E?%wb^?q$;M0@2^IV2UeQ^dr$}=uep`I?F`o?Ii`>YivKeO}uCQ z1fjQ!{*?=bT_Z(*mFR@GPIA31@}1)Iqp#emUs!xj5_Y63` zOGUrN&)Ho`qTf;4Iw7$Pm9_>5eMIPPLSz4j?%zg^5dAhHKPmEfk*A0}DDs&i_lo>i zkxvr&7b4#=JKjA+{4I zs80rj1-pOJ#{4kiyU1ZlC4=OAjO2W)_`gZ$C9{8VEfad9&|^iuUTFHLGaX!CEUqEQ}=^!pLVwz?c+CGX5ied?hao)#hIY_Gi-vpZQg+v z-K1+xcjX1AlCd*&`8L=6wbJW$suAIyDRr^4GP;~=lF;bX*LcBSgR>oCi;&A_f@8V3$aS^T)1G5M4;lsV9T%BqxOHC1*xf+&pb*q-{ zTP^YJNy!N@rk|yy$=@UWzckM>|C{qrQu=hq*s`vRCs#Md&#PZ`b%&*Ob0hD!qJ{g^ z#dLYeEsfmUO1$RY`@4LrJy*uHs{Ga%bPl$y?0z)M`;GUBJa?sj?l;SAjd|#%JU9Qf zIQ7)E)s1tD{O#$BQ=1mq8dG2Pf-?!_T$`fD$M%#pzhd8jZ}-I2jq8e?hS`>+7C4kQ zs-=vp<--EL2ZBxAW#w67Ri8xv$~r3>k2)A{TE+Q&N6T-Cc}R4=84~a{E1A!|Pjn*W z*<-K96Z)A zo$em2;l6Cr=i|8&{oFTh1^;CnW-Xa6C*BwGEJ^)U;$;kEmA@(6sP9YeP~#T;H*zgW z9i8m5@;NJPN$S|I((^xF=%2(6Ity$%l%34V&(~S*erJv=N_}hmZ+y$F&5YKl!SW0o zC(poDCz|09BWrASmd*#QT2r`(!N%(oY2ui=NG!P&@F_%Avz_6ZY%E&JLJ8iM9ZBi zZh7|ZShrSiO5(DZ3)8xpdj|d;?H*6;b@?WeyJj%{hpVxFxd)lW#U}+W$K~+^UVPg8)ahg(rgWUA`^{0N z*pLE&lKscTKG!GS1kaA~S2(jNX3wS3=KIeR{0l~pja`>L&dgpF=db%@0ngi|MwmsH=^?~jXpbKnqDJzbuzodQL|Tqi_luh^gZNflSyT@yX5v0t`GbYCx(zV@EX zn#JAXuhrJtd*7$!UDwNO6BTx`zmTQ1Y`mFx~x=K+uGV?2J&xO9SJki}< z>K+g}xq1P21);xa-o#WNx;v`jhAQS$p-;bYAnFmJ>FZXLm%H1DowK4}t659;MzOP5 z?SLnoj zP0d4PXQ$jaQpv0p`Dl?pBXZ~}bGD^CD|BO_dvE(T>V(iog`S(!pK_nj>x6!>#rl+| zh5kumxu?WQ*KZQbHxh5yO1yfgdRbpUu>BF9J?|aSL zUxo#?52|b?Ug>WZm75s&W9wMYm|AVkqaXhe=vU(#PtEKxWYB+BUj)vNj4(+>N}6i7iUkYE|33Jy>@WWvb$KRl zDEt0HIseaR?>Ao=W*&dNh%3v*A%Vz7ea*8Y?s3&$xI4hNs_f0LC%aGHVoeC;lAm{+U?_TOzosb>p5m5HC|dUD|LAX1^m6ED zM2E|>`22exvhJ#dqBHaDaj$$c{Jz6z%T6ddGj^OhYaQPe7dYsT9rO+dO>T2Zyp@{_ zwsIJXUNJW&<>IYi68f2;$4I|iu=PXH+-rUE^$J$Iq3Hj#?=qvGUE1|Odd13n#`N9q z_m*S~>|0{l2t}WgeXH2Id2VtRieB&Ni%_)HM zrSa{43`I|qzRs28vSJHGXC}}8dv)&KzYXW6xZ7;3V&yUvy~)vcp=kQD(r3+oQF;tfS#lD;W* zDJwcA6rI_e{HJ5}Kh@7B`J5K^trbtk^xbpygT(u2-J@2#q3Dk%rmUCWWz;7pq3HiD zIr%$>X-V>1c*|$zoq*Mss`T`op%9G5w$QX(<2C%lLQC zYHE%DQ1ms?+5cfLYhH(=meLgq7z|bc?w^uK)F+m6lE@Ix{~1Q#t&n?0h}( z@4g5{Z5J^W)>?Z(C>lR_4&PI*p0(D8qCda#)a`o$ z8PR7Xt|g1QSYsm;J?M!8>*MUP8j4;gcDk(|W#uOn9V%X@yu8Go{PiwtjD@0!UA`N* z+7;hp>4l>2Dg5_&Wk_1=)LBu{$|27!8PW0my1H+ctYGPcqN)2u!J4=2{40I;es|{K zzk}}M=*Lj>o8vaEf6eaeP;_?bqj6_CTjMhno!Plr#L-8g=#19S%-a9|qV9Cb;kFW+ ztg#u2&W!(m%A6Y8w4yaPL(!QVCkZB}jL$1gpR~qjMzq`|N=iIg-FmhRMbCDOpHMV$ z$vKW|!P)Cp{29}knG1LSTOVV*d59+{AIl;`(dqsF@BemX4EbY|@QZ`0ZSSo#^mP>CxP{ZIM)?z!{Ky1S{m(Wm5Z7EP1?hQhcHMQ6^R zyT?u&^1PQ^sNLUx6YNfUk>l@ig`zX-Pc_H*$%rl{ebK=^$r|sW==UA|grbQ{e9F{V z-5pWq_E^1>PImmQs!(+3wc_vfgu5JD?Y~16ipFQ=%iQN;Zu|4E^xrl!)9!yor>^*1 zrcWu$mr(Rc`PMx7xkc6*9f~Hdk=gBgT>pkncH9LDMa%PE@|Bp!ET1x_|L5}and7&a zp=e^~?$eu&dr%qDa`)z|$3C&*$`yhxBj@tD+ZVQULeb3S|N7mhyXWvLN9>{KRgOCw zp=cfRce`IiT-6RoSh0tqmpR5yDEjh!Pex7o)ot0yh(0RgIpyok)_4v@XJ$?2+FKKC?DvMBmM4>|{m<`#%*=zpIlmefN1mTZ`m= zQOO_EeGWzUcib-uMPI&h@b(>~Q1sp6IwfZ)Gm`2=iC-oZ-TUo(gVkz>1-HLb!5p07 z3VxNEJveUoWlyC1AI#BZ$^|D6DlFg56N2(>>c4!~Wi$TR-(*73nVDb2Geyqmui9sw z8PV@M+6qMz*Pn&Pub1BfSa-%k(L8&fKX=_4uOVoYv*ZD{oNHNUxFP7wj6=ya&yk_e z`pe7ncRj~Bdqy<*StI8fyUx_G`aUDNwAgthDw(y;grYfbO_>-ZZWD^$CV775y!D=D zLebQJ!*Na*iZ0aqfvBGE7qxs2Ma#WJ*Ol&bES*sFKF66(Ms#I~{k?U+S+R$ro5=Y- z-%;>A6#b*)Y&sMjbd1ALG;Mq*asB?vR4cAfbcEzb?mt^&EEN5tBle8x%zU%TSV!&~ zC%wFSo;4mq(K2@Lde`fWHmO|f#qAN&WTu$0+jg3%rX8g&FP6IiUU2o6vP&8-0%O|~Qc zQ_gXg8j2q7_;wwNE+skqsP-BwhoNYB4^4_)x7gANMQ6t6%<0G(pW}Qa6wQ2ZFd}`= z%80J#$WJJGjUzvy=#L#|L!s!*#KoEB8=W`Fe$BZ=#&l-vP~SQCL(zXYezzEkK6K@! z+vlXA=uq}meq6@tE@+$9}2nOcQa+@7dXFru+?|W1i)6r^Pmv%-c0Z zehZz;oLv64c`eIL&zzNSo9q#}&53a{&AD>nX2`KArpeNRruE=uCSvR{54g9;O$$H0 zzt33MfWu-pl)PqM3-&gX0 zJrFtNrF{7`6PwX%9P3ivP$#y4KAP)AVpyw5C%*|fNt=96!2Wp7=XKlAHW^-hrSm-WG_-a#@h=TE5U-68XS>eb?^Kiu6aKAwwgEJf&3=+{u~$j&%q8=y&uSYF0{F__qxpY>aSO{`ip*}zu-aqd38wH06a)Jh&)%BWJ?Yr zS3YJ;c(CG@%9b9e^11~d3ZkdwAa;+PlJAD12S!Rcdhn``9K9;9%(vtq?LRE_LG(cM zu&?EcRcobKau7S^1!*Ut+7}iNQXfQqVZafK2k8gJSD!x@WPG~>(T8W;XnCcsH!L1G z_0Ij6EzKHNB1d1#51h@JMmdNaL=Sy=pF;{8NZ?Za$oC1gJ(o?c_7SjfH$k6#+M@{B{uLFy?oevyON z0V%I7^8q5 zYxc=HPJMXlE&iy8srkZav$@z&&%B5cCgR**o{cBt%&Z==ALbZt>YqR2srh`O*|l<- z2mhOi-^7dm`Ig6-*A`9lRDL7Ql7qxMsK79DYQZ$m5&0h|=tp-QX0AN$w|L6YBOjE5 z@boJ@NIUckauA+=tS&r=9&&j4@wo8FL3rf!H#`VWzr%y@j92V}$U)@H4|tF`RZn@4 zd|Z0wT(GdjAJyqxaFoP*<;inFuf%z(`iQ)4a%8TMEWmpl{{%#t|gk*ZwN2_J4pFXeUOJm#|2rrPf zT%Nn%8do5#u8f=e>gG#hTzxw+f7(+ro{nY7m$qHT-w%26r=61VM>%rJ(XT7@us0*N zU>eWyF^39R?ey4HFl~oC$L|a;XtlqlUU(YM<@eSoX!(zy#B(q*od;Qek%REWwR=jq zrT53|a4VkvFNRz7;n4$mo<<*}KKlg7J_EAPC~xTr526QN7risK9qb{u?1~<8_CZDT z*>B-Nc=luEX$KxT^^{j+|7D+6M9%Xk{mkrl!p5NGicurzp=eY)K@l;iB zN7;XnGe7!0UDcAq^V|cka-NUinU^5XQ6SG{ZF^U@?8c$LGW5903;S!WOQsP6q**0JH8s(VMvIxFWq-o>)c?fR;Qcekv6EpOED&Xe_Q zPnBBUTpj(Mc3EqAAC&d4OxBu~T@ZU9?SlAK&4|8@D#w51AbP|H55kiV{MG!BH+V(z z2T#7yhX*MKkz)@zh#XXX?7}P3Ua^L?yk}&cBF@^fZV~4ZS+B^;8ClQB2kRF3`B|PT zc#h|}g8a0Ub&U59)+ydcSeJP3V7=n`pY@FQ64r}C^4`)y)+ydkSO?0>djsnL?Pel=e>gU13S}Xo#6e0^@jJM+_KK`Uc>tIi@YbXZt;G@y2blVM_Jc+ zk0~PS2JbPfC(Iw_7v-!E@XSBzu|8mLrK~r+??lUbgnz6@_;Xm+Gu~%dpNDLz>5Z0k zoAFRi)^YO6I0G3E@ zSicxwAmzvvwH`>hVw%`zol`_k`|u$3LFD*}97Ik%ZI68xf6!CEXb1hqYopEg*Lnok zKHbrj_%$7SJk=%mN!tqMv3fm&`PN07-7j?smRlWdieK+*>2*HaH+X-skw%ev@UHI% z1i#un^EPUEVyQT*o|Y>gQFy#n52PN5ACym86m4EE7Z=?6PP92;%V*V}8oYOTvVEJEZ^LqyKv?*wkUwk3hYhpq3al@{` z?2lJ4rIWe@|D2fBTrb%z*uQ&L6aDb>!LJJa>FL;{dvH#|AD+$CdIfV2Kk3P_s7LV7 z^FMnIg!c}fZ+F7;a`yf~^YD33*@S+wu@Xdr&aX^!=XF+v9@cHXQME_#`fv_|!hnZrAu=)wCZyE9#98Zt(B* zG-*6FII!7|o)L|v1{;<7(X;CQIl(QH_F6dpgVPow-&Ji%5FVr)yt?zW=l$rZ!NHZz zc&1bzA8dRp%p^ul4MtoFGuT-ek;NRYFh1C6-x<%YH{*hzy`RNo9X2r7|B)=FZ{N6J z!$Mh2=`$|`ca|(@N>>{gEdP4}bE!#O@Y6j7%$1VkgV{eTV5YdH28RR+SoW|>yYL|V z=vUTReu4N2juAgQ_StChApRmpAD%dJjQZLt2ZxJ2%0cDPLmz%s_6k<{azWaKr~Kml zXiE+v2az*=um`X8LF9_67hUv(r3X@u9gzG{A6z2sfkSgtFwaCz4gQ(8g7Fp`AMCv# z+H95a$hc=*g6J`h;X(K&IoDWxD?#NM=kIy9-Ig;iC}-S*%p1z#K`m#VVHZTMh(7h0 zx0HjFgZKq5oOt3kQty>PVP52*^4LL7k#^zn13g8R69;mQ2SlIvX`guELG%Ao{FV8@<7NDP{#{cq^K{alre5algySu|%=esMweT{(dme7;W&WP} ztCg4ap}-HVysQJ8e{bPso!FPVwU_l{WV^Or)}z$QZN02h=YDKz`E%fG3kzp_=&=wv z{vZdDgZRsQg9q^&M9w@z4kA~cd5AsqK;^ZZ`G~&C;juGi{zXe4q+IpjDgVJ_OT!*W z`;>#&86k)sNICUE_&P=NT098v-km=Ud+@#|8hJm;U(hPgwWEM#A35dQb{9+|AMl{I zUwVCb+MWWfZ_B6jDP)z?{!Wpjhd%zHr*ilAn_mv;XCzc z>t%ntw?;cJ`yF!Z5WgbrAP14-2Ryhlyq%YQGv?64UiQ=KN7{JVZ{HgCu$O(d_3BpA z4+Delk6L)y-^y-m>SaG0y1?V*d7##ZO}#t^jI15)<@ts2z&tNiE85F*54^4e;Ha9> zUY>Ubz3K7tyzuKBkC*45wu_s3d9J85zp0n!iPmql@UnkS8zlWG&k<%oD=*In(>$%b zJV*3-t&NxGh6CXbdwEXiv8$cs_l($fmb|X`&-2B%6We-up17}W8;j3drInZGkz-lf zczF(q>D|K1^9uVB^ehsoOBc~jF_H*PQ z@-4ED!-LAxU-0x3sP#bXD$h8i9HbqPc0l}4tlFYbT1<)S9>y!>kw*%p5ubZhxP|Bu zXZ;}sErcf@v;)Gg%-+NVWxmo5cEGpV7q;SoC!SXq6}J3=$FImkg{|)lJTL3>yFQ=m z^SVAS>+>_^j3bb7gB;`>lW~Qd{R26Ad=Ft$rtZ0%A*gDoO0^HBZtQ>ydv!)2YEkIIrZR?^PYqp z9yvU6-usY)s%QBrJjiz*%0Vs159}!7C-y+(!~qXtSCMjf>R}HaR9@RdpYKnK=<(eN z9#o!s=qXYk9)Hn;2jP+9KRgJ}a|-Q)$U)?+h&c!&e z&Ru2P@I8xh#CI?H8$JBtyp-|H`#tjpIsWs0&%A&qPQD8;f8dFi?*q&u-uszHdAY58o-6C!E7FPxubOJmUKV^N8za`vdzL-znJd_&&q@B_Z}R<-`OSGI&!?Q5qKCfLXCEgn5c?qQQ4YfMorQWJ z^2&m$&pv`4h(929*jJE)w1+vt)AoeIn&iFtMBBxyCS`T}at6lar^g!%rx$^9H zl!LSnqQ}0297GP{KlMQLKrL4}_K6Rkdho;vPhRj7L=LJPdnH8=q`o5dk%P$D2Wb~X z4kBm2Lk=Pbk@s&{#Nx~6FJi@kK7Ofw_)|sFh!;8Wg7B1+N7@DP2UI;R2dQ`8m~=aP zMijC19~hh7UX>S%q&?oQrq_S7a2oNVZ^bS9GKf7;+hH8BPJyhStV19?>nuF$E(njD z{XymM><{qB;n|nqLDo0QRSvR`QO>z9^8g+>=e^7m&Ku!5Zv?p?#X7(}FV+e48IS0J zv;(Rfo^h*oL3reh2Y3*kaRCp)Gd|!!c=`bzgePzCAUyem2UiGBzTrW5`UPGQKZr~H zhv%G>I6>tpM-QHJH_AC5WnJW680#kIq^y^mld?W?Zpk{x`6%lj=asB`oMW;Ma*oOR z$oV7d8t0X)Yn)HAu5pgX`pP*V?Qz}+(mwux>Oc9zUl2J+J<37!DJQR#gYe{)xKs|0 zK0JsW%8{c_-sxw`kt{~-sFYroQu$U)@FGymY3 zf7qpe@t64rqDS2MWWIySW0!L9VTl(x*hkh4^zer~s2)6W{70_k$`faK=_lkMa*+B5 z<=hrIsB+q)ob?Gge8u{s4C@8F*5f%IJ?tX~D+q7(n;`i{4u4n>9<;`*l!Kg0TjNG} z5T5bGIX(L?^GCm@^S(eHtJ?1koL_4>a`ae76!rZAWZmIAJ>`ljcYfc;4t7D#f3UBp za?Zz*gVi)a?Y9HLCbHEgYcAdE>1a!9K=t`LFKW>`l>wVQ$uSI0Ag3$!LG9%%4tvg6Qn(DpLXE2J<4fU<5Icig>lXN(D9F7^be@>N8`p{+E+wQ zyNdX!{;PkKYknxFeRxpw1Zw}Ozwj!jAJlKn7l?nf$GD;%et?=UQ0=NcZI|yOtY@4D zD6+1pJ+%*#4`-ajPdgxXo$WZ|L$2dl{eUNaP~!u2JnOimoVf9iby)pWzd6^yZ;*8x zM2~XSS2=M}AJlUfkoq9{oKJx8)Pq-Ke?Sh>jw1UBau9uxb|?qo@drB~au7M^Ad2j3 zns-q1tw^59zxK1D_BZ9^T~X!QFYww==pm~r6MSrrMf$A5C9okoaK>WZi?NbiIqlbNX5I>QF@Z^_vLFysL9{Ql_YdLto$U*GT zAJhYpgTIJe`v*j>JkKTYpteIkX;1UY_|S2O|BMrm_Si2$@<+RxPwjWjt0HplGl804 z`c?Z^^Xwc4+TXN8yR@UIc?OYdo+#ING;hR1{xm+~LSN^d&O?ola_p!ca@x^y#y{nH z9tdKOb3qWE_TUxK=iCk+RDJBiYdJjUYVdl#2BHsApYt~5>3?|Sl+*9nQ@J8?%ISaf zLG)B#<%|bCZ@TlGiF%alITQAHUPTVJ8*-o5G|p%7sSEO@%@q6SqX&`?+5>4%{VBJ< zh*e+hQLcWI2j+*4FGa>5a>kREGrqLkInH$4G2W0n=QHDtbz9Ln&#_DUI{rYbzoZ?j zzXa(A^gx}Dj5GY#ai{AhNZhPXisXawr-&SXdG6A9G(M;Q8i%f@>X)MCP5nnseMRKt z0Um@W5AdM!#6`Ix;|x3SAUx&7%X~!+s-DWNaVBzj>cJBiNM6xr9xGyp{86s?)clf1 z#uIr|ByXBu@`)To&b0 zTm2}=IKaM+2gV!YgYn1nH3-kVg9mj!+&LbQTmCr40qr9P83&5!ImZY7I`=bp`h$Ga zABx05f3$3!|8~DHE}Z?N{YC#E*M8A{BH!2{zqF(Mq5Y)!*8ZRze^rk>k}vYC$h<-h zt`dLv?hkSvP*(f}bK3XQ;3)?=Kd5KlYkN=h;qjYtka~-ly)`@B8EK5y6a zZ@qsq-oBU8Vs-lYe4>3nMenWTzT-ZM-d8zp-&fK5DclF3|GC!z>OGYq_Pv!V_I&_7 zZ{KU5x9j}?Jy+Lr_QP4y&((j()7CmK(R27|_PM;C)32=8-a4O&w(lM2J%s)*wztk} zirDuVI@t+($rEwt}36_>kTc$pgUBgYxgzTq`XJ>X`m7`HtSj&!JaY8mLDn(kApWQvJ$U5!3lCBb zs=mr;mwYN}edY0&{!v6uKPjS5Kf#bbkB3_6YkP_oM5_y20&XMfhd=YIXM z^n32h?fd0bw7|AFv| ztdHn{l!KJBF1{zoI*1$|gh$T$Mm;T8UJ?Dg;*TP7c=Y>9|02g<+Ji?vN8&e%<^kfT>x@(Yq*<-(?1=ki{GJ>Dx6X;0rHG(L;(U%-0LL{Hxf;gYcBAoOufmQqFn-55n_2i5<#8 zOMLiHX@xp`n4_f*|)9+z?{(SoV4ApxfA)Ti_ z{wQLfb%FNOPc27|9*7?6iX!@~ONuH-pY;hIq@3@mR=FTNa`cdc><3y-{P5`M_e%7U zgXEKXpq7L1>?2yAenAhUobeA2qK91f9loQ%gOu|<4RrEaPCNYF7UmavAiUON9>asR z<$jy$@qCIsvrB>t!#a(MLdA2~d7c;v)`93DA5a`FTZQjQ#+{!&yq>pyxR z{cG6~q#S+Z^gle~0%W`@(jGie7eRvR_euf9( z^}e&-Z$^$i^g-wSX7+vTYq|0uept^1;vYy}K)nae@1xnz^&Yg|qt^S&df!>^E%SSA z_HVss&EFH?KDOT9)%(hNpP9cWz`aGi&#d>I@4UZ!=ly2A&#d>0`Mo*&con%XNMoc;spKjez^7jlsL$eD-mn`OWerkQ?715`h_V6D)Q024_PdR${53h1~;?=m}$s0UK9wYrE$@&4ZZs0FG2(NPDL=I99WZk12bn>jD%7Z+okVl?_$P@V^F7l^He0px9 z=Q^AN(ZBHIN!K}e{MU0G z5dSqFcjgD4ILX7ENIo<#=qZmLJpHQUK=Y>hAm!wxbiOVr&B2UQg%$M?ZZW5T3li zgPJGJ8~H>}^Q!qdao|_e>`HDcPqSn5{2%$EJ-$bRnkVu@ydZIsA4TNkNs;lS`Eu%M zK0wM9$q)Hbq+QL6GatmE<3`7s`WZJYpO<+AUuBj29VqEv{8N8H+QT13%JCaif1Ks& z4@kKp{^75p_KWrx{h)qoKk0ckNIm=kX&-+;?9;xs zg1i<|?!4bZef0yRJ>@w+pj^KvJHIotPT())>X-Vhaj1XJa;Kk^!-M$g^qc(YI9EA- zp?~MS9=?O)58uB*^;5rN>-TLf$3N`gmm+aE<54+&seev?(O18a<1aj@-{(R6QUCaU zuRQybe$NM)FX)4O?^k3#!BdZUt8(hYBWJuL2hj(SbB=%XA9FV;=+f?Uz*KmKSO$n|@+%0c3%J=)QB)j#Y~uIqt7~_e&a9oK+2J;-=Myi@;pWU zK>W~iEghF2<<9YfT^$d!tL>{C)b_M}5dUbGcCvgT|r#0pdULC~6$|t9jKp$+uHpLgHuL(Re}1>32o!5~m{eDF=yL5q~uw z#1F6eaOTIUuk}@r{f4}NnlDh-ACPkAI)GoA7xDJs)$*xu>T2V|-DM`J~7?id<30 zqvlr;Ir)MI;Wb~Zf8-6+@dAJ6ex-40UNjFN_B3A2S0jm^_J~^%J>=Y{)cciMPvh3} zF?iy~Px>EZUeMo)$njedIsJ?P~nQjej8H3^@pI%_CVi6p@n$;v-%~?N{X$HExhR zDPm9a0qXb$HGa(p$a|p112Qg&NB4W|X@6;4_(^;Csfb_dhg0tKhjMrjf7Cya{Lx>a z`lr0UXQ^N6C&=@F%2`+O8>C-A>?u#)k%QV_iugl(_^16u+{lRsxyGgOgDOW4UJ<+K zgUD%D;|7syKAiTcuX(vsU-O~)()TruTk`;t7mZuXiJSar9*7gaK+OY4+=}?4ddM|@ zikfdl+C^X6Q6ALyCiP$QpnhpRZBNTJk3PvK?W!Hh;X&Tdw4U0*U;NPgYkjq+^;NF# zMbyJzt*`db<986MuXg#aR#kpS#yZdM$>8}N89c~(uY7s={U7E0-iUJW&id$MN9$A0 z?`q(|JL{vb_Nd4Htf=k7^B%2#r_=d+NVSU{ZAX6(rAU2kN9{BJobABV9_@he&fhy~ z`@EMTceY2n@ceE=<+P)6^#jDN^0cphU|)HS8+*j3cJ+6P*rgswJJ_SXqS|rt_>ElS zgQp$FFQ{?R9{1?2eiel09zAi(6FsLN>KFd1oc2_XKipH{IS6F`=bj3@QxAQ3 z?C_qXzq57zo>t3g2R(Rx4}hQ81F?_4@aW+$`BK02_W{(STz|hpIeEbk<`2KafyaO9 zV-Ljso$bN1@6j&h%MglO4e1z6+HIw1N)%1M?T;|?5Mx^g*}k^w5Rs#$o(qp z@|>vc@Vf`}v_1VD2kl^&c0u(+?SicT*r&cehf;q--hBUZk4xKCJ?!BZ{SCrnN8{9X z^?8%;p^P*34-lU5!u)~<;n_Ff=}-Iyv9Ebjzd`mV{3j0e8-IA-);#F*DgIsUk$%pB zpZff&&#kJbeuK2D&%^2;$T-AL^_OwOyaAEx_@_Sp(;nYr;pu1PL3sSvzt7@4cVHh? zzww9XO=q65ha5Zj2~U3U!};A@{bju2Cy1ZuF}}$&sO9j?Pn9c=ef{pO-Yea^%W z{87K0i2tgm-^ZPP(mwfB|CHDK;)m0J^$))^4$9&2U**c<7yUuLLB@~9qtAo-e5G+X zk#h>w!*ANxILJFZ{)6OKdCe<+;GdSOfB1#}TCRT5|M&;0zv>^zIfFjWIoosEr#bZbEH|qCO{hq4!c~0c_2Ku~6o_UVceGbGA)&a)3elK*|Vf@f9vVs-e zztd&(eU$NpKj`BRymQ~dzV18t;q(hVOXSz2c&(*8~*VgrAQtb-yXQBA3_s5yvv=8Es z=7Id+2dHv*`U`(R^6dOxrE>Cyzwo-hYd)QEpr_9P`rS&)L7p45K5-F`#;4!6)Nc^~ z@E?EioBU}U$l=K=ertXyhbQkUzcViU)VTF~hWe-eQqDfh{9t@AKR|faH~Jg9^fw5P zKk7FKkDr=%^fV6S@c2z$H4e(*wI8%x{nUM5{R4?d%R%;6)x%%bSM{4Xly}C%c!p8V~i=f6C!?-&a4?Z}e23{aE$z1AjsCuJNc}PQNKv|FxWc z!7hkj$`g;%Pu>6V!}&a*euLz}iP+WeFxaCU`_*KT2H^{s2=r+7keN) zb{J3W->MH!JH0$JeA{>J@;vI95!0aSG0#q+`v@Iv(;^Eb{#e1YJ@K07zQnXZhwJq% z`chI-;8AGNhaQWL(CE}^n#vB5G#>qCVA0V7G26ucy>piaRtSv_bRBerMyHn0=v)>* zJK6RtiJ#Bf_Mz+9`si3~iT>2^?dd)Xy}r<{z%ko@=$^Je=&ZUKZN*Ew9qs(k?h|%? zpjV?~`&Qk~4|Scnb>^^!ou4V9Gr`V3d2r^|nZt>8{?T#vk<&M)56-@G_K~wMoH=*) zowJXeec{Zxv+taJ?3DiICJjoJIgn_kDR%6=Fr)9&OUPH)|o?R-#sGz zxI_9b`28Gzd%J(36YPGe)9fMt7(4&9h5peVCr=k`82G^+|IpfZ*$PMA9{!&UeuEzl6}w+5Y^pC%fPBO>|BPZRJzwZ)wZU5A;fV zUc`uRj6-tRSZHUioH?v&&x?~{vzk5rp>>=SyEBL5?fjD~s~^RFeW9IgIel>UowHA! zxpn5;*>}!9b>`NYb7$W<`_!3RXU?5{=j>BwZk;)I_MNj&ow;)6(Ajs+K6U2GnL}sa zIs3F)&M{WsvCdnxj5p}%Z%*>;5SlgLq9y;(^G7eU^e@UfZ_%Oy?e9L@(qAg;yhV#X z^s-(XE&Y75c3HIOLl2vqd|Th5ZT$w9cUk(yWxb7p7JcXfm$qAUBUx_?LW@51a@#(> zseNeGCl=L*USRv5EbF}b53T;NCJ)Cqu@9~Jp)Ji1YyQ=|qbz^e7yg14eQ0N{oH^9| zU{mwsq;Ka<;)R}O=bv1?4lVYfoozXNP~UF%qv%6BbE`38Ut_=BkD?E)xguW8A++Z9 zc0bzws6K6}KD4v%oPFxdt@=YA)INRZ?9+eAmE;F~^`E|T_Ng;h&Kzof=sRbhzG3IN zrmUG&nG0e+AnT+>ON`K#j?gtk$7hf8tg>FI51nNFw`kFMN@(>N9gPuMW2`6Zm_>^| zwDu7?n#1p9jU|UW#h-?y@58eC0tFpc&Ky(=z^kCbV=C;%S7h~slTw@ z=8v&`Na~+mRCYsNv4^eC3zlk-L+DeYV?HU}prYu!8Q(8h>8-LGo)H^jE9je7Zo{ox zb5o!%9V*!%OW0>A3qdX42+`@5Ql>!((K#vd?VTbv+`8d1R}X#W`D9nA z4P_+{(APyD8l7_;%QZk}jvn<`}Q8(65QP(NU)H>-QC^Y9fG?%!R6p?!IHt<-Q6X) z6LLRQCwaH;K0E*4`#gJoTVJc1_U`JC$-D9Kvv#Kn5$7cVI@9kI@*G73ee(ANr;_I` zEywNdlT;xmSZ7|gF9*l-AGXC0J)v>(LW|KE7<2Djib6*iBaYYCyQw)x=lwY*o_KrG zgydk^Y=dX@&t!$FqQ#g4!O06n2Cegd#`#beqz+M8#%IpQ>lLX((z0x!&&N$sNa&}G z*^x9wA&oJSp7<*1uS48C2-QT0Otp?XYe6~&OcWv}qwvBV;dBDExVqe%6kGTGat)8$a zCi(&U`-XkzzVJLopJU(IE^)ni4vJ$Hc}kp9&nIzggO>S=WhLa;*5P=HHWqFoLo+Dk^ z=^qw#??*)L_K&{zv$F1SJS)y|PO_u({7M~i2%U&yE1oS^IEV4j;@NToEtWfnXA#FN zkYnXZ$FqxLC7)df<+JOe*iNo*@$A~V`v=P^#j`FA`!009A1OnG<{p>NMsbfnM<3(a zsBq0zVOfcImWp#B*0G9buh4&jLUwzip1qo~YxkF^XK!pibAo5}9hMOv-L&9@J=f7$ zSjPaK?Uz_*CbW3A-$AEiAH}orU6jtv{=P*UQTzLZ&kFs7{e6s%i2Uq-FzQ*MEK6PF z+|PfXEj;tXW=B0+e9#$rwya`1`MkUybhd^2T0ZN94(D1F*8}T!zekJffqP#(Puv{0 zLdx)X@|ndmKSUWGCuAebn#uWn$9>QJFVC-d9*E<0jQthI?>qVfbJ=^exX#2}7USNL zFmZgv{(fh_w1aW}^Q`zA880OI{(a4|#QiItE#Xnm7S`zz^U-Y1Z!?blEOaK$Z%4=Z zRTRhEH2k04T>qZk-0xif;u@CEI<9{Y*S~z$v0Wane|f)i{d;b(P2zgU%r=Vi(Ue8oKF;+J2Q988?mM2PYvl9c8_x%I_%```NWk-fXHS^eX7TK8j84V2 zCgl2A!7)o2b^Qpf_@v(ZCgk6_TOI!5Ki3cUp*tzhLydb;oEz~x6z7NMwfiE^L!RGm z<}>$ej^{fx^Qe42Tw~4@T09?w7Uxks9~9voR=${qZqLZx?iE6agHKbj}K!~aZYnE zhHVR6!83$yb4LX2-u<8VH)ZpG-rwpm#+PeGJV(X#_U|<|$A2dKBj%tk?4P(7)^Lrr zM~g9X&I(%S&-+is;e~K+K8E z$6+s`=ESRL@jk$P;kn6}o!nD#86%FVxCd*pjsLEf_rsv=@)`T@`{Cx@Vy>LUJu9C7 z5kU+8Ge@_>i+fybdn>e1`615HKiel1<~)k+l<$Yi@T4JcI3MDD?+?rP%Xt^i zK(QW^b0eOC%zfgx$!DfGZn_fopZB-Y;<)pS4QAP8(c&2^^zWek|C!UpJDZrZR&)H) zaJmbgX0f(AI1;A**;W} z|2>q)KvAN3IM@DbsVCPOEmxgdwl)`#r7=ZeIWY%Ao{&v^2kl`2FUKCs>@c5Nu z?pCv)Y{`M~2rMFYHzaV|5Mx%91bAS5n=Q+l@S~bY)juV`_cnIsdQ-4%|Gyms) z9*dbMD--&-`WnFJLUzMs(bDv~gZ8?w5 zyk8zqU^>>dk@Mx$&gJ}H%P+po?Z>)ibG~})ei=A|{p!wfevm#q@E+@W!1*dRf4f{) zOwOY-Z@K8DT-SZhms2~JliIQTHNIi)e5~s_$MaI$$8ue_(RE@!lj}Ond2#BR2_DGh zi@Z|3P&Hn&3g$ z2DG^TOVm&%E8^ z%!9d?BM+Vr{FV4#m{U8K<6Qo?sC)Tl?rEMiQTL!#;%QjYsC#*RuSa3;qwewHgQt3& z`J1SFIep=KVNUH_j&u17qVDB4nfV!*dvF;0)vx}uuqNEgx4AZM$9oudCF&l}H7cLS zncw1GPR;TBcI;l5Q#+UAT>fJ2FY(;S#WAeIeI)MXZ5*qs++X5(ID%v7%v+4i?-uuU zvSV94;oM*1-2LPjI+xRi`&2w{yK*j^W2!~nUpF|0mAQ|^JsZTaN*Hy2t>YLv^HqUU z-Sb)3gDz7%{kgx=vaWO-L+5hRa-WKInVbvfm^4w>{|k;`K-7JdjbrsN>i)XLF?8lD z{kORnu&zSQ{5-9q?ys*LL+5gOM%|}cnxy(5?Ip;O!a-3tFbB%Kj za?W2)?VQV;bCYvkb1ug@#yP(@=N;$VbD49Db6#_faW3CEH#z4T=RDPfdrDmA zlX=H*j(5&k&N0s1xlHHWvwS=Un5Qr+S|F_x&?D&s*ns=bYsn&EImbA2=Q5phlXI?d&Qr^y-am`+ymgLu&RNbe&fK|7=Un5QgPil1 zQ#t^tE_2RJ&Uwwb9OoG4T;rUBob#7cJLfXz+~l0s zoXc^JsS_C)_~VL?CvokJZf}~O$vth7s5{$V4(7Wd|Ff>na{gZNaVM&s(c?|;8qqj# zS?ffeB!4Tqz3KX8yLjfl%D=yK(qm!Xbm_JQ-Hnp?xGOz5ALdOr+z}qy$1kqu`te$B zZ~A^EKTo6ldk$QfUD)GIuPIX99j^Jflh3&n>P?59ei}9+kLAfYuZY{5ZuM(@Sou|* zL)YK#;qj(#cBKyNzXqC^E(CrdAX=jTmluanW8 z@|utP#m~qErk?Nk`oUfvsFK>GG$)|yHb6cK)^NYB>Y3tYe zz=f+jhwkBgdDD+NRq(9he5K)hdDBU_uSRo!_7-gI(Rad+kZ>Q^hH+nW~Ge0y=t7ihlSn|{E(Qg5Fn@W|)w$+-aK0WrJ|E^y2QLl}?Z)%))rneeZ+b&z zKhM{^dk)0ndFV}-X8y{j`?zDTxD@J52cLWzwvXpwQ=W(3w8H$gZOy;WLvK1(=L+ui z6@A@%;xr5NrqgkJ8*skr@jUdV=P`d>kBpS(%9|GND_?ovXw37_n?5nJao7ybS3J&_ zH(i|h>;C@y`#qd5Z@LKgS1-<2R^~5nI>Gkv;{A9=-R6D6n|@fy&;2Ifo&)DNU*2?9 z=C8V(ulk%XZ#veQr-4VgzwXX0;`XMea(`v!ePadlmpA>1`D+H}t4RE2f!=hOcrWCA zV+ijX-gLU6|22Pk(-rGv^!V|<(UJEJZ~77UV0q@R7F;9Vw77q_a4*-kVuaDi>~9^NW`<(o4#9y?^`a*w|@@LUT=C+n}Y6XTpOOJ=L5az;rqfv zqo2Lr^q`7rLNa{u0;5js(rZyy+m`4=ZyF{W*r-^g!;fO zESjyvmi@6{o4%Mz93?IokKQBC{lAMY>sgfE@LzV_k4W?Gog6U+E9!`%- z3ucg6Iwd2VLCGXJ6M1GO3oSikGJrzsN>*BCC7X0v;mq`k%;0G0_^e8HB?rA(!K|d& zX*t2{N-iZgS#~fxNiK2?)|5OFU9d~Z3+7S$lze1)z&s>=;o213W7e0 zzsw5a^P>wWg_Odezfy$$0_Z|u5wNII3@oAq$gCK?5W1*RTnPjN6gT}v(ZxZx!o;VM$)l}c23(z0ZgsdA+Ga8;X#w;HY{Rb8n?RVS@VR-39unj2S#s*2Bnt4rm^XTfEna^N%I#1)bWoeHi8rjVSG zBqgpsm5SUK*8of;IVGtNt|8@1?vHB-HdGpMR{X(+q>UvvM%7oE;2MDSSyofYO;L5( z9>D_Zu$@idW>iyjV_b8p3BD1o1=Sc|1lN*kgb%>A1Y0VtIJ*I0OVZYoTcesQZE!8X z<}9VHPddRFhzB9U;(o^XL_E37$-woXp>@B$uy0_9-5!{#FUP?cuKdqNC02bJbzAp3( zq`K475jTkHf^Ux-Om)P!#SNj_~$M(2@c{r+{ zG6FXc93i)3Bs_{_gfbEy!4{21jZwyeqhXPbrGKO{4nJO*0FHx2-voL_D-)GTB$H{A zlqtAzpcpZk{&C7wWg6LZ+7xgqJdtFQGDDe(n?;)r&VZ+qOjBl~XDM@(x$taw1~r$S zdARw?0+QM21=7uC~w+Xji*{WuVAE3tr9;6*Y3l61uaEFy6@KNO$=m8HY z$H_dPhjB;f@!(G=C&5$rQ?Ss-$&M?h!871-#-0Jsf(Mmza42;aeI6G^ox@+iU8K(A zFX1jz7w}h7t~A6!y2wO z(f39Ih?Ei zJ#Hl^^it&m_yM<6`3NuNZu&@@1%Bkd{RGZ}Kfs@;>D=R=l+Vf+l270#{AcQ`@(nd! z_IyTvMt`NgD?dbpGE{?1SHG~` zrfQNI>Ie4iJ@tj;JuRGOsFq|4rK>j10Ckq?lI%h$>J~-t7Vd9FjX{Y`*hVIv3tN;J z>P{slejDggLzGzfonTCLA7?LwdV_nzd5fjK<&4Ev1;mCxjaK-fD2fsc+SRAXM(C4hrUQ$95t>Q4~$ge(h~Zes)<1#I02lPycRvR zc$@K2Yw(tnguWVJCElWvs)CcM6?n%=rV37`mf{^Qxhk0dSL;d&wFEweDs(Hjm6B2w z*cxulOqfzlsism>lcfYxsza4jv|->d=EF4f4FiLi-Ns55IF?x}m6}FPOQlgKD5)8h zmL;TSEvZrIB&TB=lB1Kt>8WJsB)AMzQoIk&mr8>7rDbGaeZdU$Ws;l;l}??k2%fB@ zW66`1w5(4glbIhgsgsnXXJm5)Auun@iw><{{@ zg~1{+DGC?G6$Xo;1JvSRF}Mg-oH2p8qN*D%N)<+xKnq`zQGvLUj0i-RLYJnMArUM_ zmco?<%hAfC1(&9k#Z>?+(kh_^m!nm{RR*ijs-gu~q*caMQ>()@)S6&ru&P>%tTI@c zanU>dSETa)&uKMXEl!A+8+N0N)5#nretIjB`_s z@O~^Y515wqP5zo!TC33%7>blUKr3Qaebj3RhJ-f*sUO zYG<$`+!pRkUK7_v?F!cfJ96y0pt^xI)b45zxEtJs>Op@~Tw}E-iQsOGX^QK{{`5rk zQhTGC!!4-ZWPQ-h)xK&!xDVWm>PJs|wLiWUEU*t_`jGTx``gR39j-0g*Nz&1ZigN~ z8z`|8+({h-4paxLL%>1s0C)&{FqFPd;2?BYxQ99n?g|c7gVf>p?r;xkIN1nvcXgyX z3LXImQKRVTjq9n7CJ{V>F}-mk*!t0^e(D%?EZ7$w4Ua{QLyu9%s}sO+@K|^P+dh%L zNhEzylfeFL=|tKPaI!iD9t;nmrjSfU4_2qC)8VP`WNJD+GjKE2StNp|GG+#DsyZ8< zqs~POow|VT{JhEWP!RS%+j8Yd$90`w97l8}a#p)7p z5j-DWLOvQdnmt=Yo1iY0ycD%eT@H?ig13mjR#k#tHE&` zk=5WDaFV)KT?em$S5xcgpN^ZNt|t+^hB4D|Yt#+kbdJRaa3eTP-K1`YH^LjJ&Gc`< z%~H3L2;Rt;Ex3*B$2QblSl|}=wvcRPAD75Vq2v6$M9UX0#OTMjN~A9hIIf!e9= z!mR>Vv4=ZpyTK6Jzr2gR+(Wt&+|AzX#jgPOuy1?u`_%oYweUJ>KiL8FS~XM+gZF{^ zNkUPZ;q|HqE%*RqHscPc2f@wk;X&{acvw9`BKRQbA>2XrD11ykjy{AwF5MwUoWPw_ zPmvr&pOWqLvVT_#AbKp3Crg^$N*V z+GX_`c!eI}uBq42H)uCWuHbG;cU8TGzD>JBavgU^x*O_U^gY^rl3Td@(%n`cs1I?E z)W_gm@V@$l>@Mje@Cogn`jkYZPt|AS57g(>1M~}$m$Vn^E6GpDo}yoqyrI2T-%5T- z_5%HmB%Jn6eJ}Y9*=zI%l8>|x>LW}!xS?v#LgsN)4 zRZWW^jez+-O_vzSae9P(Onap2aHMKzh8D?Z@6%_1hGuGaIGQH8qFFctRJ6aUE!jr> zP+gi}m-d70j-d&Tp?y?iYTxiNHKD`da5a`D@D2P%jjhF^;%ITnVu7)=*tj>Gf!Nwh zH6HFIXDgoegfkaUi>Jlc5|G6M<7xNQ__W*LZLXJu^xXz;a7`uB1Sit2a&7r&f_*d} z?V9RKyUcYc_&ohST4KsaOG5c*zI-Z?mXu0F8XuR8N{CN@OU8N=ux$xY$t4R+uBBkB z!KI^8<5S_%Q)#peR2tG0 zWErVcq;YYXs1*2^xENGiybI36@poyNDHqzpWua`miOWh^_&c1%Y?O(=$^DZJ%%)}6 zE^&`#C(o+oz-0roGCHT^oT$uNE?gEcGfU4XSzt!CDkq$q%7xB>%R}YFXUFBGa^Nqq z^b0%*vg0qPd9|}NKZ$wZJX$``Ps^{J;%VXs`jO-(&kg6+3P?;3r`HOC1vG!H5Lp4R z0Es^>J;$q{R#@r`S`k!1iAA+y=ptGGJ%!Ol!2qzh76=AtZkYw*i=vBbCA5p=w#U9Lo%Z%fiBy(L&Wixbkd6F}M&c zTv__^;qp_3@cC)SdCuks%hPv+XK{J39G~~_ye_ACm;p*@dzl$ZX?vJAO0h+I)Y95+ zwE|6SVFi)^ts?A(D^L}+5PCzHaRN9F6={_uW`Hwrg;k;|YgNE>a7DNZDlIxKS7%kp zRZ+fLHCz(VS3A#hUa-J3%mr0Rt5emqlWJu~)u5{4tMKU>U=6J%ORmCJgs4@}HR!7) zxfbdqvy5PY$C!y~(pQ_Rr5$E`O>Gx5YEAquwYFAA+kvZtJIov{cq@FE*=-wcE4Urr z&OBU)Ct6*ebB}n^*VP`X^|ZQLJ@`3q4wHDZ8qOQfFe+HBuLbk|Ge`0q-U^4IhSCPn z=I{n3Sl~?FvKsS_Tb+0C0{jHjKx?Qq(i&?`v<6@UbOWs^Sp$-$R5RJ%P-_l1(^^Pw zL0?PR+ls6yx|P;iYeU)uY{_z3quQcdYwc+5X^piG=(bU=gVqt;7D6h90eNDZZD7(7S|A{kB_ri}oD=n-y&Hc}gf8?B82 zgU~}!BT-|?1O_o~oHm|p3_Ow=uT20aFm|FgiEJ`W^i85?GTAt73OH4pMlz9_tW77G zCbNm?8Mv9+ERrecS<+2m{A_Iwel9$NnnTZAc&0W_n@_fYCi>>nvw&>27OX9V7tt1g z!SFni`PyP_32rHE5x5u*CRwO00~c${X)9<;wUy{)QEsKSO8W=599~BKqpb#4^NBUu zTC#OC(YKbKb!4lw_233=BZ=TOr0a2Ov`z44Z3}umdW&@H8L<_&P1{bg3B6sqO^n>3 z?Zoebw^BRl*#&RYcB6M_A+$Zz4$=^^9ok+nMBAtBhj)VqNcN$2(hg{$xG>E_vKQ@< zZZG2x;tpwtNkY+wr3+=`5$!1c7<`aAO3yL)kaiq>L_0w{NgW|QL3Ttt1)k7OYiHn7 z@Nw!4W6$EwY3E5!q0dWqijfy^7qv?yXVI6WJIlz++7o~!Uh?Hc;BcAa*E zc2&EHz82+fYPZnWwcFYq_!fMPy2B^#;_hkpNp7LM#;67^K;UC&h^cVC`>Ao=H z7w)(AhvYl@k96M|8G-w&MUwnNM@sjLk%}Insk){|k}9xp5scJzMK^SlMA3CvIE8=i zwQ#oXBGJ(<>2&&H;9}~rNGxLU&lEgsAl`aM&8SWiNd5S>K2gp5pzOQt6$@kJ+>&Xuz)jT1k=sTuJGQ>!tM4 zIJaJgq%2P8(zvp43B4S;lwO`zfht8>o~)E!5iGA)(ksIi;c`@E##X^q)vJ+IL|2op zA|tEgYUnjds-SC1SA~(a^xF73aCNFSJ$2w3dR=ray&kPTRg1J9SuMQ*SWj=LH-a0$ zb*V;-ZLBxJH-#HeP3UO~*VCKn&BXN$-sB0=K6+)6)g+pm!zdMs<>XUFqpg)`Qj)-4)kU zx^8+ey*I9p-WTkS?uqJ!>PIH9JLCG3^wkIG1L6K~FKQrT2jK?O29XKws}IqK;s)u% zNP=)e55)z+gZ1I)A^He?Bshu|gc>gO2yirdq&`L;3y+3}Q)BtWINW%B0?BCf1nEXI za-u#7KN%iJO`>NqJYJtdGL@Pr`=-z{O`lFWMW2D5f}WwzB%1B0I!coA&@7!1!NnXfNKFQF~cmx7DQgj=dFLoe4? z=qusH;6joWGF!}uRk(lj)g;T%tEF4U_%*n-`Z|(T=ylSqV&r<<27M#R8uUi#)-ZAt zZnM6HWIcL|bn6+p6}L^_PO=HTUAj$-+@bHp?}E2dJL%a4Z_{_9cjzIsJ+xi=Ui9uL zw^!e%@5dd`L&4o(7`^*Y`^m&7cawNX4pRGMpNGCf`e9O!egy47AJLDJc|Z^2j_Jp7 zCum2(WAGu8!}>|^n0|_OnmR_`DY9ew8T~AL3O-4l)z5+F7<*p7Kz5NP`YzCOk?f3q z3B0UdArX9@^b+p8eigo^Uq@d;UzhF@BW~bs>bFR)qHjrem65k`cl5g?H_&&byTQnN zxcmA8lH2G9(%oj{L);_%G08pjW9jZO@(J##{*2@y`k8bO8TlOdLVro}1pQLFCyacB zd#%4Ad5(S~-E&61)!*U6X|HMT=m{r#rN7rdz;AIM!4LF&B6|zICHbs>!F{ED0zbp= zNj~V`^zXPIG?9KM`$6_u|Ed3izu|uCe{e$oqW=&4TaQ5h)c?{Vsh^~O$$s)Rwg{BU zKO#k-RWL%=j9*ORieb=nGQod!)39*5VUxHFQ)&z6LK#L3BPLlan&^wk*jQwyF+q!A zjM8G02#!HI0T;sx)`c$yZ^5I75-rNuYmQ3;HMV0<_(oX|*w zp2a)959ouNrTKzBMq(og>MmVjJ$;eEWg(mtk)02fPy^$5nW@IN3oQX6m zE|ZZ1&S~UAXGQ0dE-NE)DlM;5=GU5`T12>HHa4%m~0AhKo=E^c>cT zFtRwhm~n>uDDU#cNY9WJGXjm`q{R)lQ34eR2f!talIYV~pizn>5LZgNGg@i%d9935 z7A^^vGD;g|WLA<9<&5(9OK@qbJUy5A#Cfd(x}0%`{0i^#m5j=$ zig0z3D%~Be8v4Fg#i&kF#i#}gcU!Ar)Wp>?YJ=6l>c%6oYNWNm zM||$SRtHzZsB6>%pV0eAt7p`ax-M8BUC(G>G=%HJb*P4Xq7kmK(S)Qvx`}l48QB!q z%xF&12;E$|MvQEMYiYD1X^L(oT~kK3#q1XAvhK7V=q|V((sea@8ohAcjNT;O(7la5WZl4SjOdH* zXY?l*+>^8~uBS1;7>F7K_oW7s4TAd_gV6(wA+({?0Ma331B_ut5IoozZj2xqCUp>Q zAZmm$lHOs)DB5Uh7$ZiJ4Kv1oql~e}ICu;^k{ZX@@wf@bM3OP+iPDW>`Xe=|9<5ti_x}0nU*l^7S1FkbFgQfLN#%5F{xH50^n~jae7Gsl9N#AO0 zgSQx4!A{qwrz)Aa#_n$Bg6n6Yyc`I6WueL&izt z6xnH-=sQKvX|iKRZ~YA1Q$LCC$s74e+!^`@lK0ln8s|_0;DNlapQGozaltriT%--q zFXGNp7Z`QPxQsh*TrsZFdr9icxC^MO#x;5`8P{nys7s8vPIk$-30^mD8Mon^@HOf- zWAEVZ8uv(UqVGv}lacq02l$61cZ^54JNSoE-(mb?;|bYQn&^8%-&3;t#xvtNJVSqs zpP@fPKPGu%yf9wU_X_>Ym`*-}clHV>r*9#NNW;k%@|OPAc#mGmd-;3tgYgmniMB%jWPE_%lY|?e(VvVj##i_= z{DJyP&o|t6;|IxS^bhGiGx8_ym+_nA8~V3&-x&D^7h(J*`HB83-A_hF8jAVHP|Zlv zKj^>cKa333HL@^0Qub-4VutZH9!Y+Ho+JEY$^n#NYUY04wuRPB!#u2;^c?|p^SEx| z4}+$84m_^grVDjej{%<3U1m%(hH1;bb9ziOmKhrt1GcHyW*jgMpNNZ&WyUk(g9&Ic zP;sS>2PQWu`}Gpk*XUgUcvgS~C+mGc5~AdR!LiGMHJ-Y`E;S z9JFlY*~$KOnNc~-TxM=F4=OKOjLu4uoh&P9UNEQWXXZ2WgJNt>bY7fDJ7@*W_WTRJ z==U=VkhVv6;9vC{(bGX zN`s|wZmJYxT4`l)rQwor8M7={mY!COY{u^{%As0;Wz05Od9x)+d9$3^8Em8d)+?Yo z!JYYCMFq3G`G=n(g#STLH!YH%Ai8OPNP3{V@tcN7y@zJ-bHV_A(_k0_NdEGZhKrvK z`t!SmSo~ZtSaYF=q6dSc;2(NLvjSC#WRlzFeSAK4)Vt&%A(LRDT%#Zw}RSm2`e+{!HEu5do1i#j+ z^Vu4FwmL_sELan)#jz@jszs{})-vmub-~(jDY!2AYrQt@1^9xW0PE5B0({C(iS1}n}Qpg*Z9e{i7B{=*~Gl8H#M7r z7wKtYHlsB+TS#t!YC>Nl#zK9(}ZQqe(*ex0*ft zOU)Q_H2D~FjJa1IOWVc2=Lp`$*fHifYK%Fa8e@*-v!l%k)M(O?xCyLfq&bl`!JH&{ z65BJ}oJLpB$jE_o*DJoFrMK5YRwPx2hbOeLRZ2GbT&^XLmEo5z++MGb}* zQB%-EaEmx2L(IjrMdlL8OE`A}&85^pd_UYWsz1IPZaLKtzk;i*8`urM61{?2Zmu%_ z!L0ySpgWVVG*{EsP%BASlda^s?TqROucbPnJK)w)9r5jP>!}X-cDM~xdwgBoMyegY z6s`nS7tjAh99SIQLA2)8-l8cYMIpq-Q0cMV&Oy;ZA|)&?mt2 z<^}Ksd=|cdI*vYXUNkR($Kea`CDdi~aklU>?TU1l&8zSg^P1#qs5M-TS7_I0tH4#} zb@K+e92V{dY8m>vdDFZFE`x8tw@^#bOSw00OTLX-V&1_m2A7z3&3lsXp%>v6ai`s- z7Ml0zxeMMU5pJRRfLh2MdJp%I_Q-rpyH6_IW0rHzd_vvB-^M+q?%;2+=G*2oSm15a z8|dfME&Mgy3+e{`D((gN!hC7I;<#J|ucBYj_geC6___Ipdd_EG;@(oP&3Dvm(pO~R z)JxJ!Ea8>;9v1kD^aA<=bqRllGjqZG2n)PG>Wlu!JFPEo#Bson;3wXVgk zFK=*S)E{&N?I9y0%)e9wTEYDlKg)>3_-p>AMM``KKjeHzQi}D1pLQb6AGF7~$EIot zd;~w@%W5j6TLzg5s+NX(#1&(r9)SmKi7;QIfgZt zxg@3~IHom=`6iYnIF>crjBUjM$HT(KvBony#DI1>%=L4FOU8EX1k>yKE3~G`S zF-F7bv?NwinlHV=37yzV1}3*s(2}4P4+$;38PKV%8!(z$!`wSjFinY6Vh7(E;=OSLSsAMw zRmLhyP31S9<>2zP$^0f%@OZrf{S~bWj1^pt-qPp_RwY_xu(ad~^p!+cp;fY~O0LSb zm9(l+CGml{YG5_1x>bYy3j_nv)#$4!xhATrRSQ=Itjcm~ORi(p!PTZJvBo-ZU0P+U zp5%H~eX<5%Ey;CA8=~u5jcAR*hLYWDQw+O;ioI8C4zKoGq+j zwSWcIAT2`DoU_{8YDsHhwL%w(a;-S0MdX<;L~lOMdVX3f-t*tg(HTl8TR$Hqb z*b)}59jcYg+FI@5R$wcugTxka3)U@M2dg8k8Q6^N>qs?WA3D-HS)J+c2zEp_wYpec zC3i(NWgoj(-K_3lBdZ5JUC`aY9$-(a7udttpqY z`+>dr)Btb*t_MeX0N4m_%uybQYYaBvObn7d2vyG-jH?UQvxZnh!OF03Ls1pcL#z?v z_xk7&`cT{`y&_lJ2(H8N{JviBNcx9aL40DA9%Ky@D0w(KNPI&89?WNhtPxa@HIfRl zhO?HT_`$SMY{Ou16nZo@f)RsoW2jNqSZWmMK(aC57;7B+G7ubNjkhMy#xO!Sp~qSi zB~P*@;U?loTazVEMvb(l;6{TZ*@8a0;67~OV7})dxGzZ`z9BK05mTutRzH0rpO{8X z#!q5N)2WI08Mv9?1j&;~XQ5|UvuSg{S(0ZkrXRXLHA|-b7&U=k1X z$#Qy^TDQqB^KZIKNpF)awN_ZmNxO2zEk}0+m!p?iD{;4sP9!VPoupgA$W^#|MrV?h z)+(-X;Z`#8A8R%KA-sxOP0vHd-ZR!%Yps8*bu`hpmY#Li8r*ttgSC-F@EX$fxHZ-$ zp8M;W0XBl0aqIDUq+ZXsEzBXCtgSTBmy^D&WSgvQ%rIN5?X<1nHh2q3PHP8xCo@rY z$=m4Lf!k*7f_F2+rhs?B!tG$Bf%|IcB)ibMbi3$Na9{YBUxVHshJyZT?6yAAc3L5l zL*Sj(9%?6R`Dlb#;rv^2i1m(tdk!IeXY8@w(6(E9CGUl|v$b!Gz1Bi$1z_Gwg=mDUb^!vSw{8Z+PG@$v-X2atbNu6emAh6t7kEKpLM_r1sB8n;ZRf< zdNEgB7%f=3Fv|l6TL&c{L@lrm;ex>hT(yU2hb7K|=U7L;!`4yj7noF(t4pP}^td+^Pv z^Q1k%Zu$l5q9ypEbph-m`4YMd-?I|jfl(K&%hW~d3U$%C#Ana5%(LKS@UnH4^_&H- zqOVbx8FvnMow{n>pstdhAUjE&BRxsG$sU{pZ=!Ee*BN&TcbmFt-Jx!h9w9qQogzI- zyUP(e3f{KvS@&tT87G|3cdQ4JA6gG_5Ae6FN0J|*Zdi|Tx4;{0%@fH_P*<#{xNG1Q z_U)PEXQ&Q*15I#S___7MdX8#M(pDF`wf+)(Wxb|7w_eKr*KljT^Y#jULu;YGmHd`5 z@2qgzE4=tbxODGH-dOKR!mSTfxb=|=CwW2kiF!@?4ELFOfq#no41Tu0u+2}w&!k@^ ze?@(;zTrNB-_YNw4=nL3?g#bF`bm8w{X+JO`bzo)_nZ2He~kML{)=-~sOBgy{HoD0h1TI}w== z7>f2mC$#tTEbz5`NfOx?jQ!R*e&4vCMhbgBEt#ECa!OPzj+@d>VTaC1KdUQHF z13Dc#BPt!3mZfC^Gm*vM>}H~=c4o<$QIS>_oN8x5{j{=5&T9YUI?iSb&Srn-D$i~U z&TfC?{>fnr&SAf?a@z0lIc=fe!f&lyw!jvAXZ5YsRL^BM<(sUz>|AzzJvTkM?A)|^ zd@nXPNgg{7SVzxEnuE%1=cRI!=CJ+je6$?+>|j3W@{{DX^ONMW3sCv&f>b_|Y-9z% z0=7TfoDK9x7orL!Q}_5lH~{UavZDBs!6P)SF`Kz z?PTGq+0|(^_ztt+s(Mwj>U^SxU6apN1*_s~&}xA-?Amr6vKn9wlGyy-E ze=Fk4!cC|O=yJFw9G`M_Q(6+i)zW34D@W{J0c}Ww;CCwZf$QiS~ISlleeHgd`=J})8rc28zV-lnAU%D-z9a+4>%sNx zK@#i2b?w36AbW^Clxz?JV_aJ;EL(c@%22Jq9eIk0l#{9u1BK$Jyhh8;>4~8*5Jh z$JrC@N%V{Z$B|4VFT!6LjJ5ss2{b>@kH27;OrIZ^o4s6^Y7~AbZXq=i-yb)C8j2r4Tf})A04_oYqZiqWsYUh@ zY7t34vZd5O(%!f}R6l$l+A^-1KHyUNmP=j^FSb`ui~0OYvgP(F+CSh*$;;{M%(c1F zUQH8e4@RvfTgkQES*lKCYjA79_L94hcR;VP*Bfi>bzledI@(%$9eTa7&S=Mojo>=I znbi)pf$w;&vp3Mz+pBSFC^9~^*4{uyA8NI|QSwH3HQTcR-b7nvZ((hvXfoP3TSbPKlf0&Gs(ocG|n)U3Q4% z5b{+VtIf1sv^^46z$@&%((SSL!F$0K9N)dP{St%WV9xY@>VO>zE`ayKp{V)j`CK1i zlEYAQZ4Yi9IG5|`pyY$_Z2J&3n`_R4J4_w4k5C6m!^n!*;Dw2ik9OC-FZn*(cGZ4BUBzF*J)|zsi*kIxDV75{8;wnBlQ?Rj_=BT1V7rJz|VFNZJhCm-VgQ{vX9^gKJ!)bS5&zD z4fh@lXC2=qe@DHwf8gGMZ`r1wl7FHS>py9Uz(oB0-YyvQKgk70()WX9N3sn+@ZV{g z>l=>$nFW{X;tvu*#r2i#<;zH9CioR?qIK67_Q`O4VlVlX56*CXX7Bltfy{D=qcWUt zC4VLvZrCoDYXr_kujPt?vq6jH#grTqHdt;vSgv?fEVRiM z#G%EPsKAOV!j2C|*a^tuyAo3IT?wcNjz|JmB9{+I0x*H=ubqhIE3-td#IUa`iR2{Y zw(je)`ST55QbSkuB(SO{W<*k&s{hpl|J9Q5iR7+iEKzV`dQ+g2xl+qc1Kx zHEZ{goPxf%xD;R?V5jIPX7Msy~UROn2u zEVNXvtdg_3vXNy6Gf2)%+Jhx#b9FSbxjOMJ_#Tq8F{YD|-Ic@Do^Q|Rz-4je#AOGw zu&i8?bD>hXa)Y@^QgL*0(~`RKNX~=$tL35n27mMSw|VLL4gTP7bp2d{{ajzQe6IYi zeDG)Kg#N4*01LYOY580QWWPWBnZFAz2p6J#&|xr%`SuHv*J zXpt2sE$j-!6#@&p-f3>|1Al`ooSS;b-zf*eC1|g;l9Ed@KG0Q)3d9HCN>jz~0j@Hx zva|raSdY-n*?X+B?>v@}?X3X46 z17Gu3)xuSyUhtRK)m+tGHR!JfR&zbos?#2V)m=4RwaBW2)m;y@nzVc1J^s?WHhuTN z+OF&T<#`Iu1BlmsxP@dYpLOCK-Iuk!8KqztAG{YhE!#AMO;Jn ztD>tBts&SL*90stxe`fJbYoXDT63_e?O6(4IXLL`hm#c}<6WxoRp6G6_-so;Dxi_sN*xS{|)t9U{*qfvetv%SD z{p=^XAF8#hKdvpd4&Pud4Jlqa#|;Aqvjrn0k3cnZjl>NEN1~gfN4iGQn!83z9?i)AL)BNnMe)4TyA@mP#x7J0EDXd>6cvem?7&Vy3`E5S3lru4p5^ZQ_vgIk zseSM4?Cjn=&og(7bCmN@=0KkXZ2`(`=s{?AA<8W1{`ecGg`f+Si!#NYF@p%2uOx2VJdPt6T@$YS7iNtVKv1Fza-QBs*z&Lo#75;k>51xvdQf>7M~^^00)80!er2l6Q^EJ6{Z!PWu%s%Fp`=1SfGefRJPpzw<#A~H zK=+{ECuDvC(hkTwFfJ!hPb$+vw}Epl9nyBlCzYp^8KB$2)4?+!WkTMLG0#NZ3Yw|R zQf9-J37QE@7OEuE%X$)?89|ejq&y9qq&$NnK_(ozfMeL91oaH)8SG$k7DuqNiBiHY zC+C!$pHrSwp2VIh=b>>qUGIYOqVhbXi>Mcrm(bpMRVtFN0=- zUxMWf`kAfFLCJ{UPc#+4fNR2>hDz zvCJPs%27Unb`A6ipjWge(yi+wdBX1$UQoe`$3fFp%`T_L4vP4-5+k4RWu#}*_L_a^Eegypl z%O~)U(4Q+m%ltE>XUZ?oo`XKaJ%5$?S4f4*GH6dh3-Km>1HA&ywQnew@z#A)epmj0 zU&3RRqrQ-?|9<_4r2H`>|V*9&FsAFDL{9Y++Xgv(5gZ; z;jdB;Uufyc$NnlS@byYHXuojfYJw7SbB+uVEKx> zRDr658p0QhN)6Zr!4R4X)DUt_6aj73fL05|P^gV!2!8$t^)p7d4rm>ruJ93~ zUKjRSLOp18K`4`CXl(!6xRAe3up~M>!aT-W!@4}O`#RE+MqQtF0EzW8eEAn zZ;jdpmezt9N^8h%U@-t~E3|{94QLzaZBZ4VZH4xNIc#k~+rrWwwS!Fc!Sw|T&<>y- zVe24RqI7_)k2k;yR(;T_!d^XVnOh6ikheoi*0X`dTChRgj@`79v6q%Dv}90QVTYa_ z>Q+5_fpdGYJW(8> zdtp2*K`o)1L-rE9Q9VJ;!P|lQpqN89gXW9U4!R$nj2WmI^p=qQP<#b{Apn{ms2}7O zkOT1CTL^(DEg(0C7KG9adUGLI2tjQQoxd+3vK9(UkPr$>h|m^04ulA;u@6BAEKOnS zfV~DxVQ&o068j4@g~bM%r6Ne^3QTK7sL&F%D`*g|(G@jJrUBpq=u;RVBDKx@v4LyNqtoTo8h}ui0QQ%QRZ_r*sAHi7B3vwSE z=><6o*Y1tlSEk;0Qqib=Q9VHW3jKuspdR48!TUpUhwP3wV1UdAfV&9;QQYvB^n*4C zWq>dkWdN-GVH<>V`{RoJAq|l^r$dCHxPBkdA+QgV`EX%4v|%WNaQ<-c7}UYS2$_!% z>MDi{BSDAa*hthEp$_D_*!`leVkBA{3VkH3ql9|kqftgej=}k3WIhJcSYaIKU~sOD zgESEGSkUpH<6#+yI~k8E3b8Ve#phuHG!c}`uEIpniO^hyN#L&dbWTFG1DzyH7N&sO zflmaV0?8h-y|7ttD(F`1t;e;gD4VhW-emA;s2lXA%X~V{m<(x(FhiILIt_dx_)JK% zAkPqH3v)ncfzJe=1N(Gn(}g&hZopoD(}i_o4hU5T9r=gEA5umIXTlx5hNaDgxn`xq{SZIQ50m@ji6fLtgnMp-BD) zZ0zBg8MqxARRK3lp<3TqI6~uDby}TnoA#{ap*X8ax?gov;IC9W1M0OF>x;>rRZs zD$rHXcR}8Xk|OLD_CVVSx)btp*mntgQTL(jf^{!!yD-knAid5mKpi&rut5AbWYsZC?;3tH1nWw|P586KA6zD1NJu=ULyhq3Y>V!-)giPSmg)EeG$a^q$87R9U z?-sIUngX7JanD9c79`lR1wzS&EWxq^vLu{F-65Qj`5ECXZ0A5TWlpeWK|U*-N4)@= zCG)euT!efc^dxv1=tZHr;-YW~G!614)bqIaG+94}<5d;a6_-FS33{lPWqKa`yl@5d zvXCQOh3zuvWms}h&*O?$P_Kbrhvho>HR$Jr8#2EE>9lYY+BwkExQAOZzXj>Ga0he; zIM?n#+79_P-rc*P+rjUE-$mJqxBaegPq+`uUC_JG@1Z^by(i=fd9d9By$4G!?6GkbtTzOFh@QQ{BWRr3 zjlXq&3R);U6P^l1s9b-B zBSk_XwCBPL@Rz7XpwGbzVR?q}c>(PPYB9=l9J>MAbJSZna!Yt6(>vgIaNn;`?xP1U zz@MSKg8U5i3C8~h&c6;`EI*mo!fR;7czQX)8;`6c9c!h6)0!Uvgu0P?Ny5j$hOg^nGygb%z5B{B!a9hQQ= z1m{{QN)bk*1pFha74`+-yo139{Sx6F-<=EgclsZN*Qgc-oOZxI0~XkO;3f9b$?1+$$y~dh>HZk}lJivZrO$;9Be-fHt zpM+0BZG*e|T)T_f2>UWL!cGdcQR*7p#7<|mL2v5UHMoX-9_nJRhQG+tDzH*;0&4|l zu##~W-;oITmShZmWv~su;|ahodD5__+ffurzpBAe)WfKM6o>WyV1J4O*jMfk=r8PH zu@`&K{Q~`teJ*xkf4c9WyRchEGWOnErT;>)6m>E7>U)7*J{IdgQ_M$w1o{a3gDk)v ze~&;H=s&KkBwPL5=Nk3U(hx%EthW1(bEF@#c8*4~kAa7NCmHAhpBlf}k0{TTL6WU_0 z%re-&3g4i80sSg$R(uEDid}TL_8nz2cG~$a{1ATP_;=9n!Un|;)U}{LgkQpM*nWWi z5Y{Swp(cPPU}v9l97_OQf!%-p2%P^BmSKmWzXIofg~ixKs6ybpLZ}etVmG3{;8j!= z!aPM)73Wn|e{ft+rKkD}dpXX-*P5{DseYk7Y=Z`yzUnuwqfq@s4-6nHRMk|RS5tjM zzwq-#95GOpq3_i}tE*b;x5YiT)~^m!3w_R8=o{diX8N2r)31iF8XIE|(`umAa0Ml* zKL7d=$+a=|JXL}!VG&UEK=sg5mCRL;s;X*0s{&e8HBVtE^O~xf&quuys^Q)Ow)xR7NTTd~sV3lwZLJwE?J+s-a3x-w3iX zju=612%9mE)`qRN%0#A96(*{w*m;U;CaOlL6BUhR-dNQbaxAnas-}=*6-{7o3^^7% zTQz~TnW{PHXhk#Fnm`_n9kZILMk-8IEpTk4qJ_#7GzNN0RV&Cb*jbC)T0u8e4OX;N zwN|x(JQ#a*aa$YcEmZ>*oSUHz#Qt5J_ruXPsj<7nTIH~?qbOy==#S!{@z0RsP*mt=z^f!7g zs$x`URd)sF-4)J2M_^YsXH^6&-LbP<8urLOijt*guQ-Z&7}Xlo8aweFz~0=}pdGPW z-yZDW-4S$;p1EQt_WU--{(d|4+9`HnPw;lw32>L5t7;46HVRi&8|)IuHCNRp)D{Z0 z%+)G2SgERqL@gxmu+`X^uS!*XwCiYf+nEuR_j^6dSKOiVx;?WRC~@lqL;w z6{kJ3V@6AVNrwK8VsP|->})N=!S4U6M!Ze;%`P;_tsC)cS$~OPx!7Wq--~mxJ1hQ*;1c)JvUd#AoU2C5=X4TJ zdM{zKR#u^|C3fP<+l$$@wfe;GrS@7^a^BIM_?Q^#i)>$H4f(#tcGS?0+TDrYd!h9Z z_R&H~d`zb8bYk_+t7uv~8_{)PU*@r;I$a)SE&exqA)8U%fZShNh)+JvW#w@SLM|x! zmNBwF7)D8}Y{hnQwroc~CAC|)Ks1}+MscPg^nQt@Skf_?S-Ba|(~UObfjA5H`L2ST z)^!x48iljEX;n!-%v|i;csAQ+p-0F2wiowQoyxv={E>K@tKHkP3$?1s?ezN)!V(_- zmS&)DqvJx^#m8k5?}MdR7wXm{K<-=VlS#~Rcd1krZC?I5kxfZ0lX(B9&Y8~Uo_jA% zc5f$+FkZnLZF(b3IMYUa9~IB$WtB?d7&qISbJ*N#AEad%&*EM4nd`LA(xpaLVmz&7 z4d=X)Ob>Msi>|F=8HvSG{sl;%V=6l)}1W-jA$rS{KNVk7_itRf;`+P|-bsA`tUx*RW%KJ;iW z-geo`HuQKV-EC(kCag$d)Atuj&s5FDJ!Z$*&rt%V!Bgq@*Op>j%k8Yyo9B{A zlBxK*U@Pm~>8<2HtC5&vcZhi(dMP!wt0zADaFP{mDw00;5X3RpiFvp@l!~v^6$gw- zXX9tTl^%Ukia%|#*Z_}blHXMm@l*Z7>{ILqDd|jeQE0fGU3&USy8ocHIQ9GrHYM`A z{Cp4pNMPRm|H{w(a-&4{W_nfP&vB~ZCYJcAD)Hz0^-L0bGr9`B!8q7!Qd!igU-CG# zzIl*+`u0cee_`vr?1|4Gx&No8rLdn5f5`pcbmu5D?DkcvkNYhena(=L{*cGbZIHxb zGk!?>FwVnF&#^!C%j9Pov>K41)N@7CVYpGZ3TTB>s zmUSIkD$DLyve}BWg;IiTG`j?h3K%o{Xr=@v3>YqV(PF9|Sf#$G#SGoLO6>;wN}M~v zF`C_+c!e#h|3y;HSf#$9m4^XSUE9uFvs>&I>x-1w?GO85bDNF7`Wf4n6tg8GZ!`b&&(iqzx0uh+ z+wA+P&r-N1nt4P10XY`^SG z*hCd59KV#`;mPXqrR_+^&2*jeql-2SayF0(wHC-FAFYvt}%x0ti` z+()G=)sB!SqMg;zd0AsjZ!x#}_a#GIw^QR=?61*%Y2L!TEJw>+He1S*>hxNfJ@nHh z_G{LCsa})3tZ$Z=*@F@HC4|QZsyh$K&(c`&C;>iMhfF zb44|qP^lW`2RF=m2y>k!=DLL;lcn#NC+A?Etnq1-bPaRVddyKfZC#~U%q>$ewH4XFC z{5X5*BIXl6%qNyn-K80rbJ}3e$qZ^JJ;B`a0&~lZqc+k9?YxotGeCNQxyTuF(We7O zQeVt7<1o(Kk!G?q0dvlJ%sCN_XGr<*p?}~*vm@3@##%q_zjc|k z6ux^ae7ChjymS+OxfFi6V8uqMxi$t^zdT8@Mhx&8F~F1m)=4FLB0B(|?lWaG=7piG zE#i&5+sTrbHkLSlVU=_gvB7M_2Klg`L=00JQX%m+mmr3Dj~M1MFwfxc82nwYJ*y=r z__ew4YvGh4nIWD@Mm!Vw$dXbJ!z@A!YpUjei5r@=49Acv!Ep0{Y@fop4-|OQf zLi{ip@dIz?1!5R$#4y{@jxFLMcf>^;V~e=Yg*~MS@H^AtclbN-3US3k#1;HK z>5F*71n~xc?k^FaxF9}xjQ8O&Vu>uo68t?GgZN|t;uGg@anfSM8x0U|gyMbZh?ryn zViFJB*A~PT`w>?xyuMh<)y5m#J{mDb3}TEq_`GBzmheCk&@N56U zuT@xwN`v5!su-2YpZCG=M-}i#AMyEp^(LQPDt{$?NJz+@qm0{kF#k?K)C^yR(bN(&N`Fy@QfjNII=KN8Ia|*%MPVk$r zac;%xY}Nxlap8ud>`U;WcJQGdm?s~=rx?Je@cFY7d`d2S3ZEMX2R&e~3`*rWvnG7> zNBHO=m?sy&M|Xyg=JUxR_~=9M(W}wsH^d}^5R>qE=?P*0XT$(}UTTi`;p?|Q^8DFJ z8xKU`eh*GL!&JxerRwmBqhrso%W3&iHTa|S_LtehQTJuPIYw*e{&6hiOTchnc1nxk zzVZm#5zx*9_{vbs^EWWhE8quz!bjYPkKleV1Na4Kll#gT_>tf6Bi%OrVSC{_uE2LR zyZMK$#PjvT^Q~L-hfT$EKZ57ZW5u_4A1>g1;PKutjLB<^2|riwMJ`*3XUfm*hv!}u z&%N|)F}sZCuEcY{aiN$g@osd%yK(PgF`JBc<`Ui+Zg+uSn+ds!uMl}3 zpJyH;kDG-&ZUb_kT-aSU&eohkzLSb`4@?f$)Ibguf;KmYM`{$vmGXc;lAXqQ-j|Fv zJI_7ICL-sWj`^*j<9tm9@}nb|H-e8W)l5eYG6wTWmi{137vw}A@wxU0vDaKet}zXt z|1bilmSdr~&rj9g|7=Btv~J2Y*PAGN`pmQnQrdx!j}Kjx@f6P9S6Aa^*3 zxhrDd8I2?IqiD=a{`>c6(vTDF!@RVr@k&h<q!s+p z(Kfd=eB5dxXKZ}AOujFk10M7~r%6OkY6E{1XM0M+$HxW!=vV4nO{g~aJbUt_CJ6bj z8T?V$?~R)E$ZezGkH$T_qv5$#I{c9ozg4pi_H*z@6aClAZLWnsy5}%M#_;@WV5y%b z4|x`YKf35SM-zek+7|vO=VY2@E^_B2_@lFXGgvJ0Y^)1=K0+e#9#vrT-7`m`;3^XPIgNT&({Vb zj%wOSrQtbU5#p})Z`R7^ZblsS`goM49?pG^dD7|R6ip#=%r2N4&EHJZ>_x6L9KLDn z@!pyp$T#cpxi_$v<{Wa&C763#B=*+m^5rG7qBYgDIrZBPO*K59t$}!TczKfRSZ(gy zKtEi~bJ)FzT^A2u=E`%}If#KZ??N+qUTlb1_s^0+nY{g$h=E%ONv^savva@MYF!>$ z^ts$cmy31oU7_*}Iv$6vJcWhU=G&+B(*-OA+sCmR=U`1NR*(Yei)6 zK6C$K)4ep)MC+T}#>TklYyDAP^RJoC$U}MVnKpKeIu3qq9Q<1O`%y0A;HNU-r?wyc zl4+vNZPOyNT_nrp6W{gE)bNWBF9!X|4zUDHjfX#g2 zt>)))pLKu7j11l;_gNZugDifo6MWNHl|fcl_+{>AFQWhB;Ip_dn+H3Wx$nOHZj{UC zpjB$_yWauR6S=kra^%yy$EYo}dHU4Q@A8=3MlO6THCV$jD&)wDC|k`~jE^sJRr{9# znowMe=eE|6dHXzfJ`DU=$UIk_gnMa;+>_^|_i>NCkdyM8DYMgg-AvD`)Y^i+(Y72-f1vsn!uNN!BR%*-`kihsdqc;md}@mvuwl)E0h9 zf}i4cZ}`3*@O_VwbD6?#4u{`-1bHd^T^9V^M&wZA5M%u6JYVCATxkM)*>m`^Xyj1I z@Nt>&afOI&t|NxALJT7z7V<*eG6HeSf7&=_FXEOq$ZK{XKIx43#0D|aZp1lj5a-N9 zjI;~!j3wfkm&luzAPy-)9I_L+%wWVY%Mru$LJnnvSS1><$}rq}3gQrd#32ij`$Qo= z`5e1MvsIgm9YfsWh`cEj@rfPclSRN3BMxbcIHU;en;;IkgE+(<`P6pAEt3$p?7+3` z5R;rmOfmp@lO6J=U5H8eb%Wq@8^GtbME}PjCJ9DN!sEJF_~kF~%eJ_eTZmgaAa3E~ zP>P(l7GjcU@4%k@sof-}!x=L2T9xu^I1MF=9eX#Du&*V-XWBM@-lS?es%F*b=dXCE9t7 zJaH}JhcNWP61mF5!Y@BXAD$pjj6=Lp3whjitbw@0M=P;DQyu=U#_uH8 zzS?!0$IAz07HijGR6~NC-)q-=qTh#R+G^K)sx5n&nRmoX+6kXnGHjXaHsmSs@b53r zk5t=W9b+ceO!N`Aq+t!@CE}U3h-da7ubBW}zenM!UWE0KONapi5d)0Tt{vU4p5!WN z*H{eT>(6M{qs+2zW%_B?qsDwFcloMaV<|OJX*Ou{CS&;7*;tb)LHtmh)lzdAYb@0e zBOOAFbQXO$ftbe(F;8do?J;5@d&EM#&!&iNW+JxXV`7cmwlQKJeT>Oq#1Fj?Kjh;c zJ0q_6^Lm=x|EGvI%n)zz{;x+I@&IuNY4f-n@YgZ87oOkMLX7bN<5ml?#}mXJXSKPZ zF?_ebHfLN2-`!A~!z$sUmuvINQuz9OZSHA|IH5$Fx0=9z)zjv-b>P3uwR!6X__z<+ z{IuxwIJJb__Ahc<3;2SC$Y;Ib*P`Lq=0lzZzqtT@^X>jsYQ7#jA?CX}6ziybJ@!|m zttK2YUyt1gpRxk;JYUzH2}~>a0=}+W0Zancd#}L0NNeY7ya$0VoxV!V*J<~`kBmWn zY69Q-2EMffK8vrNc7U%jNB+JDzV!@z>lfg8e!BbZD3_7IA3`2FU{s7tUF~{fo#~5Q z8fe!or$>}#n&I5<$VnYczh(;Bb<5hf^|H86;cE-u>qca(hYxaspFO&3M#e7qow4w< z!{KLt!cXxWa2@<_dC*%YYsz2fOnzfEWZ&3|s;_dQJtv$g z{<{^Gzw@NV>liH$w;=~-U-FVXs36Xs7C-W($(?+uO`IKtc(_oLRh}e%u%giDj?{aN zA4S^RkcUm9}2frcq;Xx4`=)bgz{^%ERv zS>H%n_r!#pYrB%e$^Yo^M>E=z<3t&od(hta8sux`Oh<1=QlYakjr!?8H*>nur#^<{ z>Y|}1<~^xSv%ivug)>=?45Q7j{z~nAU8#pb6z#83gJv{zB!x>DjnKT3{9dc6bAu?_ zyrWn;f60Z4rian%nt!FdZq77!bRd0rtD@naj&xNWNKI8YCFjA60-8k8#yYno%bD)f zF}5d7jeac^{B@(6qk7V~Z6~B1uS5z4X3WeR(k)LleUA$xRmw@}Vuc4;0iXOWNiy>g zW&7pvTci<#y2$t?CMTr77c{c{#*g_@s^muBaPH}fBuOtuB-i{?^||_7T&b6h7ZM+ug-2g+Ed2Y>d{e3a`KYx<{NKjnN0JN@vD2T&Aw^iBio~* zZ)O>Ud&&48>kg`OJbh*RYyBhYhW9J+Lj2vVz_*q7lJ?6qWp4s$;yZVW(_gL`x~dXC z#$&I#byB50tNRB{-J5v+7u=|PREfsiF-XSWsJ&EEFsIT!)3F^})F_%VKe$n?8||1! z({LHTx&3=hw`)|P!;u)#acLa$1>-|u;B zQj@`~* zT8VkN_a>{z=|`K<&Xr}an0|gFox;60yk14zF}JU5A26$m*lTc4xy|p1ubJ8CO8n;2 zhT@l*|4|066;!LH=(M>HZ9+Q>%c_VKyZh7E;2^4~+DKfS*h9u#*k~diZ`qyF(SBUC zp=c^Z$g-bF6>-VON;$W$nJ68Mmhl%u8j07^ddqEgebq)BT?qA%$Gkx3C^S<7zJGSY)OU+FG79}A`yuiPj&*-w0D7fKnp7lRG` z#m~uMRN>=6=6@r^xz15kaoC4KU-c8WIRueGo*VTm9wmPG8cNBHJ;>K=fOz#(1l``| zL%CH)iAR$%{KL+BgIq2_fLaq>t%Ne-!@ttYS5iB$N5l{%Up5K zlR)}u=1x7&%@vy#hSIGm-V`)ox)}Ml8>vnNQqTHh#IzQXG+7ly@v9bzc8UN>zwbsT zo-7m_9P^^X;~4ea6DPKb^Pz-OBK1#RCRW+xM;E3t(sW-e`hNCO^*f8Lqi8zdv1mJ zWPmS~I@^=;>6K!gUV)TWLqnF=*NQWj1X4^da|(N$AbuDYK(~Ikr|{-$MT7i6vTNOm zg1)a8Mdtvj*S8sYE7yr-n0MVZ&1ikbdU0Mi;4hiej5(XcR`-0UtZrTURBeOkXcs`; zRCVd-*iE9Qz=x*HZbmiRC5caOyVGlIA9xyg1K=NH1^G_fB=I-wkB#fn_Y+BCL5Z5& zia$y^ya!~ReJcKYIGuboEKge7BuN}r$MOH*xt(M3(9RH||6#aY*Cw~?FwZP@{}03M zIt;h#Fw@t^{}03MIt;h#Ff~*o{)gdqj(Lpxst>ykWAohQe;AI}VYpp~@yQbYhv9Y| zCIEIFW>1IIY~8(cybiW(d}&X1L1N=_Gw z`JBhxMy(XHUb<4RLwRgO#X8ZgrUTvHlFh0QTP#`(_oPy{Le`DTy@!?!X<9|G5)|rdNmcRVy=C1-)@B3u&K(Q}1`23vZxW$P+x82BZ zeG$86IahRX3#9q0p0LsbF=DkAUbLv~3-&%?ggC`8fc(e4U={gO#IrHMh-;p*{iTz{ ztrhN+zvnsIXw_E?*cnL4Ctk26NO%6Cz~=JY{#^hKq~Z2UE`N z7i?sHUvZ0F7!?jKWFL?Ch->zRP`CUS?6Xz47}D97is!#zw(Glz@yEmI*PKFDG}TpX z(XlJ_0LHY;TZ~BeqlwF3u%Uf?#Yv9cY0=_BR&Se?7@Q7Y5BoGnYjORdFuBbVbG2BS z9zjchF(ntV2y+X^7=LIbR@)d(;b^mWOe-;Sdk~F*J-LCExYN^zMx{PwGg2Cginwkv z=2}f-F||PtT8MVc2e%f-cZ`;0?*S@t)UfU{W{-VCaloQr8jW_=Uc)-%pGtg7&vJG@ zG(yIV`z(mpM~BE5YWRoEdGVjzPK@d~J8j!lwx8VcoMl=@%J_->e>3~YP}v?-Brfu(Yrtzj5e1l=dhK7!e|umy}~vy z^_D;y0()-HuIyg9FYVIHWu_io*`nq_GXD7E*(~NtrM-!DOO|k?QuY|$m3_MBP4RcH zGM`H=*!SC&?Ux%DYI?$7@OAp9wMI_Y{Ac7%<+;RsR~uwcwyCr)$Qi13yX+;~&kY=?es#r1 zzV39>lxAQSMJ3G)*?!zSf$49*)D%;t7S5Gop z?nOJ%|00z_`mo=R24Q^C2JXsUk>D?nNuNA>Y4=V~8DnFsC+#2XLCY}?H(drwcN4qF zvg_l4k}GmB-p79=k^+Vsn{w|TyE_loBFB*{{r5zG!D=_J) z+ohI*NQ=?8oH3cwfXf~-ew5!GsYp=E_9gf4Na2=D#-DwDNTJZSdfJjv6A#Kf>B)j^ZK*|s zBaPJM!0Tj=*I{-%cgv2}_JPYj+Uq7m*7adI+R@49(2nlhU350PwzmBg z;A?8-%mwwNs@gtqS=au*crH)Na;AsD0kr#|hon1~%QLigey+~G@LsH>!!L!Lv`wVT zLj&nB@H%_Op9D#TKDgn2PeRu9VFBo6+=%KnGpb{%F3>>P6y{hv`%jda)IcpWC~eKm^PEYh)I zf#l*)|9_ZaAFI*ObZ0sf54+j!p3*L(2e4)YPZ#8=Pr>L;&>; zGo|91BAr?sNa9)x3hLoS#ts4Gn_x=YJ33R_(E&6D>(d8bXlUxSKzcaNk@Q}B(%GN@ zs`bNyt~GF?3kL(J`t;5;^^gm_UmQfojoj(NJ`bw87P%7EnEqSUiK=-7(%K-AhW777 z+d_hA|Da%6{>6^IJ`bkBUwkPmU8K4*0?EF<7cDn7r%ONJ-@irBm(%U(@a#|;vZN~o zP4S@T1O4bnk}vr>I?{mo0i@SAoN{h9q4|#ksI*;A>f5y`b+QR1cOi<(-nOUiiGH-m z@IQJxxE5`i>q`Zvd()br+GHjK6K(8C^L{m^uid;UB&avNs9BW?$dgj9_a;w;9v$54 zPxH%qlfmakWIM`@PMP(lLw#z}_Ra3(w4pb3=>1MQ+%u3GSL;LZ*WO6&MtGCKlit*? zT@|v97U@r~p0wrJ9VzH(5QP}_p$K+Qsu&SYvBf>9#qIafm)H0`T47HL9G@ZS^$U?P zKZf0wT72*!n-{&Q)sAhFW2wI^J5))Q{uG5$DB78PJ5$wDKS)h#1`mk4R|2aUGpIt12(f-9O!Y7a>U`=e%&>JkPa~Q41+E?$}FY$eX4U4s`I4>{yPUxs0?dqJ zUop$gpEg1Eui0I!dB&Hjk{h*h@)c_x^OW!9lb{w;?7ii7tStJ8)7*XN`C$qFY)QtcSQ$nf!GI$j)+Sl=*P~el_#*1Y>h%w6QPzf-Fz&M{$kmM2 z|CQsg2GV!uN^!zpAL4jj`zBcT(Ahag*Cv;AnP#yp8KyHh&7OLZC8sX zegVYsx^uf}?TuhRfi)1`{zUYL%j30pey+}Lk2Mh94#(R;E;C*yzJ`xJ4!q9Z2x}lZ zya{A}t#FJv$LnO?esArynqWOdcP^K|qRlsGvkA`a1)Wn;B{YbE4qx&z-8*PZmDDWk-d;%bF2?X?eL{JwbqtLryo=U?NUsqH~K^n%#% zfh)zGO?>J5t7+_*$!gIZ@xz3bK}_#Nyx6&|2i*;t#+qGPA^P<9rQVYhnAeL0@%G>V z`cz{E+tNHp3OuOw?aeG_ z^>T681gy2LKFAD5Efb&a@gsxzJ6ZX@mEx2Ef#h*4g&Er{7SCc0p;;6BeaQMn;#2Do zay2~4s$7W|r@Mww*RLnp=<#z!wLv%y?|YSz*Id!ZC7f(xi1pdLSgd#!N}bB^8ek^PVU-AmKz1u5U*$Vqnc$T8y{niZ3dDd+CN%$m0i3) zKyK&2&kfAyU@w}9wFuT`Ba2n^r+UD%)^nKufXej;3-ug!yEjo<3Zc4jp;WwQ$_W%tLE zG`mx~%J_P7Cun{is>GK$JkjL+t+XGD`cGZ)HbBnVQ=&uEM+R2f8z`n~RybC!MQnSk z%Dy|P60>o)ft1oJgodFHZbSBFpA$l5dEaO!DbJxB`C(n<_3-MFXVdPo-19(Z$jQ#egTe~K<=Ng+;H z>j1{C!Fwt3vKuu?e#)9Be2`jo_9kH_)|4LIl^%J!%WDWxVpY=ocA-1D57@ikRVm6) zq_6XzvI!py>E5}{^rXvG_GolXBCHQ&jefumyVatocWSa}_LNy%HKAJ%9msox#A-Kf zL`QcyP*(pO)?92u<=r}wdUqgX+_0m1bFx?yJ4>2)$(~ND53-vUwq#Jtp2|n2 zuoPz}I%aE4ql{OxN9#M$rOVc2Wx1EN=w?q<67XGh(kj-pp)=W5u_kldiR|MiMtSEf zX|eMpc0gcM@!gUN53XUoqns)9lNBxP@5OeQIndYscC_Dh0vp>&q(f==p8mKOJ22Fl zQt-X`v>rw*Yp?@FcC#ao241YtOQc^%EUDcHBeq+M;d%F)i4K$+YDbOyjo4FQ{sMCX z_7||H!OnAG9ezJ#ot>Ynlh+}4*5%YZ=hfMHeyz)k|IL?q{u{2%$4?4kNYL%`3+eRVeV zpz~IyRB_aS+NylX$gDmE*0&*ZR}E$2+=-WLsG1|<&s!a6)EWoUuj@G1G)in2|X=NSg{1R)r9j&3(cREnFl8*H1tA?n|m1-`w zqGPKyG_!9f@@ip4R`)z;=^s~`(ZZe<4fLgi)17G48A~#6=|qp~Yv|DiYub|PNb_>L~MeW9$Qcx?A z%F-=q(i&6bySg9gug-R)&ZB~8lnQ-%U`p?? zeo!8!p?*7DNMRpL33?jZa;77dtO%fc=)==pF0|Ihmy|sj9X#bnjk5x%W+xBo>Fh$| z6TN6?ffKFs45SlvJJFgBo#_I;m-Xx1j-It(WKpdbee2SmjH`Rn2+Lm7v#KLS4sfL% zAEPMW*ohAKbfLpW(R8_k6P11Prr|9jsd~0IwajMZf*gL=UoT2u>Pdo807sGsqldx^?c_;55hZ=(W)TI zy6R5GS4^pBUoh=>r6vvTJw3pmOmF*;bE+wgiSZ}B93Kksu1^W0{i#0IwCz7v`=89$ zd31LES3C>;YH>4|=08+F0@Pq)5z4r_qAcG6&fpdFKc?OfKie+(F% zd#gMR)Fb z$htMs#_$C*wQG;3;V=Ft!(SL<-BOKp%PVRlwoQB8)3DD6J{N1Gjs5%L|M&eI z>7tW&!>+q8-k%-Xd*2R>PUaXLp105K{QczePF(jAa+4m>MvP-jvHtmYxDks+nmcwx zAT{je#i9;4)AXxAPA|qD2k3U_z z=0ofMRATu1%=^<4@6{Z`gWOTv&o@z-BtUfIr=u8PER+Ni1-kakbXhT;! zYT2%%|Hz36?86@_5V;rFr>_p%$GcinyQKL65UxXjPxu??4bn|shEm-)4Lob#{D?_G!C zvhG|i>)Pb9?ppuKd<=D%U66GcIeyUghd(17hTC=RbG+`lT-NpNUzy`|n19dxSLX9% ziuNA4{74)7#p6BUb{-#cxg7m@i!n@qtm`L#Pjq(vj_K_GzDxW))Y-W_LHq9UIVVQ@ zULAw1v-3GbCzt&5&hNqJLTCS1K90{6|18Ae^P*Z|#B^ykGWQD{&)-R%%+KX*>M$9QpKCEY z(Fa|8&f{&J9FKd~#q;C;k@sPIboUYnyH5Vs&c|72?>F6ujcepZDL1UhQO}!QXzov5 zM))nR+MC_P-=){6=15Kc^JbcS?8VdCj>=w4W;ypfsm>EC{4M%qHcbj9&*y5Y)x(=D zO$nlYm)xndvo{;t*q%VXnn}Xk;r5p&PN974D&fSwfjSHZl)oYl3dq3J)&zEuy*RdIsgX#BYHO=>!!dedu zq;RY${j^SGXIz8md;>@N;ys1EoE$`b@i!EMZY8ot_&u&|2x7wfiR{&5U+Uh|juc`d z>mK1p4H`3w@0-qU8~c*K#);O9O=nqeJZYO~PrH_#VAo=OX(_(Lwe5L=EnVwH6;BbP z9XrbAwC_S{vp{PTp*%L9Jc>rZxy~YwJ zxX{g&*ptcP9y>JAg&sV2Bb7lOJKx8d=2f^*JG^G#K zyeaU%=d9L_4&-4KN)7K_VIB|6>FFe_S$)f9^@5s{V^|pVEV#;&?V8iery-=e_JCy` zZBK8e1k?NHM_Jy$cBB{QkGXmu^A2oA!LgxKn32XhlsBVp3&N=Q1u?UzrgRT}e0ZG$ zZ12w6)Tyo?xvTcDCOhlUg4kd(d3k`%+ER1fCvcCGM^6t{uVm!dT0{_d1?=ZHrBO~RWw8IoILH`zWXW4m9evCI+HlfS{;= zlES@vMoJn%5s(fWu?PVJu?18_6v6I53={?7p26-;?7;5A)@ODXzQ51w`ETyLW@k_B z%)IBEGk4u0J|rRt^GW`2*DBusW1uAC>3NtJE(^hNLk_c-=Rfipu>n}w?f`q4*b2MS zp4g(C5;l24L)2U0kH@~3u)*J3Ve?h~IJUBq1>GV3fdEYIPIZ*pYh%m=f2?1AjwM}g zh36X%!qnY2*?{VXn6fAU9~+!!j}|n<{@wjiyFJxY82gDY92tZ`4(C}_>?eM9VGy2k zIn3@ARq@?zf^ibH=eW~h{$hLx)~CGUlkHW!zl34~ zl3DX=F;7?*F7dBFUd#`qhD-cGDU12!DWMob<51r)j;}o#A<5j*iQ{M1M_@yGcGZlr z+-7~4BxBV{$(!tslw>qpE4kHzNJ-CyDGI)Eez+tvNmq*}Esv69!rfze*vz5Q*lyW5 zns3qam*&FbhDp-+J)j;T8E~dZB+?70wtYVlQns>2@%rRPL3{CZ3v3QFq*HOpLA8f48kP& zeM|PKlxfk@n0qDatE`=(B$+2u_oPzad$H=~n+R-1w0)o^_fePWW4f_i_fe3P7rhiYmQS`0ljOU_ zEarb(gi3UGy=|Oj1WR<+qDr3JXsAS|wX5Ro<^*CR(%Gr-1HZb*4_~D`WJwo3^4z~e zaD>e*X7|1UHVyW`$eq>feU&=u-XDk`LLRbUv-iA#u@_!AUCmrwTVg5Q$o{}x#2^jQ^&o#!tS#)-1BKa4${I(hq7c#t zgZ3Y0MUR|tdmD3%G+fTipWCC=PBTn!-^C2+j?s>qKA6+sAUhXrgi&)WFf05N`*Kzn z50%{fZDNkNsiqPSvXh0q9Nn=fR_ORWs8=CBFIgHmdKh1Ed^&k}mCU z-K4z<8n-E_y_M<%<^6>vC(R~J z6pWihV>qoJzx)ZplRm>Rfow&3et)G+mmq1qy+7!!9Ar2MOX*v%?w2TRiwnXPWN)Xn ziWm6vFkDCLvx4rQugUVl+2j}Ol4F!lXfDLHopmflu%)x>B7aoQWMRkzSx<|UDT3)t zS?1-`hr+@r`7Gk$`VWPui!y&{R9ALnm(0)a@jw`3Om!1U&#Z1;S+1VDqxsouye!XAyh0%V#%J2jCw%hgq4tm-$j&Pn4N@U@yz_lh30r z4%*AMXvp#yyq7ICljX0hJcVxq9w&Aghq*Ki-pOwFm=Vir% z87$FSZu6&4GuXK-xi2|E)E8hdA>|c&ai`9 zWSLQm^I6}UGXJ4gI`ir#kJWPHbf#_~k7189`KIikZhenKoN-hM5U;e~#w& zE-z-5_2ju|*WxU@ME6Zr(^`G_FQ0w(k@@u@ou#aj=`nuktOu9pE4oJkOPL_kD}EQV zR0Em5J>@JLurCbP(>gz=w~ux6kmvoz`LnF=wJ7P^nJW}9*A+6qQAj##@=T_075TC} z-Qm(Vb!?X}+xl7F`wN=TiG^*J>9~U1LiZq<_S!Z<_@XJ(8o#ZTp5H^IJ;B+lCJJ3w z%is77dq?H6D0y%0y>GmrGeF+IQ|7c#g?#Xp_V4Dmxg!L;ijwvaV~RSlOj~(B@wv*E zZJQ(0p~2~_L#6z#*SCC`msz;Hhe$J_WX*$WU>#FuT``A zJ7X|~=u?-f*^jyMK4zP>)oj(AD2yO`64CK5YkW3Zk})~+hppQbDe<59XuvubHpLkLj$Zyspl^ zdc>Mg&RSgmhR+`{!-?{GUUTL&v#NH*Li!fg>z!eS4ZWmu;AwiKXNAny&;7~L9(qXp z^zT2|=EDOddC#psm~y4F^j%c%{J~lsc9!(tZPNsi8HxxcAu znxH|rLtM`b&Hk|Cb3&!H=Q~jowssGY#$@U(O$b{PBJtBl>cGY8;nEoDW$S?L??`EE z_v-3E&4FM^=61XxEIB_^q6eO*^GL75B>6eT?Ev}@k#z2HXa}nX43yqGdx`;^jqs6Z z;g12d3G$a@qHnc@kHvH@h}yh*Zd=F=r#%Vk`@NvH;7IpA#PQb-XbZ9D9HsF|5SoDE zwu>~LJEpgVYoDAY+9k6I=>Bk*#ys_0TPPyzBc9LqTG*u9ny&l)9oQC`f=&-7NroqxLUnyvreAA&_;lI@Cy}0^OYFdIj|1)@J=ex}1R)~^u!y0-FFFIi z&kwq1D6#3ev&=Ys5Uf1mh}GL4u&0N^;gFL9o>}yOW!Z*9t6l=Od3b~E?K}n?H`2NH zH8)t!i!dnFP+*6>XW5JWqoH^m=Eoetk)+Dqqwrj0f3&bz{H z{h}Jkbhq#P{F6+<=7WK$9Y*w~+G?{G!>KJcm~VQGeGFd&?6w8wcRt5Pz08IAxqUEh z0p(sy7J_M;zUa*lv*H;!u;0!c6F=@{#pm*1Jnb`XeXx>6IuyW~^%l5f*J{?wFdK6F z_QCfzcd*5;bHTBv8LFn{Gs8AnurI$a!kPmtd+}U&GmGw_?tPr?Hdo-P5@fHthC^Nf?ekXdXY<#G!tk}s~^&SjWHFRFsZ5s>oihy5}U2&1=Hl~|81|ALT zk82b=*~jODLFXmqd~&z3u^N$JF~%DwrEFst2gE|wTRM08YAdT;<`1XI=JcFU#12}x zgHgLsY5o7}Fa+983c?qi4zReGA)r_mjDNikv*9^Wu!!~>+gl!Hqnx6k-=_d^2Vk69X~z zO(pAQHxA;x0&(5*bIfXfDm)oT-&9;BJM}9C9?@Oezx_*?wP6bUG8u>#%XYE}os&W9 zq&uBy+{)U-&IDfrZ`@H($f6&l!|5Zgv|qS|HEll`8a{NwpOdySJ?kWR8_claSRvC3 zNr$g@956j~3+t1g2rrvc&P!uI>s~Sg)av&`Z>@bS`qK=!LHA8Zp4q|5!so&_O&fH- zxrdE*%Y?K5D{MG%CsQ|F1Y-iIMuFcZX4X6hnhZ6^tB;qn;#XO)%d{UZ30=#qHZ6wT zw3qEZIhQScngI_U^h1ZEn^@(9xo{%Z9y@Q}#$Ftm3l+a8=M%k&?Q)w3%_t5`EZoFi zy_gC5CVp7oiRS(7JUHFY6Bp1uk*TvY;Wg!j9Mspd!k-z?a1KM;%5}_nVHTAB6wvn2 zDt1U~5wzY(_bgWAuvaq|LN(osv0A)@E$^@hPPz*C)qe^*yPaf)+oJOK6c*-9XEOT; z_)*=PS>Ia(zv$hp3~T{nb}b7X@Ld>-t6>=9O%->9M$$tXXk(C zzysPl2x#ZSVE;1ce908kd(L1+n^r*K2ijYIJ%g!rqkD)7+TWR$&bo%Lgwn2bHYR=` zGrzY2G;f-rSG$4i=Idq9{h%qHTj|3}HJ8Gw=Vth-vp#$GV;Nkbe0zmbpBZOo!vPo4 z(@>vP(OJ;DbQU!BgC6@p=S3gUdC~WDCh!f>)kL45^Muz(<^jptRu;9qG!c>pdV^=igaCH1fuKOuTS)i+V<-aEw))~zj*Gkj_&ZEGnV4nOHp3z zi$2kHdb$u@r(e9gTK8V@eyiA?jnp3T?&@r6r!%#4#eZn=-fJCSyeC^ni}z|1YM&M9 zI=*-(w~jA9TStq}ex&|hra2P%Wi+-cY3{`Pwsm|_rhD!9xBZWd$gk^{$QRGMisK-j zDXpW$GpKbk+iUfd&>HwJE#48XJC`e-YprX8$giWVsQqFa#Aijiu5JJAuh_>r{(t)` z-dV2Wi}#xA#zf@Tje~gixsLx|TD&)1_pHdTlNb4QZ4-6Y(bGw$PF|F$YqNOnR~!fN z{Il5py0gJzf9q)R3~=2zi1Kx`sIyLwNY}mVzxu_q%5{A4Jab(eM7mCoC{w3L4SL);L5p&=Crs^$({8SUysuQlWO7eT zwpFZ009 z`5ACyzAtv5J(w)B*%0%J&b2o6!o1koP(yX2SE&!e;j5;C&3S)}FCK)MFEgP3S8wcn za|rgCI2&46`JyT%5F6fG0;QRrI4af;*GJ?D+*$h)Gdg6c&xnR)43`dN$!Kgbc;6C}9Uo-X5 zs%ROwT{XqKmrT%#Y+WVU$xQ85*zDCZ_(ndcag09Q>yYi|H>%Z8LiX(q*|$bol;f=B zi)*!Roo`a9|BwIQ^)JfQeHVQz)Ul2h?G_SeUCGqPcimjzzxtdFNL2L?1T$D|P^c)djqxCfczKczKp@ymv| zE|f1l0l25-BIt6o57qPV#5T z1JR^#K4@IA!c^-an68)!*P7X4-t_>SbBylzQ{ALklMwX1lnz-9tnsI#9}ZZW4&T8V zPkDG^;lgxyRA!4?skV;o@X65eh#fwqTw6Ws$&fyX&e47LM4fSyA)>1-ig}82jgz6L zjU8T@8;JW~CBrEYaNoTUoDnb!PRI7gE6c*r<4X!WT<3`AJ;PCPXBLbaGywf8!m#6S zIzLb6-o{S~$Mx?rKrPc9H&qYCG&UQ0(w#fqybv@SI~7)i4Z^ryL8x|n3QTM6gL^zf z(eTZ9Fq!X<$?0?kFK|3ewe!X2>qGI6=>#bI5`gy_55^}mVnAn45FV!Z)z>iww4Er= zOuzRe#lVTGAZ%ynjYe*PFgiFG2fKM=j7K2s?PpTghBGrC5-PRM@>Dvh_}gI+PVN#3<#a~cgYFVoj*o>- z;dYouXBxHk#=_n+3jB3u0Nyzk0pq{g(_Sj&h8jdde6)ZUzYf3_7bBqZtUWfSx>$Kn z27}=^hU?l;J*)h|Ab2a$hw5Lo7~>DS=g^(1xKPY!KLkd9am8u(!g2DoA+YS3H?D0M zfzw<(;82Y}#?d`Qy*zi&8a)s_>0V)G3kEL90XT{H3nK+6eC3PY#P6BM;O?nl^rmrJ zV`2g2zM&F5zoaj``V%P0?;B$QgH_?um_He30m`T0(!A)rF@imBBP4p&3nMsiJVKIj zPS%BBUCSJSa?R zL#V4R+;9w+X!Sux5Y}KQj;Hn;bmHcGA-eCBgsKjN{>Hg|)S6Fa?;(yv(wYfJK znm=avOWhSOjdX?mH3Hhq@xsczuHYNpU%Ib%%tis5CWFKen5lqfPaGuvVG9Ku7zmP{ z7fA{jJkddV*RAgg7{9;;dr})dzcq*Ebca!-&!m~dZo20uwr9vqL+C^~Mv;Hpw;LqW zxeBo_*RFSiu@eSM{e7F+9_A8O75hHwYkT)Fz9%u;N-%w3*>hF5WHI;wpFVP1w z&0#RrmlE$P7S1t*^Fy5_I%=E_+!9L}^Y{HF;o4p7}D z;>Vj(4%TRZB;U+P3!JD9lGyhZzcu0MA}2|{Vv-gtxa2O4!;LB}2&FusI1W2Kn!*Pd zfc$_%CEj)eRE@^wc7i}MKjjt=;4zNq@hT(2n+jH#Zuy?m*nZ5nyu=B+-Kd=MU9T+ClCF?G- z3qeshklLJm`2f?~D${zd7ui)c+E1rG-bs4Saw%sk_I+X#H3+2KtVl!Of9#m4FZQDG zF}U=Mb#CJ)(HE{>U|UAZ@+WMcu_dcKu@|i?&!7veXPh6Jle|XEU-tQ+hs57>@((L2 z7$D8Xmt#-apJ}e>M)NZH`FXbMi~Ov~f~V|LkPCjI^)n{tJR5%96+K9XC;egGNpyaQ z`0J&u$m|LeEBy zKF@S+$u;G2DBqFXRlYA=)v1Kt|0UlM_Uc-~ei_R5c|+4nSVsr>9&ymk64v^V+^;d# z2blIjs=GqtpYJt?-EfSS#{Y7gIjsIGncs6; z5Q|(pYnogyPXG2xK`T?% z-%M@3VANig?~yxCxGBi|KaXAtZ=>b+Hd-}LIMjBSw6>XMj`Hn$c|AYxo1?sZGDcdT zy-jnKfmC-+tY4SYPfc}Xu`JW7y_#zGNO{d~{`$LO z(zs3gyis+0YP6)&b#1OvuXa7pXg6PYzF8jg>7lO#z0Wc|-p`o%^_RzXA2((vXm3{> zTkBmx%w$!NG<1uvkv})q&56LU^Q#jSf=;st!Cv5<@Ip! z!zy+qPF_D>t5&f#Zt~sm^>B+-y1R7ey^3lNPFy3ucd%!7c5k5EwkMCevlVn+OZ>i^ecuS%>dX9w zwy%YS1#%zLVtcS*v`;PG%^yDPtuUO<ejKkmi^gURgw=#;5*3##4OTJkMM_;ms=f^eR(MzLnAKB8isSWrDI#(dpGaU4EgUWbD zq_l23xzto#^_0JtDQ+v2`*+B+NBL^y(Z2GxGhx`j z5N`QNwI!MWgq5bIAaFIlGwhz^zNJr=GnP)+>kE6FcysK(#Z z*$Gjm-iCVoNJ@w#leQyI1))^iiuBC0`=NS~=poTlX8%@&Y0A&eU2n>#ETY<3B=aFW zjQ8<#mg*Qx*b>fLY;}|PW2evM3527?x}6_9Bl#@4t0>mY927o}@7v-k$uxB}=kMvx zqsaHy?8|4+-A1uJr?*(}!8yTFdsvHT-qzY*;_okv;V*U!MNYmvdHQ^Qf@*KBre`(x zE#Rf5gRz31ZGL$j-*k{_j1a$z*#M0Wa^W;H(f4j5v?ERS+_>ZwlsaERFb{F~bTXbh% zl&4y+)*tNAB+U!esRnFfh=B7NQvEN(OFY2D38&C|tAk!}`$7kdc4z|^o!+{!vcqNlIVrDiHrFD4zR(-CS z7a^^~s5C47^J=8TUmS16zZ6E|9$L2(lZW#K$0Be)(bp@7ahrfJX>A9l#PDD>dHvtJ z8pWT)5>6tYH9lhjSECwVBE51)2G_0$l)jNZ12*yolL90X(RZUUz#FpB@+{(JyAG_|z*Q5}lf?;!Adf zNP2#Mui!WK43+xZ!|xh5ZtpLR)w;mzynUY_+(=`Rb?FWFUp5FA1kzdxd(G8*c;gbP z$?5y#I-lhijNj>9Yu>!&FA4*27}cA2cKA_^Y};no&)d5f?*o z(Y*%fM=?@4t?ABB8z4Rnz)^HRc0h6i9Q(;1m#lTgeaGtKFv|118{mZI_v>M4swXOL z_Q$(tU-Id;t~ixyTwHmshR?HIa3s~T&~2=Sqcr>D9I8_heN790{Gk%?8y&G(c~eZE z<%D+A`s2vHTG(o@9VQ+ffU&c6@Is9OGwmF4@6h%bkw*3K+w{jBFWTWzb89TT=!sYB z>tKgXwrC$T05=vJVEb;C7a6JjMmr&o{sc&Fss#Sdy!+ofGg-0;C4TdI4b`;lfib&NaS-P9koY+K^K zBmU@GZ!j+Y&;pwV48nD(bWc834;OD5gqM~K!XX{>@agSASh(B^hkWUd6VCZ!`ASc` zcgYy1T%z1ss{uI2y$>Gi<&DYrsLt{^Q`9B>?Ost%rbl1wcAM^RQog(H9;kR{#OC}0 z_z+ArSI=E#gQ#wR$q!G=r}L=!_ZP$G5+96cbCgAn%!9o3?zFd3%IqgDgK;Ok5Qi1B z{jHaRH}^(s&qDT2Zy9VQKWn>VIrF95;JqE5sPCN5dRRji^>?+adZ4Yw5GJ7bDhCZ9sf+Kc$Y&ruT|9E5!N|;@*L2ZQH~>1(EJV z?Gg72>grmEIrF+&tRmmMR_4EaaqmEssV}yH^wi0V`vP@3#XNi+zYXQv>-31U_^wyf z9#N)_7IX4-^*8=Yi#ho^8Ii7&5%cYJe37oJA0p<`>tsZ_j(>r2>2-WD4_U`|rF>%@ zU#x#3@+VXM4HeZ(snaj!Arp+{S|XhCkac`fPaQ43tFDjY-a#GxU%uG>x-k*=JL+gr zzK;H{yr{p9FVb~7#rD+kMY^sHttgLLCo`AwuH`h&^{7@@7s`<;sr}~eo>=g+CHA5| zW>Ftsd})bl%d;V>p&PbusE;4oErk}obk{>)A9n@!VBxdndPlR|-wP`#2QS7O?WQjj zmUoro3Q~t`1tS*k8jV z+>H9d$KPcU%Uw`8^c@@K^pF`nbjC`5PnbQXh85mZ@n45uGe4@w{WgR4Ggh~@`({$W zR(DE3b-Qr;+g=5%jcx)~?tIT%rK9llQzUvFxo5v5xq!9TPC!c)s^-cs#BZyY?XGjGoC>R2TNe;W3vIzWr&n>iRbi zT)Nbjx6*5ii}T0e@z|sM#>pC080lP^_k`PAJjTY8p5g6Zajzdo*e7aRGqs1jSD*{b zrZ(&z^@wjAO#c~2ZFBtej9(k;4BC`Sdl*^6yCx!Au-8LjmYmPs?GwQI)+4^J@-x>y z;t0pOyI{srs$KWHltt6H1wYPIW#>f0HX2V=vK=d%+y=CIKVzF!#;RfChe4-^3dM+` z6`T!C0FQ-Zz;^vn_N3`Iq4)C`XclvytsLEyc^!6vOUp;G!b>{PljxNv8o~3+CH$Jp zU`W5)1Y+BovGhZ>aA(a%79Z0ICKJ8rjXv0q+RSf1?F~~ktYBME4Ew{W9<1v-R@&2q zGUV+bZKor2?wiGTvnwniFC6kSv)H(G2U*2dJxEWqg3Ux1J{SpqEk<(tN(0un;Y1M3 zRMZ9@6$#)|lB(Qayo9GkC&FlFALWT=3wgSB5_mdn7AhlR*tyDN=o;I$ zc+yA_5x$g3FLZHOhCSRfxX4?^G{W=y0P3%@!HfWXTsCPZJM*k94%c@; ztIv6C`^x=%LdpmX$(_kQSLLggd)wj5Tyto*^$J%{4=3D7F=K8czNN!t+~GNr{T^wC z3-()JTwxU7d}1(m>(K-oSef!$I>XSV=pNruqs0%?{1$i*|3Gpu;_ix-%;8BqF6{M;-EsKJ+BR^&o-__c8#N%PNP!z#G3B}*YnW|PJno?OyE`(w zX#FwRlG^`u^%`#Tz6)-q_CNhm&GXvQzSKLa8>P%swbPx5D~eNSlWXUZp`6OHrE zf1SX5nI(SN9>T^ITLU}M3pd*OD4Vt0%5rKZ;)zH%o@=Vh-|Ho#5skwXYaKj#+75eV zcjRUs6R~0N3OOlJ9>)4h@Yq6)jc%`8{ENx{dJVXQfRx7*b@0ec!2@YxNk>{?a# z#zE(l=+gP7oy(UL+;1PoMx?IjswlG%FO!ph-sZ~Sv!iH}kmTa|uJ!K2P$%;nVg zvK=JTpJdD)-6#{EJxI?s^ii{V;uOY@k=&V#>1FTz!}yg?DHv!_Rn~^yHIUx*?BsO2 zhs3{1{7$N_<$q&C`ILVt*jasJ#V=J5zh{(+m+s`Ne&l=ddB&;O?wygs^YJ?7pb?KJ zyJy<1owvYDo&B5wBdM*8Z4>P}omE22)86>mAhE0|(Md$}&pq~U>YM-x zq^oA^O}l<1zt=mA&z*a-%#!GaK4JXxnkqZDhrQwSMJ24fZLz=I8gQ3`y!ZdBfgzPlv)?zC^`3+eRj{H1S4 z>)!^YC)ND;xz`km9egURuqyQm_c@6>$-#dIN6-BWOKBz9f~%pkZe?(S2KQsY|9O@ zEgRSso?L6A?$g+1kWIT37{j_$8u0F9mu8b)I!=1FkiGg!_UeWU)dV8jc!F%B6X{GO zTW3eMZvG)#{7rT;n(XAS3paUi?kwd(vQfw0Z)N+*wuF&w+1i6u3?+NjkL=acXKf*j z?8&=NdF;2rMW#zO2g&AaUb&y8kZtKiwx!J|Ge{=8(T(gz<5e~=iEPnbvPC*uudw=L zXC{!HX-fP``o`Vp8{bAc>;0_ene>epofr(iyEnm5Yg2yo<|F1^*kAZV_N1-hMdoB~ zZ|6bwp{%hEj5Vj10zaQnsY`ErT@MorZdL4WdVmRjG0Ez0qDjpCVElkNzA*9^oYiecO-hS`7WJ>Tk# zs{R!7?56fGim!|)zIs4@e-y`J5MT%z@P(0&X+_KE5 zX8~JIwrTs$_w@fGD7>XOWM08Q=$zi1=Tj{4;^jMbzGJzNLUG7FikFU3Ea6VEgsSU6 zI8mt0Lny`wA$m2%238asWYDwQCpQ?)zzvw`C~wR>{0Gdu}6pR9`JzThre{@a~J7Z z8P}QXQ4Di{^bDf7Xb#0iAHR9PuUuPxv141jsxu5i$?p`9-?>g}pn&2EO^PeDZarcv zDBkE!@y4wYFIgDHCs!ywS)5!^9!jx9e~KlHxkq`=+W5q(_cPuJja5S_-Y};1;Q1s| zwT5C6iYsst#TCUAS6Due!E4d?ncJAA%!v3)DaL4XrG(F3E3_SyX?!Syn>TK+STIq5wjFxo+c{weyVlz0)Pl^imt?m;lHGn-*;UbcY$#79oA1+Lqw+G@ z{D)-oPhHAXoF<=@Lq4n8wVCjOeB250al`!AD}K}32_(PPMaxiVMt*Q1`N3mvGZms= zdqIA!b#_N4`pqWfH?`cF38GKTCZA}Z+lV=m4-Ft6`u$G6Fr~ng&mfoTMu?OTk z7FKBsyJ&t3X?`1*nh5u4-mPig4JlSULhIo`_)z{GHVZm5CT27yo7ZnwPNX^QLvtEI z&zjS`N6@@4{9&XxNb|m*=DmwewxR>AjcK$tp1<9qsG#>}(VBVgmaRx6zxJ8@TIgvb zMf+Ocw@Ed<%$I!MF7kca7plsf$cJ7aA8O#Ew*LUd7Zhi}te|&%(8KMjOu}xCZ|@!o zCA?NccuiUKo;@Orc8@Tc`pD2j288>567D;b)wZmda9j!DxJ;igdu`(XF-pMkhwj>^ z$yg5y2@k#?JeZzCcIHwGJ57Cxak?bn8p3@)NoVOR7kojOt2x;>o#s)PM)=5s?8b;o zF8G`?B_nrJexm2$Sj) zCVgvogc;HJ93g)cx!eW55Qd5*|Mfb<32F%cI*>m)@ugbTi?Hn-@<-*Pj%+I z;`dan1M$xirXF{w6)q;7N#u{l?9j$twfJlAB`n;7u<)Btk#LUY>pbCE#k5v1iuw{ncyMt}H1;9Pc!X?t^COP9JF-F% zM|N8nnt(|7Vjma|2Hp}uxGOoP6AratN*#)?94Zp4#iaQg;A^x;k5=7M~$79#kLWanMiS$U+zr4i=MqoSZP^XQ+PvI z$(XQG8{LVZy*E{vEMp}A!b(LlR)YIBK1yA(z1cMr;XdJ`46?oN^pYWw+LlQ^&U@5m zCSvL|iW{f4H6z?#%YVWb#E_+nJgM9d=Ju~zmSxP;oUhkVC&A0W5Bm> zMv5}>N5!SRVVjlgkES0FWhZCcEVCki^3ywv8TCjkYeo2O0`>b;t)I#u|N60?jMwH7 zZR44(NFbl}<$x0X&KoHjlg}FYJO%w1PcL&PpS7E??%M-eR*@vTl`v-3hOw46$Y&iS z%)9xzjg=$$@vo11;~d8oHeY)e@NU${_J%UP-e(`io7Up=wFU*O?W*Z^R|yMW`$Sk& zy~?hojK^Wc?Ljt^2&>w4O@LbmwDz|kU%H=S0E3NV_tkR_<434JORwAPe^1!fmoR67 zul4>j#2fDvMt6&3th$@}>k#~HpNL^6Q(JHJO|5E8a55;(y6c4oSKzOw_hHMZqlr<~;Uku4N*Tz(x zXr0&LzRwmTS;zmwgZvW3qQhuyd(qmi!;EJFV>l2VOeH+nw{I5POt>pYg$xfmx`QJma+Oj8LB zJPGflYJF3AP%OQI?BqVOlii43LUy&wl@ivNu$3P9GR;rbs=b7jP7zirB;Q1S3MY^+ z)4s1_LkU}rA#9~dzHBq$rrYGF@+r?5Mf^GB`vmfR*@U^?5sn+x?Fd^=v=#Zg;pFf3 z5QegoF%+I5Y&DFq73GuBmM~NmVXjY!t#HGl&_hirhWSe|OcKRH!4wNEqPV4X|JG%D zd4UW9# zt`xVtqqt=w;ig^WTlLAe3WV9;kS}IW;-P}@{w2cuf5}IS82=(+{E_6lMcfxc{=JC& zyNDUZob%rVRCsVZc!G%OfXOlnJMz({wYV~ne7$xp_H0gZ!Xv`1&&hwC zBLDTa{zj#WuILiu$%yzgi(-kd|A%eaeZs#d$*<*-U#obNsZf&N zyh(o3x;EG9OgknheX-~Em7Y%clwljQ6F{oSDSp;+kKUdojX$SNC3@xWz@2hOPLAJnH9 z;5EenODJz?L3zuYMJafjd`dCJ4_hgIu=B_+A5VVv2l?5sBSz)AGB(77o&U>=qVc{e zy8(m^&t6nwJ+-#`YV)i3piIV$=ZOzwGu0{Yw25N=$Aq&ci1{eO0<3lqMVI`@u0h-R z?6@(oX3JBZFp_yhh19e zvRVEq(0sEQ@AmJHaOn9E@M+KlquTXg%7e*p>!um^x^qX+-w^oL8)si1bw zlp9udWW%>6!OV40?9rS)%-~icjF=qBy1%?4TzMD(=hkbWrN&~R<7RD8Y5U>ueL2F@ zIBjq=_d~-L*Mw^i0)Va3pt}||LjK59C|YF7JMGUFT5r$>=azoBHu9U`IU*JQ#+mXo zhik$Ol5en513P#9COD9M$~fBhnSW8J_bCqJ2#pcP0JN}teFB9^gl)YZcZ1Lz6ylF)aG%o`w6jqTSH3&>dUVjL8n0q0;KsuI&Tf9FXalctEa$t>PvFF zBq5CWqlq8T$wx37lmhN6qS>$PB%y%#uBz5>&fS*||4)G_Z%lch(SGHQ8ea%L*&2>E zx~X(rkpj6*qS>V3y@l#bU-;Li4OC1IP;OhI0aY`Cpn1nlN;5S-SVH>McE&1I=^8L= zK@hC#J6~ZLZOTl%r$Xl90Od52|4j0`%;qbO65o*cUf*|@vv*Pa_wE!}xqY7EX@n_r zCVp(<-tq>|qj=Pw6o_Bs(N8m_Cz~8M6-L*LEUmsVj4z&>0=+j5uW%}%ec^`y^29EqPP#q z-}yF0>CRi@-$s70Y2*&&43e2mGB4dK6>8n1`SP79u)g0X<*bHn@XH}zXrx}IjExV% zZaEs@vCCem6FrPSo}U6+=T8^XUk73=JsWo1RJa(_8XwVnyBYTtieiKCq=yC!cxo!> z5Z|5J9DZfGu;W!A+OE=o+s?Vd{xwr@?l@Dn;)|)^K{D-0X204T<(5zy2WqGK@7c=! zL=Ppp^y6&h{IDqQM)V+|pYSE7HMaQY3lD3i3zekvBDGI;(^%@b}trgO8I8nEo_A!Qre7=A4)1u7q36>dGG|IVgoTddC(PHxb~pVa;U z*S&&HRv?vx(g5Gji-hYtwdq`tA6$NNMHu)Z0J|;MfRM*ELjO^zcrwnE9r&0b)Z^N8 zXU7jTFCSKBl}GYPG><=iTvOV`Me@%?uiiOdsHxFL$5*~E*X5FM_j3Sh=4wEHw>3&M ziRN1CQy}#1QX#EDYdm(u7e0NzCVcr7fUaXSppE-De$E-VZ{3r`K0bLzEn^|vDHw6GH(PdUqH12eE=~{jg1k<;ym{sfKILix%zUU&wT_SD=Xf$?XXf(# z3S;b4V+j+wbQe@lgRzajI{b6G&2Noe$!~WHh7LL{@p5-dyl?)9HQ0PZ6}%w^-5OOh zjhjx`c4|3)ysj|_7x(j`iE)^6_oq;_))Z%qu)*;*{aD|1nY_n@Sp2jln?2AQqOAUy zhJVM;R^HE3@ip_~@ahsPA#u++<++_{m}p`tvlpe_~w4^r<%RV}T_G53wy@cl9L8D2~NY<4K3st+N4>FiUj%5>jF55C^k- zEBRUHxusu*+kmj%605#KX@B=PSYcGj)iN{7b^oS8sp^N~%&-HN`Xv93=L zyXjAbk>-|CQRe)<9|~`!sio5 zlT3WIj%7EJIZryL_8Dv?%Je<)Lve%N)tzKCGETDQq^C}1Jn3mqGN-QmP&_9Y3zE4( zdelj#GwG=&J#inctVEfnmwqU!Nv0dg=#rjRB-4XrN=fG4iC@yY3~S%jfn;1srem$1 zXCxC)+h(IfKNQDFPj8a>MDJ=sG95_IUy@<9?J0WlL-CJfj7X+6>1jzarX;hLWMWR5 zT8sT!dE|%UGRYW{Oh=N@{{P-3wi&PgP`n|TJ|y#i-qny~#4&70V`y93o|MBs6g}E$ zS?Q4skRDx<(IJ_pBy(h`b&05_`?Vj6jI~#7Y)Gb(^qg>ZwQ5c>_9Qd=lDy{5Bjk&cS1334OoMZc8z~#QY!dF5#lqOIlg$6>0j1gFu~4mvJg9YsV6kj6bZId` zvBzR2%V`n|f481sAyJ!!UYaAJri$}TZ$sJOBmH3b%_8<=Ob5`N4)KeMhbcA2O z`$K2zbKGr5LkKL3fh64{tk2w;O!o-=H_~lXy+1MxRIw@+HGVOBe>55v_-a9iLK9f9 zs{u6c)kaJc<)Vdu8Sc*Q*kBAV?{4o@-VQN(}M z;Y7u(?h&m2@f658o*{&vZH!)nf2P`PWVDepis+dAE>*!wD+bs?F=4)X-tdyO&5 zHwc79yDA^3fWhd2 z%7sa0e1>u=EUTVfv7kDFO(C5(;zp{hZM7-?%+g$1-o9}pD><72pEO5RY#!Mfmbm!QK1ifuzkU$t_G<##VY-So^;$#9GCv5r zyr`neJ_uaCYe4a$9m+%&1RGvyK(l)@6$fpn!urAHY{tM*%6X(`J?WYFXuHygWCC83 zzy5wgx!zc%l4+gnaoJO^+bd)>G~At=4#Hie)+02-bArRX(V@RdR^Jl zI0&5TH-RkmG@+_A5R#~!|4KnfxDW^{&6_|+$E8Ah9g6QrPx^seVfVr*aD>{hF(*tg z4M_pB7ExS#<8g5#no zaE0{P-PkN#h@1jDo13$4MvH`hX@M|Evk5pXG8KMkwFU#yGdVt2a3c8~)W_vBONIQm z0pMWV1e)1j7ZUxFVe0QlzBcHlkbf!_xScuMVZBN4dzlO$Pek&NM%M(hT>%hB{c=pp z7SsZ@VKlYpaQ!L50%vXTnB@mgtF8*;Nu~p}t%375p(G#`cHB2({YGUA@d4VPMQu2d zRwHNzr9x6ebJm^;Yp>fK0NS54U_70rm>HM~(bTr8%!cfmS}JsPG-oGUeEok+U1wBO zJrlOlR8&^%DA++dEC}42sE8E=EU-431q88E78bArcCq({1uF_j*?SWkA}Wf#fL&j^ zSh36Z?5p27@4q>7o=hgWliXx7nTUg*#L*VvA#7f3dlIt_d#HvXETN(;Y202-Lk#Un zP_IYg(cuB~Wh+B!x1m1SH7}0p9S&iCtF272op3 zf&9e#74EW_JkoC`cdt&N6FuFeZr=hVAEPL&`%BrK-h%vlNi_9k zj12WsO7TBZ=(txNQfaiMHf3lOeKoU`Ep4Wf-r#=yiY1IpzGkf50nEvcqEzu=xQpfJ zDC!kaida@F?S*a8v{fvFkFkTxhcQvKQD`Zf97~*b0)MQrD4D%F>hurz{lVW=cd(0& zzqXYq)dv4H_}#!C0=(rbN4laV-qvg&XFGvT2R+_A$>kj|t$+#rEAvECQEG{@r%-Qy z)ca!0D<=+m1n4)QkAqf$ehs<`W!s?a70ZoEC1j>TW(xy3y9?-5pv&SmD8B;pE~J#T z{2r>*>2{>KD7^`6taJosAuzvQJaG1dyc64^d6VD*X94^a@Tb<7vmL-M0sn=0i1PnB zTX~*SMu9JZU!31eY2HMXAeV=1+U8gt!^l}?g|0dZm_mkltKC`}>I~)C~lewv7evS>wy&4n6H>8yu?E?Hc-~&Sk zDlNHX6dB`N(*4#0>gpP1Ew69SYR%M5NRdk zydBxZP1l#`Q@(#kUFCqujEvq9&F`-|?KbzGmt+G><64{C)lsD^e^e9?Z(h4_8et@3 ze>A_eb(n{%ze-y0ErqYM+2WzuUdqh;qWD9vg+&6BNd%AP9%EF(kY2N;#aQQ`Hy$gn zcIVh;=O}(mf2sCsphU86NAtZ;+K7(1ccl9HDLij@dokBt*fJ*fox%fO1hZcM zRLDEk8b08BEwbklXHm9M{GwQkowu0G7HsLyyTmB?m#e-kpmGN9&^3Zxc5lhsJ#gjq zKNT=z)nztv4dGkO^m*37#;nky9?$Sm@lZ1dcGeDe;NB`Y9Wjv|-tn6~85F?3X~xJw zX{t9a*{Y&mDTIdi|4$d?z(LdEJJ^82EiAAH$dZgI6c+v}j= zr;@fv8%n}S>R>g0>+LT*P6{IdJJsCFDVCh?uweLE-e?^?=+!8V}E|#YKd?yFNCZwQ1b=PZN&G13K|N( z*2Bli;yU<|9I?Lf7?~nI27P~n0as@@ic9OL=%6YC#1Ptw{YNOM5^}t&Y{Zr-1?`El z4;B;&Vc{xzB-4Pm>T_H0P-Wpv{{G%xA3%(inTfh&zzr!tcx0?3c9Y#KwWC{`RFZF_d>BjO*w}5^c_$q8z7TF;U ztc|r2{8#rspOAK=Y%2UW2n>+ z{1Wi{Sq4b!LH7myYG|4^WULKo3xCnflRKrCz;6ZKfBgh$UaA3gS)iiBTBK=9foTa$ zOVeyg{oRk+pMr1A^`7+kg+85rO+{mJGPGyA+K`pL8hU8Fm2AG)kN#-hjJglsgWY5gIysXOMh4TA%t~P|*WkcZIQi zL)cLGe2SiCNsT&M|EquXprg_-J!^8$TSGq`Dwcj~yOT+v+iggd&#us?(~?!xzGA+- zakV}j2l)>N{gy^rSdk9?8Y-M#ByXLgPXm%v^pT0XT(+wV;o$!$E0v2{>(K-2Ra9ZP zS+41%Pv@qosH+%T^x*Y4)@Qz&e#}@Tk8tfwz8Gn!Tgh{I^CB}+>6J)FJq%`#A2lFa z6_SfI@5YQ8)}x1e2GX`QHS(Of_35pqD%$tVZ#LzMBsRM+n*MWT4%@m2IWJ}nr7K#g zxck9h!hw2*bea1vW?1@;1hn;_V?K}PExs4C*CoS=XM6&0)V-u&(dWM*rjF<=e;}I*j=K zn>O`c<2?8}_{;PXb|WOMN5@{#yxi|NnY6H9jt=AS{hPM^_+vSCz&rw`OS=Ny{+$=s z{jRkJ-x>V#;MeZ;CZ`R`en;8fD67Li244?+9lpa~IXX-=Fnxi6|AaSKSi;~x$${^J zzXu+^i<}Se@$??=!dv{V$#DX|9Q;w$B<~&geg5)wGS}AouC;*fo9s~kPY?;h|yaWlPF zxqjdqf^P%d^SPab8-tKQf2? z?C;P7^>%`sCnt?uEFtGN%FeA?^DkWs{n-$G7_ia_IZ9o42NthQft*^IJg-7S8qtNAt!@2TKc{NAkOSN?6pP&2sD#Yd%GA;g1^)WZIE3E6#}Ko84Vy*YD%_ zo8`sKXi_+P|4&_Rr*!1|zSOYFSx4D|h-lvBw-IYUP|2673RvUBHhjpOSo!_A5T0xJ zk!=|X3V-Pse#NjB8=o&Jo{E9KpX^>hbf155-}o z8qSnP%(tUEdDTCL&rS>@r{Cl4fDURt{#$o;W{NKJ8Mq%jrHMmCM)Qj zNCz^aB!=I89zq=LT*G}>i8f*S-1ZChkWKVR$%VmuqdCs5CfyOg#ryJ` zu?m`KUM}w5hBt8%uxFnAOZ=gY-V#DwFMbv`RL1cR+7P_`rxG1Y4Y=ZKAa$7-D>lpX2p2@I^%Y-YHB6J|FlyL&tmk9BIeq!!PiArlX+wWx%!A z+i$5m(fyysL1glCoH?1h6}<^_V0IQ7nnu&L$?#XW!C$fQaJGl#Uw?&HK)QDJ6TNfWM+H_QIRS*AdOHnb4h!{pm)lc|v3ObKaut z49|H&kB`BGfxdUcM{*0dWd!omuK7qM@DX`}-qv-V&=>gEz+{zW2)j=Nk#kqoG=E^Y zl%%p_5e^#oDJ^6l_>L-}b5qbRpkIM*$ks^9uiLRLvhdy1JEs!@o*5@yQ@6q*&ko7%?41!N=bfY}!L6{AT1Aet*n%v~3KA+{UqNcAZ zgyEGz|N63$o~#iqe>SCOr~A|A4=xKGvc?eeTWXrNBp>?DgCv`pI-mcm2B7>PtWwUCkw9BCry_Prw2MCcmB>TVq$F*+Fj*O+ef>S zcE@7qWMK>|b?-nnUyr9IdmKpQ@rh*U$U(H0SrfjbwhsxhjG^yu4`p@R-Xi-f`_ipz z-?KLFEvQc$51MT=mu)CJMQ%--MC+Q}l(zmlM4s-LLg((bmwMgI{~x2{>*RgHp0nV2wDJ>V=wTl?YvLDY9sg8A zQ5t^1?caTUUVTxTI=P|COJJOU+3{KVFMph|D5Yx0DY3t#9l-C|?xAxg%Bp?|(h%(B zb@fJ|-ZSU)Ty%V)jwtm3Uje=LV2^x4A!lQcOYKp1$=7DNrr_@eKishCzj6X0M|geI z=^*6fK~AlpS58MkZvp)SZPC%2{?h;VCn!HRRO;#~s1c+Us7njXWMHnf+Nk`9x(ra) zuYNb2VnO#BTgt4SSh_bxy$4Wl4Cwms z(mKSIw=~}-ym*;Hz2>?|8;=wT!&ZgU);-R$9{X)bxWbWk8tKZfC?|*pQ*o|g+D&R@ zv_Nzz7*0F+AZ}(?Lz;>8_l}4Q+9mU?NdB9ibVoR2i?|Wpb=j52lhB_ypliUwr#73TJEp{JKS(J7xy#nkFa^z(jB+6)X6Pb5au({C8b9JN`P zQ0_uU*f`NQ7JkB-b!SP7v?%Jff1$^$=^cgl=-e;;ap1IYne3ma{^zzr@hec+W=M*n!?A{^cJSnUo1CS zI)OhiIzwju9LQ!qiQ*l{^wT!}=M39n7|A#3%dCrOcXk>%K?lnR$xy@g{95Kx=5((e zEzR`chcA7VT}|T2sHj-pZA&k9{dhx0p2u^S{7Wos>Pm9AX%Iir@*~^sdPu%XL%8LO zk8I<%C(P_=FYfrLA5VU7EVn<}o;NqZdkCX0u^)R3_}1xTxS{(=`1AL&sfZ{4VeG_B z+K*uYtz9_T;lO`5Je6ZcMDvUcnH^daC2tCGzIPe7lb`bCeh>81uaI@LGAB;Ww%m$5_*#S2^>6aRsK_wU5JA@W010 z))@T5pbvts8S^S98}u&Fzd-Bw`$7K(eR+E{|2UN~ecq(#&>rkf;HVPQRTw?a-^$ibYMlMc)+l+Bpzb*vctPcI$$CEGQ}_Cvl5`E}3_`#_%r zT^F=jD_6b&m^zblkNpC_OAKQJfB79758q_-peWw8UE{pZkaHTC?T}v&{ZkK^UFfT$ zm|t}|{L;S83BVi%A1Ln%-`#Z3MW7pk7XM<_!5=sld>Q;U;CKG3|4Q)jt>`?|;i4~R z|5uJb@H+n|8`jfh)+0xH(Hw7v4rrZ3=n==*DP!*57tD0)5~w{eS%VR@KgTp;smNCJDWrgM)fYp=j@T zpC(1);LnzZNAbyze!Css=p(I$eROK-s-17dNdMeu{%hekZ9eARjdvZn(w@6l-7ICE zeXvJ$>*(w(eP%=LDn z@ZsgroEG432Y>lr{u*;pcmuu;Q`ANjet_0}lMgLLq3&OMJ8dQkpZ{Xi!2JA67jzJX z8QII6Zo*y`;=exYm0#{t&;vj_#F8BNhj|y!!$Cg>ErKSXd&1Td@&9hMVq31x2kZd; zK=5^A5o3~g{Vm%Gbb-26o)`K%KDd<3HMA?5863se4l5<~?-yy0e09V-qF4v?*s5)Q zkg@Trqv`#^0Bs+Yv+xsh>`%|lMfcj5lABTZFSbi}|5C@5UaW<6OMlleH+G+F>Pmy&I?|@6Ww#N5s3!!ubPv?@_<7tzI0~6hmNh9nlgyYg z%7l$CDGYn#$iteuQvEBqbtR$9(t5JJJLox} zhv>=nJ%Bj_j2AFNz>fsq5&awtJ_Emca-C!De=!rYN^_6=M>lKKt2^5`0o@LwT%*7G z90hF%x@Cfc(hZmwz{K^BRKCKTq+2%>LboW)NjkdEiXO*Ifzhp3#wBgZ+t%<;+qZT7 znil~6WAF!$d6M@LI&6bJA$8;OQlO`ZI$pn#?CW9<##~GnK3v1fY#Z0_FsE`1b!g+ z9l@^zJrlGZ=+VGw1gYFEv`BTY03v@Hkz3xl)UTD{Hw96x8fRiKWRiFdW#%m4!^iOG|QC_!3 zf9Tcd&(OwyXq=Te1pvPUcq^1mg^rk?>G|4JIZN>elRo^0vM>0$^Qyh=8Y{Pgz6yHb zeYNum)c+MW=2$z`DO0BxzT+dGUP{cbbOz?fD~Gozb!Sh*K(-z}u%8N(Ke`>QeMp(| zpSGOFcgO#OUVm((+yVLs=t{Ip_iw>Jh92M9EU&{l#-6T6|J*v`9(I#4>qQvXxD-3E zmJ@&a%Y{a2J%pmsQG8SXQnGQ>XrWdeCqDa_3+2&W#95O#K3xFhD(&u7WriJoHmAq@{0=PEp}>PS-iNAP9Wu--e{i9GD< zz>oPU>DlClWOr2vFK=fh8Bh2`Ji~qXGrIyZ@5V=BqHN0_R@qROZRMo7`7pkE(MhIC zzCxNObmQ)$9r>z`86?cMgl&62kslfNRt(x5DVM!X=1qcD$WxcEBK>Yp;xpqCnBT5e zw6RLbBOMsKREW6qaozZ#E%v-)uN&f|)Nwp&>H}67dRy)WU7v2Qmh&ptF>|NMeCYHM zB&+RX=DAAX+QW6I?WX#Cq`?EWd%6c@@p`<*ZHsLGPDRHwc)`ekHRQTeAhjBh$r@z0 zr|KClv^;DeTRNs8GuFh@kpt_qiU)C|d8b%fQZkiQ_597eo(`u9hZ!tpYJa}b4(A0E z8nZJq>+yWVYB){KmTSMUV28^SsrMCsMoMS!(oNyy#~BkAZJfZL8+K$b4!bgoaWUL1 zGmK~++B1VlZ~k?=f_^wMTON`>g3rmW&(qQ*VZgE$yxM&*Z(jLQ?o=4S&w3j0qH7)4 z$VO`9X0c|!f2riB%M^U&aX)^d{}AcLx===NuGBbwt9-)Cgn#Yq&)E~iQH(xdkgd)jC6TJcV(K8?j&P~Z49;riO{ zVmI*DFAQOkEfQeH(6gKvjtT)ie0`Gm0J@PBn&xmNxWXTrT( z`*YQcz497w6TYCXKkqhSsoZ?52|tE+2X>BKF3$=u;f>*6dpKghV3c7)5a+`m-l~xD z?*_3ekU2MerO@Jack*?JhIg!q5TBgUr@PZt+<546IW5qH&-3!uM5|EhfPZ~!-XX~5s{M0v)06Ygb*xbBQAa;E}(JH!UH{#`8}3ryhC zAK0?!50B(5#GM|N4fw`RdTj3H;anHDZ(dr5^{*emYY?M8ux&Ti@kBg#d}qT(dzi6d zj%q#*_XSSQvS(Y)$8g_(P|~MaJ9c5J4^LXCptH~8KKG(n9tgjsUn?VaGHEcc7^U`y@w6?)L+Ag=QxRrJq@V&WEEePa8&H}!k3mGR`8@b>7q}9ADxq-;MO%6 z;vU2uk;Ngb*05OdU9KM;1Y32eyHeZ^{wLUQFDna?E;gV~VTad7#)_YTaRbJ=!bi9{ z!It!f{am-U5ZeOt4Ve5c^Q6Rg!R!TWsdlB0@B)}#z$lm4$d4K*xFc-uHZZ+`(b=%o zA{)7VLj^Yke^%YW!u|+b(j9n@HuI#4_rdHYFgHe8h-OO+s59gT6vm2O^Zbx!U%{8m zbQ23s_)*V71y3{iAS4YmptCYm{P5?NLd_^^(lkKBt;22PE{zm?3hdVRM}MheY#0-F zsd@S8WVv=B-fThNzVu9%uYw*5yM0+*M}E3q!L4fh^Y_lHw8U`v%lW96^# zjrW9ae0H5!`8#~(BjJ~>?H?=G0qp|*HFIaV8TRo%Y*qAzCSAU^*N+$bDQL{_qjFGB zKR!*Vp!3gPkhkXg@)juj;`If2SdK4uKv|Qhi}IJfzC0#gLG_2OllxuQ=WDvE=-#Bq za^O^7-rie5ceZXNH_f(Y&%5Am!hI&UYpu`YJE#yZbxR7fvt`9L8rml>NcQ}vD=Pse zX5^Gc?(t@Ly3Jp?pJiTm7Twt zQcpWydiScIIN*y3o$BmQt>zoE(9AJ(X{&0ykvB}-Q65P98XMA0Mtj-)rs1^lx~0U0 zFA%R!O{861oyokmob?zyiN0#j#MseWJz|$6(|6>yc=f{q61RQ^JEmoyI@m0b&}Irr)LW?J@UDwyf^> z8XL5BxxTF`Zz#HZMJmk>=!Sa{^eK%gkPq(`$JZppd z5DOK&(ft77=>r3L3iiLLSGq^SRmAjRj7+x96ueyg=}U}-m0eE@8xf1xYzgA=Mq~ijUoHz}JLF7rm}EmW|pD9fm61?*v*C^AQ@JpJ?onG~IxH+MwbUF(W((?pTnM z3U0q?wnsBbO>edjWk%c0e-zqDG7bM3w?X4{G?=m6tRe@A#CBvOeqEY$>1AxUMO{P@TZk23VyD; zv()6G0o^-V#a~Phl*XX{C!_z{76wTEpl5^r9I{g~@8M5pPr=;lkggqc&6e2XTTJO1 zAf-Gupq7Xu@|c~j)dSxN{KoP)ZT*q9WN&W`k8ilrV`H6Awi0nZOGviIn!n$xaB8;4 zM$qN>c2B>jX+PeyB?c(F{&Khwj&FAy-)?h$wg;UR!Zrfauy?qS3;rtbOisFD@2-g1;K}a4l}9VCkUYxy6`Q9p-Ci^nzZ~ZQ1x#Eob?;_?6Gb1mdb(ih06zqCZ2j9irFfht7GUnp zd_G!xA`x#4bym=RPqz!lFuq$yhLGQpO|(CP4Ke0aw8@K9VM;%L&O;Q`cgrc^4)mE1 zJrjdUgmY-))jPJ#d>Ikveoy2ooZGd|5yVjo)Z7y1c1BA&if8*E_w{<*vrAeo8m>#^ zwXfN-mM`PPq~bun2J5KsY5&Ie@~#hU*_d_7;zg_z{4wt8Cf*k`Clq`n-s=9nue)Hb zHJW;W=&>rP+v|@k4%XeZzM0q4R#U@p*j9>w?^GrkXOlP}cbv zk<+UZ>8TJqvhdDcsclacUGm(3ZbDoTpQxaAef()wXh-?|oj|&?C*G`{WGP?NSJ3I+ zxQ})uUalntQuFr)bg1D9`O4}UumbNP1c7nw`r^7A&56Vk8u>ccB<@^ z??+?fVRJt-tRO0gzsR?^*5ccf7$VPmJ zHHj7Gu>nVu#mDHw8rbTaxvNBL{P#U!p9yPl2My~J-TYkr!&cf>Ih4~>Qno@_#ZXN5hnSEu>l*^TvHt(_IFqC3$Ofmqf4vB(Tgxf zZrd_3ZlCBDAILkeHsI$2R*5g0Ay#@`2+`kgMjT_9$gP5Hna#e_;{LVqyyST>S^Y6n ztUKF}2ed>i#QbWpU_=6cUunx?+I|w-{}abOv4(FSb5$(M4&c{b81NQO%f*E%6W&cX zzeOw)CyX}XJ278hIDdyvG+UaSVnfV9 zn^@lzB0dDM!@#^YTOgZaA2%Q0x^h#dyrjmL9x2Bf+qg_7*!Qi$zo4U8s+{>ypRU9l zKJ@M9m3v;6E~9PKeWgoRm_%h3mX zX$j`m7nWD$oA_S&Zw=^~uw}Bj%7h;7=T9G9DVI}o18A2|1~k7>wcKY!0!?XZM`o5U zlC#20=ntHm|8sGH{58~sZV2?JwLf2y4G#oRt)3yByX?K}`(QZDi7=#-qrb`b`zO#R z0e0l9Q8VNrR#VZ_o*bri+0GTi>9hfc^to$S7L9ZE%J25Xbk`dBv!MxnFwviO=};+$ z5a=+$kk+*~XYcRD)1`+UN!e9vxxBlAjO>q#KJalwH8t}(y;JeZDX49HHQ?3s=iycj{AX*u&RL_1Piy zV0vMlf}37gC||yzPaD9uu*v#_#Cq9~o$xJ8E_o^K7;a78z^=p&vaC(jqvdl|JlFG# z&`=0wCa^Ihzg!mOPMXx zJSZ3M@c`c7kpUM>szuG11U~RE{>4AOiC_H^_~l4jwroPVxaVR3XJrPww0){LdW{Kh z>*&v4ELw}VX-s&ZDnG97uvRe43S(6pFz1tl;Zp-d%Z%J}1 zWBIc-Atc?rE6FN}=M#Kv*|ylar0n5v-X3v93l^*u{YIGZ=eW-<{LmAA-4A7nhY^$9 z&q=(1m}rOXSQFMfk&I48FoOMmr{7cMXEl2h`49~NZY z+C*;H(1O*^^P%UznDE&jUD%--Z+c{;34dIxC0qTW9yOaD$ju)|u*v-f(RzcM@PzjT zEZ(^vtxT`W!&aGaev8uj;y$*Z6JxL9qUnhTo#gT9BCnitpNzXxhj*W6&-K$?Xpm(c z7Eu2xd%L}wP`p{St$7G@bg4tltcUaIFP+(H(u~aUP;-YRcje66aqRJpSj-{!M8lr} z{APCpo>OpIav0fy>*HP0<6ZYK*VoIL=e-F$Zr(Ze#PFfmY|2DF=KBEdHBJ!k-)_sd z{FuPEI-em;!g{leC2HO~GR^(`sB!E$N#Udw*G|gZBtIKAiJz-~l6ZcfD;rfI*3aUN zcHp6GX{}i_pLOOqsdH+Tbl*zJ8!vLE`>btcuXZln<*^fe7}Q5vUwE2r8#0MjbPAP5 zoIJx$zKWvy-)3q1%y-wOe@>wusmq0c4JQ!mJ&E?xQ1RI;Cwgq3k}h#yA{H|z+8yWg zSHEl&-aI`{YMVtI**(P9 zg+Iu5qFxKlwR?L+^Pcg?$vw9j+Ifg6)vr^nm1iQy65hn;9mfD7H4n&goW85-QE{mw!xdP0wgP2W7T(dXTG&1x>2|UF-JzOOB3i-Qc^n zw)NdS++#)l*%J1!W<#DXmUANTCT$$@0wCuu1%4lvDYXZDBxczcf1Fz9?AvL0@&$<@Wl z>hAguhRzDK%M5bsPEO9#eY--_@7hY!+Q)SL5RCZPD_dIT;eIa19cMD&?UlT6$hiPH z&WkPbCj6x<@((#R1Ewu7t8!jCSN_$ZzmK)^b?&f0!%0L!|M7OdH;=7*7e(Y$mwL0kp2H}q_Y{F{IlS1vP;N5 z0ey7$nUlev_8*=9D<>NGV&Fp^60$=JPqRUTT3Y?o(Us{O$3{Znt(N z?n*l(ln|GRd$i&aC+auch0?1_wObM6)IGG0aI*Z2;Cg?C=t=|QIU~-_kvo>uVh*n7iA8QCpOWb$moAQ=w1zR$k-gZG zRK!+}-QsaIe;j+VWIQz;b&A-RjAv(N+0mpDCt8u#hgG_GQR^N#WKFaIVhc>^x8~OL z;3qb6YwS?k&Y zuW^}92HvR0y3UE^Rll~A&tc|xH`IkM-C<2UH>D6|TjaRU+)A#z8&CISZeivJ4T+U! z5dFC56Km0Hy;#1Z1${LJZ~1g#WRHIo6~5JH!P6T`XFZZ>Qd*Uq5O#tb=acBLH}3MS z{>6nO52R4NhlAx`RmaKcR?###BwSK<4As8Df6A+Ju_P=#PC}fc>7&-YwD+f<)V_nA zo!fdq+iB==vJZ9}=G?2GVAMa_K+NZHnq@^TV9yW#&J}a7fBW~}(f;A`{0`vX2Y&?Y zyx!mO`vCTTD6ND|gH7MdC9eM+Bbbl5ZeDIf60)0tHs9eyW1F?>QR9vOY>^Xf;iB{y z)U$-;Uyh;!Pfm8FyljvKIAR+1~XP+IT z>C;xt#JxST*zr+QX~pr=V%rOg<@l^bT3N@I#gYZH;a+`X2ZYr24$_|Kr{7k4LJ zr#kS4RxUK_&?_;ai`zrD@j~9o9*xzNC$p5rVZT!SbyY$ z&)PJE_~qAU$7SRrsiS0HjlM}wU#Ms^NuOU>aYo*IE`ZK3Hsp5$uS-$J&FDPIk2jFp zGNT6Yi9K^*sZ9u57K3}WZAKH(us3@!(VL#{XF?TOUDz*QANs;vK_6UoVv6DzdahG2 ziBIXwTAhifAAj1h-?x6qTdIcB3Oz$^HgG#&&PAm3wPW% z_Z>$Hm*T$IhBso|<~FQBzeH}iXt7u^yAyM7qTwgjrxQKXAI!{S7=N+Zl7#-M!?Ujh z@>+AckW){*`RxJ)pV+n*@n}__`wmg@QFR*B*A{z94MV6Uq1=Z99DkosnYkOeryr6t9}(EZ(+8SW42uTB-|LVd18 z+jk5+in#IaEC~Fj(tPn7?iI%3USZ9ZEJ16591-B>ZMq zE$E$JL)qETIpPycJsU2o(ALms6I70ZOCwe8qS_&w>9 zYf@Ek2sws+h`xACDjOa|Dz2(|%aFU${(d3E1AOu2QrQGK!A#L_$#<^EE08N}@eTv- zXId>kJRe7mE{2ljxz+MCBN+N%h$yFL( zdIjGLnQY|O$o)0uODJ)Bd_mrx#UlJ__@IAywkqzs#a+ACvJ&{_@$9tQ*ljSC_0_i`{)BN)W+2L(G ztx|-MZi)-?!V&Rw(V{T2S-Vd*Jnl=KFn?_?o-I!w=SN4E;oR+6jJyN6!UAvyQ*$jt zjzs=3$8VveN6;!+y(N*(MxHUN_Zf0G@QuKK*%W>};B`5{E?!NRk*kV2<4$OY#8oov zg!)XiVdYP4Qe$Zawl?RwwdTbO~iJEH9c=gh@aw7nEA*}g?Jkbc^XCch|14|rK&Zf-*Y~z6{>#c+JTP9( zlaT}Kf%jnX-LFJ$iaVA+@7@&dxM=wJF*aoLrt88!?A?Q&gfgE)|K3;S>BvcSPc9bj zx@kBEz5U59Artw#-mEpC2ezITI>VRj0o$J2`h-x+L&LjA*pSqAT-dTj%{x?uvROw@ z34MSWiLt=9VVu_U=XG;o^XZwwPUO`qgZ|ZTBZNDf4fvNh75}Hau~7BZjwRV@c#Nqx z@~~Mm2lPYR7W1WrL7~JM{c}FlMLPN}h?L&MSUR}UL%9QYXAzI_dD1(nX;TIL5$?|; zKQZk;heFBt95r`pX)EtQKg+Pmrj9AHF4x>%*uWNzz1*s5hLX25skuadVQr<^TpG}>mRyasva2H{(GK5s5>6%A-1 z?uSZ~Vr3V6_a^x6_WK6OHAB_({6^%v>v2t5>w-JAF*fW|qbt(6^=hiD9Y*dh&ytQ# zRnd6pvw2am^cZ)6JHeJrW}T8K?(>eqU0~JnaOo@V5ub$q6|P6L$uB~Qh<;cxEX`x# zSmdZd|FozK5JdP|VqgPP-s}_(qi_E~-%6nYLIC*D;IDAsCbUKWn-nSd&71y0&$WoN zNK)}776S|S`Qj{NoPv*=V^HYS*^qa&!r3;NTzD8~8M}vuBKCY*;U>g@q`tEz?_y6$ zq3$?Snq)(KVopdm@qHhB3S}yD|H9h&D(>7DxyTF@g*9R`Uh9}2^?AETS~Cr2KpPBb zL;ZbHTg+{}k+*GFrwGXn`Q-?5wUs0u(RM}-x?tST9o6xSbP)D72yZr3l%%yW2PfN`}-vw>Cw?e8`YPeaj4LLaGwp6}e&D%T;Wlx4n z(uwIR-Wd0sN4ojR%AbjR)pu($x!GX3e5@L=v!N{KhND~-q2e8V3}~F~D)~L;^INca zqe5$WEMjL)MZqV(J40?%Pt8+4hcfNWJjodS`4nw%^vsmp(C4ujn;8z7k}GK4I8C(Q zA-zTHz*b4YdyX3>Jzt63I4StosGJJw2ivoC)*3!KdA>*COdB@VTfjgxH}-}7+ebE)e4g3iAEn{$JI!TeN#S46|C0yy5UOgBm+1z+ zWv7qARTBmMGTxutHuRQkzgaU==i-c`x)? zRA;{MW>hE{158vGZ|UF{YleI4JhWz>a0h%{d&icU%SphO0l(QWRvv;md?{?hwRx=U z13CrtsaF}YGu8&}zJ;>vnX6<0wr2-Bj|@+i8@vwW*Bog9okXu6u3ZCdSdzo`vL^3%{|4;ue&7C;$ zG2&-buw{(d4TcutI-DC;rKsrFE9N3@715iR1NT~c3(N3t!FQygW#(968PEsd2j8C~ z9t`%Q&gBYP`Nc}SX=*?}tiav>v-`!d%$M$I(2U+nQ3-p8Sd*ngHFVzFV9{)fKJ9!C zIS0Dnp9q;D4iA@(#>rYkv9B z`%4!KVWw8(QMiW26l$gZ9mlegC2Hz~+zv-OS(AE@X)oTDe)bE|#R}56C-X(mHTv`k z+GSgjCA92dO_0}uD!lJXSG__QY?TIlx*)#6TBsA&LgR}shy|c$V9x(>e!duvTmk#g z-iI$gi8ryP+HgCR6jYRn?SY|%3OemlZL%gKjz+!@CHL(s#d1eqdha4~HqA^G`(^0U zlw|aw%S!QvpikXbt7z^nJu;}*U^=-%LBkFo5xfnp$!+8)7<6E{+z)vsm1w)e((6*Y zNW^VHw-f7^%Y{2l_;`Fr%hVZiR4(;vRn$jDfoSpSII45pJOpUzx$XW zyTNX!;{P7FYLmSCO+5c{J(OKAn=5~c_u~imBe!N$ce$$%&gif=Id3~snvrb7w)NHU zS!rRO0 zU#En!kR=!7RVlvQ7-Rek`6RzBkK=lnlau@|$sK+s@J01)$P}EB9YkJDZIlgJV)#W~ z6`sJuF{b7we3Hv9#qk{cFX->9a!2It?2dNTHC-l09WdeXh#hgOxgtM*7QovfKW9H- zrJR4-ggNO83TxGXI^(!&O?1_%6f^`eBUCsg%cD!}&%=fZe@!w z*0)0)R-jD48pMX2&$}RhO!DP%81J2)m&uwKU!HRcaeMD8<-G%Z`H+1IKHQ}aYrZUw zFZ~$G;=k*$)-wk4Ix7@B>PeA&s#=f7^;Pkx$*piF9cPL2tcku+TXthhEH|wi#=K2x zzDhBvh`t%%ig1@qCvx!Cy*#A{ueJpUl>^=H0KQAcUblHM8QZHT zUms{lbH1gKIJ>D_ED9m#X11oCuPgbQU40U(&$_UG4IU)_TP;#YLv#O znrry$H$F=Y6nkjA4w!ogSNUBJ!2{@Z{JW_et%1Z)88YqY;lxM=%1 z_-}xn+yvmPy}`ZLpbxLvT(tomIPebWEbs@~8v%U=I{40h*?&Csk-#_}n$q$YmJ8|s&_m9gQKXLNI4`n_)`oSsLQyq z@_#=U{?zHa>K}?88W_TBx)+y#MwEco|40J#-XWmHclH@DlL06IdO3RNz`FWJYA)0~6G;D5_ z^+XE8MV))NP`G;oJTqi_W;@J{ zUECe=eQn4HGxTb)V@GMj6r#zSO7aLKQ61V71p+OIu|*49!!KyM_nA?=Uj0|gUK*#= z{0bwz0z#LLHVB)rtw|MLEfS^Bk^zz0Yb*x`X)NC&mP#dt?pGr1be~5C1eR zpF<``#8rwjmG1a5ycJapW1MWG@>v;^P=_oTfn`Z_hpYbR{Ob!dm-ay6vFc+9+^=5h z#ivur>}A`Et*}jP9U~)%ibVtTy8Oam4b&0ItM|*hNjA5#vb~uArckJqAW9^`x15}( zc7be=h;Cr-OLAv(wwq;E2(gzAKdQEgEF&`4>t=-+4r#7|_*NBtRb0bP6+PsIK9lZz zLsyntaG!HReBvzF7={|n)9E#-07n+bgo&57*2R_c!$15Z+^U!hF!f?xV}K*pNJ%V zrT$)$z){(wt`&bv{p;lq{~WCx@Qckc;>y?VxT5)tt@btbLroo+N*Xg)7hB?sFi!oi-tzTsi0~le<^VP_C&#W4r+$@| zI^v`PS#V%^#rX)GETzwInYo1LljWrkD+~E$_Fvp6+C55P1&)Yk%1_)EeDdeWb}X&? z?9qtboEh|N;#!qQm0GzZPXu$04@}%S%Yra_5DJ?2GFB5K8h#k{eBzmI9#^A1`(f5E zyughia*F9A+}h2_yztwhL!>q;N_Bbg*?>`1w-*}fKs}_D{zG$w!!0QGeCE%lSNI;&pVwHccBZR7ALKRPD|rZO17e%gm|w`oL)qbgLsS{(^qg; zziDCAzpU|yJZ%pi_e{reVPoasmTpU|Xp8E>aGGxEfM1>& zk?_r*Bh$IYfa8-k-?M1Kh4#lHBc`>{456^^jblgmj$crzK>r%OE#~yZmF~EL)!5Sb z-gvIx8@}EpKSZY|b*n`@_TB?j^ZHxP4tU0rjUOncS0>e5K{mV8j;)+QL04qs$|myS zh2(%eknc;}o4P|G9#lE65bD=a@%qv)P3_WBaxOgUHoq_ev22Qcl{`%SbEE{Bday7m zLWKn{3a>rVI>HsYWWbf}fI8fN41>aCp`zHNyZ|@;Ba4scd@g?xaTKmGbvoF@x%o_8 zjD`3-3mT``u%nr~N|-k7a&_^^7cOWfy%Hs zmy-?#iee{kg~(eJMC#dSai_0D3;*0GMs-B40%YEg|>TWWn*qrkj) zW&9|HkdsNu!I>LLTp#M`z|g|BQUa~Mlt9>?_Wm^a0t4!36)5xY>~Q@Y(|N#oUT+Q? z{U_<`K*q>Og6r@wJuURJ4yw{+m1uIASkAV<(DrWAM$^xJxBIKnWbRD=Inv2Q=J!m6 z5c|wyPQ5<#5Z+o){~`Z&ERwD(;--Yt&a+)BDWyWxdceGG{730t^9C=frdABQ`x&hX z_{ZXhd!TFqI&A4Qj9ZnUdNO1W6p?zz4iHKmSrW-Y-ojxbb|5S)xklARw~{Nl#Hk!E zevW^xya&2`TIBlAvDOY(Uzc=?nsL>F7tnTa^|why>GT+rsI5>~W%DCR8kg$ZPw!}3 z4zJ=w6NGla>3XW@+~vdwsF7m-sZoy_MXU2B`F5k;FInhF0^EJ@Pf{lc^p1vK^f#Y- zI?&jk4A;#xZ+@EQbZRurE`NrY35}s9B~MPt>dVaBZ3&NmFNHuQc2ZMst&S3&1w88b zJ1Tl~X52g$Q&MnwxcDk95AHEcKnHDc{l>@(4qa+xrTDq;ST8ST>`*fxx}_t|JQ~cC zBpS(GEQs6G>lIq|?txJJw97t%#a&JSX%7_ax_cpQV7hc3(n;E|Iq8sHRf79@xQcF5 zU~TAB6apsF9fqndsu9CfP06`b()@82ID;0jIiLns_kEn^*+3~$-*gdlMQjD7VM0CE zc7+VoDbWLaQUZ$Zwr z6*#VBfvG*+_P0Mx;s0N4*njo-PxZ#uoCL<|r4Es15{+BFc7arYlE5X|G!;Ho=%2YcSd`IeT1-uvE+^uBoq<&h3Fj|L`+~-DNxk z_J1qE3Rmq0-?V5=kI=1wokZt&5o7-BO2mZ%*RZ*0Cl$+gi0D94k6-!j46&i23AV!u zQ!(Q_{BrEv&#QpF%_JRH=lu-FnXf)>3d3A)f4RZyV5)8-6k*FbSE!MWDvldmri13~ z(_(T!SG=Ny{wql4Rzv*vr6k{xhtYc=DLDQ`&E@UF`&)YPuk`jn+i`SUL$ps+8XTfzy0)VBtEPF!;&;a6BH!d1Z8OhNl2g8GBWu z|EN%dn>zK2BJ12NxAoN_tEZ+GtW$(Uz!8^bd{q7sqZ)0-RyHL^E0TT0I*M|!uG zPeG%$kA@79M<3vzAJo0dOvq9(ECj#VVCz3udF## z63p+!twED%vkJE(abe?j)W)OY-MsbEP1prsx1TE*w0BZbT=ncia#MJ)LU0H(xp)@x zcxKFFq+UAuVkgJDdwEfZ16lB;!&KI~2!&kRF4;O=qcDS&3a*@O#7~#Ut8SDMu>>-1 zJU!sX|FCzFp6Vqd?XjK4s~snY7B!;sM+ zS3d2;Yn&Grjoo=8RXF~@)l7mBZQ|xKZ@~wfYiuCeDd-T-^z#g4E;$e0qh|i;I}{2n znrr{CfSg-oTHEr^h3MFQSq_uT4<2@EsXF%Mv+5i?ijJ-tNuHsuka5>}tgK-w35n25 zy%j~{DFjXrD7IoX`GuWZo*v|BpMJJW3IW{VAx0@OSJwjA%Ijj;rZ~CGgKaU^X&0Jo zA*7N$5F{RkQ+nB8v0JASohiXjuK6A0dxLpIS&d7g<9d`!1Fo!Kt-dX(&MvI=u2hgT z5qCZNnBH^5>3P4(26K43RPHRoJMjtZ!5lhlfn+%p93oBpAN7E-c1BOg)Z=O5CgSkI zx-8fp>0scovGq7|4>TgXGA@Vjy26ZW&#d%Pk6)V3d@^N{A2$;A033i>c|$^DYWOcl z?vK3a*S2R89ipo=3NJNnS4KhOS$wCkhLYw9I=OG~+ zr+m`&`|=xZ?XApVmaDKi0=Cg>@j%3D6T&zQec2Wxuq!g9b|p9s&XyHBAa*J%oluv9 zeW=zQg$Qj7GtFxgSHn-=#w1Nx9)0=k6hy7%{)9Top(mbXNnxkG;j8R{JWqmOZniFM zRUZ)R6e2s5GUYLc2r&6zDvzEO6uYGmuQmA$hiY1~JlFmn;YJPMHge%BS5IvnP1o0H z`bw)uVs0XJAT7}AwygdK+CMPcYrwX3@1m1u-CQ3oS8+un^dJI-Qo6hcB59a2ZdO~3 zGR>^e?dPa4KJ7e1v7;i?F1BEmr=lIKG(mLV;8BW?Lh3B4*7iVs)G6SI068UtDed;* z;b)P7lOvF`klkZs_m{($W-)U8)P%32mbRkEDQMvk!;b3gWPRGo$%Gp#izs$`G zxXPc{`~_eAFExD9p73DKtShq8_}VjePF7qMnn!i+guyIxwl{QnEbC;Ash2(Kb?(|8 zG)b8CqkexlHh4iyo&gq_j-4LnbO~V}IZCR9z^UmEd@t8*td|XyUO@Wv_sdcpRE8GE z*A~6?y6n3Hu0NvDz0B2H@gvO!o(yDXeTYX<-uWW6yg;%^vL9GY{UwZ$SL*IQp{D+M zc+A_01YrBH4f2HigA~+Z$EKRBG%N`{MeGCQRmqec_7RTKxQ^bkC9SuB;Y_UUlxwNB z_~9EYVL<>(M$X4V$kh8*xHW^ex#=>zDcyM;m?v@TOZvlE9IYv1^XqP7yX>9G4QG9b zJt~rQXAdM88QB9(9AYCx7Q?{Q?aiv2%ez=qkI*8Q6>4Z`KD!Y{E~6NxwcT&(HM3t+ z7a?6Eu!-WlA9E))e55R4Tq zNtM5Dy}3Fc$CK4*zckesXfs?IBi#diI4YC$x8K;aVZ&y+G8-$rxCVptJG5>GZe#1| zufvqfS*@$d4RA)P)u*`g93B5&c~NBL;`sQ&oz8I2sP)6+rsqXN>`)n`&Tv6s;eaI@!IJA_Wt2RB(bn=C2mdFv z&V?N!O`PV(Py5Ml`+8PvFe6Ba>{N*yfH>|5o|$Hojg>-S!#Uj2=wcMRvMY$6JF{HDvv%@xY%e*B@Ep+50x@^<_!mFA){#;DmE_vSFW)G#G#ST-1wVQ1;?yw z#9mAZ&5OF=&QLMrLL623QHf%0DAK6^oendk_f(pf)%&(o%P-L@JT#?Vgmkq>OY5!{frLepA|e`ZLdYi>S6yP32pQ&+ zD*(KXunEa>%pK`Ba#bo_vKaHX>02G$QHAX0lurz#Wux?P|@^#P{JF@a%>w9il)0;cnwFyv^k z-Xoqaa3l4y8*Sbrg^S{>tUE??)7LI;>u%Ss=*nzxQrmM7%&h3F-IxWkvF(wy!hvh; zdUJa7;1?s#ViNxa@<`J^f5!m`q!!0qEh?BKb04jO<0TDB@gB+QkG;#bNM@6w&2?-T z{DnULJLW4N(kyot9AmNrTUfi0>aT23Hs4x-Tin!YXlm+!hFzJV{Gru<|8UYJ>p{Rg zHrpuU!6YmrCnsFngW-?{bJ$hy3TXRC>{EOai5x9ZGk)kn_uib~0Z*>5dU!9}vJ@AW zdJHl(x}BIpVCpK1T-V_nfzy8KE2J|yI-Mx3m5bXOLr`S8jM##fmF?f>-yfY(S3YLR z{^uWORe&R_9n`F~d8-{YY$j?CG#_QOOFwNJ!*X1MM7HuIi>ni@{|r!l5A`G4vX|Nu zwH~%f9TGWx)Mkcr9KgG+jjzI@lYl_S#Eov}e;4l$SL9QEEYRKq9Sh8;r*|L?Lp~i7 zg$yV!RXF6d)i(rm0dp0P6a5)6#+!4m#^M@gjZ+&BRv5jbweA@&gEo^OMfm6);q|tE zo02OZzly!Ic~Ofk`EfGr`%K@>? zg|ADN6SQV1`QEv6oK7A%W_S0zbqMT}Kd}4XKm6~_{<|++WS8~86C-lPip7-4u&m9-*0;*hgXVyp$J6~>7CxX|B)!a1RicmE&{|kj5 z|C>^jO>?8_@10vXJAc}@^+gfYHDusyuebhLC=`2JVjb!E)@U4E@jg9DzDYAoa(Y}5 zA-GtIORfkG^X|N?&u87i#>@)X^`%Qr9afu7O&g2AXtKDJ-O!>N1nw z*Q=ts2cmhSg%~O^N7KDPloQ00znKzYlc7|YZT$1Tjt`VZ9;2FHBu8c7!h^!L?Al`I zO^nnozF?_TJ6IHNP;&9a&y)x^7EjM((Ti!zt>HqWUH?FS;eh$PI}@cEcw=J5B(uXQ zJTPTLU)79)54XG)jfY*AYxA-j>S?mpm5@ShvZ5%0slnt(pP$5?;Zv@LAyXAoIKIJX zCsSlQr?WU^m;(%7lbJHNHrVsg`0?##@*QVG^MYH*6es2G*;)*;H-4RohkV zyyL%8pgTNTH{iQjQ>Wu-GSYb2s8hdVs4qZD3Bub40|vE}dwlCmzxhdX9cXLZ*yH|d zp`)dA^VPLsacHpNNH0T5T-CAjaypZ{E9vkk-2h_Ajpw(z1^OR8{EBH8B)abhCxYRa z25epB#01*4+VaNqjX9ILn%ZrusmZ`hve2g{{9@6R{HdRJF?^Pwhu#a7JkP; z`8x)_#t0eh@csl@DJ66c=jqY*Dl$d&*u_)KqOxTQm_m-3&7JUzJ;%K=NQ`1R^XXc8#HKioCHeJ~Q`u5Ou^;nMlU;4#J>cnWh!M)f&^b2r}5M`n|A z_nN+8M_KzVyO$fK5n-g8!mIw#vC(PkMG&_!3;r_G3`x9GJiET>Lrk-Q=x9Hp2k~Tv z^We|-K$3PEk0wEdznRx(_Xs_UI%SZFJ?f~Q7U^5!2BM!L1N@5SC4(xzK zP1ey0@cs*e+IT}JnU$Mx)FsF}1)=tQna6G-Z}M12rFrkLAU4=o2QIt>_C9Bf5>ibvLlU)pWm zmzKsAZg~rZ2o@H-+Z*@&OKLJ)UzN{Haoz(NTFf)1RI%V`KY6Iag-Y+9R46JS6}g6Y z;Wl{Lw@Eb@z#SI0^8IL1R)D7Bj*K_8A88%oMUK(PE3R$rk`D?Z*ZWZd+_L+i_JbG; z$T$0{Jsuyk(5W9Q98Ej;Wn$?VKCXEtJ*XND=?vQgB>_e+-bmz|&deE0>EE7Ay&X9D zv&)hc(aE_m4t9PX7P8|I9PI9Kq8dK#@8@a&Q-RrLIdckt+1;U}o~$Grst`o%FLle& zYZ@2bKz0%{>OPuAzwOZf_;NtlZ4hF6d+t%aP9`3<-N4E~a%JY{AsI3q9UE5H<+h}Y z{nNsso{zJe^Oh9UxPYyLGK;Q`5RruKW;zP2@EzZV_7{^$Y&5)K*Ku5CN@l);iSW;L z%^f4sMGNUNTkPKOh2v*p6X`a)Lz9*)qM1d*TTcGA+kpEFzHo#|M`xiQGLA>=N*9*A z8$KePfIp+=W0C`E(S+4JQCLCCu}veR0qL#>W9e*HrFq|qGdEH@^ovHy{F#9jeZAm3 z(HPr{>y26=IO=%OBu?Hh`vd5z`iAxom%$K#)ZZcZBda1KY9M)6#4uv9cNPC-FLFSl zC83P2tw(N8)=H-}6DORsJFEP;k?8IbmCN?~!U|4W8fI?5 z+OfIaSiObU7AJJ%Oj(dM{QSI6zMn!*qbuC%s+NlGXUR3c=+BOR_{%+{uEL0@FIXv# zy<9SgC$G+FgoI6I1h<4Za9RR4R#ak|b^*)kJ$~|=J&=9nPH*ej`ac4qeOosbzeF%gvqy5~cBXx7 z&)NYe`U#ftNATzIKK||cm!37WZ1buxU*E>_M8ur0ZniI2Q;emYGdrV0-NM)Vln)%1 zOb#oler4TBt)ubb9UDso|jz zj!kV%XU;E=+>a!z2YuoKrP)}GrdZ=rNBv;@*%TlBptv}F2TtzFwC3{Jk=Ht_u9};X zp`t>_9_ZOI^R`{HfvZTf)y>wE{`Qo-GRjRFflLWVN=nx_*W(vCaw1xn{4!==h5xaf zRC#sG@l_#UDBd+F8^!XC6}x^yS`2HYuh#`MI4x6fc0L8gZP9|5A3Gl#3H}j;y}!w+ zMaQ~sCupsk$65@|b7xhyzWZ{w%VeLB^JI}U6ygxb zcE+wZ>q7K_^v9;B0nrs-X|JMzV2z7tW^!Sm5m%h1j{U*6FRGFNQlRU!P<(+tX2 zZ(I8hFDe#4$`}7+0YIiBfsT(P4M@X+Pe*aJFy*CNoT$<%XK5bW-1h!T*Tz4HF(F;w z^+_&BNH-TYt2R!+7SWry>H%tx#rn>vXLUb+v)}rWJHxV-@|(d$vB!#hiz-{oM@Zj} zTRt2v?8TNzmXiHq5E?P+N#Av?xIOWl5d!hdN?v#CP*vQTt)h+O?~QT0uq}eAF_ncC zI(fHeaSdVKPT-CXAgzF8Y_ae4oM;=ZV0sl{SlZKD>Hf~vUoWnNKP{}~O}ANOTD;BD~})_v>v7IEv779ckw zu1a#zz;;mt-2*AA_mm4=IgR;C(Qo)6Jyu_d?FTmkSP3}+nD27h&Qb~bsWnQP)9JgA zSoX|?Q0FK6?fs`>=fmM?Z-yGBiD{E7rQ@S}pmRZwgmDsmsh~eEV3WH6wR5^3&G?7y zGxx$;u_#?dU%KRBYMB)wiGj_`wTLz*$5kV-oE+DtfyQ*zXJ;Mur%Q9&nFtQ>C~9?aCo8JoQs zWm=+h7n1|=T7D*p_|H*iZPcc<7WhE6Vo?w!xG7neB&=Dcw)ed;xXfs}P~R?X zbws_Cc<*LQQT=M_5HZ&^ppm75rjVK)*3vZx(hD*X_orP9se-hnjTKbPm^M|1{lN0? zBI)wYq`RNLW&ht_-U*V%&4%_y*M`PoR0}Lm2sSRlT7%chNeoDBuVsH#n_p0VacBKe z$f*uVX?(=(B@!dK8$h(B)QKuv7h?=Z^~hGm!@Iv&2**9kE&kEH8B7mn=u|qp!ekbg z!X{{1FB)|rLYW;?!g3-ZaB`_`Q63?Qb8LwMdokr_1=m*qH=!uRH)?)^mFfMGIK&(P z!VFurt#_TE(M~c=R@l#SCv+8bT@jL({r<8rC$E(U$v1w@Sh7>;QuZ$-1(U`r<2BP7 zDLg#3UQnmJAykNS=G>&Nk}gcgt93$-3O++)v#<`T=q{BtTkz0meYLK$wKI^p6_vXZ zaXNEmUoi)%7nM|v6-6rEd6(T9tzAT(G*fat!X!6$B`JY&k-~F?>6bk3bOw;Qonyr{ zk_1B@QU;Ie+Zf6Xlps1rpRp`<23P3LyIS!LVUUK11)@QzUUjAKJ_IKcr#C{}BZU_> zG%<`!E2!Eh`xO7Z9GdFsDwvLx4eP$sj9y*v(GmFKS+*ACN!zfnrns6n$(<`&;Uj1F zK+6T)W3A6lMZ0*rz;VP~-N*4b|FEC0Tv=_nsE8)vty6CW1NpZ>i4*6^>WPWrTRB=R zuTfegfj{da>V~CJMLDz+uuCeOGGp&!#zi*~UmqN6eYt61k%gt z`dJ2az-#uy4SgBKw(liW$`H?)2NO6MYX^ShBPlRftOEEG!Bo>}Y5_fJ>g_p(ohZc` zrBU%xTKC4%ec-5CbR|w^PW$e!!paW}p(@7g#yw{rPqhgwPmFDP&k5LD2CX=!?LI5C zglw6^9?Kl6y6*7Ir?3_&PFL{_J+!MRWnara7l?e@$OrPP!-_uZBSYr#u;Mu%JeE6{ z9#jLE;}P4FTL9RrTQnKTJ+_1$3#hmq1iy`5>PK{Tja>z>9w}swXzSJX$}q+9q`G_~ z8Ug%fXLy!mk}Ezzz1!^B;!c*74_VfmW?wvxdVe45Rc}${2ZO))mH9uu9SolhuwOAt zdNlKN0)Qfy6;M^JyyC*Xrd_Q^6PE7F)`*QP(~$J|4f`4K3a20H^&%{Aa zS27OX;2H8}#XDkz988Nyj3FeZ`G2~}<=zrekd&2j zVs>rnWo%bLnk&HHnijs*RYreSMrNu#Zx9LcRST5{DiTtx)1w9tL z!0ZntFIKLOg-@YK386bW5)^+Y56&*%4N?ORkWy{ui(f7bJSZK%?BHRHX+3$FaVP#b z&ga4PQ?-n@jT}0L4LN=}CS;+YkY|9Q>ur+jNsUqs*!geMQ;E|}aAsz3nvqNk8 zO$>D(nMcj*BLtx(OHRi*brQQ`n*UA3W>P{%iZ4rl|2M)2PCgWq0DIKKYgTKfd8sm5(`%)<4!sD1mn_0IsIgaFF|C}%* zj<9mo-TLVw!E}bhpOBZEOq-Ru{j1)x;M#=w(I0^1k|2goE9sg6UcJ z!Og;gOqA+H`6=TH9s>-sj^OAzJ5)d|9KBuUl4lAuRQ(W|ZoWE665nGKqDyLfmM6X9 zb+b|ASu8HhSDEId`rTsqBImWcY6mWt7fq|XWVZ`>=U)|ffJn#?==BhdMasj;+JnSoMF zJmz7^C?lNPR_R>?I4%)+nTAybhFW)VI z)U*!03cpnKx^k5PuW~K9y>=~V`Im9<>Ej+{MB1Gq`+-+_QKO2L<@mT{*7#syFKWtb zEjiYlb06i)LHT~icr{$e_Q_~%P2g50vb$T2jLX070LqH~q)uGgZ)56EcW>+-h`Kru zIUx$sKs;htp43zcn#fO))fIb^W;-12H#uaY4yG}`VJnoar0YKYfrmoUA}l{Kq6xa! zvcFAWMqJ8eClHYrivY`X945E#veDI@KS4}r@@)1<=@+=&uQap{>$>M&@XNjKT6Ghd z9iu1;-8rbV7RlKx$Wve7LKKQDG@n(GWCePx@K7Ux)mK#xo1Dp!*{5~@f+^|J>xi$7 zi`{MbLhVi2H^1KNzkhqzimPj!F?;F=)0PcF=u%DXPQY|a3l4$IWg4y-QXptEtr9S+o_fxNIQUe3J~{b(uD{7=W|FAX_YeV; zXu?vCrOo4iv3c<3?BhKUcQd$t31gJ0@8wBK$iy3l*;^;&u2phYr#0LBG+#2mZ5e&y zlhPO6`qAr`NG8M8O!Y@4SJcc_`zOyw>*b+7&pR1%-IiFwA|<)FjS`TXD@m|>KA}BP zX*~~s6qmfBM}p5Tb^YS&y*N;7d>wKeW4!xq+E%?_$G%fW8bmtQt&%zJ%1K%wcr%TO zsG=*br8@yj!qwMgAV$>_a0X#HYzcsSpYt-|&Y%2?``;?>jxDV9j6KjR8^cPCO`^Da zpweNQxi?F8+kMv~;CX+Qbgeu*(`Y6zUzsrP&pO@I8eM?vph`%2NcRD-|ymk{sVkVeic$C{3+{$oB`c2|W?k_JENFLl z@?>5R8J?7sw3L)E9F(WAk5OVMxfG2&#lFhIBe1?WSPGr4p^0+NU*}4Y{r|TKZKQI_&Z(jn3;*uX;?uhk(PpRzVMM0B&`i=DB z%hkrgz&Sbo>B1Kb`-eZ8<8RN6RC#rbnoYyp&oBoN!ePO4()q;Yed~HTF%flfZN6!g z$k24Z4};k`Ra93v{Ow;dfO2CCu&uuKn8UBIe5*ZB0zEiGfm|+3!Q!lEHlnP3bu>jw z`b?F;MPsaaW*-n9-m1H@R&Uyaxh8rW?dW!f**OAWMOSxj2G{Z&MA~Z>v9I!J~8?&D?TQQQ7gb;>@bZoCwTA7$S@}R+d|4L~Hk9Z*hvEqG95H zi3q$O2#(FJ?_5ncq!Ex_RV!|N4&BBg7++YHj%e!GnS-+}+htYJruE@C!#_Hx8t<{I zzI>43sr1c$YX^_Bq~sj7!3UL%)RE~fYjC%hZ9hGHAFoWrS49=}YFEhXO&?nIr9ZZS z-|;+imyrfUr;wzp6A!j(g6D|FK5ZkL>?-uGp|8s$JQba^W!O6}3j`Zw`9OdwiWN0t zz^B*8n&-DFe9yeYHbREteWV}P_V3gFV?pj{&bGKZ8p{D885Y*(Y;(ta_sHCaCpliu z3mQ{QShf-XOOZm-BVtzSEg>IfwS^A@P;O{LJ!Ti|e|vFpDPsG&iHXbkYCPWBsM52@ zgq#dGOcJ;AAHQ8oC@0Se!JOS1I*1-qPqm`G=EjPWiHt;>&U#SGyMbw$;zvYKh;G@5xe(R2a(2y1wv>PPO^Vs zW|WmFIWU)-J0{??D;2Z&j;^%MVfw<&oBet1+f4 zuCBwb1?&sFM<>tC0oAHRh-#W(60V%EoMCg+Gct0=d4 zxQn54QufF?H`ZeUQaP--FaTKV@!JkjInGZfgp;>=vHi2FBGg$Q`RNm@L(In(xWRk9 zZoiY{m+IGbqOra;dwR-`Gg1wai+9|V?i4hd>%3uQtFJ%%!AJRa4d*CT-UVuB76);; z)M~_NNLJV2h%t1Kh*ABdSDn8eCLUw!HoJ;A!?gG%Amk(SW-1B@h(6oqGpEj~-yy%g zjb4=Z>ufZg1bZI5`sgiLt;4lz?t7r7&9qp{k?5FNv)HkffwICO_tTuAq?Mwi9Sz#9 zqt@l~`o4)(GW{lC8rU>79$Y<+*Ni1NQ!{2 zrWWg!>ef_jFFm$|1YS4Bdf~!wbFA?AVcMx;vI#Rgf5Hasoe**7^obn$KIjK0e7Qh_t zTcPwJ|9qO%H1f=YA_1avq~i(9WR`qL%aE5attO%~i4nGXT+c$Bpt7^odlnYAutNb> zJIJUw%Ba}8;#<8sE_cosIzBToLmoaHdH`_=$V1a_{@H-|&A!a<{D^aiByBsC4fO6X za=J20d3zuWY?3f51GbpnMA_m@^EBze6ESvvmrMKe0WV z=L-8%n1-J8%Go8m%1@gum?RcDciS+`@_tim3Fq@ReJzxd8RzZl#``sx2c_)4Klo)G z>bueXJ_L`sLwA-IwR`R9rM-p|uH#FAOGKDM$p+S;1WI0p_J_}p4g)JRTy{l!ptv_i zsBD`X0Ui)62D26?rD)F^hlySBaa^=$7zolNPbQaBGy&seF*gSar0A+qFxT_B(ETLc z!~d3~s~SkA%q5>E2T{s_Ok)CJRU=~L?>4NDZ`G^!Y@&@)R%ui}2(j;G5~~B#N}rT3 z7K|IltmAdOMj)Mya|&2<)Q%YjaDawRy;_D=y$*@UQQuGb85d=K@&4PX@4#W)^~gLU zn>2HC$Oe6@36SgFQ_zlAx5y6LW}AZs+nmaz=t`N%msN5g<+wHsJ7^xFvZWzT{ivWv=S zrms3`*l+0`IXJBJpm5a-h^D6TEw=zX(*jo8wv|#>sY}-cFB?YCM}c{?V%OqvzTAl~ zrab0TYgC1*r1&biIB)0Ie`Fo>m#Y6CQ?+bW&A@fbkjBvX;K8w}1+Jyd5REk9s$xvG zxKP-)y|rO$u=^!q^hLfLVZ_p4?e>aLf!hSZI&9PzgM6hmQ~Sr1lO zfnx(Ju_H{_O2A?HfTTt&yf(fL97H;gcTX(%pjFkz*AK~Ud}zWENdXMQHEa7exPH2v z8JWt)d9+t)8k;Tf+2|^>(%v35AhvR3-&P)=HhKMKD>r-)`nNxhm-mB*#1*b)fsY=i za>ZP89E@pa>ZsoV_gW-x+qOTWfdeIZezMUTfhNZq+5v+(9uv>*(lwoE@6h!5_qbahE7gBikMlZ(OoPO!_0(Mx#uq=*K*VQLG1G(tL(p1K#*tT z3U=a+frV7QMz_NdQN%T}x$PFbrF=P2lAH9ZBW%@Qsv-2;Qcv9#!&%|lP8DVHELspT z$E|&UUQxe{LeV?h(#WltnW~=U!_sm=m z=CT|sTkJ`e5bqBlfef1H#(qOd} zup}jMBJV;X@K9(|JBt8Twv|)L`~3&X$>+(x+s@@+b7im@lHc=C!iMXl-nw)V=F^C7 zJQ|4K=G?c!5GFoO7Y<)?G}f`tIGL#n4c0ow<(CF|f62?CSCHbm-b=qVyIx~aF(hb- zVQ)4Bk$m_vCjto5a?{4sZ$xR`&n(u9Xrn}WP>;;Qe`6N}s^zy^1mqLZ^*5LgH&{r* zrrJ*1W3J5EE-oA0Tyql2#fF9vlC%L%Z{rM^h5dGvGR3 zQQl>&UmLf+VX!2&9cFmN=FO5WB#D8HNE0ZmLvAkAqo8_zbfEc0$fUL%G2>x; zwGz9`M|$YpN?Y+Q2P2VHnB6=|8eBSMIUJ4uC=x2K$A>ieG5|C9PVVHDoGY&6&d#Oz zvu-XU&cCS~sGU-<+4RShDXz74F<@poBxlzg--Kpri?$P_Mlh>tdRGIJ*Ww*OwB@*n zfJZ-awaYHs{szut7szP_9{t)~Z};G-fL=Fnul7r1AbB#)2K(U?+xu3g4`4u89p+Tg zUIeU&gE~P2KNLn|_o*LF@#v4>u^;%)V_UpG8gz4^u;YYrr+Za505C7sZ~9Dmq}Htn z=~bYns^OR0@2o&&+xOK!U|kM&hwS7ZJ3G|7guuDia8fsLk|-{O-Jo`squ+6{Bee4+ zPpSAWZpj+(J_T`0)Ca%WC-=K@AdsDn<(L`?Bc7xDSI|8DRqL&+Sc;lyel*D~eKm$z z+LjBXjn?=?*qm4e@&?Xq<6=#We;#Oj_8`}j_~U*{2W9K)x^fx}E>$*Gc&sfg2TtC#C`z)N7~|RS5&UdOiJIr zFBXe-7CZ%d5x4i-J76D6#&UMAaDxW7LND{X4MrNLks~B(P6lB3bz4dC7YYL!Pq!tI zrW@sapAQ#4Fy9gkTjFE}iK83Sz08BukUyBLZ<`!R%gji~4AwujgAN^}5wmHYlt4=I z1Tf9OpZUQHeFG^sb18(L8&XX>D)&`f6GaHbAGyA)8*zbYj4GL1&+UA&&)#txhWv{S}z1NjL9a-7ZKJ8fXRkQ0A5hpah zpX)U1np3g_IlH3&!*pggkjar1y0*Nfrl0yy|Cohup)oF+a>B-98=8{KbP1+oJ5k7~ z`pM+7eVY}3At_=wD0voe-1vF%DTt)JpfnBTP={~!rTevf&;o3;L|z?Os@u&7B@W5O z22DdMsbNwobxLLjXPf%mRVjt>ZH=)=gm-^E^mJSY9%@a*33^Ou_j-qiT{>Tdp?5Qa zc{O;4ej0qrVXQTMy|K_d-GKQ@-RxMq`tN*Uyah4*nz`_chS;d=o;3x;A6 zL%v$VTyZUuuz@*WWrh~Q?Mj%DZ{wR8ZI8I&NT0IBlm6Wu-IhqekK!_i*D5a@hl z`LBNa`}{D+X5Jt_Qv=Z-(04z+I_?S;&Sb!(1LCSs*@b@V%jTnf>B+&B*JUd z?g5UIOb+AWG~+R#bbUG#tQg;S#DbG)i-nIAstSaL;UH7LDRe*vnK^9$H@0a6tnkY3 z%fwE9Obh5#d{5frKU%hb?C~B9f!5t!-L3nHe~FBA;`k zyML#~i5QkM7ii2-8bFyq$UuY%U;wGFYc#D<#!?A=L0FkdTUj+~_CYm+yPaO&fPC(q=htXvGj=h{D~ zgGWldzB@4eUK#xhuVl_2Hg_)E4W41~%8?Jab%ugV#&g9bSC&iiidA#tL^Uxq6gS^zE`Mg2$_ydKFU%E;3_SRg@P{m=pInGl9=p&b0)7gfrysZ6~SP z`@E<33`Hr3ZbXUTn!|8yNG$|u;Tl82&mnhYkqv)c+Qc~05)DOd8UPAuA$!r+qk0_w zi+vNP-vtCPO)W?N8u&k3#Co6Po}n@1?Wdf%u$sz?d<#)~ow+UEt(g+S*4D42l`5YG?|xqewqe>$1Cf3^w3@-dBlZ%$qmS_c+yhuV>POPBbfu3aX7 zpZCYLh8t}&thN0Tu9{=Wgp@v;e~ta$T0pMZE~9*V>oTZ04+w5>FTsKr1JSHS3PE%f z+V-_yz5Y?qooclFg-24C;Q#VZ7A~3n!g!74TEB1wxpi+-OJ~+(K{Qh7s9C=^UPo3V zKr@1$bCF_SqDX7xy#FnAa8)=GfC{zik#CkGHN&gRJjiu3><3S=Za^S&ss}KJdV2u8 zvTV8@eq>dWaX9wWtCjfYqU1Vr7vV}dq{F+Fmauy8pW}XfPP_8H`?NSXi%$DND%)+tU*1)vFbG7SfmJX!j*cZ(FSxlU_w@ASM&$u+yxcX_ zFfS+UUPw-gV-#BwkRsU$7Q2K3dpr&a8DN65J^-xYM-T5$@;bj5O}VH_)Dov4&##3o zSOQ{5ED(_VZ=XY_iqh+hjSo)Y5lPhwAi_S z!gAixVA7g=u@_Kraob!LPwSXCJn&~pm{OTo0mjf_v=9r9W=l&TR;Ir?U z<gWWB%cgxwL^7zW`GnYEt% z`WOQ-rCk6dOijIbN-f$`ir)9BA;6N#X^jV#u6pI=zI61^Q?X-VWr-$n!(4(QSZH8M zjhXYKY4)@z)=$yadu zb+{pgpknr&46e@5#P(gavhkDNc7WMGcfD|$4=BKV@!PHmWC8gmhR42*_azl>z6`y7 z(^n0Y!GK~itf|JI2IHPooQ&n@F32qK)D%;RrO3_w@Q?X9h}-uMN!0&r89y;#wcI-$ zcI|>_rs`bAGptkg?A`fME#u#eQ-@{b9Nsz+zC}f$Xr1A}%LSb-Ki7iENr?c}lPp{@uegBZ8t>Ws7xLySqhw;KSr@l+hb&J^Z zhUSJdgnKHFM_BeBciMk{a1b}##zI*Zey@fhTsQ0OL*e|tvOWRj+v2J-oYuvDTle2}>`v_@2>ZlpaoJOKeOv0nEt@B}LPg`uJ)XH84u_jT`1_G5>4Tf6I<+XhmK@g8wK{9P{5sr8b_&_i$Du)XYm%x1l%rLC(C z85(L|JG?neiyP0BLe%7VhlK1VC#C?!OM67_<6s~QQj?itV-o*ug-#QE;#)PFmU6Ge zs3*+TelqG}{n#`okX&KP2d*U*1xYbTwpu-l0c!uQF>!Vk3s~5+>?XW5)=x3})um0s zz=I4RnkkZA(ypAcVyN^l**z>8nx<{mIbgH-Q8RaKvuD6n8jm=xuMQ0B%y_x z20{cAFq>vU_j&*{%FD2_X=+U1DYS)ixo>0FhBJfT6cK<1NWVqHKz+Wnsns!9>vx&G zdCfO>z?@ZWUbW@-eNb22rNKUE{sLys=D~$ttR`^*}M9xi#%T z{(}w8#Yq~Sw`duzg$(M(-tvZKeE_yMpeI=?R4MOzG`BE5`LmdJAnwvLz>>C{k&#`5 z?J|qJY1LqUnMGbito|9*Sb`8K+$o53HkSO$nxkW+y%E6|3$fOfjp;D=7nx`)X>L?1 zROYmN0hD|u`U}rz(O(h}iFGuz3oO`CSw1_iQPD}jB$}-G?bZjfXl_#^Tw1*L9;=nV za(;g-QA~Pqa#D|z zKt3nftk{B8l#wt*gntNjzPglBP@KPLZ$7ZlQ9OJJz{$+9cQEm>WWBWXSI14ShbOf$ z1GwH>4(2G!xA_K|b*DOAXHr`^`$B8la!1>_N!xRw5%9}pwAp+?U_-22IGV=HOTbcG zOWswiuuJ`56QEg0@R?Tu@Foup2#r#!V`%77qH0cFF&jX^jr*ciYff*50XZKZ|7O%PJJ(R&p0|*l%Hsw zL&(apFUjTkeeQw5a*3^BrS;yul-Ktyg~_r$

  2. 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