├── .github
└── FUNDING.yml
├── .gitignore
├── .prettierrc.json
├── LICENSE
├── README.md
├── capture-01.gif
├── dist
├── aframe-cursor-teleport-component.js
├── aframe-cursor-teleport-component.js.map
├── aframe-cursor-teleport-component.min.js
└── aframe-cursor-teleport-component.min.js.map
├── examples
├── basic
│ └── index.html
└── custom
│ ├── index.html
│ └── models
│ ├── environment.glb
│ ├── vr-collider.mtl
│ └── vr-collider.obj
├── index.html
├── index.js
├── package-lock.json
├── package.json
└── webpack.config.js
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 |
3 | github: vincentfretin
4 | patreon: # Replace with a single Patreon username
5 | open_collective: # Replace with a single Open Collective username
6 | ko_fi: # Replace with a single Ko-fi username
7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
9 | liberapay: # Replace with a single Liberapay username
10 | issuehunt: # Replace with a single IssueHunt username
11 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
12 | polar: # Replace with a single Polar username
13 | buy_me_a_coffee: # Replace with a single Buy Me a Coffee username
14 | thanks_dev: # Replace with a single thanks.dev username
15 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
16 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
--------------------------------------------------------------------------------
/.prettierrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "printWidth": 120,
3 | "singleQuote": true,
4 | "trailingComma": "none"
5 | }
6 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2019 Mike Beene <mwbeene@gmail.com>
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
23 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ## aframe-cursor-teleport-component
2 |
3 | [](https://npmjs.org/package/aframe-cursor-teleport-component)
4 | [](https://npmjs.org/package/aframe-cursor-teleport-component)
5 |
6 | 
7 |
8 | A simple A-Frame component for navigating scenes on non-VR devices. When combined with A-Frame's cursor and look-controls components, this allows users to freely explore A-Frame scenes using device orientation and touch on mobile or using the mouse on desktop.
9 |
10 | - [Live Example - Basic](https://c-frame.github.io/aframe-cursor-teleport/examples/basic/index.html)
11 | - [Live Example - Custom Collision](https://c-frame.github.io/aframe-cursor-teleport/examples/custom/index.html)
12 |
13 | For [A-Frame](https://aframe.io).
14 |
15 | ### API
16 |
17 | | Property | Description | Default Value |
18 | | ----------------- | ---------------------------------------------------------------------------------------------------------------- | ------------- |
19 | | enabled | Enable or disable the component | true |
20 | | cameraRig | Selector of the camera rig to teleport | |
21 | | cameraHead | Selector of the scene's active camera | |
22 | | cursorColor | Color of the cursor, default blue | '#4d93fd' |
23 | | cursorType | Type of the cursor, cylinder or ring | 'cylinder' |
24 | | collisionEntities | Selector of the meshes used to check the collisions. If no value provided a plane at Y=0 is used. | |
25 | | defaultPlaneSize | Size of the default plane created for collision when `collisionEntities` is not specified | 100 |
26 | | ignoreEntities | Selector of meshes that may obstruct the teleport raycaster, like UI or other clickable elements. | |
27 | | landingNormal | Normal vector to detect collisions with the `collisionEntities` | (0, 1, 0) |
28 | | landingMaxAngle | Angle threshold (in degrees) used together with `landingNormal` to detect if the mesh is so steep to jump to it. | 45 |
29 |
30 | ### Events
31 |
32 | The `cursor-teleport` component will emit two events:
33 |
34 | - `navigation-start`: Entity beginning travel to a destination.
35 | - `navigation-end`: Entity has reached destination.
36 |
37 | ### Installation
38 |
39 | #### Browser
40 |
41 | Install and use by directly including the [browser files](dist):
42 |
43 | ```html
44 |
45 | My A-Frame Scene
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 | ```
55 |
56 | #### npm
57 |
58 | Install via npm:
59 |
60 | ```bash
61 | npm install aframe-cursor-teleport-component
62 | ```
63 |
64 | Then require and use.
65 |
66 | ```js
67 | require('aframe');
68 | require('aframe-cursor-teleport-component');
69 | ```
70 |
71 | ### Usage
72 |
73 | #### Basic Setup
74 |
75 | ```html
76 |
77 |
78 |
79 |
80 |
81 | ```
82 |
83 | #### Collision Entities
84 |
85 | To add collision objects, simply identify them with a selector:
86 |
87 | ```html
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
100 |
101 | ```
102 |
103 | #### Ignored Entities
104 |
105 | If your scene has interactive entities that should not initiate a teleport when clicked, you can add them to the ignoredEntities array using a selector:
106 |
107 | ```html
108 |
109 |
110 |
114 |
115 |
116 |
117 |
118 |
123 |
124 |
125 |
132 |
133 | ```
134 |
135 | #### Use with aframe-blink-controls
136 |
137 | This component works with [aframe-blink-controls](https://github.com/jure/aframe-blink-controls) allowing for easy-to-use navigation across virtually all devices:
138 |
139 | ```html
140 |
141 |
142 |
146 |
147 |
153 |
159 |
160 |
161 |
162 |
167 |
168 |
169 |
176 |
177 | ```
178 |
179 | #### Use with simple-navmesh-constraint
180 |
181 | You should disable the `simple-navmesh-constraint` component during the navigation transition.
182 | You can do that like this:
183 |
184 | ```html
185 |
201 | ```
202 |
203 | Then add `character-controller` component to your cameraRig entity. You also probably want to add `.navmesh-hole` to the `cursor-teleport`'s `ignoreEntities`:
204 |
205 | ```html
206 |
211 |
212 |
213 | ```
214 |
215 | #### teleportTo API
216 |
217 | You can use the same teleport animation programmatically to teleport to a destination knowing
218 | the position and quaternion (optional):
219 |
220 | ```js
221 | const cameraRig = document.getElementById('cameraRig');
222 | const cursorTeleport = cameraRig.components['cursor-teleport'];
223 | cursorTeleport.teleportTo(destination.object3D.position, destination.object3D.quaternion);
224 | ```
225 |
226 | Look at the source code of the basic example, the black button triggers the teleportation to the black arrow on the second platform.
227 |
--------------------------------------------------------------------------------
/capture-01.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/c-frame/aframe-cursor-teleport/658818f6f6c17a113c173cd04c8743b131ceb5ba/capture-01.gif
--------------------------------------------------------------------------------
/dist/aframe-cursor-teleport-component.js:
--------------------------------------------------------------------------------
1 | (function webpackUniversalModuleDefinition(root, factory) {
2 | if(typeof exports === 'object' && typeof module === 'object')
3 | module.exports = factory();
4 | else if(typeof define === 'function' && define.amd)
5 | define([], factory);
6 | else {
7 | var a = factory();
8 | for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
9 | }
10 | })(self, () => {
11 | return /******/ (() => { // webpackBootstrap
12 | var __webpack_exports__ = {};
13 | /*!******************!*\
14 | !*** ./index.js ***!
15 | \******************/
16 | /* global AFRAME, THREE */
17 |
18 | if (typeof AFRAME === 'undefined') {
19 | throw new Error('Component attempted to register before AFRAME was available.');
20 | }
21 |
22 | /**
23 | * Cursor Teleport component for A-Frame.
24 | */
25 | AFRAME.registerComponent('cursor-teleport', {
26 | schema: {
27 | enabled: { type: 'boolean', default: true },
28 | cameraHead: { type: 'selector', default: '' },
29 | cameraRig: { type: 'selector', default: '' },
30 | collisionEntities: { type: 'string', default: '' },
31 | cursorColor: { type: 'color', default: '#4d93fd' },
32 | cursorType: { type: 'string', default: 'cylinder', oneOf: ['ring', 'cylinder'] },
33 | defaultPlaneSize: { type: 'number', default: 100 },
34 | ignoreEntities: { type: 'string', default: '' },
35 | landingMaxAngle: { default: 45, min: 0, max: 360 },
36 | landingNormal: { type: 'vec3', default: { x: 0, y: 1, z: 0 } },
37 | transitionSpeed: { type: 'number', default: 0.0006 }
38 | },
39 |
40 | init() {
41 | // platform detect
42 | this.mobile = AFRAME.utils.device.isMobile() || AFRAME.utils.device.isMobileDeviceRequestingDesktopSite();
43 |
44 | // main app
45 | const sceneEl = this.el.sceneEl;
46 | this.canvas = sceneEl.renderer.domElement;
47 |
48 | // camera
49 | this.data.cameraHead.object3D.traverse((child) => {
50 | if (child instanceof THREE.Camera) {
51 | this.cam = child; // This is the PerspectiveCamera
52 | }
53 | });
54 | this.camForRotation = this.data.cameraHead.object3D; // This is the Group, parent of the PerspectiveCamera
55 |
56 | this.camRig = this.data.cameraRig.object3D;
57 |
58 | // collision
59 | this.rayCaster = new THREE.Raycaster();
60 | this.collisionObjectNormalMatrix = new THREE.Matrix3();
61 | this.collisionWorldNormal = new THREE.Vector3();
62 | this.referenceNormal = new THREE.Vector3();
63 | this.rayCastObjects = [];
64 |
65 | // Update collision normal
66 | this.referenceNormal.copy(this.data.landingNormal);
67 |
68 | // RING teleport indicator
69 | const geo = new THREE.RingGeometry(0.25, 0.3, 32, 1);
70 | geo.rotateX(-Math.PI / 2);
71 | geo.translate(0, 0.02, 0);
72 | const mat = new THREE.MeshBasicMaterial({ color: this.data.cursorColor });
73 | const indicatorRing = new THREE.Mesh(geo, mat);
74 | const group = new THREE.Group();
75 | group.add(indicatorRing);
76 | this.teleportIndicator = group;
77 | this.teleportIndicator.visible = false;
78 |
79 | if (this.data.cursorType === 'cylinder') {
80 | // CYLINDER teleport indicator
81 | const geoCyl = new THREE.CylinderGeometry(0.3, 0.3, 0.5, 32, 1, true);
82 | geoCyl.translate(0, 0.25, 0);
83 | // texture source MIT license https://github.com/fernandojsg/aframe-teleport-controls/blob/master/lib/cylinderTexture.js
84 | const textureString =
85 | 'data:image/png;base64,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';
86 | const textureCyl = new THREE.TextureLoader().load(textureString);
87 | const matCyl = new THREE.MeshBasicMaterial({
88 | color: this.data.cursorColor,
89 | side: 'double',
90 | map: textureCyl,
91 | transparent: true,
92 | depthTest: false
93 | });
94 | const indicatorCyl = new THREE.Mesh(geoCyl, matCyl);
95 | group.add(indicatorCyl);
96 | }
97 |
98 | sceneEl.object3D.add(this.teleportIndicator);
99 |
100 | // transition
101 | this.transitioning = false;
102 | this.transitionProgress = 0;
103 | this.transitionCamPosStart = new THREE.Vector3();
104 | this.transitionCamPosEnd = new THREE.Vector3();
105 | this.transitionCamQuaternionStart = new THREE.Quaternion();
106 | this.transitionCamQuaternionEnd = new THREE.Quaternion();
107 |
108 | // Bind functions
109 | this.updateRaycastObjects = this.updateRaycastObjects.bind(this);
110 | this.getMouseState = this.getMouseState.bind(this);
111 | this.getTeleportPosition = this.getTeleportPosition.bind(this);
112 | this.isValidNormalsAngle = this.isValidNormalsAngle.bind(this);
113 | this.transition = this.transition.bind(this);
114 | this.mouseMove = this.mouseMove.bind(this);
115 | this.mouseDown = this.mouseDown.bind(this);
116 | this.mouseUp = this.mouseUp.bind(this);
117 | this.easeInOutQuad = this.easeInOutQuad.bind(this);
118 | this.teleportTo = this.teleportTo.bind(this);
119 | this.hideCursor = this.hideCursor.bind(this);
120 |
121 | this.updateRaycastObjects();
122 | },
123 |
124 | remove() {
125 | this.cam = null;
126 | this.canvas = null;
127 | this.rayCastObjects.length = 0;
128 | this.el.sceneEl.object3D.remove(this.teleportIndicator);
129 | for (const child of this.teleportIndicator.children) {
130 | child.material.dispose();
131 | child.geometry.dispose();
132 | }
133 | this.teleportIndicator = null;
134 | if (this.collisionMesh) {
135 | this.collisionMesh.geometry.dispose();
136 | this.collisionMesh.material.dispose();
137 | this.collisionMesh = null;
138 | }
139 | },
140 |
141 | update(oldData) {
142 | if (typeof oldData.enabled === 'undefined') return;
143 | if (!oldData.enabled && this.data.enabled) {
144 | this.registerEventListeners();
145 | }
146 | if (oldData.enabled && !this.data.enabled) {
147 | // Call unregisterEventListeners instead of pause that is a wrapped method unregistering tick method
148 | // because we still want the tick method to use the component via the teleportTo api.
149 | this.unregisterEventListeners();
150 | }
151 | },
152 |
153 | registerEventListeners() {
154 | const canvas = this.canvas;
155 | canvas.addEventListener('mousedown', this.mouseDown, false);
156 | canvas.addEventListener('mousemove', this.mouseMove, false);
157 | canvas.addEventListener('mouseup', this.mouseUp, false);
158 | canvas.addEventListener('touchstart', this.mouseDown, false);
159 | canvas.addEventListener('touchmove', this.mouseMove, false);
160 | canvas.addEventListener('touchend', this.mouseUp, false);
161 | window.addEventListener('keydown', this.hideCursor, false);
162 | },
163 |
164 | unregisterEventListeners() {
165 | this.transitioning = false;
166 | this.hideCursor();
167 | const canvas = this.canvas;
168 | canvas.removeEventListener('mousedown', this.mouseDown);
169 | canvas.removeEventListener('mousemove', this.mouseMove);
170 | canvas.removeEventListener('mouseup', this.mouseUp);
171 | canvas.removeEventListener('touchstart', this.mouseDown);
172 | canvas.removeEventListener('touchmove', this.mouseMove);
173 | canvas.removeEventListener('touchend', this.mouseUp);
174 | window.removeEventListener('keydown', this.hideCursor);
175 | },
176 |
177 | play() {
178 | if (!this.data.enabled) return;
179 | this.registerEventListeners();
180 | },
181 |
182 | pause() {
183 | this.unregisterEventListeners();
184 | },
185 |
186 | updateRaycastObjects() {
187 | // updates the array of meshes we will need to raycast to
188 | // clear the array of any existing meshes
189 | this.rayCastObjects.length = 0;
190 |
191 | if (this.data.collisionEntities !== '') {
192 | // traverse collision entities and add their meshes to the rayCastEntities array.
193 | const collisionEntities = this.el.sceneEl.querySelectorAll(this.data.collisionEntities);
194 |
195 | collisionEntities.forEach((e) => {
196 | e.object3D.traverse((child) => {
197 | if (child.isMesh) {
198 | // mark this mesh as a collision object
199 | child.userData.collision = true;
200 | this.rayCastObjects.push(child);
201 | }
202 | });
203 | });
204 | } else {
205 | if (!this.collisionMesh) {
206 | // if no collision entities are specified, create a default ground plane collision.
207 | const geo = new THREE.PlaneGeometry(this.data.defaultPlaneSize, this.data.defaultPlaneSize, 1);
208 | geo.rotateX(-Math.PI / 2);
209 | const mat = new THREE.MeshNormalMaterial();
210 | const collisionMesh = new THREE.Mesh(geo, mat);
211 | // mark this mesh as a collision object
212 | collisionMesh.userData.collision = true;
213 | this.collisionMesh = collisionMesh;
214 | }
215 | this.rayCastObjects.push(this.collisionMesh);
216 | }
217 |
218 | // We may need some entities to be seen by the raycaster even though they are not teleportable.
219 | // This prevents the user from unnesserily teleporting when clicking things like buttons or UI.
220 | if (this.data.ignoreEntities !== '') {
221 | const ignoreEntities = this.el.sceneEl.querySelectorAll(this.data.ignoreEntities);
222 | ignoreEntities.forEach((e) => {
223 | e.object3D.traverse((child) => {
224 | if (child.isMesh) {
225 | this.rayCastObjects.push(child);
226 | }
227 | });
228 | });
229 | }
230 | },
231 |
232 | getMouseState: (function () {
233 | const coordinates = new THREE.Vector2();
234 | return function (e) {
235 | const rect = this.canvas.getBoundingClientRect();
236 | if (e.clientX != null) {
237 | coordinates.x = e.clientX - rect.left;
238 | coordinates.y = e.clientY - rect.top;
239 | return coordinates;
240 | } else if (e.touches[0] != null) {
241 | coordinates.x = e.touches[0].clientX - rect.left;
242 | coordinates.y = e.touches[0].clientY - rect.top;
243 | return coordinates;
244 | }
245 | };
246 | })(),
247 |
248 | getTeleportPosition: (function () {
249 | const mouse = new THREE.Vector2();
250 | return function (mouseX, mouseY) {
251 | if (this.rayCastObjects.length !== 0) {
252 | if (this.cam && this.canvas) {
253 | const cam = this.cam;
254 | const rect = this.canvas.getBoundingClientRect();
255 |
256 | mouse.x = (mouseX / (rect.right - rect.left)) * 2 - 1;
257 | mouse.y = -(mouseY / (rect.bottom - rect.top)) * 2 + 1;
258 | this.rayCaster.setFromCamera(mouse, cam);
259 | const intersects = this.rayCaster.intersectObjects(this.rayCastObjects);
260 | if (intersects.length !== 0 && this.isValidNormalsAngle(intersects[0].face.normal, intersects[0].object)) {
261 | if (intersects[0].object.userData.collision === true) {
262 | return intersects[0].point;
263 | }
264 | return false;
265 | } else {
266 | return false;
267 | }
268 | } else {
269 | return false;
270 | }
271 | } else {
272 | return false;
273 | }
274 | };
275 | })(),
276 |
277 | isValidNormalsAngle(collisionNormal, collisionObject) {
278 | this.collisionObjectNormalMatrix.getNormalMatrix(collisionObject.matrixWorld);
279 | this.collisionWorldNormal.copy(collisionNormal).applyNormalMatrix(this.collisionObjectNormalMatrix);
280 | const angleNormals = this.referenceNormal.angleTo(this.collisionWorldNormal);
281 | return THREE.MathUtils.RAD2DEG * angleNormals <= this.data.landingMaxAngle;
282 | },
283 |
284 | transition(destPos, destQuaternion = undefined) {
285 | this.transitionProgress = 0;
286 | this.transitionCamPosEnd.copy(destPos);
287 | this.transitionCamPosStart.copy(this.camRig.position);
288 | if (destQuaternion) {
289 | this.transitionCamQuaternionEnd.copy(destQuaternion);
290 | this.transitionCamQuaternionStart.copy(this.camRig.quaternion);
291 | } else {
292 | this.transitionCamQuaternionEnd.copy(this.camRig.quaternion);
293 | this.transitionCamQuaternionStart.copy(this.transitionCamQuaternionEnd);
294 | }
295 | this.transitioning = true;
296 | this.el.emit('navigation-start');
297 | },
298 |
299 | hideCursor() {
300 | this.teleportIndicator.visible = false;
301 | },
302 |
303 | mouseMove(e) {
304 | const mouseState = this.getMouseState(e);
305 | this.mouseX = mouseState.x;
306 | this.mouseY = mouseState.y;
307 | },
308 |
309 | mouseDown(e) {
310 | this.updateRaycastObjects();
311 |
312 | const mouseState = this.getMouseState(e);
313 | this.mouseX = mouseState.x;
314 | this.mouseY = mouseState.y;
315 |
316 | this.mouseXOrig = mouseState.x;
317 | this.mouseYOrig = mouseState.y;
318 | },
319 |
320 | mouseUp(e) {
321 | if (this.mouseX === this.mouseXOrig && this.mouseY === this.mouseYOrig) {
322 | const pos = this.getTeleportPosition(this.mouseX, this.mouseY);
323 | if (pos) {
324 | this.teleportIndicator.visible = true;
325 | this.teleportIndicator.position.copy(pos);
326 | this.transition(pos);
327 | }
328 | }
329 | },
330 |
331 | teleportTo(pos, quaternion = undefined) {
332 | this.teleportIndicator.position.copy(pos);
333 | if (!quaternion) {
334 | this.transition(pos);
335 | } else {
336 | const destQuaternion = new THREE.Quaternion();
337 | destQuaternion.setFromEuler(new THREE.Euler(0, this.camForRotation.rotation.y, 0));
338 | destQuaternion.invert();
339 | destQuaternion.multiply(quaternion);
340 | this.transition(pos, destQuaternion);
341 | }
342 | // don't show the indicator when using via api
343 | this.hideCursor();
344 | },
345 |
346 | easeInOutQuad(t) {
347 | return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;
348 | },
349 |
350 | tick(time, delta) {
351 | if (!this.transitioning && !this.mobile) {
352 | const pos = this.getTeleportPosition(this.mouseX, this.mouseY);
353 | if (pos) {
354 | this.teleportIndicator.position.copy(pos);
355 | }
356 | }
357 | if (this.transitioning) {
358 | this.transitionProgress += delta * this.data.transitionSpeed;
359 | const easeInOutTransitionProgress = this.easeInOutQuad(this.transitionProgress);
360 | const value =
361 | easeInOutTransitionProgress < 0.5 ? easeInOutTransitionProgress : 0.5 - 1 * (easeInOutTransitionProgress - 0.5);
362 | this.teleportIndicator.scale.set(0.5 + value, 1, 0.5 + value);
363 |
364 | // set camera position
365 | const camPos = this.camRig.position;
366 | camPos.lerpVectors(this.transitionCamPosStart, this.transitionCamPosEnd, easeInOutTransitionProgress);
367 |
368 | this.camRig.quaternion.slerpQuaternions(
369 | this.transitionCamQuaternionStart,
370 | this.transitionCamQuaternionEnd,
371 | easeInOutTransitionProgress
372 | );
373 |
374 | if (this.transitionProgress >= 1) {
375 | this.transitioning = false;
376 | camPos.copy(this.transitionCamPosEnd);
377 | this.camRig.quaternion.copy(this.transitionCamQuaternionEnd);
378 | this.el.emit('navigation-end');
379 | }
380 | }
381 | }
382 | });
383 |
384 | /******/ return __webpack_exports__;
385 | /******/ })()
386 | ;
387 | });
388 | //# sourceMappingURL=aframe-cursor-teleport-component.js.map
--------------------------------------------------------------------------------
/dist/aframe-cursor-teleport-component.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"aframe-cursor-teleport-component.js","mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,O;;;;;ACVA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,gCAAgC;AAC/C,kBAAkB,+BAA+B;AACjD,iBAAiB,+BAA+B;AAChD,yBAAyB,6BAA6B;AACtD,mBAAmB,mCAAmC;AACtD,kBAAkB,kEAAkE;AACpF,wBAAwB,8BAA8B;AACtD,sBAAsB,6BAA6B;AACnD,uBAAuB,+BAA+B;AACtD,qBAAqB,yBAAyB,oBAAoB;AAClE,uBAAuB;AACvB,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA,KAAK;AACL,yDAAyD;;AAEzD;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,8CAA8C,8BAA8B;AAC5E;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC","sources":["webpack://aframe-cursor-teleport-component/webpack/universalModuleDefinition","webpack://aframe-cursor-teleport-component/./index.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, () => {\nreturn ","/* global AFRAME, THREE */\n\nif (typeof AFRAME === 'undefined') {\n throw new Error('Component attempted to register before AFRAME was available.');\n}\n\n/**\n * Cursor Teleport component for A-Frame.\n */\nAFRAME.registerComponent('cursor-teleport', {\n schema: {\n enabled: { type: 'boolean', default: true },\n cameraHead: { type: 'selector', default: '' },\n cameraRig: { type: 'selector', default: '' },\n collisionEntities: { type: 'string', default: '' },\n cursorColor: { type: 'color', default: '#4d93fd' },\n cursorType: { type: 'string', default: 'cylinder', oneOf: ['ring', 'cylinder'] },\n defaultPlaneSize: { type: 'number', default: 100 },\n ignoreEntities: { type: 'string', default: '' },\n landingMaxAngle: { default: 45, min: 0, max: 360 },\n landingNormal: { type: 'vec3', default: { x: 0, y: 1, z: 0 } },\n transitionSpeed: { type: 'number', default: 0.0006 }\n },\n\n init() {\n // platform detect\n this.mobile = AFRAME.utils.device.isMobile() || AFRAME.utils.device.isMobileDeviceRequestingDesktopSite();\n\n // main app\n const sceneEl = this.el.sceneEl;\n this.canvas = sceneEl.renderer.domElement;\n\n // camera\n this.data.cameraHead.object3D.traverse((child) => {\n if (child instanceof THREE.Camera) {\n this.cam = child; // This is the PerspectiveCamera\n }\n });\n this.camForRotation = this.data.cameraHead.object3D; // This is the Group, parent of the PerspectiveCamera\n\n this.camRig = this.data.cameraRig.object3D;\n\n // collision\n this.rayCaster = new THREE.Raycaster();\n this.collisionObjectNormalMatrix = new THREE.Matrix3();\n this.collisionWorldNormal = new THREE.Vector3();\n this.referenceNormal = new THREE.Vector3();\n this.rayCastObjects = [];\n\n // Update collision normal\n this.referenceNormal.copy(this.data.landingNormal);\n\n // RING teleport indicator\n const geo = new THREE.RingGeometry(0.25, 0.3, 32, 1);\n geo.rotateX(-Math.PI / 2);\n geo.translate(0, 0.02, 0);\n const mat = new THREE.MeshBasicMaterial({ color: this.data.cursorColor });\n const indicatorRing = new THREE.Mesh(geo, mat);\n const group = new THREE.Group();\n group.add(indicatorRing);\n this.teleportIndicator = group;\n this.teleportIndicator.visible = false;\n\n if (this.data.cursorType === 'cylinder') {\n // CYLINDER teleport indicator\n const geoCyl = new THREE.CylinderGeometry(0.3, 0.3, 0.5, 32, 1, true);\n geoCyl.translate(0, 0.25, 0);\n // texture source MIT license https://github.com/fernandojsg/aframe-teleport-controls/blob/master/lib/cylinderTexture.js\n const textureString =\n 'data:image/png;base64,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';\n const textureCyl = new THREE.TextureLoader().load(textureString);\n const matCyl = new THREE.MeshBasicMaterial({\n color: this.data.cursorColor,\n side: 'double',\n map: textureCyl,\n transparent: true,\n depthTest: false\n });\n const indicatorCyl = new THREE.Mesh(geoCyl, matCyl);\n group.add(indicatorCyl);\n }\n\n sceneEl.object3D.add(this.teleportIndicator);\n\n // transition\n this.transitioning = false;\n this.transitionProgress = 0;\n this.transitionCamPosStart = new THREE.Vector3();\n this.transitionCamPosEnd = new THREE.Vector3();\n this.transitionCamQuaternionStart = new THREE.Quaternion();\n this.transitionCamQuaternionEnd = new THREE.Quaternion();\n\n // Bind functions\n this.updateRaycastObjects = this.updateRaycastObjects.bind(this);\n this.getMouseState = this.getMouseState.bind(this);\n this.getTeleportPosition = this.getTeleportPosition.bind(this);\n this.isValidNormalsAngle = this.isValidNormalsAngle.bind(this);\n this.transition = this.transition.bind(this);\n this.mouseMove = this.mouseMove.bind(this);\n this.mouseDown = this.mouseDown.bind(this);\n this.mouseUp = this.mouseUp.bind(this);\n this.easeInOutQuad = this.easeInOutQuad.bind(this);\n this.teleportTo = this.teleportTo.bind(this);\n this.hideCursor = this.hideCursor.bind(this);\n\n this.updateRaycastObjects();\n },\n\n remove() {\n this.cam = null;\n this.canvas = null;\n this.rayCastObjects.length = 0;\n this.el.sceneEl.object3D.remove(this.teleportIndicator);\n for (const child of this.teleportIndicator.children) {\n child.material.dispose();\n child.geometry.dispose();\n }\n this.teleportIndicator = null;\n if (this.collisionMesh) {\n this.collisionMesh.geometry.dispose();\n this.collisionMesh.material.dispose();\n this.collisionMesh = null;\n }\n },\n\n update(oldData) {\n if (typeof oldData.enabled === 'undefined') return;\n if (!oldData.enabled && this.data.enabled) {\n this.registerEventListeners();\n }\n if (oldData.enabled && !this.data.enabled) {\n // Call unregisterEventListeners instead of pause that is a wrapped method unregistering tick method\n // because we still want the tick method to use the component via the teleportTo api.\n this.unregisterEventListeners();\n }\n },\n\n registerEventListeners() {\n const canvas = this.canvas;\n canvas.addEventListener('mousedown', this.mouseDown, false);\n canvas.addEventListener('mousemove', this.mouseMove, false);\n canvas.addEventListener('mouseup', this.mouseUp, false);\n canvas.addEventListener('touchstart', this.mouseDown, false);\n canvas.addEventListener('touchmove', this.mouseMove, false);\n canvas.addEventListener('touchend', this.mouseUp, false);\n window.addEventListener('keydown', this.hideCursor, false);\n },\n\n unregisterEventListeners() {\n this.transitioning = false;\n this.hideCursor();\n const canvas = this.canvas;\n canvas.removeEventListener('mousedown', this.mouseDown);\n canvas.removeEventListener('mousemove', this.mouseMove);\n canvas.removeEventListener('mouseup', this.mouseUp);\n canvas.removeEventListener('touchstart', this.mouseDown);\n canvas.removeEventListener('touchmove', this.mouseMove);\n canvas.removeEventListener('touchend', this.mouseUp);\n window.removeEventListener('keydown', this.hideCursor);\n },\n\n play() {\n if (!this.data.enabled) return;\n this.registerEventListeners();\n },\n\n pause() {\n this.unregisterEventListeners();\n },\n\n updateRaycastObjects() {\n // updates the array of meshes we will need to raycast to\n // clear the array of any existing meshes\n this.rayCastObjects.length = 0;\n\n if (this.data.collisionEntities !== '') {\n // traverse collision entities and add their meshes to the rayCastEntities array.\n const collisionEntities = this.el.sceneEl.querySelectorAll(this.data.collisionEntities);\n\n collisionEntities.forEach((e) => {\n e.object3D.traverse((child) => {\n if (child.isMesh) {\n // mark this mesh as a collision object\n child.userData.collision = true;\n this.rayCastObjects.push(child);\n }\n });\n });\n } else {\n if (!this.collisionMesh) {\n // if no collision entities are specified, create a default ground plane collision.\n const geo = new THREE.PlaneGeometry(this.data.defaultPlaneSize, this.data.defaultPlaneSize, 1);\n geo.rotateX(-Math.PI / 2);\n const mat = new THREE.MeshNormalMaterial();\n const collisionMesh = new THREE.Mesh(geo, mat);\n // mark this mesh as a collision object\n collisionMesh.userData.collision = true;\n this.collisionMesh = collisionMesh;\n }\n this.rayCastObjects.push(this.collisionMesh);\n }\n\n // We may need some entities to be seen by the raycaster even though they are not teleportable.\n // This prevents the user from unnesserily teleporting when clicking things like buttons or UI.\n if (this.data.ignoreEntities !== '') {\n const ignoreEntities = this.el.sceneEl.querySelectorAll(this.data.ignoreEntities);\n ignoreEntities.forEach((e) => {\n e.object3D.traverse((child) => {\n if (child.isMesh) {\n this.rayCastObjects.push(child);\n }\n });\n });\n }\n },\n\n getMouseState: (function () {\n const coordinates = new THREE.Vector2();\n return function (e) {\n const rect = this.canvas.getBoundingClientRect();\n if (e.clientX != null) {\n coordinates.x = e.clientX - rect.left;\n coordinates.y = e.clientY - rect.top;\n return coordinates;\n } else if (e.touches[0] != null) {\n coordinates.x = e.touches[0].clientX - rect.left;\n coordinates.y = e.touches[0].clientY - rect.top;\n return coordinates;\n }\n };\n })(),\n\n getTeleportPosition: (function () {\n const mouse = new THREE.Vector2();\n return function (mouseX, mouseY) {\n if (this.rayCastObjects.length !== 0) {\n if (this.cam && this.canvas) {\n const cam = this.cam;\n const rect = this.canvas.getBoundingClientRect();\n\n mouse.x = (mouseX / (rect.right - rect.left)) * 2 - 1;\n mouse.y = -(mouseY / (rect.bottom - rect.top)) * 2 + 1;\n this.rayCaster.setFromCamera(mouse, cam);\n const intersects = this.rayCaster.intersectObjects(this.rayCastObjects);\n if (intersects.length !== 0 && this.isValidNormalsAngle(intersects[0].face.normal, intersects[0].object)) {\n if (intersects[0].object.userData.collision === true) {\n return intersects[0].point;\n }\n return false;\n } else {\n return false;\n }\n } else {\n return false;\n }\n } else {\n return false;\n }\n };\n })(),\n\n isValidNormalsAngle(collisionNormal, collisionObject) {\n this.collisionObjectNormalMatrix.getNormalMatrix(collisionObject.matrixWorld);\n this.collisionWorldNormal.copy(collisionNormal).applyNormalMatrix(this.collisionObjectNormalMatrix);\n const angleNormals = this.referenceNormal.angleTo(this.collisionWorldNormal);\n return THREE.MathUtils.RAD2DEG * angleNormals <= this.data.landingMaxAngle;\n },\n\n transition(destPos, destQuaternion = undefined) {\n this.transitionProgress = 0;\n this.transitionCamPosEnd.copy(destPos);\n this.transitionCamPosStart.copy(this.camRig.position);\n if (destQuaternion) {\n this.transitionCamQuaternionEnd.copy(destQuaternion);\n this.transitionCamQuaternionStart.copy(this.camRig.quaternion);\n } else {\n this.transitionCamQuaternionEnd.copy(this.camRig.quaternion);\n this.transitionCamQuaternionStart.copy(this.transitionCamQuaternionEnd);\n }\n this.transitioning = true;\n this.el.emit('navigation-start');\n },\n\n hideCursor() {\n this.teleportIndicator.visible = false;\n },\n\n mouseMove(e) {\n const mouseState = this.getMouseState(e);\n this.mouseX = mouseState.x;\n this.mouseY = mouseState.y;\n },\n\n mouseDown(e) {\n this.updateRaycastObjects();\n\n const mouseState = this.getMouseState(e);\n this.mouseX = mouseState.x;\n this.mouseY = mouseState.y;\n\n this.mouseXOrig = mouseState.x;\n this.mouseYOrig = mouseState.y;\n },\n\n mouseUp(e) {\n if (this.mouseX === this.mouseXOrig && this.mouseY === this.mouseYOrig) {\n const pos = this.getTeleportPosition(this.mouseX, this.mouseY);\n if (pos) {\n this.teleportIndicator.visible = true;\n this.teleportIndicator.position.copy(pos);\n this.transition(pos);\n }\n }\n },\n\n teleportTo(pos, quaternion = undefined) {\n this.teleportIndicator.position.copy(pos);\n if (!quaternion) {\n this.transition(pos);\n } else {\n const destQuaternion = new THREE.Quaternion();\n destQuaternion.setFromEuler(new THREE.Euler(0, this.camForRotation.rotation.y, 0));\n destQuaternion.invert();\n destQuaternion.multiply(quaternion);\n this.transition(pos, destQuaternion);\n }\n // don't show the indicator when using via api\n this.hideCursor();\n },\n\n easeInOutQuad(t) {\n return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n },\n\n tick(time, delta) {\n if (!this.transitioning && !this.mobile) {\n const pos = this.getTeleportPosition(this.mouseX, this.mouseY);\n if (pos) {\n this.teleportIndicator.position.copy(pos);\n }\n }\n if (this.transitioning) {\n this.transitionProgress += delta * this.data.transitionSpeed;\n const easeInOutTransitionProgress = this.easeInOutQuad(this.transitionProgress);\n const value =\n easeInOutTransitionProgress < 0.5 ? easeInOutTransitionProgress : 0.5 - 1 * (easeInOutTransitionProgress - 0.5);\n this.teleportIndicator.scale.set(0.5 + value, 1, 0.5 + value);\n\n // set camera position\n const camPos = this.camRig.position;\n camPos.lerpVectors(this.transitionCamPosStart, this.transitionCamPosEnd, easeInOutTransitionProgress);\n\n this.camRig.quaternion.slerpQuaternions(\n this.transitionCamQuaternionStart,\n this.transitionCamQuaternionEnd,\n easeInOutTransitionProgress\n );\n\n if (this.transitionProgress >= 1) {\n this.transitioning = false;\n camPos.copy(this.transitionCamPosEnd);\n this.camRig.quaternion.copy(this.transitionCamQuaternionEnd);\n this.el.emit('navigation-end');\n }\n }\n }\n});\n"],"names":[],"sourceRoot":""}
--------------------------------------------------------------------------------
/dist/aframe-cursor-teleport-component.min.js:
--------------------------------------------------------------------------------
1 | !function(t,e){if("object"==typeof exports&&"object"==typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var i=e();for(var s in i)("object"==typeof exports?exports:t)[s]=i[s]}}(self,(()=>(()=>{if("undefined"==typeof AFRAME)throw new Error("Component attempted to register before AFRAME was available.");return AFRAME.registerComponent("cursor-teleport",{schema:{enabled:{type:"boolean",default:!0},cameraHead:{type:"selector",default:""},cameraRig:{type:"selector",default:""},collisionEntities:{type:"string",default:""},cursorColor:{type:"color",default:"#4d93fd"},cursorType:{type:"string",default:"cylinder",oneOf:["ring","cylinder"]},defaultPlaneSize:{type:"number",default:100},ignoreEntities:{type:"string",default:""},landingMaxAngle:{default:45,min:0,max:360},landingNormal:{type:"vec3",default:{x:0,y:1,z:0}},transitionSpeed:{type:"number",default:6e-4}},init(){this.mobile=AFRAME.utils.device.isMobile()||AFRAME.utils.device.isMobileDeviceRequestingDesktopSite();const t=this.el.sceneEl;this.canvas=t.renderer.domElement,this.data.cameraHead.object3D.traverse((t=>{t instanceof THREE.Camera&&(this.cam=t)})),this.camForRotation=this.data.cameraHead.object3D,this.camRig=this.data.cameraRig.object3D,this.rayCaster=new THREE.Raycaster,this.collisionObjectNormalMatrix=new THREE.Matrix3,this.collisionWorldNormal=new THREE.Vector3,this.referenceNormal=new THREE.Vector3,this.rayCastObjects=[],this.referenceNormal.copy(this.data.landingNormal);const e=new THREE.RingGeometry(.25,.3,32,1);e.rotateX(-Math.PI/2),e.translate(0,.02,0);const i=new THREE.MeshBasicMaterial({color:this.data.cursorColor}),s=new THREE.Mesh(e,i),o=new THREE.Group;if(o.add(s),this.teleportIndicator=o,this.teleportIndicator.visible=!1,"cylinder"===this.data.cursorType){const t=new THREE.CylinderGeometry(.3,.3,.5,32,1,!0);t.translate(0,.25,0);const e="data:image/png;base64,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",i=(new THREE.TextureLoader).load(e),s=new THREE.MeshBasicMaterial({color:this.data.cursorColor,side:"double",map:i,transparent:!0,depthTest:!1}),n=new THREE.Mesh(t,s);o.add(n)}t.object3D.add(this.teleportIndicator),this.transitioning=!1,this.transitionProgress=0,this.transitionCamPosStart=new THREE.Vector3,this.transitionCamPosEnd=new THREE.Vector3,this.transitionCamQuaternionStart=new THREE.Quaternion,this.transitionCamQuaternionEnd=new THREE.Quaternion,this.updateRaycastObjects=this.updateRaycastObjects.bind(this),this.getMouseState=this.getMouseState.bind(this),this.getTeleportPosition=this.getTeleportPosition.bind(this),this.isValidNormalsAngle=this.isValidNormalsAngle.bind(this),this.transition=this.transition.bind(this),this.mouseMove=this.mouseMove.bind(this),this.mouseDown=this.mouseDown.bind(this),this.mouseUp=this.mouseUp.bind(this),this.easeInOutQuad=this.easeInOutQuad.bind(this),this.teleportTo=this.teleportTo.bind(this),this.hideCursor=this.hideCursor.bind(this),this.updateRaycastObjects()},remove(){this.cam=null,this.canvas=null,this.rayCastObjects.length=0,this.el.sceneEl.object3D.remove(this.teleportIndicator);for(const t of this.teleportIndicator.children)t.material.dispose(),t.geometry.dispose();this.teleportIndicator=null,this.collisionMesh&&(this.collisionMesh.geometry.dispose(),this.collisionMesh.material.dispose(),this.collisionMesh=null)},update(t){void 0!==t.enabled&&(!t.enabled&&this.data.enabled&&this.registerEventListeners(),t.enabled&&!this.data.enabled&&this.unregisterEventListeners())},registerEventListeners(){const t=this.canvas;t.addEventListener("mousedown",this.mouseDown,!1),t.addEventListener("mousemove",this.mouseMove,!1),t.addEventListener("mouseup",this.mouseUp,!1),t.addEventListener("touchstart",this.mouseDown,!1),t.addEventListener("touchmove",this.mouseMove,!1),t.addEventListener("touchend",this.mouseUp,!1),window.addEventListener("keydown",this.hideCursor,!1)},unregisterEventListeners(){this.transitioning=!1,this.hideCursor();const t=this.canvas;t.removeEventListener("mousedown",this.mouseDown),t.removeEventListener("mousemove",this.mouseMove),t.removeEventListener("mouseup",this.mouseUp),t.removeEventListener("touchstart",this.mouseDown),t.removeEventListener("touchmove",this.mouseMove),t.removeEventListener("touchend",this.mouseUp),window.removeEventListener("keydown",this.hideCursor)},play(){this.data.enabled&&this.registerEventListeners()},pause(){this.unregisterEventListeners()},updateRaycastObjects(){if(this.rayCastObjects.length=0,""!==this.data.collisionEntities)this.el.sceneEl.querySelectorAll(this.data.collisionEntities).forEach((t=>{t.object3D.traverse((t=>{t.isMesh&&(t.userData.collision=!0,this.rayCastObjects.push(t))}))}));else{if(!this.collisionMesh){const t=new THREE.PlaneGeometry(this.data.defaultPlaneSize,this.data.defaultPlaneSize,1);t.rotateX(-Math.PI/2);const e=new THREE.MeshNormalMaterial,i=new THREE.Mesh(t,e);i.userData.collision=!0,this.collisionMesh=i}this.rayCastObjects.push(this.collisionMesh)}""!==this.data.ignoreEntities&&this.el.sceneEl.querySelectorAll(this.data.ignoreEntities).forEach((t=>{t.object3D.traverse((t=>{t.isMesh&&this.rayCastObjects.push(t)}))}))},getMouseState:function(){const t=new THREE.Vector2;return function(e){const i=this.canvas.getBoundingClientRect();return null!=e.clientX?(t.x=e.clientX-i.left,t.y=e.clientY-i.top,t):null!=e.touches[0]?(t.x=e.touches[0].clientX-i.left,t.y=e.touches[0].clientY-i.top,t):void 0}}(),getTeleportPosition:function(){const t=new THREE.Vector2;return function(e,i){if(0!==this.rayCastObjects.length){if(this.cam&&this.canvas){const s=this.cam,o=this.canvas.getBoundingClientRect();t.x=e/(o.right-o.left)*2-1,t.y=-i/(o.bottom-o.top)*2+1,this.rayCaster.setFromCamera(t,s);const n=this.rayCaster.intersectObjects(this.rayCastObjects);return!(0===n.length||!this.isValidNormalsAngle(n[0].face.normal,n[0].object))&&!0===n[0].object.userData.collision&&n[0].point}return!1}return!1}}(),isValidNormalsAngle(t,e){this.collisionObjectNormalMatrix.getNormalMatrix(e.matrixWorld),this.collisionWorldNormal.copy(t).applyNormalMatrix(this.collisionObjectNormalMatrix);const i=this.referenceNormal.angleTo(this.collisionWorldNormal);return THREE.MathUtils.RAD2DEG*i<=this.data.landingMaxAngle},transition(t,e=void 0){this.transitionProgress=0,this.transitionCamPosEnd.copy(t),this.transitionCamPosStart.copy(this.camRig.position),e?(this.transitionCamQuaternionEnd.copy(e),this.transitionCamQuaternionStart.copy(this.camRig.quaternion)):(this.transitionCamQuaternionEnd.copy(this.camRig.quaternion),this.transitionCamQuaternionStart.copy(this.transitionCamQuaternionEnd)),this.transitioning=!0,this.el.emit("navigation-start")},hideCursor(){this.teleportIndicator.visible=!1},mouseMove(t){const e=this.getMouseState(t);this.mouseX=e.x,this.mouseY=e.y},mouseDown(t){this.updateRaycastObjects();const e=this.getMouseState(t);this.mouseX=e.x,this.mouseY=e.y,this.mouseXOrig=e.x,this.mouseYOrig=e.y},mouseUp(t){if(this.mouseX===this.mouseXOrig&&this.mouseY===this.mouseYOrig){const t=this.getTeleportPosition(this.mouseX,this.mouseY);t&&(this.teleportIndicator.visible=!0,this.teleportIndicator.position.copy(t),this.transition(t))}},teleportTo(t,e=void 0){if(this.teleportIndicator.position.copy(t),e){const i=new THREE.Quaternion;i.setFromEuler(new THREE.Euler(0,this.camForRotation.rotation.y,0)),i.invert(),i.multiply(e),this.transition(t,i)}else this.transition(t);this.hideCursor()},easeInOutQuad:t=>t<.5?2*t*t:(4-2*t)*t-1,tick(t,e){if(!this.transitioning&&!this.mobile){const t=this.getTeleportPosition(this.mouseX,this.mouseY);t&&this.teleportIndicator.position.copy(t)}if(this.transitioning){this.transitionProgress+=e*this.data.transitionSpeed;const t=this.easeInOutQuad(this.transitionProgress),i=t<.5?t:.5-1*(t-.5);this.teleportIndicator.scale.set(.5+i,1,.5+i);const s=this.camRig.position;s.lerpVectors(this.transitionCamPosStart,this.transitionCamPosEnd,t),this.camRig.quaternion.slerpQuaternions(this.transitionCamQuaternionStart,this.transitionCamQuaternionEnd,t),this.transitionProgress>=1&&(this.transitioning=!1,s.copy(this.transitionCamPosEnd),this.camRig.quaternion.copy(this.transitionCamQuaternionEnd),this.el.emit("navigation-end"))}}}),{}})()));
2 | //# sourceMappingURL=aframe-cursor-teleport-component.min.js.map
--------------------------------------------------------------------------------
/dist/aframe-cursor-teleport-component.min.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"aframe-cursor-teleport-component.min.js","mappings":"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","sources":["webpack://aframe-cursor-teleport-component/webpack/universalModuleDefinition","webpack://aframe-cursor-teleport-component/./index.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, () => {\nreturn ","/* global AFRAME, THREE */\n\nif (typeof AFRAME === 'undefined') {\n throw new Error('Component attempted to register before AFRAME was available.');\n}\n\n/**\n * Cursor Teleport component for A-Frame.\n */\nAFRAME.registerComponent('cursor-teleport', {\n schema: {\n enabled: { type: 'boolean', default: true },\n cameraHead: { type: 'selector', default: '' },\n cameraRig: { type: 'selector', default: '' },\n collisionEntities: { type: 'string', default: '' },\n cursorColor: { type: 'color', default: '#4d93fd' },\n cursorType: { type: 'string', default: 'cylinder', oneOf: ['ring', 'cylinder'] },\n defaultPlaneSize: { type: 'number', default: 100 },\n ignoreEntities: { type: 'string', default: '' },\n landingMaxAngle: { default: 45, min: 0, max: 360 },\n landingNormal: { type: 'vec3', default: { x: 0, y: 1, z: 0 } },\n transitionSpeed: { type: 'number', default: 0.0006 }\n },\n\n init() {\n // platform detect\n this.mobile = AFRAME.utils.device.isMobile() || AFRAME.utils.device.isMobileDeviceRequestingDesktopSite();\n\n // main app\n const sceneEl = this.el.sceneEl;\n this.canvas = sceneEl.renderer.domElement;\n\n // camera\n this.data.cameraHead.object3D.traverse((child) => {\n if (child instanceof THREE.Camera) {\n this.cam = child; // This is the PerspectiveCamera\n }\n });\n this.camForRotation = this.data.cameraHead.object3D; // This is the Group, parent of the PerspectiveCamera\n\n this.camRig = this.data.cameraRig.object3D;\n\n // collision\n this.rayCaster = new THREE.Raycaster();\n this.collisionObjectNormalMatrix = new THREE.Matrix3();\n this.collisionWorldNormal = new THREE.Vector3();\n this.referenceNormal = new THREE.Vector3();\n this.rayCastObjects = [];\n\n // Update collision normal\n this.referenceNormal.copy(this.data.landingNormal);\n\n // RING teleport indicator\n const geo = new THREE.RingGeometry(0.25, 0.3, 32, 1);\n geo.rotateX(-Math.PI / 2);\n geo.translate(0, 0.02, 0);\n const mat = new THREE.MeshBasicMaterial({ color: this.data.cursorColor });\n const indicatorRing = new THREE.Mesh(geo, mat);\n const group = new THREE.Group();\n group.add(indicatorRing);\n this.teleportIndicator = group;\n this.teleportIndicator.visible = false;\n\n if (this.data.cursorType === 'cylinder') {\n // CYLINDER teleport indicator\n const geoCyl = new THREE.CylinderGeometry(0.3, 0.3, 0.5, 32, 1, true);\n geoCyl.translate(0, 0.25, 0);\n // texture source MIT license https://github.com/fernandojsg/aframe-teleport-controls/blob/master/lib/cylinderTexture.js\n const textureString =\n 'data:image/png;base64,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';\n const textureCyl = new THREE.TextureLoader().load(textureString);\n const matCyl = new THREE.MeshBasicMaterial({\n color: this.data.cursorColor,\n side: 'double',\n map: textureCyl,\n transparent: true,\n depthTest: false\n });\n const indicatorCyl = new THREE.Mesh(geoCyl, matCyl);\n group.add(indicatorCyl);\n }\n\n sceneEl.object3D.add(this.teleportIndicator);\n\n // transition\n this.transitioning = false;\n this.transitionProgress = 0;\n this.transitionCamPosStart = new THREE.Vector3();\n this.transitionCamPosEnd = new THREE.Vector3();\n this.transitionCamQuaternionStart = new THREE.Quaternion();\n this.transitionCamQuaternionEnd = new THREE.Quaternion();\n\n // Bind functions\n this.updateRaycastObjects = this.updateRaycastObjects.bind(this);\n this.getMouseState = this.getMouseState.bind(this);\n this.getTeleportPosition = this.getTeleportPosition.bind(this);\n this.isValidNormalsAngle = this.isValidNormalsAngle.bind(this);\n this.transition = this.transition.bind(this);\n this.mouseMove = this.mouseMove.bind(this);\n this.mouseDown = this.mouseDown.bind(this);\n this.mouseUp = this.mouseUp.bind(this);\n this.easeInOutQuad = this.easeInOutQuad.bind(this);\n this.teleportTo = this.teleportTo.bind(this);\n this.hideCursor = this.hideCursor.bind(this);\n\n this.updateRaycastObjects();\n },\n\n remove() {\n this.cam = null;\n this.canvas = null;\n this.rayCastObjects.length = 0;\n this.el.sceneEl.object3D.remove(this.teleportIndicator);\n for (const child of this.teleportIndicator.children) {\n child.material.dispose();\n child.geometry.dispose();\n }\n this.teleportIndicator = null;\n if (this.collisionMesh) {\n this.collisionMesh.geometry.dispose();\n this.collisionMesh.material.dispose();\n this.collisionMesh = null;\n }\n },\n\n update(oldData) {\n if (typeof oldData.enabled === 'undefined') return;\n if (!oldData.enabled && this.data.enabled) {\n this.registerEventListeners();\n }\n if (oldData.enabled && !this.data.enabled) {\n // Call unregisterEventListeners instead of pause that is a wrapped method unregistering tick method\n // because we still want the tick method to use the component via the teleportTo api.\n this.unregisterEventListeners();\n }\n },\n\n registerEventListeners() {\n const canvas = this.canvas;\n canvas.addEventListener('mousedown', this.mouseDown, false);\n canvas.addEventListener('mousemove', this.mouseMove, false);\n canvas.addEventListener('mouseup', this.mouseUp, false);\n canvas.addEventListener('touchstart', this.mouseDown, false);\n canvas.addEventListener('touchmove', this.mouseMove, false);\n canvas.addEventListener('touchend', this.mouseUp, false);\n window.addEventListener('keydown', this.hideCursor, false);\n },\n\n unregisterEventListeners() {\n this.transitioning = false;\n this.hideCursor();\n const canvas = this.canvas;\n canvas.removeEventListener('mousedown', this.mouseDown);\n canvas.removeEventListener('mousemove', this.mouseMove);\n canvas.removeEventListener('mouseup', this.mouseUp);\n canvas.removeEventListener('touchstart', this.mouseDown);\n canvas.removeEventListener('touchmove', this.mouseMove);\n canvas.removeEventListener('touchend', this.mouseUp);\n window.removeEventListener('keydown', this.hideCursor);\n },\n\n play() {\n if (!this.data.enabled) return;\n this.registerEventListeners();\n },\n\n pause() {\n this.unregisterEventListeners();\n },\n\n updateRaycastObjects() {\n // updates the array of meshes we will need to raycast to\n // clear the array of any existing meshes\n this.rayCastObjects.length = 0;\n\n if (this.data.collisionEntities !== '') {\n // traverse collision entities and add their meshes to the rayCastEntities array.\n const collisionEntities = this.el.sceneEl.querySelectorAll(this.data.collisionEntities);\n\n collisionEntities.forEach((e) => {\n e.object3D.traverse((child) => {\n if (child.isMesh) {\n // mark this mesh as a collision object\n child.userData.collision = true;\n this.rayCastObjects.push(child);\n }\n });\n });\n } else {\n if (!this.collisionMesh) {\n // if no collision entities are specified, create a default ground plane collision.\n const geo = new THREE.PlaneGeometry(this.data.defaultPlaneSize, this.data.defaultPlaneSize, 1);\n geo.rotateX(-Math.PI / 2);\n const mat = new THREE.MeshNormalMaterial();\n const collisionMesh = new THREE.Mesh(geo, mat);\n // mark this mesh as a collision object\n collisionMesh.userData.collision = true;\n this.collisionMesh = collisionMesh;\n }\n this.rayCastObjects.push(this.collisionMesh);\n }\n\n // We may need some entities to be seen by the raycaster even though they are not teleportable.\n // This prevents the user from unnesserily teleporting when clicking things like buttons or UI.\n if (this.data.ignoreEntities !== '') {\n const ignoreEntities = this.el.sceneEl.querySelectorAll(this.data.ignoreEntities);\n ignoreEntities.forEach((e) => {\n e.object3D.traverse((child) => {\n if (child.isMesh) {\n this.rayCastObjects.push(child);\n }\n });\n });\n }\n },\n\n getMouseState: (function () {\n const coordinates = new THREE.Vector2();\n return function (e) {\n const rect = this.canvas.getBoundingClientRect();\n if (e.clientX != null) {\n coordinates.x = e.clientX - rect.left;\n coordinates.y = e.clientY - rect.top;\n return coordinates;\n } else if (e.touches[0] != null) {\n coordinates.x = e.touches[0].clientX - rect.left;\n coordinates.y = e.touches[0].clientY - rect.top;\n return coordinates;\n }\n };\n })(),\n\n getTeleportPosition: (function () {\n const mouse = new THREE.Vector2();\n return function (mouseX, mouseY) {\n if (this.rayCastObjects.length !== 0) {\n if (this.cam && this.canvas) {\n const cam = this.cam;\n const rect = this.canvas.getBoundingClientRect();\n\n mouse.x = (mouseX / (rect.right - rect.left)) * 2 - 1;\n mouse.y = -(mouseY / (rect.bottom - rect.top)) * 2 + 1;\n this.rayCaster.setFromCamera(mouse, cam);\n const intersects = this.rayCaster.intersectObjects(this.rayCastObjects);\n if (intersects.length !== 0 && this.isValidNormalsAngle(intersects[0].face.normal, intersects[0].object)) {\n if (intersects[0].object.userData.collision === true) {\n return intersects[0].point;\n }\n return false;\n } else {\n return false;\n }\n } else {\n return false;\n }\n } else {\n return false;\n }\n };\n })(),\n\n isValidNormalsAngle(collisionNormal, collisionObject) {\n this.collisionObjectNormalMatrix.getNormalMatrix(collisionObject.matrixWorld);\n this.collisionWorldNormal.copy(collisionNormal).applyNormalMatrix(this.collisionObjectNormalMatrix);\n const angleNormals = this.referenceNormal.angleTo(this.collisionWorldNormal);\n return THREE.MathUtils.RAD2DEG * angleNormals <= this.data.landingMaxAngle;\n },\n\n transition(destPos, destQuaternion = undefined) {\n this.transitionProgress = 0;\n this.transitionCamPosEnd.copy(destPos);\n this.transitionCamPosStart.copy(this.camRig.position);\n if (destQuaternion) {\n this.transitionCamQuaternionEnd.copy(destQuaternion);\n this.transitionCamQuaternionStart.copy(this.camRig.quaternion);\n } else {\n this.transitionCamQuaternionEnd.copy(this.camRig.quaternion);\n this.transitionCamQuaternionStart.copy(this.transitionCamQuaternionEnd);\n }\n this.transitioning = true;\n this.el.emit('navigation-start');\n },\n\n hideCursor() {\n this.teleportIndicator.visible = false;\n },\n\n mouseMove(e) {\n const mouseState = this.getMouseState(e);\n this.mouseX = mouseState.x;\n this.mouseY = mouseState.y;\n },\n\n mouseDown(e) {\n this.updateRaycastObjects();\n\n const mouseState = this.getMouseState(e);\n this.mouseX = mouseState.x;\n this.mouseY = mouseState.y;\n\n this.mouseXOrig = mouseState.x;\n this.mouseYOrig = mouseState.y;\n },\n\n mouseUp(e) {\n if (this.mouseX === this.mouseXOrig && this.mouseY === this.mouseYOrig) {\n const pos = this.getTeleportPosition(this.mouseX, this.mouseY);\n if (pos) {\n this.teleportIndicator.visible = true;\n this.teleportIndicator.position.copy(pos);\n this.transition(pos);\n }\n }\n },\n\n teleportTo(pos, quaternion = undefined) {\n this.teleportIndicator.position.copy(pos);\n if (!quaternion) {\n this.transition(pos);\n } else {\n const destQuaternion = new THREE.Quaternion();\n destQuaternion.setFromEuler(new THREE.Euler(0, this.camForRotation.rotation.y, 0));\n destQuaternion.invert();\n destQuaternion.multiply(quaternion);\n this.transition(pos, destQuaternion);\n }\n // don't show the indicator when using via api\n this.hideCursor();\n },\n\n easeInOutQuad(t) {\n return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n },\n\n tick(time, delta) {\n if (!this.transitioning && !this.mobile) {\n const pos = this.getTeleportPosition(this.mouseX, this.mouseY);\n if (pos) {\n this.teleportIndicator.position.copy(pos);\n }\n }\n if (this.transitioning) {\n this.transitionProgress += delta * this.data.transitionSpeed;\n const easeInOutTransitionProgress = this.easeInOutQuad(this.transitionProgress);\n const value =\n easeInOutTransitionProgress < 0.5 ? easeInOutTransitionProgress : 0.5 - 1 * (easeInOutTransitionProgress - 0.5);\n this.teleportIndicator.scale.set(0.5 + value, 1, 0.5 + value);\n\n // set camera position\n const camPos = this.camRig.position;\n camPos.lerpVectors(this.transitionCamPosStart, this.transitionCamPosEnd, easeInOutTransitionProgress);\n\n this.camRig.quaternion.slerpQuaternions(\n this.transitionCamQuaternionStart,\n this.transitionCamQuaternionEnd,\n easeInOutTransitionProgress\n );\n\n if (this.transitionProgress >= 1) {\n this.transitioning = false;\n camPos.copy(this.transitionCamPosEnd);\n this.camRig.quaternion.copy(this.transitionCamQuaternionEnd);\n this.el.emit('navigation-end');\n }\n }\n }\n});\n"],"names":["root","factory","exports","module","define","amd","a","i","self","AFRAME","Error","registerComponent","schema","enabled","type","default","cameraHead","cameraRig","collisionEntities","cursorColor","cursorType","oneOf","defaultPlaneSize","ignoreEntities","landingMaxAngle","min","max","landingNormal","x","y","z","transitionSpeed","init","this","mobile","utils","device","isMobile","isMobileDeviceRequestingDesktopSite","sceneEl","el","canvas","renderer","domElement","data","object3D","traverse","child","THREE","Camera","cam","camForRotation","camRig","rayCaster","Raycaster","collisionObjectNormalMatrix","Matrix3","collisionWorldNormal","Vector3","referenceNormal","rayCastObjects","copy","geo","RingGeometry","rotateX","Math","PI","translate","mat","MeshBasicMaterial","color","indicatorRing","Mesh","group","Group","add","teleportIndicator","visible","geoCyl","CylinderGeometry","textureString","textureCyl","TextureLoader","load","matCyl","side","map","transparent","depthTest","indicatorCyl","transitioning","transitionProgress","transitionCamPosStart","transitionCamPosEnd","transitionCamQuaternionStart","Quaternion","transitionCamQuaternionEnd","updateRaycastObjects","bind","getMouseState","getTeleportPosition","isValidNormalsAngle","transition","mouseMove","mouseDown","mouseUp","easeInOutQuad","teleportTo","hideCursor","remove","length","children","material","dispose","geometry","collisionMesh","update","oldData","registerEventListeners","unregisterEventListeners","addEventListener","window","removeEventListener","play","pause","querySelectorAll","forEach","e","isMesh","userData","collision","push","PlaneGeometry","MeshNormalMaterial","coordinates","Vector2","rect","getBoundingClientRect","clientX","left","clientY","top","touches","mouse","mouseX","mouseY","right","bottom","setFromCamera","intersects","intersectObjects","face","normal","object","point","collisionNormal","collisionObject","getNormalMatrix","matrixWorld","applyNormalMatrix","angleNormals","angleTo","MathUtils","RAD2DEG","destPos","destQuaternion","undefined","position","quaternion","emit","mouseState","mouseXOrig","mouseYOrig","pos","setFromEuler","Euler","rotation","invert","multiply","t","tick","time","delta","easeInOutTransitionProgress","value","scale","set","camPos","lerpVectors","slerpQuaternions"],"sourceRoot":""}
--------------------------------------------------------------------------------
/examples/basic/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | A-Frame Cursor Teleport Component - Basic
6 |
7 |
8 |
9 |
10 |
11 |
12 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
38 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
--------------------------------------------------------------------------------
/examples/custom/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | A-Frame Cursor Teleport Component - Custom
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
43 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
--------------------------------------------------------------------------------
/examples/custom/models/environment.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/c-frame/aframe-cursor-teleport/658818f6f6c17a113c173cd04c8743b131ceb5ba/examples/custom/models/environment.glb
--------------------------------------------------------------------------------
/examples/custom/models/vr-collider.mtl:
--------------------------------------------------------------------------------
1 | # Blender MTL File: 'environment.blend'
2 | # Material Count: 1
3 |
4 | newmtl uv-checker|lm_environment
5 | Ns 9.000004
6 | Ka 1.000000 1.000000 1.000000
7 | Kd 0.800000 0.800000 0.800000
8 | Ks 0.500000 0.500000 0.500000
9 | Ke 0.000000 0.000000 0.000000
10 | Ni 1.450000
11 | d 1.000000
12 | illum 2
13 | map_Kd C:\\Paragram\\vr-development\\2020-07-24_navigator\\models\\textures\\uv-checker.jpg
14 |
--------------------------------------------------------------------------------
/examples/custom/models/vr-collider.obj:
--------------------------------------------------------------------------------
1 | # Blender v2.83.0 OBJ File: 'environment.blend'
2 | # www.blender.org
3 | mtllib vr-collider.mtl
4 | o Plane
5 | v -8.000000 0.000000 8.000000
6 | v 8.000000 0.000000 8.000000
7 | v -8.000000 0.000000 -8.000000
8 | v 8.000000 0.000000 -8.000000
9 | v -8.000000 0.000000 -4.000000
10 | v -8.000000 0.000000 0.000000
11 | v -8.000000 0.000000 4.000000
12 | v 8.000000 0.000000 4.000000
13 | v 8.000000 0.000000 0.000000
14 | v 8.000000 0.000000 -4.000000
15 | v -4.000000 0.000000 8.000000
16 | v 0.000000 0.000000 8.000000
17 | v 4.000000 0.000000 8.000000
18 | v 4.000000 0.000000 -8.000000
19 | v 0.000000 0.000000 -8.000000
20 | v -4.000000 0.000000 -8.000000
21 | v 4.000000 0.000000 4.000000
22 | v 0.000000 0.000000 4.000000
23 | v -4.000000 0.000000 4.000000
24 | v 4.000000 0.000000 0.000000
25 | v 0.000000 0.000000 0.000000
26 | v -4.000000 0.000000 0.000000
27 | v 4.000000 0.000000 -4.000000
28 | v 0.000000 0.000000 -4.000000
29 | v -4.000000 0.000000 -4.000000
30 | v -8.000000 -0.328289 8.000000
31 | v 8.000000 -0.328289 8.000000
32 | v -8.000000 -0.328289 -8.000000
33 | v 8.000000 -0.328289 -8.000000
34 | v -8.000000 -0.328289 -4.000000
35 | v -8.000000 -0.328289 0.000000
36 | v -8.000000 -0.328289 4.000000
37 | v 8.000000 -0.328289 4.000000
38 | v 8.000000 -0.328289 0.000000
39 | v 8.000000 -0.328289 -4.000000
40 | v -4.000000 -0.328289 8.000000
41 | v 0.000000 -0.328289 8.000000
42 | v 4.000000 -0.328289 8.000000
43 | v 4.000000 -0.328289 -8.000000
44 | v 0.000000 -0.328289 -8.000000
45 | v -4.000000 -0.328289 -8.000000
46 | v -6.590962 -0.328289 6.590962
47 | v 6.590962 -0.328289 6.590962
48 | v -6.590962 -0.328289 -6.590962
49 | v 6.590962 -0.328289 -6.590962
50 | v -6.590962 -0.328289 -3.295481
51 | v -6.590962 -0.328289 0.000000
52 | v -6.590962 -0.328289 3.295481
53 | v 6.590962 -0.328289 3.295481
54 | v 6.590962 -0.328289 0.000000
55 | v 6.590962 -0.328289 -3.295481
56 | v -3.295481 -0.328289 6.590962
57 | v 0.000000 -0.328289 6.590962
58 | v 3.295481 -0.328289 6.590962
59 | v 3.295481 -0.328289 -6.590962
60 | v 0.000000 -0.328289 -6.590962
61 | v -3.295481 -0.328289 -6.590962
62 | v -6.590962 -2.940611 6.590962
63 | v 6.590962 -2.940611 6.590962
64 | v -6.590962 -2.940611 -6.590962
65 | v 6.590962 -2.940611 -6.590962
66 | v -6.590962 -2.940611 -3.295481
67 | v -6.590962 -2.940611 0.000000
68 | v -6.590962 -2.940611 3.295481
69 | v 6.590962 -2.940611 3.295481
70 | v 6.590962 -2.940611 0.000000
71 | v 6.590962 -2.940611 -3.295481
72 | v -3.295481 -2.940611 6.590962
73 | v 0.000000 -2.940611 6.590962
74 | v 3.295481 -2.940611 6.590962
75 | v 3.295481 -2.940611 -6.590962
76 | v 0.000000 -2.940611 -6.590962
77 | v -3.295481 -2.940611 -6.590962
78 | v 0.000001 0.000000 -3.069546
79 | v 0.390181 0.038430 -3.069546
80 | v 0.765368 0.152241 -3.069546
81 | v 1.111141 0.337061 -3.069546
82 | v 1.961571 1.609821 -3.069546
83 | v 2.000000 2.000002 -3.069546
84 | v 1.414214 0.585787 -3.069546
85 | v 1.662940 0.888861 -3.069546
86 | v 1.847760 1.234635 -3.069546
87 | v 0.000001 0.000000 -6.069546
88 | v 0.390181 0.038430 -6.069546
89 | v 0.765368 0.152241 -6.069546
90 | v 1.111141 0.337061 -6.069546
91 | v 1.414214 0.585787 -6.069546
92 | v 1.662940 0.888861 -6.069546
93 | v 1.847760 1.234635 -6.069546
94 | v 1.961571 1.609821 -6.069546
95 | v 2.000000 2.000002 -6.069546
96 | v 2.964541 0.000000 -3.069546
97 | v 2.964541 0.000000 -6.069546
98 | v 2.964541 2.000002 -3.069546
99 | v 2.964541 2.000002 -6.069546
100 | v -2.118722 -0.000003 1.293438
101 | v -2.118722 2.982726 1.293438
102 | v -2.118722 -0.000003 1.418745
103 | v -2.118722 2.982726 1.418745
104 | v -7.346629 -0.000003 1.293438
105 | v -7.346629 2.982726 1.293438
106 | v -7.346629 -0.000003 1.418745
107 | v -7.346629 2.982726 1.418745
108 | v 5.389536 -0.000003 0.495008
109 | v 5.389536 2.982726 0.495008
110 | v 5.514844 -0.000003 0.495008
111 | v 5.514844 2.982726 0.495008
112 | v 5.389537 -0.000003 5.722915
113 | v 5.389537 2.982726 5.722915
114 | v 5.514844 -0.000003 5.722915
115 | v 5.514844 2.982726 5.722915
116 | v 0.240513 0.899911 3.990598
117 | v 0.240513 1.099911 3.990598
118 | v 0.240513 0.899911 1.990598
119 | v 0.240513 1.099911 1.990598
120 | v 2.240513 0.899911 3.990598
121 | v 2.240513 1.099911 3.990598
122 | v 2.240513 0.899911 1.990598
123 | v 2.240513 1.099911 1.990598
124 | v 1.479873 1.639635 5.294719
125 | v 1.479873 1.839635 5.294719
126 | v 1.479873 1.639635 3.294719
127 | v 1.479873 1.839635 3.294719
128 | v 3.479873 1.639635 5.294719
129 | v 3.479873 1.839635 5.294719
130 | v 3.479873 1.639635 3.294719
131 | v 3.479873 1.839635 3.294719
132 | v 0.288719 2.420509 6.772532
133 | v 0.288719 2.620509 6.772532
134 | v 0.288719 2.420509 4.772532
135 | v 0.288719 2.620509 4.772532
136 | v 2.288719 2.420509 6.772532
137 | v 2.288719 2.620509 6.772532
138 | v 2.288719 2.420509 4.772532
139 | v 2.288719 2.620509 4.772532
140 | v -16.000000 -0.691323 16.000000
141 | v 16.000000 -0.048527 16.000000
142 | v -16.000000 -0.584955 -16.000000
143 | v 16.000000 -0.911990 -16.000000
144 | v -8.000000 -0.911990 16.000000
145 | v 0.000000 0.464535 16.000000
146 | v 8.000000 0.851952 16.000000
147 | v 8.000000 0.826505 -16.000000
148 | v 0.000000 0.147359 -16.000000
149 | v -8.000000 -0.584955 -16.000000
150 | v -16.000000 1.459539 -8.000000
151 | v -16.000000 -0.366294 0.000000
152 | v -16.000000 1.084192 8.000000
153 | v 16.000000 0.867325 8.000000
154 | v 16.000000 0.321344 0.000000
155 | v 16.000000 -0.133569 -8.000000
156 | v -8.000000 -0.911990 8.000000
157 | v -8.000000 -0.911990 0.000000
158 | v -8.000000 -0.880091 -8.000000
159 | v 0.000000 -0.911990 8.000000
160 | v 0.000000 -0.911990 0.000000
161 | v 0.000000 -0.911990 -8.000000
162 | v 8.000000 -0.797832 8.000000
163 | v 8.000000 -0.911990 0.000000
164 | v 8.000000 -0.453127 -8.000000
165 | v -16.000000 0.549155 10.666667
166 | v -16.000000 -0.096277 13.333334
167 | v 10.666667 0.226302 16.000000
168 | v 13.333334 0.128510 16.000000
169 | v 16.000000 -0.453127 -10.666667
170 | v 16.000000 -0.749373 -13.333334
171 | v -10.666667 -0.166009 -16.000000
172 | v -13.333334 -0.166009 -16.000000
173 | v -13.333333 -0.797832 16.000000
174 | v -10.666666 -0.911990 16.000000
175 | v -5.333333 -0.880091 16.000000
176 | v -2.666667 -0.402945 16.000000
177 | v 2.666667 1.330854 16.000000
178 | v 5.333333 1.303651 16.000000
179 | v 13.333333 -0.565240 -16.000000
180 | v 10.666666 0.311224 -16.000000
181 | v 5.333333 0.784997 -16.000000
182 | v 2.666667 0.445479 -16.000000
183 | v -2.666667 -0.402945 -16.000000
184 | v -5.333333 -0.880091 -16.000000
185 | v -8.000000 -0.584955 -10.666667
186 | v -8.000000 -0.402945 -13.333334
187 | v 0.000000 -0.721581 -10.666667
188 | v 0.000000 -0.166009 -13.333334
189 | v 8.000000 -0.132838 -10.666667
190 | v 8.000000 0.451101 -13.333334
191 | v -16.000000 -0.358722 -13.333333
192 | v -16.000000 0.142027 -10.666666
193 | v -16.000000 1.806245 -5.333333
194 | v -16.000000 0.650969 -2.666667
195 | v -16.000000 0.286597 2.666667
196 | v -16.000000 1.015272 5.333333
197 | v 16.000000 0.869034 13.333333
198 | v 16.000000 1.151055 10.666666
199 | v 16.000000 0.188060 5.333333
200 | v 16.000000 -0.084642 2.666667
201 | v 16.000000 0.794605 -2.666667
202 | v 16.000000 0.450542 -5.333333
203 | v -8.000000 -0.911990 13.333333
204 | v -8.000000 -0.911990 10.666666
205 | v -8.000000 -0.911990 5.333333
206 | v -8.000000 -0.911990 2.666667
207 | v -8.000000 -0.911990 -2.666667
208 | v -8.000000 -0.911990 -5.333333
209 | v 0.000000 0.001121 13.333333
210 | v 0.000000 -0.721581 10.666666
211 | v 0.000000 -0.911990 5.333333
212 | v 0.000000 -0.911990 2.666667
213 | v 0.000000 -0.911990 -2.666667
214 | v 0.000000 -0.911990 -5.333333
215 | v 8.000000 0.728121 13.333333
216 | v 8.000000 -0.181277 10.666666
217 | v 8.000000 -0.911990 5.333333
218 | v 8.000000 -0.911990 2.666667
219 | v 8.000000 -0.911990 -2.666667
220 | v 8.000000 -0.749374 -5.333333
221 | v 5.333333 -0.911990 8.000000
222 | v 2.666667 -0.911990 8.000000
223 | v 5.333333 -0.911990 0.000000
224 | v 2.666667 -0.911990 0.000000
225 | v 5.333333 -0.890267 -8.000000
226 | v 2.666667 -0.911990 -8.000000
227 | v -2.666667 -0.911990 8.000000
228 | v -5.333333 -0.911990 8.000000
229 | v -2.666667 -0.911990 0.000000
230 | v -5.333333 -0.911990 0.000000
231 | v -2.666667 -0.911990 -8.000000
232 | v -5.333333 -0.911990 -8.000000
233 | v -10.666667 -0.629891 8.000000
234 | v -13.333334 0.473982 8.000000
235 | v -10.666667 -0.911990 0.000000
236 | v -13.333334 -0.629891 0.000000
237 | v -10.666667 -0.458944 -8.000000
238 | v -13.333334 0.735703 -8.000000
239 | v 13.333333 0.306705 8.000000
240 | v 10.666666 -0.644337 8.000000
241 | v 13.333333 -0.080276 0.000000
242 | v 10.666666 -0.743843 0.000000
243 | v 13.333333 0.210789 -8.000000
244 | v 10.666666 0.059304 -8.000000
245 | v 10.666666 -0.565250 -2.666667
246 | v 10.666666 -0.288780 -5.333333
247 | v 13.333333 0.311201 -2.666667
248 | v 13.333333 0.365959 -5.333333
249 | v 10.666666 -0.721581 5.333333
250 | v 10.666666 -0.880091 2.666667
251 | v 13.333333 -0.162306 5.333333
252 | v 13.333333 -0.418743 2.666667
253 | v 10.666667 0.506398 13.333333
254 | v 10.666666 0.175744 10.666666
255 | v 13.333334 0.982874 13.333333
256 | v 13.333334 0.742900 10.666666
257 | v -13.333334 0.124289 -2.666667
258 | v -13.333334 0.999198 -5.333333
259 | v -10.666667 -0.758749 -2.666667
260 | v -10.666667 -0.427487 -5.333333
261 | v -13.333334 0.402985 5.333333
262 | v -13.333334 -0.085518 2.666667
263 | v -10.666667 -0.588231 5.333333
264 | v -10.666667 -0.744726 2.666667
265 | v -13.333333 -0.349372 13.333333
266 | v -13.333334 0.065507 10.666666
267 | v -10.666666 -0.797833 13.333333
268 | v -10.666666 -0.691323 10.666666
269 | v -5.333333 -0.911990 -2.666667
270 | v -5.333333 -0.911990 -5.333333
271 | v -2.666667 -0.911990 -2.666667
272 | v -2.666667 -0.911990 -5.333333
273 | v -5.333333 -0.911990 5.333333
274 | v -5.333333 -0.911990 2.666667
275 | v -2.666667 -0.911990 5.333333
276 | v -2.666667 -0.911990 2.666667
277 | v -5.333333 -0.908978 13.333333
278 | v -5.333333 -0.911990 10.666666
279 | v -2.666667 -0.584955 13.333333
280 | v -2.666667 -0.880091 10.666666
281 | v 2.666667 -0.911990 -2.666667
282 | v 2.666667 -0.911990 -5.333333
283 | v 5.333333 -0.911990 -2.666667
284 | v 5.333333 -0.911990 -5.333333
285 | v 2.666667 -0.911990 5.333333
286 | v 2.666667 -0.911990 2.666667
287 | v 5.333333 -0.911990 5.333333
288 | v 5.333333 -0.911990 2.666667
289 | v 2.666667 0.660122 13.333333
290 | v 2.666667 -0.555272 10.666666
291 | v 5.333333 0.614561 13.333333
292 | v 5.333333 -0.476861 10.666666
293 | v 2.666667 -0.721581 -10.666667
294 | v 2.666667 -0.006984 -13.333334
295 | v 5.333333 -0.711943 -10.666667
296 | v 5.333333 0.239761 -13.333334
297 | v -5.333333 -0.908978 -10.666667
298 | v -5.333333 -0.880091 -13.333334
299 | v -2.666667 -0.880091 -10.666667
300 | v -2.666667 -0.584955 -13.333334
301 | v -13.333334 0.312484 -10.666667
302 | v -13.333334 0.151796 -13.333334
303 | v -10.666667 -0.119929 -10.666667
304 | v -10.666667 0.147359 -13.333334
305 | v 10.666666 0.211838 -10.666667
306 | v 10.666666 0.367246 -13.333334
307 | v 13.333333 0.059304 -10.666667
308 | v 13.333333 -0.288272 -13.333334
309 | v -16.000000 -0.402945 14.666667
310 | v 14.666667 0.090468 16.000000
311 | v 16.000000 -0.880091 -14.666667
312 | v -14.666667 -0.349372 -16.000000
313 | v -9.333333 -0.911990 16.000000
314 | v -1.333333 -0.050158 16.000000
315 | v 6.666667 0.972866 16.000000
316 | v 9.333333 0.651315 -16.000000
317 | v 1.333333 0.282623 -16.000000
318 | v -6.666667 -0.797832 -16.000000
319 | v -8.000000 -0.453127 -14.666667
320 | v 0.000000 0.059304 -14.666667
321 | v 8.000000 0.680266 -14.666667
322 | v -16.000000 0.780549 -9.333333
323 | v -16.000000 -0.085769 -1.333333
324 | v -16.000000 1.151054 6.666667
325 | v 16.000000 1.084192 9.333333
326 | v 16.000000 0.056380 1.333333
327 | v 16.000000 0.160253 -6.666667
328 | v -8.000000 -0.911990 9.333333
329 | v -8.000000 -0.911990 1.333333
330 | v -8.000000 -0.911990 -6.666667
331 | v 0.000000 -0.890267 9.333333
332 | v 0.000000 -0.911990 1.333333
333 | v 0.000000 -0.911990 -6.666667
334 | v 8.000000 -0.580610 9.333333
335 | v 8.000000 -0.911990 1.333333
336 | v 8.000000 -0.584955 -6.666667
337 | v 1.333333 -0.911990 8.000000
338 | v 1.333333 -0.911990 0.000000
339 | v 1.333333 -0.911990 -8.000000
340 | v -6.666667 -0.911990 8.000000
341 | v -6.666667 -0.911990 0.000000
342 | v -6.666667 -0.911990 -8.000000
343 | v -14.666667 0.917451 8.000000
344 | v -14.666667 -0.441142 0.000000
345 | v -14.666667 1.257823 -8.000000
346 | v 9.333333 -0.721581 8.000000
347 | v 9.333333 -0.907554 0.000000
348 | v 9.333333 -0.166009 -8.000000
349 | v -16.000000 0.867325 9.333334
350 | v -16.000000 0.188060 12.000000
351 | v 9.333334 0.581374 16.000000
352 | v 12.000000 0.067480 16.000000
353 | v 16.000000 -0.358329 -9.333334
354 | v 16.000000 -0.584955 -12.000000
355 | v -9.333334 -0.349371 -16.000000
356 | v -12.000000 -0.096277 -16.000000
357 | v -14.666666 -0.721581 16.000000
358 | v -12.000000 -0.880091 16.000000
359 | v -6.666667 -0.911990 16.000000
360 | v -4.000000 -0.691323 16.000000
361 | v 1.333333 0.978450 16.000000
362 | v 4.000000 1.456893 16.000000
363 | v 14.666666 -0.862000 -16.000000
364 | v 12.000000 -0.130298 -16.000000
365 | v 6.666667 0.866306 -16.000000
366 | v 4.000000 0.627421 -16.000000
367 | v -1.333333 -0.096277 -16.000000
368 | v -4.000000 -0.691323 -16.000000
369 | v -8.000000 -0.749373 -9.333334
370 | v -8.000000 -0.453127 -12.000000
371 | v 0.000000 -0.890266 -9.333334
372 | v 0.000000 -0.453127 -12.000000
373 | v 8.000000 -0.358044 -9.333334
374 | v 8.000000 0.161102 -12.000000
375 | v -16.000000 -0.453127 -14.666666
376 | v -16.000000 -0.137437 -12.000000
377 | v -16.000000 1.853955 -6.666667
378 | v -16.000000 1.348855 -4.000000
379 | v -16.000000 -0.131828 1.333333
380 | v -16.000000 0.677538 4.000000
381 | v 16.000000 0.479860 14.666666
382 | v 16.000000 1.015272 12.000000
383 | v 16.000000 0.549155 6.666667
384 | v 16.000000 -0.055248 4.000000
385 | v 16.000000 0.648367 -1.333333
386 | v 16.000000 0.680188 -4.000000
387 | v -8.000000 -0.911990 14.666666
388 | v -8.000000 -0.911990 12.000000
389 | v -8.000000 -0.911990 6.666667
390 | v -8.000000 -0.911990 4.000000
391 | v -8.000000 -0.911990 -1.333333
392 | v -8.000000 -0.911990 -4.000000
393 | v 0.000000 0.334655 14.666666
394 | v 0.000000 -0.406164 12.000000
395 | v 0.000000 -0.911990 6.666667
396 | v 0.000000 -0.911990 4.000000
397 | v 0.000000 -0.911990 -1.333333
398 | v 0.000000 -0.911990 -4.000000
399 | v 8.000000 0.929645 14.666666
400 | v 8.000000 0.313857 12.000000
401 | v 8.000000 -0.908978 6.666667
402 | v 8.000000 -0.911990 4.000000
403 | v 8.000000 -0.911990 -1.333333
404 | v 8.000000 -0.880091 -4.000000
405 | v 6.666667 -0.880091 8.000000
406 | v 4.000000 -0.911990 8.000000
407 | v 6.666667 -0.911990 0.000000
408 | v 4.000000 -0.911990 0.000000
409 | v 6.666667 -0.721581 -8.000000
410 | v 4.000000 -0.911990 -8.000000
411 | v -1.333333 -0.911990 8.000000
412 | v -4.000000 -0.911990 8.000000
413 | v -1.333333 -0.911990 0.000000
414 | v -4.000000 -0.911990 0.000000
415 | v -1.333333 -0.911990 -8.000000
416 | v -4.000000 -0.911990 -8.000000
417 | v -9.333334 -0.904672 8.000000
418 | v -12.000000 -0.103622 8.000000
419 | v -9.333334 -0.911990 0.000000
420 | v -12.000000 -0.833434 0.000000
421 | v -9.333334 -0.772254 -8.000000
422 | v -12.000000 0.069567 -8.000000
423 | v 14.666666 0.712755 8.000000
424 | v 12.000000 -0.214850 8.000000
425 | v 14.666666 0.208492 0.000000
426 | v 12.000000 -0.430287 0.000000
427 | v 14.666666 0.101252 -8.000000
428 | v 12.000000 0.184539 -8.000000
429 | v 10.666666 -0.124034 -6.666667
430 | v 10.666666 -0.631530 -1.333333
431 | v 10.666666 -0.441991 -4.000000
432 | v 13.333333 0.297669 -6.666667
433 | v 13.333333 0.186794 -1.333333
434 | v 13.333333 0.375181 -4.000000
435 | v 9.333333 -0.861992 -2.666667
436 | v 9.333333 -0.580811 -5.333333
437 | v 12.000000 -0.130342 -2.666667
438 | v 12.000000 0.070314 -5.333333
439 | v 14.666666 0.651378 -2.666667
440 | v 14.666666 0.507872 -5.333333
441 | v 10.666666 -0.865004 1.333333
442 | v 10.666666 -0.691323 6.666667
443 | v 10.666666 -0.797833 4.000000
444 | v 13.333333 -0.316556 1.333333
445 | v 13.333333 0.065507 6.666667
446 | v 13.333333 -0.345771 4.000000
447 | v 9.333333 -0.890267 5.333333
448 | v 9.333333 -0.911990 2.666667
449 | v 12.000000 -0.453127 5.333333
450 | v 12.000000 -0.702632 2.666667
451 | v 14.666666 0.087167 5.333333
452 | v 14.666666 -0.177702 2.666667
453 | v 10.666666 -0.236304 9.333333
454 | v 10.666667 0.420593 14.666666
455 | v 10.666666 0.454313 12.000000
456 | v 13.333334 0.473982 9.333333
457 | v 13.333334 0.650106 14.666666
458 | v 13.333334 1.019074 12.000000
459 | v 9.333334 0.619202 13.333333
460 | v 9.333333 -0.119542 10.666666
461 | v 12.000000 0.795313 13.333333
462 | v 12.000000 0.498826 10.666666
463 | v 14.666667 1.021930 13.333333
464 | v 14.666667 0.973583 10.666666
465 | v -13.333334 1.029626 -6.666667
466 | v -13.333334 -0.426393 -1.333333
467 | v -13.333334 0.658200 -4.000000
468 | v -10.666667 -0.415932 -6.666667
469 | v -10.666667 -0.880091 -1.333333
470 | v -10.666667 -0.566844 -4.000000
471 | v -14.666667 0.505926 -2.666667
472 | v -14.666667 1.578016 -5.333333
473 | v -12.000000 -0.357081 -2.666667
474 | v -12.000000 0.260821 -5.333333
475 | v -9.333334 -0.908978 -2.666667
476 | v -9.333334 -0.855600 -5.333333
477 | v -13.333334 -0.428825 1.333333
478 | v -13.333334 0.513198 6.666667
479 | v -13.333334 0.187164 4.000000
480 | v -10.666667 -0.865454 1.333333
481 | v -10.666667 -0.600486 6.666667
482 | v -10.666667 -0.632699 4.000000
483 | v -14.666667 0.838705 5.333333
484 | v -14.666667 0.184079 2.666667
485 | v -12.000000 -0.131828 5.333333
486 | v -12.000000 -0.431881 2.666667
487 | v -9.333334 -0.865454 5.333333
488 | v -9.333334 -0.907688 2.666667
489 | v -13.333334 0.306705 9.333333
490 | v -13.333333 -0.584955 14.666666
491 | v -13.333334 -0.162306 12.000000
492 | v -10.666666 -0.674604 9.333333
493 | v -10.666666 -0.880091 14.666666
494 | v -10.666666 -0.721581 12.000000
495 | v -14.666666 -0.166009 13.333334
496 | v -14.666667 0.411195 10.666666
497 | v -12.000000 -0.584955 13.333333
498 | v -12.000000 -0.356726 10.666666
499 | v -9.333333 -0.908978 13.333333
500 | v -9.333333 -0.880091 10.666666
501 | v -5.333333 -0.911990 -6.666667
502 | v -5.333333 -0.911990 -1.333333
503 | v -5.333333 -0.911990 -4.000000
504 | v -2.666667 -0.911990 -6.666667
505 | v -2.666667 -0.911990 -1.333333
506 | v -2.666667 -0.911990 -4.000000
507 | v -6.666667 -0.911990 -2.666667
508 | v -6.666667 -0.911990 -5.333333
509 | v -4.000000 -0.911990 -2.666667
510 | v -4.000000 -0.911990 -5.333333
511 | v -1.333333 -0.911990 -2.666667
512 | v -1.333333 -0.911990 -5.333333
513 | v -5.333333 -0.911990 1.333333
514 | v -5.333333 -0.911990 6.666667
515 | v -5.333333 -0.911990 4.000000
516 | v -2.666667 -0.911990 1.333333
517 | v -2.666667 -0.911990 6.666667
518 | v -2.666667 -0.911990 4.000000
519 | v -6.666667 -0.911990 5.333333
520 | v -6.666667 -0.911990 2.666667
521 | v -4.000000 -0.911990 5.333333
522 | v -4.000000 -0.911990 2.666667
523 | v -1.333333 -0.911990 5.333333
524 | v -1.333333 -0.911990 2.666667
525 | v -5.333333 -0.911990 9.333333
526 | v -5.333333 -0.890267 14.666666
527 | v -5.333333 -0.911990 12.000000
528 | v -2.666667 -0.911990 9.333333
529 | v -2.666667 -0.453127 14.666666
530 | v -2.666667 -0.749373 12.000000
531 | v -6.666667 -0.911990 13.333333
532 | v -6.666667 -0.911990 10.666666
533 | v -4.000000 -0.797832 13.333333
534 | v -4.000000 -0.911990 10.666666
535 | v -1.333333 -0.344943 13.333333
536 | v -1.333333 -0.797833 10.666666
537 | v 2.666667 -0.911990 -6.666667
538 | v 2.666667 -0.911990 -1.333333
539 | v 2.666667 -0.911990 -4.000000
540 | v 5.333333 -0.908978 -6.666667
541 | v 5.333333 -0.911990 -1.333333
542 | v 5.333333 -0.911990 -4.000000
543 | v 1.333333 -0.911990 -2.666667
544 | v 1.333333 -0.911990 -5.333333
545 | v 4.000000 -0.911990 -2.666667
546 | v 4.000000 -0.911990 -5.333333
547 | v 6.666667 -0.911990 -2.666667
548 | v 6.666667 -0.880091 -5.333333
549 | v 2.666667 -0.911990 1.333333
550 | v 2.666667 -0.911990 6.666667
551 | v 2.666667 -0.911990 4.000000
552 | v 5.333333 -0.911990 1.333333
553 | v 5.333333 -0.911990 6.666667
554 | v 5.333333 -0.911990 4.000000
555 | v 1.333333 -0.911990 5.333333
556 | v 1.333333 -0.911990 2.666667
557 | v 4.000000 -0.911990 5.333333
558 | v 4.000000 -0.911990 2.666667
559 | v 6.666667 -0.911990 5.333333
560 | v 6.666667 -0.911990 2.666667
561 | v 2.666667 -0.886465 9.333333
562 | v 2.666667 1.146209 14.666666
563 | v 2.666667 0.028494 12.000000
564 | v 5.333333 -0.835190 9.333333
565 | v 5.333333 1.107037 14.666666
566 | v 5.333333 0.023858 12.000000
567 | v 1.333333 0.382352 13.333333
568 | v 1.333333 -0.645105 10.666666
569 | v 4.000000 0.749253 13.333333
570 | v 4.000000 -0.521106 10.666666
571 | v 6.666667 0.695840 13.333333
572 | v 6.666667 -0.305290 10.666666
573 | v 2.666667 0.318997 -14.666667
574 | v 2.666667 -0.890266 -9.333334
575 | v 2.666667 -0.407815 -12.000000
576 | v 5.333333 0.635517 -14.666667
577 | v 5.333333 -0.875654 -9.333334
578 | v 5.333333 -0.268230 -12.000000
579 | v 1.333333 -0.691323 -10.666667
580 | v 1.333333 -0.093382 -13.333334
581 | v 4.000000 -0.750909 -10.666667
582 | v 4.000000 0.123158 -13.333334
583 | v 6.666667 -0.441724 -10.666667
584 | v 6.666667 0.300575 -13.333334
585 | v -5.333333 -0.890266 -14.666667
586 | v -5.333333 -0.911990 -9.333334
587 | v -5.333333 -0.890267 -12.000000
588 | v -2.666667 -0.453127 -14.666667
589 | v -2.666667 -0.911990 -9.333334
590 | v -2.666667 -0.749373 -12.000000
591 | v -6.666667 -0.797833 -10.666667
592 | v -6.666667 -0.691323 -13.333334
593 | v -4.000000 -0.911990 -10.666667
594 | v -4.000000 -0.797832 -13.333334
595 | v -1.333333 -0.797832 -10.666667
596 | v -1.333333 -0.349372 -13.333334
597 | v -13.333334 0.059304 -14.666667
598 | v -13.333334 0.359153 -9.333334
599 | v -13.333334 0.227310 -12.000000
600 | v -10.666667 0.059304 -14.666667
601 | v -10.666667 -0.291459 -9.333334
602 | v -10.666667 0.059304 -12.000000
603 | v -14.666667 0.316627 -10.666666
604 | v -14.666667 -0.064729 -13.333334
605 | v -12.000000 0.141942 -10.666667
606 | v -12.000000 0.246643 -13.333334
607 | v -9.333334 -0.349372 -10.666667
608 | v -9.333334 -0.096277 -13.333334
609 | v 10.666666 0.375802 -14.666667
610 | v 10.666666 0.149350 -9.333334
611 | v 10.666666 0.299162 -12.000000
612 | v 13.333333 -0.441724 -14.666667
613 | v 13.333333 0.149228 -9.333334
614 | v 13.333333 -0.123626 -12.000000
615 | v 9.333333 0.102343 -10.666667
616 | v 9.333333 0.508976 -13.333334
617 | v 12.000000 0.185088 -10.666667
618 | v 12.000000 0.071335 -13.333334
619 | v 14.666666 -0.166009 -10.666667
620 | v 14.666666 -0.580757 -13.333334
621 | v 14.666666 -0.349371 -12.000000
622 | v 14.666666 -0.069131 -9.333334
623 | v 12.000000 0.129927 -12.000000
624 | v 12.000000 0.246643 -9.333334
625 | v 9.333333 0.315236 -12.000000
626 | v 9.333333 -0.068773 -9.333334
627 | v 12.000000 -0.016878 -14.666667
628 | v 9.333333 0.632353 -14.666667
629 | v -9.333334 -0.166009 -12.000000
630 | v -9.333334 -0.581883 -9.333334
631 | v -12.000000 0.194345 -12.000000
632 | v -12.000000 0.068899 -9.333334
633 | v -14.666667 0.112097 -12.000000
634 | v -14.666667 0.625666 -9.333333
635 | v -12.000000 0.147359 -14.666667
636 | v -14.666667 -0.166009 -14.666667
637 | v -1.333333 -0.584955 -12.000000
638 | v -1.333333 -0.908978 -9.333334
639 | v -4.000000 -0.880091 -12.000000
640 | v -4.000000 -0.911990 -9.333334
641 | v -6.666667 -0.721581 -12.000000
642 | v -6.666667 -0.880091 -9.333334
643 | v -4.000000 -0.721581 -14.666667
644 | v -6.666667 -0.721581 -14.666667
645 | v 6.666667 -0.122227 -12.000000
646 | v 6.666667 -0.659595 -9.333334
647 | v 4.000000 -0.347344 -12.000000
648 | v 4.000000 -0.908978 -9.333334
649 | v 1.333333 -0.402945 -12.000000
650 | v 1.333333 -0.880091 -9.333334
651 | v 4.000000 0.489553 -14.666667
652 | v 1.333333 0.171850 -14.666667
653 | v 6.666667 0.222649 12.000000
654 | v 6.666667 0.977354 14.666666
655 | v 4.000000 0.089591 12.000000
656 | v 4.000000 1.260742 14.666666
657 | v 1.333333 -0.163420 12.000000
658 | v 1.333333 0.811125 14.666666
659 | v 4.000000 -0.878896 9.333333
660 | v 1.333333 -0.880091 9.333333
661 | v 6.666667 -0.911990 4.000000
662 | v 6.666667 -0.911990 6.666667
663 | v 4.000000 -0.911990 4.000000
664 | v 4.000000 -0.911990 6.666667
665 | v 1.333333 -0.911990 4.000000
666 | v 1.333333 -0.911990 6.666667
667 | v 4.000000 -0.911990 1.333333
668 | v 1.333333 -0.911990 1.333333
669 | v 6.666667 -0.911990 -4.000000
670 | v 6.666667 -0.911990 -1.333333
671 | v 4.000000 -0.911990 -4.000000
672 | v 4.000000 -0.911990 -1.333333
673 | v 1.333333 -0.911990 -4.000000
674 | v 1.333333 -0.911990 -1.333333
675 | v 4.000000 -0.911990 -6.666667
676 | v 1.333333 -0.911990 -6.666667
677 | v -1.333333 -0.584955 12.000000
678 | v -1.333333 -0.134436 14.666666
679 | v -4.000000 -0.880091 12.000000
680 | v -4.000000 -0.721581 14.666666
681 | v -6.666667 -0.911990 12.000000
682 | v -6.666667 -0.911990 14.666666
683 | v -4.000000 -0.911990 9.333333
684 | v -6.666667 -0.911990 9.333333
685 | v -1.333333 -0.911990 4.000000
686 | v -1.333333 -0.911990 6.666667
687 | v -4.000000 -0.911990 4.000000
688 | v -4.000000 -0.911990 6.666667
689 | v -6.666667 -0.911990 4.000000
690 | v -6.666667 -0.911990 6.666667
691 | v -4.000000 -0.911990 1.333333
692 | v -6.666667 -0.911990 1.333333
693 | v -1.333333 -0.911990 -4.000000
694 | v -1.333333 -0.911990 -1.333333
695 | v -4.000000 -0.911990 -4.000000
696 | v -4.000000 -0.911990 -1.333333
697 | v -6.666667 -0.911990 -4.000000
698 | v -6.666667 -0.911990 -1.333333
699 | v -4.000000 -0.911990 -6.666667
700 | v -6.666667 -0.911990 -6.666667
701 | v -9.333333 -0.890267 12.000000
702 | v -9.333333 -0.911990 14.666666
703 | v -12.000000 -0.453127 12.000000
704 | v -12.000000 -0.749373 14.666666
705 | v -14.666666 0.087167 12.000000
706 | v -14.666666 -0.453127 14.666667
707 | v -12.000000 -0.214850 9.333333
708 | v -14.666667 0.712755 9.333333
709 | v -9.333334 -0.880361 4.000000
710 | v -9.333334 -0.880361 6.666667
711 | v -12.000000 -0.238069 4.000000
712 | v -12.000000 -0.073631 6.666667
713 | v -14.666667 0.537636 4.000000
714 | v -14.666667 0.973583 6.666667
715 | v -12.000000 -0.673537 1.333333
716 | v -14.666667 -0.215980 1.333333
717 | v -9.333334 -0.888315 -4.000000
718 | v -9.333334 -0.911990 -1.333333
719 | v -12.000000 0.016850 -4.000000
720 | v -12.000000 -0.709534 -1.333333
721 | v -14.666667 1.157656 -4.000000
722 | v -14.666667 -0.181259 -1.333333
723 | v -12.000000 0.281279 -6.666667
724 | v -14.666667 1.619067 -6.666667
725 | v 14.666667 1.102890 12.000000
726 | v 14.666667 0.642494 14.666666
727 | v 12.000000 0.785143 12.000000
728 | v 12.000000 0.522759 14.666666
729 | v 9.333334 0.294148 12.000000
730 | v 9.333334 0.726621 14.666666
731 | v 12.000000 0.026720 9.333333
732 | v 9.333333 -0.448847 9.333333
733 | v 14.666666 -0.138097 4.000000
734 | v 14.666666 0.411195 6.666667
735 | v 12.000000 -0.584955 4.000000
736 | v 12.000000 -0.356726 6.666667
737 | v 9.333333 -0.908978 4.000000
738 | v 9.333333 -0.880091 6.666667
739 | v 12.000000 -0.640589 1.333333
740 | v 9.333333 -0.911990 1.333333
741 | v 14.666666 0.631917 -4.000000
742 | v 14.666666 0.518667 -1.333333
743 | v 12.000000 -0.017402 -4.000000
744 | v 12.000000 -0.236112 -1.333333
745 | v 9.333333 -0.765934 -4.000000
746 | v 9.333333 -0.879993 -1.333333
747 | v 12.000000 0.128839 -6.666667
748 | v 9.333333 -0.349372 -6.666667
749 | v 14.666666 0.313849 -6.666667
750 | v 14.666666 -0.047161 1.333333
751 | v 14.666666 0.917451 9.333333
752 | v -9.333334 -0.852711 -6.666667
753 | v -9.333334 -0.911990 1.333333
754 | v -9.333334 -0.890266 9.333333
755 | v -1.333333 -0.911990 -6.666667
756 | v -1.333333 -0.911990 1.333333
757 | v -1.333333 -0.908978 9.333333
758 | v 6.666667 -0.797833 -6.666667
759 | v 6.666667 -0.911990 1.333333
760 | v 6.666667 -0.718281 9.333333
761 | v 6.666667 0.707327 -14.666667
762 | v -1.333333 -0.166009 -14.666667
763 | v -9.333334 -0.166009 -14.666667
764 | v 14.666666 -0.765886 -14.666667
765 | v 2.000000 2.000002 -3.069546
766 | v 2.000000 2.000002 -6.069546
767 | v 2.964541 2.000002 -3.069546
768 | v 2.964541 2.000002 -6.069546
769 | v 0.000001 0.000000 -3.069546
770 | v 0.390181 0.038430 -3.069546
771 | v 0.765368 0.152241 -3.069546
772 | v 1.111141 0.337061 -3.069546
773 | v 1.961571 1.609821 -3.069546
774 | v 2.000000 2.000002 -3.069546
775 | v 1.414214 0.585787 -3.069546
776 | v 1.662940 0.888861 -3.069546
777 | v 1.847760 1.234635 -3.069546
778 | v 2.964541 0.000000 -3.069546
779 | v 2.964541 2.000002 -3.069546
780 | v 0.000001 0.000000 -6.069546
781 | v 0.390181 0.038430 -6.069546
782 | v 0.765368 0.152241 -6.069546
783 | v 1.111141 0.337061 -6.069546
784 | v 1.414214 0.585787 -6.069546
785 | v 1.662940 0.888861 -6.069546
786 | v 1.847760 1.234635 -6.069546
787 | v 1.961571 1.609821 -6.069546
788 | v 2.000000 2.000002 -6.069546
789 | v 2.964541 0.000000 -6.069546
790 | v 2.964541 2.000002 -6.069546
791 | vt 0.831134 0.411204
792 | vt 0.936265 0.411205
793 | vt 0.936264 0.544969
794 | vt 0.831134 0.544969
795 | vt 0.831134 0.009912
796 | vt 0.936265 0.009912
797 | vt 0.936265 0.143676
798 | vt 0.831134 0.143676
799 | vt 0.936265 0.277440
800 | vt 0.831134 0.277440
801 | vt 0.515741 0.277440
802 | vt 0.620872 0.277440
803 | vt 0.620872 0.411204
804 | vt 0.515741 0.411205
805 | vt 0.726003 0.277440
806 | vt 0.726003 0.411204
807 | vt 0.515741 0.143676
808 | vt 0.620872 0.143676
809 | vt 0.726003 0.143676
810 | vt 0.515741 0.009912
811 | vt 0.620872 0.009912
812 | vt 0.726003 0.009912
813 | vt 0.620872 0.544969
814 | vt 0.515741 0.544969
815 | vt 0.726003 0.544969
816 | vt 0.956089 0.870777
817 | vt 0.956089 0.765648
818 | vt 0.967067 0.765648
819 | vt 0.967067 0.870777
820 | vt 0.956089 0.325305
821 | vt 0.956089 0.220174
822 | vt 0.967067 0.220174
823 | vt 0.967067 0.325305
824 | vt 0.726004 0.931073
825 | vt 0.831135 0.931074
826 | vt 0.831135 0.942052
827 | vt 0.726004 0.942052
828 | vt 0.956089 0.430436
829 | vt 0.967067 0.430436
830 | vt 0.484939 0.620872
831 | vt 0.484939 0.515741
832 | vt 0.495917 0.515741
833 | vt 0.495917 0.620872
834 | vt 0.620872 0.931074
835 | vt 0.620872 0.942052
836 | vt 0.515741 0.931073
837 | vt 0.515741 0.942052
838 | vt 0.484939 0.726003
839 | vt 0.495917 0.726003
840 | vt 0.484939 0.936266
841 | vt 0.484939 0.831135
842 | vt 0.495917 0.831135
843 | vt 0.495917 0.936266
844 | vt 0.956089 0.555389
845 | vt 0.956089 0.450260
846 | vt 0.967067 0.450260
847 | vt 0.967067 0.555389
848 | vt 0.956089 0.660519
849 | vt 0.967067 0.660519
850 | vt 0.956089 0.115043
851 | vt 0.956089 0.009912
852 | vt 0.967067 0.009912
853 | vt 0.967067 0.115043
854 | vt 0.936266 0.931073
855 | vt 0.936266 0.942052
856 | vt 0.739393 0.854403
857 | vt 0.748680 0.854403
858 | vt 0.748680 0.858565
859 | vt 0.741029 0.858565
860 | vt 0.767252 0.878034
861 | vt 0.767252 0.889850
862 | vt 0.763981 0.887769
863 | vt 0.763981 0.878034
864 | vt 0.739393 0.901666
865 | vt 0.730107 0.901666
866 | vt 0.733378 0.897503
867 | vt 0.741029 0.897503
868 | vt 0.767252 0.866219
869 | vt 0.763981 0.868300
870 | vt 0.748680 0.901666
871 | vt 0.748680 0.897503
872 | vt 0.730107 0.866219
873 | vt 0.730107 0.854403
874 | vt 0.733378 0.858565
875 | vt 0.733378 0.868300
876 | vt 0.767252 0.854403
877 | vt 0.763981 0.858565
878 | vt 0.757966 0.901666
879 | vt 0.756330 0.897503
880 | vt 0.730107 0.878034
881 | vt 0.733378 0.878034
882 | vt 0.730107 0.889850
883 | vt 0.733378 0.887769
884 | vt 0.757966 0.854403
885 | vt 0.756330 0.858565
886 | vt 0.767252 0.901666
887 | vt 0.763981 0.897503
888 | vt 0.376938 0.515741
889 | vt 0.463552 0.515741
890 | vt 0.463552 0.603100
891 | vt 0.376938 0.603100
892 | vt 0.622924 0.824635
893 | vt 0.622924 0.738021
894 | vt 0.710283 0.738021
895 | vt 0.710283 0.824635
896 | vt 0.290324 0.515741
897 | vt 0.290323 0.603100
898 | vt 0.009912 0.602355
899 | vt 0.009912 0.515741
900 | vt 0.097271 0.515741
901 | vt 0.097271 0.602355
902 | vt 0.622924 0.911249
903 | vt 0.710283 0.911249
904 | vt 0.203709 0.515741
905 | vt 0.203709 0.603100
906 | vt 0.009912 0.688969
907 | vt 0.097271 0.688969
908 | vt 0.515741 0.911249
909 | vt 0.515741 0.824635
910 | vt 0.603100 0.824635
911 | vt 0.603100 0.911249
912 | vt 0.009912 0.775584
913 | vt 0.097271 0.775584
914 | vt 0.009912 0.862198
915 | vt 0.097271 0.862198
916 | vt 0.515741 0.651407
917 | vt 0.515741 0.564793
918 | vt 0.603100 0.564793
919 | vt 0.603100 0.651407
920 | vt 0.117095 0.515741
921 | vt 0.117095 0.603100
922 | vt 0.515741 0.738021
923 | vt 0.603100 0.738021
924 | vt 0.622924 0.651407
925 | vt 0.622924 0.564793
926 | vt 0.710283 0.564793
927 | vt 0.710283 0.651407
928 | vt 0.932160 0.813848
929 | vt 0.932160 0.905019
930 | vt 0.928557 0.905019
931 | vt 0.928557 0.813848
932 | vt 0.730107 0.564793
933 | vt 0.815873 0.564793
934 | vt 0.815873 0.724591
935 | vt 0.730107 0.724591
936 | vt 0.211391 0.823625
937 | vt 0.211391 0.914796
938 | vt 0.207788 0.914796
939 | vt 0.207788 0.823625
940 | vt 0.225859 0.622924
941 | vt 0.311626 0.622924
942 | vt 0.311626 0.782722
943 | vt 0.225859 0.782722
944 | vt 0.932160 0.634225
945 | vt 0.932160 0.794024
946 | vt 0.928557 0.794024
947 | vt 0.928557 0.634225
948 | vt 0.233991 0.962345
949 | vt 0.233991 0.802546
950 | vt 0.237594 0.802546
951 | vt 0.237594 0.962345
952 | vt 0.908733 0.813848
953 | vt 0.908733 0.905019
954 | vt 0.905130 0.905019
955 | vt 0.905130 0.813848
956 | vt 0.331450 0.622924
957 | vt 0.417216 0.622924
958 | vt 0.417216 0.782722
959 | vt 0.331450 0.782722
960 | vt 0.463552 0.802547
961 | vt 0.463552 0.893719
962 | vt 0.459949 0.893719
963 | vt 0.459949 0.802547
964 | vt 0.257418 0.888313
965 | vt 0.257418 0.802546
966 | vt 0.417216 0.802547
967 | vt 0.417216 0.888313
968 | vt 0.463552 0.622924
969 | vt 0.463552 0.782723
970 | vt 0.459949 0.782723
971 | vt 0.459949 0.622924
972 | vt 0.905130 0.794024
973 | vt 0.905130 0.634225
974 | vt 0.908733 0.634225
975 | vt 0.908733 0.794024
976 | vt 0.326850 0.942135
977 | vt 0.326850 0.935048
978 | vt 0.376459 0.935048
979 | vt 0.376459 0.942135
980 | vt 0.086431 0.931630
981 | vt 0.079344 0.931630
982 | vt 0.079344 0.882022
983 | vt 0.086431 0.882022
984 | vt 0.463552 0.963152
985 | vt 0.456465 0.963152
986 | vt 0.456465 0.913544
987 | vt 0.463552 0.913544
988 | vt 0.956090 0.931073
989 | vt 0.963177 0.931073
990 | vt 0.963177 0.980682
991 | vt 0.956090 0.980682
992 | vt 0.009912 0.882022
993 | vt 0.059520 0.882022
994 | vt 0.059520 0.952891
995 | vt 0.009912 0.952891
996 | vt 0.117095 0.873233
997 | vt 0.117095 0.823625
998 | vt 0.187964 0.823625
999 | vt 0.187964 0.873233
1000 | vt 0.211391 0.984228
1001 | vt 0.204304 0.984228
1002 | vt 0.204304 0.934620
1003 | vt 0.211391 0.934620
1004 | vt 0.326850 0.915224
1005 | vt 0.326850 0.908137
1006 | vt 0.376459 0.908137
1007 | vt 0.376459 0.915224
1008 | vt 0.307026 0.935048
1009 | vt 0.307026 0.942135
1010 | vt 0.257418 0.942135
1011 | vt 0.257418 0.935048
1012 | vt 0.983001 0.931073
1013 | vt 0.990088 0.931073
1014 | vt 0.990088 0.980682
1015 | vt 0.983001 0.980682
1016 | vt 0.880039 0.852128
1017 | vt 0.880039 0.901736
1018 | vt 0.809170 0.901736
1019 | vt 0.809170 0.852128
1020 | vt 0.835697 0.614401
1021 | vt 0.835697 0.564793
1022 | vt 0.906566 0.564793
1023 | vt 0.906566 0.614401
1024 | vt 0.403370 0.957746
1025 | vt 0.396283 0.957746
1026 | vt 0.396283 0.908137
1027 | vt 0.403370 0.908137
1028 | vt 0.257418 0.915224
1029 | vt 0.257418 0.908137
1030 | vt 0.307026 0.908137
1031 | vt 0.307026 0.915224
1032 | vt 0.430281 0.957746
1033 | vt 0.423194 0.957746
1034 | vt 0.423194 0.908137
1035 | vt 0.430281 0.908137
1036 | vt 0.926390 0.564793
1037 | vt 0.933477 0.564793
1038 | vt 0.933477 0.614401
1039 | vt 0.926390 0.614401
1040 | vt 0.885306 0.705094
1041 | vt 0.835697 0.705094
1042 | vt 0.835697 0.634225
1043 | vt 0.885306 0.634225
1044 | vt 0.166703 0.963926
1045 | vt 0.117095 0.963926
1046 | vt 0.117095 0.893057
1047 | vt 0.166703 0.893057
1048 | vt 0.030162 0.475667
1049 | vt 0.030162 0.495917
1050 | vt 0.009912 0.495917
1051 | vt 0.009912 0.475667
1052 | vt 0.030162 0.111163
1053 | vt 0.030162 0.131413
1054 | vt 0.009912 0.131413
1055 | vt 0.009912 0.111163
1056 | vt 0.030162 0.232664
1057 | vt 0.030162 0.252914
1058 | vt 0.009912 0.252915
1059 | vt 0.009912 0.232664
1060 | vt 0.030162 0.354166
1061 | vt 0.030162 0.374416
1062 | vt 0.009912 0.374416
1063 | vt 0.009912 0.354166
1064 | vt 0.394666 0.354166
1065 | vt 0.394666 0.374416
1066 | vt 0.374416 0.374416
1067 | vt 0.374416 0.354166
1068 | vt 0.273165 0.354166
1069 | vt 0.273165 0.374416
1070 | vt 0.252915 0.374416
1071 | vt 0.252915 0.354166
1072 | vt 0.151664 0.354166
1073 | vt 0.151664 0.374416
1074 | vt 0.131413 0.374416
1075 | vt 0.131413 0.354166
1076 | vt 0.394666 0.232664
1077 | vt 0.394666 0.252914
1078 | vt 0.374416 0.252914
1079 | vt 0.374416 0.232664
1080 | vt 0.273165 0.232664
1081 | vt 0.273165 0.252914
1082 | vt 0.252915 0.252914
1083 | vt 0.252915 0.232664
1084 | vt 0.151664 0.232664
1085 | vt 0.151664 0.252914
1086 | vt 0.131413 0.252914
1087 | vt 0.131413 0.232664
1088 | vt 0.394666 0.111163
1089 | vt 0.394666 0.131413
1090 | vt 0.374416 0.131413
1091 | vt 0.374416 0.111163
1092 | vt 0.273165 0.111163
1093 | vt 0.273165 0.131413
1094 | vt 0.252915 0.131413
1095 | vt 0.252915 0.111163
1096 | vt 0.151664 0.111163
1097 | vt 0.151664 0.131413
1098 | vt 0.131413 0.131413
1099 | vt 0.131413 0.111163
1100 | vt 0.394666 0.475667
1101 | vt 0.394666 0.495917
1102 | vt 0.374416 0.495917
1103 | vt 0.374416 0.475667
1104 | vt 0.273165 0.475667
1105 | vt 0.273165 0.495917
1106 | vt 0.252915 0.495917
1107 | vt 0.252915 0.475667
1108 | vt 0.151664 0.475667
1109 | vt 0.151664 0.495917
1110 | vt 0.131413 0.495917
1111 | vt 0.131413 0.475667
1112 | vt 0.151664 0.394666
1113 | vt 0.151664 0.414916
1114 | vt 0.131413 0.414916
1115 | vt 0.131413 0.394666
1116 | vt 0.151664 0.435166
1117 | vt 0.151664 0.455417
1118 | vt 0.131413 0.455417
1119 | vt 0.131413 0.435166
1120 | vt 0.232664 0.394666
1121 | vt 0.232664 0.414916
1122 | vt 0.212414 0.414916
1123 | vt 0.212414 0.394666
1124 | vt 0.192164 0.394666
1125 | vt 0.192164 0.414916
1126 | vt 0.171914 0.414916
1127 | vt 0.171914 0.394666
1128 | vt 0.232664 0.435166
1129 | vt 0.232664 0.455417
1130 | vt 0.212414 0.455417
1131 | vt 0.212414 0.435166
1132 | vt 0.192164 0.435166
1133 | vt 0.192164 0.455417
1134 | vt 0.171914 0.455417
1135 | vt 0.171914 0.435166
1136 | vt 0.232664 0.475667
1137 | vt 0.232664 0.495917
1138 | vt 0.212414 0.495917
1139 | vt 0.212414 0.475667
1140 | vt 0.192164 0.475667
1141 | vt 0.192164 0.495917
1142 | vt 0.171914 0.495917
1143 | vt 0.171914 0.475667
1144 | vt 0.273165 0.394666
1145 | vt 0.273165 0.414916
1146 | vt 0.252915 0.414916
1147 | vt 0.252915 0.394666
1148 | vt 0.273165 0.435166
1149 | vt 0.273165 0.455416
1150 | vt 0.252915 0.455417
1151 | vt 0.252915 0.435166
1152 | vt 0.354166 0.394666
1153 | vt 0.354166 0.414916
1154 | vt 0.333915 0.414916
1155 | vt 0.333915 0.394666
1156 | vt 0.313665 0.394666
1157 | vt 0.313665 0.414916
1158 | vt 0.293415 0.414916
1159 | vt 0.293415 0.394666
1160 | vt 0.354166 0.435166
1161 | vt 0.354166 0.455417
1162 | vt 0.333915 0.455417
1163 | vt 0.333915 0.435166
1164 | vt 0.313665 0.435166
1165 | vt 0.313665 0.455416
1166 | vt 0.293415 0.455416
1167 | vt 0.293415 0.435166
1168 | vt 0.354166 0.475667
1169 | vt 0.354166 0.495917
1170 | vt 0.333915 0.495917
1171 | vt 0.333915 0.475667
1172 | vt 0.313665 0.475667
1173 | vt 0.313665 0.495917
1174 | vt 0.293415 0.495917
1175 | vt 0.293415 0.475667
1176 | vt 0.394666 0.394666
1177 | vt 0.394666 0.414916
1178 | vt 0.374416 0.414916
1179 | vt 0.374416 0.394666
1180 | vt 0.394666 0.435166
1181 | vt 0.394666 0.455417
1182 | vt 0.374416 0.455417
1183 | vt 0.374416 0.435166
1184 | vt 0.475667 0.394666
1185 | vt 0.475667 0.414916
1186 | vt 0.455417 0.414916
1187 | vt 0.455417 0.394666
1188 | vt 0.435166 0.394666
1189 | vt 0.435166 0.414916
1190 | vt 0.414916 0.414916
1191 | vt 0.414916 0.394666
1192 | vt 0.475667 0.435166
1193 | vt 0.475667 0.455417
1194 | vt 0.455417 0.455417
1195 | vt 0.455417 0.435166
1196 | vt 0.435166 0.435166
1197 | vt 0.435166 0.455417
1198 | vt 0.414916 0.455417
1199 | vt 0.414916 0.435166
1200 | vt 0.475667 0.475667
1201 | vt 0.475667 0.495917
1202 | vt 0.455417 0.495917
1203 | vt 0.455417 0.475667
1204 | vt 0.435166 0.475667
1205 | vt 0.435166 0.495917
1206 | vt 0.414916 0.495917
1207 | vt 0.414916 0.475667
1208 | vt 0.151664 0.030162
1209 | vt 0.151664 0.050413
1210 | vt 0.131413 0.050413
1211 | vt 0.131413 0.030162
1212 | vt 0.151664 0.070663
1213 | vt 0.151664 0.090913
1214 | vt 0.131413 0.090913
1215 | vt 0.131413 0.070663
1216 | vt 0.232664 0.030162
1217 | vt 0.232664 0.050413
1218 | vt 0.212414 0.050413
1219 | vt 0.212414 0.030162
1220 | vt 0.192164 0.030162
1221 | vt 0.192164 0.050413
1222 | vt 0.171914 0.050413
1223 | vt 0.171914 0.030162
1224 | vt 0.232664 0.070663
1225 | vt 0.232664 0.090913
1226 | vt 0.212414 0.090913
1227 | vt 0.212414 0.070663
1228 | vt 0.192164 0.070663
1229 | vt 0.192164 0.090913
1230 | vt 0.171914 0.090913
1231 | vt 0.171914 0.070663
1232 | vt 0.232664 0.111163
1233 | vt 0.232664 0.131413
1234 | vt 0.212414 0.131413
1235 | vt 0.212414 0.111163
1236 | vt 0.192164 0.111163
1237 | vt 0.192164 0.131413
1238 | vt 0.171914 0.131413
1239 | vt 0.171914 0.111163
1240 | vt 0.273165 0.030162
1241 | vt 0.273165 0.050413
1242 | vt 0.252915 0.050413
1243 | vt 0.252915 0.030162
1244 | vt 0.273165 0.070663
1245 | vt 0.273165 0.090913
1246 | vt 0.252915 0.090913
1247 | vt 0.252915 0.070663
1248 | vt 0.354166 0.030162
1249 | vt 0.354166 0.050413
1250 | vt 0.333915 0.050413
1251 | vt 0.333915 0.030162
1252 | vt 0.313665 0.030162
1253 | vt 0.313665 0.050413
1254 | vt 0.293415 0.050413
1255 | vt 0.293415 0.030162
1256 | vt 0.354166 0.070663
1257 | vt 0.354166 0.090913
1258 | vt 0.333915 0.090913
1259 | vt 0.333915 0.070663
1260 | vt 0.313665 0.070663
1261 | vt 0.313665 0.090913
1262 | vt 0.293415 0.090913
1263 | vt 0.293415 0.070663
1264 | vt 0.354166 0.111163
1265 | vt 0.354166 0.131413
1266 | vt 0.333915 0.131413
1267 | vt 0.333915 0.111163
1268 | vt 0.313665 0.111163
1269 | vt 0.313665 0.131413
1270 | vt 0.293415 0.131413
1271 | vt 0.293415 0.111163
1272 | vt 0.394666 0.030162
1273 | vt 0.394666 0.050413
1274 | vt 0.374416 0.050413
1275 | vt 0.374416 0.030162
1276 | vt 0.394666 0.070663
1277 | vt 0.394666 0.090913
1278 | vt 0.374416 0.090913
1279 | vt 0.374416 0.070663
1280 | vt 0.475667 0.030162
1281 | vt 0.475667 0.050413
1282 | vt 0.455417 0.050413
1283 | vt 0.455417 0.030162
1284 | vt 0.435166 0.030162
1285 | vt 0.435166 0.050413
1286 | vt 0.414916 0.050413
1287 | vt 0.414916 0.030162
1288 | vt 0.475667 0.070663
1289 | vt 0.475667 0.090913
1290 | vt 0.455417 0.090913
1291 | vt 0.455417 0.070663
1292 | vt 0.435166 0.070663
1293 | vt 0.435166 0.090913
1294 | vt 0.414916 0.090913
1295 | vt 0.414916 0.070663
1296 | vt 0.475667 0.111163
1297 | vt 0.475667 0.131413
1298 | vt 0.455417 0.131413
1299 | vt 0.455417 0.111163
1300 | vt 0.435166 0.111163
1301 | vt 0.435166 0.131413
1302 | vt 0.414916 0.131413
1303 | vt 0.414916 0.111163
1304 | vt 0.151664 0.151663
1305 | vt 0.151664 0.171914
1306 | vt 0.131413 0.171914
1307 | vt 0.131413 0.151664
1308 | vt 0.151664 0.192164
1309 | vt 0.151664 0.212414
1310 | vt 0.131413 0.212414
1311 | vt 0.131413 0.192164
1312 | vt 0.232664 0.151664
1313 | vt 0.232664 0.171914
1314 | vt 0.212414 0.171914
1315 | vt 0.212414 0.151664
1316 | vt 0.192164 0.151664
1317 | vt 0.192164 0.171914
1318 | vt 0.171914 0.171914
1319 | vt 0.171914 0.151664
1320 | vt 0.232664 0.192164
1321 | vt 0.232664 0.212414
1322 | vt 0.212414 0.212414
1323 | vt 0.212414 0.192164
1324 | vt 0.192164 0.192164
1325 | vt 0.192164 0.212414
1326 | vt 0.171914 0.212414
1327 | vt 0.171914 0.192164
1328 | vt 0.232664 0.232664
1329 | vt 0.232664 0.252914
1330 | vt 0.212414 0.252914
1331 | vt 0.212414 0.232664
1332 | vt 0.192164 0.232664
1333 | vt 0.192164 0.252914
1334 | vt 0.171914 0.252914
1335 | vt 0.171914 0.232664
1336 | vt 0.273165 0.151664
1337 | vt 0.273165 0.171914
1338 | vt 0.252915 0.171914
1339 | vt 0.252915 0.151664
1340 | vt 0.273165 0.192164
1341 | vt 0.273165 0.212414
1342 | vt 0.252915 0.212414
1343 | vt 0.252915 0.192164
1344 | vt 0.354166 0.151664
1345 | vt 0.354166 0.171914
1346 | vt 0.333915 0.171914
1347 | vt 0.333915 0.151664
1348 | vt 0.313665 0.151664
1349 | vt 0.313665 0.171914
1350 | vt 0.293415 0.171914
1351 | vt 0.293415 0.151664
1352 | vt 0.354166 0.192164
1353 | vt 0.354166 0.212414
1354 | vt 0.333915 0.212414
1355 | vt 0.333915 0.192164
1356 | vt 0.313665 0.192164
1357 | vt 0.313665 0.212414
1358 | vt 0.293415 0.212414
1359 | vt 0.293415 0.192164
1360 | vt 0.354166 0.232664
1361 | vt 0.354166 0.252914
1362 | vt 0.333915 0.252914
1363 | vt 0.333915 0.232664
1364 | vt 0.313665 0.232664
1365 | vt 0.313665 0.252914
1366 | vt 0.293415 0.252914
1367 | vt 0.293415 0.232664
1368 | vt 0.394666 0.151663
1369 | vt 0.394666 0.171914
1370 | vt 0.374416 0.171914
1371 | vt 0.374416 0.151664
1372 | vt 0.394666 0.192164
1373 | vt 0.394666 0.212414
1374 | vt 0.374416 0.212414
1375 | vt 0.374416 0.192164
1376 | vt 0.475667 0.151663
1377 | vt 0.475667 0.171914
1378 | vt 0.455417 0.171914
1379 | vt 0.455417 0.151663
1380 | vt 0.435166 0.151663
1381 | vt 0.435166 0.171914
1382 | vt 0.414916 0.171914
1383 | vt 0.414916 0.151663
1384 | vt 0.475667 0.192164
1385 | vt 0.475667 0.212414
1386 | vt 0.455417 0.212414
1387 | vt 0.455417 0.192164
1388 | vt 0.435166 0.192164
1389 | vt 0.435166 0.212414
1390 | vt 0.414916 0.212414
1391 | vt 0.414916 0.192164
1392 | vt 0.475667 0.232664
1393 | vt 0.475667 0.252914
1394 | vt 0.455417 0.252914
1395 | vt 0.455417 0.232664
1396 | vt 0.435166 0.232664
1397 | vt 0.435166 0.252914
1398 | vt 0.414916 0.252914
1399 | vt 0.414916 0.232664
1400 | vt 0.151664 0.273165
1401 | vt 0.151664 0.293415
1402 | vt 0.131413 0.293415
1403 | vt 0.131413 0.273165
1404 | vt 0.151664 0.313665
1405 | vt 0.151664 0.333915
1406 | vt 0.131413 0.333915
1407 | vt 0.131413 0.313665
1408 | vt 0.232664 0.273165
1409 | vt 0.232664 0.293415
1410 | vt 0.212414 0.293415
1411 | vt 0.212414 0.273165
1412 | vt 0.192164 0.273165
1413 | vt 0.192164 0.293415
1414 | vt 0.171914 0.293415
1415 | vt 0.171914 0.273165
1416 | vt 0.232664 0.313665
1417 | vt 0.232664 0.333915
1418 | vt 0.212414 0.333915
1419 | vt 0.212414 0.313665
1420 | vt 0.192164 0.313665
1421 | vt 0.192164 0.333915
1422 | vt 0.171914 0.333915
1423 | vt 0.171914 0.313665
1424 | vt 0.232664 0.354166
1425 | vt 0.232664 0.374416
1426 | vt 0.212414 0.374416
1427 | vt 0.212414 0.354166
1428 | vt 0.192164 0.354166
1429 | vt 0.192164 0.374416
1430 | vt 0.171914 0.374416
1431 | vt 0.171914 0.354166
1432 | vt 0.273165 0.273165
1433 | vt 0.273165 0.293415
1434 | vt 0.252915 0.293415
1435 | vt 0.252915 0.273165
1436 | vt 0.273165 0.313665
1437 | vt 0.273165 0.333915
1438 | vt 0.252915 0.333915
1439 | vt 0.252915 0.313665
1440 | vt 0.354166 0.273165
1441 | vt 0.354166 0.293415
1442 | vt 0.333915 0.293415
1443 | vt 0.333915 0.273165
1444 | vt 0.313665 0.273165
1445 | vt 0.313665 0.293415
1446 | vt 0.293415 0.293415
1447 | vt 0.293415 0.273165
1448 | vt 0.354166 0.313665
1449 | vt 0.354166 0.333915
1450 | vt 0.333915 0.333915
1451 | vt 0.333915 0.313665
1452 | vt 0.313665 0.313665
1453 | vt 0.313665 0.333915
1454 | vt 0.293415 0.333915
1455 | vt 0.293415 0.313665
1456 | vt 0.354166 0.354166
1457 | vt 0.354166 0.374416
1458 | vt 0.333915 0.374416
1459 | vt 0.333915 0.354166
1460 | vt 0.313665 0.354166
1461 | vt 0.313665 0.374416
1462 | vt 0.293415 0.374416
1463 | vt 0.293415 0.354166
1464 | vt 0.394666 0.273165
1465 | vt 0.394666 0.293415
1466 | vt 0.374416 0.293415
1467 | vt 0.374416 0.273165
1468 | vt 0.394666 0.313665
1469 | vt 0.394666 0.333915
1470 | vt 0.374416 0.333915
1471 | vt 0.374416 0.313665
1472 | vt 0.475667 0.273165
1473 | vt 0.475667 0.293415
1474 | vt 0.455417 0.293415
1475 | vt 0.455417 0.273165
1476 | vt 0.435166 0.273165
1477 | vt 0.435166 0.293415
1478 | vt 0.414916 0.293415
1479 | vt 0.414916 0.273165
1480 | vt 0.475667 0.313665
1481 | vt 0.475667 0.333915
1482 | vt 0.455417 0.333915
1483 | vt 0.455417 0.313665
1484 | vt 0.435166 0.313665
1485 | vt 0.435166 0.333915
1486 | vt 0.414916 0.333915
1487 | vt 0.414916 0.313665
1488 | vt 0.475667 0.354165
1489 | vt 0.475667 0.374416
1490 | vt 0.455417 0.374416
1491 | vt 0.455417 0.354166
1492 | vt 0.435166 0.354166
1493 | vt 0.435166 0.374416
1494 | vt 0.414916 0.374416
1495 | vt 0.414916 0.354166
1496 | vt 0.030162 0.273165
1497 | vt 0.030162 0.293415
1498 | vt 0.009912 0.293415
1499 | vt 0.009912 0.273165
1500 | vt 0.030162 0.313665
1501 | vt 0.030162 0.333915
1502 | vt 0.009912 0.333915
1503 | vt 0.009912 0.313665
1504 | vt 0.111163 0.273165
1505 | vt 0.111163 0.293415
1506 | vt 0.090913 0.293415
1507 | vt 0.090913 0.273165
1508 | vt 0.070663 0.273165
1509 | vt 0.070663 0.293415
1510 | vt 0.050413 0.293415
1511 | vt 0.050413 0.273165
1512 | vt 0.111163 0.313665
1513 | vt 0.111163 0.333915
1514 | vt 0.090913 0.333915
1515 | vt 0.090913 0.313665
1516 | vt 0.070663 0.313665
1517 | vt 0.070663 0.333915
1518 | vt 0.050413 0.333915
1519 | vt 0.050413 0.313665
1520 | vt 0.111163 0.354166
1521 | vt 0.111163 0.374416
1522 | vt 0.090913 0.374416
1523 | vt 0.090913 0.354166
1524 | vt 0.070663 0.354166
1525 | vt 0.070663 0.374416
1526 | vt 0.050413 0.374416
1527 | vt 0.050413 0.354166
1528 | vt 0.030162 0.151663
1529 | vt 0.030162 0.171914
1530 | vt 0.009912 0.171914
1531 | vt 0.009912 0.151664
1532 | vt 0.030162 0.192164
1533 | vt 0.030162 0.212414
1534 | vt 0.009912 0.212414
1535 | vt 0.009912 0.192164
1536 | vt 0.111163 0.151664
1537 | vt 0.111163 0.171914
1538 | vt 0.090913 0.171914
1539 | vt 0.090913 0.151664
1540 | vt 0.070663 0.151663
1541 | vt 0.070663 0.171914
1542 | vt 0.050413 0.171914
1543 | vt 0.050413 0.151663
1544 | vt 0.111163 0.192164
1545 | vt 0.111163 0.212414
1546 | vt 0.090913 0.212414
1547 | vt 0.090913 0.192164
1548 | vt 0.070663 0.192164
1549 | vt 0.070663 0.212414
1550 | vt 0.050413 0.212414
1551 | vt 0.050413 0.192164
1552 | vt 0.111163 0.232664
1553 | vt 0.111163 0.252914
1554 | vt 0.090913 0.252914
1555 | vt 0.090913 0.232664
1556 | vt 0.070663 0.232664
1557 | vt 0.070663 0.252914
1558 | vt 0.050413 0.252914
1559 | vt 0.050413 0.232664
1560 | vt 0.030162 0.030162
1561 | vt 0.030162 0.050413
1562 | vt 0.009912 0.050412
1563 | vt 0.009912 0.030162
1564 | vt 0.030162 0.070663
1565 | vt 0.030162 0.090913
1566 | vt 0.009912 0.090913
1567 | vt 0.009912 0.070663
1568 | vt 0.111163 0.030162
1569 | vt 0.111163 0.050413
1570 | vt 0.090913 0.050413
1571 | vt 0.090913 0.030162
1572 | vt 0.070663 0.030162
1573 | vt 0.070663 0.050413
1574 | vt 0.050413 0.050413
1575 | vt 0.050413 0.030162
1576 | vt 0.111163 0.070663
1577 | vt 0.111163 0.090913
1578 | vt 0.090913 0.090913
1579 | vt 0.090913 0.070663
1580 | vt 0.070663 0.070663
1581 | vt 0.070663 0.090913
1582 | vt 0.050413 0.090913
1583 | vt 0.050413 0.070663
1584 | vt 0.111163 0.111163
1585 | vt 0.111163 0.131413
1586 | vt 0.090913 0.131413
1587 | vt 0.090913 0.111163
1588 | vt 0.070663 0.111163
1589 | vt 0.070663 0.131413
1590 | vt 0.050413 0.131413
1591 | vt 0.050413 0.111163
1592 | vt 0.030162 0.394666
1593 | vt 0.030162 0.414916
1594 | vt 0.009912 0.414916
1595 | vt 0.009912 0.394666
1596 | vt 0.030162 0.435166
1597 | vt 0.030162 0.455417
1598 | vt 0.009912 0.455417
1599 | vt 0.009912 0.435166
1600 | vt 0.111163 0.394666
1601 | vt 0.111163 0.414916
1602 | vt 0.090913 0.414916
1603 | vt 0.090913 0.394666
1604 | vt 0.070663 0.394666
1605 | vt 0.070663 0.414916
1606 | vt 0.050413 0.414916
1607 | vt 0.050413 0.394666
1608 | vt 0.111163 0.435166
1609 | vt 0.111163 0.455417
1610 | vt 0.090913 0.455417
1611 | vt 0.090913 0.435166
1612 | vt 0.070663 0.435166
1613 | vt 0.070663 0.455417
1614 | vt 0.050413 0.455417
1615 | vt 0.050413 0.435166
1616 | vt 0.111163 0.475667
1617 | vt 0.111163 0.495917
1618 | vt 0.090913 0.495917
1619 | vt 0.090913 0.475667
1620 | vt 0.070663 0.475667
1621 | vt 0.070663 0.495917
1622 | vt 0.050412 0.495917
1623 | vt 0.050413 0.475667
1624 | vt 0.070663 0.009912
1625 | vt 0.050413 0.009912
1626 | vt 0.090913 0.009912
1627 | vt 0.111163 0.009912
1628 | vt 0.131413 0.009912
1629 | vt 0.030162 0.009912
1630 | vt 0.009912 0.009912
1631 | vt 0.495917 0.333915
1632 | vt 0.495917 0.354165
1633 | vt 0.495917 0.374416
1634 | vt 0.495917 0.293415
1635 | vt 0.495917 0.313665
1636 | vt 0.495917 0.252915
1637 | vt 0.495917 0.273165
1638 | vt 0.495917 0.212414
1639 | vt 0.495917 0.232664
1640 | vt 0.495917 0.171914
1641 | vt 0.495917 0.192164
1642 | vt 0.495917 0.131413
1643 | vt 0.495917 0.151663
1644 | vt 0.495917 0.090913
1645 | vt 0.495917 0.111163
1646 | vt 0.495917 0.050412
1647 | vt 0.495917 0.070663
1648 | vt 0.435166 0.009912
1649 | vt 0.414916 0.009912
1650 | vt 0.455417 0.009912
1651 | vt 0.475667 0.009912
1652 | vt 0.495917 0.009912
1653 | vt 0.495917 0.030162
1654 | vt 0.394666 0.009912
1655 | vt 0.374416 0.009912
1656 | vt 0.313665 0.009912
1657 | vt 0.293415 0.009912
1658 | vt 0.333915 0.009912
1659 | vt 0.354166 0.009912
1660 | vt 0.273165 0.009912
1661 | vt 0.252915 0.009912
1662 | vt 0.192164 0.009912
1663 | vt 0.171914 0.009912
1664 | vt 0.212414 0.009912
1665 | vt 0.232664 0.009912
1666 | vt 0.151664 0.009912
1667 | vt 0.495917 0.455417
1668 | vt 0.495917 0.475667
1669 | vt 0.495917 0.495917
1670 | vt 0.495917 0.414916
1671 | vt 0.495917 0.435166
1672 | vt 0.495917 0.394666
1673 | vt 0.787982 0.758264
1674 | vt 0.784649 0.769371
1675 | vt 0.779213 0.779614
1676 | vt 0.771883 0.788600
1677 | vt 0.762941 0.795983
1678 | vt 0.752731 0.801480
1679 | vt 0.741644 0.804880
1680 | vt 0.730107 0.806051
1681 | vt 0.730192 0.834579
1682 | vt 0.789346 0.834402
1683 | vt 0.789346 0.744415
1684 | vt 0.206035 0.780554
1685 | vt 0.117095 0.780553
1686 | vt 0.117095 0.792177
1687 | vt 0.206035 0.792177
1688 | vt 0.206035 0.768930
1689 | vt 0.117095 0.768930
1690 | vt 0.206035 0.757306
1691 | vt 0.117095 0.757307
1692 | vt 0.206035 0.745683
1693 | vt 0.117095 0.745683
1694 | vt 0.206035 0.734059
1695 | vt 0.117095 0.734059
1696 | vt 0.206035 0.722436
1697 | vt 0.117095 0.722436
1698 | vt 0.206035 0.710813
1699 | vt 0.117095 0.710812
1700 | vt 0.206035 0.803801
1701 | vt 0.117095 0.803800
1702 | vt 0.206035 0.622924
1703 | vt 0.117095 0.622924
1704 | vt 0.117095 0.682217
1705 | vt 0.206035 0.682217
1706 | vt 0.863764 0.809640
1707 | vt 0.867104 0.820753
1708 | vt 0.868434 0.832303
1709 | vt 0.868434 0.744565
1710 | vt 0.809243 0.744415
1711 | vt 0.809170 0.772962
1712 | vt 0.820715 0.774128
1713 | vt 0.831810 0.777525
1714 | vt 0.842030 0.783020
1715 | vt 0.850981 0.790404
1716 | vt 0.858320 0.799392
1717 | vt 0.117095 0.710812
1718 | vt 0.206035 0.710813
1719 | vt 0.206035 0.682217
1720 | vt 0.117095 0.682217
1721 | vn 0.0000 1.0000 0.0000
1722 | vn -1.0000 0.0000 0.0000
1723 | vn 0.0000 0.0000 1.0000
1724 | vn 1.0000 0.0000 0.0000
1725 | vn 0.0000 0.0000 -1.0000
1726 | vn 0.0000 -1.0000 0.0000
1727 | vn 0.0614 0.9970 -0.0479
1728 | vn 0.1911 0.9748 -0.1152
1729 | vn -0.1729 0.9832 0.0582
1730 | vn 0.0249 0.9932 0.1137
1731 | vn -0.0814 0.9868 -0.1403
1732 | vn -0.1771 0.9812 0.0766
1733 | vn -0.0070 0.9999 -0.0093
1734 | vn 0.0109 0.9999 -0.0054
1735 | vn 0.0625 0.9972 0.0420
1736 | vn -0.1182 0.9808 -0.1551
1737 | vn -0.0794 0.9784 0.1910
1738 | vn 0.1417 0.9725 -0.1847
1739 | vn -0.1651 0.9771 0.1344
1740 | vn -0.0730 0.9973 -0.0117
1741 | vn -0.2002 0.9793 0.0309
1742 | vn -0.2234 0.9670 0.1227
1743 | vn -0.3073 0.9481 0.0818
1744 | vn -0.2498 0.9679 0.0285
1745 | vn -0.1013 0.9895 0.1035
1746 | vn 0.0034 0.9913 -0.1315
1747 | vn -0.0787 0.9958 0.0469
1748 | vn -0.2419 0.9570 0.1603
1749 | vn -0.1328 0.9910 -0.0150
1750 | vn -0.0535 0.9981 -0.0319
1751 | vn -0.2566 0.9595 -0.1167
1752 | vn -0.1920 0.9789 -0.0700
1753 | vn -0.0864 0.9649 -0.2479
1754 | vn -0.0658 0.9975 -0.0258
1755 | vn -0.1047 0.9636 -0.2460
1756 | vn -0.3380 0.9303 -0.1426
1757 | vn 0.1552 0.9879 -0.0080
1758 | vn -0.1631 0.9550 -0.2479
1759 | vn -0.1144 0.9688 0.2199
1760 | vn -0.1728 0.9638 -0.2033
1761 | vn 0.1130 0.9547 0.2752
1762 | vn -0.0337 0.9994 0.0024
1763 | vn 0.3752 0.9002 -0.2212
1764 | vn 0.4161 0.9052 -0.0865
1765 | vn 0.2085 0.8871 0.4118
1766 | vn 0.3624 0.8962 0.2559
1767 | vn 0.2067 0.9633 0.1712
1768 | vn 0.4270 0.8951 0.1287
1769 | vn 0.0011 1.0000 0.0011
1770 | vn 0.0300 0.9995 0.0123
1771 | vn 0.1471 0.9767 -0.1561
1772 | vn 0.1006 0.9920 -0.0768
1773 | vn 0.3173 0.9443 -0.0868
1774 | vn 0.2208 0.9495 -0.2230
1775 | vn 0.3459 0.9381 -0.0162
1776 | vn 0.2549 0.9607 -0.1102
1777 | vn 0.0293 0.9996 0.0056
1778 | vn 0.0135 0.9999 -0.0102
1779 | vn 0.3009 0.9445 0.1317
1780 | vn 0.3463 0.9365 0.0548
1781 | vn 0.1152 0.9748 0.1911
1782 | vn 0.2135 0.9567 0.1980
1783 | vn 0.1273 0.9877 0.0914
1784 | vn 0.2203 0.9743 0.0463
1785 | vn 0.0201 0.9998 0.0038
1786 | vn -0.0093 0.9999 -0.0070
1787 | vn -0.1771 0.9812 -0.0766
1788 | vn -0.0608 0.9963 -0.0608
1789 | vn -0.2869 0.9386 -0.1915
1790 | vn -0.0934 0.9766 -0.1935
1791 | vn -0.0093 0.9999 0.0070
1792 | vn -0.0608 0.9963 0.0608
1793 | vn -0.0011 1.0000 -0.0011
1794 | vn 0.0024 0.9998 -0.0215
1795 | vn -0.0164 0.9990 -0.0412
1796 | vn -0.2124 0.9243 -0.3171
1797 | vn -0.0976 0.9242 -0.3693
1798 | vn 0.1007 0.9311 -0.3506
1799 | vn 0.0074 0.9230 -0.3847
1800 | vn 0.0057 0.9840 -0.1782
1801 | vn -0.0751 0.9310 -0.3572
1802 | vn -0.1150 0.9895 0.0880
1803 | vn -0.1125 0.9879 0.1065
1804 | vn 0.0150 0.9910 0.1328
1805 | vn -0.0295 0.9659 0.2573
1806 | vn -0.0269 0.9924 0.1198
1807 | vn -0.0687 0.9366 0.3437
1808 | vn -0.2203 0.9622 0.1599
1809 | vn -0.1553 0.9544 0.2551
1810 | vn 0.0937 0.9953 -0.0247
1811 | vn -0.2043 0.9785 0.0295
1812 | vn 0.0535 0.9981 0.0319
1813 | vn 0.1328 0.9910 0.0150
1814 | vn -0.0120 0.9999 0.0120
1815 | vn -0.1273 0.9877 0.0914
1816 | vn -0.0354 0.9939 0.1043
1817 | vn -0.1152 0.9748 0.1911
1818 | vn -0.1498 0.9773 -0.1498
1819 | vn 0.0582 0.9832 -0.1729
1820 | vn 0.1001 0.9862 -0.1316
1821 | vn -0.1229 0.9880 -0.0935
1822 | vn 0.2263 0.9700 0.0890
1823 | vn 0.0874 0.9948 0.0524
1824 | vn 0.1479 0.9782 0.1456
1825 | vn 0.2171 0.9752 0.0439
1826 | vn 0.2183 0.9757 -0.0167
1827 | vn 0.3058 0.9484 -0.0843
1828 | vn -0.1215 0.9888 0.0866
1829 | vn 0.0588 0.9935 0.0975
1830 | vn 0.0833 0.9949 -0.0565
1831 | vn 0.2233 0.9713 -0.0813
1832 | vn 0.2107 0.9750 -0.0701
1833 | vn 0.1483 0.9782 -0.1452
1834 | vn 0.1888 0.9714 -0.1443
1835 | vn 0.1653 0.9771 -0.1342
1836 | vn 0.1637 0.9841 -0.0689
1837 | vn 0.1216 0.9888 -0.0860
1838 | vn 0.1908 0.9710 -0.1439
1839 | vn 0.1718 0.9851 0.0035
1840 | vn 0.0733 0.9972 0.0120
1841 | vn 0.1403 0.9862 -0.0881
1842 | vn -0.0264 0.9997 0.0003
1843 | vn -0.0830 0.9949 0.0568
1844 | vn 0.0267 0.9996 0.0002
1845 | vn -0.0780 0.9809 0.1779
1846 | vn -0.1420 0.9725 0.1848
1847 | vn -0.0348 0.9931 0.1118
1848 | vn -0.1910 0.9709 0.1443
1849 | vn -0.2107 0.9750 0.0703
1850 | vn -0.1636 0.9841 0.0691
1851 | vn 0.2980 0.9525 -0.0636
1852 | vn 0.2499 0.9678 -0.0289
1853 | vn 0.2812 0.9557 -0.0866
1854 | vn 0.0832 0.9946 0.0616
1855 | vn -0.0037 0.9914 0.1311
1856 | vn 0.1475 0.9878 0.0489
1857 | vn 0.1729 0.9832 0.0582
1858 | vn 0.1666 0.9770 0.1329
1859 | vn 0.1911 0.9748 0.1152
1860 | vn 0.1893 0.9708 0.1471
1861 | vn 0.2189 0.9671 0.1298
1862 | vn 0.1020 0.9877 0.1189
1863 | vn -0.0232 0.9997 -0.0087
1864 | vn 0.0761 0.9970 -0.0123
1865 | vn 0.1467 0.9855 0.0856
1866 | vn 0.1703 0.9853 0.0097
1867 | vn 0.3346 0.9331 -0.1320
1868 | vn 0.3157 0.9470 0.0592
1869 | vn -0.1976 0.9695 -0.1447
1870 | vn -0.1546 0.9721 -0.1764
1871 | vn -0.0414 0.9933 -0.1079
1872 | vn -0.0070 0.9423 -0.3348
1873 | vn 0.1191 0.8910 -0.4381
1874 | vn 0.2666 0.9015 -0.3410
1875 | vn -0.0582 0.9832 -0.1729
1876 | vn -0.0683 0.9951 -0.0716
1877 | vn 0.0699 0.9951 -0.0699
1878 | vn -0.1911 0.9748 -0.1152
1879 | vn -0.2124 0.9746 -0.0715
1880 | vn -0.1630 0.9840 -0.0715
1881 | vn -0.1467 0.9782 0.1467
1882 | vn -0.0914 0.9877 0.1273
1883 | vn -0.0766 0.9812 0.1771
1884 | vn -0.0319 0.9981 0.0535
1885 | vn -0.0011 1.0000 0.0011
1886 | vn -0.0070 0.9999 0.0093
1887 | vn -0.0346 0.9988 0.0346
1888 | vn -0.0027 0.9998 0.0190
1889 | vn 0.2043 0.9785 0.0295
1890 | vn 0.1771 0.9812 0.0766
1891 | vn 0.1043 0.9939 0.0354
1892 | vn 0.0608 0.9963 0.0608
1893 | vn 0.0120 0.9999 0.0120
1894 | vn -0.1328 0.9910 0.0150
1895 | vn -0.0937 0.9953 0.0247
1896 | vn 0.1771 0.9812 -0.0766
1897 | vn 0.2043 0.9785 -0.0295
1898 | vn 0.1328 0.9910 -0.0150
1899 | vn -0.0730 0.9416 0.3287
1900 | vn -0.1484 0.9508 0.2721
1901 | vn -0.2115 0.9525 0.2191
1902 | vn -0.1776 0.9742 0.1394
1903 | vn -0.1427 0.9894 0.0284
1904 | vn -0.2087 0.9763 0.0575
1905 | vn -0.0678 0.9484 0.3099
1906 | vn -0.0113 0.9656 0.2597
1907 | vn -0.0422 0.9522 0.3025
1908 | vn 0.0179 0.9924 0.1216
1909 | vn 0.0070 0.9999 0.0093
1910 | vn -0.0206 0.9998 0.0066
1911 | vn -0.0449 0.9749 0.2181
1912 | vn -0.0295 0.9785 0.2043
1913 | vn 0.0128 0.9754 0.2202
1914 | vn -0.0150 0.9910 0.1328
1915 | vn -0.0038 0.9998 0.0201
1916 | vn 0.0038 0.9998 0.0201
1917 | vn -0.1304 0.9866 0.0978
1918 | vn -0.1085 0.9622 0.2498
1919 | vn -0.0943 0.9572 0.2736
1920 | vn -0.0923 0.9930 0.0740
1921 | vn -0.0681 0.9812 0.1805
1922 | vn -0.0852 0.9727 0.2157
1923 | vn -0.1285 0.9253 -0.3569
1924 | vn -0.0971 0.9244 -0.3688
1925 | vn -0.0439 0.9479 -0.3155
1926 | vn 0.0174 0.9602 -0.2787
1927 | vn 0.1697 0.9829 -0.0708
1928 | vn 0.0631 0.9975 0.0307
1929 | vn -0.0326 0.9121 -0.4086
1930 | vn -0.0506 0.8989 -0.4353
1931 | vn 0.0679 0.9033 -0.4236
1932 | vn -0.0714 0.9342 -0.3495
1933 | vn -0.0890 0.9860 -0.1408
1934 | vn 0.1131 0.9830 -0.1448
1935 | vn -0.1139 0.9519 -0.2845
1936 | vn -0.2152 0.9196 -0.3287
1937 | vn -0.1591 0.9032 -0.3988
1938 | vn -0.2954 0.9186 -0.2626
1939 | vn -0.3463 0.9324 -0.1039
1940 | vn -0.2476 0.9605 -0.1268
1941 | vn -0.0028 0.9998 -0.0220
1942 | vn -0.0152 0.9681 -0.2501
1943 | vn -0.0318 0.9653 -0.2592
1944 | vn -0.0038 0.9998 -0.0201
1945 | vn -0.0321 0.9882 -0.1496
1946 | vn -0.0306 0.9777 -0.2076
1947 | vn -0.0120 0.9999 -0.0120
1948 | vn -0.0319 0.9981 -0.0535
1949 | vn -0.0914 0.9877 -0.1273
1950 | vn -0.1483 0.9778 -0.1483
1951 | vn -0.1879 0.9545 -0.2317
1952 | vn -0.2035 0.9711 -0.1247
1953 | vn -0.2439 0.9686 -0.0488
1954 | vn -0.3451 0.9355 -0.0751
1955 | vn -0.1273 0.9877 -0.0914
1956 | vn -0.1043 0.9939 -0.0354
1957 | vn -0.2043 0.9785 -0.0295
1958 | vn -0.0201 0.9998 -0.0038
1959 | vn 0.0093 0.9999 0.0070
1960 | vn 0.2566 0.9595 0.1167
1961 | vn 0.1923 0.9744 0.1165
1962 | vn 0.1467 0.9782 0.1467
1963 | vn 0.0914 0.9877 0.1273
1964 | vn 0.0864 0.9649 0.2479
1965 | vn 0.0626 0.9784 0.1972
1966 | vn 0.1581 0.9742 0.1608
1967 | vn 0.0439 0.9752 0.2171
1968 | vn 0.0295 0.9785 0.2043
1969 | vn 0.0766 0.9812 0.1771
1970 | vn 0.3793 0.9203 0.0961
1971 | vn 0.3306 0.9342 0.1342
1972 | vn 0.2850 0.9568 0.0569
1973 | vn 0.1182 0.9808 0.1551
1974 | vn 0.1062 0.9685 0.2251
1975 | vn 0.2663 0.9445 0.1922
1976 | vn 0.1520 0.9870 -0.0516
1977 | vn 0.1931 0.9809 -0.0218
1978 | vn 0.0293 0.9996 -0.0056
1979 | vn 0.2045 0.9788 0.0100
1980 | vn 0.2036 0.9789 0.0197
1981 | vn 0.0146 0.9999 0.0091
1982 | vn 0.2741 0.9473 -0.1657
1983 | vn 0.3366 0.9349 -0.1129
1984 | vn 0.3036 0.9513 -0.0538
1985 | vn 0.3871 0.9202 -0.0581
1986 | vn 0.4001 0.9162 0.0238
1987 | vn 0.3672 0.9299 0.0207
1988 | vn 0.0872 0.9595 -0.2679
1989 | vn 0.1146 0.9661 -0.2314
1990 | vn 0.2780 0.9430 -0.1828
1991 | vn 0.1309 0.9863 -0.1001
1992 | vn 0.1279 0.9907 0.0457
1993 | vn 0.3208 0.9465 0.0338
1994 | vn 0.1643 0.9775 -0.1323
1995 | vn 0.2116 0.9547 -0.2094
1996 | vn 0.1843 0.9739 -0.1323
1997 | vn 0.0587 0.9838 -0.1696
1998 | vn 0.0668 0.9538 -0.2928
1999 | vn 0.1717 0.9490 -0.2645
2000 | vn 0.2701 0.9608 0.0620
2001 | vn 0.1736 0.9817 0.0783
2002 | vn 0.0100 0.9999 0.0077
2003 | vn 0.0681 0.9966 0.0465
2004 | vn 0.4511 0.8718 0.1912
2005 | vn 0.3702 0.8794 0.2994
2006 | vn 0.3399 0.9200 0.1952
2007 | vn 0.2621 0.9141 0.3096
2008 | vn 0.1782 0.9767 0.1199
2009 | vn 0.0929 0.9940 0.0581
2010 | vn 0.1478 0.9394 0.3092
2011 | vn 0.1118 0.8866 0.4487
2012 | vn 0.2890 0.8748 0.3889
2013 | vn 0.0793 0.8793 0.4695
2014 | vn 0.0625 0.9782 0.1982
2015 | vn 0.1583 0.9728 0.1690
2016 | vn 0.4622 0.8713 -0.1652
2017 | vn 0.4869 0.8733 0.0167
2018 | vn 0.4610 0.8873 0.0107
2019 | vn 0.1556 0.9504 -0.2693
2020 | vn 0.1710 0.9847 0.0328
2021 | vn 0.4012 0.9157 0.0245
2022 | vn -0.1158 0.9820 -0.1493
2023 | vn -0.0460 0.9980 0.0438
2024 | vn 0.0895 0.9924 0.0846
2025 | vn -0.0114 0.9661 0.2580
2026 | vn 0.0159 0.9275 0.3734
2027 | vn 0.1043 0.9218 0.3735
2028 | vn -0.2333 0.9513 -0.2015
2029 | vn -0.2263 0.9738 -0.0227
2030 | vn -0.1561 0.9877 0.0096
2031 | vn -0.1438 0.9808 0.1318
2032 | vn 0.0206 0.9714 0.2366
2033 | vn -0.0662 0.9369 0.3432
2034 | vn -0.0149 0.9464 -0.3226
2035 | vn 0.0464 0.9626 -0.2669
2036 | vn -0.0176 0.9900 -0.1400
2037 | vn 0.1154 0.9867 -0.1143
2038 | vn 0.1743 0.9813 0.0820
2039 | vn 0.2388 0.9633 0.1227
2040 | vn -0.2446 0.9421 -0.2295
2041 | vn -0.2042 0.9292 -0.3081
2042 | vn -0.2423 0.9348 -0.2598
2043 | vn -0.0765 0.9807 -0.1802
2044 | vn -0.0698 0.9623 -0.2629
2045 | vn -0.1805 0.9476 -0.2635
2046 | vn -0.1658 0.9853 -0.0416
2047 | vn -0.1671 0.9746 -0.1494
2048 | vn -0.0677 0.9827 -0.1727
2049 | vn -0.2135 0.9567 -0.1980
2050 | vn -0.2663 0.9445 -0.1922
2051 | vn -0.1062 0.9685 -0.2251
2052 | vn -0.1444 0.9867 -0.0740
2053 | vn -0.1936 0.9743 -0.1152
2054 | vn -0.2203 0.9743 -0.0463
2055 | vn -0.2748 0.9591 -0.0679
2056 | vn -0.3306 0.9342 -0.1342
2057 | vn -0.0190 0.9998 -0.0049
2058 | vn -0.0392 0.9942 -0.1005
2059 | vn -0.0990 0.9921 -0.0765
2060 | vn -0.1963 0.9731 0.1209
2061 | vn -0.1490 0.9884 0.0286
2062 | vn -0.2219 0.9732 0.0599
2063 | vn -0.0017 1.0000 0.0017
2064 | vn -0.0296 0.9995 0.0057
2065 | vn -0.1477 0.9878 -0.0494
2066 | vn -0.2184 0.9757 0.0163
2067 | vn -0.0715 0.9962 -0.0500
2068 | vn -0.2433 0.9655 0.0931
2069 | vn -0.2218 0.9530 0.2063
2070 | vn -0.0881 0.9688 0.2315
2071 | vn -0.2809 0.9558 0.0864
2072 | vn -0.3057 0.9484 0.0840
2073 | vn -0.2979 0.9525 0.0632
2074 | vn -0.2967 0.9530 0.0615
2075 | vn -0.2554 0.9605 0.1104
2076 | vn -0.2746 0.9475 0.1639
2077 | vn -0.1047 0.9876 0.1170
2078 | vn -0.0614 0.9970 0.0478
2079 | vn -0.2260 0.9709 0.0798
2080 | vn -0.0307 0.9995 0.0067
2081 | vn -0.0137 0.9999 0.0103
2082 | vn -0.1525 0.9869 0.0518
2083 | vn -0.1398 0.9862 0.0884
2084 | vn -0.2229 0.9714 0.0813
2085 | vn -0.1716 0.9852 -0.0036
2086 | vn -0.1911 0.9748 0.1152
2087 | vn -0.1483 0.9782 0.1452
2088 | vn -0.1885 0.9714 0.1443
2089 | vn 0.0348 0.9932 -0.1115
2090 | vn -0.0589 0.9935 -0.0977
2091 | vn 0.0776 0.9809 -0.1782
2092 | vn -0.2016 0.9632 0.1777
2093 | vn -0.1873 0.9786 0.0854
2094 | vn -0.0731 0.9922 0.1010
2095 | vn -0.3009 0.9445 -0.1317
2096 | vn -0.2434 0.9628 -0.1174
2097 | vn -0.1279 0.9907 -0.0457
2098 | vn 0.2708 0.9626 0.0135
2099 | vn 0.3085 0.9512 0.0052
2100 | vn 0.0433 0.9991 0.0011
2101 | vn 0.0174 0.9997 -0.0174
2102 | vn 0.0782 0.9958 -0.0467
2103 | vn 0.0016 1.0000 -0.0016
2104 | vn 0.1809 0.9834 0.0112
2105 | vn 0.1499 0.9887 0.0024
2106 | vn 0.0201 0.9998 -0.0038
2107 | vn -0.0354 0.9939 -0.1043
2108 | vn -0.1043 0.9939 0.0354
2109 | vn -0.0535 0.9981 0.0319
2110 | vn -0.0555 0.9945 -0.0890
2111 | vn -0.1034 0.9555 -0.2764
2112 | vn -0.0935 0.9524 -0.2901
2113 | vn -0.0569 0.9918 0.1147
2114 | vn -0.0476 0.9565 0.2878
2115 | vn -0.0450 0.9717 0.2317
2116 | vn -0.2171 0.9752 0.0439
2117 | vn -0.1498 0.9773 0.1498
2118 | vn 0.1498 0.9773 -0.1498
2119 | vn 0.1729 0.9832 -0.0582
2120 | vn 0.2171 0.9752 -0.0439
2121 | vn 0.2261 0.9708 -0.0800
2122 | vn 0.2236 0.9669 -0.1228
2123 | vn 0.1047 0.9876 -0.1170
2124 | vn -0.3827 0.9239 0.0000
2125 | vn -0.1951 0.9808 0.0000
2126 | vn -0.5556 0.8314 0.0000
2127 | vn -0.7071 0.7071 0.0000
2128 | vn -0.8314 0.5556 0.0000
2129 | vn -0.9239 0.3827 0.0000
2130 | vn -0.9808 0.1951 0.0000
2131 | vn -0.9952 0.0980 0.0000
2132 | vn -0.0980 0.9952 0.0000
2133 | usemtl uv-checker|lm_environment
2134 | s off
2135 | f 23/1/1 10/2/1 4/3/1 14/4/1
2136 | f 13/5/1 2/6/1 8/7/1 17/8/1
2137 | f 17/8/1 8/7/1 9/9/1 20/10/1
2138 | f 20/10/1 9/9/1 10/2/1 23/1/1
2139 | f 6/11/1 22/12/1 25/13/1 5/14/1
2140 | f 22/12/1 21/15/1 24/16/1 25/13/1
2141 | f 21/15/1 20/10/1 23/1/1 24/16/1
2142 | f 7/17/1 19/18/1 22/12/1 6/11/1
2143 | f 19/18/1 18/19/1 21/15/1 22/12/1
2144 | f 18/19/1 17/8/1 20/10/1 21/15/1
2145 | f 1/20/1 11/21/1 19/18/1 7/17/1
2146 | f 11/21/1 12/22/1 18/19/1 19/18/1
2147 | f 12/22/1 13/5/1 17/8/1 18/19/1
2148 | f 5/14/1 25/13/1 16/23/1 3/24/1
2149 | f 25/13/1 24/16/1 15/25/1 16/23/1
2150 | f 24/16/1 23/1/1 14/4/1 15/25/1
2151 | f 1/26/2 7/27/2 32/28/2 26/29/2
2152 | f 13/30/3 12/31/3 37/32/3 38/33/3
2153 | f 9/34/4 8/35/4 33/36/4 34/37/4
2154 | f 2/38/3 13/30/3 38/33/3 27/39/3
2155 | f 14/40/5 4/41/5 29/42/5 39/43/5
2156 | f 10/44/4 9/34/4 34/37/4 35/45/4
2157 | f 4/46/4 10/44/4 35/45/4 29/47/4
2158 | f 15/48/5 14/40/5 39/43/5 40/49/5
2159 | f 3/50/5 16/51/5 41/52/5 28/53/5
2160 | f 16/51/5 15/48/5 40/49/5 41/52/5
2161 | f 5/54/2 3/55/2 28/56/2 30/57/2
2162 | f 6/58/2 5/54/2 30/57/2 31/59/2
2163 | f 11/60/3 1/61/3 26/62/3 36/63/3
2164 | f 7/27/2 6/58/2 31/59/2 32/28/2
2165 | f 12/31/3 11/60/3 36/63/3 37/32/3
2166 | f 8/35/4 2/64/4 27/65/4 33/36/4
2167 | f 38/66/6 37/67/6 53/68/6 54/69/6
2168 | f 31/70/6 30/71/6 46/72/6 47/73/6
2169 | f 39/74/6 29/75/6 45/76/6 55/77/6
2170 | f 32/78/6 31/70/6 47/73/6 48/79/6
2171 | f 40/80/6 39/74/6 55/77/6 56/81/6
2172 | f 33/82/6 27/83/6 43/84/6 49/85/6
2173 | f 26/86/6 32/78/6 48/79/6 42/87/6
2174 | f 41/88/6 40/80/6 56/81/6 57/89/6
2175 | f 34/90/6 33/82/6 49/85/6 50/91/6
2176 | f 27/83/6 38/66/6 54/69/6 43/84/6
2177 | f 35/92/6 34/90/6 50/91/6 51/93/6
2178 | f 29/75/6 35/92/6 51/93/6 45/76/6
2179 | f 36/94/6 26/86/6 42/87/6 52/95/6
2180 | f 28/96/6 41/88/6 57/89/6 44/97/6
2181 | f 37/67/6 36/94/6 52/95/6 53/68/6
2182 | f 30/71/6 28/96/6 44/97/6 46/72/6
2183 | f 55/98/5 45/99/5 61/100/5 71/101/5
2184 | f 48/102/2 47/103/2 63/104/2 64/105/2
2185 | f 56/106/5 55/98/5 71/101/5 72/107/5
2186 | f 49/108/4 43/109/4 59/110/4 65/111/4
2187 | f 42/112/2 48/102/2 64/105/2 58/113/2
2188 | f 57/114/5 56/106/5 72/107/5 73/115/5
2189 | f 50/116/4 49/108/4 65/111/4 66/117/4
2190 | f 43/118/3 54/119/3 70/120/3 59/121/3
2191 | f 51/122/4 50/116/4 66/117/4 67/123/4
2192 | f 45/124/4 51/122/4 67/123/4 61/125/4
2193 | f 52/126/3 42/127/3 58/128/3 68/129/3
2194 | f 44/130/5 57/114/5 73/115/5 60/131/5
2195 | f 53/132/3 52/126/3 68/129/3 69/133/3
2196 | f 46/134/2 44/135/2 60/136/2 62/137/2
2197 | f 54/119/3 53/132/3 69/133/3 70/120/3
2198 | f 47/103/2 46/134/2 62/137/2 63/104/2
2199 | f 96/138/4 97/139/4 99/140/4 98/141/4
2200 | f 98/142/3 99/143/3 103/144/3 102/145/3
2201 | f 102/146/2 103/147/2 101/148/2 100/149/2
2202 | f 100/150/5 101/151/5 97/152/5 96/153/5
2203 | f 98/154/6 102/155/6 100/156/6 96/157/6
2204 | f 103/158/1 99/159/1 97/160/1 101/161/1
2205 | f 104/162/5 105/163/5 107/164/5 106/165/5
2206 | f 106/166/4 107/167/4 111/168/4 110/169/4
2207 | f 110/170/3 111/171/3 109/172/3 108/173/3
2208 | f 108/174/2 109/175/2 105/176/2 104/177/2
2209 | f 106/178/6 110/179/6 108/180/6 104/181/6
2210 | f 111/182/1 107/183/1 105/184/1 109/185/1
2211 | f 112/186/2 113/187/2 115/188/2 114/189/2
2212 | f 114/190/5 115/191/5 119/192/5 118/193/5
2213 | f 118/194/4 119/195/4 117/196/4 116/197/4
2214 | f 116/198/3 117/199/3 113/200/3 112/201/3
2215 | f 114/202/6 118/203/6 116/204/6 112/205/6
2216 | f 119/206/1 115/207/1 113/208/1 117/209/1
2217 | f 120/210/2 121/211/2 123/212/2 122/213/2
2218 | f 122/214/5 123/215/5 127/216/5 126/217/5
2219 | f 126/218/4 127/219/4 125/220/4 124/221/4
2220 | f 124/222/3 125/223/3 121/224/3 120/225/3
2221 | f 122/226/6 126/227/6 124/228/6 120/229/6
2222 | f 127/230/1 123/231/1 121/232/1 125/233/1
2223 | f 128/234/2 129/235/2 131/236/2 130/237/2
2224 | f 130/238/5 131/239/5 135/240/5 134/241/5
2225 | f 134/242/4 135/243/4 133/244/4 132/245/4
2226 | f 132/246/3 133/247/3 129/248/3 128/249/3
2227 | f 130/250/6 134/251/6 132/252/6 128/253/6
2228 | f 135/254/1 131/255/1 129/256/1 133/257/1
2229 | f 760/258/7 307/259/7 139/260/7 359/261/7
2230 | f 759/262/8 315/263/8 145/264/8 351/265/8
2231 | f 758/266/9 316/267/9 144/268/9 363/269/9
2232 | f 757/270/10 317/271/10 143/272/10 361/273/10
2233 | f 756/274/11 330/275/11 158/276/11 401/277/11
2234 | f 755/278/1 331/279/1 159/280/1 403/281/1
2235 | f 754/282/12 332/283/12 160/284/12 405/285/12
2236 | f 753/286/13 327/287/13 155/288/13 407/289/13
2237 | f 752/290/1 328/291/1 156/292/1 409/293/1
2238 | f 751/294/1 329/295/1 157/296/1 411/297/1
2239 | f 750/298/14 324/299/14 152/300/14 413/301/14
2240 | f 749/302/1 325/303/1 153/304/1 415/305/1
2241 | f 748/306/15 326/307/15 154/308/15 417/309/15
2242 | f 747/310/16 321/311/16 149/312/16 419/313/16
2243 | f 746/314/17 322/315/17 150/316/17 421/317/17
2244 | f 745/318/18 323/319/18 151/320/18 423/321/18
2245 | f 744/322/19 425/323/19 240/324/19 344/325/19
2246 | f 743/326/20 428/327/20 239/328/20 424/329/20
2247 | f 742/330/21 426/331/21 241/332/21 431/333/21
2248 | f 741/334/22 427/335/22 242/336/22 432/337/22
2249 | f 740/338/23 429/339/23 243/340/23 433/341/23
2250 | f 739/342/24 430/343/24 244/344/24 434/345/24
2251 | f 738/346/25 381/347/25 197/348/25 435/349/25
2252 | f 737/350/26 382/351/26 198/352/26 436/353/26
2253 | f 736/354/27 437/355/27 238/356/27 343/357/27
2254 | f 735/358/28 440/359/28 237/360/28 422/361/28
2255 | f 734/362/29 438/363/29 245/364/29 443/365/29
2256 | f 733/366/30 439/367/30 246/368/30 444/369/30
2257 | f 732/370/31 441/371/31 247/372/31 445/373/31
2258 | f 731/374/32 442/375/32 248/376/32 446/377/32
2259 | f 730/378/33 379/379/33 195/380/33 447/381/33
2260 | f 729/382/34 380/383/34 196/384/34 448/385/34
2261 | f 728/386/35 449/387/35 236/388/35 342/389/35
2262 | f 727/390/36 452/391/36 235/392/36 420/393/36
2263 | f 726/394/37 450/395/37 249/396/37 455/397/37
2264 | f 725/398/38 451/399/38 250/400/38 456/401/38
2265 | f 724/402/39 453/403/39 251/404/39 457/405/39
2266 | f 723/406/40 454/407/40 252/408/40 458/409/40
2267 | f 722/410/41 377/411/41 193/412/41 459/413/41
2268 | f 721/414/42 378/415/42 194/416/42 460/417/42
2269 | f 720/418/43 461/419/43 234/420/43 341/421/43
2270 | f 719/422/44 464/423/44 233/424/44 418/425/44
2271 | f 718/426/45 462/427/45 253/428/45 467/429/45
2272 | f 717/430/46 463/431/46 254/432/46 468/433/46
2273 | f 716/434/47 465/435/47 255/436/47 469/437/47
2274 | f 715/438/48 466/439/48 256/440/48 470/441/48
2275 | f 714/442/49 387/443/49 203/444/49 471/445/49
2276 | f 713/446/50 388/447/50 204/448/50 472/449/50
2277 | f 712/450/51 473/451/51 232/452/51 340/453/51
2278 | f 711/454/52 476/455/52 231/456/52 416/457/52
2279 | f 710/458/53 474/459/53 257/460/53 479/461/53
2280 | f 709/462/54 475/463/54 258/464/54 480/465/54
2281 | f 708/466/55 477/467/55 259/468/55 481/469/55
2282 | f 707/470/56 478/471/56 260/472/56 482/473/56
2283 | f 706/474/57 385/475/57 201/476/57 483/477/57
2284 | f 705/478/58 386/479/58 202/480/58 484/481/58
2285 | f 704/482/59 485/483/59 230/484/59 339/485/59
2286 | f 703/486/60 488/487/60 229/488/60 414/489/60
2287 | f 702/490/61 486/491/61 261/492/61 491/493/61
2288 | f 701/494/62 487/495/62 262/496/62 492/497/62
2289 | f 700/498/63 489/499/63 263/500/63 493/501/63
2290 | f 699/502/64 490/503/64 264/504/64 494/505/64
2291 | f 698/506/49 383/507/49 199/508/49 495/509/49
2292 | f 697/510/65 384/511/65 200/512/65 496/513/65
2293 | f 696/514/1 497/515/1 228/516/1 338/517/1
2294 | f 695/518/1 500/519/1 227/520/1 412/521/1
2295 | f 694/522/1 498/523/1 265/524/1 503/525/1
2296 | f 693/526/1 499/527/1 266/528/1 504/529/1
2297 | f 692/530/1 501/531/1 267/532/1 505/533/1
2298 | f 691/534/1 502/535/1 268/536/1 506/537/1
2299 | f 690/538/1 393/539/1 209/540/1 507/541/1
2300 | f 689/542/1 394/543/1 210/544/1 508/545/1
2301 | f 688/546/1 509/547/1 226/548/1 337/549/1
2302 | f 687/550/1 512/551/1 225/552/1 410/553/1
2303 | f 686/554/1 510/555/1 269/556/1 515/557/1
2304 | f 685/558/1 511/559/1 270/560/1 516/561/1
2305 | f 684/562/1 513/563/1 271/564/1 517/565/1
2306 | f 683/566/1 514/567/1 272/568/1 518/569/1
2307 | f 682/570/1 391/571/1 207/572/1 519/573/1
2308 | f 681/574/1 392/575/1 208/576/1 520/577/1
2309 | f 680/578/1 521/579/1 224/580/1 336/581/1
2310 | f 679/582/1 524/583/1 223/584/1 408/585/1
2311 | f 678/586/66 522/587/66 273/588/66 527/589/66
2312 | f 677/590/1 523/591/1 274/592/1 528/593/1
2313 | f 676/594/67 525/595/67 275/596/67 529/597/67
2314 | f 675/598/68 526/599/68 276/600/68 530/601/68
2315 | f 674/602/69 389/603/69 205/604/69 531/605/69
2316 | f 673/606/70 390/607/70 206/608/70 532/609/70
2317 | f 672/610/1 533/611/1 222/612/1 335/613/1
2318 | f 671/614/71 536/615/71 221/616/71 406/617/71
2319 | f 670/618/1 534/619/1 277/620/1 539/621/1
2320 | f 669/622/1 535/623/1 278/624/1 540/625/1
2321 | f 668/626/1 537/627/1 279/628/1 541/629/1
2322 | f 667/630/1 538/631/1 280/632/1 542/633/1
2323 | f 666/634/1 399/635/1 215/636/1 543/637/1
2324 | f 665/638/72 400/639/72 216/640/72 544/641/72
2325 | f 664/642/1 545/643/1 220/644/1 334/645/1
2326 | f 663/646/1 548/647/1 219/648/1 404/649/1
2327 | f 662/650/1 546/651/1 281/652/1 551/653/1
2328 | f 661/654/1 547/655/1 282/656/1 552/657/1
2329 | f 660/658/1 549/659/1 283/660/1 553/661/1
2330 | f 659/662/1 550/663/1 284/664/1 554/665/1
2331 | f 658/666/73 397/667/73 213/668/73 555/669/73
2332 | f 657/670/1 398/671/1 214/672/1 556/673/1
2333 | f 656/674/74 557/675/74 218/676/74 333/677/74
2334 | f 655/678/75 560/679/75 217/680/75 402/681/75
2335 | f 654/682/76 558/683/76 285/684/76 563/685/76
2336 | f 653/686/77 559/687/77 286/688/77 564/689/77
2337 | f 652/690/78 561/691/78 287/692/78 565/693/78
2338 | f 651/694/79 562/695/79 288/696/79 566/697/79
2339 | f 650/698/80 395/699/80 211/700/80 567/701/80
2340 | f 649/702/81 396/703/81 212/704/81 568/705/81
2341 | f 648/706/82 569/707/82 178/708/82 313/709/82
2342 | f 647/710/83 572/711/83 177/712/83 362/713/83
2343 | f 646/714/84 570/715/84 289/716/84 575/717/84
2344 | f 645/718/85 571/719/85 290/720/85 576/721/85
2345 | f 644/722/86 573/723/86 291/724/86 577/725/86
2346 | f 643/726/87 574/727/87 292/728/87 578/729/87
2347 | f 642/730/88 369/731/88 185/732/88 579/733/88
2348 | f 641/734/89 370/735/89 186/736/89 580/737/89
2349 | f 640/738/90 581/739/90 180/740/90 314/741/90
2350 | f 639/742/91 584/743/91 179/744/91 364/745/91
2351 | f 638/746/92 582/747/92 293/748/92 587/749/92
2352 | f 637/750/93 583/751/93 294/752/93 588/753/93
2353 | f 636/754/94 585/755/94 295/756/94 589/757/94
2354 | f 635/758/95 586/759/95 296/760/95 590/761/95
2355 | f 634/762/96 367/763/96 183/764/96 591/765/96
2356 | f 633/766/97 368/767/97 184/768/97 592/769/97
2357 | f 632/770/98 593/771/98 168/772/98 308/773/98
2358 | f 631/774/99 596/775/99 167/776/99 352/777/99
2359 | f 630/778/100 594/779/100 297/780/100 599/781/100
2360 | f 629/782/101 595/783/101 298/784/101 600/785/101
2361 | f 628/786/102 597/787/102 299/788/102 601/789/102
2362 | f 627/790/103 598/791/103 300/792/103 602/793/103
2363 | f 626/794/104 365/795/104 181/796/104 603/797/104
2364 | f 625/798/105 366/799/105 182/800/105 604/801/105
2365 | f 624/802/106 605/803/106 176/804/106 312/805/106
2366 | f 623/806/107 608/807/107 175/808/107 360/809/107
2367 | f 622/810/108 606/811/108 301/812/108 611/813/108
2368 | f 621/814/109 607/815/109 302/816/109 612/817/109
2369 | f 620/818/110 609/819/110 303/820/110 613/821/110
2370 | f 619/822/111 610/823/111 304/824/111 614/825/111
2371 | f 618/826/112 349/827/112 165/828/112 615/829/112
2372 | f 617/830/113 350/831/113 166/832/113 616/833/113
2373 | f 610/823/114 617/830/114 616/833/114 304/824/114
2374 | f 303/820/115 615/829/115 617/830/115 610/823/115
2375 | f 615/829/8 165/828/8 350/831/8 617/830/8
2376 | f 609/819/116 618/826/116 615/829/116 303/820/116
2377 | f 239/328/117 423/321/117 618/826/117 609/819/117
2378 | f 423/321/118 151/320/118 349/827/118 618/826/118
2379 | f 607/815/119 619/822/119 614/825/119 302/816/119
2380 | f 301/812/120 613/821/120 619/822/120 607/815/120
2381 | f 613/821/121 303/820/121 610/823/121 619/822/121
2382 | f 606/811/122 620/818/122 613/821/122 301/812/122
2383 | f 240/324/123 424/329/123 620/818/123 606/811/123
2384 | f 424/329/124 239/328/124 609/819/124 620/818/124
2385 | f 370/735/125 621/814/125 612/817/125 186/736/125
2386 | f 185/732/126 611/813/126 621/814/126 370/735/126
2387 | f 611/813/127 301/812/127 607/815/127 621/814/127
2388 | f 369/731/128 622/810/128 611/813/128 185/732/128
2389 | f 160/284/129 344/325/129 622/810/129 369/731/129
2390 | f 344/325/130 240/324/130 606/811/130 622/810/130
2391 | f 605/803/131 623/806/131 360/809/131 176/804/131
2392 | f 302/816/132 614/825/132 623/806/132 605/803/132
2393 | f 614/825/133 304/824/133 608/807/133 623/806/133
2394 | f 317/271/134 624/802/134 312/805/134 143/272/134
2395 | f 186/736/135 612/817/135 624/802/135 317/271/135
2396 | f 612/817/136 302/816/136 605/803/136 624/802/136
2397 | f 598/791/137 625/798/137 604/801/137 300/792/137
2398 | f 299/788/138 603/797/138 625/798/138 598/791/138
2399 | f 603/797/139 181/796/139 366/799/139 625/798/139
2400 | f 597/787/140 626/794/140 603/797/140 299/788/140
2401 | f 233/424/141 417/309/141 626/794/141 597/787/141
2402 | f 417/309/142 154/308/142 365/795/142 626/794/142
2403 | f 595/783/143 627/790/143 602/793/143 298/784/143
2404 | f 297/780/144 601/789/144 627/790/144 595/783/144
2405 | f 601/789/145 299/788/145 598/791/145 627/790/145
2406 | f 594/779/146 628/786/146 601/789/146 297/780/146
2407 | f 234/420/147 418/425/147 628/786/147 594/779/147
2408 | f 418/425/148 233/424/148 597/787/148 628/786/148
2409 | f 372/834/149 629/782/149 600/785/149 187/835/149
2410 | f 188/836/150 599/781/150 629/782/150 372/834/150
2411 | f 599/781/151 297/780/151 595/783/151 629/782/151
2412 | f 318/837/152 630/778/152 599/781/152 188/836/152
2413 | f 146/838/153 341/421/153 630/778/153 318/837/153
2414 | f 341/421/154 234/420/154 594/779/154 630/778/154
2415 | f 593/771/155 631/774/155 352/777/155 168/772/155
2416 | f 298/784/156 602/793/156 631/774/156 593/771/156
2417 | f 602/793/157 300/792/157 596/775/157 631/774/157
2418 | f 371/839/158 632/770/158 308/773/158 138/840/158
2419 | f 187/835/159 600/785/159 632/770/159 371/839/159
2420 | f 600/785/160 298/784/160 593/771/160 632/770/160
2421 | f 586/759/161 633/766/161 592/769/161 296/760/161
2422 | f 295/756/162 591/765/162 633/766/162 586/759/162
2423 | f 591/765/163 183/764/163 368/767/163 633/766/163
2424 | f 585/755/164 634/762/164 591/765/164 295/756/164
2425 | f 227/520/165 411/297/165 634/762/165 585/755/165
2426 | f 411/297/166 157/296/166 367/763/166 634/762/166
2427 | f 583/751/167 635/758/167 590/761/167 294/752/167
2428 | f 293/748/168 589/757/168 635/758/168 583/751/168
2429 | f 589/757/72 295/756/72 586/759/72 635/758/72
2430 | f 582/747/49 636/754/49 589/757/49 293/748/49
2431 | f 228/516/1 412/521/1 636/754/1 582/747/1
2432 | f 412/521/1 227/520/1 585/755/1 636/754/1
2433 | f 366/799/169 637/750/169 588/753/169 182/800/169
2434 | f 181/796/170 587/749/170 637/750/170 366/799/170
2435 | f 587/749/171 293/748/171 583/751/171 637/750/171
2436 | f 365/795/63 638/746/63 587/749/63 181/796/63
2437 | f 154/308/172 338/517/172 638/746/172 365/795/172
2438 | f 338/517/173 228/516/173 582/747/173 638/746/173
2439 | f 581/739/174 639/742/174 364/745/174 180/740/174
2440 | f 294/752/175 590/761/175 639/742/175 581/739/175
2441 | f 590/761/12 296/760/12 584/743/12 639/742/12
2442 | f 315/263/176 640/738/176 314/741/176 145/264/176
2443 | f 182/800/177 588/753/177 640/738/177 315/263/177
2444 | f 588/753/178 294/752/178 581/739/178 640/738/178
2445 | f 574/727/179 641/734/179 580/737/179 292/728/179
2446 | f 291/724/180 579/733/180 641/734/180 574/727/180
2447 | f 579/733/181 185/732/181 370/735/181 641/734/181
2448 | f 573/723/182 642/730/182 579/733/182 291/724/182
2449 | f 221/616/183 405/285/183 642/730/183 573/723/183
2450 | f 405/285/184 160/284/184 369/731/184 642/730/184
2451 | f 571/719/185 643/726/185 578/729/185 290/720/185
2452 | f 289/716/186 577/725/186 643/726/186 571/719/186
2453 | f 577/725/187 291/724/187 574/727/187 643/726/187
2454 | f 570/715/188 644/722/188 577/725/188 289/716/188
2455 | f 222/612/189 406/617/189 644/722/189 570/715/189
2456 | f 406/617/190 221/616/190 573/723/190 644/722/190
2457 | f 368/767/191 645/718/191 576/721/191 184/768/191
2458 | f 183/764/192 575/717/192 645/718/192 368/767/192
2459 | f 575/717/193 289/716/193 571/719/193 645/718/193
2460 | f 367/763/194 646/714/194 575/717/194 183/764/194
2461 | f 157/296/195 335/613/195 646/714/195 367/763/195
2462 | f 335/613/196 222/612/196 570/715/196 646/714/196
2463 | f 569/707/197 647/710/197 362/713/197 178/708/197
2464 | f 290/720/198 578/729/198 647/710/198 569/707/198
2465 | f 578/729/199 292/728/199 572/711/199 647/710/199
2466 | f 316/267/200 648/706/200 313/709/200 144/268/200
2467 | f 184/768/201 576/721/201 648/706/201 316/267/201
2468 | f 576/721/202 290/720/202 569/707/202 648/706/202
2469 | f 562/695/203 649/702/203 568/705/203 288/696/203
2470 | f 287/692/204 567/701/204 649/702/204 562/695/204
2471 | f 567/701/205 211/700/205 396/703/205 649/702/205
2472 | f 561/691/206 650/698/206 567/701/206 287/692/206
2473 | f 174/841/207 311/842/207 650/698/207 561/691/207
2474 | f 311/842/208 142/843/208 395/699/208 650/698/208
2475 | f 559/687/209 651/694/209 566/697/209 286/688/209
2476 | f 285/684/210 565/693/210 651/694/210 559/687/210
2477 | f 565/693/211 287/692/211 562/695/211 651/694/211
2478 | f 558/683/212 652/690/212 565/693/212 285/684/212
2479 | f 173/844/213 358/845/213 652/690/213 558/683/213
2480 | f 358/845/214 174/841/214 561/691/214 652/690/214
2481 | f 390/607/215 653/686/215 564/689/215 206/608/215
2482 | f 205/604/216 563/685/216 653/686/216 390/607/216
2483 | f 563/685/217 285/684/217 559/687/217 653/686/217
2484 | f 389/603/218 654/682/218 563/685/218 205/604/218
2485 | f 141/846/219 357/847/219 654/682/219 389/603/219
2486 | f 357/847/220 173/844/220 558/683/220 654/682/220
2487 | f 557/675/221 655/678/221 402/681/221 218/676/221
2488 | f 286/688/222 566/697/222 655/678/222 557/675/222
2489 | f 566/697/223 288/696/223 560/679/223 655/678/223
2490 | f 327/287/224 656/674/224 333/677/224 155/288/224
2491 | f 206/608/225 564/689/225 656/674/225 327/287/225
2492 | f 564/689/226 286/688/226 557/675/226 656/674/226
2493 | f 550/663/1 657/670/1 556/673/1 284/664/1
2494 | f 283/660/1 555/669/1 657/670/1 550/663/1
2495 | f 555/669/1 213/668/1 398/671/1 657/670/1
2496 | f 549/659/1 658/666/1 555/669/1 283/660/1
2497 | f 217/680/227 401/277/227 658/666/227 549/659/227
2498 | f 401/277/228 158/276/228 397/667/228 658/666/228
2499 | f 547/655/1 659/662/1 554/665/1 282/656/1
2500 | f 281/652/1 553/661/1 659/662/1 547/655/1
2501 | f 553/661/1 283/660/1 550/663/1 659/662/1
2502 | f 546/651/1 660/658/1 553/661/1 281/652/1
2503 | f 218/676/1 402/681/1 660/658/1 546/651/1
2504 | f 402/681/1 217/680/1 549/659/1 660/658/1
2505 | f 392/575/1 661/654/1 552/657/1 208/576/1
2506 | f 207/572/1 551/653/1 661/654/1 392/575/1
2507 | f 551/653/1 281/652/1 547/655/1 661/654/1
2508 | f 391/571/1 662/650/1 551/653/1 207/572/1
2509 | f 155/288/1 333/677/1 662/650/1 391/571/1
2510 | f 333/677/1 218/676/1 546/651/1 662/650/1
2511 | f 545/643/1 663/646/1 404/649/1 220/644/1
2512 | f 282/656/1 554/665/1 663/646/1 545/643/1
2513 | f 554/665/1 284/664/1 548/647/1 663/646/1
2514 | f 328/291/1 664/642/1 334/645/1 156/292/1
2515 | f 208/576/1 552/657/1 664/642/1 328/291/1
2516 | f 552/657/1 282/656/1 545/643/1 664/642/1
2517 | f 538/631/94 665/638/94 544/641/94 280/632/94
2518 | f 279/628/1 543/637/1 665/638/1 538/631/1
2519 | f 543/637/94 215/636/94 400/639/94 665/638/94
2520 | f 537/627/1 666/634/1 543/637/1 279/628/1
2521 | f 219/648/1 403/281/1 666/634/1 537/627/1
2522 | f 403/281/1 159/280/1 399/635/1 666/634/1
2523 | f 535/623/1 667/630/1 542/633/1 278/624/1
2524 | f 277/620/1 541/629/1 667/630/1 535/623/1
2525 | f 541/629/1 279/628/1 538/631/1 667/630/1
2526 | f 534/619/1 668/626/1 541/629/1 277/620/1
2527 | f 220/644/1 404/649/1 668/626/1 534/619/1
2528 | f 404/649/1 219/648/1 537/627/1 668/626/1
2529 | f 394/543/1 669/622/1 540/625/1 210/544/1
2530 | f 209/540/1 539/621/1 669/622/1 394/543/1
2531 | f 539/621/1 277/620/1 535/623/1 669/622/1
2532 | f 393/539/1 670/618/1 539/621/1 209/540/1
2533 | f 156/292/1 334/645/1 670/618/1 393/539/1
2534 | f 334/645/1 220/644/1 534/619/1 670/618/1
2535 | f 533/611/1 671/614/1 406/617/1 222/612/1
2536 | f 278/624/1 542/633/1 671/614/1 533/611/1
2537 | f 542/633/165 280/632/165 536/615/165 671/614/165
2538 | f 329/295/1 672/610/1 335/613/1 157/296/1
2539 | f 210/544/1 540/625/1 672/610/1 329/295/1
2540 | f 540/625/1 278/624/1 533/611/1 672/610/1
2541 | f 526/599/229 673/606/229 532/609/229 276/600/229
2542 | f 275/596/230 531/605/230 673/606/230 526/599/230
2543 | f 531/605/231 205/604/231 390/607/231 673/606/231
2544 | f 525/595/232 674/602/232 531/605/232 275/596/232
2545 | f 172/848/233 310/849/233 674/602/233 525/595/233
2546 | f 310/849/234 141/846/234 389/603/234 674/602/234
2547 | f 523/591/227 675/598/227 530/601/227 274/592/227
2548 | f 273/588/30 529/597/30 675/598/30 523/591/30
2549 | f 529/597/235 275/596/235 526/599/235 675/598/235
2550 | f 522/587/236 676/594/236 529/597/236 273/588/236
2551 | f 171/850/29 356/851/29 676/594/29 522/587/29
2552 | f 356/851/237 172/848/237 525/595/237 676/594/237
2553 | f 384/511/1 677/590/1 528/593/1 200/512/1
2554 | f 199/508/1 527/589/1 677/590/1 384/511/1
2555 | f 527/589/73 273/588/73 523/591/73 677/590/73
2556 | f 383/507/1 678/586/1 527/589/1 199/508/1
2557 | f 140/852/1 355/853/1 678/586/1 383/507/1
2558 | f 355/853/238 171/850/238 522/587/238 678/586/238
2559 | f 521/579/1 679/582/1 408/585/1 224/580/1
2560 | f 274/592/1 530/601/1 679/582/1 521/579/1
2561 | f 530/601/227 276/600/227 524/583/227 679/582/227
2562 | f 324/299/1 680/578/1 336/581/1 152/300/1
2563 | f 200/512/1 528/593/1 680/578/1 324/299/1
2564 | f 528/593/1 274/592/1 521/579/1 680/578/1
2565 | f 514/567/1 681/574/1 520/577/1 272/568/1
2566 | f 271/564/1 519/573/1 681/574/1 514/567/1
2567 | f 519/573/1 207/572/1 392/575/1 681/574/1
2568 | f 513/563/1 682/570/1 519/573/1 271/564/1
2569 | f 223/584/1 407/289/1 682/570/1 513/563/1
2570 | f 407/289/1 155/288/1 391/571/1 682/570/1
2571 | f 511/559/1 683/566/1 518/569/1 270/560/1
2572 | f 269/556/1 517/565/1 683/566/1 511/559/1
2573 | f 517/565/1 271/564/1 514/567/1 683/566/1
2574 | f 510/555/1 684/562/1 517/565/1 269/556/1
2575 | f 224/580/1 408/585/1 684/562/1 510/555/1
2576 | f 408/585/1 223/584/1 513/563/1 684/562/1
2577 | f 386/479/1 685/558/1 516/561/1 202/480/1
2578 | f 201/476/1 515/557/1 685/558/1 386/479/1
2579 | f 515/557/1 269/556/1 511/559/1 685/558/1
2580 | f 385/475/1 686/554/1 515/557/1 201/476/1
2581 | f 152/300/1 336/581/1 686/554/1 385/475/1
2582 | f 336/581/1 224/580/1 510/555/1 686/554/1
2583 | f 509/547/1 687/550/1 410/553/1 226/548/1
2584 | f 270/560/1 518/569/1 687/550/1 509/547/1
2585 | f 518/569/1 272/568/1 512/551/1 687/550/1
2586 | f 325/303/1 688/546/1 337/549/1 153/304/1
2587 | f 202/480/1 516/561/1 688/546/1 325/303/1
2588 | f 516/561/1 270/560/1 509/547/1 688/546/1
2589 | f 502/535/1 689/542/1 508/545/1 268/536/1
2590 | f 267/532/1 507/541/1 689/542/1 502/535/1
2591 | f 507/541/1 209/540/1 394/543/1 689/542/1
2592 | f 501/531/1 690/538/1 507/541/1 267/532/1
2593 | f 225/552/1 409/293/1 690/538/1 501/531/1
2594 | f 409/293/1 156/292/1 393/539/1 690/538/1
2595 | f 499/527/1 691/534/1 506/537/1 266/528/1
2596 | f 265/524/1 505/533/1 691/534/1 499/527/1
2597 | f 505/533/1 267/532/1 502/535/1 691/534/1
2598 | f 498/523/1 692/530/1 505/533/1 265/524/1
2599 | f 226/548/1 410/553/1 692/530/1 498/523/1
2600 | f 410/553/1 225/552/1 501/531/1 692/530/1
2601 | f 388/447/1 693/526/1 504/529/1 204/448/1
2602 | f 203/444/1 503/525/1 693/526/1 388/447/1
2603 | f 503/525/1 265/524/1 499/527/1 693/526/1
2604 | f 387/443/1 694/522/1 503/525/1 203/444/1
2605 | f 153/304/1 337/549/1 694/522/1 387/443/1
2606 | f 337/549/1 226/548/1 498/523/1 694/522/1
2607 | f 497/515/1 695/518/1 412/521/1 228/516/1
2608 | f 266/528/1 506/537/1 695/518/1 497/515/1
2609 | f 506/537/1 268/536/1 500/519/1 695/518/1
2610 | f 326/307/173 696/514/173 338/517/173 154/308/173
2611 | f 204/448/1 504/529/1 696/514/1 326/307/1
2612 | f 504/529/1 266/528/1 497/515/1 696/514/1
2613 | f 490/503/93 697/510/93 496/513/93 264/504/93
2614 | f 263/500/171 495/509/171 697/510/171 490/503/171
2615 | f 495/509/239 199/508/239 384/511/239 697/510/239
2616 | f 489/499/92 698/506/92 495/509/92 263/500/92
2617 | f 170/854/173 309/855/173 698/506/173 489/499/173
2618 | f 309/855/1 140/852/1 383/507/1 698/506/1
2619 | f 487/495/240 699/502/240 494/505/240 262/496/240
2620 | f 261/492/241 493/501/241 699/502/241 487/495/241
2621 | f 493/501/170 263/500/170 490/503/170 699/502/170
2622 | f 486/491/242 700/498/242 493/501/242 261/492/242
2623 | f 169/856/243 354/857/243 700/498/243 486/491/243
2624 | f 354/857/172 170/854/172 489/499/172 700/498/172
2625 | f 346/858/244 701/494/244 492/497/244 161/859/244
2626 | f 162/860/245 491/493/245 701/494/245 346/858/245
2627 | f 491/493/246 261/492/246 487/495/246 701/494/246
2628 | f 305/861/247 702/490/247 491/493/247 162/860/247
2629 | f 136/862/248 353/863/248 702/490/248 305/861/248
2630 | f 353/863/249 169/856/249 486/491/249 702/490/249
2631 | f 485/483/250 703/486/250 414/489/250 230/484/250
2632 | f 262/496/251 494/505/251 703/486/251 485/483/251
2633 | f 494/505/252 264/504/252 488/487/252 703/486/252
2634 | f 345/864/253 704/482/253 339/485/253 148/865/253
2635 | f 161/859/254 492/497/254 704/482/254 345/864/254
2636 | f 492/497/255 262/496/255 485/483/255 704/482/255
2637 | f 478/471/256 705/478/256 484/481/256 260/472/256
2638 | f 259/468/257 483/477/257 705/478/257 478/471/257
2639 | f 483/477/258 201/476/258 386/479/258 705/478/258
2640 | f 477/467/259 706/474/259 483/477/259 259/468/259
2641 | f 229/488/260 413/301/260 706/474/260 477/467/260
2642 | f 413/301/261 152/300/261 385/475/261 706/474/261
2643 | f 475/463/262 707/470/262 482/473/262 258/464/262
2644 | f 257/460/263 481/469/263 707/470/263 475/463/263
2645 | f 481/469/264 259/468/264 478/471/264 707/470/264
2646 | f 474/459/265 708/466/265 481/469/265 257/460/265
2647 | f 230/484/266 414/489/266 708/466/266 474/459/266
2648 | f 414/489/267 229/488/267 477/467/267 708/466/267
2649 | f 376/866/268 709/462/268 480/465/268 191/867/268
2650 | f 192/868/269 479/461/269 709/462/269 376/866/269
2651 | f 479/461/270 257/460/270 475/463/270 709/462/270
2652 | f 320/869/271 710/458/271 479/461/271 192/868/271
2653 | f 148/865/272 339/485/272 710/458/272 320/869/272
2654 | f 339/485/273 230/484/273 474/459/273 710/458/273
2655 | f 473/451/274 711/454/274 416/457/274 232/452/274
2656 | f 258/464/275 482/473/275 711/454/275 473/451/275
2657 | f 482/473/276 260/472/276 476/455/276 711/454/276
2658 | f 375/870/277 712/450/277 340/453/277 147/871/277
2659 | f 191/867/278 480/465/278 712/450/278 375/870/278
2660 | f 480/465/279 258/464/279 473/451/279 712/450/279
2661 | f 466/439/280 713/446/280 472/449/280 256/440/280
2662 | f 255/436/281 471/445/281 713/446/281 466/439/281
2663 | f 471/445/282 203/444/282 388/447/282 713/446/282
2664 | f 465/435/283 714/442/283 471/445/283 255/436/283
2665 | f 231/456/173 415/305/173 714/442/173 465/435/173
2666 | f 415/305/1 153/304/1 387/443/1 714/442/1
2667 | f 463/431/284 715/438/284 470/441/284 254/432/284
2668 | f 253/428/285 469/437/285 715/438/285 463/431/285
2669 | f 469/437/286 255/436/286 466/439/286 715/438/286
2670 | f 462/427/287 716/434/287 469/437/287 253/428/287
2671 | f 232/452/288 416/457/288 716/434/288 462/427/288
2672 | f 416/457/289 231/456/289 465/435/289 716/434/289
2673 | f 374/872/290 717/430/290 468/433/290 189/873/290
2674 | f 190/874/291 467/429/291 717/430/291 374/872/291
2675 | f 467/429/292 253/428/292 463/431/292 717/430/292
2676 | f 319/875/293 718/426/293 467/429/293 190/874/293
2677 | f 147/871/294 340/453/294 718/426/294 319/875/294
2678 | f 340/453/295 232/452/295 462/427/295 718/426/295
2679 | f 461/419/296 719/422/296 418/425/296 234/420/296
2680 | f 254/432/297 470/441/297 719/422/297 461/419/297
2681 | f 470/441/298 256/440/298 464/423/298 719/422/298
2682 | f 373/876/299 720/418/299 341/421/299 146/838/299
2683 | f 189/873/300 468/433/300 720/418/300 373/876/300
2684 | f 468/433/301 254/432/301 461/419/301 720/418/301
2685 | f 454/407/302 721/414/302 460/417/302 252/408/302
2686 | f 251/404/303 459/413/303 721/414/303 454/407/303
2687 | f 459/413/304 193/412/304 378/415/304 721/414/304
2688 | f 453/403/305 722/410/305 459/413/305 251/404/305
2689 | f 164/877/306 306/878/306 722/410/306 453/403/306
2690 | f 306/878/307 137/879/307 377/411/307 722/410/307
2691 | f 451/399/308 723/406/308 458/409/308 250/400/308
2692 | f 249/396/309 457/405/309 723/406/309 451/399/309
2693 | f 457/405/310 251/404/310 454/407/310 723/406/310
2694 | f 450/395/311 724/402/311 457/405/311 249/396/311
2695 | f 163/880/312 348/881/312 724/402/312 450/395/312
2696 | f 348/881/313 164/877/313 453/403/313 724/402/313
2697 | f 396/703/314 725/398/314 456/401/314 212/704/314
2698 | f 211/700/315 455/397/315 725/398/315 396/703/315
2699 | f 455/397/316 249/396/316 451/399/316 725/398/316
2700 | f 395/699/317 726/394/317 455/397/317 211/700/317
2701 | f 142/843/318 347/882/318 726/394/318 395/699/318
2702 | f 347/882/319 163/880/319 450/395/319 726/394/319
2703 | f 449/387/320 727/390/320 420/393/320 236/388/320
2704 | f 250/400/321 458/409/321 727/390/321 449/387/321
2705 | f 458/409/322 252/408/322 452/391/322 727/390/322
2706 | f 330/275/323 728/386/323 342/389/323 158/276/323
2707 | f 212/704/324 456/401/324 728/386/324 330/275/324
2708 | f 456/401/325 250/400/325 449/387/325 728/386/325
2709 | f 442/375/326 729/382/326 448/385/326 248/376/326
2710 | f 247/372/327 447/381/327 729/382/327 442/375/327
2711 | f 447/381/328 195/380/328 380/383/328 729/382/328
2712 | f 441/371/329 730/378/329 447/381/329 247/372/329
2713 | f 235/392/330 419/313/330 730/378/330 441/371/330
2714 | f 419/313/331 149/312/331 379/379/331 730/378/331
2715 | f 439/367/332 731/374/332 446/377/332 246/368/332
2716 | f 245/364/67 445/373/67 731/374/67 439/367/67
2717 | f 445/373/333 247/372/333 442/375/333 731/374/333
2718 | f 438/363/334 732/370/334 445/373/334 245/364/334
2719 | f 236/388/335 420/393/335 732/370/335 438/363/335
2720 | f 420/393/336 235/392/336 441/371/336 732/370/336
2721 | f 398/671/73 733/366/73 444/369/73 214/672/73
2722 | f 213/668/66 443/365/66 733/366/66 398/671/66
2723 | f 443/365/236 245/364/236 439/367/236 733/366/236
2724 | f 397/667/337 734/362/337 443/365/337 213/668/337
2725 | f 158/276/338 342/389/338 734/362/338 397/667/338
2726 | f 342/389/339 236/388/339 438/363/339 734/362/339
2727 | f 437/355/340 735/358/340 422/361/340 238/356/340
2728 | f 246/368/341 446/377/341 735/358/341 437/355/341
2729 | f 446/377/342 248/376/342 440/359/342 735/358/342
2730 | f 331/279/343 736/354/343 343/357/343 159/280/343
2731 | f 214/672/1 444/369/1 736/354/1 331/279/1
2732 | f 444/369/344 246/368/344 437/355/344 736/354/344
2733 | f 430/343/345 737/350/345 436/353/345 244/344/345
2734 | f 243/340/346 435/349/346 737/350/346 430/343/346
2735 | f 435/349/347 197/348/347 382/351/347 737/350/347
2736 | f 429/339/348 738/346/348 435/349/348 243/340/348
2737 | f 237/360/349 421/317/349 738/346/349 429/339/349
2738 | f 421/317/350 150/316/350 381/347/350 738/346/350
2739 | f 427/335/351 739/342/351 434/345/351 242/336/351
2740 | f 241/332/352 433/341/352 739/342/352 427/335/352
2741 | f 433/341/353 243/340/353 430/343/353 739/342/353
2742 | f 426/331/354 740/338/354 433/341/354 241/332/354
2743 | f 238/356/355 422/361/355 740/338/355 426/331/355
2744 | f 422/361/356 237/360/356 429/339/356 740/338/356
2745 | f 400/639/357 741/334/357 432/337/357 216/640/357
2746 | f 215/636/358 431/333/358 741/334/358 400/639/358
2747 | f 431/333/359 241/332/359 427/335/359 741/334/359
2748 | f 399/635/360 742/330/360 431/333/360 215/636/360
2749 | f 159/280/361 343/357/361 742/330/361 399/635/361
2750 | f 343/357/362 238/356/362 426/331/362 742/330/362
2751 | f 425/323/363 743/326/363 424/329/363 240/324/363
2752 | f 242/336/364 434/345/364 743/326/364 425/323/364
2753 | f 434/345/365 244/344/365 428/327/365 743/326/365
2754 | f 332/283/366 744/322/366 344/325/366 160/284/366
2755 | f 216/640/367 432/337/367 744/322/367 332/283/367
2756 | f 432/337/368 242/336/368 425/323/368 744/322/368
2757 | f 428/327/369 745/318/369 423/321/369 239/328/369
2758 | f 244/344/370 436/353/370 745/318/370 428/327/370
2759 | f 436/353/371 198/352/371 323/319/371 745/318/371
2760 | f 440/359/372 746/314/372 421/317/372 237/360/372
2761 | f 248/376/373 448/385/373 746/314/373 440/359/373
2762 | f 448/385/374 196/384/374 322/315/374 746/314/374
2763 | f 452/391/375 747/310/375 419/313/375 235/392/375
2764 | f 252/408/376 460/417/376 747/310/376 452/391/376
2765 | f 460/417/377 194/416/377 321/311/377 747/310/377
2766 | f 464/423/378 748/306/378 417/309/378 233/424/378
2767 | f 256/440/379 472/449/379 748/306/379 464/423/379
2768 | f 472/449/380 204/448/380 326/307/380 748/306/380
2769 | f 476/455/381 749/302/381 415/305/381 231/456/381
2770 | f 260/472/382 484/481/382 749/302/382 476/455/382
2771 | f 484/481/383 202/480/383 325/303/383 749/302/383
2772 | f 488/487/384 750/298/384 413/301/384 229/488/384
2773 | f 264/504/385 496/513/385 750/298/385 488/487/385
2774 | f 496/513/386 200/512/386 324/299/386 750/298/386
2775 | f 500/519/1 751/294/1 411/297/1 227/520/1
2776 | f 268/536/1 508/545/1 751/294/1 500/519/1
2777 | f 508/545/1 210/544/1 329/295/1 751/294/1
2778 | f 512/551/1 752/290/1 409/293/1 225/552/1
2779 | f 272/568/1 520/577/1 752/290/1 512/551/1
2780 | f 520/577/1 208/576/1 328/291/1 752/290/1
2781 | f 524/583/73 753/286/73 407/289/73 223/584/73
2782 | f 276/600/228 532/609/228 753/286/228 524/583/228
2783 | f 532/609/387 206/608/387 327/287/387 753/286/387
2784 | f 536/615/388 754/282/388 405/285/388 221/616/388
2785 | f 280/632/389 544/641/389 754/282/389 536/615/389
2786 | f 544/641/95 216/640/95 332/283/95 754/282/95
2787 | f 548/647/1 755/278/1 403/281/1 219/648/1
2788 | f 284/664/1 556/673/1 755/278/1 548/647/1
2789 | f 556/673/1 214/672/1 331/279/1 755/278/1
2790 | f 560/679/390 756/274/390 401/277/390 217/680/390
2791 | f 288/696/391 568/705/391 756/274/391 560/679/391
2792 | f 568/705/392 212/704/392 330/275/392 756/274/392
2793 | f 572/711/393 757/270/393 361/273/393 177/712/393
2794 | f 292/728/394 580/737/394 757/270/394 572/711/394
2795 | f 580/737/395 186/736/395 317/271/395 757/270/395
2796 | f 584/743/396 758/266/396 363/269/396 179/744/396
2797 | f 296/760/366 592/769/366 758/266/366 584/743/366
2798 | f 592/769/397 184/768/397 316/267/397 758/266/397
2799 | f 596/775/398 759/262/398 351/265/398 167/776/398
2800 | f 300/792/399 604/801/399 759/262/399 596/775/399
2801 | f 604/801/400 182/800/400 315/263/400 759/262/400
2802 | f 608/807/401 760/258/401 359/261/401 175/808/401
2803 | f 304/824/402 616/833/402 760/258/402 608/807/402
2804 | f 616/833/403 166/832/403 307/259/403 760/258/403
2805 | s 1
2806 | f 777/883/5 778/884/5 779/885/5 780/886/5 781/887/5 782/888/5 783/889/5 784/890/5 786/891/5 785/892/5 776/893/5
2807 | f 76/894/404 85/895/404 84/896/405 75/897/405
2808 | f 77/898/406 86/899/406 85/895/404 76/894/404
2809 | f 80/900/407 87/901/407 86/899/406 77/898/406
2810 | f 81/902/408 88/903/408 87/901/407 80/900/407
2811 | f 82/904/409 89/905/409 88/903/408 81/902/408
2812 | f 78/906/410 90/907/410 89/905/409 82/904/409
2813 | f 79/908/411 91/909/411 90/907/410 78/906/410
2814 | f 74/910/412 75/897/405 84/896/405 83/911/412
2815 | f 92/912/4 93/913/4 95/914/4 94/915/4
2816 | f 767/916/3 766/917/3 765/918/3 774/919/3 775/920/3 770/921/3 769/922/3 773/923/3 772/924/3 771/925/3 768/926/3
2817 | f 762/927/1 761/928/1 763/929/1 764/930/1
2818 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | A-Frame Cursor Teleport Component
6 |
7 |
48 |
49 |
50 | A-Frame Cursor Teleport Component
51 |
52 |
53 |
54 |
55 | Basic
56 | This is a basic example.
57 |
58 |
59 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
75 |
76 |
77 |
--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
1 | /* global AFRAME, THREE */
2 |
3 | if (typeof AFRAME === 'undefined') {
4 | throw new Error('Component attempted to register before AFRAME was available.');
5 | }
6 |
7 | /**
8 | * Cursor Teleport component for A-Frame.
9 | */
10 | AFRAME.registerComponent('cursor-teleport', {
11 | schema: {
12 | enabled: { type: 'boolean', default: true },
13 | cameraHead: { type: 'selector', default: '' },
14 | cameraRig: { type: 'selector', default: '' },
15 | collisionEntities: { type: 'string', default: '' },
16 | cursorColor: { type: 'color', default: '#4d93fd' },
17 | cursorType: { type: 'string', default: 'cylinder', oneOf: ['ring', 'cylinder'] },
18 | defaultPlaneSize: { type: 'number', default: 100 },
19 | ignoreEntities: { type: 'string', default: '' },
20 | landingMaxAngle: { default: 45, min: 0, max: 360 },
21 | landingNormal: { type: 'vec3', default: { x: 0, y: 1, z: 0 } },
22 | transitionSpeed: { type: 'number', default: 0.0006 }
23 | },
24 |
25 | init() {
26 | // platform detect
27 | this.mobile = AFRAME.utils.device.isMobile() || AFRAME.utils.device.isMobileDeviceRequestingDesktopSite();
28 |
29 | // main app
30 | const sceneEl = this.el.sceneEl;
31 | this.canvas = sceneEl.renderer.domElement;
32 |
33 | // camera
34 | this.data.cameraHead.object3D.traverse((child) => {
35 | if (child instanceof THREE.Camera) {
36 | this.cam = child; // This is the PerspectiveCamera
37 | }
38 | });
39 | this.camForRotation = this.data.cameraHead.object3D; // This is the Group, parent of the PerspectiveCamera
40 |
41 | this.camRig = this.data.cameraRig.object3D;
42 |
43 | // collision
44 | this.rayCaster = new THREE.Raycaster();
45 | this.collisionObjectNormalMatrix = new THREE.Matrix3();
46 | this.collisionWorldNormal = new THREE.Vector3();
47 | this.referenceNormal = new THREE.Vector3();
48 | this.rayCastObjects = [];
49 |
50 | // Update collision normal
51 | this.referenceNormal.copy(this.data.landingNormal);
52 |
53 | // RING teleport indicator
54 | const geo = new THREE.RingGeometry(0.25, 0.3, 32, 1);
55 | geo.rotateX(-Math.PI / 2);
56 | geo.translate(0, 0.02, 0);
57 | const mat = new THREE.MeshBasicMaterial({ color: this.data.cursorColor });
58 | const indicatorRing = new THREE.Mesh(geo, mat);
59 | const group = new THREE.Group();
60 | group.add(indicatorRing);
61 | this.teleportIndicator = group;
62 | this.teleportIndicator.visible = false;
63 |
64 | if (this.data.cursorType === 'cylinder') {
65 | // CYLINDER teleport indicator
66 | const geoCyl = new THREE.CylinderGeometry(0.3, 0.3, 0.5, 32, 1, true);
67 | geoCyl.translate(0, 0.25, 0);
68 | // texture source MIT license https://github.com/fernandojsg/aframe-teleport-controls/blob/master/lib/cylinderTexture.js
69 | const textureString =
70 | 'data:image/png;base64,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';
71 | const textureCyl = new THREE.TextureLoader().load(textureString);
72 | const matCyl = new THREE.MeshBasicMaterial({
73 | color: this.data.cursorColor,
74 | side: 'double',
75 | map: textureCyl,
76 | transparent: true,
77 | depthTest: false
78 | });
79 | const indicatorCyl = new THREE.Mesh(geoCyl, matCyl);
80 | group.add(indicatorCyl);
81 | }
82 |
83 | sceneEl.object3D.add(this.teleportIndicator);
84 |
85 | // transition
86 | this.transitioning = false;
87 | this.transitionProgress = 0;
88 | this.transitionCamPosStart = new THREE.Vector3();
89 | this.transitionCamPosEnd = new THREE.Vector3();
90 | this.transitionCamQuaternionStart = new THREE.Quaternion();
91 | this.transitionCamQuaternionEnd = new THREE.Quaternion();
92 |
93 | // Bind functions
94 | this.updateRaycastObjects = this.updateRaycastObjects.bind(this);
95 | this.getMouseState = this.getMouseState.bind(this);
96 | this.getTeleportPosition = this.getTeleportPosition.bind(this);
97 | this.isValidNormalsAngle = this.isValidNormalsAngle.bind(this);
98 | this.transition = this.transition.bind(this);
99 | this.mouseMove = this.mouseMove.bind(this);
100 | this.mouseDown = this.mouseDown.bind(this);
101 | this.mouseUp = this.mouseUp.bind(this);
102 | this.easeInOutQuad = this.easeInOutQuad.bind(this);
103 | this.teleportTo = this.teleportTo.bind(this);
104 | this.hideCursor = this.hideCursor.bind(this);
105 |
106 | this.updateRaycastObjects();
107 | },
108 |
109 | remove() {
110 | this.cam = null;
111 | this.canvas = null;
112 | this.rayCastObjects.length = 0;
113 | this.el.sceneEl.object3D.remove(this.teleportIndicator);
114 | for (const child of this.teleportIndicator.children) {
115 | child.material.dispose();
116 | child.geometry.dispose();
117 | }
118 | this.teleportIndicator = null;
119 | if (this.collisionMesh) {
120 | this.collisionMesh.geometry.dispose();
121 | this.collisionMesh.material.dispose();
122 | this.collisionMesh = null;
123 | }
124 | },
125 |
126 | update(oldData) {
127 | if (typeof oldData.enabled === 'undefined') return;
128 | if (!oldData.enabled && this.data.enabled) {
129 | this.registerEventListeners();
130 | }
131 | if (oldData.enabled && !this.data.enabled) {
132 | // Call unregisterEventListeners instead of pause that is a wrapped method unregistering tick method
133 | // because we still want the tick method to use the component via the teleportTo api.
134 | this.unregisterEventListeners();
135 | }
136 | },
137 |
138 | registerEventListeners() {
139 | const canvas = this.canvas;
140 | canvas.addEventListener('mousedown', this.mouseDown, false);
141 | canvas.addEventListener('mousemove', this.mouseMove, false);
142 | canvas.addEventListener('mouseup', this.mouseUp, false);
143 | canvas.addEventListener('touchstart', this.mouseDown, false);
144 | canvas.addEventListener('touchmove', this.mouseMove, false);
145 | canvas.addEventListener('touchend', this.mouseUp, false);
146 | window.addEventListener('keydown', this.hideCursor, false);
147 | },
148 |
149 | unregisterEventListeners() {
150 | this.transitioning = false;
151 | this.hideCursor();
152 | const canvas = this.canvas;
153 | canvas.removeEventListener('mousedown', this.mouseDown);
154 | canvas.removeEventListener('mousemove', this.mouseMove);
155 | canvas.removeEventListener('mouseup', this.mouseUp);
156 | canvas.removeEventListener('touchstart', this.mouseDown);
157 | canvas.removeEventListener('touchmove', this.mouseMove);
158 | canvas.removeEventListener('touchend', this.mouseUp);
159 | window.removeEventListener('keydown', this.hideCursor);
160 | },
161 |
162 | play() {
163 | if (!this.data.enabled) return;
164 | this.registerEventListeners();
165 | },
166 |
167 | pause() {
168 | this.unregisterEventListeners();
169 | },
170 |
171 | updateRaycastObjects() {
172 | // updates the array of meshes we will need to raycast to
173 | // clear the array of any existing meshes
174 | this.rayCastObjects.length = 0;
175 |
176 | if (this.data.collisionEntities !== '') {
177 | // traverse collision entities and add their meshes to the rayCastEntities array.
178 | const collisionEntities = this.el.sceneEl.querySelectorAll(this.data.collisionEntities);
179 |
180 | collisionEntities.forEach((e) => {
181 | e.object3D.traverse((child) => {
182 | if (child.isMesh) {
183 | // mark this mesh as a collision object
184 | child.userData.collision = true;
185 | this.rayCastObjects.push(child);
186 | }
187 | });
188 | });
189 | } else {
190 | if (!this.collisionMesh) {
191 | // if no collision entities are specified, create a default ground plane collision.
192 | const geo = new THREE.PlaneGeometry(this.data.defaultPlaneSize, this.data.defaultPlaneSize, 1);
193 | geo.rotateX(-Math.PI / 2);
194 | const mat = new THREE.MeshNormalMaterial();
195 | const collisionMesh = new THREE.Mesh(geo, mat);
196 | // mark this mesh as a collision object
197 | collisionMesh.userData.collision = true;
198 | this.collisionMesh = collisionMesh;
199 | }
200 | this.rayCastObjects.push(this.collisionMesh);
201 | }
202 |
203 | // We may need some entities to be seen by the raycaster even though they are not teleportable.
204 | // This prevents the user from unnesserily teleporting when clicking things like buttons or UI.
205 | if (this.data.ignoreEntities !== '') {
206 | const ignoreEntities = this.el.sceneEl.querySelectorAll(this.data.ignoreEntities);
207 | ignoreEntities.forEach((e) => {
208 | e.object3D.traverse((child) => {
209 | if (child.isMesh) {
210 | this.rayCastObjects.push(child);
211 | }
212 | });
213 | });
214 | }
215 | },
216 |
217 | getMouseState: (function () {
218 | const coordinates = new THREE.Vector2();
219 | return function (e) {
220 | const rect = this.canvas.getBoundingClientRect();
221 | if (e.clientX != null) {
222 | coordinates.x = e.clientX - rect.left;
223 | coordinates.y = e.clientY - rect.top;
224 | return coordinates;
225 | } else if (e.touches[0] != null) {
226 | coordinates.x = e.touches[0].clientX - rect.left;
227 | coordinates.y = e.touches[0].clientY - rect.top;
228 | return coordinates;
229 | }
230 | };
231 | })(),
232 |
233 | getTeleportPosition: (function () {
234 | const mouse = new THREE.Vector2();
235 | return function (mouseX, mouseY) {
236 | if (this.rayCastObjects.length !== 0) {
237 | if (this.cam && this.canvas) {
238 | const cam = this.cam;
239 | const rect = this.canvas.getBoundingClientRect();
240 |
241 | mouse.x = (mouseX / (rect.right - rect.left)) * 2 - 1;
242 | mouse.y = -(mouseY / (rect.bottom - rect.top)) * 2 + 1;
243 | this.rayCaster.setFromCamera(mouse, cam);
244 | const intersects = this.rayCaster.intersectObjects(this.rayCastObjects);
245 | if (intersects.length !== 0 && this.isValidNormalsAngle(intersects[0].face.normal, intersects[0].object)) {
246 | if (intersects[0].object.userData.collision === true) {
247 | return intersects[0].point;
248 | }
249 | return false;
250 | } else {
251 | return false;
252 | }
253 | } else {
254 | return false;
255 | }
256 | } else {
257 | return false;
258 | }
259 | };
260 | })(),
261 |
262 | isValidNormalsAngle(collisionNormal, collisionObject) {
263 | this.collisionObjectNormalMatrix.getNormalMatrix(collisionObject.matrixWorld);
264 | this.collisionWorldNormal.copy(collisionNormal).applyNormalMatrix(this.collisionObjectNormalMatrix);
265 | const angleNormals = this.referenceNormal.angleTo(this.collisionWorldNormal);
266 | return THREE.MathUtils.RAD2DEG * angleNormals <= this.data.landingMaxAngle;
267 | },
268 |
269 | transition(destPos, destQuaternion = undefined) {
270 | this.transitionProgress = 0;
271 | this.transitionCamPosEnd.copy(destPos);
272 | this.transitionCamPosStart.copy(this.camRig.position);
273 | if (destQuaternion) {
274 | this.transitionCamQuaternionEnd.copy(destQuaternion);
275 | this.transitionCamQuaternionStart.copy(this.camRig.quaternion);
276 | } else {
277 | this.transitionCamQuaternionEnd.copy(this.camRig.quaternion);
278 | this.transitionCamQuaternionStart.copy(this.transitionCamQuaternionEnd);
279 | }
280 | this.transitioning = true;
281 | this.el.emit('navigation-start');
282 | },
283 |
284 | hideCursor() {
285 | this.teleportIndicator.visible = false;
286 | },
287 |
288 | mouseMove(e) {
289 | const mouseState = this.getMouseState(e);
290 | this.mouseX = mouseState.x;
291 | this.mouseY = mouseState.y;
292 | },
293 |
294 | mouseDown(e) {
295 | this.updateRaycastObjects();
296 |
297 | const mouseState = this.getMouseState(e);
298 | this.mouseX = mouseState.x;
299 | this.mouseY = mouseState.y;
300 |
301 | this.mouseXOrig = mouseState.x;
302 | this.mouseYOrig = mouseState.y;
303 | },
304 |
305 | mouseUp(e) {
306 | if (this.mouseX === this.mouseXOrig && this.mouseY === this.mouseYOrig) {
307 | const pos = this.getTeleportPosition(this.mouseX, this.mouseY);
308 | if (pos) {
309 | this.teleportIndicator.visible = true;
310 | this.teleportIndicator.position.copy(pos);
311 | this.transition(pos);
312 | }
313 | }
314 | },
315 |
316 | teleportTo(pos, quaternion = undefined) {
317 | this.teleportIndicator.position.copy(pos);
318 | if (!quaternion) {
319 | this.transition(pos);
320 | } else {
321 | const destQuaternion = new THREE.Quaternion();
322 | destQuaternion.setFromEuler(new THREE.Euler(0, this.camForRotation.rotation.y, 0));
323 | destQuaternion.invert();
324 | destQuaternion.multiply(quaternion);
325 | this.transition(pos, destQuaternion);
326 | }
327 | // don't show the indicator when using via api
328 | this.hideCursor();
329 | },
330 |
331 | easeInOutQuad(t) {
332 | return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;
333 | },
334 |
335 | tick(time, delta) {
336 | if (!this.transitioning && !this.mobile) {
337 | const pos = this.getTeleportPosition(this.mouseX, this.mouseY);
338 | if (pos) {
339 | this.teleportIndicator.position.copy(pos);
340 | }
341 | }
342 | if (this.transitioning) {
343 | this.transitionProgress += delta * this.data.transitionSpeed;
344 | const easeInOutTransitionProgress = this.easeInOutQuad(this.transitionProgress);
345 | const value =
346 | easeInOutTransitionProgress < 0.5 ? easeInOutTransitionProgress : 0.5 - 1 * (easeInOutTransitionProgress - 0.5);
347 | this.teleportIndicator.scale.set(0.5 + value, 1, 0.5 + value);
348 |
349 | // set camera position
350 | const camPos = this.camRig.position;
351 | camPos.lerpVectors(this.transitionCamPosStart, this.transitionCamPosEnd, easeInOutTransitionProgress);
352 |
353 | this.camRig.quaternion.slerpQuaternions(
354 | this.transitionCamQuaternionStart,
355 | this.transitionCamQuaternionEnd,
356 | easeInOutTransitionProgress
357 | );
358 |
359 | if (this.transitionProgress >= 1) {
360 | this.transitioning = false;
361 | camPos.copy(this.transitionCamPosEnd);
362 | this.camRig.quaternion.copy(this.transitionCamQuaternionEnd);
363 | this.el.emit('navigation-end');
364 | }
365 | }
366 | }
367 | });
368 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "aframe-cursor-teleport-component",
3 | "version": "1.6.0",
4 | "description": "Simple teleport navigation for non-XR devices.",
5 | "module": "index.js",
6 | "main": "dist/aframe-cursor-teleport-component.min.js",
7 | "scripts": {
8 | "dist": "npm run dist:min && npm run dist:max",
9 | "dist:max": "webpack",
10 | "dist:min": "cross-env NODE_ENV=production webpack",
11 | "prepublish": "npm run dist",
12 | "start": "cross-env NODE_ENV=production webpack serve"
13 | },
14 | "repository": {
15 | "type": "git",
16 | "url": "git+https://github.com/c-frame/aframe-cursor-teleport.git"
17 | },
18 | "keywords": [
19 | "aframe",
20 | "aframe-component",
21 | "aframe-vr",
22 | "vr",
23 | "webvr",
24 | "webxr",
25 | "cursor-teleport"
26 | ],
27 | "author": "Mike Beene ",
28 | "license": "MIT",
29 | "bugs": {
30 | "url": "https://github.com/c-frame/aframe-cursor-teleport/issues"
31 | },
32 | "homepage": "https://github.com/c-frame/aframe-cursor-teleport#readme",
33 | "devDependencies": {
34 | "cross-env": "^7.0.3",
35 | "webpack": "^5.91.0",
36 | "webpack-cli": "^5.1.4",
37 | "webpack-dev-server": "^5.0.4"
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/webpack.config.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 |
3 | module.exports = {
4 | entry: './index.js',
5 | output: {
6 | libraryTarget: 'umd',
7 | path: path.resolve(__dirname, 'dist'),
8 | publicPath: '/dist/',
9 | filename:
10 | process.env.NODE_ENV === 'production'
11 | ? 'aframe-cursor-teleport-component.min.js'
12 | : 'aframe-cursor-teleport-component.js'
13 | },
14 | externals: {
15 | // Stubs out `import ... from 'three'` so it returns `import ... from window.THREE` effectively using THREE global variable that is defined by AFRAME.
16 | three: 'THREE'
17 | },
18 | devtool: 'source-map',
19 | mode: process.env.NODE_ENV === 'production' ? 'production' : 'development',
20 | devServer: {
21 | port: process.env.PORT || 5000,
22 | hot: false,
23 | liveReload: true,
24 | server: {
25 | type: 'https'
26 | },
27 | static: {
28 | directory: path.resolve(__dirname)
29 | }
30 | }
31 | };
32 |
--------------------------------------------------------------------------------