- Animated Svelte component library powered by GSAP and Three.js. Drop-in
+ Animated Svelte component library powered by GSAP and OGL. Drop-in
solutions for motion design, 3D canvases, and interactive animations.
diff --git a/apps/web/src/lib/config/site.ts b/apps/web/src/lib/config/site.ts
index 18ca309..5983b7c 100644
--- a/apps/web/src/lib/config/site.ts
+++ b/apps/web/src/lib/config/site.ts
@@ -11,7 +11,7 @@ export const siteConfig = {
url: "https://motion-core.dev",
/** Default SEO description for the homepage and fallback metadata. */
description:
- "Svelte-native motion toolkit with GSAP and Three.js powered components, demos, and CLI-driven workflows.",
+ "Svelte-native motion toolkit with GSAP and OGL-powered components, demos, and CLI-driven workflows.",
/** Author shown in metadata and structured data. */
author: "Marek Jóźwiak",
/** Primary SEO keywords for indexing and discovery. */
@@ -19,7 +19,7 @@ export const siteConfig = {
"motion core",
"svelte animation",
"gsap",
- "three.js",
+ "ogl",
"component library",
"svelte components",
"motion toolkit",
diff --git a/apps/web/src/routes/docs/globe/+page.svx b/apps/web/src/routes/docs/globe/+page.svx
index 1dfd80d..da32431 100644
--- a/apps/web/src/routes/docs/globe/+page.svx
+++ b/apps/web/src/routes/docs/globe/+page.svx
@@ -87,7 +87,7 @@ import { Globe } from "$lib/motion-core";
},
{
prop: "landPointColor",
- type: "THREE.ColorRepresentation",
+ type: "string | number | readonly [number, number, number] | { r: number; g: number; b: number }",
default: '"#f77114"',
description: "Color of the dots representing land.",
},
@@ -172,13 +172,13 @@ import { Globe } from "$lib/motion-core";
data={[
{
key: "color",
- type: "THREE.ColorRepresentation",
+ type: "string | number | readonly [number, number, number] | { r: number; g: number; b: number }",
default: '"#111113"',
description: "Base color before the rim glow is applied.",
},
{
key: "rimColor",
- type: "THREE.ColorRepresentation",
+ type: "string | number | readonly [number, number, number] | { r: number; g: number; b: number }",
default: '"#FF6900"',
description: "Color tint used for the Fresnel rim.",
},
@@ -205,7 +205,7 @@ import { Globe } from "$lib/motion-core";
data={[
{
key: "color",
- type: "THREE.ColorRepresentation",
+ type: "string | number | readonly [number, number, number] | { r: number; g: number; b: number }",
default: '"#FF6900"',
description: "Color of the atmosphere glow.",
},
diff --git a/apps/web/src/routes/docs/introduction/+page.svx b/apps/web/src/routes/docs/introduction/+page.svx
index ec6e345..2df6af8 100644
--- a/apps/web/src/routes/docs/introduction/+page.svx
+++ b/apps/web/src/routes/docs/introduction/+page.svx
@@ -5,7 +5,7 @@ description: An open-source initiative exploring the intersection of motion and
Motion Core is an open-source initiative born from a simple desire: to bring high-quality, expressive motion to the Svelte ecosystem. It is a curated collection of motion components, heavily inspired by the experimental web, distinct design engineering work, and the creative coding community.
-We are not trying to reinvent the wheel. Instead, we are standing on the shoulders of giants—leveraging the power of **GSAP** for timelines and **Three.js** for WebGL—and wrapping them in the developer experience that Svelte 5 provides.
+We are not trying to reinvent the wheel. Instead, we are standing on the shoulders of giants—leveraging the power of **GSAP** for timelines and **OGL** for WebGL—and wrapping them in the developer experience that Svelte 5 provides.
## The Craft
@@ -21,6 +21,6 @@ Motion Core is, and always will be, free and open source. It is a playground for
- **Svelte 5**: Utilizing runes and snippets for reactive, modern UI logic.
- **Tailwind CSS v4**: For styling that is as fluid as the animations.
-- **GSAP & Three.js**: The industry standards for heavy-lifting motion and 3D.
+- **GSAP & OGL**: The industry standards for heavy-lifting motion and 3D.
This is not just a library; it is a starting point for your own creative journey. Use the CLI to grab what you need, and make it your own.
diff --git a/apps/web/static/registry/components.json b/apps/web/static/registry/components.json
index b2e57e4..6dccacf 100644
--- a/apps/web/static/registry/components.json
+++ b/apps/web/static/registry/components.json
@@ -30,7 +30,7 @@
"components/glitter-cloth/GlitterCloth.svelte": "PHNjcmlwdCBsYW5nPSJ0cyI+CglpbXBvcnQgdHlwZSB7IENvbXBvbmVudFByb3BzIH0gZnJvbSAic3ZlbHRlIjsKCWltcG9ydCBTY2VuZSBmcm9tICIuL0dsaXR0ZXJDbG90aFNjZW5lLnN2ZWx0ZSI7CglpbXBvcnQgeyBjbiB9IGZyb20gIi4uL3V0aWxzL2NuIjsKCgl0eXBlIFNjZW5lUHJvcHMgPSBDb21wb25lbnRQcm9wczx0eXBlb2YgU2NlbmU+OwoKCWludGVyZmFjZSBQcm9wcyB7CgkJLyoqCgkJICogQWRkaXRpb25hbCBDU1MgY2xhc3NlcyBmb3IgdGhlIGNvbnRhaW5lci4KCQkgKi8KCQljbGFzcz86IHN0cmluZzsKCQkvKioKCQkgKiBQcmltYXJ5IGNvbG9yIHVzZWQgdG8gZGVyaXZlIHRoZSBmdWxsIHNoYWRlciBwYWxldHRlLgoJCSAqIEBkZWZhdWx0ICIjRkY2OTAwIgoJCSAqLwoJCWNvbG9yPzogU2NlbmVQcm9wc1siY29sb3IiXTsKCQkvKioKCQkgKiBTcGVlZCBtdWx0aXBsaWVyIGZvciB0aGUgZnVsbCBzaGFkZXIgYW5pbWF0aW9uIHRpbWVsaW5lLgoJCSAqIEBkZWZhdWx0IDEuMAoJCSAqLwoJCXNwZWVkPzogU2NlbmVQcm9wc1sic3BlZWQiXTsKCQkvKioKCQkgKiBHbG9iYWwgaW50ZW5zaXR5IG11bHRpcGxpZXIgZm9yIHRoZSBiYXNlIHNpbGsgY29sb3IuCgkJICogQGRlZmF1bHQgMS4wCgkJICovCgkJYnJpZ2h0bmVzcz86IFNjZW5lUHJvcHNbImJyaWdodG5lc3MiXTsKCQkvKioKCQkgKiBPcGFjaXR5IG9mIHRoZSB2aXZpZC1saWdodCBnbGl0dGVyIGJsZW5kLgoJCSAqIEBkZWZhdWx0IDAuMDIKCQkgKi8KCQlibGVuZFN0cmVuZ3RoPzogU2NlbmVQcm9wc1siYmxlbmRTdHJlbmd0aCJdOwoJCS8qKgoJCSAqIFNwYXRpYWwgc2NhbGUgZm9yIHNpbXBsZXggbm9pc2Ugc2FtcGxpbmcuCgkJICogTG93ZXIgdmFsdWVzIGNyZWF0ZSBmaW5lciBnbGl0dGVyLgoJCSAqIEBkZWZhdWx0IDQuMAoJCSAqLwoJCW5vaXNlU2NhbGU/OiBTY2VuZVByb3BzWyJub2lzZVNjYWxlIl07CgkJLyoqCgkJICogQmFzZSBzdHJlbmd0aCBvZiB2aWduZXR0ZSBmYWxsb2ZmLgoJCSAqIEBkZWZhdWx0IDE1LjAKCQkgKi8KCQl2aWduZXR0ZVN0cmVuZ3RoPzogU2NlbmVQcm9wc1sidmlnbmV0dGVTdHJlbmd0aCJdOwoJCS8qKgoJCSAqIFZpZ25ldHRlIGN1cnZlIGV4cG9uZW50LgoJCSAqIExvd2VyIHZhbHVlcyBwcm9kdWNlIGEgc29mdGVyIHJvbGxvZmYuCgkJICogQGRlZmF1bHQgMC4yNQoJCSAqLwoJCXZpZ25ldHRlUG93ZXI/OiBTY2VuZVByb3BzWyJ2aWduZXR0ZVBvd2VyIl07CgkJLyoqCgkJICogT3BhY2l0eSBvZiB0aGUgdmlnbmV0dGUgZWZmZWN0LgoJCSAqIGAwYCBkaXNhYmxlcyB2aWduZXR0ZSBpbmZsdWVuY2UsIGAxYCBhcHBsaWVzIGZ1bGwgdmlnbmV0dGUuCgkJICogQGRlZmF1bHQgMS4wCgkJICovCgkJdmlnbmV0dGVPcGFjaXR5PzogU2NlbmVQcm9wc1sidmlnbmV0dGVPcGFjaXR5Il07CgkJW2tleTogc3RyaW5nXTogdW5rbm93bjsKCX0KCglsZXQgewoJCWNsYXNzOiBjbGFzc05hbWUgPSAiIiwKCQljb2xvciA9ICIjRkY2OTAwIiwKCQlzcGVlZCA9IDEuMCwKCQlicmlnaHRuZXNzID0gMS4wLAoJCWJsZW5kU3RyZW5ndGggPSAwLjAyLAoJCW5vaXNlU2NhbGUgPSA0LjAsCgkJdmlnbmV0dGVTdHJlbmd0aCA9IDE1LjAsCgkJdmlnbmV0dGVQb3dlciA9IDAuMjUsCgkJdmlnbmV0dGVPcGFjaXR5ID0gMS4wLAoJCS4uLnJlc3QKCX06IFByb3BzID0gJHByb3BzKCk7Cjwvc2NyaXB0PgoKPGRpdiBjbGFzcz17Y24oInJlbGF0aXZlIGgtZnVsbCB3LWZ1bGwgb3ZlcmZsb3ctaGlkZGVuIiwgY2xhc3NOYW1lKX0gey4uLnJlc3R9PgoJPGRpdiBjbGFzcz0iYWJzb2x1dGUgaW5zZXQtMCB6LTAiPgoJCTxTY2VuZQoJCQl7Y29sb3J9CgkJCXtzcGVlZH0KCQkJe2JyaWdodG5lc3N9CgkJCXtibGVuZFN0cmVuZ3RofQoJCQl7bm9pc2VTY2FsZX0KCQkJe3ZpZ25ldHRlU3RyZW5ndGh9CgkJCXt2aWduZXR0ZVBvd2VyfQoJCQl7dmlnbmV0dGVPcGFjaXR5fQoJCS8+Cgk8L2Rpdj4KPC9kaXY+Cg==",
"components/glitter-cloth/GlitterClothScene.svelte": "PHNjcmlwdCBsYW5nPSJ0cyI+CglpbXBvcnQgeyBvbk1vdW50IH0gZnJvbSAic3ZlbHRlIjsKCWltcG9ydCB7CgkJQ2FtZXJhLAoJCU1lc2gsCgkJUHJvZ3JhbSwKCQlSZW5kZXJlciwKCQlUcmFuc2Zvcm0sCgkJVHJpYW5nbGUsCgkJVmVjMiwKCQlWZWMzLAoJfSBmcm9tICJvZ2wiOwoJaW1wb3J0IHsKCQljbGFtcDAxLAoJCXR5cGUgQ29sb3JSZXByZXNlbnRhdGlvbiwKCQlzcmdiVG9MaW5lYXIsCgkJdG9SZ2IsCgl9IGZyb20gIi4uL2hlbHBlcnMvY29sb3IiOwoKCWludGVyZmFjZSBQcm9wcyB7CgkJLyoqCgkJICogUHJpbWFyeSBjb2xvciB1c2VkIHRvIGRlcml2ZSB0aGUgZnVsbCBzaGFkZXIgcGFsZXR0ZS4KCQkgKiBAZGVmYXVsdCAiI0ZGNjkwMCIKCQkgKi8KCQljb2xvcj86IENvbG9yUmVwcmVzZW50YXRpb247CgkJLyoqCgkJICogU3BlZWQgbXVsdGlwbGllciBmb3IgdGhlIGZ1bGwgc2hhZGVyIGFuaW1hdGlvbiB0aW1lbGluZS4KCQkgKiBAZGVmYXVsdCAxLjAKCQkgKi8KCQlzcGVlZD86IG51bWJlcjsKCQkvKioKCQkgKiBHbG9iYWwgaW50ZW5zaXR5IG11bHRpcGxpZXIgZm9yIHRoZSBiYXNlIHNpbGsgY29sb3IuCgkJICogQGRlZmF1bHQgMS4wCgkJICovCgkJYnJpZ2h0bmVzcz86IG51bWJlcjsKCQkvKioKCQkgKiBPcGFjaXR5IG9mIHRoZSB2aXZpZC1saWdodCBnbGl0dGVyIGJsZW5kLgoJCSAqIEBkZWZhdWx0IDAuMDIKCQkgKi8KCQlibGVuZFN0cmVuZ3RoPzogbnVtYmVyOwoJCS8qKgoJCSAqIFNwYXRpYWwgc2NhbGUgZm9yIHNpbXBsZXggbm9pc2Ugc2FtcGxpbmcuCgkJICogTG93ZXIgdmFsdWVzIGNyZWF0ZSBmaW5lciBnbGl0dGVyLgoJCSAqIEBkZWZhdWx0IDQuMAoJCSAqLwoJCW5vaXNlU2NhbGU/OiBudW1iZXI7CgkJLyoqCgkJICogQmFzZSBzdHJlbmd0aCBvZiB2aWduZXR0ZSBmYWxsb2ZmLgoJCSAqIEBkZWZhdWx0IDE1LjAKCQkgKi8KCQl2aWduZXR0ZVN0cmVuZ3RoPzogbnVtYmVyOwoJCS8qKgoJCSAqIFZpZ25ldHRlIGN1cnZlIGV4cG9uZW50LgoJCSAqIExvd2VyIHZhbHVlcyBwcm9kdWNlIGEgc29mdGVyIHJvbGxvZmYuCgkJICogQGRlZmF1bHQgMC4yNQoJCSAqLwoJCXZpZ25ldHRlUG93ZXI/OiBudW1iZXI7CgkJLyoqCgkJICogT3BhY2l0eSBvZiB0aGUgdmlnbmV0dGUgZWZmZWN0LgoJCSAqIGAwYCBkaXNhYmxlcyB2aWduZXR0ZSBpbmZsdWVuY2UsIGAxYCBhcHBsaWVzIGZ1bGwgdmlnbmV0dGUuCgkJICogQGRlZmF1bHQgMS4wCgkJICovCgkJdmlnbmV0dGVPcGFjaXR5PzogbnVtYmVyOwoJfQoKCWxldCB7CgkJY29sb3IgPSAiI0ZGNjkwMCIsCgkJc3BlZWQgPSAxLjAsCgkJYnJpZ2h0bmVzcyA9IDEuMCwKCQlibGVuZFN0cmVuZ3RoID0gMC4wMiwKCQlub2lzZVNjYWxlID0gNC4wLAoJCXZpZ25ldHRlU3RyZW5ndGggPSAxNS4wLAoJCXZpZ25ldHRlUG93ZXIgPSAwLjI1LAoJCXZpZ25ldHRlT3BhY2l0eSA9IDEuMCwKCX06IFByb3BzID0gJHByb3BzKCk7CgoJdHlwZSBVbmlmb3JtU3RhdGUgPSB7CgkJdVRpbWU6IHsgdmFsdWU6IG51bWJlciB9OwoJCXVSZXNvbHV0aW9uOiB7IHZhbHVlOiBWZWMyIH07CgkJdVByaW1hcnlDb2xvcjogeyB2YWx1ZTogVmVjMyB9OwoJCXVBY2NlbnRDb2xvcjogeyB2YWx1ZTogVmVjMyB9OwoJCXVTaGFkb3dDb2xvcjogeyB2YWx1ZTogVmVjMyB9OwoJCXVTcGVlZDogeyB2YWx1ZTogbnVtYmVyIH07CgkJdUJyaWdodG5lc3M6IHsgdmFsdWU6IG51bWJlciB9OwoJCXVCbGVuZFN0cmVuZ3RoOiB7IHZhbHVlOiBudW1iZXIgfTsKCQl1Tm9pc2VTY2FsZTogeyB2YWx1ZTogbnVtYmVyIH07CgkJdVZpZ25ldHRlU3RyZW5ndGg6IHsgdmFsdWU6IG51bWJlciB9OwoJCXVWaWduZXR0ZVBvd2VyOiB7IHZhbHVlOiBudW1iZXIgfTsKCQl1VmlnbmV0dGVPcGFjaXR5OiB7IHZhbHVlOiBudW1iZXIgfTsKCX07CgoJY29uc3QgREVGQVVMVF9QUklNQVJZOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPSBbMSwgMTA1IC8gMjU1LCAwXTsKCglsZXQgY2FudmFzID0gJHN0YXRlPEhUTUxDYW52YXNFbGVtZW50PigpOwoJbGV0IHVuaWZvcm1zID0gJHN0YXRlPFVuaWZvcm1TdGF0ZT4oKTsKCgljb25zdCB0b0xpbmVhclRyaXBsZXQgPSAoCgkJdmFsdWU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSwKCSk6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9PiBbCgkJc3JnYlRvTGluZWFyKHZhbHVlWzBdKSwKCQlzcmdiVG9MaW5lYXIodmFsdWVbMV0pLAoJCXNyZ2JUb0xpbmVhcih2YWx1ZVsyXSksCgldOwoKCWNvbnN0IHJnYlRvSHNsID0gKAoJCXI6IG51bWJlciwKCQlnOiBudW1iZXIsCgkJYjogbnVtYmVyLAoJKTogeyBoOiBudW1iZXI7IHM6IG51bWJlcjsgbDogbnVtYmVyIH0gPT4gewoJCWNvbnN0IG1heCA9IE1hdGgubWF4KHIsIGcsIGIpOwoJCWNvbnN0IG1pbiA9IE1hdGgubWluKHIsIGcsIGIpOwoJCWNvbnN0IGwgPSAobWF4ICsgbWluKSAqIDAuNTsKCgkJaWYgKG1heCA9PT0gbWluKSByZXR1cm4geyBoOiAwLCBzOiAwLCBsIH07CgoJCWNvbnN0IGQgPSBtYXggLSBtaW47CgkJY29uc3QgcyA9IGwgPiAwLjUgPyBkIC8gKDIgLSBtYXggLSBtaW4pIDogZCAvIChtYXggKyBtaW4pOwoJCWxldCBoID0gMDsKCgkJc3dpdGNoIChtYXgpIHsKCQkJY2FzZSByOgoJCQkJaCA9IChnIC0gYikgLyBkICsgKGcgPCBiID8gNiA6IDApOwoJCQkJYnJlYWs7CgkJCWNhc2UgZzoKCQkJCWggPSAoYiAtIHIpIC8gZCArIDI7CgkJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCWggPSAociAtIGcpIC8gZCArIDQ7CgkJCQlicmVhazsKCQl9CgoJCWggLz0gNjsKCQlyZXR1cm4geyBoLCBzLCBsIH07Cgl9OwoKCWNvbnN0IGh1ZTJyZ2IgPSAocDogbnVtYmVyLCBxOiBudW1iZXIsIHRJbnB1dDogbnVtYmVyKSA9PiB7CgkJbGV0IHQgPSB0SW5wdXQ7CgkJaWYgKHQgPCAwKSB0ICs9IDE7CgkJaWYgKHQgPiAxKSB0IC09IDE7CgkJaWYgKHQgPCAxIC8gNikgcmV0dXJuIHAgKyAocSAtIHApICogNiAqIHQ7CgkJaWYgKHQgPCAxIC8gMikgcmV0dXJuIHE7CgkJaWYgKHQgPCAyIC8gMykgcmV0dXJuIHAgKyAocSAtIHApICogKDIgLyAzIC0gdCkgKiA2OwoJCXJldHVybiBwOwoJfTsKCgljb25zdCBoc2xUb1JnYiA9ICgKCQloOiBudW1iZXIsCgkJczogbnVtYmVyLAoJCWw6IG51bWJlciwKCSk6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9PiB7CgkJaWYgKHMgPT09IDApIHJldHVybiBbbCwgbCwgbF07CgkJY29uc3QgcSA9IGwgPCAwLjUgPyBsICogKDEgKyBzKSA6IGwgKyBzIC0gbCAqIHM7CgkJY29uc3QgcCA9IDIgKiBsIC0gcTsKCQlyZXR1cm4gWwoJCQlodWUycmdiKHAsIHEsIGggKyAxIC8gMyksCgkJCWh1ZTJyZ2IocCwgcSwgaCksCgkJCWh1ZTJyZ2IocCwgcSwgaCAtIDEgLyAzKSwKCQldOwoJfTsKCgljb25zdCBkZXJpdmVQYWxldHRlID0gKAoJCXByaW1hcnk6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSwKCSk6IHsKCQlhY2NlbnQ6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTsKCQlzaGFkb3c6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTsKCX0gPT4gewoJCWNvbnN0IGhzbCA9IHJnYlRvSHNsKHByaW1hcnlbMF0sIHByaW1hcnlbMV0sIHByaW1hcnlbMl0pOwoJCWNvbnN0IGFjY2VudCA9IGhzbFRvUmdiKAoJCQkoaHNsLmggKyAwLjA0KSAlIDEsCgkJCWNsYW1wMDEoaHNsLnMgKiAxLjEpLAoJCQljbGFtcDAxKGhzbC5sICogMS4xICsgMC4wNCksCgkJKTsKCQljb25zdCBzaGFkb3cgPSBoc2xUb1JnYigKCQkJaHNsLmgsCgkJCWNsYW1wMDEoaHNsLnMgKiAwLjU1KSwKCQkJY2xhbXAwMShoc2wubCAqIDAuNDUpLAoJCSk7CgkJcmV0dXJuIHsgYWNjZW50LCBzaGFkb3cgfTsKCX07CgoJY29uc3QgdmVydGV4U2hhZGVyID0gYAoJCWF0dHJpYnV0ZSB2ZWMyIHV2OwoJCWF0dHJpYnV0ZSB2ZWMyIHBvc2l0aW9uOwoJCXZhcnlpbmcgdmVjMiB2VXY7CgoJCXZvaWQgbWFpbigpIHsKCQkJdlV2ID0gdXY7CgkJCWdsX1Bvc2l0aW9uID0gdmVjNChwb3NpdGlvbiwgMC4wLCAxLjApOwoJCX0KCWA7CgoJY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBgCgkJcHJlY2lzaW9uIGhpZ2hwIGZsb2F0OwoJCXZhcnlpbmcgdmVjMiB2VXY7CgoJCXVuaWZvcm0gZmxvYXQgdVRpbWU7CgkJdW5pZm9ybSB2ZWMyIHVSZXNvbHV0aW9uOwoJCXVuaWZvcm0gdmVjMyB1UHJpbWFyeUNvbG9yOwoJCXVuaWZvcm0gdmVjMyB1QWNjZW50Q29sb3I7CgkJdW5pZm9ybSB2ZWMzIHVTaGFkb3dDb2xvcjsKCQl1bmlmb3JtIGZsb2F0IHVTcGVlZDsKCQl1bmlmb3JtIGZsb2F0IHVCcmlnaHRuZXNzOwoJCXVuaWZvcm0gZmxvYXQgdUJsZW5kU3RyZW5ndGg7CgkJdW5pZm9ybSBmbG9hdCB1Tm9pc2VTY2FsZTsKCQl1bmlmb3JtIGZsb2F0IHVWaWduZXR0ZVN0cmVuZ3RoOwoJCXVuaWZvcm0gZmxvYXQgdVZpZ25ldHRlUG93ZXI7CgkJdW5pZm9ybSBmbG9hdCB1VmlnbmV0dGVPcGFjaXR5OwoKCQljb25zdCBmbG9hdCBub2lzZVNpemVDb2VmZiA9IDAuNjE7CgkJY29uc3QgZmxvYXQgbm9pc2VEZW5zaXR5ID0gNTMuMDsKCgkJdmVjMyBtb2QyODkodmVjMyB4KSB7CgkJCXJldHVybiB4IC0gZmxvb3IoeCAqICgxLjAgLyAyODkuMCkpICogMjg5LjA7CgkJfQoKCQl2ZWM0IG1vZDI4OSh2ZWM0IHgpIHsKCQkJcmV0dXJuIHggLSBmbG9vcih4ICogKDEuMCAvIDI4OS4wKSkgKiAyODkuMDsKCQl9CgoJCXZlYzQgcGVybXV0ZSh2ZWM0IHgpIHsKCQkJcmV0dXJuIG1vZDI4OSgoKHggKiAzNC4wKSArIDEuMCkgKiB4KTsKCQl9CgoJCXZlYzQgdGF5bG9ySW52U3FydCh2ZWM0IHIpIHsKCQkJcmV0dXJuIDEuNzkyODQyOTE0MDAxNTkgLSAwLjg1MzczNDcyMDk1MzE0ICogcjsKCQl9CgoJCWZsb2F0IHNub2lzZSh2ZWMzIHYpIHsKCQkJY29uc3QgdmVjMiBDID0gdmVjMigxLjAgLyA2LjAsIDEuMCAvIDMuMCk7CgkJCWNvbnN0IHZlYzQgRCA9IHZlYzQoMC4wLCAwLjUsIDEuMCwgMi4wKTsKCgkJCXZlYzMgaSA9IGZsb29yKHYgKyBkb3QodiwgQy55eXkpKTsKCQkJdmVjMyB4MCA9IHYgLSBpICsgZG90KGksIEMueHh4KTsKCgkJCXZlYzMgZyA9IHN0ZXAoeDAueXp4LCB4MC54eXopOwoJCQl2ZWMzIGwgPSAxLjAgLSBnOwoJCQl2ZWMzIGkxID0gbWluKGcueHl6LCBsLnp4eSk7CgkJCXZlYzMgaTIgPSBtYXgoZy54eXosIGwuenh5KTsKCgkJCXZlYzMgeDEgPSB4MCAtIGkxICsgQy54eHg7CgkJCXZlYzMgeDIgPSB4MCAtIGkyICsgQy55eXk7CgkJCXZlYzMgeDMgPSB4MCAtIEQueXl5OwoKCQkJaSA9IG1vZDI4OShpKTsKCQkJdmVjNCBwID0gcGVybXV0ZShwZXJtdXRlKHBlcm11dGUoaS56ICsgdmVjNCgwLjAsIGkxLnosIGkyLnosIDEuMCkpICsKCQkJCWkueSArIHZlYzQoMC4wLCBpMS55LCBpMi55LCAxLjApKSArCgkJCQlpLnggKyB2ZWM0KDAuMCwgaTEueCwgaTIueCwgMS4wKSk7CgoJCQlmbG9hdCBuXyA9IDAuMTQyODU3MTQyODU3OwoJCQl2ZWMzIG5zID0gbl8gKiBELnd5eiAtIEQueHp4OwoKCQkJdmVjNCBqID0gcCAtIDQ5LjAgKiBmbG9vcihwICogbnMueiAqIG5zLnopOwoKCQkJdmVjNCB4XyA9IGZsb29yKGogKiBucy56KTsKCQkJdmVjNCB5XyA9IGZsb29yKGogLSA3LjAgKiB4Xyk7CgoJCQl2ZWM0IHggPSB4XyAqIG5zLnggKyBucy55eXl5OwoJCQl2ZWM0IHkgPSB5XyAqIG5zLnggKyBucy55eXl5OwoJCQl2ZWM0IGggPSAxLjAgLSBhYnMoeCkgLSBhYnMoeSk7CgoJCQl2ZWM0IGIwID0gdmVjNCh4Lnh5LCB5Lnh5KTsKCQkJdmVjNCBiMSA9IHZlYzQoeC56dywgeS56dyk7CgoJCQl2ZWM0IHMwID0gZmxvb3IoYjApICogMi4wICsgMS4wOwoJCQl2ZWM0IHMxID0gZmxvb3IoYjEpICogMi4wICsgMS4wOwoJCQl2ZWM0IHNoID0gLXN0ZXAoaCwgdmVjNCgwLjApKTsKCgkJCXZlYzQgYTAgPSBiMC54enl3ICsgczAueHp5dyAqIHNoLnh4eXk7CgkJCXZlYzQgYTEgPSBiMS54enl3ICsgczEueHp5dyAqIHNoLnp6d3c7CgoJCQl2ZWMzIHAwID0gdmVjMyhhMC54eSwgaC54KTsKCQkJdmVjMyBwMSA9IHZlYzMoYTAuencsIGgueSk7CgkJCXZlYzMgcDIgPSB2ZWMzKGExLnh5LCBoLnopOwoJCQl2ZWMzIHAzID0gdmVjMyhhMS56dywgaC53KTsKCgkJCXZlYzQgbm9ybSA9IHRheWxvckludlNxcnQodmVjNChkb3QocDAsIHAwKSwgZG90KHAxLCBwMSksIGRvdChwMiwgcDIpLCBkb3QocDMsIHAzKSkpOwoJCQlwMCAqPSBub3JtLng7CgkJCXAxICo9IG5vcm0ueTsKCQkJcDIgKj0gbm9ybS56OwoJCQlwMyAqPSBub3JtLnc7CgoJCQl2ZWM0IG0gPSBtYXgobm9pc2VTaXplQ29lZmYgLSB2ZWM0KGRvdCh4MCwgeDApLCBkb3QoeDEsIHgxKSwgZG90KHgyLCB4MiksIGRvdCh4MywgeDMpKSwgMC4wKTsKCQkJbSA9IG0gKiBtOwoJCQlyZXR1cm4gbm9pc2VEZW5zaXR5ICogZG90KG0gKiBtLCB2ZWM0KGRvdChwMCwgeDApLCBkb3QocDEsIHgxKSwgZG90KHAyLCB4MiksIGRvdChwMywgeDMpKSk7CgkJfQoKCQlmbG9hdCB2aXZpZExpZ2h0KGZsb2F0IHMsIGZsb2F0IGQpIHsKCQkJcmV0dXJuIChzIDwgMC41KSA/IDEuMCAtICgxLjAgLSBkKSAvICgyLjAgKiBzKSA6IGQgLyAoMi4wICogKDEuMCAtIHMpKTsKCQl9CgoJCXZlYzMgdml2aWRMaWdodCh2ZWMzIHMsIHZlYzMgZCkgewoJCQl2ZWMzIGM7CgkJCWMueCA9IHZpdmlkTGlnaHQocy54LCBkLngpOwoJCQljLnkgPSB2aXZpZExpZ2h0KHMueSwgZC55KTsKCQkJYy56ID0gdml2aWRMaWdodChzLnosIGQueik7CgkJCXJldHVybiBjOwoJCX0KCgkJZmxvYXQgdmlnbmV0dGUodmVjMiB1diwgZmxvYXQgc3RyZW5ndGgsIGZsb2F0IHBvd2VyKSB7CgkJCXV2ICo9IDEuMCAtIHV2Lnl4OwoJCQlmbG9hdCB2aWcgPSB1di54ICogdXYueSAqIHN0cmVuZ3RoOwoJCQl2aWcgPSBwb3codmlnLCBwb3dlcik7CgkJCXJldHVybiB2aWc7CgkJfQoKCQl2ZWMzIGxpbmVhclRvU3JnYih2ZWMzIGNvbG9yKSB7CgkJCXZlYzMgc2FmZSA9IG1heChjb2xvciwgdmVjMygwLjApKTsKCQkJdmVjMyBsb3cgPSBzYWZlICogMTIuOTI7CgkJCXZlYzMgaGlnaCA9IDEuMDU1ICogcG93KHNhZmUsIHZlYzMoMS4wIC8gMi40KSkgLSAwLjA1NTsKCQkJdmVjMyBjdXRvZmYgPSBzdGVwKHZlYzMoMC4wMDMxMzA4KSwgc2FmZSk7CgkJCXJldHVybiBtaXgobG93LCBoaWdoLCBjdXRvZmYpOwoJCX0KCgkJdm9pZCBtYWluSW1hZ2Uob3V0IHZlYzQgY29sLCB2ZWMyIGZyYWdDb29yZCkgewoJCQlmbG9hdCB0aW1lID0gdVRpbWUgKiB1U3BlZWQ7CgkJCXZlYzIgcmVzb2x1dGlvbiA9IHVSZXNvbHV0aW9uOwoKCQkJdmVjMiB1diA9IGZyYWdDb29yZCAvIHJlc29sdXRpb24ueTsKCQkJZmxvYXQgdCA9IDAuNSAqIHRpbWU7CgkJCXV2LnkgKz0gMC4wMyAqIHNpbig4LjAgKiB1di54IC0gdCk7CgoJCQlmbG9hdCBmID0gMC42ICsgMC40ICogc2luKDUuMCAqICh1di54ICsgdXYueSArIGNvcygzLjAgKiB1di54ICsgNS4wICogdXYueSkgKyAwLjAyICogdCkgKwoJCQkJc2luKDIwLjAgKiAodXYueCArIHV2LnkgLSAwLjEgKiB0KSkpOwoKCQkJZmxvYXQgYiA9IHVCcmlnaHRuZXNzOwoJCQljb2wgPSB2ZWM0KHVQcmltYXJ5Q29sb3IgKiBiLCAxLjApICogdmVjNChmKTsKCgkJCXV2ID0gZnJhZ0Nvb3JkLnh5IC8gcmVzb2x1dGlvbi54eTsKCQkJZmxvYXQgdmlnID0gdmlnbmV0dGUodXYsIHVWaWduZXR0ZVN0cmVuZ3RoLCB1VmlnbmV0dGVQb3dlcik7CgkJCWZsb2F0IHZpZ25ldHRlTWFzayA9IG1peCgxLjAsIHZpZywgdVZpZ25ldHRlT3BhY2l0eSk7CgoJCQlmbG9hdCBmYWRlTFIgPSAwLjcgLSBhYnModXYueCAtIDAuNCk7CgkJCWZsb2F0IGZhZGVUQiA9IDEuMSAtIHV2Lnk7CgkJCXZlYzMgcG9zID0gdmVjMyh1diAqIHZlYzIoMy4wLCAxLjApIC0gdmVjMigwLjAsIHRpbWUgKiAwLjAwMDA1KSwgdGltZSAqIDAuMDA2KTsKCgkJCWZsb2F0IG4gPSBmYWRlTFIgKiBmYWRlVEIgKiBzbW9vdGhzdGVwKDAuNTAsIDEuMCwgc25vaXNlKHBvcyAqIHJlc29sdXRpb24ueSAvIHVOb2lzZVNjYWxlKSkgKiA4LjA7CgkJCXZlYzMgbm9pc2VHcmV5U2hpZnRlZCA9IG1pbigodmVjMyhuKSArIDEuMCkgLyAzLjAgKyAwLjMsIHZlYzMoMS4wKSkgKiAwLjkxOwoKCQkJdmVjMyBtaXhlZCA9IGNvbC54eXo7CgkJCW1peGVkID0gbWl4KGNvbC54eXosIHZpdmlkTGlnaHQobm9pc2VHcmV5U2hpZnRlZCwgY29sLnh5eiksIHVCbGVuZFN0cmVuZ3RoKTsKCQkJY29sID0gdmVjNChtaXhlZCwgMS4wKSAqIHZpZ25ldHRlTWFzazsKCgkJCWZsb2F0IGsgPSAoc2luKHRpbWUgLyAxLjApICsgMS4wKSAvIDQuMCArIDAuNzU7CgkJCWNvbC5yZ2IgLT0gdUFjY2VudENvbG9yICogKCgxLjAgLSB1di55KSAqIDAuMSAqIGspOwoJCQljb2wucmdiIC09IHZlYzModVNoYWRvd0NvbG9yLnIsIHVTaGFkb3dDb2xvci5nICogMC44LCB1U2hhZG93Q29sb3IuYikgKiAodXYueSAvIDguMCk7CgkJCWNvbC5hID0gMS4wOwoJCX0KCgkJdm9pZCBtYWluKCkgewoJCQl2ZWM0IGZyYWdDb2xvcjsKCQkJdmVjMiBmcmFnQ29vcmQgPSB2VXYgKiB1UmVzb2x1dGlvbi54eTsKCQkJbWFpbkltYWdlKGZyYWdDb2xvciwgZnJhZ0Nvb3JkKTsKCQkJZnJhZ0NvbG9yLnJnYiA9IGxpbmVhclRvU3JnYihmcmFnQ29sb3IucmdiKTsKCQkJZ2xfRnJhZ0NvbG9yID0gZnJhZ0NvbG9yOwoJCX0KCWA7CgoJJGVmZmVjdCgoKSA9PiB7CgkJaWYgKCF1bmlmb3JtcykgcmV0dXJuOwoJCWNvbnN0IHByaW1hcnlTcmdiID0gdG9SZ2IoY29sb3IsIERFRkFVTFRfUFJJTUFSWSk7CgkJY29uc3QgcGFsZXR0ZVNyZ2IgPSBkZXJpdmVQYWxldHRlKHByaW1hcnlTcmdiKTsKCQljb25zdCBwcmltYXJ5ID0gdG9MaW5lYXJUcmlwbGV0KHByaW1hcnlTcmdiKTsKCQljb25zdCBhY2NlbnQgPSB0b0xpbmVhclRyaXBsZXQocGFsZXR0ZVNyZ2IuYWNjZW50KTsKCQljb25zdCBzaGFkb3cgPSB0b0xpbmVhclRyaXBsZXQocGFsZXR0ZVNyZ2Iuc2hhZG93KTsKCQl1bmlmb3Jtcy51UHJpbWFyeUNvbG9yLnZhbHVlLnNldChwcmltYXJ5WzBdLCBwcmltYXJ5WzFdLCBwcmltYXJ5WzJdKTsKCQl1bmlmb3Jtcy51QWNjZW50Q29sb3IudmFsdWUuc2V0KGFjY2VudFswXSwgYWNjZW50WzFdLCBhY2NlbnRbMl0pOwoJCXVuaWZvcm1zLnVTaGFkb3dDb2xvci52YWx1ZS5zZXQoc2hhZG93WzBdLCBzaGFkb3dbMV0sIHNoYWRvd1syXSk7CgkJdW5pZm9ybXMudVNwZWVkLnZhbHVlID0gc3BlZWQ7CgkJdW5pZm9ybXMudUJyaWdodG5lc3MudmFsdWUgPSBicmlnaHRuZXNzOwoJCXVuaWZvcm1zLnVCbGVuZFN0cmVuZ3RoLnZhbHVlID0gYmxlbmRTdHJlbmd0aDsKCQl1bmlmb3Jtcy51Tm9pc2VTY2FsZS52YWx1ZSA9IG5vaXNlU2NhbGU7CgkJdW5pZm9ybXMudVZpZ25ldHRlU3RyZW5ndGgudmFsdWUgPSB2aWduZXR0ZVN0cmVuZ3RoOwoJCXVuaWZvcm1zLnVWaWduZXR0ZVBvd2VyLnZhbHVlID0gdmlnbmV0dGVQb3dlcjsKCQl1bmlmb3Jtcy51VmlnbmV0dGVPcGFjaXR5LnZhbHVlID0gdmlnbmV0dGVPcGFjaXR5OwoJfSk7CgoJb25Nb3VudCgoKSA9PiB7CgkJY29uc3QgdGFyZ2V0Q2FudmFzID0gY2FudmFzOwoJCWlmICghdGFyZ2V0Q2FudmFzKSByZXR1cm47CgoJCWNvbnN0IHJlbmRlcmVyID0gbmV3IFJlbmRlcmVyKHsKCQkJY2FudmFzOiB0YXJnZXRDYW52YXMsCgkJCWFscGhhOiB0cnVlLAoJCQlkcHI6IHR5cGVvZiB3aW5kb3cgIT09ICJ1bmRlZmluZWQiID8gd2luZG93LmRldmljZVBpeGVsUmF0aW8gOiAxLAoJCX0pOwoJCWNvbnN0IGdsID0gcmVuZGVyZXIuZ2w7CgkJZ2wuY2xlYXJDb2xvcigwLCAwLCAwLCAwKTsKCgkJY29uc3QgY2FtZXJhID0gbmV3IENhbWVyYShnbCk7CgkJY2FtZXJhLnBvc2l0aW9uLnogPSAxOwoKCQljb25zdCBzY2VuZSA9IG5ldyBUcmFuc2Zvcm0oKTsKCQljb25zdCBnZW9tZXRyeSA9IG5ldyBUcmlhbmdsZShnbCk7CgoJCWNvbnN0IHByaW1hcnlTcmdiID0gdG9SZ2IoY29sb3IsIERFRkFVTFRfUFJJTUFSWSk7CgkJY29uc3QgcGFsZXR0ZVNyZ2IgPSBkZXJpdmVQYWxldHRlKHByaW1hcnlTcmdiKTsKCQljb25zdCBwcmltYXJ5ID0gdG9MaW5lYXJUcmlwbGV0KHByaW1hcnlTcmdiKTsKCQljb25zdCBhY2NlbnQgPSB0b0xpbmVhclRyaXBsZXQocGFsZXR0ZVNyZ2IuYWNjZW50KTsKCQljb25zdCBzaGFkb3cgPSB0b0xpbmVhclRyaXBsZXQocGFsZXR0ZVNyZ2Iuc2hhZG93KTsKCQljb25zdCBsb2NhbFVuaWZvcm1zOiBVbmlmb3JtU3RhdGUgPSB7CgkJCXVUaW1lOiB7IHZhbHVlOiAwIH0sCgkJCXVSZXNvbHV0aW9uOiB7IHZhbHVlOiBuZXcgVmVjMigxLCAxKSB9LAoJCQl1UHJpbWFyeUNvbG9yOiB7IHZhbHVlOiBuZXcgVmVjMyhwcmltYXJ5WzBdLCBwcmltYXJ5WzFdLCBwcmltYXJ5WzJdKSB9LAoJCQl1QWNjZW50Q29sb3I6IHsKCQkJCXZhbHVlOiBuZXcgVmVjMyhhY2NlbnRbMF0sIGFjY2VudFsxXSwgYWNjZW50WzJdKSwKCQkJfSwKCQkJdVNoYWRvd0NvbG9yOiB7CgkJCQl2YWx1ZTogbmV3IFZlYzMoc2hhZG93WzBdLCBzaGFkb3dbMV0sIHNoYWRvd1syXSksCgkJCX0sCgkJCXVTcGVlZDogeyB2YWx1ZTogc3BlZWQgfSwKCQkJdUJyaWdodG5lc3M6IHsgdmFsdWU6IGJyaWdodG5lc3MgfSwKCQkJdUJsZW5kU3RyZW5ndGg6IHsgdmFsdWU6IGJsZW5kU3RyZW5ndGggfSwKCQkJdU5vaXNlU2NhbGU6IHsgdmFsdWU6IG5vaXNlU2NhbGUgfSwKCQkJdVZpZ25ldHRlU3RyZW5ndGg6IHsgdmFsdWU6IHZpZ25ldHRlU3RyZW5ndGggfSwKCQkJdVZpZ25ldHRlUG93ZXI6IHsgdmFsdWU6IHZpZ25ldHRlUG93ZXIgfSwKCQkJdVZpZ25ldHRlT3BhY2l0eTogeyB2YWx1ZTogdmlnbmV0dGVPcGFjaXR5IH0sCgkJfTsKCQl1bmlmb3JtcyA9IGxvY2FsVW5pZm9ybXM7CgoJCWNvbnN0IHByb2dyYW0gPSBuZXcgUHJvZ3JhbShnbCwgewoJCQl2ZXJ0ZXg6IHZlcnRleFNoYWRlciwKCQkJZnJhZ21lbnQ6IGZyYWdtZW50U2hhZGVyLAoJCQl1bmlmb3JtczogbG9jYWxVbmlmb3JtcywKCQkJdHJhbnNwYXJlbnQ6IHRydWUsCgkJCWRlcHRoVGVzdDogZmFsc2UsCgkJCWRlcHRoV3JpdGU6IGZhbHNlLAoJCX0pOwoKCQljb25zdCBtZXNoID0gbmV3IE1lc2goZ2wsIHsgZ2VvbWV0cnksIHByb2dyYW0gfSk7CgkJbWVzaC5zZXRQYXJlbnQoc2NlbmUpOwoKCQljb25zdCByZXNpemUgPSAoKSA9PiB7CgkJCWNvbnN0IGhvc3QgPSB0YXJnZXRDYW52YXMucGFyZW50RWxlbWVudCA/PyB0YXJnZXRDYW52YXM7CgkJCWNvbnN0IHsgd2lkdGg6IGhvc3RXaWR0aCwgaGVpZ2h0OiBob3N0SGVpZ2h0IH0gPQoJCQkJaG9zdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKCQkJY29uc3Qgd2lkdGggPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGhvc3RXaWR0aCkpOwoJCQljb25zdCBoZWlnaHQgPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGhvc3RIZWlnaHQpKTsKCQkJcmVuZGVyZXIuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTsKCQkJbG9jYWxVbmlmb3Jtcy51UmVzb2x1dGlvbi52YWx1ZS5zZXQod2lkdGgsIGhlaWdodCk7CgkJfTsKCgkJcmVzaXplKCk7CgkJY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIocmVzaXplKTsKCQlvYnNlcnZlci5vYnNlcnZlKHRhcmdldENhbnZhcyk7CgkJaWYgKHRhcmdldENhbnZhcy5wYXJlbnRFbGVtZW50KQoJCQlvYnNlcnZlci5vYnNlcnZlKHRhcmdldENhbnZhcy5wYXJlbnRFbGVtZW50KTsKCgkJbGV0IHJhZiA9IDA7CgkJbGV0IHByZXZpb3VzID0gMDsKCQljb25zdCB0aWNrID0gKG5vdzogbnVtYmVyKSA9PiB7CgkJCWNvbnN0IGRlbHRhID0gcHJldmlvdXMgPyAobm93IC0gcHJldmlvdXMpIC8gMTAwMCA6IDA7CgkJCXByZXZpb3VzID0gbm93OwoJCQlsb2NhbFVuaWZvcm1zLnVUaW1lLnZhbHVlICs9IGRlbHRhOwoKCQkJcmVuZGVyZXIucmVuZGVyKHsgc2NlbmUsIGNhbWVyYSB9KTsKCQkJcmFmID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSh0aWNrKTsKCQl9OwoKCQlyYWYgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRpY2spOwoKCQlyZXR1cm4gKCkgPT4gewoJCQl3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmKTsKCQkJb2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwoJCX07Cgl9KTsKPC9zY3JpcHQ+Cgo8Y2FudmFzCgliaW5kOnRoaXM9e2NhbnZhc30KCWNsYXNzPSJhYnNvbHV0ZSBpbnNldC0wIGJsb2NrIGgtZnVsbCB3LWZ1bGwiCglzdHlsZT0id2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTsiCglhcmlhLWhpZGRlbj0idHJ1ZSIKPjwvY2FudmFzPgo=",
"components/globe/Globe.svelte": "PHNjcmlwdCBsYW5nPSJ0cyI+CglpbXBvcnQgU2NlbmUgZnJvbSAiLi9HbG9iZVNjZW5lLnN2ZWx0ZSI7CglpbXBvcnQgeyBjbiB9IGZyb20gIi4uL3V0aWxzL2NuIjsKCWltcG9ydCB0eXBlIHsgQ29tcG9uZW50UHJvcHMsIFNuaXBwZXQgfSBmcm9tICJzdmVsdGUiOwoJaW1wb3J0IHR5cGUgeyBHbG9iZU1hcmtlciwgR2xvYmVNYXJrZXJUb29sdGlwQ29udGV4dCB9IGZyb20gIi4vdHlwZXMiOwoKCXR5cGUgU2NlbmVQcm9wcyA9IENvbXBvbmVudFByb3BzPHR5cGVvZiBTY2VuZT47CgoJaW50ZXJmYWNlIFByb3BzIHsKCQkvKioKCQkgKiBBZGRpdGlvbmFsIENTUyBjbGFzc2VzIGZvciB0aGUgY29udGFpbmVyLgoJCSAqLwoJCWNsYXNzPzogc3RyaW5nOwoJCS8qKgoJCSAqIFJhZGl1cyBvZiB0aGUgc3BoZXJlLgoJCSAqIEBkZWZhdWx0IDIKCQkgKi8KCQlyYWRpdXM/OiBTY2VuZVByb3BzWyJyYWRpdXMiXTsKCQkvKioKCQkgKiBPcHRpb25hbCBvdmVycmlkZXMgZm9yIHRoZSBGcmVzbmVsIHNoYWRlciB1bmlmb3Jtcy4KCQkgKi8KCQlmcmVzbmVsQ29uZmlnPzogU2NlbmVQcm9wc1siZnJlc25lbENvbmZpZyJdOwoJCS8qKgoJCSAqIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBhdG1vc3BoZXJpYyBoYWxvLgoJCSAqLwoJCWF0bW9zcGhlcmVDb25maWc/OiBTY2VuZVByb3BzWyJhdG1vc3BoZXJlQ29uZmlnIl07CgkJLyoqCgkJICogTnVtYmVyIG9mIHBvaW50cyByZW5kZXJlZCBvbiB0aGUgc3VyZmFjZS4KCQkgKiBAZGVmYXVsdCAxNTAwMAoJCSAqLwoJCXBvaW50Q291bnQ/OiBTY2VuZVByb3BzWyJwb2ludENvdW50Il07CgkJLyoqCgkJICogQ29sb3IgYXBwbGllZCB0byBwb2ludHMgdGhhdCBmYWxsIG9uIGxhbmQuCgkJICogQGRlZmF1bHQgIiNmNzcxMTQiCgkJICovCgkJbGFuZFBvaW50Q29sb3I/OiBTY2VuZVByb3BzWyJsYW5kUG9pbnRDb2xvciJdOwoJCS8qKgoJCSAqIFNpemUgb2YgZWFjaCBwb2ludCBpbiB3b3JsZCB1bml0cy4KCQkgKiBAZGVmYXVsdCAwLjA1CgkJICovCgkJcG9pbnRTaXplPzogU2NlbmVQcm9wc1sicG9pbnRTaXplIl07CgkJLyoqCgkJICogV2hldGhlciB0aGUgZ2xvYmUgc2hvdWxkIGF1dG8tcm90YXRlLgoJCSAqIEBkZWZhdWx0IHRydWUKCQkgKi8KCQlhdXRvUm90YXRlPzogU2NlbmVQcm9wc1siYXV0b1JvdGF0ZSJdOwoJCS8qKgoJCSAqIFdoZXRoZXIgdG8gbG9jayB0aGUgY2FtZXJhJ3MgcG9sYXIgYW5nbGUgKHZlcnRpY2FsIHJvdGF0aW9uKS4KCQkgKiBJZiB0cnVlLCBsaW1pdHMgdGhlIHZlcnRpY2FsIHZpZXcgdG8gYSBuYXJyb3cgYmFuZC4KCQkgKiBAZGVmYXVsdCB0cnVlCgkJICovCgkJbG9ja2VkUG9sYXJBbmdsZT86IGJvb2xlYW47CgkJLyoqCgkJICogQXJyYXkgb2YgbWFya2VycyB0byBkaXNwbGF5IG9uIHRoZSBnbG9iZS4KCQkgKi8KCQltYXJrZXJzPzogR2xvYmVNYXJrZXJbXTsKCQkvKioKCQkgKiBPcHRpb25hbCBjdXN0b20gdG9vbHRpcCByZW5kZXJlciBmb3IgbWFya2Vycy4KCQkgKiBSZWNlaXZlcyBtYXJrZXIgZGF0YSBhbmQgdmlzaWJpbGl0eSBjb250ZXh0LgoJCSAqLwoJCW1hcmtlclRvb2x0aXA/OiBTbmlwcGV0PFtHbG9iZU1hcmtlclRvb2x0aXBDb250ZXh0XT47CgkJLyoqCgkJICogQ29vcmRpbmF0ZXMgW2xhdCwgbG9uXSB0byBmb2N1cyB0aGUgY2FtZXJhIG9uLgoJCSAqIFdoZW4gc2V0LCBhdXRvLXJvdGF0aW9uIHdpbGwgYmUgZGlzYWJsZWQgdGVtcG9yYXJpbHkuCgkJICovCgkJZm9jdXNPbj86IFtudW1iZXIsIG51bWJlcl0gfCBudWxsOwoKCQlba2V5OiBzdHJpbmddOiB1bmtub3duOwoJfQoKCWxldCB7CgkJY2xhc3M6IGNsYXNzTmFtZSA9ICIiLAoJCXJhZGl1cyA9IDIsCgkJZnJlc25lbENvbmZpZywKCQlhdG1vc3BoZXJlQ29uZmlnLAoJCXBvaW50Q291bnQsCgkJbGFuZFBvaW50Q29sb3IsCgkJcG9pbnRTaXplLAoJCWF1dG9Sb3RhdGUgPSB0cnVlLAoJCWxvY2tlZFBvbGFyQW5nbGUgPSB0cnVlLAoJCW1hcmtlcnMgPSBbXSwKCQltYXJrZXJUb29sdGlwLAoJCWZvY3VzT24gPSBudWxsLAoJCS4uLnJlc3QKCX06IFByb3BzID0gJHByb3BzKCk7Cjwvc2NyaXB0PgoKPGRpdiBjbGFzcz17Y24oInJlbGF0aXZlIGgtZnVsbCB3LWZ1bGwgb3ZlcmZsb3ctaGlkZGVuIiwgY2xhc3NOYW1lKX0gey4uLnJlc3R9PgoJPGRpdiBjbGFzcz0iYWJzb2x1dGUgaW5zZXQtMCB6LTAiPgoJCTxTY2VuZQoJCQl7cmFkaXVzfQoJCQl7ZnJlc25lbENvbmZpZ30KCQkJe2F0bW9zcGhlcmVDb25maWd9CgkJCXtwb2ludENvdW50fQoJCQl7bGFuZFBvaW50Q29sb3J9CgkJCXtwb2ludFNpemV9CgkJCXthdXRvUm90YXRlfQoJCQl7bG9ja2VkUG9sYXJBbmdsZX0KCQkJe21hcmtlcnN9CgkJCXttYXJrZXJUb29sdGlwfQoJCQl7Zm9jdXNPbn0KCQkvPgoJPC9kaXY+CjwvZGl2Pgo=",
- "components/globe/GlobeScene.svelte": "PHNjcmlwdCBsYW5nPSJ0cyI+CglpbXBvcnQgeyBvbk1vdW50IH0gZnJvbSAic3ZlbHRlIjsKCWltcG9ydCB7CgkJQ2FtZXJhLAoJCU1lc2gsCgkJUHJvZ3JhbSwKCQlSZW5kZXJlciwKCQlUZXh0dXJlLAoJCVRyYW5zZm9ybSwKCQlUcmlhbmdsZSwKCQlWZWMyLAoJCVZlYzMsCgl9IGZyb20gIm9nbCI7CglpbXBvcnQgeyBnc2FwIH0gZnJvbSAiZ3NhcC9kaXN0L2dzYXAiOwoJaW1wb3J0IHR5cGUgeyBTbmlwcGV0IH0gZnJvbSAic3ZlbHRlIjsKCWltcG9ydCBsYW5kVGV4dHVyZVVybCBmcm9tICIuLi9hc3NldHMvbGFuZC10ZXh0dXJlLnBuZyI7CglpbXBvcnQgeyB0eXBlIENvbG9yUmVwcmVzZW50YXRpb24sIHRvTGluZWFyUmdiIH0gZnJvbSAiLi4vaGVscGVycy9jb2xvciI7CglpbXBvcnQgdHlwZSB7IEdsb2JlTWFya2VyLCBHbG9iZU1hcmtlclRvb2x0aXBDb250ZXh0IH0gZnJvbSAiLi90eXBlcyI7CglpbXBvcnQgR2xvYmVNYXJrZXJJdGVtIGZyb20gIi4vR2xvYmVNYXJrZXJJdGVtLnN2ZWx0ZSI7CgoJaW50ZXJmYWNlIEZyZXNuZWxDb25maWcgewoJCS8qKgoJCSAqIEJhc2UgYm9keSBjb2xvciBmb3IgdGhlIGdsb2JlIHN1cmZhY2UuCgkJICogQGRlZmF1bHQgIiMxMTExMTMiCgkJICovCgkJY29sb3I/OiBDb2xvclJlcHJlc2VudGF0aW9uOwoJCS8qKgoJCSAqIEFjY2VudCBjb2xvciBhcHBsaWVkIGJ5IHRoZSBGcmVzbmVsIHJpbS4KCQkgKiBAZGVmYXVsdCAiI0ZGNjkwMCIKCQkgKi8KCQlyaW1Db2xvcj86IENvbG9yUmVwcmVzZW50YXRpb247CgkJLyoqCgkJICogQ29udHJvbHMgaG93IHRpZ2h0IHRoZSBGcmVzbmVsIHJpbSBodWcgaXMuCgkJICogSGlnaGVyIHZhbHVlcyB5aWVsZCBhIHRoaW5uZXIgb3V0bGluZS4KCQkgKiBAZGVmYXVsdCA2CgkJICovCgkJcmltUG93ZXI/OiBudW1iZXI7CgkJLyoqCgkJICogSW50ZW5zaXR5IG11bHRpcGxpZXIgZm9yIHRoZSBGcmVzbmVsIHJpbSBjb2xvci4KCQkgKiBAZGVmYXVsdCAxLjUKCQkgKi8KCQlyaW1JbnRlbnNpdHk/OiBudW1iZXI7Cgl9CgoJaW50ZXJmYWNlIEF0bW9zcGhlcmVDb25maWcgewoJCS8qKgoJCSAqIENvbG9yIG9mIHRoZSBhdG1vc3BoZXJlIGdsb3cuCgkJICogQGRlZmF1bHQgIiNGRjY5MDAiCgkJICovCgkJY29sb3I/OiBDb2xvclJlcHJlc2VudGF0aW9uOwoJCS8qKgoJCSAqIFNpemUgb2YgdGhlIGF0bW9zcGhlcmUgcmVsYXRpdmUgdG8gdGhlIGdsb2JlIHJhZGl1cy4KCQkgKiBAZGVmYXVsdCAxLjEKCQkgKi8KCQlzY2FsZT86IG51bWJlcjsKCQkvKioKCQkgKiBGYWxsb2ZmIHBvd2VyIG9mIHRoZSBnbG93LiBIaWdoZXIgdmFsdWVzIG1lYW4gYSBzaGFycGVyIGVkZ2UuCgkJICogQGRlZmF1bHQgMTIuMAoJCSAqLwoJCXBvd2VyPzogbnVtYmVyOwoJCS8qKgoJCSAqIEJhc2UgY29lZmZpY2llbnQgZm9yIHRoZSBpbnRlbnNpdHkgY2FsY3VsYXRpb24uCgkJICogQ29udHJvbHMgaG93IGZhciB0aGUgZ2xvdyBleHRlbmRzIGlud2FyZHMuCgkJICogQGRlZmF1bHQgMC45CgkJICovCgkJY29lZmZpY2llbnQ/OiBudW1iZXI7CgkJLyoqCgkJICogR2xvYmFsIGludGVuc2l0eSBtdWx0aXBsaWVyLgoJCSAqIEBkZWZhdWx0IDIuMAoJCSAqLwoJCWludGVuc2l0eT86IG51bWJlcjsKCX0KCglpbnRlcmZhY2UgUHJvcHMgewoJCS8qKgoJCSAqIFJhZGl1cyBvZiB0aGUgc3BoZXJlLgoJCSAqIEBkZWZhdWx0IDIKCQkgKi8KCQlyYWRpdXM6IG51bWJlcjsKCQkvKioKCQkgKiBPcHRpb25hbCBvdmVycmlkZXMgZm9yIHRoZSBGcmVzbmVsIHNoYWRlciB1bmlmb3Jtcy4KCQkgKi8KCQlmcmVzbmVsQ29uZmlnPzogRnJlc25lbENvbmZpZzsKCQkvKioKCQkgKiBPcHRpb25hbCBjb25maWd1cmF0aW9uIGZvciB0aGUgYXRtb3NwaGVyaWMgaGFsby4KCQkgKi8KCQlhdG1vc3BoZXJlQ29uZmlnPzogQXRtb3NwaGVyZUNvbmZpZzsKCQkvKioKCQkgKiBOdW1iZXIgb2YgcG9pbnRzIHJlbmRlcmVkIGFsb25nIHRoZSBnbG9iZSBzdXJmYWNlLgoJCSAqIEBkZWZhdWx0IDE1MDAwCgkJICovCgkJcG9pbnRDb3VudD86IG51bWJlcjsKCQkvKioKCQkgKiBTaXplIG9mIGVhY2ggcG9pbnQgaW4gd29ybGQgdW5pdHMuCgkJICogQGRlZmF1bHQgMC4wNQoJCSAqLwoJCXBvaW50U2l6ZT86IG51bWJlcjsKCQkvKioKCQkgKiBDb2xvciBhcHBsaWVkIHRvIHBvaW50cyByZXByZXNlbnRpbmcgbGFuZC4KCQkgKiBAZGVmYXVsdCAiI2Y3NzExNCIKCQkgKi8KCQlsYW5kUG9pbnRDb2xvcj86IENvbG9yUmVwcmVzZW50YXRpb247CgkJLyoqCgkJICogV2hldGhlciB0aGUgZ2xvYmUgc2hvdWxkIGF1dG8tcm90YXRlLgoJCSAqIEBkZWZhdWx0IHRydWUKCQkgKi8KCQlhdXRvUm90YXRlPzogYm9vbGVhbjsKCQkvKioKCQkgKiBXaGV0aGVyIHRvIGxvY2sgdGhlIGNhbWVyYSdzIHBvbGFyIGFuZ2xlLgoJCSAqIEBkZWZhdWx0IHRydWUKCQkgKi8KCQlsb2NrZWRQb2xhckFuZ2xlPzogYm9vbGVhbjsKCQkvKioKCQkgKiBNYXJrZXJzIHRvIGRpc3BsYXkgb24gdGhlIGdsb2JlLgoJCSAqLwoJCW1hcmtlcnM/OiBHbG9iZU1hcmtlcltdOwoJCS8qKgoJCSAqIE9wdGlvbmFsIGN1c3RvbSB0b29sdGlwIHJlbmRlcmVyIGZvciBtYXJrZXJzLgoJCSAqLwoJCW1hcmtlclRvb2x0aXA/OiBTbmlwcGV0PFtHbG9iZU1hcmtlclRvb2x0aXBDb250ZXh0XT47CgkJLyoqCgkJICogQ29vcmRpbmF0ZXMgW2xhdCwgbG9uXSB0byBmb2N1cyBvbi4KCQkgKi8KCQlmb2N1c09uPzogW251bWJlciwgbnVtYmVyXSB8IG51bGw7Cgl9CgoJaW50ZXJmYWNlIFByb2plY3RlZE1hcmtlciB7CgkJbWFya2VyOiBHbG9iZU1hcmtlcjsKCQlpbmRleDogbnVtYmVyOwoJCXNjcmVlblg6IG51bWJlcjsKCQlzY3JlZW5ZOiBudW1iZXI7CgkJdmlzaWJpbGl0eTogbnVtYmVyOwoJCXNpemVQeDogbnVtYmVyOwoJfQoKCWludGVyZmFjZSBVbmlmb3JtVXBkYXRlclN0YXRlIHsKCQlyYWRpdXM6IG51bWJlcjsKCQlwb2ludENvdW50OiBudW1iZXI7CgkJcG9pbnRTaXplOiBudW1iZXI7CgkJbGFuZFBvaW50Q29sb3I6IENvbG9yUmVwcmVzZW50YXRpb247CgkJZnJlc25lbENvbmZpZzogUmVxdWlyZWQ8RnJlc25lbENvbmZpZz47CgkJYXRtb3NwaGVyZUNvbmZpZzogUmVxdWlyZWQ8QXRtb3NwaGVyZUNvbmZpZz47Cgl9CgoJY29uc3QgUEkgPSBNYXRoLlBJOwoJY29uc3QgREVHMlJBRCA9IFBJIC8gMTgwOwoJY29uc3QgRVBTSUxPTiA9IDFlLTY7Cgljb25zdCBDT0JFX0dMT0JFX1JBRElVUyA9IDAuODsKCWNvbnN0IE1BUktFUl9FTEVWQVRJT04gPSAwLjA1OwoJY29uc3QgQVVUT19ST1RBVEVfU1BFRUQgPSAoMiAqIFBJKSAvIDMwOwoJY29uc3QgUk9UQVRFX1NFTlNJVElWSVRZID0gMC4wMDU7Cgljb25zdCBTTU9PVEhJTkdfU1RSRU5HVEggPSAxNDsKCWNvbnN0IExPQ0tFRF9QT0xBUl9BTkdMRSA9IDEuNTsKCWNvbnN0IExPQ0tFRF9USEVUQSA9IE1hdGguYXNpbihNYXRoLmNvcyhMT0NLRURfUE9MQVJfQU5HTEUpKTsKCWNvbnN0IE1JTl9USEVUQSA9IC1QSSAqIDAuNSArIDAuMDAxOwoJY29uc3QgTUFYX1RIRVRBID0gUEkgKiAwLjUgLSAwLjAwMTsKCWNvbnN0IFZJU0lCSUxJVFlfTUlOX0RPVCA9IDAuMjQ7Cgljb25zdCBWSVNJQklMSVRZX01BWF9ET1QgPSAwLjQ4OwoKCWNvbnN0IGRlZmF1bHRGcmVzbmVsQ29uZmlnOiBSZXF1aXJlZDxGcmVzbmVsQ29uZmlnPiA9IHsKCQljb2xvcjogIiMxMTExMTMiLAoJCXJpbUNvbG9yOiAiI0ZGNjkwMCIsCgkJcmltUG93ZXI6IDYsCgkJcmltSW50ZW5zaXR5OiAxLjUsCgl9OwoKCWNvbnN0IGRlZmF1bHRBdG1vc3BoZXJlQ29uZmlnOiBSZXF1aXJlZDxBdG1vc3BoZXJlQ29uZmlnPiA9IHsKCQljb2xvcjogIiNGRjY5MDAiLAoJCXNjYWxlOiAxLjEsCgkJcG93ZXI6IDEyLjAsCgkJY29lZmZpY2llbnQ6IDAuOSwKCQlpbnRlbnNpdHk6IDIuMCwKCX07CgoJbGV0IHsKCQlyYWRpdXMsCgkJZnJlc25lbENvbmZpZyA9IHt9LAoJCWF0bW9zcGhlcmVDb25maWcgPSB7fSwKCQlwb2ludENvdW50ID0gMTUwMDAsCgkJcG9pbnRTaXplID0gMC4wNSwKCQlsYW5kUG9pbnRDb2xvciA9ICIjZjc3MTE0IiwKCQlhdXRvUm90YXRlID0gdHJ1ZSwKCQlsb2NrZWRQb2xhckFuZ2xlID0gdHJ1ZSwKCQltYXJrZXJzID0gW10sCgkJbWFya2VyVG9vbHRpcCwKCQlmb2N1c09uID0gbnVsbCwKCX06IFByb3BzID0gJHByb3BzKCk7CgoJbGV0IGNhbnZhcyA9ICRzdGF0ZTxIVE1MQ2FudmFzRWxlbWVudD4oKTsKCWxldCBwcm9qZWN0ZWRNYXJrZXJzID0gJHN0YXRlPFByb2plY3RlZE1hcmtlcltdPihbXSk7CgoJY29uc3QgcmVzb2x2ZWRGcmVzbmVsQ29uZmlnID0gJGRlcml2ZWQoewoJCS4uLmRlZmF1bHRGcmVzbmVsQ29uZmlnLAoJCS4uLmZyZXNuZWxDb25maWcsCgl9KTsKCWNvbnN0IHJlc29sdmVkQXRtb3NwaGVyZUNvbmZpZyA9ICRkZXJpdmVkKHsKCQkuLi5kZWZhdWx0QXRtb3NwaGVyZUNvbmZpZywKCQkuLi5hdG1vc3BoZXJlQ29uZmlnLAoJfSk7CgoJbGV0IHVwZGF0ZVVuaWZvcm1zID0gJHN0YXRlPCgoc3RhdGU6IFVuaWZvcm1VcGRhdGVyU3RhdGUpID0+IHZvaWQpIHwgbnVsbD4oCgkJbnVsbCwKCSk7CglsZXQgc3luY0ZvY3VzVGFyZ2V0ID0gJHN0YXRlPAoJCSgodGFyZ2V0OiBbbnVtYmVyLCBudW1iZXJdIHwgbnVsbCkgPT4gdm9pZCkgfCBudWxsCgk+KG51bGwpOwoJbGV0IGZvY3VzVHdlZW46IGdzYXAuY29yZS5Ud2VlbiB8IG51bGwgPSBudWxsOwoKCWNvbnN0IGNsYW1wID0gKHZhbHVlOiBudW1iZXIsIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcikgPT4KCQlNYXRoLm1pbihtYXgsIE1hdGgubWF4KG1pbiwgdmFsdWUpKTsKCgljb25zdCBjbGFtcFRoZXRhID0gKHZhbHVlOiBudW1iZXIsIGxvY2tQb2xhcjogYm9vbGVhbikgPT4KCQlsb2NrUG9sYXIgPyBMT0NLRURfVEhFVEEgOiBjbGFtcCh2YWx1ZSwgTUlOX1RIRVRBLCBNQVhfVEhFVEEpOwoKCWNvbnN0IHNtb290aHN0ZXAgPSAodmFsdWU6IG51bWJlciwgZWRnZTA6IG51bWJlciwgZWRnZTE6IG51bWJlcikgPT4gewoJCWlmIChNYXRoLmFicyhlZGdlMSAtIGVkZ2UwKSA8PSBFUFNJTE9OKSB7CgkJCXJldHVybiB2YWx1ZSA+PSBlZGdlMSA/IDEgOiAwOwoJCX0KCQljb25zdCB0ID0gY2xhbXAoKHZhbHVlIC0gZWRnZTApIC8gKGVkZ2UxIC0gZWRnZTApLCAwLCAxKTsKCQlyZXR1cm4gdCAqIHQgKiAoMyAtIDIgKiB0KTsKCX07CgoJY29uc3QgdG9TY2FsZSA9IChuZXh0UmFkaXVzOiBudW1iZXIpID0+IE1hdGgubWF4KDAuMDAxLCBuZXh0UmFkaXVzIC8gMik7Cgljb25zdCB0b1BvaW50UmFkaXVzID0gKG5leHRQb2ludFNpemU6IG51bWJlcikgPT4KCQlNYXRoLm1heCgwLjAwMSwgbmV4dFBvaW50U2l6ZSAqIDAuMTYpOwoKCWZ1bmN0aW9uIG5vcm1hbGl6ZUFuZ2xlKHZhbHVlOiBudW1iZXIpOiBudW1iZXIgewoJCWNvbnN0IHdyYXBwZWQgPSAoKCh2YWx1ZSArIFBJKSAlICgyICogUEkpKSArIDIgKiBQSSkgJSAoMiAqIFBJKTsKCQlyZXR1cm4gd3JhcHBlZCAtIFBJOwoJfQoKCWZ1bmN0aW9uIHNob3J0ZXN0QW5nbGVUYXJnZXQoY3VycmVudDogbnVtYmVyLCBuZXh0OiBudW1iZXIpOiBudW1iZXIgewoJCWNvbnN0IGRlbHRhID0gbm9ybWFsaXplQW5nbGUobmV4dCAtIGN1cnJlbnQpOwoJCXJldHVybiBjdXJyZW50ICsgZGVsdGE7Cgl9CgoJZnVuY3Rpb24gbG9uTGF0VG9DYXJ0ZXNpYW4obG9uOiBudW1iZXIsIGxhdDogbnVtYmVyLCByOiBudW1iZXIpIHsKCQljb25zdCBsb25SYWQgPSBsb24gKiBERUcyUkFEOwoJCWNvbnN0IGxhdFJhZCA9IGxhdCAqIERFRzJSQUQ7CgoJCWNvbnN0IHkgPSByICogTWF0aC5zaW4obGF0UmFkKTsKCQljb25zdCByWFogPSByICogTWF0aC5jb3MobGF0UmFkKTsKCQljb25zdCB4ID0gclhaICogTWF0aC5zaW4obG9uUmFkKTsKCQljb25zdCB6ID0gclhaICogTWF0aC5jb3MobG9uUmFkKTsKCgkJcmV0dXJuIHsgeCwgeSwgeiB9OwoJfQoKCWZ1bmN0aW9uIGNhcnRlc2lhblRvUm90YXRpb24oeDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcikgewoJCWNvbnN0IGxlbmd0aCA9IE1hdGguaHlwb3QoeCwgeSwgeik7CgkJaWYgKGxlbmd0aCA8PSBFUFNJTE9OKSB7CgkJCXJldHVybiB7IHBoaTogMCwgdGhldGE6IDAgfTsKCQl9CgkJY29uc3QgbnggPSB4IC8gbGVuZ3RoOwoJCWNvbnN0IG55ID0geSAvIGxlbmd0aDsKCQljb25zdCBueiA9IHogLyBsZW5ndGg7CgoJCXJldHVybiB7CgkJCXBoaTogTWF0aC5hdGFuMigtbngsIG56KSwKCQkJdGhldGE6IE1hdGguYXNpbihjbGFtcChueSwgLTEsIDEpKSwKCQl9OwoJfQoKCWZ1bmN0aW9uIGFwcGx5Um90YXRpb24oCgkJeDogbnVtYmVyLAoJCXk6IG51bWJlciwKCQl6OiBudW1iZXIsCgkJcGhpOiBudW1iZXIsCgkJdGhldGE6IG51bWJlciwKCSkgewoJCWNvbnN0IGN4ID0gTWF0aC5jb3ModGhldGEpOwoJCWNvbnN0IGN5ID0gTWF0aC5jb3MocGhpKTsKCQljb25zdCBzeCA9IE1hdGguc2luKHRoZXRhKTsKCQljb25zdCBzeSA9IE1hdGguc2luKHBoaSk7CgoJCXJldHVybiB7CgkJCXJ4OiBjeSAqIHggKyBzeSAqIHosCgkJCXJ5OiBzeSAqIHN4ICogeCArIGN4ICogeSAtIGN5ICogc3ggKiB6LAoJCQlyejogLXN5ICogY3ggKiB4ICsgc3ggKiB5ICsgY3kgKiBjeCAqIHosCgkJfTsKCX0KCglmdW5jdGlvbiBjdWJpY0JlemllckF0KAoJCXQ6IG51bWJlciwKCQlwMDogbnVtYmVyLAoJCXAxOiBudW1iZXIsCgkJcDI6IG51bWJlciwKCQlwMzogbnVtYmVyLAoJKTogbnVtYmVyIHsKCQljb25zdCB1ID0gMSAtIHQ7CgkJcmV0dXJuICgKCQkJdSAqIHUgKiB1ICogcDAgKyAzICogdSAqIHUgKiB0ICogcDEgKyAzICogdSAqIHQgKiB0ICogcDIgKyB0ICogdCAqIHQgKiBwMwoJCSk7Cgl9CgoJZnVuY3Rpb24gY3ViaWNCZXppZXJEZXJpdmF0aXZlQXQoCgkJdDogbnVtYmVyLAoJCXAwOiBudW1iZXIsCgkJcDE6IG51bWJlciwKCQlwMjogbnVtYmVyLAoJCXAzOiBudW1iZXIsCgkpOiBudW1iZXIgewoJCWNvbnN0IHUgPSAxIC0gdDsKCQlyZXR1cm4gKAoJCQkzICogdSAqIHUgKiAocDEgLSBwMCkgKyA2ICogdSAqIHQgKiAocDIgLSBwMSkgKyAzICogdCAqIHQgKiAocDMgLSBwMikKCQkpOwoJfQoKCWZ1bmN0aW9uIGR5bmFtaWNFYXNlKHZhbHVlOiBudW1iZXIpOiBudW1iZXIgewoJCWNvbnN0IGNsYW1wZWQgPSBjbGFtcCh2YWx1ZSwgMCwgMSk7CgkJbGV0IHQgPSBjbGFtcGVkOwoJCWZvciAobGV0IGkgPSAwOyBpIDwgNTsgaSsrKSB7CgkJCWNvbnN0IHggPSBjdWJpY0JlemllckF0KHQsIDAsIDAuNjI1LCAwLCAxKTsKCQkJY29uc3QgZHggPSBjdWJpY0JlemllckRlcml2YXRpdmVBdCh0LCAwLCAwLjYyNSwgMCwgMSk7CgkJCWlmIChNYXRoLmFicyhkeCkgPCAxZS02KSBicmVhazsKCQkJdCA9IGNsYW1wKHQgLSAoeCAtIGNsYW1wZWQpIC8gZHgsIDAsIDEpOwoJCX0KCQlyZXR1cm4gY3ViaWNCZXppZXJBdCh0LCAwLCAwLjA1LCAxLCAxKTsKCX0KCgkkZWZmZWN0KCgpID0+IHsKCQlpZiAoIXVwZGF0ZVVuaWZvcm1zKSByZXR1cm47CgkJdXBkYXRlVW5pZm9ybXMoewoJCQlyYWRpdXMsCgkJCXBvaW50Q291bnQsCgkJCXBvaW50U2l6ZSwKCQkJbGFuZFBvaW50Q29sb3IsCgkJCWZyZXNuZWxDb25maWc6IHJlc29sdmVkRnJlc25lbENvbmZpZywKCQkJYXRtb3NwaGVyZUNvbmZpZzogcmVzb2x2ZWRBdG1vc3BoZXJlQ29uZmlnLAoJCX0pOwoJfSk7CgoJJGVmZmVjdCgoKSA9PiB7CgkJaWYgKCFzeW5jRm9jdXNUYXJnZXQpIHJldHVybjsKCQlzeW5jRm9jdXNUYXJnZXQoZm9jdXNPbik7Cgl9KTsKCglvbk1vdW50KCgpID0+IHsKCQljb25zdCB0YXJnZXRDYW52YXMgPSBjYW52YXM7CgkJaWYgKCF0YXJnZXRDYW52YXMpIHJldHVybjsKCgkJY29uc3QgcmVuZGVyZXIgPSBuZXcgUmVuZGVyZXIoewoJCQljYW52YXM6IHRhcmdldENhbnZhcywKCQkJYWxwaGE6IHRydWUsCgkJCWFudGlhbGlhczogdHJ1ZSwKCQkJZHByOiB0eXBlb2Ygd2luZG93ICE9PSAidW5kZWZpbmVkIiA/IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIDogMSwKCQl9KTsKCQljb25zdCBnbCA9IHJlbmRlcmVyLmdsOwoJCWdsLmNsZWFyQ29sb3IoMCwgMCwgMCwgMCk7CgoJCWNvbnN0IGNhbWVyYSA9IG5ldyBDYW1lcmEoZ2wpOwoJCWNhbWVyYS5wb3NpdGlvbi56ID0gMTsKCgkJY29uc3Qgc2NlbmUgPSBuZXcgVHJhbnNmb3JtKCk7CgkJY29uc3QgZ2VvbWV0cnkgPSBuZXcgVHJpYW5nbGUoZ2wpOwoJCWNvbnN0IGxhbmRUZXh0dXJlID0gbmV3IFRleHR1cmUoZ2wsIHsKCQkJaW1hZ2U6IG5ldyBVaW50OEFycmF5KFswLCAwLCAwLCAyNTVdKSwKCQkJd2lkdGg6IDEsCgkJCWhlaWdodDogMSwKCQkJZm9ybWF0OiBnbC5SR0JBLAoJCQl0eXBlOiBnbC5VTlNJR05FRF9CWVRFLAoJCQltaW5GaWx0ZXI6IGdsLk5FQVJFU1QsCgkJCW1hZ0ZpbHRlcjogZ2wuTkVBUkVTVCwKCQkJZ2VuZXJhdGVNaXBtYXBzOiBmYWxzZSwKCQkJd3JhcFM6IGdsLlJFUEVBVCwKCQkJd3JhcFQ6IGdsLlJFUEVBVCwKCQl9KTsKCgkJY29uc3QgdW5pZm9ybXMgPSB7CgkJCXVSZXNvbHV0aW9uOiB7IHZhbHVlOiBuZXcgVmVjMigxLCAxKSB9LAoJCQl1Um90YXRpb246IHsgdmFsdWU6IG5ldyBWZWMyKDAsIGNsYW1wVGhldGEoMCwgbG9ja2VkUG9sYXJBbmdsZSkpIH0sCgkJCXVTY2FsZTogeyB2YWx1ZTogdG9TY2FsZShyYWRpdXMpIH0sCgkJCXVEb3RzOiB7IHZhbHVlOiBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHBvaW50Q291bnQpKSB9LAoJCQl1UG9pbnRSYWRpdXM6IHsgdmFsdWU6IHRvUG9pbnRSYWRpdXMocG9pbnRTaXplKSB9LAoJCQl1QmFzZUNvbG9yOiB7IHZhbHVlOiBuZXcgVmVjMygwLCAwLCAwKSB9LAoJCQl1UmltQ29sb3I6IHsgdmFsdWU6IG5ldyBWZWMzKDAsIDAsIDApIH0sCgkJCXVSaW1Qb3dlcjogeyB2YWx1ZTogcmVzb2x2ZWRGcmVzbmVsQ29uZmlnLnJpbVBvd2VyIH0sCgkJCXVSaW1JbnRlbnNpdHk6IHsgdmFsdWU6IHJlc29sdmVkRnJlc25lbENvbmZpZy5yaW1JbnRlbnNpdHkgfSwKCQkJdUF0bW9zcGhlcmVDb2xvcjogeyB2YWx1ZTogbmV3IFZlYzMoMCwgMCwgMCkgfSwKCQkJdUF0bW9zcGhlcmVTY2FsZTogeyB2YWx1ZTogcmVzb2x2ZWRBdG1vc3BoZXJlQ29uZmlnLnNjYWxlIH0sCgkJCXVBdG1vc3BoZXJlUG93ZXI6IHsgdmFsdWU6IHJlc29sdmVkQXRtb3NwaGVyZUNvbmZpZy5wb3dlciB9LAoJCQl1QXRtb3NwaGVyZUNvZWZmaWNpZW50OiB7IHZhbHVlOiByZXNvbHZlZEF0bW9zcGhlcmVDb25maWcuY29lZmZpY2llbnQgfSwKCQkJdUF0bW9zcGhlcmVJbnRlbnNpdHk6IHsgdmFsdWU6IHJlc29sdmVkQXRtb3NwaGVyZUNvbmZpZy5pbnRlbnNpdHkgfSwKCQkJdUxhbmRQb2ludENvbG9yOiB7IHZhbHVlOiBuZXcgVmVjMygwLCAwLCAwKSB9LAoJCQl1TGFuZFRleHR1cmU6IHsgdmFsdWU6IGxhbmRUZXh0dXJlIH0sCgkJfTsKCgkJY29uc3QgdmVydGV4U2hhZGVyID0gYAoJCQlhdHRyaWJ1dGUgdmVjMiB1djsKCQkJYXR0cmlidXRlIHZlYzIgcG9zaXRpb247CgkJCXZhcnlpbmcgdmVjMiB2VXY7CgoJCQl2b2lkIG1haW4oKSB7CgkJCQl2VXYgPSB1djsKCQkJCWdsX1Bvc2l0aW9uID0gdmVjNChwb3NpdGlvbiwgMC4wLCAxLjApOwoJCQl9CgkJYDsKCgkJY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBgCgkJCXByZWNpc2lvbiBoaWdocCBmbG9hdDsKCgkJCXZhcnlpbmcgdmVjMiB2VXY7CgoJCQl1bmlmb3JtIHZlYzIgdVJlc29sdXRpb247CgkJCXVuaWZvcm0gdmVjMiB1Um90YXRpb247CgkJCXVuaWZvcm0gZmxvYXQgdVNjYWxlOwoJCQl1bmlmb3JtIGZsb2F0IHVEb3RzOwoJCQl1bmlmb3JtIGZsb2F0IHVQb2ludFJhZGl1czsKCQkJdW5pZm9ybSB2ZWMzIHVCYXNlQ29sb3I7CgkJCXVuaWZvcm0gdmVjMyB1UmltQ29sb3I7CgkJCXVuaWZvcm0gZmxvYXQgdVJpbVBvd2VyOwoJCQl1bmlmb3JtIGZsb2F0IHVSaW1JbnRlbnNpdHk7CgkJCXVuaWZvcm0gdmVjMyB1QXRtb3NwaGVyZUNvbG9yOwoJCQl1bmlmb3JtIGZsb2F0IHVBdG1vc3BoZXJlU2NhbGU7CgkJCXVuaWZvcm0gZmxvYXQgdUF0bW9zcGhlcmVQb3dlcjsKCQkJdW5pZm9ybSBmbG9hdCB1QXRtb3NwaGVyZUNvZWZmaWNpZW50OwoJCQl1bmlmb3JtIGZsb2F0IHVBdG1vc3BoZXJlSW50ZW5zaXR5OwoJCQl1bmlmb3JtIHZlYzMgdUxhbmRQb2ludENvbG9yOwoJCQl1bmlmb3JtIHNhbXBsZXIyRCB1TGFuZFRleHR1cmU7CgoJCQljb25zdCBmbG9hdCBrUGkgPSAzLjE0MTU5MjY1MzU4OTc5MzsKCQkJY29uc3QgZmxvYXQga1RhdSA9IDYuMjgzMTg1MzA3MTc5NTg2OwoJCQljb25zdCBmbG9hdCBrUGhpID0gMS42MTgwMzM5ODg3NDk4OTU7CgkJCWNvbnN0IGZsb2F0IGtTcXJ0NSA9IDIuMjM2MDY3OTc3NDk5Nzk7CgkJCWNvbnN0IGZsb2F0IGtTcGhlcmVSYWRpdXMgPSAwLjg7CgoJCQlmbG9hdCBieURvdHM7CgoJCQltYXQzIHJvdGF0ZShmbG9hdCB0aGV0YSwgZmxvYXQgcGhpKSB7CgkJCQlmbG9hdCBjeCA9IGNvcyh0aGV0YSk7CgkJCQlmbG9hdCBjeSA9IGNvcyhwaGkpOwoJCQkJZmxvYXQgc3ggPSBzaW4odGhldGEpOwoJCQkJZmxvYXQgc3kgPSBzaW4ocGhpKTsKCQkJCXJldHVybiBtYXQzKAoJCQkJCWN5LCBzeSAqIHN4LCAtc3kgKiBjeCwKCQkJCQkwLjAsIGN4LCBzeCwKCQkJCQlzeSwgY3kgKiAtc3gsIGN5ICogY3gKCQkJCSk7CgkJCX0KCgkJCXZlYzMgbmVhcmVzdEZpYm9uYWNjaUxhdHRpY2UodmVjMyBwLCBvdXQgZmxvYXQgbSkgewoJCQkJcCA9IHAueHp5OwoKCQkJCWZsb2F0IGsgPSBtYXgoMi4wLCBmbG9vcihsb2cyKGtTcXJ0NSAqIHVEb3RzICoga1BpICogKDEuMCAtIHAueiAqIHAueikpICogMC43MjAyMSkpOwoJCQkJdmVjMiBmID0gZmxvb3IocG93KGtQaGksIGspIC8ga1NxcnQ1ICogdmVjMigxLjAsIGtQaGkpICsgMC41KTsKCQkJCXZlYzIgYnIxID0gZnJhY3QoKGYgKyAxLjApICogKGtQaGkgLSAxLjApKSAqIGtUYXUgLSAzLjg4MzIyMjsKCQkJCXZlYzIgYnIyID0gLTIuMCAqIGY7CgkJCQl2ZWMyIHNwID0gdmVjMihhdGFuKHAueSwgcC54KSwgcC56IC0gMS4wKTsKCQkJCXZlYzIgYyA9IGZsb29yKHZlYzIoCgkJCQkJYnIyLnkgKiBzcC54IC0gYnIxLnkgKiAoc3AueSAqIHVEb3RzICsgMS4wKSwKCQkJCQktYnIyLnggKiBzcC54ICsgYnIxLnggKiAoc3AueSAqIHVEb3RzICsgMS4wKQoJCQkJKSAvIChicjEueCAqIGJyMi55IC0gYnIyLnggKiBicjEueSkpOwoKCQkJCWZsb2F0IG1pbmRpc3QgPSBrUGk7CgkJCQl2ZWMzIG1pbmlwID0gdmVjMygwLjAsIDAuMCwgMS4wKTsKCgkJCQlmb3IgKGZsb2F0IHMgPSAwLjA7IHMgPCA0LjA7IHMgKz0gMS4wKSB7CgkJCQkJdmVjMiBvID0gdmVjMihtb2QocywgMi4wKSwgZmxvb3IocyAqIDAuNSkpOwoJCQkJCWZsb2F0IGlkeCA9IGRvdChmLCBjICsgbyk7CgkJCQkJaWYgKGlkeCA+IHVEb3RzKSBjb250aW51ZTsKCgkJCQkJZmxvYXQgYSA9IGlkeDsKCQkJCQlmbG9hdCBiID0gMC4wOwoJCQkJCWlmIChhID49IDE2Mzg0LjApIGEgLT0gMTYzODQuMCwgYiArPSAwLjg2ODg3MjsKCQkJCQlpZiAoYSA+PSA4MTkyLjApIGEgLT0gODE5Mi4wLCBiICs9IDAuOTM0NDM2OwoJCQkJCWlmIChhID49IDQwOTYuMCkgYSAtPSA0MDk2LjAsIGIgKz0gMC40NjcyMTg7CgkJCQkJaWYgKGEgPj0gMjA0OC4wKSBhIC09IDIwNDguMCwgYiArPSAwLjczMzYwOTsKCQkJCQlpZiAoYSA+PSAxMDI0LjApIGEgLT0gMTAyNC4wLCBiICs9IDAuODY2ODA0OwoJCQkJCWlmIChhID49IDUxMi4wKSBhIC09IDUxMi4wLCBiICs9IDAuNDMzNDAyOwoJCQkJCWlmIChhID49IDI1Ni4wKSBhIC09IDI1Ni4wLCBiICs9IDAuMjE2NzAxOwoJCQkJCWlmIChhID49IDEyOC4wKSBhIC09IDEyOC4wLCBiICs9IDAuMTA4MzUxOwoJCQkJCWlmIChhID49IDY0LjApIGEgLT0gNjQuMCwgYiArPSAwLjU1NDE3NTsKCQkJCQlpZiAoYSA+PSAzMi4wKSBhIC09IDMyLjAsIGIgKz0gMC43NzcwODg7CgkJCQkJaWYgKGEgPj0gMTYuMCkgYSAtPSAxNi4wLCBiICs9IDAuODg4NTQ0OwoJCQkJCWlmIChhID49IDguMCkgYSAtPSA4LjAsIGIgKz0gMC45NDQyNzI7CgkJCQkJaWYgKGEgPj0gNC4wKSBhIC09IDQuMCwgYiArPSAwLjQ3MjEzNjsKCQkJCQlpZiAoYSA+PSAyLjApIGEgLT0gMi4wLCBiICs9IDAuMjM2MDY4OwoJCQkJCWlmIChhID49IDEuMCkgYSAtPSAxLjAsIGIgKz0gMC42MTgwMzQ7CgoJCQkJCWZsb2F0IHRoZXRhID0gZnJhY3QoYikgKiBrVGF1OwoJCQkJCWZsb2F0IGNvc3BoaSA9IDEuMCAtIDIuMCAqIGlkeCAqIGJ5RG90czsKCQkJCQlmbG9hdCBzaW5waGkgPSBzcXJ0KG1heCgwLjAsIDEuMCAtIGNvc3BoaSAqIGNvc3BoaSkpOwoJCQkJCXZlYzMgc2FtcGxlUG9pbnQgPSB2ZWMzKGNvcyh0aGV0YSkgKiBzaW5waGksIHNpbih0aGV0YSkgKiBzaW5waGksIGNvc3BoaSk7CgoJCQkJCWZsb2F0IGRpc3QgPSBsZW5ndGgocCAtIHNhbXBsZVBvaW50KTsKCQkJCQlpZiAoZGlzdCA8IG1pbmRpc3QpIHsKCQkJCQkJbWluZGlzdCA9IGRpc3Q7CgkJCQkJCW1pbmlwID0gc2FtcGxlUG9pbnQ7CgkJCQkJfQoJCQkJfQoKCQkJCW0gPSBtaW5kaXN0OwoJCQkJcmV0dXJuIG1pbmlwLnh6eTsKCQkJfQoKCQkJdmVjMiBwb2ludFRvTWFza1VWKHZlYzMgcCkgewoJCQkJZmxvYXQgbGVuZ3RoUCA9IGxlbmd0aChwKTsKCQkJCWlmIChsZW5ndGhQIDw9IDAuMCkgewoJCQkJCXJldHVybiB2ZWMyKDAuMCwgMC4wKTsKCQkJCX0KCgkJCQl2ZWMzIG4gPSBwIC8gbGVuZ3RoUDsKCgkJCQlmbG9hdCBueCA9IG4uejsKCQkJCWZsb2F0IG55ID0gbi55OwoJCQkJZmxvYXQgbnogPSAtbi54OwoKCQkJCWZsb2F0IGdQaGkgPSBhc2luKGNsYW1wKG55LCAtMS4wLCAxLjApKTsKCQkJCWZsb2F0IGNvc1BoaSA9IGNvcyhnUGhpKTsKCgkJCQlmbG9hdCBnVGhldGEgPSAwLjA7CgkJCQlpZiAoYWJzKGNvc1BoaSkgPiAxZS02KSB7CgkJCQkJZmxvYXQgdGhldGFJbnB1dCA9IGNsYW1wKC1ueCAvIGNvc1BoaSwgLTEuMCwgMS4wKTsKCQkJCQlnVGhldGEgPSBhY29zKHRoZXRhSW5wdXQpOwoJCQkJCWlmIChueiA8IDAuMCkgewoJCQkJCQlnVGhldGEgPSAtZ1RoZXRhOwoJCQkJCX0KCQkJCX0KCgkJCQlyZXR1cm4gdmVjMigKCQkJCQlmcmFjdCgoZ1RoZXRhICogMC41KSAvIGtQaSksCgkJCQkJZnJhY3QoLShnUGhpIC8ga1BpICsgMC41KSkKCQkJCSk7CgkJCX0KCgkJCXZlYzMgbGluZWFyVG9TcmdiKHZlYzMgY29sb3IpIHsKCQkJCXZlYzMgc2FmZSA9IG1heChjb2xvciwgdmVjMygwLjApKTsKCQkJCXZlYzMgbG93ID0gc2FmZSAqIDEyLjkyOwoJCQkJdmVjMyBoaWdoID0gMS4wNTUgKiBwb3coc2FmZSwgdmVjMygxLjAgLyAyLjQpKSAtIDAuMDU1OwoJCQkJdmVjMyBjdXRvZmYgPSBzdGVwKHZlYzMoMC4wMDMxMzA4KSwgc2FmZSk7CgkJCQlyZXR1cm4gbWl4KGxvdywgaGlnaCwgY3V0b2ZmKTsKCQkJfQoKCQkJdm9pZCBtYWluKCkgewoJCQkJYnlEb3RzID0gMS4wIC8gbWF4KDEuMCwgdURvdHMpOwoKCQkJCXZlYzIgdXYgPSB2VXYgKiAyLjAgLSAxLjA7CgkJCQl1di54ICo9IHVSZXNvbHV0aW9uLnggLyBtYXgoMS4wLCB1UmVzb2x1dGlvbi55KTsKCQkJCXV2IC89IG1heCgwLjAwMDEsIHVTY2FsZSk7CgoJCQkJZmxvYXQgbCA9IGRvdCh1diwgdXYpOwoJCQkJZmxvYXQgZ2xvYmVSMiA9IGtTcGhlcmVSYWRpdXMgKiBrU3BoZXJlUmFkaXVzOwoJCQkJZmxvYXQgYXRtb3NwaGVyZVIgPSBrU3BoZXJlUmFkaXVzICogbWF4KDEuMCwgdUF0bW9zcGhlcmVTY2FsZSk7CgkJCQlmbG9hdCBhdG1vc3BoZXJlUjIgPSBhdG1vc3BoZXJlUiAqIGF0bW9zcGhlcmVSOwoKCQkJCXZlYzMgY29sb3IgPSB2ZWMzKDAuMCk7CgkJCQlmbG9hdCBhbHBoYSA9IDAuMDsKCgkJCQlpZiAobCA8PSBhdG1vc3BoZXJlUjIgJiYgbCA+IGdsb2JlUjIpIHsKCQkJCQlmbG9hdCBkID0gKHNxcnQobCkgLSBrU3BoZXJlUmFkaXVzKSAvIG1heCgxZS01LCBhdG1vc3BoZXJlUiAtIGtTcGhlcmVSYWRpdXMpOwoJCQkJCWZsb2F0IG91dGVyR2xvdyA9IHBvdyhjbGFtcCgxLjAgLSBkLCAwLjAsIDEuMCksIHVBdG1vc3BoZXJlUG93ZXIpICogdUF0bW9zcGhlcmVJbnRlbnNpdHk7CgkJCQkJY29sb3IgKz0gdUF0bW9zcGhlcmVDb2xvciAqIG91dGVyR2xvdzsKCQkJCQlhbHBoYSA9IG1heChhbHBoYSwgb3V0ZXJHbG93KTsKCQkJCX0KCgkJCQlpZiAobCA8PSBnbG9iZVIyKSB7CgkJCQkJZmxvYXQgZGlzOwoJCQkJCXZlYzMgcCA9IG5vcm1hbGl6ZSh2ZWMzKHV2LCBzcXJ0KG1heCgwLjAsIGdsb2JlUjIgLSBsKSkpKTsKCQkJCQltYXQzIHJvdCA9IHJvdGF0ZSh1Um90YXRpb24ueSwgdVJvdGF0aW9uLngpOwoJCQkJCXZlYzMgc2FtcGxlUG9pbnQgPSBuZWFyZXN0Rmlib25hY2NpTGF0dGljZShwICogcm90LCBkaXMpOwoJCQkJCXZlYzIgbWFwVXYgPSBwb2ludFRvTWFza1VWKHNhbXBsZVBvaW50KTsKCQkJCQlmbG9hdCBsYW5kID0gdGV4dHVyZTJEKHVMYW5kVGV4dHVyZSwgbWFwVXYpLnI7CgoJCQkJCWZsb2F0IGxhbmREb3RzID0gc3RlcCgwLjUsIGxhbmQpICogc21vb3Roc3RlcCh1UG9pbnRSYWRpdXMsIDAuMCwgZGlzKTsKCgkJCQkJZmxvYXQgZG90TlYgPSBjbGFtcChwLnogLyBrU3BoZXJlUmFkaXVzLCAwLjAsIDEuMCk7CgkJCQkJZmxvYXQgcmltID0gcG93KDEuMCAtIGRvdE5WLCBtYXgoMC4wMDAxLCB1UmltUG93ZXIpKSAqIHVSaW1JbnRlbnNpdHk7CgkJCQkJZmxvYXQgaW5uZXJBdG1vc3BoZXJlID0gcG93KG1heCgwLjAsIHVBdG1vc3BoZXJlQ29lZmZpY2llbnQgLSBkb3ROViksIHVBdG1vc3BoZXJlUG93ZXIpICogdUF0bW9zcGhlcmVJbnRlbnNpdHk7CgoJCQkJCXZlYzMgc3VyZmFjZSA9IHVCYXNlQ29sb3I7CgkJCQkJc3VyZmFjZSArPSB1UmltQ29sb3IgKiByaW07CgkJCQkJc3VyZmFjZSArPSB1QXRtb3NwaGVyZUNvbG9yICogaW5uZXJBdG1vc3BoZXJlOwoJCQkJCXN1cmZhY2UgKz0gdUxhbmRQb2ludENvbG9yICogbGFuZERvdHM7CgoJCQkJCWNvbG9yICs9IHN1cmZhY2U7CgkJCQkJYWxwaGEgPSAxLjA7CgkJCQl9CgoJCQkJZ2xfRnJhZ0NvbG9yID0gdmVjNChsaW5lYXJUb1NyZ2IoY29sb3IpLCBjbGFtcChhbHBoYSwgMC4wLCAxLjApKTsKCQkJfQoJCWA7CgoJCWNvbnN0IHByb2dyYW0gPSBuZXcgUHJvZ3JhbShnbCwgewoJCQl2ZXJ0ZXg6IHZlcnRleFNoYWRlciwKCQkJZnJhZ21lbnQ6IGZyYWdtZW50U2hhZGVyLAoJCQl1bmlmb3JtcywKCQkJdHJhbnNwYXJlbnQ6IHRydWUsCgkJCWRlcHRoVGVzdDogZmFsc2UsCgkJCWRlcHRoV3JpdGU6IGZhbHNlLAoJCX0pOwoKCQljb25zdCBtZXNoID0gbmV3IE1lc2goZ2wsIHsKCQkJZ2VvbWV0cnksCgkJCXByb2dyYW0sCgkJCWZydXN0dW1DdWxsZWQ6IGZhbHNlLAoJCX0pOwoJCW1lc2guc2V0UGFyZW50KHNjZW5lKTsKCgkJbGV0IGN1cnJlbnRTY2FsZSA9IHRvU2NhbGUocmFkaXVzKTsKCQljb25zdCB0ZW1wQ29sb3IgPSBuZXcgVmVjMygpOwoJCWNvbnN0IHNldENvbG9yID0gKAoJCQl0YXJnZXQ6IFZlYzMsCgkJCXZhbHVlOiBDb2xvclJlcHJlc2VudGF0aW9uLAoJCQlmYWxsYmFjazogW251bWJlciwgbnVtYmVyLCBudW1iZXJdLAoJCSkgPT4gewoJCQljb25zdCBbciwgZywgYl0gPSB0b0xpbmVhclJnYih2YWx1ZSwgZmFsbGJhY2spOwoJCQl0YXJnZXQuc2V0KHIsIGcsIGIpOwoJCX07CgoJCXVwZGF0ZVVuaWZvcm1zID0gKHN0YXRlKSA9PiB7CgkJCWN1cnJlbnRTY2FsZSA9IHRvU2NhbGUoc3RhdGUucmFkaXVzKTsKCQkJdW5pZm9ybXMudVNjYWxlLnZhbHVlID0gY3VycmVudFNjYWxlOwoJCQl1bmlmb3Jtcy51RG90cy52YWx1ZSA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3Ioc3RhdGUucG9pbnRDb3VudCkpOwoJCQl1bmlmb3Jtcy51UG9pbnRSYWRpdXMudmFsdWUgPSB0b1BvaW50UmFkaXVzKHN0YXRlLnBvaW50U2l6ZSk7CgoJCQlzZXRDb2xvcih1bmlmb3Jtcy51QmFzZUNvbG9yLnZhbHVlLCBzdGF0ZS5mcmVzbmVsQ29uZmlnLmNvbG9yLCBbCgkJCQkxNyAvIDI1NSwKCQkJCTE3IC8gMjU1LAoJCQkJMTkgLyAyNTUsCgkJCV0pOwoJCQlzZXRDb2xvcih1bmlmb3Jtcy51UmltQ29sb3IudmFsdWUsIHN0YXRlLmZyZXNuZWxDb25maWcucmltQ29sb3IsIFsKCQkJCTEsCgkJCQkxMDUgLyAyNTUsCgkJCQkwLAoJCQldKTsKCQkJdW5pZm9ybXMudVJpbVBvd2VyLnZhbHVlID0gTWF0aC5tYXgoMC4wMDAxLCBzdGF0ZS5mcmVzbmVsQ29uZmlnLnJpbVBvd2VyKTsKCQkJdW5pZm9ybXMudVJpbUludGVuc2l0eS52YWx1ZSA9IE1hdGgubWF4KAoJCQkJMCwKCQkJCXN0YXRlLmZyZXNuZWxDb25maWcucmltSW50ZW5zaXR5LAoJCQkpOwoKCQkJc2V0Q29sb3IodW5pZm9ybXMudUF0bW9zcGhlcmVDb2xvci52YWx1ZSwgc3RhdGUuYXRtb3NwaGVyZUNvbmZpZy5jb2xvciwgWwoJCQkJMSwKCQkJCTEwNSAvIDI1NSwKCQkJCTAsCgkJCV0pOwoJCQl1bmlmb3Jtcy51QXRtb3NwaGVyZVNjYWxlLnZhbHVlID0gTWF0aC5tYXgoCgkJCQkxLAoJCQkJc3RhdGUuYXRtb3NwaGVyZUNvbmZpZy5zY2FsZSwKCQkJKTsKCQkJdW5pZm9ybXMudUF0bW9zcGhlcmVQb3dlci52YWx1ZSA9IE1hdGgubWF4KAoJCQkJMC4wMDAxLAoJCQkJc3RhdGUuYXRtb3NwaGVyZUNvbmZpZy5wb3dlciwKCQkJKTsKCQkJdW5pZm9ybXMudUF0bW9zcGhlcmVDb2VmZmljaWVudC52YWx1ZSA9IE1hdGgubWF4KAoJCQkJMCwKCQkJCXN0YXRlLmF0bW9zcGhlcmVDb25maWcuY29lZmZpY2llbnQsCgkJCSk7CgkJCXVuaWZvcm1zLnVBdG1vc3BoZXJlSW50ZW5zaXR5LnZhbHVlID0gTWF0aC5tYXgoCgkJCQkwLAoJCQkJc3RhdGUuYXRtb3NwaGVyZUNvbmZpZy5pbnRlbnNpdHksCgkJCSk7CgoJCQlzZXRDb2xvcih0ZW1wQ29sb3IsIHN0YXRlLmxhbmRQb2ludENvbG9yLCBbCgkJCQkyNDcgLyAyNTUsCgkJCQkxMTMgLyAyNTUsCgkJCQkyMCAvIDI1NSwKCQkJXSk7CgkJCXVuaWZvcm1zLnVMYW5kUG9pbnRDb2xvci52YWx1ZS5zZXQodGVtcENvbG9yLngsIHRlbXBDb2xvci55LCB0ZW1wQ29sb3Iueik7CgkJfTsKCgkJdXBkYXRlVW5pZm9ybXMoewoJCQlyYWRpdXMsCgkJCXBvaW50Q291bnQsCgkJCXBvaW50U2l6ZSwKCQkJbGFuZFBvaW50Q29sb3IsCgkJCWZyZXNuZWxDb25maWc6IHJlc29sdmVkRnJlc25lbENvbmZpZywKCQkJYXRtb3NwaGVyZUNvbmZpZzogcmVzb2x2ZWRBdG1vc3BoZXJlQ29uZmlnLAoJCX0pOwoKCQlsZXQgd2lkdGggPSAxOwoJCWxldCBoZWlnaHQgPSAxOwoJCWNvbnN0IHJlc2l6ZSA9ICgpID0+IHsKCQkJY29uc3QgaG9zdCA9IHRhcmdldENhbnZhcy5wYXJlbnRFbGVtZW50ID8/IHRhcmdldENhbnZhczsKCQkJY29uc3QgeyB3aWR0aDogaG9zdFdpZHRoLCBoZWlnaHQ6IGhvc3RIZWlnaHQgfSA9CgkJCQlob3N0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwoJCQl3aWR0aCA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoaG9zdFdpZHRoKSk7CgkJCWhlaWdodCA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoaG9zdEhlaWdodCkpOwoJCQlyZW5kZXJlci5zZXRTaXplKHdpZHRoLCBoZWlnaHQpOwoJCQl1bmlmb3Jtcy51UmVzb2x1dGlvbi52YWx1ZS5zZXQoZ2wuY2FudmFzLndpZHRoLCBnbC5jYW52YXMuaGVpZ2h0KTsKCQl9OwoKCQlyZXNpemUoKTsKCQljb25zdCBvYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcihyZXNpemUpOwoJCW9ic2VydmVyLm9ic2VydmUodGFyZ2V0Q2FudmFzKTsKCQlpZiAodGFyZ2V0Q2FudmFzLnBhcmVudEVsZW1lbnQpCgkJCW9ic2VydmVyLm9ic2VydmUodGFyZ2V0Q2FudmFzLnBhcmVudEVsZW1lbnQpOwoKCQljb25zdCBzdGFydFRoZXRhID0gY2xhbXBUaGV0YSgwLCBsb2NrZWRQb2xhckFuZ2xlKTsKCQlsZXQgcGhpID0gMDsKCQlsZXQgdGhldGEgPSBzdGFydFRoZXRhOwoJCWxldCB0YXJnZXRQaGkgPSBwaGk7CgkJbGV0IHRhcmdldFRoZXRhID0gc3RhcnRUaGV0YTsKCgkJY29uc3Qgc3luY01hcmtlcnMgPSAoCgkJCWN1cnJlbnRQaGk6IG51bWJlciwKCQkJY3VycmVudFRoZXRhOiBudW1iZXIsCgkJCWN1cnJlbnRTY2FsZVZhbHVlOiBudW1iZXIsCgkJKSA9PiB7CgkJCWNvbnN0IG1hcmtlclJhZGl1cyA9IENPQkVfR0xPQkVfUkFESVVTICsgTUFSS0VSX0VMRVZBVElPTjsKCQkJY29uc3QgYXNwZWN0ID0gd2lkdGggLyBNYXRoLm1heCgxLCBoZWlnaHQpOwoKCQkJY29uc3QgbmV4dE1hcmtlcnM6IFByb2plY3RlZE1hcmtlcltdID0gbWFya2Vycy5tYXAoKG1hcmtlciwgaW5kZXgpID0+IHsKCQkJCWNvbnN0IHBvcyA9IGxvbkxhdFRvQ2FydGVzaWFuKAoJCQkJCW1hcmtlci5sb2NhdGlvblsxXSwKCQkJCQltYXJrZXIubG9jYXRpb25bMF0sCgkJCQkJbWFya2VyUmFkaXVzLAoJCQkJKTsKCQkJCWNvbnN0IHJvdGF0ZWQgPSBhcHBseVJvdGF0aW9uKAoJCQkJCXBvcy54LAoJCQkJCXBvcy55LAoJCQkJCXBvcy56LAoJCQkJCWN1cnJlbnRQaGksCgkJCQkJY3VycmVudFRoZXRhLAoJCQkJKTsKCgkJCQljb25zdCBuZGNYID0gKHJvdGF0ZWQucnggLyBhc3BlY3QpICogY3VycmVudFNjYWxlVmFsdWU7CgkJCQljb25zdCBuZGNZID0gLXJvdGF0ZWQucnkgKiBjdXJyZW50U2NhbGVWYWx1ZTsKCQkJCWNvbnN0IHNjcmVlblggPSAobmRjWCArIDEpICogMC41OwoJCQkJY29uc3Qgc2NyZWVuWSA9IChuZGNZICsgMSkgKiAwLjU7CgoJCQkJY29uc3QgZnJvbnREb3QgPSByb3RhdGVkLnJ6IC8gbWFya2VyUmFkaXVzOwoJCQkJY29uc3QgcmF3VmlzaWJpbGl0eSA9IHNtb290aHN0ZXAoCgkJCQkJZnJvbnREb3QsCgkJCQkJVklTSUJJTElUWV9NSU5fRE9ULAoJCQkJCVZJU0lCSUxJVFlfTUFYX0RPVCwKCQkJCSk7CgkJCQljb25zdCB2aXNpYmlsaXR5ID0gZHluYW1pY0Vhc2UocmF3VmlzaWJpbGl0eSk7CgoJCQkJcmV0dXJuIHsKCQkJCQltYXJrZXIsCgkJCQkJaW5kZXgsCgkJCQkJc2NyZWVuWCwKCQkJCQlzY3JlZW5ZLAoJCQkJCXZpc2liaWxpdHksCgkJCQkJc2l6ZVB4OiBNYXRoLm1heCgyLCAobWFya2VyLnNpemUgPz8gMC4wNSkgKiAxNjAgKiBjdXJyZW50U2NhbGVWYWx1ZSksCgkJCQl9OwoJCQl9KTsKCgkJCXByb2plY3RlZE1hcmtlcnMgPSBuZXh0TWFya2VyczsKCQl9OwoKCQlzeW5jRm9jdXNUYXJnZXQgPSAodGFyZ2V0KSA9PiB7CgkJCWZvY3VzVHdlZW4/LmtpbGwoKTsKCQkJZm9jdXNUd2VlbiA9IG51bGw7CgoJCQlpZiAoIXRhcmdldCkgcmV0dXJuOwoKCQkJY29uc3QgW2xhdCwgbG9uXSA9IHRhcmdldDsKCQkJY29uc3QgbmV4dERpcmVjdGlvbiA9IGxvbkxhdFRvQ2FydGVzaWFuKGxvbiwgbGF0LCAxKTsKCQkJY29uc3QgdGFyZ2V0Um90YXRpb24gPSBjYXJ0ZXNpYW5Ub1JvdGF0aW9uKAoJCQkJbmV4dERpcmVjdGlvbi54LAoJCQkJbmV4dERpcmVjdGlvbi55LAoJCQkJbmV4dERpcmVjdGlvbi56LAoJCQkpOwoKCQkJY29uc3QgZGVzaXJlZFRoZXRhID0gY2xhbXBUaGV0YSh0YXJnZXRSb3RhdGlvbi50aGV0YSwgbG9ja2VkUG9sYXJBbmdsZSk7CgkJCWNvbnN0IGRlc2lyZWRQaGkgPSBzaG9ydGVzdEFuZ2xlVGFyZ2V0KHRhcmdldFBoaSwgdGFyZ2V0Um90YXRpb24ucGhpKTsKCgkJCWNvbnN0IHR3ZWVuU3RhdGUgPSB7IHBoaTogdGFyZ2V0UGhpLCB0aGV0YTogdGFyZ2V0VGhldGEgfTsKCQkJZm9jdXNUd2VlbiA9IGdzYXAudG8odHdlZW5TdGF0ZSwgewoJCQkJcGhpOiBkZXNpcmVkUGhpLAoJCQkJdGhldGE6IGRlc2lyZWRUaGV0YSwKCQkJCWR1cmF0aW9uOiAxLjUsCgkJCQllYXNlOiAicG93ZXIyLmluT3V0IiwKCQkJCW9uVXBkYXRlOiAoKSA9PiB7CgkJCQkJdGFyZ2V0UGhpID0gdHdlZW5TdGF0ZS5waGk7CgkJCQkJdGFyZ2V0VGhldGEgPSBjbGFtcFRoZXRhKHR3ZWVuU3RhdGUudGhldGEsIGxvY2tlZFBvbGFyQW5nbGUpOwoJCQkJfSwKCQkJCW92ZXJ3cml0ZTogdHJ1ZSwKCQkJfSk7CgkJfTsKCgkJc3luY0ZvY3VzVGFyZ2V0KGZvY3VzT24pOwoKCQlsZXQgZHJhZ2dpbmcgPSBmYWxzZTsKCQlsZXQgYWN0aXZlUG9pbnRlcklkID0gLTE7CgkJbGV0IGxhc3RQb2ludGVyWCA9IDA7CgkJbGV0IGxhc3RQb2ludGVyWSA9IDA7CgoJCWNvbnN0IG9uUG9pbnRlckRvd24gPSAoZXZlbnQ6IFBvaW50ZXJFdmVudCkgPT4gewoJCQlpZiAoZXZlbnQuYnV0dG9uICE9PSAwKSByZXR1cm47CgkJCWRyYWdnaW5nID0gdHJ1ZTsKCQkJYWN0aXZlUG9pbnRlcklkID0gZXZlbnQucG9pbnRlcklkOwoJCQlsYXN0UG9pbnRlclggPSBldmVudC5jbGllbnRYOwoJCQlsYXN0UG9pbnRlclkgPSBldmVudC5jbGllbnRZOwoJCQl0YXJnZXRDYW52YXMuc2V0UG9pbnRlckNhcHR1cmUoZXZlbnQucG9pbnRlcklkKTsKCQkJZm9jdXNUd2Vlbj8ua2lsbCgpOwoJCQlmb2N1c1R3ZWVuID0gbnVsbDsKCQl9OwoKCQljb25zdCBvblBvaW50ZXJNb3ZlID0gKGV2ZW50OiBQb2ludGVyRXZlbnQpID0+IHsKCQkJaWYgKCFkcmFnZ2luZyB8fCBldmVudC5wb2ludGVySWQgIT09IGFjdGl2ZVBvaW50ZXJJZCkgcmV0dXJuOwoJCQljb25zdCBkeCA9IGV2ZW50LmNsaWVudFggLSBsYXN0UG9pbnRlclg7CgkJCWNvbnN0IGR5ID0gZXZlbnQuY2xpZW50WSAtIGxhc3RQb2ludGVyWTsKCQkJbGFzdFBvaW50ZXJYID0gZXZlbnQuY2xpZW50WDsKCQkJbGFzdFBvaW50ZXJZID0gZXZlbnQuY2xpZW50WTsKCgkJCXRhcmdldFBoaSAtPSBkeCAqIFJPVEFURV9TRU5TSVRJVklUWTsKCQkJdGFyZ2V0VGhldGEgPSBjbGFtcFRoZXRhKAoJCQkJdGFyZ2V0VGhldGEgKyBkeSAqIFJPVEFURV9TRU5TSVRJVklUWSwKCQkJCWxvY2tlZFBvbGFyQW5nbGUsCgkJCSk7CgkJfTsKCgkJY29uc3Qgc3RvcERyYWdnaW5nID0gKGV2ZW50OiBQb2ludGVyRXZlbnQpID0+IHsKCQkJaWYgKGV2ZW50LnBvaW50ZXJJZCAhPT0gYWN0aXZlUG9pbnRlcklkKSByZXR1cm47CgkJCWRyYWdnaW5nID0gZmFsc2U7CgkJCWFjdGl2ZVBvaW50ZXJJZCA9IC0xOwoJCX07CgoJCXRhcmdldENhbnZhcy5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVyZG93biIsIG9uUG9pbnRlckRvd24pOwoJCXRhcmdldENhbnZhcy5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVybW92ZSIsIG9uUG9pbnRlck1vdmUpOwoJCXRhcmdldENhbnZhcy5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVydXAiLCBzdG9wRHJhZ2dpbmcpOwoJCXRhcmdldENhbnZhcy5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVyY2FuY2VsIiwgc3RvcERyYWdnaW5nKTsKCQl0YXJnZXRDYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigibG9zdHBvaW50ZXJjYXB0dXJlIiwgc3RvcERyYWdnaW5nKTsKCgkJbGV0IGRpc3Bvc2VkID0gZmFsc2U7CgkJY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2UoKTsKCQlpbWFnZS5vbmxvYWQgPSAoKSA9PiB7CgkJCWlmIChkaXNwb3NlZCkgcmV0dXJuOwoJCQlsYW5kVGV4dHVyZS5pbWFnZSA9IGltYWdlOwoJCQlsYW5kVGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSB0cnVlOwoJCQlsYW5kVGV4dHVyZS5taW5GaWx0ZXIgPSBnbC5ORUFSRVNUX01JUE1BUF9ORUFSRVNUOwoJCQlsYW5kVGV4dHVyZS5tYWdGaWx0ZXIgPSBnbC5ORUFSRVNUOwoJCQlsYW5kVGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7CgkJfTsKCQlpbWFnZS5vbmVycm9yID0gKGVycm9yKSA9PiB7CgkJCWNvbnNvbGUud2FybigiR2xvYmVTY2VuZTogZmFpbGVkIHRvIGxvYWQgbGFuZCBtYXNrIHRleHR1cmUiLCBlcnJvcik7CgkJfTsKCQlpbWFnZS5zcmMgPSBsYW5kVGV4dHVyZVVybDsKCgkJbGV0IHJhZiA9IDA7CgkJbGV0IHByZXZpb3VzID0gMDsKCQljb25zdCB0aWNrID0gKG5vdzogbnVtYmVyKSA9PiB7CgkJCWNvbnN0IGRlbHRhID0gcHJldmlvdXMgPyAobm93IC0gcHJldmlvdXMpIC8gMTAwMCA6IDA7CgkJCXByZXZpb3VzID0gbm93OwoKCQkJaWYgKGF1dG9Sb3RhdGUpIHsKCQkJCXRhcmdldFBoaSAtPSBBVVRPX1JPVEFURV9TUEVFRCAqIGRlbHRhOwoJCQl9CgkJCXRhcmdldFRoZXRhID0gY2xhbXBUaGV0YSh0YXJnZXRUaGV0YSwgbG9ja2VkUG9sYXJBbmdsZSk7CgoJCQljb25zdCBlYXNpbmcgPSAxIC0gTWF0aC5leHAoLWRlbHRhICogU01PT1RISU5HX1NUUkVOR1RIKTsKCQkJcGhpICs9ICh0YXJnZXRQaGkgLSBwaGkpICogZWFzaW5nOwoJCQl0aGV0YSArPSAodGFyZ2V0VGhldGEgLSB0aGV0YSkgKiBlYXNpbmc7CgoJCQl1bmlmb3Jtcy51Um90YXRpb24udmFsdWUuc2V0KHBoaSwgdGhldGEpOwoKCQkJc3luY01hcmtlcnMocGhpLCB0aGV0YSwgY3VycmVudFNjYWxlKTsKCQkJcmVuZGVyZXIucmVuZGVyKHsgc2NlbmUsIGNhbWVyYSwgY2xlYXI6IHRydWUgfSk7CgkJCXJhZiA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGljayk7CgkJfTsKCgkJcmFmID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSh0aWNrKTsKCgkJcmV0dXJuICgpID0+IHsKCQkJZGlzcG9zZWQgPSB0cnVlOwoJCQlmb2N1c1R3ZWVuPy5raWxsKCk7CgkJCWZvY3VzVHdlZW4gPSBudWxsOwoJCQl3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmKTsKCQkJb2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwoJCQl0YXJnZXRDYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcmRvd24iLCBvblBvaW50ZXJEb3duKTsKCQkJdGFyZ2V0Q2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJtb3ZlIiwgb25Qb2ludGVyTW92ZSk7CgkJCXRhcmdldENhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCJwb2ludGVydXAiLCBzdG9wRHJhZ2dpbmcpOwoJCQl0YXJnZXRDYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcmNhbmNlbCIsIHN0b3BEcmFnZ2luZyk7CgkJCXRhcmdldENhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCJsb3N0cG9pbnRlcmNhcHR1cmUiLCBzdG9wRHJhZ2dpbmcpOwoKCQkJbWVzaC5zZXRQYXJlbnQobnVsbCk7CgkJCWdlb21ldHJ5LnJlbW92ZSgpOwoJCQlwcm9ncmFtLnJlbW92ZSgpOwoJCX07Cgl9KTsKPC9zY3JpcHQ+Cgo8Y2FudmFzCgliaW5kOnRoaXM9e2NhbnZhc30KCWNsYXNzPSJhYnNvbHV0ZSBpbnNldC0wIGJsb2NrIGgtZnVsbCB3LWZ1bGwiCglzdHlsZT0id2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTt0b3VjaC1hY3Rpb246bm9uZTsiCglhcmlhLWhpZGRlbj0idHJ1ZSIKPjwvY2FudmFzPgoKPGRpdiBjbGFzcz0icG9pbnRlci1ldmVudHMtbm9uZSBhYnNvbHV0ZSBpbnNldC0wIG92ZXJmbG93LWhpZGRlbiI+Cgl7I2VhY2ggcHJvamVjdGVkTWFya2VycyBhcyBwcm9qZWN0ZWQsIGkgKHByb2plY3RlZC5tYXJrZXIubGFiZWwgfHwgaSl9CgkJPEdsb2JlTWFya2VySXRlbQoJCQltYXJrZXI9e3Byb2plY3RlZC5tYXJrZXJ9CgkJCWluZGV4PXtwcm9qZWN0ZWQuaW5kZXh9CgkJCXNjcmVlblg9e3Byb2plY3RlZC5zY3JlZW5YfQoJCQlzY3JlZW5ZPXtwcm9qZWN0ZWQuc2NyZWVuWX0KCQkJdmlzaWJpbGl0eT17cHJvamVjdGVkLnZpc2liaWxpdHl9CgkJCXNpemVQeD17cHJvamVjdGVkLnNpemVQeH0KCQkJdG9vbHRpcD17bWFya2VyVG9vbHRpcH0KCQkvPgoJey9lYWNofQo8L2Rpdj4K",
+ "components/globe/GlobeScene.svelte": "PHNjcmlwdCBsYW5nPSJ0cyI+CglpbXBvcnQgeyBvbk1vdW50IH0gZnJvbSAic3ZlbHRlIjsKCWltcG9ydCB7CgkJQ2FtZXJhLAoJCU1lc2gsCgkJUHJvZ3JhbSwKCQlSZW5kZXJlciwKCQlUZXh0dXJlLAoJCVRyYW5zZm9ybSwKCQlUcmlhbmdsZSwKCQlWZWMyLAoJCVZlYzMsCgl9IGZyb20gIm9nbCI7CglpbXBvcnQgeyBnc2FwIH0gZnJvbSAiZ3NhcC9kaXN0L2dzYXAiOwoJaW1wb3J0IHR5cGUgeyBTbmlwcGV0IH0gZnJvbSAic3ZlbHRlIjsKCWltcG9ydCBsYW5kVGV4dHVyZVVybCBmcm9tICIuLi9hc3NldHMvbGFuZC10ZXh0dXJlLnBuZyI7CglpbXBvcnQgeyB0eXBlIENvbG9yUmVwcmVzZW50YXRpb24sIHRvTGluZWFyUmdiIH0gZnJvbSAiLi4vaGVscGVycy9jb2xvciI7CglpbXBvcnQgdHlwZSB7IEdsb2JlTWFya2VyLCBHbG9iZU1hcmtlclRvb2x0aXBDb250ZXh0IH0gZnJvbSAiLi90eXBlcyI7CglpbXBvcnQgR2xvYmVNYXJrZXJJdGVtIGZyb20gIi4vR2xvYmVNYXJrZXJJdGVtLnN2ZWx0ZSI7CgoJaW50ZXJmYWNlIEZyZXNuZWxDb25maWcgewoJCS8qKgoJCSAqIEJhc2UgYm9keSBjb2xvciBmb3IgdGhlIGdsb2JlIHN1cmZhY2UuCgkJICogQGRlZmF1bHQgIiMxMTExMTMiCgkJICovCgkJY29sb3I/OiBDb2xvclJlcHJlc2VudGF0aW9uOwoJCS8qKgoJCSAqIEFjY2VudCBjb2xvciBhcHBsaWVkIGJ5IHRoZSBGcmVzbmVsIHJpbS4KCQkgKiBAZGVmYXVsdCAiI0ZGNjkwMCIKCQkgKi8KCQlyaW1Db2xvcj86IENvbG9yUmVwcmVzZW50YXRpb247CgkJLyoqCgkJICogQ29udHJvbHMgaG93IHRpZ2h0IHRoZSBGcmVzbmVsIHJpbSBodWcgaXMuCgkJICogSGlnaGVyIHZhbHVlcyB5aWVsZCBhIHRoaW5uZXIgb3V0bGluZS4KCQkgKiBAZGVmYXVsdCA2CgkJICovCgkJcmltUG93ZXI/OiBudW1iZXI7CgkJLyoqCgkJICogSW50ZW5zaXR5IG11bHRpcGxpZXIgZm9yIHRoZSBGcmVzbmVsIHJpbSBjb2xvci4KCQkgKiBAZGVmYXVsdCAxLjUKCQkgKi8KCQlyaW1JbnRlbnNpdHk/OiBudW1iZXI7Cgl9CgoJaW50ZXJmYWNlIEF0bW9zcGhlcmVDb25maWcgewoJCS8qKgoJCSAqIENvbG9yIG9mIHRoZSBhdG1vc3BoZXJlIGdsb3cuCgkJICogQGRlZmF1bHQgIiNGRjY5MDAiCgkJICovCgkJY29sb3I/OiBDb2xvclJlcHJlc2VudGF0aW9uOwoJCS8qKgoJCSAqIFNpemUgb2YgdGhlIGF0bW9zcGhlcmUgcmVsYXRpdmUgdG8gdGhlIGdsb2JlIHJhZGl1cy4KCQkgKiBAZGVmYXVsdCAxLjEKCQkgKi8KCQlzY2FsZT86IG51bWJlcjsKCQkvKioKCQkgKiBGYWxsb2ZmIHBvd2VyIG9mIHRoZSBnbG93LiBIaWdoZXIgdmFsdWVzIG1lYW4gYSBzaGFycGVyIGVkZ2UuCgkJICogQGRlZmF1bHQgMTIuMAoJCSAqLwoJCXBvd2VyPzogbnVtYmVyOwoJCS8qKgoJCSAqIEJhc2UgY29lZmZpY2llbnQgZm9yIHRoZSBpbnRlbnNpdHkgY2FsY3VsYXRpb24uCgkJICogQ29udHJvbHMgaG93IGZhciB0aGUgZ2xvdyBleHRlbmRzIGlud2FyZHMuCgkJICogQGRlZmF1bHQgMC45CgkJICovCgkJY29lZmZpY2llbnQ/OiBudW1iZXI7CgkJLyoqCgkJICogR2xvYmFsIGludGVuc2l0eSBtdWx0aXBsaWVyLgoJCSAqIEBkZWZhdWx0IDIuMAoJCSAqLwoJCWludGVuc2l0eT86IG51bWJlcjsKCX0KCglpbnRlcmZhY2UgUHJvcHMgewoJCS8qKgoJCSAqIFJhZGl1cyBvZiB0aGUgc3BoZXJlLgoJCSAqIEBkZWZhdWx0IDIKCQkgKi8KCQlyYWRpdXM6IG51bWJlcjsKCQkvKioKCQkgKiBPcHRpb25hbCBvdmVycmlkZXMgZm9yIHRoZSBGcmVzbmVsIHNoYWRlciB1bmlmb3Jtcy4KCQkgKi8KCQlmcmVzbmVsQ29uZmlnPzogRnJlc25lbENvbmZpZzsKCQkvKioKCQkgKiBPcHRpb25hbCBjb25maWd1cmF0aW9uIGZvciB0aGUgYXRtb3NwaGVyaWMgaGFsby4KCQkgKi8KCQlhdG1vc3BoZXJlQ29uZmlnPzogQXRtb3NwaGVyZUNvbmZpZzsKCQkvKioKCQkgKiBOdW1iZXIgb2YgcG9pbnRzIHJlbmRlcmVkIGFsb25nIHRoZSBnbG9iZSBzdXJmYWNlLgoJCSAqIEBkZWZhdWx0IDE1MDAwCgkJICovCgkJcG9pbnRDb3VudD86IG51bWJlcjsKCQkvKioKCQkgKiBTaXplIG9mIGVhY2ggcG9pbnQgaW4gd29ybGQgdW5pdHMuCgkJICogQGRlZmF1bHQgMC4wNQoJCSAqLwoJCXBvaW50U2l6ZT86IG51bWJlcjsKCQkvKioKCQkgKiBDb2xvciBhcHBsaWVkIHRvIHBvaW50cyByZXByZXNlbnRpbmcgbGFuZC4KCQkgKiBAZGVmYXVsdCAiI2Y3NzExNCIKCQkgKi8KCQlsYW5kUG9pbnRDb2xvcj86IENvbG9yUmVwcmVzZW50YXRpb247CgkJLyoqCgkJICogV2hldGhlciB0aGUgZ2xvYmUgc2hvdWxkIGF1dG8tcm90YXRlLgoJCSAqIEBkZWZhdWx0IHRydWUKCQkgKi8KCQlhdXRvUm90YXRlPzogYm9vbGVhbjsKCQkvKioKCQkgKiBXaGV0aGVyIHRvIGxvY2sgdGhlIGNhbWVyYSdzIHBvbGFyIGFuZ2xlLgoJCSAqIEBkZWZhdWx0IHRydWUKCQkgKi8KCQlsb2NrZWRQb2xhckFuZ2xlPzogYm9vbGVhbjsKCQkvKioKCQkgKiBNYXJrZXJzIHRvIGRpc3BsYXkgb24gdGhlIGdsb2JlLgoJCSAqLwoJCW1hcmtlcnM/OiBHbG9iZU1hcmtlcltdOwoJCS8qKgoJCSAqIE9wdGlvbmFsIGN1c3RvbSB0b29sdGlwIHJlbmRlcmVyIGZvciBtYXJrZXJzLgoJCSAqLwoJCW1hcmtlclRvb2x0aXA/OiBTbmlwcGV0PFtHbG9iZU1hcmtlclRvb2x0aXBDb250ZXh0XT47CgkJLyoqCgkJICogQ29vcmRpbmF0ZXMgW2xhdCwgbG9uXSB0byBmb2N1cyBvbi4KCQkgKi8KCQlmb2N1c09uPzogW251bWJlciwgbnVtYmVyXSB8IG51bGw7Cgl9CgoJaW50ZXJmYWNlIFByb2plY3RlZE1hcmtlciB7CgkJbWFya2VyOiBHbG9iZU1hcmtlcjsKCQlpbmRleDogbnVtYmVyOwoJCXNjcmVlblg6IG51bWJlcjsKCQlzY3JlZW5ZOiBudW1iZXI7CgkJdmlzaWJpbGl0eTogbnVtYmVyOwoJCXNpemVQeDogbnVtYmVyOwoJfQoKCWludGVyZmFjZSBVbmlmb3JtVXBkYXRlclN0YXRlIHsKCQlyYWRpdXM6IG51bWJlcjsKCQlwb2ludENvdW50OiBudW1iZXI7CgkJcG9pbnRTaXplOiBudW1iZXI7CgkJbGFuZFBvaW50Q29sb3I6IENvbG9yUmVwcmVzZW50YXRpb247CgkJZnJlc25lbENvbmZpZzogUmVxdWlyZWQ8RnJlc25lbENvbmZpZz47CgkJYXRtb3NwaGVyZUNvbmZpZzogUmVxdWlyZWQ8QXRtb3NwaGVyZUNvbmZpZz47Cgl9CgoJY29uc3QgUEkgPSBNYXRoLlBJOwoJY29uc3QgREVHMlJBRCA9IFBJIC8gMTgwOwoJY29uc3QgRVBTSUxPTiA9IDFlLTY7Cgljb25zdCBDT0JFX0dMT0JFX1JBRElVUyA9IDAuODsKCWNvbnN0IE1BUktFUl9FTEVWQVRJT04gPSAwLjA1OwoJY29uc3QgQVVUT19ST1RBVEVfU1BFRUQgPSAoMiAqIFBJKSAvIDMwOwoJY29uc3QgUk9UQVRFX1NFTlNJVElWSVRZID0gMC4wMDU7Cgljb25zdCBTTU9PVEhJTkdfU1RSRU5HVEggPSAxNDsKCWNvbnN0IExPQ0tFRF9QT0xBUl9BTkdMRSA9IDEuNTsKCWNvbnN0IExPQ0tFRF9USEVUQSA9IE1hdGguYXNpbihNYXRoLmNvcyhMT0NLRURfUE9MQVJfQU5HTEUpKTsKCWNvbnN0IE1JTl9USEVUQSA9IC1QSSAqIDAuNSArIDAuMDAxOwoJY29uc3QgTUFYX1RIRVRBID0gUEkgKiAwLjUgLSAwLjAwMTsKCWNvbnN0IFZJU0lCSUxJVFlfTUlOX0RPVCA9IDAuMjQ7Cgljb25zdCBWSVNJQklMSVRZX01BWF9ET1QgPSAwLjQ4OwoKCWNvbnN0IGRlZmF1bHRGcmVzbmVsQ29uZmlnOiBSZXF1aXJlZDxGcmVzbmVsQ29uZmlnPiA9IHsKCQljb2xvcjogIiMxMTExMTMiLAoJCXJpbUNvbG9yOiAiI0ZGNjkwMCIsCgkJcmltUG93ZXI6IDYsCgkJcmltSW50ZW5zaXR5OiAxLjUsCgl9OwoKCWNvbnN0IGRlZmF1bHRBdG1vc3BoZXJlQ29uZmlnOiBSZXF1aXJlZDxBdG1vc3BoZXJlQ29uZmlnPiA9IHsKCQljb2xvcjogIiNGRjY5MDAiLAoJCXNjYWxlOiAxLjEsCgkJcG93ZXI6IDEyLjAsCgkJY29lZmZpY2llbnQ6IDAuOSwKCQlpbnRlbnNpdHk6IDEuMSwKCX07CgoJbGV0IHsKCQlyYWRpdXMsCgkJZnJlc25lbENvbmZpZyA9IHt9LAoJCWF0bW9zcGhlcmVDb25maWcgPSB7fSwKCQlwb2ludENvdW50ID0gMTUwMDAsCgkJcG9pbnRTaXplID0gMC4wNSwKCQlsYW5kUG9pbnRDb2xvciA9ICIjZjc3MTE0IiwKCQlhdXRvUm90YXRlID0gdHJ1ZSwKCQlsb2NrZWRQb2xhckFuZ2xlID0gdHJ1ZSwKCQltYXJrZXJzID0gW10sCgkJbWFya2VyVG9vbHRpcCwKCQlmb2N1c09uID0gbnVsbCwKCX06IFByb3BzID0gJHByb3BzKCk7CgoJbGV0IGNhbnZhcyA9ICRzdGF0ZTxIVE1MQ2FudmFzRWxlbWVudD4oKTsKCWxldCBwcm9qZWN0ZWRNYXJrZXJzID0gJHN0YXRlPFByb2plY3RlZE1hcmtlcltdPihbXSk7CgoJY29uc3QgcmVzb2x2ZWRGcmVzbmVsQ29uZmlnID0gJGRlcml2ZWQoewoJCS4uLmRlZmF1bHRGcmVzbmVsQ29uZmlnLAoJCS4uLmZyZXNuZWxDb25maWcsCgl9KTsKCWNvbnN0IHJlc29sdmVkQXRtb3NwaGVyZUNvbmZpZyA9ICRkZXJpdmVkKHsKCQkuLi5kZWZhdWx0QXRtb3NwaGVyZUNvbmZpZywKCQkuLi5hdG1vc3BoZXJlQ29uZmlnLAoJfSk7CgoJbGV0IHVwZGF0ZVVuaWZvcm1zID0gJHN0YXRlPCgoc3RhdGU6IFVuaWZvcm1VcGRhdGVyU3RhdGUpID0+IHZvaWQpIHwgbnVsbD4oCgkJbnVsbCwKCSk7CglsZXQgc3luY0ZvY3VzVGFyZ2V0ID0gJHN0YXRlPAoJCSgodGFyZ2V0OiBbbnVtYmVyLCBudW1iZXJdIHwgbnVsbCkgPT4gdm9pZCkgfCBudWxsCgk+KG51bGwpOwoJbGV0IGZvY3VzVHdlZW46IGdzYXAuY29yZS5Ud2VlbiB8IG51bGwgPSBudWxsOwoKCWNvbnN0IGNsYW1wID0gKHZhbHVlOiBudW1iZXIsIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcikgPT4KCQlNYXRoLm1pbihtYXgsIE1hdGgubWF4KG1pbiwgdmFsdWUpKTsKCgljb25zdCBjbGFtcFRoZXRhID0gKHZhbHVlOiBudW1iZXIsIGxvY2tQb2xhcjogYm9vbGVhbikgPT4KCQlsb2NrUG9sYXIgPyBMT0NLRURfVEhFVEEgOiBjbGFtcCh2YWx1ZSwgTUlOX1RIRVRBLCBNQVhfVEhFVEEpOwoKCWNvbnN0IHNtb290aHN0ZXAgPSAodmFsdWU6IG51bWJlciwgZWRnZTA6IG51bWJlciwgZWRnZTE6IG51bWJlcikgPT4gewoJCWlmIChNYXRoLmFicyhlZGdlMSAtIGVkZ2UwKSA8PSBFUFNJTE9OKSB7CgkJCXJldHVybiB2YWx1ZSA+PSBlZGdlMSA/IDEgOiAwOwoJCX0KCQljb25zdCB0ID0gY2xhbXAoKHZhbHVlIC0gZWRnZTApIC8gKGVkZ2UxIC0gZWRnZTApLCAwLCAxKTsKCQlyZXR1cm4gdCAqIHQgKiAoMyAtIDIgKiB0KTsKCX07CgoJY29uc3QgdG9TY2FsZSA9IChuZXh0UmFkaXVzOiBudW1iZXIpID0+IE1hdGgubWF4KDAuMDAxLCBuZXh0UmFkaXVzIC8gMik7Cgljb25zdCB0b1BvaW50UmFkaXVzID0gKG5leHRQb2ludFNpemU6IG51bWJlcikgPT4KCQlNYXRoLm1heCgwLjAwMSwgbmV4dFBvaW50U2l6ZSAqIDAuMTYpOwoKCWZ1bmN0aW9uIG5vcm1hbGl6ZUFuZ2xlKHZhbHVlOiBudW1iZXIpOiBudW1iZXIgewoJCWNvbnN0IHdyYXBwZWQgPSAoKCh2YWx1ZSArIFBJKSAlICgyICogUEkpKSArIDIgKiBQSSkgJSAoMiAqIFBJKTsKCQlyZXR1cm4gd3JhcHBlZCAtIFBJOwoJfQoKCWZ1bmN0aW9uIHNob3J0ZXN0QW5nbGVUYXJnZXQoY3VycmVudDogbnVtYmVyLCBuZXh0OiBudW1iZXIpOiBudW1iZXIgewoJCWNvbnN0IGRlbHRhID0gbm9ybWFsaXplQW5nbGUobmV4dCAtIGN1cnJlbnQpOwoJCXJldHVybiBjdXJyZW50ICsgZGVsdGE7Cgl9CgoJZnVuY3Rpb24gbG9uTGF0VG9DYXJ0ZXNpYW4obG9uOiBudW1iZXIsIGxhdDogbnVtYmVyLCByOiBudW1iZXIpIHsKCQljb25zdCBsb25SYWQgPSBsb24gKiBERUcyUkFEOwoJCWNvbnN0IGxhdFJhZCA9IGxhdCAqIERFRzJSQUQ7CgoJCWNvbnN0IHkgPSByICogTWF0aC5zaW4obGF0UmFkKTsKCQljb25zdCByWFogPSByICogTWF0aC5jb3MobGF0UmFkKTsKCQljb25zdCB4ID0gclhaICogTWF0aC5zaW4obG9uUmFkKTsKCQljb25zdCB6ID0gclhaICogTWF0aC5jb3MobG9uUmFkKTsKCgkJcmV0dXJuIHsgeCwgeSwgeiB9OwoJfQoKCWZ1bmN0aW9uIGNhcnRlc2lhblRvUm90YXRpb24oeDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcikgewoJCWNvbnN0IGxlbmd0aCA9IE1hdGguaHlwb3QoeCwgeSwgeik7CgkJaWYgKGxlbmd0aCA8PSBFUFNJTE9OKSB7CgkJCXJldHVybiB7IHBoaTogMCwgdGhldGE6IDAgfTsKCQl9CgkJY29uc3QgbnggPSB4IC8gbGVuZ3RoOwoJCWNvbnN0IG55ID0geSAvIGxlbmd0aDsKCQljb25zdCBueiA9IHogLyBsZW5ndGg7CgoJCXJldHVybiB7CgkJCXBoaTogTWF0aC5hdGFuMigtbngsIG56KSwKCQkJdGhldGE6IE1hdGguYXNpbihjbGFtcChueSwgLTEsIDEpKSwKCQl9OwoJfQoKCWZ1bmN0aW9uIGFwcGx5Um90YXRpb24oCgkJeDogbnVtYmVyLAoJCXk6IG51bWJlciwKCQl6OiBudW1iZXIsCgkJcGhpOiBudW1iZXIsCgkJdGhldGE6IG51bWJlciwKCSkgewoJCWNvbnN0IGN4ID0gTWF0aC5jb3ModGhldGEpOwoJCWNvbnN0IGN5ID0gTWF0aC5jb3MocGhpKTsKCQljb25zdCBzeCA9IE1hdGguc2luKHRoZXRhKTsKCQljb25zdCBzeSA9IE1hdGguc2luKHBoaSk7CgoJCXJldHVybiB7CgkJCXJ4OiBjeSAqIHggKyBzeSAqIHosCgkJCXJ5OiBzeSAqIHN4ICogeCArIGN4ICogeSAtIGN5ICogc3ggKiB6LAoJCQlyejogLXN5ICogY3ggKiB4ICsgc3ggKiB5ICsgY3kgKiBjeCAqIHosCgkJfTsKCX0KCglmdW5jdGlvbiBjdWJpY0JlemllckF0KAoJCXQ6IG51bWJlciwKCQlwMDogbnVtYmVyLAoJCXAxOiBudW1iZXIsCgkJcDI6IG51bWJlciwKCQlwMzogbnVtYmVyLAoJKTogbnVtYmVyIHsKCQljb25zdCB1ID0gMSAtIHQ7CgkJcmV0dXJuICgKCQkJdSAqIHUgKiB1ICogcDAgKyAzICogdSAqIHUgKiB0ICogcDEgKyAzICogdSAqIHQgKiB0ICogcDIgKyB0ICogdCAqIHQgKiBwMwoJCSk7Cgl9CgoJZnVuY3Rpb24gY3ViaWNCZXppZXJEZXJpdmF0aXZlQXQoCgkJdDogbnVtYmVyLAoJCXAwOiBudW1iZXIsCgkJcDE6IG51bWJlciwKCQlwMjogbnVtYmVyLAoJCXAzOiBudW1iZXIsCgkpOiBudW1iZXIgewoJCWNvbnN0IHUgPSAxIC0gdDsKCQlyZXR1cm4gKAoJCQkzICogdSAqIHUgKiAocDEgLSBwMCkgKyA2ICogdSAqIHQgKiAocDIgLSBwMSkgKyAzICogdCAqIHQgKiAocDMgLSBwMikKCQkpOwoJfQoKCWZ1bmN0aW9uIGR5bmFtaWNFYXNlKHZhbHVlOiBudW1iZXIpOiBudW1iZXIgewoJCWNvbnN0IGNsYW1wZWQgPSBjbGFtcCh2YWx1ZSwgMCwgMSk7CgkJbGV0IHQgPSBjbGFtcGVkOwoJCWZvciAobGV0IGkgPSAwOyBpIDwgNTsgaSsrKSB7CgkJCWNvbnN0IHggPSBjdWJpY0JlemllckF0KHQsIDAsIDAuNjI1LCAwLCAxKTsKCQkJY29uc3QgZHggPSBjdWJpY0JlemllckRlcml2YXRpdmVBdCh0LCAwLCAwLjYyNSwgMCwgMSk7CgkJCWlmIChNYXRoLmFicyhkeCkgPCAxZS02KSBicmVhazsKCQkJdCA9IGNsYW1wKHQgLSAoeCAtIGNsYW1wZWQpIC8gZHgsIDAsIDEpOwoJCX0KCQlyZXR1cm4gY3ViaWNCZXppZXJBdCh0LCAwLCAwLjA1LCAxLCAxKTsKCX0KCgkkZWZmZWN0KCgpID0+IHsKCQlpZiAoIXVwZGF0ZVVuaWZvcm1zKSByZXR1cm47CgkJdXBkYXRlVW5pZm9ybXMoewoJCQlyYWRpdXMsCgkJCXBvaW50Q291bnQsCgkJCXBvaW50U2l6ZSwKCQkJbGFuZFBvaW50Q29sb3IsCgkJCWZyZXNuZWxDb25maWc6IHJlc29sdmVkRnJlc25lbENvbmZpZywKCQkJYXRtb3NwaGVyZUNvbmZpZzogcmVzb2x2ZWRBdG1vc3BoZXJlQ29uZmlnLAoJCX0pOwoJfSk7CgoJJGVmZmVjdCgoKSA9PiB7CgkJaWYgKCFzeW5jRm9jdXNUYXJnZXQpIHJldHVybjsKCQlzeW5jRm9jdXNUYXJnZXQoZm9jdXNPbik7Cgl9KTsKCglvbk1vdW50KCgpID0+IHsKCQljb25zdCB0YXJnZXRDYW52YXMgPSBjYW52YXM7CgkJaWYgKCF0YXJnZXRDYW52YXMpIHJldHVybjsKCgkJY29uc3QgcmVuZGVyZXIgPSBuZXcgUmVuZGVyZXIoewoJCQljYW52YXM6IHRhcmdldENhbnZhcywKCQkJYWxwaGE6IHRydWUsCgkJCWFudGlhbGlhczogdHJ1ZSwKCQkJZHByOiB0eXBlb2Ygd2luZG93ICE9PSAidW5kZWZpbmVkIiA/IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIDogMSwKCQl9KTsKCQljb25zdCBnbCA9IHJlbmRlcmVyLmdsOwoJCWdsLmNsZWFyQ29sb3IoMCwgMCwgMCwgMCk7CgoJCWNvbnN0IGNhbWVyYSA9IG5ldyBDYW1lcmEoZ2wpOwoJCWNhbWVyYS5wb3NpdGlvbi56ID0gMTsKCgkJY29uc3QgZ2xvYmVTY2VuZSA9IG5ldyBUcmFuc2Zvcm0oKTsKCQljb25zdCBhdG1vc3BoZXJlU2NlbmUgPSBuZXcgVHJhbnNmb3JtKCk7CgkJY29uc3QgZ2VvbWV0cnkgPSBuZXcgVHJpYW5nbGUoZ2wpOwoJCWNvbnN0IGxhbmRUZXh0dXJlID0gbmV3IFRleHR1cmUoZ2wsIHsKCQkJaW1hZ2U6IG5ldyBVaW50OEFycmF5KFswLCAwLCAwLCAyNTVdKSwKCQkJd2lkdGg6IDEsCgkJCWhlaWdodDogMSwKCQkJZm9ybWF0OiBnbC5SR0JBLAoJCQl0eXBlOiBnbC5VTlNJR05FRF9CWVRFLAoJCQltaW5GaWx0ZXI6IGdsLk5FQVJFU1QsCgkJCW1hZ0ZpbHRlcjogZ2wuTkVBUkVTVCwKCQkJZ2VuZXJhdGVNaXBtYXBzOiBmYWxzZSwKCQkJd3JhcFM6IGdsLlJFUEVBVCwKCQkJd3JhcFQ6IGdsLlJFUEVBVCwKCQl9KTsKCgkJY29uc3QgdW5pZm9ybXMgPSB7CgkJCXVSZXNvbHV0aW9uOiB7IHZhbHVlOiBuZXcgVmVjMigxLCAxKSB9LAoJCQl1Um90YXRpb246IHsgdmFsdWU6IG5ldyBWZWMyKDAsIGNsYW1wVGhldGEoMCwgbG9ja2VkUG9sYXJBbmdsZSkpIH0sCgkJCXVTY2FsZTogeyB2YWx1ZTogdG9TY2FsZShyYWRpdXMpIH0sCgkJCXVEb3RzOiB7IHZhbHVlOiBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHBvaW50Q291bnQpKSB9LAoJCQl1UG9pbnRSYWRpdXM6IHsgdmFsdWU6IHRvUG9pbnRSYWRpdXMocG9pbnRTaXplKSB9LAoJCQl1QmFzZUNvbG9yOiB7IHZhbHVlOiBuZXcgVmVjMygwLCAwLCAwKSB9LAoJCQl1UmltQ29sb3I6IHsgdmFsdWU6IG5ldyBWZWMzKDAsIDAsIDApIH0sCgkJCXVSaW1Qb3dlcjogeyB2YWx1ZTogcmVzb2x2ZWRGcmVzbmVsQ29uZmlnLnJpbVBvd2VyIH0sCgkJCXVSaW1JbnRlbnNpdHk6IHsgdmFsdWU6IHJlc29sdmVkRnJlc25lbENvbmZpZy5yaW1JbnRlbnNpdHkgfSwKCQkJdUF0bW9zcGhlcmVDb2xvcjogeyB2YWx1ZTogbmV3IFZlYzMoMCwgMCwgMCkgfSwKCQkJdUF0bW9zcGhlcmVTY2FsZTogeyB2YWx1ZTogcmVzb2x2ZWRBdG1vc3BoZXJlQ29uZmlnLnNjYWxlIH0sCgkJCXVBdG1vc3BoZXJlUG93ZXI6IHsgdmFsdWU6IHJlc29sdmVkQXRtb3NwaGVyZUNvbmZpZy5wb3dlciB9LAoJCQl1QXRtb3NwaGVyZUNvZWZmaWNpZW50OiB7IHZhbHVlOiByZXNvbHZlZEF0bW9zcGhlcmVDb25maWcuY29lZmZpY2llbnQgfSwKCQkJdUF0bW9zcGhlcmVJbnRlbnNpdHk6IHsgdmFsdWU6IHJlc29sdmVkQXRtb3NwaGVyZUNvbmZpZy5pbnRlbnNpdHkgfSwKCQkJdUxhbmRQb2ludENvbG9yOiB7IHZhbHVlOiBuZXcgVmVjMygwLCAwLCAwKSB9LAoJCQl1TGFuZFRleHR1cmU6IHsgdmFsdWU6IGxhbmRUZXh0dXJlIH0sCgkJfTsKCgkJY29uc3QgdmVydGV4U2hhZGVyID0gYAoJCQlhdHRyaWJ1dGUgdmVjMiB1djsKCQkJYXR0cmlidXRlIHZlYzIgcG9zaXRpb247CgkJCXZhcnlpbmcgdmVjMiB2VXY7CgoJCQl2b2lkIG1haW4oKSB7CgkJCQl2VXYgPSB1djsKCQkJCWdsX1Bvc2l0aW9uID0gdmVjNChwb3NpdGlvbiwgMC4wLCAxLjApOwoJCQl9CgkJYDsKCgkJY29uc3QgZ2xvYmVGcmFnbWVudFNoYWRlciA9IGAKCQkJcHJlY2lzaW9uIGhpZ2hwIGZsb2F0OwoKCQkJdmFyeWluZyB2ZWMyIHZVdjsKCgkJCXVuaWZvcm0gdmVjMiB1UmVzb2x1dGlvbjsKCQkJdW5pZm9ybSB2ZWMyIHVSb3RhdGlvbjsKCQkJdW5pZm9ybSBmbG9hdCB1U2NhbGU7CgkJCXVuaWZvcm0gZmxvYXQgdURvdHM7CgkJCXVuaWZvcm0gZmxvYXQgdVBvaW50UmFkaXVzOwoJCQl1bmlmb3JtIHZlYzMgdUJhc2VDb2xvcjsKCQkJdW5pZm9ybSB2ZWMzIHVSaW1Db2xvcjsKCQkJdW5pZm9ybSBmbG9hdCB1UmltUG93ZXI7CgkJCXVuaWZvcm0gZmxvYXQgdVJpbUludGVuc2l0eTsKCQkJdW5pZm9ybSB2ZWMzIHVMYW5kUG9pbnRDb2xvcjsKCQkJdW5pZm9ybSBzYW1wbGVyMkQgdUxhbmRUZXh0dXJlOwoKCQkJY29uc3QgZmxvYXQga1BpID0gMy4xNDE1OTI2NTM1ODk3OTM7CgkJCWNvbnN0IGZsb2F0IGtUYXUgPSA2LjI4MzE4NTMwNzE3OTU4NjsKCQkJY29uc3QgZmxvYXQga1BoaSA9IDEuNjE4MDMzOTg4NzQ5ODk1OwoJCQljb25zdCBmbG9hdCBrU3FydDUgPSAyLjIzNjA2Nzk3NzQ5OTc5OwoJCQljb25zdCBmbG9hdCBrU3BoZXJlUmFkaXVzID0gMC44OwoKCQkJZmxvYXQgYnlEb3RzOwoKCQkJbWF0MyByb3RhdGUoZmxvYXQgdGhldGEsIGZsb2F0IHBoaSkgewoJCQkJZmxvYXQgY3ggPSBjb3ModGhldGEpOwoJCQkJZmxvYXQgY3kgPSBjb3MocGhpKTsKCQkJCWZsb2F0IHN4ID0gc2luKHRoZXRhKTsKCQkJCWZsb2F0IHN5ID0gc2luKHBoaSk7CgkJCQlyZXR1cm4gbWF0MygKCQkJCQljeSwgc3kgKiBzeCwgLXN5ICogY3gsCgkJCQkJMC4wLCBjeCwgc3gsCgkJCQkJc3ksIGN5ICogLXN4LCBjeSAqIGN4CgkJCQkpOwoJCQl9CgoJCQl2ZWMzIG5lYXJlc3RGaWJvbmFjY2lMYXR0aWNlKHZlYzMgcCwgb3V0IGZsb2F0IG0pIHsKCQkJCXAgPSBwLnh6eTsKCgkJCQlmbG9hdCBrID0gbWF4KDIuMCwgZmxvb3IobG9nMihrU3FydDUgKiB1RG90cyAqIGtQaSAqICgxLjAgLSBwLnogKiBwLnopKSAqIDAuNzIwMjEpKTsKCQkJCXZlYzIgZiA9IGZsb29yKHBvdyhrUGhpLCBrKSAvIGtTcXJ0NSAqIHZlYzIoMS4wLCBrUGhpKSArIDAuNSk7CgkJCQl2ZWMyIGJyMSA9IGZyYWN0KChmICsgMS4wKSAqIChrUGhpIC0gMS4wKSkgKiBrVGF1IC0gMy44ODMyMjI7CgkJCQl2ZWMyIGJyMiA9IC0yLjAgKiBmOwoJCQkJdmVjMiBzcCA9IHZlYzIoYXRhbihwLnksIHAueCksIHAueiAtIDEuMCk7CgkJCQl2ZWMyIGMgPSBmbG9vcih2ZWMyKAoJCQkJCWJyMi55ICogc3AueCAtIGJyMS55ICogKHNwLnkgKiB1RG90cyArIDEuMCksCgkJCQkJLWJyMi54ICogc3AueCArIGJyMS54ICogKHNwLnkgKiB1RG90cyArIDEuMCkKCQkJCSkgLyAoYnIxLnggKiBicjIueSAtIGJyMi54ICogYnIxLnkpKTsKCgkJCQlmbG9hdCBtaW5kaXN0ID0ga1BpOwoJCQkJdmVjMyBtaW5pcCA9IHZlYzMoMC4wLCAwLjAsIDEuMCk7CgoJCQkJZm9yIChmbG9hdCBzID0gMC4wOyBzIDwgNC4wOyBzICs9IDEuMCkgewoJCQkJCXZlYzIgbyA9IHZlYzIobW9kKHMsIDIuMCksIGZsb29yKHMgKiAwLjUpKTsKCQkJCQlmbG9hdCBpZHggPSBkb3QoZiwgYyArIG8pOwoJCQkJCWlmIChpZHggPiB1RG90cykgY29udGludWU7CgoJCQkJCWZsb2F0IGEgPSBpZHg7CgkJCQkJZmxvYXQgYiA9IDAuMDsKCQkJCQlpZiAoYSA+PSAxNjM4NC4wKSBhIC09IDE2Mzg0LjAsIGIgKz0gMC44Njg4NzI7CgkJCQkJaWYgKGEgPj0gODE5Mi4wKSBhIC09IDgxOTIuMCwgYiArPSAwLjkzNDQzNjsKCQkJCQlpZiAoYSA+PSA0MDk2LjApIGEgLT0gNDA5Ni4wLCBiICs9IDAuNDY3MjE4OwoJCQkJCWlmIChhID49IDIwNDguMCkgYSAtPSAyMDQ4LjAsIGIgKz0gMC43MzM2MDk7CgkJCQkJaWYgKGEgPj0gMTAyNC4wKSBhIC09IDEwMjQuMCwgYiArPSAwLjg2NjgwNDsKCQkJCQlpZiAoYSA+PSA1MTIuMCkgYSAtPSA1MTIuMCwgYiArPSAwLjQzMzQwMjsKCQkJCQlpZiAoYSA+PSAyNTYuMCkgYSAtPSAyNTYuMCwgYiArPSAwLjIxNjcwMTsKCQkJCQlpZiAoYSA+PSAxMjguMCkgYSAtPSAxMjguMCwgYiArPSAwLjEwODM1MTsKCQkJCQlpZiAoYSA+PSA2NC4wKSBhIC09IDY0LjAsIGIgKz0gMC41NTQxNzU7CgkJCQkJaWYgKGEgPj0gMzIuMCkgYSAtPSAzMi4wLCBiICs9IDAuNzc3MDg4OwoJCQkJCWlmIChhID49IDE2LjApIGEgLT0gMTYuMCwgYiArPSAwLjg4ODU0NDsKCQkJCQlpZiAoYSA+PSA4LjApIGEgLT0gOC4wLCBiICs9IDAuOTQ0MjcyOwoJCQkJCWlmIChhID49IDQuMCkgYSAtPSA0LjAsIGIgKz0gMC40NzIxMzY7CgkJCQkJaWYgKGEgPj0gMi4wKSBhIC09IDIuMCwgYiArPSAwLjIzNjA2ODsKCQkJCQlpZiAoYSA+PSAxLjApIGEgLT0gMS4wLCBiICs9IDAuNjE4MDM0OwoKCQkJCQlmbG9hdCB0aGV0YSA9IGZyYWN0KGIpICoga1RhdTsKCQkJCQlmbG9hdCBjb3NwaGkgPSAxLjAgLSAyLjAgKiBpZHggKiBieURvdHM7CgkJCQkJZmxvYXQgc2lucGhpID0gc3FydChtYXgoMC4wLCAxLjAgLSBjb3NwaGkgKiBjb3NwaGkpKTsKCQkJCQl2ZWMzIHNhbXBsZVBvaW50ID0gdmVjMyhjb3ModGhldGEpICogc2lucGhpLCBzaW4odGhldGEpICogc2lucGhpLCBjb3NwaGkpOwoKCQkJCQlmbG9hdCBkaXN0ID0gbGVuZ3RoKHAgLSBzYW1wbGVQb2ludCk7CgkJCQkJaWYgKGRpc3QgPCBtaW5kaXN0KSB7CgkJCQkJCW1pbmRpc3QgPSBkaXN0OwoJCQkJCQltaW5pcCA9IHNhbXBsZVBvaW50OwoJCQkJCX0KCQkJCX0KCgkJCQltID0gbWluZGlzdDsKCQkJCXJldHVybiBtaW5pcC54enk7CgkJCX0KCgkJCXZlYzIgcG9pbnRUb01hc2tVVih2ZWMzIHApIHsKCQkJCWZsb2F0IGxlbmd0aFAgPSBsZW5ndGgocCk7CgkJCQlpZiAobGVuZ3RoUCA8PSAwLjApIHsKCQkJCQlyZXR1cm4gdmVjMigwLjAsIDAuMCk7CgkJCQl9CgoJCQkJdmVjMyBuID0gcCAvIGxlbmd0aFA7CgoJCQkJZmxvYXQgbnggPSBuLno7CgkJCQlmbG9hdCBueSA9IG4ueTsKCQkJCWZsb2F0IG56ID0gLW4ueDsKCgkJCQlmbG9hdCBnUGhpID0gYXNpbihjbGFtcChueSwgLTEuMCwgMS4wKSk7CgkJCQlmbG9hdCBjb3NQaGkgPSBjb3MoZ1BoaSk7CgoJCQkJZmxvYXQgZ1RoZXRhID0gMC4wOwoJCQkJaWYgKGFicyhjb3NQaGkpID4gMWUtNikgewoJCQkJCWZsb2F0IHRoZXRhSW5wdXQgPSBjbGFtcCgtbnggLyBjb3NQaGksIC0xLjAsIDEuMCk7CgkJCQkJZ1RoZXRhID0gYWNvcyh0aGV0YUlucHV0KTsKCQkJCQlpZiAobnogPCAwLjApIHsKCQkJCQkJZ1RoZXRhID0gLWdUaGV0YTsKCQkJCQl9CgkJCQl9CgoJCQkJcmV0dXJuIHZlYzIoCgkJCQkJZnJhY3QoKGdUaGV0YSAqIDAuNSkgLyBrUGkpLAoJCQkJCWZyYWN0KGdQaGkgLyBrUGkgKyAwLjUpCgkJCQkpOwoJCQl9CgoJCQl2ZWMzIGxpbmVhclRvU3JnYih2ZWMzIGNvbG9yKSB7CgkJCQl2ZWMzIHNhZmUgPSBtYXgoY29sb3IsIHZlYzMoMC4wKSk7CgkJCQl2ZWMzIGxvdyA9IHNhZmUgKiAxMi45MjsKCQkJCXZlYzMgaGlnaCA9IDEuMDU1ICogcG93KHNhZmUsIHZlYzMoMS4wIC8gMi40KSkgLSAwLjA1NTsKCQkJCXZlYzMgY3V0b2ZmID0gc3RlcCh2ZWMzKDAuMDAzMTMwOCksIHNhZmUpOwoJCQkJcmV0dXJuIG1peChsb3csIGhpZ2gsIGN1dG9mZik7CgkJCX0KCgkJCXZvaWQgbWFpbigpIHsKCQkJCWJ5RG90cyA9IDEuMCAvIG1heCgxLjAsIHVEb3RzKTsKCgkJCQl2ZWMyIHV2ID0gdlV2ICogMi4wIC0gMS4wOwoJCQkJdXYueCAqPSB1UmVzb2x1dGlvbi54IC8gbWF4KDEuMCwgdVJlc29sdXRpb24ueSk7CgkJCQl1diAvPSBtYXgoMC4wMDAxLCB1U2NhbGUpOwoKCQkJCWZsb2F0IGwgPSBkb3QodXYsIHV2KTsKCQkJCWZsb2F0IGdsb2JlUjIgPSBrU3BoZXJlUmFkaXVzICoga1NwaGVyZVJhZGl1czsKCgkJCQl2ZWMzIGNvbG9yID0gdmVjMygwLjApOwoJCQkJZmxvYXQgYWxwaGEgPSAwLjA7CgoJCQkJaWYgKGwgPD0gZ2xvYmVSMikgewoJCQkJCWZsb2F0IGRpczsKCQkJCQl2ZWMzIHAgPSBub3JtYWxpemUodmVjMyh1diwgc3FydChtYXgoMC4wLCBnbG9iZVIyIC0gbCkpKSk7CgkJCQkJbWF0MyByb3QgPSByb3RhdGUodVJvdGF0aW9uLnksIHVSb3RhdGlvbi54KTsKCQkJCQl2ZWMzIHNhbXBsZVBvaW50ID0gbmVhcmVzdEZpYm9uYWNjaUxhdHRpY2UocCAqIHJvdCwgZGlzKTsKCQkJCQl2ZWMyIG1hcFV2ID0gcG9pbnRUb01hc2tVVihzYW1wbGVQb2ludCk7CgkJCQkJZmxvYXQgbGFuZCA9IHRleHR1cmUyRCh1TGFuZFRleHR1cmUsIG1hcFV2KS5yOwoKCQkJCQlmbG9hdCBsYW5kRG90cyA9IHN0ZXAoMC41LCBsYW5kKSAqIHNtb290aHN0ZXAodVBvaW50UmFkaXVzLCAwLjAsIGRpcyk7CgoJCQkJCWZsb2F0IGRvdE5WID0gY2xhbXAocC56IC8ga1NwaGVyZVJhZGl1cywgMC4wLCAxLjApOwoJCQkJCWZsb2F0IHJpbSA9IHBvdygxLjAgLSBkb3ROViwgbWF4KDAuMDAwMSwgdVJpbVBvd2VyKSkgKiB1UmltSW50ZW5zaXR5OwoJCQkJCS8vIE1hdGNoIHRoZSBnZW9tZXRyaWMgZm9yZXNob3J0ZW5pbmcgZnJvbSB0aGUgb2xkIGluc3RhbmNlZCBwb2ludCBtZXNoOgoJCQkJCS8vIG5lYXIgdGhlIHNpbGhvdWV0dGUgcG9pbnRzIHNob3VsZCB2aXN1YWxseSBmYWRlIGluc3RlYWQgb2Ygc3RheWluZyBmdWxseSBjcmlzcC4KCQkJCQlmbG9hdCBkb3RGYWRlID0gc21vb3Roc3RlcCgwLjA0LCAwLjI4LCBkb3ROVik7CgkJCQkJbGFuZERvdHMgKj0gZG90RmFkZTsKCgkJCQkJdmVjMyBzdXJmYWNlID0gdUJhc2VDb2xvcjsKCQkJCQlzdXJmYWNlICs9IHVSaW1Db2xvciAqIHJpbTsKCQkJCQlzdXJmYWNlICs9IHVMYW5kUG9pbnRDb2xvciAqIGxhbmREb3RzOwoKCQkJCQljb2xvciArPSBzdXJmYWNlOwoJCQkJCWFscGhhID0gMS4wOwoJCQkJfQoKCQkJCWdsX0ZyYWdDb2xvciA9IHZlYzQobGluZWFyVG9TcmdiKGNvbG9yKSwgY2xhbXAoYWxwaGEsIDAuMCwgMS4wKSk7CgkJCX0KCQlgOwoKCQljb25zdCBhdG1vc3BoZXJlRnJhZ21lbnRTaGFkZXIgPSBgCgkJCXByZWNpc2lvbiBoaWdocCBmbG9hdDsKCgkJCXZhcnlpbmcgdmVjMiB2VXY7CgoJCQl1bmlmb3JtIHZlYzIgdVJlc29sdXRpb247CgkJCXVuaWZvcm0gZmxvYXQgdVNjYWxlOwoJCQl1bmlmb3JtIHZlYzMgdUF0bW9zcGhlcmVDb2xvcjsKCQkJdW5pZm9ybSBmbG9hdCB1QXRtb3NwaGVyZVNjYWxlOwoJCQl1bmlmb3JtIGZsb2F0IHVBdG1vc3BoZXJlUG93ZXI7CgkJCXVuaWZvcm0gZmxvYXQgdUF0bW9zcGhlcmVDb2VmZmljaWVudDsKCQkJdW5pZm9ybSBmbG9hdCB1QXRtb3NwaGVyZUludGVuc2l0eTsKCgkJCWNvbnN0IGZsb2F0IGtTcGhlcmVSYWRpdXMgPSAwLjg7CgoJCQl2ZWMzIGxpbmVhclRvU3JnYih2ZWMzIGNvbG9yKSB7CgkJCQl2ZWMzIHNhZmUgPSBtYXgoY29sb3IsIHZlYzMoMC4wKSk7CgkJCQl2ZWMzIGxvdyA9IHNhZmUgKiAxMi45MjsKCQkJCXZlYzMgaGlnaCA9IDEuMDU1ICogcG93KHNhZmUsIHZlYzMoMS4wIC8gMi40KSkgLSAwLjA1NTsKCQkJCXZlYzMgY3V0b2ZmID0gc3RlcCh2ZWMzKDAuMDAzMTMwOCksIHNhZmUpOwoJCQkJcmV0dXJuIG1peChsb3csIGhpZ2gsIGN1dG9mZik7CgkJCX0KCgkJCXZvaWQgbWFpbigpIHsKCQkJCXZlYzIgdXYgPSB2VXYgKiAyLjAgLSAxLjA7CgkJCQl1di54ICo9IHVSZXNvbHV0aW9uLnggLyBtYXgoMS4wLCB1UmVzb2x1dGlvbi55KTsKCQkJCXV2IC89IG1heCgwLjAwMDEsIHVTY2FsZSk7CgoJCQkJZmxvYXQgZ2xvYmVSID0ga1NwaGVyZVJhZGl1czsKCQkJCWZsb2F0IGF0bW9zcGhlcmVSID0ga1NwaGVyZVJhZGl1cyAqIG1heCgxLjAsIHVBdG1vc3BoZXJlU2NhbGUpOwoJCQkJZmxvYXQgbCA9IGRvdCh1diwgdXYpOwoJCQkJZmxvYXQgcmFkaWFsID0gc3FydChsKTsKCgkJCQlpZiAocmFkaWFsIDw9IGdsb2JlUikgewoJCQkJCWRpc2NhcmQ7CgkJCQl9CgoJCQkJZmxvYXQgc2hlbGxXaWR0aCA9IG1heCgxZS01LCBhdG1vc3BoZXJlUiAtIGdsb2JlUik7CgkJCQlmbG9hdCB4ID0gKHJhZGlhbCAtIGdsb2JlUikgLyBzaGVsbFdpZHRoOwoJCQkJaWYgKHggPiAzLjApIHsKCQkJCQlkaXNjYXJkOwoJCQkJfQoKCQkJCS8vIFNtb290aCBvdXR3YXJkIGJsdXIgcHJvZmlsZSAobm8gaGFyZCByaW5nIGN1dG9mZiBhdCBzaGVsbCBib3VuZGFyeSkuCgkJCQlmbG9hdCBmYWxsb2ZmID0gZXhwKC1wb3cobWF4KDAuMCwgeCksIDEuMikgKiBtYXgoMC4xNSwgdUF0bW9zcGhlcmVQb3dlciAqIDAuMDkpKTsKCQkJCWZsb2F0IGZpbmFsRmFjdG9yID0KCQkJCQlmYWxsb2ZmICogdUF0bW9zcGhlcmVJbnRlbnNpdHkgKiBtYXgoMC4wLCB1QXRtb3NwaGVyZUNvZWZmaWNpZW50KTsKCgkJCQl2ZWMzIGZpbmFsQ29sb3IgPSB1QXRtb3NwaGVyZUNvbG9yICogZmluYWxGYWN0b3I7CgkJCQlmbG9hdCBhbHBoYSA9IGZpbmFsRmFjdG9yOwoKCQkJCWdsX0ZyYWdDb2xvciA9IHZlYzQobGluZWFyVG9TcmdiKGZpbmFsQ29sb3IpLCBjbGFtcChhbHBoYSwgMC4wLCAxLjApKTsKCQkJfQoJCWA7CgoJCWNvbnN0IGdsb2JlUHJvZ3JhbSA9IG5ldyBQcm9ncmFtKGdsLCB7CgkJCXZlcnRleDogdmVydGV4U2hhZGVyLAoJCQlmcmFnbWVudDogZ2xvYmVGcmFnbWVudFNoYWRlciwKCQkJdW5pZm9ybXMsCgkJCXRyYW5zcGFyZW50OiB0cnVlLAoJCQlkZXB0aFRlc3Q6IGZhbHNlLAoJCQlkZXB0aFdyaXRlOiBmYWxzZSwKCQl9KTsKCgkJY29uc3QgYXRtb3NwaGVyZVByb2dyYW0gPSBuZXcgUHJvZ3JhbShnbCwgewoJCQl2ZXJ0ZXg6IHZlcnRleFNoYWRlciwKCQkJZnJhZ21lbnQ6IGF0bW9zcGhlcmVGcmFnbWVudFNoYWRlciwKCQkJdW5pZm9ybXMsCgkJCXRyYW5zcGFyZW50OiB0cnVlLAoJCQlkZXB0aFRlc3Q6IGZhbHNlLAoJCQlkZXB0aFdyaXRlOiBmYWxzZSwKCQl9KTsKCQlhdG1vc3BoZXJlUHJvZ3JhbS5zZXRCbGVuZEZ1bmMoZ2wuU1JDX0FMUEhBLCBnbC5PTkUpOwoKCQljb25zdCBnbG9iZU1lc2ggPSBuZXcgTWVzaChnbCwgewoJCQlnZW9tZXRyeSwKCQkJcHJvZ3JhbTogZ2xvYmVQcm9ncmFtLAoJCQlmcnVzdHVtQ3VsbGVkOiBmYWxzZSwKCQl9KTsKCQlnbG9iZU1lc2guc2V0UGFyZW50KGdsb2JlU2NlbmUpOwoKCQljb25zdCBhdG1vc3BoZXJlTWVzaCA9IG5ldyBNZXNoKGdsLCB7CgkJCWdlb21ldHJ5LAoJCQlwcm9ncmFtOiBhdG1vc3BoZXJlUHJvZ3JhbSwKCQkJZnJ1c3R1bUN1bGxlZDogZmFsc2UsCgkJfSk7CgkJYXRtb3NwaGVyZU1lc2guc2V0UGFyZW50KGF0bW9zcGhlcmVTY2VuZSk7CgoJCWxldCBjdXJyZW50U2NhbGUgPSB0b1NjYWxlKHJhZGl1cyk7CgkJY29uc3QgdGVtcENvbG9yID0gbmV3IFZlYzMoKTsKCQljb25zdCBzZXRDb2xvciA9ICgKCQkJdGFyZ2V0OiBWZWMzLAoJCQl2YWx1ZTogQ29sb3JSZXByZXNlbnRhdGlvbiwKCQkJZmFsbGJhY2s6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSwKCQkpID0+IHsKCQkJY29uc3QgW3IsIGcsIGJdID0gdG9MaW5lYXJSZ2IodmFsdWUsIGZhbGxiYWNrKTsKCQkJdGFyZ2V0LnNldChyLCBnLCBiKTsKCQl9OwoKCQl1cGRhdGVVbmlmb3JtcyA9IChzdGF0ZSkgPT4gewoJCQljdXJyZW50U2NhbGUgPSB0b1NjYWxlKHN0YXRlLnJhZGl1cyk7CgkJCXVuaWZvcm1zLnVTY2FsZS52YWx1ZSA9IGN1cnJlbnRTY2FsZTsKCQkJdW5pZm9ybXMudURvdHMudmFsdWUgPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHN0YXRlLnBvaW50Q291bnQpKTsKCQkJdW5pZm9ybXMudVBvaW50UmFkaXVzLnZhbHVlID0gdG9Qb2ludFJhZGl1cyhzdGF0ZS5wb2ludFNpemUpOwoKCQkJc2V0Q29sb3IodW5pZm9ybXMudUJhc2VDb2xvci52YWx1ZSwgc3RhdGUuZnJlc25lbENvbmZpZy5jb2xvciwgWwoJCQkJMTcgLyAyNTUsCgkJCQkxNyAvIDI1NSwKCQkJCTE5IC8gMjU1LAoJCQldKTsKCQkJc2V0Q29sb3IodW5pZm9ybXMudVJpbUNvbG9yLnZhbHVlLCBzdGF0ZS5mcmVzbmVsQ29uZmlnLnJpbUNvbG9yLCBbCgkJCQkxLAoJCQkJMTA1IC8gMjU1LAoJCQkJMCwKCQkJXSk7CgkJCXVuaWZvcm1zLnVSaW1Qb3dlci52YWx1ZSA9IE1hdGgubWF4KDAuMDAwMSwgc3RhdGUuZnJlc25lbENvbmZpZy5yaW1Qb3dlcik7CgkJCXVuaWZvcm1zLnVSaW1JbnRlbnNpdHkudmFsdWUgPSBNYXRoLm1heCgKCQkJCTAsCgkJCQlzdGF0ZS5mcmVzbmVsQ29uZmlnLnJpbUludGVuc2l0eSwKCQkJKTsKCgkJCXNldENvbG9yKHVuaWZvcm1zLnVBdG1vc3BoZXJlQ29sb3IudmFsdWUsIHN0YXRlLmF0bW9zcGhlcmVDb25maWcuY29sb3IsIFsKCQkJCTEsCgkJCQkxMDUgLyAyNTUsCgkJCQkwLAoJCQldKTsKCQkJdW5pZm9ybXMudUF0bW9zcGhlcmVTY2FsZS52YWx1ZSA9IE1hdGgubWF4KAoJCQkJMSwKCQkJCXN0YXRlLmF0bW9zcGhlcmVDb25maWcuc2NhbGUsCgkJCSk7CgkJCXVuaWZvcm1zLnVBdG1vc3BoZXJlUG93ZXIudmFsdWUgPSBNYXRoLm1heCgKCQkJCTAuMDAwMSwKCQkJCXN0YXRlLmF0bW9zcGhlcmVDb25maWcucG93ZXIsCgkJCSk7CgkJCXVuaWZvcm1zLnVBdG1vc3BoZXJlQ29lZmZpY2llbnQudmFsdWUgPSBNYXRoLm1heCgKCQkJCTAsCgkJCQlzdGF0ZS5hdG1vc3BoZXJlQ29uZmlnLmNvZWZmaWNpZW50LAoJCQkpOwoJCQl1bmlmb3Jtcy51QXRtb3NwaGVyZUludGVuc2l0eS52YWx1ZSA9IE1hdGgubWF4KAoJCQkJMCwKCQkJCXN0YXRlLmF0bW9zcGhlcmVDb25maWcuaW50ZW5zaXR5LAoJCQkpOwoKCQkJc2V0Q29sb3IodGVtcENvbG9yLCBzdGF0ZS5sYW5kUG9pbnRDb2xvciwgWwoJCQkJMjQ3IC8gMjU1LAoJCQkJMTEzIC8gMjU1LAoJCQkJMjAgLyAyNTUsCgkJCV0pOwoJCQl1bmlmb3Jtcy51TGFuZFBvaW50Q29sb3IudmFsdWUuc2V0KHRlbXBDb2xvci54LCB0ZW1wQ29sb3IueSwgdGVtcENvbG9yLnopOwoJCX07CgoJCXVwZGF0ZVVuaWZvcm1zKHsKCQkJcmFkaXVzLAoJCQlwb2ludENvdW50LAoJCQlwb2ludFNpemUsCgkJCWxhbmRQb2ludENvbG9yLAoJCQlmcmVzbmVsQ29uZmlnOiByZXNvbHZlZEZyZXNuZWxDb25maWcsCgkJCWF0bW9zcGhlcmVDb25maWc6IHJlc29sdmVkQXRtb3NwaGVyZUNvbmZpZywKCQl9KTsKCgkJbGV0IHdpZHRoID0gMTsKCQlsZXQgaGVpZ2h0ID0gMTsKCQljb25zdCByZXNpemUgPSAoKSA9PiB7CgkJCWNvbnN0IGhvc3QgPSB0YXJnZXRDYW52YXMucGFyZW50RWxlbWVudCA/PyB0YXJnZXRDYW52YXM7CgkJCWNvbnN0IHsgd2lkdGg6IGhvc3RXaWR0aCwgaGVpZ2h0OiBob3N0SGVpZ2h0IH0gPQoJCQkJaG9zdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKCQkJd2lkdGggPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGhvc3RXaWR0aCkpOwoJCQloZWlnaHQgPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGhvc3RIZWlnaHQpKTsKCQkJcmVuZGVyZXIuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTsKCQkJdW5pZm9ybXMudVJlc29sdXRpb24udmFsdWUuc2V0KGdsLmNhbnZhcy53aWR0aCwgZ2wuY2FudmFzLmhlaWdodCk7CgkJfTsKCgkJcmVzaXplKCk7CgkJY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIocmVzaXplKTsKCQlvYnNlcnZlci5vYnNlcnZlKHRhcmdldENhbnZhcyk7CgkJaWYgKHRhcmdldENhbnZhcy5wYXJlbnRFbGVtZW50KQoJCQlvYnNlcnZlci5vYnNlcnZlKHRhcmdldENhbnZhcy5wYXJlbnRFbGVtZW50KTsKCgkJY29uc3Qgc3RhcnRUaGV0YSA9IGNsYW1wVGhldGEoMCwgbG9ja2VkUG9sYXJBbmdsZSk7CgkJbGV0IHBoaSA9IDA7CgkJbGV0IHRoZXRhID0gc3RhcnRUaGV0YTsKCQlsZXQgdGFyZ2V0UGhpID0gcGhpOwoJCWxldCB0YXJnZXRUaGV0YSA9IHN0YXJ0VGhldGE7CgoJCWNvbnN0IHN5bmNNYXJrZXJzID0gKAoJCQljdXJyZW50UGhpOiBudW1iZXIsCgkJCWN1cnJlbnRUaGV0YTogbnVtYmVyLAoJCQljdXJyZW50U2NhbGVWYWx1ZTogbnVtYmVyLAoJCSkgPT4gewoJCQljb25zdCBtYXJrZXJSYWRpdXMgPSBDT0JFX0dMT0JFX1JBRElVUyArIE1BUktFUl9FTEVWQVRJT047CgkJCWNvbnN0IGFzcGVjdCA9IHdpZHRoIC8gTWF0aC5tYXgoMSwgaGVpZ2h0KTsKCgkJCWNvbnN0IG5leHRNYXJrZXJzOiBQcm9qZWN0ZWRNYXJrZXJbXSA9IG1hcmtlcnMubWFwKChtYXJrZXIsIGluZGV4KSA9PiB7CgkJCQljb25zdCBwb3MgPSBsb25MYXRUb0NhcnRlc2lhbigKCQkJCQltYXJrZXIubG9jYXRpb25bMV0sCgkJCQkJbWFya2VyLmxvY2F0aW9uWzBdLAoJCQkJCW1hcmtlclJhZGl1cywKCQkJCSk7CgkJCQljb25zdCByb3RhdGVkID0gYXBwbHlSb3RhdGlvbigKCQkJCQlwb3MueCwKCQkJCQlwb3MueSwKCQkJCQlwb3MueiwKCQkJCQljdXJyZW50UGhpLAoJCQkJCWN1cnJlbnRUaGV0YSwKCQkJCSk7CgoJCQkJY29uc3QgbmRjWCA9IChyb3RhdGVkLnJ4IC8gYXNwZWN0KSAqIGN1cnJlbnRTY2FsZVZhbHVlOwoJCQkJY29uc3QgbmRjWSA9IC1yb3RhdGVkLnJ5ICogY3VycmVudFNjYWxlVmFsdWU7CgkJCQljb25zdCBzY3JlZW5YID0gKG5kY1ggKyAxKSAqIDAuNTsKCQkJCWNvbnN0IHNjcmVlblkgPSAobmRjWSArIDEpICogMC41OwoKCQkJCWNvbnN0IGZyb250RG90ID0gcm90YXRlZC5yeiAvIG1hcmtlclJhZGl1czsKCQkJCWNvbnN0IHJhd1Zpc2liaWxpdHkgPSBzbW9vdGhzdGVwKAoJCQkJCWZyb250RG90LAoJCQkJCVZJU0lCSUxJVFlfTUlOX0RPVCwKCQkJCQlWSVNJQklMSVRZX01BWF9ET1QsCgkJCQkpOwoJCQkJY29uc3QgdmlzaWJpbGl0eSA9IGR5bmFtaWNFYXNlKHJhd1Zpc2liaWxpdHkpOwoKCQkJCXJldHVybiB7CgkJCQkJbWFya2VyLAoJCQkJCWluZGV4LAoJCQkJCXNjcmVlblgsCgkJCQkJc2NyZWVuWSwKCQkJCQl2aXNpYmlsaXR5LAoJCQkJCXNpemVQeDogTWF0aC5tYXgoMiwgKG1hcmtlci5zaXplID8/IDAuMDUpICogMTYwICogY3VycmVudFNjYWxlVmFsdWUpLAoJCQkJfTsKCQkJfSk7CgoJCQlwcm9qZWN0ZWRNYXJrZXJzID0gbmV4dE1hcmtlcnM7CgkJfTsKCgkJc3luY0ZvY3VzVGFyZ2V0ID0gKHRhcmdldCkgPT4gewoJCQlmb2N1c1R3ZWVuPy5raWxsKCk7CgkJCWZvY3VzVHdlZW4gPSBudWxsOwoKCQkJaWYgKCF0YXJnZXQpIHJldHVybjsKCgkJCWNvbnN0IFtsYXQsIGxvbl0gPSB0YXJnZXQ7CgkJCWNvbnN0IG5leHREaXJlY3Rpb24gPSBsb25MYXRUb0NhcnRlc2lhbihsb24sIGxhdCwgMSk7CgkJCWNvbnN0IHRhcmdldFJvdGF0aW9uID0gY2FydGVzaWFuVG9Sb3RhdGlvbigKCQkJCW5leHREaXJlY3Rpb24ueCwKCQkJCW5leHREaXJlY3Rpb24ueSwKCQkJCW5leHREaXJlY3Rpb24ueiwKCQkJKTsKCgkJCWNvbnN0IGRlc2lyZWRUaGV0YSA9IGNsYW1wVGhldGEodGFyZ2V0Um90YXRpb24udGhldGEsIGxvY2tlZFBvbGFyQW5nbGUpOwoJCQljb25zdCBkZXNpcmVkUGhpID0gc2hvcnRlc3RBbmdsZVRhcmdldCh0YXJnZXRQaGksIHRhcmdldFJvdGF0aW9uLnBoaSk7CgoJCQljb25zdCB0d2VlblN0YXRlID0geyBwaGk6IHRhcmdldFBoaSwgdGhldGE6IHRhcmdldFRoZXRhIH07CgkJCWZvY3VzVHdlZW4gPSBnc2FwLnRvKHR3ZWVuU3RhdGUsIHsKCQkJCXBoaTogZGVzaXJlZFBoaSwKCQkJCXRoZXRhOiBkZXNpcmVkVGhldGEsCgkJCQlkdXJhdGlvbjogMS41LAoJCQkJZWFzZTogInBvd2VyMi5pbk91dCIsCgkJCQlvblVwZGF0ZTogKCkgPT4gewoJCQkJCXRhcmdldFBoaSA9IHR3ZWVuU3RhdGUucGhpOwoJCQkJCXRhcmdldFRoZXRhID0gY2xhbXBUaGV0YSh0d2VlblN0YXRlLnRoZXRhLCBsb2NrZWRQb2xhckFuZ2xlKTsKCQkJCX0sCgkJCQlvdmVyd3JpdGU6IHRydWUsCgkJCX0pOwoJCX07CgoJCXN5bmNGb2N1c1RhcmdldChmb2N1c09uKTsKCgkJbGV0IGRyYWdnaW5nID0gZmFsc2U7CgkJbGV0IGFjdGl2ZVBvaW50ZXJJZCA9IC0xOwoJCWxldCBsYXN0UG9pbnRlclggPSAwOwoJCWxldCBsYXN0UG9pbnRlclkgPSAwOwoKCQljb25zdCBvblBvaW50ZXJEb3duID0gKGV2ZW50OiBQb2ludGVyRXZlbnQpID0+IHsKCQkJaWYgKGV2ZW50LmJ1dHRvbiAhPT0gMCkgcmV0dXJuOwoJCQlkcmFnZ2luZyA9IHRydWU7CgkJCWFjdGl2ZVBvaW50ZXJJZCA9IGV2ZW50LnBvaW50ZXJJZDsKCQkJbGFzdFBvaW50ZXJYID0gZXZlbnQuY2xpZW50WDsKCQkJbGFzdFBvaW50ZXJZID0gZXZlbnQuY2xpZW50WTsKCQkJdGFyZ2V0Q2FudmFzLnNldFBvaW50ZXJDYXB0dXJlKGV2ZW50LnBvaW50ZXJJZCk7CgkJCWZvY3VzVHdlZW4/LmtpbGwoKTsKCQkJZm9jdXNUd2VlbiA9IG51bGw7CgkJfTsKCgkJY29uc3Qgb25Qb2ludGVyTW92ZSA9IChldmVudDogUG9pbnRlckV2ZW50KSA9PiB7CgkJCWlmICghZHJhZ2dpbmcgfHwgZXZlbnQucG9pbnRlcklkICE9PSBhY3RpdmVQb2ludGVySWQpIHJldHVybjsKCQkJY29uc3QgZHggPSBldmVudC5jbGllbnRYIC0gbGFzdFBvaW50ZXJYOwoJCQljb25zdCBkeSA9IGV2ZW50LmNsaWVudFkgLSBsYXN0UG9pbnRlclk7CgkJCWxhc3RQb2ludGVyWCA9IGV2ZW50LmNsaWVudFg7CgkJCWxhc3RQb2ludGVyWSA9IGV2ZW50LmNsaWVudFk7CgoJCQl0YXJnZXRQaGkgKz0gZHggKiBST1RBVEVfU0VOU0lUSVZJVFk7CgkJCXRhcmdldFRoZXRhID0gY2xhbXBUaGV0YSgKCQkJCXRhcmdldFRoZXRhICsgZHkgKiBST1RBVEVfU0VOU0lUSVZJVFksCgkJCQlsb2NrZWRQb2xhckFuZ2xlLAoJCQkpOwoJCX07CgoJCWNvbnN0IHN0b3BEcmFnZ2luZyA9IChldmVudDogUG9pbnRlckV2ZW50KSA9PiB7CgkJCWlmIChldmVudC5wb2ludGVySWQgIT09IGFjdGl2ZVBvaW50ZXJJZCkgcmV0dXJuOwoJCQlkcmFnZ2luZyA9IGZhbHNlOwoJCQlhY3RpdmVQb2ludGVySWQgPSAtMTsKCQl9OwoKCQl0YXJnZXRDYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcmRvd24iLCBvblBvaW50ZXJEb3duKTsKCQl0YXJnZXRDYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcm1vdmUiLCBvblBvaW50ZXJNb3ZlKTsKCQl0YXJnZXRDYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcnVwIiwgc3RvcERyYWdnaW5nKTsKCQl0YXJnZXRDYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcmNhbmNlbCIsIHN0b3BEcmFnZ2luZyk7CgkJdGFyZ2V0Q2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoImxvc3Rwb2ludGVyY2FwdHVyZSIsIHN0b3BEcmFnZ2luZyk7CgoJCWxldCBkaXNwb3NlZCA9IGZhbHNlOwoJCWNvbnN0IGltYWdlID0gbmV3IEltYWdlKCk7CgkJaW1hZ2Uub25sb2FkID0gKCkgPT4gewoJCQlpZiAoZGlzcG9zZWQpIHJldHVybjsKCQkJbGFuZFRleHR1cmUuaW1hZ2UgPSBpbWFnZTsKCQkJbGFuZFRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gdHJ1ZTsKCQkJbGFuZFRleHR1cmUubWluRmlsdGVyID0gZ2wuTkVBUkVTVF9NSVBNQVBfTkVBUkVTVDsKCQkJbGFuZFRleHR1cmUubWFnRmlsdGVyID0gZ2wuTkVBUkVTVDsKCQkJbGFuZFRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlOwoJCX07CgkJaW1hZ2Uub25lcnJvciA9IChlcnJvcikgPT4gewoJCQljb25zb2xlLndhcm4oIkdsb2JlU2NlbmU6IGZhaWxlZCB0byBsb2FkIGxhbmQgbWFzayB0ZXh0dXJlIiwgZXJyb3IpOwoJCX07CgkJaW1hZ2Uuc3JjID0gbGFuZFRleHR1cmVVcmw7CgoJCWxldCByYWYgPSAwOwoJCWxldCBwcmV2aW91cyA9IDA7CgkJY29uc3QgdGljayA9IChub3c6IG51bWJlcikgPT4gewoJCQljb25zdCBkZWx0YSA9IHByZXZpb3VzID8gKG5vdyAtIHByZXZpb3VzKSAvIDEwMDAgOiAwOwoJCQlwcmV2aW91cyA9IG5vdzsKCgkJCWlmIChhdXRvUm90YXRlKSB7CgkJCQl0YXJnZXRQaGkgLT0gQVVUT19ST1RBVEVfU1BFRUQgKiBkZWx0YTsKCQkJfQoJCQl0YXJnZXRUaGV0YSA9IGNsYW1wVGhldGEodGFyZ2V0VGhldGEsIGxvY2tlZFBvbGFyQW5nbGUpOwoKCQkJY29uc3QgZWFzaW5nID0gMSAtIE1hdGguZXhwKC1kZWx0YSAqIFNNT09USElOR19TVFJFTkdUSCk7CgkJCXBoaSArPSAodGFyZ2V0UGhpIC0gcGhpKSAqIGVhc2luZzsKCQkJdGhldGEgKz0gKHRhcmdldFRoZXRhIC0gdGhldGEpICogZWFzaW5nOwoKCQkJdW5pZm9ybXMudVJvdGF0aW9uLnZhbHVlLnNldChwaGksIHRoZXRhKTsKCgkJCXN5bmNNYXJrZXJzKHBoaSwgdGhldGEsIGN1cnJlbnRTY2FsZSk7CgkJCXJlbmRlcmVyLnJlbmRlcih7IHNjZW5lOiBnbG9iZVNjZW5lLCBjYW1lcmEsIGNsZWFyOiB0cnVlIH0pOwoJCQlyZW5kZXJlci5yZW5kZXIoeyBzY2VuZTogYXRtb3NwaGVyZVNjZW5lLCBjYW1lcmEsIGNsZWFyOiBmYWxzZSB9KTsKCQkJcmFmID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSh0aWNrKTsKCQl9OwoKCQlyYWYgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRpY2spOwoKCQlyZXR1cm4gKCkgPT4gewoJCQlkaXNwb3NlZCA9IHRydWU7CgkJCWZvY3VzVHdlZW4/LmtpbGwoKTsKCQkJZm9jdXNUd2VlbiA9IG51bGw7CgkJCXdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZShyYWYpOwoJCQlvYnNlcnZlci5kaXNjb25uZWN0KCk7CgkJCXRhcmdldENhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCJwb2ludGVyZG93biIsIG9uUG9pbnRlckRvd24pOwoJCQl0YXJnZXRDYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcm1vdmUiLCBvblBvaW50ZXJNb3ZlKTsKCQkJdGFyZ2V0Q2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJ1cCIsIHN0b3BEcmFnZ2luZyk7CgkJCXRhcmdldENhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCJwb2ludGVyY2FuY2VsIiwgc3RvcERyYWdnaW5nKTsKCQkJdGFyZ2V0Q2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvc3Rwb2ludGVyY2FwdHVyZSIsIHN0b3BEcmFnZ2luZyk7CgoJCQlnbG9iZU1lc2guc2V0UGFyZW50KG51bGwpOwoJCQlhdG1vc3BoZXJlTWVzaC5zZXRQYXJlbnQobnVsbCk7CgkJCWdlb21ldHJ5LnJlbW92ZSgpOwoJCQlnbG9iZVByb2dyYW0ucmVtb3ZlKCk7CgkJCWF0bW9zcGhlcmVQcm9ncmFtLnJlbW92ZSgpOwoJCX07Cgl9KTsKPC9zY3JpcHQ+Cgo8Y2FudmFzCgliaW5kOnRoaXM9e2NhbnZhc30KCWNsYXNzPSJhYnNvbHV0ZSBpbnNldC0wIGJsb2NrIGgtZnVsbCB3LWZ1bGwiCglzdHlsZT0id2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTt0b3VjaC1hY3Rpb246bm9uZTsiCglhcmlhLWhpZGRlbj0idHJ1ZSIKPjwvY2FudmFzPgoKPGRpdiBjbGFzcz0icG9pbnRlci1ldmVudHMtbm9uZSBhYnNvbHV0ZSBpbnNldC0wIG92ZXJmbG93LWhpZGRlbiI+Cgl7I2VhY2ggcHJvamVjdGVkTWFya2VycyBhcyBwcm9qZWN0ZWQsIGkgKHByb2plY3RlZC5tYXJrZXIubGFiZWwgfHwgaSl9CgkJPEdsb2JlTWFya2VySXRlbQoJCQltYXJrZXI9e3Byb2plY3RlZC5tYXJrZXJ9CgkJCWluZGV4PXtwcm9qZWN0ZWQuaW5kZXh9CgkJCXNjcmVlblg9e3Byb2plY3RlZC5zY3JlZW5YfQoJCQlzY3JlZW5ZPXtwcm9qZWN0ZWQuc2NyZWVuWX0KCQkJdmlzaWJpbGl0eT17cHJvamVjdGVkLnZpc2liaWxpdHl9CgkJCXNpemVQeD17cHJvamVjdGVkLnNpemVQeH0KCQkJdG9vbHRpcD17bWFya2VyVG9vbHRpcH0KCQkvPgoJey9lYWNofQo8L2Rpdj4K",
"components/globe/GlobeMarkerItem.svelte": "PHNjcmlwdCBsYW5nPSJ0cyI+CglpbXBvcnQgdHlwZSB7IFNuaXBwZXQgfSBmcm9tICJzdmVsdGUiOwoJaW1wb3J0IHR5cGUgeyBHbG9iZU1hcmtlciwgR2xvYmVNYXJrZXJUb29sdGlwQ29udGV4dCB9IGZyb20gIi4vdHlwZXMiOwoKCWludGVyZmFjZSBQcm9wcyB7CgkJLyoqCgkJICogVGhlIG1hcmtlciBkYXRhIG9iamVjdCBjb250YWluaW5nIGxvY2F0aW9uLCBjb2xvciwgc2l6ZSwgZXRjLgoJCSAqLwoJCW1hcmtlcjogR2xvYmVNYXJrZXI7CgkJLyoqCgkJICogTWFya2VyIGluZGV4IGluIHRoZSBtYXJrZXJzIGFycmF5LgoJCSAqLwoJCWluZGV4OiBudW1iZXI7CgkJLyoqCgkJICogSG9yaXpvbnRhbCBtYXJrZXIgcG9zaXRpb24gaW4gbm9ybWFsaXplZCBbMCwgMV0gdmlld3BvcnQgc3BhY2UuCgkJICovCgkJc2NyZWVuWDogbnVtYmVyOwoJCS8qKgoJCSAqIFZlcnRpY2FsIG1hcmtlciBwb3NpdGlvbiBpbiBub3JtYWxpemVkIFswLCAxXSB2aWV3cG9ydCBzcGFjZS4KCQkgKi8KCQlzY3JlZW5ZOiBudW1iZXI7CgkJLyoqCgkJICogTWFya2VyIHZpc2liaWxpdHkgZmFjdG9yIGluIHJhbmdlIFswLCAxXS4KCQkgKi8KCQl2aXNpYmlsaXR5OiBudW1iZXI7CgkJLyoqCgkJICogTWFya2VyIHZpc3VhbCBzaXplIGluIHBpeGVscy4KCQkgKi8KCQlzaXplUHg6IG51bWJlcjsKCQkvKioKCQkgKiBPcHRpb25hbCBjdXN0b20gdG9vbHRpcCBzbmlwcGV0LgoJCSAqLwoJCXRvb2x0aXA/OiBTbmlwcGV0PFtHbG9iZU1hcmtlclRvb2x0aXBDb250ZXh0XT47Cgl9CgoJbGV0IHsgbWFya2VyLCBpbmRleCwgc2NyZWVuWCwgc2NyZWVuWSwgdmlzaWJpbGl0eSwgc2l6ZVB4LCB0b29sdGlwIH06IFByb3BzID0KCQkkcHJvcHMoKTsKCgljb25zdCBNQVhfVE9PTFRJUF9CTFVSID0gODsKCglsZXQgdG9vbHRpcEJsdXIgPSAkZGVyaXZlZCgoMSAtIHZpc2liaWxpdHkpICogTUFYX1RPT0xUSVBfQkxVUik7CglsZXQgdG9vbHRpcENvbnRleHQgPSAkZGVyaXZlZDxHbG9iZU1hcmtlclRvb2x0aXBDb250ZXh0Pih7CgkJbWFya2VyLAoJCWluZGV4LAoJCXZpc2liaWxpdHksCgl9KTsKCWxldCBtYXJrZXJDb2xvciA9ICRkZXJpdmVkKG1hcmtlci5jb2xvciA/PyAiI2ZmZmZmZiIpOwoJbGV0IG1hcmtlck9wYWNpdHkgPSAkZGVyaXZlZCh2aXNpYmlsaXR5KTsKCWxldCBjbGFtcGVkU2l6ZVB4ID0gJGRlcml2ZWQoTWF0aC5tYXgoMiwgc2l6ZVB4KSk7Cjwvc2NyaXB0PgoKPGRpdgoJY2xhc3M9InBvaW50ZXItZXZlbnRzLW5vbmUgYWJzb2x1dGUiCglzdHlsZTpsZWZ0PXtgJHtzY3JlZW5YICogMTAwfSVgfQoJc3R5bGU6dG9wPXtgJHtzY3JlZW5ZICogMTAwfSVgfQoJc3R5bGU6dHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTUwJSwgLTUwJSkiCj4KCTxkaXYKCQljbGFzcz0icm91bmRlZC1mdWxsIgoJCXN0eWxlOndpZHRoPXtgJHtjbGFtcGVkU2l6ZVB4fXB4YH0KCQlzdHlsZTpoZWlnaHQ9e2Ake2NsYW1wZWRTaXplUHh9cHhgfQoJCXN0eWxlOmJhY2tncm91bmQ9e21hcmtlckNvbG9yfQoJCXN0eWxlOm9wYWNpdHk9e21hcmtlck9wYWNpdHl9Cgk+PC9kaXY+CgoJeyNpZiB0b29sdGlwIHx8IG1hcmtlci5sYWJlbH0KCQk8ZGl2CgkJCWNsYXNzPSJwb2ludGVyLWV2ZW50cy1ub25lIGFic29sdXRlIHRvcC0wIGxlZnQtMS8yIGlubGluZS1mbGV4IC10cmFuc2xhdGUteC0xLzIgLXRyYW5zbGF0ZS15LTYgZmxleC1jb2wgaXRlbXMtY2VudGVyIHRyYW5zaXRpb24tW29wYWNpdHksZmlsdGVyXSBkdXJhdGlvbi0yMDAgZWFzZS1vdXQiCgkJCXN0eWxlOm9wYWNpdHk9e3Zpc2liaWxpdHl9CgkJCXN0eWxlOmZpbHRlcj17YGJsdXIoJHt0b29sdGlwQmx1cn1weClgfQoJCT4KCQkJeyNpZiB0b29sdGlwfQoJCQkJe0ByZW5kZXIgdG9vbHRpcCh0b29sdGlwQ29udGV4dCl9CgkJCXs6ZWxzZX0KCQkJCTxkaXYKCQkJCQljbGFzcz0iYmctZml4ZWQtZGFyay84MCByb3VuZGVkLXhzIHB4LTIgcHktMSB0ZXh0LXhzIHdoaXRlc3BhY2Utbm93cmFwIHRleHQtZml4ZWQtbGlnaHQgYmFja2Ryb3AtYmx1ci1zbSIKCQkJCT4KCQkJCQl7bWFya2VyLmxhYmVsfQoJCQkJPC9kaXY+CgkJCXsvaWZ9CgkJPC9kaXY+Cgl7L2lmfQo8L2Rpdj4K",
"components/globe/types.ts": "ZXhwb3J0IGludGVyZmFjZSBHbG9iZU1hcmtlciB7CgkvKioKCSAqIExhdGl0dWRlIGFuZCBMb25naXR1ZGUgY29vcmRpbmF0ZXMgW2xhdCwgbG9uXS4KCSAqLwoJbG9jYXRpb246IFtudW1iZXIsIG51bWJlcl07CgkvKioKCSAqIFNpemUgb2YgdGhlIG1hcmtlciBpbiB3b3JsZCB1bml0cy4KCSAqIEBkZWZhdWx0IDAuMDUKCSAqLwoJc2l6ZT86IG51bWJlcjsKCS8qKgoJICogQ29sb3Igb2YgdGhlIG1hcmtlci4KCSAqIEBkZWZhdWx0ICIjZmZmZmZmIgoJICovCgljb2xvcj86IHN0cmluZzsKCS8qKgoJICogT3B0aW9uYWwgZmFsbGJhY2sgdG9vbHRpcCB0ZXh0ICh1c2VkIHdoZW4gbm8gY3VzdG9tIHRvb2x0aXAgcmVuZGVyZXIgaXMgcHJvdmlkZWQpLgoJICovCglsYWJlbD86IHN0cmluZzsKfQoKZXhwb3J0IGludGVyZmFjZSBHbG9iZU1hcmtlclRvb2x0aXBDb250ZXh0IHsKCS8qKgoJICogTWFya2VyIGN1cnJlbnRseSBiZWluZyByZW5kZXJlZC4KCSAqLwoJbWFya2VyOiBHbG9iZU1hcmtlcjsKCS8qKgoJICogTWFya2VyIGluZGV4IGluIHRoZSBtYXJrZXJzIGFycmF5LgoJICovCglpbmRleDogbnVtYmVyOwoJLyoqCgkgKiBNYXJrZXIgdmlzaWJpbGl0eSBmYWN0b3IgaW4gcmFuZ2UgWzAsIDFdLgoJICogMCBtZWFucyBmdWxseSBoaWRkZW4gYmVoaW5kIHRoZSBnbG9iZSwgMSBtZWFucyBmdWxseSB2aXNpYmxlLgoJICovCgl2aXNpYmlsaXR5OiBudW1iZXI7Cn0K",
"assets/land-texture.png": "iVBORw0KGgoAAAANSUhEUgAAAQAAAACAAQAAAADMzoqnAAAAAXNSR0IArs4c6QAABA5JREFUeNrV179uHEUAx/Hf3JpbF+E2VASBsmVKTBcpKJs3SMEDcDwBiVJAAewYEBUivIHT0uUBIt0YCovKD0CRjUC4QfHYh8hYXu+P25vZ2Zm9c66gMd/GJ/tz82d3bk8GN4SrByYF2366FNTACIAkivVAAazQdnf3MvAlbNUQfOPAdQDvSAimMWhwy4I2g4SU+Kp04ISLpPBAKLxPyic3O/CCi+Y7rUJbiodcpDOFY7CgxCEXmdYD2EYK2s5lApOx5pEDDYCUwM1XdJUwBV11QQMg59kePSCaPAASQMEL2hwo6TJFgxpg+TgC2ymXPbuvc40awr3D1QCFfbH9kcoqAOkZozpQo0aqAGQRKCog/+tjkgbNFEtg2FffBvBGlSxHoAaAa1u6X4PBAwDiR8FFsrQgeUhfJTSALaB9jy5NCybJPn1SVFiWk7ywN+KzhH1aKAuydhGkbEF4lWohLXDXavlyFgHY7LBnLRdlAP6BS5Cc8RfVDXbkwN/oIvmY+6obbNeBP0JwTuMGu9gTzy1Q4RS/cWpfzszeYwd+CAFrtBW/Hur0gLbJGlD+/OjVwe/drfBxkbbg63dndEDfiEBlAd7ac0BPe1D6Jd8dfbLH+RI0OzseFB5s01/M+gMdAeluLOCAuaUA9Lezo/vSgXoCX9rtEiXnp7Q1W/CNyWcd8DXoS6jH/YZ5vAJEWY2dXFQe2TUgaFaNejCzJ98g6HnlVrsE58sDcYqg+9XY75fPqdoh/kRQWiXKg8MWlJQxUFMPjqnyujhFBE7UxIMjyszk0QwQlFsezImsyvUYYYVED2pk6m0Tg8T04Fwjk2kdAwSACqlM6gRRt3vQYAFGX0Ah7Ebx1H+MDRI5ui0QldH4j7FGcm90XdxD2Jg1AOEAVAKhEFXSn4cKUELurIAKwJ3MArypPscQaLhJFICJ0ohjDySAdH8AhDtCiTuMycH8CXzhH9jUACAO5uMhoAwA5i+T6WAKmmAqnLy80wxHqIPFYpqCwxGaYLt4Dyievg5kEoVEUAhs6pqKgFtDQYOuaXypaWKQfIuwwoGSZgfLsu/XAtI8cGN+h7Cc1A5oLOMhwlIPXuhu48AIvsSBkvtV9wsJRKCyYLfq5lTrQMFd1a262oqBck9K1V0YjQg0iEYYgpS1A9GlXQV5cykwm4A7BzVsxQqo7E+zCegO7Ma7yKgsuOcfKbMBwLC8wvVNYDsANYalEpOAa6zpWjTeMKGwEwC1CiQewJc5EKfgy7GmRAZA4vUVGwE2dPM/g0xuAInE/yG5aZ8ISxWGfYigUVbdyBElTHh2uCwGdfCkOLGgQVBh3Ewp+/QK4CDlR5Ws/Zf7yhCf8pH7vinWAvoVCQ6zz0NX5V/6GkAVV+2/5qsJ/gU8bsxpM8IeAQAAAABJRU5ErkJggg==",
diff --git a/apps/web/static/registry/registry.json b/apps/web/static/registry/registry.json
index 47c5491..909e932 100644
--- a/apps/web/static/registry/registry.json
+++ b/apps/web/static/registry/registry.json
@@ -11,8 +11,7 @@
"tailwind-merge": "^3.4.0"
},
"baseDevDependencies": {
- "@types/gsap": "^3.0.0",
- "@types/three": "^0.182.0"
+ "@types/gsap": "^3.0.0"
},
"components": {
"ascii-renderer": {
diff --git a/bun.lock b/bun.lock
index 3e63815..f3b2ea8 100644
--- a/bun.lock
+++ b/bun.lock
@@ -29,15 +29,13 @@
"@fontsource/inter": "^5.2.8",
"@mediapipe/tasks-vision": "^0.10.22-rc.20250304",
"@takumi-rs/image-response": "1.0.0-rc.12",
- "@threlte/core": "^8.3.1",
- "@threlte/extras": "^9.7.1",
"carbon-icons-svelte": "^13.9.0",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"gsap": "^3.14.2",
"motion-core": "workspace:*",
+ "ogl": "^1.0.11",
"tailwind-merge": "^3.5.0",
- "three": "^0.182.0",
},
"devDependencies": {
"@eslint/js": "^10.0.1",
@@ -45,7 +43,6 @@
"@sveltejs/kit": "^2.53.0",
"@sveltejs/vite-plugin-svelte": "^6.2.4",
"@tailwindcss/vite": "^4.1.17",
- "@types/three": "^0.182.0",
"@typescript-eslint/eslint-plugin": "^8.56.1",
"@typescript-eslint/parser": "^8.56.1",
"eslint": "^10.0.2",
@@ -76,22 +73,16 @@
},
"devDependencies": {
"@mediapipe/tasks-vision": "^0.10.22-rc.20250304",
- "@threlte/core": "^8.3.1",
- "@threlte/extras": "^9.7.1",
"@types/gsap": "^3.0.0",
- "@types/three": "^0.182.0",
"ogl": "^1.0.11",
"tailwindcss": "^4.1.18",
- "three": "^0.182.0",
},
"peerDependencies": {
"@mediapipe/tasks-vision": "^0.10.22-rc.20250304",
- "@threlte/core": "^8.0.0",
- "@threlte/extras": "^9.0.0",
"gsap": "^3.14.2",
+ "ogl": "^1.0.11",
"svelte": "^5.0.0",
"tailwindcss": "^4.1.18",
- "three": "^0.182.0",
},
},
},
@@ -123,8 +114,6 @@
"@cspotcode/source-map-support": ["@cspotcode/source-map-support@0.8.1", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.9" } }, "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="],
- "@dimforge/rapier3d-compat": ["@dimforge/rapier3d-compat@0.12.0", "", {}, "sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow=="],
-
"@emnapi/core": ["@emnapi/core@1.7.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg=="],
"@emnapi/runtime": ["@emnapi/runtime@1.7.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA=="],
@@ -447,14 +436,6 @@
"@takumi-rs/wasm": ["@takumi-rs/wasm@1.0.0-rc.12", "", { "dependencies": { "@takumi-rs/helpers": "1.0.0-rc.12" } }, "sha512-F4cid0g3At2jPcO/LfX10NjiJD3RvuBjsVpWv6LGeN+cYP65h9F5YGifwqSpTQ2IdPXLL1nctVGWjHe6CKN9tA=="],
- "@threejs-kit/instanced-sprite-mesh": ["@threejs-kit/instanced-sprite-mesh@2.5.1", "", { "dependencies": { "diet-sprite": "^0.0.1", "earcut": "^2.2.4", "maath": "^0.10.7", "three-instanced-uniforms-mesh": "^0.52.4", "troika-three-utils": "^0.52.4" }, "peerDependencies": { "three": ">=0.170.0" } }, "sha512-pmt1ALRhbHhCJQTj2FuthH6PeLIeaM4hOuS2JO3kWSwlnvx/9xuUkjFR3JOi/myMqsH7pSsLIROSaBxDfttjeA=="],
-
- "@threlte/core": ["@threlte/core@8.3.1", "", { "dependencies": { "mitt": "^3.0.1" }, "peerDependencies": { "svelte": ">=5", "three": ">=0.160" } }, "sha512-qKjjNCQ+40hyeBcfOMh/8ef5x/j5PG5Wmo/L9Ye0aDCcdD6fCewWxfp7tV/J3CxPzX1dEp1JGK7sjyc7ntZSrg=="],
-
- "@threlte/extras": ["@threlte/extras@9.7.1", "", { "dependencies": { "@threejs-kit/instanced-sprite-mesh": "^2.5.1", "camera-controls": "^3.1.2", "three-mesh-bvh": "^0.9.1", "three-perf": "^1.0.11", "three-viewport-gizmo": "^2.2.0", "troika-three-text": "^0.52.4" }, "peerDependencies": { "svelte": ">=5", "three": ">=0.160" } }, "sha512-SGm59HDCdHxADFHuweHfFDknwubkCPodyK0pbfsVtOWWOX26gE2xfK7aKolh6YFDiPAjWjGxN0jIgkNbbr1ohg=="],
-
- "@tweenjs/tween.js": ["@tweenjs/tween.js@23.1.3", "", {}, "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA=="],
-
"@tybys/wasm-util": ["@tybys/wasm-util@0.9.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw=="],
"@types/chai": ["@types/chai@5.2.3", "", { "dependencies": { "@types/deep-eql": "*", "assertion-error": "^2.0.1" } }, "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA=="],
@@ -477,16 +458,10 @@
"@types/node": ["@types/node@25.3.0", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A=="],
- "@types/stats.js": ["@types/stats.js@0.17.4", "", {}, "sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA=="],
-
- "@types/three": ["@types/three@0.182.0", "", { "dependencies": { "@dimforge/rapier3d-compat": "~0.12.0", "@tweenjs/tween.js": "~23.1.3", "@types/stats.js": "*", "@types/webxr": ">=0.5.17", "@webgpu/types": "*", "fflate": "~0.8.2", "meshoptimizer": "~0.22.0" } }, "sha512-WByN9V3Sbwbe2OkWuSGyoqQO8Du6yhYaXtXLoA5FkKTUJorZ+yOHBZ35zUUPQXlAKABZmbYp5oAqpA4RBjtJ/Q=="],
-
"@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="],
"@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
- "@types/webxr": ["@types/webxr@0.5.24", "", {}, "sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg=="],
-
"@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.57.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.57.0", "@typescript-eslint/type-utils": "8.57.0", "@typescript-eslint/utils": "8.57.0", "@typescript-eslint/visitor-keys": "8.57.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.57.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-qeu4rTHR3/IaFORbD16gmjq9+rEs9fGKdX0kF6BKSfi+gCuG3RCKLlSBYzn/bGsY9Tj7KE/DAQStbp8AHJGHEQ=="],
"@typescript-eslint/parser": ["@typescript-eslint/parser@8.57.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.57.0", "@typescript-eslint/types": "8.57.0", "@typescript-eslint/typescript-estree": "8.57.0", "@typescript-eslint/visitor-keys": "8.57.0", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-XZzOmihLIr8AD1b9hL9ccNMzEMWt/dE2u7NyTY9jJG6YNiNthaD5XtUHVF2uCXZ15ng+z2hT3MVuxnUYhq6k1g=="],
@@ -523,8 +498,6 @@
"@vitest/utils": ["@vitest/utils@4.1.0", "", { "dependencies": { "@vitest/pretty-format": "4.1.0", "convert-source-map": "^2.0.0", "tinyrainbow": "^3.0.3" } }, "sha512-XfPXT6a8TZY3dcGY8EdwsBulFCIw+BeeX0RZn2x/BtiY/75YGh8FeWGG8QISN/WhaqSrE2OrlDgtF8q5uhOTmw=="],
- "@webgpu/types": ["@webgpu/types@0.1.68", "", {}, "sha512-3ab1B59Ojb6RwjOspYLsTpCzbNB3ZaamIAxBMmvnNkiDoLTZUOBXZ9p5nAYVEkQlDdf6qAZWi1pqj9+ypiqznA=="],
-
"@yarnpkg/lockfile": ["@yarnpkg/lockfile@1.1.0", "", {}, "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ=="],
"@yarnpkg/parsers": ["@yarnpkg/parsers@3.0.2", "", { "dependencies": { "js-yaml": "^3.10.0", "tslib": "^2.4.0" } }, "sha512-/HcYgtUSiJiot/XWGLOlGxPYUG65+/31V8oqk17vZLW1xlCoR4PampyePljOxY2n8/3jz9+tIFzICsyGujJZoA=="],
@@ -563,8 +536,6 @@
"base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="],
- "bidi-js": ["bidi-js@1.0.3", "", { "dependencies": { "require-from-string": "^2.0.2" } }, "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw=="],
-
"bl": ["bl@4.1.0", "", { "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w=="],
"blake3-wasm": ["blake3-wasm@2.1.5", "", {}, "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g=="],
@@ -577,8 +548,6 @@
"callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="],
- "camera-controls": ["camera-controls@3.1.2", "", { "peerDependencies": { "three": ">=0.126.1" } }, "sha512-xkxfpG2ECZ6Ww5/9+kf4mfg1VEYAoe9aDSY+IwF0UEs7qEzwy0aVRfs2grImIECs/PoBtWFrh7RXsQkwG922JA=="],
-
"carbon-icons-svelte": ["carbon-icons-svelte@13.9.0", "", {}, "sha512-+5bd/94B1mRt0sdCTADLfy5ArJRxtz5gZdIZBF3EYJPHnWbJUD5/y/S7Q/QoOSzco+B7MSsgezqIQYpmvBYK5w=="],
"ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="],
@@ -641,16 +610,12 @@
"devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="],
- "diet-sprite": ["diet-sprite@0.0.1", "", {}, "sha512-zSHI2WDAn1wJqJYxcmjWfJv3Iw8oL9reQIbEyx2x2/EZ4/qmUTIo8/5qOCurnAcq61EwtJJaZ0XTy2NRYqpB5A=="],
-
"dotenv": ["dotenv@16.4.7", "", {}, "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ=="],
"dotenv-expand": ["dotenv-expand@11.0.7", "", { "dependencies": { "dotenv": "^16.4.5" } }, "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA=="],
"dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="],
- "earcut": ["earcut@2.2.4", "", {}, "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ=="],
-
"ejs": ["ejs@3.1.10", "", { "dependencies": { "jake": "^10.8.5" }, "bin": { "ejs": "bin/cli.js" } }, "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA=="],
"emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
@@ -721,8 +686,6 @@
"fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
- "fflate": ["fflate@0.8.2", "", {}, "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A=="],
-
"figures": ["figures@3.2.0", "", { "dependencies": { "escape-string-regexp": "^1.0.5" } }, "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg=="],
"file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="],
@@ -885,8 +848,6 @@
"log-symbols": ["log-symbols@4.1.0", "", { "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" } }, "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg=="],
- "maath": ["maath@0.10.8", "", { "peerDependencies": { "@types/three": ">=0.134.0", "three": ">=0.134.0" } }, "sha512-tRvbDF0Pgqz+9XUa4jjfgAQ8/aPKmQdWXilFu2tMy4GWj4NOsx99HlULO4IeREfbO3a0sA145DZYyvXPkybm0g=="],
-
"magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
"math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="],
@@ -895,8 +856,6 @@
"mdsvex": ["mdsvex@0.12.6", "", { "dependencies": { "@types/mdast": "^4.0.4", "@types/unist": "^2.0.3", "prism-svelte": "^0.4.7", "prismjs": "^1.17.1", "unist-util-visit": "^2.0.1", "vfile-message": "^2.0.4" }, "peerDependencies": { "svelte": "^3.56.0 || ^4.0.0 || ^5.0.0-next.120" } }, "sha512-pupx2gzWh3hDtm/iDW4WuCpljmyHbHi34r7ktOqpPGvyiM4MyfNgdJ3qMizXdgCErmvYC9Nn/qyjePy+4ss9Wg=="],
- "meshoptimizer": ["meshoptimizer@0.22.0", "", {}, "sha512-IebiK79sqIy+E4EgOr+CAw+Ke8hAspXKzBd0JdgEmPHiAwmvEj2S4h1rfvo+o/BnfEYd/jAOg5IeeIjzlzSnDg=="],
-
"micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="],
"micromark-util-encode": ["micromark-util-encode@2.0.1", "", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="],
@@ -919,8 +878,6 @@
"minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="],
- "mitt": ["mitt@3.0.1", "", {}, "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="],
-
"motion-core": ["motion-core@workspace:packages/motion-core"],
"mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="],
@@ -1031,8 +988,6 @@
"require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="],
- "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="],
-
"resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="],
"resolve.exports": ["resolve.exports@2.0.3", "", {}, "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A=="],
@@ -1103,16 +1058,6 @@
"tar-stream": ["tar-stream@2.2.0", "", { "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" } }, "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ=="],
- "three": ["three@0.182.0", "", {}, "sha512-GbHabT+Irv+ihI1/f5kIIsZ+Ef9Sl5A1Y7imvS5RQjWgtTPfPnZ43JmlYI7NtCRDK9zir20lQpfg8/9Yd02OvQ=="],
-
- "three-instanced-uniforms-mesh": ["three-instanced-uniforms-mesh@0.52.4", "", { "dependencies": { "troika-three-utils": "^0.52.4" }, "peerDependencies": { "three": ">=0.125.0" } }, "sha512-YwDBy05hfKZQtU+Rp0KyDf9yH4GxfhxMbVt9OYruxdgLfPwmDG5oAbGoW0DrKtKZSM3BfFcCiejiOHCjFBTeng=="],
-
- "three-mesh-bvh": ["three-mesh-bvh@0.9.4", "", { "peerDependencies": { "three": ">= 0.159.0" } }, "sha512-+y6xLS6k5LWkNNhYsTgKXBC2D9r/z0swiehVHYhZZ8AOhaKDRCWKsN94ctV5Xy7xA4Xbnv4LKYzf7epRLPT6oQ=="],
-
- "three-perf": ["three-perf@1.0.11", "", { "dependencies": { "troika-three-text": "^0.52.0", "tweakpane": "^3.1.10" }, "peerDependencies": { "three": ">=0.170" } }, "sha512-OgBpZjwL+csQKGKZjpkH/QHdbGFMxqngMbSEJeSnVNfXDYd6On7WHNv/GhUZH4YxIpNMwMahBWrNnsJvnbSJHQ=="],
-
- "three-viewport-gizmo": ["three-viewport-gizmo@2.2.0", "", { "peerDependencies": { "three": ">=0.162.0 <1.0.0" } }, "sha512-Jo9Liur1rUmdKk75FZumLU/+hbF+RtJHi1qsKZpntjKlCYScK6tjbYoqvJ9M+IJphrlQJF5oReFW7Sambh0N4Q=="],
-
"tinybench": ["tinybench@2.9.0", "", {}, "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg=="],
"tinyexec": ["tinyexec@1.0.4", "", {}, "sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw=="],
@@ -1129,12 +1074,6 @@
"trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="],
- "troika-three-text": ["troika-three-text@0.52.4", "", { "dependencies": { "bidi-js": "^1.0.2", "troika-three-utils": "^0.52.4", "troika-worker-utils": "^0.52.0", "webgl-sdf-generator": "1.1.1" }, "peerDependencies": { "three": ">=0.125.0" } }, "sha512-V50EwcYGruV5rUZ9F4aNsrytGdKcXKALjEtQXIOBfhVoZU9VAqZNIoGQ3TMiooVqFAbR1w15T+f+8gkzoFzawg=="],
-
- "troika-three-utils": ["troika-three-utils@0.52.4", "", { "peerDependencies": { "three": ">=0.125.0" } }, "sha512-NORAStSVa/BDiG52Mfudk4j1FG4jC4ILutB3foPnfGbOeIs9+G5vZLa0pnmnaftZUGm4UwSoqEpWdqvC7zms3A=="],
-
- "troika-worker-utils": ["troika-worker-utils@0.52.0", "", {}, "sha512-W1CpvTHykaPH5brv5VHLfQo9D1OYuo0cSBEUQFFT/nBUzM8iD6Lq2/tgG/f1OelbAS1WtaTPQzE5uM49egnngw=="],
-
"trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="],
"ts-api-utils": ["ts-api-utils@2.4.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA=="],
@@ -1143,8 +1082,6 @@
"tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
- "tweakpane": ["tweakpane@3.1.10", "", {}, "sha512-rqwnl/pUa7+inhI2E9ayGTqqP0EPOOn/wVvSWjZsRbZUItzNShny7pzwL3hVlaN4m9t/aZhsP0aFQ9U5VVR2VQ=="],
-
"type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="],
"typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
@@ -1189,8 +1126,6 @@
"web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="],
- "webgl-sdf-generator": ["webgl-sdf-generator@1.1.1", "", {}, "sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA=="],
-
"which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
"why-is-node-running": ["why-is-node-running@2.3.0", "", { "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" }, "bin": { "why-is-node-running": "cli.js" } }, "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w=="],
diff --git a/packages/motion-core/package.json b/packages/motion-core/package.json
index 7afc0de..ba4d09a 100644
--- a/packages/motion-core/package.json
+++ b/packages/motion-core/package.json
@@ -15,21 +15,14 @@
"svelte": "^5.0.0",
"gsap": "^3.14.2",
"tailwindcss": "^4.1.18",
- "three": "^0.182.0",
- "@threlte/core": "^8.0.0",
- "@threlte/extras": "^9.0.0",
"@mediapipe/tasks-vision": "^0.10.22-rc.20250304",
"ogl": "^1.0.11"
},
"devDependencies": {
"@mediapipe/tasks-vision": "^0.10.22-rc.20250304",
- "@threlte/core": "^8.3.1",
- "@threlte/extras": "^9.7.1",
"@types/gsap": "^3.0.0",
- "@types/three": "^0.182.0",
"ogl": "^1.0.11",
- "tailwindcss": "^4.1.18",
- "three": "^0.182.0"
+ "tailwindcss": "^4.1.18"
},
"dependencies": {
"clsx": "^2.1.1",
From 04bc40abaf8d8b5013aecf7c6ca35b14858d0aa6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marek=20J=C3=B3=C5=BAwiak?=
<168720167+66HEX@users.noreply.github.com>
Date: Thu, 16 Apr 2026 20:43:00 +0200
Subject: [PATCH 15/24] chore(globe): update default base color
---
apps/web/src/routes/docs/globe/+page.svx | 2 +-
packages/motion-core/src/lib/components/globe/GlobeScene.svelte | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/apps/web/src/routes/docs/globe/+page.svx b/apps/web/src/routes/docs/globe/+page.svx
index da32431..692556b 100644
--- a/apps/web/src/routes/docs/globe/+page.svx
+++ b/apps/web/src/routes/docs/globe/+page.svx
@@ -173,7 +173,7 @@ import { Globe } from "$lib/motion-core";
{
key: "color",
type: "string | number | readonly [number, number, number] | { r: number; g: number; b: number }",
- default: '"#111113"',
+ default: '"#17181A"',
description: "Base color before the rim glow is applied.",
},
{
diff --git a/packages/motion-core/src/lib/components/globe/GlobeScene.svelte b/packages/motion-core/src/lib/components/globe/GlobeScene.svelte
index 12187ea..f800e53 100644
--- a/packages/motion-core/src/lib/components/globe/GlobeScene.svelte
+++ b/packages/motion-core/src/lib/components/globe/GlobeScene.svelte
@@ -158,7 +158,7 @@
const VISIBILITY_MAX_DOT = 0.48;
const defaultFresnelConfig: Required
= {
- color: "#111113",
+ color: "#17181A",
rimColor: "#FF6900",
rimPower: 6,
rimIntensity: 1.5,
From 76da7950068b4977f794cf29c171fd2ce7ab6d5e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marek=20J=C3=B3=C5=BAwiak?=
<168720167+66HEX@users.noreply.github.com>
Date: Thu, 16 Apr 2026 20:47:24 +0200
Subject: [PATCH 16/24] perf(globe): add will-change transform to marker
tooltip
---
.../motion-core/src/lib/components/globe/GlobeMarkerItem.svelte | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/packages/motion-core/src/lib/components/globe/GlobeMarkerItem.svelte b/packages/motion-core/src/lib/components/globe/GlobeMarkerItem.svelte
index f74a17f..91ef9a9 100644
--- a/packages/motion-core/src/lib/components/globe/GlobeMarkerItem.svelte
+++ b/packages/motion-core/src/lib/components/globe/GlobeMarkerItem.svelte
@@ -65,7 +65,7 @@
{#if tooltip || marker.label}
From fdd825cbb64bd2da40939691d9302144cceb089d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marek=20J=C3=B3=C5=BAwiak?=
<168720167+66HEX@users.noreply.github.com>
Date: Thu, 16 Apr 2026 21:00:15 +0200
Subject: [PATCH 17/24] refactor(globe): render markers in shader and keep html
tooltips
---
.../components/globe/GlobeMarkerItem.svelte | 19 +---
.../lib/components/globe/GlobeScene.svelte | 87 ++++++++++++++++---
2 files changed, 77 insertions(+), 29 deletions(-)
diff --git a/packages/motion-core/src/lib/components/globe/GlobeMarkerItem.svelte b/packages/motion-core/src/lib/components/globe/GlobeMarkerItem.svelte
index 91ef9a9..9a1a414 100644
--- a/packages/motion-core/src/lib/components/globe/GlobeMarkerItem.svelte
+++ b/packages/motion-core/src/lib/components/globe/GlobeMarkerItem.svelte
@@ -23,17 +23,13 @@
* Marker visibility factor in range [0, 1].
*/
visibility: number;
- /**
- * Marker visual size in pixels.
- */
- sizePx: number;
/**
* Optional custom tooltip snippet.
*/
tooltip?: Snippet<[GlobeMarkerTooltipContext]>;
}
- let { marker, index, screenX, screenY, visibility, sizePx, tooltip }: Props =
+ let { marker, index, screenX, screenY, visibility, tooltip }: Props =
$props();
const MAX_TOOLTIP_BLUR = 8;
@@ -44,9 +40,6 @@
index,
visibility,
});
- let markerColor = $derived(marker.color ?? "#ffffff");
- let markerOpacity = $derived(visibility);
- let clampedSizePx = $derived(Math.max(2, sizePx));
-
-
{#if tooltip || marker.label}