!function(e){function r(e,r,o){return 4===arguments.length?t.apply(this,arguments):void n(e,{declarative:!0,deps:r,declare:o})}function t(e,r,t,o){n(e,{declarative:!1,deps:r,executingRequire:t,execute:o})}function n(e,r){r.name=e,e in v||(v[e]=r),r.normalizedDeps=r.deps}function o(e,r){if(r[e.groupIndex]=r[e.groupIndex]||[],-1==g.call(r[e.groupIndex],e)){r[e.groupIndex].push(e);for(var t=0,n=e.normalizedDeps.length;n>t;t++){var a=e.normalizedDeps[t],u=v[a];if(u&&!u.evaluated){var d=e.groupIndex+(u.declarative!=e.declarative);if(void 0===u.groupIndex||u.groupIndex<d){if(void 0!==u.groupIndex&&(r[u.groupIndex].splice(g.call(r[u.groupIndex],u),1),0==r[u.groupIndex].length))throw new TypeError("Mixed dependency cycle detected");u.groupIndex=d}o(u,r)}}}}function a(e){var r=v[e];r.groupIndex=0;var t=[];o(r,t);for(var n=!!r.declarative==t.length%2,a=t.length-1;a>=0;a--){for(var u=t[a],i=0;i<u.length;i++){var s=u[i];n?d(s):l(s)}n=!n}}function u(e){return y[e]||(y[e]={name:e,dependencies:[],exports:{},importers:[]})}function d(r){if(!r.module){var t=r.module=u(r.name),n=r.module.exports,o=r.declare.call(e,function(e,r){if(t.locked=!0,"object"==typeof e)for(var o in e)n[o]=e[o];else n[e]=r;for(var a=0,u=t.importers.length;u>a;a++){var d=t.importers[a];if(!d.locked)for(var i=0;i<d.dependencies.length;++i)d.dependencies[i]===t&&d.setters[i](n)}return t.locked=!1,r},{id:r.name});t.setters=o.setters,t.execute=o.execute;for(var a=0,i=r.normalizedDeps.length;i>a;a++){var l,s=r.normalizedDeps[a],c=v[s],f=y[s];f?l=f.exports:c&&!c.declarative?l=c.esModule:c?(d(c),f=c.module,l=f.exports):l=p(s),f&&f.importers?(f.importers.push(t),t.dependencies.push(f)):t.dependencies.push(null),t.setters[a]&&t.setters[a](l)}}}function i(e){var r,t=v[e];if(t)t.declarative?f(e,[]):t.evaluated||l(t),r=t.module.exports;else if(r=p(e),!r)throw new Error("Unable to load dependency "+e+".");return(!t||t.declarative)&&r&&r.__useDefault?r["default"]:r}function l(r){if(!r.module){var t={},n=r.module={exports:t,id:r.name};if(!r.executingRequire)for(var o=0,a=r.normalizedDeps.length;a>o;o++){var u=r.normalizedDeps[o],d=v[u];d&&l(d)}r.evaluated=!0;var c=r.execute.call(e,function(e){for(var t=0,n=r.deps.length;n>t;t++)if(r.deps[t]==e)return i(r.normalizedDeps[t]);throw new TypeError("Module "+e+" not declared as a dependency.")},t,n);void 0!==c&&(n.exports=c),t=n.exports,t&&t.__esModule?r.esModule=t:r.esModule=s(t)}}function s(r){var t={};if(("object"==typeof r||"function"==typeof r)&&r!==e)if(m)for(var n in r)"default"!==n&&c(t,r,n);else{var o=r&&r.hasOwnProperty;for(var n in r)"default"===n||o&&!r.hasOwnProperty(n)||(t[n]=r[n])}return t["default"]=r,x(t,"__useDefault",{value:!0}),t}function c(e,r,t){try{var n;(n=Object.getOwnPropertyDescriptor(r,t))&&x(e,t,n)}catch(o){return e[t]=r[t],!1}}function f(r,t){var n=v[r];if(n&&!n.evaluated&&n.declarative){t.push(r);for(var o=0,a=n.normalizedDeps.length;a>o;o++){var u=n.normalizedDeps[o];-1==g.call(t,u)&&(v[u]?f(u,t):p(u))}n.evaluated||(n.evaluated=!0,n.module.execute.call(e))}}function p(e){if(I[e])return I[e];if("@node/"==e.substr(0,6))return I[e]=s(D(e.substr(6)));var r=v[e];if(!r)throw"Module "+e+" not present.";return a(e),f(e,[]),v[e]=void 0,r.declarative&&x(r.module.exports,"__esModule",{value:!0}),I[e]=r.declarative?r.module.exports:r.esModule}var v={},g=Array.prototype.indexOf||function(e){for(var r=0,t=this.length;t>r;r++)if(this[r]===e)return r;return-1},m=!0;try{Object.getOwnPropertyDescriptor({a:0},"a")}catch(h){m=!1}var x;!function(){try{Object.defineProperty({},"a",{})&&(x=Object.defineProperty)}catch(e){x=function(e,r,t){try{e[r]=t.value||t.get.call(e)}catch(n){}}}}();var y={},D="undefined"!=typeof System&&System._nodeRequire||"undefined"!=typeof require&&"undefined"!=typeof require.resolve&&"undefined"!=typeof process&&process.platform&&require,I={"@empty":{}};return function(e,n,o,a){return function(u){u(function(u){for(var d={_nodeRequire:D,register:r,registerDynamic:t,get:p,set:function(e,r){I[e]=r},newModule:function(e){return e}},i=0;i<n.length;i++)(function(e,r){r&&r.__esModule?I[e]=r:I[e]=s(r)})(n[i],arguments[i]);a(d);var l=p(e[0]);if(e.length>1)for(var i=1;i<e.length;i++)p(e[i]);return o?l["default"]:l})}}}("undefined"!=typeof self?self:global)

(["1"], [], false, function($__System) {
var require = this.require, exports = this.exports, module = this.module;
!function(e){function n(e,n){e=e.replace(l,"");var r=e.match(u),t=(r[1].split(",")[n]||"require").replace(s,""),i=p[t]||(p[t]=new RegExp(a+t+f,"g"));i.lastIndex=0;for(var o,c=[];o=i.exec(e);)c.push(o[2]||o[3]);return c}function r(e,n,t,o){if("object"==typeof e&&!(e instanceof Array))return r.apply(null,Array.prototype.splice.call(arguments,1,arguments.length-1));if("string"==typeof e&&"function"==typeof n&&(e=[e]),!(e instanceof Array)){if("string"==typeof e){var l=i.get(e);return l.__useDefault?l["default"]:l}throw new TypeError("Invalid require")}for(var a=[],f=0;f<e.length;f++)a.push(i["import"](e[f],o));Promise.all(a).then(function(e){n&&n.apply(null,e)},t)}function t(t,l,a){"string"!=typeof t&&(a=l,l=t,t=null),l instanceof Array||(a=l,l=["require","exports","module"].splice(0,a.length)),"function"!=typeof a&&(a=function(e){return function(){return e}}(a)),void 0===l[l.length-1]&&l.pop();var f,u,s;-1!=(f=o.call(l,"require"))&&(l.splice(f,1),t||(l=l.concat(n(a.toString(),f)))),-1!=(u=o.call(l,"exports"))&&l.splice(u,1),-1!=(s=o.call(l,"module"))&&l.splice(s,1);var p={name:t,deps:l,execute:function(n,t,o){for(var p=[],c=0;c<l.length;c++)p.push(n(l[c]));o.uri=o.id,o.config=function(){},-1!=s&&p.splice(s,0,o),-1!=u&&p.splice(u,0,t),-1!=f&&p.splice(f,0,function(e,t,l){return"string"==typeof e&&"function"!=typeof t?n(e):r.call(i,e,t,l,o.id)});var d=a.apply(-1==u?e:t,p);return"undefined"==typeof d&&o&&(d=o.exports),"undefined"!=typeof d?d:void 0}};if(t)c.anonDefine||c.isBundle?c.anonDefine&&c.anonDefine.name&&(c.anonDefine=null):c.anonDefine=p,c.isBundle=!0,i.registerDynamic(p.name,p.deps,!1,p.execute);else{if(c.anonDefine&&!c.anonDefine.name)throw new Error("Multiple anonymous defines in module "+t);c.anonDefine=p}}var i=$__System,o=Array.prototype.indexOf||function(e){for(var n=0,r=this.length;r>n;n++)if(this[n]===e)return n;return-1},l=/(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/gm,a="(?:^|[^$_a-zA-Z\\xA0-\\uFFFF.])",f="\\s*\\(\\s*(\"([^\"]+)\"|'([^']+)')\\s*\\)",u=/\(([^\)]*)\)/,s=/^\s+|\s+$/g,p={};t.amd={};var c={isBundle:!1,anonDefine:null};i.amdDefine=t,i.amdRequire=r}("undefined"!=typeof self?self:global);
$__System.register('2', ['3'], function (_export) {
	'use strict';

	var THREE, clock, music;

	_export('start', start);

	_export('getTime', getTime);

	_export('getDuration', getDuration);

	function start() {
		clock.start();
		music.play();
	}

	function getTime() {
		if (music.currentTime < music.duration) {
			return music.currentTime;
		} else {
			return clock.getElapsedTime();
		}
	}

	function getDuration() {
		return music.duration;
	}

	return {
		setters: [function (_) {
			THREE = _;
		}],
		execute: function () {
			clock = new THREE.Clock();
			music = document.getElementById('music');

			music.load();
		}
	};
});

$__System.register('4', ['3'], function (_export) {
	'use strict';

	var Texture;

	_export('createTexture', createTexture);

	function createCanvas(segments) {
		var ctx = document.createElement('canvas').getContext('2d');
		ctx.canvas.width = segments[0].width || 1024;
		ctx.canvas.height = segments[0].height || 1024;
		var font = segments[0].font;
		segments.forEach(function (segment) {
			var options = segment || {};
			var fontSize = options.fontSize || 32;
			options.font = options.font || font;
			ctx.font = fontSize + 'px ' + options.font;
			ctx.fillStyle = options.fillStyle || 'white';
			ctx.textAlign = options.textAlign || 'center';
			ctx.textBaseline = options.textBaseline || 'middle';
			ctx.shadowColor = options.shadowColor || 'rgba(0,0,0,.5)';
			ctx.shadowBlur = options.shadowBlur || 4;

			var words = options.text.split('\n');
			var line = '';

			var anchor = options.anchor || [.5, .5];
			var x = ctx.canvas.width * anchor[0];
			var y = ctx.canvas.height * anchor[1];

			x += options.offsetX || 0;
			y += options.offsetY || 0;

			// y = ctx.canvas.height - fontSize;
			y -= Math.max(0, words.length - 1) * fontSize / 2;

			for (var n = 0; n < words.length; n++) {
				line = words[n];
				ctx.fillText(line, x, y);
				y += fontSize;
			}
		});

		return ctx.canvas;
	}

	function createTexture(segments) {
		var texture = new Texture(createCanvas(segments));
		texture.needsUpdate = true;
		return texture;
	}

	return {
		setters: [function (_) {
			Texture = _.Texture;
		}],
		execute: function () {}
	};
});

$__System.register('5', ['3'], function (_export) {
	'use strict';

	var THREE, renderer;
	return {
		setters: [function (_) {
			THREE = _;
		}],
		execute: function () {
			renderer = new THREE.WebGLRenderer({
				alpha: true,
				antialias: true,
				preserveDrawingBuffer: true
			});

			renderer.scale = 1.;
			renderer.setPixelRatio(window.devicePixelRatio / renderer.scale);
			renderer.setSize(window.innerWidth, window.innerHeight);
			document.body.appendChild(renderer.domElement);

			_export('default', renderer);
		}
	};
});

$__System.register('6', ['3', '5', '7', '8', '9'], function (_export) {
	var THREE, renderer, _createClass, _classCallCheck, closestPowerOfTwo, _default;

	return {
		setters: [function (_3) {
			THREE = _3;
		}, function (_5) {
			renderer = _5['default'];
		}, function (_) {
			_createClass = _['default'];
		}, function (_2) {
			_classCallCheck = _2['default'];
		}, function (_4) {
			closestPowerOfTwo = _4.closestPowerOfTwo;
		}],
		execute: function () {
			'use strict';

			_default = (function () {
				function _default(options) {
					_classCallCheck(this, _default);

					options = options || {};
					this.renderTextures = [];
					this.currentIndex = 0;
					this.count = options.count || 2;
					for (var i = 0; i < this.count; ++i) {
						this.renderTextures.push(new THREE.WebGLRenderTarget(options.width || window.innerWidth, options.height || window.innerHeight, {
							format: options.format || THREE.RGBAFormat,
							type: options.type || THREE.FloatType,
							minFilter: options.min || THREE.LinearFilter,
							magFilter: options.mag || THREE.LinearFilter,
							stencilBuffer: options.stencil || true,
							depthBuffer: options.depth || true
						}));
					}

					this.scene = new THREE.Mesh(new THREE.PlaneGeometry(1, 1), options.material);
					this.camera = new THREE.PerspectiveCamera(75, 1, 0.01, 100);
					this.camera.position.z = 5;
				}

				_createClass(_default, [{
					key: 'update',
					value: function update() {
						this.swap();
						renderer.clear();
						renderer.setRenderTarget(this.getRenderTarget());
						renderer.render(this.scene, this.camera);
						renderer.setRenderTarget(null);
					}
				}, {
					key: 'record',
					value: function record(scene, camera) {
						renderer.clear();
						renderer.setRenderTarget(this.getRenderTarget());
						renderer.render(scene, camera);
						renderer.setRenderTarget(null);
					}
				}, {
					key: 'getRenderTarget',
					value: function getRenderTarget() {
						return this.renderTextures[this.currentIndex];
					}
				}, {
					key: 'getTexture',
					value: function getTexture() {
						return this.renderTextures[this.currentIndex].texture;
					}
				}, {
					key: 'swap',
					value: function swap() {
						this.currentIndex = (this.currentIndex + 1) % this.count;
					}
				}, {
					key: 'setSize',
					value: function setSize(width, height) {
						for (var i = 0; i < this.count; ++i) {
							this.renderTextures[i].setSize(width, height);
						}
					}
				}, {
					key: 'dispose',
					value: function dispose() {
						for (var i = 0; i < this.count; ++i) {
							this.renderTextures[i].dispose();
						}
					}
				}], [{
					key: 'createDataTexture',
					value: function createDataTexture(dataArray, itemSize) {
						// var dimension = closestPowerOfTwo(Math.sqrt(dataArray.length / itemSize));
						var array = [];
						// var count = dimension * dimension;
						var count = dataArray.length / 3;
						for (var t = 0; t < count; ++t) {
							if (t * itemSize + itemSize - 1 < dataArray.length) {
								for (var i = 0; i < 3; ++i) {
									if (i < itemSize) {
										array.push(dataArray[t * itemSize + i]);
									} else {
										array.push(0);
									}
								}
							} else {
								array.push(0, 0, 0);
							}
						}
						var texture = new THREE.DataTexture(new Float32Array(array), count, 1, THREE.RGBFormat, THREE.FloatType);
						texture.needsUpdate = true;
						return texture;
					}
				}]);

				return _default;
			})();

			_export('default', _default);
		}
	};
});

$__System.register('a', ['3', '7', '8', '9', 'b'], function (_export) {
	var THREE, _createClass, _classCallCheck, closestPowerOfTwo, lerp, getRandomPoints, _Object$keys, Geometry;

	return {
		setters: [function (_3) {
			THREE = _3;
		}, function (_) {
			_createClass = _['default'];
		}, function (_2) {
			_classCallCheck = _2['default'];
		}, function (_4) {
			closestPowerOfTwo = _4.closestPowerOfTwo;
			lerp = _4.lerp;
			getRandomPoints = _4.getRandomPoints;
		}, function (_b) {
			_Object$keys = _b['default'];
		}],
		execute: function () {
			'use strict';

			Geometry = (function () {
				function Geometry() {
					_classCallCheck(this, Geometry);
				}

				_createClass(Geometry, null, [{
					key: 'create',
					value: function create(attributes, subdivisions) {
						subdivisions = subdivisions || [1, 1];
						var count = attributes.position.array.length / attributes.position.itemSize;
						var geometries = [];
						var verticesMax = Math.pow(2, 16);
						var dimension = closestPowerOfTwo(Math.sqrt(count));
						var geometryCount = 1 + Math.floor(count / verticesMax);
						var faces = [subdivisions[0] + 1, subdivisions[1] + 1];
						var quadCount = subdivisions[0] * subdivisions[1];
						var numberIndex = 0;
						for (var m = 0; m < geometryCount; ++m) {

							var vertexCount = count;
							if (geometryCount > 1) {
								if (m == geometryCount - 1) count = count % verticesMax;else vertexCount = verticesMax;
							}

							var arrays = {};
							var anchors = [];
							var quantities = [];
							var indexMap = [];
							var indices = [];
							var vIndex = 0;
							var attributeNames = _Object$keys(attributes);
							attributeNames.forEach(function (name) {
								arrays[name] = [];
							});

							for (var index = 0; index < vertexCount; ++index) {
								var u = index % dimension / dimension;
								var v = Math.floor(index / dimension) / dimension;
								for (var y = 0; y < faces[1]; ++y) {
									for (var x = 0; x < faces[0]; ++x) {
										attributeNames.forEach(function (name) {
											var itemSize = attributes[name].itemSize;
											var array = attributes[name].array;
											for (var i = 0; i < itemSize; i++) {
												arrays[name].push(array[index * itemSize + i]);
											}
										});
										var anchorX = x / subdivisions[0];
										var anchorY = y / subdivisions[1];
										anchors.push(anchorX * 2. - 1., anchorY * 2. - 1.);
										indexMap.push(u, v);
										quantities.push(numberIndex / (count - 1), numberIndex);
									}
								}
								for (var y = 0; y < subdivisions[1]; ++y) {
									for (var x = 0; x < subdivisions[0]; ++x) {
										indices.push(vIndex, vIndex + 1, vIndex + 1 + subdivisions[0]);
										indices.push(vIndex + 1 + subdivisions[0], vIndex + 1, vIndex + 2 + subdivisions[0]);
										vIndex += 1;
									}
									vIndex += 1;
								}
								vIndex += faces[0];
								numberIndex++;
							}

							var geometry = new THREE.BufferGeometry();
							attributeNames.forEach(function (name) {
								var array = new Float32Array(arrays[name]);
								geometry.addAttribute(name, new THREE.BufferAttribute(array, attributes[name].itemSize));
							});
							geometry.addAttribute('anchor', new THREE.BufferAttribute(new Float32Array(anchors), 2));
							if (geometry.attributes.quantity == null) {
								geometry.addAttribute('quantity', new THREE.BufferAttribute(new Float32Array(quantities), 2));
							}
							// geometry.addAttribute( 'indexMap', new THREE.BufferAttribute( new Float32Array(indexMap), 2 ) );
							geometry.setIndex(new THREE.BufferAttribute(new Uint32Array(indices), 1));
							geometries.push(geometry);
						}
						return geometries;
					}
				}, {
					key: 'createLine',
					value: function createLine(geometry, subdivisions) {
						var positions = [];
						var nexts = [];
						var colors = [];
						// geometry = new THREE.EdgesGeometry(geometry);
						var arrayPosition = geometry.attributes.position.array;
						var index = geometry.index.array;
						var count = index.length / 3;
						var line = new THREE.BufferGeometry();
						for (var i = 0; i < count; ++i) {
							for (var t = 0; t < 3; ++t) {
								for (var x = 0; x < 3; ++x) {
									positions.push(arrayPosition[(index[i * 3 + t] * 3 + x) % arrayPosition.length]);
									nexts.push(arrayPosition[(index[i * 3 + (t + 1) % 3] * 3 + x) % arrayPosition.length]);
								}
							}
						}
						geometry.addAttribute('position', new THREE.BufferAttribute(new Float32Array(positions), 3));
						geometry.addAttribute('next', new THREE.BufferAttribute(new Float32Array(nexts), 3));
						return Geometry.create(geometry.attributes, subdivisions);
					}
				}, {
					key: 'clone',
					value: function clone(geometryToClone, instances) {
						var geometries = [];
						var numberIndex = 0;
						var arrays = {};
						var quantities = [];
						var indices = [];
						var attributes = geometryToClone.attributes;
						var vertexCount = attributes.position.array.length / 3;
						var triCount;
						if (geometryToClone.index != null) triCount = geometryToClone.index.array.length;
						var attributeNames = _Object$keys(attributes);
						attributeNames.forEach(function (name) {
							arrays[name] = [];
						});
						for (var index = 0; index < instances; ++index) {
							attributeNames.forEach(function (name) {
								var array = attributes[name].array;
								for (var i = 0; i < array.length; i++) {
									arrays[name].push(array[i]);
								}
							});

							if (geometryToClone.index != null) {
								for (var v = 0; v < triCount; ++v) {
									indices.push(numberIndex * vertexCount + geometryToClone.index.array[v]);
								}
							}
							for (var v = 0; v < vertexCount; ++v) {
								quantities.push(numberIndex / (instances - 1), numberIndex);
							}
							numberIndex++;
						}

						var geometry = new THREE.BufferGeometry();
						attributeNames.forEach(function (name) {
							geometry.addAttribute(name, new THREE.BufferAttribute(new Float32Array(arrays[name]), attributes[name].itemSize));
						});
						geometry.addAttribute('quantity', new THREE.BufferAttribute(new Float32Array(quantities), 2));
						if (geometryToClone.index != null) {
							geometry.setIndex(new THREE.BufferAttribute(new Uint32Array(indices), 1));
						}
						geometries.push(geometry);
						console.log(geometries);
						return geometries;
					}
				}, {
					key: 'random',
					value: function random(count) {
						return {
							position: {
								array: getRandomPoints(count),
								itemSize: 3
							}
						};
					}
				}, {
					key: 'parsePointCloud',
					value: function parsePointCloud(data, step) {
						var cloud = {};
						cloud.points = [];

						cloud.middle = [0, 0, 0];
						cloud.top = -9000;
						cloud.ground = 9000;

						step = step || 10;
						var lines = data.split("\n");
						for (var l = 17; l < lines.length; l += step) {
							var column = lines[l].split(" ");
							if (column.length > 8) {
								var point = { x: parseFloat(column[0]), y: parseFloat(column[1]), z: parseFloat(column[2]) };
								point.normal = { x: parseFloat(column[3]), y: parseFloat(column[4]), z: parseFloat(column[5]) };
								point.color = { r: parseInt(column[6]) / 255, g: parseInt(column[7]) / 255, b: parseInt(column[8]) / 255, a: parseInt(column[9]) / 255 };
								cloud.points.push(point);

								cloud.middle[0] += point.x;
								cloud.middle[1] += point.y;
								cloud.middle[2] += point.z;

								cloud.top = Math.max(cloud.top, point.y);
								cloud.ground = Math.min(cloud.ground, point.y);
							}
						}

						cloud.middle[0] /= cloud.points.length;
						cloud.middle[1] /= cloud.points.length;
						cloud.middle[2] /= cloud.points.length;

						cloud.ground = cloud.ground;

						return cloud;
					}
				}]);

				return Geometry;
			})();

			_export('default', Geometry);
		}
	};
});

$__System.register('c', ['3', '7', '8', 'd'], function (_export) {
  var THREE, _createClass, _classCallCheck, assets, PlaneBright;

  return {
    setters: [function (_3) {
      THREE = _3;
    }, function (_) {
      _createClass = _['default'];
    }, function (_2) {
      _classCallCheck = _2['default'];
    }, function (_d) {
      assets = _d['default'];
    }],
    execute: function () {
      'use strict';

      PlaneBright = (function () {
        function PlaneBright(texture) {
          _classCallCheck(this, PlaneBright);

          this.uniforms = null;
          this.minBright = 0.2;
          this.texture = texture;
          this.mesh = this.createMesh();
        }

        _createClass(PlaneBright, [{
          key: 'createMesh',
          value: function createMesh() {
            this.uniforms = {
              minBright: {
                type: 'f',
                value: this.minBright
              },
              texture: {
                type: 't',
                value: this.texture
              }
            };
            var material = assets.shaders.bright.clone();
            material.uniforms = this.uniforms;
            return new THREE.Mesh(new THREE.PlaneBufferGeometry(2, 2), material);
          }
        }]);

        return PlaneBright;
      })();

      _export('default', PlaneBright);
    }
  };
});

$__System.register('e', ['3', '7', '8', 'd'], function (_export) {
  var THREE, _createClass, _classCallCheck, assets, PlaneBlur;

  return {
    setters: [function (_3) {
      THREE = _3;
    }, function (_) {
      _createClass = _['default'];
    }, function (_2) {
      _classCallCheck = _2['default'];
    }, function (_d) {
      assets = _d['default'];
    }],
    execute: function () {
      'use strict';

      PlaneBlur = (function () {
        function PlaneBlur(texture, direction) {
          _classCallCheck(this, PlaneBlur);

          this.uniforms = null;
          this.texture = texture;
          this.direction = direction;
          this.mesh = this.createMesh();
        }

        _createClass(PlaneBlur, [{
          key: 'createMesh',
          value: function createMesh() {
            this.uniforms = {
              resolution: {
                type: 'v2',
                value: new THREE.Vector2(window.innerWidth / 10, window.innerHeight / 10)
              },
              direction: {
                type: 'v2',
                value: this.direction
              },
              texture: {
                type: 't',
                value: this.texture
              }
            };
            var material = assets.shaders.gaussian_blur.clone();
            material.uniforms = this.uniforms;
            return new THREE.Mesh(new THREE.PlaneBufferGeometry(2, 2), material);
          }
        }, {
          key: 'resize',
          value: function resize() {
            this.uniforms.resolution.value.set(window.innerWidth / 10, window.innerHeight / 10);
          }
        }]);

        return PlaneBlur;
      })();

      _export('default', PlaneBlur);
    }
  };
});

$__System.registerDynamic('f', ['10'], true, function ($__require, exports, module) {
  var global = this || self,
      GLOBAL = global;
  /* */
  var $ = $__require('10');
  module.exports = function defineProperty(it, key, desc) {
    return $.setDesc(it, key, desc);
  };
});
$__System.registerDynamic("11", ["f"], true, function ($__require, exports, module) {
  var global = this || self,
      GLOBAL = global;
  /* */
  module.exports = { "default": $__require("f"), __esModule: true };
});
$__System.registerDynamic("7", ["11"], true, function ($__require, exports, module) {
  /* */
  "use strict";

  var global = this || self,
      GLOBAL = global;
  var _Object$defineProperty = $__require("11")["default"];
  exports["default"] = function () {
    function defineProperties(target, props) {
      for (var i = 0; i < props.length; i++) {
        var descriptor = props[i];
        descriptor.enumerable = descriptor.enumerable || false;
        descriptor.configurable = true;
        if ("value" in descriptor) descriptor.writable = true;
        _Object$defineProperty(target, descriptor.key, descriptor);
      }
    }
    return function (Constructor, protoProps, staticProps) {
      if (protoProps) defineProperties(Constructor.prototype, protoProps);
      if (staticProps) defineProperties(Constructor, staticProps);
      return Constructor;
    };
  }();
  exports.__esModule = true;
});
$__System.registerDynamic("8", [], true, function ($__require, exports, module) {
  /* */
  "use strict";

  var global = this || self,
      GLOBAL = global;
  exports["default"] = function (instance, Constructor) {
    if (!(instance instanceof Constructor)) {
      throw new TypeError("Cannot call a class as a function");
    }
  };

  exports.__esModule = true;
});
$__System.register('12', ['3', '7', '8', 'd'], function (_export) {
  var THREE, _createClass, _classCallCheck, assets, PlaneBloom;

  return {
    setters: [function (_3) {
      THREE = _3;
    }, function (_) {
      _createClass = _['default'];
    }, function (_2) {
      _classCallCheck = _2['default'];
    }, function (_d) {
      assets = _d['default'];
    }],
    execute: function () {
      'use strict';

      PlaneBloom = (function () {
        function PlaneBloom(tex_base, tex_blur) {
          _classCallCheck(this, PlaneBloom);

          this.uniforms = null;
          this.tone = 0.7;
          this.strength = 3;
          this.texBase = tex_base;
          this.texBlur = tex_blur;
          this.mesh = this.createMesh();
        }

        _createClass(PlaneBloom, [{
          key: 'createMesh',
          value: function createMesh() {
            this.uniforms = {
              tone: {
                type: 'f',
                value: this.tone
              },
              strength: {
                type: 'f',
                value: this.strength
              },
              texBase: {
                type: 't',
                value: this.texBase
              },
              texBlur: {
                type: 't',
                value: this.texBlur
              }
            };
            var material = assets.shaders.bloom;
            material.uniforms = this.uniforms;
            return new THREE.Mesh(new THREE.PlaneBufferGeometry(2, 2), material);
          }
        }]);

        return PlaneBloom;
      })();

      _export('default', PlaneBloom);
    }
  };
});

$__System.register('13', ['3', '7', '8', '12', 'c', 'e'], function (_export) {
  var THREE, _createClass, _classCallCheck, PlaneBloom, PlaneBright, PlaneBlur, Bloom;

  return {
    setters: [function (_3) {
      THREE = _3;
    }, function (_) {
      _createClass = _['default'];
    }, function (_2) {
      _classCallCheck = _2['default'];
    }, function (_4) {
      PlaneBloom = _4['default'];
    }, function (_c) {
      PlaneBright = _c['default'];
    }, function (_e) {
      PlaneBlur = _e['default'];
    }],
    execute: function () {
      'use strict';

      Bloom = (function () {
        function Bloom(tex_base) {
          _classCallCheck(this, Bloom);

          this.blurCount = 3;
          this.renderTarget = [new THREE.WebGLRenderTarget(window.innerWidth / 4, window.innerHeight / 4), new THREE.WebGLRenderTarget(window.innerWidth / 4, window.innerHeight / 4)];
          this.scene = {
            bright: new THREE.Scene(),
            blurh: new THREE.Scene(),
            blurv: new THREE.Scene(),
            bloom: new THREE.Scene()
          };
          this.camera = new THREE.PerspectiveCamera(45, 1, 1, 2);
          this.plane = {
            bright: new PlaneBright(tex_base),
            blurh: new PlaneBlur(this.renderTarget[0].texture, new THREE.Vector2(1.0, 0.0)),
            blurv: new PlaneBlur(this.renderTarget[1].texture, new THREE.Vector2(0.0, 1.0)),
            bloom: new PlaneBloom(tex_base, this.renderTarget[0].texture)
          };
          this.blurTarget = this.renderTarget[0];
          this.bloomTarget = new THREE.WebGLRenderTarget(window.innerWidth, window.innerHeight);
          this.init();
        }

        _createClass(Bloom, [{
          key: 'init',
          value: function init() {
            this.scene.bright.add(this.plane.bright.mesh);
            this.scene.blurh.add(this.plane.blurh.mesh);
            this.scene.blurv.add(this.plane.blurv.mesh);
            this.scene.bloom.add(this.plane.bloom.mesh);
          }
        }, {
          key: 'render',
          value: function render(renderer) {
            renderer.setRenderTarget(this.renderTarget[0]);
            renderer.render(this.scene.bright, this.camera);
            for (var i = 0; i < this.blurCount; i++) {
              renderer.setRenderTarget(this.renderTarget[1]);
              renderer.render(this.scene.blurh, this.camera);
              renderer.setRenderTarget(this.renderTarget[0]);
              renderer.render(this.scene.blurv, this.camera);
            }
            // renderer.setRenderTarget(this.bloomTarget);
            // renderer.render(this.scene.bloom, this.camera);
            renderer.setRenderTarget(null);
          }
        }, {
          key: 'resize',
          value: function resize() {
            this.renderTarget[0].setSize(window.innerWidth / 4, window.innerHeight / 4);
            this.renderTarget[1].setSize(window.innerWidth / 4, window.innerHeight / 4);
            this.plane.blurh.resize();
            this.plane.blurv.resize();
            this.bloomTarget.setSize(window.innerWidth, window.innerHeight);
          }
        }]);

        return Bloom;
      })();

      _export('default', Bloom);
    }
  };
});

$__System.register("14", ["3"], function (_export) {
	/**
  * @author mrdoob / http://mrdoob.com/
  * @author marklundin / http://mark-lundin.com/
  * @author alteredq / http://alteredqualia.com/
  * @author tschw
  */

	"use strict";

	var THREE, AnaglyphEffect;
	return {
		setters: [function (_) {
			THREE = _;
		}],
		execute: function () {
			AnaglyphEffect = function AnaglyphEffect(renderer, width, height) {

				// Matrices generated with angler.js https://github.com/tschw/angler.js/
				// (in column-major element order, as accepted by WebGL)

				this.colorMatrixLeft = new THREE.Matrix3().fromArray([1.0671679973602295, -0.0016435992438346148, 0.0001777536963345483, // r out
				-0.028107794001698494, -0.00019593400065787137, -0.0002875397040043026, // g out
				-0.04279090091586113, 0.000015809757314855233, -0.00024287120322696865 // b out

				]);

				//		red						green 						blue  						in

				this.colorMatrixRight = new THREE.Matrix3().fromArray([-0.0355340838432312, -0.06440307199954987, 0.018319187685847282, // r out
				-0.10269022732973099, 0.8079727292060852, -0.04835830628871918, // g out
				0.0001224992738571018, -0.009558862075209618, 0.567823588848114 // b out

				]);

				var _camera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1);

				var _scene = new THREE.Scene();

				var _stereo = new THREE.StereoCamera();
				_stereo.eyeSep = 0.2;

				var _params = { minFilter: THREE.LinearFilter, magFilter: THREE.NearestFilter, format: THREE.RGBAFormat };

				if (width === undefined) width = 512;
				if (height === undefined) height = 512;

				var _renderTargetL = new THREE.WebGLRenderTarget(width, height, _params);
				var _renderTargetR = new THREE.WebGLRenderTarget(width, height, _params);

				var _material = new THREE.ShaderMaterial({

					uniforms: {

						"mapLeft": { value: _renderTargetL.texture },
						"mapRight": { value: _renderTargetR.texture },

						"colorMatrixLeft": { value: this.colorMatrixLeft },
						"colorMatrixRight": { value: this.colorMatrixRight }

					},

					vertexShader: ["varying vec2 vUv;", "void main() {", "	vUv = vec2( uv.x, uv.y );", "	gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", "}"].join("\n"),

					fragmentShader: ["uniform sampler2D mapLeft;", "uniform sampler2D mapRight;", "varying vec2 vUv;", "uniform mat3 colorMatrixLeft;", "uniform mat3 colorMatrixRight;",

					// These functions implement sRGB linearization and gamma correction

					"float lin( float c ) {", "	return c <= 0.04045 ? c * 0.0773993808 :", "			pow( c * 0.9478672986 + 0.0521327014, 2.4 );", "}", "vec4 lin( vec4 c ) {", "	return vec4( lin( c.r ), lin( c.g ), lin( c.b ), c.a );", "}", "float dev( float c ) {", "	return c <= 0.0031308 ? c * 12.92", "			: pow( c, 0.41666 ) * 1.055 - 0.055;", "}", "void main() {", "	vec2 uv = vUv;", "	vec4 colorL = lin( texture2D( mapLeft, uv ) );", "	vec4 colorR = lin( texture2D( mapRight, uv ) );", "	vec3 color = clamp(", "			colorMatrixLeft * colorL.rgb +", "			colorMatrixRight * colorR.rgb, 0., 1. );", "	gl_FragColor = vec4(", "			dev( color.r ), dev( color.g ), dev( color.b ),", "			max( colorL.a, colorR.a ) );", "}"].join("\n")

				});

				var _mesh = new THREE.Mesh(new THREE.PlaneBufferGeometry(2, 2), _material);
				_scene.add(_mesh);

				this.setSize = function (width, height) {

					renderer.setSize(width, height);

					var pixelRatio = renderer.getPixelRatio();

					_renderTargetL.setSize(width * pixelRatio, height * pixelRatio);
					_renderTargetR.setSize(width * pixelRatio, height * pixelRatio);
				};

				this.render = function (scene, camera) {

					var currentRenderTarget = renderer.getRenderTarget();

					scene.updateMatrixWorld();

					if (camera.parent === null) camera.updateMatrixWorld();

					_stereo.update(camera);

					renderer.setRenderTarget(_renderTargetR);
					renderer.clear();
					renderer.render(scene, _stereo.cameraL);

					renderer.setRenderTarget(_renderTargetL);
					renderer.clear();
					renderer.render(scene, _stereo.cameraR);

					renderer.setRenderTarget(currentRenderTarget);
					renderer.render(_scene, _camera);
					renderer.setRenderTarget(null);
				};

				this.dispose = function () {

					if (_renderTargetL) _renderTargetL.dispose();
					if (_renderTargetR) _renderTargetR.dispose();
					if (_mesh) _mesh.geometry.dispose();
					if (_material) _material.dispose();
				};
			};

			_export("AnaglyphEffect", AnaglyphEffect);
		}
	};
});

(function() {
var define = $__System.amdDefine;
(function webpackUniversalModuleDefinition(root, factory) {
  if (typeof exports === 'object' && typeof module === 'object')
    module.exports = factory();
  else if (typeof define === 'function' && define.amd)
    define("15", [], factory);
  else if (typeof exports === 'object')
    exports["dat"] = factory();
  else
    root["dat"] = factory();
})(this, function() {
  return (function(modules) {
    var installedModules = {};
    function __webpack_require__(moduleId) {
      if (installedModules[moduleId])
        return installedModules[moduleId].exports;
      var module = installedModules[moduleId] = {
        exports: {},
        id: moduleId,
        loaded: false
      };
      modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
      module.loaded = true;
      return module.exports;
    }
    __webpack_require__.m = modules;
    __webpack_require__.c = installedModules;
    __webpack_require__.p = "";
    return __webpack_require__(0);
  })([function(module, exports, __webpack_require__) {
    'use strict';
    exports.__esModule = true;
    var _index = __webpack_require__(1);
    var _index2 = _interopRequireDefault(_index);
    function _interopRequireDefault(obj) {
      return obj && obj.__esModule ? obj : {default: obj};
    }
    exports.default = _index2.default;
    module.exports = exports['default'];
  }, function(module, exports, __webpack_require__) {
    'use strict';
    exports.__esModule = true;
    var _Color = __webpack_require__(2);
    var _Color2 = _interopRequireDefault(_Color);
    var _math = __webpack_require__(6);
    var _math2 = _interopRequireDefault(_math);
    var _interpret = __webpack_require__(3);
    var _interpret2 = _interopRequireDefault(_interpret);
    var _Controller = __webpack_require__(7);
    var _Controller2 = _interopRequireDefault(_Controller);
    var _BooleanController = __webpack_require__(8);
    var _BooleanController2 = _interopRequireDefault(_BooleanController);
    var _OptionController = __webpack_require__(10);
    var _OptionController2 = _interopRequireDefault(_OptionController);
    var _StringController = __webpack_require__(11);
    var _StringController2 = _interopRequireDefault(_StringController);
    var _NumberController = __webpack_require__(12);
    var _NumberController2 = _interopRequireDefault(_NumberController);
    var _NumberControllerBox = __webpack_require__(13);
    var _NumberControllerBox2 = _interopRequireDefault(_NumberControllerBox);
    var _NumberControllerSlider = __webpack_require__(14);
    var _NumberControllerSlider2 = _interopRequireDefault(_NumberControllerSlider);
    var _FunctionController = __webpack_require__(15);
    var _FunctionController2 = _interopRequireDefault(_FunctionController);
    var _ColorController = __webpack_require__(16);
    var _ColorController2 = _interopRequireDefault(_ColorController);
    var _dom = __webpack_require__(9);
    var _dom2 = _interopRequireDefault(_dom);
    var _GUI = __webpack_require__(17);
    var _GUI2 = _interopRequireDefault(_GUI);
    function _interopRequireDefault(obj) {
      return obj && obj.__esModule ? obj : {default: obj};
    }
    exports.default = {
      color: {
        Color: _Color2.default,
        math: _math2.default,
        interpret: _interpret2.default
      },
      controllers: {
        Controller: _Controller2.default,
        BooleanController: _BooleanController2.default,
        OptionController: _OptionController2.default,
        StringController: _StringController2.default,
        NumberController: _NumberController2.default,
        NumberControllerBox: _NumberControllerBox2.default,
        NumberControllerSlider: _NumberControllerSlider2.default,
        FunctionController: _FunctionController2.default,
        ColorController: _ColorController2.default
      },
      dom: {dom: _dom2.default},
      gui: {GUI: _GUI2.default},
      GUI: _GUI2.default
    };
    module.exports = exports['default'];
  }, function(module, exports, __webpack_require__) {
    'use strict';
    exports.__esModule = true;
    var _interpret = __webpack_require__(3);
    var _interpret2 = _interopRequireDefault(_interpret);
    var _math = __webpack_require__(6);
    var _math2 = _interopRequireDefault(_math);
    var _toString = __webpack_require__(4);
    var _toString2 = _interopRequireDefault(_toString);
    var _common = __webpack_require__(5);
    var _common2 = _interopRequireDefault(_common);
    function _interopRequireDefault(obj) {
      return obj && obj.__esModule ? obj : {default: obj};
    }
    function _classCallCheck(instance, Constructor) {
      if (!(instance instanceof Constructor)) {
        throw new TypeError("Cannot call a class as a function");
      }
    }
    var Color = function() {
      function Color() {
        _classCallCheck(this, Color);
        this.__state = _interpret2.default.apply(this, arguments);
        if (this.__state === false) {
          throw new Error('Failed to interpret color arguments');
        }
        this.__state.a = this.__state.a || 1;
      }
      Color.prototype.toString = function toString() {
        return (0, _toString2.default)(this);
      };
      Color.prototype.toHexString = function toHexString() {
        return (0, _toString2.default)(this, true);
      };
      Color.prototype.toOriginal = function toOriginal() {
        return this.__state.conversion.write(this);
      };
      return Color;
    }();
    function defineRGBComponent(target, component, componentHexIndex) {
      Object.defineProperty(target, component, {
        get: function get() {
          if (this.__state.space === 'RGB') {
            return this.__state[component];
          }
          Color.recalculateRGB(this, component, componentHexIndex);
          return this.__state[component];
        },
        set: function set(v) {
          if (this.__state.space !== 'RGB') {
            Color.recalculateRGB(this, component, componentHexIndex);
            this.__state.space = 'RGB';
          }
          this.__state[component] = v;
        }
      });
    }
    function defineHSVComponent(target, component) {
      Object.defineProperty(target, component, {
        get: function get() {
          if (this.__state.space === 'HSV') {
            return this.__state[component];
          }
          Color.recalculateHSV(this);
          return this.__state[component];
        },
        set: function set(v) {
          if (this.__state.space !== 'HSV') {
            Color.recalculateHSV(this);
            this.__state.space = 'HSV';
          }
          this.__state[component] = v;
        }
      });
    }
    Color.recalculateRGB = function(color, component, componentHexIndex) {
      if (color.__state.space === 'HEX') {
        color.__state[component] = _math2.default.component_from_hex(color.__state.hex, componentHexIndex);
      } else if (color.__state.space === 'HSV') {
        _common2.default.extend(color.__state, _math2.default.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));
      } else {
        throw new Error('Corrupted color state');
      }
    };
    Color.recalculateHSV = function(color) {
      var result = _math2.default.rgb_to_hsv(color.r, color.g, color.b);
      _common2.default.extend(color.__state, {
        s: result.s,
        v: result.v
      });
      if (!_common2.default.isNaN(result.h)) {
        color.__state.h = result.h;
      } else if (_common2.default.isUndefined(color.__state.h)) {
        color.__state.h = 0;
      }
    };
    Color.COMPONENTS = ['r', 'g', 'b', 'h', 's', 'v', 'hex', 'a'];
    defineRGBComponent(Color.prototype, 'r', 2);
    defineRGBComponent(Color.prototype, 'g', 1);
    defineRGBComponent(Color.prototype, 'b', 0);
    defineHSVComponent(Color.prototype, 'h');
    defineHSVComponent(Color.prototype, 's');
    defineHSVComponent(Color.prototype, 'v');
    Object.defineProperty(Color.prototype, 'a', {
      get: function get() {
        return this.__state.a;
      },
      set: function set(v) {
        this.__state.a = v;
      }
    });
    Object.defineProperty(Color.prototype, 'hex', {
      get: function get() {
        if (!this.__state.space !== 'HEX') {
          this.__state.hex = _math2.default.rgb_to_hex(this.r, this.g, this.b);
        }
        return this.__state.hex;
      },
      set: function set(v) {
        this.__state.space = 'HEX';
        this.__state.hex = v;
      }
    });
    exports.default = Color;
    module.exports = exports['default'];
  }, function(module, exports, __webpack_require__) {
    'use strict';
    exports.__esModule = true;
    var _toString = __webpack_require__(4);
    var _toString2 = _interopRequireDefault(_toString);
    var _common = __webpack_require__(5);
    var _common2 = _interopRequireDefault(_common);
    function _interopRequireDefault(obj) {
      return obj && obj.__esModule ? obj : {default: obj};
    }
    var INTERPRETATIONS = [{
      litmus: _common2.default.isString,
      conversions: {
        THREE_CHAR_HEX: {
          read: function read(original) {
            var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);
            if (test === null) {
              return false;
            }
            return {
              space: 'HEX',
              hex: parseInt('0x' + test[1].toString() + test[1].toString() + test[2].toString() + test[2].toString() + test[3].toString() + test[3].toString(), 0)
            };
          },
          write: _toString2.default
        },
        SIX_CHAR_HEX: {
          read: function read(original) {
            var test = original.match(/^#([A-F0-9]{6})$/i);
            if (test === null) {
              return false;
            }
            return {
              space: 'HEX',
              hex: parseInt('0x' + test[1].toString(), 0)
            };
          },
          write: _toString2.default
        },
        CSS_RGB: {
          read: function read(original) {
            var test = original.match(/^rgb\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/);
            if (test === null) {
              return false;
            }
            return {
              space: 'RGB',
              r: parseFloat(test[1]),
              g: parseFloat(test[2]),
              b: parseFloat(test[3])
            };
          },
          write: _toString2.default
        },
        CSS_RGBA: {
          read: function read(original) {
            var test = original.match(/^rgba\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/);
            if (test === null) {
              return false;
            }
            return {
              space: 'RGB',
              r: parseFloat(test[1]),
              g: parseFloat(test[2]),
              b: parseFloat(test[3]),
              a: parseFloat(test[4])
            };
          },
          write: _toString2.default
        }
      }
    }, {
      litmus: _common2.default.isNumber,
      conversions: {HEX: {
          read: function read(original) {
            return {
              space: 'HEX',
              hex: original,
              conversionName: 'HEX'
            };
          },
          write: function write(color) {
            return color.hex;
          }
        }}
    }, {
      litmus: _common2.default.isArray,
      conversions: {
        RGB_ARRAY: {
          read: function read(original) {
            if (original.length !== 3) {
              return false;
            }
            return {
              space: 'RGB',
              r: original[0],
              g: original[1],
              b: original[2]
            };
          },
          write: function write(color) {
            return [color.r, color.g, color.b];
          }
        },
        RGBA_ARRAY: {
          read: function read(original) {
            if (original.length !== 4)
              return false;
            return {
              space: 'RGB',
              r: original[0],
              g: original[1],
              b: original[2],
              a: original[3]
            };
          },
          write: function write(color) {
            return [color.r, color.g, color.b, color.a];
          }
        }
      }
    }, {
      litmus: _common2.default.isObject,
      conversions: {
        RGBA_OBJ: {
          read: function read(original) {
            if (_common2.default.isNumber(original.r) && _common2.default.isNumber(original.g) && _common2.default.isNumber(original.b) && _common2.default.isNumber(original.a)) {
              return {
                space: 'RGB',
                r: original.r,
                g: original.g,
                b: original.b,
                a: original.a
              };
            }
            return false;
          },
          write: function write(color) {
            return {
              r: color.r,
              g: color.g,
              b: color.b,
              a: color.a
            };
          }
        },
        RGB_OBJ: {
          read: function read(original) {
            if (_common2.default.isNumber(original.r) && _common2.default.isNumber(original.g) && _common2.default.isNumber(original.b)) {
              return {
                space: 'RGB',
                r: original.r,
                g: original.g,
                b: original.b
              };
            }
            return false;
          },
          write: function write(color) {
            return {
              r: color.r,
              g: color.g,
              b: color.b
            };
          }
        },
        HSVA_OBJ: {
          read: function read(original) {
            if (_common2.default.isNumber(original.h) && _common2.default.isNumber(original.s) && _common2.default.isNumber(original.v) && _common2.default.isNumber(original.a)) {
              return {
                space: 'HSV',
                h: original.h,
                s: original.s,
                v: original.v,
                a: original.a
              };
            }
            return false;
          },
          write: function write(color) {
            return {
              h: color.h,
              s: color.s,
              v: color.v,
              a: color.a
            };
          }
        },
        HSV_OBJ: {
          read: function read(original) {
            if (_common2.default.isNumber(original.h) && _common2.default.isNumber(original.s) && _common2.default.isNumber(original.v)) {
              return {
                space: 'HSV',
                h: original.h,
                s: original.s,
                v: original.v
              };
            }
            return false;
          },
          write: function write(color) {
            return {
              h: color.h,
              s: color.s,
              v: color.v
            };
          }
        }
      }
    }];
    var result = void 0;
    var toReturn = void 0;
    var interpret = function interpret() {
      toReturn = false;
      var original = arguments.length > 1 ? _common2.default.toArray(arguments) : arguments[0];
      _common2.default.each(INTERPRETATIONS, function(family) {
        if (family.litmus(original)) {
          _common2.default.each(family.conversions, function(conversion, conversionName) {
            result = conversion.read(original);
            if (toReturn === false && result !== false) {
              toReturn = result;
              result.conversionName = conversionName;
              result.conversion = conversion;
              return _common2.default.BREAK;
            }
          });
          return _common2.default.BREAK;
        }
      });
      return toReturn;
    };
    exports.default = interpret;
    module.exports = exports['default'];
  }, function(module, exports) {
    'use strict';
    exports.__esModule = true;
    exports.default = function(color, forceCSSHex) {
      var colorFormat = color.__state.conversionName.toString();
      var r = Math.round(color.r);
      var g = Math.round(color.g);
      var b = Math.round(color.b);
      var a = color.a;
      var h = Math.round(color.h);
      var s = color.s.toFixed(1);
      var v = color.v.toFixed(1);
      if (forceCSSHex || colorFormat === 'THREE_CHAR_HEX' || colorFormat === 'SIX_CHAR_HEX') {
        var str = color.hex.toString(16);
        while (str.length < 6) {
          str = '0' + str;
        }
        return '#' + str;
      } else if (colorFormat === 'CSS_RGB') {
        return 'rgb(' + r + ',' + g + ',' + b + ')';
      } else if (colorFormat === 'CSS_RGBA') {
        return 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')';
      } else if (colorFormat === 'HEX') {
        return '0x' + color.hex.toString(16);
      } else if (colorFormat === 'RGB_ARRAY') {
        return '[' + r + ',' + g + ',' + b + ']';
      } else if (colorFormat === 'RGBA_ARRAY') {
        return '[' + r + ',' + g + ',' + b + ',' + a + ']';
      } else if (colorFormat === 'RGB_OBJ') {
        return '{r:' + r + ',g:' + g + ',b:' + b + '}';
      } else if (colorFormat === 'RGBA_OBJ') {
        return '{r:' + r + ',g:' + g + ',b:' + b + ',a:' + a + '}';
      } else if (colorFormat === 'HSV_OBJ') {
        return '{h:' + h + ',s:' + s + ',v:' + v + '}';
      } else if (colorFormat === 'HSVA_OBJ') {
        return '{h:' + h + ',s:' + s + ',v:' + v + ',a:' + a + '}';
      }
      return 'unknown format';
    };
    module.exports = exports['default'];
  }, function(module, exports) {
    'use strict';
    exports.__esModule = true;
    var ARR_EACH = Array.prototype.forEach;
    var ARR_SLICE = Array.prototype.slice;
    var Common = {
      BREAK: {},
      extend: function extend(target) {
        this.each(ARR_SLICE.call(arguments, 1), function(obj) {
          var keys = this.isObject(obj) ? Object.keys(obj) : [];
          keys.forEach(function(key) {
            if (!this.isUndefined(obj[key])) {
              target[key] = obj[key];
            }
          }.bind(this));
        }, this);
        return target;
      },
      defaults: function defaults(target) {
        this.each(ARR_SLICE.call(arguments, 1), function(obj) {
          var keys = this.isObject(obj) ? Object.keys(obj) : [];
          keys.forEach(function(key) {
            if (this.isUndefined(target[key])) {
              target[key] = obj[key];
            }
          }.bind(this));
        }, this);
        return target;
      },
      compose: function compose() {
        var toCall = ARR_SLICE.call(arguments);
        return function() {
          var args = ARR_SLICE.call(arguments);
          for (var i = toCall.length - 1; i >= 0; i--) {
            args = [toCall[i].apply(this, args)];
          }
          return args[0];
        };
      },
      each: function each(obj, itr, scope) {
        if (!obj) {
          return;
        }
        if (ARR_EACH && obj.forEach && obj.forEach === ARR_EACH) {
          obj.forEach(itr, scope);
        } else if (obj.length === obj.length + 0) {
          var key = void 0;
          var l = void 0;
          for (key = 0, l = obj.length; key < l; key++) {
            if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) {
              return;
            }
          }
        } else {
          for (var _key in obj) {
            if (itr.call(scope, obj[_key], _key) === this.BREAK) {
              return;
            }
          }
        }
      },
      defer: function defer(fnc) {
        setTimeout(fnc, 0);
      },
      debounce: function debounce(func, threshold, callImmediately) {
        var timeout = void 0;
        return function() {
          var obj = this;
          var args = arguments;
          function delayed() {
            timeout = null;
            if (!callImmediately)
              func.apply(obj, args);
          }
          var callNow = callImmediately || !timeout;
          clearTimeout(timeout);
          timeout = setTimeout(delayed, threshold);
          if (callNow) {
            func.apply(obj, args);
          }
        };
      },
      toArray: function toArray(obj) {
        if (obj.toArray)
          return obj.toArray();
        return ARR_SLICE.call(obj);
      },
      isUndefined: function isUndefined(obj) {
        return obj === undefined;
      },
      isNull: function isNull(obj) {
        return obj === null;
      },
      isNaN: function(_isNaN) {
        function isNaN(_x) {
          return _isNaN.apply(this, arguments);
        }
        isNaN.toString = function() {
          return _isNaN.toString();
        };
        return isNaN;
      }(function(obj) {
        return isNaN(obj);
      }),
      isArray: Array.isArray || function(obj) {
        return obj.constructor === Array;
      },
      isObject: function isObject(obj) {
        return obj === Object(obj);
      },
      isNumber: function isNumber(obj) {
        return obj === obj + 0;
      },
      isString: function isString(obj) {
        return obj === obj + '';
      },
      isBoolean: function isBoolean(obj) {
        return obj === false || obj === true;
      },
      isFunction: function isFunction(obj) {
        return Object.prototype.toString.call(obj) === '[object Function]';
      }
    };
    exports.default = Common;
    module.exports = exports['default'];
  }, function(module, exports) {
    "use strict";
    exports.__esModule = true;
    var tmpComponent = void 0;
    var ColorMath = {
      hsv_to_rgb: function hsv_to_rgb(h, s, v) {
        var hi = Math.floor(h / 60) % 6;
        var f = h / 60 - Math.floor(h / 60);
        var p = v * (1.0 - s);
        var q = v * (1.0 - f * s);
        var t = v * (1.0 - (1.0 - f) * s);
        var c = [[v, t, p], [q, v, p], [p, v, t], [p, q, v], [t, p, v], [v, p, q]][hi];
        return {
          r: c[0] * 255,
          g: c[1] * 255,
          b: c[2] * 255
        };
      },
      rgb_to_hsv: function rgb_to_hsv(r, g, b) {
        var min = Math.min(r, g, b);
        var max = Math.max(r, g, b);
        var delta = max - min;
        var h = void 0;
        var s = void 0;
        if (max !== 0) {
          s = delta / max;
        } else {
          return {
            h: NaN,
            s: 0,
            v: 0
          };
        }
        if (r === max) {
          h = (g - b) / delta;
        } else if (g === max) {
          h = 2 + (b - r) / delta;
        } else {
          h = 4 + (r - g) / delta;
        }
        h /= 6;
        if (h < 0) {
          h += 1;
        }
        return {
          h: h * 360,
          s: s,
          v: max / 255
        };
      },
      rgb_to_hex: function rgb_to_hex(r, g, b) {
        var hex = this.hex_with_component(0, 2, r);
        hex = this.hex_with_component(hex, 1, g);
        hex = this.hex_with_component(hex, 0, b);
        return hex;
      },
      component_from_hex: function component_from_hex(hex, componentIndex) {
        return hex >> componentIndex * 8 & 0xFF;
      },
      hex_with_component: function hex_with_component(hex, componentIndex, value) {
        return value << (tmpComponent = componentIndex * 8) | hex & ~(0xFF << tmpComponent);
      }
    };
    exports.default = ColorMath;
    module.exports = exports["default"];
  }, function(module, exports) {
    'use strict';
    exports.__esModule = true;
    function _classCallCheck(instance, Constructor) {
      if (!(instance instanceof Constructor)) {
        throw new TypeError("Cannot call a class as a function");
      }
    }
    var Controller = function() {
      function Controller(object, property) {
        _classCallCheck(this, Controller);
        this.initialValue = object[property];
        this.domElement = document.createElement('div');
        this.object = object;
        this.property = property;
        this.__onChange = undefined;
        this.__onFinishChange = undefined;
      }
      Controller.prototype.onChange = function onChange(fnc) {
        this.__onChange = fnc;
        return this;
      };
      Controller.prototype.onFinishChange = function onFinishChange(fnc) {
        this.__onFinishChange = fnc;
        return this;
      };
      Controller.prototype.setValue = function setValue(newValue) {
        this.object[this.property] = newValue;
        if (this.__onChange) {
          this.__onChange.call(this, newValue);
        }
        this.updateDisplay();
        return this;
      };
      Controller.prototype.getValue = function getValue() {
        return this.object[this.property];
      };
      Controller.prototype.updateDisplay = function updateDisplay() {
        return this;
      };
      Controller.prototype.isModified = function isModified() {
        return this.initialValue !== this.getValue();
      };
      return Controller;
    }();
    exports.default = Controller;
    module.exports = exports['default'];
  }, function(module, exports, __webpack_require__) {
    'use strict';
    exports.__esModule = true;
    var _Controller2 = __webpack_require__(7);
    var _Controller3 = _interopRequireDefault(_Controller2);
    var _dom = __webpack_require__(9);
    var _dom2 = _interopRequireDefault(_dom);
    function _interopRequireDefault(obj) {
      return obj && obj.__esModule ? obj : {default: obj};
    }
    function _classCallCheck(instance, Constructor) {
      if (!(instance instanceof Constructor)) {
        throw new TypeError("Cannot call a class as a function");
      }
    }
    function _possibleConstructorReturn(self, call) {
      if (!self) {
        throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
      }
      return call && (typeof call === "object" || typeof call === "function") ? call : self;
    }
    function _inherits(subClass, superClass) {
      if (typeof superClass !== "function" && superClass !== null) {
        throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
      }
      subClass.prototype = Object.create(superClass && superClass.prototype, {constructor: {
          value: subClass,
          enumerable: false,
          writable: true,
          configurable: true
        }});
      if (superClass)
        Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
    }
    var BooleanController = function(_Controller) {
      _inherits(BooleanController, _Controller);
      function BooleanController(object, property) {
        _classCallCheck(this, BooleanController);
        var _this2 = _possibleConstructorReturn(this, _Controller.call(this, object, property));
        var _this = _this2;
        _this2.__prev = _this2.getValue();
        _this2.__checkbox = document.createElement('input');
        _this2.__checkbox.setAttribute('type', 'checkbox');
        function onChange() {
          _this.setValue(!_this.__prev);
        }
        _dom2.default.bind(_this2.__checkbox, 'change', onChange, false);
        _this2.domElement.appendChild(_this2.__checkbox);
        _this2.updateDisplay();
        return _this2;
      }
      BooleanController.prototype.setValue = function setValue(v) {
        var toReturn = _Controller.prototype.setValue.call(this, v);
        if (this.__onFinishChange) {
          this.__onFinishChange.call(this, this.getValue());
        }
        this.__prev = this.getValue();
        return toReturn;
      };
      BooleanController.prototype.updateDisplay = function updateDisplay() {
        if (this.getValue() === true) {
          this.__checkbox.setAttribute('checked', 'checked');
          this.__checkbox.checked = true;
          this.__prev = true;
        } else {
          this.__checkbox.checked = false;
          this.__prev = false;
        }
        return _Controller.prototype.updateDisplay.call(this);
      };
      return BooleanController;
    }(_Controller3.default);
    exports.default = BooleanController;
    module.exports = exports['default'];
  }, function(module, exports, __webpack_require__) {
    'use strict';
    exports.__esModule = true;
    var _common = __webpack_require__(5);
    var _common2 = _interopRequireDefault(_common);
    function _interopRequireDefault(obj) {
      return obj && obj.__esModule ? obj : {default: obj};
    }
    var EVENT_MAP = {
      HTMLEvents: ['change'],
      MouseEvents: ['click', 'mousemove', 'mousedown', 'mouseup', 'mouseover'],
      KeyboardEvents: ['keydown']
    };
    var EVENT_MAP_INV = {};
    _common2.default.each(EVENT_MAP, function(v, k) {
      _common2.default.each(v, function(e) {
        EVENT_MAP_INV[e] = k;
      });
    });
    var CSS_VALUE_PIXELS = /(\d+(\.\d+)?)px/;
    function cssValueToPixels(val) {
      if (val === '0' || _common2.default.isUndefined(val)) {
        return 0;
      }
      var match = val.match(CSS_VALUE_PIXELS);
      if (!_common2.default.isNull(match)) {
        return parseFloat(match[1]);
      }
      return 0;
    }
    var dom = {
      makeSelectable: function makeSelectable(elem, selectable) {
        if (elem === undefined || elem.style === undefined)
          return;
        elem.onselectstart = selectable ? function() {
          return false;
        } : function() {};
        elem.style.MozUserSelect = selectable ? 'auto' : 'none';
        elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none';
        elem.unselectable = selectable ? 'on' : 'off';
      },
      makeFullscreen: function makeFullscreen(elem, hor, vert) {
        var vertical = vert;
        var horizontal = hor;
        if (_common2.default.isUndefined(horizontal)) {
          horizontal = true;
        }
        if (_common2.default.isUndefined(vertical)) {
          vertical = true;
        }
        elem.style.position = 'absolute';
        if (horizontal) {
          elem.style.left = 0;
          elem.style.right = 0;
        }
        if (vertical) {
          elem.style.top = 0;
          elem.style.bottom = 0;
        }
      },
      fakeEvent: function fakeEvent(elem, eventType, pars, aux) {
        var params = pars || {};
        var className = EVENT_MAP_INV[eventType];
        if (!className) {
          throw new Error('Event type ' + eventType + ' not supported.');
        }
        var evt = document.createEvent(className);
        switch (className) {
          case 'MouseEvents':
            {
              var clientX = params.x || params.clientX || 0;
              var clientY = params.y || params.clientY || 0;
              evt.initMouseEvent(eventType, params.bubbles || false, params.cancelable || true, window, params.clickCount || 1, 0, 0, clientX, clientY, false, false, false, false, 0, null);
              break;
            }
          case 'KeyboardEvents':
            {
              var init = evt.initKeyboardEvent || evt.initKeyEvent;
              _common2.default.defaults(params, {
                cancelable: true,
                ctrlKey: false,
                altKey: false,
                shiftKey: false,
                metaKey: false,
                keyCode: undefined,
                charCode: undefined
              });
              init(eventType, params.bubbles || false, params.cancelable, window, params.ctrlKey, params.altKey, params.shiftKey, params.metaKey, params.keyCode, params.charCode);
              break;
            }
          default:
            {
              evt.initEvent(eventType, params.bubbles || false, params.cancelable || true);
              break;
            }
        }
        _common2.default.defaults(evt, aux);
        elem.dispatchEvent(evt);
      },
      bind: function bind(elem, event, func, newBool) {
        var bool = newBool || false;
        if (elem.addEventListener) {
          elem.addEventListener(event, func, bool);
        } else if (elem.attachEvent) {
          elem.attachEvent('on' + event, func);
        }
        return dom;
      },
      unbind: function unbind(elem, event, func, newBool) {
        var bool = newBool || false;
        if (elem.removeEventListener) {
          elem.removeEventListener(event, func, bool);
        } else if (elem.detachEvent) {
          elem.detachEvent('on' + event, func);
        }
        return dom;
      },
      addClass: function addClass(elem, className) {
        if (elem.className === undefined) {
          elem.className = className;
        } else if (elem.className !== className) {
          var classes = elem.className.split(/ +/);
          if (classes.indexOf(className) === -1) {
            classes.push(className);
            elem.className = classes.join(' ').replace(/^\s+/, '').replace(/\s+$/, '');
          }
        }
        return dom;
      },
      removeClass: function removeClass(elem, className) {
        if (className) {
          if (elem.className === className) {
            elem.removeAttribute('class');
          } else {
            var classes = elem.className.split(/ +/);
            var index = classes.indexOf(className);
            if (index !== -1) {
              classes.splice(index, 1);
              elem.className = classes.join(' ');
            }
          }
        } else {
          elem.className = undefined;
        }
        return dom;
      },
      hasClass: function hasClass(elem, className) {
        return new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)').test(elem.className) || false;
      },
      getWidth: function getWidth(elem) {
        var style = getComputedStyle(elem);
        return cssValueToPixels(style['border-left-width']) + cssValueToPixels(style['border-right-width']) + cssValueToPixels(style['padding-left']) + cssValueToPixels(style['padding-right']) + cssValueToPixels(style.width);
      },
      getHeight: function getHeight(elem) {
        var style = getComputedStyle(elem);
        return cssValueToPixels(style['border-top-width']) + cssValueToPixels(style['border-bottom-width']) + cssValueToPixels(style['padding-top']) + cssValueToPixels(style['padding-bottom']) + cssValueToPixels(style.height);
      },
      getOffset: function getOffset(el) {
        var elem = el;
        var offset = {
          left: 0,
          top: 0
        };
        if (elem.offsetParent) {
          do {
            offset.left += elem.offsetLeft;
            offset.top += elem.offsetTop;
            elem = elem.offsetParent;
          } while (elem);
        }
        return offset;
      },
      isActive: function isActive(elem) {
        return elem === document.activeElement && (elem.type || elem.href);
      }
    };
    exports.default = dom;
    module.exports = exports['default'];
  }, function(module, exports, __webpack_require__) {
    'use strict';
    exports.__esModule = true;
    var _Controller2 = __webpack_require__(7);
    var _Controller3 = _interopRequireDefault(_Controller2);
    var _dom = __webpack_require__(9);
    var _dom2 = _interopRequireDefault(_dom);
    var _common = __webpack_require__(5);
    var _common2 = _interopRequireDefault(_common);
    function _interopRequireDefault(obj) {
      return obj && obj.__esModule ? obj : {default: obj};
    }
    function _classCallCheck(instance, Constructor) {
      if (!(instance instanceof Constructor)) {
        throw new TypeError("Cannot call a class as a function");
      }
    }
    function _possibleConstructorReturn(self, call) {
      if (!self) {
        throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
      }
      return call && (typeof call === "object" || typeof call === "function") ? call : self;
    }
    function _inherits(subClass, superClass) {
      if (typeof superClass !== "function" && superClass !== null) {
        throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
      }
      subClass.prototype = Object.create(superClass && superClass.prototype, {constructor: {
          value: subClass,
          enumerable: false,
          writable: true,
          configurable: true
        }});
      if (superClass)
        Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
    }
    var OptionController = function(_Controller) {
      _inherits(OptionController, _Controller);
      function OptionController(object, property, opts) {
        _classCallCheck(this, OptionController);
        var _this2 = _possibleConstructorReturn(this, _Controller.call(this, object, property));
        var options = opts;
        var _this = _this2;
        _this2.__select = document.createElement('select');
        if (_common2.default.isArray(options)) {
          var map = {};
          _common2.default.each(options, function(element) {
            map[element] = element;
          });
          options = map;
        }
        _common2.default.each(options, function(value, key) {
          var opt = document.createElement('option');
          opt.innerHTML = key;
          opt.setAttribute('value', value);
          _this.__select.appendChild(opt);
        });
        _this2.updateDisplay();
        _dom2.default.bind(_this2.__select, 'change', function() {
          var desiredValue = this.options[this.selectedIndex].value;
          _this.setValue(desiredValue);
        });
        _this2.domElement.appendChild(_this2.__select);
        return _this2;
      }
      OptionController.prototype.setValue = function setValue(v) {
        var toReturn = _Controller.prototype.setValue.call(this, v);
        if (this.__onFinishChange) {
          this.__onFinishChange.call(this, this.getValue());
        }
        return toReturn;
      };
      OptionController.prototype.updateDisplay = function updateDisplay() {
        if (_dom2.default.isActive(this.__select))
          return this;
        this.__select.value = this.getValue();
        return _Controller.prototype.updateDisplay.call(this);
      };
      return OptionController;
    }(_Controller3.default);
    exports.default = OptionController;
    module.exports = exports['default'];
  }, function(module, exports, __webpack_require__) {
    'use strict';
    exports.__esModule = true;
    var _Controller2 = __webpack_require__(7);
    var _Controller3 = _interopRequireDefault(_Controller2);
    var _dom = __webpack_require__(9);
    var _dom2 = _interopRequireDefault(_dom);
    function _interopRequireDefault(obj) {
      return obj && obj.__esModule ? obj : {default: obj};
    }
    function _classCallCheck(instance, Constructor) {
      if (!(instance instanceof Constructor)) {
        throw new TypeError("Cannot call a class as a function");
      }
    }
    function _possibleConstructorReturn(self, call) {
      if (!self) {
        throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
      }
      return call && (typeof call === "object" || typeof call === "function") ? call : self;
    }
    function _inherits(subClass, superClass) {
      if (typeof superClass !== "function" && superClass !== null) {
        throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
      }
      subClass.prototype = Object.create(superClass && superClass.prototype, {constructor: {
          value: subClass,
          enumerable: false,
          writable: true,
          configurable: true
        }});
      if (superClass)
        Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
    }
    var StringController = function(_Controller) {
      _inherits(StringController, _Controller);
      function StringController(object, property) {
        _classCallCheck(this, StringController);
        var _this2 = _possibleConstructorReturn(this, _Controller.call(this, object, property));
        var _this = _this2;
        function onChange() {
          _this.setValue(_this.__input.value);
        }
        function onBlur() {
          if (_this.__onFinishChange) {
            _this.__onFinishChange.call(_this, _this.getValue());
          }
        }
        _this2.__input = document.createElement('input');
        _this2.__input.setAttribute('type', 'text');
        _dom2.default.bind(_this2.__input, 'keyup', onChange);
        _dom2.default.bind(_this2.__input, 'change', onChange);
        _dom2.default.bind(_this2.__input, 'blur', onBlur);
        _dom2.default.bind(_this2.__input, 'keydown', function(e) {
          if (e.keyCode === 13) {
            this.blur();
          }
        });
        _this2.updateDisplay();
        _this2.domElement.appendChild(_this2.__input);
        return _this2;
      }
      StringController.prototype.updateDisplay = function updateDisplay() {
        if (!_dom2.default.isActive(this.__input)) {
          this.__input.value = this.getValue();
        }
        return _Controller.prototype.updateDisplay.call(this);
      };
      return StringController;
    }(_Controller3.default);
    exports.default = StringController;
    module.exports = exports['default'];
  }, function(module, exports, __webpack_require__) {
    'use strict';
    exports.__esModule = true;
    var _Controller2 = __webpack_require__(7);
    var _Controller3 = _interopRequireDefault(_Controller2);
    var _common = __webpack_require__(5);
    var _common2 = _interopRequireDefault(_common);
    function _interopRequireDefault(obj) {
      return obj && obj.__esModule ? obj : {default: obj};
    }
    function _classCallCheck(instance, Constructor) {
      if (!(instance instanceof Constructor)) {
        throw new TypeError("Cannot call a class as a function");
      }
    }
    function _possibleConstructorReturn(self, call) {
      if (!self) {
        throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
      }
      return call && (typeof call === "object" || typeof call === "function") ? call : self;
    }
    function _inherits(subClass, superClass) {
      if (typeof superClass !== "function" && superClass !== null) {
        throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
      }
      subClass.prototype = Object.create(superClass && superClass.prototype, {constructor: {
          value: subClass,
          enumerable: false,
          writable: true,
          configurable: true
        }});
      if (superClass)
        Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
    }
    function numDecimals(x) {
      var _x = x.toString();
      if (_x.indexOf('.') > -1) {
        return _x.length - _x.indexOf('.') - 1;
      }
      return 0;
    }
    var NumberController = function(_Controller) {
      _inherits(NumberController, _Controller);
      function NumberController(object, property, params) {
        _classCallCheck(this, NumberController);
        var _this = _possibleConstructorReturn(this, _Controller.call(this, object, property));
        var _params = params || {};
        _this.__min = _params.min;
        _this.__max = _params.max;
        _this.__step = _params.step;
        if (_common2.default.isUndefined(_this.__step)) {
          if (_this.initialValue === 0) {
            _this.__impliedStep = 1;
          } else {
            _this.__impliedStep = Math.pow(10, Math.floor(Math.log(Math.abs(_this.initialValue)) / Math.LN10)) / 10;
          }
        } else {
          _this.__impliedStep = _this.__step;
        }
        _this.__precision = numDecimals(_this.__impliedStep);
        return _this;
      }
      NumberController.prototype.setValue = function setValue(v) {
        var _v = v;
        if (this.__min !== undefined && _v < this.__min) {
          _v = this.__min;
        } else if (this.__max !== undefined && _v > this.__max) {
          _v = this.__max;
        }
        if (this.__step !== undefined && _v % this.__step !== 0) {
          _v = Math.round(_v / this.__step) * this.__step;
        }
        return _Controller.prototype.setValue.call(this, _v);
      };
      NumberController.prototype.min = function min(v) {
        this.__min = v;
        return this;
      };
      NumberController.prototype.max = function max(v) {
        this.__max = v;
        return this;
      };
      NumberController.prototype.step = function step(v) {
        this.__step = v;
        this.__impliedStep = v;
        this.__precision = numDecimals(v);
        return this;
      };
      return NumberController;
    }(_Controller3.default);
    exports.default = NumberController;
    module.exports = exports['default'];
  }, function(module, exports, __webpack_require__) {
    'use strict';
    exports.__esModule = true;
    var _NumberController2 = __webpack_require__(12);
    var _NumberController3 = _interopRequireDefault(_NumberController2);
    var _dom = __webpack_require__(9);
    var _dom2 = _interopRequireDefault(_dom);
    var _common = __webpack_require__(5);
    var _common2 = _interopRequireDefault(_common);
    function _interopRequireDefault(obj) {
      return obj && obj.__esModule ? obj : {default: obj};
    }
    function _classCallCheck(instance, Constructor) {
      if (!(instance instanceof Constructor)) {
        throw new TypeError("Cannot call a class as a function");
      }
    }
    function _possibleConstructorReturn(self, call) {
      if (!self) {
        throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
      }
      return call && (typeof call === "object" || typeof call === "function") ? call : self;
    }
    function _inherits(subClass, superClass) {
      if (typeof superClass !== "function" && superClass !== null) {
        throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
      }
      subClass.prototype = Object.create(superClass && superClass.prototype, {constructor: {
          value: subClass,
          enumerable: false,
          writable: true,
          configurable: true
        }});
      if (superClass)
        Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
    }
    function roundToDecimal(value, decimals) {
      var tenTo = Math.pow(10, decimals);
      return Math.round(value * tenTo) / tenTo;
    }
    var NumberControllerBox = function(_NumberController) {
      _inherits(NumberControllerBox, _NumberController);
      function NumberControllerBox(object, property, params) {
        _classCallCheck(this, NumberControllerBox);
        var _this2 = _possibleConstructorReturn(this, _NumberController.call(this, object, property, params));
        _this2.__truncationSuspended = false;
        var _this = _this2;
        var prevY = void 0;
        function onChange() {
          var attempted = parseFloat(_this.__input.value);
          if (!_common2.default.isNaN(attempted)) {
            _this.setValue(attempted);
          }
        }
        function onFinish() {
          if (_this.__onFinishChange) {
            _this.__onFinishChange.call(_this, _this.getValue());
          }
        }
        function onBlur() {
          onFinish();
        }
        function onMouseDrag(e) {
          var diff = prevY - e.clientY;
          _this.setValue(_this.getValue() + diff * _this.__impliedStep);
          prevY = e.clientY;
        }
        function onMouseUp() {
          _dom2.default.unbind(window, 'mousemove', onMouseDrag);
          _dom2.default.unbind(window, 'mouseup', onMouseUp);
          onFinish();
        }
        function onMouseDown(e) {
          _dom2.default.bind(window, 'mousemove', onMouseDrag);
          _dom2.default.bind(window, 'mouseup', onMouseUp);
          prevY = e.clientY;
        }
        _this2.__input = document.createElement('input');
        _this2.__input.setAttribute('type', 'text');
        _dom2.default.bind(_this2.__input, 'change', onChange);
        _dom2.default.bind(_this2.__input, 'blur', onBlur);
        _dom2.default.bind(_this2.__input, 'mousedown', onMouseDown);
        _dom2.default.bind(_this2.__input, 'keydown', function(e) {
          if (e.keyCode === 13) {
            _this.__truncationSuspended = true;
            this.blur();
            _this.__truncationSuspended = false;
            onFinish();
          }
        });
        _this2.updateDisplay();
        _this2.domElement.appendChild(_this2.__input);
        return _this2;
      }
      NumberControllerBox.prototype.updateDisplay = function updateDisplay() {
        this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision);
        return _NumberController.prototype.updateDisplay.call(this);
      };
      return NumberControllerBox;
    }(_NumberController3.default);
    exports.default = NumberControllerBox;
    module.exports = exports['default'];
  }, function(module, exports, __webpack_require__) {
    'use strict';
    exports.__esModule = true;
    var _NumberController2 = __webpack_require__(12);
    var _NumberController3 = _interopRequireDefault(_NumberController2);
    var _dom = __webpack_require__(9);
    var _dom2 = _interopRequireDefault(_dom);
    function _interopRequireDefault(obj) {
      return obj && obj.__esModule ? obj : {default: obj};
    }
    function _classCallCheck(instance, Constructor) {
      if (!(instance instanceof Constructor)) {
        throw new TypeError("Cannot call a class as a function");
      }
    }
    function _possibleConstructorReturn(self, call) {
      if (!self) {
        throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
      }
      return call && (typeof call === "object" || typeof call === "function") ? call : self;
    }
    function _inherits(subClass, superClass) {
      if (typeof superClass !== "function" && superClass !== null) {
        throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
      }
      subClass.prototype = Object.create(superClass && superClass.prototype, {constructor: {
          value: subClass,
          enumerable: false,
          writable: true,
          configurable: true
        }});
      if (superClass)
        Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
    }
    function map(v, i1, i2, o1, o2) {
      return o1 + (o2 - o1) * ((v - i1) / (i2 - i1));
    }
    var NumberControllerSlider = function(_NumberController) {
      _inherits(NumberControllerSlider, _NumberController);
      function NumberControllerSlider(object, property, min, max, step) {
        _classCallCheck(this, NumberControllerSlider);
        var _this2 = _possibleConstructorReturn(this, _NumberController.call(this, object, property, {
          min: min,
          max: max,
          step: step
        }));
        var _this = _this2;
        _this2.__background = document.createElement('div');
        _this2.__foreground = document.createElement('div');
        _dom2.default.bind(_this2.__background, 'mousedown', onMouseDown);
        _dom2.default.addClass(_this2.__background, 'slider');
        _dom2.default.addClass(_this2.__foreground, 'slider-fg');
        function onMouseDown(e) {
          document.activeElement.blur();
          _dom2.default.bind(window, 'mousemove', onMouseDrag);
          _dom2.default.bind(window, 'mouseup', onMouseUp);
          onMouseDrag(e);
        }
        function onMouseDrag(e) {
          e.preventDefault();
          var bgRect = _this.__background.getBoundingClientRect();
          _this.setValue(map(e.clientX, bgRect.left, bgRect.right, _this.__min, _this.__max));
          return false;
        }
        function onMouseUp() {
          _dom2.default.unbind(window, 'mousemove', onMouseDrag);
          _dom2.default.unbind(window, 'mouseup', onMouseUp);
          if (_this.__onFinishChange) {
            _this.__onFinishChange.call(_this, _this.getValue());
          }
        }
        _this2.updateDisplay();
        _this2.__background.appendChild(_this2.__foreground);
        _this2.domElement.appendChild(_this2.__background);
        return _this2;
      }
      NumberControllerSlider.prototype.updateDisplay = function updateDisplay() {
        var pct = (this.getValue() - this.__min) / (this.__max - this.__min);
        this.__foreground.style.width = pct * 100 + '%';
        return _NumberController.prototype.updateDisplay.call(this);
      };
      return NumberControllerSlider;
    }(_NumberController3.default);
    exports.default = NumberControllerSlider;
    module.exports = exports['default'];
  }, function(module, exports, __webpack_require__) {
    'use strict';
    exports.__esModule = true;
    var _Controller2 = __webpack_require__(7);
    var _Controller3 = _interopRequireDefault(_Controller2);
    var _dom = __webpack_require__(9);
    var _dom2 = _interopRequireDefault(_dom);
    function _interopRequireDefault(obj) {
      return obj && obj.__esModule ? obj : {default: obj};
    }
    function _classCallCheck(instance, Constructor) {
      if (!(instance instanceof Constructor)) {
        throw new TypeError("Cannot call a class as a function");
      }
    }
    function _possibleConstructorReturn(self, call) {
      if (!self) {
        throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
      }
      return call && (typeof call === "object" || typeof call === "function") ? call : self;
    }
    function _inherits(subClass, superClass) {
      if (typeof superClass !== "function" && superClass !== null) {
        throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
      }
      subClass.prototype = Object.create(superClass && superClass.prototype, {constructor: {
          value: subClass,
          enumerable: false,
          writable: true,
          configurable: true
        }});
      if (superClass)
        Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
    }
    var FunctionController = function(_Controller) {
      _inherits(FunctionController, _Controller);
      function FunctionController(object, property, text) {
        _classCallCheck(this, FunctionController);
        var _this2 = _possibleConstructorReturn(this, _Controller.call(this, object, property));
        var _this = _this2;
        _this2.__button = document.createElement('div');
        _this2.__button.innerHTML = text === undefined ? 'Fire' : text;
        _dom2.default.bind(_this2.__button, 'click', function(e) {
          e.preventDefault();
          _this.fire();
          return false;
        });
        _dom2.default.addClass(_this2.__button, 'button');
        _this2.domElement.appendChild(_this2.__button);
        return _this2;
      }
      FunctionController.prototype.fire = function fire() {
        if (this.__onChange) {
          this.__onChange.call(this);
        }
        this.getValue().call(this.object);
        if (this.__onFinishChange) {
          this.__onFinishChange.call(this, this.getValue());
        }
      };
      return FunctionController;
    }(_Controller3.default);
    exports.default = FunctionController;
    module.exports = exports['default'];
  }, function(module, exports, __webpack_require__) {
    'use strict';
    exports.__esModule = true;
    var _Controller2 = __webpack_require__(7);
    var _Controller3 = _interopRequireDefault(_Controller2);
    var _dom = __webpack_require__(9);
    var _dom2 = _interopRequireDefault(_dom);
    var _Color = __webpack_require__(2);
    var _Color2 = _interopRequireDefault(_Color);
    var _interpret = __webpack_require__(3);
    var _interpret2 = _interopRequireDefault(_interpret);
    var _common = __webpack_require__(5);
    var _common2 = _interopRequireDefault(_common);
    function _interopRequireDefault(obj) {
      return obj && obj.__esModule ? obj : {default: obj};
    }
    function _classCallCheck(instance, Constructor) {
      if (!(instance instanceof Constructor)) {
        throw new TypeError("Cannot call a class as a function");
      }
    }
    function _possibleConstructorReturn(self, call) {
      if (!self) {
        throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
      }
      return call && (typeof call === "object" || typeof call === "function") ? call : self;
    }
    function _inherits(subClass, superClass) {
      if (typeof superClass !== "function" && superClass !== null) {
        throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
      }
      subClass.prototype = Object.create(superClass && superClass.prototype, {constructor: {
          value: subClass,
          enumerable: false,
          writable: true,
          configurable: true
        }});
      if (superClass)
        Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
    }
    var ColorController = function(_Controller) {
      _inherits(ColorController, _Controller);
      function ColorController(object, property) {
        _classCallCheck(this, ColorController);
        var _this2 = _possibleConstructorReturn(this, _Controller.call(this, object, property));
        _this2.__color = new _Color2.default(_this2.getValue());
        _this2.__temp = new _Color2.default(0);
        var _this = _this2;
        _this2.domElement = document.createElement('div');
        _dom2.default.makeSelectable(_this2.domElement, false);
        _this2.__selector = document.createElement('div');
        _this2.__selector.className = 'selector';
        _this2.__saturation_field = document.createElement('div');
        _this2.__saturation_field.className = 'saturation-field';
        _this2.__field_knob = document.createElement('div');
        _this2.__field_knob.className = 'field-knob';
        _this2.__field_knob_border = '2px solid ';
        _this2.__hue_knob = document.createElement('div');
        _this2.__hue_knob.className = 'hue-knob';
        _this2.__hue_field = document.createElement('div');
        _this2.__hue_field.className = 'hue-field';
        _this2.__input = document.createElement('input');
        _this2.__input.type = 'text';
        _this2.__input_textShadow = '0 1px 1px ';
        _dom2.default.bind(_this2.__input, 'keydown', function(e) {
          if (e.keyCode === 13) {
            onBlur.call(this);
          }
        });
        _dom2.default.bind(_this2.__input, 'blur', onBlur);
        _dom2.default.bind(_this2.__selector, 'mousedown', function() {
          _dom2.default.addClass(this, 'drag').bind(window, 'mouseup', function() {
            _dom2.default.removeClass(_this.__selector, 'drag');
          });
        });
        var valueField = document.createElement('div');
        _common2.default.extend(_this2.__selector.style, {
          width: '122px',
          height: '102px',
          padding: '3px',
          backgroundColor: '#222',
          boxShadow: '0px 1px 3px rgba(0,0,0,0.3)'
        });
        _common2.default.extend(_this2.__field_knob.style, {
          position: 'absolute',
          width: '12px',
          height: '12px',
          border: _this2.__field_knob_border + (_this2.__color.v < 0.5 ? '#fff' : '#000'),
          boxShadow: '0px 1px 3px rgba(0,0,0,0.5)',
          borderRadius: '12px',
          zIndex: 1
        });
        _common2.default.extend(_this2.__hue_knob.style, {
          position: 'absolute',
          width: '15px',
          height: '2px',
          borderRight: '4px solid #fff',
          zIndex: 1
        });
        _common2.default.extend(_this2.__saturation_field.style, {
          width: '100px',
          height: '100px',
          border: '1px solid #555',
          marginRight: '3px',
          display: 'inline-block',
          cursor: 'pointer'
        });
        _common2.default.extend(valueField.style, {
          width: '100%',
          height: '100%',
          background: 'none'
        });
        linearGradient(valueField, 'top', 'rgba(0,0,0,0)', '#000');
        _common2.default.extend(_this2.__hue_field.style, {
          width: '15px',
          height: '100px',
          border: '1px solid #555',
          cursor: 'ns-resize',
          position: 'absolute',
          top: '3px',
          right: '3px'
        });
        hueGradient(_this2.__hue_field);
        _common2.default.extend(_this2.__input.style, {
          outline: 'none',
          textAlign: 'center',
          color: '#fff',
          border: 0,
          fontWeight: 'bold',
          textShadow: _this2.__input_textShadow + 'rgba(0,0,0,0.7)'
        });
        _dom2.default.bind(_this2.__saturation_field, 'mousedown', fieldDown);
        _dom2.default.bind(_this2.__field_knob, 'mousedown', fieldDown);
        _dom2.default.bind(_this2.__hue_field, 'mousedown', function(e) {
          setH(e);
          _dom2.default.bind(window, 'mousemove', setH);
          _dom2.default.bind(window, 'mouseup', fieldUpH);
        });
        function fieldDown(e) {
          setSV(e);
          _dom2.default.bind(window, 'mousemove', setSV);
          _dom2.default.bind(window, 'mouseup', fieldUpSV);
        }
        function fieldUpSV() {
          _dom2.default.unbind(window, 'mousemove', setSV);
          _dom2.default.unbind(window, 'mouseup', fieldUpSV);
          onFinish();
        }
        function onBlur() {
          var i = (0, _interpret2.default)(this.value);
          if (i !== false) {
            _this.__color.__state = i;
            _this.setValue(_this.__color.toOriginal());
          } else {
            this.value = _this.__color.toString();
          }
        }
        function fieldUpH() {
          _dom2.default.unbind(window, 'mousemove', setH);
          _dom2.default.unbind(window, 'mouseup', fieldUpH);
          onFinish();
        }
        function onFinish() {
          if (_this.__onFinishChange) {
            _this.__onFinishChange.call(_this, _this.__color.toOriginal());
          }
        }
        _this2.__saturation_field.appendChild(valueField);
        _this2.__selector.appendChild(_this2.__field_knob);
        _this2.__selector.appendChild(_this2.__saturation_field);
        _this2.__selector.appendChild(_this2.__hue_field);
        _this2.__hue_field.appendChild(_this2.__hue_knob);
        _this2.domElement.appendChild(_this2.__input);
        _this2.domElement.appendChild(_this2.__selector);
        _this2.updateDisplay();
        function setSV(e) {
          e.preventDefault();
          var fieldRect = _this.__saturation_field.getBoundingClientRect();
          var s = (e.clientX - fieldRect.left) / (fieldRect.right - fieldRect.left);
          var v = 1 - (e.clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top);
          if (v > 1) {
            v = 1;
          } else if (v < 0) {
            v = 0;
          }
          if (s > 1) {
            s = 1;
          } else if (s < 0) {
            s = 0;
          }
          _this.__color.v = v;
          _this.__color.s = s;
          _this.setValue(_this.__color.toOriginal());
          return false;
        }
        function setH(e) {
          e.preventDefault();
          var fieldRect = _this.__hue_field.getBoundingClientRect();
          var h = 1 - (e.clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top);
          if (h > 1) {
            h = 1;
          } else if (h < 0) {
            h = 0;
          }
          _this.__color.h = h * 360;
          _this.setValue(_this.__color.toOriginal());
          return false;
        }
        return _this2;
      }
      ColorController.prototype.updateDisplay = function updateDisplay() {
        var i = (0, _interpret2.default)(this.getValue());
        if (i !== false) {
          var mismatch = false;
          _common2.default.each(_Color2.default.COMPONENTS, function(component) {
            if (!_common2.default.isUndefined(i[component]) && !_common2.default.isUndefined(this.__color.__state[component]) && i[component] !== this.__color.__state[component]) {
              mismatch = true;
              return {};
            }
          }, this);
          if (mismatch) {
            _common2.default.extend(this.__color.__state, i);
          }
        }
        _common2.default.extend(this.__temp.__state, this.__color.__state);
        this.__temp.a = 1;
        var flip = this.__color.v < 0.5 || this.__color.s > 0.5 ? 255 : 0;
        var _flip = 255 - flip;
        _common2.default.extend(this.__field_knob.style, {
          marginLeft: 100 * this.__color.s - 7 + 'px',
          marginTop: 100 * (1 - this.__color.v) - 7 + 'px',
          backgroundColor: this.__temp.toHexString(),
          border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip + ')'
        });
        this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px';
        this.__temp.s = 1;
        this.__temp.v = 1;
        linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toHexString());
        this.__input.value = this.__color.toString();
        _common2.default.extend(this.__input.style, {
          backgroundColor: this.__color.toHexString(),
          color: 'rgb(' + flip + ',' + flip + ',' + flip + ')',
          textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip + ',.7)'
        });
      };
      return ColorController;
    }(_Controller3.default);
    var vendors = ['-moz-', '-o-', '-webkit-', '-ms-', ''];
    function linearGradient(elem, x, a, b) {
      elem.style.background = '';
      _common2.default.each(vendors, function(vendor) {
        elem.style.cssText += 'background: ' + vendor + 'linear-gradient(' + x + ', ' + a + ' 0%, ' + b + ' 100%); ';
      });
    }
    function hueGradient(elem) {
      elem.style.background = '';
      elem.style.cssText += 'background: -moz-linear-gradient(top,  #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);';
      elem.style.cssText += 'background: -webkit-linear-gradient(top,  #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';
      elem.style.cssText += 'background: -o-linear-gradient(top,  #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';
      elem.style.cssText += 'background: -ms-linear-gradient(top,  #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';
      elem.style.cssText += 'background: linear-gradient(top,  #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';
    }
    exports.default = ColorController;
    module.exports = exports['default'];
  }, function(module, exports, __webpack_require__) {
    'use strict';
    exports.__esModule = true;
    var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function(obj) {
      return typeof obj;
    } : function(obj) {
      return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
    };
    var _css = __webpack_require__(18);
    var _css2 = _interopRequireDefault(_css);
    var _saveDialogue = __webpack_require__(19);
    var _saveDialogue2 = _interopRequireDefault(_saveDialogue);
    var _ControllerFactory = __webpack_require__(20);
    var _ControllerFactory2 = _interopRequireDefault(_ControllerFactory);
    var _Controller = __webpack_require__(7);
    var _Controller2 = _interopRequireDefault(_Controller);
    var _BooleanController = __webpack_require__(8);
    var _BooleanController2 = _interopRequireDefault(_BooleanController);
    var _FunctionController = __webpack_require__(15);
    var _FunctionController2 = _interopRequireDefault(_FunctionController);
    var _NumberControllerBox = __webpack_require__(13);
    var _NumberControllerBox2 = _interopRequireDefault(_NumberControllerBox);
    var _NumberControllerSlider = __webpack_require__(14);
    var _NumberControllerSlider2 = _interopRequireDefault(_NumberControllerSlider);
    var _ColorController = __webpack_require__(16);
    var _ColorController2 = _interopRequireDefault(_ColorController);
    var _requestAnimationFrame = __webpack_require__(21);
    var _requestAnimationFrame2 = _interopRequireDefault(_requestAnimationFrame);
    var _CenteredDiv = __webpack_require__(22);
    var _CenteredDiv2 = _interopRequireDefault(_CenteredDiv);
    var _dom = __webpack_require__(9);
    var _dom2 = _interopRequireDefault(_dom);
    var _common = __webpack_require__(5);
    var _common2 = _interopRequireDefault(_common);
    var _style = __webpack_require__(23);
    var _style2 = _interopRequireDefault(_style);
    function _interopRequireDefault(obj) {
      return obj && obj.__esModule ? obj : {default: obj};
    }
    _css2.default.inject(_style2.default);
    var CSS_NAMESPACE = 'dg';
    var HIDE_KEY_CODE = 72;
    var CLOSE_BUTTON_HEIGHT = 20;
    var DEFAULT_DEFAULT_PRESET_NAME = 'Default';
    var SUPPORTS_LOCAL_STORAGE = function() {
      try {
        return 'localStorage' in window && window.localStorage !== null;
      } catch (e) {
        return false;
      }
    }();
    var SAVE_DIALOGUE = void 0;
    var autoPlaceVirgin = true;
    var autoPlaceContainer = void 0;
    var hide = false;
    var hideableGuis = [];
    var GUI = function GUI(pars) {
      var _this = this;
      var params = pars || {};
      this.domElement = document.createElement('div');
      this.__ul = document.createElement('ul');
      this.domElement.appendChild(this.__ul);
      _dom2.default.addClass(this.domElement, CSS_NAMESPACE);
      this.__folders = {};
      this.__controllers = [];
      this.__rememberedObjects = [];
      this.__rememberedObjectIndecesToControllers = [];
      this.__listening = [];
      params = _common2.default.defaults(params, {
        closeOnTop: false,
        autoPlace: true,
        width: GUI.DEFAULT_WIDTH
      });
      params = _common2.default.defaults(params, {
        resizable: params.autoPlace,
        hideable: params.autoPlace
      });
      if (!_common2.default.isUndefined(params.load)) {
        if (params.preset) {
          params.load.preset = params.preset;
        }
      } else {
        params.load = {preset: DEFAULT_DEFAULT_PRESET_NAME};
      }
      if (_common2.default.isUndefined(params.parent) && params.hideable) {
        hideableGuis.push(this);
      }
      params.resizable = _common2.default.isUndefined(params.parent) && params.resizable;
      if (params.autoPlace && _common2.default.isUndefined(params.scrollable)) {
        params.scrollable = true;
      }
      var useLocalStorage = SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true';
      var saveToLocalStorage = void 0;
      Object.defineProperties(this, {
        parent: {get: function get() {
            return params.parent;
          }},
        scrollable: {get: function get() {
            return params.scrollable;
          }},
        autoPlace: {get: function get() {
            return params.autoPlace;
          }},
        closeOnTop: {get: function get() {
            return params.closeOnTop;
          }},
        preset: {
          get: function get() {
            if (_this.parent) {
              return _this.getRoot().preset;
            }
            return params.load.preset;
          },
          set: function set(v) {
            if (_this.parent) {
              _this.getRoot().preset = v;
            } else {
              params.load.preset = v;
            }
            setPresetSelectIndex(this);
            _this.revert();
          }
        },
        width: {
          get: function get() {
            return params.width;
          },
          set: function set(v) {
            params.width = v;
            setWidth(_this, v);
          }
        },
        name: {
          get: function get() {
            return params.name;
          },
          set: function set(v) {
            params.name = v;
            if (titleRowName) {
              titleRowName.innerHTML = params.name;
            }
          }
        },
        closed: {
          get: function get() {
            return params.closed;
          },
          set: function set(v) {
            params.closed = v;
            if (params.closed) {
              _dom2.default.addClass(_this.__ul, GUI.CLASS_CLOSED);
            } else {
              _dom2.default.removeClass(_this.__ul, GUI.CLASS_CLOSED);
            }
            this.onResize();
            if (_this.__closeButton) {
              _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED;
            }
          }
        },
        load: {get: function get() {
            return params.load;
          }},
        useLocalStorage: {
          get: function get() {
            return useLocalStorage;
          },
          set: function set(bool) {
            if (SUPPORTS_LOCAL_STORAGE) {
              useLocalStorage = bool;
              if (bool) {
                _dom2.default.bind(window, 'unload', saveToLocalStorage);
              } else {
                _dom2.default.unbind(window, 'unload', saveToLocalStorage);
              }
              localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool);
            }
          }
        }
      });
      if (_common2.default.isUndefined(params.parent)) {
        params.closed = false;
        _dom2.default.addClass(this.domElement, GUI.CLASS_MAIN);
        _dom2.default.makeSelectable(this.domElement, false);
        if (SUPPORTS_LOCAL_STORAGE) {
          if (useLocalStorage) {
            _this.useLocalStorage = true;
            var savedGui = localStorage.getItem(getLocalStorageHash(this, 'gui'));
            if (savedGui) {
              params.load = JSON.parse(savedGui);
            }
          }
        }
        this.__closeButton = document.createElement('div');
        this.__closeButton.innerHTML = GUI.TEXT_CLOSED;
        _dom2.default.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON);
        if (params.closeOnTop) {
          _dom2.default.addClass(this.__closeButton, GUI.CLASS_CLOSE_TOP);
          this.domElement.insertBefore(this.__closeButton, this.domElement.childNodes[0]);
        } else {
          _dom2.default.addClass(this.__closeButton, GUI.CLASS_CLOSE_BOTTOM);
          this.domElement.appendChild(this.__closeButton);
        }
        _dom2.default.bind(this.__closeButton, 'click', function() {
          _this.closed = !_this.closed;
        });
      } else {
        if (params.closed === undefined) {
          params.closed = true;
        }
        var _titleRowName = document.createTextNode(params.name);
        _dom2.default.addClass(_titleRowName, 'controller-name');
        var titleRow = addRow(_this, _titleRowName);
        var onClickTitle = function onClickTitle(e) {
          e.preventDefault();
          _this.closed = !_this.closed;
          return false;
        };
        _dom2.default.addClass(this.__ul, GUI.CLASS_CLOSED);
        _dom2.default.addClass(titleRow, 'title');
        _dom2.default.bind(titleRow, 'click', onClickTitle);
        if (!params.closed) {
          this.closed = false;
        }
      }
      if (params.autoPlace) {
        if (_common2.default.isUndefined(params.parent)) {
          if (autoPlaceVirgin) {
            autoPlaceContainer = document.createElement('div');
            _dom2.default.addClass(autoPlaceContainer, CSS_NAMESPACE);
            _dom2.default.addClass(autoPlaceContainer, GUI.CLASS_AUTO_PLACE_CONTAINER);
            document.body.appendChild(autoPlaceContainer);
            autoPlaceVirgin = false;
          }
          autoPlaceContainer.appendChild(this.domElement);
          _dom2.default.addClass(this.domElement, GUI.CLASS_AUTO_PLACE);
        }
        if (!this.parent) {
          setWidth(_this, params.width);
        }
      }
      this.__resizeHandler = function() {
        _this.onResizeDebounced();
      };
      _dom2.default.bind(window, 'resize', this.__resizeHandler);
      _dom2.default.bind(this.__ul, 'webkitTransitionEnd', this.__resizeHandler);
      _dom2.default.bind(this.__ul, 'transitionend', this.__resizeHandler);
      _dom2.default.bind(this.__ul, 'oTransitionEnd', this.__resizeHandler);
      this.onResize();
      if (params.resizable) {
        addResizeHandle(this);
      }
      saveToLocalStorage = function saveToLocalStorage() {
        if (SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(_this, 'isLocal')) === 'true') {
          localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject()));
        }
      };
      this.saveToLocalStorageIfPossible = saveToLocalStorage;
      function resetWidth() {
        var root = _this.getRoot();
        root.width += 1;
        _common2.default.defer(function() {
          root.width -= 1;
        });
      }
      if (!params.parent) {
        resetWidth();
      }
    };
    GUI.toggleHide = function() {
      hide = !hide;
      _common2.default.each(hideableGuis, function(gui) {
        gui.domElement.style.display = hide ? 'none' : '';
      });
    };
    GUI.CLASS_AUTO_PLACE = 'a';
    GUI.CLASS_AUTO_PLACE_CONTAINER = 'ac';
    GUI.CLASS_MAIN = 'main';
    GUI.CLASS_CONTROLLER_ROW = 'cr';
    GUI.CLASS_TOO_TALL = 'taller-than-window';
    GUI.CLASS_CLOSED = 'closed';
    GUI.CLASS_CLOSE_BUTTON = 'close-button';
    GUI.CLASS_CLOSE_TOP = 'close-top';
    GUI.CLASS_CLOSE_BOTTOM = 'close-bottom';
    GUI.CLASS_DRAG = 'drag';
    GUI.DEFAULT_WIDTH = 245;
    GUI.TEXT_CLOSED = 'Close Controls';
    GUI.TEXT_OPEN = 'Open Controls';
    GUI._keydownHandler = function(e) {
      if (document.activeElement.type !== 'text' && (e.which === HIDE_KEY_CODE || e.keyCode === HIDE_KEY_CODE)) {
        GUI.toggleHide();
      }
    };
    _dom2.default.bind(window, 'keydown', GUI._keydownHandler, false);
    _common2.default.extend(GUI.prototype, {
      add: function add(object, property) {
        return _add(this, object, property, {factoryArgs: Array.prototype.slice.call(arguments, 2)});
      },
      addColor: function addColor(object, property) {
        return _add(this, object, property, {color: true});
      },
      remove: function remove(controller) {
        this.__ul.removeChild(controller.__li);
        this.__controllers.splice(this.__controllers.indexOf(controller), 1);
        var _this = this;
        _common2.default.defer(function() {
          _this.onResize();
        });
      },
      destroy: function destroy() {
        if (this.autoPlace) {
          autoPlaceContainer.removeChild(this.domElement);
        }
        _dom2.default.unbind(window, 'keydown', GUI._keydownHandler, false);
        _dom2.default.unbind(window, 'resize', this.__resizeHandler);
        if (this.saveToLocalStorageIfPossible) {
          _dom2.default.unbind(window, 'unload', this.saveToLocalStorageIfPossible);
        }
      },
      addFolder: function addFolder(name) {
        if (this.__folders[name] !== undefined) {
          throw new Error('You already have a folder in this GUI by the' + ' name "' + name + '"');
        }
        var newGuiParams = {
          name: name,
          parent: this
        };
        newGuiParams.autoPlace = this.autoPlace;
        if (this.load && this.load.folders && this.load.folders[name]) {
          newGuiParams.closed = this.load.folders[name].closed;
          newGuiParams.load = this.load.folders[name];
        }
        var gui = new GUI(newGuiParams);
        this.__folders[name] = gui;
        var li = addRow(this, gui.domElement);
        _dom2.default.addClass(li, 'folder');
        return gui;
      },
      open: function open() {
        this.closed = false;
      },
      close: function close() {
        this.closed = true;
      },
      onResize: function onResize() {
        var root = this.getRoot();
        if (root.scrollable) {
          var top = _dom2.default.getOffset(root.__ul).top;
          var h = 0;
          _common2.default.each(root.__ul.childNodes, function(node) {
            if (!(root.autoPlace && node === root.__save_row)) {
              h += _dom2.default.getHeight(node);
            }
          });
          if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) {
            _dom2.default.addClass(root.domElement, GUI.CLASS_TOO_TALL);
            root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px';
          } else {
            _dom2.default.removeClass(root.domElement, GUI.CLASS_TOO_TALL);
            root.__ul.style.height = 'auto';
          }
        }
        if (root.__resize_handle) {
          _common2.default.defer(function() {
            root.__resize_handle.style.height = root.__ul.offsetHeight + 'px';
          });
        }
        if (root.__closeButton) {
          root.__closeButton.style.width = root.width + 'px';
        }
      },
      onResizeDebounced: _common2.default.debounce(function() {
        this.onResize();
      }, 50),
      remember: function remember() {
        if (_common2.default.isUndefined(SAVE_DIALOGUE)) {
          SAVE_DIALOGUE = new _CenteredDiv2.default();
          SAVE_DIALOGUE.domElement.innerHTML = _saveDialogue2.default;
        }
        if (this.parent) {
          throw new Error('You can only call remember on a top level GUI.');
        }
        var _this = this;
        _common2.default.each(Array.prototype.slice.call(arguments), function(object) {
          if (_this.__rememberedObjects.length === 0) {
            addSaveMenu(_this);
          }
          if (_this.__rememberedObjects.indexOf(object) === -1) {
            _this.__rememberedObjects.push(object);
          }
        });
        if (this.autoPlace) {
          setWidth(this, this.width);
        }
      },
      getRoot: function getRoot() {
        var gui = this;
        while (gui.parent) {
          gui = gui.parent;
        }
        return gui;
      },
      getSaveObject: function getSaveObject() {
        var toReturn = this.load;
        toReturn.closed = this.closed;
        if (this.__rememberedObjects.length > 0) {
          toReturn.preset = this.preset;
          if (!toReturn.remembered) {
            toReturn.remembered = {};
          }
          toReturn.remembered[this.preset] = getCurrentPreset(this);
        }
        toReturn.folders = {};
        _common2.default.each(this.__folders, function(element, key) {
          toReturn.folders[key] = element.getSaveObject();
        });
        return toReturn;
      },
      save: function save() {
        if (!this.load.remembered) {
          this.load.remembered = {};
        }
        this.load.remembered[this.preset] = getCurrentPreset(this);
        markPresetModified(this, false);
        this.saveToLocalStorageIfPossible();
      },
      saveAs: function saveAs(presetName) {
        if (!this.load.remembered) {
          this.load.remembered = {};
          this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true);
        }
        this.load.remembered[presetName] = getCurrentPreset(this);
        this.preset = presetName;
        addPresetOption(this, presetName, true);
        this.saveToLocalStorageIfPossible();
      },
      revert: function revert(gui) {
        _common2.default.each(this.__controllers, function(controller) {
          if (!this.getRoot().load.remembered) {
            controller.setValue(controller.initialValue);
          } else {
            recallSavedValue(gui || this.getRoot(), controller);
          }
          if (controller.__onFinishChange) {
            controller.__onFinishChange.call(controller, controller.getValue());
          }
        }, this);
        _common2.default.each(this.__folders, function(folder) {
          folder.revert(folder);
        });
        if (!gui) {
          markPresetModified(this.getRoot(), false);
        }
      },
      listen: function listen(controller) {
        var init = this.__listening.length === 0;
        this.__listening.push(controller);
        if (init) {
          updateDisplays(this.__listening);
        }
      },
      updateDisplay: function updateDisplay() {
        _common2.default.each(this.__controllers, function(controller) {
          controller.updateDisplay();
        });
        _common2.default.each(this.__folders, function(folder) {
          folder.updateDisplay();
        });
      }
    });
    function addRow(gui, newDom, liBefore) {
      var li = document.createElement('li');
      if (newDom) {
        li.appendChild(newDom);
      }
      if (liBefore) {
        gui.__ul.insertBefore(li, liBefore);
      } else {
        gui.__ul.appendChild(li);
      }
      gui.onResize();
      return li;
    }
    function markPresetModified(gui, modified) {
      var opt = gui.__preset_select[gui.__preset_select.selectedIndex];
      if (modified) {
        opt.innerHTML = opt.value + '*';
      } else {
        opt.innerHTML = opt.value;
      }
    }
    function augmentController(gui, li, controller) {
      controller.__li = li;
      controller.__gui = gui;
      _common2.default.extend(controller, {
        options: function options(_options) {
          if (arguments.length > 1) {
            var nextSibling = controller.__li.nextElementSibling;
            controller.remove();
            return _add(gui, controller.object, controller.property, {
              before: nextSibling,
              factoryArgs: [_common2.default.toArray(arguments)]
            });
          }
          if (_common2.default.isArray(_options) || _common2.default.isObject(_options)) {
            var _nextSibling = controller.__li.nextElementSibling;
            controller.remove();
            return _add(gui, controller.object, controller.property, {
              before: _nextSibling,
              factoryArgs: [_options]
            });
          }
        },
        name: function name(v) {
          controller.__li.firstElementChild.firstElementChild.innerHTML = v;
          return controller;
        },
        listen: function listen() {
          controller.__gui.listen(controller);
          return controller;
        },
        remove: function remove() {
          controller.__gui.remove(controller);
          return controller;
        }
      });
      if (controller instanceof _NumberControllerSlider2.default) {
        var box = new _NumberControllerBox2.default(controller.object, controller.property, {
          min: controller.__min,
          max: controller.__max,
          step: controller.__step
        });
        _common2.default.each(['updateDisplay', 'onChange', 'onFinishChange', 'step'], function(method) {
          var pc = controller[method];
          var pb = box[method];
          controller[method] = box[method] = function() {
            var args = Array.prototype.slice.call(arguments);
            pb.apply(box, args);
            return pc.apply(controller, args);
          };
        });
        _dom2.default.addClass(li, 'has-slider');
        controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild);
      } else if (controller instanceof _NumberControllerBox2.default) {
        var r = function r(returned) {
          if (_common2.default.isNumber(controller.__min) && _common2.default.isNumber(controller.__max)) {
            var oldName = controller.__li.firstElementChild.firstElementChild.innerHTML;
            var wasListening = controller.__gui.__listening.indexOf(controller) > -1;
            controller.remove();
            var newController = _add(gui, controller.object, controller.property, {
              before: controller.__li.nextElementSibling,
              factoryArgs: [controller.__min, controller.__max, controller.__step]
            });
            newController.name(oldName);
            if (wasListening)
              newController.listen();
            return newController;
          }
          return returned;
        };
        controller.min = _common2.default.compose(r, controller.min);
        controller.max = _common2.default.compose(r, controller.max);
      } else if (controller instanceof _BooleanController2.default) {
        _dom2.default.bind(li, 'click', function() {
          _dom2.default.fakeEvent(controller.__checkbox, 'click');
        });
        _dom2.default.bind(controller.__checkbox, 'click', function(e) {
          e.stopPropagation();
        });
      } else if (controller instanceof _FunctionController2.default) {
        _dom2.default.bind(li, 'click', function() {
          _dom2.default.fakeEvent(controller.__button, 'click');
        });
        _dom2.default.bind(li, 'mouseover', function() {
          _dom2.default.addClass(controller.__button, 'hover');
        });
        _dom2.default.bind(li, 'mouseout', function() {
          _dom2.default.removeClass(controller.__button, 'hover');
        });
      } else if (controller instanceof _ColorController2.default) {
        _dom2.default.addClass(li, 'color');
        controller.updateDisplay = _common2.default.compose(function(val) {
          li.style.borderLeftColor = controller.__color.toString();
          return val;
        }, controller.updateDisplay);
        controller.updateDisplay();
      }
      controller.setValue = _common2.default.compose(function(val) {
        if (gui.getRoot().__preset_select && controller.isModified()) {
          markPresetModified(gui.getRoot(), true);
        }
        return val;
      }, controller.setValue);
    }
    function recallSavedValue(gui, controller) {
      var root = gui.getRoot();
      var matchedIndex = root.__rememberedObjects.indexOf(controller.object);
      if (matchedIndex !== -1) {
        var controllerMap = root.__rememberedObjectIndecesToControllers[matchedIndex];
        if (controllerMap === undefined) {
          controllerMap = {};
          root.__rememberedObjectIndecesToControllers[matchedIndex] = controllerMap;
        }
        controllerMap[controller.property] = controller;
        if (root.load && root.load.remembered) {
          var presetMap = root.load.remembered;
          var preset = void 0;
          if (presetMap[gui.preset]) {
            preset = presetMap[gui.preset];
          } else if (presetMap[DEFAULT_DEFAULT_PRESET_NAME]) {
            preset = presetMap[DEFAULT_DEFAULT_PRESET_NAME];
          } else {
            return;
          }
          if (preset[matchedIndex] && preset[matchedIndex][controller.property] !== undefined) {
            var value = preset[matchedIndex][controller.property];
            controller.initialValue = value;
            controller.setValue(value);
          }
        }
      }
    }
    function _add(gui, object, property, params) {
      if (object[property] === undefined) {
        throw new Error('Object "' + object + '" has no property "' + property + '"');
      }
      var controller = void 0;
      if (params.color) {
        controller = new _ColorController2.default(object, property);
      } else {
        var factoryArgs = [object, property].concat(params.factoryArgs);
        controller = _ControllerFactory2.default.apply(gui, factoryArgs);
      }
      if (params.before instanceof _Controller2.default) {
        params.before = params.before.__li;
      }
      recallSavedValue(gui, controller);
      _dom2.default.addClass(controller.domElement, 'c');
      var name = document.createElement('span');
      _dom2.default.addClass(name, 'property-name');
      name.innerHTML = controller.property;
      var container = document.createElement('div');
      container.appendChild(name);
      container.appendChild(controller.domElement);
      var li = addRow(gui, container, params.before);
      _dom2.default.addClass(li, GUI.CLASS_CONTROLLER_ROW);
      if (controller instanceof _ColorController2.default) {
        _dom2.default.addClass(li, 'color');
      } else {
        _dom2.default.addClass(li, _typeof(controller.getValue()));
      }
      augmentController(gui, li, controller);
      gui.__controllers.push(controller);
      return controller;
    }
    function getLocalStorageHash(gui, key) {
      return document.location.href + '.' + key;
    }
    function addPresetOption(gui, name, setSelected) {
      var opt = document.createElement('option');
      opt.innerHTML = name;
      opt.value = name;
      gui.__preset_select.appendChild(opt);
      if (setSelected) {
        gui.__preset_select.selectedIndex = gui.__preset_select.length - 1;
      }
    }
    function showHideExplain(gui, explain) {
      explain.style.display = gui.useLocalStorage ? 'block' : 'none';
    }
    function addSaveMenu(gui) {
      var div = gui.__save_row = document.createElement('li');
      _dom2.default.addClass(gui.domElement, 'has-save');
      gui.__ul.insertBefore(div, gui.__ul.firstChild);
      _dom2.default.addClass(div, 'save-row');
      var gears = document.createElement('span');
      gears.innerHTML = '&nbsp;';
      _dom2.default.addClass(gears, 'button gears');
      var button = document.createElement('span');
      button.innerHTML = 'Save';
      _dom2.default.addClass(button, 'button');
      _dom2.default.addClass(button, 'save');
      var button2 = document.createElement('span');
      button2.innerHTML = 'New';
      _dom2.default.addClass(button2, 'button');
      _dom2.default.addClass(button2, 'save-as');
      var button3 = document.createElement('span');
      button3.innerHTML = 'Revert';
      _dom2.default.addClass(button3, 'button');
      _dom2.default.addClass(button3, 'revert');
      var select = gui.__preset_select = document.createElement('select');
      if (gui.load && gui.load.remembered) {
        _common2.default.each(gui.load.remembered, function(value, key) {
          addPresetOption(gui, key, key === gui.preset);
        });
      } else {
        addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false);
      }
      _dom2.default.bind(select, 'change', function() {
        for (var index = 0; index < gui.__preset_select.length; index++) {
          gui.__preset_select[index].innerHTML = gui.__preset_select[index].value;
        }
        gui.preset = this.value;
      });
      div.appendChild(select);
      div.appendChild(gears);
      div.appendChild(button);
      div.appendChild(button2);
      div.appendChild(button3);
      if (SUPPORTS_LOCAL_STORAGE) {
        var explain = document.getElementById('dg-local-explain');
        var localStorageCheckBox = document.getElementById('dg-local-storage');
        var saveLocally = document.getElementById('dg-save-locally');
        saveLocally.style.display = 'block';
        if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') {
          localStorageCheckBox.setAttribute('checked', 'checked');
        }
        showHideExplain(gui, explain);
        _dom2.default.bind(localStorageCheckBox, 'change', function() {
          gui.useLocalStorage = !gui.useLocalStorage;
          showHideExplain(gui, explain);
        });
      }
      var newConstructorTextArea = document.getElementById('dg-new-constructor');
      _dom2.default.bind(newConstructorTextArea, 'keydown', function(e) {
        if (e.metaKey && (e.which === 67 || e.keyCode === 67)) {
          SAVE_DIALOGUE.hide();
        }
      });
      _dom2.default.bind(gears, 'click', function() {
        newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2);
        SAVE_DIALOGUE.show();
        newConstructorTextArea.focus();
        newConstructorTextArea.select();
      });
      _dom2.default.bind(button, 'click', function() {
        gui.save();
      });
      _dom2.default.bind(button2, 'click', function() {
        var presetName = prompt('Enter a new preset name.');
        if (presetName) {
          gui.saveAs(presetName);
        }
      });
      _dom2.default.bind(button3, 'click', function() {
        gui.revert();
      });
    }
    function addResizeHandle(gui) {
      var pmouseX = void 0;
      gui.__resize_handle = document.createElement('div');
      _common2.default.extend(gui.__resize_handle.style, {
        width: '6px',
        marginLeft: '-3px',
        height: '200px',
        cursor: 'ew-resize',
        position: 'absolute'
      });
      function drag(e) {
        e.preventDefault();
        gui.width += pmouseX - e.clientX;
        gui.onResize();
        pmouseX = e.clientX;
        return false;
      }
      function dragStop() {
        _dom2.default.removeClass(gui.__closeButton, GUI.CLASS_DRAG);
        _dom2.default.unbind(window, 'mousemove', drag);
        _dom2.default.unbind(window, 'mouseup', dragStop);
      }
      function dragStart(e) {
        e.preventDefault();
        pmouseX = e.clientX;
        _dom2.default.addClass(gui.__closeButton, GUI.CLASS_DRAG);
        _dom2.default.bind(window, 'mousemove', drag);
        _dom2.default.bind(window, 'mouseup', dragStop);
        return false;
      }
      _dom2.default.bind(gui.__resize_handle, 'mousedown', dragStart);
      _dom2.default.bind(gui.__closeButton, 'mousedown', dragStart);
      gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild);
    }
    function setWidth(gui, w) {
      gui.domElement.style.width = w + 'px';
      if (gui.__save_row && gui.autoPlace) {
        gui.__save_row.style.width = w + 'px';
      }
      if (gui.__closeButton) {
        gui.__closeButton.style.width = w + 'px';
      }
    }
    function getCurrentPreset(gui, useInitialValues) {
      var toReturn = {};
      _common2.default.each(gui.__rememberedObjects, function(val, index) {
        var savedValues = {};
        var controllerMap = gui.__rememberedObjectIndecesToControllers[index];
        _common2.default.each(controllerMap, function(controller, property) {
          savedValues[property] = useInitialValues ? controller.initialValue : controller.getValue();
        });
        toReturn[index] = savedValues;
      });
      return toReturn;
    }
    function setPresetSelectIndex(gui) {
      for (var index = 0; index < gui.__preset_select.length; index++) {
        if (gui.__preset_select[index].value === gui.preset) {
          gui.__preset_select.selectedIndex = index;
        }
      }
    }
    function updateDisplays(controllerArray) {
      if (controllerArray.length !== 0) {
        _requestAnimationFrame2.default.call(window, function() {
          updateDisplays(controllerArray);
        });
      }
      _common2.default.each(controllerArray, function(c) {
        c.updateDisplay();
      });
    }
    exports.default = GUI;
    module.exports = exports['default'];
  }, function(module, exports) {
    'use strict';
    module.exports = {
      load: function load(url, indoc) {
        var doc = indoc || document;
        var link = doc.createElement('link');
        link.type = 'text/css';
        link.rel = 'stylesheet';
        link.href = url;
        doc.getElementsByTagName('head')[0].appendChild(link);
      },
      inject: function inject(css, indoc) {
        var doc = indoc || document;
        var injected = document.createElement('style');
        injected.type = 'text/css';
        injected.innerHTML = css;
        var head = doc.getElementsByTagName('head')[0];
        try {
          head.appendChild(injected);
        } catch (e) {}
      }
    };
  }, function(module, exports) {
    module.exports = "<div id=\"dg-save\" class=\"dg dialogue\">\n\n  Here's the new load parameter for your <code>GUI</code>'s constructor:\n\n  <textarea id=\"dg-new-constructor\"></textarea>\n\n  <div id=\"dg-save-locally\">\n\n    <input id=\"dg-local-storage\" type=\"checkbox\"/> Automatically save\n    values to <code>localStorage</code> on exit.\n\n    <div id=\"dg-local-explain\">The values saved to <code>localStorage</code> will\n      override those passed to <code>dat.GUI</code>'s constructor. This makes it\n      easier to work incrementally, but <code>localStorage</code> is fragile,\n      and your friends may not see the same values you do.\n\n    </div>\n\n  </div>\n\n</div>";
  }, function(module, exports, __webpack_require__) {
    'use strict';
    exports.__esModule = true;
    var _OptionController = __webpack_require__(10);
    var _OptionController2 = _interopRequireDefault(_OptionController);
    var _NumberControllerBox = __webpack_require__(13);
    var _NumberControllerBox2 = _interopRequireDefault(_NumberControllerBox);
    var _NumberControllerSlider = __webpack_require__(14);
    var _NumberControllerSlider2 = _interopRequireDefault(_NumberControllerSlider);
    var _StringController = __webpack_require__(11);
    var _StringController2 = _interopRequireDefault(_StringController);
    var _FunctionController = __webpack_require__(15);
    var _FunctionController2 = _interopRequireDefault(_FunctionController);
    var _BooleanController = __webpack_require__(8);
    var _BooleanController2 = _interopRequireDefault(_BooleanController);
    var _common = __webpack_require__(5);
    var _common2 = _interopRequireDefault(_common);
    function _interopRequireDefault(obj) {
      return obj && obj.__esModule ? obj : {default: obj};
    }
    var ControllerFactory = function ControllerFactory(object, property) {
      var initialValue = object[property];
      if (_common2.default.isArray(arguments[2]) || _common2.default.isObject(arguments[2])) {
        return new _OptionController2.default(object, property, arguments[2]);
      }
      if (_common2.default.isNumber(initialValue)) {
        if (_common2.default.isNumber(arguments[2]) && _common2.default.isNumber(arguments[3])) {
          if (_common2.default.isNumber(arguments[4])) {
            return new _NumberControllerSlider2.default(object, property, arguments[2], arguments[3], arguments[4]);
          }
          return new _NumberControllerSlider2.default(object, property, arguments[2], arguments[3]);
        }
        if (_common2.default.isNumber(arguments[4])) {
          return new _NumberControllerBox2.default(object, property, {
            min: arguments[2],
            max: arguments[3],
            step: arguments[4]
          });
        }
        return new _NumberControllerBox2.default(object, property, {
          min: arguments[2],
          max: arguments[3]
        });
      }
      if (_common2.default.isString(initialValue)) {
        return new _StringController2.default(object, property);
      }
      if (_common2.default.isFunction(initialValue)) {
        return new _FunctionController2.default(object, property, '');
      }
      if (_common2.default.isBoolean(initialValue)) {
        return new _BooleanController2.default(object, property);
      }
      return null;
    };
    exports.default = ControllerFactory;
    module.exports = exports['default'];
  }, function(module, exports) {
    "use strict";
    exports.__esModule = true;
    function requestAnimationFrame(callback) {
      setTimeout(callback, 1000 / 60);
    }
    exports.default = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || requestAnimationFrame;
    module.exports = exports["default"];
  }, function(module, exports, __webpack_require__) {
    'use strict';
    exports.__esModule = true;
    var _dom = __webpack_require__(9);
    var _dom2 = _interopRequireDefault(_dom);
    var _common = __webpack_require__(5);
    var _common2 = _interopRequireDefault(_common);
    function _interopRequireDefault(obj) {
      return obj && obj.__esModule ? obj : {default: obj};
    }
    function _classCallCheck(instance, Constructor) {
      if (!(instance instanceof Constructor)) {
        throw new TypeError("Cannot call a class as a function");
      }
    }
    var CenteredDiv = function() {
      function CenteredDiv() {
        _classCallCheck(this, CenteredDiv);
        this.backgroundElement = document.createElement('div');
        _common2.default.extend(this.backgroundElement.style, {
          backgroundColor: 'rgba(0,0,0,0.8)',
          top: 0,
          left: 0,
          display: 'none',
          zIndex: '1000',
          opacity: 0,
          WebkitTransition: 'opacity 0.2s linear',
          transition: 'opacity 0.2s linear'
        });
        _dom2.default.makeFullscreen(this.backgroundElement);
        this.backgroundElement.style.position = 'fixed';
        this.domElement = document.createElement('div');
        _common2.default.extend(this.domElement.style, {
          position: 'fixed',
          display: 'none',
          zIndex: '1001',
          opacity: 0,
          WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear',
          transition: 'transform 0.2s ease-out, opacity 0.2s linear'
        });
        document.body.appendChild(this.backgroundElement);
        document.body.appendChild(this.domElement);
        var _this = this;
        _dom2.default.bind(this.backgroundElement, 'click', function() {
          _this.hide();
        });
      }
      CenteredDiv.prototype.show = function show() {
        var _this = this;
        this.backgroundElement.style.display = 'block';
        this.domElement.style.display = 'block';
        this.domElement.style.opacity = 0;
        this.domElement.style.webkitTransform = 'scale(1.1)';
        this.layout();
        _common2.default.defer(function() {
          _this.backgroundElement.style.opacity = 1;
          _this.domElement.style.opacity = 1;
          _this.domElement.style.webkitTransform = 'scale(1)';
        });
      };
      CenteredDiv.prototype.hide = function hide() {
        var _this = this;
        var hide = function hide() {
          _this.domElement.style.display = 'none';
          _this.backgroundElement.style.display = 'none';
          _dom2.default.unbind(_this.domElement, 'webkitTransitionEnd', hide);
          _dom2.default.unbind(_this.domElement, 'transitionend', hide);
          _dom2.default.unbind(_this.domElement, 'oTransitionEnd', hide);
        };
        _dom2.default.bind(this.domElement, 'webkitTransitionEnd', hide);
        _dom2.default.bind(this.domElement, 'transitionend', hide);
        _dom2.default.bind(this.domElement, 'oTransitionEnd', hide);
        this.backgroundElement.style.opacity = 0;
        this.domElement.style.opacity = 0;
        this.domElement.style.webkitTransform = 'scale(1.1)';
      };
      CenteredDiv.prototype.layout = function layout() {
        this.domElement.style.left = window.innerWidth / 2 - _dom2.default.getWidth(this.domElement) / 2 + 'px';
        this.domElement.style.top = window.innerHeight / 2 - _dom2.default.getHeight(this.domElement) / 2 + 'px';
      };
      return CenteredDiv;
    }();
    exports.default = CenteredDiv;
    module.exports = exports['default'];
  }, function(module, exports, __webpack_require__) {
    exports = module.exports = __webpack_require__(24)();
    exports.push([module.id, ".dg {\n  /** Clear list styles */\n  /* Auto-place container */\n  /* Auto-placed GUI's */\n  /* Line items that don't contain folders. */\n  /** Folder names */\n  /** Hides closed items */\n  /** Controller row */\n  /** Name-half (left) */\n  /** Controller-half (right) */\n  /** Controller placement */\n  /** Shorter number boxes when slider is present. */\n  /** Ensure the entire boolean and function row shows a hand */\n  /** allow overflow for color selector */ }\n  .dg ul {\n    list-style: none;\n    margin: 0;\n    padding: 0;\n    width: 100%;\n    clear: both; }\n  .dg.ac {\n    position: fixed;\n    top: 0;\n    left: 0;\n    right: 0;\n    height: 0;\n    z-index: 0; }\n  .dg:not(.ac) .main {\n    /** Exclude mains in ac so that we don't hide close button */\n    overflow: hidden; }\n  .dg.main {\n    -webkit-transition: opacity 0.1s linear;\n    -o-transition: opacity 0.1s linear;\n    -moz-transition: opacity 0.1s linear;\n    transition: opacity 0.1s linear; }\n    .dg.main.taller-than-window {\n      overflow-y: auto; }\n      .dg.main.taller-than-window .close-button {\n        opacity: 1;\n        /* TODO, these are style notes */\n        margin-top: -1px;\n        border-top: 1px solid #2c2c2c; }\n    .dg.main ul.closed .close-button {\n      opacity: 1 !important; }\n    .dg.main:hover .close-button,\n    .dg.main .close-button.drag {\n      opacity: 1; }\n    .dg.main .close-button {\n      /*opacity: 0;*/\n      -webkit-transition: opacity 0.1s linear;\n      -o-transition: opacity 0.1s linear;\n      -moz-transition: opacity 0.1s linear;\n      transition: opacity 0.1s linear;\n      border: 0;\n      line-height: 19px;\n      height: 20px;\n      /* TODO, these are style notes */\n      cursor: pointer;\n      text-align: center;\n      background-color: #000; }\n      .dg.main .close-button.close-top {\n        position: relative; }\n      .dg.main .close-button.close-bottom {\n        position: absolute; }\n      .dg.main .close-button:hover {\n        background-color: #111; }\n  .dg.a {\n    float: right;\n    margin-right: 15px;\n    overflow-y: visible; }\n    .dg.a.has-save > ul.close-top {\n      margin-top: 0; }\n    .dg.a.has-save > ul.close-bottom {\n      margin-top: 27px; }\n    .dg.a.has-save > ul.closed {\n      margin-top: 0; }\n    .dg.a .save-row {\n      top: 0;\n      z-index: 1002; }\n      .dg.a .save-row.close-top {\n        position: relative; }\n      .dg.a .save-row.close-bottom {\n        position: fixed; }\n  .dg li {\n    -webkit-transition: height 0.1s ease-out;\n    -o-transition: height 0.1s ease-out;\n    -moz-transition: height 0.1s ease-out;\n    transition: height 0.1s ease-out;\n    -webkit-transition: overflow 0.1s linear;\n    -o-transition: overflow 0.1s linear;\n    -moz-transition: overflow 0.1s linear;\n    transition: overflow 0.1s linear; }\n  .dg li:not(.folder) {\n    cursor: auto;\n    height: 27px;\n    line-height: 27px;\n    padding: 0 4px 0 5px; }\n  .dg li.folder {\n    padding: 0;\n    border-left: 4px solid transparent; }\n  .dg li.title {\n    cursor: pointer;\n    margin-left: -4px; }\n  .dg .closed li:not(.title),\n  .dg .closed ul li,\n  .dg .closed ul li > * {\n    height: 0;\n    overflow: hidden;\n    border: 0; }\n  .dg .cr {\n    clear: both;\n    padding-left: 3px;\n    height: 27px;\n    overflow: hidden; }\n  .dg .property-name {\n    cursor: default;\n    float: left;\n    clear: left;\n    width: 40%;\n    overflow: hidden;\n    text-overflow: ellipsis; }\n  .dg .c {\n    float: left;\n    width: 60%;\n    position: relative; }\n  .dg .c input[type=text] {\n    border: 0;\n    margin-top: 4px;\n    padding: 3px;\n    width: 100%;\n    float: right; }\n  .dg .has-slider input[type=text] {\n    width: 30%;\n    /*display: none;*/\n    margin-left: 0; }\n  .dg .slider {\n    float: left;\n    width: 66%;\n    margin-left: -5px;\n    margin-right: 0;\n    height: 19px;\n    margin-top: 4px; }\n  .dg .slider-fg {\n    height: 100%; }\n  .dg .c input[type=checkbox] {\n    margin-top: 7px; }\n  .dg .c select {\n    margin-top: 5px; }\n  .dg .cr.function,\n  .dg .cr.function .property-name,\n  .dg .cr.function *,\n  .dg .cr.boolean,\n  .dg .cr.boolean * {\n    cursor: pointer; }\n  .dg .cr.color {\n    overflow: visible; }\n  .dg .selector {\n    display: none;\n    position: absolute;\n    margin-left: -9px;\n    margin-top: 23px;\n    z-index: 10; }\n  .dg .c:hover .selector,\n  .dg .selector.drag {\n    display: block; }\n  .dg li.save-row {\n    padding: 0; }\n    .dg li.save-row .button {\n      display: inline-block;\n      padding: 0px 6px; }\n  .dg.dialogue {\n    background-color: #222;\n    width: 460px;\n    padding: 15px;\n    font-size: 13px;\n    line-height: 15px; }\n\n/* TODO Separate style and structure */\n#dg-new-constructor {\n  padding: 10px;\n  color: #222;\n  font-family: Monaco, monospace;\n  font-size: 10px;\n  border: 0;\n  resize: none;\n  box-shadow: inset 1px 1px 1px #888;\n  word-wrap: break-word;\n  margin: 12px 0;\n  display: block;\n  width: 440px;\n  overflow-y: scroll;\n  height: 100px;\n  position: relative; }\n\n#dg-local-explain {\n  display: none;\n  font-size: 11px;\n  line-height: 17px;\n  border-radius: 3px;\n  background-color: #333;\n  padding: 8px;\n  margin-top: 10px; }\n  #dg-local-explain code {\n    font-size: 10px; }\n\n#dat-gui-save-locally {\n  display: none; }\n\n/** Main type */\n.dg {\n  color: #eee;\n  font: 11px 'Lucida Grande', sans-serif;\n  text-shadow: 0 -1px 0 #111;\n  /** Auto place */\n  /* Controller row, <li> */\n  /** Controllers */ }\n  .dg.main {\n    /** Scrollbar */ }\n    .dg.main::-webkit-scrollbar {\n      width: 5px;\n      background: #1a1a1a; }\n    .dg.main::-webkit-scrollbar-corner {\n      height: 0;\n      display: none; }\n    .dg.main::-webkit-scrollbar-thumb {\n      border-radius: 5px;\n      background: #676767; }\n  .dg li:not(.folder) {\n    background: #1a1a1a;\n    border-bottom: 1px solid #2c2c2c; }\n  .dg li.save-row {\n    line-height: 25px;\n    background: #dad5cb;\n    border: 0; }\n    .dg li.save-row select {\n      margin-left: 5px;\n      width: 108px; }\n    .dg li.save-row .button {\n      margin-left: 5px;\n      margin-top: 1px;\n      border-radius: 2px;\n      font-size: 9px;\n      line-height: 7px;\n      padding: 4px 4px 5px 4px;\n      background: #c5bdad;\n      color: #fff;\n      text-shadow: 0 1px 0 #b0a58f;\n      box-shadow: 0 -1px 0 #b0a58f;\n      cursor: pointer; }\n      .dg li.save-row .button.gears {\n        background: #c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;\n        height: 7px;\n        width: 8px; }\n      .dg li.save-row .button:hover {\n        background-color: #bab19e;\n        box-shadow: 0 -1px 0 #b0a58f; }\n  .dg li.folder {\n    border-bottom: 0; }\n  .dg li.title {\n    padding-left: 16px;\n    background: #000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;\n    cursor: pointer;\n    border-bottom: 1px solid rgba(255, 255, 255, 0.2); }\n  .dg .closed li.title {\n    background-image: url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==); }\n  .dg .cr.boolean {\n    border-left: 3px solid #806787; }\n  .dg .cr.color {\n    border-left: 3px solid; }\n  .dg .cr.function {\n    border-left: 3px solid #e61d5f; }\n  .dg .cr.number {\n    border-left: 3px solid #2FA1D6; }\n    .dg .cr.number input[type=text] {\n      color: #2FA1D6; }\n  .dg .cr.string {\n    border-left: 3px solid #1ed36f; }\n    .dg .cr.string input[type=text] {\n      color: #1ed36f; }\n  .dg .cr.function:hover, .dg .cr.boolean:hover {\n    background: #111; }\n  .dg .c input[type=text] {\n    background: #303030;\n    outline: none; }\n    .dg .c input[type=text]:hover {\n      background: #3c3c3c; }\n    .dg .c input[type=text]:focus {\n      background: #494949;\n      color: #fff; }\n  .dg .c .slider {\n    background: #303030;\n    cursor: ew-resize; }\n  .dg .c .slider-fg {\n    background: #2FA1D6;\n    max-width: 100%; }\n  .dg .c .slider:hover {\n    background: #3c3c3c; }\n    .dg .c .slider:hover .slider-fg {\n      background: #44abda; }\n", ""]);
  }, function(module, exports) {
    module.exports = function() {
      var list = [];
      list.toString = function toString() {
        var result = [];
        for (var i = 0; i < this.length; i++) {
          var item = this[i];
          if (item[2]) {
            result.push("@media " + item[2] + "{" + item[1] + "}");
          } else {
            result.push(item[1]);
          }
        }
        return result.join("");
      };
      list.i = function(modules, mediaQuery) {
        if (typeof modules === "string")
          modules = [[null, modules, ""]];
        var alreadyImportedModules = {};
        for (var i = 0; i < this.length; i++) {
          var id = this[i][0];
          if (typeof id === "number")
            alreadyImportedModules[id] = true;
        }
        for (i = 0; i < modules.length; i++) {
          var item = modules[i];
          if (typeof item[0] !== "number" || !alreadyImportedModules[item[0]]) {
            if (mediaQuery && !item[2]) {
              item[2] = mediaQuery;
            } else if (mediaQuery) {
              item[2] = "(" + item[2] + ") and (" + mediaQuery + ")";
            }
            list.push(item);
          }
        }
      };
      return list;
    };
  }]);
});
;

})();
$__System.register('16', ['15', '17', 'b'], function (_export) {
	var dat, parameters, _Object$keys, gui;

	return {
		setters: [function (_) {
			dat = _;
		}, function (_2) {
			parameters = _2['default'];
		}, function (_b) {
			_Object$keys = _b['default'];
		}],
		execute: function () {
			'use strict';

			gui = {};

			_export('gui', gui);

			gui.gone = false;
			gui.go = function () {
				_export('gui', gui = new dat.gui.GUI());
				gui.remember(parameters);
				_Object$keys(parameters).forEach(function (keyRoot) {
					var folder = gui.addFolder(keyRoot);
					var keys = _Object$keys(parameters[keyRoot]);
					if (keys.length > 0) {
						keys.forEach(function (key) {
							var param = parameters[keyRoot][key];
							var item = folder.add(parameters[keyRoot], key);
							var type = typeof param;
							if (type == 'number') {
								item.step(0.01);
							}
						});
					} else {}
					folder.open();
				});
				gui.close();
				gui.gone = true;
			};
		}
	};
});

$__System.registerDynamic('18', ['10'], true, function ($__require, exports, module) {
  var global = this || self,
      GLOBAL = global;
  /* */
  var $ = $__require('10');
  module.exports = function create(P, D) {
    return $.create(P, D);
  };
});
$__System.registerDynamic("19", ["18"], true, function ($__require, exports, module) {
  var global = this || self,
      GLOBAL = global;
  /* */
  module.exports = { "default": $__require("18"), __esModule: true };
});
$__System.registerDynamic('1a', ['10'], true, function ($__require, exports, module) {
  var global = this || self,
      GLOBAL = global;
  /* */
  var $ = $__require('10');
  module.exports = function defineProperties(T, D) {
    return $.setDescs(T, D);
  };
});
$__System.registerDynamic("1b", ["1a"], true, function ($__require, exports, module) {
  var global = this || self,
      GLOBAL = global;
  /* */
  module.exports = { "default": $__require("1a"), __esModule: true };
});
$__System.register('1c', ['3', '19', '1b'], function (_export) {
		var THREE, _Object$create, _Object$defineProperties, OrbitControls;

		return {
				setters: [function (_2) {
						THREE = _2;
				}, function (_) {
						_Object$create = _['default'];
				}, function (_b) {
						_Object$defineProperties = _b['default'];
				}],
				execute: function () {
						/**
       * @author qiao / https://github.com/qiao
       * @author mrdoob / http://mrdoob.com
       * @author alteredq / http://alteredqualia.com/
       * @author WestLangley / http://github.com/WestLangley
       * @author erich666 / http://erichaines.com
       */

						// This set of controls performs orbiting, dollying (zooming), and panning.
						// Unlike TrackballControls, it maintains the "up" direction object.up (+Y by default).
						//
						//    Orbit - left mouse / touch: one finger move
						//    Zoom - middle mouse, or mousewheel / touch: two finger spread or squish
						//    Pan - right mouse, or arrow keys / touch: three finger swipe

						'use strict';

						OrbitControls = function OrbitControls(object, domElement) {

								this.object = object;

								this.domElement = domElement !== undefined ? domElement : document;

								// Set to false to disable this control
								this.enabled = true;

								// "target" sets the location of focus, where the object orbits around
								this.target = new THREE.Vector3();

								// How far you can dolly in and out ( PerspectiveCamera only )
								this.minDistance = 0;
								this.maxDistance = Infinity;

								// How far you can zoom in and out ( OrthographicCamera only )
								this.minZoom = 0;
								this.maxZoom = Infinity;

								// How far you can orbit vertically, upper and lower limits.
								// Range is 0 to Math.PI radians.
								this.minPolarAngle = 0; // radians
								this.maxPolarAngle = Math.PI; // radians

								// How far you can orbit horizontally, upper and lower limits.
								// If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].
								this.minAzimuthAngle = -Infinity; // radians
								this.maxAzimuthAngle = Infinity; // radians

								// Set to true to enable damping (inertia)
								// If damping is enabled, you must call controls.update() in your animation loop
								this.enableDamping = false;
								this.dampingFactor = 0.25;

								// This option actually enables dollying in and out; left as "zoom" for backwards compatibility.
								// Set to false to disable zooming
								this.enableZoom = true;
								this.zoomSpeed = 1.0;

								// Set to false to disable rotating
								this.enableRotate = true;
								this.rotateSpeed = 1.0;

								// Set to false to disable panning
								this.enablePan = true;
								this.keyPanSpeed = 7.0; // pixels moved per arrow key push

								// Set to true to automatically rotate around the target
								// If auto-rotate is enabled, you must call controls.update() in your animation loop
								this.autoRotate = false;
								this.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60

								// Set to false to disable use of the keys
								this.enableKeys = true;

								// The four arrow keys
								this.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };

								// Mouse buttons
								this.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT };

								// for reset
								this.target0 = this.target.clone();
								this.position0 = this.object.position.clone();
								this.zoom0 = this.object.zoom;

								//
								// public methods
								//

								this.getPolarAngle = function () {

										return spherical.phi;
								};

								this.getAzimuthalAngle = function () {

										return spherical.theta;
								};

								this.reset = function () {

										scope.target.copy(scope.target0);
										scope.object.position.copy(scope.position0);
										scope.object.zoom = scope.zoom0;

										scope.object.updateProjectionMatrix();
										scope.dispatchEvent(changeEvent);

										scope.update();

										state = STATE.NONE;
								};

								// this method is exposed, but perhaps it would be better if we can make it private...
								this.update = (function () {

										var offset = new THREE.Vector3();

										// so camera.up is the orbit axis
										var quat = new THREE.Quaternion().setFromUnitVectors(object.up, new THREE.Vector3(0, 1, 0));
										var quatInverse = quat.clone().inverse();

										var lastPosition = new THREE.Vector3();
										var lastQuaternion = new THREE.Quaternion();

										return function update() {

												var position = scope.object.position;

												offset.copy(position).sub(scope.target);

												// rotate offset to "y-axis-is-up" space
												offset.applyQuaternion(quat);

												// angle from z-axis around y-axis
												spherical.setFromVector3(offset);

												if (scope.autoRotate && state === STATE.NONE) {

														rotateLeft(getAutoRotationAngle());
												}

												spherical.theta += sphericalDelta.theta;
												spherical.phi += sphericalDelta.phi;

												// restrict theta to be between desired limits
												spherical.theta = Math.max(scope.minAzimuthAngle, Math.min(scope.maxAzimuthAngle, spherical.theta));

												// restrict phi to be between desired limits
												spherical.phi = Math.max(scope.minPolarAngle, Math.min(scope.maxPolarAngle, spherical.phi));

												spherical.makeSafe();

												spherical.radius *= scale;

												// restrict radius to be between desired limits
												spherical.radius = Math.max(scope.minDistance, Math.min(scope.maxDistance, spherical.radius));

												// move target to panned location
												scope.target.add(panOffset);

												offset.setFromSpherical(spherical);

												// rotate offset back to "camera-up-vector-is-up" space
												offset.applyQuaternion(quatInverse);

												position.copy(scope.target).add(offset);

												scope.object.lookAt(scope.target);

												if (scope.enableDamping === true) {

														sphericalDelta.theta *= 1 - scope.dampingFactor;
														sphericalDelta.phi *= 1 - scope.dampingFactor;
												} else {

														sphericalDelta.set(0, 0, 0);
												}

												scale = 1;
												panOffset.set(0, 0, 0);

												// update condition is:
												// min(camera displacement, camera rotation in radians)^2 > EPS
												// using small-angle approximation cos(x/2) = 1 - x^2 / 8

												if (zoomChanged || lastPosition.distanceToSquared(scope.object.position) > EPS || 8 * (1 - lastQuaternion.dot(scope.object.quaternion)) > EPS) {

														scope.dispatchEvent(changeEvent);

														lastPosition.copy(scope.object.position);
														lastQuaternion.copy(scope.object.quaternion);
														zoomChanged = false;

														return true;
												}

												return false;
										};
								})();

								this.dispose = function () {

										scope.domElement.removeEventListener('contextmenu', onContextMenu, false);
										scope.domElement.removeEventListener('mousedown', onMouseDown, false);
										scope.domElement.removeEventListener('wheel', onMouseWheel, false);

										scope.domElement.removeEventListener('touchstart', onTouchStart, false);
										scope.domElement.removeEventListener('touchend', onTouchEnd, false);
										scope.domElement.removeEventListener('touchmove', onTouchMove, false);

										document.removeEventListener('mousemove', onMouseMove, false);
										document.removeEventListener('mouseup', onMouseUp, false);

										// window.removeEventListener( 'keydown', onKeyDown, false );

										//scope.dispatchEvent( { type: 'dispose' } ); // should this be added here?
								};

								//
								// internals
								//

								var scope = this;

								var changeEvent = { type: 'change' };
								var startEvent = { type: 'start' };
								var endEvent = { type: 'end' };

								var STATE = { NONE: -1, ROTATE: 0, DOLLY: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_DOLLY: 4, TOUCH_PAN: 5 };

								var state = STATE.NONE;

								var EPS = 0.000001;

								// current position in spherical coordinates
								var spherical = new THREE.Spherical();
								var sphericalDelta = new THREE.Spherical();

								var scale = 1;
								var panOffset = new THREE.Vector3();
								var zoomChanged = false;

								var rotateStart = new THREE.Vector2();
								var rotateEnd = new THREE.Vector2();
								var rotateDelta = new THREE.Vector2();

								var panStart = new THREE.Vector2();
								var panEnd = new THREE.Vector2();
								var panDelta = new THREE.Vector2();

								var dollyStart = new THREE.Vector2();
								var dollyEnd = new THREE.Vector2();
								var dollyDelta = new THREE.Vector2();

								function getAutoRotationAngle() {

										return 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;
								}

								function getZoomScale() {

										return Math.pow(0.95, scope.zoomSpeed);
								}

								function rotateLeft(angle) {

										sphericalDelta.theta -= angle;
								}

								function rotateUp(angle) {

										sphericalDelta.phi -= angle;
								}

								var panLeft = (function () {

										var v = new THREE.Vector3();

										return function panLeft(distance, objectMatrix) {

												v.setFromMatrixColumn(objectMatrix, 0); // get X column of objectMatrix
												v.multiplyScalar(-distance);

												panOffset.add(v);
										};
								})();

								var panUp = (function () {

										var v = new THREE.Vector3();

										return function panUp(distance, objectMatrix) {

												v.setFromMatrixColumn(objectMatrix, 1); // get Y column of objectMatrix
												v.multiplyScalar(distance);

												panOffset.add(v);
										};
								})();

								// deltaX and deltaY are in pixels; right and down are positive
								var pan = (function () {

										var offset = new THREE.Vector3();

										return function pan(deltaX, deltaY) {

												var element = scope.domElement === document ? scope.domElement.body : scope.domElement;

												if (scope.object instanceof THREE.PerspectiveCamera) {

														// perspective
														var position = scope.object.position;
														offset.copy(position).sub(scope.target);
														var targetDistance = offset.length();

														// half of the fov is center to top of screen
														targetDistance *= Math.tan(scope.object.fov / 2 * Math.PI / 180.0);

														// we actually don't use screenWidth, since perspective camera is fixed to screen height
														panLeft(2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix);
														panUp(2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix);
												} else if (scope.object instanceof THREE.OrthographicCamera) {

														// orthographic
														panLeft(deltaX * (scope.object.right - scope.object.left) / scope.object.zoom / element.clientWidth, scope.object.matrix);
														panUp(deltaY * (scope.object.top - scope.object.bottom) / scope.object.zoom / element.clientHeight, scope.object.matrix);
												} else {

														// camera neither orthographic nor perspective
														console.warn('WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.');
														scope.enablePan = false;
												}
										};
								})();

								function dollyIn(dollyScale) {

										if (scope.object instanceof THREE.PerspectiveCamera) {

												scale /= dollyScale;
										} else if (scope.object instanceof THREE.OrthographicCamera) {

												scope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom * dollyScale));
												scope.object.updateProjectionMatrix();
												zoomChanged = true;
										} else {

												console.warn('WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.');
												scope.enableZoom = false;
										}
								}

								function dollyOut(dollyScale) {

										if (scope.object instanceof THREE.PerspectiveCamera) {

												scale *= dollyScale;
										} else if (scope.object instanceof THREE.OrthographicCamera) {

												scope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom / dollyScale));
												scope.object.updateProjectionMatrix();
												zoomChanged = true;
										} else {

												console.warn('WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.');
												scope.enableZoom = false;
										}
								}

								//
								// event callbacks - update the object state
								//

								function handleMouseDownRotate(event) {

										//console.log( 'handleMouseDownRotate' );

										rotateStart.set(event.clientX, event.clientY);
								}

								function handleMouseDownDolly(event) {

										//console.log( 'handleMouseDownDolly' );

										dollyStart.set(event.clientX, event.clientY);
								}

								function handleMouseDownPan(event) {

										//console.log( 'handleMouseDownPan' );

										panStart.set(event.clientX, event.clientY);
								}

								function handleMouseMoveRotate(event) {

										//console.log( 'handleMouseMoveRotate' );

										rotateEnd.set(event.clientX, event.clientY);
										rotateDelta.subVectors(rotateEnd, rotateStart);

										var element = scope.domElement === document ? scope.domElement.body : scope.domElement;

										// rotating across whole screen goes 360 degrees around
										rotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed);

										// rotating up and down along whole screen attempts to go 360, but limited to 180
										rotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed);

										rotateStart.copy(rotateEnd);

										scope.update();
								}

								function handleMouseMoveDolly(event) {

										//console.log( 'handleMouseMoveDolly' );

										dollyEnd.set(event.clientX, event.clientY);

										dollyDelta.subVectors(dollyEnd, dollyStart);

										if (dollyDelta.y > 0) {

												dollyIn(getZoomScale());
										} else if (dollyDelta.y < 0) {

												dollyOut(getZoomScale());
										}

										dollyStart.copy(dollyEnd);

										scope.update();
								}

								function handleMouseMovePan(event) {

										//console.log( 'handleMouseMovePan' );

										panEnd.set(event.clientX, event.clientY);

										panDelta.subVectors(panEnd, panStart);

										pan(panDelta.x, panDelta.y);

										panStart.copy(panEnd);

										scope.update();
								}

								function handleMouseUp(event) {

										// console.log( 'handleMouseUp' );

								}

								function handleMouseWheel(event) {

										// console.log( 'handleMouseWheel' );

										if (event.deltaY < 0) {

												dollyOut(getZoomScale());
										} else if (event.deltaY > 0) {

												dollyIn(getZoomScale());
										}

										scope.update();
								}

								function handleKeyDown(event) {

										//console.log( 'handleKeyDown' );

										switch (event.keyCode) {

												case scope.keys.UP:
														pan(0, scope.keyPanSpeed);
														scope.update();
														break;

												case scope.keys.BOTTOM:
														pan(0, -scope.keyPanSpeed);
														scope.update();
														break;

												case scope.keys.LEFT:
														pan(scope.keyPanSpeed, 0);
														scope.update();
														break;

												case scope.keys.RIGHT:
														pan(-scope.keyPanSpeed, 0);
														scope.update();
														break;

										}
								}

								function handleTouchStartRotate(event) {

										//console.log( 'handleTouchStartRotate' );

										rotateStart.set(event.touches[0].pageX, event.touches[0].pageY);
								}

								function handleTouchStartDolly(event) {

										//console.log( 'handleTouchStartDolly' );

										var dx = event.touches[0].pageX - event.touches[1].pageX;
										var dy = event.touches[0].pageY - event.touches[1].pageY;

										var distance = Math.sqrt(dx * dx + dy * dy);

										dollyStart.set(0, distance);
								}

								function handleTouchStartPan(event) {

										//console.log( 'handleTouchStartPan' );

										panStart.set(event.touches[0].pageX, event.touches[0].pageY);
								}

								function handleTouchMoveRotate(event) {

										//console.log( 'handleTouchMoveRotate' );

										rotateEnd.set(event.touches[0].pageX, event.touches[0].pageY);
										rotateDelta.subVectors(rotateEnd, rotateStart);

										var element = scope.domElement === document ? scope.domElement.body : scope.domElement;

										// rotating across whole screen goes 360 degrees around
										rotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed);

										// rotating up and down along whole screen attempts to go 360, but limited to 180
										rotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed);

										rotateStart.copy(rotateEnd);

										scope.update();
								}

								function handleTouchMoveDolly(event) {

										//console.log( 'handleTouchMoveDolly' );

										var dx = event.touches[0].pageX - event.touches[1].pageX;
										var dy = event.touches[0].pageY - event.touches[1].pageY;

										var distance = Math.sqrt(dx * dx + dy * dy);

										dollyEnd.set(0, distance);

										dollyDelta.subVectors(dollyEnd, dollyStart);

										if (dollyDelta.y > 0) {

												dollyOut(getZoomScale());
										} else if (dollyDelta.y < 0) {

												dollyIn(getZoomScale());
										}

										dollyStart.copy(dollyEnd);

										scope.update();
								}

								function handleTouchMovePan(event) {

										//console.log( 'handleTouchMovePan' );

										panEnd.set(event.touches[0].pageX, event.touches[0].pageY);

										panDelta.subVectors(panEnd, panStart);

										pan(panDelta.x, panDelta.y);

										panStart.copy(panEnd);

										scope.update();
								}

								function handleTouchEnd(event) {}

								//console.log( 'handleTouchEnd' );

								//
								// event handlers - FSM: listen for events and reset state
								//

								function onMouseDown(event) {

										if (scope.enabled === false) return;

										event.preventDefault();

										if (event.button === scope.mouseButtons.ORBIT) {

												if (scope.enableRotate === false) return;

												handleMouseDownRotate(event);

												state = STATE.ROTATE;
										} else if (event.button === scope.mouseButtons.ZOOM) {

												if (scope.enableZoom === false) return;

												handleMouseDownDolly(event);

												state = STATE.DOLLY;
										} else if (event.button === scope.mouseButtons.PAN) {

												if (scope.enablePan === false) return;

												handleMouseDownPan(event);

												state = STATE.PAN;
										}

										if (state !== STATE.NONE) {

												document.addEventListener('mousemove', onMouseMove, false);
												document.addEventListener('mouseup', onMouseUp, false);

												scope.dispatchEvent(startEvent);
										}
								}

								function onMouseMove(event) {

										if (scope.enabled === false) return;

										event.preventDefault();

										if (state === STATE.ROTATE) {

												if (scope.enableRotate === false) return;

												handleMouseMoveRotate(event);
										} else if (state === STATE.DOLLY) {

												if (scope.enableZoom === false) return;

												handleMouseMoveDolly(event);
										} else if (state === STATE.PAN) {

												if (scope.enablePan === false) return;

												handleMouseMovePan(event);
										}
								}

								function onMouseUp(event) {

										if (scope.enabled === false) return;

										handleMouseUp(event);

										document.removeEventListener('mousemove', onMouseMove, false);
										document.removeEventListener('mouseup', onMouseUp, false);

										scope.dispatchEvent(endEvent);

										state = STATE.NONE;
								}

								function onMouseWheel(event) {

										if (scope.enabled === false || scope.enableZoom === false || state !== STATE.NONE && state !== STATE.ROTATE) return;

										event.preventDefault();
										event.stopPropagation();

										handleMouseWheel(event);

										scope.dispatchEvent(startEvent); // not sure why these are here...
										scope.dispatchEvent(endEvent);
								}

								function onKeyDown(event) {

										if (scope.enabled === false || scope.enableKeys === false || scope.enablePan === false) return;

										handleKeyDown(event);
								}

								function onTouchStart(event) {

										if (scope.enabled === false) return;

										switch (event.touches.length) {

												case 1:
														// one-fingered touch: rotate

														if (scope.enableRotate === false) return;

														handleTouchStartRotate(event);

														state = STATE.TOUCH_ROTATE;

														break;

												case 2:
														// two-fingered touch: dolly

														if (scope.enableZoom === false) return;

														handleTouchStartDolly(event);

														state = STATE.TOUCH_DOLLY;

														break;

												case 3:
														// three-fingered touch: pan

														if (scope.enablePan === false) return;

														handleTouchStartPan(event);

														state = STATE.TOUCH_PAN;

														break;

												default:

														state = STATE.NONE;

										}

										if (state !== STATE.NONE) {

												scope.dispatchEvent(startEvent);
										}
								}

								function onTouchMove(event) {

										if (scope.enabled === false) return;

										event.preventDefault();
										event.stopPropagation();

										switch (event.touches.length) {

												case 1:
														// one-fingered touch: rotate

														if (scope.enableRotate === false) return;
														if (state !== STATE.TOUCH_ROTATE) return; // is this needed?...

														handleTouchMoveRotate(event);

														break;

												case 2:
														// two-fingered touch: dolly

														if (scope.enableZoom === false) return;
														if (state !== STATE.TOUCH_DOLLY) return; // is this needed?...

														handleTouchMoveDolly(event);

														break;

												case 3:
														// three-fingered touch: pan

														if (scope.enablePan === false) return;
														if (state !== STATE.TOUCH_PAN) return; // is this needed?...

														handleTouchMovePan(event);

														break;

												default:

														state = STATE.NONE;

										}
								}

								function onTouchEnd(event) {

										if (scope.enabled === false) return;

										handleTouchEnd(event);

										scope.dispatchEvent(endEvent);

										state = STATE.NONE;
								}

								function onContextMenu(event) {

										event.preventDefault();
								}

								//

								scope.domElement.addEventListener('contextmenu', onContextMenu, false);

								scope.domElement.addEventListener('mousedown', onMouseDown, false);
								scope.domElement.addEventListener('wheel', onMouseWheel, false);

								scope.domElement.addEventListener('touchstart', onTouchStart, false);
								scope.domElement.addEventListener('touchend', onTouchEnd, false);
								scope.domElement.addEventListener('touchmove', onTouchMove, false);

								// window.addEventListener( 'keydown', onKeyDown, false );

								// force an update at start

								this.update();
						};

						_export('OrbitControls', OrbitControls);

						OrbitControls.prototype = _Object$create(THREE.EventDispatcher.prototype);
						OrbitControls.prototype.constructor = OrbitControls;

						_Object$defineProperties(OrbitControls.prototype, {

								center: {

										get: function get() {

												console.warn('OrbitControls: .center has been renamed to .target');
												return this.target;
										}

								},

								// backward compatibility

								noZoom: {

										get: function get() {

												console.warn('OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.');
												return !this.enableZoom;
										},

										set: function set(value) {

												console.warn('OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.');
												this.enableZoom = !value;
										}

								},

								noRotate: {

										get: function get() {

												console.warn('OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.');
												return !this.enableRotate;
										},

										set: function set(value) {

												console.warn('OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.');
												this.enableRotate = !value;
										}

								},

								noPan: {

										get: function get() {

												console.warn('OrbitControls: .noPan has been deprecated. Use .enablePan instead.');
												return !this.enablePan;
										},

										set: function set(value) {

												console.warn('OrbitControls: .noPan has been deprecated. Use .enablePan instead.');
												this.enablePan = !value;
										}

								},

								noKeys: {

										get: function get() {

												console.warn('OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.');
												return !this.enableKeys;
										},

										set: function set(value) {

												console.warn('OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.');
												this.enableKeys = !value;
										}

								},

								staticMoving: {

										get: function get() {

												console.warn('OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.');
												return !this.enableDamping;
										},

										set: function set(value) {

												console.warn('OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.');
												this.enableDamping = !value;
										}

								},

								dynamicDampingFactor: {

										get: function get() {

												console.warn('OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.');
												return this.dampingFactor;
										},

										set: function set(value) {

												console.warn('OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.');
												this.dampingFactor = value;
										}

								}

						});
				}
		};
});

$__System.register("17", [], function (_export) {
	"use strict";

	return {
		setters: [],
		execute: function () {
			_export("default", {
				debug: {
					brighty: 0.8,
					bloomy: 0.8,
					range: .8,
					radius: .4,
					height: .001,
					thin: .001,
					blend: .6,
					rotationX: 0.19,
					rotationY: 0.35,
					rotationZ: 0.75,
					amplitude: 2,
					spice: 0.1,
					raydamping: 0.5,
					eyeoffset: 0.02,
					framedamping: 0.9,
					renderwidth: 3508,
					renderheight: 2480,
					renderdelay: 0
				}
			});
		}
	};
});

$__System.registerDynamic("10", [], true, function ($__require, exports, module) {
  var global = this || self,
      GLOBAL = global;
  /* */
  var $Object = Object;
  module.exports = {
    create: $Object.create,
    getProto: $Object.getPrototypeOf,
    isEnum: {}.propertyIsEnumerable,
    getDesc: $Object.getOwnPropertyDescriptor,
    setDesc: $Object.defineProperty,
    setDescs: $Object.defineProperties,
    getKeys: $Object.keys,
    getNames: $Object.getOwnPropertyNames,
    getSymbols: $Object.getOwnPropertySymbols,
    each: [].forEach
  };
});
$__System.registerDynamic("1d", [], true, function ($__require, exports, module) {
  var global = this || self,
      GLOBAL = global;
  /* */
  var toString = {}.toString;

  module.exports = function (it) {
    return toString.call(it).slice(8, -1);
  };
});
$__System.registerDynamic('1e', ['1d'], true, function ($__require, exports, module) {
  var global = this || self,
      GLOBAL = global;
  /* */
  var cof = $__require('1d');
  module.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {
    return cof(it) == 'String' ? it.split('') : Object(it);
  };
});
$__System.registerDynamic('1f', ['10', '20', '1e', '21'], true, function ($__require, exports, module) {
  var global = this || self,
      GLOBAL = global;
  /* */
  var $ = $__require('10'),
      toObject = $__require('20'),
      IObject = $__require('1e');
  module.exports = $__require('21')(function () {
    var a = Object.assign,
        A = {},
        B = {},
        S = Symbol(),
        K = 'abcdefghijklmnopqrst';
    A[S] = 7;
    K.split('').forEach(function (k) {
      B[k] = k;
    });
    return a({}, A)[S] != 7 || Object.keys(a({}, B)).join('') != K;
  }) ? function assign(target, source) {
    var T = toObject(target),
        $$ = arguments,
        $$len = $$.length,
        index = 1,
        getKeys = $.getKeys,
        getSymbols = $.getSymbols,
        isEnum = $.isEnum;
    while ($$len > index) {
      var S = IObject($$[index++]),
          keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S),
          length = keys.length,
          j = 0,
          key;
      while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key];
    }
    return T;
  } : Object.assign;
});
$__System.registerDynamic('22', ['23', '1f'], true, function ($__require, exports, module) {
  var global = this || self,
      GLOBAL = global;
  /* */
  var $export = $__require('23');
  $export($export.S + $export.F, 'Object', { assign: $__require('1f') });
});
$__System.registerDynamic('24', ['22', '25'], true, function ($__require, exports, module) {
  var global = this || self,
      GLOBAL = global;
  /* */
  $__require('22');
  module.exports = $__require('25').Object.assign;
});
$__System.registerDynamic("26", ["24"], true, function ($__require, exports, module) {
  var global = this || self,
      GLOBAL = global;
  /* */
  module.exports = { "default": $__require("24"), __esModule: true };
});
$__System.register("27", [], function (_export, _context) {
  "use strict";

  var __useDefault, animations, fonts, textures, geometries, shaders;

  return {
    setters: [],
    execute: function () {
      _export("__useDefault", __useDefault = true);

      _export("__useDefault", __useDefault);

      _export("animations", animations = "animation/scene.json");

      _export("animations", animations);

      _export("fonts", fonts = {});

      _export("fonts", fonts);

      _export("textures", textures = {});

      _export("textures", textures);

      _export("geometries", geometries = { "geo": { "file": "mesh/geo.ply" } });

      _export("geometries", geometries);

      _export("shaders", shaders = { "dust": { "vertexShader": "shader/particle/dust.vert", "fragmentShader": "shader/color.frag" }, "egg": { "vertexShader": "shader/mesh/egg.vert", "fragmentShader": "shader/mesh/egg.frag", "side": 2 }, "eggcrack": { "vertexShader": "shader/line/eggcrack.vert", "fragmentShader": "shader/color.frag", "side": 2 }, "curves": { "vertexShader": "shader/line/curves.vert", "fragmentShader": "shader/line/curves.frag", "side": 2 }, "text": { "vertexShader": "shader/mesh/text.vert", "fragmentShader": "shader/mesh/text.frag", "side": 2, "depthTest": false, "transparent": true }, "bright": { "vertexShader": "shader/filter/bloom/bright.vert", "fragmentShader": "shader/filter/bloom/bright.frag" }, "gaussian_blur": { "vertexShader": "shader/filter/bloom/gaussian_blur.vert", "fragmentShader": "shader/filter/bloom/gaussian_blur.frag" }, "bloom": { "vertexShader": "shader/filter/bloom/bloom.vert", "fragmentShader": "shader/filter/bloom/bloom.frag" }, "render": { "vertexShader": "shader/filter/fullscreen.vert", "fragmentShader": "shader/filter/render.frag" }, "edge": { "vertexShader": "shader/filter/fullscreen.vert", "fragmentShader": "shader/filter/edge.frag" } });

      _export("shaders", shaders);

      _export("default", {
        animations: animations,
        fonts: fonts,
        textures: textures,
        geometries: geometries,
        shaders: shaders
      });
    }
  };
});
(function() {
var define = $__System.amdDefine;
(function webpackUniversalModuleDefinition(root, factory) {
  if (typeof exports === 'object' && typeof module === 'object')
    module.exports = factory();
  else if (typeof define === 'function' && define.amd)
    define("28", [], factory);
  else {
    var a = factory();
    for (var i in a)
      (typeof exports === 'object' ? exports : root)[i] = a[i];
  }
})(this, function() {
  return (function(modules) {
    var installedModules = {};
    function __webpack_require__(moduleId) {
      if (installedModules[moduleId]) {
        return installedModules[moduleId].exports;
      }
      var module = installedModules[moduleId] = {
        i: moduleId,
        l: false,
        exports: {}
      };
      modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
      module.l = true;
      return module.exports;
    }
    __webpack_require__.m = modules;
    __webpack_require__.c = installedModules;
    __webpack_require__.d = function(exports, name, getter) {
      if (!__webpack_require__.o(exports, name)) {
        Object.defineProperty(exports, name, {
          configurable: false,
          enumerable: true,
          get: getter
        });
      }
    };
    __webpack_require__.n = function(module) {
      var getter = module && module.__esModule ? function getDefault() {
        return module['default'];
      } : function getModuleExports() {
        return module;
      };
      __webpack_require__.d(getter, 'a', getter);
      return getter;
    };
    __webpack_require__.o = function(object, property) {
      return Object.prototype.hasOwnProperty.call(object, property);
    };
    __webpack_require__.p = "";
    return __webpack_require__(__webpack_require__.s = 4);
  })([(function(module, exports, __webpack_require__) {
    "use strict";
    Object.defineProperty(exports, "__esModule", {value: true});
    exports.setMatrixArrayType = setMatrixArrayType;
    exports.toRadian = toRadian;
    exports.equals = equals;
    var EPSILON = exports.EPSILON = 0.000001;
    var ARRAY_TYPE = exports.ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array;
    var RANDOM = exports.RANDOM = Math.random;
    function setMatrixArrayType(type) {
      exports.ARRAY_TYPE = ARRAY_TYPE = type;
    }
    var degree = Math.PI / 180;
    function toRadian(a) {
      return a * degree;
    }
    function equals(a, b) {
      return Math.abs(a - b) <= EPSILON * Math.max(1.0, Math.abs(a), Math.abs(b));
    }
  }), (function(module, exports, __webpack_require__) {
    "use strict";
    Object.defineProperty(exports, "__esModule", {value: true});
    exports.sub = exports.mul = undefined;
    exports.create = create;
    exports.fromMat4 = fromMat4;
    exports.clone = clone;
    exports.copy = copy;
    exports.fromValues = fromValues;
    exports.set = set;
    exports.identity = identity;
    exports.transpose = transpose;
    exports.invert = invert;
    exports.adjoint = adjoint;
    exports.determinant = determinant;
    exports.multiply = multiply;
    exports.translate = translate;
    exports.rotate = rotate;
    exports.scale = scale;
    exports.fromTranslation = fromTranslation;
    exports.fromRotation = fromRotation;
    exports.fromScaling = fromScaling;
    exports.fromMat2d = fromMat2d;
    exports.fromQuat = fromQuat;
    exports.normalFromMat4 = normalFromMat4;
    exports.projection = projection;
    exports.str = str;
    exports.frob = frob;
    exports.add = add;
    exports.subtract = subtract;
    exports.multiplyScalar = multiplyScalar;
    exports.multiplyScalarAndAdd = multiplyScalarAndAdd;
    exports.exactEquals = exactEquals;
    exports.equals = equals;
    var _common = __webpack_require__(0);
    var glMatrix = _interopRequireWildcard(_common);
    function _interopRequireWildcard(obj) {
      if (obj && obj.__esModule) {
        return obj;
      } else {
        var newObj = {};
        if (obj != null) {
          for (var key in obj) {
            if (Object.prototype.hasOwnProperty.call(obj, key))
              newObj[key] = obj[key];
          }
        }
        newObj.default = obj;
        return newObj;
      }
    }
    function create() {
      var out = new glMatrix.ARRAY_TYPE(9);
      out[0] = 1;
      out[1] = 0;
      out[2] = 0;
      out[3] = 0;
      out[4] = 1;
      out[5] = 0;
      out[6] = 0;
      out[7] = 0;
      out[8] = 1;
      return out;
    }
    function fromMat4(out, a) {
      out[0] = a[0];
      out[1] = a[1];
      out[2] = a[2];
      out[3] = a[4];
      out[4] = a[5];
      out[5] = a[6];
      out[6] = a[8];
      out[7] = a[9];
      out[8] = a[10];
      return out;
    }
    function clone(a) {
      var out = new glMatrix.ARRAY_TYPE(9);
      out[0] = a[0];
      out[1] = a[1];
      out[2] = a[2];
      out[3] = a[3];
      out[4] = a[4];
      out[5] = a[5];
      out[6] = a[6];
      out[7] = a[7];
      out[8] = a[8];
      return out;
    }
    function copy(out, a) {
      out[0] = a[0];
      out[1] = a[1];
      out[2] = a[2];
      out[3] = a[3];
      out[4] = a[4];
      out[5] = a[5];
      out[6] = a[6];
      out[7] = a[7];
      out[8] = a[8];
      return out;
    }
    function fromValues(m00, m01, m02, m10, m11, m12, m20, m21, m22) {
      var out = new glMatrix.ARRAY_TYPE(9);
      out[0] = m00;
      out[1] = m01;
      out[2] = m02;
      out[3] = m10;
      out[4] = m11;
      out[5] = m12;
      out[6] = m20;
      out[7] = m21;
      out[8] = m22;
      return out;
    }
    function set(out, m00, m01, m02, m10, m11, m12, m20, m21, m22) {
      out[0] = m00;
      out[1] = m01;
      out[2] = m02;
      out[3] = m10;
      out[4] = m11;
      out[5] = m12;
      out[6] = m20;
      out[7] = m21;
      out[8] = m22;
      return out;
    }
    function identity(out) {
      out[0] = 1;
      out[1] = 0;
      out[2] = 0;
      out[3] = 0;
      out[4] = 1;
      out[5] = 0;
      out[6] = 0;
      out[7] = 0;
      out[8] = 1;
      return out;
    }
    function transpose(out, a) {
      if (out === a) {
        var a01 = a[1],
            a02 = a[2],
            a12 = a[5];
        out[1] = a[3];
        out[2] = a[6];
        out[3] = a01;
        out[5] = a[7];
        out[6] = a02;
        out[7] = a12;
      } else {
        out[0] = a[0];
        out[1] = a[3];
        out[2] = a[6];
        out[3] = a[1];
        out[4] = a[4];
        out[5] = a[7];
        out[6] = a[2];
        out[7] = a[5];
        out[8] = a[8];
      }
      return out;
    }
    function invert(out, a) {
      var a00 = a[0],
          a01 = a[1],
          a02 = a[2];
      var a10 = a[3],
          a11 = a[4],
          a12 = a[5];
      var a20 = a[6],
          a21 = a[7],
          a22 = a[8];
      var b01 = a22 * a11 - a12 * a21;
      var b11 = -a22 * a10 + a12 * a20;
      var b21 = a21 * a10 - a11 * a20;
      var det = a00 * b01 + a01 * b11 + a02 * b21;
      if (!det) {
        return null;
      }
      det = 1.0 / det;
      out[0] = b01 * det;
      out[1] = (-a22 * a01 + a02 * a21) * det;
      out[2] = (a12 * a01 - a02 * a11) * det;
      out[3] = b11 * det;
      out[4] = (a22 * a00 - a02 * a20) * det;
      out[5] = (-a12 * a00 + a02 * a10) * det;
      out[6] = b21 * det;
      out[7] = (-a21 * a00 + a01 * a20) * det;
      out[8] = (a11 * a00 - a01 * a10) * det;
      return out;
    }
    function adjoint(out, a) {
      var a00 = a[0],
          a01 = a[1],
          a02 = a[2];
      var a10 = a[3],
          a11 = a[4],
          a12 = a[5];
      var a20 = a[6],
          a21 = a[7],
          a22 = a[8];
      out[0] = a11 * a22 - a12 * a21;
      out[1] = a02 * a21 - a01 * a22;
      out[2] = a01 * a12 - a02 * a11;
      out[3] = a12 * a20 - a10 * a22;
      out[4] = a00 * a22 - a02 * a20;
      out[5] = a02 * a10 - a00 * a12;
      out[6] = a10 * a21 - a11 * a20;
      out[7] = a01 * a20 - a00 * a21;
      out[8] = a00 * a11 - a01 * a10;
      return out;
    }
    function determinant(a) {
      var a00 = a[0],
          a01 = a[1],
          a02 = a[2];
      var a10 = a[3],
          a11 = a[4],
          a12 = a[5];
      var a20 = a[6],
          a21 = a[7],
          a22 = a[8];
      return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20);
    }
    function multiply(out, a, b) {
      var a00 = a[0],
          a01 = a[1],
          a02 = a[2];
      var a10 = a[3],
          a11 = a[4],
          a12 = a[5];
      var a20 = a[6],
          a21 = a[7],
          a22 = a[8];
      var b00 = b[0],
          b01 = b[1],
          b02 = b[2];
      var b10 = b[3],
          b11 = b[4],
          b12 = b[5];
      var b20 = b[6],
          b21 = b[7],
          b22 = b[8];
      out[0] = b00 * a00 + b01 * a10 + b02 * a20;
      out[1] = b00 * a01 + b01 * a11 + b02 * a21;
      out[2] = b00 * a02 + b01 * a12 + b02 * a22;
      out[3] = b10 * a00 + b11 * a10 + b12 * a20;
      out[4] = b10 * a01 + b11 * a11 + b12 * a21;
      out[5] = b10 * a02 + b11 * a12 + b12 * a22;
      out[6] = b20 * a00 + b21 * a10 + b22 * a20;
      out[7] = b20 * a01 + b21 * a11 + b22 * a21;
      out[8] = b20 * a02 + b21 * a12 + b22 * a22;
      return out;
    }
    function translate(out, a, v) {
      var a00 = a[0],
          a01 = a[1],
          a02 = a[2],
          a10 = a[3],
          a11 = a[4],
          a12 = a[5],
          a20 = a[6],
          a21 = a[7],
          a22 = a[8],
          x = v[0],
          y = v[1];
      out[0] = a00;
      out[1] = a01;
      out[2] = a02;
      out[3] = a10;
      out[4] = a11;
      out[5] = a12;
      out[6] = x * a00 + y * a10 + a20;
      out[7] = x * a01 + y * a11 + a21;
      out[8] = x * a02 + y * a12 + a22;
      return out;
    }
    function rotate(out, a, rad) {
      var a00 = a[0],
          a01 = a[1],
          a02 = a[2],
          a10 = a[3],
          a11 = a[4],
          a12 = a[5],
          a20 = a[6],
          a21 = a[7],
          a22 = a[8],
          s = Math.sin(rad),
          c = Math.cos(rad);
      out[0] = c * a00 + s * a10;
      out[1] = c * a01 + s * a11;
      out[2] = c * a02 + s * a12;
      out[3] = c * a10 - s * a00;
      out[4] = c * a11 - s * a01;
      out[5] = c * a12 - s * a02;
      out[6] = a20;
      out[7] = a21;
      out[8] = a22;
      return out;
    }
    ;
    function scale(out, a, v) {
      var x = v[0],
          y = v[1];
      out[0] = x * a[0];
      out[1] = x * a[1];
      out[2] = x * a[2];
      out[3] = y * a[3];
      out[4] = y * a[4];
      out[5] = y * a[5];
      out[6] = a[6];
      out[7] = a[7];
      out[8] = a[8];
      return out;
    }
    function fromTranslation(out, v) {
      out[0] = 1;
      out[1] = 0;
      out[2] = 0;
      out[3] = 0;
      out[4] = 1;
      out[5] = 0;
      out[6] = v[0];
      out[7] = v[1];
      out[8] = 1;
      return out;
    }
    function fromRotation(out, rad) {
      var s = Math.sin(rad),
          c = Math.cos(rad);
      out[0] = c;
      out[1] = s;
      out[2] = 0;
      out[3] = -s;
      out[4] = c;
      out[5] = 0;
      out[6] = 0;
      out[7] = 0;
      out[8] = 1;
      return out;
    }
    function fromScaling(out, v) {
      out[0] = v[0];
      out[1] = 0;
      out[2] = 0;
      out[3] = 0;
      out[4] = v[1];
      out[5] = 0;
      out[6] = 0;
      out[7] = 0;
      out[8] = 1;
      return out;
    }
    function fromMat2d(out, a) {
      out[0] = a[0];
      out[1] = a[1];
      out[2] = 0;
      out[3] = a[2];
      out[4] = a[3];
      out[5] = 0;
      out[6] = a[4];
      out[7] = a[5];
      out[8] = 1;
      return out;
    }
    function fromQuat(out, q) {
      var x = q[0],
          y = q[1],
          z = q[2],
          w = q[3];
      var x2 = x + x;
      var y2 = y + y;
      var z2 = z + z;
      var xx = x * x2;
      var yx = y * x2;
      var yy = y * y2;
      var zx = z * x2;
      var zy = z * y2;
      var zz = z * z2;
      var wx = w * x2;
      var wy = w * y2;
      var wz = w * z2;
      out[0] = 1 - yy - zz;
      out[3] = yx - wz;
      out[6] = zx + wy;
      out[1] = yx + wz;
      out[4] = 1 - xx - zz;
      out[7] = zy - wx;
      out[2] = zx - wy;
      out[5] = zy + wx;
      out[8] = 1 - xx - yy;
      return out;
    }
    function normalFromMat4(out, a) {
      var a00 = a[0],
          a01 = a[1],
          a02 = a[2],
          a03 = a[3];
      var a10 = a[4],
          a11 = a[5],
          a12 = a[6],
          a13 = a[7];
      var a20 = a[8],
          a21 = a[9],
          a22 = a[10],
          a23 = a[11];
      var a30 = a[12],
          a31 = a[13],
          a32 = a[14],
          a33 = a[15];
      var b00 = a00 * a11 - a01 * a10;
      var b01 = a00 * a12 - a02 * a10;
      var b02 = a00 * a13 - a03 * a10;
      var b03 = a01 * a12 - a02 * a11;
      var b04 = a01 * a13 - a03 * a11;
      var b05 = a02 * a13 - a03 * a12;
      var b06 = a20 * a31 - a21 * a30;
      var b07 = a20 * a32 - a22 * a30;
      var b08 = a20 * a33 - a23 * a30;
      var b09 = a21 * a32 - a22 * a31;
      var b10 = a21 * a33 - a23 * a31;
      var b11 = a22 * a33 - a23 * a32;
      var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
      if (!det) {
        return null;
      }
      det = 1.0 / det;
      out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;
      out[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det;
      out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det;
      out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det;
      out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det;
      out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det;
      out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det;
      out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det;
      out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det;
      return out;
    }
    function projection(out, width, height) {
      out[0] = 2 / width;
      out[1] = 0;
      out[2] = 0;
      out[3] = 0;
      out[4] = -2 / height;
      out[5] = 0;
      out[6] = -1;
      out[7] = 1;
      out[8] = 1;
      return out;
    }
    function str(a) {
      return 'mat3(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ', ' + a[4] + ', ' + a[5] + ', ' + a[6] + ', ' + a[7] + ', ' + a[8] + ')';
    }
    function frob(a) {
      return Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2) + Math.pow(a[4], 2) + Math.pow(a[5], 2) + Math.pow(a[6], 2) + Math.pow(a[7], 2) + Math.pow(a[8], 2));
    }
    function add(out, a, b) {
      out[0] = a[0] + b[0];
      out[1] = a[1] + b[1];
      out[2] = a[2] + b[2];
      out[3] = a[3] + b[3];
      out[4] = a[4] + b[4];
      out[5] = a[5] + b[5];
      out[6] = a[6] + b[6];
      out[7] = a[7] + b[7];
      out[8] = a[8] + b[8];
      return out;
    }
    function subtract(out, a, b) {
      out[0] = a[0] - b[0];
      out[1] = a[1] - b[1];
      out[2] = a[2] - b[2];
      out[3] = a[3] - b[3];
      out[4] = a[4] - b[4];
      out[5] = a[5] - b[5];
      out[6] = a[6] - b[6];
      out[7] = a[7] - b[7];
      out[8] = a[8] - b[8];
      return out;
    }
    function multiplyScalar(out, a, b) {
      out[0] = a[0] * b;
      out[1] = a[1] * b;
      out[2] = a[2] * b;
      out[3] = a[3] * b;
      out[4] = a[4] * b;
      out[5] = a[5] * b;
      out[6] = a[6] * b;
      out[7] = a[7] * b;
      out[8] = a[8] * b;
      return out;
    }
    function multiplyScalarAndAdd(out, a, b, scale) {
      out[0] = a[0] + b[0] * scale;
      out[1] = a[1] + b[1] * scale;
      out[2] = a[2] + b[2] * scale;
      out[3] = a[3] + b[3] * scale;
      out[4] = a[4] + b[4] * scale;
      out[5] = a[5] + b[5] * scale;
      out[6] = a[6] + b[6] * scale;
      out[7] = a[7] + b[7] * scale;
      out[8] = a[8] + b[8] * scale;
      return out;
    }
    function exactEquals(a, b) {
      return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8];
    }
    function equals(a, b) {
      var a0 = a[0],
          a1 = a[1],
          a2 = a[2],
          a3 = a[3],
          a4 = a[4],
          a5 = a[5],
          a6 = a[6],
          a7 = a[7],
          a8 = a[8];
      var b0 = b[0],
          b1 = b[1],
          b2 = b[2],
          b3 = b[3],
          b4 = b[4],
          b5 = b[5],
          b6 = b[6],
          b7 = b[7],
          b8 = b[8];
      return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8));
    }
    var mul = exports.mul = multiply;
    var sub = exports.sub = subtract;
  }), (function(module, exports, __webpack_require__) {
    "use strict";
    Object.defineProperty(exports, "__esModule", {value: true});
    exports.forEach = exports.sqrLen = exports.len = exports.sqrDist = exports.dist = exports.div = exports.mul = exports.sub = undefined;
    exports.create = create;
    exports.clone = clone;
    exports.length = length;
    exports.fromValues = fromValues;
    exports.copy = copy;
    exports.set = set;
    exports.add = add;
    exports.subtract = subtract;
    exports.multiply = multiply;
    exports.divide = divide;
    exports.ceil = ceil;
    exports.floor = floor;
    exports.min = min;
    exports.max = max;
    exports.round = round;
    exports.scale = scale;
    exports.scaleAndAdd = scaleAndAdd;
    exports.distance = distance;
    exports.squaredDistance = squaredDistance;
    exports.squaredLength = squaredLength;
    exports.negate = negate;
    exports.inverse = inverse;
    exports.normalize = normalize;
    exports.dot = dot;
    exports.cross = cross;
    exports.lerp = lerp;
    exports.hermite = hermite;
    exports.bezier = bezier;
    exports.random = random;
    exports.transformMat4 = transformMat4;
    exports.transformMat3 = transformMat3;
    exports.transformQuat = transformQuat;
    exports.rotateX = rotateX;
    exports.rotateY = rotateY;
    exports.rotateZ = rotateZ;
    exports.angle = angle;
    exports.str = str;
    exports.exactEquals = exactEquals;
    exports.equals = equals;
    var _common = __webpack_require__(0);
    var glMatrix = _interopRequireWildcard(_common);
    function _interopRequireWildcard(obj) {
      if (obj && obj.__esModule) {
        return obj;
      } else {
        var newObj = {};
        if (obj != null) {
          for (var key in obj) {
            if (Object.prototype.hasOwnProperty.call(obj, key))
              newObj[key] = obj[key];
          }
        }
        newObj.default = obj;
        return newObj;
      }
    }
    function create() {
      var out = new glMatrix.ARRAY_TYPE(3);
      out[0] = 0;
      out[1] = 0;
      out[2] = 0;
      return out;
    }
    function clone(a) {
      var out = new glMatrix.ARRAY_TYPE(3);
      out[0] = a[0];
      out[1] = a[1];
      out[2] = a[2];
      return out;
    }
    function length(a) {
      var x = a[0];
      var y = a[1];
      var z = a[2];
      return Math.sqrt(x * x + y * y + z * z);
    }
    function fromValues(x, y, z) {
      var out = new glMatrix.ARRAY_TYPE(3);
      out[0] = x;
      out[1] = y;
      out[2] = z;
      return out;
    }
    function copy(out, a) {
      out[0] = a[0];
      out[1] = a[1];
      out[2] = a[2];
      return out;
    }
    function set(out, x, y, z) {
      out[0] = x;
      out[1] = y;
      out[2] = z;
      return out;
    }
    function add(out, a, b) {
      out[0] = a[0] + b[0];
      out[1] = a[1] + b[1];
      out[2] = a[2] + b[2];
      return out;
    }
    function subtract(out, a, b) {
      out[0] = a[0] - b[0];
      out[1] = a[1] - b[1];
      out[2] = a[2] - b[2];
      return out;
    }
    function multiply(out, a, b) {
      out[0] = a[0] * b[0];
      out[1] = a[1] * b[1];
      out[2] = a[2] * b[2];
      return out;
    }
    function divide(out, a, b) {
      out[0] = a[0] / b[0];
      out[1] = a[1] / b[1];
      out[2] = a[2] / b[2];
      return out;
    }
    function ceil(out, a) {
      out[0] = Math.ceil(a[0]);
      out[1] = Math.ceil(a[1]);
      out[2] = Math.ceil(a[2]);
      return out;
    }
    function floor(out, a) {
      out[0] = Math.floor(a[0]);
      out[1] = Math.floor(a[1]);
      out[2] = Math.floor(a[2]);
      return out;
    }
    function min(out, a, b) {
      out[0] = Math.min(a[0], b[0]);
      out[1] = Math.min(a[1], b[1]);
      out[2] = Math.min(a[2], b[2]);
      return out;
    }
    function max(out, a, b) {
      out[0] = Math.max(a[0], b[0]);
      out[1] = Math.max(a[1], b[1]);
      out[2] = Math.max(a[2], b[2]);
      return out;
    }
    function round(out, a) {
      out[0] = Math.round(a[0]);
      out[1] = Math.round(a[1]);
      out[2] = Math.round(a[2]);
      return out;
    }
    function scale(out, a, b) {
      out[0] = a[0] * b;
      out[1] = a[1] * b;
      out[2] = a[2] * b;
      return out;
    }
    function scaleAndAdd(out, a, b, scale) {
      out[0] = a[0] + b[0] * scale;
      out[1] = a[1] + b[1] * scale;
      out[2] = a[2] + b[2] * scale;
      return out;
    }
    function distance(a, b) {
      var x = b[0] - a[0];
      var y = b[1] - a[1];
      var z = b[2] - a[2];
      return Math.sqrt(x * x + y * y + z * z);
    }
    function squaredDistance(a, b) {
      var x = b[0] - a[0];
      var y = b[1] - a[1];
      var z = b[2] - a[2];
      return x * x + y * y + z * z;
    }
    function squaredLength(a) {
      var x = a[0];
      var y = a[1];
      var z = a[2];
      return x * x + y * y + z * z;
    }
    function negate(out, a) {
      out[0] = -a[0];
      out[1] = -a[1];
      out[2] = -a[2];
      return out;
    }
    function inverse(out, a) {
      out[0] = 1.0 / a[0];
      out[1] = 1.0 / a[1];
      out[2] = 1.0 / a[2];
      return out;
    }
    function normalize(out, a) {
      var x = a[0];
      var y = a[1];
      var z = a[2];
      var len = x * x + y * y + z * z;
      if (len > 0) {
        len = 1 / Math.sqrt(len);
        out[0] = a[0] * len;
        out[1] = a[1] * len;
        out[2] = a[2] * len;
      }
      return out;
    }
    function dot(a, b) {
      return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
    }
    function cross(out, a, b) {
      var ax = a[0],
          ay = a[1],
          az = a[2];
      var bx = b[0],
          by = b[1],
          bz = b[2];
      out[0] = ay * bz - az * by;
      out[1] = az * bx - ax * bz;
      out[2] = ax * by - ay * bx;
      return out;
    }
    function lerp(out, a, b, t) {
      var ax = a[0];
      var ay = a[1];
      var az = a[2];
      out[0] = ax + t * (b[0] - ax);
      out[1] = ay + t * (b[1] - ay);
      out[2] = az + t * (b[2] - az);
      return out;
    }
    function hermite(out, a, b, c, d, t) {
      var factorTimes2 = t * t;
      var factor1 = factorTimes2 * (2 * t - 3) + 1;
      var factor2 = factorTimes2 * (t - 2) + t;
      var factor3 = factorTimes2 * (t - 1);
      var factor4 = factorTimes2 * (3 - 2 * t);
      out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;
      out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;
      out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;
      return out;
    }
    function bezier(out, a, b, c, d, t) {
      var inverseFactor = 1 - t;
      var inverseFactorTimesTwo = inverseFactor * inverseFactor;
      var factorTimes2 = t * t;
      var factor1 = inverseFactorTimesTwo * inverseFactor;
      var factor2 = 3 * t * inverseFactorTimesTwo;
      var factor3 = 3 * factorTimes2 * inverseFactor;
      var factor4 = factorTimes2 * t;
      out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;
      out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;
      out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;
      return out;
    }
    function random(out, scale) {
      scale = scale || 1.0;
      var r = glMatrix.RANDOM() * 2.0 * Math.PI;
      var z = glMatrix.RANDOM() * 2.0 - 1.0;
      var zScale = Math.sqrt(1.0 - z * z) * scale;
      out[0] = Math.cos(r) * zScale;
      out[1] = Math.sin(r) * zScale;
      out[2] = z * scale;
      return out;
    }
    function transformMat4(out, a, m) {
      var x = a[0],
          y = a[1],
          z = a[2];
      var w = m[3] * x + m[7] * y + m[11] * z + m[15];
      w = w || 1.0;
      out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;
      out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;
      out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;
      return out;
    }
    function transformMat3(out, a, m) {
      var x = a[0],
          y = a[1],
          z = a[2];
      out[0] = x * m[0] + y * m[3] + z * m[6];
      out[1] = x * m[1] + y * m[4] + z * m[7];
      out[2] = x * m[2] + y * m[5] + z * m[8];
      return out;
    }
    function transformQuat(out, a, q) {
      var x = a[0],
          y = a[1],
          z = a[2];
      var qx = q[0],
          qy = q[1],
          qz = q[2],
          qw = q[3];
      var ix = qw * x + qy * z - qz * y;
      var iy = qw * y + qz * x - qx * z;
      var iz = qw * z + qx * y - qy * x;
      var iw = -qx * x - qy * y - qz * z;
      out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;
      out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;
      out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;
      return out;
    }
    function rotateX(out, a, b, c) {
      var p = [],
          r = [];
      p[0] = a[0] - b[0];
      p[1] = a[1] - b[1];
      p[2] = a[2] - b[2];
      r[0] = p[0];
      r[1] = p[1] * Math.cos(c) - p[2] * Math.sin(c);
      r[2] = p[1] * Math.sin(c) + p[2] * Math.cos(c);
      out[0] = r[0] + b[0];
      out[1] = r[1] + b[1];
      out[2] = r[2] + b[2];
      return out;
    }
    function rotateY(out, a, b, c) {
      var p = [],
          r = [];
      p[0] = a[0] - b[0];
      p[1] = a[1] - b[1];
      p[2] = a[2] - b[2];
      r[0] = p[2] * Math.sin(c) + p[0] * Math.cos(c);
      r[1] = p[1];
      r[2] = p[2] * Math.cos(c) - p[0] * Math.sin(c);
      out[0] = r[0] + b[0];
      out[1] = r[1] + b[1];
      out[2] = r[2] + b[2];
      return out;
    }
    function rotateZ(out, a, b, c) {
      var p = [],
          r = [];
      p[0] = a[0] - b[0];
      p[1] = a[1] - b[1];
      p[2] = a[2] - b[2];
      r[0] = p[0] * Math.cos(c) - p[1] * Math.sin(c);
      r[1] = p[0] * Math.sin(c) + p[1] * Math.cos(c);
      r[2] = p[2];
      out[0] = r[0] + b[0];
      out[1] = r[1] + b[1];
      out[2] = r[2] + b[2];
      return out;
    }
    function angle(a, b) {
      var tempA = fromValues(a[0], a[1], a[2]);
      var tempB = fromValues(b[0], b[1], b[2]);
      normalize(tempA, tempA);
      normalize(tempB, tempB);
      var cosine = dot(tempA, tempB);
      if (cosine > 1.0) {
        return 0;
      } else if (cosine < -1.0) {
        return Math.PI;
      } else {
        return Math.acos(cosine);
      }
    }
    function str(a) {
      return 'vec3(' + a[0] + ', ' + a[1] + ', ' + a[2] + ')';
    }
    function exactEquals(a, b) {
      return a[0] === b[0] && a[1] === b[1] && a[2] === b[2];
    }
    function equals(a, b) {
      var a0 = a[0],
          a1 = a[1],
          a2 = a[2];
      var b0 = b[0],
          b1 = b[1],
          b2 = b[2];
      return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2));
    }
    var sub = exports.sub = subtract;
    var mul = exports.mul = multiply;
    var div = exports.div = divide;
    var dist = exports.dist = distance;
    var sqrDist = exports.sqrDist = squaredDistance;
    var len = exports.len = length;
    var sqrLen = exports.sqrLen = squaredLength;
    var forEach = exports.forEach = function() {
      var vec = create();
      return function(a, stride, offset, count, fn, arg) {
        var i = void 0,
            l = void 0;
        if (!stride) {
          stride = 3;
        }
        if (!offset) {
          offset = 0;
        }
        if (count) {
          l = Math.min(count * stride + offset, a.length);
        } else {
          l = a.length;
        }
        for (i = offset; i < l; i += stride) {
          vec[0] = a[i];
          vec[1] = a[i + 1];
          vec[2] = a[i + 2];
          fn(vec, vec, arg);
          a[i] = vec[0];
          a[i + 1] = vec[1];
          a[i + 2] = vec[2];
        }
        return a;
      };
    }();
  }), (function(module, exports, __webpack_require__) {
    "use strict";
    Object.defineProperty(exports, "__esModule", {value: true});
    exports.forEach = exports.sqrLen = exports.len = exports.sqrDist = exports.dist = exports.div = exports.mul = exports.sub = undefined;
    exports.create = create;
    exports.clone = clone;
    exports.fromValues = fromValues;
    exports.copy = copy;
    exports.set = set;
    exports.add = add;
    exports.subtract = subtract;
    exports.multiply = multiply;
    exports.divide = divide;
    exports.ceil = ceil;
    exports.floor = floor;
    exports.min = min;
    exports.max = max;
    exports.round = round;
    exports.scale = scale;
    exports.scaleAndAdd = scaleAndAdd;
    exports.distance = distance;
    exports.squaredDistance = squaredDistance;
    exports.length = length;
    exports.squaredLength = squaredLength;
    exports.negate = negate;
    exports.inverse = inverse;
    exports.normalize = normalize;
    exports.dot = dot;
    exports.lerp = lerp;
    exports.random = random;
    exports.transformMat4 = transformMat4;
    exports.transformQuat = transformQuat;
    exports.str = str;
    exports.exactEquals = exactEquals;
    exports.equals = equals;
    var _common = __webpack_require__(0);
    var glMatrix = _interopRequireWildcard(_common);
    function _interopRequireWildcard(obj) {
      if (obj && obj.__esModule) {
        return obj;
      } else {
        var newObj = {};
        if (obj != null) {
          for (var key in obj) {
            if (Object.prototype.hasOwnProperty.call(obj, key))
              newObj[key] = obj[key];
          }
        }
        newObj.default = obj;
        return newObj;
      }
    }
    function create() {
      var out = new glMatrix.ARRAY_TYPE(4);
      out[0] = 0;
      out[1] = 0;
      out[2] = 0;
      out[3] = 0;
      return out;
    }
    function clone(a) {
      var out = new glMatrix.ARRAY_TYPE(4);
      out[0] = a[0];
      out[1] = a[1];
      out[2] = a[2];
      out[3] = a[3];
      return out;
    }
    function fromValues(x, y, z, w) {
      var out = new glMatrix.ARRAY_TYPE(4);
      out[0] = x;
      out[1] = y;
      out[2] = z;
      out[3] = w;
      return out;
    }
    function copy(out, a) {
      out[0] = a[0];
      out[1] = a[1];
      out[2] = a[2];
      out[3] = a[3];
      return out;
    }
    function set(out, x, y, z, w) {
      out[0] = x;
      out[1] = y;
      out[2] = z;
      out[3] = w;
      return out;
    }
    function add(out, a, b) {
      out[0] = a[0] + b[0];
      out[1] = a[1] + b[1];
      out[2] = a[2] + b[2];
      out[3] = a[3] + b[3];
      return out;
    }
    function subtract(out, a, b) {
      out[0] = a[0] - b[0];
      out[1] = a[1] - b[1];
      out[2] = a[2] - b[2];
      out[3] = a[3] - b[3];
      return out;
    }
    function multiply(out, a, b) {
      out[0] = a[0] * b[0];
      out[1] = a[1] * b[1];
      out[2] = a[2] * b[2];
      out[3] = a[3] * b[3];
      return out;
    }
    function divide(out, a, b) {
      out[0] = a[0] / b[0];
      out[1] = a[1] / b[1];
      out[2] = a[2] / b[2];
      out[3] = a[3] / b[3];
      return out;
    }
    function ceil(out, a) {
      out[0] = Math.ceil(a[0]);
      out[1] = Math.ceil(a[1]);
      out[2] = Math.ceil(a[2]);
      out[3] = Math.ceil(a[3]);
      return out;
    }
    function floor(out, a) {
      out[0] = Math.floor(a[0]);
      out[1] = Math.floor(a[1]);
      out[2] = Math.floor(a[2]);
      out[3] = Math.floor(a[3]);
      return out;
    }
    function min(out, a, b) {
      out[0] = Math.min(a[0], b[0]);
      out[1] = Math.min(a[1], b[1]);
      out[2] = Math.min(a[2], b[2]);
      out[3] = Math.min(a[3], b[3]);
      return out;
    }
    function max(out, a, b) {
      out[0] = Math.max(a[0], b[0]);
      out[1] = Math.max(a[1], b[1]);
      out[2] = Math.max(a[2], b[2]);
      out[3] = Math.max(a[3], b[3]);
      return out;
    }
    function round(out, a) {
      out[0] = Math.round(a[0]);
      out[1] = Math.round(a[1]);
      out[2] = Math.round(a[2]);
      out[3] = Math.round(a[3]);
      return out;
    }
    function scale(out, a, b) {
      out[0] = a[0] * b;
      out[1] = a[1] * b;
      out[2] = a[2] * b;
      out[3] = a[3] * b;
      return out;
    }
    function scaleAndAdd(out, a, b, scale) {
      out[0] = a[0] + b[0] * scale;
      out[1] = a[1] + b[1] * scale;
      out[2] = a[2] + b[2] * scale;
      out[3] = a[3] + b[3] * scale;
      return out;
    }
    function distance(a, b) {
      var x = b[0] - a[0];
      var y = b[1] - a[1];
      var z = b[2] - a[2];
      var w = b[3] - a[3];
      return Math.sqrt(x * x + y * y + z * z + w * w);
    }
    function squaredDistance(a, b) {
      var x = b[0] - a[0];
      var y = b[1] - a[1];
      var z = b[2] - a[2];
      var w = b[3] - a[3];
      return x * x + y * y + z * z + w * w;
    }
    function length(a) {
      var x = a[0];
      var y = a[1];
      var z = a[2];
      var w = a[3];
      return Math.sqrt(x * x + y * y + z * z + w * w);
    }
    function squaredLength(a) {
      var x = a[0];
      var y = a[1];
      var z = a[2];
      var w = a[3];
      return x * x + y * y + z * z + w * w;
    }
    function negate(out, a) {
      out[0] = -a[0];
      out[1] = -a[1];
      out[2] = -a[2];
      out[3] = -a[3];
      return out;
    }
    function inverse(out, a) {
      out[0] = 1.0 / a[0];
      out[1] = 1.0 / a[1];
      out[2] = 1.0 / a[2];
      out[3] = 1.0 / a[3];
      return out;
    }
    function normalize(out, a) {
      var x = a[0];
      var y = a[1];
      var z = a[2];
      var w = a[3];
      var len = x * x + y * y + z * z + w * w;
      if (len > 0) {
        len = 1 / Math.sqrt(len);
        out[0] = x * len;
        out[1] = y * len;
        out[2] = z * len;
        out[3] = w * len;
      }
      return out;
    }
    function dot(a, b) {
      return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];
    }
    function lerp(out, a, b, t) {
      var ax = a[0];
      var ay = a[1];
      var az = a[2];
      var aw = a[3];
      out[0] = ax + t * (b[0] - ax);
      out[1] = ay + t * (b[1] - ay);
      out[2] = az + t * (b[2] - az);
      out[3] = aw + t * (b[3] - aw);
      return out;
    }
    function random(out, vectorScale) {
      vectorScale = vectorScale || 1.0;
      out[0] = glMatrix.RANDOM();
      out[1] = glMatrix.RANDOM();
      out[2] = glMatrix.RANDOM();
      out[3] = glMatrix.RANDOM();
      normalize(out, out);
      scale(out, out, vectorScale);
      return out;
    }
    function transformMat4(out, a, m) {
      var x = a[0],
          y = a[1],
          z = a[2],
          w = a[3];
      out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w;
      out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w;
      out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w;
      out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w;
      return out;
    }
    function transformQuat(out, a, q) {
      var x = a[0],
          y = a[1],
          z = a[2];
      var qx = q[0],
          qy = q[1],
          qz = q[2],
          qw = q[3];
      var ix = qw * x + qy * z - qz * y;
      var iy = qw * y + qz * x - qx * z;
      var iz = qw * z + qx * y - qy * x;
      var iw = -qx * x - qy * y - qz * z;
      out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;
      out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;
      out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;
      out[3] = a[3];
      return out;
    }
    function str(a) {
      return 'vec4(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ')';
    }
    function exactEquals(a, b) {
      return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];
    }
    function equals(a, b) {
      var a0 = a[0],
          a1 = a[1],
          a2 = a[2],
          a3 = a[3];
      var b0 = b[0],
          b1 = b[1],
          b2 = b[2],
          b3 = b[3];
      return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3));
    }
    var sub = exports.sub = subtract;
    var mul = exports.mul = multiply;
    var div = exports.div = divide;
    var dist = exports.dist = distance;
    var sqrDist = exports.sqrDist = squaredDistance;
    var len = exports.len = length;
    var sqrLen = exports.sqrLen = squaredLength;
    var forEach = exports.forEach = function() {
      var vec = create();
      return function(a, stride, offset, count, fn, arg) {
        var i = void 0,
            l = void 0;
        if (!stride) {
          stride = 4;
        }
        if (!offset) {
          offset = 0;
        }
        if (count) {
          l = Math.min(count * stride + offset, a.length);
        } else {
          l = a.length;
        }
        for (i = offset; i < l; i += stride) {
          vec[0] = a[i];
          vec[1] = a[i + 1];
          vec[2] = a[i + 2];
          vec[3] = a[i + 3];
          fn(vec, vec, arg);
          a[i] = vec[0];
          a[i + 1] = vec[1];
          a[i + 2] = vec[2];
          a[i + 3] = vec[3];
        }
        return a;
      };
    }();
  }), (function(module, exports, __webpack_require__) {
    "use strict";
    Object.defineProperty(exports, "__esModule", {value: true});
    exports.vec4 = exports.vec3 = exports.vec2 = exports.quat = exports.mat4 = exports.mat3 = exports.mat2d = exports.mat2 = exports.glMatrix = undefined;
    var _common = __webpack_require__(0);
    var glMatrix = _interopRequireWildcard(_common);
    var _mat = __webpack_require__(5);
    var mat2 = _interopRequireWildcard(_mat);
    var _mat2d = __webpack_require__(6);
    var mat2d = _interopRequireWildcard(_mat2d);
    var _mat2 = __webpack_require__(1);
    var mat3 = _interopRequireWildcard(_mat2);
    var _mat3 = __webpack_require__(7);
    var mat4 = _interopRequireWildcard(_mat3);
    var _quat = __webpack_require__(8);
    var quat = _interopRequireWildcard(_quat);
    var _vec = __webpack_require__(9);
    var vec2 = _interopRequireWildcard(_vec);
    var _vec2 = __webpack_require__(2);
    var vec3 = _interopRequireWildcard(_vec2);
    var _vec3 = __webpack_require__(3);
    var vec4 = _interopRequireWildcard(_vec3);
    function _interopRequireWildcard(obj) {
      if (obj && obj.__esModule) {
        return obj;
      } else {
        var newObj = {};
        if (obj != null) {
          for (var key in obj) {
            if (Object.prototype.hasOwnProperty.call(obj, key))
              newObj[key] = obj[key];
          }
        }
        newObj.default = obj;
        return newObj;
      }
    }
    exports.glMatrix = glMatrix;
    exports.mat2 = mat2;
    exports.mat2d = mat2d;
    exports.mat3 = mat3;
    exports.mat4 = mat4;
    exports.quat = quat;
    exports.vec2 = vec2;
    exports.vec3 = vec3;
    exports.vec4 = vec4;
  }), (function(module, exports, __webpack_require__) {
    "use strict";
    Object.defineProperty(exports, "__esModule", {value: true});
    exports.sub = exports.mul = undefined;
    exports.create = create;
    exports.clone = clone;
    exports.copy = copy;
    exports.identity = identity;
    exports.fromValues = fromValues;
    exports.set = set;
    exports.transpose = transpose;
    exports.invert = invert;
    exports.adjoint = adjoint;
    exports.determinant = determinant;
    exports.multiply = multiply;
    exports.rotate = rotate;
    exports.scale = scale;
    exports.fromRotation = fromRotation;
    exports.fromScaling = fromScaling;
    exports.str = str;
    exports.frob = frob;
    exports.LDU = LDU;
    exports.add = add;
    exports.subtract = subtract;
    exports.exactEquals = exactEquals;
    exports.equals = equals;
    exports.multiplyScalar = multiplyScalar;
    exports.multiplyScalarAndAdd = multiplyScalarAndAdd;
    var _common = __webpack_require__(0);
    var glMatrix = _interopRequireWildcard(_common);
    function _interopRequireWildcard(obj) {
      if (obj && obj.__esModule) {
        return obj;
      } else {
        var newObj = {};
        if (obj != null) {
          for (var key in obj) {
            if (Object.prototype.hasOwnProperty.call(obj, key))
              newObj[key] = obj[key];
          }
        }
        newObj.default = obj;
        return newObj;
      }
    }
    function create() {
      var out = new glMatrix.ARRAY_TYPE(4);
      out[0] = 1;
      out[1] = 0;
      out[2] = 0;
      out[3] = 1;
      return out;
    }
    function clone(a) {
      var out = new glMatrix.ARRAY_TYPE(4);
      out[0] = a[0];
      out[1] = a[1];
      out[2] = a[2];
      out[3] = a[3];
      return out;
    }
    function copy(out, a) {
      out[0] = a[0];
      out[1] = a[1];
      out[2] = a[2];
      out[3] = a[3];
      return out;
    }
    function identity(out) {
      out[0] = 1;
      out[1] = 0;
      out[2] = 0;
      out[3] = 1;
      return out;
    }
    function fromValues(m00, m01, m10, m11) {
      var out = new glMatrix.ARRAY_TYPE(4);
      out[0] = m00;
      out[1] = m01;
      out[2] = m10;
      out[3] = m11;
      return out;
    }
    function set(out, m00, m01, m10, m11) {
      out[0] = m00;
      out[1] = m01;
      out[2] = m10;
      out[3] = m11;
      return out;
    }
    function transpose(out, a) {
      if (out === a) {
        var a1 = a[1];
        out[1] = a[2];
        out[2] = a1;
      } else {
        out[0] = a[0];
        out[1] = a[2];
        out[2] = a[1];
        out[3] = a[3];
      }
      return out;
    }
    function invert(out, a) {
      var a0 = a[0],
          a1 = a[1],
          a2 = a[2],
          a3 = a[3];
      var det = a0 * a3 - a2 * a1;
      if (!det) {
        return null;
      }
      det = 1.0 / det;
      out[0] = a3 * det;
      out[1] = -a1 * det;
      out[2] = -a2 * det;
      out[3] = a0 * det;
      return out;
    }
    function adjoint(out, a) {
      var a0 = a[0];
      out[0] = a[3];
      out[1] = -a[1];
      out[2] = -a[2];
      out[3] = a0;
      return out;
    }
    function determinant(a) {
      return a[0] * a[3] - a[2] * a[1];
    }
    function multiply(out, a, b) {
      var a0 = a[0],
          a1 = a[1],
          a2 = a[2],
          a3 = a[3];
      var b0 = b[0],
          b1 = b[1],
          b2 = b[2],
          b3 = b[3];
      out[0] = a0 * b0 + a2 * b1;
      out[1] = a1 * b0 + a3 * b1;
      out[2] = a0 * b2 + a2 * b3;
      out[3] = a1 * b2 + a3 * b3;
      return out;
    }
    function rotate(out, a, rad) {
      var a0 = a[0],
          a1 = a[1],
          a2 = a[2],
          a3 = a[3];
      var s = Math.sin(rad);
      var c = Math.cos(rad);
      out[0] = a0 * c + a2 * s;
      out[1] = a1 * c + a3 * s;
      out[2] = a0 * -s + a2 * c;
      out[3] = a1 * -s + a3 * c;
      return out;
    }
    function scale(out, a, v) {
      var a0 = a[0],
          a1 = a[1],
          a2 = a[2],
          a3 = a[3];
      var v0 = v[0],
          v1 = v[1];
      out[0] = a0 * v0;
      out[1] = a1 * v0;
      out[2] = a2 * v1;
      out[3] = a3 * v1;
      return out;
    }
    function fromRotation(out, rad) {
      var s = Math.sin(rad);
      var c = Math.cos(rad);
      out[0] = c;
      out[1] = s;
      out[2] = -s;
      out[3] = c;
      return out;
    }
    function fromScaling(out, v) {
      out[0] = v[0];
      out[1] = 0;
      out[2] = 0;
      out[3] = v[1];
      return out;
    }
    function str(a) {
      return 'mat2(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ')';
    }
    function frob(a) {
      return Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2));
    }
    function LDU(L, D, U, a) {
      L[2] = a[2] / a[0];
      U[0] = a[0];
      U[1] = a[1];
      U[3] = a[3] - L[2] * U[1];
      return [L, D, U];
    }
    function add(out, a, b) {
      out[0] = a[0] + b[0];
      out[1] = a[1] + b[1];
      out[2] = a[2] + b[2];
      out[3] = a[3] + b[3];
      return out;
    }
    function subtract(out, a, b) {
      out[0] = a[0] - b[0];
      out[1] = a[1] - b[1];
      out[2] = a[2] - b[2];
      out[3] = a[3] - b[3];
      return out;
    }
    function exactEquals(a, b) {
      return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];
    }
    function equals(a, b) {
      var a0 = a[0],
          a1 = a[1],
          a2 = a[2],
          a3 = a[3];
      var b0 = b[0],
          b1 = b[1],
          b2 = b[2],
          b3 = b[3];
      return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3));
    }
    function multiplyScalar(out, a, b) {
      out[0] = a[0] * b;
      out[1] = a[1] * b;
      out[2] = a[2] * b;
      out[3] = a[3] * b;
      return out;
    }
    function multiplyScalarAndAdd(out, a, b, scale) {
      out[0] = a[0] + b[0] * scale;
      out[1] = a[1] + b[1] * scale;
      out[2] = a[2] + b[2] * scale;
      out[3] = a[3] + b[3] * scale;
      return out;
    }
    var mul = exports.mul = multiply;
    var sub = exports.sub = subtract;
  }), (function(module, exports, __webpack_require__) {
    "use strict";
    Object.defineProperty(exports, "__esModule", {value: true});
    exports.sub = exports.mul = undefined;
    exports.create = create;
    exports.clone = clone;
    exports.copy = copy;
    exports.identity = identity;
    exports.fromValues = fromValues;
    exports.set = set;
    exports.invert = invert;
    exports.determinant = determinant;
    exports.multiply = multiply;
    exports.rotate = rotate;
    exports.scale = scale;
    exports.translate = translate;
    exports.fromRotation = fromRotation;
    exports.fromScaling = fromScaling;
    exports.fromTranslation = fromTranslation;
    exports.str = str;
    exports.frob = frob;
    exports.add = add;
    exports.subtract = subtract;
    exports.multiplyScalar = multiplyScalar;
    exports.multiplyScalarAndAdd = multiplyScalarAndAdd;
    exports.exactEquals = exactEquals;
    exports.equals = equals;
    var _common = __webpack_require__(0);
    var glMatrix = _interopRequireWildcard(_common);
    function _interopRequireWildcard(obj) {
      if (obj && obj.__esModule) {
        return obj;
      } else {
        var newObj = {};
        if (obj != null) {
          for (var key in obj) {
            if (Object.prototype.hasOwnProperty.call(obj, key))
              newObj[key] = obj[key];
          }
        }
        newObj.default = obj;
        return newObj;
      }
    }
    function create() {
      var out = new glMatrix.ARRAY_TYPE(6);
      out[0] = 1;
      out[1] = 0;
      out[2] = 0;
      out[3] = 1;
      out[4] = 0;
      out[5] = 0;
      return out;
    }
    function clone(a) {
      var out = new glMatrix.ARRAY_TYPE(6);
      out[0] = a[0];
      out[1] = a[1];
      out[2] = a[2];
      out[3] = a[3];
      out[4] = a[4];
      out[5] = a[5];
      return out;
    }
    function copy(out, a) {
      out[0] = a[0];
      out[1] = a[1];
      out[2] = a[2];
      out[3] = a[3];
      out[4] = a[4];
      out[5] = a[5];
      return out;
    }
    function identity(out) {
      out[0] = 1;
      out[1] = 0;
      out[2] = 0;
      out[3] = 1;
      out[4] = 0;
      out[5] = 0;
      return out;
    }
    function fromValues(a, b, c, d, tx, ty) {
      var out = new glMatrix.ARRAY_TYPE(6);
      out[0] = a;
      out[1] = b;
      out[2] = c;
      out[3] = d;
      out[4] = tx;
      out[5] = ty;
      return out;
    }
    function set(out, a, b, c, d, tx, ty) {
      out[0] = a;
      out[1] = b;
      out[2] = c;
      out[3] = d;
      out[4] = tx;
      out[5] = ty;
      return out;
    }
    function invert(out, a) {
      var aa = a[0],
          ab = a[1],
          ac = a[2],
          ad = a[3];
      var atx = a[4],
          aty = a[5];
      var det = aa * ad - ab * ac;
      if (!det) {
        return null;
      }
      det = 1.0 / det;
      out[0] = ad * det;
      out[1] = -ab * det;
      out[2] = -ac * det;
      out[3] = aa * det;
      out[4] = (ac * aty - ad * atx) * det;
      out[5] = (ab * atx - aa * aty) * det;
      return out;
    }
    function determinant(a) {
      return a[0] * a[3] - a[1] * a[2];
    }
    function multiply(out, a, b) {
      var a0 = a[0],
          a1 = a[1],
          a2 = a[2],
          a3 = a[3],
          a4 = a[4],
          a5 = a[5];
      var b0 = b[0],
          b1 = b[1],
          b2 = b[2],
          b3 = b[3],
          b4 = b[4],
          b5 = b[5];
      out[0] = a0 * b0 + a2 * b1;
      out[1] = a1 * b0 + a3 * b1;
      out[2] = a0 * b2 + a2 * b3;
      out[3] = a1 * b2 + a3 * b3;
      out[4] = a0 * b4 + a2 * b5 + a4;
      out[5] = a1 * b4 + a3 * b5 + a5;
      return out;
    }
    function rotate(out, a, rad) {
      var a0 = a[0],
          a1 = a[1],
          a2 = a[2],
          a3 = a[3],
          a4 = a[4],
          a5 = a[5];
      var s = Math.sin(rad);
      var c = Math.cos(rad);
      out[0] = a0 * c + a2 * s;
      out[1] = a1 * c + a3 * s;
      out[2] = a0 * -s + a2 * c;
      out[3] = a1 * -s + a3 * c;
      out[4] = a4;
      out[5] = a5;
      return out;
    }
    function scale(out, a, v) {
      var a0 = a[0],
          a1 = a[1],
          a2 = a[2],
          a3 = a[3],
          a4 = a[4],
          a5 = a[5];
      var v0 = v[0],
          v1 = v[1];
      out[0] = a0 * v0;
      out[1] = a1 * v0;
      out[2] = a2 * v1;
      out[3] = a3 * v1;
      out[4] = a4;
      out[5] = a5;
      return out;
    }
    function translate(out, a, v) {
      var a0 = a[0],
          a1 = a[1],
          a2 = a[2],
          a3 = a[3],
          a4 = a[4],
          a5 = a[5];
      var v0 = v[0],
          v1 = v[1];
      out[0] = a0;
      out[1] = a1;
      out[2] = a2;
      out[3] = a3;
      out[4] = a0 * v0 + a2 * v1 + a4;
      out[5] = a1 * v0 + a3 * v1 + a5;
      return out;
    }
    function fromRotation(out, rad) {
      var s = Math.sin(rad),
          c = Math.cos(rad);
      out[0] = c;
      out[1] = s;
      out[2] = -s;
      out[3] = c;
      out[4] = 0;
      out[5] = 0;
      return out;
    }
    function fromScaling(out, v) {
      out[0] = v[0];
      out[1] = 0;
      out[2] = 0;
      out[3] = v[1];
      out[4] = 0;
      out[5] = 0;
      return out;
    }
    function fromTranslation(out, v) {
      out[0] = 1;
      out[1] = 0;
      out[2] = 0;
      out[3] = 1;
      out[4] = v[0];
      out[5] = v[1];
      return out;
    }
    function str(a) {
      return 'mat2d(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ', ' + a[4] + ', ' + a[5] + ')';
    }
    function frob(a) {
      return Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2) + Math.pow(a[4], 2) + Math.pow(a[5], 2) + 1);
    }
    function add(out, a, b) {
      out[0] = a[0] + b[0];
      out[1] = a[1] + b[1];
      out[2] = a[2] + b[2];
      out[3] = a[3] + b[3];
      out[4] = a[4] + b[4];
      out[5] = a[5] + b[5];
      return out;
    }
    function subtract(out, a, b) {
      out[0] = a[0] - b[0];
      out[1] = a[1] - b[1];
      out[2] = a[2] - b[2];
      out[3] = a[3] - b[3];
      out[4] = a[4] - b[4];
      out[5] = a[5] - b[5];
      return out;
    }
    function multiplyScalar(out, a, b) {
      out[0] = a[0] * b;
      out[1] = a[1] * b;
      out[2] = a[2] * b;
      out[3] = a[3] * b;
      out[4] = a[4] * b;
      out[5] = a[5] * b;
      return out;
    }
    function multiplyScalarAndAdd(out, a, b, scale) {
      out[0] = a[0] + b[0] * scale;
      out[1] = a[1] + b[1] * scale;
      out[2] = a[2] + b[2] * scale;
      out[3] = a[3] + b[3] * scale;
      out[4] = a[4] + b[4] * scale;
      out[5] = a[5] + b[5] * scale;
      return out;
    }
    function exactEquals(a, b) {
      return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5];
    }
    function equals(a, b) {
      var a0 = a[0],
          a1 = a[1],
          a2 = a[2],
          a3 = a[3],
          a4 = a[4],
          a5 = a[5];
      var b0 = b[0],
          b1 = b[1],
          b2 = b[2],
          b3 = b[3],
          b4 = b[4],
          b5 = b[5];
      return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5));
    }
    var mul = exports.mul = multiply;
    var sub = exports.sub = subtract;
  }), (function(module, exports, __webpack_require__) {
    "use strict";
    Object.defineProperty(exports, "__esModule", {value: true});
    exports.sub = exports.mul = undefined;
    exports.create = create;
    exports.clone = clone;
    exports.copy = copy;
    exports.fromValues = fromValues;
    exports.set = set;
    exports.identity = identity;
    exports.transpose = transpose;
    exports.invert = invert;
    exports.adjoint = adjoint;
    exports.determinant = determinant;
    exports.multiply = multiply;
    exports.translate = translate;
    exports.scale = scale;
    exports.rotate = rotate;
    exports.rotateX = rotateX;
    exports.rotateY = rotateY;
    exports.rotateZ = rotateZ;
    exports.fromTranslation = fromTranslation;
    exports.fromScaling = fromScaling;
    exports.fromRotation = fromRotation;
    exports.fromXRotation = fromXRotation;
    exports.fromYRotation = fromYRotation;
    exports.fromZRotation = fromZRotation;
    exports.fromRotationTranslation = fromRotationTranslation;
    exports.getTranslation = getTranslation;
    exports.getScaling = getScaling;
    exports.getRotation = getRotation;
    exports.fromRotationTranslationScale = fromRotationTranslationScale;
    exports.fromRotationTranslationScaleOrigin = fromRotationTranslationScaleOrigin;
    exports.fromQuat = fromQuat;
    exports.frustum = frustum;
    exports.perspective = perspective;
    exports.perspectiveFromFieldOfView = perspectiveFromFieldOfView;
    exports.ortho = ortho;
    exports.lookAt = lookAt;
    exports.targetTo = targetTo;
    exports.str = str;
    exports.frob = frob;
    exports.add = add;
    exports.subtract = subtract;
    exports.multiplyScalar = multiplyScalar;
    exports.multiplyScalarAndAdd = multiplyScalarAndAdd;
    exports.exactEquals = exactEquals;
    exports.equals = equals;
    var _common = __webpack_require__(0);
    var glMatrix = _interopRequireWildcard(_common);
    function _interopRequireWildcard(obj) {
      if (obj && obj.__esModule) {
        return obj;
      } else {
        var newObj = {};
        if (obj != null) {
          for (var key in obj) {
            if (Object.prototype.hasOwnProperty.call(obj, key))
              newObj[key] = obj[key];
          }
        }
        newObj.default = obj;
        return newObj;
      }
    }
    function create() {
      var out = new glMatrix.ARRAY_TYPE(16);
      out[0] = 1;
      out[1] = 0;
      out[2] = 0;
      out[3] = 0;
      out[4] = 0;
      out[5] = 1;
      out[6] = 0;
      out[7] = 0;
      out[8] = 0;
      out[9] = 0;
      out[10] = 1;
      out[11] = 0;
      out[12] = 0;
      out[13] = 0;
      out[14] = 0;
      out[15] = 1;
      return out;
    }
    function clone(a) {
      var out = new glMatrix.ARRAY_TYPE(16);
      out[0] = a[0];
      out[1] = a[1];
      out[2] = a[2];
      out[3] = a[3];
      out[4] = a[4];
      out[5] = a[5];
      out[6] = a[6];
      out[7] = a[7];
      out[8] = a[8];
      out[9] = a[9];
      out[10] = a[10];
      out[11] = a[11];
      out[12] = a[12];
      out[13] = a[13];
      out[14] = a[14];
      out[15] = a[15];
      return out;
    }
    function copy(out, a) {
      out[0] = a[0];
      out[1] = a[1];
      out[2] = a[2];
      out[3] = a[3];
      out[4] = a[4];
      out[5] = a[5];
      out[6] = a[6];
      out[7] = a[7];
      out[8] = a[8];
      out[9] = a[9];
      out[10] = a[10];
      out[11] = a[11];
      out[12] = a[12];
      out[13] = a[13];
      out[14] = a[14];
      out[15] = a[15];
      return out;
    }
    function fromValues(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {
      var out = new glMatrix.ARRAY_TYPE(16);
      out[0] = m00;
      out[1] = m01;
      out[2] = m02;
      out[3] = m03;
      out[4] = m10;
      out[5] = m11;
      out[6] = m12;
      out[7] = m13;
      out[8] = m20;
      out[9] = m21;
      out[10] = m22;
      out[11] = m23;
      out[12] = m30;
      out[13] = m31;
      out[14] = m32;
      out[15] = m33;
      return out;
    }
    function set(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {
      out[0] = m00;
      out[1] = m01;
      out[2] = m02;
      out[3] = m03;
      out[4] = m10;
      out[5] = m11;
      out[6] = m12;
      out[7] = m13;
      out[8] = m20;
      out[9] = m21;
      out[10] = m22;
      out[11] = m23;
      out[12] = m30;
      out[13] = m31;
      out[14] = m32;
      out[15] = m33;
      return out;
    }
    function identity(out) {
      out[0] = 1;
      out[1] = 0;
      out[2] = 0;
      out[3] = 0;
      out[4] = 0;
      out[5] = 1;
      out[6] = 0;
      out[7] = 0;
      out[8] = 0;
      out[9] = 0;
      out[10] = 1;
      out[11] = 0;
      out[12] = 0;
      out[13] = 0;
      out[14] = 0;
      out[15] = 1;
      return out;
    }
    function transpose(out, a) {
      if (out === a) {
        var a01 = a[1],
            a02 = a[2],
            a03 = a[3];
        var a12 = a[6],
            a13 = a[7];
        var a23 = a[11];
        out[1] = a[4];
        out[2] = a[8];
        out[3] = a[12];
        out[4] = a01;
        out[6] = a[9];
        out[7] = a[13];
        out[8] = a02;
        out[9] = a12;
        out[11] = a[14];
        out[12] = a03;
        out[13] = a13;
        out[14] = a23;
      } else {
        out[0] = a[0];
        out[1] = a[4];
        out[2] = a[8];
        out[3] = a[12];
        out[4] = a[1];
        out[5] = a[5];
        out[6] = a[9];
        out[7] = a[13];
        out[8] = a[2];
        out[9] = a[6];
        out[10] = a[10];
        out[11] = a[14];
        out[12] = a[3];
        out[13] = a[7];
        out[14] = a[11];
        out[15] = a[15];
      }
      return out;
    }
    function invert(out, a) {
      var a00 = a[0],
          a01 = a[1],
          a02 = a[2],
          a03 = a[3];
      var a10 = a[4],
          a11 = a[5],
          a12 = a[6],
          a13 = a[7];
      var a20 = a[8],
          a21 = a[9],
          a22 = a[10],
          a23 = a[11];
      var a30 = a[12],
          a31 = a[13],
          a32 = a[14],
          a33 = a[15];
      var b00 = a00 * a11 - a01 * a10;
      var b01 = a00 * a12 - a02 * a10;
      var b02 = a00 * a13 - a03 * a10;
      var b03 = a01 * a12 - a02 * a11;
      var b04 = a01 * a13 - a03 * a11;
      var b05 = a02 * a13 - a03 * a12;
      var b06 = a20 * a31 - a21 * a30;
      var b07 = a20 * a32 - a22 * a30;
      var b08 = a20 * a33 - a23 * a30;
      var b09 = a21 * a32 - a22 * a31;
      var b10 = a21 * a33 - a23 * a31;
      var b11 = a22 * a33 - a23 * a32;
      var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
      if (!det) {
        return null;
      }
      det = 1.0 / det;
      out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;
      out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;
      out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;
      out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;
      out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;
      out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;
      out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;
      out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;
      out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;
      out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;
      out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;
      out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;
      out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;
      out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;
      out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;
      out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;
      return out;
    }
    function adjoint(out, a) {
      var a00 = a[0],
          a01 = a[1],
          a02 = a[2],
          a03 = a[3];
      var a10 = a[4],
          a11 = a[5],
          a12 = a[6],
          a13 = a[7];
      var a20 = a[8],
          a21 = a[9],
          a22 = a[10],
          a23 = a[11];
      var a30 = a[12],
          a31 = a[13],
          a32 = a[14],
          a33 = a[15];
      out[0] = a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22);
      out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22));
      out[2] = a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12);
      out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12));
      out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22));
      out[5] = a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22);
      out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12));
      out[7] = a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12);
      out[8] = a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21);
      out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21));
      out[10] = a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11);
      out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11));
      out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21));
      out[13] = a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21);
      out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11));
      out[15] = a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11);
      return out;
    }
    function determinant(a) {
      var a00 = a[0],
          a01 = a[1],
          a02 = a[2],
          a03 = a[3];
      var a10 = a[4],
          a11 = a[5],
          a12 = a[6],
          a13 = a[7];
      var a20 = a[8],
          a21 = a[9],
          a22 = a[10],
          a23 = a[11];
      var a30 = a[12],
          a31 = a[13],
          a32 = a[14],
          a33 = a[15];
      var b00 = a00 * a11 - a01 * a10;
      var b01 = a00 * a12 - a02 * a10;
      var b02 = a00 * a13 - a03 * a10;
      var b03 = a01 * a12 - a02 * a11;
      var b04 = a01 * a13 - a03 * a11;
      var b05 = a02 * a13 - a03 * a12;
      var b06 = a20 * a31 - a21 * a30;
      var b07 = a20 * a32 - a22 * a30;
      var b08 = a20 * a33 - a23 * a30;
      var b09 = a21 * a32 - a22 * a31;
      var b10 = a21 * a33 - a23 * a31;
      var b11 = a22 * a33 - a23 * a32;
      return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
    }
    function multiply(out, a, b) {
      var a00 = a[0],
          a01 = a[1],
          a02 = a[2],
          a03 = a[3];
      var a10 = a[4],
          a11 = a[5],
          a12 = a[6],
          a13 = a[7];
      var a20 = a[8],
          a21 = a[9],
          a22 = a[10],
          a23 = a[11];
      var a30 = a[12],
          a31 = a[13],
          a32 = a[14],
          a33 = a[15];
      var b0 = b[0],
          b1 = b[1],
          b2 = b[2],
          b3 = b[3];
      out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;
      out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;
      out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;
      out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;
      b0 = b[4];
      b1 = b[5];
      b2 = b[6];
      b3 = b[7];
      out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;
      out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;
      out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;
      out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;
      b0 = b[8];
      b1 = b[9];
      b2 = b[10];
      b3 = b[11];
      out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;
      out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;
      out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;
      out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;
      b0 = b[12];
      b1 = b[13];
      b2 = b[14];
      b3 = b[15];
      out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;
      out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;
      out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;
      out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;
      return out;
    }
    function translate(out, a, v) {
      var x = v[0],
          y = v[1],
          z = v[2];
      var a00 = void 0,
          a01 = void 0,
          a02 = void 0,
          a03 = void 0;
      var a10 = void 0,
          a11 = void 0,
          a12 = void 0,
          a13 = void 0;
      var a20 = void 0,
          a21 = void 0,
          a22 = void 0,
          a23 = void 0;
      if (a === out) {
        out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];
        out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];
        out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];
        out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];
      } else {
        a00 = a[0];
        a01 = a[1];
        a02 = a[2];
        a03 = a[3];
        a10 = a[4];
        a11 = a[5];
        a12 = a[6];
        a13 = a[7];
        a20 = a[8];
        a21 = a[9];
        a22 = a[10];
        a23 = a[11];
        out[0] = a00;
        out[1] = a01;
        out[2] = a02;
        out[3] = a03;
        out[4] = a10;
        out[5] = a11;
        out[6] = a12;
        out[7] = a13;
        out[8] = a20;
        out[9] = a21;
        out[10] = a22;
        out[11] = a23;
        out[12] = a00 * x + a10 * y + a20 * z + a[12];
        out[13] = a01 * x + a11 * y + a21 * z + a[13];
        out[14] = a02 * x + a12 * y + a22 * z + a[14];
        out[15] = a03 * x + a13 * y + a23 * z + a[15];
      }
      return out;
    }
    function scale(out, a, v) {
      var x = v[0],
          y = v[1],
          z = v[2];
      out[0] = a[0] * x;
      out[1] = a[1] * x;
      out[2] = a[2] * x;
      out[3] = a[3] * x;
      out[4] = a[4] * y;
      out[5] = a[5] * y;
      out[6] = a[6] * y;
      out[7] = a[7] * y;
      out[8] = a[8] * z;
      out[9] = a[9] * z;
      out[10] = a[10] * z;
      out[11] = a[11] * z;
      out[12] = a[12];
      out[13] = a[13];
      out[14] = a[14];
      out[15] = a[15];
      return out;
    }
    function rotate(out, a, rad, axis) {
      var x = axis[0],
          y = axis[1],
          z = axis[2];
      var len = Math.sqrt(x * x + y * y + z * z);
      var s = void 0,
          c = void 0,
          t = void 0;
      var a00 = void 0,
          a01 = void 0,
          a02 = void 0,
          a03 = void 0;
      var a10 = void 0,
          a11 = void 0,
          a12 = void 0,
          a13 = void 0;
      var a20 = void 0,
          a21 = void 0,
          a22 = void 0,
          a23 = void 0;
      var b00 = void 0,
          b01 = void 0,
          b02 = void 0;
      var b10 = void 0,
          b11 = void 0,
          b12 = void 0;
      var b20 = void 0,
          b21 = void 0,
          b22 = void 0;
      if (Math.abs(len) < glMatrix.EPSILON) {
        return null;
      }
      len = 1 / len;
      x *= len;
      y *= len;
      z *= len;
      s = Math.sin(rad);
      c = Math.cos(rad);
      t = 1 - c;
      a00 = a[0];
      a01 = a[1];
      a02 = a[2];
      a03 = a[3];
      a10 = a[4];
      a11 = a[5];
      a12 = a[6];
      a13 = a[7];
      a20 = a[8];
      a21 = a[9];
      a22 = a[10];
      a23 = a[11];
      b00 = x * x * t + c;
      b01 = y * x * t + z * s;
      b02 = z * x * t - y * s;
      b10 = x * y * t - z * s;
      b11 = y * y * t + c;
      b12 = z * y * t + x * s;
      b20 = x * z * t + y * s;
      b21 = y * z * t - x * s;
      b22 = z * z * t + c;
      out[0] = a00 * b00 + a10 * b01 + a20 * b02;
      out[1] = a01 * b00 + a11 * b01 + a21 * b02;
      out[2] = a02 * b00 + a12 * b01 + a22 * b02;
      out[3] = a03 * b00 + a13 * b01 + a23 * b02;
      out[4] = a00 * b10 + a10 * b11 + a20 * b12;
      out[5] = a01 * b10 + a11 * b11 + a21 * b12;
      out[6] = a02 * b10 + a12 * b11 + a22 * b12;
      out[7] = a03 * b10 + a13 * b11 + a23 * b12;
      out[8] = a00 * b20 + a10 * b21 + a20 * b22;
      out[9] = a01 * b20 + a11 * b21 + a21 * b22;
      out[10] = a02 * b20 + a12 * b21 + a22 * b22;
      out[11] = a03 * b20 + a13 * b21 + a23 * b22;
      if (a !== out) {
        out[12] = a[12];
        out[13] = a[13];
        out[14] = a[14];
        out[15] = a[15];
      }
      return out;
    }
    function rotateX(out, a, rad) {
      var s = Math.sin(rad);
      var c = Math.cos(rad);
      var a10 = a[4];
      var a11 = a[5];
      var a12 = a[6];
      var a13 = a[7];
      var a20 = a[8];
      var a21 = a[9];
      var a22 = a[10];
      var a23 = a[11];
      if (a !== out) {
        out[0] = a[0];
        out[1] = a[1];
        out[2] = a[2];
        out[3] = a[3];
        out[12] = a[12];
        out[13] = a[13];
        out[14] = a[14];
        out[15] = a[15];
      }
      out[4] = a10 * c + a20 * s;
      out[5] = a11 * c + a21 * s;
      out[6] = a12 * c + a22 * s;
      out[7] = a13 * c + a23 * s;
      out[8] = a20 * c - a10 * s;
      out[9] = a21 * c - a11 * s;
      out[10] = a22 * c - a12 * s;
      out[11] = a23 * c - a13 * s;
      return out;
    }
    function rotateY(out, a, rad) {
      var s = Math.sin(rad);
      var c = Math.cos(rad);
      var a00 = a[0];
      var a01 = a[1];
      var a02 = a[2];
      var a03 = a[3];
      var a20 = a[8];
      var a21 = a[9];
      var a22 = a[10];
      var a23 = a[11];
      if (a !== out) {
        out[4] = a[4];
        out[5] = a[5];
        out[6] = a[6];
        out[7] = a[7];
        out[12] = a[12];
        out[13] = a[13];
        out[14] = a[14];
        out[15] = a[15];
      }
      out[0] = a00 * c - a20 * s;
      out[1] = a01 * c - a21 * s;
      out[2] = a02 * c - a22 * s;
      out[3] = a03 * c - a23 * s;
      out[8] = a00 * s + a20 * c;
      out[9] = a01 * s + a21 * c;
      out[10] = a02 * s + a22 * c;
      out[11] = a03 * s + a23 * c;
      return out;
    }
    function rotateZ(out, a, rad) {
      var s = Math.sin(rad);
      var c = Math.cos(rad);
      var a00 = a[0];
      var a01 = a[1];
      var a02 = a[2];
      var a03 = a[3];
      var a10 = a[4];
      var a11 = a[5];
      var a12 = a[6];
      var a13 = a[7];
      if (a !== out) {
        out[8] = a[8];
        out[9] = a[9];
        out[10] = a[10];
        out[11] = a[11];
        out[12] = a[12];
        out[13] = a[13];
        out[14] = a[14];
        out[15] = a[15];
      }
      out[0] = a00 * c + a10 * s;
      out[1] = a01 * c + a11 * s;
      out[2] = a02 * c + a12 * s;
      out[3] = a03 * c + a13 * s;
      out[4] = a10 * c - a00 * s;
      out[5] = a11 * c - a01 * s;
      out[6] = a12 * c - a02 * s;
      out[7] = a13 * c - a03 * s;
      return out;
    }
    function fromTranslation(out, v) {
      out[0] = 1;
      out[1] = 0;
      out[2] = 0;
      out[3] = 0;
      out[4] = 0;
      out[5] = 1;
      out[6] = 0;
      out[7] = 0;
      out[8] = 0;
      out[9] = 0;
      out[10] = 1;
      out[11] = 0;
      out[12] = v[0];
      out[13] = v[1];
      out[14] = v[2];
      out[15] = 1;
      return out;
    }
    function fromScaling(out, v) {
      out[0] = v[0];
      out[1] = 0;
      out[2] = 0;
      out[3] = 0;
      out[4] = 0;
      out[5] = v[1];
      out[6] = 0;
      out[7] = 0;
      out[8] = 0;
      out[9] = 0;
      out[10] = v[2];
      out[11] = 0;
      out[12] = 0;
      out[13] = 0;
      out[14] = 0;
      out[15] = 1;
      return out;
    }
    function fromRotation(out, rad, axis) {
      var x = axis[0],
          y = axis[1],
          z = axis[2];
      var len = Math.sqrt(x * x + y * y + z * z);
      var s = void 0,
          c = void 0,
          t = void 0;
      if (Math.abs(len) < glMatrix.EPSILON) {
        return null;
      }
      len = 1 / len;
      x *= len;
      y *= len;
      z *= len;
      s = Math.sin(rad);
      c = Math.cos(rad);
      t = 1 - c;
      out[0] = x * x * t + c;
      out[1] = y * x * t + z * s;
      out[2] = z * x * t - y * s;
      out[3] = 0;
      out[4] = x * y * t - z * s;
      out[5] = y * y * t + c;
      out[6] = z * y * t + x * s;
      out[7] = 0;
      out[8] = x * z * t + y * s;
      out[9] = y * z * t - x * s;
      out[10] = z * z * t + c;
      out[11] = 0;
      out[12] = 0;
      out[13] = 0;
      out[14] = 0;
      out[15] = 1;
      return out;
    }
    function fromXRotation(out, rad) {
      var s = Math.sin(rad);
      var c = Math.cos(rad);
      out[0] = 1;
      out[1] = 0;
      out[2] = 0;
      out[3] = 0;
      out[4] = 0;
      out[5] = c;
      out[6] = s;
      out[7] = 0;
      out[8] = 0;
      out[9] = -s;
      out[10] = c;
      out[11] = 0;
      out[12] = 0;
      out[13] = 0;
      out[14] = 0;
      out[15] = 1;
      return out;
    }
    function fromYRotation(out, rad) {
      var s = Math.sin(rad);
      var c = Math.cos(rad);
      out[0] = c;
      out[1] = 0;
      out[2] = -s;
      out[3] = 0;
      out[4] = 0;
      out[5] = 1;
      out[6] = 0;
      out[7] = 0;
      out[8] = s;
      out[9] = 0;
      out[10] = c;
      out[11] = 0;
      out[12] = 0;
      out[13] = 0;
      out[14] = 0;
      out[15] = 1;
      return out;
    }
    function fromZRotation(out, rad) {
      var s = Math.sin(rad);
      var c = Math.cos(rad);
      out[0] = c;
      out[1] = s;
      out[2] = 0;
      out[3] = 0;
      out[4] = -s;
      out[5] = c;
      out[6] = 0;
      out[7] = 0;
      out[8] = 0;
      out[9] = 0;
      out[10] = 1;
      out[11] = 0;
      out[12] = 0;
      out[13] = 0;
      out[14] = 0;
      out[15] = 1;
      return out;
    }
    function fromRotationTranslation(out, q, v) {
      var x = q[0],
          y = q[1],
          z = q[2],
          w = q[3];
      var x2 = x + x;
      var y2 = y + y;
      var z2 = z + z;
      var xx = x * x2;
      var xy = x * y2;
      var xz = x * z2;
      var yy = y * y2;
      var yz = y * z2;
      var zz = z * z2;
      var wx = w * x2;
      var wy = w * y2;
      var wz = w * z2;
      out[0] = 1 - (yy + zz);
      out[1] = xy + wz;
      out[2] = xz - wy;
      out[3] = 0;
      out[4] = xy - wz;
      out[5] = 1 - (xx + zz);
      out[6] = yz + wx;
      out[7] = 0;
      out[8] = xz + wy;
      out[9] = yz - wx;
      out[10] = 1 - (xx + yy);
      out[11] = 0;
      out[12] = v[0];
      out[13] = v[1];
      out[14] = v[2];
      out[15] = 1;
      return out;
    }
    function getTranslation(out, mat) {
      out[0] = mat[12];
      out[1] = mat[13];
      out[2] = mat[14];
      return out;
    }
    function getScaling(out, mat) {
      var m11 = mat[0];
      var m12 = mat[1];
      var m13 = mat[2];
      var m21 = mat[4];
      var m22 = mat[5];
      var m23 = mat[6];
      var m31 = mat[8];
      var m32 = mat[9];
      var m33 = mat[10];
      out[0] = Math.sqrt(m11 * m11 + m12 * m12 + m13 * m13);
      out[1] = Math.sqrt(m21 * m21 + m22 * m22 + m23 * m23);
      out[2] = Math.sqrt(m31 * m31 + m32 * m32 + m33 * m33);
      return out;
    }
    function getRotation(out, mat) {
      var trace = mat[0] + mat[5] + mat[10];
      var S = 0;
      if (trace > 0) {
        S = Math.sqrt(trace + 1.0) * 2;
        out[3] = 0.25 * S;
        out[0] = (mat[6] - mat[9]) / S;
        out[1] = (mat[8] - mat[2]) / S;
        out[2] = (mat[1] - mat[4]) / S;
      } else if (mat[0] > mat[5] & mat[0] > mat[10]) {
        S = Math.sqrt(1.0 + mat[0] - mat[5] - mat[10]) * 2;
        out[3] = (mat[6] - mat[9]) / S;
        out[0] = 0.25 * S;
        out[1] = (mat[1] + mat[4]) / S;
        out[2] = (mat[8] + mat[2]) / S;
      } else if (mat[5] > mat[10]) {
        S = Math.sqrt(1.0 + mat[5] - mat[0] - mat[10]) * 2;
        out[3] = (mat[8] - mat[2]) / S;
        out[0] = (mat[1] + mat[4]) / S;
        out[1] = 0.25 * S;
        out[2] = (mat[6] + mat[9]) / S;
      } else {
        S = Math.sqrt(1.0 + mat[10] - mat[0] - mat[5]) * 2;
        out[3] = (mat[1] - mat[4]) / S;
        out[0] = (mat[8] + mat[2]) / S;
        out[1] = (mat[6] + mat[9]) / S;
        out[2] = 0.25 * S;
      }
      return out;
    }
    function fromRotationTranslationScale(out, q, v, s) {
      var x = q[0],
          y = q[1],
          z = q[2],
          w = q[3];
      var x2 = x + x;
      var y2 = y + y;
      var z2 = z + z;
      var xx = x * x2;
      var xy = x * y2;
      var xz = x * z2;
      var yy = y * y2;
      var yz = y * z2;
      var zz = z * z2;
      var wx = w * x2;
      var wy = w * y2;
      var wz = w * z2;
      var sx = s[0];
      var sy = s[1];
      var sz = s[2];
      out[0] = (1 - (yy + zz)) * sx;
      out[1] = (xy + wz) * sx;
      out[2] = (xz - wy) * sx;
      out[3] = 0;
      out[4] = (xy - wz) * sy;
      out[5] = (1 - (xx + zz)) * sy;
      out[6] = (yz + wx) * sy;
      out[7] = 0;
      out[8] = (xz + wy) * sz;
      out[9] = (yz - wx) * sz;
      out[10] = (1 - (xx + yy)) * sz;
      out[11] = 0;
      out[12] = v[0];
      out[13] = v[1];
      out[14] = v[2];
      out[15] = 1;
      return out;
    }
    function fromRotationTranslationScaleOrigin(out, q, v, s, o) {
      var x = q[0],
          y = q[1],
          z = q[2],
          w = q[3];
      var x2 = x + x;
      var y2 = y + y;
      var z2 = z + z;
      var xx = x * x2;
      var xy = x * y2;
      var xz = x * z2;
      var yy = y * y2;
      var yz = y * z2;
      var zz = z * z2;
      var wx = w * x2;
      var wy = w * y2;
      var wz = w * z2;
      var sx = s[0];
      var sy = s[1];
      var sz = s[2];
      var ox = o[0];
      var oy = o[1];
      var oz = o[2];
      out[0] = (1 - (yy + zz)) * sx;
      out[1] = (xy + wz) * sx;
      out[2] = (xz - wy) * sx;
      out[3] = 0;
      out[4] = (xy - wz) * sy;
      out[5] = (1 - (xx + zz)) * sy;
      out[6] = (yz + wx) * sy;
      out[7] = 0;
      out[8] = (xz + wy) * sz;
      out[9] = (yz - wx) * sz;
      out[10] = (1 - (xx + yy)) * sz;
      out[11] = 0;
      out[12] = v[0] + ox - (out[0] * ox + out[4] * oy + out[8] * oz);
      out[13] = v[1] + oy - (out[1] * ox + out[5] * oy + out[9] * oz);
      out[14] = v[2] + oz - (out[2] * ox + out[6] * oy + out[10] * oz);
      out[15] = 1;
      return out;
    }
    function fromQuat(out, q) {
      var x = q[0],
          y = q[1],
          z = q[2],
          w = q[3];
      var x2 = x + x;
      var y2 = y + y;
      var z2 = z + z;
      var xx = x * x2;
      var yx = y * x2;
      var yy = y * y2;
      var zx = z * x2;
      var zy = z * y2;
      var zz = z * z2;
      var wx = w * x2;
      var wy = w * y2;
      var wz = w * z2;
      out[0] = 1 - yy - zz;
      out[1] = yx + wz;
      out[2] = zx - wy;
      out[3] = 0;
      out[4] = yx - wz;
      out[5] = 1 - xx - zz;
      out[6] = zy + wx;
      out[7] = 0;
      out[8] = zx + wy;
      out[9] = zy - wx;
      out[10] = 1 - xx - yy;
      out[11] = 0;
      out[12] = 0;
      out[13] = 0;
      out[14] = 0;
      out[15] = 1;
      return out;
    }
    function frustum(out, left, right, bottom, top, near, far) {
      var rl = 1 / (right - left);
      var tb = 1 / (top - bottom);
      var nf = 1 / (near - far);
      out[0] = near * 2 * rl;
      out[1] = 0;
      out[2] = 0;
      out[3] = 0;
      out[4] = 0;
      out[5] = near * 2 * tb;
      out[6] = 0;
      out[7] = 0;
      out[8] = (right + left) * rl;
      out[9] = (top + bottom) * tb;
      out[10] = (far + near) * nf;
      out[11] = -1;
      out[12] = 0;
      out[13] = 0;
      out[14] = far * near * 2 * nf;
      out[15] = 0;
      return out;
    }
    function perspective(out, fovy, aspect, near, far) {
      var f = 1.0 / Math.tan(fovy / 2);
      var nf = 1 / (near - far);
      out[0] = f / aspect;
      out[1] = 0;
      out[2] = 0;
      out[3] = 0;
      out[4] = 0;
      out[5] = f;
      out[6] = 0;
      out[7] = 0;
      out[8] = 0;
      out[9] = 0;
      out[10] = (far + near) * nf;
      out[11] = -1;
      out[12] = 0;
      out[13] = 0;
      out[14] = 2 * far * near * nf;
      out[15] = 0;
      return out;
    }
    function perspectiveFromFieldOfView(out, fov, near, far) {
      var upTan = Math.tan(fov.upDegrees * Math.PI / 180.0);
      var downTan = Math.tan(fov.downDegrees * Math.PI / 180.0);
      var leftTan = Math.tan(fov.leftDegrees * Math.PI / 180.0);
      var rightTan = Math.tan(fov.rightDegrees * Math.PI / 180.0);
      var xScale = 2.0 / (leftTan + rightTan);
      var yScale = 2.0 / (upTan + downTan);
      out[0] = xScale;
      out[1] = 0.0;
      out[2] = 0.0;
      out[3] = 0.0;
      out[4] = 0.0;
      out[5] = yScale;
      out[6] = 0.0;
      out[7] = 0.0;
      out[8] = -((leftTan - rightTan) * xScale * 0.5);
      out[9] = (upTan - downTan) * yScale * 0.5;
      out[10] = far / (near - far);
      out[11] = -1.0;
      out[12] = 0.0;
      out[13] = 0.0;
      out[14] = far * near / (near - far);
      out[15] = 0.0;
      return out;
    }
    function ortho(out, left, right, bottom, top, near, far) {
      var lr = 1 / (left - right);
      var bt = 1 / (bottom - top);
      var nf = 1 / (near - far);
      out[0] = -2 * lr;
      out[1] = 0;
      out[2] = 0;
      out[3] = 0;
      out[4] = 0;
      out[5] = -2 * bt;
      out[6] = 0;
      out[7] = 0;
      out[8] = 0;
      out[9] = 0;
      out[10] = 2 * nf;
      out[11] = 0;
      out[12] = (left + right) * lr;
      out[13] = (top + bottom) * bt;
      out[14] = (far + near) * nf;
      out[15] = 1;
      return out;
    }
    function lookAt(out, eye, center, up) {
      var x0 = void 0,
          x1 = void 0,
          x2 = void 0,
          y0 = void 0,
          y1 = void 0,
          y2 = void 0,
          z0 = void 0,
          z1 = void 0,
          z2 = void 0,
          len = void 0;
      var eyex = eye[0];
      var eyey = eye[1];
      var eyez = eye[2];
      var upx = up[0];
      var upy = up[1];
      var upz = up[2];
      var centerx = center[0];
      var centery = center[1];
      var centerz = center[2];
      if (Math.abs(eyex - centerx) < glMatrix.EPSILON && Math.abs(eyey - centery) < glMatrix.EPSILON && Math.abs(eyez - centerz) < glMatrix.EPSILON) {
        return mat4.identity(out);
      }
      z0 = eyex - centerx;
      z1 = eyey - centery;
      z2 = eyez - centerz;
      len = 1 / Math.sqrt(z0 * z0 + z1 * z1 + z2 * z2);
      z0 *= len;
      z1 *= len;
      z2 *= len;
      x0 = upy * z2 - upz * z1;
      x1 = upz * z0 - upx * z2;
      x2 = upx * z1 - upy * z0;
      len = Math.sqrt(x0 * x0 + x1 * x1 + x2 * x2);
      if (!len) {
        x0 = 0;
        x1 = 0;
        x2 = 0;
      } else {
        len = 1 / len;
        x0 *= len;
        x1 *= len;
        x2 *= len;
      }
      y0 = z1 * x2 - z2 * x1;
      y1 = z2 * x0 - z0 * x2;
      y2 = z0 * x1 - z1 * x0;
      len = Math.sqrt(y0 * y0 + y1 * y1 + y2 * y2);
      if (!len) {
        y0 = 0;
        y1 = 0;
        y2 = 0;
      } else {
        len = 1 / len;
        y0 *= len;
        y1 *= len;
        y2 *= len;
      }
      out[0] = x0;
      out[1] = y0;
      out[2] = z0;
      out[3] = 0;
      out[4] = x1;
      out[5] = y1;
      out[6] = z1;
      out[7] = 0;
      out[8] = x2;
      out[9] = y2;
      out[10] = z2;
      out[11] = 0;
      out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);
      out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);
      out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);
      out[15] = 1;
      return out;
    }
    function targetTo(out, eye, target, up) {
      var eyex = eye[0],
          eyey = eye[1],
          eyez = eye[2],
          upx = up[0],
          upy = up[1],
          upz = up[2];
      var z0 = eyex - target[0],
          z1 = eyey - target[1],
          z2 = eyez - target[2];
      var len = z0 * z0 + z1 * z1 + z2 * z2;
      if (len > 0) {
        len = 1 / Math.sqrt(len);
        z0 *= len;
        z1 *= len;
        z2 *= len;
      }
      var x0 = upy * z2 - upz * z1,
          x1 = upz * z0 - upx * z2,
          x2 = upx * z1 - upy * z0;
      out[0] = x0;
      out[1] = x1;
      out[2] = x2;
      out[3] = 0;
      out[4] = z1 * x2 - z2 * x1;
      out[5] = z2 * x0 - z0 * x2;
      out[6] = z0 * x1 - z1 * x0;
      out[7] = 0;
      out[8] = z0;
      out[9] = z1;
      out[10] = z2;
      out[11] = 0;
      out[12] = eyex;
      out[13] = eyey;
      out[14] = eyez;
      out[15] = 1;
      return out;
    }
    ;
    function str(a) {
      return 'mat4(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ', ' + a[4] + ', ' + a[5] + ', ' + a[6] + ', ' + a[7] + ', ' + a[8] + ', ' + a[9] + ', ' + a[10] + ', ' + a[11] + ', ' + a[12] + ', ' + a[13] + ', ' + a[14] + ', ' + a[15] + ')';
    }
    function frob(a) {
      return Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2) + Math.pow(a[4], 2) + Math.pow(a[5], 2) + Math.pow(a[6], 2) + Math.pow(a[7], 2) + Math.pow(a[8], 2) + Math.pow(a[9], 2) + Math.pow(a[10], 2) + Math.pow(a[11], 2) + Math.pow(a[12], 2) + Math.pow(a[13], 2) + Math.pow(a[14], 2) + Math.pow(a[15], 2));
    }
    function add(out, a, b) {
      out[0] = a[0] + b[0];
      out[1] = a[1] + b[1];
      out[2] = a[2] + b[2];
      out[3] = a[3] + b[3];
      out[4] = a[4] + b[4];
      out[5] = a[5] + b[5];
      out[6] = a[6] + b[6];
      out[7] = a[7] + b[7];
      out[8] = a[8] + b[8];
      out[9] = a[9] + b[9];
      out[10] = a[10] + b[10];
      out[11] = a[11] + b[11];
      out[12] = a[12] + b[12];
      out[13] = a[13] + b[13];
      out[14] = a[14] + b[14];
      out[15] = a[15] + b[15];
      return out;
    }
    function subtract(out, a, b) {
      out[0] = a[0] - b[0];
      out[1] = a[1] - b[1];
      out[2] = a[2] - b[2];
      out[3] = a[3] - b[3];
      out[4] = a[4] - b[4];
      out[5] = a[5] - b[5];
      out[6] = a[6] - b[6];
      out[7] = a[7] - b[7];
      out[8] = a[8] - b[8];
      out[9] = a[9] - b[9];
      out[10] = a[10] - b[10];
      out[11] = a[11] - b[11];
      out[12] = a[12] - b[12];
      out[13] = a[13] - b[13];
      out[14] = a[14] - b[14];
      out[15] = a[15] - b[15];
      return out;
    }
    function multiplyScalar(out, a, b) {
      out[0] = a[0] * b;
      out[1] = a[1] * b;
      out[2] = a[2] * b;
      out[3] = a[3] * b;
      out[4] = a[4] * b;
      out[5] = a[5] * b;
      out[6] = a[6] * b;
      out[7] = a[7] * b;
      out[8] = a[8] * b;
      out[9] = a[9] * b;
      out[10] = a[10] * b;
      out[11] = a[11] * b;
      out[12] = a[12] * b;
      out[13] = a[13] * b;
      out[14] = a[14] * b;
      out[15] = a[15] * b;
      return out;
    }
    function multiplyScalarAndAdd(out, a, b, scale) {
      out[0] = a[0] + b[0] * scale;
      out[1] = a[1] + b[1] * scale;
      out[2] = a[2] + b[2] * scale;
      out[3] = a[3] + b[3] * scale;
      out[4] = a[4] + b[4] * scale;
      out[5] = a[5] + b[5] * scale;
      out[6] = a[6] + b[6] * scale;
      out[7] = a[7] + b[7] * scale;
      out[8] = a[8] + b[8] * scale;
      out[9] = a[9] + b[9] * scale;
      out[10] = a[10] + b[10] * scale;
      out[11] = a[11] + b[11] * scale;
      out[12] = a[12] + b[12] * scale;
      out[13] = a[13] + b[13] * scale;
      out[14] = a[14] + b[14] * scale;
      out[15] = a[15] + b[15] * scale;
      return out;
    }
    function exactEquals(a, b) {
      return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] && a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15];
    }
    function equals(a, b) {
      var a0 = a[0],
          a1 = a[1],
          a2 = a[2],
          a3 = a[3];
      var a4 = a[4],
          a5 = a[5],
          a6 = a[6],
          a7 = a[7];
      var a8 = a[8],
          a9 = a[9],
          a10 = a[10],
          a11 = a[11];
      var a12 = a[12],
          a13 = a[13],
          a14 = a[14],
          a15 = a[15];
      var b0 = b[0],
          b1 = b[1],
          b2 = b[2],
          b3 = b[3];
      var b4 = b[4],
          b5 = b[5],
          b6 = b[6],
          b7 = b[7];
      var b8 = b[8],
          b9 = b[9],
          b10 = b[10],
          b11 = b[11];
      var b12 = b[12],
          b13 = b[13],
          b14 = b[14],
          b15 = b[15];
      return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)) && Math.abs(a9 - b9) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a9), Math.abs(b9)) && Math.abs(a10 - b10) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a10), Math.abs(b10)) && Math.abs(a11 - b11) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a11), Math.abs(b11)) && Math.abs(a12 - b12) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a12), Math.abs(b12)) && Math.abs(a13 - b13) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a13), Math.abs(b13)) && Math.abs(a14 - b14) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a14), Math.abs(b14)) && Math.abs(a15 - b15) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a15), Math.abs(b15));
    }
    var mul = exports.mul = multiply;
    var sub = exports.sub = subtract;
  }), (function(module, exports, __webpack_require__) {
    "use strict";
    Object.defineProperty(exports, "__esModule", {value: true});
    exports.setAxes = exports.sqlerp = exports.rotationTo = exports.equals = exports.exactEquals = exports.normalize = exports.sqrLen = exports.squaredLength = exports.len = exports.length = exports.lerp = exports.dot = exports.scale = exports.mul = exports.add = exports.set = exports.copy = exports.fromValues = exports.clone = undefined;
    exports.create = create;
    exports.identity = identity;
    exports.setAxisAngle = setAxisAngle;
    exports.getAxisAngle = getAxisAngle;
    exports.multiply = multiply;
    exports.rotateX = rotateX;
    exports.rotateY = rotateY;
    exports.rotateZ = rotateZ;
    exports.calculateW = calculateW;
    exports.slerp = slerp;
    exports.invert = invert;
    exports.conjugate = conjugate;
    exports.fromMat3 = fromMat3;
    exports.fromEuler = fromEuler;
    exports.str = str;
    var _common = __webpack_require__(0);
    var glMatrix = _interopRequireWildcard(_common);
    var _mat = __webpack_require__(1);
    var mat3 = _interopRequireWildcard(_mat);
    var _vec = __webpack_require__(2);
    var vec3 = _interopRequireWildcard(_vec);
    var _vec2 = __webpack_require__(3);
    var vec4 = _interopRequireWildcard(_vec2);
    function _interopRequireWildcard(obj) {
      if (obj && obj.__esModule) {
        return obj;
      } else {
        var newObj = {};
        if (obj != null) {
          for (var key in obj) {
            if (Object.prototype.hasOwnProperty.call(obj, key))
              newObj[key] = obj[key];
          }
        }
        newObj.default = obj;
        return newObj;
      }
    }
    function create() {
      var out = new glMatrix.ARRAY_TYPE(4);
      out[0] = 0;
      out[1] = 0;
      out[2] = 0;
      out[3] = 1;
      return out;
    }
    function identity(out) {
      out[0] = 0;
      out[1] = 0;
      out[2] = 0;
      out[3] = 1;
      return out;
    }
    function setAxisAngle(out, axis, rad) {
      rad = rad * 0.5;
      var s = Math.sin(rad);
      out[0] = s * axis[0];
      out[1] = s * axis[1];
      out[2] = s * axis[2];
      out[3] = Math.cos(rad);
      return out;
    }
    function getAxisAngle(out_axis, q) {
      var rad = Math.acos(q[3]) * 2.0;
      var s = Math.sin(rad / 2.0);
      if (s != 0.0) {
        out_axis[0] = q[0] / s;
        out_axis[1] = q[1] / s;
        out_axis[2] = q[2] / s;
      } else {
        out_axis[0] = 1;
        out_axis[1] = 0;
        out_axis[2] = 0;
      }
      return rad;
    }
    function multiply(out, a, b) {
      var ax = a[0],
          ay = a[1],
          az = a[2],
          aw = a[3];
      var bx = b[0],
          by = b[1],
          bz = b[2],
          bw = b[3];
      out[0] = ax * bw + aw * bx + ay * bz - az * by;
      out[1] = ay * bw + aw * by + az * bx - ax * bz;
      out[2] = az * bw + aw * bz + ax * by - ay * bx;
      out[3] = aw * bw - ax * bx - ay * by - az * bz;
      return out;
    }
    function rotateX(out, a, rad) {
      rad *= 0.5;
      var ax = a[0],
          ay = a[1],
          az = a[2],
          aw = a[3];
      var bx = Math.sin(rad),
          bw = Math.cos(rad);
      out[0] = ax * bw + aw * bx;
      out[1] = ay * bw + az * bx;
      out[2] = az * bw - ay * bx;
      out[3] = aw * bw - ax * bx;
      return out;
    }
    function rotateY(out, a, rad) {
      rad *= 0.5;
      var ax = a[0],
          ay = a[1],
          az = a[2],
          aw = a[3];
      var by = Math.sin(rad),
          bw = Math.cos(rad);
      out[0] = ax * bw - az * by;
      out[1] = ay * bw + aw * by;
      out[2] = az * bw + ax * by;
      out[3] = aw * bw - ay * by;
      return out;
    }
    function rotateZ(out, a, rad) {
      rad *= 0.5;
      var ax = a[0],
          ay = a[1],
          az = a[2],
          aw = a[3];
      var bz = Math.sin(rad),
          bw = Math.cos(rad);
      out[0] = ax * bw + ay * bz;
      out[1] = ay * bw - ax * bz;
      out[2] = az * bw + aw * bz;
      out[3] = aw * bw - az * bz;
      return out;
    }
    function calculateW(out, a) {
      var x = a[0],
          y = a[1],
          z = a[2];
      out[0] = x;
      out[1] = y;
      out[2] = z;
      out[3] = Math.sqrt(Math.abs(1.0 - x * x - y * y - z * z));
      return out;
    }
    function slerp(out, a, b, t) {
      var ax = a[0],
          ay = a[1],
          az = a[2],
          aw = a[3];
      var bx = b[0],
          by = b[1],
          bz = b[2],
          bw = b[3];
      var omega = void 0,
          cosom = void 0,
          sinom = void 0,
          scale0 = void 0,
          scale1 = void 0;
      cosom = ax * bx + ay * by + az * bz + aw * bw;
      if (cosom < 0.0) {
        cosom = -cosom;
        bx = -bx;
        by = -by;
        bz = -bz;
        bw = -bw;
      }
      if (1.0 - cosom > 0.000001) {
        omega = Math.acos(cosom);
        sinom = Math.sin(omega);
        scale0 = Math.sin((1.0 - t) * omega) / sinom;
        scale1 = Math.sin(t * omega) / sinom;
      } else {
        scale0 = 1.0 - t;
        scale1 = t;
      }
      out[0] = scale0 * ax + scale1 * bx;
      out[1] = scale0 * ay + scale1 * by;
      out[2] = scale0 * az + scale1 * bz;
      out[3] = scale0 * aw + scale1 * bw;
      return out;
    }
    function invert(out, a) {
      var a0 = a[0],
          a1 = a[1],
          a2 = a[2],
          a3 = a[3];
      var dot = a0 * a0 + a1 * a1 + a2 * a2 + a3 * a3;
      var invDot = dot ? 1.0 / dot : 0;
      out[0] = -a0 * invDot;
      out[1] = -a1 * invDot;
      out[2] = -a2 * invDot;
      out[3] = a3 * invDot;
      return out;
    }
    function conjugate(out, a) {
      out[0] = -a[0];
      out[1] = -a[1];
      out[2] = -a[2];
      out[3] = a[3];
      return out;
    }
    function fromMat3(out, m) {
      var fTrace = m[0] + m[4] + m[8];
      var fRoot = void 0;
      if (fTrace > 0.0) {
        fRoot = Math.sqrt(fTrace + 1.0);
        out[3] = 0.5 * fRoot;
        fRoot = 0.5 / fRoot;
        out[0] = (m[5] - m[7]) * fRoot;
        out[1] = (m[6] - m[2]) * fRoot;
        out[2] = (m[1] - m[3]) * fRoot;
      } else {
        var i = 0;
        if (m[4] > m[0])
          i = 1;
        if (m[8] > m[i * 3 + i])
          i = 2;
        var j = (i + 1) % 3;
        var k = (i + 2) % 3;
        fRoot = Math.sqrt(m[i * 3 + i] - m[j * 3 + j] - m[k * 3 + k] + 1.0);
        out[i] = 0.5 * fRoot;
        fRoot = 0.5 / fRoot;
        out[3] = (m[j * 3 + k] - m[k * 3 + j]) * fRoot;
        out[j] = (m[j * 3 + i] + m[i * 3 + j]) * fRoot;
        out[k] = (m[k * 3 + i] + m[i * 3 + k]) * fRoot;
      }
      return out;
    }
    function fromEuler(out, x, y, z) {
      var halfToRad = 0.5 * Math.PI / 180.0;
      x *= halfToRad;
      y *= halfToRad;
      z *= halfToRad;
      var sx = Math.sin(x);
      var cx = Math.cos(x);
      var sy = Math.sin(y);
      var cy = Math.cos(y);
      var sz = Math.sin(z);
      var cz = Math.cos(z);
      out[0] = sx * cy * cz - cx * sy * sz;
      out[1] = cx * sy * cz + sx * cy * sz;
      out[2] = cx * cy * sz - sx * sy * cz;
      out[3] = cx * cy * cz + sx * sy * sz;
      return out;
    }
    function str(a) {
      return 'quat(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ')';
    }
    var clone = exports.clone = vec4.clone;
    var fromValues = exports.fromValues = vec4.fromValues;
    var copy = exports.copy = vec4.copy;
    var set = exports.set = vec4.set;
    var add = exports.add = vec4.add;
    var mul = exports.mul = multiply;
    var scale = exports.scale = vec4.scale;
    var dot = exports.dot = vec4.dot;
    var lerp = exports.lerp = vec4.lerp;
    var length = exports.length = vec4.length;
    var len = exports.len = length;
    var squaredLength = exports.squaredLength = vec4.squaredLength;
    var sqrLen = exports.sqrLen = squaredLength;
    var normalize = exports.normalize = vec4.normalize;
    var exactEquals = exports.exactEquals = vec4.exactEquals;
    var equals = exports.equals = vec4.equals;
    var rotationTo = exports.rotationTo = function() {
      var tmpvec3 = vec3.create();
      var xUnitVec3 = vec3.fromValues(1, 0, 0);
      var yUnitVec3 = vec3.fromValues(0, 1, 0);
      return function(out, a, b) {
        var dot = vec3.dot(a, b);
        if (dot < -0.999999) {
          vec3.cross(tmpvec3, xUnitVec3, a);
          if (vec3.len(tmpvec3) < 0.000001)
            vec3.cross(tmpvec3, yUnitVec3, a);
          vec3.normalize(tmpvec3, tmpvec3);
          setAxisAngle(out, tmpvec3, Math.PI);
          return out;
        } else if (dot > 0.999999) {
          out[0] = 0;
          out[1] = 0;
          out[2] = 0;
          out[3] = 1;
          return out;
        } else {
          vec3.cross(tmpvec3, a, b);
          out[0] = tmpvec3[0];
          out[1] = tmpvec3[1];
          out[2] = tmpvec3[2];
          out[3] = 1 + dot;
          return normalize(out, out);
        }
      };
    }();
    var sqlerp = exports.sqlerp = function() {
      var temp1 = create();
      var temp2 = create();
      return function(out, a, b, c, d, t) {
        slerp(temp1, a, d, t);
        slerp(temp2, b, c, t);
        slerp(out, temp1, temp2, 2 * t * (1 - t));
        return out;
      };
    }();
    var setAxes = exports.setAxes = function() {
      var matr = mat3.create();
      return function(out, view, right, up) {
        matr[0] = right[0];
        matr[3] = right[1];
        matr[6] = right[2];
        matr[1] = up[0];
        matr[4] = up[1];
        matr[7] = up[2];
        matr[2] = -view[0];
        matr[5] = -view[1];
        matr[8] = -view[2];
        return normalize(out, fromMat3(out, matr));
      };
    }();
  }), (function(module, exports, __webpack_require__) {
    "use strict";
    Object.defineProperty(exports, "__esModule", {value: true});
    exports.forEach = exports.sqrLen = exports.sqrDist = exports.dist = exports.div = exports.mul = exports.sub = exports.len = undefined;
    exports.create = create;
    exports.clone = clone;
    exports.fromValues = fromValues;
    exports.copy = copy;
    exports.set = set;
    exports.add = add;
    exports.subtract = subtract;
    exports.multiply = multiply;
    exports.divide = divide;
    exports.ceil = ceil;
    exports.floor = floor;
    exports.min = min;
    exports.max = max;
    exports.round = round;
    exports.scale = scale;
    exports.scaleAndAdd = scaleAndAdd;
    exports.distance = distance;
    exports.squaredDistance = squaredDistance;
    exports.length = length;
    exports.squaredLength = squaredLength;
    exports.negate = negate;
    exports.inverse = inverse;
    exports.normalize = normalize;
    exports.dot = dot;
    exports.cross = cross;
    exports.lerp = lerp;
    exports.random = random;
    exports.transformMat2 = transformMat2;
    exports.transformMat2d = transformMat2d;
    exports.transformMat3 = transformMat3;
    exports.transformMat4 = transformMat4;
    exports.str = str;
    exports.exactEquals = exactEquals;
    exports.equals = equals;
    var _common = __webpack_require__(0);
    var glMatrix = _interopRequireWildcard(_common);
    function _interopRequireWildcard(obj) {
      if (obj && obj.__esModule) {
        return obj;
      } else {
        var newObj = {};
        if (obj != null) {
          for (var key in obj) {
            if (Object.prototype.hasOwnProperty.call(obj, key))
              newObj[key] = obj[key];
          }
        }
        newObj.default = obj;
        return newObj;
      }
    }
    function create() {
      var out = new glMatrix.ARRAY_TYPE(2);
      out[0] = 0;
      out[1] = 0;
      return out;
    }
    function clone(a) {
      var out = new glMatrix.ARRAY_TYPE(2);
      out[0] = a[0];
      out[1] = a[1];
      return out;
    }
    function fromValues(x, y) {
      var out = new glMatrix.ARRAY_TYPE(2);
      out[0] = x;
      out[1] = y;
      return out;
    }
    function copy(out, a) {
      out[0] = a[0];
      out[1] = a[1];
      return out;
    }
    function set(out, x, y) {
      out[0] = x;
      out[1] = y;
      return out;
    }
    function add(out, a, b) {
      out[0] = a[0] + b[0];
      out[1] = a[1] + b[1];
      return out;
    }
    function subtract(out, a, b) {
      out[0] = a[0] - b[0];
      out[1] = a[1] - b[1];
      return out;
    }
    function multiply(out, a, b) {
      out[0] = a[0] * b[0];
      out[1] = a[1] * b[1];
      return out;
    }
    ;
    function divide(out, a, b) {
      out[0] = a[0] / b[0];
      out[1] = a[1] / b[1];
      return out;
    }
    ;
    function ceil(out, a) {
      out[0] = Math.ceil(a[0]);
      out[1] = Math.ceil(a[1]);
      return out;
    }
    ;
    function floor(out, a) {
      out[0] = Math.floor(a[0]);
      out[1] = Math.floor(a[1]);
      return out;
    }
    ;
    function min(out, a, b) {
      out[0] = Math.min(a[0], b[0]);
      out[1] = Math.min(a[1], b[1]);
      return out;
    }
    ;
    function max(out, a, b) {
      out[0] = Math.max(a[0], b[0]);
      out[1] = Math.max(a[1], b[1]);
      return out;
    }
    ;
    function round(out, a) {
      out[0] = Math.round(a[0]);
      out[1] = Math.round(a[1]);
      return out;
    }
    ;
    function scale(out, a, b) {
      out[0] = a[0] * b;
      out[1] = a[1] * b;
      return out;
    }
    ;
    function scaleAndAdd(out, a, b, scale) {
      out[0] = a[0] + b[0] * scale;
      out[1] = a[1] + b[1] * scale;
      return out;
    }
    ;
    function distance(a, b) {
      var x = b[0] - a[0],
          y = b[1] - a[1];
      return Math.sqrt(x * x + y * y);
    }
    ;
    function squaredDistance(a, b) {
      var x = b[0] - a[0],
          y = b[1] - a[1];
      return x * x + y * y;
    }
    ;
    function length(a) {
      var x = a[0],
          y = a[1];
      return Math.sqrt(x * x + y * y);
    }
    ;
    function squaredLength(a) {
      var x = a[0],
          y = a[1];
      return x * x + y * y;
    }
    ;
    function negate(out, a) {
      out[0] = -a[0];
      out[1] = -a[1];
      return out;
    }
    ;
    function inverse(out, a) {
      out[0] = 1.0 / a[0];
      out[1] = 1.0 / a[1];
      return out;
    }
    ;
    function normalize(out, a) {
      var x = a[0],
          y = a[1];
      var len = x * x + y * y;
      if (len > 0) {
        len = 1 / Math.sqrt(len);
        out[0] = a[0] * len;
        out[1] = a[1] * len;
      }
      return out;
    }
    ;
    function dot(a, b) {
      return a[0] * b[0] + a[1] * b[1];
    }
    ;
    function cross(out, a, b) {
      var z = a[0] * b[1] - a[1] * b[0];
      out[0] = out[1] = 0;
      out[2] = z;
      return out;
    }
    ;
    function lerp(out, a, b, t) {
      var ax = a[0],
          ay = a[1];
      out[0] = ax + t * (b[0] - ax);
      out[1] = ay + t * (b[1] - ay);
      return out;
    }
    ;
    function random(out, scale) {
      scale = scale || 1.0;
      var r = glMatrix.RANDOM() * 2.0 * Math.PI;
      out[0] = Math.cos(r) * scale;
      out[1] = Math.sin(r) * scale;
      return out;
    }
    ;
    function transformMat2(out, a, m) {
      var x = a[0],
          y = a[1];
      out[0] = m[0] * x + m[2] * y;
      out[1] = m[1] * x + m[3] * y;
      return out;
    }
    ;
    function transformMat2d(out, a, m) {
      var x = a[0],
          y = a[1];
      out[0] = m[0] * x + m[2] * y + m[4];
      out[1] = m[1] * x + m[3] * y + m[5];
      return out;
    }
    ;
    function transformMat3(out, a, m) {
      var x = a[0],
          y = a[1];
      out[0] = m[0] * x + m[3] * y + m[6];
      out[1] = m[1] * x + m[4] * y + m[7];
      return out;
    }
    ;
    function transformMat4(out, a, m) {
      var x = a[0];
      var y = a[1];
      out[0] = m[0] * x + m[4] * y + m[12];
      out[1] = m[1] * x + m[5] * y + m[13];
      return out;
    }
    function str(a) {
      return 'vec2(' + a[0] + ', ' + a[1] + ')';
    }
    function exactEquals(a, b) {
      return a[0] === b[0] && a[1] === b[1];
    }
    function equals(a, b) {
      var a0 = a[0],
          a1 = a[1];
      var b0 = b[0],
          b1 = b[1];
      return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1));
    }
    var len = exports.len = length;
    var sub = exports.sub = subtract;
    var mul = exports.mul = multiply;
    var div = exports.div = divide;
    var dist = exports.dist = distance;
    var sqrDist = exports.sqrDist = squaredDistance;
    var sqrLen = exports.sqrLen = squaredLength;
    var forEach = exports.forEach = function() {
      var vec = create();
      return function(a, stride, offset, count, fn, arg) {
        var i = void 0,
            l = void 0;
        if (!stride) {
          stride = 2;
        }
        if (!offset) {
          offset = 0;
        }
        if (count) {
          l = Math.min(count * stride + offset, a.length);
        } else {
          l = a.length;
        }
        for (i = offset; i < l; i += stride) {
          vec[0] = a[i];
          vec[1] = a[i + 1];
          fn(vec, vec, arg);
          a[i] = vec[0];
          a[i + 1] = vec[1];
        }
        return a;
      };
    }();
  })]);
});

})();
(function() {
var define = $__System.amdDefine;
define("29", ["28"], function(main) {
  return main;
});

})();
(function() {
var define = $__System.amdDefine;
(function webpackUniversalModuleDefinition(root, factory) {
  if (typeof exports === 'object' && typeof module === 'object')
    module.exports = factory(require("gl-matrix"));
  else if (typeof define === 'function' && define.amd)
    define("2a", ["29"], factory);
  else if (typeof exports === 'object')
    exports["blenderHTML5Animations"] = factory(require("gl-matrix"));
  else
    root["blenderHTML5Animations"] = factory(root["window"]);
})(this, function(__WEBPACK_EXTERNAL_MODULE_2__) {
  return (function(modules) {
    var installedModules = {};
    function __webpack_require__(moduleId) {
      if (installedModules[moduleId])
        return installedModules[moduleId].exports;
      var module = installedModules[moduleId] = {
        exports: {},
        id: moduleId,
        loaded: false
      };
      modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
      module.loaded = true;
      return module.exports;
    }
    __webpack_require__.m = modules;
    __webpack_require__.c = installedModules;
    __webpack_require__.p = "";
    return __webpack_require__(0);
  })([function(module, exports, __webpack_require__) {
    'use strict';
    module.exports.Action = __webpack_require__(1);
    module.exports.ActionLibrary = __webpack_require__(9);
    module.exports.FCurve = __webpack_require__(4);
    module.exports.FCurveArray = __webpack_require__(3);
    module.exports.Keyframe = __webpack_require__(7);
    module.exports.Marker = __webpack_require__(8);
  }, function(module, exports, __webpack_require__) {
    'use strict';
    var glMatrixLib = __webpack_require__(2);
    var glMatrix = glMatrixLib.glMatrix;
    var mat4 = glMatrixLib.mat4;
    var vec3 = glMatrixLib.vec3;
    var FCurveArray = __webpack_require__(3);
    var Marker = __webpack_require__(8);
    function Action(data) {
      var self = this;
      this.startTime = +Infinity;
      this.endTime = -Infinity;
      function timeUpdater(fcurve) {
        if (fcurve) {
          self.startTime = Math.min(self.startTime, fcurve.keyframes[0].time);
          self.endTime = Math.max(self.endTime, fcurve.keyframes[fcurve.keyframes.length - 1].time);
        }
      }
      this.paths = {};
      for (var groupName in data[0]) {
        var path = new FCurveArray(data[0][groupName]);
        this.paths[groupName] = path;
        path.forEach(timeUpdater);
      }
      this.markers = data.length > 1 ? data[1].map(function(data) {
        return new Marker(data);
      }) : [];
    }
    Action.RotationMode = {
      QUATERNION: 0,
      EULER_XYZ: 1,
      EULER_YXZ: 3,
      EULER_XZY: 2,
      EULER_ZXY: 5,
      EULER_YZX: 4,
      EULER_ZYX: 6,
      AXIS_ANGLE: -1
    };
    Action.prototype.forEachMarker = function(startTime, endTime, callback) {
      return this.markers.forEach(function(marker, index) {
        if (marker.time >= startTime && marker.time < endTime)
          return callback(marker, index);
      });
    };
    var qmat = new glMatrix.ARRAY_TYPE(16);
    Action.prototype.toWorld = function(out, time, rotationMode) {
      mat4.identity(out);
      var paths = this.paths;
      var angles;
      function computeEulerAngles() {
        angles = vec3.fromValues(0, 0, 0);
        [paths.rotation_euler, paths.delta_rotation_euler].forEach(function(path) {
          if (path)
            vec3.add(angles, angles, path.evaluate(time, FCurveArray.DefaultValues.ROTATION));
        });
      }
      var location = vec3.fromValues(0, 0, 0);
      [paths.location, paths.delta_location].forEach(function(path) {
        if (path)
          vec3.add(location, location, path.evaluate(time, FCurveArray.DefaultValues.LOCATION));
      });
      mat4.translate(out, out, location);
      switch (rotationMode) {
        case Action.RotationMode.QUATERNION:
          [paths.rotation_quaternion, paths.delta_rotation_quaternion].forEach(function(path) {
            if (path) {
              mat4.fromQuat(qmat, path.evaluate(time, FCurveArray.DefaultValues.ROTATION_QUATERNION));
              mat4.multiply(out, out, qmat);
            }
          });
          break;
        case Action.RotationMode.EULER_XYZ:
          computeEulerAngles();
          mat4.rotateZ(out, out, angles[2]);
          mat4.rotateY(out, out, angles[1]);
          mat4.rotateX(out, out, angles[0]);
          break;
        case Action.RotationMode.EULER_XZY:
          computeEulerAngles();
          mat4.rotateY(out, out, angles[1]);
          mat4.rotateZ(out, out, angles[2]);
          mat4.rotateX(out, out, angles[0]);
          break;
        case Action.RotationMode.EULER_YXZ:
          computeEulerAngles();
          mat4.rotateZ(out, out, angles[2]);
          mat4.rotateX(out, out, angles[0]);
          mat4.rotateY(out, out, angles[1]);
          break;
        case Action.RotationMode.EULER_YZX:
          computeEulerAngles();
          mat4.rotateX(out, out, angles[0]);
          mat4.rotateZ(out, out, angles[2]);
          mat4.rotateY(out, out, angles[1]);
          break;
        case Action.RotationMode.EULER_ZXY:
          computeEulerAngles();
          mat4.rotateY(out, out, angles[1]);
          mat4.rotateX(out, out, angles[0]);
          mat4.rotateZ(out, out, angles[2]);
          break;
        case Action.RotationMode.EULER_ZYX:
          computeEulerAngles();
          mat4.rotateX(out, out, angles[0]);
          mat4.rotateY(out, out, angles[1]);
          mat4.rotateZ(out, out, angles[2]);
          break;
        case Action.RotationMode.AXIS_ANGLE:
          if (paths.rotation_axis) {
            var vec = paths.rotation_axis.evaluate(time, FCurveArray.DefaultValues.ROTATION);
            mat4.rotate(out, out, vec[3], vec);
          }
          break;
      }
      var scale = vec3.fromValues(1, 1, 1);
      [paths.scale, paths.delta_scale].forEach(function(path) {
        if (path)
          vec3.multiply(scale, scale, path.evaluate(time, FCurveArray.DefaultValues.SCALE));
      });
      mat4.scale(out, out, scale);
      return out;
    };
    Action.prototype.toLocal = function(out, time, rotationMode) {
      this.toWorld(out, time, rotationMode);
      mat4.invert(out, out);
      return out;
    };
    Action.prototype.setElementTransform = function(element, time, rotationMode) {
      var mat = new glMatrix.ARRAY_TYPE(16);
      this.toWorld(mat, time, rotationMode);
      var transform = 'matrix3d(' + mat.join(',') + ')';
      ['transform', 'mozTransform', 'oTransform', 'webkitTransform'].forEach(function(property) {
        element.style[property] = transform;
      });
    };
    module.exports = Action;
  }, function(module, exports) {
    module.exports = __WEBPACK_EXTERNAL_MODULE_2__;
  }, function(module, exports, __webpack_require__) {
    'use strict';
    var FCurve = __webpack_require__(4);
    function FCurveArray(data) {
      var array = data.map(function(data) {
        return data && new FCurve(data);
      });
      array.evaluate = function(time, defaultValues) {
        return array.map(function(fcurve, index) {
          return fcurve ? fcurve.evaluate(time) : defaultValues(index, time);
        });
      };
      return array;
    }
    FCurveArray.DefaultValues = {
      LOCATION: function() {
        return 0;
      },
      ROTATION: function() {
        return 0;
      },
      ROTATION_QUATERNION: function(index) {
        return (index === 3 ? 1 : 0);
      },
      SCALE: function() {
        return 1;
      }
    };
    module.exports = FCurveArray;
  }, function(module, exports, __webpack_require__) {
    'use strict';
    var bezier = __webpack_require__(5);
    var easing = __webpack_require__(6);
    var Keyframe = __webpack_require__(7);
    function FCurve(data) {
      this.keyframes = data[0].map(function(data) {
        return new Keyframe(data);
      });
      this.extrapolation = data[1];
    }
    FCurve.Extrapolation = {
      CONSTANT: 0,
      LINEAR: 1
    };
    FCurve.evaluationTimeEpsilon = 0.0001;
    function areTimesAlmostEqual(t1, t2) {
      return Math.abs(t1 - t2) <= FCurve.evaluationTimeEpsilon;
    }
    FCurve.prototype.evaluate = function(time) {
      var leftIndex = 0;
      var leftKeyframe = this.keyframes[leftIndex];
      if (areTimesAlmostEqual(time, leftKeyframe.time)) {
        return leftKeyframe.value;
      }
      if (time <= leftKeyframe.time) {
        switch (this.extrapolation) {
          case FCurve.Extrapolation.LINEAR:
            return leftKeyframe.value + (leftKeyframe.leftValue - leftKeyframe.value) * (time - leftKeyframe.time) / (leftKeyframe.leftTime - leftKeyframe.time);
          default:
            return leftKeyframe.value;
        }
      }
      var rightIndex = this.keyframes.length - 1;
      var rightKeyframe = this.keyframes[rightIndex];
      if (areTimesAlmostEqual(time, rightKeyframe.time)) {
        return rightKeyframe.value;
      }
      if (time >= rightKeyframe.time) {
        switch (this.extrapolation) {
          case FCurve.Extrapolation.LINEAR:
            return rightKeyframe.value + (rightKeyframe.rightValue - rightKeyframe.value) * (time - rightKeyframe.time) / (rightKeyframe.rightTime - rightKeyframe.time);
          default:
            return rightKeyframe.value;
        }
      }
      while (rightIndex - leftIndex > 1) {
        var index = ((leftIndex + rightIndex) / 2) | 0;
        if (this.keyframes[index].time >= time)
          rightIndex = index;
        else
          leftIndex = index;
      }
      leftKeyframe = this.keyframes[leftIndex];
      if (areTimesAlmostEqual(time, leftKeyframe.time)) {
        return leftKeyframe.value;
      }
      rightKeyframe = this.keyframes[rightIndex];
      if (areTimesAlmostEqual(time, rightKeyframe.time)) {
        return rightKeyframe.value;
      }
      var relTime = time - leftKeyframe.time;
      var begin = leftKeyframe.value;
      var duration = rightKeyframe.time - leftKeyframe.time;
      var change = rightKeyframe.value - leftKeyframe.value;
      switch (leftKeyframe.interpolation) {
        case Keyframe.Interpolation.BACK:
          switch (leftKeyframe.easing) {
            case Keyframe.Easing.IN:
              return easing.backEaseIn(relTime, begin, change, duration, leftKeyframe.overshoot);
            case Keyframe.Easing.IN_OUT:
              return easing.backEaseInOut(relTime, begin, change, duration, leftKeyframe.overshoot);
            default:
              return easing.backEaseOut(relTime, begin, change, duration, leftKeyframe.overshoot);
          }
          break;
        case Keyframe.Interpolation.BEZIER:
          return bezier(time, leftKeyframe, rightKeyframe);
        case Keyframe.Interpolation.BOUNCE:
          switch (leftKeyframe.easing) {
            case Keyframe.Easing.IN:
              return easing.bounceEaseIn(relTime, begin, change, duration);
            case Keyframe.Easing.IN_OUT:
              return easing.bounceEaseInOut(relTime, begin, change, duration);
            default:
              return easing.bounceEaseOut(relTime, begin, change, duration);
          }
          break;
        case Keyframe.Interpolation.CIRCULAR:
          switch (leftKeyframe.easing) {
            case Keyframe.Easing.OUT:
              return easing.circularEaseOut(relTime, begin, change, duration);
            case Keyframe.Easing.IN_OUT:
              return easing.circularEaseInOut(relTime, begin, change, duration);
            default:
              return easing.circularEaseIn(relTime, begin, change, duration);
          }
          break;
        case Keyframe.Interpolation.CUBIC:
          switch (leftKeyframe.easing) {
            case Keyframe.Easing.OUT:
              return easing.cubicEaseOut(relTime, begin, change, duration);
            case Keyframe.Easing.IN_OUT:
              return easing.cubicEaseInOut(relTime, begin, change, duration);
            default:
              return easing.cubicEaseIn(relTime, begin, change, duration);
          }
          break;
        case Keyframe.Interpolation.ELASTIC:
          switch (leftKeyframe.easing) {
            case Keyframe.Easing.IN:
              return easing.elasticEaseIn(relTime, begin, change, duration);
            case Keyframe.Easing.IN_OUT:
              return easing.elasticEaseInOut(relTime, begin, change, duration);
            default:
              return easing.elasticEaseOut(relTime, begin, change, duration, leftKeyframe.amplitude, leftKeyframe.period);
          }
          break;
        case Keyframe.Interpolation.EXPONENTIAL:
          switch (leftKeyframe.easing) {
            case Keyframe.Easing.OUT:
              return easing.exponentialEaseOut(relTime, begin, change, duration);
            case Keyframe.Keyframe.Easing.IN_OUT:
              return easing.exponentialEaseInOut(relTime, begin, change, duration);
            default:
              return easing.exponentialEaseIn(relTime, begin, change, duration);
          }
          break;
        case Keyframe.Interpolation.LINEAR:
          return easing.linear(relTime, begin, change, duration);
        case Keyframe.Interpolation.QUADRATIC:
          switch (leftKeyframe.easing) {
            case Keyframe.Easing.OUT:
              return easing.quadraticEaseOut(relTime, begin, change, duration);
            case Keyframe.Easing.IN_OUT:
              return easing.quadraticEaseInOut(relTime, begin, change, duration);
            default:
              return easing.quadraticEaseIn(relTime, begin, change, duration);
          }
          break;
        case Keyframe.Interpolation.QUARTIC:
          switch (leftKeyframe.easing) {
            case Keyframe.Easing.OUT:
              return easing.quarticEaseOut(relTime, begin, change, duration);
            case Keyframe.Easing.IN_OUT:
              return easing.quarticEaseInOut(relTime, begin, change, duration);
            default:
              return easing.quarticEaseIn(relTime, begin, change, duration);
          }
          break;
        case Keyframe.Interpolation.QUINTIC:
          switch (leftKeyframe.easing) {
            case Keyframe.Easing.OUT:
              return easing.quinticEaseOut(relTime, begin, change, duration);
            case Keyframe.Easing.IN_OUT:
              return easing.quinticEaseInOut(relTime, begin, change, duration);
            default:
              return easing.quinticEaseIn(relTime, begin, change, duration);
          }
          break;
        case Keyframe.Interpolation.SINUSOIDAL:
          switch (leftKeyframe.easing) {
            case Keyframe.Easing.OUT:
              return easing.sinusoidalEaseOut(relTime, begin, change, duration);
            case Keyframe.Easing.IN_OUT:
              return easing.sinusoidalEaseInOut(relTime, begin, change, duration);
            default:
              return easing.sinusoidalEaseIn(relTime, begin, change, duration);
          }
          break;
        default:
          return begin;
      }
    };
    module.exports = FCurve;
  }, function(module, exports) {
    'use strict';
    function bezierInterpolation(A, B, C, D, t) {
      var T = 1 - t;
      return T * T * T * A + 3 * T * T * t * B + 3 * T * t * t * C + t * t * t * D;
    }
    function bezier(time, leftKeyframe, rightKeyframe) {
      var aT = leftKeyframe.time;
      var aV = leftKeyframe.value;
      var bT = leftKeyframe.rightTime;
      var bV = leftKeyframe.rightValue;
      var cT = rightKeyframe.leftTime;
      var cV = rightKeyframe.leftValue;
      var dT = rightKeyframe.time;
      var dV = rightKeyframe.value;
      var leftDeltaTime = bT - aT;
      var rightDeltaTime = dT - cT;
      var duration = dT - aT;
      if (leftDeltaTime + rightDeltaTime > duration) {
        var leftDeltaValue = bV - aV;
        var rightDeltaValue = dV - cV;
        var factor = duration / (leftDeltaTime + rightDeltaTime);
        bT = aT + factor * leftDeltaTime;
        bV = aV + factor * leftDeltaValue;
        cT = dT - factor * rightDeltaTime;
        cV = dV - factor * rightDeltaValue;
      }
      var uLeft = 0,
          uRight = 1;
      var u,
          T;
      do {
        u = (uLeft + uRight) / 2;
        T = bezierInterpolation(aT, bT, cT, dT, u);
        if (T > time)
          uRight = u;
        else
          uLeft = u;
      } while (Math.abs(T - time) > 0.01);
      return bezierInterpolation(aV, bV, cV, dV, u);
    }
    module.exports = bezier;
  }, function(module, exports) {
    'use strict';
    function backEaseIn(time, begin, change, duration, overshoot) {
      time /= duration;
      return change * time * time * ((overshoot + 1) * time - overshoot) + begin;
    }
    function backEaseOut(time, begin, change, duration, overshoot) {
      time = time / duration - 1;
      return change * (time * time * ((overshoot + 1) * time + overshoot) + 1) + begin;
    }
    function backEaseInOut(time, begin, change, duration, overshoot) {
      overshoot *= 1.525;
      if ((time /= duration / 2) < 1) {
        return change / 2 * (time * time * ((overshoot + 1) * time - overshoot)) + begin;
      }
      time -= 2.0;
      return change / 2 * (time * time * ((overshoot + 1) * time + overshoot) + 2) + begin;
    }
    function bounceEaseOut(time, begin, change, duration) {
      time /= duration;
      if (time < (1 / 2.75)) {
        return change * (7.5625 * time * time) + begin;
      } else if (time < (2 / 2.75)) {
        time -= (1.5 / 2.75);
        return change * ((7.5625 * time) * time + 0.75) + begin;
      } else if (time < (2.5 / 2.75)) {
        time -= (2.25 / 2.75);
        return change * ((7.5625 * time) * time + 0.9375) + begin;
      } else {
        time -= (2.625 / 2.75);
        return change * ((7.5625 * time) * time + 0.984375) + begin;
      }
    }
    function bounceEaseIn(time, begin, change, duration) {
      return change - bounceEaseOut(duration - time, 0, change, duration) + begin;
    }
    function bounceEaseInOut(time, begin, change, duration) {
      if (time < duration / 2)
        return bounceEaseIn(time * 2, 0, change, duration) * 0.5 + begin;
      else
        return bounceEaseOut(time * 2 - duration, 0, change, duration) * 0.5 + change * 0.5 + begin;
    }
    function circularEaseIn(time, begin, change, duration) {
      time /= duration;
      return -change * (Math.sqrt(1 - time * time) - 1) + begin;
    }
    function circularEaseOut(time, begin, change, duration) {
      time = time / duration - 1;
      return change * Math.sqrt(1 - time * time) + begin;
    }
    function circularEaseInOut(time, begin, change, duration) {
      if ((time /= duration / 2) < 1.0)
        return -change / 2 * (Math.sqrt(1 - time * time) - 1) + begin;
      time -= 2.0;
      return change / 2 * (Math.sqrt(1 - time * time) + 1) + begin;
    }
    function cubicEaseIn(time, begin, change, duration) {
      time /= duration;
      return change * time * time * time + begin;
    }
    function cubicEaseOut(time, begin, change, duration) {
      time = time / duration - 1;
      return change * (time * time * time + 1) + begin;
    }
    function cubicEaseInOut(time, begin, change, duration) {
      if ((time /= duration / 2) < 1.0)
        return change / 2 * time * time * time + begin;
      time -= 2.0;
      return change / 2 * (time * time * time + 2) + begin;
    }
    function elasticBlend(time, change, duration, amplitude, s, f) {
      if (change) {
        var t = Math.abs(s);
        if (amplitude) {
          f *= amplitude / Math.abs(change);
        } else {
          f = 0;
        }
        var td = Math.abs(time * duration);
        if (td < t) {
          var l = td / t;
          f = (f * l) + (1 - l);
        }
      }
      return f;
    }
    function elasticEaseIn(time, begin, change, duration, amplitude, period) {
      var s;
      var f = 1.0;
      if (time <= 0.0)
        return begin;
      if ((time /= duration) >= 1.0)
        return begin + change;
      time -= 1.0;
      if (!period)
        period = duration * 0.3;
      if (!amplitude || amplitude < Math.abs(change)) {
        s = period / 4;
        f = elasticBlend(time, change, duration, amplitude, s, f);
        amplitude = change;
      } else
        s = period / (2 * Math.PI) * Math.asin(change / amplitude);
      return (-f * (amplitude * Math.pow(2, 10 * time) * Math.sin((time * duration - s) * (2 * Math.PI) / period))) + begin;
    }
    function elasticEaseOut(time, begin, change, duration, amplitude, period) {
      var s;
      var f = 1;
      if (time <= 0)
        return begin;
      if ((time /= duration) >= 1.0)
        return begin + change;
      time = -time;
      if (!period)
        period = duration * 0.3;
      if (!amplitude || amplitude < Math.abs(change)) {
        s = period / 4;
        f = elasticBlend(time, change, duration, amplitude, s, f);
        amplitude = change;
      } else
        s = period / (2 * Math.PI) * Math.asin(change / amplitude);
      return (f * (amplitude * Math.pow(2, 10 * time) * Math.sin((time * duration - s) * (2 * Math.PI) / period))) + change + begin;
    }
    function elasticEaseInOut(time, begin, change, duration, amplitude, period) {
      var s;
      var f = 1.0;
      if (time <= 0.0)
        return begin;
      if ((time /= duration / 2) >= 2.0)
        return begin + change;
      time -= 1.0;
      if (!period)
        period = duration * (0.3 * 1.5);
      if (!amplitude || amplitude < Math.abs(change)) {
        s = period / 4;
        f = elasticBlend(time, change, duration, amplitude, s, f);
        amplitude = change;
      } else
        s = period / (2 * Math.PI) * Math.asin(change / amplitude);
      if (time < 0.0) {
        f *= -0.5;
        return (f * (amplitude * Math.pow(2, 10 * time) * Math.sin((time * duration - s) * (2 * Math.PI) / period))) + begin;
      } else {
        time = -time;
        f *= 0.5;
        return (f * (amplitude * Math.pow(2, 10 * time) * Math.sin((time * duration - s) * (2 * Math.PI) / period))) + change + begin;
      }
    }
    function exponentialEaseIn(time, begin, change, duration) {
      return (time <= 0.0) ? begin : change * Math.pow(2, 10 * (time / duration - 1)) + begin;
    }
    function exponentialEaseOut(time, begin, change, duration) {
      return (time >= duration) ? begin + change : change * (-Math.pow(2, -10 * time / duration) + 1) + begin;
    }
    function exponentialEaseInOut(time, begin, change, duration) {
      if (time <= 0.0)
        return begin;
      if (time >= duration)
        return begin + change;
      if ((time /= duration / 2) < 1)
        return change / 2 * Math.pow(2, 10 * (time - 1)) + begin;
      time -= 1.0;
      return change / 2 * (-Math.pow(2, -10 * time) + 2) + begin;
    }
    function linear(time, begin, change, duration) {
      return change * time / duration + begin;
    }
    function quadraticEaseIn(time, begin, change, duration) {
      time /= duration;
      return change * time * time + begin;
    }
    function quadraticEaseOut(time, begin, change, duration) {
      time /= duration;
      return -change * time * (time - 2) + begin;
    }
    function quadraticEaseInOut(time, begin, change, duration) {
      if ((time /= duration / 2) < 1.0)
        return change / 2 * time * time + begin;
      time -= 1.0;
      return -change / 2 * (time * (time - 2) - 1) + begin;
    }
    function quarticEaseIn(time, begin, change, duration) {
      time /= duration;
      return change * time * time * time * time + begin;
    }
    function quarticEaseOut(time, begin, change, duration) {
      time = time / duration - 1;
      return -change * (time * time * time * time - 1) + begin;
    }
    function quarticEaseInOut(time, begin, change, duration) {
      if ((time /= duration / 2) < 1.0)
        return change / 2 * time * time * time * time + begin;
      time -= 2.0;
      return -change / 2 * (time * time * time * time - 2) + begin;
    }
    function quinticEaseIn(time, begin, change, duration) {
      time /= duration;
      return change * time * time * time * time * time + begin;
    }
    function quinticEaseOut(time, begin, change, duration) {
      time = time / duration - 1;
      return change * (time * time * time * time * time + 1) + begin;
    }
    function quinticEaseInOut(time, begin, change, duration) {
      if ((time /= duration / 2) < 1.0)
        return change / 2 * time * time * time * time * time + begin;
      time -= 2.0;
      return change / 2 * (time * time * time * time * time + 2) + begin;
    }
    function sinusoidalEaseIn(time, begin, change, duration) {
      return -change * Math.cos(time / duration * Math.PI / 2) + change + begin;
    }
    function sinusoidalEaseOut(time, begin, change, duration) {
      return change * Math.sin(time / duration * Math.PI / 2) + begin;
    }
    function sinusoidalEaseInOut(time, begin, change, duration) {
      return -change / 2 * (Math.cos(Math.PI * time / duration) - 1) + begin;
    }
    module.exports.backEaseIn = backEaseIn;
    module.exports.backEaseOut = backEaseOut;
    module.exports.backEaseInOut = backEaseInOut;
    module.exports.bounceEaseOut = bounceEaseOut;
    module.exports.bounceEaseIn = bounceEaseIn;
    module.exports.bounceEaseInOut = bounceEaseInOut;
    module.exports.circularEaseIn = circularEaseIn;
    module.exports.circularEaseOut = circularEaseOut;
    module.exports.circularEaseInOut = circularEaseInOut;
    module.exports.cubicEaseIn = cubicEaseIn;
    module.exports.cubicEaseOut = cubicEaseOut;
    module.exports.cubicEaseInOut = cubicEaseInOut;
    module.exports.elasticEaseIn = elasticEaseIn;
    module.exports.elasticEaseOut = elasticEaseOut;
    module.exports.elasticEaseInOut = elasticEaseInOut;
    module.exports.exponentialEaseIn = exponentialEaseIn;
    module.exports.exponentialEaseOut = exponentialEaseOut;
    module.exports.exponentialEaseInOut = exponentialEaseInOut;
    module.exports.linear = linear;
    module.exports.quadraticEaseIn = quadraticEaseIn;
    module.exports.quadraticEaseOut = quadraticEaseOut;
    module.exports.quadraticEaseInOut = quadraticEaseInOut;
    module.exports.quarticEaseIn = quarticEaseIn;
    module.exports.quarticEaseOut = quarticEaseOut;
    module.exports.quarticEaseInOut = quarticEaseInOut;
    module.exports.quinticEaseIn = quinticEaseIn;
    module.exports.quinticEaseOut = quinticEaseOut;
    module.exports.quinticEaseInOut = quinticEaseInOut;
    module.exports.sinusoidalEaseIn = sinusoidalEaseIn;
    module.exports.sinusoidalEaseOut = sinusoidalEaseOut;
    module.exports.sinusoidalEaseInOut = sinusoidalEaseInOut;
  }, function(module, exports) {
    'use strict';
    function Keyframe(data) {
      this.time = data[0];
      this.value = data[1];
      this.leftTime = data[2];
      this.leftValue = data[3];
      this.rightTime = data[4];
      this.rightValue = data[5];
      this.interpolation = data[6];
      this.easing = data[7];
      this.overshoot = data[8];
      this.amplitude = data[8];
      this.period = data[9];
    }
    Keyframe.Easing = {
      AUTO: 0,
      IN: 1,
      OUT: 2,
      IN_OUT: 3
    };
    Keyframe.Interpolation = {
      CONSTANT: 0,
      LINEAR: 1,
      BEZIER: 2,
      BACK: 3,
      BOUNCE: 4,
      CIRCULAR: 5,
      CUBIC: 6,
      ELASTIC: 7,
      EXPONENTIAL: 8,
      QUADRATIC: 9,
      QUARTIC: 10,
      QUINTIC: 11,
      SINUSOIDAL: 12
    };
    module.exports = Keyframe;
  }, function(module, exports) {
    'use strict';
    function Marker(data) {
      this.time = data[0];
      this.name = data[1];
    }
    module.exports = Marker;
  }, function(module, exports, __webpack_require__) {
    'use strict';
    var Action = __webpack_require__(1);
    function ActionLibrary(data) {
      for (var actionName in data) {
        this[actionName] = new Action(data[actionName]);
      }
    }
    module.exports = ActionLibrary;
  }]);
});
;

})();
$__System.register('2b', ['2a'], function (_export) {
	'use strict';

	var blenderHTML5Animations;
	return {
		setters: [function (_a) {
			blenderHTML5Animations = _a['default'];
		}],
		execute: function () {
			_export('default', function (actionDescriptors) {
				var actions = new blenderHTML5Animations.ActionLibrary(actionDescriptors);

				function evaluate(matrix, actionName, time) {
					return actions[actionName].toWorld(matrix.elements, time, blenderHTML5Animations.Action.RotationMode.EULER_XYZ);
				}

				function getPosition(actionName, time) {
					var position = actions[actionName].paths['location'].evaluate(time, blenderHTML5Animations.FCurveArray.DefaultValues.LOCATION);
					position = [-position[0], position[2], position[1]];
					return position;
				}

				function getRotation(actionName, time) {
					return actions[actionName].paths['rotation_euler'].evaluate(time, blenderHTML5Animations.FCurveArray.DefaultValues.ROTATION);
				}

				function getValue(actionName, time) {
					if (actions[actionName] !== undefined) {
						var pos = actions[actionName].paths['location'].evaluate(time, blenderHTML5Animations.FCurveArray.DefaultValues.LOCATION);
						return pos[2];
					} else {
						console.log(actionName + ' not foud');
						return 0.;
					}
				}

				return {
					actions: actions,
					evaluate: evaluate,
					getPosition: getPosition,
					getRotation: getRotation,
					getValue: getValue
				};
			});
		}
	};
});

$__System.register('2c', ['3'], function (_export) {
				/**
     * @author mrdoob / http://mrdoob.com/
     */

				'use strict';

				var THREE, OBJLoader;
				return {
								setters: [function (_) {
												THREE = _;
								}],
								execute: function () {
												OBJLoader = function OBJLoader(manager) {

																this.manager = manager !== undefined ? manager : THREE.DefaultLoadingManager;

																this.material = null;

																this.regexp = {
																				// v float float float
																				vertex_pattern: /^v\s+([\d|\.|\+|\-|e|E]+)\s+([\d|\.|\+|\-|e|E]+)\s+([\d|\.|\+|\-|e|E]+)/,
																				// vn float float float
																				normal_pattern: /^vn\s+([\d|\.|\+|\-|e|E]+)\s+([\d|\.|\+|\-|e|E]+)\s+([\d|\.|\+|\-|e|E]+)/,
																				// vt float float
																				uv_pattern: /^vt\s+([\d|\.|\+|\-|e|E]+)\s+([\d|\.|\+|\-|e|E]+)/,
																				// f vertex vertex vertex
																				face_vertex: /^f\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)(?:\s+(-?\d+))?/,
																				// f vertex/uv vertex/uv vertex/uv
																				face_vertex_uv: /^f\s+(-?\d+)\/(-?\d+)\s+(-?\d+)\/(-?\d+)\s+(-?\d+)\/(-?\d+)(?:\s+(-?\d+)\/(-?\d+))?/,
																				// f vertex/uv/normal vertex/uv/normal vertex/uv/normal
																				face_vertex_uv_normal: /^f\s+(-?\d+)\/(-?\d+)\/(-?\d+)\s+(-?\d+)\/(-?\d+)\/(-?\d+)\s+(-?\d+)\/(-?\d+)\/(-?\d+)(?:\s+(-?\d+)\/(-?\d+)\/(-?\d+))?/,
																				// f vertex//normal vertex//normal vertex//normal
																				face_vertex_normal: /^f\s+(-?\d+)\/\/(-?\d+)\s+(-?\d+)\/\/(-?\d+)\s+(-?\d+)\/\/(-?\d+)(?:\s+(-?\d+)\/\/(-?\d+))?/,
																				// o object_name | g group_name
																				object_pattern: /^[og]\s*(.+)?/,
																				// s boolean
																				smoothing_pattern: /^s\s+(\d+|on|off)/,
																				// mtllib file_reference
																				material_library_pattern: /^mtllib /,
																				// usemtl material_name
																				material_use_pattern: /^usemtl /
																};
												};

												_export('OBJLoader', OBJLoader);

												OBJLoader.prototype = {

																constructor: OBJLoader,

																load: function load(url, onLoad, onProgress, onError) {

																				var scope = this;

																				var loader = new THREE.FileLoader(scope.manager);
																				loader.setPath(this.path);
																				loader.load(url, function (text) {

																								onLoad(scope.parse(text));
																				}, onProgress, onError);
																},

																setPath: function setPath(value) {

																				this.path = value;
																},

																setMaterials: function setMaterials(material) {

																				this.material = material;
																},

																_createParserState: function _createParserState() {

																				var state = {
																								objects: [],
																								object: {},

																								vertices: [],
																								normals: [],
																								uvs: [],

																								materialLibraries: [],

																								startObject: function startObject(name, fromDeclaration) {

																												// If the current object (initial from reset) is not from a g/o declaration in the parsed
																												// file. We need to use it for the first parsed g/o to keep things in sync.
																												if (this.object && this.object.fromDeclaration === false) {

																																this.object.name = name;
																																this.object.fromDeclaration = fromDeclaration !== false;
																																return;
																												}

																												var previousMaterial = this.object && typeof this.object.currentMaterial === 'function' ? this.object.currentMaterial() : undefined;

																												if (this.object && typeof this.object._finalize === 'function') {

																																this.object._finalize(true);
																												}

																												this.object = {
																																name: name || '',
																																fromDeclaration: fromDeclaration !== false,

																																geometry: {
																																				vertices: [],
																																				normals: [],
																																				uvs: []
																																},
																																material: [],
																																smooth: true,

																																startMaterial: function startMaterial(name, libraries) {

																																				var previous = this._finalize(false);

																																				// New usemtl declaration overwrites an inherited material, except if faces were declared
																																				// after the material, then it must be preserved for proper MultiMaterial continuation.
																																				if (previous && (previous.inherited || previous.groupCount <= 0)) {

																																								this.material.splice(previous.index, 1);
																																				}

																																				var material = {
																																								index: this.material.length,
																																								name: name || '',
																																								mtllib: Array.isArray(libraries) && libraries.length > 0 ? libraries[libraries.length - 1] : '',
																																								smooth: previous !== undefined ? previous.smooth : this.smooth,
																																								groupStart: previous !== undefined ? previous.groupEnd : 0,
																																								groupEnd: -1,
																																								groupCount: -1,
																																								inherited: false,

																																								clone: function clone(index) {
																																												var cloned = {
																																																index: typeof index === 'number' ? index : this.index,
																																																name: this.name,
																																																mtllib: this.mtllib,
																																																smooth: this.smooth,
																																																groupStart: 0,
																																																groupEnd: -1,
																																																groupCount: -1,
																																																inherited: false
																																												};
																																												cloned.clone = this.clone.bind(cloned);
																																												return cloned;
																																								}
																																				};

																																				this.material.push(material);

																																				return material;
																																},

																																currentMaterial: function currentMaterial() {

																																				if (this.material.length > 0) {
																																								return this.material[this.material.length - 1];
																																				}

																																				return undefined;
																																},

																																_finalize: function _finalize(end) {

																																				var lastMultiMaterial = this.currentMaterial();
																																				if (lastMultiMaterial && lastMultiMaterial.groupEnd === -1) {

																																								lastMultiMaterial.groupEnd = this.geometry.vertices.length / 3;
																																								lastMultiMaterial.groupCount = lastMultiMaterial.groupEnd - lastMultiMaterial.groupStart;
																																								lastMultiMaterial.inherited = false;
																																				}

																																				// Ignore objects tail material if no face declarations followed them before a new o/g started.
																																				if (end && this.material.length > 1) {

																																								for (var mi = this.material.length - 1; mi >= 0; mi--) {
																																												if (this.material[mi].groupCount <= 0) {
																																																this.material.splice(mi, 1);
																																												}
																																								}
																																				}

																																				// Guarantee at least one empty material, this makes the creation later more straight forward.
																																				if (end && this.material.length === 0) {

																																								this.material.push({
																																												name: '',
																																												smooth: this.smooth
																																								});
																																				}

																																				return lastMultiMaterial;
																																}
																												};

																												// Inherit previous objects material.
																												// Spec tells us that a declared material must be set to all objects until a new material is declared.
																												// If a usemtl declaration is encountered while this new object is being parsed, it will
																												// overwrite the inherited material. Exception being that there was already face declarations
																												// to the inherited material, then it will be preserved for proper MultiMaterial continuation.

																												if (previousMaterial && previousMaterial.name && typeof previousMaterial.clone === "function") {

																																var declared = previousMaterial.clone(0);
																																declared.inherited = true;
																																this.object.material.push(declared);
																												}

																												this.objects.push(this.object);
																								},

																								finalize: function finalize() {

																												if (this.object && typeof this.object._finalize === 'function') {

																																this.object._finalize(true);
																												}
																								},

																								parseVertexIndex: function parseVertexIndex(value, len) {

																												var index = parseInt(value, 10);
																												return (index >= 0 ? index - 1 : index + len / 3) * 3;
																								},

																								parseNormalIndex: function parseNormalIndex(value, len) {

																												var index = parseInt(value, 10);
																												return (index >= 0 ? index - 1 : index + len / 3) * 3;
																								},

																								parseUVIndex: function parseUVIndex(value, len) {

																												var index = parseInt(value, 10);
																												return (index >= 0 ? index - 1 : index + len / 2) * 2;
																								},

																								addVertex: function addVertex(a, b, c) {

																												var src = this.vertices;
																												var dst = this.object.geometry.vertices;

																												dst.push(src[a + 0]);
																												dst.push(src[a + 1]);
																												dst.push(src[a + 2]);
																												dst.push(src[b + 0]);
																												dst.push(src[b + 1]);
																												dst.push(src[b + 2]);
																												dst.push(src[c + 0]);
																												dst.push(src[c + 1]);
																												dst.push(src[c + 2]);
																								},

																								addVertexLine: function addVertexLine(a) {

																												var src = this.vertices;
																												var dst = this.object.geometry.vertices;

																												dst.push(src[a + 0]);
																												dst.push(src[a + 1]);
																												dst.push(src[a + 2]);
																								},

																								addNormal: function addNormal(a, b, c) {

																												var src = this.normals;
																												var dst = this.object.geometry.normals;

																												dst.push(src[a + 0]);
																												dst.push(src[a + 1]);
																												dst.push(src[a + 2]);
																												dst.push(src[b + 0]);
																												dst.push(src[b + 1]);
																												dst.push(src[b + 2]);
																												dst.push(src[c + 0]);
																												dst.push(src[c + 1]);
																												dst.push(src[c + 2]);
																								},

																								addUV: function addUV(a, b, c) {

																												var src = this.uvs;
																												var dst = this.object.geometry.uvs;

																												dst.push(src[a + 0]);
																												dst.push(src[a + 1]);
																												dst.push(src[b + 0]);
																												dst.push(src[b + 1]);
																												dst.push(src[c + 0]);
																												dst.push(src[c + 1]);
																								},

																								addUVLine: function addUVLine(a) {

																												var src = this.uvs;
																												var dst = this.object.geometry.uvs;

																												dst.push(src[a + 0]);
																												dst.push(src[a + 1]);
																								},

																								addFace: function addFace(a, b, c, d, ua, ub, uc, ud, na, nb, nc, nd) {

																												var vLen = this.vertices.length;

																												var ia = this.parseVertexIndex(a, vLen);
																												var ib = this.parseVertexIndex(b, vLen);
																												var ic = this.parseVertexIndex(c, vLen);
																												var id;

																												if (d === undefined) {

																																this.addVertex(ia, ib, ic);
																												} else {

																																id = this.parseVertexIndex(d, vLen);

																																this.addVertex(ia, ib, id);
																																this.addVertex(ib, ic, id);
																												}

																												if (ua !== undefined) {

																																var uvLen = this.uvs.length;

																																ia = this.parseUVIndex(ua, uvLen);
																																ib = this.parseUVIndex(ub, uvLen);
																																ic = this.parseUVIndex(uc, uvLen);

																																if (d === undefined) {

																																				this.addUV(ia, ib, ic);
																																} else {

																																				id = this.parseUVIndex(ud, uvLen);

																																				this.addUV(ia, ib, id);
																																				this.addUV(ib, ic, id);
																																}
																												}

																												if (na !== undefined) {

																																// Normals are many times the same. If so, skip function call and parseInt.
																																var nLen = this.normals.length;
																																ia = this.parseNormalIndex(na, nLen);

																																ib = na === nb ? ia : this.parseNormalIndex(nb, nLen);
																																ic = na === nc ? ia : this.parseNormalIndex(nc, nLen);

																																if (d === undefined) {

																																				this.addNormal(ia, ib, ic);
																																} else {

																																				id = this.parseNormalIndex(nd, nLen);

																																				this.addNormal(ia, ib, id);
																																				this.addNormal(ib, ic, id);
																																}
																												}
																								},

																								addLineGeometry: function addLineGeometry(vertices, uvs) {

																												this.object.geometry.type = 'Line';

																												var vLen = this.vertices.length;
																												var uvLen = this.uvs.length;

																												for (var vi = 0, l = vertices.length; vi < l; vi++) {

																																this.addVertexLine(this.parseVertexIndex(vertices[vi], vLen));
																												}

																												for (var uvi = 0, l = uvs.length; uvi < l; uvi++) {

																																this.addUVLine(this.parseUVIndex(uvs[uvi], uvLen));
																												}
																								}

																				};

																				state.startObject('', false);

																				return state;
																},

																parse: function parse(text) {

																				console.time('OBJLoader');

																				var state = this._createParserState();

																				if (text.indexOf('\r\n') !== -1) {

																								// This is faster than String.split with regex that splits on both
																								text = text.replace(/\r\n/g, '\n');
																				}

																				if (text.indexOf('\\\n') !== -1) {

																								// join lines separated by a line continuation character (\)
																								text = text.replace(/\\\n/g, '');
																				}

																				var lines = text.split('\n');
																				var line = '',
																				    lineFirstChar = '',
																				    lineSecondChar = '';
																				var lineLength = 0;
																				var result = [];

																				// Faster to just trim left side of the line. Use if available.
																				var trimLeft = typeof ''.trimLeft === 'function';

																				for (var i = 0, l = lines.length; i < l; i++) {

																								line = lines[i];

																								line = trimLeft ? line.trimLeft() : line.trim();

																								lineLength = line.length;

																								if (lineLength === 0) continue;

																								lineFirstChar = line.charAt(0);

																								// @todo invoke passed in handler if any
																								if (lineFirstChar === '#') continue;

																								if (lineFirstChar === 'v') {

																												lineSecondChar = line.charAt(1);

																												if (lineSecondChar === ' ' && (result = this.regexp.vertex_pattern.exec(line)) !== null) {

																																// 0                  1      2      3
																																// ["v 1.0 2.0 3.0", "1.0", "2.0", "3.0"]

																																state.vertices.push(parseFloat(result[1]), parseFloat(result[2]), parseFloat(result[3]));
																												} else if (lineSecondChar === 'n' && (result = this.regexp.normal_pattern.exec(line)) !== null) {

																																// 0                   1      2      3
																																// ["vn 1.0 2.0 3.0", "1.0", "2.0", "3.0"]

																																state.normals.push(parseFloat(result[1]), parseFloat(result[2]), parseFloat(result[3]));
																												} else if (lineSecondChar === 't' && (result = this.regexp.uv_pattern.exec(line)) !== null) {

																																// 0               1      2
																																// ["vt 0.1 0.2", "0.1", "0.2"]

																																state.uvs.push(parseFloat(result[1]), parseFloat(result[2]));
																												} else {

																																throw new Error("Unexpected vertex/normal/uv line: '" + line + "'");
																												}
																								} else if (lineFirstChar === "f") {

																												if ((result = this.regexp.face_vertex_uv_normal.exec(line)) !== null) {

																																// f vertex/uv/normal vertex/uv/normal vertex/uv/normal
																																// 0                        1    2    3    4    5    6    7    8    9   10         11         12
																																// ["f 1/1/1 2/2/2 3/3/3", "1", "1", "1", "2", "2", "2", "3", "3", "3", undefined, undefined, undefined]

																																state.addFace(result[1], result[4], result[7], result[10], result[2], result[5], result[8], result[11], result[3], result[6], result[9], result[12]);
																												} else if ((result = this.regexp.face_vertex_uv.exec(line)) !== null) {

																																// f vertex/uv vertex/uv vertex/uv
																																// 0                  1    2    3    4    5    6   7          8
																																// ["f 1/1 2/2 3/3", "1", "1", "2", "2", "3", "3", undefined, undefined]

																																state.addFace(result[1], result[3], result[5], result[7], result[2], result[4], result[6], result[8]);
																												} else if ((result = this.regexp.face_vertex_normal.exec(line)) !== null) {

																																// f vertex//normal vertex//normal vertex//normal
																																// 0                     1    2    3    4    5    6   7          8
																																// ["f 1//1 2//2 3//3", "1", "1", "2", "2", "3", "3", undefined, undefined]

																																state.addFace(result[1], result[3], result[5], result[7], undefined, undefined, undefined, undefined, result[2], result[4], result[6], result[8]);
																												} else if ((result = this.regexp.face_vertex.exec(line)) !== null) {

																																// f vertex vertex vertex
																																// 0            1    2    3   4
																																// ["f 1 2 3", "1", "2", "3", undefined]

																																state.addFace(result[1], result[2], result[3], result[4]);
																												} else {

																																throw new Error("Unexpected face line: '" + line + "'");
																												}
																								} else if (lineFirstChar === "l") {

																												var lineParts = line.substring(1).trim().split(" ");
																												var lineVertices = [],
																												    lineUVs = [];

																												if (line.indexOf("/") === -1) {

																																lineVertices = lineParts;
																												} else {

																																for (var li = 0, llen = lineParts.length; li < llen; li++) {

																																				var parts = lineParts[li].split("/");

																																				if (parts[0] !== "") lineVertices.push(parts[0]);
																																				if (parts[1] !== "") lineUVs.push(parts[1]);
																																}
																												}
																												state.addLineGeometry(lineVertices, lineUVs);
																								} else if ((result = this.regexp.object_pattern.exec(line)) !== null) {

																												// o object_name
																												// or
																												// g group_name

																												// WORKAROUND: https://bugs.chromium.org/p/v8/issues/detail?id=2869
																												// var name = result[ 0 ].substr( 1 ).trim();
																												var name = (" " + result[0].substr(1).trim()).substr(1);

																												state.startObject(name);
																								} else if (this.regexp.material_use_pattern.test(line)) {

																												// material

																												state.object.startMaterial(line.substring(7).trim(), state.materialLibraries);
																								} else if (this.regexp.material_library_pattern.test(line)) {

																												// mtl file

																												state.materialLibraries.push(line.substring(7).trim());
																								} else if ((result = this.regexp.smoothing_pattern.exec(line)) !== null) {

																												// smooth shading

																												// @todo Handle files that have varying smooth values for a set of faces inside one geometry,
																												// but does not define a usemtl for each face set.
																												// This should be detected and a dummy material created (later MultiMaterial and geometry groups).
																												// This requires some care to not create extra material on each smooth value for "normal" obj files.
																												// where explicit usemtl defines geometry groups.
																												// Example asset: examples/models/obj/cerberus/Cerberus.obj

																												var value = result[1].trim().toLowerCase();
																												state.object.smooth = value === '1' || value === 'on';

																												var material = state.object.currentMaterial();
																												if (material) {

																																material.smooth = state.object.smooth;
																												}
																								} else {

																												// Handle null terminated files without exception
																												if (line === '\0') continue;

																												throw new Error("Unexpected line: '" + line + "'");
																								}
																				}

																				state.finalize();

																				var container = new THREE.Group();
																				container.materialLibraries = [].concat(state.materialLibraries);

																				for (var i = 0, l = state.objects.length; i < l; i++) {

																								var object = state.objects[i];
																								var geometry = object.geometry;
																								var material = object.material;
																								var isLine = geometry.type === 'Line';

																								// Skip o/g line declarations that did not follow with any faces
																								if (geometry.vertices.length === 0) continue;

																								var buffergeometry = new THREE.BufferGeometry();

																								buffergeometry.addAttribute('position', new THREE.BufferAttribute(new Float32Array(geometry.vertices), 3));

																								if (geometry.normals.length > 0) {

																												buffergeometry.addAttribute('normal', new THREE.BufferAttribute(new Float32Array(geometry.normals), 3));
																								} else {

																												buffergeometry.computeVertexNormals();
																								}

																								if (geometry.uvs.length > 0) {

																												buffergeometry.addAttribute('uv', new THREE.BufferAttribute(new Float32Array(geometry.uvs), 2));
																								}

																								// Create material

																								var createdMaterials = [];

																								for (var mi = 0, miLen = material.length; mi < miLen; mi++) {

																												var sourceMaterial = material[mi];
																												var material = undefined;

																												if (this.material !== null) {

																																material = this.material.create(sourceMaterial.name);

																																// mtl etc. loaders probably can't create line material correctly, copy properties to a line material.
																																if (isLine && material && !(material instanceof THREE.LineBasicMaterial)) {

																																				var materialLine = new THREE.LineBasicMaterial();
																																				materialLine.copy(material);
																																				material = materialLine;
																																}
																												}

																												if (!material) {

																																material = !isLine ? new THREE.MeshPhongMaterial() : new THREE.LineBasicMaterial();
																																material.name = sourceMaterial.name;
																												}

																												// material.shading = sourceMaterial.smooth ? THREE.SmoothShading : THREE.FlatShading;
																												material.flatShading = sourceMaterial.smooth;

																												createdMaterials.push(material);
																								}

																								// Create mesh

																								var mesh;

																								if (createdMaterials.length > 1) {

																												for (var mi = 0, miLen = material.length; mi < miLen; mi++) {

																																var sourceMaterial = material[mi];
																																buffergeometry.addGroup(sourceMaterial.groupStart, sourceMaterial.groupCount, mi);
																												}

																												var multiMaterial = new THREE.MultiMaterial(createdMaterials);
																												mesh = !isLine ? new THREE.Mesh(buffergeometry, multiMaterial) : new THREE.LineSegments(buffergeometry, multiMaterial);
																								} else {

																												mesh = !isLine ? new THREE.Mesh(buffergeometry, createdMaterials[0]) : new THREE.LineSegments(buffergeometry, createdMaterials[0]);
																								}

																								mesh.name = object.name;

																								container.add(mesh);
																				}

																				console.timeEnd('OBJLoader');

																				return container;
																}

												};
								}
				};
});

$__System.register('2d', ['3'], function (_export) {
			/**
    * @author Wei Meng / http://about.me/menway
    *
    * Description: A THREE loader for PLY ASCII files (known as the Polygon
    * File Format or the Stanford Triangle Format).
    *
    * Limitations: ASCII decoding assumes file is UTF-8.
    *
    * Usage:
    *	var loader = new PLYLoader();
    *	loader.load('./models/ply/ascii/dolphins.ply', function (geometry) {
    *
    *		scene.add( new THREE.Mesh( geometry ) );
    *
    *	} );
    *
    * If the PLY file uses non standard property names, they can be mapped while
    * loading. For example, the following maps the properties
    * “diffuse_(red|green|blue)” in the file to standard color names.
    *
    * loader.setPropertyNameMapping( {
    *	diffuse_red: 'red',
    *	diffuse_green: 'green',
    *	diffuse_blue: 'blue'
    * } );
    *
    */

			'use strict';

			var THREE, PLYLoader;
			return {
						setters: [function (_) {
									THREE = _;
						}],
						execute: function () {
									PLYLoader = function PLYLoader(manager) {

												this.manager = manager !== undefined ? manager : THREE.DefaultLoadingManager;

												this.propertyNameMapping = {};
									};

									_export('PLYLoader', PLYLoader);

									PLYLoader.prototype = {

												constructor: PLYLoader,

												load: function load(url, onLoad, onProgress, onError) {

															var scope = this;

															var loader = new THREE.FileLoader(this.manager);
															loader.setResponseType('arraybuffer');
															loader.load(url, function (text) {

																		onLoad(scope.parse(text));
															}, onProgress, onError);
												},

												setPropertyNameMapping: function setPropertyNameMapping(mapping) {

															this.propertyNameMapping = mapping;
												},

												parse: function parse(data) {

															function isASCII(data) {

																		var header = parseHeader(bin2str(data));
																		return header.format === 'ascii';
															}

															function bin2str(buf) {

																		var array_buffer = new Uint8Array(buf);
																		var str = '';

																		for (var i = 0; i < buf.byteLength; i++) {

																					str += String.fromCharCode(array_buffer[i]); // implicitly assumes little-endian
																		}

																		return str;
															}

															function parseHeader(data) {

																		var patternHeader = /ply([\s\S]*)end_header\s/;
																		var headerText = '';
																		var headerLength = 0;
																		var result = patternHeader.exec(data);

																		if (result !== null) {

																					headerText = result[1];
																					headerLength = result[0].length;
																		}

																		var header = {
																					comments: [],
																					elements: [],
																					headerLength: headerLength
																		};

																		var lines = headerText.split('\n');
																		var currentElement;
																		var lineType, lineValues;

																		function make_ply_element_property(propertValues, propertyNameMapping) {

																					var property = { type: propertValues[0] };

																					if (property.type === 'list') {

																								property.name = propertValues[3];
																								property.countType = propertValues[1];
																								property.itemType = propertValues[2];
																					} else {

																								property.name = propertValues[1];
																					}

																					if (property.name in propertyNameMapping) {

																								property.name = propertyNameMapping[property.name];
																					}

																					return property;
																		}

																		for (var i = 0; i < lines.length; i++) {

																					var line = lines[i];
																					line = line.trim();

																					if (line === '') continue;

																					lineValues = line.split(/\s+/);
																					lineType = lineValues.shift();
																					line = lineValues.join(' ');

																					switch (lineType) {

																								case 'format':

																											header.format = lineValues[0];
																											header.version = lineValues[1];

																											break;

																								case 'comment':

																											header.comments.push(line);

																											break;

																								case 'element':

																											if (currentElement !== undefined) {

																														header.elements.push(currentElement);
																											}

																											currentElement = {};
																											currentElement.name = lineValues[0];
																											currentElement.count = parseInt(lineValues[1]);
																											currentElement.properties = [];

																											break;

																								case 'property':

																											currentElement.properties.push(make_ply_element_property(lineValues, scope.propertyNameMapping));

																											break;

																								default:

																											console.log('unhandled', lineType, lineValues);

																					}
																		}

																		if (currentElement !== undefined) {

																					header.elements.push(currentElement);
																		}

																		return header;
															}

															function parseASCIINumber(n, type) {

																		switch (type) {

																					case 'char':case 'uchar':case 'short':case 'ushort':case 'int':case 'uint':
																					case 'int8':case 'uint8':case 'int16':case 'uint16':case 'int32':case 'uint32':

																								return parseInt(n);

																					case 'float':case 'double':case 'float32':case 'float64':

																								return parseFloat(n);

																		}
															}

															function parseASCIIElement(properties, line) {

																		var values = line.split(/\s+/);

																		var element = {};

																		for (var i = 0; i < properties.length; i++) {

																					if (properties[i].type === 'list') {

																								var list = [];
																								var n = parseASCIINumber(values.shift(), properties[i].countType);

																								for (var j = 0; j < n; j++) {

																											list.push(parseASCIINumber(values.shift(), properties[i].itemType));
																								}

																								element[properties[i].name] = list;
																					} else {

																								element[properties[i].name] = parseASCIINumber(values.shift(), properties[i].type);
																					}
																		}

																		return element;
															}

															function parseASCII(data) {

																		// PLY ascii format specification, as per http://en.wikipedia.org/wiki/PLY_(file_format)

																		var buffer = {
																					indices: [],
																					vertices: [],
																					normals: [],
																					uvs: [],
																					colors: []
																		};

																		var result;

																		var header = parseHeader(data);

																		var patternBody = /end_header\s([\s\S]*)$/;
																		var body = '';
																		if ((result = patternBody.exec(data)) !== null) {

																					body = result[1];
																		}

																		var lines = body.split('\n');
																		var currentElement = 0;
																		var currentElementCount = 0;

																		for (var i = 0; i < lines.length; i++) {

																					var line = lines[i];
																					line = line.trim();
																					if (line === '') {

																								continue;
																					}

																					if (currentElementCount >= header.elements[currentElement].count) {

																								currentElement++;
																								currentElementCount = 0;
																					}

																					var element = parseASCIIElement(header.elements[currentElement].properties, line);

																					handleElement(buffer, header.elements[currentElement].name, element);

																					currentElementCount++;
																		}

																		return postProcess(buffer);
															}

															function postProcess(buffer) {

																		var geometry = new THREE.BufferGeometry();

																		// mandatory buffer data

																		if (buffer.indices.length > 0) {

																					geometry.setIndex(buffer.indices);
																		}

																		geometry.addAttribute('position', new THREE.Float32BufferAttribute(buffer.vertices, 3));

																		// optional buffer data

																		if (buffer.normals.length > 0) {

																					geometry.addAttribute('normal', new THREE.Float32BufferAttribute(buffer.normals, 3));
																		}

																		if (buffer.uvs.length > 0) {

																					geometry.addAttribute('uv', new THREE.Float32BufferAttribute(buffer.uvs, 2));
																		}

																		if (buffer.colors.length > 0) {

																					geometry.addAttribute('color', new THREE.Float32BufferAttribute(buffer.colors, 3));
																		}

																		geometry.computeBoundingSphere();

																		return geometry;
															}

															function handleElement(buffer, elementName, element) {

																		if (elementName === 'vertex') {

																					buffer.vertices.push(element.x, element.y, element.z);

																					if ('nx' in element && 'ny' in element && 'nz' in element) {

																								buffer.normals.push(element.nx, element.ny, element.nz);
																					}

																					if ('s' in element && 't' in element) {

																								buffer.uvs.push(element.s, element.t);
																					}

																					if ('red' in element && 'green' in element && 'blue' in element) {

																								buffer.colors.push(element.red / 255.0, element.green / 255.0, element.blue / 255.0);
																					}
																		} else if (elementName === 'face') {

																					var vertex_indices = element.vertex_indices || element.vertex_index; // issue #9338

																					if (vertex_indices.length === 3) {

																								buffer.indices.push(vertex_indices[0], vertex_indices[1], vertex_indices[2]);
																					} else if (vertex_indices.length === 4) {

																								buffer.indices.push(vertex_indices[0], vertex_indices[1], vertex_indices[3]);
																								buffer.indices.push(vertex_indices[1], vertex_indices[2], vertex_indices[3]);
																					}
																		}
															}

															function binaryRead(dataview, at, type, little_endian) {

																		switch (type) {

																					// corespondences for non-specific length types here match rply:
																					case 'int8':case 'char':
																								return [dataview.getInt8(at), 1];
																					case 'uint8':case 'uchar':
																								return [dataview.getUint8(at), 1];
																					case 'int16':case 'short':
																								return [dataview.getInt16(at, little_endian), 2];
																					case 'uint16':case 'ushort':
																								return [dataview.getUint16(at, little_endian), 2];
																					case 'int32':case 'int':
																								return [dataview.getInt32(at, little_endian), 4];
																					case 'uint32':case 'uint':
																								return [dataview.getUint32(at, little_endian), 4];
																					case 'float32':case 'float':
																								return [dataview.getFloat32(at, little_endian), 4];
																					case 'float64':case 'double':
																								return [dataview.getFloat64(at, little_endian), 8];

																		}
															}

															function binaryReadElement(dataview, at, properties, little_endian) {

																		var element = {};
																		var result,
																		    read = 0;

																		for (var i = 0; i < properties.length; i++) {

																					if (properties[i].type === 'list') {

																								var list = [];

																								result = binaryRead(dataview, at + read, properties[i].countType, little_endian);
																								var n = result[0];
																								read += result[1];

																								for (var j = 0; j < n; j++) {

																											result = binaryRead(dataview, at + read, properties[i].itemType, little_endian);
																											list.push(result[0]);
																											read += result[1];
																								}

																								element[properties[i].name] = list;
																					} else {

																								result = binaryRead(dataview, at + read, properties[i].type, little_endian);
																								element[properties[i].name] = result[0];
																								read += result[1];
																					}
																		}

																		return [element, read];
															}

															function parseBinary(data) {

																		var buffer = {
																					indices: [],
																					vertices: [],
																					normals: [],
																					uvs: [],
																					colors: []
																		};

																		var header = parseHeader(bin2str(data));
																		var little_endian = header.format === 'binary_little_endian';
																		var body = new DataView(data, header.headerLength);
																		var result,
																		    loc = 0;

																		for (var currentElement = 0; currentElement < header.elements.length; currentElement++) {

																					for (var currentElementCount = 0; currentElementCount < header.elements[currentElement].count; currentElementCount++) {

																								result = binaryReadElement(body, loc, header.elements[currentElement].properties, little_endian);
																								loc += result[1];
																								var element = result[0];

																								handleElement(buffer, header.elements[currentElement].name, element);
																					}
																		}

																		return postProcess(buffer);
															}

															//

															var geometry;
															var scope = this;

															if (data instanceof ArrayBuffer) {

																		geometry = isASCII(data) ? parseASCII(bin2str(data)) : parseBinary(data);
															} else {

																		geometry = parseASCII(data);
															}

															return geometry;
												}

									};
						}
			};
});

$__System.register("2e", [], function (_export, _context) {
  "use strict";

  var __useDefault;

  return {
    setters: [],
    execute: function () {
      _export("__useDefault", __useDefault = "\r\nconst float PI = 3.14159;\r\nconst float PI2 = 6.28318;\r\nconst float TAU = 6.28318;\r\nconst float HALFPI = 1.57079;\r\nconst float PIHALF = 1.57079;\r\nconst float PIQUART = 0.785397;\r\nconst float HALF3PI = 4.71238;\r\n\r\nconst vec3 colorDesert = vec3(0.968, 0.792, 0.372);\r\nconst vec3 colorSkyDay = vec3(0.772, 0.905, 0.929);\r\nconst vec3 colorSkyNight = vec3(0.254, 0.454, 0.784);\r\nconst vec3 colorSkyDark = vec3(0.109, 0.231, 0.427);\r\nconst vec3 colorWarningLight = vec3(0, 1, 0.0);\r\nconst vec3 colorDangerLight = vec3(1, 0.2, 0.101);\r\n\r\n#define getSunLight(sun) clamp((dot(normalize(sun), vec3(0,1,0)))*24., 0., 1.)\r\n\r\n#define repeat(p,r) (mod(p,r)-r/2.)\r\n#define sdist(p,r) (length(p)-r)\r\nfloat box (vec3 p, vec3 b) { vec3 d = abs(p) - b; return min(max(d.x,max(d.y,d.z)),0.0) + length(max(d,0.0)); }\r\nfloat torus (vec3 p, vec2 t) { vec2 q = vec2(length(p.xz)-t.x,p.y); return length(q)-t.y; }\r\nfloat smoothmin (float a, float b, float r) { float h = clamp(.5+.5*(b-a)/r, 0., 1.); return mix(b, a, h)-r*h*(1.-h); }\r\nmat2 rot (float a) { float c=cos(a),s=sin(a); return mat2(c,-s,s,c); }\r\nvec3 look (vec3 eye, vec3 target, vec2 anchor) {\r\n    vec3 forward = normalize(target-eye);\r\n    vec3 right = normalize(cross(forward, vec3(0,1,0)));\r\n    vec3 up = normalize(cross(right, forward));\r\n    return normalize(forward + right * anchor.x + up * anchor.y);\r\n}\r\nfloat sdCapsule( vec3 p, vec3 a, vec3 b, float r ) {\r\n    vec3 pa = p - a, ba = b - a;\r\n    float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );\r\n    return length( pa - ba*h ) - r;\r\n}\r\nfloat sdCylinderSquare( vec2 p, float r ) {\r\n    vec2 d = abs(p) - r;\r\n    return min(max(d.x,d.y),0.0) + length(max(d,0.0));\r\n}\r\n\r\n\r\n// https://www.shadertoy.com/view/4dS3Wd\r\nfloat random (in vec2 st) { return fract(sin(dot(st.xy,vec2(12.9898,78.233)))*43758.5453123); }\r\nfloat hash(float n) { return fract(sin(n) * 1e4); }\r\nfloat hash(vec2 p) { return fract(1e4 * sin(17.0 * p.x + p.y * 0.1) * (0.1 + abs(sin(p.y * 13.0 + p.x)))); }\r\nfloat noise(float x) {\r\n    float i = floor(x);\r\n    float f = fract(x);\r\n    float u = f * f * (3.0 - 2.0 * f);\r\n    return mix(hash(i), hash(i + 1.0), u);\r\n}\r\nfloat noise (in vec2 st) {\r\n    vec2 i = floor(st);\r\n    vec2 f = fract(st);\r\n    float a = random(i);\r\n    float b = random(i + vec2(1.0, 0.0));\r\n    float c = random(i + vec2(0.0, 1.0));\r\n    float d = random(i + vec2(1.0, 1.0));\r\n    vec2 u = f * f * (3.0 - 2.0 * f);\r\n    return mix(a, b, u.x) +\r\n            (c - a)* u.y * (1.0 - u.x) +\r\n            (d - b) * u.x * u.y;\r\n}\r\nfloat noise(vec3 x) {\r\n    const vec3 step = vec3(110, 241, 171);\r\n    vec3 i = floor(x);\r\n    vec3 f = fract(x);\r\n    float n = dot(i, step);\r\n    vec3 u = f * f * (3.0 - 2.0 * f);\r\n    return mix(mix(mix( hash(n + dot(step, vec3(0, 0, 0))), hash(n + dot(step, vec3(1, 0, 0))), u.x),\r\n                   mix( hash(n + dot(step, vec3(0, 1, 0))), hash(n + dot(step, vec3(1, 1, 0))), u.x), u.y),\r\n               mix(mix( hash(n + dot(step, vec3(0, 0, 1))), hash(n + dot(step, vec3(1, 0, 1))), u.x),\r\n                   mix( hash(n + dot(step, vec3(0, 1, 1))), hash(n + dot(step, vec3(1, 1, 1))), u.x), u.y), u.z);\r\n}\r\n\r\nvec3 lookAt (vec3 eye, vec3 target, vec2 anchor) {\r\n\tvec3 forward = normalize(target-eye);\r\n\tvec3 right = normalize(cross(forward, vec3(0,1,0)));\r\n\tvec3 up = normalize(cross(right, forward));\r\n\treturn normalize(forward + right * anchor.x + up * anchor.y);\r\n}\r\n\r\nmat2 rotation (float a) { float c=cos(a),s=sin(a); return mat2(c,-s,s,c); }\r\nmat4 rotationMatrix(vec3 axis, float angle) {\r\n    axis = normalize(axis);\r\n    float s = sin(angle);\r\n    float c = cos(angle);\r\n    float oc = 1.0 - c;\r\n    return mat4(oc*axis.x*axis.x + c, oc*axis.x*axis.y - axis.z*s, oc*axis.z*axis.x + axis.y*s, 0.0,\r\n                oc*axis.x*axis.y + axis.z*s, oc*axis.y*axis.y + c, oc*axis.y*axis.z - axis.x*s, 0.0,\r\n                oc*axis.z*axis.x - axis.y*s, oc*axis.y*axis.z + axis.x*s, oc*axis.z*axis.z + c, 0.0,\r\n                0.0, 0.0, 0.0, 1.0);\r\n}\r\n\r\nfloat pModPolar(inout vec2 p, float repetitions) {\r\n\tfloat angle = 2.*PI/repetitions;\r\n\tfloat a = atan(p.y, p.x) + angle/2.;\r\n\tfloat r = length(p);\r\n\tfloat c = floor(a/angle);\r\n\ta = mod(a,angle) - angle/2.;\r\n\tp = vec2(cos(a), sin(a))*r;\r\n\tif (abs(c) >= (repetitions/2.)) c = abs(c);\r\n\treturn c;\r\n}\r\n\r\nfloat luminance ( vec3 color ) { return (color.r + color.g + color.b) / 3.0; }\r\nfloat reflectance(vec3 a, vec3 b) { return dot(normalize(a), normalize(b)) * 0.5 + 0.5; }\r\nvec2 kaelidoGrid(vec2 p) { return vec2(step(mod(p, 2.0), vec2(1.0))); }\r\n\r\nvec4 edgeSD (sampler2D bitmap, vec2 uv, vec2 dimension)\r\n{\r\n    vec4 color = vec4(0.0, 0.0, 0.0, 0.0);\r\n\r\n    color += abs(texture2D(bitmap, uv + vec2(1, 0) / dimension) - texture2D(bitmap, uv + vec2(-1, 0) / dimension));\r\n    color += abs(texture2D(bitmap, uv + vec2(0, 1) / dimension) - texture2D(bitmap, uv + vec2(0, -1) / dimension));\r\n\r\n    return color / 2.;\r\n}\r\n\r\nvec4 edge (sampler2D bitmap, vec2 uv, vec2 dimension)\r\n{\r\n    vec4 color = vec4(0.0, 0.0, 0.0, 0.0);\r\n\r\n    color += -1.0 * texture2D(bitmap, uv + vec2(-2, -2) / dimension);\r\n    color += -1.0 * texture2D(bitmap, uv + vec2(-2, -1) / dimension);\r\n    color += -1.0 * texture2D(bitmap, uv + vec2(-2,  0) / dimension);\r\n    color += -1.0 * texture2D(bitmap, uv + vec2(-2,  1) / dimension);\r\n    color += -1.0 * texture2D(bitmap, uv + vec2(-2,  2) / dimension);\r\n\r\n    color += -1.0 * texture2D(bitmap, uv + vec2(-1, -2) / dimension);\r\n    color += -1.0 * texture2D(bitmap, uv + vec2(-1, -1) / dimension);\r\n    color += -1.0 * texture2D(bitmap, uv + vec2(-1,  0) / dimension);\r\n    color += -1.0 * texture2D(bitmap, uv + vec2(-1,  1) / dimension);\r\n    color += -1.0 * texture2D(bitmap, uv + vec2(-1,  2) / dimension);\r\n\r\n    color += -1.0 * texture2D(bitmap, uv + vec2( 0, -2) / dimension);\r\n    color += -1.0 * texture2D(bitmap, uv + vec2( 0, -1) / dimension);\r\n    color += 24.0 * texture2D(bitmap, uv + vec2( 0,  0) / dimension);\r\n    color += -1.0 * texture2D(bitmap, uv + vec2( 0,  1) / dimension);\r\n    color += -1.0 * texture2D(bitmap, uv + vec2( 0,  2) / dimension);\r\n\r\n    color += -1.0 * texture2D(bitmap, uv + vec2( 1, -2) / dimension);\r\n    color += -1.0 * texture2D(bitmap, uv + vec2( 1, -1) / dimension);\r\n    color += -1.0 * texture2D(bitmap, uv + vec2( 1,  0) / dimension);\r\n    color += -1.0 * texture2D(bitmap, uv + vec2( 1,  1) / dimension);\r\n    color += -1.0 * texture2D(bitmap, uv + vec2( 1,  2) / dimension);\r\n\r\n    color += -1.0 * texture2D(bitmap, uv + vec2( 2, -2) / dimension);\r\n    color += -1.0 * texture2D(bitmap, uv + vec2( 2, -1) / dimension);\r\n    color += -1.0 * texture2D(bitmap, uv + vec2( 2,  0) / dimension);\r\n    color += -1.0 * texture2D(bitmap, uv + vec2( 2,  1) / dimension);\r\n    color += -1.0 * texture2D(bitmap, uv + vec2( 2,  2) / dimension);\r\n\r\n    return color;\r\n}\r\n\r\nvec3 rgb2hsv(vec3 c) {\r\n\tvec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\r\n\tvec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\r\n\tvec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\r\n\tfloat d = q.x - min(q.w, q.y);\r\n\tfloat e = 1.0e-10;\r\n\treturn vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\r\n}\r\nvec3 hsv2rgb(vec3 c) {\r\n\tvec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\r\n\tvec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\r\n\treturn c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\r\n}");

      _export("__useDefault", __useDefault);

      _export("default", __useDefault);
    }
  };
});
$__System.register("2f", [], function (_export, _context) {
  "use strict";

  var __useDefault;

  return {
    setters: [],
    execute: function () {
      _export("__useDefault", __useDefault = "{\"Text\":[{\"rotation_euler\":[[[[4.45,0.0,4.433333333333334,0.0,4.466666666666667,0.0,2]],0],[[[4.45,0.0,4.433333333333334,0.0,4.466666666666667,0.0,2]],0],[[[4.45,0.0,4.433333333333334,0.0,4.466666666666667,0.0,2]],0]],\"location\":[[[[4.45,0.0,4.433333333333334,0.0,4.466666666666667,0.0,2]],0],[[[4.45,-1.0,4.433333333333334,-1.0,4.466666666666667,-1.0,2]],0],[[[4.45,0.0,4.433333333333334,0.0,4.466666666666667,0.0,2]],0]],\"scale\":[[[[4.45,1.0,4.433333333333334,1.0,4.466666666666667,1.0,2]],0],[[[4.45,1.0,4.433333333333334,1.0,4.466666666666667,1.0,2]],0],[[[4.45,1.0,4.433333333333334,1.0,4.466666666666667,1.0,2]],0]]}],\"Texting\":[{\"rotation_euler\":[[[[0.0,0.0,-17.70516153971354,0.0,17.70516153971354,0.0,2],[45.35,0.0,27.644838460286458,0.0,63.05515950520833,0.0,2]],0],[[[0.0,0.0,-17.70516153971354,0.0,17.70516153971354,0.0,2],[45.35,0.0,27.644838460286458,0.0,63.05515950520833,0.0,2]],0],[[[0.0,0.0,-17.70516153971354,0.0,17.70516153971354,0.0,2],[45.35,0.0,27.644838460286458,0.0,63.05515950520833,0.0,2]],0]],\"location\":[[[[0.0,2.0,-17.627079264322916,2.0,17.627079264322916,2.0,2],[45.15,2.0,44.759586588541666,2.0,45.228084309895834,2.0,2],[45.35,2.0,45.271915690104166,2.0,45.42808430989583,2.0,2]],0],[[[0.0,0.0,-17.627079264322916,0.0,17.627079264322916,0.0,2],[45.15,0.0,44.759586588541666,0.0,45.228084309895834,0.0,2],[45.35,0.0,45.271915690104166,0.0,45.42808430989583,0.0,2]],0],[[[0.0,1.0,-17.627079264322916,1.0,17.627079264322916,1.0,2],[45.15,1.0,44.759586588541666,1.0,45.228084309895834,1.0,2],[45.35,0.0,45.271915690104166,0.0,45.42808430989583,0.0,2]],0]],\"scale\":[[[[0.0,1.0,-17.70516153971354,1.0,17.70516153971354,1.0,2],[45.35,1.0,27.644838460286458,1.0,63.05515950520833,1.0,2]],0],[[[0.0,1.0,-17.70516153971354,1.0,17.70516153971354,1.0,2],[45.35,1.0,27.644838460286458,1.0,63.05515950520833,1.0,2]],0],[[[0.0,1.0,-17.70516153971354,1.0,17.70516153971354,1.0,2],[45.35,1.0,27.644838460286458,1.0,63.05515950520833,1.0,2]],0]]}],\"CurveOut\":[{\"rotation_euler\":[[[[78.95,0.0,74.7140380859375,0.0,83.1859619140625,0.0,1],[89.8,0.0,86.70924479166666,0.0,90.41814778645833,0.0,2],[91.38333333333333,0.0,90.765185546875,0.0,92.00148111979166,0.0,2]],0],[[[78.95,0.0,74.7140380859375,0.0,83.1859619140625,0.0,1],[89.8,0.0,86.70924479166666,0.0,90.41814778645833,0.0,2],[91.38333333333333,0.0,90.765185546875,0.0,92.00148111979166,0.0,2]],0],[[[78.95,0.0,74.7140380859375,0.0,83.1859619140625,0.0,1],[89.8,0.0,86.70924479166666,0.0,90.41814778645833,0.0,2],[91.38333333333333,0.0,90.765185546875,0.0,92.00148111979166,0.0,2]],0]],\"location\":[[[[78.95,-2.0,74.7140380859375,-2.0,83.1859619140625,-2.0,1],[89.8,-2.0,86.70924479166666,-2.0,90.41814778645833,-2.0,2],[91.38333333333333,-2.0,90.765185546875,-2.0,94.47408854166666,-2.0,2],[119.61666666666666,-2.0,108.59405110677083,-2.0,130.6392822265625,-2.0,2]],0],[[[78.95,-2.0,74.7140380859375,-2.0,83.1859619140625,-2.0,1],[89.8,-2.0,86.70924479166666,-2.0,90.41814778645833,-2.0,2],[91.38333333333333,-2.0,90.765185546875,-2.0,94.47408854166666,-2.0,2],[119.61666666666666,-2.0,108.59405110677083,-2.0,130.6392822265625,-2.0,2]],0],[[[78.95,0.0,74.7140380859375,0.0,83.1859619140625,0.0,1],[89.8,1.0,86.70924479166666,1.0,90.41814778645833,1.0,2],[91.38333333333333,0.6558696031570435,90.765185546875,0.6558696031570435,94.47408854166666,0.6558696031570435,2],[119.61666666666666,0.6558696031570435,109.98651529947917,0.6558696031570435,121.54270019531249,0.6558696031570435,2],[124.55,0.0,122.62396647135417,0.0,126.47603352864583,0.0,2]],0]],\"scale\":[[[[78.95,1.0,74.7140380859375,1.0,83.1859619140625,1.0,1],[89.8,1.0,86.70924479166666,1.0,90.41814778645833,1.0,2],[91.38333333333333,1.0,90.765185546875,1.0,92.00148111979166,1.0,2]],0],[[[78.95,1.0,74.7140380859375,1.0,83.1859619140625,1.0,1],[89.8,1.0,86.70924479166666,1.0,90.41814778645833,1.0,2],[91.38333333333333,1.0,90.765185546875,1.0,92.00148111979166,1.0,2]],0],[[[78.95,1.0,74.7140380859375,1.0,83.1859619140625,1.0,1],[89.8,1.0,86.70924479166666,1.0,90.41814778645833,1.0,2],[91.38333333333333,1.0,90.765185546875,1.0,92.00148111979166,1.0,2]],0]]}],\"CurveTwist\":[{\"rotation_euler\":[[[[90.2,0.0,90.03081868489583,0.0,90.36918131510417,0.0,2],[90.63333333333333,0.0,90.46415201822917,0.0,91.16039225260417,0.0,2],[91.98333333333333,0.0,91.4562744140625,0.0,92.51039225260416,0.0,2]],0],[[[90.2,0.0,90.03081868489583,0.0,90.36918131510417,0.0,2],[90.63333333333333,0.0,90.46415201822917,0.0,91.16039225260417,0.0,2],[91.98333333333333,0.0,91.4562744140625,0.0,92.51039225260416,0.0,2]],0],[[[90.2,0.0,90.03081868489583,0.0,90.36918131510417,0.0,2],[90.63333333333333,0.0,90.46415201822917,0.0,91.16039225260417,0.0,2],[91.98333333333333,0.0,91.4562744140625,0.0,92.51039225260416,0.0,2]],0]],\"location\":[[[[90.2,-3.0,90.03081868489583,-3.0,90.36918131510417,-3.0,2],[90.63333333333333,-3.0,90.46415201822917,-3.0,91.16039225260417,-3.0,2],[91.98333333333333,-3.0,91.4562744140625,-3.0,94.61861165364583,-3.0,2],[123.56666666666666,-3.0,111.23617350260416,-3.0,135.89715983072915,-3.0,2]],0],[[[90.2,-2.0,90.03081868489583,-2.0,90.36918131510417,-2.0,2],[90.63333333333333,-2.0,90.46415201822917,-2.0,91.16039225260417,-2.0,2],[91.98333333333333,-2.0,91.4562744140625,-2.0,94.61861165364583,-2.0,2],[123.56666666666666,-2.0,111.23617350260416,-2.0,135.89715983072915,-2.0,2]],0],[[[90.2,0.0,90.03081868489583,0.0,90.36918131510417,0.0,2],[90.63333333333333,0.5708911418914795,90.46415201822917,0.4331509470939636,91.16039225260417,1.0,2],[91.98333333333333,1.0,91.4562744140625,1.0,94.61861165364583,1.0,2],[123.56666666666666,1.0,111.23617350260416,1.0,127.63345540364583,1.0,2],[133.98333333333332,0.0,129.91654459635416,0.0,138.05011393229165,0.0,2]],0]],\"scale\":[[[[90.2,1.0,90.03081868489583,1.0,90.36918131510417,1.0,2],[90.63333333333333,1.0,90.46415201822917,1.0,91.16039225260417,1.0,2],[91.98333333333333,1.0,91.4562744140625,1.0,92.51039225260416,1.0,2]],0],[[[90.2,1.0,90.03081868489583,1.0,90.36918131510417,1.0,2],[90.63333333333333,1.0,90.46415201822917,1.0,91.16039225260417,1.0,2],[91.98333333333333,1.0,91.4562744140625,1.0,92.51039225260416,1.0,2]],0],[[[90.2,1.0,90.03081868489583,1.0,90.36918131510417,1.0,2],[90.63333333333333,1.0,90.46415201822917,1.0,91.16039225260417,1.0,2],[91.98333333333333,1.0,91.4562744140625,1.0,92.51039225260416,1.0,2]],0]]}],\"CurveRolling\":[{\"rotation_euler\":[[[[90.71666666666667,0.0,81.54850260416667,0.0,99.88483072916667,0.0,2],[114.2,0.0,105.03183593749999,0.0,123.3681640625,0.0,2]],0],[[[90.71666666666667,0.0,81.54850260416667,0.0,99.88483072916667,0.0,2],[114.2,0.0,105.03183593749999,0.0,123.3681640625,0.0,2]],0],[[[90.71666666666667,0.0,81.54850260416667,0.0,99.88483072916667,0.0,2],[114.2,0.0,105.03183593749999,0.0,123.3681640625,0.0,2]],0]],\"location\":[[[[90.71666666666667,-6.0,81.54850260416667,-6.0,99.88483072916667,-6.0,2],[114.2,-6.0,105.03183593749999,-6.0,123.3681640625,-6.0,2]],0],[[[90.71666666666667,-2.0,81.54850260416667,-2.0,99.88483072916667,-2.0,2],[114.2,-2.0,105.03183593749999,-2.0,123.3681640625,-2.0,2]],0],[[[90.71666666666667,0.0,81.54850260416667,0.0,99.88483072916667,0.0,2],[114.2,35.0,105.03183593749999,35.0,123.3681640625,35.0,2]],0]],\"scale\":[[[[90.71666666666667,1.0,81.54850260416667,1.0,99.88483072916667,1.0,2],[114.2,1.0,105.03183593749999,1.0,123.3681640625,1.0,2]],0],[[[90.71666666666667,1.0,81.54850260416667,1.0,99.88483072916667,1.0,2],[114.2,1.0,105.03183593749999,1.0,123.3681640625,1.0,2]],0],[[[90.71666666666667,1.0,81.54850260416667,1.0,99.88483072916667,1.0,2],[114.2,1.0,105.03183593749999,1.0,123.3681640625,1.0,2]],0]]}],\"CameraTarget\":[{\"rotation_euler\":[[[[22.583333333333332,0.0,20.377508544921874,0.0,24.78915812174479,0.0,1],[28.233333333333334,0.0,26.027508544921876,0.0,30.44566446940104,0.0,1],[33.9,0.0,31.68766886393229,0.0,38.98185628255208,0.0,1],[46.916666666666664,0.0,46.884130859375,0.0,46.92317301432291,0.0,1],[46.93333333333333,0.0,46.92682698567708,0.0,46.965869140625,0.0,1],[56.5,0.0,56.467464192708334,0.0,56.50650634765625,0.0,1],[56.516666666666666,0.0,56.51016031901042,0.0,56.54920247395833,0.0,1],[62.083333333333336,0.0,59.91004231770833,0.0,66.56005045572917,0.0,1],[73.55,0.0,73.51746419270833,0.0,73.55651041666667,0.0,1],[73.56666666666666,0.0,73.56015625,0.0,73.59920247395833,0.0,1],[84.28333333333333,0.0,80.09942220052083,0.0,86.84052734375,0.0,1],[90.83333333333333,0.0,88.27613932291666,0.0,92.85696614583333,0.0,2],[96.01666666666667,0.0,95.984130859375,0.0,96.02317708333334,0.0,1],[96.03333333333333,0.0,96.02682291666666,0.0,96.065869140625,0.0,1],[107.66666666666667,0.0,103.1248779296875,0.0,111.86359049479167,0.0,1],[118.41666666666667,0.0,114.21974283854166,0.0,119.70502115885417,0.0,1],[121.71666666666667,0.0,120.42831217447916,0.0,123.00502115885416,0.0,1]],0],[[[22.583333333333332,0.0,20.377508544921874,0.0,24.78915812174479,0.0,1],[28.233333333333334,0.0,26.027508544921876,0.0,30.44566446940104,0.0,1],[33.9,0.0,31.68766886393229,0.0,38.98185628255208,0.0,1],[46.916666666666664,0.0,46.884130859375,0.0,46.92317301432291,0.0,1],[46.93333333333333,0.0,46.92682698567708,0.0,46.965869140625,0.0,1],[56.5,0.0,56.467464192708334,0.0,56.50650634765625,0.0,1],[56.516666666666666,0.0,56.51016031901042,0.0,56.54920247395833,0.0,1],[62.083333333333336,0.0,59.91004231770833,0.0,66.56005045572917,0.0,1],[73.55,0.0,73.51746419270833,0.0,73.55651041666667,0.0,1],[73.56666666666666,0.0,73.56015625,0.0,73.59920247395833,0.0,1],[84.28333333333333,0.0,80.09942220052083,0.0,86.84052734375,0.0,1],[90.83333333333333,0.0,88.27613932291666,0.0,92.85696614583333,0.0,2],[96.01666666666667,0.0,95.984130859375,0.0,96.02317708333334,0.0,1],[96.03333333333333,0.0,96.02682291666666,0.0,96.065869140625,0.0,1],[107.66666666666667,0.0,103.1248779296875,0.0,111.86359049479167,0.0,1],[118.41666666666667,0.0,114.21974283854166,0.0,119.70502115885417,0.0,1],[121.71666666666667,0.0,120.42831217447916,0.0,123.00502115885416,0.0,1]],0],[[[22.583333333333332,0.0,20.377508544921874,0.0,24.78915812174479,0.0,1],[28.233333333333334,0.0,26.027508544921876,0.0,30.44566446940104,0.0,1],[33.9,0.0,31.68766886393229,0.0,38.98185628255208,0.0,1],[46.916666666666664,0.0,46.884130859375,0.0,46.92317301432291,0.0,1],[46.93333333333333,0.0,46.92682698567708,0.0,46.965869140625,0.0,1],[56.5,0.0,56.467464192708334,0.0,56.50650634765625,0.0,1],[56.516666666666666,0.0,56.51016031901042,0.0,56.54920247395833,0.0,1],[62.083333333333336,0.0,59.91004231770833,0.0,66.56005045572917,0.0,1],[73.55,0.0,73.51746419270833,0.0,73.55651041666667,0.0,1],[73.56666666666666,0.0,73.56015625,0.0,73.59920247395833,0.0,1],[84.28333333333333,0.0,80.09942220052083,0.0,86.84052734375,0.0,1],[90.83333333333333,0.0,88.27613932291666,0.0,92.85696614583333,0.0,2],[96.01666666666667,0.0,95.984130859375,0.0,96.02317708333334,0.0,1],[96.03333333333333,0.0,96.02682291666666,0.0,96.065869140625,0.0,1],[107.66666666666667,0.0,103.1248779296875,0.0,111.86359049479167,0.0,1],[118.41666666666667,0.0,114.21974283854166,0.0,119.70502115885417,0.0,1],[121.71666666666667,0.0,120.42831217447916,0.0,123.00502115885416,0.0,1]],0]],\"location\":[[[[0.0,0.0,-8.810286458333334,0.0,8.810286458333334,0.0,1],[22.566666666666666,0.0,22.53413289388021,0.0,22.573173014322915,0.0,1],[22.583333333333332,0.0,22.576826985677084,0.0,22.61586710611979,0.0,1],[28.216666666666665,0.0,28.184132893880207,0.0,28.223173014322917,0.0,1],[28.233333333333334,0.3035154640674591,28.226826985677082,0.3035154640674591,28.265867106119792,0.3035154640674591,1],[33.88333333333333,0.3035154640674591,33.850799560546875,0.3035154640674591,33.88983968098958,0.3035154640674591,1],[33.9,-0.13389502465724945,33.89349365234375,-0.13389502465724945,33.932533772786456,-0.13389502465724945,1],[39.516666666666666,-0.13389502465724945,39.484130859375,-0.13389502465724945,39.523173014322914,-0.13389502465724945,1],[39.53333333333333,0.0,39.52682698567708,0.0,39.565869140625,0.0,1],[46.916666666666664,0.0,46.884130859375,0.0,46.92317301432291,0.0,1],[46.93333333333333,0.16334687173366547,46.92682698567708,0.16334687173366547,46.965869140625,0.16334687173366547,1],[51.483333333333334,0.16334687173366547,49.70696207682292,0.16334687173366547,53.441898600260416,0.16334687173366547,1],[56.5,0.38605794310569763,56.467464192708334,0.38605794310569763,56.50650634765625,0.38605794310569763,1],[56.516666666666666,0.3449830412864685,56.51016031901042,0.3449830412864685,56.54920247395833,0.3449830412864685,1],[62.06666666666666,0.3449830412864685,62.034130859375,0.3449830412864685,62.07317301432292,0.3449830412864685,1],[62.083333333333336,0.29498523473739624,62.07682698567708,0.29498523473739624,62.115869140625,0.29498523473739624,1],[73.55,0.29498523473739624,73.51746419270833,0.29498523473739624,73.55651041666667,0.29498523473739624,1],[73.56666666666666,0.29498523473739624,73.56015625,0.29498523473739624,73.59920247395833,0.29498523473739624,1],[84.28333333333333,0.0,80.09942220052083,0.0,86.84052734375,0.0,1],[90.83333333333333,0.0,88.27613932291666,0.0,92.85696614583333,0.0,2],[96.01666666666667,0.0,95.984130859375,0.0,96.02317708333334,0.0,1],[96.03333333333333,0.0,96.02682291666666,0.0,96.065869140625,0.0,1],[107.66666666666667,0.0,103.1248779296875,0.0,109.77488606770834,0.0,1],[113.06666666666666,0.0,113.034130859375,0.0,113.07317708333333,0.0,1],[113.08333333333333,0.0,113.07682291666667,0.0,113.115869140625,0.0,1],[118.41666666666667,0.0,116.33447265625,0.0,119.70502115885417,0.0,1],[121.71666666666667,-0.17660491168498993,120.42831217447916,-0.17660491168498993,123.42797037760417,-0.17660491168498993,1],[126.1,0.0,124.3886962890625,0.0,127.8113037109375,0.0,1]],0],[[[0.0,0.0,-8.810286458333334,0.0,8.810286458333334,0.0,1],[22.566666666666666,0.0,22.53413289388021,0.0,22.573173014322915,0.0,1],[22.583333333333332,0.0,22.576826985677084,0.0,22.61586710611979,0.0,1],[28.216666666666665,0.0,28.184132893880207,0.0,28.223173014322917,0.0,1],[28.233333333333334,-0.0962601751089096,28.226826985677082,-0.0962601751089096,28.265867106119792,-0.0962601751089096,1],[33.88333333333333,-0.0962601751089096,33.850799560546875,-0.0962601751089096,33.88983968098958,-0.0962601751089096,1],[33.9,0.8209441304206848,33.89349365234375,0.8209441304206848,33.932533772786456,0.8209441304206848,1],[39.516666666666666,0.8209441304206848,39.484130859375,0.8209441304206848,39.523173014322914,0.8209441304206848,1],[39.53333333333333,0.0,39.52682698567708,0.0,39.565869140625,0.0,1],[46.916666666666664,0.0,46.884130859375,0.0,46.92317301432291,0.0,1],[46.93333333333333,0.4397817552089691,46.92682698567708,0.4397817552089691,46.965869140625,0.4397817552089691,1],[51.483333333333334,0.4397817552089691,49.70696207682292,0.4397817552089691,53.441898600260416,0.4397817552089691,1],[56.5,0.6317379474639893,56.467464192708334,0.6317379474639893,56.50650634765625,0.6317379474639893,1],[56.516666666666666,0.43265238404273987,56.51016031901042,0.43265238404273987,56.54920247395833,0.43265238404273987,1],[62.06666666666666,0.43265238404273987,62.034130859375,0.43265238404273987,62.07317301432292,0.43265238404273987,1],[62.083333333333336,-0.3111448884010315,62.07682698567708,-0.3111448884010315,62.115869140625,-0.3111448884010315,1],[73.55,-0.3111448884010315,73.51746419270833,-0.3111448884010315,73.55651041666667,-0.3111448884010315,1],[73.56666666666666,-0.3111448884010315,73.56015625,-0.3111448884010315,73.59920247395833,-0.3111448884010315,1],[84.28333333333333,0.0,80.09942220052083,0.0,86.84052734375,0.0,1],[90.83333333333333,0.0,88.27613932291666,0.0,92.85696614583333,0.0,2],[96.01666666666667,0.0,95.984130859375,0.0,96.02317708333334,0.0,1],[96.03333333333333,0.0,96.02682291666666,0.0,96.065869140625,0.0,1],[107.66666666666667,0.0,103.1248779296875,0.0,109.77488606770834,0.0,1],[113.06666666666666,0.0,113.034130859375,0.0,113.07317708333333,0.0,1],[113.08333333333333,0.0,113.07682291666667,0.0,113.115869140625,0.0,1],[118.41666666666667,0.0,116.33447265625,0.0,119.70502115885417,0.0,1],[121.71666666666667,-0.10370779037475586,120.42831217447916,-0.10370779037475586,123.42797037760417,-0.10370779037475586,1],[126.1,0.0,124.3886962890625,0.0,127.8113037109375,0.0,1]],0],[[[0.0,0.0,-8.810286458333334,0.0,8.810286458333334,0.0,1],[22.566666666666666,0.0,22.53413289388021,0.0,22.573173014322915,0.0,1],[22.583333333333332,0.929543137550354,22.576826985677084,0.929543137550354,22.61586710611979,0.929543137550354,1],[28.216666666666665,0.929543137550354,28.184132893880207,0.929543137550354,28.223173014322917,0.929543137550354,1],[28.233333333333334,0.9411077499389648,28.226826985677082,0.9411077499389648,28.265867106119792,0.9411077499389648,1],[33.88333333333333,0.9411077499389648,33.850799560546875,0.9411077499389648,33.88983968098958,0.9411077499389648,1],[33.9,0.0942237377166748,33.89349365234375,0.0942237377166748,33.932533772786456,0.0942237377166748,1],[39.516666666666666,0.0942237377166748,39.484130859375,0.0942237377166748,39.523173014322914,0.0942237377166748,1],[39.53333333333333,0.0,39.52682698567708,0.0,39.565869140625,0.0,1],[46.916666666666664,0.21919268369674683,46.884130859375,0.0,46.92317301432291,0.2630257308483124,1],[46.93333333333333,0.946829617023468,46.92682698567708,0.946829617023468,46.965869140625,0.946829617023468,1],[51.483333333333334,0.946829617023468,49.70696207682292,0.946829617023468,53.441898600260416,0.946829617023468,1],[56.5,1.3760722875595093,56.467464192708334,1.3760722875595093,56.50650634765625,1.3760722875595093,1],[56.516666666666666,0.961020827293396,56.51016031901042,0.961020827293396,56.54920247395833,0.961020827293396,1],[62.06666666666666,0.961020827293396,62.034130859375,0.961020827293396,62.07317301432292,0.961020827293396,1],[62.083333333333336,0.7762316465377808,62.07682698567708,0.8124698400497437,62.115869140625,0.5950407981872559,1],[73.55,0.1902613639831543,73.51746419270833,0.1902613639831543,73.55651041666667,0.1902613639831543,1],[73.56666666666666,3.608147621154785,73.56015625,3.608147621154785,73.59920247395833,3.608147621154785,1],[84.28333333333333,0.2891044318675995,80.09942220052083,0.2891044318675995,86.84052734375,0.2891044318675995,1],[90.83333333333333,0.7125749588012695,88.27613932291666,0.44132232666015625,92.85696614583333,0.9272303581237793,2],[96.01666666666667,1.477098822593689,95.984130859375,1.477098822593689,96.02317708333334,1.477098822593689,1],[96.03333333333333,-0.14830374717712402,96.02682291666666,-0.14830374717712402,96.065869140625,-0.14830374717712402,1],[107.66666666666667,0.4096316695213318,103.1248779296875,0.4096316695213318,109.77488606770834,0.4096316695213318,1],[113.06666666666666,0.4096316695213318,113.034130859375,0.4096316695213318,113.07317708333333,0.4096316695213318,1],[113.08333333333333,0.4096316695213318,113.07682291666667,0.4096316695213318,113.115869140625,0.4096316695213318,1],[118.41666666666667,-0.03710082173347473,116.33447265625,-0.03710082173347473,119.70502115885417,-0.03710082173347473,1],[121.71666666666667,0.041156232357025146,120.42831217447916,0.041156232357025146,123.42797037760417,0.041156232357025146,1],[126.1,0.0,124.3886962890625,0.0,127.8113037109375,0.0,1]],0]],\"scale\":[[[[22.583333333333332,1.0,20.377508544921874,1.0,24.78915812174479,1.0,1],[28.233333333333334,1.0,26.027508544921876,1.0,30.44566446940104,1.0,1],[33.9,1.0,31.68766886393229,1.0,38.98185628255208,1.0,1],[46.916666666666664,1.0,46.884130859375,1.0,46.92317301432291,1.0,1],[46.93333333333333,1.0,46.92682698567708,1.0,46.965869140625,1.0,1],[56.5,1.0,56.467464192708334,1.0,56.50650634765625,1.0,1],[56.516666666666666,1.0,56.51016031901042,1.0,56.54920247395833,1.0,1],[62.083333333333336,1.0,59.91004231770833,1.0,66.56005045572917,1.0,1],[73.55,1.0,73.51746419270833,1.0,73.55651041666667,1.0,1],[73.56666666666666,1.0,73.56015625,1.0,73.59920247395833,1.0,1],[84.28333333333333,1.0,80.09942220052083,1.0,86.84052734375,1.0,1],[90.83333333333333,1.0,88.27613932291666,1.0,92.85696614583333,1.0,2],[96.01666666666667,1.0,95.984130859375,1.0,96.02317708333334,1.0,1],[96.03333333333333,1.0,96.02682291666666,1.0,96.065869140625,1.0,1],[107.66666666666667,1.0,103.1248779296875,1.0,111.86359049479167,1.0,1],[118.41666666666667,1.0,114.21974283854166,1.0,119.70502115885417,1.0,1],[121.71666666666667,1.0,120.42831217447916,1.0,123.00502115885416,1.0,1]],0],[[[22.583333333333332,1.0,20.377508544921874,1.0,24.78915812174479,1.0,1],[28.233333333333334,1.0,26.027508544921876,1.0,30.44566446940104,1.0,1],[33.9,1.0,31.68766886393229,1.0,38.98185628255208,1.0,1],[46.916666666666664,1.0,46.884130859375,1.0,46.92317301432291,1.0,1],[46.93333333333333,1.0,46.92682698567708,1.0,46.965869140625,1.0,1],[56.5,1.0,56.467464192708334,1.0,56.50650634765625,1.0,1],[56.516666666666666,1.0,56.51016031901042,1.0,56.54920247395833,1.0,1],[62.083333333333336,1.0,59.91004231770833,1.0,66.56005045572917,1.0,1],[73.55,1.0,73.51746419270833,1.0,73.55651041666667,1.0,1],[73.56666666666666,1.0,73.56015625,1.0,73.59920247395833,1.0,1],[84.28333333333333,1.0,80.09942220052083,1.0,86.84052734375,1.0,1],[90.83333333333333,1.0,88.27613932291666,1.0,92.85696614583333,1.0,2],[96.01666666666667,1.0,95.984130859375,1.0,96.02317708333334,1.0,1],[96.03333333333333,1.0,96.02682291666666,1.0,96.065869140625,1.0,1],[107.66666666666667,1.0,103.1248779296875,1.0,111.86359049479167,1.0,1],[118.41666666666667,1.0,114.21974283854166,1.0,119.70502115885417,1.0,1],[121.71666666666667,1.0,120.42831217447916,1.0,123.00502115885416,1.0,1]],0],[[[22.583333333333332,1.0,20.377508544921874,1.0,24.78915812174479,1.0,1],[28.233333333333334,1.0,26.027508544921876,1.0,30.44566446940104,1.0,1],[33.9,1.0,31.68766886393229,1.0,38.98185628255208,1.0,1],[46.916666666666664,1.0,46.884130859375,1.0,46.92317301432291,1.0,1],[46.93333333333333,1.0,46.92682698567708,1.0,46.965869140625,1.0,1],[56.5,1.0,56.467464192708334,1.0,56.50650634765625,1.0,1],[56.516666666666666,1.0,56.51016031901042,1.0,56.54920247395833,1.0,1],[62.083333333333336,1.0,59.91004231770833,1.0,66.56005045572917,1.0,1],[73.55,1.0,73.51746419270833,1.0,73.55651041666667,1.0,1],[73.56666666666666,1.0,73.56015625,1.0,73.59920247395833,1.0,1],[84.28333333333333,1.0,80.09942220052083,1.0,86.84052734375,1.0,1],[90.83333333333333,1.0,88.27613932291666,1.0,92.85696614583333,1.0,2],[96.01666666666667,1.0,95.984130859375,1.0,96.02317708333334,1.0,1],[96.03333333333333,1.0,96.02682291666666,1.0,96.065869140625,1.0,1],[107.66666666666667,1.0,103.1248779296875,1.0,111.86359049479167,1.0,1],[118.41666666666667,1.0,114.21974283854166,1.0,119.70502115885417,1.0,1],[121.71666666666667,1.0,120.42831217447916,1.0,123.00502115885416,1.0,1]],0]]}],\"ExtraFOV\":[{\"rotation_euler\":[[[[47.38333333333333,0.0,47.18812662760416,0.0,47.5785400390625,0.0,2],[47.88333333333333,0.0,47.68812662760416,0.0,48.800801595052086,0.0,2],[50.233333333333334,0.0,49.452510579427084,0.0,50.38949788411458,0.0,2],[50.63333333333333,0.0,50.477168782552084,0.0,50.69189453125,0.0,2],[50.78333333333333,0.0,50.724772135416664,0.0,51.0045654296875,0.0,2],[51.35,0.0,51.12876790364583,0.0,52.065755208333336,0.0,2],[53.18333333333333,0.0,52.467578124999996,0.0,53.43059488932292,0.0,2],[53.81666666666666,0.0,53.56940511067708,0.0,54.870776367187496,0.0,2],[56.516666666666666,0.0,55.46255696614583,0.0,58.68995768229166,0.0,2],[62.083333333333336,0.0,59.91004231770833,0.0,64.25662434895833,0.0,2]],0],[[[47.38333333333333,0.0,47.18812662760416,0.0,47.5785400390625,0.0,2],[47.88333333333333,0.0,47.68812662760416,0.0,48.800801595052086,0.0,2],[50.233333333333334,0.0,49.452510579427084,0.0,50.38949788411458,0.0,2],[50.63333333333333,0.0,50.477168782552084,0.0,50.69189453125,0.0,2],[50.78333333333333,0.0,50.724772135416664,0.0,51.0045654296875,0.0,2],[51.35,0.0,51.12876790364583,0.0,52.065755208333336,0.0,2],[53.18333333333333,0.0,52.467578124999996,0.0,53.43059488932292,0.0,2],[53.81666666666666,0.0,53.56940511067708,0.0,54.870776367187496,0.0,2],[56.516666666666666,0.0,55.46255696614583,0.0,58.68995768229166,0.0,2],[62.083333333333336,0.0,59.91004231770833,0.0,64.25662434895833,0.0,2]],0],[[[47.38333333333333,0.0,47.18812662760416,0.0,47.5785400390625,0.0,2],[47.88333333333333,0.0,47.68812662760416,0.0,48.800801595052086,0.0,2],[50.233333333333334,0.0,49.452510579427084,0.0,50.38949788411458,0.0,2],[50.63333333333333,0.0,50.477168782552084,0.0,50.69189453125,0.0,2],[50.78333333333333,0.0,50.724772135416664,0.0,51.0045654296875,0.0,2],[51.35,0.0,51.12876790364583,0.0,52.065755208333336,0.0,2],[53.18333333333333,0.0,52.467578124999996,0.0,53.43059488932292,0.0,2],[53.81666666666666,0.0,53.56940511067708,0.0,54.870776367187496,0.0,2],[56.516666666666666,0.0,55.46255696614583,0.0,58.68995768229166,0.0,2],[62.083333333333336,0.0,59.91004231770833,0.0,64.25662434895833,0.0,2]],0]],\"location\":[[[[47.266666666666666,-2.0,47.2211181640625,-2.0,47.312215169270836,-2.0,2],[47.38333333333333,-2.0,47.33778483072916,-2.0,47.5785400390625,-2.0,2],[47.88333333333333,-2.0,47.68812662760416,-2.0,48.74874674479167,-2.0,2],[50.1,-2.0,49.839725748697916,-2.0,50.15205485026041,-2.0,2],[50.233333333333334,-2.0,50.181278483072916,-2.0,50.38949788411458,-2.0,2],[50.63333333333333,-2.0,50.477168782552084,-2.0,50.69189453125,-2.0,2],[50.78333333333333,-2.0,50.724772135416664,-2.0,51.0045654296875,-2.0,2],[51.35,-2.0,51.12876790364583,-2.0,52.00719401041667,-2.0,2],[53.03333333333333,-2.0,52.74052327473958,-2.0,53.09189453125,-2.0,2],[53.18333333333333,-2.0,53.12477213541666,-2.0,53.35251057942708,-2.0,2],[53.61666666666667,-2.0,53.447489420572914,-2.0,53.694750976562496,-2.0,2],[53.81666666666666,-2.0,53.738582356770834,-2.0,54.0704345703125,-2.0,2],[54.46666666666667,-2.0,54.21289876302083,-2.0,55.260502115885416,-2.0,2],[56.5,-2.0,56.467464192708334,-2.0,56.50650634765625,-2.0,2],[56.516666666666666,-2.0,56.51016031901042,-2.0,56.54920247395833,-2.0,2],[58.56666666666666,-2.0,57.76632486979167,-2.0,58.839953613281246,-2.0,2],[59.266666666666666,-2.0,58.99337972005208,-2.0,60.11906331380208,-2.0,2],[61.449999999999996,-2.0,60.669177246093746,-2.0,61.60616455078125,-2.0,2],[61.85,-2.0,61.693835449218746,-2.0,61.934590657552086,-2.0,2],[62.06666666666666,-2.0,62.034130859375,-2.0,62.07317301432292,-2.0,2],[62.083333333333336,-2.0,62.07682698567708,-2.0,62.089839680989584,-2.0,2]],0],[[[47.266666666666666,-3.0,47.2211181640625,-3.0,47.312215169270836,-3.0,2],[47.38333333333333,-3.0,47.33778483072916,-3.0,47.5785400390625,-3.0,2],[47.88333333333333,-3.0,47.68812662760416,-3.0,48.74874674479167,-3.0,2],[50.1,-3.0,49.839725748697916,-3.0,50.15205485026041,-3.0,2],[50.233333333333334,-3.0,50.181278483072916,-3.0,50.38949788411458,-3.0,2],[50.63333333333333,-3.0,50.477168782552084,-3.0,50.69189453125,-3.0,2],[50.78333333333333,-3.0,50.724772135416664,-3.0,51.0045654296875,-3.0,2],[51.35,-3.0,51.12876790364583,-3.0,52.00719401041667,-3.0,2],[53.03333333333333,-3.0,52.74052327473958,-3.0,53.09189453125,-3.0,2],[53.18333333333333,-3.0,53.12477213541666,-3.0,53.35251057942708,-3.0,2],[53.61666666666667,-3.0,53.447489420572914,-3.0,53.694750976562496,-3.0,2],[53.81666666666666,-3.0,53.738582356770834,-3.0,54.0704345703125,-3.0,2],[54.46666666666667,-3.0,54.21289876302083,-3.0,55.260502115885416,-3.0,2],[56.5,-3.0,56.467464192708334,-3.0,56.50650634765625,-3.0,2],[56.516666666666666,-3.0,56.51016031901042,-3.0,56.54920247395833,-3.0,2],[58.56666666666666,-3.0,57.76632486979167,-3.0,58.839953613281246,-3.0,2],[59.266666666666666,-3.0,58.99337972005208,-3.0,60.11906331380208,-3.0,2],[61.449999999999996,-3.0,60.669177246093746,-3.0,61.60616455078125,-3.0,2],[61.85,-3.0,61.693835449218746,-3.0,61.934590657552086,-3.0,2],[62.06666666666666,-3.0,62.034130859375,-3.0,62.07317301432292,-3.0,2],[62.083333333333336,-3.0,62.07682698567708,-3.0,62.089839680989584,-3.0,2]],0],[[[47.266666666666666,0.0,47.2211181640625,0.0,47.312215169270836,0.0,2],[47.38333333333333,14.906534194946289,47.33778483072916,14.906534194946289,47.5785400390625,14.906534194946289,2],[47.88333333333333,0.0,47.68812662760416,0.0,48.74874674479167,0.0,2],[50.1,0.0,49.839725748697916,0.0,50.15205485026041,0.0,2],[50.233333333333334,16.01653480529785,50.181278483072916,16.01653480529785,50.38949788411458,16.01653480529785,2],[50.63333333333333,0.0,50.477168782552084,0.0,50.69189453125,0.0,2],[50.78333333333333,37.55653381347656,50.724772135416664,37.55653381347656,51.0045654296875,37.55653381347656,2],[51.35,0.0,51.12876790364583,0.0,52.00719401041667,0.0,2],[53.03333333333333,0.0,52.74052327473958,0.0,53.09189453125,0.0,2],[53.18333333333333,11.565223693847656,53.12477213541666,11.565223693847656,53.35251057942708,11.565223693847656,2],[53.61666666666667,0.0,53.447489420572914,0.0,53.694750976562496,0.0,2],[53.81666666666666,11.565223693847656,53.738582356770834,11.565223693847656,54.0704345703125,11.565223693847656,2],[54.46666666666667,0.0,54.21289876302083,0.0,55.260502115885416,0.0,2],[56.5,0.0,56.467464192708334,0.0,56.50650634765625,0.0,2],[56.516666666666666,-27.29120635986328,56.51016031901042,-27.29120635986328,56.54920247395833,-27.29120635986328,2],[58.28333333333333,0.0,57.7302490234375,0.0,58.39394938151042,0.0,2],[58.56666666666666,0.0,58.456050618489584,0.0,58.638240559895834,0.0,2],[58.75,10.0,58.678426106770836,10.0,58.95171305338542,10.0,2],[59.266666666666666,0.0,59.06495361328125,0.0,60.11906331380208,0.0,2],[61.449999999999996,0.0,61.092122395833336,0.0,61.52157389322917,0.0,2],[61.63333333333333,5.0,61.56175944010417,5.0,61.71792399088542,5.0,2],[61.85,0.0,61.76540934244792,0.0,61.921573893229166,0.0,2],[62.03333333333333,5.0,61.968265787760416,5.0,62.046346028645836,5.0,2],[62.06666666666666,0.0,62.053653971354166,0.0,62.07317301432292,0.0,2],[62.083333333333336,30.746854782104492,62.07682698567708,30.746854782104492,62.115869140625,30.746854782104492,2],[74.9,0.0,69.89622395833334,0.0,79.90377604166666,0.0,2]],0]],\"delta_rotation_euler\":[[[[58.56666666666666,0.0,57.44097900390625,0.0,59.69235432942708,0.0,2],[61.449999999999996,0.0,60.669177246093746,0.0,61.60616455078125,0.0,2],[61.85,0.0,61.693835449218746,0.0,62.00616455078125,0.0,2]],0],[[[58.56666666666666,0.0,57.44097900390625,0.0,59.69235432942708,0.0,2],[61.449999999999996,0.0,60.669177246093746,0.0,61.60616455078125,0.0,2],[61.85,0.0,61.693835449218746,0.0,62.00616455078125,0.0,2]],0],[[[58.56666666666666,0.0,57.44097900390625,0.0,59.69235432942708,0.0,2],[61.449999999999996,0.0,60.669177246093746,0.0,61.60616455078125,0.0,2],[61.85,0.0,61.693835449218746,0.0,62.00616455078125,0.0,2]],0]],\"scale\":[[[[47.38333333333333,1.0,47.18812662760416,1.0,47.5785400390625,1.0,2],[47.88333333333333,1.0,47.68812662760416,1.0,48.800801595052086,1.0,2],[50.233333333333334,1.0,49.452510579427084,1.0,50.38949788411458,1.0,2],[50.63333333333333,1.0,50.477168782552084,1.0,50.69189453125,1.0,2],[50.78333333333333,1.0,50.724772135416664,1.0,51.0045654296875,1.0,2],[51.35,1.0,51.12876790364583,1.0,52.065755208333336,1.0,2],[53.18333333333333,1.0,52.467578124999996,1.0,53.43059488932292,1.0,2],[53.81666666666666,1.0,53.56940511067708,1.0,54.870776367187496,1.0,2],[56.516666666666666,1.0,55.46255696614583,1.0,58.68995768229166,1.0,2],[62.083333333333336,1.0,59.91004231770833,1.0,64.25662434895833,1.0,2]],0],[[[47.38333333333333,1.0,47.18812662760416,1.0,47.5785400390625,1.0,2],[47.88333333333333,1.0,47.68812662760416,1.0,48.800801595052086,1.0,2],[50.233333333333334,1.0,49.452510579427084,1.0,50.38949788411458,1.0,2],[50.63333333333333,1.0,50.477168782552084,1.0,50.69189453125,1.0,2],[50.78333333333333,1.0,50.724772135416664,1.0,51.0045654296875,1.0,2],[51.35,1.0,51.12876790364583,1.0,52.065755208333336,1.0,2],[53.18333333333333,1.0,52.467578124999996,1.0,53.43059488932292,1.0,2],[53.81666666666666,1.0,53.56940511067708,1.0,54.870776367187496,1.0,2],[56.516666666666666,1.0,55.46255696614583,1.0,58.68995768229166,1.0,2],[62.083333333333336,1.0,59.91004231770833,1.0,64.25662434895833,1.0,2]],0],[[[47.38333333333333,1.0,47.18812662760416,1.0,47.5785400390625,1.0,2],[47.88333333333333,1.0,47.68812662760416,1.0,48.800801595052086,1.0,2],[50.233333333333334,1.0,49.452510579427084,1.0,50.38949788411458,1.0,2],[50.63333333333333,1.0,50.477168782552084,1.0,50.69189453125,1.0,2],[50.78333333333333,1.0,50.724772135416664,1.0,51.0045654296875,1.0,2],[51.35,1.0,51.12876790364583,1.0,52.065755208333336,1.0,2],[53.18333333333333,1.0,52.467578124999996,1.0,53.43059488932292,1.0,2],[53.81666666666666,1.0,53.56940511067708,1.0,54.870776367187496,1.0,2],[56.516666666666666,1.0,55.46255696614583,1.0,58.68995768229166,1.0,2],[62.083333333333336,1.0,59.91004231770833,1.0,64.25662434895833,1.0,2]],0]]}],\"Cookie\":[{\"rotation_euler\":[[[[144.33333333333334,0.0,143.46140950520834,0.0,145.20525716145832,0.0,2],[146.56666666666666,0.0,145.69474283854166,0.0,147.43859049479167,0.0,2]],0],[[[144.33333333333334,0.0,143.46140950520834,0.0,145.20525716145832,0.0,2],[146.56666666666666,0.0,145.69474283854166,0.0,147.43859049479167,0.0,2]],0],[[[144.33333333333334,0.0,143.46140950520834,0.0,145.20525716145832,0.0,2],[146.56666666666666,0.0,145.69474283854166,0.0,147.43859049479167,0.0,2]],0]],\"location\":[[[[144.33333333333334,2.0,143.46140950520834,2.0,145.20525716145832,2.0,2],[146.56666666666666,2.0,145.69474283854166,2.0,147.43859049479167,2.0,2]],0],[[[144.33333333333334,3.0,143.46140950520834,3.0,145.20525716145832,3.0,2],[146.56666666666666,3.0,145.69474283854166,3.0,147.43859049479167,3.0,2]],0],[[[144.33333333333334,0.0,143.46140950520834,0.0,145.20525716145832,0.0,2],[146.56666666666666,1.0,145.69474283854166,1.0,147.43859049479167,1.0,2]],0]],\"scale\":[[[[144.33333333333334,1.0,143.46140950520834,1.0,145.20525716145832,1.0,2],[146.56666666666666,1.0,145.69474283854166,1.0,147.43859049479167,1.0,2]],0],[[[144.33333333333334,1.0,143.46140950520834,1.0,145.20525716145832,1.0,2],[146.56666666666666,1.0,145.69474283854166,1.0,147.43859049479167,1.0,2]],0],[[[144.33333333333334,1.0,143.46140950520834,1.0,145.20525716145832,1.0,2],[146.56666666666666,1.0,145.69474283854166,1.0,147.43859049479167,1.0,2]],0]]}],\"CurveCurve\":[{\"rotation_euler\":[[[[98.18333333333334,0.0,97.55867513020833,0.0,98.80799153645833,0.0,2],[99.78333333333333,0.0,99.15867513020834,0.0,100.40799153645833,0.0,2]],0],[[[98.18333333333334,0.0,97.55867513020833,0.0,98.80799153645833,0.0,2],[99.78333333333333,0.0,99.15867513020834,0.0,100.40799153645833,0.0,2]],0],[[[98.18333333333334,0.0,97.55867513020833,0.0,98.80799153645833,0.0,2],[99.78333333333333,0.0,99.15867513020834,0.0,100.40799153645833,0.0,2]],0]],\"location\":[[[[98.18333333333334,-4.0,97.55867513020833,-4.0,98.80799153645833,-4.0,2],[99.78333333333333,-4.0,99.15867513020834,-4.0,102.90662434895833,-4.0,2],[114.0,-4.0,108.44965006510417,-4.0,119.55034993489583,-4.0,2]],0],[[[98.18333333333334,-2.0,97.55867513020833,-2.0,98.80799153645833,-2.0,2],[99.78333333333333,-2.0,99.15867513020834,-2.0,102.90662434895833,-2.0,2],[114.0,-2.0,108.44965006510417,-2.0,119.55034993489583,-2.0,2]],0],[[[98.18333333333334,0.0,97.55867513020833,0.0,98.80799153645833,0.0,2],[99.78333333333333,1.0,99.15867513020834,1.0,102.90662434895833,1.0,2],[114.0,1.0,108.44965006510417,1.0,115.92603352864583,1.0,2],[118.93333333333334,0.0,117.00729980468749,0.0,120.85936686197917,0.0,2]],0]],\"scale\":[[[[98.18333333333334,1.0,97.55867513020833,1.0,98.80799153645833,1.0,2],[99.78333333333333,1.0,99.15867513020834,1.0,100.40799153645833,1.0,2]],0],[[[98.18333333333334,1.0,97.55867513020833,1.0,98.80799153645833,1.0,2],[99.78333333333333,1.0,99.15867513020834,1.0,100.40799153645833,1.0,2]],0],[[[98.18333333333334,1.0,97.55867513020833,1.0,98.80799153645833,1.0,2],[99.78333333333333,1.0,99.15867513020834,1.0,100.40799153645833,1.0,2]],0]]}],\"Geo\":[{\"rotation_euler\":[[[[0.0,0.0,-0.016666666666666666,0.0,0.016666666666666666,0.0,2]],0],[[[0.0,0.0,-0.016666666666666666,0.0,0.016666666666666666,0.0,2]],0],[[[0.0,0.0,-0.016666666666666666,0.0,0.016666666666666666,0.0,2]],0]],\"location\":[[[[0.0,1.0,-0.016666666666666666,1.0,0.016666666666666666,1.0,2]],0],[[[0.0,0.0,-0.016666666666666666,0.0,0.016666666666666666,0.0,2]],0],[[[0.0,1.0,-0.016666666666666666,1.0,0.016666666666666666,1.0,2]],0]],\"scale\":[[[[0.0,1.0,-0.016666666666666666,1.0,0.016666666666666666,1.0,2]],0],[[[0.0,1.0,-0.016666666666666666,1.0,0.016666666666666666,1.0,2]],0],[[[0.0,1.0,-0.016666666666666666,1.0,0.016666666666666666,1.0,2]],0]]}],\"Rolling\":[{\"rotation_euler\":[[[[57.516666666666666,0.0,51.374194335937496,0.0,63.659138997395836,0.0,2],[73.25,0.0,67.10752766927084,0.0,97.37743326822917,0.0,2],[135.05,0.0,110.92256673177083,0.0,159.17742513020832,0.0,2]],0],[[[57.516666666666666,0.0,51.374194335937496,0.0,63.659138997395836,0.0,2],[73.25,0.0,67.10752766927084,0.0,97.37743326822917,0.0,2],[135.05,0.0,110.92256673177083,0.0,159.17742513020832,0.0,2]],0],[[[57.516666666666666,0.0,51.374194335937496,0.0,63.659138997395836,0.0,2],[73.25,0.0,67.10752766927084,0.0,97.37743326822917,0.0,2],[135.05,0.0,110.92256673177083,0.0,159.17742513020832,0.0,2]],0]],\"location\":[[[[57.516666666666666,-3.0,51.374194335937496,-3.0,63.659138997395836,-3.0,2],[73.25,-3.0,67.10752766927084,-3.0,97.37743326822917,-3.0,2],[135.05,-3.0,110.92256673177083,-3.0,159.17742513020832,-3.0,2]],0],[[[57.516666666666666,-2.0,51.374194335937496,-2.0,63.659138997395836,-2.0,2],[73.25,-2.0,67.10752766927084,-2.0,97.37743326822917,-2.0,2],[135.05,-2.0,110.92256673177083,-2.0,159.17742513020832,-2.0,2]],0],[[[57.516666666666666,0.0,51.374194335937496,0.0,63.659138997395836,0.0,2],[73.25,2.2929375171661377,67.10752766927084,1.050569772720337,97.37743326822917,7.172916412353516,2],[135.05,18.285511016845703,110.92256673177083,18.285511016845703,159.17742513020832,18.285511016845703,2]],0]],\"scale\":[[[[57.516666666666666,1.0,51.374194335937496,1.0,63.659138997395836,1.0,2],[73.25,1.0,67.10752766927084,1.0,97.37743326822917,1.0,2],[135.05,1.0,110.92256673177083,1.0,159.17742513020832,1.0,2]],0],[[[57.516666666666666,1.0,51.374194335937496,1.0,63.659138997395836,1.0,2],[73.25,1.0,67.10752766927084,1.0,97.37743326822917,1.0,2],[135.05,1.0,110.92256673177083,1.0,159.17742513020832,1.0,2]],0],[[[57.516666666666666,1.0,51.374194335937496,1.0,63.659138997395836,1.0,2],[73.25,1.0,67.10752766927084,1.0,97.37743326822917,1.0,2],[135.05,1.0,110.92256673177083,1.0,159.17742513020832,1.0,2]],0]]}],\"TextingScreen\":[{\"rotation_euler\":[[[[114.78333333333333,0.0,113.019970703125,0.0,116.54669596354167,0.0,2],[119.3,0.0,117.53663736979166,0.0,121.06336263020833,0.0,2]],0],[[[114.78333333333333,0.0,113.019970703125,0.0,116.54669596354167,0.0,2],[119.3,0.0,117.53663736979166,0.0,121.06336263020833,0.0,2]],0],[[[114.78333333333333,0.0,113.019970703125,0.0,116.54669596354167,0.0,2],[119.3,0.0,117.53663736979166,0.0,121.06336263020833,0.0,2]],0]],\"location\":[[[[114.78333333333333,2.0,113.019970703125,2.0,116.54669596354167,2.0,2],[119.3,2.0,117.53663736979166,2.0,122.47534993489583,2.0,2],[127.43333333333334,2.0,124.2579833984375,2.0,130.60868326822916,2.0,2]],0],[[[114.78333333333333,1.0,113.019970703125,1.0,116.54669596354167,1.0,2],[119.3,1.0,117.53663736979166,1.0,122.47534993489583,1.0,2],[127.43333333333334,1.0,124.2579833984375,1.0,130.60868326822916,1.0,2]],0],[[[114.78333333333333,0.0,113.019970703125,0.0,116.54669596354167,0.0,2],[119.3,1.0,117.53663736979166,1.0,122.47534993489583,1.0,2],[127.43333333333334,1.0,124.2579833984375,1.0,128.74772135416666,1.0,2],[130.8,0.0,129.48561197916666,0.0,132.11438802083333,0.0,2]],0]],\"scale\":[[[[114.78333333333333,1.0,113.019970703125,1.0,116.54669596354167,1.0,2],[119.3,1.0,117.53663736979166,1.0,121.06336263020833,1.0,2]],0],[[[114.78333333333333,1.0,113.019970703125,1.0,116.54669596354167,1.0,2],[119.3,1.0,117.53663736979166,1.0,121.06336263020833,1.0,2]],0],[[[114.78333333333333,1.0,113.019970703125,1.0,116.54669596354167,1.0,2],[119.3,1.0,117.53663736979166,1.0,121.06336263020833,1.0,2]],0]]}],\"Circle3\":[{\"rotation_euler\":[[[[112.61666666666666,0.0,112.34988606770833,0.0,112.883447265625,0.0,2],[113.3,0.0,113.03321940104166,0.0,114.63390299479167,0.0,2],[120.11666666666666,0.0,117.45536295572917,0.0,122.77797037760416,0.0,2]],0],[[[112.61666666666666,0.0,112.34988606770833,0.0,112.883447265625,0.0,2],[113.3,0.0,113.03321940104166,0.0,114.63390299479167,0.0,2],[120.11666666666666,0.0,117.45536295572917,0.0,122.77797037760416,0.0,2]],0],[[[112.61666666666666,0.0,112.34988606770833,0.0,112.883447265625,0.0,2],[113.3,0.0,113.03321940104166,0.0,114.63390299479167,0.0,2],[120.11666666666666,0.0,117.45536295572917,0.0,122.77797037760416,0.0,2]],0]],\"location\":[[[[112.61666666666666,-5.0,112.34988606770833,-5.0,112.883447265625,-5.0,2],[113.3,-5.0,113.03321940104166,-5.0,114.63390299479167,-5.0,2],[120.11666666666666,-5.0,117.45536295572917,-5.0,122.77797037760416,-5.0,2]],0],[[[112.61666666666666,-4.0,112.34988606770833,-4.0,112.883447265625,-4.0,2],[113.3,-4.0,113.03321940104166,-4.0,114.63390299479167,-4.0,2],[120.11666666666666,-4.0,117.45536295572917,-4.0,122.77797037760416,-4.0,2]],0],[[[112.61666666666666,-0.08832231909036636,112.34988606770833,-0.08832231909036636,112.883447265625,-0.08832231909036636,2],[113.3,1.784546971321106,113.03321940104166,1.5777044296264648,114.63390299479167,2.8187594413757324,2],[120.11666666666666,2.8187594413757324,117.45536295572917,2.8187594413757324,122.77797037760416,2.8187594413757324,2]],0]],\"scale\":[[[[112.61666666666666,1.0,112.34988606770833,1.0,112.883447265625,1.0,2],[113.3,1.0,113.03321940104166,1.0,114.63390299479167,1.0,2],[120.11666666666666,1.0,117.45536295572917,1.0,122.77797037760416,1.0,2]],0],[[[112.61666666666666,1.0,112.34988606770833,1.0,112.883447265625,1.0,2],[113.3,1.0,113.03321940104166,1.0,114.63390299479167,1.0,2],[120.11666666666666,1.0,117.45536295572917,1.0,122.77797037760416,1.0,2]],0],[[[112.61666666666666,1.0,112.34988606770833,1.0,112.883447265625,1.0,2],[113.3,1.0,113.03321940104166,1.0,114.63390299479167,1.0,2],[120.11666666666666,1.0,117.45536295572917,1.0,122.77797037760416,1.0,2]],0]]}],\"Curves\":[{\"rotation_euler\":[[[[0.0,0.0,-25.558939615885418,0.0,25.558939615885418,0.0,2],[65.46666666666667,0.0,53.624186197916664,0.0,67.83516438802083,0.0,2],[71.53333333333333,0.0,69.16483561197917,0.0,83.37581380208333,0.0,2],[120.31666666666666,0.0,101.27109375,0.0,131.90537923177084,0.0,2],[150.0,0.0,138.411279296875,0.0,161.588720703125,0.0,2]],0],[[[0.0,0.0,-25.558939615885418,0.0,25.558939615885418,0.0,2],[65.46666666666667,0.0,53.624186197916664,0.0,67.83516438802083,0.0,2],[71.53333333333333,0.0,69.16483561197917,0.0,83.37581380208333,0.0,2],[120.31666666666666,0.0,101.27109375,0.0,131.90537923177084,0.0,2],[150.0,0.0,138.411279296875,0.0,161.588720703125,0.0,2]],0],[[[0.0,0.0,-25.558939615885418,0.0,25.558939615885418,0.0,2],[65.46666666666667,0.0,53.624186197916664,0.0,67.83516438802083,0.0,2],[71.53333333333333,0.0,69.16483561197917,0.0,83.37581380208333,0.0,2],[120.31666666666666,0.0,101.27109375,0.0,131.90537923177084,0.0,2],[150.0,0.0,138.411279296875,0.0,161.588720703125,0.0,2]],0]],\"location\":[[[[0.0,-4.0,-25.558939615885418,-4.0,25.558939615885418,-4.0,2],[65.46666666666667,-4.0,53.624186197916664,-4.0,67.83516438802083,-4.0,2],[71.53333333333333,-4.0,69.16483561197917,-4.0,83.37581380208333,-4.0,2],[120.31666666666666,-4.0,101.27109375,-4.0,131.90537923177084,-4.0,2],[150.0,-4.0,138.411279296875,-4.0,161.588720703125,-4.0,2]],0],[[[0.0,0.0,-25.558939615885418,0.0,25.558939615885418,0.0,2],[65.46666666666667,0.0,53.624186197916664,0.0,67.83516438802083,0.0,2],[71.53333333333333,0.0,69.16483561197917,0.0,83.37581380208333,0.0,2],[120.31666666666666,0.0,101.27109375,0.0,131.90537923177084,0.0,2],[150.0,0.0,138.411279296875,0.0,161.588720703125,0.0,2]],0],[[[0.0,0.0,-25.558939615885418,0.0,25.558939615885418,0.0,2],[65.46666666666667,0.0,53.624186197916664,0.0,67.83516438802083,0.0,2],[71.53333333333333,1.0,69.16483561197917,1.0,83.37581380208333,1.0,2],[120.31666666666666,1.0,101.27109375,1.0,131.90537923177084,1.0,2],[150.0,9.567564010620117,138.411279296875,9.567564010620117,161.588720703125,9.567564010620117,2]],0]],\"scale\":[[[[0.0,1.0,-25.558939615885418,1.0,25.558939615885418,1.0,2],[65.46666666666667,1.0,53.624186197916664,1.0,67.83516438802083,1.0,2],[71.53333333333333,1.0,69.16483561197917,1.0,83.37581380208333,1.0,2],[120.31666666666666,1.0,101.27109375,1.0,131.90537923177084,1.0,2],[150.0,1.0,138.411279296875,1.0,161.588720703125,1.0,2]],0],[[[0.0,1.0,-25.558939615885418,1.0,25.558939615885418,1.0,2],[65.46666666666667,1.0,53.624186197916664,1.0,67.83516438802083,1.0,2],[71.53333333333333,1.0,69.16483561197917,1.0,83.37581380208333,1.0,2],[120.31666666666666,1.0,101.27109375,1.0,131.90537923177084,1.0,2],[150.0,1.0,138.411279296875,1.0,161.588720703125,1.0,2]],0],[[[0.0,1.0,-25.558939615885418,1.0,25.558939615885418,1.0,2],[65.46666666666667,1.0,53.624186197916664,1.0,67.83516438802083,1.0,2],[71.53333333333333,1.0,69.16483561197917,1.0,83.37581380208333,1.0,2],[120.31666666666666,1.0,101.27109375,1.0,131.90537923177084,1.0,2],[150.0,1.0,138.411279296875,1.0,161.588720703125,1.0,2]],0]]}],\"Scratch\":[{\"rotation_euler\":[[[[0.0,0.0,-0.052054866154988604,0.0,0.052054866154988604,0.0,2],[0.13333333333333333,0.0,0.08127846717834472,0.0,0.18538819948832194,0.0,2],[0.26666666666666666,0.0,0.21461180051167805,0.0,0.44885870615641277,0.0,2],[0.7333333333333333,0.0,0.5511412938435872,0.0,0.78538818359375,0.0,2],[0.8666666666666667,0.0,0.81461181640625,0.0,0.9187215169270834,0.0,2],[1.0,0.0,0.9479451497395833,0.0,1.1952056884765625,0.0,2],[1.5,0.0,1.3047943115234375,0.0,1.5520548502604166,0.0,2],[1.6333333333333333,0.0,1.5812784830729167,0.0,1.6853881835937499,0.0,2],[1.7666666666666666,0.0,1.71461181640625,0.0,1.948858642578125,0.0,2],[2.2333333333333334,0.0,2.051141357421875,0.0,2.28538818359375,0.0,2],[2.3666666666666667,0.0,2.31461181640625,0.0,2.4187215169270835,0.0,2],[2.5,0.0,2.447945149739583,0.0,2.65616455078125,0.0,2],[2.9,0.0,2.74383544921875,0.0,2.9520548502604167,0.0,2],[3.033333333333333,0.0,2.9812784830729164,0.0,3.08538818359375,0.0,2],[3.1666666666666665,0.0,3.11461181640625,0.0,3.348858642578125,0.0,2],[3.6333333333333333,0.0,3.451141357421875,0.0,3.68538818359375,0.0,2],[3.7666666666666666,0.0,3.71461181640625,0.0,3.8187215169270834,0.0,2],[3.9,0.0,3.847945149739583,0.0,4.082191975911458,0.0,2],[4.366666666666666,0.0,4.184474690755208,0.0,4.418721516927083,0.0,2],[4.5,0.0,4.447945149739583,0.0,4.552054850260417,0.0,2],[4.633333333333333,0.0,4.581278483072917,0.0,4.7764841715494795,0.0,2],[5.0,0.0,4.856849161783854,0.0,5.052054850260417,0.0,2],[5.133333333333333,0.0,5.081278483072917,0.0,5.18538818359375,0.0,2],[5.266666666666667,0.0,5.21461181640625,0.0,5.409817504882812,0.0,2],[5.633333333333333,0.0,5.490182495117187,0.0,5.68538818359375,0.0,2],[5.766666666666667,0.0,5.71461181640625,0.0,5.818721516927083,0.0,2],[5.9,0.0,5.847945149739584,0.0,6.043150838216146,0.0,2],[6.266666666666667,0.0,6.123515828450521,0.0,6.318721516927083,0.0,2],[6.4,0.0,6.347945149739584,0.0,6.452054850260416,0.0,2],[6.533333333333333,0.0,6.481278483072916,0.0,6.715525309244792,0.0,2],[7.0,0.0,6.817808024088541,0.0,7.052054850260417,0.0,2],[7.133333333333333,0.0,7.081278483072917,0.0,7.18538818359375,0.0,2],[7.266666666666667,0.0,7.21461181640625,0.0,7.4488586425781245,0.0,2],[7.733333333333333,0.0,7.551141357421875,0.0,7.78538818359375,0.0,2],[7.866666666666666,0.0,7.8146118164062495,0.0,7.918721516927083,0.0,2],[8.0,0.0,7.947945149739583,0.0,8.143150838216146,0.0,2],[8.366666666666667,0.0,8.223515828450521,0.0,8.418721516927084,0.0,2],[8.5,0.0,8.447945149739583,0.0,8.552054850260417,0.0,2],[8.633333333333333,0.0,8.581278483072916,0.0,8.776484171549479,0.0,2],[9.0,0.0,8.856849161783854,0.0,9.052054850260417,0.0,2],[9.133333333333333,0.0,9.081278483072916,0.0,9.18538818359375,0.0,2],[9.266666666666666,0.0,9.21461181640625,0.0,9.42933858235677,0.0,2],[9.683333333333334,0.0,9.520661417643229,0.0,9.73538818359375,0.0,2],[9.816666666666666,0.0,9.76461181640625,0.0,9.868721516927083,0.0,2],[9.95,0.0,9.897945149739583,0.0,10.132191975911459,0.0,2],[10.416666666666666,0.0,10.234474690755208,0.0,10.468721516927083,0.0,2],[10.55,0.0,10.497945149739584,0.0,10.602054850260416,0.0,2],[10.683333333333334,0.0,10.631278483072917,0.0,10.865525309244791,0.0,2],[11.15,0.0,10.96780802408854,0.0,11.202054850260417,0.0,2],[11.283333333333333,0.0,11.231278483072916,0.0,11.33538818359375,0.0,2],[11.416666666666666,0.0,11.36461181640625,0.0,11.559817504882812,0.0,2],[11.783333333333333,0.0,11.640182495117188,0.0,11.83538818359375,0.0,2],[11.916666666666666,0.0,11.86461181640625,0.0,11.968721516927083,0.0,2],[12.05,0.0,11.997945149739584,0.0,12.193150838216146,0.0,2],[12.416666666666666,0.0,12.27351582845052,0.0,12.468721516927083,0.0,2],[12.55,0.0,12.497945149739584,0.0,12.602054850260416,0.0,2],[12.683333333333334,0.0,12.631278483072917,0.0,12.865525309244791,0.0,2],[13.15,0.0,12.96780802408854,0.0,13.202054850260417,0.0,2],[13.283333333333333,0.0,13.231278483072916,0.0,13.33538818359375,0.0,2],[13.416666666666666,0.0,13.36461181640625,0.0,13.598858642578124,0.0,2],[13.883333333333333,0.0,13.701141357421875,0.0,13.93538818359375,0.0,2],[14.016666666666666,0.0,13.964611816406249,0.0,14.068721516927083,0.0,2],[14.15,0.0,14.097945149739584,0.0,14.332191975911458,0.0,2],[14.616666666666667,0.0,14.434474690755208,0.0,14.668721516927084,0.0,2],[14.75,0.0,14.697945149739583,0.0,14.802054850260417,0.0,2],[14.883333333333333,0.0,14.831278483072916,0.0,15.06552530924479,0.0,2],[15.35,0.0,15.167808024088542,0.0,15.402054850260416,0.0,2],[15.483333333333333,0.0,15.431278483072916,0.0,15.53538818359375,0.0,2],[15.616666666666667,0.0,15.56461181640625,0.0,15.759817504882813,0.0,2],[15.983333333333333,0.0,15.840182495117187,0.0,16.03538818359375,0.0,2],[16.116666666666667,0.0,16.06461181640625,0.0,16.168721516927082,0.0,2],[16.25,0.0,16.19794514973958,0.0,16.432191975911458,0.0,2],[16.716666666666665,0.0,16.534474690755207,0.0,16.768721516927084,0.0,2],[16.85,0.0,16.797945149739583,0.0,16.902054850260416,0.0,2],[16.983333333333334,0.0,16.931278483072916,0.0,17.165525309244792,0.0,2],[17.45,0.0,17.26780802408854,0.0,17.502054850260418,0.0,2],[17.583333333333332,0.0,17.531278483072917,0.0,17.63538818359375,0.0,2],[17.716666666666665,0.0,17.66461181640625,0.0,17.898858642578126,0.0,2],[18.183333333333334,0.0,18.001141357421876,0.0,18.23538818359375,0.0,2],[18.316666666666666,0.0,18.26461181640625,0.0,18.36872151692708,0.0,2],[18.45,0.0,18.397945149739584,0.0,18.632191975911457,0.0,2],[18.916666666666668,0.0,18.734474690755206,0.0,18.968721516927083,0.0,2],[19.05,0.0,18.997945149739582,0.0,19.102054850260416,0.0,2],[19.183333333333334,0.0,19.131278483072915,0.0,19.32648518880208,0.0,2],[19.55,0.0,19.40684814453125,0.0,19.602054850260416,0.0,2],[19.683333333333334,0.0,19.631278483072915,0.0,19.73538818359375,0.0,2],[19.816666666666666,0.0,19.76461181640625,0.0,19.998858642578124,0.0,2],[20.28333333333333,0.0,20.101141357421874,0.0,20.33538818359375,0.0,2],[20.416666666666668,0.0,20.36461181640625,0.0,20.468721516927083,0.0,2],[20.55,0.0,20.497945149739582,0.0,20.73219197591146,0.0,2],[21.016666666666666,0.0,20.834474690755208,0.0,21.068721516927084,0.0,2],[21.15,0.0,21.097945149739584,0.0,21.202054850260417,0.0,2],[21.28333333333333,0.0,21.231278483072916,0.0,21.465525309244793,0.0,2],[21.75,0.0,21.567808024088542,0.0,21.802054850260415,0.0,2],[21.883333333333333,0.0,21.831278483072918,0.0,21.93538818359375,0.0,2],[22.016666666666666,0.0,21.96461181640625,0.0,22.192352294921875,0.0,2],[22.466666666666665,0.0,22.29098103841146,0.0,22.518721516927084,0.0,2],[22.6,0.0,22.547945149739583,0.0,22.652054850260416,0.0,2],[22.733333333333334,0.0,22.681278483072916,0.0,22.876485188802082,0.0,2],[23.1,0.0,22.95684814453125,0.0,23.152054850260416,0.0,2],[23.233333333333334,0.0,23.181278483072916,0.0,23.28538818359375,0.0,2],[23.366666666666667,0.0,23.31461181640625,0.0,23.548858642578125,0.0,2],[23.833333333333332,0.0,23.651141357421874,0.0,23.88538818359375,0.0,2],[23.966666666666665,0.0,23.91461181640625,0.0,24.018721516927084,0.0,2],[24.1,0.0,24.047945149739583,0.0,24.28219197591146,0.0,2],[24.566666666666666,0.0,24.38447469075521,0.0,24.61872151692708,0.0,2],[24.7,0.0,24.647945149739584,0.0,24.752054850260418,0.0,2],[24.833333333333332,0.0,24.781278483072917,0.0,25.01552530924479,0.0,2],[25.3,0.0,25.117808024088543,0.0,25.352054850260416,0.0,2],[25.433333333333334,0.0,25.381278483072915,0.0,25.48538818359375,0.0,2],[25.566666666666666,0.0,25.51461181640625,0.0,25.61872151692708,0.0,2]],0],[[[0.0,0.0,-0.052054866154988604,0.0,0.052054866154988604,0.0,2],[0.13333333333333333,0.0,0.08127846717834472,0.0,0.18538819948832194,0.0,2],[0.26666666666666666,0.0,0.21461180051167805,0.0,0.44885870615641277,0.0,2],[0.7333333333333333,0.0,0.5511412938435872,0.0,0.78538818359375,0.0,2],[0.8666666666666667,0.0,0.81461181640625,0.0,0.9187215169270834,0.0,2],[1.0,0.0,0.9479451497395833,0.0,1.1952056884765625,0.0,2],[1.5,0.0,1.3047943115234375,0.0,1.5520548502604166,0.0,2],[1.6333333333333333,0.0,1.5812784830729167,0.0,1.6853881835937499,0.0,2],[1.7666666666666666,0.0,1.71461181640625,0.0,1.948858642578125,0.0,2],[2.2333333333333334,0.0,2.051141357421875,0.0,2.28538818359375,0.0,2],[2.3666666666666667,0.0,2.31461181640625,0.0,2.4187215169270835,0.0,2],[2.5,0.0,2.447945149739583,0.0,2.65616455078125,0.0,2],[2.9,0.0,2.74383544921875,0.0,2.9520548502604167,0.0,2],[3.033333333333333,0.0,2.9812784830729164,0.0,3.08538818359375,0.0,2],[3.1666666666666665,0.0,3.11461181640625,0.0,3.348858642578125,0.0,2],[3.6333333333333333,0.0,3.451141357421875,0.0,3.68538818359375,0.0,2],[3.7666666666666666,0.0,3.71461181640625,0.0,3.8187215169270834,0.0,2],[3.9,0.0,3.847945149739583,0.0,4.082191975911458,0.0,2],[4.366666666666666,0.0,4.184474690755208,0.0,4.418721516927083,0.0,2],[4.5,0.0,4.447945149739583,0.0,4.552054850260417,0.0,2],[4.633333333333333,0.0,4.581278483072917,0.0,4.7764841715494795,0.0,2],[5.0,0.0,4.856849161783854,0.0,5.052054850260417,0.0,2],[5.133333333333333,0.0,5.081278483072917,0.0,5.18538818359375,0.0,2],[5.266666666666667,0.0,5.21461181640625,0.0,5.409817504882812,0.0,2],[5.633333333333333,0.0,5.490182495117187,0.0,5.68538818359375,0.0,2],[5.766666666666667,0.0,5.71461181640625,0.0,5.818721516927083,0.0,2],[5.9,0.0,5.847945149739584,0.0,6.043150838216146,0.0,2],[6.266666666666667,0.0,6.123515828450521,0.0,6.318721516927083,0.0,2],[6.4,0.0,6.347945149739584,0.0,6.452054850260416,0.0,2],[6.533333333333333,0.0,6.481278483072916,0.0,6.715525309244792,0.0,2],[7.0,0.0,6.817808024088541,0.0,7.052054850260417,0.0,2],[7.133333333333333,0.0,7.081278483072917,0.0,7.18538818359375,0.0,2],[7.266666666666667,0.0,7.21461181640625,0.0,7.4488586425781245,0.0,2],[7.733333333333333,0.0,7.551141357421875,0.0,7.78538818359375,0.0,2],[7.866666666666666,0.0,7.8146118164062495,0.0,7.918721516927083,0.0,2],[8.0,0.0,7.947945149739583,0.0,8.143150838216146,0.0,2],[8.366666666666667,0.0,8.223515828450521,0.0,8.418721516927084,0.0,2],[8.5,0.0,8.447945149739583,0.0,8.552054850260417,0.0,2],[8.633333333333333,0.0,8.581278483072916,0.0,8.776484171549479,0.0,2],[9.0,0.0,8.856849161783854,0.0,9.052054850260417,0.0,2],[9.133333333333333,0.0,9.081278483072916,0.0,9.18538818359375,0.0,2],[9.266666666666666,0.0,9.21461181640625,0.0,9.42933858235677,0.0,2],[9.683333333333334,0.0,9.520661417643229,0.0,9.73538818359375,0.0,2],[9.816666666666666,0.0,9.76461181640625,0.0,9.868721516927083,0.0,2],[9.95,0.0,9.897945149739583,0.0,10.132191975911459,0.0,2],[10.416666666666666,0.0,10.234474690755208,0.0,10.468721516927083,0.0,2],[10.55,0.0,10.497945149739584,0.0,10.602054850260416,0.0,2],[10.683333333333334,0.0,10.631278483072917,0.0,10.865525309244791,0.0,2],[11.15,0.0,10.96780802408854,0.0,11.202054850260417,0.0,2],[11.283333333333333,0.0,11.231278483072916,0.0,11.33538818359375,0.0,2],[11.416666666666666,0.0,11.36461181640625,0.0,11.559817504882812,0.0,2],[11.783333333333333,0.0,11.640182495117188,0.0,11.83538818359375,0.0,2],[11.916666666666666,0.0,11.86461181640625,0.0,11.968721516927083,0.0,2],[12.05,0.0,11.997945149739584,0.0,12.193150838216146,0.0,2],[12.416666666666666,0.0,12.27351582845052,0.0,12.468721516927083,0.0,2],[12.55,0.0,12.497945149739584,0.0,12.602054850260416,0.0,2],[12.683333333333334,0.0,12.631278483072917,0.0,12.865525309244791,0.0,2],[13.15,0.0,12.96780802408854,0.0,13.202054850260417,0.0,2],[13.283333333333333,0.0,13.231278483072916,0.0,13.33538818359375,0.0,2],[13.416666666666666,0.0,13.36461181640625,0.0,13.598858642578124,0.0,2],[13.883333333333333,0.0,13.701141357421875,0.0,13.93538818359375,0.0,2],[14.016666666666666,0.0,13.964611816406249,0.0,14.068721516927083,0.0,2],[14.15,0.0,14.097945149739584,0.0,14.332191975911458,0.0,2],[14.616666666666667,0.0,14.434474690755208,0.0,14.668721516927084,0.0,2],[14.75,0.0,14.697945149739583,0.0,14.802054850260417,0.0,2],[14.883333333333333,0.0,14.831278483072916,0.0,15.06552530924479,0.0,2],[15.35,0.0,15.167808024088542,0.0,15.402054850260416,0.0,2],[15.483333333333333,0.0,15.431278483072916,0.0,15.53538818359375,0.0,2],[15.616666666666667,0.0,15.56461181640625,0.0,15.759817504882813,0.0,2],[15.983333333333333,0.0,15.840182495117187,0.0,16.03538818359375,0.0,2],[16.116666666666667,0.0,16.06461181640625,0.0,16.168721516927082,0.0,2],[16.25,0.0,16.19794514973958,0.0,16.432191975911458,0.0,2],[16.716666666666665,0.0,16.534474690755207,0.0,16.768721516927084,0.0,2],[16.85,0.0,16.797945149739583,0.0,16.902054850260416,0.0,2],[16.983333333333334,0.0,16.931278483072916,0.0,17.165525309244792,0.0,2],[17.45,0.0,17.26780802408854,0.0,17.502054850260418,0.0,2],[17.583333333333332,0.0,17.531278483072917,0.0,17.63538818359375,0.0,2],[17.716666666666665,0.0,17.66461181640625,0.0,17.898858642578126,0.0,2],[18.183333333333334,0.0,18.001141357421876,0.0,18.23538818359375,0.0,2],[18.316666666666666,0.0,18.26461181640625,0.0,18.36872151692708,0.0,2],[18.45,0.0,18.397945149739584,0.0,18.632191975911457,0.0,2],[18.916666666666668,0.0,18.734474690755206,0.0,18.968721516927083,0.0,2],[19.05,0.0,18.997945149739582,0.0,19.102054850260416,0.0,2],[19.183333333333334,0.0,19.131278483072915,0.0,19.32648518880208,0.0,2],[19.55,0.0,19.40684814453125,0.0,19.602054850260416,0.0,2],[19.683333333333334,0.0,19.631278483072915,0.0,19.73538818359375,0.0,2],[19.816666666666666,0.0,19.76461181640625,0.0,19.998858642578124,0.0,2],[20.28333333333333,0.0,20.101141357421874,0.0,20.33538818359375,0.0,2],[20.416666666666668,0.0,20.36461181640625,0.0,20.468721516927083,0.0,2],[20.55,0.0,20.497945149739582,0.0,20.73219197591146,0.0,2],[21.016666666666666,0.0,20.834474690755208,0.0,21.068721516927084,0.0,2],[21.15,0.0,21.097945149739584,0.0,21.202054850260417,0.0,2],[21.28333333333333,0.0,21.231278483072916,0.0,21.465525309244793,0.0,2],[21.75,0.0,21.567808024088542,0.0,21.802054850260415,0.0,2],[21.883333333333333,0.0,21.831278483072918,0.0,21.93538818359375,0.0,2],[22.016666666666666,0.0,21.96461181640625,0.0,22.192352294921875,0.0,2],[22.466666666666665,0.0,22.29098103841146,0.0,22.518721516927084,0.0,2],[22.6,0.0,22.547945149739583,0.0,22.652054850260416,0.0,2],[22.733333333333334,0.0,22.681278483072916,0.0,22.876485188802082,0.0,2],[23.1,0.0,22.95684814453125,0.0,23.152054850260416,0.0,2],[23.233333333333334,0.0,23.181278483072916,0.0,23.28538818359375,0.0,2],[23.366666666666667,0.0,23.31461181640625,0.0,23.548858642578125,0.0,2],[23.833333333333332,0.0,23.651141357421874,0.0,23.88538818359375,0.0,2],[23.966666666666665,0.0,23.91461181640625,0.0,24.018721516927084,0.0,2],[24.1,0.0,24.047945149739583,0.0,24.28219197591146,0.0,2],[24.566666666666666,0.0,24.38447469075521,0.0,24.61872151692708,0.0,2],[24.7,0.0,24.647945149739584,0.0,24.752054850260418,0.0,2],[24.833333333333332,0.0,24.781278483072917,0.0,25.01552530924479,0.0,2],[25.3,0.0,25.117808024088543,0.0,25.352054850260416,0.0,2],[25.433333333333334,0.0,25.381278483072915,0.0,25.48538818359375,0.0,2],[25.566666666666666,0.0,25.51461181640625,0.0,25.61872151692708,0.0,2]],0],[[[0.0,0.0,-0.052054866154988604,0.0,0.052054866154988604,0.0,2],[0.13333333333333333,0.0,0.08127846717834472,0.0,0.18538819948832194,0.0,2],[0.26666666666666666,0.0,0.21461180051167805,0.0,0.44885870615641277,0.0,2],[0.7333333333333333,0.0,0.5511412938435872,0.0,0.78538818359375,0.0,2],[0.8666666666666667,0.0,0.81461181640625,0.0,0.9187215169270834,0.0,2],[1.0,0.0,0.9479451497395833,0.0,1.1952056884765625,0.0,2],[1.5,0.0,1.3047943115234375,0.0,1.5520548502604166,0.0,2],[1.6333333333333333,0.0,1.5812784830729167,0.0,1.6853881835937499,0.0,2],[1.7666666666666666,0.0,1.71461181640625,0.0,1.948858642578125,0.0,2],[2.2333333333333334,0.0,2.051141357421875,0.0,2.28538818359375,0.0,2],[2.3666666666666667,0.0,2.31461181640625,0.0,2.4187215169270835,0.0,2],[2.5,0.0,2.447945149739583,0.0,2.65616455078125,0.0,2],[2.9,0.0,2.74383544921875,0.0,2.9520548502604167,0.0,2],[3.033333333333333,0.0,2.9812784830729164,0.0,3.08538818359375,0.0,2],[3.1666666666666665,0.0,3.11461181640625,0.0,3.348858642578125,0.0,2],[3.6333333333333333,0.0,3.451141357421875,0.0,3.68538818359375,0.0,2],[3.7666666666666666,0.0,3.71461181640625,0.0,3.8187215169270834,0.0,2],[3.9,0.0,3.847945149739583,0.0,4.082191975911458,0.0,2],[4.366666666666666,0.0,4.184474690755208,0.0,4.418721516927083,0.0,2],[4.5,0.0,4.447945149739583,0.0,4.552054850260417,0.0,2],[4.633333333333333,0.0,4.581278483072917,0.0,4.7764841715494795,0.0,2],[5.0,0.0,4.856849161783854,0.0,5.052054850260417,0.0,2],[5.133333333333333,0.0,5.081278483072917,0.0,5.18538818359375,0.0,2],[5.266666666666667,0.0,5.21461181640625,0.0,5.409817504882812,0.0,2],[5.633333333333333,0.0,5.490182495117187,0.0,5.68538818359375,0.0,2],[5.766666666666667,0.0,5.71461181640625,0.0,5.818721516927083,0.0,2],[5.9,0.0,5.847945149739584,0.0,6.043150838216146,0.0,2],[6.266666666666667,0.0,6.123515828450521,0.0,6.318721516927083,0.0,2],[6.4,0.0,6.347945149739584,0.0,6.452054850260416,0.0,2],[6.533333333333333,0.0,6.481278483072916,0.0,6.715525309244792,0.0,2],[7.0,0.0,6.817808024088541,0.0,7.052054850260417,0.0,2],[7.133333333333333,0.0,7.081278483072917,0.0,7.18538818359375,0.0,2],[7.266666666666667,0.0,7.21461181640625,0.0,7.4488586425781245,0.0,2],[7.733333333333333,0.0,7.551141357421875,0.0,7.78538818359375,0.0,2],[7.866666666666666,0.0,7.8146118164062495,0.0,7.918721516927083,0.0,2],[8.0,0.0,7.947945149739583,0.0,8.143150838216146,0.0,2],[8.366666666666667,0.0,8.223515828450521,0.0,8.418721516927084,0.0,2],[8.5,0.0,8.447945149739583,0.0,8.552054850260417,0.0,2],[8.633333333333333,0.0,8.581278483072916,0.0,8.776484171549479,0.0,2],[9.0,0.0,8.856849161783854,0.0,9.052054850260417,0.0,2],[9.133333333333333,0.0,9.081278483072916,0.0,9.18538818359375,0.0,2],[9.266666666666666,0.0,9.21461181640625,0.0,9.42933858235677,0.0,2],[9.683333333333334,0.0,9.520661417643229,0.0,9.73538818359375,0.0,2],[9.816666666666666,0.0,9.76461181640625,0.0,9.868721516927083,0.0,2],[9.95,0.0,9.897945149739583,0.0,10.132191975911459,0.0,2],[10.416666666666666,0.0,10.234474690755208,0.0,10.468721516927083,0.0,2],[10.55,0.0,10.497945149739584,0.0,10.602054850260416,0.0,2],[10.683333333333334,0.0,10.631278483072917,0.0,10.865525309244791,0.0,2],[11.15,0.0,10.96780802408854,0.0,11.202054850260417,0.0,2],[11.283333333333333,0.0,11.231278483072916,0.0,11.33538818359375,0.0,2],[11.416666666666666,0.0,11.36461181640625,0.0,11.559817504882812,0.0,2],[11.783333333333333,0.0,11.640182495117188,0.0,11.83538818359375,0.0,2],[11.916666666666666,0.0,11.86461181640625,0.0,11.968721516927083,0.0,2],[12.05,0.0,11.997945149739584,0.0,12.193150838216146,0.0,2],[12.416666666666666,0.0,12.27351582845052,0.0,12.468721516927083,0.0,2],[12.55,0.0,12.497945149739584,0.0,12.602054850260416,0.0,2],[12.683333333333334,0.0,12.631278483072917,0.0,12.865525309244791,0.0,2],[13.15,0.0,12.96780802408854,0.0,13.202054850260417,0.0,2],[13.283333333333333,0.0,13.231278483072916,0.0,13.33538818359375,0.0,2],[13.416666666666666,0.0,13.36461181640625,0.0,13.598858642578124,0.0,2],[13.883333333333333,0.0,13.701141357421875,0.0,13.93538818359375,0.0,2],[14.016666666666666,0.0,13.964611816406249,0.0,14.068721516927083,0.0,2],[14.15,0.0,14.097945149739584,0.0,14.332191975911458,0.0,2],[14.616666666666667,0.0,14.434474690755208,0.0,14.668721516927084,0.0,2],[14.75,0.0,14.697945149739583,0.0,14.802054850260417,0.0,2],[14.883333333333333,0.0,14.831278483072916,0.0,15.06552530924479,0.0,2],[15.35,0.0,15.167808024088542,0.0,15.402054850260416,0.0,2],[15.483333333333333,0.0,15.431278483072916,0.0,15.53538818359375,0.0,2],[15.616666666666667,0.0,15.56461181640625,0.0,15.759817504882813,0.0,2],[15.983333333333333,0.0,15.840182495117187,0.0,16.03538818359375,0.0,2],[16.116666666666667,0.0,16.06461181640625,0.0,16.168721516927082,0.0,2],[16.25,0.0,16.19794514973958,0.0,16.432191975911458,0.0,2],[16.716666666666665,0.0,16.534474690755207,0.0,16.768721516927084,0.0,2],[16.85,0.0,16.797945149739583,0.0,16.902054850260416,0.0,2],[16.983333333333334,0.0,16.931278483072916,0.0,17.165525309244792,0.0,2],[17.45,0.0,17.26780802408854,0.0,17.502054850260418,0.0,2],[17.583333333333332,0.0,17.531278483072917,0.0,17.63538818359375,0.0,2],[17.716666666666665,0.0,17.66461181640625,0.0,17.898858642578126,0.0,2],[18.183333333333334,0.0,18.001141357421876,0.0,18.23538818359375,0.0,2],[18.316666666666666,0.0,18.26461181640625,0.0,18.36872151692708,0.0,2],[18.45,0.0,18.397945149739584,0.0,18.632191975911457,0.0,2],[18.916666666666668,0.0,18.734474690755206,0.0,18.968721516927083,0.0,2],[19.05,0.0,18.997945149739582,0.0,19.102054850260416,0.0,2],[19.183333333333334,0.0,19.131278483072915,0.0,19.32648518880208,0.0,2],[19.55,0.0,19.40684814453125,0.0,19.602054850260416,0.0,2],[19.683333333333334,0.0,19.631278483072915,0.0,19.73538818359375,0.0,2],[19.816666666666666,0.0,19.76461181640625,0.0,19.998858642578124,0.0,2],[20.28333333333333,0.0,20.101141357421874,0.0,20.33538818359375,0.0,2],[20.416666666666668,0.0,20.36461181640625,0.0,20.468721516927083,0.0,2],[20.55,0.0,20.497945149739582,0.0,20.73219197591146,0.0,2],[21.016666666666666,0.0,20.834474690755208,0.0,21.068721516927084,0.0,2],[21.15,0.0,21.097945149739584,0.0,21.202054850260417,0.0,2],[21.28333333333333,0.0,21.231278483072916,0.0,21.465525309244793,0.0,2],[21.75,0.0,21.567808024088542,0.0,21.802054850260415,0.0,2],[21.883333333333333,0.0,21.831278483072918,0.0,21.93538818359375,0.0,2],[22.016666666666666,0.0,21.96461181640625,0.0,22.192352294921875,0.0,2],[22.466666666666665,0.0,22.29098103841146,0.0,22.518721516927084,0.0,2],[22.6,0.0,22.547945149739583,0.0,22.652054850260416,0.0,2],[22.733333333333334,0.0,22.681278483072916,0.0,22.876485188802082,0.0,2],[23.1,0.0,22.95684814453125,0.0,23.152054850260416,0.0,2],[23.233333333333334,0.0,23.181278483072916,0.0,23.28538818359375,0.0,2],[23.366666666666667,0.0,23.31461181640625,0.0,23.548858642578125,0.0,2],[23.833333333333332,0.0,23.651141357421874,0.0,23.88538818359375,0.0,2],[23.966666666666665,0.0,23.91461181640625,0.0,24.018721516927084,0.0,2],[24.1,0.0,24.047945149739583,0.0,24.28219197591146,0.0,2],[24.566666666666666,0.0,24.38447469075521,0.0,24.61872151692708,0.0,2],[24.7,0.0,24.647945149739584,0.0,24.752054850260418,0.0,2],[24.833333333333332,0.0,24.781278483072917,0.0,25.01552530924479,0.0,2],[25.3,0.0,25.117808024088543,0.0,25.352054850260416,0.0,2],[25.433333333333334,0.0,25.381278483072915,0.0,25.48538818359375,0.0,2],[25.566666666666666,0.0,25.51461181640625,0.0,25.61872151692708,0.0,2]],0]],\"location\":[[[[0.0,-2.0,-0.052054866154988604,-2.0,0.052054866154988604,-2.0,2],[0.13333333333333333,-2.0,0.08127846717834472,-2.0,0.18538819948832194,-2.0,2],[0.26666666666666666,-2.0,0.21461180051167805,-2.0,0.44885870615641277,-2.0,2],[0.7333333333333333,-2.0,0.5511412938435872,-2.0,0.78538818359375,-2.0,2],[0.8666666666666667,-2.0,0.81461181640625,-2.0,0.9187215169270834,-2.0,2],[1.0,-2.0,0.9479451497395833,-2.0,1.1952056884765625,-2.0,2],[1.5,-2.0,1.3047943115234375,-2.0,1.5520548502604166,-2.0,2],[1.6333333333333333,-2.0,1.5812784830729167,-2.0,1.6853881835937499,-2.0,2],[1.7666666666666666,-2.0,1.71461181640625,-2.0,1.948858642578125,-2.0,2],[2.2333333333333334,-2.0,2.051141357421875,-2.0,2.28538818359375,-2.0,2],[2.3666666666666667,-2.0,2.31461181640625,-2.0,2.4187215169270835,-2.0,2],[2.5,-2.0,2.447945149739583,-2.0,2.65616455078125,-2.0,2],[2.9,-2.0,2.74383544921875,-2.0,2.9520548502604167,-2.0,2],[3.033333333333333,-2.0,2.9812784830729164,-2.0,3.08538818359375,-2.0,2],[3.1666666666666665,-2.0,3.11461181640625,-2.0,3.348858642578125,-2.0,2],[3.6333333333333333,-2.0,3.451141357421875,-2.0,3.68538818359375,-2.0,2],[3.7666666666666666,-2.0,3.71461181640625,-2.0,3.8187215169270834,-2.0,2],[3.9,-2.0,3.847945149739583,-2.0,4.082191975911458,-2.0,2],[4.366666666666666,-2.0,4.184474690755208,-2.0,4.418721516927083,-2.0,2],[4.5,-2.0,4.447945149739583,-2.0,4.552054850260417,-2.0,2],[4.633333333333333,-2.0,4.581278483072917,-2.0,4.7764841715494795,-2.0,2],[5.0,-2.0,4.856849161783854,-2.0,5.052054850260417,-2.0,2],[5.133333333333333,-2.0,5.081278483072917,-2.0,5.18538818359375,-2.0,2],[5.266666666666667,-2.0,5.21461181640625,-2.0,5.409817504882812,-2.0,2],[5.633333333333333,-2.0,5.490182495117187,-2.0,5.68538818359375,-2.0,2],[5.766666666666667,-2.0,5.71461181640625,-2.0,5.818721516927083,-2.0,2],[5.9,-2.0,5.847945149739584,-2.0,6.043150838216146,-2.0,2],[6.266666666666667,-2.0,6.123515828450521,-2.0,6.318721516927083,-2.0,2],[6.4,-2.0,6.347945149739584,-2.0,6.452054850260416,-2.0,2],[6.533333333333333,-2.0,6.481278483072916,-2.0,6.715525309244792,-2.0,2],[7.0,-2.0,6.817808024088541,-2.0,7.052054850260417,-2.0,2],[7.133333333333333,-2.0,7.081278483072917,-2.0,7.18538818359375,-2.0,2],[7.266666666666667,-2.0,7.21461181640625,-2.0,7.4488586425781245,-2.0,2],[7.733333333333333,-2.0,7.551141357421875,-2.0,7.78538818359375,-2.0,2],[7.866666666666666,-2.0,7.8146118164062495,-2.0,7.918721516927083,-2.0,2],[8.0,-2.0,7.947945149739583,-2.0,8.143150838216146,-2.0,2],[8.366666666666667,-2.0,8.223515828450521,-2.0,8.418721516927084,-2.0,2],[8.5,-2.0,8.447945149739583,-2.0,8.552054850260417,-2.0,2],[8.633333333333333,-2.0,8.581278483072916,-2.0,8.776484171549479,-2.0,2],[9.0,-2.0,8.856849161783854,-2.0,9.052054850260417,-2.0,2],[9.133333333333333,-2.0,9.081278483072916,-2.0,9.18538818359375,-2.0,2],[9.266666666666666,-2.0,9.21461181640625,-2.0,9.42933858235677,-2.0,2],[9.683333333333334,-2.0,9.520661417643229,-2.0,9.73538818359375,-2.0,2],[9.816666666666666,-2.0,9.76461181640625,-2.0,9.868721516927083,-2.0,2],[9.95,-2.0,9.897945149739583,-2.0,10.132191975911459,-2.0,2],[10.416666666666666,-2.0,10.234474690755208,-2.0,10.468721516927083,-2.0,2],[10.55,-2.0,10.497945149739584,-2.0,10.602054850260416,-2.0,2],[10.683333333333334,-2.0,10.631278483072917,-2.0,10.865525309244791,-2.0,2],[11.15,-2.0,10.96780802408854,-2.0,11.202054850260417,-2.0,2],[11.283333333333333,-2.0,11.231278483072916,-2.0,11.33538818359375,-2.0,2],[11.416666666666666,-2.0,11.36461181640625,-2.0,11.559817504882812,-2.0,2],[11.783333333333333,-2.0,11.640182495117188,-2.0,11.83538818359375,-2.0,2],[11.916666666666666,-2.0,11.86461181640625,-2.0,11.968721516927083,-2.0,2],[12.05,-2.0,11.997945149739584,-2.0,12.193150838216146,-2.0,2],[12.416666666666666,-2.0,12.27351582845052,-2.0,12.468721516927083,-2.0,2],[12.55,-2.0,12.497945149739584,-2.0,12.602054850260416,-2.0,2],[12.683333333333334,-2.0,12.631278483072917,-2.0,12.865525309244791,-2.0,2],[13.15,-2.0,12.96780802408854,-2.0,13.202054850260417,-2.0,2],[13.283333333333333,-2.0,13.231278483072916,-2.0,13.33538818359375,-2.0,2],[13.416666666666666,-2.0,13.36461181640625,-2.0,13.598858642578124,-2.0,2],[13.883333333333333,-2.0,13.701141357421875,-2.0,13.93538818359375,-2.0,2],[14.016666666666666,-2.0,13.964611816406249,-2.0,14.068721516927083,-2.0,2],[14.15,-2.0,14.097945149739584,-2.0,14.332191975911458,-2.0,2],[14.616666666666667,-2.0,14.434474690755208,-2.0,14.668721516927084,-2.0,2],[14.75,-2.0,14.697945149739583,-2.0,14.802054850260417,-2.0,2],[14.883333333333333,-2.0,14.831278483072916,-2.0,15.06552530924479,-2.0,2],[15.35,-2.0,15.167808024088542,-2.0,15.402054850260416,-2.0,2],[15.483333333333333,-2.0,15.431278483072916,-2.0,15.53538818359375,-2.0,2],[15.616666666666667,-2.0,15.56461181640625,-2.0,15.759817504882813,-2.0,2],[15.983333333333333,-2.0,15.840182495117187,-2.0,16.03538818359375,-2.0,2],[16.116666666666667,-2.0,16.06461181640625,-2.0,16.168721516927082,-2.0,2],[16.25,-2.0,16.19794514973958,-2.0,16.432191975911458,-2.0,2],[16.716666666666665,-2.0,16.534474690755207,-2.0,16.768721516927084,-2.0,2],[16.85,-2.0,16.797945149739583,-2.0,16.902054850260416,-2.0,2],[16.983333333333334,-2.0,16.931278483072916,-2.0,17.165525309244792,-2.0,2],[17.45,-2.0,17.26780802408854,-2.0,17.502054850260418,-2.0,2],[17.583333333333332,-2.0,17.531278483072917,-2.0,17.63538818359375,-2.0,2],[17.716666666666665,-2.0,17.66461181640625,-2.0,17.898858642578126,-2.0,2],[18.183333333333334,-2.0,18.001141357421876,-2.0,18.23538818359375,-2.0,2],[18.316666666666666,-2.0,18.26461181640625,-2.0,18.36872151692708,-2.0,2],[18.45,-2.0,18.397945149739584,-2.0,18.632191975911457,-2.0,2],[18.916666666666668,-2.0,18.734474690755206,-2.0,18.968721516927083,-2.0,2],[19.05,-2.0,18.997945149739582,-2.0,19.102054850260416,-2.0,2],[19.183333333333334,-2.0,19.131278483072915,-2.0,19.32648518880208,-2.0,2],[19.55,-2.0,19.40684814453125,-2.0,19.602054850260416,-2.0,2],[19.683333333333334,-2.0,19.631278483072915,-2.0,19.73538818359375,-2.0,2],[19.816666666666666,-2.0,19.76461181640625,-2.0,19.998858642578124,-2.0,2],[20.28333333333333,-2.0,20.101141357421874,-2.0,20.33538818359375,-2.0,2],[20.416666666666668,-2.0,20.36461181640625,-2.0,20.468721516927083,-2.0,2],[20.55,-2.0,20.497945149739582,-2.0,20.73219197591146,-2.0,2],[21.016666666666666,-2.0,20.834474690755208,-2.0,21.068721516927084,-2.0,2],[21.15,-2.0,21.097945149739584,-2.0,21.202054850260417,-2.0,2],[21.28333333333333,-2.0,21.231278483072916,-2.0,21.465525309244793,-2.0,2],[21.75,-2.0,21.567808024088542,-2.0,21.802054850260415,-2.0,2],[21.883333333333333,-2.0,21.831278483072918,-2.0,21.93538818359375,-2.0,2],[22.016666666666666,-2.0,21.96461181640625,-2.0,22.192352294921875,-2.0,2],[22.466666666666665,-2.0,22.29098103841146,-2.0,22.518721516927084,-2.0,2],[22.6,-2.0,22.547945149739583,-2.0,22.652054850260416,-2.0,2],[22.733333333333334,-2.0,22.681278483072916,-2.0,22.876485188802082,-2.0,2],[23.1,-2.0,22.95684814453125,-2.0,23.152054850260416,-2.0,2],[23.233333333333334,-2.0,23.181278483072916,-2.0,23.28538818359375,-2.0,2],[23.366666666666667,-2.0,23.31461181640625,-2.0,23.548858642578125,-2.0,2],[23.833333333333332,-2.0,23.651141357421874,-2.0,23.88538818359375,-2.0,2],[23.966666666666665,-2.0,23.91461181640625,-2.0,24.018721516927084,-2.0,2],[24.1,-2.0,24.047945149739583,-2.0,24.28219197591146,-2.0,2],[24.566666666666666,-2.0,24.38447469075521,-2.0,24.61872151692708,-2.0,2],[24.7,-2.0,24.647945149739584,-2.0,24.752054850260418,-2.0,2],[24.833333333333332,-2.0,24.781278483072917,-2.0,25.01552530924479,-2.0,2],[25.3,-2.0,25.117808024088543,-2.0,25.352054850260416,-2.0,2],[25.433333333333334,-2.0,25.381278483072915,-2.0,25.48538818359375,-2.0,2],[25.566666666666666,-2.0,25.51461181640625,-2.0,25.61872151692708,-2.0,2]],0],[[[0.0,0.0,-0.052054866154988604,0.0,0.052054866154988604,0.0,2],[0.13333333333333333,0.0,0.08127846717834472,0.0,0.18538819948832194,0.0,2],[0.26666666666666666,0.0,0.21461180051167805,0.0,0.44885870615641277,0.0,2],[0.7333333333333333,0.0,0.5511412938435872,0.0,0.78538818359375,0.0,2],[0.8666666666666667,0.0,0.81461181640625,0.0,0.9187215169270834,0.0,2],[1.0,0.0,0.9479451497395833,0.0,1.1952056884765625,0.0,2],[1.5,0.0,1.3047943115234375,0.0,1.5520548502604166,0.0,2],[1.6333333333333333,0.0,1.5812784830729167,0.0,1.6853881835937499,0.0,2],[1.7666666666666666,0.0,1.71461181640625,0.0,1.948858642578125,0.0,2],[2.2333333333333334,0.0,2.051141357421875,0.0,2.28538818359375,0.0,2],[2.3666666666666667,0.0,2.31461181640625,0.0,2.4187215169270835,0.0,2],[2.5,0.0,2.447945149739583,0.0,2.65616455078125,0.0,2],[2.9,0.0,2.74383544921875,0.0,2.9520548502604167,0.0,2],[3.033333333333333,0.0,2.9812784830729164,0.0,3.08538818359375,0.0,2],[3.1666666666666665,0.0,3.11461181640625,0.0,3.348858642578125,0.0,2],[3.6333333333333333,0.0,3.451141357421875,0.0,3.68538818359375,0.0,2],[3.7666666666666666,0.0,3.71461181640625,0.0,3.8187215169270834,0.0,2],[3.9,0.0,3.847945149739583,0.0,4.082191975911458,0.0,2],[4.366666666666666,0.0,4.184474690755208,0.0,4.418721516927083,0.0,2],[4.5,0.0,4.447945149739583,0.0,4.552054850260417,0.0,2],[4.633333333333333,0.0,4.581278483072917,0.0,4.7764841715494795,0.0,2],[5.0,0.0,4.856849161783854,0.0,5.052054850260417,0.0,2],[5.133333333333333,0.0,5.081278483072917,0.0,5.18538818359375,0.0,2],[5.266666666666667,0.0,5.21461181640625,0.0,5.409817504882812,0.0,2],[5.633333333333333,0.0,5.490182495117187,0.0,5.68538818359375,0.0,2],[5.766666666666667,0.0,5.71461181640625,0.0,5.818721516927083,0.0,2],[5.9,0.0,5.847945149739584,0.0,6.043150838216146,0.0,2],[6.266666666666667,0.0,6.123515828450521,0.0,6.318721516927083,0.0,2],[6.4,0.0,6.347945149739584,0.0,6.452054850260416,0.0,2],[6.533333333333333,0.0,6.481278483072916,0.0,6.715525309244792,0.0,2],[7.0,0.0,6.817808024088541,0.0,7.052054850260417,0.0,2],[7.133333333333333,0.0,7.081278483072917,0.0,7.18538818359375,0.0,2],[7.266666666666667,0.0,7.21461181640625,0.0,7.4488586425781245,0.0,2],[7.733333333333333,0.0,7.551141357421875,0.0,7.78538818359375,0.0,2],[7.866666666666666,0.0,7.8146118164062495,0.0,7.918721516927083,0.0,2],[8.0,0.0,7.947945149739583,0.0,8.143150838216146,0.0,2],[8.366666666666667,0.0,8.223515828450521,0.0,8.418721516927084,0.0,2],[8.5,0.0,8.447945149739583,0.0,8.552054850260417,0.0,2],[8.633333333333333,0.0,8.581278483072916,0.0,8.776484171549479,0.0,2],[9.0,0.0,8.856849161783854,0.0,9.052054850260417,0.0,2],[9.133333333333333,0.0,9.081278483072916,0.0,9.18538818359375,0.0,2],[9.266666666666666,0.0,9.21461181640625,0.0,9.42933858235677,0.0,2],[9.683333333333334,0.0,9.520661417643229,0.0,9.73538818359375,0.0,2],[9.816666666666666,0.0,9.76461181640625,0.0,9.868721516927083,0.0,2],[9.95,0.0,9.897945149739583,0.0,10.132191975911459,0.0,2],[10.416666666666666,0.0,10.234474690755208,0.0,10.468721516927083,0.0,2],[10.55,0.0,10.497945149739584,0.0,10.602054850260416,0.0,2],[10.683333333333334,0.0,10.631278483072917,0.0,10.865525309244791,0.0,2],[11.15,0.0,10.96780802408854,0.0,11.202054850260417,0.0,2],[11.283333333333333,0.0,11.231278483072916,0.0,11.33538818359375,0.0,2],[11.416666666666666,0.0,11.36461181640625,0.0,11.559817504882812,0.0,2],[11.783333333333333,0.0,11.640182495117188,0.0,11.83538818359375,0.0,2],[11.916666666666666,0.0,11.86461181640625,0.0,11.968721516927083,0.0,2],[12.05,0.0,11.997945149739584,0.0,12.193150838216146,0.0,2],[12.416666666666666,0.0,12.27351582845052,0.0,12.468721516927083,0.0,2],[12.55,0.0,12.497945149739584,0.0,12.602054850260416,0.0,2],[12.683333333333334,0.0,12.631278483072917,0.0,12.865525309244791,0.0,2],[13.15,0.0,12.96780802408854,0.0,13.202054850260417,0.0,2],[13.283333333333333,0.0,13.231278483072916,0.0,13.33538818359375,0.0,2],[13.416666666666666,0.0,13.36461181640625,0.0,13.598858642578124,0.0,2],[13.883333333333333,0.0,13.701141357421875,0.0,13.93538818359375,0.0,2],[14.016666666666666,0.0,13.964611816406249,0.0,14.068721516927083,0.0,2],[14.15,0.0,14.097945149739584,0.0,14.332191975911458,0.0,2],[14.616666666666667,0.0,14.434474690755208,0.0,14.668721516927084,0.0,2],[14.75,0.0,14.697945149739583,0.0,14.802054850260417,0.0,2],[14.883333333333333,0.0,14.831278483072916,0.0,15.06552530924479,0.0,2],[15.35,0.0,15.167808024088542,0.0,15.402054850260416,0.0,2],[15.483333333333333,0.0,15.431278483072916,0.0,15.53538818359375,0.0,2],[15.616666666666667,0.0,15.56461181640625,0.0,15.759817504882813,0.0,2],[15.983333333333333,0.0,15.840182495117187,0.0,16.03538818359375,0.0,2],[16.116666666666667,0.0,16.06461181640625,0.0,16.168721516927082,0.0,2],[16.25,0.0,16.19794514973958,0.0,16.432191975911458,0.0,2],[16.716666666666665,0.0,16.534474690755207,0.0,16.768721516927084,0.0,2],[16.85,0.0,16.797945149739583,0.0,16.902054850260416,0.0,2],[16.983333333333334,0.0,16.931278483072916,0.0,17.165525309244792,0.0,2],[17.45,0.0,17.26780802408854,0.0,17.502054850260418,0.0,2],[17.583333333333332,0.0,17.531278483072917,0.0,17.63538818359375,0.0,2],[17.716666666666665,0.0,17.66461181640625,0.0,17.898858642578126,0.0,2],[18.183333333333334,0.0,18.001141357421876,0.0,18.23538818359375,0.0,2],[18.316666666666666,0.0,18.26461181640625,0.0,18.36872151692708,0.0,2],[18.45,0.0,18.397945149739584,0.0,18.632191975911457,0.0,2],[18.916666666666668,0.0,18.734474690755206,0.0,18.968721516927083,0.0,2],[19.05,0.0,18.997945149739582,0.0,19.102054850260416,0.0,2],[19.183333333333334,0.0,19.131278483072915,0.0,19.32648518880208,0.0,2],[19.55,0.0,19.40684814453125,0.0,19.602054850260416,0.0,2],[19.683333333333334,0.0,19.631278483072915,0.0,19.73538818359375,0.0,2],[19.816666666666666,0.0,19.76461181640625,0.0,19.998858642578124,0.0,2],[20.28333333333333,0.0,20.101141357421874,0.0,20.33538818359375,0.0,2],[20.416666666666668,0.0,20.36461181640625,0.0,20.468721516927083,0.0,2],[20.55,0.0,20.497945149739582,0.0,20.73219197591146,0.0,2],[21.016666666666666,0.0,20.834474690755208,0.0,21.068721516927084,0.0,2],[21.15,0.0,21.097945149739584,0.0,21.202054850260417,0.0,2],[21.28333333333333,0.0,21.231278483072916,0.0,21.465525309244793,0.0,2],[21.75,0.0,21.567808024088542,0.0,21.802054850260415,0.0,2],[21.883333333333333,0.0,21.831278483072918,0.0,21.93538818359375,0.0,2],[22.016666666666666,0.0,21.96461181640625,0.0,22.192352294921875,0.0,2],[22.466666666666665,0.0,22.29098103841146,0.0,22.518721516927084,0.0,2],[22.6,0.0,22.547945149739583,0.0,22.652054850260416,0.0,2],[22.733333333333334,0.0,22.681278483072916,0.0,22.876485188802082,0.0,2],[23.1,0.0,22.95684814453125,0.0,23.152054850260416,0.0,2],[23.233333333333334,0.0,23.181278483072916,0.0,23.28538818359375,0.0,2],[23.366666666666667,0.0,23.31461181640625,0.0,23.548858642578125,0.0,2],[23.833333333333332,0.0,23.651141357421874,0.0,23.88538818359375,0.0,2],[23.966666666666665,0.0,23.91461181640625,0.0,24.018721516927084,0.0,2],[24.1,0.0,24.047945149739583,0.0,24.28219197591146,0.0,2],[24.566666666666666,0.0,24.38447469075521,0.0,24.61872151692708,0.0,2],[24.7,0.0,24.647945149739584,0.0,24.752054850260418,0.0,2],[24.833333333333332,0.0,24.781278483072917,0.0,25.01552530924479,0.0,2],[25.3,0.0,25.117808024088543,0.0,25.352054850260416,0.0,2],[25.433333333333334,0.0,25.381278483072915,0.0,25.48538818359375,0.0,2],[25.566666666666666,0.0,25.51461181640625,0.0,25.61872151692708,0.0,2]],0],[[[0.0,0.0,-0.052054866154988604,0.0,0.052054866154988604,0.0,2],[0.13333333333333333,1.0,0.08127846717834472,1.0,0.18538819948832194,1.0,2],[0.26666666666666666,0.0,0.21461180051167805,0.0,0.44885870615641277,0.0,2],[0.7333333333333333,0.0,0.5511412938435872,0.0,0.78538818359375,0.0,2],[0.8666666666666667,1.0,0.81461181640625,1.0,0.9187215169270834,1.0,2],[1.0,0.0,0.9479451497395833,0.0,1.1952056884765625,0.0,2],[1.5,0.0,1.3047943115234375,0.0,1.5520548502604166,0.0,2],[1.6333333333333333,1.0,1.5812784830729167,1.0,1.6853881835937499,1.0,2],[1.7666666666666666,0.0,1.71461181640625,0.0,1.948858642578125,0.0,2],[2.2333333333333334,0.0,2.051141357421875,0.0,2.28538818359375,0.0,2],[2.3666666666666667,1.0,2.31461181640625,1.0,2.4187215169270835,1.0,2],[2.5,0.0,2.447945149739583,0.0,2.65616455078125,0.0,2],[2.9,0.0,2.74383544921875,0.0,2.9520548502604167,0.0,2],[3.033333333333333,1.0,2.9812784830729164,1.0,3.08538818359375,1.0,2],[3.1666666666666665,0.0,3.11461181640625,0.0,3.348858642578125,0.0,2],[3.6333333333333333,0.0,3.451141357421875,0.0,3.68538818359375,0.0,2],[3.7666666666666666,1.0,3.71461181640625,1.0,3.8187215169270834,1.0,2],[3.9,0.0,3.847945149739583,0.0,4.082191975911458,0.0,2],[4.366666666666666,0.0,4.184474690755208,0.0,4.418721516927083,0.0,2],[4.5,1.0,4.447945149739583,1.0,4.552054850260417,1.0,2],[4.633333333333333,0.0,4.581278483072917,0.0,4.7764841715494795,0.0,2],[5.0,0.0,4.856849161783854,0.0,5.052054850260417,0.0,2],[5.133333333333333,1.0,5.081278483072917,1.0,5.18538818359375,1.0,2],[5.266666666666667,0.0,5.21461181640625,0.0,5.409817504882812,0.0,2],[5.633333333333333,0.0,5.490182495117187,0.0,5.68538818359375,0.0,2],[5.766666666666667,1.0,5.71461181640625,1.0,5.818721516927083,1.0,2],[5.9,0.0,5.847945149739584,0.0,6.043150838216146,0.0,2],[6.266666666666667,0.0,6.123515828450521,0.0,6.318721516927083,0.0,2],[6.4,1.0,6.347945149739584,1.0,6.452054850260416,1.0,2],[6.533333333333333,0.0,6.481278483072916,0.0,6.715525309244792,0.0,2],[7.0,0.0,6.817808024088541,0.0,7.052054850260417,0.0,2],[7.133333333333333,1.0,7.081278483072917,1.0,7.18538818359375,1.0,2],[7.266666666666667,0.0,7.21461181640625,0.0,7.4488586425781245,0.0,2],[7.733333333333333,0.0,7.551141357421875,0.0,7.78538818359375,0.0,2],[7.866666666666666,1.0,7.8146118164062495,1.0,7.918721516927083,1.0,2],[8.0,0.0,7.947945149739583,0.0,8.143150838216146,0.0,2],[8.366666666666667,0.0,8.223515828450521,0.0,8.418721516927084,0.0,2],[8.5,1.0,8.447945149739583,1.0,8.552054850260417,1.0,2],[8.633333333333333,0.0,8.581278483072916,0.0,8.776484171549479,0.0,2],[9.0,0.0,8.856849161783854,0.0,9.052054850260417,0.0,2],[9.133333333333333,1.0,9.081278483072916,1.0,9.18538818359375,1.0,2],[9.266666666666666,0.0,9.21461181640625,0.0,9.42933858235677,0.0,2],[9.683333333333334,0.0,9.520661417643229,0.0,9.73538818359375,0.0,2],[9.816666666666666,1.0,9.76461181640625,1.0,9.868721516927083,1.0,2],[9.95,0.0,9.897945149739583,0.0,10.132191975911459,0.0,2],[10.416666666666666,0.0,10.234474690755208,0.0,10.468721516927083,0.0,2],[10.55,1.0,10.497945149739584,1.0,10.602054850260416,1.0,2],[10.683333333333334,0.0,10.631278483072917,0.0,10.865525309244791,0.0,2],[11.15,0.0,10.96780802408854,0.0,11.202054850260417,0.0,2],[11.283333333333333,1.0,11.231278483072916,1.0,11.33538818359375,1.0,2],[11.416666666666666,0.0,11.36461181640625,0.0,11.559817504882812,0.0,2],[11.783333333333333,0.0,11.640182495117188,0.0,11.83538818359375,0.0,2],[11.916666666666666,1.0,11.86461181640625,1.0,11.968721516927083,1.0,2],[12.05,0.0,11.997945149739584,0.0,12.193150838216146,0.0,2],[12.416666666666666,0.0,12.27351582845052,0.0,12.468721516927083,0.0,2],[12.55,1.0,12.497945149739584,1.0,12.602054850260416,1.0,2],[12.683333333333334,0.0,12.631278483072917,0.0,12.865525309244791,0.0,2],[13.15,0.0,12.96780802408854,0.0,13.202054850260417,0.0,2],[13.283333333333333,1.0,13.231278483072916,1.0,13.33538818359375,1.0,2],[13.416666666666666,0.0,13.36461181640625,0.0,13.598858642578124,0.0,2],[13.883333333333333,0.0,13.701141357421875,0.0,13.93538818359375,0.0,2],[14.016666666666666,1.0,13.964611816406249,1.0,14.068721516927083,1.0,2],[14.15,0.0,14.097945149739584,0.0,14.332191975911458,0.0,2],[14.616666666666667,0.0,14.434474690755208,0.0,14.668721516927084,0.0,2],[14.75,1.0,14.697945149739583,1.0,14.802054850260417,1.0,2],[14.883333333333333,0.0,14.831278483072916,0.0,15.06552530924479,0.0,2],[15.35,0.0,15.167808024088542,0.0,15.402054850260416,0.0,2],[15.483333333333333,1.0,15.431278483072916,1.0,15.53538818359375,1.0,2],[15.616666666666667,0.0,15.56461181640625,0.0,15.759817504882813,0.0,2],[15.983333333333333,0.0,15.840182495117187,0.0,16.03538818359375,0.0,2],[16.116666666666667,1.0,16.06461181640625,1.0,16.168721516927082,1.0,2],[16.25,0.0,16.19794514973958,0.0,16.432191975911458,0.0,2],[16.716666666666665,0.0,16.534474690755207,0.0,16.768721516927084,0.0,2],[16.85,1.0,16.797945149739583,1.0,16.902054850260416,1.0,2],[16.983333333333334,0.0,16.931278483072916,0.0,17.165525309244792,0.0,2],[17.45,0.0,17.26780802408854,0.0,17.502054850260418,0.0,2],[17.583333333333332,1.0,17.531278483072917,1.0,17.63538818359375,1.0,2],[17.716666666666665,0.0,17.66461181640625,0.0,17.898858642578126,0.0,2],[18.183333333333334,0.0,18.001141357421876,0.0,18.23538818359375,0.0,2],[18.316666666666666,1.0,18.26461181640625,1.0,18.36872151692708,1.0,2],[18.45,0.0,18.397945149739584,0.0,18.632191975911457,0.0,2],[18.916666666666668,0.0,18.734474690755206,0.0,18.968721516927083,0.0,2],[19.05,1.0,18.997945149739582,1.0,19.102054850260416,1.0,2],[19.183333333333334,0.0,19.131278483072915,0.0,19.32648518880208,0.0,2],[19.55,0.0,19.40684814453125,0.0,19.602054850260416,0.0,2],[19.683333333333334,1.0,19.631278483072915,1.0,19.73538818359375,1.0,2],[19.816666666666666,0.0,19.76461181640625,0.0,19.998858642578124,0.0,2],[20.28333333333333,0.0,20.101141357421874,0.0,20.33538818359375,0.0,2],[20.416666666666668,1.0,20.36461181640625,1.0,20.468721516927083,1.0,2],[20.55,0.0,20.497945149739582,0.0,20.73219197591146,0.0,2],[21.016666666666666,0.0,20.834474690755208,0.0,21.068721516927084,0.0,2],[21.15,1.0,21.097945149739584,1.0,21.202054850260417,1.0,2],[21.28333333333333,0.0,21.231278483072916,0.0,21.465525309244793,0.0,2],[21.75,0.0,21.567808024088542,0.0,21.802054850260415,0.0,2],[21.883333333333333,1.0,21.831278483072918,1.0,21.93538818359375,1.0,2],[22.016666666666666,0.0,21.96461181640625,0.0,22.192352294921875,0.0,2],[22.466666666666665,0.0,22.29098103841146,0.0,22.518721516927084,0.0,2],[22.6,1.0,22.547945149739583,1.0,22.652054850260416,1.0,2],[22.733333333333334,0.0,22.681278483072916,0.0,22.876485188802082,0.0,2],[23.1,0.0,22.95684814453125,0.0,23.152054850260416,0.0,2],[23.233333333333334,1.0,23.181278483072916,1.0,23.28538818359375,1.0,2],[23.366666666666667,0.0,23.31461181640625,0.0,23.548858642578125,0.0,2],[23.833333333333332,0.0,23.651141357421874,0.0,23.88538818359375,0.0,2],[23.966666666666665,1.0,23.91461181640625,1.0,24.018721516927084,1.0,2],[24.1,0.0,24.047945149739583,0.0,24.28219197591146,0.0,2],[24.566666666666666,0.0,24.38447469075521,0.0,24.61872151692708,0.0,2],[24.7,1.0,24.647945149739584,1.0,24.752054850260418,1.0,2],[24.833333333333332,0.0,24.781278483072917,0.0,25.01552530924479,0.0,2],[25.3,0.0,25.117808024088543,0.0,25.352054850260416,0.0,2],[25.433333333333334,1.0,25.381278483072915,1.0,25.48538818359375,1.0,2],[25.566666666666666,0.0,25.51461181640625,0.0,25.61872151692708,0.0,2]],0]],\"scale\":[[[[0.0,1.0,-0.052054866154988604,1.0,0.052054866154988604,1.0,2],[0.13333333333333333,1.0,0.08127846717834472,1.0,0.18538819948832194,1.0,2],[0.26666666666666666,1.0,0.21461180051167805,1.0,0.44885870615641277,1.0,2],[0.7333333333333333,1.0,0.5511412938435872,1.0,0.78538818359375,1.0,2],[0.8666666666666667,1.0,0.81461181640625,1.0,0.9187215169270834,1.0,2],[1.0,1.0,0.9479451497395833,1.0,1.1952056884765625,1.0,2],[1.5,1.0,1.3047943115234375,1.0,1.5520548502604166,1.0,2],[1.6333333333333333,1.0,1.5812784830729167,1.0,1.6853881835937499,1.0,2],[1.7666666666666666,1.0,1.71461181640625,1.0,1.948858642578125,1.0,2],[2.2333333333333334,1.0,2.051141357421875,1.0,2.28538818359375,1.0,2],[2.3666666666666667,1.0,2.31461181640625,1.0,2.4187215169270835,1.0,2],[2.5,1.0,2.447945149739583,1.0,2.65616455078125,1.0,2],[2.9,1.0,2.74383544921875,1.0,2.9520548502604167,1.0,2],[3.033333333333333,1.0,2.9812784830729164,1.0,3.08538818359375,1.0,2],[3.1666666666666665,1.0,3.11461181640625,1.0,3.348858642578125,1.0,2],[3.6333333333333333,1.0,3.451141357421875,1.0,3.68538818359375,1.0,2],[3.7666666666666666,1.0,3.71461181640625,1.0,3.8187215169270834,1.0,2],[3.9,1.0,3.847945149739583,1.0,4.082191975911458,1.0,2],[4.366666666666666,1.0,4.184474690755208,1.0,4.418721516927083,1.0,2],[4.5,1.0,4.447945149739583,1.0,4.552054850260417,1.0,2],[4.633333333333333,1.0,4.581278483072917,1.0,4.7764841715494795,1.0,2],[5.0,1.0,4.856849161783854,1.0,5.052054850260417,1.0,2],[5.133333333333333,1.0,5.081278483072917,1.0,5.18538818359375,1.0,2],[5.266666666666667,1.0,5.21461181640625,1.0,5.409817504882812,1.0,2],[5.633333333333333,1.0,5.490182495117187,1.0,5.68538818359375,1.0,2],[5.766666666666667,1.0,5.71461181640625,1.0,5.818721516927083,1.0,2],[5.9,1.0,5.847945149739584,1.0,6.043150838216146,1.0,2],[6.266666666666667,1.0,6.123515828450521,1.0,6.318721516927083,1.0,2],[6.4,1.0,6.347945149739584,1.0,6.452054850260416,1.0,2],[6.533333333333333,1.0,6.481278483072916,1.0,6.715525309244792,1.0,2],[7.0,1.0,6.817808024088541,1.0,7.052054850260417,1.0,2],[7.133333333333333,1.0,7.081278483072917,1.0,7.18538818359375,1.0,2],[7.266666666666667,1.0,7.21461181640625,1.0,7.4488586425781245,1.0,2],[7.733333333333333,1.0,7.551141357421875,1.0,7.78538818359375,1.0,2],[7.866666666666666,1.0,7.8146118164062495,1.0,7.918721516927083,1.0,2],[8.0,1.0,7.947945149739583,1.0,8.143150838216146,1.0,2],[8.366666666666667,1.0,8.223515828450521,1.0,8.418721516927084,1.0,2],[8.5,1.0,8.447945149739583,1.0,8.552054850260417,1.0,2],[8.633333333333333,1.0,8.581278483072916,1.0,8.776484171549479,1.0,2],[9.0,1.0,8.856849161783854,1.0,9.052054850260417,1.0,2],[9.133333333333333,1.0,9.081278483072916,1.0,9.18538818359375,1.0,2],[9.266666666666666,1.0,9.21461181640625,1.0,9.42933858235677,1.0,2],[9.683333333333334,1.0,9.520661417643229,1.0,9.73538818359375,1.0,2],[9.816666666666666,1.0,9.76461181640625,1.0,9.868721516927083,1.0,2],[9.95,1.0,9.897945149739583,1.0,10.132191975911459,1.0,2],[10.416666666666666,1.0,10.234474690755208,1.0,10.468721516927083,1.0,2],[10.55,1.0,10.497945149739584,1.0,10.602054850260416,1.0,2],[10.683333333333334,1.0,10.631278483072917,1.0,10.865525309244791,1.0,2],[11.15,1.0,10.96780802408854,1.0,11.202054850260417,1.0,2],[11.283333333333333,1.0,11.231278483072916,1.0,11.33538818359375,1.0,2],[11.416666666666666,1.0,11.36461181640625,1.0,11.559817504882812,1.0,2],[11.783333333333333,1.0,11.640182495117188,1.0,11.83538818359375,1.0,2],[11.916666666666666,1.0,11.86461181640625,1.0,11.968721516927083,1.0,2],[12.05,1.0,11.997945149739584,1.0,12.193150838216146,1.0,2],[12.416666666666666,1.0,12.27351582845052,1.0,12.468721516927083,1.0,2],[12.55,1.0,12.497945149739584,1.0,12.602054850260416,1.0,2],[12.683333333333334,1.0,12.631278483072917,1.0,12.865525309244791,1.0,2],[13.15,1.0,12.96780802408854,1.0,13.202054850260417,1.0,2],[13.283333333333333,1.0,13.231278483072916,1.0,13.33538818359375,1.0,2],[13.416666666666666,1.0,13.36461181640625,1.0,13.598858642578124,1.0,2],[13.883333333333333,1.0,13.701141357421875,1.0,13.93538818359375,1.0,2],[14.016666666666666,1.0,13.964611816406249,1.0,14.068721516927083,1.0,2],[14.15,1.0,14.097945149739584,1.0,14.332191975911458,1.0,2],[14.616666666666667,1.0,14.434474690755208,1.0,14.668721516927084,1.0,2],[14.75,1.0,14.697945149739583,1.0,14.802054850260417,1.0,2],[14.883333333333333,1.0,14.831278483072916,1.0,15.06552530924479,1.0,2],[15.35,1.0,15.167808024088542,1.0,15.402054850260416,1.0,2],[15.483333333333333,1.0,15.431278483072916,1.0,15.53538818359375,1.0,2],[15.616666666666667,1.0,15.56461181640625,1.0,15.759817504882813,1.0,2],[15.983333333333333,1.0,15.840182495117187,1.0,16.03538818359375,1.0,2],[16.116666666666667,1.0,16.06461181640625,1.0,16.168721516927082,1.0,2],[16.25,1.0,16.19794514973958,1.0,16.432191975911458,1.0,2],[16.716666666666665,1.0,16.534474690755207,1.0,16.768721516927084,1.0,2],[16.85,1.0,16.797945149739583,1.0,16.902054850260416,1.0,2],[16.983333333333334,1.0,16.931278483072916,1.0,17.165525309244792,1.0,2],[17.45,1.0,17.26780802408854,1.0,17.502054850260418,1.0,2],[17.583333333333332,1.0,17.531278483072917,1.0,17.63538818359375,1.0,2],[17.716666666666665,1.0,17.66461181640625,1.0,17.898858642578126,1.0,2],[18.183333333333334,1.0,18.001141357421876,1.0,18.23538818359375,1.0,2],[18.316666666666666,1.0,18.26461181640625,1.0,18.36872151692708,1.0,2],[18.45,1.0,18.397945149739584,1.0,18.632191975911457,1.0,2],[18.916666666666668,1.0,18.734474690755206,1.0,18.968721516927083,1.0,2],[19.05,1.0,18.997945149739582,1.0,19.102054850260416,1.0,2],[19.183333333333334,1.0,19.131278483072915,1.0,19.32648518880208,1.0,2],[19.55,1.0,19.40684814453125,1.0,19.602054850260416,1.0,2],[19.683333333333334,1.0,19.631278483072915,1.0,19.73538818359375,1.0,2],[19.816666666666666,1.0,19.76461181640625,1.0,19.998858642578124,1.0,2],[20.28333333333333,1.0,20.101141357421874,1.0,20.33538818359375,1.0,2],[20.416666666666668,1.0,20.36461181640625,1.0,20.468721516927083,1.0,2],[20.55,1.0,20.497945149739582,1.0,20.73219197591146,1.0,2],[21.016666666666666,1.0,20.834474690755208,1.0,21.068721516927084,1.0,2],[21.15,1.0,21.097945149739584,1.0,21.202054850260417,1.0,2],[21.28333333333333,1.0,21.231278483072916,1.0,21.465525309244793,1.0,2],[21.75,1.0,21.567808024088542,1.0,21.802054850260415,1.0,2],[21.883333333333333,1.0,21.831278483072918,1.0,21.93538818359375,1.0,2],[22.016666666666666,1.0,21.96461181640625,1.0,22.192352294921875,1.0,2],[22.466666666666665,1.0,22.29098103841146,1.0,22.518721516927084,1.0,2],[22.6,1.0,22.547945149739583,1.0,22.652054850260416,1.0,2],[22.733333333333334,1.0,22.681278483072916,1.0,22.876485188802082,1.0,2],[23.1,1.0,22.95684814453125,1.0,23.152054850260416,1.0,2],[23.233333333333334,1.0,23.181278483072916,1.0,23.28538818359375,1.0,2],[23.366666666666667,1.0,23.31461181640625,1.0,23.548858642578125,1.0,2],[23.833333333333332,1.0,23.651141357421874,1.0,23.88538818359375,1.0,2],[23.966666666666665,1.0,23.91461181640625,1.0,24.018721516927084,1.0,2],[24.1,1.0,24.047945149739583,1.0,24.28219197591146,1.0,2],[24.566666666666666,1.0,24.38447469075521,1.0,24.61872151692708,1.0,2],[24.7,1.0,24.647945149739584,1.0,24.752054850260418,1.0,2],[24.833333333333332,1.0,24.781278483072917,1.0,25.01552530924479,1.0,2],[25.3,1.0,25.117808024088543,1.0,25.352054850260416,1.0,2],[25.433333333333334,1.0,25.381278483072915,1.0,25.48538818359375,1.0,2],[25.566666666666666,1.0,25.51461181640625,1.0,25.61872151692708,1.0,2]],0],[[[0.0,1.0,-0.052054866154988604,1.0,0.052054866154988604,1.0,2],[0.13333333333333333,1.0,0.08127846717834472,1.0,0.18538819948832194,1.0,2],[0.26666666666666666,1.0,0.21461180051167805,1.0,0.44885870615641277,1.0,2],[0.7333333333333333,1.0,0.5511412938435872,1.0,0.78538818359375,1.0,2],[0.8666666666666667,1.0,0.81461181640625,1.0,0.9187215169270834,1.0,2],[1.0,1.0,0.9479451497395833,1.0,1.1952056884765625,1.0,2],[1.5,1.0,1.3047943115234375,1.0,1.5520548502604166,1.0,2],[1.6333333333333333,1.0,1.5812784830729167,1.0,1.6853881835937499,1.0,2],[1.7666666666666666,1.0,1.71461181640625,1.0,1.948858642578125,1.0,2],[2.2333333333333334,1.0,2.051141357421875,1.0,2.28538818359375,1.0,2],[2.3666666666666667,1.0,2.31461181640625,1.0,2.4187215169270835,1.0,2],[2.5,1.0,2.447945149739583,1.0,2.65616455078125,1.0,2],[2.9,1.0,2.74383544921875,1.0,2.9520548502604167,1.0,2],[3.033333333333333,1.0,2.9812784830729164,1.0,3.08538818359375,1.0,2],[3.1666666666666665,1.0,3.11461181640625,1.0,3.348858642578125,1.0,2],[3.6333333333333333,1.0,3.451141357421875,1.0,3.68538818359375,1.0,2],[3.7666666666666666,1.0,3.71461181640625,1.0,3.8187215169270834,1.0,2],[3.9,1.0,3.847945149739583,1.0,4.082191975911458,1.0,2],[4.366666666666666,1.0,4.184474690755208,1.0,4.418721516927083,1.0,2],[4.5,1.0,4.447945149739583,1.0,4.552054850260417,1.0,2],[4.633333333333333,1.0,4.581278483072917,1.0,4.7764841715494795,1.0,2],[5.0,1.0,4.856849161783854,1.0,5.052054850260417,1.0,2],[5.133333333333333,1.0,5.081278483072917,1.0,5.18538818359375,1.0,2],[5.266666666666667,1.0,5.21461181640625,1.0,5.409817504882812,1.0,2],[5.633333333333333,1.0,5.490182495117187,1.0,5.68538818359375,1.0,2],[5.766666666666667,1.0,5.71461181640625,1.0,5.818721516927083,1.0,2],[5.9,1.0,5.847945149739584,1.0,6.043150838216146,1.0,2],[6.266666666666667,1.0,6.123515828450521,1.0,6.318721516927083,1.0,2],[6.4,1.0,6.347945149739584,1.0,6.452054850260416,1.0,2],[6.533333333333333,1.0,6.481278483072916,1.0,6.715525309244792,1.0,2],[7.0,1.0,6.817808024088541,1.0,7.052054850260417,1.0,2],[7.133333333333333,1.0,7.081278483072917,1.0,7.18538818359375,1.0,2],[7.266666666666667,1.0,7.21461181640625,1.0,7.4488586425781245,1.0,2],[7.733333333333333,1.0,7.551141357421875,1.0,7.78538818359375,1.0,2],[7.866666666666666,1.0,7.8146118164062495,1.0,7.918721516927083,1.0,2],[8.0,1.0,7.947945149739583,1.0,8.143150838216146,1.0,2],[8.366666666666667,1.0,8.223515828450521,1.0,8.418721516927084,1.0,2],[8.5,1.0,8.447945149739583,1.0,8.552054850260417,1.0,2],[8.633333333333333,1.0,8.581278483072916,1.0,8.776484171549479,1.0,2],[9.0,1.0,8.856849161783854,1.0,9.052054850260417,1.0,2],[9.133333333333333,1.0,9.081278483072916,1.0,9.18538818359375,1.0,2],[9.266666666666666,1.0,9.21461181640625,1.0,9.42933858235677,1.0,2],[9.683333333333334,1.0,9.520661417643229,1.0,9.73538818359375,1.0,2],[9.816666666666666,1.0,9.76461181640625,1.0,9.868721516927083,1.0,2],[9.95,1.0,9.897945149739583,1.0,10.132191975911459,1.0,2],[10.416666666666666,1.0,10.234474690755208,1.0,10.468721516927083,1.0,2],[10.55,1.0,10.497945149739584,1.0,10.602054850260416,1.0,2],[10.683333333333334,1.0,10.631278483072917,1.0,10.865525309244791,1.0,2],[11.15,1.0,10.96780802408854,1.0,11.202054850260417,1.0,2],[11.283333333333333,1.0,11.231278483072916,1.0,11.33538818359375,1.0,2],[11.416666666666666,1.0,11.36461181640625,1.0,11.559817504882812,1.0,2],[11.783333333333333,1.0,11.640182495117188,1.0,11.83538818359375,1.0,2],[11.916666666666666,1.0,11.86461181640625,1.0,11.968721516927083,1.0,2],[12.05,1.0,11.997945149739584,1.0,12.193150838216146,1.0,2],[12.416666666666666,1.0,12.27351582845052,1.0,12.468721516927083,1.0,2],[12.55,1.0,12.497945149739584,1.0,12.602054850260416,1.0,2],[12.683333333333334,1.0,12.631278483072917,1.0,12.865525309244791,1.0,2],[13.15,1.0,12.96780802408854,1.0,13.202054850260417,1.0,2],[13.283333333333333,1.0,13.231278483072916,1.0,13.33538818359375,1.0,2],[13.416666666666666,1.0,13.36461181640625,1.0,13.598858642578124,1.0,2],[13.883333333333333,1.0,13.701141357421875,1.0,13.93538818359375,1.0,2],[14.016666666666666,1.0,13.964611816406249,1.0,14.068721516927083,1.0,2],[14.15,1.0,14.097945149739584,1.0,14.332191975911458,1.0,2],[14.616666666666667,1.0,14.434474690755208,1.0,14.668721516927084,1.0,2],[14.75,1.0,14.697945149739583,1.0,14.802054850260417,1.0,2],[14.883333333333333,1.0,14.831278483072916,1.0,15.06552530924479,1.0,2],[15.35,1.0,15.167808024088542,1.0,15.402054850260416,1.0,2],[15.483333333333333,1.0,15.431278483072916,1.0,15.53538818359375,1.0,2],[15.616666666666667,1.0,15.56461181640625,1.0,15.759817504882813,1.0,2],[15.983333333333333,1.0,15.840182495117187,1.0,16.03538818359375,1.0,2],[16.116666666666667,1.0,16.06461181640625,1.0,16.168721516927082,1.0,2],[16.25,1.0,16.19794514973958,1.0,16.432191975911458,1.0,2],[16.716666666666665,1.0,16.534474690755207,1.0,16.768721516927084,1.0,2],[16.85,1.0,16.797945149739583,1.0,16.902054850260416,1.0,2],[16.983333333333334,1.0,16.931278483072916,1.0,17.165525309244792,1.0,2],[17.45,1.0,17.26780802408854,1.0,17.502054850260418,1.0,2],[17.583333333333332,1.0,17.531278483072917,1.0,17.63538818359375,1.0,2],[17.716666666666665,1.0,17.66461181640625,1.0,17.898858642578126,1.0,2],[18.183333333333334,1.0,18.001141357421876,1.0,18.23538818359375,1.0,2],[18.316666666666666,1.0,18.26461181640625,1.0,18.36872151692708,1.0,2],[18.45,1.0,18.397945149739584,1.0,18.632191975911457,1.0,2],[18.916666666666668,1.0,18.734474690755206,1.0,18.968721516927083,1.0,2],[19.05,1.0,18.997945149739582,1.0,19.102054850260416,1.0,2],[19.183333333333334,1.0,19.131278483072915,1.0,19.32648518880208,1.0,2],[19.55,1.0,19.40684814453125,1.0,19.602054850260416,1.0,2],[19.683333333333334,1.0,19.631278483072915,1.0,19.73538818359375,1.0,2],[19.816666666666666,1.0,19.76461181640625,1.0,19.998858642578124,1.0,2],[20.28333333333333,1.0,20.101141357421874,1.0,20.33538818359375,1.0,2],[20.416666666666668,1.0,20.36461181640625,1.0,20.468721516927083,1.0,2],[20.55,1.0,20.497945149739582,1.0,20.73219197591146,1.0,2],[21.016666666666666,1.0,20.834474690755208,1.0,21.068721516927084,1.0,2],[21.15,1.0,21.097945149739584,1.0,21.202054850260417,1.0,2],[21.28333333333333,1.0,21.231278483072916,1.0,21.465525309244793,1.0,2],[21.75,1.0,21.567808024088542,1.0,21.802054850260415,1.0,2],[21.883333333333333,1.0,21.831278483072918,1.0,21.93538818359375,1.0,2],[22.016666666666666,1.0,21.96461181640625,1.0,22.192352294921875,1.0,2],[22.466666666666665,1.0,22.29098103841146,1.0,22.518721516927084,1.0,2],[22.6,1.0,22.547945149739583,1.0,22.652054850260416,1.0,2],[22.733333333333334,1.0,22.681278483072916,1.0,22.876485188802082,1.0,2],[23.1,1.0,22.95684814453125,1.0,23.152054850260416,1.0,2],[23.233333333333334,1.0,23.181278483072916,1.0,23.28538818359375,1.0,2],[23.366666666666667,1.0,23.31461181640625,1.0,23.548858642578125,1.0,2],[23.833333333333332,1.0,23.651141357421874,1.0,23.88538818359375,1.0,2],[23.966666666666665,1.0,23.91461181640625,1.0,24.018721516927084,1.0,2],[24.1,1.0,24.047945149739583,1.0,24.28219197591146,1.0,2],[24.566666666666666,1.0,24.38447469075521,1.0,24.61872151692708,1.0,2],[24.7,1.0,24.647945149739584,1.0,24.752054850260418,1.0,2],[24.833333333333332,1.0,24.781278483072917,1.0,25.01552530924479,1.0,2],[25.3,1.0,25.117808024088543,1.0,25.352054850260416,1.0,2],[25.433333333333334,1.0,25.381278483072915,1.0,25.48538818359375,1.0,2],[25.566666666666666,1.0,25.51461181640625,1.0,25.61872151692708,1.0,2]],0],[[[0.0,1.0,-0.052054866154988604,1.0,0.052054866154988604,1.0,2],[0.13333333333333333,1.0,0.08127846717834472,1.0,0.18538819948832194,1.0,2],[0.26666666666666666,1.0,0.21461180051167805,1.0,0.44885870615641277,1.0,2],[0.7333333333333333,1.0,0.5511412938435872,1.0,0.78538818359375,1.0,2],[0.8666666666666667,1.0,0.81461181640625,1.0,0.9187215169270834,1.0,2],[1.0,1.0,0.9479451497395833,1.0,1.1952056884765625,1.0,2],[1.5,1.0,1.3047943115234375,1.0,1.5520548502604166,1.0,2],[1.6333333333333333,1.0,1.5812784830729167,1.0,1.6853881835937499,1.0,2],[1.7666666666666666,1.0,1.71461181640625,1.0,1.948858642578125,1.0,2],[2.2333333333333334,1.0,2.051141357421875,1.0,2.28538818359375,1.0,2],[2.3666666666666667,1.0,2.31461181640625,1.0,2.4187215169270835,1.0,2],[2.5,1.0,2.447945149739583,1.0,2.65616455078125,1.0,2],[2.9,1.0,2.74383544921875,1.0,2.9520548502604167,1.0,2],[3.033333333333333,1.0,2.9812784830729164,1.0,3.08538818359375,1.0,2],[3.1666666666666665,1.0,3.11461181640625,1.0,3.348858642578125,1.0,2],[3.6333333333333333,1.0,3.451141357421875,1.0,3.68538818359375,1.0,2],[3.7666666666666666,1.0,3.71461181640625,1.0,3.8187215169270834,1.0,2],[3.9,1.0,3.847945149739583,1.0,4.082191975911458,1.0,2],[4.366666666666666,1.0,4.184474690755208,1.0,4.418721516927083,1.0,2],[4.5,1.0,4.447945149739583,1.0,4.552054850260417,1.0,2],[4.633333333333333,1.0,4.581278483072917,1.0,4.7764841715494795,1.0,2],[5.0,1.0,4.856849161783854,1.0,5.052054850260417,1.0,2],[5.133333333333333,1.0,5.081278483072917,1.0,5.18538818359375,1.0,2],[5.266666666666667,1.0,5.21461181640625,1.0,5.409817504882812,1.0,2],[5.633333333333333,1.0,5.490182495117187,1.0,5.68538818359375,1.0,2],[5.766666666666667,1.0,5.71461181640625,1.0,5.818721516927083,1.0,2],[5.9,1.0,5.847945149739584,1.0,6.043150838216146,1.0,2],[6.266666666666667,1.0,6.123515828450521,1.0,6.318721516927083,1.0,2],[6.4,1.0,6.347945149739584,1.0,6.452054850260416,1.0,2],[6.533333333333333,1.0,6.481278483072916,1.0,6.715525309244792,1.0,2],[7.0,1.0,6.817808024088541,1.0,7.052054850260417,1.0,2],[7.133333333333333,1.0,7.081278483072917,1.0,7.18538818359375,1.0,2],[7.266666666666667,1.0,7.21461181640625,1.0,7.4488586425781245,1.0,2],[7.733333333333333,1.0,7.551141357421875,1.0,7.78538818359375,1.0,2],[7.866666666666666,1.0,7.8146118164062495,1.0,7.918721516927083,1.0,2],[8.0,1.0,7.947945149739583,1.0,8.143150838216146,1.0,2],[8.366666666666667,1.0,8.223515828450521,1.0,8.418721516927084,1.0,2],[8.5,1.0,8.447945149739583,1.0,8.552054850260417,1.0,2],[8.633333333333333,1.0,8.581278483072916,1.0,8.776484171549479,1.0,2],[9.0,1.0,8.856849161783854,1.0,9.052054850260417,1.0,2],[9.133333333333333,1.0,9.081278483072916,1.0,9.18538818359375,1.0,2],[9.266666666666666,1.0,9.21461181640625,1.0,9.42933858235677,1.0,2],[9.683333333333334,1.0,9.520661417643229,1.0,9.73538818359375,1.0,2],[9.816666666666666,1.0,9.76461181640625,1.0,9.868721516927083,1.0,2],[9.95,1.0,9.897945149739583,1.0,10.132191975911459,1.0,2],[10.416666666666666,1.0,10.234474690755208,1.0,10.468721516927083,1.0,2],[10.55,1.0,10.497945149739584,1.0,10.602054850260416,1.0,2],[10.683333333333334,1.0,10.631278483072917,1.0,10.865525309244791,1.0,2],[11.15,1.0,10.96780802408854,1.0,11.202054850260417,1.0,2],[11.283333333333333,1.0,11.231278483072916,1.0,11.33538818359375,1.0,2],[11.416666666666666,1.0,11.36461181640625,1.0,11.559817504882812,1.0,2],[11.783333333333333,1.0,11.640182495117188,1.0,11.83538818359375,1.0,2],[11.916666666666666,1.0,11.86461181640625,1.0,11.968721516927083,1.0,2],[12.05,1.0,11.997945149739584,1.0,12.193150838216146,1.0,2],[12.416666666666666,1.0,12.27351582845052,1.0,12.468721516927083,1.0,2],[12.55,1.0,12.497945149739584,1.0,12.602054850260416,1.0,2],[12.683333333333334,1.0,12.631278483072917,1.0,12.865525309244791,1.0,2],[13.15,1.0,12.96780802408854,1.0,13.202054850260417,1.0,2],[13.283333333333333,1.0,13.231278483072916,1.0,13.33538818359375,1.0,2],[13.416666666666666,1.0,13.36461181640625,1.0,13.598858642578124,1.0,2],[13.883333333333333,1.0,13.701141357421875,1.0,13.93538818359375,1.0,2],[14.016666666666666,1.0,13.964611816406249,1.0,14.068721516927083,1.0,2],[14.15,1.0,14.097945149739584,1.0,14.332191975911458,1.0,2],[14.616666666666667,1.0,14.434474690755208,1.0,14.668721516927084,1.0,2],[14.75,1.0,14.697945149739583,1.0,14.802054850260417,1.0,2],[14.883333333333333,1.0,14.831278483072916,1.0,15.06552530924479,1.0,2],[15.35,1.0,15.167808024088542,1.0,15.402054850260416,1.0,2],[15.483333333333333,1.0,15.431278483072916,1.0,15.53538818359375,1.0,2],[15.616666666666667,1.0,15.56461181640625,1.0,15.759817504882813,1.0,2],[15.983333333333333,1.0,15.840182495117187,1.0,16.03538818359375,1.0,2],[16.116666666666667,1.0,16.06461181640625,1.0,16.168721516927082,1.0,2],[16.25,1.0,16.19794514973958,1.0,16.432191975911458,1.0,2],[16.716666666666665,1.0,16.534474690755207,1.0,16.768721516927084,1.0,2],[16.85,1.0,16.797945149739583,1.0,16.902054850260416,1.0,2],[16.983333333333334,1.0,16.931278483072916,1.0,17.165525309244792,1.0,2],[17.45,1.0,17.26780802408854,1.0,17.502054850260418,1.0,2],[17.583333333333332,1.0,17.531278483072917,1.0,17.63538818359375,1.0,2],[17.716666666666665,1.0,17.66461181640625,1.0,17.898858642578126,1.0,2],[18.183333333333334,1.0,18.001141357421876,1.0,18.23538818359375,1.0,2],[18.316666666666666,1.0,18.26461181640625,1.0,18.36872151692708,1.0,2],[18.45,1.0,18.397945149739584,1.0,18.632191975911457,1.0,2],[18.916666666666668,1.0,18.734474690755206,1.0,18.968721516927083,1.0,2],[19.05,1.0,18.997945149739582,1.0,19.102054850260416,1.0,2],[19.183333333333334,1.0,19.131278483072915,1.0,19.32648518880208,1.0,2],[19.55,1.0,19.40684814453125,1.0,19.602054850260416,1.0,2],[19.683333333333334,1.0,19.631278483072915,1.0,19.73538818359375,1.0,2],[19.816666666666666,1.0,19.76461181640625,1.0,19.998858642578124,1.0,2],[20.28333333333333,1.0,20.101141357421874,1.0,20.33538818359375,1.0,2],[20.416666666666668,1.0,20.36461181640625,1.0,20.468721516927083,1.0,2],[20.55,1.0,20.497945149739582,1.0,20.73219197591146,1.0,2],[21.016666666666666,1.0,20.834474690755208,1.0,21.068721516927084,1.0,2],[21.15,1.0,21.097945149739584,1.0,21.202054850260417,1.0,2],[21.28333333333333,1.0,21.231278483072916,1.0,21.465525309244793,1.0,2],[21.75,1.0,21.567808024088542,1.0,21.802054850260415,1.0,2],[21.883333333333333,1.0,21.831278483072918,1.0,21.93538818359375,1.0,2],[22.016666666666666,1.0,21.96461181640625,1.0,22.192352294921875,1.0,2],[22.466666666666665,1.0,22.29098103841146,1.0,22.518721516927084,1.0,2],[22.6,1.0,22.547945149739583,1.0,22.652054850260416,1.0,2],[22.733333333333334,1.0,22.681278483072916,1.0,22.876485188802082,1.0,2],[23.1,1.0,22.95684814453125,1.0,23.152054850260416,1.0,2],[23.233333333333334,1.0,23.181278483072916,1.0,23.28538818359375,1.0,2],[23.366666666666667,1.0,23.31461181640625,1.0,23.548858642578125,1.0,2],[23.833333333333332,1.0,23.651141357421874,1.0,23.88538818359375,1.0,2],[23.966666666666665,1.0,23.91461181640625,1.0,24.018721516927084,1.0,2],[24.1,1.0,24.047945149739583,1.0,24.28219197591146,1.0,2],[24.566666666666666,1.0,24.38447469075521,1.0,24.61872151692708,1.0,2],[24.7,1.0,24.647945149739584,1.0,24.752054850260418,1.0,2],[24.833333333333332,1.0,24.781278483072917,1.0,25.01552530924479,1.0,2],[25.3,1.0,25.117808024088543,1.0,25.352054850260416,1.0,2],[25.433333333333334,1.0,25.381278483072915,1.0,25.48538818359375,1.0,2],[25.566666666666666,1.0,25.51461181640625,1.0,25.61872151692708,1.0,2]],0]]}],\"Bloom\":[{\"rotation_euler\":[[[[45.5,0.0,29.903059895833334,0.0,61.09694010416666,0.0,2]],0],[[[45.5,0.0,29.903059895833334,0.0,61.09694010416666,0.0,2]],0],[[[45.5,0.0,29.903059895833334,0.0,61.09694010416666,0.0,2]],0]],\"location\":[[[[45.5,3.0,29.903059895833334,3.0,61.09694010416666,3.0,2]],0],[[[45.5,0.0,29.903059895833334,0.0,61.09694010416666,0.0,2]],0],[[[45.13333333333333,10.0,44.99018147786458,10.0,45.276485188802084,10.0,2],[45.5,1.8185338973999023,45.35684814453125,1.8185338973999023,45.64315185546875,1.8185338973999023,2]],0]],\"scale\":[[[[45.5,1.0,29.903059895833334,1.0,61.09694010416666,1.0,2]],0],[[[45.5,1.0,29.903059895833334,1.0,61.09694010416666,1.0,2]],0],[[[45.5,1.0,29.903059895833334,1.0,61.09694010416666,1.0,2]],0]]}],\"Camera\":[{\"rotation_euler\":[[[[0.0,1.5987498760223389,-8.810286458333334,1.5987498760223389,8.810286458333334,1.5987498760223389,1],[22.566666666666666,1.5987498760223389,22.53413289388021,1.5987498760223389,22.573173014322915,1.5987498760223389,1],[22.583333333333332,1.5987498760223389,22.576826985677084,1.5987498760223389,22.61586710611979,1.5987498760223389,1],[28.233333333333334,1.5987498760223389,26.027508544921876,1.5987498760223389,30.44566446940104,1.5987498760223389,1],[33.9,1.5987498760223389,31.68766886393229,1.5987498760223389,36.09931640625,1.5987498760223389,1],[39.53333333333333,1.5987498760223389,37.33401692708333,1.5987498760223389,42.415873209635414,1.5987498760223389,1],[46.916666666666664,1.5987498760223389,46.884130859375,1.5987498760223389,46.92317301432291,1.5987498760223389,1],[46.93333333333333,1.5987498760223389,46.92682698567708,1.5987498760223389,46.965869140625,1.5987498760223389,1],[47.38333333333333,1.5987498760223389,47.20764973958333,1.5987498760223389,48.261759440104164,1.5987498760223389,2],[50.233333333333334,1.5987498760223389,49.15970052083333,1.5987498760223389,50.44805908203125,1.5987498760223389,2],[50.78333333333333,1.5987498760223389,50.568607584635416,1.5987498760223389,51.056620279947914,1.5987498760223389,2],[51.483333333333334,1.5987498760223389,51.21004638671875,1.5987498760223389,52.849772135416664,1.5987498760223389,1],[56.516666666666666,1.5987498760223389,54.551595052083336,1.5987498760223389,57.37557373046875,1.5987498760223389,1],[58.71666666666667,1.5987498760223389,57.85775960286458,1.5987498760223389,59.855367024739586,1.5987498760223389,1],[61.63333333333333,1.5987498760223389,60.85251057942708,1.5987498760223389,61.78949788411458,1.5987498760223389,1],[62.03333333333333,1.5987498760223389,61.968265787760416,1.5987498760223389,62.046346028645836,1.5987498760223389,1],[62.06666666666666,1.5987498760223389,62.053653971354166,1.5987498760223389,62.07317301432292,1.5987498760223389,1],[62.083333333333336,1.5987498760223389,62.07682698567708,1.5987498760223389,62.115869140625,1.5987498760223389,1],[73.55,1.5987498760223389,73.51746419270833,1.5987498760223389,73.55651041666667,1.5987498760223389,1],[73.56666666666666,1.5987498760223389,73.56015625,1.5987498760223389,73.59920247395833,1.5987498760223389,1],[84.28333333333333,1.5987498760223389,84.25079752604167,1.5987498760223389,84.28984375,1.5987498760223389,1],[84.3,1.5987498760223389,84.29348958333333,1.5987498760223389,84.33253580729166,1.5987498760223389,1],[90.71666666666667,1.5987498760223389,88.2115234375,1.5987498760223389,92.78584798177083,1.5987498760223389,1],[96.01666666666667,1.5987498760223389,95.984130859375,1.5987498760223389,96.02317708333334,1.5987498760223389,1],[96.03333333333333,1.5987498760223389,96.02682291666666,1.5987498760223389,96.065869140625,1.5987498760223389,1],[107.66666666666667,1.5987498760223389,107.63413085937499,1.5987498760223389,107.67317708333333,1.5987498760223389,1],[107.68333333333334,1.5987498760223389,107.67682291666667,1.5987498760223389,107.715869140625,1.5987498760223389,1],[113.06666666666666,1.5987498760223389,113.034130859375,1.5987498760223389,113.07317708333333,1.5987498760223389,1],[113.08333333333333,1.5987498760223389,113.07682291666667,1.5987498760223389,113.115869140625,1.5987498760223389,1],[121.23333333333333,1.5987498760223389,118.05148111979166,1.5987498760223389,127.39532877604167,1.5987498760223389,2],[137.01666666666665,1.5987498760223389,130.85467122395832,1.5987498760223389,141.07044270833333,1.5987498760223389,2],[147.4,1.5987498760223389,143.34622395833333,1.5987498760223389,152.09794921875,1.5987498760223389,2],[159.43333333333334,1.5987498760223389,154.73538411458333,1.5987498760223389,164.13128255208332,1.5987498760223389,1]],0],[[[0.0,0.013984373770654202,-8.810286458333334,0.013984373770654202,8.810286458333334,0.013984373770654202,1],[22.566666666666666,0.013984373770654202,22.53413289388021,0.013984373770654202,22.573173014322915,0.013984373770654202,1],[22.583333333333332,0.013984373770654202,22.576826985677084,0.013984373770654202,22.61586710611979,0.013984373770654202,1],[28.233333333333334,0.013984373770654202,26.027508544921876,0.013984373770654202,30.44566446940104,0.013984373770654202,1],[33.9,0.013984373770654202,31.68766886393229,0.013984373770654202,36.09931640625,0.013984373770654202,1],[39.53333333333333,0.013984373770654202,37.33401692708333,0.013984373770654202,42.415873209635414,0.013984373770654202,1],[46.916666666666664,0.013984373770654202,46.884130859375,0.013984373770654202,46.92317301432291,0.013984373770654202,1],[46.93333333333333,0.013984373770654202,46.92682698567708,0.013984373770654202,46.965869140625,0.013984373770654202,1],[47.38333333333333,0.013984373770654202,47.20764973958333,0.013984373770654202,48.261759440104164,0.013984373770654202,2],[50.233333333333334,0.013984373770654202,49.15970052083333,0.013984373770654202,50.44805908203125,0.013984373770654202,2],[50.78333333333333,0.013984373770654202,50.568607584635416,0.013984373770654202,51.056620279947914,0.013984373770654202,2],[51.483333333333334,0.013984373770654202,51.21004638671875,0.013984373770654202,52.849772135416664,0.013984373770654202,1],[56.516666666666666,0.013984373770654202,54.551595052083336,0.013984373770654202,57.37557373046875,0.013984373770654202,1],[58.71666666666667,0.013984373770654202,57.85775960286458,0.013984373770654202,59.855367024739586,0.013984373770654202,1],[61.63333333333333,0.013984373770654202,60.85251057942708,0.013984373770654202,61.78949788411458,0.013984373770654202,1],[62.03333333333333,0.013984373770654202,61.968265787760416,0.013984373770654202,62.046346028645836,0.013984373770654202,1],[62.06666666666666,0.013984373770654202,62.053653971354166,0.013984373770654202,62.07317301432292,0.013984373770654202,1],[62.083333333333336,0.013984373770654202,62.07682698567708,0.013984373770654202,62.115869140625,0.013984373770654202,1],[73.55,0.013984373770654202,73.51746419270833,0.013984373770654202,73.55651041666667,0.013984373770654202,1],[73.56666666666666,0.013984373770654202,73.56015625,0.013984373770654202,73.59920247395833,0.013984373770654202,1],[84.28333333333333,0.013984373770654202,84.25079752604167,0.013984373770654202,84.28984375,0.013984373770654202,1],[84.3,0.013984373770654202,84.29348958333333,0.013984373770654202,84.33253580729166,0.013984373770654202,1],[90.71666666666667,0.013984373770654202,88.2115234375,0.013984373770654202,92.78584798177083,0.013984373770654202,1],[96.01666666666667,0.013984373770654202,95.984130859375,0.013984373770654202,96.02317708333334,0.013984373770654202,1],[96.03333333333333,0.013984373770654202,96.02682291666666,0.013984373770654202,96.065869140625,0.013984373770654202,1],[107.66666666666667,0.013984373770654202,107.63413085937499,0.013984373770654202,107.67317708333333,0.013984373770654202,1],[107.68333333333334,0.013984373770654202,107.67682291666667,0.013984373770654202,107.715869140625,0.013984373770654202,1],[113.06666666666666,0.013984373770654202,113.034130859375,0.013984373770654202,113.07317708333333,0.013984373770654202,1],[113.08333333333333,0.013984373770654202,113.07682291666667,0.013984373770654202,113.115869140625,0.013984373770654202,1],[121.23333333333333,0.013984373770654202,118.05148111979166,0.013984373770654202,127.39532877604167,0.013984373770654202,2],[137.01666666666665,0.013984373770654202,130.85467122395832,0.013984373770654202,141.07044270833333,0.013984373770654202,2],[147.4,0.013984373770654202,143.34622395833333,0.013984373770654202,152.09794921875,0.013984373770654202,2],[159.43333333333334,0.013984373770654202,154.73538411458333,0.013984373770654202,164.13128255208332,0.013984373770654202,1]],0],[[[0.0,1.042007327079773,-8.810286458333334,1.042007327079773,8.810286458333334,1.042007327079773,1],[22.566666666666666,1.042007327079773,22.53413289388021,1.042007327079773,22.573173014322915,1.042007327079773,1],[22.583333333333332,1.042007327079773,22.576826985677084,1.042007327079773,22.61586710611979,1.042007327079773,1],[28.233333333333334,1.042007327079773,26.027508544921876,1.042007327079773,30.44566446940104,1.042007327079773,1],[33.9,1.042007327079773,31.68766886393229,1.042007327079773,36.09931640625,1.042007327079773,1],[39.53333333333333,1.042007327079773,37.33401692708333,1.042007327079773,42.415873209635414,1.042007327079773,1],[46.916666666666664,1.042007327079773,46.884130859375,1.042007327079773,46.92317301432291,1.042007327079773,1],[46.93333333333333,1.042007327079773,46.92682698567708,1.042007327079773,46.965869140625,1.042007327079773,1],[47.38333333333333,1.042007327079773,47.20764973958333,1.042007327079773,48.261759440104164,1.042007327079773,2],[50.233333333333334,1.042007327079773,49.15970052083333,1.042007327079773,50.44805908203125,1.042007327079773,2],[50.78333333333333,1.042007327079773,50.568607584635416,1.042007327079773,51.056620279947914,1.042007327079773,2],[51.483333333333334,1.042007327079773,51.21004638671875,1.042007327079773,52.849772135416664,1.042007327079773,1],[56.516666666666666,1.042007327079773,54.551595052083336,1.042007327079773,57.37557373046875,1.042007327079773,1],[58.71666666666667,1.042007327079773,57.85775960286458,1.042007327079773,59.855367024739586,1.042007327079773,1],[61.63333333333333,1.042007327079773,60.85251057942708,1.042007327079773,61.78949788411458,1.042007327079773,1],[62.03333333333333,1.042007327079773,61.968265787760416,1.042007327079773,62.046346028645836,1.042007327079773,1],[62.06666666666666,1.042007327079773,62.053653971354166,1.042007327079773,62.07317301432292,1.042007327079773,1],[62.083333333333336,1.042007327079773,62.07682698567708,1.042007327079773,62.115869140625,1.042007327079773,1],[73.55,1.042007327079773,73.51746419270833,1.042007327079773,73.55651041666667,1.042007327079773,1],[73.56666666666666,1.042007327079773,73.56015625,1.042007327079773,73.59920247395833,1.042007327079773,1],[84.28333333333333,1.042007327079773,84.25079752604167,1.042007327079773,84.28984375,1.042007327079773,1],[84.3,1.042007327079773,84.29348958333333,1.042007327079773,84.33253580729166,1.042007327079773,1],[90.71666666666667,1.042007327079773,88.2115234375,1.042007327079773,92.78584798177083,1.042007327079773,1],[96.01666666666667,1.042007327079773,95.984130859375,1.042007327079773,96.02317708333334,1.042007327079773,1],[96.03333333333333,1.042007327079773,96.02682291666666,1.042007327079773,96.065869140625,1.042007327079773,1],[107.66666666666667,1.042007327079773,107.63413085937499,1.042007327079773,107.67317708333333,1.042007327079773,1],[107.68333333333334,1.042007327079773,107.67682291666667,1.042007327079773,107.715869140625,1.042007327079773,1],[113.06666666666666,1.042007327079773,113.034130859375,1.042007327079773,113.07317708333333,1.042007327079773,1],[113.08333333333333,1.042007327079773,113.07682291666667,1.042007327079773,113.115869140625,1.042007327079773,1],[121.23333333333333,1.042007327079773,118.05148111979166,1.042007327079773,127.39532877604167,1.042007327079773,2],[137.01666666666665,1.042007327079773,130.85467122395832,1.042007327079773,141.07044270833333,1.042007327079773,2],[147.4,1.042007327079773,143.34622395833333,1.042007327079773,152.09794921875,1.042007327079773,2],[159.43333333333334,1.042007327079773,154.73538411458333,1.042007327079773,164.13128255208332,1.042007327079773,1]],0]],\"location\":[[[[0.0,0.010807782411575317,-8.810286458333334,0.010807782411575317,8.810286458333334,0.010807782411575317,1],[22.566666666666666,-0.04259668290615082,22.53413289388021,-0.04259668290615082,22.573173014322915,-0.04259668290615082,1],[22.583333333333332,0.657659649848938,22.576826985677084,0.657659649848938,22.61586710611979,0.657659649848938,1],[28.216666666666665,0.5405210256576538,28.184132893880207,0.657659649848938,28.223173014322917,0.5170947909355164,1],[28.233333333333334,-0.7975797653198242,28.226826985677082,-0.7975797653198242,28.265867106119792,-0.7975797653198242,1],[33.88333333333333,-0.6687895059585571,33.850799560546875,-0.7975797653198242,33.88983968098958,-0.6430330872535706,1],[33.9,-0.1725481003522873,33.89349365234375,-0.19155855476856232,33.932533772786456,-0.07748989760875702,1],[39.516666666666666,-0.07748989760875702,39.484130859375,-0.1725481003522873,39.523173014322914,-0.0584806352853775,1],[39.53333333333333,0.031116606667637825,39.52682698567708,0.02621668577194214,39.565869140625,0.05561927333474159,1],[46.916666666666664,0.05561927333474159,46.884130859375,0.031116606667637825,46.92317301432291,0.06051919236779213,1],[46.93333333333333,2.4858806133270264,46.92682698567708,2.4858806133270264,46.965869140625,2.4858806133270264,1],[47.266666666666666,2.4858806133270264,47.13652750651042,2.4858806133270264,47.312215169270836,2.4858806133270264,1],[47.38333333333333,2.1006217002868652,47.33778483072916,2.1006217002868652,47.5785400390625,2.1006217002868652,2],[47.88333333333333,2.4858806133270264,47.68812662760416,2.4858806133270264,48.74874674479167,2.4858806133270264,1],[50.1,2.4858806133270264,49.839725748697916,2.4858806133270264,50.15205485026041,2.4858806133270264,1],[50.233333333333334,2.1006217002868652,50.181278483072916,2.1006217002868652,50.38949788411458,2.1006217002868652,2],[50.63333333333333,2.4858806133270264,50.477168782552084,2.4858806133270264,50.69189453125,2.4858806133270264,1],[50.78333333333333,2.1006217002868652,50.724772135416664,2.1006217002868652,51.03710123697917,2.1006217002868652,2],[51.43333333333333,2.4858806133270264,51.368265787760414,2.4858806133270264,51.446346028645834,2.4858806133270264,1],[51.46666666666667,2.4858806133270264,51.453653971354164,2.4858806133270264,51.47317301432292,2.4858806133270264,1],[51.483333333333334,0.6432379484176636,51.476826985677086,0.6432379484176636,51.515869140625,0.6432379484176636,1],[53.03333333333333,0.6432379484176636,52.42819417317708,0.6432379484176636,54.386759440104164,0.6432379484176636,1],[56.5,0.6432379484176636,56.467464192708334,0.6432379484176636,56.50650634765625,0.6432379484176636,1],[56.516666666666666,-1.4367026090621948,56.51016031901042,-1.4191772937774658,56.54920247395833,-1.5243401527404785,1],[58.56666666666666,-1.5243401527404785,58.27385660807292,-1.5243401527404785,58.62522786458333,-1.5243401527404785,1],[58.71666666666667,-1.3698663711547852,58.65810546875,-1.3698663711547852,58.931392415364584,-1.3698663711547852,1],[59.266666666666666,-1.5542651414871216,59.05194091796875,-1.529316782951355,60.11906331380208,-1.6533026695251465,1],[61.449999999999996,-1.6533026695251465,61.092122395833336,-1.6533026695251465,61.52157389322917,-1.6533026695251465,1],[61.63333333333333,-1.4855626821517944,61.56175944010417,-1.4855626821517944,61.71792399088542,-1.4855626821517944,1],[61.85,-1.6533026695251465,61.76540934244792,-1.6533026695251465,61.921573893229166,-1.6533026695251465,1],[62.03333333333333,-1.4855626821517944,61.968265787760416,-1.4855626821517944,62.046346028645836,-1.4855626821517944,1],[62.06666666666666,-1.6882151365280151,62.053653971354166,-1.4855626821517944,62.07317301432292,-1.7895413637161255,1],[62.083333333333336,-2.9851624965667725,62.07682698567708,-2.8720040321350098,62.115869140625,-3.551025390625,1],[73.55,-3.551025390625,73.51746419270833,-3.551025390625,73.55651041666667,-3.551025390625,1],[73.56666666666666,-2.1268677711486816,73.56015625,-2.1268677711486816,73.59920247395833,-2.1268677711486816,1],[84.28333333333333,-3.689730405807495,84.25079752604167,-3.689730405807495,84.28984375,-3.689730405807495,1],[84.3,-1.3218681812286377,84.29348958333333,-1.4614548683166504,84.33253580729166,-0.6242836713790894,1],[90.43333333333334,-0.6242836713790894,89.8802490234375,-0.6242836713790894,90.54395345052083,-0.6242836713790894,1],[90.71666666666667,-0.9359050393104553,90.60604654947916,-0.9359050393104553,91.2697509765625,-0.9359050393104553,1],[96.01666666666667,-0.6597786545753479,95.984130859375,-0.6597786545753479,96.02317708333334,-0.6597786545753479,1],[96.03333333333333,-1.2630789279937744,96.02682291666666,-1.1448951959609985,96.065869140625,-1.8539975881576538,1],[107.66666666666667,-2.750770092010498,107.63413085937499,-2.750770092010498,107.67317708333333,-2.750770092010498,1],[107.68333333333334,-0.23255577683448792,107.67682291666667,-0.23255577683448792,107.715869140625,-0.23255577683448792,1],[113.06666666666666,-1.8327817916870117,113.034130859375,-1.8327817916870117,113.07317708333333,-1.8327817916870117,1],[113.08333333333333,2.056687355041504,113.07682291666667,2.056687355041504,113.115869140625,2.056687355041504,1],[121.23333333333333,0.7596797943115234,118.05148111979166,0.7596797943115234,127.39532877604167,0.7596797943115234,2],[137.01666666666665,2.376997947692871,130.85467122395832,2.376997947692871,141.07044270833333,2.376997947692871,2],[147.4,1.0259164571762085,143.34622395833333,1.5517010688781738,152.09794921875,0.4165802597999573,2],[159.43333333333334,-0.5298111438751221,154.73538411458333,-0.5298111438751221,164.13128255208332,-0.5298111438751221,1]],0],[[[0.0,-1.102004051208496,-8.810286458333334,-1.102004051208496,8.810286458333334,-1.102004051208496,1],[22.566666666666666,-1.544808268547058,22.53413289388021,-1.544808268547058,22.573173014322915,-1.544808268547058,1],[22.583333333333332,-0.9119936227798462,22.576826985677084,-0.9119936227798462,22.61586710611979,-0.9119936227798462,1],[28.216666666666665,-0.9173592925071716,28.184132893880207,-0.9119936227798462,28.223173014322917,-0.918432354927063,1],[28.233333333333334,-1.725215196609497,28.226826985677082,-1.725215196609497,28.265867106119792,-1.725215196609497,1],[33.88333333333333,-1.5965700149536133,33.850799560546875,-1.725215196609497,33.88983968098958,-1.5708426237106323,1],[33.9,1.1840521097183228,33.89349365234375,1.1840521097183228,33.932533772786456,1.1840521097183228,1],[39.516666666666666,1.022315263748169,39.484130859375,1.1840521097183228,39.523173014322914,0.989971935749054,1],[39.53333333333333,-1.5522620677947998,39.52682698567708,-1.3078279495239258,39.565869140625,-2.774585485458374,1],[46.916666666666664,-2.774585485458374,46.884130859375,-2.774585485458374,46.92317301432291,-2.774585485458374,1],[46.93333333333333,-0.48877596855163574,46.92682698567708,-0.48877596855163574,46.965869140625,-0.48877596855163574,1],[47.266666666666666,-0.48877596855163574,47.13652750651042,-0.48877596855163574,47.312215169270836,-0.48877596855163574,1],[47.38333333333333,-0.3347480297088623,47.33778483072916,-0.3347480297088623,47.5785400390625,-0.3347480297088623,2],[47.88333333333333,-0.48877596855163574,47.68812662760416,-0.48877596855163574,48.74874674479167,-0.48877596855163574,1],[50.1,-0.48877596855163574,49.839725748697916,-0.48877596855163574,50.15205485026041,-0.48877596855163574,1],[50.233333333333334,-0.3347480297088623,50.181278483072916,-0.3347480297088623,50.38949788411458,-0.3347480297088623,2],[50.63333333333333,-0.48877596855163574,50.477168782552084,-0.48877596855163574,50.69189453125,-0.48877596855163574,1],[50.78333333333333,-0.3347480297088623,50.724772135416664,-0.3347480297088623,51.03710123697917,-0.3347480297088623,2],[51.43333333333333,-0.48877596855163574,51.368265787760414,-0.48877596855163574,51.446346028645834,-0.48877596855163574,1],[51.46666666666667,-0.48877596855163574,51.453653971354164,-0.48877596855163574,51.47317301432292,-0.48877596855163574,1],[51.483333333333334,-0.5683528184890747,51.476826985677086,-0.5683528184890747,51.515869140625,-0.5683528184890747,1],[53.03333333333333,-0.5683528184890747,52.42819417317708,-0.5683528184890747,54.386759440104164,-0.5683528184890747,1],[56.5,-0.5683528184890747,56.467464192708334,-0.5683528184890747,56.50650634765625,-0.5683528184890747,1],[56.516666666666666,-0.48304688930511475,56.51016031901042,-0.48304688930511475,56.54920247395833,-0.48304688930511475,1],[58.56666666666666,-0.5222950577735901,58.27385660807292,-0.5222950577735901,58.62522786458333,-0.5222950577735901,1],[58.71666666666667,-0.44301241636276245,58.65810546875,-0.44301241636276245,58.931392415364584,-0.44301241636276245,1],[59.266666666666666,-0.5356968641281128,59.05194091796875,-0.5245237946510315,60.11906331380208,-0.580050528049469,1],[61.449999999999996,-0.580050528049469,61.092122395833336,-0.580050528049469,61.52157389322917,-0.580050528049469,1],[61.63333333333333,-0.49454447627067566,61.56175944010417,-0.49454447627067566,61.71792399088542,-0.49454447627067566,1],[61.85,-0.580050528049469,61.76540934244792,-0.580050528049469,61.921573893229166,-0.580050528049469,1],[62.03333333333333,-0.49454447627067566,61.968265787760416,-0.49454447627067566,62.046346028645836,-0.49454447627067566,1],[62.06666666666666,-0.5956859588623047,62.053653971354166,-0.5956859588623047,62.07317301432292,-0.5956859588623047,1],[62.083333333333336,3.1493663787841797,62.07682698567708,3.0299859046936035,62.115869140625,3.7463438510894775,1],[73.55,3.7463438510894775,73.51746419270833,3.7463438510894775,73.55651041666667,3.7463438510894775,1],[73.56666666666666,1.5255711078643799,73.56015625,1.6435433626174927,73.59920247395833,0.9360050559043884,1],[84.28333333333333,0.9360050559043884,84.25079752604167,1.043387770652771,84.28984375,0.914528489112854,1],[84.3,0.826901912689209,84.29348958333333,0.8486175537109375,84.33253580729166,0.718323826789856,1],[90.43333333333334,0.038786619901657104,89.8802490234375,0.05009760707616806,90.54395345052083,0.03652435541152954,1],[90.71666666666667,0.03652435541152954,90.60604654947916,0.038786619901657104,91.2697509765625,0.025213366374373436,1],[96.01666666666667,-0.2440561056137085,95.984130859375,-0.2440561056137085,96.02317708333334,-0.2440561056137085,1],[96.03333333333333,0.8815076351165771,96.02682291666666,0.8815076351165771,96.065869140625,0.8815076351165771,1],[107.66666666666667,-2.130944013595581,107.63413085937499,-2.130944013595581,107.67317708333333,-2.130944013595581,1],[107.68333333333334,-0.7222652435302734,107.67682291666667,-0.7222652435302734,107.715869140625,-0.7222652435302734,1],[113.06666666666666,-1.1081395149230957,113.034130859375,-0.7222652435302734,113.07317708333333,-1.1853530406951904,1],[113.08333333333333,-1.9680323600769043,113.07682291666667,-1.9680323600769043,113.115869140625,-1.9680323600769043,1],[121.23333333333333,0.33228081464767456,118.05148111979166,-0.3330572247505188,127.39532877604167,1.6207780838012695,2],[137.01666666666665,2.4781956672668457,130.85467122395832,2.4781956672668457,141.07044270833333,2.4781956672668457,2],[147.4,1.069593906402588,143.34622395833333,1.4139982461929321,152.09794921875,0.6704608201980591,2],[159.43333333333334,0.657355546951294,154.73538411458333,0.657355546951294,164.13128255208332,0.657355546951294,1]],0],[[[0.0,0.0,-8.810286458333334,0.0,8.810286458333334,0.0,1],[22.566666666666666,0.06807519495487213,22.53413289388021,0.0,22.573173014322915,0.08168938010931015,1],[22.583333333333332,0.8464165329933167,22.576826985677084,0.8464165329933167,22.61586710611979,0.8464165329933167,1],[28.216666666666665,0.8444985151290894,28.184132893880207,0.8444985151290894,28.223173014322917,0.8444985151290894,1],[28.233333333333334,1.9990156888961792,28.226826985677082,1.9990156888961792,28.265867106119792,1.9990156888961792,1],[33.88333333333333,1.7706425189971924,33.850799560546875,1.9990156888961792,33.88983968098958,1.7249706983566284,1],[33.9,1.1594310998916626,33.89349365234375,1.2079981565475464,33.932533772786456,0.9165805578231812,1],[39.516666666666666,0.9165805578231812,39.484130859375,1.1594310998916626,39.523173014322914,0.8680165410041809,1],[39.53333333333333,0.04723849147558212,39.52682698567708,0.0720309168100357,39.565869140625,-0.07673913985490799,1],[46.916666666666664,-0.07673913985490799,46.884130859375,0.04723849147558212,46.92317301432291,-0.10153156518936157,1],[46.93333333333333,-0.20524272322654724,46.92682698567708,-0.20524272322654724,46.965869140625,-0.20524272322654724,1],[47.266666666666666,-0.20524272322654724,47.13652750651042,-0.20524272322654724,47.312215169270836,-0.20524272322654724,1],[47.38333333333333,-0.014138445258140564,47.33778483072916,-0.014138445258140564,47.5785400390625,-0.014138445258140564,2],[47.88333333333333,-0.20524272322654724,47.68812662760416,-0.20524272322654724,48.74874674479167,-0.20524272322654724,1],[50.1,-0.20524272322654724,49.839725748697916,-0.20524272322654724,50.15205485026041,-0.20524272322654724,1],[50.233333333333334,-0.014138445258140564,50.181278483072916,-0.014138445258140564,50.38949788411458,-0.014138445258140564,2],[50.63333333333333,-0.20524272322654724,50.477168782552084,-0.20524272322654724,50.69189453125,-0.20524272322654724,1],[50.78333333333333,-0.014138445258140564,50.724772135416664,-0.014138445258140564,51.03710123697917,-0.014138445258140564,2],[51.43333333333333,-0.20524272322654724,51.368265787760414,-0.20524272322654724,51.446346028645834,-0.20524272322654724,1],[51.46666666666667,-0.20524272322654724,51.453653971354164,-0.20524272322654724,51.47317301432292,-0.20524272322654724,1],[51.483333333333334,-0.5147305130958557,51.476826985677086,-0.5147305130958557,51.515869140625,-0.5147305130958557,1],[53.03333333333333,-0.5147305130958557,52.42819417317708,-0.5147305130958557,54.386759440104164,-0.5147305130958557,1],[56.5,-0.5147305130958557,56.467464192708334,-0.5147305130958557,56.50650634765625,-0.5147305130958557,1],[56.516666666666666,-0.6397807002067566,56.51016031901042,-0.6329289674758911,56.54920247395833,-0.6740435361862183,1],[58.56666666666666,-0.6740435361862183,58.27385660807292,-0.6740435361862183,58.62522786458333,-0.6740435361862183,1],[58.71666666666667,-0.5360921621322632,58.65810546875,-0.5360921621322632,58.931392415364584,-0.5360921621322632,1],[59.266666666666666,-0.6857430338859558,59.05194091796875,-0.6759892106056213,60.11906331380208,-0.7244628071784973,1],[61.449999999999996,-0.7244628071784973,61.092122395833336,-0.7244628071784973,61.52157389322917,-0.7244628071784973,1],[61.63333333333333,-0.5791582465171814,61.56175944010417,-0.5791582465171814,61.71792399088542,-0.5791582465171814,1],[61.85,-0.7244628071784973,61.76540934244792,-0.7244628071784973,61.921573893229166,-0.7244628071784973,1],[62.03333333333333,-0.5791582465171814,61.968265787760416,-0.5791582465171814,62.046346028645836,-0.5791582465171814,1],[62.06666666666666,-0.738112211227417,62.053653971354166,-0.738112211227417,62.07317301432292,-0.738112211227417,1],[62.083333333333336,0.5160173177719116,62.07682698567708,0.5160173177719116,62.115869140625,0.5160173177719116,1],[73.55,0.47112739086151123,73.51746419270833,0.5160173177719116,73.55651041666667,0.4621449112892151,1],[73.56666666666666,0.043872714042663574,73.56015625,0.12759163975715637,73.59920247395833,-0.3747219443321228,1],[84.28333333333333,-0.9982022643089294,84.25079752604167,-0.9982022643089294,84.28984375,-0.9982022643089294,1],[84.3,2.884636402130127,84.29348958333333,2.884636402130127,84.33253580729166,2.884636402130127,1],[90.43333333333334,2.7196764945983887,89.8802490234375,2.7196764945983887,90.54395345052083,2.7196764945983887,1],[90.71666666666667,3.7052383422851562,90.60604654947916,3.7052383422851562,91.2697509765625,3.7052383422851562,1],[96.01666666666667,2.569509267807007,95.984130859375,3.7052383422851562,96.02317708333334,2.342249870300293,1],[96.03333333333333,-1.9805225133895874,96.02682291666666,-1.9805225133895874,96.065869140625,-1.9805225133895874,1],[107.66666666666667,-1.4235188961029053,107.63413085937499,-1.9805225133895874,107.67317708333333,-1.3120625019073486,1],[107.68333333333334,3.4361915588378906,107.67682291666667,3.1334726810455322,107.715869140625,4.949028968811035,1],[113.06666666666666,4.949028968811035,113.034130859375,4.949028968811035,113.07317708333333,4.949028968811035,1],[113.08333333333333,1.6343028545379639,113.07682291666667,1.6343028545379639,113.115869140625,1.6343028545379639,1],[121.23333333333333,3.010232448577881,118.05148111979166,3.010232448577881,127.39532877604167,3.010232448577881,2],[137.01666666666665,2.5552854537963867,130.85467122395832,3.010232448577881,141.07044270833333,2.255990743637085,2],[147.4,1.0817782878875732,143.34622395833333,1.0817782878875732,152.09794921875,1.0817782878875732,2],[159.43333333333334,1.2393134832382202,154.73538411458333,1.2393134832382202,164.13128255208332,1.2393134832382202,1]],0]],\"scale\":[[[[0.0,0.9999999403953552,-8.810286458333334,0.9999999403953552,8.810286458333334,0.9999999403953552,1],[22.566666666666666,0.9999999403953552,22.53413289388021,0.9999999403953552,22.573173014322915,0.9999999403953552,1],[22.583333333333332,0.9999999403953552,22.576826985677084,0.9999999403953552,22.61586710611979,0.9999999403953552,1],[28.233333333333334,0.9999999403953552,26.027508544921876,0.9999999403953552,30.44566446940104,0.9999999403953552,1],[33.9,0.9999999403953552,31.68766886393229,0.9999999403953552,36.09931640625,0.9999999403953552,1],[39.53333333333333,0.9999999403953552,37.33401692708333,0.9999999403953552,42.415873209635414,0.9999999403953552,1],[46.916666666666664,0.9999999403953552,46.884130859375,0.9999999403953552,46.92317301432291,0.9999999403953552,1],[46.93333333333333,0.9999999403953552,46.92682698567708,0.9999999403953552,46.965869140625,0.9999999403953552,1],[47.38333333333333,0.9999999403953552,47.20764973958333,0.9999999403953552,48.261759440104164,0.9999999403953552,2],[50.233333333333334,0.9999999403953552,49.15970052083333,0.9999999403953552,50.44805908203125,0.9999999403953552,2],[50.78333333333333,0.9999999403953552,50.568607584635416,0.9999999403953552,51.056620279947914,0.9999999403953552,2],[51.483333333333334,0.9999999403953552,51.21004638671875,0.9999999403953552,52.849772135416664,0.9999999403953552,1],[56.516666666666666,0.9999999403953552,54.551595052083336,0.9999999403953552,57.37557373046875,0.9999999403953552,1],[58.71666666666667,0.9999999403953552,57.85775960286458,0.9999999403953552,59.855367024739586,0.9999999403953552,1],[61.63333333333333,0.9999999403953552,60.85251057942708,0.9999999403953552,61.78949788411458,0.9999999403953552,1],[62.03333333333333,0.9999999403953552,61.968265787760416,0.9999999403953552,62.046346028645836,0.9999999403953552,1],[62.06666666666666,0.9999999403953552,62.053653971354166,0.9999999403953552,62.07317301432292,0.9999999403953552,1],[62.083333333333336,0.9999999403953552,62.07682698567708,0.9999999403953552,62.115869140625,0.9999999403953552,1],[73.55,0.9999999403953552,73.51746419270833,0.9999999403953552,73.55651041666667,0.9999999403953552,1],[73.56666666666666,0.9999999403953552,73.56015625,0.9999999403953552,73.59920247395833,0.9999999403953552,1],[84.28333333333333,0.9999999403953552,84.25079752604167,0.9999999403953552,84.28984375,0.9999999403953552,1],[84.3,0.9999999403953552,84.29348958333333,0.9999999403953552,84.33253580729166,0.9999999403953552,1],[90.71666666666667,0.9999999403953552,88.2115234375,0.9999999403953552,92.78584798177083,0.9999999403953552,1],[96.01666666666667,0.9999999403953552,95.984130859375,0.9999999403953552,96.02317708333334,0.9999999403953552,1],[96.03333333333333,0.9999999403953552,96.02682291666666,0.9999999403953552,96.065869140625,0.9999999403953552,1],[107.66666666666667,0.9999999403953552,107.63413085937499,0.9999999403953552,107.67317708333333,0.9999999403953552,1],[107.68333333333334,0.9999999403953552,107.67682291666667,0.9999999403953552,107.715869140625,0.9999999403953552,1],[113.06666666666666,0.9999999403953552,113.034130859375,0.9999999403953552,113.07317708333333,0.9999999403953552,1],[113.08333333333333,0.9999999403953552,113.07682291666667,0.9999999403953552,113.115869140625,0.9999999403953552,1],[121.23333333333333,0.9999999403953552,118.05148111979166,0.9999999403953552,127.39532877604167,0.9999999403953552,2],[137.01666666666665,0.9999999403953552,130.85467122395832,0.9999999403953552,141.07044270833333,0.9999999403953552,2],[147.4,0.9999999403953552,143.34622395833333,0.9999999403953552,152.09794921875,0.9999999403953552,2],[159.43333333333334,0.9999999403953552,154.73538411458333,0.9999999403953552,164.13128255208332,0.9999999403953552,1]],0],[[[0.0,1.0,-8.810286458333334,1.0,8.810286458333334,1.0,1],[22.566666666666666,1.0,22.53413289388021,1.0,22.573173014322915,1.0,1],[22.583333333333332,1.0,22.576826985677084,1.0,22.61586710611979,1.0,1],[28.233333333333334,1.0,26.027508544921876,1.0,30.44566446940104,1.0,1],[33.9,1.0,31.68766886393229,1.0,36.09931640625,1.0,1],[39.53333333333333,1.0,37.33401692708333,1.0,42.415873209635414,1.0,1],[46.916666666666664,1.0,46.884130859375,1.0,46.92317301432291,1.0,1],[46.93333333333333,1.0,46.92682698567708,1.0,46.965869140625,1.0,1],[47.38333333333333,1.0,47.20764973958333,1.0,48.261759440104164,1.0,2],[50.233333333333334,1.0,49.15970052083333,1.0,50.44805908203125,1.0,2],[50.78333333333333,1.0,50.568607584635416,1.0,51.056620279947914,1.0,2],[51.483333333333334,1.0,51.21004638671875,1.0,52.849772135416664,1.0,1],[56.516666666666666,1.0,54.551595052083336,1.0,57.37557373046875,1.0,1],[58.71666666666667,1.0,57.85775960286458,1.0,59.855367024739586,1.0,1],[61.63333333333333,1.0,60.85251057942708,1.0,61.78949788411458,1.0,1],[62.03333333333333,1.0,61.968265787760416,1.0,62.046346028645836,1.0,1],[62.06666666666666,1.0,62.053653971354166,1.0,62.07317301432292,1.0,1],[62.083333333333336,1.0,62.07682698567708,1.0,62.115869140625,1.0,1],[73.55,1.0,73.51746419270833,1.0,73.55651041666667,1.0,1],[73.56666666666666,1.0,73.56015625,1.0,73.59920247395833,1.0,1],[84.28333333333333,1.0,84.25079752604167,1.0,84.28984375,1.0,1],[84.3,1.0,84.29348958333333,1.0,84.33253580729166,1.0,1],[90.71666666666667,1.0,88.2115234375,1.0,92.78584798177083,1.0,1],[96.01666666666667,1.0,95.984130859375,1.0,96.02317708333334,1.0,1],[96.03333333333333,1.0,96.02682291666666,1.0,96.065869140625,1.0,1],[107.66666666666667,1.0,107.63413085937499,1.0,107.67317708333333,1.0,1],[107.68333333333334,1.0,107.67682291666667,1.0,107.715869140625,1.0,1],[113.06666666666666,1.0,113.034130859375,1.0,113.07317708333333,1.0,1],[113.08333333333333,1.0,113.07682291666667,1.0,113.115869140625,1.0,1],[121.23333333333333,1.0,118.05148111979166,1.0,127.39532877604167,1.0,2],[137.01666666666665,1.0,130.85467122395832,1.0,141.07044270833333,1.0,2],[147.4,1.0,143.34622395833333,1.0,152.09794921875,1.0,2],[159.43333333333334,1.0,154.73538411458333,1.0,164.13128255208332,1.0,1]],0],[[[0.0,1.0,-8.810286458333334,1.0,8.810286458333334,1.0,1],[22.566666666666666,1.0,22.53413289388021,1.0,22.573173014322915,1.0,1],[22.583333333333332,1.0,22.576826985677084,1.0,22.61586710611979,1.0,1],[28.233333333333334,1.0,26.027508544921876,1.0,30.44566446940104,1.0,1],[33.9,1.0,31.68766886393229,1.0,36.09931640625,1.0,1],[39.53333333333333,1.0,37.33401692708333,1.0,42.415873209635414,1.0,1],[46.916666666666664,1.0,46.884130859375,1.0,46.92317301432291,1.0,1],[46.93333333333333,1.0,46.92682698567708,1.0,46.965869140625,1.0,1],[47.38333333333333,1.0,47.20764973958333,1.0,48.261759440104164,1.0,2],[50.233333333333334,1.0,49.15970052083333,1.0,50.44805908203125,1.0,2],[50.78333333333333,1.0,50.568607584635416,1.0,51.056620279947914,1.0,2],[51.483333333333334,1.0,51.21004638671875,1.0,52.849772135416664,1.0,1],[56.516666666666666,1.0,54.551595052083336,1.0,57.37557373046875,1.0,1],[58.71666666666667,1.0,57.85775960286458,1.0,59.855367024739586,1.0,1],[61.63333333333333,1.0,60.85251057942708,1.0,61.78949788411458,1.0,1],[62.03333333333333,1.0,61.968265787760416,1.0,62.046346028645836,1.0,1],[62.06666666666666,1.0,62.053653971354166,1.0,62.07317301432292,1.0,1],[62.083333333333336,1.0,62.07682698567708,1.0,62.115869140625,1.0,1],[73.55,1.0,73.51746419270833,1.0,73.55651041666667,1.0,1],[73.56666666666666,1.0,73.56015625,1.0,73.59920247395833,1.0,1],[84.28333333333333,1.0,84.25079752604167,1.0,84.28984375,1.0,1],[84.3,1.0,84.29348958333333,1.0,84.33253580729166,1.0,1],[90.71666666666667,1.0,88.2115234375,1.0,92.78584798177083,1.0,1],[96.01666666666667,1.0,95.984130859375,1.0,96.02317708333334,1.0,1],[96.03333333333333,1.0,96.02682291666666,1.0,96.065869140625,1.0,1],[107.66666666666667,1.0,107.63413085937499,1.0,107.67317708333333,1.0,1],[107.68333333333334,1.0,107.67682291666667,1.0,107.715869140625,1.0,1],[113.06666666666666,1.0,113.034130859375,1.0,113.07317708333333,1.0,1],[113.08333333333333,1.0,113.07682291666667,1.0,113.115869140625,1.0,1],[121.23333333333333,1.0,118.05148111979166,1.0,127.39532877604167,1.0,2],[137.01666666666665,1.0,130.85467122395832,1.0,141.07044270833333,1.0,2],[147.4,1.0,143.34622395833333,1.0,152.09794921875,1.0,2],[159.43333333333334,1.0,154.73538411458333,1.0,164.13128255208332,1.0,1]],0]]}],\"Crack\":[{\"rotation_euler\":[[[[34.56666666666666,0.0,34.55,0.0,34.583333333333336,0.0,2]],0],[[[34.56666666666666,0.0,34.55,0.0,34.583333333333336,0.0,2]],0],[[[34.56666666666666,0.0,34.55,0.0,34.583333333333336,0.0,2]],0]],\"location\":[[[[34.56666666666666,0.0,34.55,0.0,34.583333333333336,0.0,2]],0],[[[34.56666666666666,0.0,34.55,0.0,34.583333333333336,0.0,2]],0],[[[34.56666666666666,0.8761409521102905,34.55,0.8761409521102905,34.583333333333336,0.8761409521102905,2]],0]],\"scale\":[[[[34.56666666666666,1.0,34.55,1.0,34.583333333333336,1.0,2]],0],[[[34.56666666666666,1.0,34.55,1.0,34.583333333333336,1.0,2]],0],[[[34.56666666666666,1.0,34.55,1.0,34.583333333333336,1.0,2]],0]]}],\"Circle\":[{\"rotation_euler\":[[[[95.65,0.0,95.38321940104167,0.0,95.91678059895833,0.0,2],[96.33333333333333,0.0,96.066552734375,0.0,97.667236328125,0.0,2],[101.0,0.0,99.178076171875,0.0,101.41643880208333,0.0,2],[102.06666666666666,0.0,101.65022786458333,0.0,103.07522786458333,0.0,2],[104.64999999999999,0.0,103.64143880208333,0.0,105.33972981770833,0.0,2],[106.41666666666667,0.0,106.12386067708333,0.0,106.47522786458333,0.0,2],[106.56666666666666,0.0,106.50810546875,0.0,106.6837890625,0.0,2],[106.86666666666666,0.0,106.74954427083333,0.0,106.90570475260417,0.0,2],[106.96666666666667,0.0,106.92762858072916,0.0,107.0447509765625,0.0,2],[107.16666666666667,0.0,107.08858235677083,0.0,107.28378906249999,0.0,2],[107.46666666666667,0.0,107.34954427083333,0.0,107.5837890625,0.0,2]],0],[[[95.65,0.0,95.38321940104167,0.0,95.91678059895833,0.0,2],[96.33333333333333,0.0,96.066552734375,0.0,97.667236328125,0.0,2],[101.0,0.0,99.178076171875,0.0,101.41643880208333,0.0,2],[102.06666666666666,0.0,101.65022786458333,0.0,103.07522786458333,0.0,2],[104.64999999999999,0.0,103.64143880208333,0.0,105.33972981770833,0.0,2],[106.41666666666667,0.0,106.12386067708333,0.0,106.47522786458333,0.0,2],[106.56666666666666,0.0,106.50810546875,0.0,106.6837890625,0.0,2],[106.86666666666666,0.0,106.74954427083333,0.0,106.90570475260417,0.0,2],[106.96666666666667,0.0,106.92762858072916,0.0,107.0447509765625,0.0,2],[107.16666666666667,0.0,107.08858235677083,0.0,107.28378906249999,0.0,2],[107.46666666666667,0.0,107.34954427083333,0.0,107.5837890625,0.0,2]],0],[[[95.65,0.0,95.38321940104167,0.0,95.91678059895833,0.0,2],[96.33333333333333,0.0,96.066552734375,0.0,97.667236328125,0.0,2],[101.0,0.0,99.178076171875,0.0,101.41643880208333,0.0,2],[102.06666666666666,0.0,101.65022786458333,0.0,103.07522786458333,0.0,2],[104.64999999999999,0.0,103.64143880208333,0.0,105.33972981770833,0.0,2],[106.41666666666667,0.0,106.12386067708333,0.0,106.47522786458333,0.0,2],[106.56666666666666,0.0,106.50810546875,0.0,106.6837890625,0.0,2],[106.86666666666666,0.0,106.74954427083333,0.0,106.90570475260417,0.0,2],[106.96666666666667,0.0,106.92762858072916,0.0,107.0447509765625,0.0,2],[107.16666666666667,0.0,107.08858235677083,0.0,107.28378906249999,0.0,2],[107.46666666666667,0.0,107.34954427083333,0.0,107.5837890625,0.0,2]],0]],\"location\":[[[[95.65,-5.0,95.38321940104167,-5.0,95.91678059895833,-5.0,2],[96.33333333333333,-5.0,96.066552734375,-5.0,97.667236328125,-5.0,2],[101.0,-5.0,99.178076171875,-5.0,101.41643880208333,-5.0,2],[102.06666666666666,-5.0,101.65022786458333,-5.0,103.07522786458333,-5.0,2],[104.64999999999999,-5.0,103.64143880208333,-5.0,105.33972981770833,-5.0,2],[106.41666666666667,-5.0,106.12386067708333,-5.0,106.47522786458333,-5.0,2],[106.56666666666666,-5.0,106.50810546875,-5.0,106.6837890625,-5.0,2],[106.86666666666666,-5.0,106.74954427083333,-5.0,106.90570475260417,-5.0,2],[106.96666666666667,-5.0,106.92762858072916,-5.0,107.0447509765625,-5.0,2],[107.16666666666667,-5.0,107.08858235677083,-5.0,107.28378906249999,-5.0,2],[107.46666666666667,-5.0,107.34954427083333,-5.0,107.5837890625,-5.0,2]],0],[[[95.65,-2.0,95.38321940104167,-2.0,95.91678059895833,-2.0,2],[96.33333333333333,-2.0,96.066552734375,-2.0,97.667236328125,-2.0,2],[101.0,-2.0,99.178076171875,-2.0,101.41643880208333,-2.0,2],[102.06666666666666,-2.0,101.65022786458333,-2.0,103.07522786458333,-2.0,2],[104.64999999999999,-2.0,103.64143880208333,-2.0,105.33972981770833,-2.0,2],[106.41666666666667,-2.0,106.12386067708333,-2.0,106.47522786458333,-2.0,2],[106.56666666666666,-2.0,106.50810546875,-2.0,106.6837890625,-2.0,2],[106.86666666666666,-2.0,106.74954427083333,-2.0,106.90570475260417,-2.0,2],[106.96666666666667,-2.0,106.92762858072916,-2.0,107.0447509765625,-2.0,2],[107.16666666666667,-2.0,107.08858235677083,-2.0,107.28378906249999,-2.0,2],[107.46666666666667,-2.0,107.34954427083333,-2.0,107.5837890625,-2.0,2]],0],[[[95.65,-0.6145171523094177,95.38321940104167,-0.6145171523094177,95.91678059895833,-0.6145171523094177,2],[96.33333333333333,0.3703446388244629,96.066552734375,0.3703446388244629,97.667236328125,0.3703446388244629,2],[101.0,-0.6145171523094177,99.178076171875,-0.6145171523094177,101.41643880208333,-0.6145171523094177,2],[102.06666666666666,0.5284545421600342,101.65022786458333,0.42945152521133423,103.07522786458333,0.7682271003723145,2],[104.64999999999999,0.7682271003723145,103.64143880208333,0.7682271003723145,105.33972981770833,0.7682271003723145,2],[106.41666666666667,0.7682271003723145,106.12386067708333,0.7682271003723145,106.47522786458333,0.7682271003723145,2],[106.56666666666666,0.9010974764823914,106.50810546875,0.9010974764823914,106.6837890625,0.9010974764823914,2],[106.86666666666666,0.7682271003723145,106.74954427083333,0.7682271003723145,106.90570475260417,0.7682271003723145,2],[106.96666666666667,0.7682271003723145,106.92762858072916,0.7682271003723145,107.0447509765625,0.7682271003723145,2],[107.16666666666667,0.9010974764823914,107.08858235677083,0.9010974764823914,107.28378906249999,0.9010974764823914,2],[107.46666666666667,0.7682271003723145,107.34954427083333,0.7682271003723145,107.5837890625,0.7682271003723145,2]],0]],\"scale\":[[[[95.65,1.0,95.38321940104167,1.0,95.91678059895833,1.0,2],[96.33333333333333,1.0,96.066552734375,1.0,97.667236328125,1.0,2],[101.0,1.0,99.178076171875,1.0,101.41643880208333,1.0,2],[102.06666666666666,1.0,101.65022786458333,1.0,103.07522786458333,1.0,2],[104.64999999999999,1.0,103.64143880208333,1.0,105.33972981770833,1.0,2],[106.41666666666667,1.0,106.12386067708333,1.0,106.47522786458333,1.0,2],[106.56666666666666,1.0,106.50810546875,1.0,106.6837890625,1.0,2],[106.86666666666666,1.0,106.74954427083333,1.0,106.90570475260417,1.0,2],[106.96666666666667,1.0,106.92762858072916,1.0,107.0447509765625,1.0,2],[107.16666666666667,1.0,107.08858235677083,1.0,107.28378906249999,1.0,2],[107.46666666666667,1.0,107.34954427083333,1.0,107.5837890625,1.0,2]],0],[[[95.65,1.0,95.38321940104167,1.0,95.91678059895833,1.0,2],[96.33333333333333,1.0,96.066552734375,1.0,97.667236328125,1.0,2],[101.0,1.0,99.178076171875,1.0,101.41643880208333,1.0,2],[102.06666666666666,1.0,101.65022786458333,1.0,103.07522786458333,1.0,2],[104.64999999999999,1.0,103.64143880208333,1.0,105.33972981770833,1.0,2],[106.41666666666667,1.0,106.12386067708333,1.0,106.47522786458333,1.0,2],[106.56666666666666,1.0,106.50810546875,1.0,106.6837890625,1.0,2],[106.86666666666666,1.0,106.74954427083333,1.0,106.90570475260417,1.0,2],[106.96666666666667,1.0,106.92762858072916,1.0,107.0447509765625,1.0,2],[107.16666666666667,1.0,107.08858235677083,1.0,107.28378906249999,1.0,2],[107.46666666666667,1.0,107.34954427083333,1.0,107.5837890625,1.0,2]],0],[[[95.65,1.0,95.38321940104167,1.0,95.91678059895833,1.0,2],[96.33333333333333,1.0,96.066552734375,1.0,97.667236328125,1.0,2],[101.0,1.0,99.178076171875,1.0,101.41643880208333,1.0,2],[102.06666666666666,1.0,101.65022786458333,1.0,103.07522786458333,1.0,2],[104.64999999999999,1.0,103.64143880208333,1.0,105.33972981770833,1.0,2],[106.41666666666667,1.0,106.12386067708333,1.0,106.47522786458333,1.0,2],[106.56666666666666,1.0,106.50810546875,1.0,106.6837890625,1.0,2],[106.86666666666666,1.0,106.74954427083333,1.0,106.90570475260417,1.0,2],[106.96666666666667,1.0,106.92762858072916,1.0,107.0447509765625,1.0,2],[107.16666666666667,1.0,107.08858235677083,1.0,107.28378906249999,1.0,2],[107.46666666666667,1.0,107.34954427083333,1.0,107.5837890625,1.0,2]],0]]}],\"Itching\":[{\"rotation_euler\":[[[[26.116666666666667,0.0,18.171793619791668,0.0,34.06153971354166,0.0,2],[46.46666666666667,0.0,38.521793619791666,0.0,51.854345703125,0.0,2],[60.266666666666666,0.0,54.878987630208336,0.0,87.20506184895834,0.0,2],[134.36666666666667,0.0,105.43717447916667,0.0,163.29615885416666,0.0,2]],0],[[[26.116666666666667,0.0,18.171793619791668,0.0,34.06153971354166,0.0,2],[46.46666666666667,0.0,38.521793619791666,0.0,51.854345703125,0.0,2],[60.266666666666666,0.0,54.878987630208336,0.0,87.20506184895834,0.0,2],[134.36666666666667,0.0,105.43717447916667,0.0,163.29615885416666,0.0,2]],0],[[[26.116666666666667,0.0,18.171793619791668,0.0,34.06153971354166,0.0,2],[46.46666666666667,0.0,38.521793619791666,0.0,51.854345703125,0.0,2],[60.266666666666666,0.0,54.878987630208336,0.0,87.20506184895834,0.0,2],[134.36666666666667,0.0,105.43717447916667,0.0,163.29615885416666,0.0,2]],0]],\"location\":[[[[26.116666666666667,-3.0,18.523162841796875,-3.0,33.71017049153646,-3.0,2],[45.56666666666666,-3.0,43.809814453125,-3.0,45.91803792317708,-3.0,2],[46.46666666666667,-3.0,46.11529541015625,-3.0,48.22351888020833,-3.0,2],[60.266666666666666,-3.0,54.878987630208336,-3.0,86.56088053385416,-3.0,2],[127.61666666666666,-3.0,114.44027506510416,-3.0,130.25194498697917,-3.0,2],[134.36666666666667,-3.0,131.73138834635415,-3.0,137.00193684895834,-3.0,2]],0],[[[26.116666666666667,-1.0,18.523162841796875,-1.0,33.71017049153646,-1.0,2],[45.56666666666666,-1.0,43.809814453125,-1.0,45.91803792317708,-1.0,2],[46.46666666666667,-1.0,46.11529541015625,-1.0,48.22351888020833,-1.0,2],[60.266666666666666,-1.0,54.878987630208336,-1.0,86.56088053385416,-1.0,2],[127.61666666666666,-1.0,114.44027506510416,-1.0,130.25194498697917,-1.0,2],[134.36666666666667,-1.0,131.73138834635415,-1.0,137.00193684895834,-1.0,2]],0],[[[26.116666666666667,-0.00524526834487915,18.523162841796875,-0.00524526834487915,33.71017049153646,-0.00524526834487915,2],[45.56666666666666,-0.00524526834487915,43.809814453125,-0.00524526834487915,45.91803792317708,-0.00524526834487915,2],[46.46666666666667,0.9947547316551208,46.11529541015625,0.993705689907074,48.22351888020833,1.0,2],[60.266666666666666,1.0,54.878987630208336,1.0,86.56088053385416,1.0,2],[127.61666666666666,1.0,114.44027506510416,1.0,130.25194498697917,1.0,2],[134.36666666666667,0.0,131.73138834635415,0.0,137.00193684895834,0.0,2]],0]],\"scale\":[[[[26.116666666666667,1.0,18.171793619791668,1.0,34.06153971354166,1.0,2],[46.46666666666667,1.0,38.521793619791666,1.0,51.854345703125,1.0,2],[60.266666666666666,1.0,54.878987630208336,1.0,87.20506184895834,1.0,2],[134.36666666666667,1.0,105.43717447916667,1.0,163.29615885416666,1.0,2]],0],[[[26.116666666666667,1.0,18.171793619791668,1.0,34.06153971354166,1.0,2],[46.46666666666667,1.0,38.521793619791666,1.0,51.854345703125,1.0,2],[60.266666666666666,1.0,54.878987630208336,1.0,87.20506184895834,1.0,2],[134.36666666666667,1.0,105.43717447916667,1.0,163.29615885416666,1.0,2]],0],[[[26.116666666666667,1.0,18.171793619791668,1.0,34.06153971354166,1.0,2],[46.46666666666667,1.0,38.521793619791666,1.0,51.854345703125,1.0,2],[60.266666666666666,1.0,54.878987630208336,1.0,87.20506184895834,1.0,2],[134.36666666666667,1.0,105.43717447916667,1.0,163.29615885416666,1.0,2]],0]]}],\"Cracking\":[{\"rotation_euler\":[[[[0.0,0.0,-17.659613037109374,0.0,17.659613037109374,0.0,2],[45.233333333333334,0.0,39.019283040364584,0.0,46.47614339192708,0.0,2],[48.416666666666664,0.0,47.17385660807292,0.0,54.630716959635414,0.0,2],[85.8,0.0,71.20511881510417,0.0,100.39488118489584,0.0,2]],0],[[[0.0,0.0,-17.659613037109374,0.0,17.659613037109374,0.0,2],[45.233333333333334,0.0,39.019283040364584,0.0,46.47614339192708,0.0,2],[48.416666666666664,0.0,47.17385660807292,0.0,54.630716959635414,0.0,2],[85.8,0.0,71.20511881510417,0.0,100.39488118489584,0.0,2]],0],[[[0.0,0.0,-17.659613037109374,0.0,17.659613037109374,0.0,2],[45.233333333333334,0.0,39.019283040364584,0.0,46.47614339192708,0.0,2],[48.416666666666664,0.0,47.17385660807292,0.0,54.630716959635414,0.0,2],[85.8,0.0,71.20511881510417,0.0,100.39488118489584,0.0,2]],0]],\"location\":[[[[0.0,-3.0,-17.60755818684896,-3.0,17.60755818684896,-3.0,2],[45.1,-3.0,44.839725748697916,-3.0,45.15205485026041,-3.0,2],[45.233333333333334,-3.0,45.181278483072916,-3.0,45.49360758463541,-3.0,2],[48.416666666666664,-3.0,47.17385660807292,-3.0,54.630716959635414,-3.0,2],[85.8,-3.0,71.20511881510417,-3.0,100.39488118489584,-3.0,2]],0],[[[0.0,0.0,-17.60755818684896,0.0,17.60755818684896,0.0,2],[45.1,0.0,44.839725748697916,0.0,45.15205485026041,0.0,2],[45.233333333333334,0.0,45.181278483072916,0.0,45.49360758463541,0.0,2],[48.416666666666664,0.0,47.17385660807292,0.0,54.630716959635414,0.0,2],[85.8,0.0,71.20511881510417,0.0,100.39488118489584,0.0,2]],0],[[[0.0,0.0,-17.60755818684896,0.0,17.60755818684896,0.0,2],[45.1,0.0,44.839725748697916,0.0,45.15205485026041,0.0,2],[45.233333333333334,0.34073251485824585,45.181278483072916,0.27134186029434204,45.49360758463541,0.6876857280731201,2],[48.416666666666664,0.6926950216293335,47.17385660807292,0.6052069067955017,52.385852050781246,0.9721074104309082,2],[58.583333333333336,1.0,54.61414794921875,0.6926950216293335,69.209033203125,1.8226702213287354,2],[85.8,5.290861129760742,75.17430013020834,5.290861129760742,96.42569986979167,5.290861129760742,2]],0]],\"scale\":[[[[0.0,1.0,-17.659613037109374,1.0,17.659613037109374,1.0,2],[45.233333333333334,1.0,39.019283040364584,1.0,46.47614339192708,1.0,2],[48.416666666666664,1.0,47.17385660807292,1.0,54.630716959635414,1.0,2],[85.8,1.0,71.20511881510417,1.0,100.39488118489584,1.0,2]],0],[[[0.0,1.0,-17.659613037109374,1.0,17.659613037109374,1.0,2],[45.233333333333334,1.0,39.019283040364584,1.0,46.47614339192708,1.0,2],[48.416666666666664,1.0,47.17385660807292,1.0,54.630716959635414,1.0,2],[85.8,1.0,71.20511881510417,1.0,100.39488118489584,1.0,2]],0],[[[0.0,1.0,-17.659613037109374,1.0,17.659613037109374,1.0,2],[45.233333333333334,1.0,39.019283040364584,1.0,46.47614339192708,1.0,2],[48.416666666666664,1.0,47.17385660807292,1.0,54.630716959635414,1.0,2],[85.8,1.0,71.20511881510417,1.0,100.39488118489584,1.0,2]],0]]}],\"ExtraBloom\":[{\"rotation_euler\":[[[[23.466666666666665,0.0,22.451597086588542,0.0,24.48173624674479,0.0,2],[26.066666666666666,0.0,25.903995768229166,0.0,26.099200439453124,0.0,2],[26.15,0.0,26.11746622721354,0.0,26.189042154947916,0.0,2],[26.25,0.0,26.210957845052082,0.0,26.38664347330729,0.0,2],[26.599999999999998,0.0,26.463356526692706,0.0,26.63253377278646,0.0,2],[26.683333333333334,0.0,26.650799560546876,0.0,26.722375488281248,0.0,2],[26.78333333333333,0.0,26.744291178385417,0.0,26.84840291341146,0.0,2],[26.95,0.0,26.884930419921876,0.0,26.982533772786457,0.0,2],[27.03333333333333,0.0,27.000799560546874,0.0,27.065867106119793,0.0,2],[27.116666666666667,0.0,27.08413289388021,0.0,27.240297444661458,0.0,2],[27.433333333333334,0.0,27.309702555338543,0.0,27.46586710611979,0.0,2],[27.516666666666666,0.0,27.484132893880208,0.0,27.555708821614584,0.0,2],[27.616666666666667,0.0,27.57762451171875,0.0,27.68173624674479,0.0,2],[27.78333333333333,0.0,27.718263753255208,0.0,27.815867106119793,0.0,2],[27.866666666666667,0.0,27.83413289388021,0.0,27.899200439453125,0.0,2],[27.95,0.0,27.91746622721354,0.0,27.982533772786457,0.0,2],[28.03333333333333,0.0,28.000799560546874,0.0,28.065867106119793,0.0,2],[28.116666666666667,0.0,28.08413289388021,0.0,28.279337565104168,0.0,2],[31.75,0.0,31.5873291015625,0.0,31.782533772786458,0.0,2],[31.833333333333332,0.0,31.800799560546874,0.0,31.86586710611979,0.0,2],[31.916666666666668,0.0,31.884132893880206,0.0,32.05331013997396,0.0,2],[32.266666666666666,0.0,32.13002319335938,0.0,32.299200439453124,0.0,2],[32.35,0.0,32.317466227213544,0.0,32.38253377278646,0.0,2],[32.43333333333333,0.0,32.40079956054687,0.0,32.4788818359375,0.0,2],[32.55,0.0,32.504451497395834,0.0,32.582533772786455,0.0,2],[32.63333333333333,0.0,32.600799560546875,0.0,32.66586710611979,0.0,2],[32.71666666666667,0.0,32.68413289388021,0.0,32.879337565104166,0.0,2],[33.13333333333333,0.0,32.970662434895836,0.0,33.16586710611979,0.0,2],[33.21666666666667,0.0,33.18413289388021,0.0,33.249200439453126,0.0,2],[33.3,0.0,33.26746622721354,0.0,33.36506958007813,0.0,2],[33.46666666666667,0.0,33.40159708658854,0.0,33.499200439453126,0.0,2],[33.55,0.0,33.51746622721354,0.0,33.582533772786455,0.0,2],[33.63333333333333,0.0,33.600799560546875,0.0,33.67237548828125,0.0,2],[33.733333333333334,0.0,33.69429117838541,0.0,33.76586710611979,0.0,2],[33.81666666666666,0.0,33.784132893880205,0.0,33.855708821614584,0.0,2],[33.916666666666664,0.0,33.87762451171875,0.0,33.94920043945312,0.0,2],[34.0,0.0,33.96746622721354,0.0,34.1626708984375,0.0,2],[37.38333333333333,0.0,37.220662434895836,0.0,37.415869140625,0.0,2],[37.46666666666667,0.0,37.434130859375,0.0,37.499202473958334,0.0,2],[37.55,0.0,37.51746419270833,0.0,37.69315185546875,0.0,2],[37.916666666666664,0.0,37.77351481119791,0.0,37.94920247395833,0.0,2],[38.0,0.0,37.967464192708334,0.0,38.032535807291666,0.0,2],[38.083333333333336,0.0,38.05079752604166,0.0,38.10285237630208,0.0,2],[38.13333333333333,0.0,38.11381429036458,0.0,38.14634602864583,0.0,2],[38.166666666666664,0.0,38.15365397135417,0.0,38.205708821614586,0.0,2],[38.266666666666666,0.0,38.22762451171875,0.0,38.29920247395833,0.0,2],[38.35,0.0,38.317464192708336,0.0,38.38253580729167,0.0,2],[38.43333333333333,0.0,38.400797526041664,0.0,38.56997884114583,0.0,2],[38.78333333333333,0.0,38.646687825520836,0.0,38.815869140625,0.0,2],[38.86666666666667,0.0,38.834130859375,0.0,38.89920247395833,0.0,2],[38.95,0.0,38.91746419270833,0.0,39.002054850260414,0.0,2],[39.083333333333336,0.0,39.03127848307292,0.0,39.115869140625,0.0,2],[39.166666666666664,0.0,39.134130859375,0.0,39.19920247395833,0.0,2],[39.25,0.0,39.217464192708334,0.0,39.27602945963542,0.0,2],[39.31666666666666,0.0,39.29063720703125,0.0,39.349202473958336,0.0,2],[39.4,0.0,39.36746419270833,0.0,39.432535807291664,0.0,2],[39.483333333333334,0.0,39.45079752604167,0.0,39.515869140625,0.0,2]],0],[[[23.466666666666665,0.0,22.451597086588542,0.0,24.48173624674479,0.0,2],[26.066666666666666,0.0,25.903995768229166,0.0,26.099200439453124,0.0,2],[26.15,0.0,26.11746622721354,0.0,26.189042154947916,0.0,2],[26.25,0.0,26.210957845052082,0.0,26.38664347330729,0.0,2],[26.599999999999998,0.0,26.463356526692706,0.0,26.63253377278646,0.0,2],[26.683333333333334,0.0,26.650799560546876,0.0,26.722375488281248,0.0,2],[26.78333333333333,0.0,26.744291178385417,0.0,26.84840291341146,0.0,2],[26.95,0.0,26.884930419921876,0.0,26.982533772786457,0.0,2],[27.03333333333333,0.0,27.000799560546874,0.0,27.065867106119793,0.0,2],[27.116666666666667,0.0,27.08413289388021,0.0,27.240297444661458,0.0,2],[27.433333333333334,0.0,27.309702555338543,0.0,27.46586710611979,0.0,2],[27.516666666666666,0.0,27.484132893880208,0.0,27.555708821614584,0.0,2],[27.616666666666667,0.0,27.57762451171875,0.0,27.68173624674479,0.0,2],[27.78333333333333,0.0,27.718263753255208,0.0,27.815867106119793,0.0,2],[27.866666666666667,0.0,27.83413289388021,0.0,27.899200439453125,0.0,2],[27.95,0.0,27.91746622721354,0.0,27.982533772786457,0.0,2],[28.03333333333333,0.0,28.000799560546874,0.0,28.065867106119793,0.0,2],[28.116666666666667,0.0,28.08413289388021,0.0,28.279337565104168,0.0,2],[31.75,0.0,31.5873291015625,0.0,31.782533772786458,0.0,2],[31.833333333333332,0.0,31.800799560546874,0.0,31.86586710611979,0.0,2],[31.916666666666668,0.0,31.884132893880206,0.0,32.05331013997396,0.0,2],[32.266666666666666,0.0,32.13002319335938,0.0,32.299200439453124,0.0,2],[32.35,0.0,32.317466227213544,0.0,32.38253377278646,0.0,2],[32.43333333333333,0.0,32.40079956054687,0.0,32.4788818359375,0.0,2],[32.55,0.0,32.504451497395834,0.0,32.582533772786455,0.0,2],[32.63333333333333,0.0,32.600799560546875,0.0,32.66586710611979,0.0,2],[32.71666666666667,0.0,32.68413289388021,0.0,32.879337565104166,0.0,2],[33.13333333333333,0.0,32.970662434895836,0.0,33.16586710611979,0.0,2],[33.21666666666667,0.0,33.18413289388021,0.0,33.249200439453126,0.0,2],[33.3,0.0,33.26746622721354,0.0,33.36506958007813,0.0,2],[33.46666666666667,0.0,33.40159708658854,0.0,33.499200439453126,0.0,2],[33.55,0.0,33.51746622721354,0.0,33.582533772786455,0.0,2],[33.63333333333333,0.0,33.600799560546875,0.0,33.67237548828125,0.0,2],[33.733333333333334,0.0,33.69429117838541,0.0,33.76586710611979,0.0,2],[33.81666666666666,0.0,33.784132893880205,0.0,33.855708821614584,0.0,2],[33.916666666666664,0.0,33.87762451171875,0.0,33.94920043945312,0.0,2],[34.0,0.0,33.96746622721354,0.0,34.1626708984375,0.0,2],[37.38333333333333,0.0,37.220662434895836,0.0,37.415869140625,0.0,2],[37.46666666666667,0.0,37.434130859375,0.0,37.499202473958334,0.0,2],[37.55,0.0,37.51746419270833,0.0,37.69315185546875,0.0,2],[37.916666666666664,0.0,37.77351481119791,0.0,37.94920247395833,0.0,2],[38.0,0.0,37.967464192708334,0.0,38.032535807291666,0.0,2],[38.083333333333336,0.0,38.05079752604166,0.0,38.10285237630208,0.0,2],[38.13333333333333,0.0,38.11381429036458,0.0,38.14634602864583,0.0,2],[38.166666666666664,0.0,38.15365397135417,0.0,38.205708821614586,0.0,2],[38.266666666666666,0.0,38.22762451171875,0.0,38.29920247395833,0.0,2],[38.35,0.0,38.317464192708336,0.0,38.38253580729167,0.0,2],[38.43333333333333,0.0,38.400797526041664,0.0,38.56997884114583,0.0,2],[38.78333333333333,0.0,38.646687825520836,0.0,38.815869140625,0.0,2],[38.86666666666667,0.0,38.834130859375,0.0,38.89920247395833,0.0,2],[38.95,0.0,38.91746419270833,0.0,39.002054850260414,0.0,2],[39.083333333333336,0.0,39.03127848307292,0.0,39.115869140625,0.0,2],[39.166666666666664,0.0,39.134130859375,0.0,39.19920247395833,0.0,2],[39.25,0.0,39.217464192708334,0.0,39.27602945963542,0.0,2],[39.31666666666666,0.0,39.29063720703125,0.0,39.349202473958336,0.0,2],[39.4,0.0,39.36746419270833,0.0,39.432535807291664,0.0,2],[39.483333333333334,0.0,39.45079752604167,0.0,39.515869140625,0.0,2]],0],[[[23.466666666666665,0.0,22.451597086588542,0.0,24.48173624674479,0.0,2],[26.066666666666666,0.0,25.903995768229166,0.0,26.099200439453124,0.0,2],[26.15,0.0,26.11746622721354,0.0,26.189042154947916,0.0,2],[26.25,0.0,26.210957845052082,0.0,26.38664347330729,0.0,2],[26.599999999999998,0.0,26.463356526692706,0.0,26.63253377278646,0.0,2],[26.683333333333334,0.0,26.650799560546876,0.0,26.722375488281248,0.0,2],[26.78333333333333,0.0,26.744291178385417,0.0,26.84840291341146,0.0,2],[26.95,0.0,26.884930419921876,0.0,26.982533772786457,0.0,2],[27.03333333333333,0.0,27.000799560546874,0.0,27.065867106119793,0.0,2],[27.116666666666667,0.0,27.08413289388021,0.0,27.240297444661458,0.0,2],[27.433333333333334,0.0,27.309702555338543,0.0,27.46586710611979,0.0,2],[27.516666666666666,0.0,27.484132893880208,0.0,27.555708821614584,0.0,2],[27.616666666666667,0.0,27.57762451171875,0.0,27.68173624674479,0.0,2],[27.78333333333333,0.0,27.718263753255208,0.0,27.815867106119793,0.0,2],[27.866666666666667,0.0,27.83413289388021,0.0,27.899200439453125,0.0,2],[27.95,0.0,27.91746622721354,0.0,27.982533772786457,0.0,2],[28.03333333333333,0.0,28.000799560546874,0.0,28.065867106119793,0.0,2],[28.116666666666667,0.0,28.08413289388021,0.0,28.279337565104168,0.0,2],[31.75,0.0,31.5873291015625,0.0,31.782533772786458,0.0,2],[31.833333333333332,0.0,31.800799560546874,0.0,31.86586710611979,0.0,2],[31.916666666666668,0.0,31.884132893880206,0.0,32.05331013997396,0.0,2],[32.266666666666666,0.0,32.13002319335938,0.0,32.299200439453124,0.0,2],[32.35,0.0,32.317466227213544,0.0,32.38253377278646,0.0,2],[32.43333333333333,0.0,32.40079956054687,0.0,32.4788818359375,0.0,2],[32.55,0.0,32.504451497395834,0.0,32.582533772786455,0.0,2],[32.63333333333333,0.0,32.600799560546875,0.0,32.66586710611979,0.0,2],[32.71666666666667,0.0,32.68413289388021,0.0,32.879337565104166,0.0,2],[33.13333333333333,0.0,32.970662434895836,0.0,33.16586710611979,0.0,2],[33.21666666666667,0.0,33.18413289388021,0.0,33.249200439453126,0.0,2],[33.3,0.0,33.26746622721354,0.0,33.36506958007813,0.0,2],[33.46666666666667,0.0,33.40159708658854,0.0,33.499200439453126,0.0,2],[33.55,0.0,33.51746622721354,0.0,33.582533772786455,0.0,2],[33.63333333333333,0.0,33.600799560546875,0.0,33.67237548828125,0.0,2],[33.733333333333334,0.0,33.69429117838541,0.0,33.76586710611979,0.0,2],[33.81666666666666,0.0,33.784132893880205,0.0,33.855708821614584,0.0,2],[33.916666666666664,0.0,33.87762451171875,0.0,33.94920043945312,0.0,2],[34.0,0.0,33.96746622721354,0.0,34.1626708984375,0.0,2],[37.38333333333333,0.0,37.220662434895836,0.0,37.415869140625,0.0,2],[37.46666666666667,0.0,37.434130859375,0.0,37.499202473958334,0.0,2],[37.55,0.0,37.51746419270833,0.0,37.69315185546875,0.0,2],[37.916666666666664,0.0,37.77351481119791,0.0,37.94920247395833,0.0,2],[38.0,0.0,37.967464192708334,0.0,38.032535807291666,0.0,2],[38.083333333333336,0.0,38.05079752604166,0.0,38.10285237630208,0.0,2],[38.13333333333333,0.0,38.11381429036458,0.0,38.14634602864583,0.0,2],[38.166666666666664,0.0,38.15365397135417,0.0,38.205708821614586,0.0,2],[38.266666666666666,0.0,38.22762451171875,0.0,38.29920247395833,0.0,2],[38.35,0.0,38.317464192708336,0.0,38.38253580729167,0.0,2],[38.43333333333333,0.0,38.400797526041664,0.0,38.56997884114583,0.0,2],[38.78333333333333,0.0,38.646687825520836,0.0,38.815869140625,0.0,2],[38.86666666666667,0.0,38.834130859375,0.0,38.89920247395833,0.0,2],[38.95,0.0,38.91746419270833,0.0,39.002054850260414,0.0,2],[39.083333333333336,0.0,39.03127848307292,0.0,39.115869140625,0.0,2],[39.166666666666664,0.0,39.134130859375,0.0,39.19920247395833,0.0,2],[39.25,0.0,39.217464192708334,0.0,39.27602945963542,0.0,2],[39.31666666666666,0.0,39.29063720703125,0.0,39.349202473958336,0.0,2],[39.4,0.0,39.36746419270833,0.0,39.432535807291664,0.0,2],[39.483333333333334,0.0,39.45079752604167,0.0,39.515869140625,0.0,2]],0]],\"location\":[[[[23.466666666666665,4.0,22.451597086588542,4.0,24.48173624674479,4.0,2],[26.066666666666666,4.0,25.903995768229166,4.0,26.099200439453124,4.0,2],[26.15,4.0,26.11746622721354,4.0,26.189042154947916,4.0,2],[26.25,4.0,26.210957845052082,4.0,26.38664347330729,4.0,2],[26.599999999999998,4.0,26.463356526692706,4.0,26.63253377278646,4.0,2],[26.683333333333334,4.0,26.650799560546876,4.0,26.722375488281248,4.0,2],[26.78333333333333,4.0,26.744291178385417,4.0,26.84840291341146,4.0,2],[26.95,4.0,26.884930419921876,4.0,26.982533772786457,4.0,2],[27.03333333333333,4.0,27.000799560546874,4.0,27.065867106119793,4.0,2],[27.116666666666667,4.0,27.08413289388021,4.0,27.240297444661458,4.0,2],[27.433333333333334,4.0,27.309702555338543,4.0,27.46586710611979,4.0,2],[27.516666666666666,4.0,27.484132893880208,4.0,27.555708821614584,4.0,2],[27.616666666666667,4.0,27.57762451171875,4.0,27.68173624674479,4.0,2],[27.78333333333333,4.0,27.718263753255208,4.0,27.815867106119793,4.0,2],[27.866666666666667,4.0,27.83413289388021,4.0,27.899200439453125,4.0,2],[27.95,4.0,27.91746622721354,4.0,27.982533772786457,4.0,2],[28.03333333333333,4.0,28.000799560546874,4.0,28.065867106119793,4.0,2],[28.116666666666667,4.0,28.08413289388021,4.0,28.279337565104168,4.0,2],[31.75,4.0,31.5873291015625,4.0,31.782533772786458,4.0,2],[31.833333333333332,4.0,31.800799560546874,4.0,31.86586710611979,4.0,2],[31.916666666666668,4.0,31.884132893880206,4.0,32.05331013997396,4.0,2],[32.266666666666666,4.0,32.13002319335938,4.0,32.299200439453124,4.0,2],[32.35,4.0,32.317466227213544,4.0,32.38253377278646,4.0,2],[32.43333333333333,4.0,32.40079956054687,4.0,32.4788818359375,4.0,2],[32.55,4.0,32.504451497395834,4.0,32.582533772786455,4.0,2],[32.63333333333333,4.0,32.600799560546875,4.0,32.66586710611979,4.0,2],[32.71666666666667,4.0,32.68413289388021,4.0,32.879337565104166,4.0,2],[33.13333333333333,4.0,32.970662434895836,4.0,33.16586710611979,4.0,2],[33.21666666666667,4.0,33.18413289388021,4.0,33.249200439453126,4.0,2],[33.3,4.0,33.26746622721354,4.0,33.36506958007813,4.0,2],[33.46666666666667,4.0,33.40159708658854,4.0,33.499200439453126,4.0,2],[33.55,4.0,33.51746622721354,4.0,33.582533772786455,4.0,2],[33.63333333333333,4.0,33.600799560546875,4.0,33.67237548828125,4.0,2],[33.733333333333334,4.0,33.69429117838541,4.0,33.76586710611979,4.0,2],[33.81666666666666,4.0,33.784132893880205,4.0,33.855708821614584,4.0,2],[33.916666666666664,4.0,33.87762451171875,4.0,33.94920043945312,4.0,2],[34.0,4.0,33.96746622721354,4.0,34.1626708984375,4.0,2],[37.38333333333333,4.0,37.220662434895836,4.0,37.415869140625,4.0,2],[37.46666666666667,4.0,37.434130859375,4.0,37.499202473958334,4.0,2],[37.55,4.0,37.51746419270833,4.0,37.69315185546875,4.0,2],[37.916666666666664,4.0,37.77351481119791,4.0,37.94920247395833,4.0,2],[38.0,4.0,37.967464192708334,4.0,38.032535807291666,4.0,2],[38.083333333333336,4.0,38.05079752604166,4.0,38.10285237630208,4.0,2],[38.13333333333333,4.0,38.11381429036458,4.0,38.14634602864583,4.0,2],[38.166666666666664,4.0,38.15365397135417,4.0,38.205708821614586,4.0,2],[38.266666666666666,4.0,38.22762451171875,4.0,38.29920247395833,4.0,2],[38.35,4.0,38.317464192708336,4.0,38.38253580729167,4.0,2],[38.43333333333333,4.0,38.400797526041664,4.0,38.56997884114583,4.0,2],[38.78333333333333,4.0,38.646687825520836,4.0,38.815869140625,4.0,2],[38.86666666666667,4.0,38.834130859375,4.0,38.89920247395833,4.0,2],[38.95,4.0,38.91746419270833,4.0,39.002054850260414,4.0,2],[39.083333333333336,4.0,39.03127848307292,4.0,39.115869140625,4.0,2],[39.166666666666664,4.0,39.134130859375,4.0,39.19920247395833,4.0,2],[39.25,4.0,39.217464192708334,4.0,39.27602945963542,4.0,2],[39.31666666666666,4.0,39.29063720703125,4.0,39.349202473958336,4.0,2],[39.4,4.0,39.36746419270833,4.0,39.432535807291664,4.0,2],[39.483333333333334,4.0,39.45079752604167,4.0,39.515869140625,4.0,2]],0],[[[23.466666666666665,0.0,22.451597086588542,0.0,24.48173624674479,0.0,2],[26.066666666666666,0.0,25.903995768229166,0.0,26.099200439453124,0.0,2],[26.15,0.0,26.11746622721354,0.0,26.189042154947916,0.0,2],[26.25,0.0,26.210957845052082,0.0,26.38664347330729,0.0,2],[26.599999999999998,0.0,26.463356526692706,0.0,26.63253377278646,0.0,2],[26.683333333333334,0.0,26.650799560546876,0.0,26.722375488281248,0.0,2],[26.78333333333333,0.0,26.744291178385417,0.0,26.84840291341146,0.0,2],[26.95,0.0,26.884930419921876,0.0,26.982533772786457,0.0,2],[27.03333333333333,0.0,27.000799560546874,0.0,27.065867106119793,0.0,2],[27.116666666666667,0.0,27.08413289388021,0.0,27.240297444661458,0.0,2],[27.433333333333334,0.0,27.309702555338543,0.0,27.46586710611979,0.0,2],[27.516666666666666,0.0,27.484132893880208,0.0,27.555708821614584,0.0,2],[27.616666666666667,0.0,27.57762451171875,0.0,27.68173624674479,0.0,2],[27.78333333333333,0.0,27.718263753255208,0.0,27.815867106119793,0.0,2],[27.866666666666667,0.0,27.83413289388021,0.0,27.899200439453125,0.0,2],[27.95,0.0,27.91746622721354,0.0,27.982533772786457,0.0,2],[28.03333333333333,0.0,28.000799560546874,0.0,28.065867106119793,0.0,2],[28.116666666666667,0.0,28.08413289388021,0.0,28.279337565104168,0.0,2],[31.75,0.0,31.5873291015625,0.0,31.782533772786458,0.0,2],[31.833333333333332,0.0,31.800799560546874,0.0,31.86586710611979,0.0,2],[31.916666666666668,0.0,31.884132893880206,0.0,32.05331013997396,0.0,2],[32.266666666666666,0.0,32.13002319335938,0.0,32.299200439453124,0.0,2],[32.35,0.0,32.317466227213544,0.0,32.38253377278646,0.0,2],[32.43333333333333,0.0,32.40079956054687,0.0,32.4788818359375,0.0,2],[32.55,0.0,32.504451497395834,0.0,32.582533772786455,0.0,2],[32.63333333333333,0.0,32.600799560546875,0.0,32.66586710611979,0.0,2],[32.71666666666667,0.0,32.68413289388021,0.0,32.879337565104166,0.0,2],[33.13333333333333,0.0,32.970662434895836,0.0,33.16586710611979,0.0,2],[33.21666666666667,0.0,33.18413289388021,0.0,33.249200439453126,0.0,2],[33.3,0.0,33.26746622721354,0.0,33.36506958007813,0.0,2],[33.46666666666667,0.0,33.40159708658854,0.0,33.499200439453126,0.0,2],[33.55,0.0,33.51746622721354,0.0,33.582533772786455,0.0,2],[33.63333333333333,0.0,33.600799560546875,0.0,33.67237548828125,0.0,2],[33.733333333333334,0.0,33.69429117838541,0.0,33.76586710611979,0.0,2],[33.81666666666666,0.0,33.784132893880205,0.0,33.855708821614584,0.0,2],[33.916666666666664,0.0,33.87762451171875,0.0,33.94920043945312,0.0,2],[34.0,0.0,33.96746622721354,0.0,34.1626708984375,0.0,2],[37.38333333333333,0.0,37.220662434895836,0.0,37.415869140625,0.0,2],[37.46666666666667,0.0,37.434130859375,0.0,37.499202473958334,0.0,2],[37.55,0.0,37.51746419270833,0.0,37.69315185546875,0.0,2],[37.916666666666664,0.0,37.77351481119791,0.0,37.94920247395833,0.0,2],[38.0,0.0,37.967464192708334,0.0,38.032535807291666,0.0,2],[38.083333333333336,0.0,38.05079752604166,0.0,38.10285237630208,0.0,2],[38.13333333333333,0.0,38.11381429036458,0.0,38.14634602864583,0.0,2],[38.166666666666664,0.0,38.15365397135417,0.0,38.205708821614586,0.0,2],[38.266666666666666,0.0,38.22762451171875,0.0,38.29920247395833,0.0,2],[38.35,0.0,38.317464192708336,0.0,38.38253580729167,0.0,2],[38.43333333333333,0.0,38.400797526041664,0.0,38.56997884114583,0.0,2],[38.78333333333333,0.0,38.646687825520836,0.0,38.815869140625,0.0,2],[38.86666666666667,0.0,38.834130859375,0.0,38.89920247395833,0.0,2],[38.95,0.0,38.91746419270833,0.0,39.002054850260414,0.0,2],[39.083333333333336,0.0,39.03127848307292,0.0,39.115869140625,0.0,2],[39.166666666666664,0.0,39.134130859375,0.0,39.19920247395833,0.0,2],[39.25,0.0,39.217464192708334,0.0,39.27602945963542,0.0,2],[39.31666666666666,0.0,39.29063720703125,0.0,39.349202473958336,0.0,2],[39.4,0.0,39.36746419270833,0.0,39.432535807291664,0.0,2],[39.483333333333334,0.0,39.45079752604167,0.0,39.515869140625,0.0,2]],0],[[[23.466666666666665,0.0,22.451597086588542,0.0,24.48173624674479,0.0,2],[26.066666666666666,0.0,25.903995768229166,0.0,26.099200439453124,0.0,2],[26.15,9.99886417388916,26.11746622721354,9.99886417388916,26.189042154947916,9.99886417388916,2],[26.25,0.0,26.210957845052082,0.0,26.38664347330729,0.0,2],[26.599999999999998,0.0,26.463356526692706,0.0,26.63253377278646,0.0,2],[26.683333333333334,6.354475498199463,26.650799560546876,6.354475498199463,26.722375488281248,6.354475498199463,2],[26.78333333333333,0.0,26.744291178385417,0.0,26.84840291341146,0.0,2],[26.95,0.0,26.884930419921876,0.0,26.982533772786457,0.0,2],[27.03333333333333,6.354475498199463,27.000799560546874,6.354475498199463,27.065867106119793,6.354475498199463,2],[27.116666666666667,0.0,27.08413289388021,0.0,27.240297444661458,0.0,2],[27.433333333333334,0.0,27.309702555338543,0.0,27.46586710611979,0.0,2],[27.516666666666666,9.99886417388916,27.484132893880208,9.99886417388916,27.555708821614584,9.99886417388916,2],[27.616666666666667,0.0,27.57762451171875,0.0,27.68173624674479,0.0,2],[27.78333333333333,0.0,27.718263753255208,0.0,27.815867106119793,0.0,2],[27.866666666666667,6.354475498199463,27.83413289388021,6.354475498199463,27.899200439453125,6.354475498199463,2],[27.95,0.0,27.91746622721354,0.0,27.982533772786457,0.0,2],[28.03333333333333,6.354475498199463,28.000799560546874,6.354475498199463,28.065867106119793,6.354475498199463,2],[28.116666666666667,0.0,28.08413289388021,0.0,28.279337565104168,0.0,2],[31.75,0.0,31.5873291015625,0.0,31.782533772786458,0.0,2],[31.833333333333332,9.99886417388916,31.800799560546874,9.99886417388916,31.86586710611979,9.99886417388916,2],[31.916666666666668,0.0,31.884132893880206,0.0,32.05331013997396,0.0,2],[32.266666666666666,0.0,32.13002319335938,0.0,32.299200439453124,0.0,2],[32.35,9.99886417388916,32.317466227213544,9.99886417388916,32.38253377278646,9.99886417388916,2],[32.43333333333333,0.0,32.40079956054687,0.0,32.4788818359375,0.0,2],[32.55,0.0,32.504451497395834,0.0,32.582533772786455,0.0,2],[32.63333333333333,9.99886417388916,32.600799560546875,9.99886417388916,32.66586710611979,9.99886417388916,2],[32.71666666666667,0.0,32.68413289388021,0.0,32.879337565104166,0.0,2],[33.13333333333333,0.0,32.970662434895836,0.0,33.16586710611979,0.0,2],[33.21666666666667,9.99886417388916,33.18413289388021,9.99886417388916,33.249200439453126,9.99886417388916,2],[33.3,0.0,33.26746622721354,0.0,33.36506958007813,0.0,2],[33.46666666666667,0.0,33.40159708658854,0.0,33.499200439453126,0.0,2],[33.55,9.99886417388916,33.51746622721354,9.99886417388916,33.582533772786455,9.99886417388916,2],[33.63333333333333,0.0,33.600799560546875,0.0,33.67237548828125,0.0,2],[33.733333333333334,9.99886417388916,33.69429117838541,9.99886417388916,33.76586710611979,9.99886417388916,2],[33.81666666666666,0.0,33.784132893880205,0.0,33.855708821614584,0.0,2],[33.916666666666664,9.99886417388916,33.87762451171875,9.99886417388916,33.94920043945312,9.99886417388916,2],[34.0,0.0,33.96746622721354,0.0,34.1626708984375,0.0,2],[37.38333333333333,0.0,37.220662434895836,0.0,37.415869140625,0.0,2],[37.46666666666667,9.99886417388916,37.434130859375,9.99886417388916,37.499202473958334,9.99886417388916,2],[37.55,0.0,37.51746419270833,0.0,37.69315185546875,0.0,2],[37.916666666666664,0.0,37.77351481119791,0.0,37.94920247395833,0.0,2],[38.0,9.99886417388916,37.967464192708334,9.99886417388916,38.032535807291666,9.99886417388916,2],[38.083333333333336,0.0,38.05079752604166,0.0,38.10285237630208,0.0,2],[38.13333333333333,3.4556593894958496,38.11381429036458,3.4556593894958496,38.14634602864583,3.4556593894958496,2],[38.166666666666664,0.0,38.15365397135417,0.0,38.205708821614586,0.0,2],[38.266666666666666,0.0,38.22762451171875,0.0,38.29920247395833,0.0,2],[38.35,9.99886417388916,38.317464192708336,9.99886417388916,38.38253580729167,9.99886417388916,2],[38.43333333333333,0.0,38.400797526041664,0.0,38.56997884114583,0.0,2],[38.78333333333333,0.0,38.646687825520836,0.0,38.815869140625,0.0,2],[38.86666666666667,9.99886417388916,38.834130859375,9.99886417388916,38.89920247395833,9.99886417388916,2],[38.95,0.0,38.91746419270833,0.0,39.002054850260414,0.0,2],[39.083333333333336,0.0,39.03127848307292,0.0,39.115869140625,0.0,2],[39.166666666666664,9.99886417388916,39.134130859375,9.99886417388916,39.19920247395833,9.99886417388916,2],[39.25,0.0,39.217464192708334,0.0,39.27602945963542,0.0,2],[39.31666666666666,0.0,39.29063720703125,0.0,39.349202473958336,0.0,2],[39.4,9.99886417388916,39.36746419270833,9.99886417388916,39.432535807291664,9.99886417388916,2],[39.483333333333334,0.0,39.45079752604167,0.0,39.515869140625,0.0,2]],0]],\"scale\":[[[[23.466666666666665,1.0,22.451597086588542,1.0,24.48173624674479,1.0,2],[26.066666666666666,1.0,25.903995768229166,1.0,26.099200439453124,1.0,2],[26.15,1.0,26.11746622721354,1.0,26.189042154947916,1.0,2],[26.25,1.0,26.210957845052082,1.0,26.38664347330729,1.0,2],[26.599999999999998,1.0,26.463356526692706,1.0,26.63253377278646,1.0,2],[26.683333333333334,1.0,26.650799560546876,1.0,26.722375488281248,1.0,2],[26.78333333333333,1.0,26.744291178385417,1.0,26.84840291341146,1.0,2],[26.95,1.0,26.884930419921876,1.0,26.982533772786457,1.0,2],[27.03333333333333,1.0,27.000799560546874,1.0,27.065867106119793,1.0,2],[27.116666666666667,1.0,27.08413289388021,1.0,27.240297444661458,1.0,2],[27.433333333333334,1.0,27.309702555338543,1.0,27.46586710611979,1.0,2],[27.516666666666666,1.0,27.484132893880208,1.0,27.555708821614584,1.0,2],[27.616666666666667,1.0,27.57762451171875,1.0,27.68173624674479,1.0,2],[27.78333333333333,1.0,27.718263753255208,1.0,27.815867106119793,1.0,2],[27.866666666666667,1.0,27.83413289388021,1.0,27.899200439453125,1.0,2],[27.95,1.0,27.91746622721354,1.0,27.982533772786457,1.0,2],[28.03333333333333,1.0,28.000799560546874,1.0,28.065867106119793,1.0,2],[28.116666666666667,1.0,28.08413289388021,1.0,28.279337565104168,1.0,2],[31.75,1.0,31.5873291015625,1.0,31.782533772786458,1.0,2],[31.833333333333332,1.0,31.800799560546874,1.0,31.86586710611979,1.0,2],[31.916666666666668,1.0,31.884132893880206,1.0,32.05331013997396,1.0,2],[32.266666666666666,1.0,32.13002319335938,1.0,32.299200439453124,1.0,2],[32.35,1.0,32.317466227213544,1.0,32.38253377278646,1.0,2],[32.43333333333333,1.0,32.40079956054687,1.0,32.4788818359375,1.0,2],[32.55,1.0,32.504451497395834,1.0,32.582533772786455,1.0,2],[32.63333333333333,1.0,32.600799560546875,1.0,32.66586710611979,1.0,2],[32.71666666666667,1.0,32.68413289388021,1.0,32.879337565104166,1.0,2],[33.13333333333333,1.0,32.970662434895836,1.0,33.16586710611979,1.0,2],[33.21666666666667,1.0,33.18413289388021,1.0,33.249200439453126,1.0,2],[33.3,1.0,33.26746622721354,1.0,33.36506958007813,1.0,2],[33.46666666666667,1.0,33.40159708658854,1.0,33.499200439453126,1.0,2],[33.55,1.0,33.51746622721354,1.0,33.582533772786455,1.0,2],[33.63333333333333,1.0,33.600799560546875,1.0,33.67237548828125,1.0,2],[33.733333333333334,1.0,33.69429117838541,1.0,33.76586710611979,1.0,2],[33.81666666666666,1.0,33.784132893880205,1.0,33.855708821614584,1.0,2],[33.916666666666664,1.0,33.87762451171875,1.0,33.94920043945312,1.0,2],[34.0,1.0,33.96746622721354,1.0,34.1626708984375,1.0,2],[37.38333333333333,1.0,37.220662434895836,1.0,37.415869140625,1.0,2],[37.46666666666667,1.0,37.434130859375,1.0,37.499202473958334,1.0,2],[37.55,1.0,37.51746419270833,1.0,37.69315185546875,1.0,2],[37.916666666666664,1.0,37.77351481119791,1.0,37.94920247395833,1.0,2],[38.0,1.0,37.967464192708334,1.0,38.032535807291666,1.0,2],[38.083333333333336,1.0,38.05079752604166,1.0,38.10285237630208,1.0,2],[38.13333333333333,1.0,38.11381429036458,1.0,38.14634602864583,1.0,2],[38.166666666666664,1.0,38.15365397135417,1.0,38.205708821614586,1.0,2],[38.266666666666666,1.0,38.22762451171875,1.0,38.29920247395833,1.0,2],[38.35,1.0,38.317464192708336,1.0,38.38253580729167,1.0,2],[38.43333333333333,1.0,38.400797526041664,1.0,38.56997884114583,1.0,2],[38.78333333333333,1.0,38.646687825520836,1.0,38.815869140625,1.0,2],[38.86666666666667,1.0,38.834130859375,1.0,38.89920247395833,1.0,2],[38.95,1.0,38.91746419270833,1.0,39.002054850260414,1.0,2],[39.083333333333336,1.0,39.03127848307292,1.0,39.115869140625,1.0,2],[39.166666666666664,1.0,39.134130859375,1.0,39.19920247395833,1.0,2],[39.25,1.0,39.217464192708334,1.0,39.27602945963542,1.0,2],[39.31666666666666,1.0,39.29063720703125,1.0,39.349202473958336,1.0,2],[39.4,1.0,39.36746419270833,1.0,39.432535807291664,1.0,2],[39.483333333333334,1.0,39.45079752604167,1.0,39.515869140625,1.0,2]],0],[[[23.466666666666665,1.0,22.451597086588542,1.0,24.48173624674479,1.0,2],[26.066666666666666,1.0,25.903995768229166,1.0,26.099200439453124,1.0,2],[26.15,1.0,26.11746622721354,1.0,26.189042154947916,1.0,2],[26.25,1.0,26.210957845052082,1.0,26.38664347330729,1.0,2],[26.599999999999998,1.0,26.463356526692706,1.0,26.63253377278646,1.0,2],[26.683333333333334,1.0,26.650799560546876,1.0,26.722375488281248,1.0,2],[26.78333333333333,1.0,26.744291178385417,1.0,26.84840291341146,1.0,2],[26.95,1.0,26.884930419921876,1.0,26.982533772786457,1.0,2],[27.03333333333333,1.0,27.000799560546874,1.0,27.065867106119793,1.0,2],[27.116666666666667,1.0,27.08413289388021,1.0,27.240297444661458,1.0,2],[27.433333333333334,1.0,27.309702555338543,1.0,27.46586710611979,1.0,2],[27.516666666666666,1.0,27.484132893880208,1.0,27.555708821614584,1.0,2],[27.616666666666667,1.0,27.57762451171875,1.0,27.68173624674479,1.0,2],[27.78333333333333,1.0,27.718263753255208,1.0,27.815867106119793,1.0,2],[27.866666666666667,1.0,27.83413289388021,1.0,27.899200439453125,1.0,2],[27.95,1.0,27.91746622721354,1.0,27.982533772786457,1.0,2],[28.03333333333333,1.0,28.000799560546874,1.0,28.065867106119793,1.0,2],[28.116666666666667,1.0,28.08413289388021,1.0,28.279337565104168,1.0,2],[31.75,1.0,31.5873291015625,1.0,31.782533772786458,1.0,2],[31.833333333333332,1.0,31.800799560546874,1.0,31.86586710611979,1.0,2],[31.916666666666668,1.0,31.884132893880206,1.0,32.05331013997396,1.0,2],[32.266666666666666,1.0,32.13002319335938,1.0,32.299200439453124,1.0,2],[32.35,1.0,32.317466227213544,1.0,32.38253377278646,1.0,2],[32.43333333333333,1.0,32.40079956054687,1.0,32.4788818359375,1.0,2],[32.55,1.0,32.504451497395834,1.0,32.582533772786455,1.0,2],[32.63333333333333,1.0,32.600799560546875,1.0,32.66586710611979,1.0,2],[32.71666666666667,1.0,32.68413289388021,1.0,32.879337565104166,1.0,2],[33.13333333333333,1.0,32.970662434895836,1.0,33.16586710611979,1.0,2],[33.21666666666667,1.0,33.18413289388021,1.0,33.249200439453126,1.0,2],[33.3,1.0,33.26746622721354,1.0,33.36506958007813,1.0,2],[33.46666666666667,1.0,33.40159708658854,1.0,33.499200439453126,1.0,2],[33.55,1.0,33.51746622721354,1.0,33.582533772786455,1.0,2],[33.63333333333333,1.0,33.600799560546875,1.0,33.67237548828125,1.0,2],[33.733333333333334,1.0,33.69429117838541,1.0,33.76586710611979,1.0,2],[33.81666666666666,1.0,33.784132893880205,1.0,33.855708821614584,1.0,2],[33.916666666666664,1.0,33.87762451171875,1.0,33.94920043945312,1.0,2],[34.0,1.0,33.96746622721354,1.0,34.1626708984375,1.0,2],[37.38333333333333,1.0,37.220662434895836,1.0,37.415869140625,1.0,2],[37.46666666666667,1.0,37.434130859375,1.0,37.499202473958334,1.0,2],[37.55,1.0,37.51746419270833,1.0,37.69315185546875,1.0,2],[37.916666666666664,1.0,37.77351481119791,1.0,37.94920247395833,1.0,2],[38.0,1.0,37.967464192708334,1.0,38.032535807291666,1.0,2],[38.083333333333336,1.0,38.05079752604166,1.0,38.10285237630208,1.0,2],[38.13333333333333,1.0,38.11381429036458,1.0,38.14634602864583,1.0,2],[38.166666666666664,1.0,38.15365397135417,1.0,38.205708821614586,1.0,2],[38.266666666666666,1.0,38.22762451171875,1.0,38.29920247395833,1.0,2],[38.35,1.0,38.317464192708336,1.0,38.38253580729167,1.0,2],[38.43333333333333,1.0,38.400797526041664,1.0,38.56997884114583,1.0,2],[38.78333333333333,1.0,38.646687825520836,1.0,38.815869140625,1.0,2],[38.86666666666667,1.0,38.834130859375,1.0,38.89920247395833,1.0,2],[38.95,1.0,38.91746419270833,1.0,39.002054850260414,1.0,2],[39.083333333333336,1.0,39.03127848307292,1.0,39.115869140625,1.0,2],[39.166666666666664,1.0,39.134130859375,1.0,39.19920247395833,1.0,2],[39.25,1.0,39.217464192708334,1.0,39.27602945963542,1.0,2],[39.31666666666666,1.0,39.29063720703125,1.0,39.349202473958336,1.0,2],[39.4,1.0,39.36746419270833,1.0,39.432535807291664,1.0,2],[39.483333333333334,1.0,39.45079752604167,1.0,39.515869140625,1.0,2]],0],[[[23.466666666666665,1.0,22.451597086588542,1.0,24.48173624674479,1.0,2],[26.066666666666666,1.0,25.903995768229166,1.0,26.099200439453124,1.0,2],[26.15,1.0,26.11746622721354,1.0,26.189042154947916,1.0,2],[26.25,1.0,26.210957845052082,1.0,26.38664347330729,1.0,2],[26.599999999999998,1.0,26.463356526692706,1.0,26.63253377278646,1.0,2],[26.683333333333334,1.0,26.650799560546876,1.0,26.722375488281248,1.0,2],[26.78333333333333,1.0,26.744291178385417,1.0,26.84840291341146,1.0,2],[26.95,1.0,26.884930419921876,1.0,26.982533772786457,1.0,2],[27.03333333333333,1.0,27.000799560546874,1.0,27.065867106119793,1.0,2],[27.116666666666667,1.0,27.08413289388021,1.0,27.240297444661458,1.0,2],[27.433333333333334,1.0,27.309702555338543,1.0,27.46586710611979,1.0,2],[27.516666666666666,1.0,27.484132893880208,1.0,27.555708821614584,1.0,2],[27.616666666666667,1.0,27.57762451171875,1.0,27.68173624674479,1.0,2],[27.78333333333333,1.0,27.718263753255208,1.0,27.815867106119793,1.0,2],[27.866666666666667,1.0,27.83413289388021,1.0,27.899200439453125,1.0,2],[27.95,1.0,27.91746622721354,1.0,27.982533772786457,1.0,2],[28.03333333333333,1.0,28.000799560546874,1.0,28.065867106119793,1.0,2],[28.116666666666667,1.0,28.08413289388021,1.0,28.279337565104168,1.0,2],[31.75,1.0,31.5873291015625,1.0,31.782533772786458,1.0,2],[31.833333333333332,1.0,31.800799560546874,1.0,31.86586710611979,1.0,2],[31.916666666666668,1.0,31.884132893880206,1.0,32.05331013997396,1.0,2],[32.266666666666666,1.0,32.13002319335938,1.0,32.299200439453124,1.0,2],[32.35,1.0,32.317466227213544,1.0,32.38253377278646,1.0,2],[32.43333333333333,1.0,32.40079956054687,1.0,32.4788818359375,1.0,2],[32.55,1.0,32.504451497395834,1.0,32.582533772786455,1.0,2],[32.63333333333333,1.0,32.600799560546875,1.0,32.66586710611979,1.0,2],[32.71666666666667,1.0,32.68413289388021,1.0,32.879337565104166,1.0,2],[33.13333333333333,1.0,32.970662434895836,1.0,33.16586710611979,1.0,2],[33.21666666666667,1.0,33.18413289388021,1.0,33.249200439453126,1.0,2],[33.3,1.0,33.26746622721354,1.0,33.36506958007813,1.0,2],[33.46666666666667,1.0,33.40159708658854,1.0,33.499200439453126,1.0,2],[33.55,1.0,33.51746622721354,1.0,33.582533772786455,1.0,2],[33.63333333333333,1.0,33.600799560546875,1.0,33.67237548828125,1.0,2],[33.733333333333334,1.0,33.69429117838541,1.0,33.76586710611979,1.0,2],[33.81666666666666,1.0,33.784132893880205,1.0,33.855708821614584,1.0,2],[33.916666666666664,1.0,33.87762451171875,1.0,33.94920043945312,1.0,2],[34.0,1.0,33.96746622721354,1.0,34.1626708984375,1.0,2],[37.38333333333333,1.0,37.220662434895836,1.0,37.415869140625,1.0,2],[37.46666666666667,1.0,37.434130859375,1.0,37.499202473958334,1.0,2],[37.55,1.0,37.51746419270833,1.0,37.69315185546875,1.0,2],[37.916666666666664,1.0,37.77351481119791,1.0,37.94920247395833,1.0,2],[38.0,1.0,37.967464192708334,1.0,38.032535807291666,1.0,2],[38.083333333333336,1.0,38.05079752604166,1.0,38.10285237630208,1.0,2],[38.13333333333333,1.0,38.11381429036458,1.0,38.14634602864583,1.0,2],[38.166666666666664,1.0,38.15365397135417,1.0,38.205708821614586,1.0,2],[38.266666666666666,1.0,38.22762451171875,1.0,38.29920247395833,1.0,2],[38.35,1.0,38.317464192708336,1.0,38.38253580729167,1.0,2],[38.43333333333333,1.0,38.400797526041664,1.0,38.56997884114583,1.0,2],[38.78333333333333,1.0,38.646687825520836,1.0,38.815869140625,1.0,2],[38.86666666666667,1.0,38.834130859375,1.0,38.89920247395833,1.0,2],[38.95,1.0,38.91746419270833,1.0,39.002054850260414,1.0,2],[39.083333333333336,1.0,39.03127848307292,1.0,39.115869140625,1.0,2],[39.166666666666664,1.0,39.134130859375,1.0,39.19920247395833,1.0,2],[39.25,1.0,39.217464192708334,1.0,39.27602945963542,1.0,2],[39.31666666666666,1.0,39.29063720703125,1.0,39.349202473958336,1.0,2],[39.4,1.0,39.36746419270833,1.0,39.432535807291664,1.0,2],[39.483333333333334,1.0,39.45079752604167,1.0,39.515869140625,1.0,2]],0]]}],\"Dust\":[{\"rotation_euler\":[[[[58.833333333333336,0.0,58.82682698567708,0.0,58.839839680989584,0.0,2],[58.85,0.0,58.843493652343746,0.0,58.88253580729167,0.0,2],[119.8,0.0,96.0044189453125,0.0,143.59557291666667,0.0,2]],0],[[[58.833333333333336,0.0,58.82682698567708,0.0,58.839839680989584,0.0,2],[58.85,0.0,58.843493652343746,0.0,58.88253580729167,0.0,2],[119.8,0.0,96.0044189453125,0.0,143.59557291666667,0.0,2]],0],[[[58.833333333333336,0.0,58.82682698567708,0.0,58.839839680989584,0.0,2],[58.85,0.0,58.843493652343746,0.0,58.88253580729167,0.0,2],[119.8,0.0,96.0044189453125,0.0,143.59557291666667,0.0,2]],0]],\"location\":[[[[0.0,-5.0,-45.62609049479167,-5.0,45.62609049479167,-5.0,2],[116.86666666666666,-5.0,111.14063313802083,-5.0,118.01187337239583,-5.0,2],[119.8,-5.0,118.65479329427083,-5.0,120.94520670572916,-5.0,2]],0],[[[0.0,0.0,-22.969209798177083,0.0,22.969209798177083,0.0,2],[58.833333333333336,0.0,58.80079752604166,0.0,58.839839680989584,0.0,2],[58.85,0.0,58.843493652343746,0.0,58.88253580729167,0.0,2],[116.86666666666666,0.0,111.14063313802083,0.0,118.01187337239583,0.0,2],[119.8,0.0,118.65479329427083,0.0,120.94520670572916,0.0,2]],0],[[[0.0,-6.67572021484375e-06,-22.969209798177083,-6.67572021484375e-06,22.969209798177083,-6.67572021484375e-06,2],[58.833333333333336,-6.67572021484375e-06,58.80079752604166,-6.67572021484375e-06,58.839839680989584,-6.67572021484375e-06,2],[58.85,1.0,58.843493652343746,1.0,58.88253580729167,1.0,2],[116.86666666666666,1.0,111.14063313802083,1.0,118.01187337239583,1.0,2],[119.8,0.0,118.65479329427083,0.0,120.94520670572916,0.0,2]],0]],\"scale\":[[[[58.833333333333336,1.0,58.82682698567708,1.0,58.839839680989584,1.0,2],[58.85,1.0,58.843493652343746,1.0,58.88253580729167,1.0,2],[119.8,1.0,96.0044189453125,1.0,143.59557291666667,1.0,2]],0],[[[58.833333333333336,1.0,58.82682698567708,1.0,58.839839680989584,1.0,2],[58.85,1.0,58.843493652343746,1.0,58.88253580729167,1.0,2],[119.8,1.0,96.0044189453125,1.0,143.59557291666667,1.0,2]],0],[[[58.833333333333336,1.0,58.82682698567708,1.0,58.839839680989584,1.0,2],[58.85,1.0,58.843493652343746,1.0,58.88253580729167,1.0,2],[119.8,1.0,96.0044189453125,1.0,143.59557291666667,1.0,2]],0]]}],\"Circle2\":[{\"rotation_euler\":[[[[104.68333333333334,0.0,103.72032063802084,0.0,105.64634602864584,0.0,2],[107.14999999999999,0.0,106.18698730468749,0.0,107.56643880208333,0.0,2],[108.21666666666667,0.0,107.80022786458333,0.0,108.73070475260417,0.0,2],[109.53333333333333,0.0,109.27305501302084,0.0,109.58539225260417,0.0,2],[109.66666666666667,0.0,109.61460774739584,0.0,109.7968017578125,0.0,2],[110.0,0.0,109.86986490885417,0.0,110.06507161458333,0.0,2],[110.16666666666667,0.0,110.10159505208333,0.0,110.2707763671875,0.0,2],[110.43333333333334,0.0,110.3292236328125,0.0,110.9538818359375,0.0,2],[112.56666666666666,0.0,111.7337890625,0.0,115.51427408854167,0.0,2],[120.11666666666666,0.0,117.16905924479167,0.0,123.06427408854167,0.0,2]],0],[[[104.68333333333334,0.0,103.72032063802084,0.0,105.64634602864584,0.0,2],[107.14999999999999,0.0,106.18698730468749,0.0,107.56643880208333,0.0,2],[108.21666666666667,0.0,107.80022786458333,0.0,108.73070475260417,0.0,2],[109.53333333333333,0.0,109.27305501302084,0.0,109.58539225260417,0.0,2],[109.66666666666667,0.0,109.61460774739584,0.0,109.7968017578125,0.0,2],[110.0,0.0,109.86986490885417,0.0,110.06507161458333,0.0,2],[110.16666666666667,0.0,110.10159505208333,0.0,110.2707763671875,0.0,2],[110.43333333333334,0.0,110.3292236328125,0.0,110.9538818359375,0.0,2],[112.56666666666666,0.0,111.7337890625,0.0,115.51427408854167,0.0,2],[120.11666666666666,0.0,117.16905924479167,0.0,123.06427408854167,0.0,2]],0],[[[104.68333333333334,0.0,103.72032063802084,0.0,105.64634602864584,0.0,2],[107.14999999999999,0.0,106.18698730468749,0.0,107.56643880208333,0.0,2],[108.21666666666667,0.0,107.80022786458333,0.0,108.73070475260417,0.0,2],[109.53333333333333,0.0,109.27305501302084,0.0,109.58539225260417,0.0,2],[109.66666666666667,0.0,109.61460774739584,0.0,109.7968017578125,0.0,2],[110.0,0.0,109.86986490885417,0.0,110.06507161458333,0.0,2],[110.16666666666667,0.0,110.10159505208333,0.0,110.2707763671875,0.0,2],[110.43333333333334,0.0,110.3292236328125,0.0,110.9538818359375,0.0,2],[112.56666666666666,0.0,111.7337890625,0.0,115.51427408854167,0.0,2],[120.11666666666666,0.0,117.16905924479167,0.0,123.06427408854167,0.0,2]],0]],\"location\":[[[[104.68333333333334,-5.0,103.72032063802084,-5.0,105.64634602864584,-5.0,2],[107.14999999999999,-5.0,106.18698730468749,-5.0,107.56643880208333,-5.0,2],[108.21666666666667,-5.0,107.80022786458333,-5.0,108.73070475260417,-5.0,2],[109.53333333333333,-5.0,109.27305501302084,-5.0,109.58539225260417,-5.0,2],[109.66666666666667,-5.0,109.61460774739584,-5.0,109.7968017578125,-5.0,2],[110.0,-5.0,109.86986490885417,-5.0,110.06507161458333,-5.0,2],[110.16666666666667,-5.0,110.10159505208333,-5.0,110.2707763671875,-5.0,2],[110.43333333333334,-5.0,110.3292236328125,-5.0,110.9538818359375,-5.0,2],[112.56666666666666,-5.0,111.7337890625,-5.0,115.51427408854167,-5.0,2],[120.11666666666666,-5.0,117.16905924479167,-5.0,123.06427408854167,-5.0,2]],0],[[[104.68333333333334,-3.0,103.72032063802084,-3.0,105.64634602864584,-3.0,2],[107.14999999999999,-3.0,106.18698730468749,-3.0,107.56643880208333,-3.0,2],[108.21666666666667,-3.0,107.80022786458333,-3.0,108.73070475260417,-3.0,2],[109.53333333333333,-3.0,109.27305501302084,-3.0,109.58539225260417,-3.0,2],[109.66666666666667,-3.0,109.61460774739584,-3.0,109.7968017578125,-3.0,2],[110.0,-3.0,109.86986490885417,-3.0,110.06507161458333,-3.0,2],[110.16666666666667,-3.0,110.10159505208333,-3.0,110.2707763671875,-3.0,2],[110.43333333333334,-3.0,110.3292236328125,-3.0,110.9538818359375,-3.0,2],[112.56666666666666,-3.0,111.7337890625,-3.0,115.51427408854167,-3.0,2],[120.11666666666666,-3.0,117.16905924479167,-3.0,123.06427408854167,-3.0,2]],0],[[[104.68333333333334,-0.1904849261045456,103.72032063802084,-0.1904849261045456,105.64634602864584,-0.1904849261045456,2],[107.14999999999999,0.0,106.18698730468749,-0.12466571480035782,107.56643880208333,0.05390949919819832,2],[108.21666666666667,0.19379571080207825,107.80022786458333,0.19379571080207825,108.73070475260417,0.19379571080207825,2],[109.53333333333333,0.19379571080207825,109.27305501302084,0.19379571080207825,109.58539225260417,0.19379571080207825,2],[109.66666666666667,0.27662575244903564,109.61460774739584,0.27662575244903564,109.7968017578125,0.27662575244903564,2],[110.0,0.19379571080207825,109.86986490885417,0.19379571080207825,110.06507161458333,0.19379571080207825,2],[110.16666666666667,0.27662575244903564,110.10159505208333,0.27662575244903564,110.2707763671875,0.27662575244903564,2],[110.43333333333334,0.19379571080207825,110.3292236328125,0.19379571080207825,110.9538818359375,0.19379571080207825,2],[112.56666666666666,0.3754868507385254,111.7337890625,0.19379571080207825,115.51427408854167,1.0185034275054932,2],[120.11666666666666,3.310706615447998,117.16905924479167,3.310706615447998,123.06427408854167,3.310706615447998,2]],0]],\"scale\":[[[[104.68333333333334,1.0,103.72032063802084,1.0,105.64634602864584,1.0,2],[107.14999999999999,1.0,106.18698730468749,1.0,107.56643880208333,1.0,2],[108.21666666666667,1.0,107.80022786458333,1.0,108.73070475260417,1.0,2],[109.53333333333333,1.0,109.27305501302084,1.0,109.58539225260417,1.0,2],[109.66666666666667,1.0,109.61460774739584,1.0,109.7968017578125,1.0,2],[110.0,1.0,109.86986490885417,1.0,110.06507161458333,1.0,2],[110.16666666666667,1.0,110.10159505208333,1.0,110.2707763671875,1.0,2],[110.43333333333334,1.0,110.3292236328125,1.0,110.9538818359375,1.0,2],[112.56666666666666,1.0,111.7337890625,1.0,115.51427408854167,1.0,2],[120.11666666666666,1.0,117.16905924479167,1.0,123.06427408854167,1.0,2]],0],[[[104.68333333333334,1.0,103.72032063802084,1.0,105.64634602864584,1.0,2],[107.14999999999999,1.0,106.18698730468749,1.0,107.56643880208333,1.0,2],[108.21666666666667,1.0,107.80022786458333,1.0,108.73070475260417,1.0,2],[109.53333333333333,1.0,109.27305501302084,1.0,109.58539225260417,1.0,2],[109.66666666666667,1.0,109.61460774739584,1.0,109.7968017578125,1.0,2],[110.0,1.0,109.86986490885417,1.0,110.06507161458333,1.0,2],[110.16666666666667,1.0,110.10159505208333,1.0,110.2707763671875,1.0,2],[110.43333333333334,1.0,110.3292236328125,1.0,110.9538818359375,1.0,2],[112.56666666666666,1.0,111.7337890625,1.0,115.51427408854167,1.0,2],[120.11666666666666,1.0,117.16905924479167,1.0,123.06427408854167,1.0,2]],0],[[[104.68333333333334,1.0,103.72032063802084,1.0,105.64634602864584,1.0,2],[107.14999999999999,1.0,106.18698730468749,1.0,107.56643880208333,1.0,2],[108.21666666666667,1.0,107.80022786458333,1.0,108.73070475260417,1.0,2],[109.53333333333333,1.0,109.27305501302084,1.0,109.58539225260417,1.0,2],[109.66666666666667,1.0,109.61460774739584,1.0,109.7968017578125,1.0,2],[110.0,1.0,109.86986490885417,1.0,110.06507161458333,1.0,2],[110.16666666666667,1.0,110.10159505208333,1.0,110.2707763671875,1.0,2],[110.43333333333334,1.0,110.3292236328125,1.0,110.9538818359375,1.0,2],[112.56666666666666,1.0,111.7337890625,1.0,115.51427408854167,1.0,2],[120.11666666666666,1.0,117.16905924479167,1.0,123.06427408854167,1.0,2]],0]]}],\"Rideau\":[{\"rotation_euler\":[[[[0.0,0.0,-0.4684938112894694,0.0,0.4684938112894694,0.0,2],[1.2,0.0,0.7315062204996745,0.0,3.542469024658203,0.0,2],[158.73333333333332,0.0,97.23050944010417,0.0,220.23616536458334,0.0,2]],0],[[[0.0,0.0,-0.4684938112894694,0.0,0.4684938112894694,0.0,2],[1.2,0.0,0.7315062204996745,0.0,3.542469024658203,0.0,2],[158.73333333333332,0.0,97.23050944010417,0.0,220.23616536458334,0.0,2]],0],[[[0.0,0.0,-0.4684938112894694,0.0,0.4684938112894694,0.0,2],[1.2,0.0,0.7315062204996745,0.0,3.542469024658203,0.0,2],[158.73333333333332,0.0,97.23050944010417,0.0,220.23616536458334,0.0,2]],0]],\"location\":[[[[0.0,3.0,-0.4684938112894694,3.0,0.4684938112894694,3.0,2],[1.2,3.0,0.7315062204996745,3.0,3.542469024658203,3.0,2],[157.93333333333334,3.0,156.3716796875,3.0,158.24567057291665,3.0,2],[158.73333333333332,3.0,158.42099609375,3.0,159.04567057291666,3.0,2]],0],[[[0.0,3.0,-0.4684938112894694,3.0,0.4684938112894694,3.0,2],[1.2,3.0,0.7315062204996745,3.0,3.542469024658203,3.0,2],[157.93333333333334,3.0,156.3716796875,3.0,158.24567057291665,3.0,2],[158.73333333333332,3.0,158.42099609375,3.0,159.04567057291666,3.0,2]],0],[[[0.0,0.0,-0.4684938112894694,0.0,0.4684938112894694,0.0,2],[1.2,1.0,0.7315062204996745,1.0,3.542469024658203,1.0,2],[157.93333333333334,1.0,156.3716796875,1.0,158.24567057291665,1.0,2],[158.73333333333332,0.0,158.42099609375,0.0,159.04567057291666,0.0,2]],0]],\"scale\":[[[[0.0,1.0,-0.4684938112894694,1.0,0.4684938112894694,1.0,2],[1.2,1.0,0.7315062204996745,1.0,3.542469024658203,1.0,2],[158.73333333333332,1.0,97.23050944010417,1.0,220.23616536458334,1.0,2]],0],[[[0.0,1.0,-0.4684938112894694,1.0,0.4684938112894694,1.0,2],[1.2,1.0,0.7315062204996745,1.0,3.542469024658203,1.0,2],[158.73333333333332,1.0,97.23050944010417,1.0,220.23616536458334,1.0,2]],0],[[[0.0,1.0,-0.4684938112894694,1.0,0.4684938112894694,1.0,2],[1.2,1.0,0.7315062204996745,1.0,3.542469024658203,1.0,2],[158.73333333333332,1.0,97.23050944010417,1.0,220.23616536458334,1.0,2]],0]]}],\"Credits\":[{\"rotation_euler\":[[[[134.83333333333334,0.0,134.24771321614583,0.0,135.41895345052083,0.0,2],[136.33333333333334,0.0,135.74771321614583,0.0,139.26142578125,0.0,2],[144.28333333333333,0.0,141.17955729166667,0.0,147.387109375,0.0,2]],0],[[[134.83333333333334,0.0,134.24771321614583,0.0,135.41895345052083,0.0,2],[136.33333333333334,0.0,135.74771321614583,0.0,139.26142578125,0.0,2],[144.28333333333333,0.0,141.17955729166667,0.0,147.387109375,0.0,2]],0],[[[134.83333333333334,0.0,134.24771321614583,0.0,135.41895345052083,0.0,2],[136.33333333333334,0.0,135.74771321614583,0.0,139.26142578125,0.0,2],[144.28333333333333,0.0,141.17955729166667,0.0,147.387109375,0.0,2]],0]],\"location\":[[[[134.83333333333334,2.0,134.24771321614583,2.0,135.41895345052083,2.0,2],[136.33333333333334,2.0,135.74771321614583,2.0,139.092236328125,2.0,2],[143.4,2.0,141.67568359375,2.0,143.74485677083334,2.0,2],[144.28333333333333,2.0,143.9384765625,2.0,144.62819010416666,2.0,2]],0],[[[134.83333333333334,2.0,134.24771321614583,2.0,135.41895345052083,2.0,2],[136.33333333333334,2.0,135.74771321614583,2.0,139.092236328125,2.0,2],[143.4,2.0,141.67568359375,2.0,143.74485677083334,2.0,2],[144.28333333333333,2.0,143.9384765625,2.0,144.62819010416666,2.0,2]],0],[[[134.83333333333334,0.0,134.24771321614583,0.0,135.41895345052083,0.0,2],[136.33333333333334,1.0,135.74771321614583,1.0,139.092236328125,1.0,2],[143.4,1.0,141.67568359375,1.0,143.74485677083334,1.0,2],[144.28333333333333,0.0,143.9384765625,0.0,144.62819010416666,0.0,2]],0]],\"scale\":[[[[134.83333333333334,1.0,134.24771321614583,1.0,135.41895345052083,1.0,2],[136.33333333333334,1.0,135.74771321614583,1.0,139.26142578125,1.0,2],[144.28333333333333,1.0,141.17955729166667,1.0,147.387109375,1.0,2]],0],[[[134.83333333333334,1.0,134.24771321614583,1.0,135.41895345052083,1.0,2],[136.33333333333334,1.0,135.74771321614583,1.0,139.26142578125,1.0,2],[144.28333333333333,1.0,141.17955729166667,1.0,147.387109375,1.0,2]],0],[[[134.83333333333334,1.0,134.24771321614583,1.0,135.41895345052083,1.0,2],[136.33333333333334,1.0,135.74771321614583,1.0,139.26142578125,1.0,2],[144.28333333333333,1.0,141.17955729166667,1.0,147.387109375,1.0,2]],0]]}],\"Scratching\":[{\"rotation_euler\":[[[[23.0,0.0,21.2886962890625,0.0,24.7113037109375,0.0,2],[27.383333333333333,0.0,25.724084472656248,0.0,27.71518351236979,0.0,1],[28.233333333333334,0.0,28.038126627604168,0.0,28.27237548828125,0.0,1],[28.333333333333332,0.0,28.294291178385418,0.0,28.5285400390625,0.0,1],[33.38333333333333,0.0,32.374770100911455,0.0,33.58504638671875,0.0,1],[33.9,0.0,33.69828694661458,0.0,34.0626708984375,0.0,1],[34.31666666666666,0.0,34.153995768229166,0.0,35.130025227864586,0.0,2],[37.733333333333334,0.0,36.39942626953125,0.0,39.067240397135414,0.0,1]],0],[[[23.0,0.0,21.2886962890625,0.0,24.7113037109375,0.0,2],[27.383333333333333,0.0,25.724084472656248,0.0,27.71518351236979,0.0,1],[28.233333333333334,0.0,28.038126627604168,0.0,28.27237548828125,0.0,1],[28.333333333333332,0.0,28.294291178385418,0.0,28.5285400390625,0.0,1],[33.38333333333333,0.0,32.374770100911455,0.0,33.58504638671875,0.0,1],[33.9,0.0,33.69828694661458,0.0,34.0626708984375,0.0,1],[34.31666666666666,0.0,34.153995768229166,0.0,35.130025227864586,0.0,2],[37.733333333333334,0.0,36.39942626953125,0.0,39.067240397135414,0.0,1]],0],[[[23.0,0.0,21.2886962890625,0.0,24.7113037109375,0.0,2],[27.383333333333333,0.0,25.724084472656248,0.0,27.71518351236979,0.0,1],[28.233333333333334,0.0,28.038126627604168,0.0,28.27237548828125,0.0,1],[28.333333333333332,0.0,28.294291178385418,0.0,28.5285400390625,0.0,1],[33.38333333333333,0.0,32.374770100911455,0.0,33.58504638671875,0.0,1],[33.9,0.0,33.69828694661458,0.0,34.0626708984375,0.0,1],[34.31666666666666,0.0,34.153995768229166,0.0,35.130025227864586,0.0,2],[37.733333333333334,0.0,36.39942626953125,0.0,39.067240397135414,0.0,1]],0]],\"location\":[[[[22.566666666666666,-2.0,22.39748738606771,-2.0,22.735845947265624,-2.0,1],[23.0,-2.0,22.830820719401043,-2.0,23.845892333984374,-2.0,2],[27.383333333333333,-2.0,25.75661824544271,-2.0,27.708677164713542,-2.0,1],[28.216666666666665,-2.0,28.184132893880207,-2.0,28.223173014322917,-2.0,1],[28.233333333333334,-2.0,28.226826985677082,-2.0,28.265867106119792,-2.0,1],[28.333333333333332,-2.0,28.294291178385418,-2.0,28.5285400390625,-2.0,1],[33.38333333333333,-2.0,32.40730387369791,-2.0,33.5785400390625,-2.0,1],[33.88333333333333,-2.0,33.850799560546875,-2.0,33.88983968098958,-2.0,1],[33.9,-2.0,33.89349365234375,-2.0,33.932533772786456,-2.0,1],[34.31666666666666,-2.0,34.153995768229166,-2.0,35.130025227864586,-2.0,2],[37.733333333333334,-2.0,36.39942626953125,-2.0,39.067240397135414,-2.0,1]],0],[[[22.566666666666666,-1.0,22.39748738606771,-1.0,22.735845947265624,-1.0,1],[23.0,-1.0,22.830820719401043,-1.0,23.845892333984374,-1.0,2],[27.383333333333333,-1.0,25.75661824544271,-1.0,27.708677164713542,-1.0,1],[28.216666666666665,-1.0,28.184132893880207,-1.0,28.223173014322917,-1.0,1],[28.233333333333334,-1.0,28.226826985677082,-1.0,28.265867106119792,-1.0,1],[28.333333333333332,-1.0,28.294291178385418,-1.0,28.5285400390625,-1.0,1],[33.38333333333333,-1.0,32.40730387369791,-1.0,33.5785400390625,-1.0,1],[33.88333333333333,-1.0,33.850799560546875,-1.0,33.88983968098958,-1.0,1],[33.9,-1.0,33.89349365234375,-1.0,33.932533772786456,-1.0,1],[34.31666666666666,-1.0,34.153995768229166,-1.0,35.130025227864586,-1.0,2],[37.733333333333334,-1.0,36.39942626953125,-1.0,39.067240397135414,-1.0,1]],0],[[[22.566666666666666,0.0,22.39748738606771,0.0,22.735845947265624,0.0,1],[23.0,0.6755656003952026,22.830820719401043,0.6106784343719482,23.845892333984374,1.0,2],[27.383333333333333,1.0,25.75661824544271,1.0,27.708677164713542,1.0,1],[28.216666666666665,1.0,28.184132893880207,1.0,28.223173014322917,1.0,1],[28.233333333333334,0.0,28.226826985677082,0.0,28.265867106119792,0.0,1],[28.333333333333332,0.3616885840892792,28.294291178385418,0.2886175215244293,28.5285400390625,0.727043867111206,1],[33.38333333333333,1.0,32.40730387369791,1.0,33.5785400390625,1.0,1],[33.88333333333333,1.0,33.850799560546875,1.0,33.88983968098958,1.0,1],[33.9,0.0,33.89349365234375,0.0,33.932533772786456,0.0,1],[34.31666666666666,0.5219523906707764,34.153995768229166,0.4263433516025543,35.130025227864586,1.0,2],[37.733333333333334,1.0,36.39942626953125,1.0,39.067240397135414,1.0,1]],0]],\"scale\":[[[[23.0,1.0,21.2886962890625,1.0,24.7113037109375,1.0,2],[27.383333333333333,1.0,25.724084472656248,1.0,27.71518351236979,1.0,1],[28.233333333333334,1.0,28.038126627604168,1.0,28.27237548828125,1.0,1],[28.333333333333332,1.0,28.294291178385418,1.0,28.5285400390625,1.0,1],[33.38333333333333,1.0,32.374770100911455,1.0,33.58504638671875,1.0,1],[33.9,1.0,33.69828694661458,1.0,34.0626708984375,1.0,1],[34.31666666666666,1.0,34.153995768229166,1.0,35.130025227864586,1.0,2],[37.733333333333334,1.0,36.39942626953125,1.0,39.067240397135414,1.0,1]],0],[[[23.0,1.0,21.2886962890625,1.0,24.7113037109375,1.0,2],[27.383333333333333,1.0,25.724084472656248,1.0,27.71518351236979,1.0,1],[28.233333333333334,1.0,28.038126627604168,1.0,28.27237548828125,1.0,1],[28.333333333333332,1.0,28.294291178385418,1.0,28.5285400390625,1.0,1],[33.38333333333333,1.0,32.374770100911455,1.0,33.58504638671875,1.0,1],[33.9,1.0,33.69828694661458,1.0,34.0626708984375,1.0,1],[34.31666666666666,1.0,34.153995768229166,1.0,35.130025227864586,1.0,2],[37.733333333333334,1.0,36.39942626953125,1.0,39.067240397135414,1.0,1]],0],[[[23.0,1.0,21.2886962890625,1.0,24.7113037109375,1.0,2],[27.383333333333333,1.0,25.724084472656248,1.0,27.71518351236979,1.0,1],[28.233333333333334,1.0,28.038126627604168,1.0,28.27237548828125,1.0,1],[28.333333333333332,1.0,28.294291178385418,1.0,28.5285400390625,1.0,1],[33.38333333333333,1.0,32.374770100911455,1.0,33.58504638671875,1.0,1],[33.9,1.0,33.69828694661458,1.0,34.0626708984375,1.0,1],[34.31666666666666,1.0,34.153995768229166,1.0,35.130025227864586,1.0,2],[37.733333333333334,1.0,36.39942626953125,1.0,39.067240397135414,1.0,1]],0]]}],\"EggBreak\":[{\"rotation_euler\":[[[[0.0,0.0,-1.5941802978515625,0.0,1.5941802978515625,0.0,2]],0],[[[0.0,0.0,-1.5941802978515625,0.0,1.5941802978515625,0.0,2]],0],[[[0.0,0.0,-1.5941802978515625,0.0,1.5941802978515625,0.0,2]],0]],\"location\":[[[[0.0,-1.0,-1.5941802978515625,-1.0,1.5941802978515625,-1.0,2]],0],[[[0.0,0.0,-1.5941802978515625,0.0,1.5941802978515625,0.0,2]],0],[[[0.0,0.0,-1.5941802978515625,0.0,1.5941802978515625,0.0,2]],0]],\"scale\":[[[[0.0,1.0,-1.5941802978515625,1.0,1.5941802978515625,1.0,2]],0],[[[0.0,1.0,-1.5941802978515625,1.0,1.5941802978515625,1.0,2]],0],[[[0.0,1.0,-1.5941802978515625,1.0,1.5941802978515625,1.0,2]],0]]}],\"Points\":[{\"rotation_euler\":[[[[0.0,0.0,-2.7198666890462238,0.0,2.7198666890462238,0.0,2],[6.966666666666667,0.0,4.246799977620443,0.0,20.565999348958332,0.0,2],[120.81666666666666,0.0,76.36831868489583,0.0,165.26500651041667,0.0,2]],0],[[[0.0,0.0,-2.7198666890462238,0.0,2.7198666890462238,0.0,2],[6.966666666666667,0.0,4.246799977620443,0.0,20.565999348958332,0.0,2],[120.81666666666666,0.0,76.36831868489583,0.0,165.26500651041667,0.0,2]],0],[[[0.0,0.0,-2.7198666890462238,0.0,2.7198666890462238,0.0,2],[6.966666666666667,0.0,4.246799977620443,0.0,20.565999348958332,0.0,2],[120.81666666666666,0.0,76.36831868489583,0.0,165.26500651041667,0.0,2]],0]],\"location\":[[[[0.0,0.0,-2.6157569885253906,0.0,2.6157569885253906,0.0,2],[6.7,0.0,6.179451497395833,0.0,6.804109700520833,0.0,2],[6.966666666666667,0.0,6.862556966145833,0.0,7.487215169270833,0.0,2],[118.35,0.0,113.53492838541666,0.0,119.3130126953125,0.0,2],[120.81666666666666,0.0,119.85365397135416,0.0,121.77967936197916,0.0,2]],0],[[[0.0,0.0,-2.6157569885253906,0.0,2.6157569885253906,0.0,2],[6.7,0.0,6.179451497395833,0.0,6.804109700520833,0.0,2],[6.966666666666667,0.0,6.862556966145833,0.0,7.487215169270833,0.0,2],[118.35,0.0,113.53492838541666,0.0,119.3130126953125,0.0,2],[120.81666666666666,0.0,119.85365397135416,0.0,121.77967936197916,0.0,2]],0],[[[0.0,0.0,-2.6157569885253906,0.0,2.6157569885253906,0.0,2],[6.7,0.0,6.179451497395833,0.0,6.804109700520833,0.0,2],[6.966666666666667,1.0,6.862556966145833,1.0,7.487215169270833,1.0,2],[118.35,1.0,113.53492838541666,1.0,119.3130126953125,1.0,2],[120.81666666666666,0.0,119.85365397135416,0.0,121.77967936197916,0.0,2]],0]],\"scale\":[[[[0.0,1.0,-2.7198666890462238,1.0,2.7198666890462238,1.0,2],[6.966666666666667,1.0,4.246799977620443,1.0,20.565999348958332,1.0,2],[120.81666666666666,1.0,76.36831868489583,1.0,165.26500651041667,1.0,2]],0],[[[0.0,1.0,-2.7198666890462238,1.0,2.7198666890462238,1.0,2],[6.966666666666667,1.0,4.246799977620443,1.0,20.565999348958332,1.0,2],[120.81666666666666,1.0,76.36831868489583,1.0,165.26500651041667,1.0,2]],0],[[[0.0,1.0,-2.7198666890462238,1.0,2.7198666890462238,1.0,2],[6.966666666666667,1.0,4.246799977620443,1.0,20.565999348958332,1.0,2],[120.81666666666666,1.0,76.36831868489583,1.0,165.26500651041667,1.0,2]],0]]}],\"CameraTilt\":[{\"rotation_euler\":[[[[103.11666666666666,0.0,101.91940104166666,0.0,104.31393229166666,0.0,2]],0],[[[103.11666666666666,0.0,101.91940104166666,0.0,104.31393229166666,0.0,2]],0],[[[103.11666666666666,0.0,101.91940104166666,0.0,104.31393229166666,0.0,2]],0]],\"location\":[[[[103.11666666666666,-6.0,101.91940104166666,-6.0,104.31393229166666,-6.0,2]],0],[[[103.11666666666666,-2.0,101.91940104166666,-2.0,104.31393229166666,-2.0,2]],0],[[[103.11666666666666,0.9478015899658203,101.91940104166666,0.9478015899658203,104.31393229166666,0.9478015899658203,2]],0]],\"scale\":[[[[103.11666666666666,1.0,101.91940104166666,1.0,104.31393229166666,1.0,2]],0],[[[103.11666666666666,1.0,101.91940104166666,1.0,104.31393229166666,1.0,2]],0],[[[103.11666666666666,1.0,101.91940104166666,1.0,104.31393229166666,1.0,2]],0]]}]}");

      _export("__useDefault", __useDefault);

      _export("default", __useDefault);
    }
  };
});
$__System.register("30", [], function (_export, _context) {
  "use strict";

  var __useDefault;

  return {
    setters: [],
    execute: function () {
      _export("__useDefault", __useDefault = "ply\nformat ascii 1.0\ncomment Created by Blender 2.79 (sub 0) - www.blender.org, source file: 'animation.blend'\nelement vertex 6078\nproperty float x\nproperty float y\nproperty float z\nproperty float nx\nproperty float ny\nproperty float nz\nelement face 2026\nproperty list uchar uint vertex_indices\nend_header\n-0.044553 -0.033316 -1.014483 -0.029677 0.028119 -0.999164\n-0.004869 0.086796 -1.012282 -0.029677 0.028119 -0.999164\n0.025844 -0.001463 -1.015678 -0.029677 0.028119 -0.999164\n-0.789314 0.049358 -0.637824 -0.841024 0.017298 -0.540720\n-0.882164 -0.080559 -0.497563 -0.841024 0.017298 -0.540720\n-0.902483 -0.042549 -0.464743 -0.841024 0.017298 -0.540720\n0.720437 -0.549459 -0.459714 0.721631 -0.552982 -0.416485\n0.758851 -0.548309 -0.394682 0.721631 -0.552982 -0.416485\n0.715494 -0.595037 -0.407763 0.721631 -0.552982 -0.416485\n-0.789314 0.049358 -0.637824 -0.839249 0.009570 -0.543663\n-0.902483 -0.042549 -0.464743 -0.839249 0.009570 -0.543663\n-0.813378 0.105143 -0.599693 -0.839249 0.009570 -0.543663\n0.943177 -0.004562 0.377714 0.900145 0.086071 0.427003\n0.865384 0.057223 0.529252 0.900145 0.086071 0.427003\n0.895748 -0.012614 0.479321 0.900145 0.086071 0.427003\n0.085965 0.046808 1.011281 0.039643 0.056450 0.997618\n-0.005494 0.067794 1.013728 0.039643 0.056450 0.997618\n0.054852 0.012734 1.014446 0.039643 0.056450 0.997618\n0.790190 -0.051529 0.636566 0.722318 0.033453 0.690752\n0.671044 0.124594 0.752627 0.722318 0.033453 0.690752\n0.645612 0.054457 0.782618 0.722318 0.033453 0.690752\n0.850548 -0.002703 0.555726 0.798802 0.008467 0.601535\n0.828979 0.068964 0.583360 0.798802 0.008467 0.601535\n0.790190 -0.051529 0.636566 0.798802 0.008467 0.601535\n0.895748 -0.012614 0.479321 0.861260 0.011225 0.508041\n0.865384 0.057223 0.529252 0.861260 0.011225 0.508041\n0.850548 -0.002703 0.555726 0.861260 0.011225 0.508041\n0.085965 0.046808 1.011281 0.049720 0.100829 0.993661\n0.040481 0.167148 1.001346 0.049720 0.100829 0.993661\n-0.005494 0.067794 1.013728 0.049720 0.100829 0.993661\n0.160666 0.056517 1.001631 0.113676 0.107192 0.987718\n0.086074 0.171276 0.997761 0.113676 0.107192 0.987718\n0.085965 0.046808 1.011281 0.113676 0.107192 0.987718\n0.085965 0.046808 1.011281 0.068243 0.107680 0.991841\n0.086074 0.171276 0.997761 0.068243 0.107680 0.991841\n0.040481 0.167148 1.001346 0.068243 0.107680 0.991841\n0.086074 0.171276 0.997761 0.050092 0.279505 0.958837\n0.169946 0.292077 0.958165 0.050092 0.279505 0.958837\n0.040481 0.167148 1.001346 0.050092 0.279505 0.958837\n0.216075 0.055717 0.991201 0.185434 0.103945 0.977144\n0.138304 0.132489 0.997793 0.185434 0.103945 0.977144\n0.160666 0.056517 1.001631 0.185434 0.103945 0.977144\n0.160666 0.056517 1.001631 0.047087 0.064217 0.996824\n0.138304 0.132489 0.997793 0.047087 0.064217 0.996824\n0.086074 0.171276 0.997761 0.047087 0.064217 0.996824\n0.138304 0.132489 0.997793 0.126759 0.171484 0.976998\n0.103455 0.208925 0.988898 0.126759 0.171484 0.976998\n0.086074 0.171276 0.997761 0.126759 0.171484 0.976998\n0.103455 0.208925 0.988898 -0.368530 -0.048422 -0.928354\n0.169946 0.292077 0.958165 -0.368530 -0.048422 -0.928354\n0.086074 0.171276 0.997761 -0.368530 -0.048422 -0.928354\n0.302671 -0.022348 0.969620 0.250796 0.010605 0.967982\n0.273499 0.067145 0.976197 0.250796 0.010605 0.967982\n0.216075 0.055717 0.991201 0.250796 0.010605 0.967982\n0.273499 0.067145 0.976197 0.223345 0.143467 0.964124\n0.138304 0.132489 0.997793 0.223345 0.143467 0.964124\n0.216075 0.055717 0.991201 0.223345 0.143467 0.964124\n0.138304 0.132489 0.997793 0.154317 0.183335 0.970863\n0.125152 0.234534 0.980613 0.154317 0.183335 0.970863\n0.103455 0.208925 0.988898 0.154317 0.183335 0.970863\n0.103455 0.208925 0.988898 -0.016572 -0.334941 -0.942093\n0.167902 0.384335 0.925401 -0.016572 -0.334941 -0.942093\n0.169946 0.292077 0.958165 -0.016572 -0.334941 -0.942093\n0.167902 0.384335 0.925401 -0.373063 0.303149 0.876883\n0.161878 0.423001 0.909471 -0.373063 0.303149 0.876883\n0.169946 0.292077 0.958165 -0.373063 0.303149 0.876883\n0.161878 0.423001 0.909471 0.115459 0.352510 0.928658\n0.055895 0.415235 0.925595 0.115459 0.352510 0.928658\n0.169946 0.292077 0.958165 0.115459 0.352510 0.928658\n0.273499 0.067145 0.976197 0.175873 0.038796 0.983648\n0.227869 0.126452 0.982017 0.175873 0.038796 0.983648\n0.138304 0.132489 0.997793 0.175873 0.038796 0.983648\n0.227869 0.126452 0.982017 0.182589 0.186062 0.965423\n0.125152 0.234534 0.980613 0.182589 0.186062 0.965423\n0.138304 0.132489 0.997793 0.182589 0.186062 0.965423\n0.125152 0.234534 0.980613 0.047230 0.271012 0.961416\n0.133257 0.289995 0.964581 0.047230 0.271012 0.961416\n0.103455 0.208925 0.988898 0.047230 0.271012 0.961416\n0.133257 0.289995 0.964581 -0.221485 0.353970 0.908653\n0.141924 0.358967 0.939825 -0.221485 0.353970 0.908653\n0.103455 0.208925 0.988898 -0.221485 0.353970 0.908653\n0.103455 0.208925 0.988898 -0.292185 -0.228791 -0.928592\n0.141924 0.358967 0.939825 -0.292185 -0.228791 -0.928592\n0.167902 0.384335 0.925401 -0.292185 -0.228791 -0.928592\n0.161878 0.423001 0.909471 0.100467 0.460334 0.882042\n0.109446 0.532883 0.858096 0.100467 0.460334 0.882042\n0.055895 0.415235 0.925595 0.100467 0.460334 0.882042\n0.227869 0.126452 0.982017 0.233338 0.234012 0.943818\n0.300994 0.321655 0.915539 0.233338 0.234012 0.943818\n0.125152 0.234534 0.980613 0.233338 0.234012 0.943818\n0.141924 0.358967 0.939825 0.070151 -0.546388 -0.834589\n0.225393 0.490335 0.860837 0.070151 -0.546388 -0.834589\n0.167902 0.384335 0.925401 0.070151 -0.546388 -0.834589\n0.167902 0.384335 0.925401 0.248789 0.401837 0.881267\n0.225393 0.490335 0.860837 0.248789 0.401837 0.881267\n0.161878 0.423001 0.909471 0.248789 0.401837 0.881267\n0.225393 0.490335 0.860837 0.151761 0.480657 0.863677\n0.191777 0.538590 0.839889 0.151761 0.480657 0.863677\n0.161878 0.423001 0.909471 0.151761 0.480657 0.863677\n0.161878 0.423001 0.909471 0.157756 0.479010 0.863518\n0.191777 0.538590 0.839889 0.157756 0.479010 0.863518\n0.109446 0.532883 0.858096 0.157756 0.479010 0.863518\n0.482300 -0.049620 0.892858 0.386838 0.034031 0.921520\n0.506978 0.059435 0.878472 0.386838 0.034031 0.921520\n0.273499 0.067145 0.976197 0.386838 0.034031 0.921520\n0.506978 0.059435 0.878472 0.386501 0.015794 0.922154\n0.407158 0.149543 0.918766 0.386501 0.015794 0.922154\n0.273499 0.067145 0.976197 0.386501 0.015794 0.922154\n0.273499 0.067145 0.976197 0.312025 0.147981 0.938478\n0.407158 0.149543 0.918766 0.312025 0.147981 0.938478\n0.227869 0.126452 0.982017 0.312025 0.147981 0.938478\n0.227869 0.126452 0.982017 0.302246 0.203891 0.931169\n0.407158 0.149543 0.918766 0.302246 0.203891 0.931169\n0.300994 0.321655 0.915539 0.302246 0.203891 0.931169\n0.125152 0.234534 0.980613 0.230676 0.238949 0.943235\n0.300994 0.321655 0.915539 0.230676 0.238949 0.943235\n0.133257 0.289995 0.964581 0.230676 0.238949 0.943235\n0.300994 0.321655 0.915539 0.197232 0.364671 0.910008\n0.256278 0.452802 0.872676 0.197232 0.364671 0.910008\n0.133257 0.289995 0.964581 0.197232 0.364671 0.910008\n0.133257 0.289995 0.964581 0.296964 0.289310 0.910007\n0.256278 0.452802 0.872676 0.296964 0.289310 0.910007\n0.141924 0.358967 0.939825 0.296964 0.289310 0.910007\n0.256278 0.452802 0.872676 0.174239 0.423742 0.888866\n0.225393 0.490335 0.860837 0.174239 0.423742 0.888866\n0.141924 0.358967 0.939825 0.174239 0.423742 0.888866\n0.191777 0.538590 0.839889 0.135834 0.586876 0.798201\n0.166664 0.655193 0.758431 0.135834 0.586876 0.798201\n0.109446 0.532883 0.858096 0.135834 0.586876 0.798201\n0.645612 0.054457 0.782618 0.568964 0.073174 0.819100\n0.568319 0.159747 0.826901 0.568964 0.073174 0.819100\n0.506978 0.059435 0.878472 0.568964 0.073174 0.819100\n0.506978 0.059435 0.878472 0.482593 0.148631 0.863141\n0.568319 0.159747 0.826901 0.482593 0.148631 0.863141\n0.407158 0.149543 0.918766 0.482593 0.148631 0.863141\n0.568319 0.159747 0.826901 0.482741 0.147420 0.863266\n0.498599 0.239214 0.852318 0.482741 0.147420 0.863266\n0.407158 0.149543 0.918766 0.482741 0.147420 0.863266\n0.498599 0.239214 0.852318 0.390169 0.257242 0.884078\n0.300994 0.321655 0.915539 0.390169 0.257242 0.884078\n0.407158 0.149543 0.918766 0.390169 0.257242 0.884078\n0.256278 0.452802 0.872676 0.295713 0.500066 0.813934\n0.271760 0.578137 0.790048 0.295713 0.500066 0.813934\n0.225393 0.490335 0.860837 0.295713 0.500066 0.813934\n0.225393 0.490335 0.860837 0.247320 0.525643 0.813961\n0.271760 0.578137 0.790048 0.247320 0.525643 0.813961\n0.191777 0.538590 0.839889 0.247320 0.525643 0.813961\n0.271760 0.578137 0.790048 0.062407 0.730653 0.679891\n0.339299 0.680457 0.673889 0.062407 0.730653 0.679891\n0.191777 0.538590 0.839889 0.062407 0.730653 0.679891\n0.191777 0.538590 0.839889 0.284060 0.589462 0.756204\n0.339299 0.680457 0.673889 0.284060 0.589462 0.756204\n0.166664 0.655193 0.758431 0.284060 0.589462 0.756204\n0.645612 0.054457 0.782618 0.607678 0.115633 0.785721\n0.671044 0.124594 0.752627 0.607678 0.115633 0.785721\n0.568319 0.159747 0.826901 0.607678 0.115633 0.785721\n0.498599 0.239214 0.852318 0.395665 0.276863 0.875669\n0.446495 0.368127 0.835103 0.395665 0.276863 0.875669\n0.300994 0.321655 0.915539 0.395665 0.276863 0.875669\n0.446495 0.368127 0.835103 0.325418 0.434643 0.839755\n0.312249 0.561697 0.786936 0.325418 0.434643 0.839755\n0.300994 0.321655 0.915539 0.325418 0.434643 0.839755\n0.300994 0.321655 0.915539 0.432557 0.409939 0.803022\n0.312249 0.561697 0.786936 0.432557 0.409939 0.803022\n0.256278 0.452802 0.872676 0.432557 0.409939 0.803022\n0.256278 0.452802 0.872676 0.268729 0.506808 0.819104\n0.312249 0.561697 0.786936 0.268729 0.506808 0.819104\n0.271760 0.578137 0.790048 0.268729 0.506808 0.819104\n0.312249 0.561697 0.786936 0.306775 0.618640 0.723307\n0.339299 0.680457 0.673889 0.306775 0.618640 0.723307\n0.271760 0.578137 0.790048 0.306775 0.618640 0.723307\n0.790190 -0.051529 0.636566 0.739383 0.058166 0.670768\n0.828979 0.068964 0.583360 0.739383 0.058166 0.670768\n0.671044 0.124594 0.752627 0.739383 0.058166 0.670768\n0.671044 0.124594 0.752627 0.623052 0.268339 0.734711\n0.743288 0.212171 0.659377 0.623052 0.268339 0.734711\n0.568319 0.159747 0.826901 0.623052 0.268339 0.734711\n0.743288 0.212171 0.659377 0.625582 0.261220 0.735126\n0.728217 0.307204 0.638432 0.625582 0.261220 0.735126\n0.568319 0.159747 0.826901 0.625582 0.261220 0.735126\n0.568319 0.159747 0.826901 0.603902 0.292706 0.741367\n0.728217 0.307204 0.638432 0.603902 0.292706 0.741367\n0.498599 0.239214 0.852318 0.603902 0.292706 0.741367\n0.728217 0.307204 0.638432 0.666916 0.078646 0.740971\n0.640773 0.333826 0.714312 0.666916 0.078646 0.740971\n0.498599 0.239214 0.852318 0.666916 0.078646 0.740971\n0.498599 0.239214 0.852318 0.540227 0.322170 0.777407\n0.640773 0.333826 0.714312 0.540227 0.322170 0.777407\n0.446495 0.368127 0.835103 0.540227 0.322170 0.777407\n0.640773 0.333826 0.714312 0.539342 0.336615 0.771881\n0.529493 0.448922 0.741874 0.539342 0.336615 0.771881\n0.446495 0.368127 0.835103 0.539342 0.336615 0.771881\n0.446495 0.368127 0.835103 0.409066 0.477230 0.777764\n0.529493 0.448922 0.741874 0.409066 0.477230 0.777764\n0.312249 0.561697 0.786936 0.409066 0.477230 0.777764\n0.529493 0.448922 0.741874 0.406304 0.469450 0.783922\n0.454902 0.566988 0.709831 0.406304 0.469450 0.783922\n0.312249 0.561697 0.786936 0.406304 0.469450 0.783922\n0.454902 0.566988 0.709831 0.361450 0.604151 0.710180\n0.417617 0.660836 0.648970 0.361450 0.604151 0.710180\n0.312249 0.561697 0.786936 0.361450 0.604151 0.710180\n0.312249 0.561697 0.786936 0.375235 0.592827 0.712570\n0.417617 0.660836 0.648970 0.375235 0.592827 0.712570\n0.339299 0.680457 0.673889 0.375235 0.592827 0.712570\n0.417617 0.660836 0.648970 0.370165 0.695645 0.615675\n0.416189 0.725828 0.576396 0.370165 0.695645 0.615675\n0.339299 0.680457 0.673889 0.370165 0.695645 0.615675\n0.828979 0.068964 0.583360 0.743032 0.092789 0.662793\n0.743288 0.212171 0.659377 0.743032 0.092789 0.662793\n0.671044 0.124594 0.752627 0.743032 0.092789 0.662793\n0.728217 0.307204 0.638432 0.669916 0.376341 0.639984\n0.725225 0.413703 0.578938 0.669916 0.376341 0.639984\n0.640773 0.333826 0.714312 0.669916 0.376341 0.639984\n0.640773 0.333826 0.714312 0.619211 0.443506 0.647982\n0.725225 0.413703 0.578938 0.619211 0.443506 0.647982\n0.529493 0.448922 0.741874 0.619211 0.443506 0.647982\n0.725225 0.413703 0.578938 0.625143 0.414436 0.661392\n0.651631 0.515567 0.584670 0.625143 0.414436 0.661392\n0.529493 0.448922 0.741874 0.625143 0.414436 0.661392\n0.529493 0.448922 0.741874 0.550440 0.524125 0.649853\n0.651631 0.515567 0.584670 0.550440 0.524125 0.649853\n0.454902 0.566988 0.709831 0.550440 0.524125 0.649853\n0.651631 0.515567 0.584670 0.508135 0.690266 0.515103\n0.705403 0.579935 0.445369 0.508135 0.690266 0.515103\n0.454902 0.566988 0.709831 0.508135 0.690266 0.515103\n0.705403 0.579935 0.445369 0.614669 0.503857 0.606886\n0.532705 0.674569 0.541714 0.614669 0.503857 0.606886\n0.454902 0.566988 0.709831 0.614669 0.503857 0.606886\n0.454902 0.566988 0.709831 0.504861 0.601854 0.618779\n0.532705 0.674569 0.541714 0.504861 0.601854 0.618779\n0.417617 0.660836 0.648970 0.504861 0.601854 0.618779\n0.532705 0.674569 0.541714 0.413343 0.734926 0.537617\n0.512848 0.752859 0.449957 0.413343 0.734926 0.537617\n0.417617 0.660836 0.648970 0.413343 0.734926 0.537617\n0.417617 0.660836 0.648970 0.546851 0.629018 0.552531\n0.512848 0.752859 0.449957 0.546851 0.629018 0.552531\n0.416189 0.725828 0.576396 0.546851 0.629018 0.552531\n0.512848 0.752859 0.449957 0.438914 0.749391 0.495750\n0.382237 0.812329 0.475698 0.438914 0.749391 0.495750\n0.416189 0.725828 0.576396 0.438914 0.749391 0.495750\n0.850548 -0.002703 0.555726 0.832871 0.037752 0.552178\n0.865384 0.057223 0.529252 0.832871 0.037752 0.552178\n0.828979 0.068964 0.583360 0.832871 0.037752 0.552178\n0.865384 0.057223 0.529252 0.835562 0.115038 0.537217\n0.841892 0.180231 0.539450 0.835562 0.115038 0.537217\n0.828979 0.068964 0.583360 0.835562 0.115038 0.537217\n0.828979 0.068964 0.583360 0.782899 0.147653 0.604374\n0.841892 0.180231 0.539450 0.782899 0.147653 0.604374\n0.743288 0.212171 0.659377 0.782899 0.147653 0.604374\n0.841892 0.180231 0.539450 0.767234 0.349600 0.537710\n0.885099 0.277860 0.414324 0.767234 0.349600 0.537710\n0.743288 0.212171 0.659377 0.767234 0.349600 0.537710\n0.885099 0.277860 0.414324 0.590145 0.626293 0.509398\n0.901398 0.323730 0.339046 0.590145 0.626293 0.509398\n0.743288 0.212171 0.659377 0.590145 0.626293 0.509398\n0.743288 0.212171 0.659377 0.834140 0.241558 0.495843\n0.901398 0.323730 0.339046 0.834140 0.241558 0.495843\n0.728217 0.307204 0.638432 0.834140 0.241558 0.495843\n0.901398 0.323730 0.339046 0.796959 0.365162 0.481158\n0.889431 0.367835 0.325395 0.796959 0.365162 0.481158\n0.728217 0.307204 0.638432 0.796959 0.365162 0.481158\n0.728217 0.307204 0.638432 0.825921 0.292466 0.481993\n0.889431 0.367835 0.325395 0.825921 0.292466 0.481993\n0.725225 0.413703 0.578938 0.825921 0.292466 0.481993\n0.889431 0.367835 0.325395 0.819081 0.327080 0.471301\n0.825655 0.460940 0.371618 0.819081 0.327080 0.471301\n0.725225 0.413703 0.578938 0.819081 0.327080 0.471301\n0.725225 0.413703 0.578938 0.728974 0.500381 0.467137\n0.825655 0.460940 0.371618 0.728974 0.500381 0.467137\n0.651631 0.515567 0.584670 0.728974 0.500381 0.467137\n0.825655 0.460940 0.371618 0.680237 0.615679 0.397765\n0.825899 0.527447 0.268259 0.680237 0.615679 0.397765\n0.651631 0.515567 0.584670 0.680237 0.615679 0.397765\n0.651631 0.515567 0.584670 0.824729 0.320056 0.466247\n0.825899 0.527447 0.268259 0.824729 0.320056 0.466247\n0.705403 0.579935 0.445369 0.824729 0.320056 0.466247\n0.705403 0.579935 0.445369 0.608528 0.656116 0.446324\n0.698791 0.641647 0.363665 0.608528 0.656116 0.446324\n0.532705 0.674569 0.541714 0.608528 0.656116 0.446324\n0.698791 0.641647 0.363665 0.591365 0.685380 0.424903\n0.640010 0.725664 0.309952 0.591365 0.685380 0.424903\n0.532705 0.674569 0.541714 0.591365 0.685380 0.424903\n0.532705 0.674569 0.541714 0.615177 0.660510 0.430445\n0.640010 0.725664 0.309952 0.615177 0.660510 0.430445\n0.512848 0.752859 0.449957 0.615177 0.660510 0.430445\n0.889431 0.367835 0.325395 0.849333 0.429303 0.307135\n0.866712 0.469810 0.245681 0.849333 0.429303 0.307135\n0.825655 0.460940 0.371618 0.849333 0.429303 0.307135\n0.825655 0.460940 0.371618 0.829641 0.468608 0.303484\n0.866712 0.469810 0.245681 0.829641 0.468608 0.303484\n0.825899 0.527447 0.268259 0.829641 0.468608 0.303484\n0.825899 0.527447 0.268259 0.708947 0.641936 0.292083\n0.821512 0.563458 0.199761 0.708947 0.641936 0.292083\n0.705403 0.579935 0.445369 0.708947 0.641936 0.292083\n0.705403 0.579935 0.445369 0.781806 0.526341 0.334282\n0.821512 0.563458 0.199761 0.781806 0.526341 0.334282\n0.698791 0.641647 0.363665 0.781806 0.526341 0.334282\n0.640010 0.725664 0.309952 0.575538 0.722900 0.382323\n0.509825 0.793981 0.376754 0.575538 0.722900 0.382323\n0.512848 0.752859 0.449957 0.575538 0.722900 0.382323\n0.509825 0.793981 0.376754 0.442854 0.789384 0.425151\n0.388220 0.847710 0.403664 0.442854 0.789384 0.425151\n0.512848 0.752859 0.449957 0.442854 0.789384 0.425151\n0.512848 0.752859 0.449957 0.443158 0.789512 0.424596\n0.388220 0.847710 0.403664 0.443158 0.789512 0.424596\n0.382237 0.812329 0.475698 0.443158 0.789512 0.424596\n0.040481 0.167148 1.001346 0.023435 0.112950 0.993324\n0.005508 0.166727 1.002219 0.023435 0.112950 0.993324\n-0.005494 0.067794 1.013728 0.023435 0.112950 0.993324\n0.109446 0.532883 0.858096 0.074636 0.470487 0.879245\n0.022112 0.522689 0.870964 0.074636 0.470487 0.879245\n0.055895 0.415235 0.925595 0.074636 0.470487 0.879245\n0.166664 0.655193 0.758431 0.123255 0.591589 0.796763\n0.062283 0.649535 0.778778 0.123255 0.591589 0.796763\n0.109446 0.532883 0.858096 0.123255 0.591589 0.796763\n0.416189 0.725828 0.576396 0.300271 0.752012 0.586783\n0.358081 0.809086 0.499428 0.300271 0.752012 0.586783\n0.339299 0.680457 0.673889 0.300271 0.752012 0.586783\n0.382237 0.812329 0.475698 0.403481 0.756883 0.514132\n0.358081 0.809086 0.499428 0.403481 0.756883 0.514132\n0.416189 0.725828 0.576396 0.403481 0.756883 0.514132\n-0.005494 0.067794 1.013728 -0.024622 -0.040004 -0.998896\n0.044971 0.076192 1.012148 -0.024622 -0.040004 -0.998896\n0.054852 0.012734 1.014446 -0.024622 -0.040004 -0.998896\n-0.005494 0.067794 1.013728 -0.012100 -0.114217 -0.993382\n0.005508 0.166727 1.002219 -0.012100 -0.114217 -0.993382\n0.044971 0.076192 1.012148 -0.012100 -0.114217 -0.993382\n0.005508 0.166727 1.002219 0.002581 -0.107904 -0.994158\n0.052323 0.128489 1.006491 0.002581 -0.107904 -0.994158\n0.044971 0.076192 1.012148 0.002581 -0.107904 -0.994158\n0.169946 0.292077 0.958165 0.091696 0.239093 0.966657\n0.004335 0.274237 0.978288 0.091696 0.239093 0.966657\n0.040481 0.167148 1.001346 0.091696 0.239093 0.966657\n0.040481 0.167148 1.001346 0.021740 0.217455 0.975828\n0.004335 0.274237 0.978288 0.021740 0.217455 0.975828\n0.005508 0.166727 1.002219 0.021740 0.217455 0.975828\n0.004335 0.274237 0.978288 0.140137 -0.213679 -0.966800\n0.012659 0.244570 0.986051 0.140137 -0.213679 -0.966800\n0.005508 0.166727 1.002219 0.140137 -0.213679 -0.966800\n0.005508 0.166727 1.002219 -0.071316 -0.196560 -0.977895\n0.012659 0.244570 0.986051 -0.071316 -0.196560 -0.977895\n0.052323 0.128489 1.006491 -0.071316 -0.196560 -0.977895\n0.012659 0.244570 0.986051 -0.296919 0.066280 0.952600\n0.006534 0.255257 0.983398 -0.296919 0.066280 0.952600\n0.052323 0.128489 1.006491 -0.296919 0.066280 0.952600\n0.169946 0.292077 0.958165 0.079753 0.323226 0.942955\n0.055895 0.415235 0.925595 0.079753 0.323226 0.942955\n0.004335 0.274237 0.978288 0.079753 0.323226 0.942955\n0.055895 0.415235 0.925595 0.012236 0.346107 0.938115\n-0.060058 0.386295 0.937785 0.012236 0.346107 0.938115\n0.004335 0.274237 0.978288 0.012236 0.346107 0.938115\n0.004335 0.274237 0.978288 -0.058637 0.237296 0.969666\n-0.013159 0.295002 0.972148 -0.058637 0.237296 0.969666\n0.012659 0.244570 0.986051 -0.058637 0.237296 0.969666\n-0.013159 0.295002 0.972148 0.371834 0.418747 0.828487\n0.006534 0.255257 0.983398 0.371834 0.418747 0.828487\n0.012659 0.244570 0.986051 0.371834 0.418747 0.828487\n-0.060058 0.386295 0.937785 -0.053104 0.312312 0.948494\n-0.099188 0.371056 0.940612 -0.053104 0.312312 0.948494\n0.004335 0.274237 0.978288 -0.053104 0.312312 0.948494\n0.004335 0.274237 0.978288 0.380615 0.047598 -0.923508\n-0.099188 0.371056 0.940612 0.380615 0.047598 -0.923508\n-0.013159 0.295002 0.972148 0.380615 0.047598 -0.923508\n0.055895 0.415235 0.925595 -0.018036 0.448620 0.893541\n0.022112 0.522689 0.870964 -0.018036 0.448620 0.893541\n-0.060058 0.386295 0.937785 -0.018036 0.448620 0.893541\n0.022112 0.522689 0.870964 -0.041669 0.459700 0.887096\n-0.127396 0.437302 0.908190 -0.041669 0.459700 0.887096\n-0.060058 0.386295 0.937785 -0.041669 0.459700 0.887096\n-0.060058 0.386295 0.937785 -0.092316 0.405730 0.909319\n-0.127396 0.437302 0.908190 -0.092316 0.405730 0.909319\n-0.099188 0.371056 0.940612 -0.092316 0.405730 0.909319\n-0.127396 0.437302 0.908190 -0.158158 0.378916 0.911816\n-0.188881 0.435817 0.898142 -0.158158 0.378916 0.911816\n-0.099188 0.371056 0.940612 -0.158158 0.378916 0.911816\n-0.099188 0.371056 0.940612 -0.621295 -0.431598 0.653999\n-0.188881 0.435817 0.898142 -0.621295 -0.431598 0.653999\n-0.013159 0.295002 0.972148 -0.621295 -0.431598 0.653999\n-0.188881 0.435817 0.898142 -0.043438 0.421770 0.905662\n-0.186370 0.393101 0.918155 -0.043438 0.421770 0.905662\n-0.013159 0.295002 0.972148 -0.043438 0.421770 0.905662\n-0.013159 0.295002 0.972148 -0.202869 0.172332 0.963922\n-0.186370 0.393101 0.918155 -0.202869 0.172332 0.963922\n0.006534 0.255257 0.983398 -0.202869 0.172332 0.963922\n0.006534 0.255257 0.983398 -0.065079 0.351043 0.934095\n-0.186370 0.393101 0.918155 -0.065079 0.351043 0.934095\n-0.032087 0.237821 0.987260 -0.065079 0.351043 0.934095\n-0.186370 0.393101 0.918155 -0.092011 0.327129 0.940489\n-0.208556 0.338942 0.934823 -0.092011 0.327129 0.940489\n-0.032087 0.237821 0.987260 -0.092011 0.327129 0.940489\n0.109446 0.532883 0.858096 0.052952 0.576043 0.815702\n0.062283 0.649535 0.778778 0.052952 0.576043 0.815702\n0.022112 0.522689 0.870964 0.052952 0.576043 0.815702\n-0.127396 0.437302 0.908190 -0.153602 0.466743 0.870952\n-0.178501 0.513264 0.858469 -0.153602 0.466743 0.870952\n-0.188881 0.435817 0.898142 -0.153602 0.466743 0.870952\n-0.188881 0.435817 0.898142 -0.303895 0.389491 0.869451\n-0.388591 0.466913 0.814408 -0.303895 0.389491 0.869451\n-0.186370 0.393101 0.918155 -0.303895 0.389491 0.869451\n-0.388591 0.466913 0.814408 -0.319411 0.358090 0.877353\n-0.409319 0.450067 0.813737 -0.319411 0.358090 0.877353\n-0.186370 0.393101 0.918155 -0.319411 0.358090 0.877353\n-0.186370 0.393101 0.918155 -0.306020 0.392316 0.867433\n-0.409319 0.450067 0.813737 -0.306020 0.392316 0.867433\n-0.208556 0.338942 0.934823 -0.306020 0.392316 0.867433\n-0.409319 0.450067 0.813737 0.586528 0.762706 -0.272517\n-0.388028 0.439440 0.829818 0.586528 0.762706 -0.272517\n-0.208556 0.338942 0.934823 0.586528 0.762706 -0.272517\n0.022112 0.522689 0.870964 -0.077311 0.509089 0.857235\n-0.178501 0.513264 0.858469 -0.077311 0.509089 0.857235\n-0.127396 0.437302 0.908190 -0.077311 0.509089 0.857235\n-0.178501 0.513264 0.858469 -0.249636 0.467783 0.847857\n-0.327369 0.494018 0.825256 -0.249636 0.467783 0.847857\n-0.188881 0.435817 0.898142 -0.249636 0.467783 0.847857\n-0.188881 0.435817 0.898142 -0.313624 0.356091 0.880250\n-0.327369 0.494018 0.825256 -0.313624 0.356091 0.880250\n-0.388591 0.466913 0.814408 -0.313624 0.356091 0.880250\n0.062283 0.649535 0.778778 -0.042123 0.596069 0.801827\n-0.052306 0.696523 0.737828 -0.042123 0.596069 0.801827\n0.022112 0.522689 0.870964 -0.042123 0.596069 0.801827\n0.022112 0.522689 0.870964 -0.077767 0.584999 0.807297\n-0.052306 0.696523 0.737828 -0.077767 0.584999 0.807297\n-0.178501 0.513264 0.858469 -0.077767 0.584999 0.807297\n-0.052306 0.696523 0.737828 -0.143144 0.611076 0.778522\n-0.273496 0.596635 0.775563 -0.143144 0.611076 0.778522\n-0.178501 0.513264 0.858469 -0.143144 0.611076 0.778522\n-0.178501 0.513264 0.858469 -0.249420 0.524999 0.813736\n-0.273496 0.596635 0.775563 -0.249420 0.524999 0.813736\n-0.327369 0.494018 0.825256 -0.249420 0.524999 0.813736\n-0.273496 0.596635 0.775563 -0.305211 0.540053 0.784340\n-0.370354 0.537790 0.778390 -0.305211 0.540053 0.784340\n-0.327369 0.494018 0.825256 -0.305211 0.540053 0.784340\n-0.327369 0.494018 0.825256 -0.359205 0.494604 0.791415\n-0.370354 0.537790 0.778390 -0.359205 0.494604 0.791415\n-0.388591 0.466913 0.814408 -0.359205 0.494604 0.791415\n-0.370354 0.537790 0.778390 -0.389556 0.494941 0.776711\n-0.429693 0.515179 0.763037 -0.389556 0.494941 0.776711\n-0.388591 0.466913 0.814408 -0.389556 0.494941 0.776711\n-0.388591 0.466913 0.814408 -0.412023 0.476042 0.776930\n-0.429693 0.515179 0.763037 -0.412023 0.476042 0.776930\n-0.409319 0.450067 0.813737 -0.412023 0.476042 0.776930\n-0.429693 0.515179 0.763037 -0.411410 0.476344 0.777071\n-0.450082 0.495755 0.764149 -0.411410 0.476344 0.777071\n-0.409319 0.450067 0.813737 -0.411410 0.476344 0.777071\n-0.409319 0.450067 0.813737 0.295382 -0.569237 -0.767280\n-0.450082 0.495755 0.764149 0.295382 -0.569237 -0.767280\n-0.388028 0.439440 0.829818 0.295382 -0.569237 -0.767280\n-0.450082 0.495755 0.764149 0.426432 -0.447042 -0.786326\n-0.442065 0.499732 0.766236 0.426432 -0.447042 -0.786326\n-0.388028 0.439440 0.829818 0.426432 -0.447042 -0.786326\n0.166664 0.655193 0.758431 0.111219 0.650432 0.751378\n0.116439 0.700504 0.726641 0.111219 0.650432 0.751378\n0.062283 0.649535 0.778778 0.111219 0.650432 0.751378\n0.116439 0.700504 0.726641 0.030921 0.698490 0.714952\n-0.052306 0.696523 0.737828 0.030921 0.698490 0.714952\n0.062283 0.649535 0.778778 0.030921 0.698490 0.714952\n-0.052306 0.696523 0.737828 -0.142255 0.609605 0.779837\n-0.246078 0.668929 0.724052 -0.142255 0.609605 0.779837\n-0.273496 0.596635 0.775563 -0.142255 0.609605 0.779837\n-0.273496 0.596635 0.775563 -0.361473 0.628085 0.689091\n-0.246078 0.668929 0.724052 -0.361473 0.628085 0.689091\n-0.370354 0.537790 0.778390 -0.361473 0.628085 0.689091\n-0.246078 0.668929 0.724052 -0.294913 0.590691 0.751073\n-0.360269 0.640689 0.701423 -0.294913 0.590691 0.751073\n-0.370354 0.537790 0.778390 -0.294913 0.590691 0.751073\n-0.370354 0.537790 0.778390 -0.403006 0.573171 0.713486\n-0.360269 0.640689 0.701423 -0.403006 0.573171 0.713486\n-0.429693 0.515179 0.763037 -0.403006 0.573171 0.713486\n-0.429693 0.515179 0.763037 -0.464193 0.527979 0.711170\n-0.486748 0.578059 0.679114 -0.464193 0.527979 0.711170\n-0.450082 0.495755 0.764149 -0.464193 0.527979 0.711170\n-0.450082 0.495755 0.764149 0.451527 -0.535912 -0.713387\n-0.486748 0.578059 0.679114 0.451527 -0.535912 -0.713387\n-0.442065 0.499732 0.766236 0.451527 -0.535912 -0.713387\n0.339299 0.680457 0.673889 0.177456 0.782885 0.596323\n0.358081 0.809086 0.499428 0.177456 0.782885 0.596323\n0.166664 0.655193 0.758431 0.177456 0.782885 0.596323\n0.358081 0.809086 0.499428 0.377146 0.646694 0.662983\n0.240585 0.807343 0.567968 0.377146 0.646694 0.662983\n0.166664 0.655193 0.758431 0.377146 0.646694 0.662983\n0.166664 0.655193 0.758431 0.227843 0.715719 0.660177\n0.240585 0.807343 0.567968 0.227843 0.715719 0.660177\n0.116439 0.700504 0.726641 0.227843 0.715719 0.660177\n0.240585 0.807343 0.567968 0.179670 0.745114 0.642280\n0.085992 0.804675 0.614309 0.179670 0.745114 0.642280\n0.116439 0.700504 0.726641 0.179670 0.745114 0.642280\n0.116439 0.700504 0.726641 0.027419 0.736661 0.675706\n0.085992 0.804675 0.614309 0.027419 0.736661 0.675706\n-0.052306 0.696523 0.737828 0.027419 0.736661 0.675706\n0.085992 0.804675 0.614309 0.020125 0.740931 0.671279\n-0.057818 0.799217 0.624644 0.020125 0.740931 0.671279\n-0.052306 0.696523 0.737828 0.020125 0.740931 0.671279\n-0.057818 0.799217 0.624644 -0.151239 0.728399 0.668253\n-0.246078 0.668929 0.724052 -0.151239 0.728399 0.668253\n-0.052306 0.696523 0.737828 -0.151239 0.728399 0.668253\n-0.360269 0.640689 0.701423 -0.426031 0.577518 0.696398\n-0.493673 0.610631 0.644739 -0.426031 0.577518 0.696398\n-0.429693 0.515179 0.763037 -0.426031 0.577518 0.696398\n-0.429693 0.515179 0.763037 -0.277270 0.668916 0.689690\n-0.493673 0.610631 0.644739 -0.277270 0.668916 0.689690\n-0.486748 0.578059 0.679114 -0.277270 0.668916 0.689690\n-0.486748 0.578059 0.679114 0.282977 -0.636563 -0.717433\n-0.487333 0.598067 0.661130 0.282977 -0.636563 -0.717433\n-0.442065 0.499732 0.766236 0.282977 -0.636563 -0.717433\n-0.057818 0.799217 0.624644 -0.177044 0.745810 0.642201\n-0.216088 0.828374 0.547151 -0.177044 0.745810 0.642201\n-0.246078 0.668929 0.724052 -0.177044 0.745810 0.642201\n-0.246078 0.668929 0.724052 -0.302051 0.733012 0.609474\n-0.216088 0.828374 0.547151 -0.302051 0.733012 0.609474\n-0.360269 0.640689 0.701423 -0.302051 0.733012 0.609474\n-0.216088 0.828374 0.547151 -0.257264 0.723857 0.640193\n-0.363362 0.771566 0.552200 -0.257264 0.723857 0.640193\n-0.360269 0.640689 0.701423 -0.257264 0.723857 0.640193\n-0.363362 0.771566 0.552200 -0.453745 0.665279 0.592890\n-0.519782 0.729037 0.480213 -0.453745 0.665279 0.592890\n-0.360269 0.640689 0.701423 -0.453745 0.665279 0.592890\n-0.360269 0.640689 0.701423 -0.404683 0.710573 0.575602\n-0.519782 0.729037 0.480213 -0.404683 0.710573 0.575602\n-0.493673 0.610631 0.644739 -0.404683 0.710573 0.575602\n-0.493673 0.610631 0.644739 -0.673671 0.463910 0.575287\n-0.546535 0.666794 0.537546 -0.673671 0.463910 0.575287\n-0.486748 0.578059 0.679114 -0.673671 0.463910 0.575287\n-0.486748 0.578059 0.679114 0.632464 -0.507481 -0.585195\n-0.546535 0.666794 0.537546 0.632464 -0.507481 -0.585195\n-0.487333 0.598067 0.661130 0.632464 -0.507481 -0.585195\n-0.546535 0.666794 0.537546 -0.390302 0.712443 0.583172\n-0.536539 0.628069 0.591546 -0.390302 0.712443 0.583172\n-0.487333 0.598067 0.661130 -0.390302 0.712443 0.583172\n0.358081 0.809086 0.499428 0.275396 0.825235 0.493096\n0.355741 0.829089 0.467259 0.275396 0.825235 0.493096\n0.240585 0.807343 0.567968 0.275396 0.825235 0.493096\n0.240585 0.807343 0.567968 0.157993 0.803932 0.573352\n0.174869 0.858927 0.513748 0.157993 0.803932 0.573352\n0.085992 0.804675 0.614309 0.157993 0.803932 0.573352\n0.085992 0.804675 0.614309 -0.008847 0.929818 0.367912\n-0.216088 0.828374 0.547151 -0.008847 0.929818 0.367912\n-0.057818 0.799217 0.624644 -0.008847 0.929818 0.367912\n-0.519782 0.729037 0.480213 -0.413527 0.706630 0.574168\n-0.546535 0.666794 0.537546 -0.413527 0.706630 0.574168\n-0.493673 0.610631 0.644739 -0.413527 0.706630 0.574168\n-0.546535 0.666794 0.537546 -0.609326 0.586617 0.533481\n-0.589057 0.672580 0.482617 -0.609326 0.586617 0.533481\n-0.536539 0.628069 0.591546 -0.609326 0.586617 0.533481\n-0.589057 0.672580 0.482617 -0.603445 0.592905 0.533215\n-0.642442 0.639163 0.459359 -0.603445 0.592905 0.533215\n-0.536539 0.628069 0.591546 -0.603445 0.592905 0.533215\n0.388220 0.847710 0.403664 0.561994 0.722996 0.401796\n0.381580 0.828129 0.448186 0.561994 0.722996 0.401796\n0.382237 0.812329 0.475698 0.561994 0.722996 0.401796\n0.382237 0.812329 0.475698 0.343597 0.817893 0.461511\n0.381580 0.828129 0.448186 0.343597 0.817893 0.461511\n0.358081 0.809086 0.499428 0.343597 0.817893 0.461511\n0.358081 0.809086 0.499428 0.376158 0.798870 0.469373\n0.381580 0.828129 0.448186 0.376158 0.798870 0.469373\n0.355741 0.829089 0.467259 0.376158 0.798870 0.469373\n0.355741 0.829089 0.467259 0.268240 0.831607 0.486289\n0.293283 0.879775 0.415032 0.268240 0.831607 0.486289\n0.240585 0.807343 0.567968 0.268240 0.831607 0.486289\n0.240585 0.807343 0.567968 0.256679 0.836277 0.484517\n0.293283 0.879775 0.415032 0.256679 0.836277 0.484517\n0.174869 0.858927 0.513748 0.256679 0.836277 0.484517\n0.174869 0.858927 0.513748 0.053189 0.858448 0.510135\n-0.029494 0.914893 0.440876 0.053189 0.858448 0.510135\n0.085992 0.804675 0.614309 0.053189 0.858448 0.510135\n0.085992 0.804675 0.614309 -0.060743 0.823626 0.563871\n-0.029494 0.914893 0.440876 -0.060743 0.823626 0.563871\n-0.216088 0.828374 0.547151 -0.060743 0.823626 0.563871\n-0.029494 0.914893 0.440876 -0.102849 0.852121 0.513140\n-0.212671 0.875701 0.469245 -0.102849 0.852121 0.513140\n-0.216088 0.828374 0.547151 -0.102849 0.852121 0.513140\n-0.216088 0.828374 0.547151 -0.300056 0.821060 0.485621\n-0.212671 0.875701 0.469245 -0.300056 0.821060 0.485621\n-0.363362 0.771566 0.552200 -0.300056 0.821060 0.485621\n-0.212671 0.875701 0.469245 -0.298333 0.820356 0.487867\n-0.399951 0.802019 0.478618 -0.298333 0.820356 0.487867\n-0.363362 0.771566 0.552200 -0.298333 0.820356 0.487867\n-0.363362 0.771566 0.552200 -0.438870 0.731968 0.521169\n-0.399951 0.802019 0.478618 -0.438870 0.731968 0.521169\n-0.519782 0.729037 0.480213 -0.438870 0.731968 0.521169\n-0.519782 0.729037 0.480213 -0.540307 0.683869 0.490297\n-0.589057 0.672580 0.482617 -0.540307 0.683869 0.490297\n-0.546535 0.666794 0.537546 -0.540307 0.683869 0.490297\n0.044971 0.076192 1.012148 -0.068833 -0.046803 -0.996530\n0.107378 0.041886 1.009449 -0.068833 -0.046803 -0.996530\n0.054852 0.012734 1.014446 -0.068833 -0.046803 -0.996530\n0.052323 0.128489 1.006491 -0.094499 -0.093923 -0.991085\n0.107378 0.041886 1.009449 -0.094499 -0.093923 -0.991085\n0.044971 0.076192 1.012148 -0.094499 -0.093923 -0.991085\n-0.442065 0.499732 0.766236 -0.363417 0.501951 0.784839\n-0.398804 0.440716 0.824012 -0.363417 0.501951 0.784839\n-0.388028 0.439440 0.829818 -0.363417 0.501951 0.784839\n-0.487333 0.598067 0.661130 -0.446163 0.549576 0.706332\n-0.478025 0.492591 0.749078 -0.446163 0.549576 0.706332\n-0.442065 0.499732 0.766236 -0.446163 0.549576 0.706332\n-0.536539 0.628069 0.591546 -0.506962 0.601194 0.617702\n-0.547019 0.578783 0.630914 -0.506962 0.601194 0.617702\n-0.487333 0.598067 0.661130 -0.506962 0.601194 0.617702\n-0.642442 0.639163 0.459359 -0.619495 0.566110 0.543825\n-0.547019 0.578783 0.630914 -0.619495 0.566110 0.543825\n-0.536539 0.628069 0.591546 -0.619495 0.566110 0.543825\n0.107378 0.041886 1.009449 -0.144559 0.091574 -0.985250\n0.282736 -0.112435 0.969376 -0.144559 0.091574 -0.985250\n0.054852 0.012734 1.014446 -0.144559 0.091574 -0.985250\n0.107378 0.041886 1.009449 0.032974 0.286133 -0.957622\n0.153297 0.019016 1.004196 0.032974 0.286133 -0.957622\n0.282736 -0.112435 0.969376 0.032974 0.286133 -0.957622\n0.153297 0.019016 1.004196 0.568725 0.364733 0.737240\n0.204098 -0.040540 0.994471 0.568725 0.364733 0.737240\n0.282736 -0.112435 0.969376 0.568725 0.364733 0.737240\n0.204098 -0.040540 0.994471 -0.092902 -0.417172 0.904067\n0.330015 -0.176881 0.944497 -0.092902 -0.417172 0.904067\n0.282736 -0.112435 0.969376 -0.092902 -0.417172 0.904067\n0.052323 0.128489 1.006491 -0.186633 -0.151795 -0.970632\n0.153297 0.019016 1.004196 -0.186633 -0.151795 -0.970632\n0.107378 0.041886 1.009449 -0.186633 -0.151795 -0.970632\n0.204098 -0.040540 0.994471 0.204162 -0.165121 0.964911\n0.153264 -0.282605 0.963803 0.204162 -0.165121 0.964911\n0.330015 -0.176881 0.944497 0.204162 -0.165121 0.964911\n0.006534 0.255257 0.983398 0.146158 0.228144 0.962594\n0.032648 0.150422 1.004280 0.146158 0.228144 0.962594\n0.052323 0.128489 1.006491 0.146158 0.228144 0.962594\n0.032648 0.150422 1.004280 -0.001104 0.099304 0.995057\n0.050388 0.069542 1.012372 -0.001104 0.099304 0.995057\n0.052323 0.128489 1.006491 -0.001104 0.099304 0.995057\n0.052323 0.128489 1.006491 0.124828 0.094433 0.987674\n0.050388 0.069542 1.012372 0.124828 0.094433 0.987674\n0.153297 0.019016 1.004196 0.124828 0.094433 0.987674\n0.153297 0.019016 1.004196 0.054748 -0.115264 0.991825\n-0.023460 -0.262463 0.981241 0.054748 -0.115264 0.991825\n0.204098 -0.040540 0.994471 0.054748 -0.115264 0.991825\n0.204098 -0.040540 0.994471 0.081159 -0.142030 0.986530\n-0.023460 -0.262463 0.981241 0.081159 -0.142030 0.986530\n0.153264 -0.282605 0.963803 0.081159 -0.142030 0.986530\n0.006534 0.255257 0.983398 0.008874 0.197468 0.980269\n-0.032087 0.237821 0.987260 0.008874 0.197468 0.980269\n0.032648 0.150422 1.004280 0.008874 0.197468 0.980269\n0.050388 0.069542 1.012372 0.074525 -0.009559 0.997173\n0.000445 -0.045125 1.015005 0.074525 -0.009559 0.997173\n0.153297 0.019016 1.004196 0.074525 -0.009559 0.997173\n0.153297 0.019016 1.004196 0.139076 -0.166937 0.976110\n0.000445 -0.045125 1.015005 0.139076 -0.166937 0.976110\n-0.023460 -0.262463 0.981241 0.139076 -0.166937 0.976110\n0.000445 -0.045125 1.015005 -0.046467 -0.148352 0.987842\n-0.126864 -0.232506 0.980876 -0.046467 -0.148352 0.987842\n-0.023460 -0.262463 0.981241 -0.046467 -0.148352 0.987842\n-0.126864 -0.232506 0.980876 -0.098159 -0.327364 0.939786\n-0.202847 -0.305233 0.947606 -0.098159 -0.327364 0.939786\n-0.023460 -0.262463 0.981241 -0.098159 -0.327364 0.939786\n-0.032087 0.237821 0.987260 -0.033645 0.166972 0.985387\n-0.078364 0.221897 0.988379 -0.033645 0.166972 0.985387\n0.032648 0.150422 1.004280 -0.033645 0.166972 0.985387\n-0.078364 0.221897 0.988379 -0.049029 0.143748 0.988399\n-0.111702 0.091398 1.005704 -0.049029 0.143748 0.988399\n0.032648 0.150422 1.004280 -0.049029 0.143748 0.988399\n0.032648 0.150422 1.004280 -0.028352 0.093345 0.995230\n-0.111702 0.091398 1.005704 -0.028352 0.093345 0.995230\n0.050388 0.069542 1.012372 -0.028352 0.093345 0.995230\n0.050388 0.069542 1.012372 -0.035878 0.038560 0.998612\n-0.111702 0.091398 1.005704 -0.035878 0.038560 0.998612\n0.000445 -0.045125 1.015005 -0.035878 0.038560 0.998612\n-0.111702 0.091398 1.005704 -0.092589 -0.008225 0.995670\n-0.132232 -0.101908 1.002198 -0.092589 -0.008225 0.995670\n0.000445 -0.045125 1.015005 -0.092589 -0.008225 0.995670\n0.000445 -0.045125 1.015005 -0.025838 -0.162111 0.986434\n-0.132232 -0.101908 1.002198 -0.025838 -0.162111 0.986434\n-0.126864 -0.232506 0.980876 -0.025838 -0.162111 0.986434\n-0.132232 -0.101908 1.002198 -0.134318 -0.165045 0.977097\n-0.188760 -0.205749 0.976887 -0.134318 -0.165045 0.977097\n-0.126864 -0.232506 0.980876 -0.134318 -0.165045 0.977097\n-0.188760 -0.205749 0.976887 -0.171841 -0.255680 0.951366\n-0.202847 -0.305233 0.947606 -0.171841 -0.255680 0.951366\n-0.126864 -0.232506 0.980876 -0.171841 -0.255680 0.951366\n-0.208556 0.338942 0.934823 -0.090594 0.329283 0.939875\n-0.078364 0.221897 0.988379 -0.090594 0.329283 0.939875\n-0.032087 0.237821 0.987260 -0.090594 0.329283 0.939875\n-0.078364 0.221897 0.988379 -0.057478 0.145806 0.987642\n-0.135295 0.137275 0.997558 -0.057478 0.145806 0.987642\n-0.111702 0.091398 1.005704 -0.057478 0.145806 0.987642\n-0.111702 0.091398 1.005704 -0.171727 0.000371 0.985144\n-0.280359 -0.020444 0.976346 -0.171727 0.000371 0.985144\n-0.132232 -0.101908 1.002198 -0.171727 0.000371 0.985144\n-0.280359 -0.020444 0.976346 -0.247153 -0.145389 0.958007\n-0.372206 -0.113224 0.938570 -0.247153 -0.145389 0.958007\n-0.132232 -0.101908 1.002198 -0.247153 -0.145389 0.958007\n-0.132232 -0.101908 1.002198 -0.250716 -0.098261 0.963061\n-0.372206 -0.113224 0.938570 -0.250716 -0.098261 0.963061\n-0.188760 -0.205749 0.976887 -0.250716 -0.098261 0.963061\n-0.188760 -0.205749 0.976887 -0.349417 -0.218680 0.911091\n-0.435786 -0.355231 0.846270 -0.349417 -0.218680 0.911091\n-0.202847 -0.305233 0.947606 -0.349417 -0.218680 0.911091\n-0.208556 0.338942 0.934823 -0.272517 0.132900 0.952928\n-0.296610 0.343524 0.909002 -0.272517 0.132900 0.952928\n-0.078364 0.221897 0.988379 -0.272517 0.132900 0.952928\n-0.135295 0.137275 0.997558 -0.212191 0.064019 0.975129\n-0.280359 -0.020444 0.976346 -0.212191 0.064019 0.975129\n-0.111702 0.091398 1.005704 -0.212191 0.064019 0.975129\n-0.372206 -0.113224 0.938570 -0.338679 -0.302531 0.890939\n-0.500113 -0.191102 0.863503 -0.338679 -0.302531 0.890939\n-0.188760 -0.205749 0.976887 -0.338679 -0.302531 0.890939\n-0.500113 -0.191102 0.863503 -0.330097 -0.400668 0.854694\n-0.551866 -0.251850 0.815038 -0.330097 -0.400668 0.854694\n-0.188760 -0.205749 0.976887 -0.330097 -0.400668 0.854694\n-0.188760 -0.205749 0.976887 -0.385227 -0.157867 0.909218\n-0.551866 -0.251850 0.815038 -0.385227 -0.157867 0.909218\n-0.435786 -0.355231 0.846270 -0.385227 -0.157867 0.909218\n-0.551866 -0.251850 0.815038 -0.488406 -0.300953 0.819077\n-0.562872 -0.304491 0.789133 -0.488406 -0.300953 0.819077\n-0.435786 -0.355231 0.846270 -0.488406 -0.300953 0.819077\n-0.562872 -0.304491 0.789133 -0.493984 -0.332680 0.803308\n-0.543746 -0.379105 0.769994 -0.493984 -0.332680 0.803308\n-0.435786 -0.355231 0.846270 -0.493984 -0.332680 0.803308\n-0.388028 0.439440 0.829818 -0.463820 0.092316 0.881107\n-0.398804 0.440716 0.824012 -0.463820 0.092316 0.881107\n-0.208556 0.338942 0.934823 -0.463820 0.092316 0.881107\n-0.398804 0.440716 0.824012 -0.219360 0.501283 0.837017\n-0.296610 0.343524 0.909002 -0.219360 0.501283 0.837017\n-0.208556 0.338942 0.934823 -0.219360 0.501283 0.837017\n-0.296610 0.343524 0.909002 -0.215301 0.232635 0.948434\n-0.354202 0.203698 0.930225 -0.215301 0.232635 0.948434\n-0.078364 0.221897 0.988379 -0.215301 0.232635 0.948434\n-0.078364 0.221897 0.988379 -0.215477 0.247437 0.944640\n-0.354202 0.203698 0.930225 -0.215477 0.247437 0.944640\n-0.135295 0.137275 0.997558 -0.215477 0.247437 0.944640\n-0.354202 0.203698 0.930225 -0.291561 0.008732 0.956513\n-0.482137 0.055848 0.892578 -0.291561 0.008732 0.956513\n-0.135295 0.137275 0.997558 -0.291561 0.008732 0.956513\n-0.135295 0.137275 0.997558 -0.321969 0.170898 0.931198\n-0.482137 0.055848 0.892578 -0.321969 0.170898 0.931198\n-0.280359 -0.020444 0.976346 -0.321969 0.170898 0.931198\n-0.482137 0.055848 0.892578 -0.417381 -0.113998 0.901553\n-0.575122 -0.051221 0.835992 -0.417381 -0.113998 0.901553\n-0.280359 -0.020444 0.976346 -0.417381 -0.113998 0.901553\n-0.280359 -0.020444 0.976346 -0.434489 0.064341 0.898376\n-0.575122 -0.051221 0.835992 -0.434489 0.064341 0.898376\n-0.372206 -0.113224 0.938570 -0.434489 0.064341 0.898376\n-0.575122 -0.051221 0.835992 -0.487175 -0.180902 0.854362\n-0.622906 -0.130077 0.792047 -0.487175 -0.180902 0.854362\n-0.372206 -0.113224 0.938570 -0.487175 -0.180902 0.854362\n-0.372206 -0.113224 0.938570 -0.504396 -0.003877 0.863464\n-0.622906 -0.130077 0.792047 -0.504396 -0.003877 0.863464\n-0.500113 -0.191102 0.863503 -0.504396 -0.003877 0.863464\n-0.622906 -0.130077 0.792047 -0.564601 -0.197796 0.801313\n-0.644909 -0.188079 0.762227 -0.564601 -0.197796 0.801313\n-0.500113 -0.191102 0.863503 -0.564601 -0.197796 0.801313\n-0.500113 -0.191102 0.863503 -0.567999 -0.160172 0.807293\n-0.644909 -0.188079 0.762227 -0.567999 -0.160172 0.807293\n-0.551866 -0.251850 0.815038 -0.567999 -0.160172 0.807293\n-0.644909 -0.188079 0.762227 -0.595149 -0.230891 0.769732\n-0.651143 -0.248363 0.739324 -0.595149 -0.230891 0.769732\n-0.551866 -0.251850 0.815038 -0.595149 -0.230891 0.769732\n-0.551866 -0.251850 0.815038 -0.592344 -0.252636 0.765052\n-0.651143 -0.248363 0.739324 -0.592344 -0.252636 0.765052\n-0.562872 -0.304491 0.789133 -0.592344 -0.252636 0.765052\n-0.651143 -0.248363 0.739324 -0.602322 -0.285837 0.745322\n-0.654403 -0.301949 0.716139 -0.602322 -0.285837 0.745322\n-0.562872 -0.304491 0.789133 -0.602322 -0.285837 0.745322\n-0.562872 -0.304491 0.789133 -0.592255 -0.339280 0.730838\n-0.654403 -0.301949 0.716139 -0.592255 -0.339280 0.730838\n-0.543746 -0.379105 0.769994 -0.592255 -0.339280 0.730838\n-0.654403 -0.301949 0.716139 -0.632909 -0.488383 0.600756\n-0.460768 -0.536318 0.729608 -0.632909 -0.488383 0.600756\n-0.543746 -0.379105 0.769994 -0.632909 -0.488383 0.600756\n-0.442065 0.499732 0.766236 -0.457021 0.428203 0.779598\n-0.478025 0.492591 0.749078 -0.457021 0.428203 0.779598\n-0.398804 0.440716 0.824012 -0.457021 0.428203 0.779598\n-0.478025 0.492591 0.749078 -0.442206 0.447507 0.777298\n-0.496963 0.414657 0.783172 -0.442206 0.447507 0.777298\n-0.398804 0.440716 0.824012 -0.442206 0.447507 0.777298\n-0.398804 0.440716 0.824012 -0.432396 0.291495 0.853267\n-0.496963 0.414657 0.783172 -0.432396 0.291495 0.853267\n-0.296610 0.343524 0.909002 -0.432396 0.291495 0.853267\n-0.496963 0.414657 0.783172 -0.399019 0.364489 0.841386\n-0.514391 0.327601 0.812619 -0.399019 0.364489 0.841386\n-0.296610 0.343524 0.909002 -0.399019 0.364489 0.841386\n-0.296610 0.343524 0.909002 -0.404463 0.297838 0.864698\n-0.514391 0.327601 0.812619 -0.404463 0.297838 0.864698\n-0.354202 0.203698 0.930225 -0.404463 0.297838 0.864698\n-0.514391 0.327601 0.812619 -0.444314 0.243809 0.862057\n-0.554963 0.221142 0.821818 -0.444314 0.243809 0.862057\n-0.354202 0.203698 0.930225 -0.444314 0.243809 0.862057\n-0.554963 0.221142 0.821818 -0.468507 0.077317 0.880070\n-0.622473 0.105388 0.796048 -0.468507 0.077317 0.880070\n-0.354202 0.203698 0.930225 -0.468507 0.077317 0.880070\n-0.354202 0.203698 0.930225 -0.499425 0.218698 0.838299\n-0.622473 0.105388 0.796048 -0.499425 0.218698 0.838299\n-0.482137 0.055848 0.892578 -0.499425 0.218698 0.838299\n-0.622473 0.105388 0.796048 -0.567977 -0.005251 0.823028\n-0.676229 0.000000 0.758278 -0.567977 -0.005251 0.823028\n-0.482137 0.055848 0.892578 -0.567977 -0.005251 0.823028\n-0.482137 0.055848 0.892578 -0.582371 0.078119 0.809161\n-0.676229 0.000000 0.758278 -0.582371 0.078119 0.809161\n-0.575122 -0.051221 0.835992 -0.582371 0.078119 0.809161\n-0.676229 0.000000 0.758278 -0.631533 -0.075871 0.771628\n-0.707475 -0.077202 0.725114 -0.631533 -0.075871 0.771628\n-0.575122 -0.051221 0.835992 -0.631533 -0.075871 0.771628\n-0.575122 -0.051221 0.835992 -0.636556 -0.043375 0.770010\n-0.707475 -0.077202 0.725114 -0.636556 -0.043375 0.770010\n-0.622906 -0.130077 0.792047 -0.636556 -0.043375 0.770010\n-0.707475 -0.077202 0.725114 -0.671444 -0.157169 0.724196\n-0.743938 -0.141605 0.677330 -0.671444 -0.157169 0.724196\n-0.622906 -0.130077 0.792047 -0.671444 -0.157169 0.724196\n-0.622906 -0.130077 0.792047 -0.677371 -0.116484 0.726361\n-0.743938 -0.141605 0.677330 -0.677371 -0.116484 0.726361\n-0.644909 -0.188079 0.762227 -0.677371 -0.116484 0.726361\n-0.743938 -0.141605 0.677330 -0.688799 -0.189401 0.699774\n-0.746303 -0.213283 0.655601 -0.688799 -0.189401 0.699774\n-0.644909 -0.188079 0.762227 -0.688799 -0.189401 0.699774\n-0.644909 -0.188079 0.762227 -0.687387 -0.194745 0.699695\n-0.746303 -0.213283 0.655601 -0.687387 -0.194745 0.699695\n-0.651143 -0.248363 0.739324 -0.687387 -0.194745 0.699695\n-0.746303 -0.213283 0.655601 -0.689923 -0.251688 0.678719\n-0.654403 -0.301949 0.716139 -0.689923 -0.251688 0.678719\n-0.651143 -0.248363 0.739324 -0.689923 -0.251688 0.678719\n-0.654403 -0.301949 0.716139 -0.506838 -0.374116 0.776629\n-0.639174 -0.417322 0.670500 -0.506838 -0.374116 0.776629\n-0.460768 -0.536318 0.729608 -0.506838 -0.374116 0.776629\n-0.478025 0.492591 0.749078 -0.520483 0.445228 0.728608\n-0.581360 0.449759 0.701433 -0.520483 0.445228 0.728608\n-0.496963 0.414657 0.783172 -0.520483 0.445228 0.728608\n-0.581360 0.449759 0.701433 -0.581172 0.332377 0.742808\n-0.669578 0.374595 0.666045 -0.581172 0.332377 0.742808\n-0.496963 0.414657 0.783172 -0.581172 0.332377 0.742808\n-0.496963 0.414657 0.783172 -0.579419 0.362859 0.729799\n-0.669578 0.374595 0.666045 -0.579419 0.362859 0.729799\n-0.514391 0.327601 0.812619 -0.579419 0.362859 0.729799\n-0.669578 0.374595 0.666045 -0.604121 0.303384 0.736883\n-0.658964 0.197326 0.747730 -0.604121 0.303384 0.736883\n-0.514391 0.327601 0.812619 -0.604121 0.303384 0.736883\n-0.514391 0.327601 0.812619 -0.598360 0.292482 0.745935\n-0.658964 0.197326 0.747730 -0.598360 0.292482 0.745935\n-0.554963 0.221142 0.821818 -0.598360 0.292482 0.745935\n-0.554963 0.221142 0.821818 -0.597486 0.174212 0.782727\n-0.658964 0.197326 0.747730 -0.597486 0.174212 0.782727\n-0.622473 0.105388 0.796048 -0.597486 0.174212 0.782727\n-0.658964 0.197326 0.747730 -0.680769 0.110364 0.724136\n-0.737568 0.042113 0.697489 -0.680769 0.110364 0.724136\n-0.622473 0.105388 0.796048 -0.680769 0.110364 0.724136\n-0.622473 0.105388 0.796048 -0.673378 0.080077 0.734949\n-0.737568 0.042113 0.697489 -0.673378 0.080077 0.734949\n-0.676229 0.000000 0.758278 -0.673378 0.080077 0.734949\n-0.737568 0.042113 0.697489 -0.721148 -0.053339 0.690724\n-0.795687 -0.036976 0.630703 -0.721148 -0.053339 0.690724\n-0.676229 0.000000 0.758278 -0.721148 -0.053339 0.690724\n-0.676229 0.000000 0.758278 -0.730245 0.002074 0.683182\n-0.795687 -0.036976 0.630703 -0.730245 0.002074 0.683182\n-0.707475 -0.077202 0.725114 -0.730245 0.002074 0.683182\n-0.795687 -0.036976 0.630703 -0.750574 -0.121509 0.649519\n-0.814064 -0.160448 0.586368 -0.750574 -0.121509 0.649519\n-0.707475 -0.077202 0.725114 -0.750574 -0.121509 0.649519\n-0.707475 -0.077202 0.725114 -0.791411 -0.005453 0.611260\n-0.814064 -0.160448 0.586368 -0.791411 -0.005453 0.611260\n-0.743938 -0.141605 0.677330 -0.791411 -0.005453 0.611260\n-0.743938 -0.141605 0.677330 -0.764590 -0.163738 0.623371\n-0.814064 -0.160448 0.586368 -0.764590 -0.163738 0.623371\n-0.746303 -0.213283 0.655601 -0.764590 -0.163738 0.623371\n-0.746303 -0.213283 0.655601 -0.713299 -0.310232 0.628459\n-0.792221 -0.257075 0.581867 -0.713299 -0.310232 0.628459\n-0.654403 -0.301949 0.716139 -0.713299 -0.310232 0.628459\n-0.654403 -0.301949 0.716139 -0.710930 -0.337834 0.616803\n-0.792221 -0.257075 0.581867 -0.710930 -0.337834 0.616803\n-0.639174 -0.417322 0.670500 -0.710930 -0.337834 0.616803\n-0.792221 -0.257075 0.581867 -0.628964 -0.182754 0.755649\n-0.714538 -0.373106 0.618465 -0.628964 -0.182754 0.755649\n-0.639174 -0.417322 0.670500 -0.628964 -0.182754 0.755649\n-0.714538 -0.373106 0.618465 -0.669182 -0.415789 0.615886\n-0.706704 -0.446988 0.577099 -0.669182 -0.415789 0.615886\n-0.639174 -0.417322 0.670500 -0.669182 -0.415789 0.615886\n-0.487333 0.598067 0.661130 -0.513444 0.522363 0.680817\n-0.547019 0.578783 0.630914 -0.513444 0.522363 0.680817\n-0.478025 0.492591 0.749078 -0.513444 0.522363 0.680817\n-0.547019 0.578783 0.630914 -0.539404 0.498543 0.678600\n-0.618310 0.504855 0.628559 -0.539404 0.498543 0.678600\n-0.478025 0.492591 0.749078 -0.539404 0.498543 0.678600\n-0.478025 0.492591 0.749078 -0.526208 0.528377 0.666275\n-0.618310 0.504855 0.628559 -0.526208 0.528377 0.666275\n-0.581360 0.449759 0.701433 -0.526208 0.528377 0.666275\n-0.618310 0.504855 0.628559 -0.628336 0.433247 0.646135\n-0.669578 0.374595 0.666045 -0.628336 0.433247 0.646135\n-0.581360 0.449759 0.701433 -0.628336 0.433247 0.646135\n-0.669578 0.374595 0.666045 -0.660413 0.281281 0.696230\n-0.741321 0.258011 0.645093 -0.660413 0.281281 0.696230\n-0.658964 0.197326 0.747730 -0.660413 0.281281 0.696230\n-0.741321 0.258011 0.645093 -0.725876 0.150164 0.671234\n-0.799003 0.080753 0.622370 -0.725876 0.150164 0.671234\n-0.658964 0.197326 0.747730 -0.725876 0.150164 0.671234\n-0.658964 0.197326 0.747730 -0.725959 0.150421 0.671087\n-0.799003 0.080753 0.622370 -0.725959 0.150421 0.671087\n-0.737568 0.042113 0.697489 -0.725959 0.150421 0.671087\n-0.799003 0.080753 0.622370 -0.778580 -0.018419 0.627275\n-0.849544 0.000000 0.557267 -0.778580 -0.018419 0.627275\n-0.737568 0.042113 0.697489 -0.778580 -0.018419 0.627275\n-0.737568 0.042113 0.697489 -0.789097 0.063978 0.610927\n-0.849544 0.000000 0.557267 -0.789097 0.063978 0.610927\n-0.795687 -0.036976 0.630703 -0.789097 0.063978 0.610927\n-0.849544 0.000000 0.557267 -0.828668 -0.122084 0.546265\n-0.905055 -0.097863 0.451187 -0.828668 -0.122084 0.546265\n-0.795687 -0.036976 0.630703 -0.828668 -0.122084 0.546265\n-0.795687 -0.036976 0.630703 -0.841810 -0.067023 0.535596\n-0.905055 -0.097863 0.451187 -0.841810 -0.067023 0.535596\n-0.814064 -0.160448 0.586368 -0.841810 -0.067023 0.535596\n-0.814064 -0.160448 0.586368 -0.779466 -0.243143 0.577334\n-0.843539 -0.202244 0.528971 -0.779466 -0.243143 0.577334\n-0.746303 -0.213283 0.655601 -0.779466 -0.243143 0.577334\n-0.843539 -0.202244 0.528971 -0.788884 -0.168089 0.591108\n-0.792221 -0.257075 0.581867 -0.788884 -0.168089 0.591108\n-0.746303 -0.213283 0.655601 -0.788884 -0.168089 0.591108\n-0.799003 0.080753 0.622370 -0.863089 0.151852 0.481683\n-0.909591 -0.009226 0.452582 -0.863089 0.151852 0.481683\n-0.849544 0.000000 0.557267 -0.863089 0.151852 0.481683\n-0.849544 0.000000 0.557267 -0.864264 -0.052104 0.500332\n-0.909591 -0.009226 0.452582 -0.864264 -0.052104 0.500332\n-0.905055 -0.097863 0.451187 -0.864264 -0.052104 0.500332\n-0.905055 -0.097863 0.451187 -0.846645 -0.103371 0.522022\n-0.877574 -0.178949 0.479700 -0.846645 -0.103371 0.522022\n-0.814064 -0.160448 0.586368 -0.846645 -0.103371 0.522022\n-0.814064 -0.160448 0.586368 -0.842923 -0.124402 0.523454\n-0.877574 -0.178949 0.479700 -0.842923 -0.124402 0.523454\n-0.843539 -0.202244 0.528971 -0.842923 -0.124402 0.523454\n-0.792221 -0.257075 0.581867 -0.758516 -0.330729 0.561490\n-0.807491 -0.360114 0.500547 -0.758516 -0.330729 0.561490\n-0.714538 -0.373106 0.618465 -0.758516 -0.330729 0.561490\n-0.714538 -0.373106 0.618465 -0.745171 -0.384201 0.545078\n-0.807491 -0.360114 0.500547 -0.745171 -0.384201 0.545078\n-0.706704 -0.446988 0.577099 -0.745171 -0.384201 0.545078\n-0.807491 -0.360114 0.500547 -0.748266 -0.405342 0.525162\n-0.725577 -0.480468 0.524366 -0.748266 -0.405342 0.525162\n-0.706704 -0.446988 0.577099 -0.748266 -0.405342 0.525162\n-0.642442 0.639163 0.459359 -0.626907 0.556997 0.544740\n-0.720166 0.539160 0.472164 -0.626907 0.556997 0.544740\n-0.547019 0.578783 0.630914 -0.626907 0.556997 0.544740\n-0.547019 0.578783 0.630914 -0.618728 0.579769 0.530136\n-0.720166 0.539160 0.472164 -0.618728 0.579769 0.530136\n-0.618310 0.504855 0.628559 -0.618728 0.579769 0.530136\n-0.720166 0.539160 0.472164 -0.697360 0.454802 0.553935\n-0.786003 0.383223 0.517310 -0.697360 0.454802 0.553935\n-0.618310 0.504855 0.628559 -0.697360 0.454802 0.553935\n-0.618310 0.504855 0.628559 -0.695499 0.437717 0.569812\n-0.786003 0.383223 0.517310 -0.695499 0.437717 0.569812\n-0.669578 0.374595 0.666045 -0.695499 0.437717 0.569812\n-0.669578 0.374595 0.666045 -0.729934 0.342926 0.591268\n-0.786003 0.383223 0.517310 -0.729934 0.342926 0.591268\n-0.741321 0.258011 0.645093 -0.729934 0.342926 0.591268\n-0.786003 0.383223 0.517310 -0.809957 0.251613 0.529773\n-0.885185 0.155329 0.473911 -0.809957 0.251613 0.529773\n-0.741321 0.258011 0.645093 -0.809957 0.251613 0.529773\n-0.741321 0.258011 0.645093 -0.804736 0.189766 0.562484\n-0.885185 0.155329 0.473911 -0.804736 0.189766 0.562484\n-0.799003 0.080753 0.622370 -0.804736 0.189766 0.562484\n-0.799003 0.080753 0.622370 -0.850364 0.058339 0.522951\n-0.885185 0.155329 0.473911 -0.850364 0.058339 0.522951\n-0.909591 -0.009226 0.452582 -0.850364 0.058339 0.522951\n-0.909591 -0.009226 0.452582 -0.890095 -0.052677 0.452720\n-0.924039 -0.050108 0.419419 -0.890095 -0.052677 0.452720\n-0.905055 -0.097863 0.451187 -0.890095 -0.052677 0.452720\n-0.843539 -0.202244 0.528971 -0.829326 -0.410980 0.378569\n-0.877574 -0.178949 0.479700 -0.829326 -0.410980 0.378569\n-0.792221 -0.257075 0.581867 -0.829326 -0.410980 0.378569\n-0.877574 -0.178949 0.479700 -0.828447 -0.249102 0.501621\n-0.853017 -0.317588 0.451410 -0.828447 -0.249102 0.501621\n-0.792221 -0.257075 0.581867 -0.828447 -0.249102 0.501621\n-0.792221 -0.257075 0.581867 -0.813045 -0.281649 0.509541\n-0.853017 -0.317588 0.451410 -0.813045 -0.281649 0.509541\n-0.807491 -0.360114 0.500547 -0.813045 -0.281649 0.509541\n-0.853017 -0.317588 0.451410 -0.818167 -0.340778 0.463113\n-0.821358 -0.383886 0.458557 -0.818167 -0.340778 0.463113\n-0.807491 -0.360114 0.500547 -0.818167 -0.340778 0.463113\n-0.807491 -0.360114 0.500547 -0.762463 -0.421843 0.490611\n-0.821358 -0.383886 0.458557 -0.762463 -0.421843 0.490611\n-0.725577 -0.480468 0.524366 -0.762463 -0.421843 0.490611\n0.282736 -0.112435 0.969376 -0.484634 -0.687678 -0.540582\n0.183533 -0.064407 0.997216 -0.484634 -0.687678 -0.540582\n0.054852 0.012734 1.014446 -0.484634 -0.687678 -0.540582\n-0.435786 -0.355231 0.846270 -0.284821 -0.419733 0.861801\n-0.132682 -0.478360 0.886476 -0.284821 -0.419733 0.861801\n-0.202847 -0.305233 0.947606 -0.284821 -0.419733 0.861801\n-0.543746 -0.379105 0.769994 -0.470841 -0.393512 0.789593\n-0.418673 -0.445537 0.811468 -0.470841 -0.393512 0.789593\n-0.435786 -0.355231 0.846270 -0.470841 -0.393512 0.789593\n-0.706704 -0.446988 0.577099 -0.620890 -0.496509 0.606609\n-0.573320 -0.587914 0.598275 -0.620890 -0.496509 0.606609\n-0.639174 -0.417322 0.670500 -0.620890 -0.496509 0.606609\n0.282736 -0.112435 0.969376 -0.176932 0.193868 -0.964940\n0.309301 -0.183520 0.950223 -0.176932 0.193868 -0.964940\n0.183533 -0.064407 0.997216 -0.176932 0.193868 -0.964940\n0.282736 -0.112435 0.969376 -0.305204 0.139743 -0.941978\n0.330015 -0.176881 0.944497 -0.305204 0.139743 -0.941978\n0.309301 -0.183520 0.950223 -0.305204 0.139743 -0.941978\n0.330015 -0.176881 0.944497 -0.322596 0.210526 -0.922828\n0.354553 -0.235728 0.922494 -0.322596 0.210526 -0.922828\n0.309301 -0.183520 0.950223 -0.322596 0.210526 -0.922828\n0.153264 -0.282605 0.963803 0.269186 -0.281864 0.920919\n0.379807 -0.323708 0.885004 0.269186 -0.281864 0.920919\n0.330015 -0.176881 0.944497 0.269186 -0.281864 0.920919\n0.330015 -0.176881 0.944497 -0.333258 -0.448953 0.829084\n0.379807 -0.323708 0.885004 -0.333258 -0.448953 0.829084\n0.354553 -0.235728 0.922494 -0.333258 -0.448953 0.829084\n0.354553 -0.235728 0.922494 0.465271 -0.230617 0.854599\n0.379807 -0.323708 0.885004 0.465271 -0.230617 0.854599\n0.484744 -0.354278 0.819623 0.465271 -0.230617 0.854599\n-0.023460 -0.262463 0.981241 0.004750 -0.630389 0.776265\n-0.202847 -0.305233 0.947606 0.004750 -0.630389 0.776265\n0.153264 -0.282605 0.963803 0.004750 -0.630389 0.776265\n-0.202847 -0.305233 0.947606 -0.018294 -0.375399 0.926683\n0.180251 -0.374797 0.926988 -0.018294 -0.375399 0.926683\n0.153264 -0.282605 0.963803 -0.018294 -0.375399 0.926683\n0.153264 -0.282605 0.963803 0.267356 -0.288830 0.919292\n0.180251 -0.374797 0.926988 0.267356 -0.288830 0.919292\n0.379807 -0.323708 0.885004 0.267356 -0.288830 0.919292\n0.180251 -0.374797 0.926988 0.265342 -0.277661 0.923308\n0.311271 -0.391897 0.884193 0.265342 -0.277661 0.923308\n0.379807 -0.323708 0.885004 0.265342 -0.277661 0.923308\n0.311271 -0.391897 0.884193 0.360154 -0.372148 0.855450\n0.369852 -0.430071 0.842923 0.360154 -0.372148 0.855450\n0.379807 -0.323708 0.885004 0.360154 -0.372148 0.855450\n0.379807 -0.323708 0.885004 0.411984 -0.368293 0.833444\n0.369852 -0.430071 0.842923 0.411984 -0.368293 0.833444\n0.484744 -0.354278 0.819623 0.411984 -0.368293 0.833444\n-0.132682 -0.478360 0.886476 -0.048364 -0.349932 0.935526\n0.022849 -0.487626 0.891050 -0.048364 -0.349932 0.935526\n-0.202847 -0.305233 0.947606 -0.048364 -0.349932 0.935526\n-0.202847 -0.305233 0.947606 -0.003061 -0.299618 0.954054\n0.022849 -0.487626 0.891050 -0.003061 -0.299618 0.954054\n0.180251 -0.374797 0.926988 -0.003061 -0.299618 0.954054\n0.266566 -0.535478 0.821266 0.365451 -0.517124 0.773969\n0.268680 -0.564821 0.800662 0.365451 -0.517124 0.773969\n0.369852 -0.430071 0.842923 0.365451 -0.517124 0.773969\n-0.435786 -0.355231 0.846270 -0.275221 -0.390673 0.878423\n-0.418673 -0.445537 0.811468 -0.275221 -0.390673 0.878423\n-0.132682 -0.478360 0.886476 -0.275221 -0.390673 0.878423\n0.022849 -0.487626 0.891050 0.104248 -0.430936 0.896340\n0.120876 -0.522905 0.862688 0.104248 -0.430936 0.896340\n0.180251 -0.374797 0.926988 0.104248 -0.430936 0.896340\n0.180251 -0.374797 0.926988 0.220458 -0.461458 0.859334\n0.120876 -0.522905 0.862688 0.220458 -0.461458 0.859334\n0.311271 -0.391897 0.884193 0.220458 -0.461458 0.859334\n0.120876 -0.522905 0.862688 0.174691 -0.401464 0.899060\n0.217525 -0.520634 0.844923 0.174691 -0.401464 0.899060\n0.311271 -0.391897 0.884193 0.174691 -0.401464 0.899060\n0.311271 -0.391897 0.884193 0.287264 -0.464687 0.837583\n0.217525 -0.520634 0.844923 0.287264 -0.464687 0.837583\n0.369852 -0.430071 0.842923 0.287264 -0.464687 0.837583\n0.217525 -0.520634 0.844923 0.276018 -0.445460 0.851692\n0.266566 -0.535478 0.821266 0.276018 -0.445460 0.851692\n0.369852 -0.430071 0.842923 0.276018 -0.445460 0.851692\n-0.418673 -0.445537 0.811468 -0.269671 -0.560759 0.782833\n-0.086106 -0.578913 0.830492 -0.269671 -0.560759 0.782833\n-0.132682 -0.478360 0.886476 -0.269671 -0.560759 0.782833\n-0.132682 -0.478360 0.886476 -0.055428 -0.505173 0.861236\n-0.086106 -0.578913 0.830492 -0.055428 -0.505173 0.861236\n0.022849 -0.487626 0.891050 -0.055428 -0.505173 0.861236\n-0.086106 -0.578913 0.830492 -0.005414 -0.548301 0.836263\n0.018628 -0.623858 0.801701 -0.005414 -0.548301 0.836263\n0.022849 -0.487626 0.891050 -0.005414 -0.548301 0.836263\n0.022849 -0.487626 0.891050 0.043997 -0.548848 0.834763\n0.018628 -0.623858 0.801701 0.043997 -0.548848 0.834763\n0.120876 -0.522905 0.862688 0.043997 -0.548848 0.834763\n-0.543746 -0.379105 0.769994 -0.487041 -0.449440 0.748863\n-0.460768 -0.536318 0.729608 -0.487041 -0.449440 0.748863\n-0.418673 -0.445537 0.811468 -0.487041 -0.449440 0.748863\n-0.460768 -0.536318 0.729608 -0.369813 -0.521753 0.768773\n-0.286012 -0.572597 0.789051 -0.369813 -0.521753 0.768773\n-0.418673 -0.445537 0.811468 -0.369813 -0.521753 0.768773\n-0.418673 -0.445537 0.811468 -0.199835 -0.368807 0.907770\n-0.286012 -0.572597 0.789051 -0.199835 -0.368807 0.907770\n-0.086106 -0.578913 0.830492 -0.199835 -0.368807 0.907770\n-0.286012 -0.572597 0.789051 -0.176800 -0.629060 0.756984\n-0.053895 -0.639920 0.787318 -0.176800 -0.629060 0.756984\n-0.086106 -0.578913 0.830492 -0.176800 -0.629060 0.756984\n-0.086106 -0.578913 0.830492 -0.030105 -0.587950 0.808337\n-0.053895 -0.639920 0.787318 -0.030105 -0.587950 0.808337\n0.018628 -0.623858 0.801701 -0.030105 -0.587950 0.808337\n0.018628 -0.623858 0.801701 0.139099 -0.611456 0.778956\n0.135699 -0.713705 0.710269 0.139099 -0.611456 0.778956\n0.120876 -0.522905 0.862688 0.139099 -0.611456 0.778956\n0.120876 -0.522905 0.862688 0.157223 -0.608896 0.777513\n0.135699 -0.713705 0.710269 0.157223 -0.608896 0.777513\n0.217525 -0.520634 0.844923 0.157223 -0.608896 0.777513\n0.217525 -0.520634 0.844923 0.184593 -0.613650 0.767698\n0.135699 -0.713705 0.710269 0.184593 -0.613650 0.767698\n0.266566 -0.535478 0.821266 0.184593 -0.613650 0.767698\n0.266566 -0.535478 0.821266 0.080580 -0.568889 0.818457\n0.135699 -0.713705 0.710269 0.080580 -0.568889 0.818457\n0.268680 -0.564821 0.800662 0.080580 -0.568889 0.818457\n0.268680 -0.564821 0.800662 0.217561 -0.641139 0.735940\n0.135699 -0.713705 0.710269 0.217561 -0.641139 0.735940\n0.275018 -0.712119 0.670465 0.217561 -0.641139 0.735940\n-0.460768 -0.536318 0.729608 -0.368039 -0.572940 0.732316\n-0.337052 -0.660071 0.694963 -0.368039 -0.572940 0.732316\n-0.286012 -0.572597 0.789051 -0.368039 -0.572940 0.732316\n-0.337052 -0.660071 0.694963 -0.206768 -0.658088 0.723994\n-0.078177 -0.688379 0.743165 -0.206768 -0.658088 0.723994\n-0.286012 -0.572597 0.789051 -0.206768 -0.658088 0.723994\n-0.286012 -0.572597 0.789051 -0.172557 -0.614755 0.769611\n-0.078177 -0.688379 0.743165 -0.172557 -0.614755 0.769611\n-0.053895 -0.639920 0.787318 -0.172557 -0.614755 0.769611\n-0.053895 -0.639920 0.787318 0.002872 -0.674283 0.738467\n-0.078177 -0.688379 0.743165 0.002872 -0.674283 0.738467\n0.018628 -0.623858 0.801701 0.002872 -0.674283 0.738467\n-0.078177 -0.688379 0.743165 0.006244 -0.677035 0.735924\n0.090040 -0.693943 0.736618 0.006244 -0.677035 0.735924\n0.018628 -0.623858 0.801701 0.006244 -0.677035 0.735924\n0.018628 -0.623858 0.801701 0.258509 -0.502653 0.824932\n0.090040 -0.693943 0.736618 0.258509 -0.502653 0.824932\n0.135699 -0.713705 0.710269 0.258509 -0.502653 0.824932\n-0.639174 -0.417322 0.670500 -0.552937 -0.496692 0.668998\n-0.573320 -0.587914 0.598275 -0.552937 -0.496692 0.668998\n-0.460768 -0.536318 0.729608 -0.552937 -0.496692 0.668998\n0.090040 -0.693943 0.736618 0.085356 -0.720449 0.688236\n0.123979 -0.754911 0.668589 0.085356 -0.720449 0.688236\n0.135699 -0.713705 0.710269 0.085356 -0.720449 0.688236\n0.123979 -0.754911 0.668589 0.191177 -0.724379 0.662364\n0.212603 -0.778787 0.616897 0.191177 -0.724379 0.662364\n0.135699 -0.713705 0.710269 0.191177 -0.724379 0.662364\n0.135699 -0.713705 0.710269 0.198218 -0.719973 0.665093\n0.212603 -0.778787 0.616897 0.198218 -0.719973 0.665093\n0.275018 -0.712119 0.670465 0.198218 -0.719973 0.665093\n0.212603 -0.778787 0.616897 0.307058 -0.754025 0.580656\n0.303659 -0.826878 0.506296 0.307058 -0.754025 0.580656\n0.275018 -0.712119 0.670465 0.307058 -0.754025 0.580656\n0.303659 -0.826878 0.506296 0.371641 -0.729209 0.574575\n0.501356 -0.694167 0.546850 0.371641 -0.729209 0.574575\n0.275018 -0.712119 0.670465 0.371641 -0.729209 0.574575\n-0.573320 -0.587914 0.598275 -0.427219 -0.654871 0.623400\n-0.337311 -0.775965 0.562469 -0.427219 -0.654871 0.623400\n-0.460768 -0.536318 0.729608 -0.427219 -0.654871 0.623400\n-0.460768 -0.536318 0.729608 -0.493770 -0.654052 0.573069\n-0.337311 -0.775965 0.562469 -0.493770 -0.654052 0.573069\n-0.337052 -0.660071 0.694963 -0.493770 -0.654052 0.573069\n-0.337052 -0.660071 0.694963 -0.200745 -0.737168 0.645201\n-0.337311 -0.775965 0.562469 -0.200745 -0.737168 0.645201\n-0.078177 -0.688379 0.743165 -0.200745 -0.737168 0.645201\n-0.337311 -0.775965 0.562469 -0.203806 -0.733871 0.647994\n-0.135313 -0.844629 0.548237 -0.203806 -0.733871 0.647994\n-0.078177 -0.688379 0.743165 -0.203806 -0.733871 0.647994\n-0.135313 -0.844629 0.548237 -0.056440 -0.770886 0.634468\n0.077300 -0.801994 0.618953 -0.056440 -0.770886 0.634468\n-0.078177 -0.688379 0.743165 -0.056440 -0.770886 0.634468\n-0.078177 -0.688379 0.743165 0.001950 -0.736666 0.676254\n0.077300 -0.801994 0.618953 0.001950 -0.736666 0.676254\n0.090040 -0.693943 0.736618 0.001950 -0.736666 0.676254\n0.077300 -0.801994 0.618953 0.149302 -0.736307 0.659971\n0.129577 -0.815204 0.592388 0.149302 -0.736307 0.659971\n0.090040 -0.693943 0.736618 0.149302 -0.736307 0.659971\n0.090040 -0.693943 0.736618 -0.191533 -0.776487 0.600320\n0.129577 -0.815204 0.592388 -0.191533 -0.776487 0.600320\n0.123979 -0.754911 0.668589 -0.191533 -0.776487 0.600320\n0.129577 -0.815204 0.592388 0.135280 -0.772138 0.620889\n0.161637 -0.808111 0.594223 0.135280 -0.772138 0.620889\n0.123979 -0.754911 0.668589 0.135280 -0.772138 0.620889\n0.161637 -0.808111 0.594223 0.160032 -0.762684 0.626660\n0.212603 -0.778787 0.616897 0.160032 -0.762684 0.626660\n0.123979 -0.754911 0.668589 0.160032 -0.762684 0.626660\n0.303659 -0.826878 0.506296 0.388882 -0.744954 0.542046\n0.398605 -0.821478 0.445599 0.388882 -0.744954 0.542046\n0.501356 -0.694167 0.546850 0.388882 -0.744954 0.542046\n-0.706704 -0.446988 0.577099 -0.641456 -0.522755 0.561481\n-0.725577 -0.480468 0.524366 -0.641456 -0.522755 0.561481\n-0.573320 -0.587914 0.598275 -0.641456 -0.522755 0.561481\n-0.573320 -0.587914 0.598275 -0.483109 -0.705139 0.519022\n-0.385760 -0.824189 0.451855 -0.483109 -0.705139 0.519022\n-0.337311 -0.775965 0.562469 -0.483109 -0.705139 0.519022\n0.161637 -0.808111 0.594223 0.235306 -0.816553 0.527136\n0.291722 -0.859466 0.456605 0.235306 -0.816553 0.527136\n0.212603 -0.778787 0.616897 0.235306 -0.816553 0.527136\n0.291722 -0.859466 0.456605 0.174984 -0.842065 0.510202\n0.303659 -0.826878 0.506296 0.174984 -0.842065 0.510202\n0.212603 -0.778787 0.616897 0.174984 -0.842065 0.510202\n0.303659 -0.826878 0.506296 0.374375 -0.769672 0.517154\n0.367627 -0.832822 0.451141 0.374375 -0.769672 0.517154\n0.398605 -0.821478 0.445599 0.374375 -0.769672 0.517154\n-0.725577 -0.480468 0.524366 -0.645157 -0.547976 0.532442\n-0.650063 -0.627939 0.464093 -0.645157 -0.547976 0.532442\n-0.573320 -0.587914 0.598275 -0.645157 -0.547976 0.532442\n-0.650063 -0.627939 0.464093 -0.516889 -0.693136 0.502382\n-0.522063 -0.784590 0.379658 -0.516889 -0.693136 0.502382\n-0.573320 -0.587914 0.598275 -0.516889 -0.693136 0.502382\n-0.573320 -0.587914 0.598275 -0.480947 -0.704881 0.521376\n-0.522063 -0.784590 0.379658 -0.480947 -0.704881 0.521376\n-0.385760 -0.824189 0.451855 -0.480947 -0.704881 0.521376\n-0.337311 -0.775965 0.562469 -0.252439 -0.841598 0.477480\n-0.385760 -0.824189 0.451855 -0.252439 -0.841598 0.477480\n-0.135313 -0.844629 0.548237 -0.252439 -0.841598 0.477480\n-0.135313 -0.844629 0.548237 -0.007775 -0.845857 0.533353\n0.037874 -0.916696 0.436468 -0.007775 -0.845857 0.533353\n0.077300 -0.801994 0.618953 -0.007775 -0.845857 0.533353\n0.077300 -0.801994 0.618953 0.051120 -0.850472 0.523530\n0.037874 -0.916696 0.436468 0.051120 -0.850472 0.523530\n0.129577 -0.815204 0.592388 0.051120 -0.850472 0.523530\n0.129577 -0.815204 0.592388 0.165286 -0.868182 0.467912\n0.037874 -0.916696 0.436468 0.165286 -0.868182 0.467912\n0.161637 -0.808111 0.594223 0.165286 -0.868182 0.467912\n0.037874 -0.916696 0.436468 0.136710 -0.862834 0.486649\n0.247455 -0.883392 0.436641 0.136710 -0.862834 0.486649\n0.161637 -0.808111 0.594223 0.136710 -0.862834 0.486649\n0.161637 -0.808111 0.594223 0.216544 -0.829795 0.514343\n0.247455 -0.883392 0.436641 0.216544 -0.829795 0.514343\n0.291722 -0.859466 0.456605 0.216544 -0.829795 0.514343\n0.291722 -0.859466 0.456605 0.349657 -0.819746 0.453603\n0.404424 -0.835781 0.412532 0.349657 -0.819746 0.453603\n0.303659 -0.826878 0.506296 0.349657 -0.819746 0.453603\n0.303659 -0.826878 0.506296 -0.148636 -0.986684 -0.066047\n0.404424 -0.835781 0.412532 -0.148636 -0.986684 -0.066047\n0.367627 -0.832822 0.451141 -0.148636 -0.986684 -0.066047\n0.367627 -0.832822 0.451141 0.377358 -0.823928 0.422781\n0.404424 -0.835781 0.412532 0.377358 -0.823928 0.422781\n0.398605 -0.821478 0.445599 0.377358 -0.823928 0.422781\n0.404424 -0.835781 0.412532 -0.373995 0.825430 -0.422839\n0.369679 -0.854630 0.406468 -0.373995 0.825430 -0.422839\n0.398605 -0.821478 0.445599 -0.373995 0.825430 -0.422839\n0.398605 -0.821478 0.445599 0.371171 -0.825571 0.425046\n0.369679 -0.854630 0.406468 0.371171 -0.825571 0.425046\n0.403557 -0.834131 0.416700 0.371171 -0.825571 0.425046\n0.309301 -0.183520 0.950223 0.260344 -0.103814 0.959919\n0.330336 -0.165174 0.946503 0.260344 -0.103814 0.959919\n0.183533 -0.064407 0.997216 0.260344 -0.103814 0.959919\n0.354553 -0.235728 0.922494 0.335704 -0.198137 0.920893\n0.330336 -0.165174 0.946503 0.335704 -0.198137 0.920893\n0.309301 -0.183520 0.950223 0.335704 -0.198137 0.920893\n0.484744 -0.354278 0.819623 0.350727 -0.363679 0.862976\n0.421447 -0.244869 0.891456 0.350727 -0.363679 0.862976\n0.354553 -0.235728 0.922494 0.350727 -0.363679 0.862976\n0.268680 -0.564821 0.800662 0.310363 -0.488744 0.815355\n0.395221 -0.496509 0.793442 0.310363 -0.488744 0.815355\n0.369852 -0.430071 0.842923 0.310363 -0.488744 0.815355\n0.275018 -0.712119 0.670465 0.367831 -0.606909 0.704530\n0.395221 -0.496509 0.793442 0.367831 -0.606909 0.704530\n0.268680 -0.564821 0.800662 0.367831 -0.606909 0.704530\n0.398605 -0.821478 0.445599 0.459790 -0.749668 0.476016\n0.454265 -0.815149 0.401805 0.459790 -0.749668 0.476016\n0.501356 -0.694167 0.546850 0.459790 -0.749668 0.476016\n0.403557 -0.834131 0.416700 0.424040 -0.800679 0.423207\n0.454265 -0.815149 0.401805 0.424040 -0.800679 0.423207\n0.398605 -0.821478 0.445599 0.424040 -0.800679 0.423207\n0.183533 -0.064407 0.997216 0.121582 -0.018852 0.992402\n0.085965 0.046808 1.011281 0.121582 -0.018852 0.992402\n0.054852 0.012734 1.014446 0.121582 -0.018852 0.992402\n0.183533 -0.064407 0.997216 0.129616 -0.011689 0.991495\n0.160666 0.056517 1.001631 0.129616 -0.011689 0.991495\n0.085965 0.046808 1.011281 0.129616 -0.011689 0.991495\n0.354553 -0.235728 0.922494 0.395302 -0.171394 0.902419\n0.421447 -0.244869 0.891456 0.395302 -0.171394 0.902419\n0.330336 -0.165174 0.946503 0.395302 -0.171394 0.902419\n0.330336 -0.165174 0.946503 -0.483470 -0.288401 -0.826487\n0.302864 -0.151716 0.957876 -0.483470 -0.288401 -0.826487\n0.183533 -0.064407 0.997216 -0.483470 -0.288401 -0.826487\n0.302864 -0.151716 0.957876 0.118344 -0.268940 0.955859\n0.259670 -0.103466 0.976800 0.118344 -0.268940 0.955859\n0.183533 -0.064407 0.997216 0.118344 -0.268940 0.955859\n0.183533 -0.064407 0.997216 0.266211 0.015153 0.963796\n0.259670 -0.103466 0.976800 0.266211 0.015153 0.963796\n0.160666 0.056517 1.001631 0.266211 0.015153 0.963796\n0.259670 -0.103466 0.976800 0.184314 -0.038373 0.982118\n0.216075 0.055717 0.991201 0.184314 -0.038373 0.982118\n0.160666 0.056517 1.001631 0.184314 -0.038373 0.982118\n0.421447 -0.244869 0.891456 -0.152303 0.437887 -0.886036\n0.302864 -0.151716 0.957876 -0.152303 0.437887 -0.886036\n0.330336 -0.165174 0.946503 -0.152303 0.437887 -0.886036\n0.259670 -0.103466 0.976800 0.217212 -0.028782 0.975700\n0.302671 -0.022348 0.969620 0.217212 -0.028782 0.975700\n0.216075 0.055717 0.991201 0.217212 -0.028782 0.975700\n0.484744 -0.354278 0.819623 0.437109 -0.303085 0.846803\n0.509222 -0.300333 0.826296 0.437109 -0.303085 0.846803\n0.421447 -0.244869 0.891456 0.437109 -0.303085 0.846803\n0.421447 -0.244869 0.891456 0.693140 0.551035 0.464670\n0.509222 -0.300333 0.826296 0.693140 0.551035 0.464670\n0.302864 -0.151716 0.957876 0.693140 0.551035 0.464670\n0.509222 -0.300333 0.826296 0.150178 -0.530254 0.834433\n0.348857 -0.167819 0.939365 0.150178 -0.530254 0.834433\n0.302864 -0.151716 0.957876 0.150178 -0.530254 0.834433\n0.302864 -0.151716 0.957876 0.359940 -0.043291 0.931970\n0.348857 -0.167819 0.939365 0.359940 -0.043291 0.931970\n0.259670 -0.103466 0.976800 0.359940 -0.043291 0.931970\n0.348857 -0.167819 0.939365 0.328809 -0.091100 0.939992\n0.302671 -0.022348 0.969620 0.328809 -0.091100 0.939992\n0.259670 -0.103466 0.976800 0.328809 -0.091100 0.939992\n0.369852 -0.430071 0.842923 0.439494 -0.422533 0.792661\n0.395221 -0.496509 0.793442 0.439494 -0.422533 0.792661\n0.484744 -0.354278 0.819623 0.439494 -0.422533 0.792661\n0.395221 -0.496509 0.793442 0.531421 -0.464843 0.708176\n0.609342 -0.325565 0.744971 0.531421 -0.464843 0.708176\n0.484744 -0.354278 0.819623 0.531421 -0.464843 0.708176\n0.484744 -0.354278 0.819623 0.539753 -0.340164 0.770036\n0.609342 -0.325565 0.744971 0.539753 -0.340164 0.770036\n0.509222 -0.300333 0.826296 0.539753 -0.340164 0.770036\n0.509222 -0.300333 0.826296 0.411548 -0.249825 0.876479\n0.524831 -0.231173 0.838679 0.411548 -0.249825 0.876479\n0.348857 -0.167819 0.939365 0.411548 -0.249825 0.876479\n0.524831 -0.231173 0.838679 0.428902 -0.206367 0.879464\n0.470212 -0.108587 0.894081 0.428902 -0.206367 0.879464\n0.348857 -0.167819 0.939365 0.428902 -0.206367 0.879464\n0.348857 -0.167819 0.939365 0.379155 -0.071492 0.922567\n0.470212 -0.108587 0.894081 0.379155 -0.071492 0.922567\n0.302671 -0.022348 0.969620 0.379155 -0.071492 0.922567\n0.302671 -0.022348 0.969620 0.443182 0.078832 0.892959\n0.470212 -0.108587 0.894081 0.443182 0.078832 0.892959\n0.273499 0.067145 0.976197 0.443182 0.078832 0.892959\n0.470212 -0.108587 0.894081 0.345302 -0.051354 0.937086\n0.482300 -0.049620 0.892858 0.345302 -0.051354 0.937086\n0.273499 0.067145 0.976197 0.345302 -0.051354 0.937086\n0.395221 -0.496509 0.793442 0.490861 -0.394591 0.776758\n0.552257 -0.492406 0.696290 0.490861 -0.394591 0.776758\n0.609342 -0.325565 0.744971 0.490861 -0.394591 0.776758\n0.509222 -0.300333 0.826296 0.566037 -0.267383 0.779813\n0.609342 -0.325565 0.744971 0.566037 -0.267383 0.779813\n0.524831 -0.231173 0.838679 0.566037 -0.267383 0.779813\n0.609342 -0.325565 0.744971 0.553665 -0.282116 0.783496\n0.608092 -0.222878 0.782829 0.553665 -0.282116 0.783496\n0.524831 -0.231173 0.838679 0.553665 -0.282116 0.783496\n0.524831 -0.231173 0.838679 0.561260 -0.120018 0.818891\n0.608092 -0.222878 0.782829 0.561260 -0.120018 0.818891\n0.470212 -0.108587 0.894081 0.561260 -0.120018 0.818891\n0.608092 -0.222878 0.782829 0.451563 -0.279908 0.847197\n0.592839 -0.178923 0.805481 0.451563 -0.279908 0.847197\n0.470212 -0.108587 0.894081 0.451563 -0.279908 0.847197\n0.592839 -0.178923 0.805481 0.546703 -0.094819 0.831941\n0.482300 -0.049620 0.892858 0.546703 -0.094819 0.831941\n0.470212 -0.108587 0.894081 0.546703 -0.094819 0.831941\n0.275018 -0.712119 0.670465 0.293406 -0.591801 0.750789\n0.421988 -0.618034 0.687191 0.293406 -0.591801 0.750789\n0.395221 -0.496509 0.793442 0.293406 -0.591801 0.750789\n0.421988 -0.618034 0.687191 0.457311 -0.526134 0.716973\n0.552257 -0.492406 0.696290 0.457311 -0.526134 0.716973\n0.395221 -0.496509 0.793442 0.457311 -0.526134 0.716973\n0.609342 -0.325565 0.744971 0.610258 -0.267485 0.745679\n0.643565 -0.309229 0.722823 0.610258 -0.267485 0.745679\n0.608092 -0.222878 0.782829 0.610258 -0.267485 0.745679\n0.643565 -0.309229 0.722823 0.569850 -0.298059 0.765789\n0.640624 -0.252885 0.746941 0.569850 -0.298059 0.765789\n0.608092 -0.222878 0.782829 0.569850 -0.298059 0.765789\n0.640624 -0.252885 0.746941 0.671523 -0.141787 0.727292\n0.592839 -0.178923 0.805481 0.671523 -0.141787 0.727292\n0.608092 -0.222878 0.782829 0.671523 -0.141787 0.727292\n0.592839 -0.178923 0.805481 0.419992 -0.233563 0.876958\n0.586829 -0.154266 0.814927 0.419992 -0.233563 0.876958\n0.482300 -0.049620 0.892858 0.419992 -0.233563 0.876958\n0.421988 -0.618034 0.687191 0.514752 -0.579528 0.631805\n0.600395 -0.504555 0.645927 0.514752 -0.579528 0.631805\n0.552257 -0.492406 0.696290 0.514752 -0.579528 0.631805\n0.552257 -0.492406 0.696290 0.609267 -0.407026 0.680532\n0.600395 -0.504555 0.645927 0.609267 -0.407026 0.680532\n0.609342 -0.325565 0.744971 0.609267 -0.407026 0.680532\n0.600395 -0.504555 0.645927 0.452209 -0.449034 0.770633\n0.629213 -0.385334 0.698484 0.452209 -0.449034 0.770633\n0.609342 -0.325565 0.744971 0.452209 -0.449034 0.770633\n0.609342 -0.325565 0.744971 0.620219 -0.342629 0.705644\n0.629213 -0.385334 0.698484 0.620219 -0.342629 0.705644\n0.643565 -0.309229 0.722823 0.620219 -0.342629 0.705644\n0.643565 -0.309229 0.722823 -0.638922 0.274300 -0.718706\n0.631254 -0.262943 0.751432 -0.638922 0.274300 -0.718706\n0.640624 -0.252885 0.746941 -0.638922 0.274300 -0.718706\n0.640624 -0.252885 0.746941 -0.602424 0.218420 -0.767709\n0.631254 -0.262943 0.751432 -0.602424 0.218420 -0.767709\n0.592839 -0.178923 0.805481 -0.602424 0.218420 -0.767709\n0.631254 -0.262943 0.751432 0.772009 -0.054407 0.633279\n0.586829 -0.154266 0.814927 0.772009 -0.054407 0.633279\n0.592839 -0.178923 0.805481 0.772009 -0.054407 0.633279\n0.586829 -0.154266 0.814927 0.565650 -0.048067 0.823244\n0.656101 -0.079052 0.771721 0.565650 -0.048067 0.823244\n0.482300 -0.049620 0.892858 0.565650 -0.048067 0.823244\n0.482300 -0.049620 0.892858 0.569353 -0.020420 0.821840\n0.656101 -0.079052 0.771721 0.569353 -0.020420 0.821840\n0.506978 0.059435 0.878472 0.569353 -0.020420 0.821840\n0.656101 -0.079052 0.771721 0.568021 -0.022522 0.822706\n0.645612 0.054457 0.782618 0.568021 -0.022522 0.822706\n0.506978 0.059435 0.878472 0.568021 -0.022522 0.822706\n0.275018 -0.712119 0.670465 0.382601 -0.704026 0.598301\n0.501356 -0.694167 0.546850 0.382601 -0.704026 0.598301\n0.421988 -0.618034 0.687191 0.382601 -0.704026 0.598301\n0.421988 -0.618034 0.687191 0.519437 -0.592865 0.615383\n0.501356 -0.694167 0.546850 0.519437 -0.592865 0.615383\n0.600395 -0.504555 0.645927 0.519437 -0.592865 0.615383\n0.600395 -0.504555 0.645927 0.565781 -0.443265 0.695275\n0.642795 -0.418089 0.666549 0.565781 -0.443265 0.695275\n0.629213 -0.385334 0.698484 0.565781 -0.443265 0.695275\n0.629213 -0.385334 0.698484 0.693192 -0.334839 0.638254\n0.642795 -0.418089 0.666549 0.693192 -0.334839 0.638254\n0.643565 -0.309229 0.722823 0.693192 -0.334839 0.638254\n0.642795 -0.418089 0.666549 0.575370 -0.378792 0.724890\n0.656740 -0.330752 0.701119 0.575370 -0.378792 0.724890\n0.643565 -0.309229 0.722823 0.575370 -0.378792 0.724890\n0.643565 -0.309229 0.722823 0.732018 -0.206584 0.649209\n0.656740 -0.330752 0.701119 0.732018 -0.206584 0.649209\n0.631254 -0.262943 0.751432 0.732018 -0.206584 0.649209\n0.656740 -0.330752 0.701119 0.640783 -0.287391 0.711901\n0.673090 -0.253137 0.717735 0.640783 -0.287391 0.711901\n0.631254 -0.262943 0.751432 0.640783 -0.287391 0.711901\n0.631254 -0.262943 0.751432 0.642129 -0.173736 0.746650\n0.673090 -0.253137 0.717735 0.642129 -0.173736 0.746650\n0.586829 -0.154266 0.814927 0.642129 -0.173736 0.746650\n0.586829 -0.154266 0.814927 0.646387 -0.167751 0.744341\n0.673090 -0.253137 0.717735 0.646387 -0.167751 0.744341\n0.656101 -0.079052 0.771721 0.646387 -0.167751 0.744341\n0.673090 -0.253137 0.717735 0.717016 -0.141683 0.682506\n0.790190 -0.051529 0.636566 0.717016 -0.141683 0.682506\n0.656101 -0.079052 0.771721 0.717016 -0.141683 0.682506\n0.656101 -0.079052 0.771721 0.710072 -0.001683 0.704127\n0.790190 -0.051529 0.636566 0.710072 -0.001683 0.704127\n0.645612 0.054457 0.782618 0.710072 -0.001683 0.704127\n0.501356 -0.694167 0.546850 0.557539 -0.594156 0.579766\n0.657284 -0.530376 0.564756 0.557539 -0.594156 0.579766\n0.600395 -0.504555 0.645927 0.557539 -0.594156 0.579766\n0.600395 -0.504555 0.645927 0.650126 -0.462569 0.602798\n0.657284 -0.530376 0.564756 0.650126 -0.462569 0.602798\n0.642795 -0.418089 0.666549 0.650126 -0.462569 0.602798\n0.657284 -0.530376 0.564756 0.662658 -0.454265 0.595422\n0.695577 -0.387793 0.630920 0.662658 -0.454265 0.595422\n0.642795 -0.418089 0.666549 0.662658 -0.454265 0.595422\n0.642795 -0.418089 0.666549 0.655792 -0.366050 0.660261\n0.695577 -0.387793 0.630920 0.655792 -0.366050 0.660261\n0.656740 -0.330752 0.701119 0.655792 -0.366050 0.660261\n0.656740 -0.330752 0.701119 0.720221 -0.286939 0.631623\n0.695577 -0.387793 0.630920 0.720221 -0.286939 0.631623\n0.673090 -0.253137 0.717735 0.720221 -0.286939 0.631623\n0.695577 -0.387793 0.630920 0.723685 -0.284512 0.628755\n0.792877 -0.313705 0.552455 0.723685 -0.284512 0.628755\n0.673090 -0.253137 0.717735 0.723685 -0.284512 0.628755\n0.792877 -0.313705 0.552455 0.764559 -0.178215 0.619426\n0.865924 -0.167814 0.504268 0.764559 -0.178215 0.619426\n0.673090 -0.253137 0.717735 0.764559 -0.178215 0.619426\n0.673090 -0.253137 0.717735 0.765431 -0.198080 0.612274\n0.865924 -0.167814 0.504268 0.765431 -0.198080 0.612274\n0.790190 -0.051529 0.636566 0.765431 -0.198080 0.612274\n0.865924 -0.167814 0.504268 0.808722 -0.126762 0.574370\n0.875649 -0.103082 0.504860 0.808722 -0.126762 0.574370\n0.790190 -0.051529 0.636566 0.808722 -0.126762 0.574370\n0.875649 -0.103082 0.504860 0.821426 -0.080688 0.564579\n0.850548 -0.002703 0.555726 0.821426 -0.080688 0.564579\n0.790190 -0.051529 0.636566 0.821426 -0.080688 0.564579\n0.454265 -0.815149 0.401805 0.498108 -0.738569 0.454318\n0.556750 -0.763298 0.373734 0.498108 -0.738569 0.454318\n0.501356 -0.694167 0.546850 0.498108 -0.738569 0.454318\n0.556750 -0.763298 0.373734 0.581266 -0.674408 0.455306\n0.672558 -0.663706 0.373406 0.581266 -0.674408 0.455306\n0.501356 -0.694167 0.546850 0.581266 -0.674408 0.455306\n0.501356 -0.694167 0.546850 0.605386 -0.629563 0.486990\n0.672558 -0.663706 0.373406 0.605386 -0.629563 0.486990\n0.657284 -0.530376 0.564756 0.605386 -0.629563 0.486990\n0.672558 -0.663706 0.373406 0.627259 -0.614617 0.478322\n0.722526 -0.534804 0.473511 0.627259 -0.614617 0.478322\n0.657284 -0.530376 0.564756 0.627259 -0.614617 0.478322\n0.722526 -0.534804 0.473511 0.696783 -0.491865 0.522075\n0.731815 -0.439095 0.551284 0.696783 -0.491865 0.522075\n0.657284 -0.530376 0.564756 0.696783 -0.491865 0.522075\n0.657284 -0.530376 0.564756 0.663610 -0.454090 0.594495\n0.731815 -0.439095 0.551284 0.663610 -0.454090 0.594495\n0.695577 -0.387793 0.630920 0.663610 -0.454090 0.594495\n0.731815 -0.439095 0.551284 0.721679 -0.384144 0.575858\n0.772533 -0.358251 0.554184 0.721679 -0.384144 0.575858\n0.695577 -0.387793 0.630920 0.721679 -0.384144 0.575858\n0.772533 -0.358251 0.554184 0.728400 -0.308915 0.611559\n0.792877 -0.313705 0.552455 0.728400 -0.308915 0.611559\n0.695577 -0.387793 0.630920 0.728400 -0.308915 0.611559\n0.792877 -0.313705 0.552455 0.609959 -0.044070 0.791207\n0.845892 -0.223245 0.516623 0.609959 -0.044070 0.791207\n0.865924 -0.167814 0.504268 0.609959 -0.044070 0.791207\n0.875649 -0.103082 0.504860 0.919641 0.031585 0.391488\n0.915913 -0.148431 0.413937 0.919641 0.031585 0.391488\n0.850548 -0.002703 0.555726 0.919641 0.031585 0.391488\n0.722526 -0.534804 0.473511 0.715775 -0.480922 0.506340\n0.758253 -0.494572 0.461218 0.715775 -0.480922 0.506340\n0.731815 -0.439095 0.551284 0.715775 -0.480922 0.506340\n0.758253 -0.494572 0.461218 0.726410 -0.469157 0.502215\n0.767215 -0.428897 0.509608 0.726410 -0.469157 0.502215\n0.731815 -0.439095 0.551284 0.726410 -0.469157 0.502215\n0.731815 -0.439095 0.551284 0.745660 -0.394819 0.536758\n0.767215 -0.428897 0.509608 0.745660 -0.394819 0.536758\n0.772533 -0.358251 0.554184 0.745660 -0.394819 0.536758\n0.845892 -0.223245 0.516623 0.872955 -0.218225 0.436265\n0.915913 -0.148431 0.413937 0.872955 -0.218225 0.436265\n0.865924 -0.167814 0.504268 0.872955 -0.218225 0.436265\n0.865924 -0.167814 0.504268 0.878896 -0.136233 0.457146\n0.915913 -0.148431 0.413937 0.878896 -0.136233 0.457146\n0.875649 -0.103082 0.504860 0.878896 -0.136233 0.457146\n0.915913 -0.148431 0.413937 0.847042 -0.123158 0.517061\n0.895748 -0.012614 0.479321 0.847042 -0.123158 0.517061\n0.850548 -0.002703 0.555726 0.847042 -0.123158 0.517061\n0.672558 -0.663706 0.373406 0.671615 -0.598989 0.436057\n0.743361 -0.573910 0.387704 0.671615 -0.598989 0.436057\n0.722526 -0.534804 0.473511 0.671615 -0.598989 0.436057\n0.743361 -0.573910 0.387704 0.736214 -0.530301 0.420439\n0.776209 -0.532239 0.382743 0.736214 -0.530301 0.420439\n0.722526 -0.534804 0.473511 0.736214 -0.530301 0.420439\n0.722526 -0.534804 0.473511 0.738130 -0.526643 0.421676\n0.776209 -0.532239 0.382743 0.738130 -0.526643 0.421676\n0.758253 -0.494572 0.461218 0.738130 -0.526643 0.421676\n0.776209 -0.532239 0.382743 0.749400 -0.513527 0.417959\n0.790001 -0.488628 0.411598 0.749400 -0.513527 0.417959\n0.758253 -0.494572 0.461218 0.749400 -0.513527 0.417959\n0.758253 -0.494572 0.461218 0.780817 -0.436142 0.447331\n0.790001 -0.488628 0.411598 0.780817 -0.436142 0.447331\n0.767215 -0.428897 0.509608 0.780817 -0.436142 0.447331\n0.790001 -0.488628 0.411598 0.821538 -0.381644 0.423585\n0.808089 -0.484304 0.380412 0.821538 -0.381644 0.423585\n0.767215 -0.428897 0.509608 0.821538 -0.381644 0.423585\n0.808089 -0.484304 0.380412 0.782173 -0.443475 0.437648\n0.829179 -0.448032 0.379473 0.782173 -0.443475 0.437648\n0.767215 -0.428897 0.509608 0.782173 -0.443475 0.437648\n0.767215 -0.428897 0.509608 0.827619 -0.342763 0.444479\n0.829179 -0.448032 0.379473 0.827619 -0.342763 0.444479\n0.772533 -0.358251 0.554184 0.827619 -0.342763 0.444479\n0.829179 -0.448032 0.379473 0.784995 -0.409431 0.464918\n0.856630 -0.372163 0.399938 0.784995 -0.409431 0.464918\n0.772533 -0.358251 0.554184 0.784995 -0.409431 0.464918\n0.772533 -0.358251 0.554184 0.808494 -0.350895 0.472451\n0.856630 -0.372163 0.399938 0.808494 -0.350895 0.472451\n0.792877 -0.313705 0.552455 0.808494 -0.350895 0.472451\n0.856630 -0.372163 0.399938 0.866015 -0.223072 0.447501\n0.946285 -0.191131 0.316677 0.866015 -0.223072 0.447501\n0.792877 -0.313705 0.552455 0.866015 -0.223072 0.447501\n0.792877 -0.313705 0.552455 0.857243 -0.354453 0.373493\n0.946285 -0.191131 0.316677 0.857243 -0.354453 0.373493\n0.845892 -0.223245 0.516623 0.857243 -0.354453 0.373493\n0.845892 -0.223245 0.516623 0.875766 -0.277222 0.395198\n0.946285 -0.191131 0.316677 0.875766 -0.277222 0.395198\n0.915913 -0.148431 0.413937 0.875766 -0.277222 0.395198\n0.915913 -0.148431 0.413937 0.927025 -0.041769 0.372666\n0.962928 -0.123065 0.299827 0.927025 -0.041769 0.372666\n0.895748 -0.012614 0.479321 0.927025 -0.041769 0.372666\n0.962928 -0.123065 0.299827 0.771937 -0.370250 0.516749\n0.949409 -0.076048 0.353710 0.771937 -0.370250 0.516749\n0.895748 -0.012614 0.479321 0.771937 -0.370250 0.516749\n0.949409 -0.076048 0.353710 0.906285 -0.061414 0.418181\n0.943177 -0.004562 0.377714 0.906285 -0.061414 0.418181\n0.895748 -0.012614 0.479321 0.906285 -0.061414 0.418181\n0.949777 0.062652 0.355345 0.897474 0.057416 0.437315\n0.865384 0.057223 0.529252 0.897474 0.057416 0.437315\n0.943177 -0.004562 0.377714 0.897474 0.057416 0.437315\n0.981719 0.180575 0.189450 0.981101 0.111924 0.157841\n0.979804 0.149369 0.223481 0.981101 0.111924 0.157841\n0.989696 0.068667 0.219220 0.981101 0.111924 0.157841\n0.973007 0.287243 -0.054952 0.974578 0.224021 0.003510\n0.967825 0.309059 -0.008336 0.974578 0.224021 0.003510\n0.978775 0.260010 0.081640 0.974578 0.224021 0.003510\n0.948752 0.333988 -0.143505 0.949527 0.296000 -0.103835\n0.950417 0.348369 -0.087280 0.949527 0.296000 -0.103835\n0.973007 0.287243 -0.054952 0.949527 0.296000 -0.103835\n0.909192 0.386153 -0.237756 0.900474 0.389122 -0.194242\n0.896327 0.431866 -0.205820 0.900474 0.389122 -0.194242\n0.928270 0.380518 -0.160601 0.900474 0.389122 -0.194242\n0.838264 0.421274 -0.390018 0.828559 0.458342 -0.321579\n0.809886 0.467532 -0.397203 0.828559 0.458342 -0.321579\n0.876835 0.396663 -0.325716 0.828559 0.458342 -0.321579\n0.989696 0.068667 0.219220 0.954817 0.087926 0.283891\n0.966874 0.161079 0.267356 0.954817 0.087926 0.283891\n0.949777 0.062652 0.355345 0.954817 0.087926 0.283891\n0.966874 0.161079 0.267356 0.933234 0.135383 0.332784\n0.921868 0.197174 0.378883 0.933234 0.135383 0.332784\n0.949777 0.062652 0.355345 0.933234 0.135383 0.332784\n0.949777 0.062652 0.355345 0.892979 0.108843 0.436739\n0.921868 0.197174 0.378883 0.892979 0.108843 0.436739\n0.865384 0.057223 0.529252 0.892979 0.108843 0.436739\n0.921868 0.197174 0.378883 0.881835 0.130854 0.453039\n0.841892 0.180231 0.539450 0.881835 0.130854 0.453039\n0.865384 0.057223 0.529252 0.881835 0.130854 0.453039\n0.989696 0.068667 0.219220 0.961185 0.104330 0.255418\n0.979804 0.149369 0.223481 0.961185 0.104330 0.255418\n0.966874 0.161079 0.267356 0.961185 0.104330 0.255418\n0.921868 0.197174 0.378883 0.869160 0.196800 0.453685\n0.885099 0.277860 0.414324 0.869160 0.196800 0.453685\n0.841892 0.180231 0.539450 0.869160 0.196800 0.453685\n0.981719 0.180575 0.189450 0.958208 0.181941 0.220758\n0.966532 0.220169 0.222741 0.958208 0.181941 0.220758\n0.979804 0.149369 0.223481 0.958208 0.181941 0.220758\n0.979804 0.149369 0.223481 0.955359 0.181536 0.233095\n0.966532 0.220169 0.222741 0.955359 0.181536 0.233095\n0.966874 0.161079 0.267356 0.955359 0.181536 0.233095\n0.966532 0.220169 0.222741 0.938622 0.211307 0.272652\n0.934058 0.259907 0.303735 0.938622 0.211307 0.272652\n0.966874 0.161079 0.267356 0.938622 0.211307 0.272652\n0.966874 0.161079 0.267356 0.929931 0.193728 0.312568\n0.934058 0.259907 0.303735 0.929931 0.193728 0.312568\n0.921868 0.197174 0.378883 0.929931 0.193728 0.312568\n0.921868 0.197174 0.378883 0.899196 0.252949 0.357020\n0.934058 0.259907 0.303735 0.899196 0.252949 0.357020\n0.885099 0.277860 0.414324 0.899196 0.252949 0.357020\n0.982255 0.228541 0.123351 0.966191 0.204887 0.156512\n0.970273 0.238621 0.184124 0.966191 0.204887 0.156512\n0.981719 0.180575 0.189450 0.966191 0.204887 0.156512\n0.981719 0.180575 0.189450 0.959411 0.206784 0.191759\n0.970273 0.238621 0.184124 0.959411 0.206784 0.191759\n0.966532 0.220169 0.222741 0.959411 0.206784 0.191759\n0.966532 0.220169 0.222741 0.929487 0.286794 0.231954\n0.958580 0.295527 0.161431 0.929487 0.286794 0.231954\n0.934058 0.259907 0.303735 0.929487 0.286794 0.231954\n0.958580 0.295527 0.161431 0.938918 0.258992 0.226620\n0.931509 0.335904 0.227445 0.938918 0.258992 0.226620\n0.934058 0.259907 0.303735 0.938918 0.258992 0.226620\n0.934058 0.259907 0.303735 0.873611 0.359043 0.328469\n0.931509 0.335904 0.227445 0.873611 0.359043 0.328469\n0.885099 0.277860 0.414324 0.873611 0.359043 0.328469\n0.931509 0.335904 0.227445 0.957583 0.102025 0.269493\n0.901398 0.323730 0.339046 0.957583 0.102025 0.269493\n0.885099 0.277860 0.414324 0.957583 0.102025 0.269493\n0.978775 0.260010 0.081640 0.959137 0.258510 0.115016\n0.968413 0.291587 0.097081 0.959137 0.258510 0.115016\n0.982255 0.228541 0.123351 0.959137 0.258510 0.115016\n0.982255 0.228541 0.123351 0.952490 0.268799 0.143210\n0.968413 0.291587 0.097081 0.952490 0.268799 0.143210\n0.970273 0.238621 0.184124 0.952490 0.268799 0.143210\n0.968413 0.291587 0.097081 0.981641 0.171536 0.083403\n0.967105 0.279848 0.136616 0.981641 0.171536 0.083403\n0.970273 0.238621 0.184124 0.981641 0.171536 0.083403\n0.970273 0.238621 0.184124 0.889351 0.373023 0.264403\n0.967105 0.279848 0.136616 0.889351 0.373023 0.264403\n0.966532 0.220169 0.222741 0.889351 0.373023 0.264403\n0.967105 0.279848 0.136616 0.954280 0.242681 0.174518\n0.958580 0.295527 0.161431 0.954280 0.242681 0.174518\n0.966532 0.220169 0.222741 0.954280 0.242681 0.174518\n0.931509 0.335904 0.227445 0.901346 0.331009 0.279299\n0.889431 0.367835 0.325395 0.901346 0.331009 0.279299\n0.901398 0.323730 0.339046 0.901346 0.331009 0.279299\n0.967825 0.309059 -0.008336 0.955321 0.292407 0.043133\n0.968413 0.291587 0.097081 0.955321 0.292407 0.043133\n0.978775 0.260010 0.081640 0.955321 0.292407 0.043133\n0.967105 0.279848 0.136616 0.942479 0.308392 0.128946\n0.956750 0.327359 0.098670 0.942479 0.308392 0.128946\n0.958580 0.295527 0.161431 0.942479 0.308392 0.128946\n0.958580 0.295527 0.161431 0.934062 0.293397 0.203586\n0.938130 0.340307 0.190723 0.934062 0.293397 0.203586\n0.931509 0.335904 0.227445 0.934062 0.293397 0.203586\n0.938130 0.340307 0.190723 0.912778 0.352234 0.206803\n0.919007 0.383499 0.201559 0.912778 0.352234 0.206803\n0.931509 0.335904 0.227445 0.912778 0.352234 0.206803\n0.931509 0.335904 0.227445 0.889786 0.375104 0.259958\n0.919007 0.383499 0.201559 0.889786 0.375104 0.259958\n0.889431 0.367835 0.325395 0.889786 0.375104 0.259958\n0.919007 0.383499 0.201559 0.878991 0.399422 0.260456\n0.866712 0.469810 0.245681 0.878991 0.399422 0.260456\n0.889431 0.367835 0.325395 0.878991 0.399422 0.260456\n0.967825 0.309059 -0.008336 0.960036 0.276926 0.040541\n0.959225 0.333940 0.025344 0.960036 0.276926 0.040541\n0.968413 0.291587 0.097081 0.960036 0.276926 0.040541\n0.968413 0.291587 0.097081 0.863869 0.474369 0.169426\n0.959225 0.333940 0.025344 0.863869 0.474369 0.169426\n0.967105 0.279848 0.136616 0.863869 0.474369 0.169426\n0.967105 0.279848 0.136616 0.965432 0.254689 0.055442\n0.959225 0.333940 0.025344 0.965432 0.254689 0.055442\n0.956750 0.327359 0.098670 0.965432 0.254689 0.055442\n0.956750 0.327359 0.098670 0.937485 0.320646 0.135307\n0.939570 0.349203 0.165943 0.937485 0.320646 0.135307\n0.958580 0.295527 0.161431 0.937485 0.320646 0.135307\n0.958580 0.295527 0.161431 0.933605 0.316532 0.167897\n0.939570 0.349203 0.165943 0.933605 0.316532 0.167897\n0.938130 0.340307 0.190723 0.933605 0.316532 0.167897\n0.939570 0.349203 0.165943 0.917828 0.353666 0.180310\n0.924061 0.374360 0.195545 0.917828 0.353666 0.180310\n0.938130 0.340307 0.190723 0.917828 0.353666 0.180310\n0.938130 0.340307 0.190723 0.907674 0.340204 0.245744\n0.924061 0.374360 0.195545 0.907674 0.340204 0.245744\n0.919007 0.383499 0.201559 0.907674 0.340204 0.245744\n0.973007 0.287243 -0.054952 0.944759 0.324409 -0.046787\n0.950417 0.348369 -0.087280 0.944759 0.324409 -0.046787\n0.967825 0.309059 -0.008336 0.944759 0.324409 -0.046787\n0.950417 0.348369 -0.087280 0.948518 0.312132 -0.053729\n0.950344 0.357662 -0.034588 0.948518 0.312132 -0.053729\n0.967825 0.309059 -0.008336 0.948518 0.312132 -0.053729\n0.967825 0.309059 -0.008336 0.942160 0.335090 -0.006991\n0.950344 0.357662 -0.034588 0.942160 0.335090 -0.006991\n0.959225 0.333940 0.025344 0.942160 0.335090 -0.006991\n0.950344 0.357662 -0.034588 0.938845 0.344329 -0.002843\n0.942083 0.380432 -0.004769 0.938845 0.344329 -0.002843\n0.959225 0.333940 0.025344 0.938845 0.344329 -0.002843\n0.959225 0.333940 0.025344 0.921747 0.382235 0.065414\n0.942083 0.380432 -0.004769 0.921747 0.382235 0.065414\n0.956750 0.327359 0.098670 0.921747 0.382235 0.065414\n0.942083 0.380432 -0.004769 0.938287 0.343170 0.043025\n0.937943 0.379675 0.091549 0.938287 0.343170 0.043025\n0.956750 0.327359 0.098670 0.938287 0.343170 0.043025\n0.956750 0.327359 0.098670 0.928399 0.350539 0.123280\n0.937943 0.379675 0.091549 0.928399 0.350539 0.123280\n0.939570 0.349203 0.165943 0.928399 0.350539 0.123280\n0.937943 0.379675 0.091549 0.925911 0.356226 0.125664\n0.925570 0.390640 0.151629 0.925911 0.356226 0.125664\n0.939570 0.349203 0.165943 0.925911 0.356226 0.125664\n0.939570 0.349203 0.165943 0.915016 0.366998 0.167506\n0.925570 0.390640 0.151629 0.915016 0.366998 0.167506\n0.924061 0.374360 0.195545 0.915016 0.366998 0.167506\n0.925570 0.390640 0.151629 0.901352 0.395069 0.177442\n0.905068 0.429555 0.169132 0.901352 0.395069 0.177442\n0.924061 0.374360 0.195545 0.901352 0.395069 0.177442\n0.924061 0.374360 0.195545 0.905197 0.391084 0.166350\n0.905068 0.429555 0.169132 0.905197 0.391084 0.166350\n0.919007 0.383499 0.201559 0.905197 0.391084 0.166350\n0.905068 0.429555 0.169132 0.858797 0.442139 0.258807\n0.875449 0.487090 0.169123 0.858797 0.442139 0.258807\n0.919007 0.383499 0.201559 0.858797 0.442139 0.258807\n0.919007 0.383499 0.201559 0.879914 0.431952 0.197914\n0.875449 0.487090 0.169123 0.879914 0.431952 0.197914\n0.866712 0.469810 0.245681 0.879914 0.431952 0.197914\n0.875449 0.487090 0.169123 0.834820 0.508846 0.210123\n0.825899 0.527447 0.268259 0.834820 0.508846 0.210123\n0.866712 0.469810 0.245681 0.834820 0.508846 0.210123\n0.948752 0.333988 -0.143505 0.924147 0.362657 -0.120132\n0.928270 0.380518 -0.160601 0.924147 0.362657 -0.120132\n0.950417 0.348369 -0.087280 0.924147 0.362657 -0.120132\n0.928270 0.380518 -0.160601 0.924054 0.362944 -0.119978\n0.929826 0.398568 -0.094010 0.924054 0.362944 -0.119978\n0.950417 0.348369 -0.087280 0.924054 0.362944 -0.119978\n0.950417 0.348369 -0.087280 0.926277 0.371334 -0.064201\n0.929826 0.398568 -0.094010 0.926277 0.371334 -0.064201\n0.950344 0.357662 -0.034588 0.926277 0.371334 -0.064201\n0.929826 0.398568 -0.094010 0.919159 0.390919 -0.048260\n0.921795 0.426928 -0.017244 0.919159 0.390919 -0.048260\n0.950344 0.357662 -0.034588 0.919159 0.390919 -0.048260\n0.950344 0.357662 -0.034588 0.919874 0.389865 -0.042870\n0.921795 0.426928 -0.017244 0.919874 0.389865 -0.042870\n0.942083 0.380432 -0.004769 0.919874 0.389865 -0.042870\n0.921795 0.426928 -0.017244 0.915716 0.401743 0.008162\n0.916899 0.437443 0.014557 0.915716 0.401743 0.008162\n0.942083 0.380432 -0.004769 0.915716 0.401743 0.008162\n0.942083 0.380432 -0.004769 0.919153 0.391592 0.042583\n0.916899 0.437443 0.014557 0.919153 0.391592 0.042583\n0.937943 0.379675 0.091549 0.919153 0.391592 0.042583\n0.916899 0.437443 0.014557 0.919963 0.389851 0.041055\n0.915412 0.434965 0.071394 0.919963 0.389851 0.041055\n0.937943 0.379675 0.091549 0.919963 0.389851 0.041055\n0.937943 0.379675 0.091549 0.905378 0.409654 0.111685\n0.915412 0.434965 0.071394 0.905378 0.409654 0.111685\n0.925570 0.390640 0.151629 0.905378 0.409654 0.111685\n0.925570 0.390640 0.151629 0.894363 0.442895 0.062920\n0.858481 0.531781 0.111758 0.894363 0.442895 0.062920\n0.905068 0.429555 0.169132 0.894363 0.442895 0.062920\n0.905068 0.429555 0.169132 0.885230 0.455723 0.093193\n0.858481 0.531781 0.111758 0.885230 0.455723 0.093193\n0.875449 0.487090 0.169123 0.885230 0.455723 0.093193\n0.858481 0.531781 0.111758 0.835481 0.525109 0.161964\n0.821512 0.563458 0.199761 0.835481 0.525109 0.161964\n0.875449 0.487090 0.169123 0.835481 0.525109 0.161964\n0.875449 0.487090 0.169123 0.836303 0.505531 0.212215\n0.821512 0.563458 0.199761 0.836303 0.505531 0.212215\n0.825899 0.527447 0.268259 0.836303 0.505531 0.212215\n0.896327 0.431866 -0.205820 0.894630 0.418341 -0.156934\n0.887203 0.458331 -0.187285 0.894630 0.418341 -0.156934\n0.928270 0.380518 -0.160601 0.894630 0.418341 -0.156934\n0.928270 0.380518 -0.160601 0.894665 0.425458 -0.136236\n0.887203 0.458331 -0.187285 0.894665 0.425458 -0.136236\n0.929826 0.398568 -0.094010 0.894665 0.425458 -0.136236\n0.887203 0.458331 -0.187285 0.911430 0.007985 -0.411377\n0.898956 0.445046 -0.161503 0.911430 0.007985 -0.411377\n0.929826 0.398568 -0.094010 0.911430 0.007985 -0.411377\n0.898956 0.445046 -0.161503 0.886339 0.453593 -0.093038\n0.880941 0.481103 -0.157334 0.886339 0.453593 -0.093038\n0.929826 0.398568 -0.094010 0.886339 0.453593 -0.093038\n0.929826 0.398568 -0.094010 0.883013 0.462725 -0.078568\n0.880941 0.481103 -0.157334 0.883013 0.462725 -0.078568\n0.921795 0.426928 -0.017244 0.883013 0.462725 -0.078568\n0.880941 0.481103 -0.157334 0.891124 0.445202 -0.087710\n0.867906 0.515467 -0.115346 0.891124 0.445202 -0.087710\n0.921795 0.426928 -0.017244 0.891124 0.445202 -0.087710\n0.867906 0.515467 -0.115346 0.884283 0.461833 -0.068942\n0.872696 0.519601 -0.026203 0.884283 0.461833 -0.068942\n0.921795 0.426928 -0.017244 0.884283 0.461833 -0.068942\n0.921795 0.426928 -0.017244 0.884224 0.466710 -0.018167\n0.872696 0.519601 -0.026203 0.884224 0.466710 -0.018167\n0.916899 0.437443 0.014557 0.884224 0.466710 -0.018167\n0.872696 0.519601 -0.026203 0.878030 0.478450 0.012216\n0.870595 0.521562 0.048045 0.878030 0.478450 0.012216\n0.916899 0.437443 0.014557 0.878030 0.478450 0.012216\n0.916899 0.437443 0.014557 0.882434 0.468421 0.043498\n0.870595 0.521562 0.048045 0.882434 0.468421 0.043498\n0.915412 0.434965 0.071394 0.882434 0.468421 0.043498\n0.915412 0.434965 0.071394 0.858228 0.487481 0.160649\n0.870595 0.521562 0.048045 0.858228 0.487481 0.160649\n0.925570 0.390640 0.151629 0.858228 0.487481 0.160649\n0.870595 0.521562 0.048045 0.888049 0.449452 0.096757\n0.858481 0.531781 0.111758 0.888049 0.449452 0.096757\n0.925570 0.390640 0.151629 0.888049 0.449452 0.096757\n0.858481 0.531781 0.111758 0.792547 0.598372 0.117557\n0.746213 0.672695 0.151391 0.792547 0.598372 0.117557\n0.821512 0.563458 0.199761 0.792547 0.598372 0.117557\n0.746213 0.672695 0.151391 0.739112 0.622944 0.256232\n0.698791 0.641647 0.363665 0.739112 0.622944 0.256232\n0.821512 0.563458 0.199761 0.739112 0.622944 0.256232\n0.887203 0.458331 -0.187285 0.874772 0.455999 -0.163827\n0.880941 0.481103 -0.157334 0.874772 0.455999 -0.163827\n0.898956 0.445046 -0.161503 0.874772 0.455999 -0.163827\n0.867906 0.515467 -0.115346 0.821747 0.565489 -0.070389\n0.792215 0.634915 -0.039378 0.821747 0.565489 -0.070389\n0.872696 0.519601 -0.026203 0.821747 0.565489 -0.070389\n0.872696 0.519601 -0.026203 0.788339 0.615211 0.006067\n0.741231 0.686761 0.105867 0.788339 0.615211 0.006067\n0.870595 0.521562 0.048045 0.788339 0.615211 0.006067\n0.870595 0.521562 0.048045 0.795309 0.603761 0.054373\n0.741231 0.686761 0.105867 0.795309 0.603761 0.054373\n0.858481 0.531781 0.111758 0.795309 0.603761 0.054373\n0.741231 0.686761 0.105867 0.791694 0.602745 0.099594\n0.746213 0.672695 0.151391 0.791694 0.602745 0.099594\n0.858481 0.531781 0.111758 0.791694 0.602745 0.099594\n0.746213 0.672695 0.151391 0.708380 0.658336 0.254543\n0.640010 0.725664 0.309952 0.708380 0.658336 0.254543\n0.698791 0.641647 0.363665 0.708380 0.658336 0.254543\n0.876835 0.396663 -0.325716 0.813934 0.530871 -0.235981\n0.809886 0.467532 -0.397203 0.813934 0.530871 -0.235981\n0.909192 0.386153 -0.237756 0.813934 0.530871 -0.235981\n0.809886 0.467532 -0.397203 0.844020 0.445811 -0.298132\n0.896327 0.431866 -0.205820 0.844020 0.445811 -0.298132\n0.909192 0.386153 -0.237756 0.844020 0.445811 -0.298132\n0.896327 0.431866 -0.205820 0.825793 0.485585 -0.286833\n0.784096 0.593639 -0.255064 0.825793 0.485585 -0.286833\n0.887203 0.458331 -0.187285 0.825793 0.485585 -0.286833\n0.784096 0.593639 -0.255064 0.826051 0.489803 -0.278804\n0.818480 0.568996 -0.196482 0.826051 0.489803 -0.278804\n0.887203 0.458331 -0.187285 0.826051 0.489803 -0.278804\n0.887203 0.458331 -0.187285 0.838665 0.503558 -0.207535\n0.818480 0.568996 -0.196482 0.838665 0.503558 -0.207535\n0.880941 0.481103 -0.157334 0.838665 0.503558 -0.207535\n0.880941 0.481103 -0.157334 0.837254 0.520887 -0.166378\n0.818480 0.568996 -0.196482 0.837254 0.520887 -0.166378\n0.867906 0.515467 -0.115346 0.837254 0.520887 -0.166378\n0.818480 0.568996 -0.196482 0.807001 0.580471 -0.108639\n0.792215 0.634915 -0.039378 0.807001 0.580471 -0.108639\n0.867906 0.515467 -0.115346 0.807001 0.580471 -0.108639\n0.792215 0.634915 -0.039378 0.788298 0.575160 0.218580\n0.656884 0.769217 0.095287 0.788298 0.575160 0.218580\n0.872696 0.519601 -0.026203 0.788298 0.575160 0.218580\n0.872696 0.519601 -0.026203 0.699084 0.692015 -0.179990\n0.656884 0.769217 0.095287 0.699084 0.692015 -0.179990\n0.741231 0.686761 0.105867 0.699084 0.692015 -0.179990\n0.746213 0.672695 0.151391 0.656509 0.728294 0.196430\n0.576533 0.808115 0.216405 0.656509 0.728294 0.196430\n0.640010 0.725664 0.309952 0.656509 0.728294 0.196430\n0.576533 0.808115 0.216405 0.559619 0.772205 0.300876\n0.509825 0.793981 0.376754 0.559619 0.772205 0.300876\n0.640010 0.725664 0.309952 0.559619 0.772205 0.300876\n0.809886 0.467532 -0.397203 0.832080 0.474379 -0.287415\n0.778365 0.561762 -0.332932 0.832080 0.474379 -0.287415\n0.896327 0.431866 -0.205820 0.832080 0.474379 -0.287415\n0.896327 0.431866 -0.205820 0.828323 0.494475 -0.263393\n0.778365 0.561762 -0.332932 0.828323 0.494475 -0.263393\n0.784096 0.593639 -0.255064 0.828323 0.494475 -0.263393\n0.784096 0.593639 -0.255064 0.740939 0.652091 -0.160580\n0.729400 0.705179 -0.054492 0.740939 0.652091 -0.160580\n0.818480 0.568996 -0.196482 0.740939 0.652091 -0.160580\n0.818480 0.568996 -0.196482 0.752945 0.642228 -0.143588\n0.729400 0.705179 -0.054492 0.752945 0.642228 -0.143588\n0.792215 0.634915 -0.039378 0.752945 0.642228 -0.143588\n0.792215 0.634915 -0.039378 0.736368 0.673080 0.068739\n0.729400 0.705179 -0.054492 0.736368 0.673080 0.068739\n0.656884 0.769217 0.095287 0.736368 0.673080 0.068739\n0.729400 0.705179 -0.054492 0.744532 0.663138 0.076942\n0.662015 0.769513 0.043084 0.744532 0.663138 0.076942\n0.656884 0.769217 0.095287 0.744532 0.663138 0.076942\n0.656884 0.769217 0.095287 0.672664 0.713323 0.196705\n0.597976 0.801550 0.179483 0.672664 0.713323 0.196705\n0.741231 0.686761 0.105867 0.672664 0.713323 0.196705\n0.741231 0.686761 0.105867 0.664677 0.731255 0.153200\n0.597976 0.801550 0.179483 0.664677 0.731255 0.153200\n0.746213 0.672695 0.151391 0.664677 0.731255 0.153200\n0.597976 0.801550 0.179483 0.661166 0.704201 0.258767\n0.576533 0.808115 0.216405 0.661166 0.704201 0.258767\n0.746213 0.672695 0.151391 0.661166 0.704201 0.258767\n0.784096 0.593639 -0.255064 0.676191 0.706593 -0.208546\n0.650222 0.778035 -0.064367 0.676191 0.706593 -0.208546\n0.729400 0.705179 -0.054492 0.676191 0.706593 -0.208546\n0.729400 0.705179 -0.054492 0.678123 0.734771 -0.016149\n0.650222 0.778035 -0.064367 0.678123 0.734771 -0.016149\n0.662015 0.769513 0.043084 0.678123 0.734771 -0.016149\n0.650222 0.778035 -0.064367 0.602014 0.798481 -0.002743\n0.568890 0.839778 0.058388 0.602014 0.798481 -0.002743\n0.662015 0.769513 0.043084 0.602014 0.798481 -0.002743\n0.662015 0.769513 0.043084 0.607764 0.791516 0.064229\n0.568890 0.839778 0.058388 0.607764 0.791516 0.064229\n0.656884 0.769217 0.095287 0.607764 0.791516 0.064229\n0.568890 0.839778 0.058388 0.528694 0.803070 0.274883\n0.418177 0.918298 0.118864 0.528694 0.803070 0.274883\n0.656884 0.769217 0.095287 0.528694 0.803070 0.274883\n0.418177 0.918298 0.118864 0.532513 0.845056 0.048059\n0.597976 0.801550 0.179483 0.532513 0.845056 0.048059\n0.656884 0.769217 0.095287 0.532513 0.845056 0.048059\n0.576533 0.808115 0.216405 0.497445 0.821291 0.279338\n0.414983 0.878381 0.297503 0.497445 0.821291 0.279338\n0.509825 0.793981 0.376754 0.497445 0.821291 0.279338\n0.509825 0.793981 0.376754 0.442297 0.825730 0.350063\n0.414983 0.878381 0.297503 0.442297 0.825730 0.350063\n0.388220 0.847710 0.403664 0.442297 0.825730 0.350063\n0.387741 0.912058 0.223781 0.343340 0.895771 0.282334\n0.400056 0.874762 0.327134 0.343340 0.895771 0.282334\n0.414983 0.878381 0.297503 0.343340 0.895771 0.282334\n0.266042 0.970728 0.138494 0.401350 0.914200 0.056184\n0.347584 0.930246 0.214710 0.401350 0.914200 0.056184\n0.387741 0.912058 0.223781 0.401350 0.914200 0.056184\n-0.119286 0.973627 -0.264751 -0.177862 0.960000 -0.216255\n-0.248889 0.967191 -0.186726 -0.177862 0.960000 -0.216255\n-0.111081 0.991263 -0.193207 -0.177862 0.960000 -0.216255\n-0.145259 0.888038 -0.471763 -0.090057 0.924313 -0.370858\n-0.203932 0.937795 -0.333502 -0.090057 0.924313 -0.370858\n-0.119286 0.973627 -0.264751 -0.090057 0.924313 -0.370858\n0.414983 0.878381 0.297503 0.516448 0.779133 0.355294\n0.400056 0.874762 0.327134 0.516448 0.779133 0.355294\n0.388220 0.847710 0.403664 0.516448 0.779133 0.355294\n0.400056 0.874762 0.327134 -0.982710 -0.062778 -0.174181\n0.381580 0.828129 0.448186 -0.982710 -0.062778 -0.174181\n0.388220 0.847710 0.403664 -0.982710 -0.062778 -0.174181\n0.400056 0.874762 0.327134 -0.276638 -0.881816 -0.381932\n0.406968 0.846275 0.387900 -0.276638 -0.881816 -0.381932\n0.381580 0.828129 0.448186 -0.276638 -0.881816 -0.381932\n0.387741 0.912058 0.223781 0.769035 0.625024 0.133908\n0.392024 0.895208 0.277832 0.769035 0.625024 0.133908\n0.400056 0.874762 0.327134 0.769035 0.625024 0.133908\n0.400056 0.874762 0.327134 -0.687229 0.624576 0.370974\n0.392024 0.895208 0.277832 -0.687229 0.624576 0.370974\n0.406968 0.846275 0.387900 -0.687229 0.624576 0.370974\n0.406968 0.846275 0.387900 0.323565 0.859785 0.395064\n0.355741 0.829089 0.467259 0.323565 0.859785 0.395064\n0.381580 0.828129 0.448186 0.323565 0.859785 0.395064\n0.387741 0.912058 0.223781 0.351075 0.901462 0.253206\n0.347584 0.930246 0.214710 0.351075 0.901462 0.253206\n0.392024 0.895208 0.277832 0.351075 0.901462 0.253206\n0.406968 0.846275 0.387900 0.346177 0.845497 0.406566\n0.293283 0.879775 0.415032 0.346177 0.845497 0.406566\n0.355741 0.829089 0.467259 0.346177 0.845497 0.406566\n0.347584 0.930246 0.214710 0.285302 0.909042 0.303720\n0.231846 0.963596 0.223610 0.285302 0.909042 0.303720\n0.392024 0.895208 0.277832 0.285302 0.909042 0.303720\n0.392024 0.895208 0.277832 0.259372 0.895080 0.362710\n0.231846 0.963596 0.223610 0.259372 0.895080 0.362710\n0.406968 0.846275 0.387900 0.259372 0.895080 0.362710\n0.231846 0.963596 0.223610 0.333081 0.898330 0.286462\n0.293283 0.879775 0.415032 0.333081 0.898330 0.286462\n0.406968 0.846275 0.387900 0.333081 0.898330 0.286462\n0.266042 0.970728 0.138494 0.285364 0.938724 0.193301\n0.231846 0.963596 0.223610 0.285364 0.938724 0.193301\n0.347584 0.930246 0.214710 0.285364 0.938724 0.193301\n0.231846 0.963596 0.223610 0.168757 0.921647 0.349412\n0.035096 0.967210 0.309104 0.168757 0.921647 0.349412\n0.293283 0.879775 0.415032 0.168757 0.921647 0.349412\n0.293283 0.879775 0.415032 0.154185 0.912972 0.377769\n0.035096 0.967210 0.309104 0.154185 0.912972 0.377769\n0.174869 0.858927 0.513748 0.154185 0.912972 0.377769\n0.035096 0.967210 0.309104 0.102067 0.906406 0.409891\n-0.029494 0.914893 0.440876 0.102067 0.906406 0.409891\n0.174869 0.858927 0.513748 0.102067 0.906406 0.409891\n0.009400 1.006086 0.141330 0.042145 0.929614 0.366118\n-0.142810 0.980986 0.222584 0.042145 0.929614 0.366118\n0.231846 0.963596 0.223610 0.042145 0.929614 0.366118\n0.231846 0.963596 0.223610 0.046096 0.996888 0.063948\n-0.142810 0.980986 0.222584 0.046096 0.996888 0.063948\n0.035096 0.967210 0.309104 0.046096 0.996888 0.063948\n-0.142810 0.980986 0.222584 -0.082964 0.943499 0.320822\n-0.196931 0.929820 0.359061 -0.082964 0.943499 0.320822\n0.035096 0.967210 0.309104 -0.082964 0.943499 0.320822\n0.035096 0.967210 0.309104 -0.079450 0.939235 0.333953\n-0.196931 0.929820 0.359061 -0.079450 0.939235 0.333953\n-0.029494 0.914893 0.440876 -0.079450 0.939235 0.333953\n-0.196931 0.929820 0.359061 -0.126543 0.897393 0.422696\n-0.212671 0.875701 0.469245 -0.126543 0.897393 0.422696\n-0.029494 0.914893 0.440876 -0.126543 0.897393 0.422696\n-0.138139 0.997343 -0.135997 -0.291021 0.817954 0.496243\n0.175558 0.999758 0.043991 -0.291021 0.817954 0.496243\n0.084757 1.012036 -0.029498 -0.291021 0.817954 0.496243\n0.266042 0.970728 0.138494 0.084185 0.989588 0.116738\n-0.085059 1.011323 0.047565 0.084185 0.989588 0.116738\n0.231846 0.963596 0.223610 0.084185 0.989588 0.116738\n0.231846 0.963596 0.223610 0.256444 0.944441 -0.205592\n-0.085059 1.011323 0.047565 0.256444 0.944441 -0.205592\n0.009400 1.006086 0.141330 0.256444 0.944441 -0.205592\n-0.085059 1.011323 0.047565 -0.160690 0.963153 0.215672\n-0.343515 0.922683 0.250847 -0.160690 0.963153 0.215672\n0.009400 1.006086 0.141330 -0.160690 0.963153 0.215672\n0.009400 1.006086 0.141330 -0.304404 0.907343 -0.289944\n-0.343515 0.922683 0.250847 -0.304404 0.907343 -0.289944\n-0.142810 0.980986 0.222584 -0.304404 0.907343 -0.289944\n-0.343515 0.922683 0.250847 -0.216137 0.912464 0.347411\n-0.367198 0.868742 0.377788 -0.216137 0.912464 0.347411\n-0.142810 0.980986 0.222584 -0.216137 0.912464 0.347411\n-0.142810 0.980986 0.222584 -0.306980 0.924747 0.224957\n-0.367198 0.868742 0.377788 -0.306980 0.924747 0.224957\n-0.196931 0.929820 0.359061 -0.306980 0.924747 0.224957\n-0.367198 0.868742 0.377788 -0.266535 0.870126 0.414536\n-0.371033 0.847143 0.420659 -0.266535 0.870126 0.414536\n-0.196931 0.929820 0.359061 -0.266535 0.870126 0.414536\n-0.371033 0.847143 0.420659 -0.321414 0.898839 0.297961\n-0.321111 0.860330 0.434731 -0.321414 0.898839 0.297961\n-0.196931 0.929820 0.359061 -0.321414 0.898839 0.297961\n-0.196931 0.929820 0.359061 -0.251590 0.882442 0.397490\n-0.321111 0.860330 0.434731 -0.251590 0.882442 0.397490\n-0.212671 0.875701 0.469245 -0.251590 0.882442 0.397490\n0.175558 0.999758 0.043991 -0.317407 0.777594 0.542772\n-0.138139 0.997343 -0.135997 -0.317407 0.777594 0.542772\n0.266042 0.970728 0.138494 -0.317407 0.777594 0.542772\n-0.138139 0.997343 -0.135997 0.143777 0.982738 -0.116419\n-0.085059 1.011323 0.047565 0.143777 0.982738 -0.116419\n0.266042 0.970728 0.138494 0.143777 0.982738 -0.116419\n-0.343515 0.922683 0.250847 -0.376164 0.875942 0.302035\n-0.449869 0.856599 0.310044 -0.376164 0.875942 0.302035\n-0.367198 0.868742 0.377788 -0.376164 0.875942 0.302035\n-0.449869 0.856599 0.310044 -0.428624 0.821621 0.375791\n-0.495354 0.820771 0.336498 -0.428624 0.821621 0.375791\n-0.367198 0.868742 0.377788 -0.428624 0.821621 0.375791\n-0.367198 0.868742 0.377788 -0.428605 0.821700 0.375641\n-0.495354 0.820771 0.336498 -0.428605 0.821700 0.375641\n-0.371033 0.847143 0.420659 -0.428605 0.821700 0.375641\n-0.495354 0.820771 0.336498 -0.406325 0.850628 0.333664\n-0.442956 0.815843 0.412871 -0.406325 0.850628 0.333664\n-0.371033 0.847143 0.420659 -0.406325 0.850628 0.333664\n-0.371033 0.847143 0.420659 -0.360103 0.664529 0.654772\n-0.442956 0.815843 0.412871 -0.360103 0.664529 0.654772\n-0.321111 0.860330 0.434731 -0.360103 0.664529 0.654772\n-0.442956 0.815843 0.412871 -0.375875 0.860558 0.343741\n-0.386421 0.827993 0.444272 -0.375875 0.860558 0.343741\n-0.321111 0.860330 0.434731 -0.375875 0.860558 0.343741\n-0.321111 0.860330 0.434731 -0.292205 0.761038 0.579169\n-0.386421 0.827993 0.444272 -0.292205 0.761038 0.579169\n-0.212671 0.875701 0.469245 -0.292205 0.761038 0.579169\n-0.386421 0.827993 0.444272 -0.295405 0.814393 0.499499\n-0.399951 0.802019 0.478618 -0.295405 0.814393 0.499499\n-0.212671 0.875701 0.469245 -0.295405 0.814393 0.499499\n-0.111081 0.991263 -0.193207 -0.177561 0.966245 -0.186663\n-0.248889 0.967191 -0.186726 -0.177561 0.966245 -0.186663\n-0.138139 0.997343 -0.135997 -0.177561 0.966245 -0.186663\n-0.138139 0.997343 -0.135997 -0.199993 0.979654 -0.016776\n-0.320667 0.961117 -0.075487 -0.199993 0.979654 -0.016776\n-0.085059 1.011323 0.047565 -0.199993 0.979654 -0.016776\n-0.320667 0.961117 -0.075487 -0.282630 0.946636 0.154918\n-0.488807 0.861629 0.225685 -0.282630 0.946636 0.154918\n-0.085059 1.011323 0.047565 -0.282630 0.946636 0.154918\n-0.085059 1.011323 0.047565 -0.375353 0.923893 -0.074374\n-0.488807 0.861629 0.225685 -0.375353 0.923893 -0.074374\n-0.343515 0.922683 0.250847 -0.375353 0.923893 -0.074374\n-0.343515 0.922683 0.250847 -0.411218 0.878768 0.242211\n-0.488807 0.861629 0.225685 -0.411218 0.878768 0.242211\n-0.449869 0.856599 0.310044 -0.411218 0.878768 0.242211\n-0.488807 0.861629 0.225685 -0.490677 0.826550 0.275774\n-0.495354 0.820771 0.336498 -0.490677 0.826550 0.275774\n-0.449869 0.856599 0.310044 -0.490677 0.826550 0.275774\n-0.495354 0.820771 0.336498 -0.549605 0.720101 0.423543\n-0.562493 0.791349 0.299398 -0.549605 0.720101 0.423543\n-0.442956 0.815843 0.412871 -0.549605 0.720101 0.423543\n-0.562493 0.791349 0.299398 -0.470183 0.823456 0.317567\n-0.476952 0.796389 0.412981 -0.470183 0.823456 0.317567\n-0.442956 0.815843 0.412871 -0.470183 0.823456 0.317567\n-0.442956 0.815843 0.412871 -0.432969 0.759375 0.485683\n-0.476952 0.796389 0.412981 -0.432969 0.759375 0.485683\n-0.386421 0.827993 0.444272 -0.432969 0.759375 0.485683\n-0.386421 0.827993 0.444272 -0.426760 0.794236 0.432510\n-0.476952 0.796389 0.412981 -0.426760 0.794236 0.432510\n-0.399951 0.802019 0.478618 -0.426760 0.794236 0.432510\n-0.119286 0.973627 -0.264751 -0.197807 0.947720 -0.250396\n-0.203932 0.937795 -0.333502 -0.197807 0.947720 -0.250396\n-0.248889 0.967191 -0.186726 -0.197807 0.947720 -0.250396\n-0.248889 0.967191 -0.186726 -0.222715 0.970655 -0.090705\n-0.320667 0.961117 -0.075487 -0.222715 0.970655 -0.090705\n-0.138139 0.997343 -0.135997 -0.222715 0.970655 -0.090705\n-0.320667 0.961117 -0.075487 -0.206355 0.957585 0.201118\n-0.473452 0.895272 0.081257 -0.206355 0.957585 0.201118\n-0.488807 0.861629 0.225685 -0.206355 0.957585 0.201118\n-0.473452 0.895272 0.081257 -0.459179 0.874728 0.154937\n-0.532048 0.849583 0.165545 -0.459179 0.874728 0.154937\n-0.488807 0.861629 0.225685 -0.459179 0.874728 0.154937\n-0.532048 0.849583 0.165545 -0.526100 0.823221 0.213370\n-0.570832 0.805526 0.239895 -0.526100 0.823221 0.213370\n-0.488807 0.861629 0.225685 -0.526100 0.823221 0.213370\n-0.488807 0.861629 0.225685 -0.511112 0.815805 0.270605\n-0.570832 0.805526 0.239895 -0.511112 0.815805 0.270605\n-0.495354 0.820771 0.336498 -0.511112 0.815805 0.270605\n-0.570832 0.805526 0.239895 -0.506545 0.820036 0.266369\n-0.562493 0.791349 0.299398 -0.506545 0.820036 0.266369\n-0.495354 0.820771 0.336498 -0.506545 0.820036 0.266369\n-0.562493 0.791349 0.299398 -0.433506 0.853686 0.288604\n-0.529042 0.784312 0.370460 -0.433506 0.853686 0.288604\n-0.476952 0.796389 0.412981 -0.433506 0.853686 0.288604\n-0.529042 0.784312 0.370460 -0.529075 0.724072 0.442491\n-0.595104 0.732496 0.376260 -0.529075 0.724072 0.442491\n-0.476952 0.796389 0.412981 -0.529075 0.724072 0.442491\n-0.476952 0.796389 0.412981 -0.522262 0.645485 0.557307\n-0.595104 0.732496 0.376260 -0.522262 0.645485 0.557307\n-0.399951 0.802019 0.478618 -0.522262 0.645485 0.557307\n-0.595104 0.732496 0.376260 -0.478905 0.794472 0.373449\n-0.519782 0.729037 0.480213 -0.478905 0.794472 0.373449\n-0.399951 0.802019 0.478618 -0.478905 0.794472 0.373449\n-0.203932 0.937795 -0.333502 -0.385825 0.874688 -0.293360\n-0.385700 0.933973 -0.105839 -0.385825 0.874688 -0.293360\n-0.248889 0.967191 -0.186726 -0.385825 0.874688 -0.293360\n-0.248889 0.967191 -0.186726 -0.318359 0.935320 -0.154350\n-0.385700 0.933973 -0.105839 -0.318359 0.935320 -0.154350\n-0.320667 0.961117 -0.075487 -0.318359 0.935320 -0.154350\n-0.320667 0.961117 -0.075487 -0.388499 0.921411 0.008379\n-0.385700 0.933973 -0.105839 -0.388499 0.921411 0.008379\n-0.473452 0.895272 0.081257 -0.388499 0.921411 0.008379\n-0.570832 0.805526 0.239895 -0.594781 0.759217 0.264244\n-0.641133 0.733995 0.287179 -0.594781 0.759217 0.264244\n-0.562493 0.791349 0.299398 -0.594781 0.759217 0.264244\n-0.562493 0.791349 0.299398 -0.587040 0.730615 0.348691\n-0.641133 0.733995 0.287179 -0.587040 0.730615 0.348691\n-0.529042 0.784312 0.370460 -0.587040 0.730615 0.348691\n-0.641133 0.733995 0.287179 -0.570385 0.761633 0.307533\n-0.595104 0.732496 0.376260 -0.570385 0.761633 0.307533\n-0.529042 0.784312 0.370460 -0.570385 0.761633 0.307533\n-0.595104 0.732496 0.376260 -0.561268 0.707030 0.430217\n-0.589057 0.672580 0.482617 -0.561268 0.707030 0.430217\n-0.519782 0.729037 0.480213 -0.561268 0.707030 0.430217\n-0.145259 0.888038 -0.471763 -0.097595 0.922518 -0.373411\n-0.194639 0.899737 -0.429954 -0.097595 0.922518 -0.373411\n-0.203932 0.937795 -0.333502 -0.097595 0.922518 -0.373411\n-0.203932 0.937795 -0.333502 0.069288 0.994993 0.072027\n-0.250200 0.938465 -0.298251 0.069288 0.994993 0.072027\n-0.385700 0.933973 -0.105839 0.069288 0.994993 0.072027\n-0.250200 0.938465 -0.298251 -0.155716 0.983991 -0.086682\n-0.369123 0.930715 -0.172593 -0.155716 0.983991 -0.086682\n-0.385700 0.933973 -0.105839 -0.155716 0.983991 -0.086682\n-0.369123 0.930715 -0.172593 -0.441530 0.884142 -0.152787\n-0.511469 0.872145 -0.100170 -0.441530 0.884142 -0.152787\n-0.385700 0.933973 -0.105839 -0.441530 0.884142 -0.152787\n-0.385700 0.933973 -0.105839 -0.441856 0.896823 -0.021732\n-0.511469 0.872145 -0.100170 -0.441856 0.896823 -0.021732\n-0.473452 0.895272 0.081257 -0.441856 0.896823 -0.021732\n-0.473452 0.895272 0.081257 -0.619678 0.784837 -0.005366\n-0.685472 0.728530 0.177889 -0.619678 0.784837 -0.005366\n-0.532048 0.849583 0.165545 -0.619678 0.784837 -0.005366\n-0.532048 0.849583 0.165545 -0.605268 0.782188 0.147758\n-0.685472 0.728530 0.177889 -0.605268 0.782188 0.147758\n-0.570832 0.805526 0.239895 -0.605268 0.782188 0.147758\n-0.685472 0.728530 0.177889 -0.624174 0.748216 0.224898\n-0.689520 0.705883 0.241997 -0.624174 0.748216 0.224898\n-0.570832 0.805526 0.239895 -0.624174 0.748216 0.224898\n-0.570832 0.805526 0.239895 -0.627310 0.751514 0.204227\n-0.689520 0.705883 0.241997 -0.627310 0.751514 0.204227\n-0.641133 0.733995 0.287179 -0.627310 0.751514 0.204227\n-0.641133 0.733995 0.287179 -0.641371 0.686318 0.342945\n-0.705233 0.656155 0.323076 -0.641371 0.686318 0.342945\n-0.595104 0.732496 0.376260 -0.641371 0.686318 0.342945\n-0.705233 0.656155 0.323076 -0.623484 0.753089 0.210060\n-0.658558 0.684141 0.361281 -0.623484 0.753089 0.210060\n-0.595104 0.732496 0.376260 -0.623484 0.753089 0.210060\n-0.595104 0.732496 0.376260 -0.611483 0.674017 0.414475\n-0.658558 0.684141 0.361281 -0.611483 0.674017 0.414475\n-0.589057 0.672580 0.482617 -0.611483 0.674017 0.414475\n-0.658558 0.684141 0.361281 -0.605632 0.680916 0.411780\n-0.642442 0.639163 0.459359 -0.605632 0.680916 0.411780\n-0.589057 0.672580 0.482617 -0.605632 0.680916 0.411780\n-0.145259 0.888038 -0.471763 -0.182931 0.869245 -0.459293\n-0.208537 0.862777 -0.494368 -0.182931 0.869245 -0.459293\n-0.194639 0.899737 -0.429954 -0.182931 0.869245 -0.459293\n-0.194639 0.899737 -0.429954 -0.171747 0.910621 -0.375862\n-0.205411 0.900128 -0.424084 -0.171747 0.910621 -0.375862\n-0.203932 0.937795 -0.333502 -0.171747 0.910621 -0.375862\n-0.203932 0.937795 -0.333502 -0.266229 0.891560 -0.366392\n-0.205411 0.900128 -0.424084 -0.266229 0.891560 -0.366392\n-0.250200 0.938465 -0.298251 -0.266229 0.891560 -0.366392\n-0.205411 0.900128 -0.424084 0.776551 -0.470005 0.419600\n-0.225196 0.921735 -0.363266 0.776551 -0.470005 0.419600\n-0.250200 0.938465 -0.298251 0.776551 -0.470005 0.419600\n-0.225196 0.921735 -0.363266 -0.456269 0.803555 -0.382254\n-0.369123 0.930715 -0.172593 -0.456269 0.803555 -0.382254\n-0.250200 0.938465 -0.298251 -0.456269 0.803555 -0.382254\n-0.511469 0.872145 -0.100170 -0.570283 0.821315 0.014804\n-0.672184 0.757235 0.083883 -0.570283 0.821315 0.014804\n-0.473452 0.895272 0.081257 -0.570283 0.821315 0.014804\n-0.473452 0.895272 0.081257 -0.560844 0.810645 0.168255\n-0.672184 0.757235 0.083883 -0.560844 0.810645 0.168255\n-0.685472 0.728530 0.177889 -0.560844 0.810645 0.168255\n-0.689520 0.705883 0.241997 -0.674916 0.672075 0.304637\n-0.736709 0.637358 0.288627 -0.674916 0.672075 0.304637\n-0.641133 0.733995 0.287179 -0.674916 0.672075 0.304637\n-0.641133 0.733995 0.287179 -0.685696 0.681984 0.254399\n-0.736709 0.637358 0.288627 -0.685696 0.681984 0.254399\n-0.705233 0.656155 0.323076 -0.685696 0.681984 0.254399\n-0.705233 0.656155 0.323076 -0.678471 0.640556 0.359673\n-0.720637 0.617872 0.362197 -0.678471 0.640556 0.359673\n-0.658558 0.684141 0.361281 -0.678471 0.640556 0.359673\n-0.658558 0.684141 0.361281 -0.666610 0.629981 0.398442\n-0.720637 0.617872 0.362197 -0.666610 0.629981 0.398442\n-0.642442 0.639163 0.459359 -0.666610 0.629981 0.398442\n-0.720637 0.617872 0.362197 -0.687767 0.588898 0.424471\n-0.720166 0.539160 0.472164 -0.687767 0.588898 0.424471\n-0.642442 0.639163 0.459359 -0.687767 0.588898 0.424471\n-0.895887 0.436118 0.198641 -0.869248 0.421088 0.259022\n-0.877580 0.397972 0.322092 -0.869248 0.421088 0.259022\n-0.850404 0.461583 0.309881 -0.869248 0.421088 0.259022\n-0.857227 0.402504 -0.367999 -0.919254 0.284150 -0.272453\n-0.976525 0.252683 -0.121741 -0.919254 0.284150 -0.272453\n-0.897479 0.431108 -0.202358 -0.919254 0.284150 -0.272453\n-0.740705 0.357653 -0.596416 -0.816863 0.320453 -0.479629\n-0.904461 0.247758 -0.390944 -0.816863 0.320453 -0.479629\n-0.857227 0.402504 -0.367999 -0.816863 0.320453 -0.479629\n-0.762673 0.255891 -0.620581 -0.817887 0.294012 -0.494588\n-0.904461 0.247758 -0.390944 -0.817887 0.294012 -0.494588\n-0.740705 0.357653 -0.596416 -0.817887 0.294012 -0.494588\n-0.813378 0.105143 -0.599693 -0.820081 -0.064290 -0.568625\n-0.916014 -0.002255 -0.439527 -0.820081 -0.064290 -0.568625\n-0.884876 0.076611 -0.493352 -0.820081 -0.064290 -0.568625\n-0.820616 0.473981 0.366336 -0.769750 0.483103 0.417249\n-0.809242 0.427256 0.441419 -0.769750 0.483103 0.417249\n-0.770633 0.543868 0.377630 -0.769750 0.483103 0.417249\n-0.770633 0.543868 0.377630 -0.760198 0.486959 0.430080\n-0.809242 0.427256 0.441419 -0.760198 0.486959 0.430080\n-0.720166 0.539160 0.472164 -0.760198 0.486959 0.430080\n-0.809242 0.427256 0.441419 -0.742097 0.455646 0.491608\n-0.786003 0.383223 0.517310 -0.742097 0.455646 0.491608\n-0.720166 0.539160 0.472164 -0.742097 0.455646 0.491608\n-0.850404 0.461583 0.309881 -0.836110 0.424018 0.348036\n-0.877580 0.397972 0.322092 -0.836110 0.424018 0.348036\n-0.820616 0.473981 0.366336 -0.836110 0.424018 0.348036\n-0.877580 0.397972 0.322092 -0.832739 0.403232 0.379407\n-0.870801 0.343057 0.395334 -0.832739 0.403232 0.379407\n-0.820616 0.473981 0.366336 -0.832739 0.403232 0.379407\n-0.820616 0.473981 0.366336 -0.833789 0.403143 0.377189\n-0.870801 0.343057 0.395334 -0.833789 0.403143 0.377189\n-0.809242 0.427256 0.441419 -0.833789 0.403143 0.377189\n-0.870801 0.343057 0.395334 -0.827044 0.375886 0.417980\n-0.842482 0.335362 0.458288 -0.827044 0.375886 0.417980\n-0.809242 0.427256 0.441419 -0.827044 0.375886 0.417980\n-0.809242 0.427256 0.441419 -0.802594 0.375412 0.463582\n-0.842482 0.335362 0.458288 -0.802594 0.375412 0.463582\n-0.786003 0.383223 0.517310 -0.802594 0.375412 0.463582\n-0.877580 0.397972 0.322092 -0.861935 0.364143 0.352801\n-0.897933 0.337388 0.334898 -0.861935 0.364143 0.352801\n-0.870801 0.343057 0.395334 -0.861935 0.364143 0.352801\n-0.895887 0.436118 0.198641 -0.897987 0.364888 0.245919\n-0.946224 0.311629 0.199548 -0.897987 0.364888 0.245919\n-0.877580 0.397972 0.322092 -0.897987 0.364888 0.245919\n-0.877580 0.397972 0.322092 -0.899609 0.355758 0.253260\n-0.946224 0.311629 0.199548 -0.899609 0.355758 0.253260\n-0.897933 0.337388 0.334898 -0.899609 0.355758 0.253260\n-0.897933 0.337388 0.334898 -0.891008 0.254166 0.376171\n-0.920564 0.168020 0.395731 -0.891008 0.254166 0.376171\n-0.870801 0.343057 0.395334 -0.891008 0.254166 0.376171\n-0.870801 0.343057 0.395334 -0.871576 0.248746 0.422471\n-0.920564 0.168020 0.395731 -0.871576 0.248746 0.422471\n-0.842482 0.335362 0.458288 -0.871576 0.248746 0.422471\n-0.920564 0.168020 0.395731 -0.868193 0.243456 0.432401\n-0.885185 0.155329 0.473911 -0.868193 0.243456 0.432401\n-0.842482 0.335362 0.458288 -0.868193 0.243456 0.432401\n-0.842482 0.335362 0.458288 -0.790637 0.236544 0.564747\n-0.885185 0.155329 0.473911 -0.790637 0.236544 0.564747\n-0.786003 0.383223 0.517310 -0.790637 0.236544 0.564747\n-0.912979 0.430880 0.114384 -0.914360 0.370899 0.162418\n-0.946224 0.311629 0.199548 -0.914360 0.370899 0.162418\n-0.895887 0.436118 0.198641 -0.914360 0.370899 0.162418\n-0.946224 0.311629 0.199548 -0.921087 0.274183 0.276447\n-0.944185 0.198868 0.318178 -0.921087 0.274183 0.276447\n-0.897933 0.337388 0.334898 -0.921087 0.274183 0.276447\n-0.897933 0.337388 0.334898 -0.892795 0.253128 0.372617\n-0.944185 0.198868 0.318178 -0.892795 0.253128 0.372617\n-0.920564 0.168020 0.395731 -0.892795 0.253128 0.372617\n-0.920564 0.168020 0.395731 -0.892079 0.146504 0.427472\n-0.915419 0.104831 0.428123 -0.892079 0.146504 0.427472\n-0.885185 0.155329 0.473911 -0.892079 0.146504 0.427472\n-0.912979 0.430880 0.114384 -0.951501 0.303060 0.052927\n-0.987796 0.191299 0.141194 -0.951501 0.303060 0.052927\n-0.946224 0.311629 0.199548 -0.951501 0.303060 0.052927\n-0.987796 0.191299 0.141194 -0.948834 0.216182 0.230175\n-0.984638 0.123303 0.218071 -0.948834 0.216182 0.230175\n-0.946224 0.311629 0.199548 -0.948834 0.216182 0.230175\n-0.946224 0.311629 0.199548 -0.951006 0.215765 0.221433\n-0.984638 0.123303 0.218071 -0.951006 0.215765 0.221433\n-0.944185 0.198868 0.318178 -0.951006 0.215765 0.221433\n-0.984638 0.123303 0.218071 -0.950641 0.146667 0.273443\n-0.971033 0.082195 0.287422 -0.950641 0.146667 0.273443\n-0.944185 0.198868 0.318178 -0.950641 0.146667 0.273443\n-0.971033 0.082195 0.287422 -0.929136 0.121772 0.349110\n-0.932763 0.053878 0.399150 -0.929136 0.121772 0.349110\n-0.944185 0.198868 0.318178 -0.929136 0.121772 0.349110\n-0.944185 0.198868 0.318178 -0.937745 0.110095 0.329414\n-0.932763 0.053878 0.399150 -0.937745 0.110095 0.329414\n-0.920564 0.168020 0.395731 -0.937745 0.110095 0.329414\n-0.920564 0.168020 0.395731 -0.925986 0.109792 0.361241\n-0.932763 0.053878 0.399150 -0.925986 0.109792 0.361241\n-0.915419 0.104831 0.428123 -0.925986 0.109792 0.361241\n-0.915419 0.104831 0.428123 -0.792413 -0.074514 0.605417\n-0.932763 0.053878 0.399150 -0.792413 -0.074514 0.605417\n-0.885185 0.155329 0.473911 -0.792413 -0.074514 0.605417\n-0.932763 0.053878 0.399150 -0.882100 0.070458 0.465763\n-0.909591 -0.009226 0.452582 -0.882100 0.070458 0.465763\n-0.885185 0.155329 0.473911 -0.882100 0.070458 0.465763\n-0.897479 0.431108 -0.202358 -0.912911 0.405738 -0.044381\n-0.978939 0.271548 0.014542 -0.912911 0.405738 -0.044381\n-0.912979 0.430880 0.114384 -0.912911 0.405738 -0.044381\n-0.912979 0.430880 0.114384 -0.942246 0.308766 0.129750\n-0.978939 0.271548 0.014542 -0.942246 0.308766 0.129750\n-0.987796 0.191299 0.141194 -0.942246 0.308766 0.129750\n-0.971033 0.082195 0.287422 -0.941194 0.047743 0.334477\n-0.939623 0.007855 0.386417 -0.941194 0.047743 0.334477\n-0.932763 0.053878 0.399150 -0.941194 0.047743 0.334477\n-0.939623 0.007855 0.386417 -0.896527 0.011101 0.442851\n-0.924039 -0.050108 0.419419 -0.896527 0.011101 0.442851\n-0.932763 0.053878 0.399150 -0.896527 0.011101 0.442851\n-0.932763 0.053878 0.399150 -0.917113 0.000754 0.398626\n-0.924039 -0.050108 0.419419 -0.917113 0.000754 0.398626\n-0.909591 -0.009226 0.452582 -0.917113 0.000754 0.398626\n-0.897479 0.431108 -0.202358 -0.923257 0.377994 -0.068676\n-0.976525 0.252683 -0.121741 -0.923257 0.377994 -0.068676\n-0.978939 0.271548 0.014542 -0.923257 0.377994 -0.068676\n-0.976525 0.252683 -0.121741 -0.981399 0.187039 -0.043272\n-1.009495 0.112825 0.021483 -0.981399 0.187039 -0.043272\n-0.978939 0.271548 0.014542 -0.981399 0.187039 -0.043272\n-0.978939 0.271548 0.014542 -0.980188 0.190993 0.052472\n-1.009495 0.112825 0.021483 -0.980188 0.190993 0.052472\n-0.987796 0.191299 0.141194 -0.980188 0.190993 0.052472\n-1.009495 0.112825 0.021483 -0.987266 0.127131 0.095619\n-1.000551 0.080113 0.157325 -0.987266 0.127131 0.095619\n-0.987796 0.191299 0.141194 -0.987266 0.127131 0.095619\n-0.987796 0.191299 0.141194 -0.977809 0.135371 0.159890\n-1.000551 0.080113 0.157325 -0.977809 0.135371 0.159890\n-0.984638 0.123303 0.218071 -0.977809 0.135371 0.159890\n-1.000551 0.080113 0.157325 -0.973399 0.041791 0.225271\n-0.969873 0.012510 0.302425 -0.973399 0.041791 0.225271\n-0.984638 0.123303 0.218071 -0.973399 0.041791 0.225271\n-0.984638 0.123303 0.218071 -0.977540 0.028689 0.208789\n-0.969873 0.012510 0.302425 -0.977540 0.028689 0.208789\n-0.971033 0.082195 0.287422 -0.977540 0.028689 0.208789\n-0.971033 0.082195 0.287422 -0.938240 0.057834 0.341118\n-0.969873 0.012510 0.302425 -0.938240 0.057834 0.341118\n-0.939623 0.007855 0.386417 -0.938240 0.057834 0.341118\n-0.969873 0.012510 0.302425 -0.941003 -0.021092 0.337739\n-0.969769 -0.050489 0.298780 -0.941003 -0.021092 0.337739\n-0.939623 0.007855 0.386417 -0.941003 -0.021092 0.337739\n-0.969769 -0.050489 0.298780 -0.938721 -0.030643 0.343313\n-0.953697 -0.086340 0.339526 -0.938721 -0.030643 0.343313\n-0.939623 0.007855 0.386417 -0.938721 -0.030643 0.343313\n-0.939623 0.007855 0.386417 -0.930197 -0.042509 0.364591\n-0.953697 -0.086340 0.339526 -0.930197 -0.042509 0.364591\n-0.924039 -0.050108 0.419419 -0.930197 -0.042509 0.364591\n-0.953697 -0.086340 0.339526 -0.915586 -0.105916 0.387923\n-0.905055 -0.097863 0.451187 -0.915586 -0.105916 0.387923\n-0.924039 -0.050108 0.419419 -0.915586 -0.105916 0.387923\n-0.857227 0.402504 -0.367999 -0.914889 0.316429 -0.250700\n-0.904461 0.247758 -0.390944 -0.914889 0.316429 -0.250700\n-0.976525 0.252683 -0.121741 -0.914889 0.316429 -0.250700\n-0.904461 0.247758 -0.390944 -0.965514 -0.036394 -0.257797\n-1.009495 0.112825 0.021483 -0.965514 -0.036394 -0.257797\n-0.976525 0.252683 -0.121741 -0.965514 -0.036394 -0.257797\n-1.009495 0.112825 0.021483 -0.996177 0.043115 0.075974\n-1.006373 -0.020493 0.138072 -0.996177 0.043115 0.075974\n-1.000551 0.080113 0.157325 -0.996177 0.043115 0.075974\n-1.006373 -0.020493 0.138072 -0.980344 0.019159 0.196364\n-0.995442 -0.054458 0.195960 -0.980344 0.019159 0.196364\n-1.000551 0.080113 0.157325 -0.980344 0.019159 0.196364\n-1.000551 0.080113 0.157325 -0.975570 0.025606 0.218190\n-0.995442 -0.054458 0.195960 -0.975570 0.025606 0.218190\n-0.969873 0.012510 0.302425 -0.975570 0.025606 0.218190\n-0.995442 -0.054458 0.195960 -0.969953 -0.015646 0.242789\n-0.969769 -0.050489 0.298780 -0.969953 -0.015646 0.242789\n-0.969873 0.012510 0.302425 -0.969953 -0.015646 0.242789\n-0.953697 -0.086340 0.339526 -0.917439 -0.056850 0.393794\n-0.935754 -0.123745 0.375930 -0.917439 -0.056850 0.393794\n-0.905055 -0.097863 0.451187 -0.917439 -0.056850 0.393794\n-0.935754 -0.123745 0.375930 -0.894667 -0.156010 0.418607\n-0.877574 -0.178949 0.479700 -0.894667 -0.156010 0.418607\n-0.905055 -0.097863 0.451187 -0.894667 -0.156010 0.418607\n-0.995442 -0.054458 0.195960 -0.968396 -0.052523 0.243823\n-0.974297 -0.100538 0.270018 -0.968396 -0.052523 0.243823\n-0.969769 -0.050489 0.298780 -0.968396 -0.052523 0.243823\n-0.969769 -0.050489 0.298780 -0.950310 -0.085981 0.299195\n-0.974297 -0.100538 0.270018 -0.950310 -0.085981 0.299195\n-0.953697 -0.086340 0.339526 -0.950310 -0.085981 0.299195\n-0.974297 -0.100538 0.270018 -0.943458 -0.128058 0.305759\n-0.943354 -0.174522 0.334510 -0.943458 -0.128058 0.305759\n-0.953697 -0.086340 0.339526 -0.943458 -0.128058 0.305759\n-0.953697 -0.086340 0.339526 -0.935508 -0.128455 0.329126\n-0.943354 -0.174522 0.334510 -0.935508 -0.128455 0.329126\n-0.935754 -0.123745 0.375930 -0.935508 -0.128455 0.329126\n-0.943354 -0.174522 0.334510 -0.915146 -0.163575 0.368444\n-0.929389 -0.204838 0.355738 -0.915146 -0.163575 0.368444\n-0.935754 -0.123745 0.375930 -0.915146 -0.163575 0.368444\n-0.935754 -0.123745 0.375930 -0.895487 -0.172459 0.410317\n-0.929389 -0.204838 0.355738 -0.895487 -0.172459 0.410317\n-0.877574 -0.178949 0.479700 -0.895487 -0.172459 0.410317\n-0.762673 0.255891 -0.620581 -0.835437 0.208632 -0.508447\n-0.884876 0.076611 -0.493352 -0.835437 0.208632 -0.508447\n-0.904461 0.247758 -0.390944 -0.835437 0.208632 -0.508447\n-0.884876 0.076611 -0.493352 -0.944055 0.082956 -0.319184\n-0.998115 -0.033080 -0.186933 -0.944055 0.082956 -0.319184\n-0.904461 0.247758 -0.390944 -0.944055 0.082956 -0.319184\n-0.904461 0.247758 -0.390944 -0.964757 0.187900 -0.184222\n-0.998115 -0.033080 -0.186933 -0.964757 0.187900 -0.184222\n-1.009495 0.112825 0.021483 -0.964757 0.187900 -0.184222\n-0.998115 -0.033080 -0.186933 -0.997907 0.012720 -0.063395\n-1.013474 -0.049953 0.051449 -0.997907 0.012720 -0.063395\n-1.009495 0.112825 0.021483 -0.997907 0.012720 -0.063395\n-1.009495 0.112825 0.021483 -0.996920 0.037088 0.069102\n-1.013474 -0.049953 0.051449 -0.996920 0.037088 0.069102\n-1.006373 -0.020493 0.138072 -0.996920 0.037088 0.069102\n-1.013474 -0.049953 0.051449 -0.994067 -0.047754 0.097723\n-1.004683 -0.091105 0.120758 -0.994067 -0.047754 0.097723\n-1.006373 -0.020493 0.138072 -0.994067 -0.047754 0.097723\n-1.006373 -0.020493 0.138072 -0.986710 -0.060587 0.150775\n-1.004683 -0.091105 0.120758 -0.986710 -0.060587 0.150775\n-0.995442 -0.054458 0.195960 -0.986710 -0.060587 0.150775\n-1.004683 -0.091105 0.120758 -0.984428 -0.076520 0.158260\n-0.994748 -0.119021 0.169059 -0.984428 -0.076520 0.158260\n-0.995442 -0.054458 0.195960 -0.984428 -0.076520 0.158260\n-0.995442 -0.054458 0.195960 -0.971449 -0.100068 0.215112\n-0.994748 -0.119021 0.169059 -0.971449 -0.100068 0.215112\n-0.974297 -0.100538 0.270018 -0.971449 -0.100068 0.215112\n-0.994748 -0.119021 0.169059 -0.967790 -0.124467 0.218837\n-0.968818 -0.167227 0.256316 -0.967790 -0.124467 0.218837\n-0.974297 -0.100538 0.270018 -0.967790 -0.124467 0.218837\n-0.974297 -0.100538 0.270018 -0.945442 -0.138277 0.294988\n-0.968818 -0.167227 0.256316 -0.945442 -0.138277 0.294988\n-0.943354 -0.174522 0.334510 -0.945442 -0.138277 0.294988\n-0.929389 -0.204838 0.355738 -0.876729 -0.240315 0.416648\n-0.853017 -0.317588 0.451410 -0.876729 -0.240315 0.416648\n-0.877574 -0.178949 0.479700 -0.876729 -0.240315 0.416648\n-0.916014 -0.002255 -0.439527 -0.942049 0.177776 -0.284499\n-0.998115 -0.033080 -0.186933 -0.942049 0.177776 -0.284499\n-0.884876 0.076611 -0.493352 -0.942049 0.177776 -0.284499\n-0.998115 -0.033080 -0.186933 -0.990221 0.128329 -0.054717\n-1.008117 -0.074182 -0.102314 -0.990221 0.128329 -0.054717\n-1.013474 -0.049953 0.051449 -0.990221 0.128329 -0.054717\n-1.008117 -0.074182 -0.102314 -0.998977 -0.034388 -0.029382\n-1.010683 -0.102329 0.017874 -0.998977 -0.034388 -0.029382\n-1.013474 -0.049953 0.051449 -0.998977 -0.034388 -0.029382\n-1.010683 -0.102329 0.017874 -0.992645 -0.098238 0.070748\n-1.000731 -0.134830 0.112381 -0.992645 -0.098238 0.070748\n-1.013474 -0.049953 0.051449 -0.992645 -0.098238 0.070748\n-1.013474 -0.049953 0.051449 -0.992623 -0.102216 0.065202\n-1.000731 -0.134830 0.112381 -0.992623 -0.102216 0.065202\n-1.004683 -0.091105 0.120758 -0.992623 -0.102216 0.065202\n-1.004683 -0.091105 0.120758 -0.984021 -0.114992 0.135942\n-1.000731 -0.134830 0.112381 -0.984021 -0.114992 0.135942\n-0.994748 -0.119021 0.169059 -0.984021 -0.114992 0.135942\n-0.943354 -0.174522 0.334510 -0.927111 -0.209451 0.310798\n-0.934976 -0.253748 0.306109 -0.927111 -0.209451 0.310798\n-0.929389 -0.204838 0.355738 -0.927111 -0.209451 0.310798\n-0.934976 -0.253748 0.306109 -0.908456 -0.242014 0.340789\n-0.905573 -0.279089 0.366495 -0.908456 -0.242014 0.340789\n-0.929389 -0.204838 0.355738 -0.908456 -0.242014 0.340789\n-0.929389 -0.204838 0.355738 -0.871047 -0.215434 0.441434\n-0.905573 -0.279089 0.366495 -0.871047 -0.215434 0.441434\n-0.853017 -0.317588 0.451410 -0.871047 -0.215434 0.441434\n-0.916014 -0.002255 -0.439527 -0.951307 0.065441 -0.301217\n-0.975066 -0.087917 -0.271640 -0.951307 0.065441 -0.301217\n-0.998115 -0.033080 -0.186933 -0.951307 0.065441 -0.301217\n-0.975066 -0.087917 -0.271640 -0.973659 -0.078666 -0.214007\n-0.995585 -0.110261 -0.170072 -0.973659 -0.078666 -0.214007\n-0.998115 -0.033080 -0.186933 -0.973659 -0.078666 -0.214007\n-0.998115 -0.033080 -0.186933 -0.986857 -0.064696 -0.148077\n-0.995585 -0.110261 -0.170072 -0.986857 -0.064696 -0.148077\n-1.008117 -0.074182 -0.102314 -0.986857 -0.064696 -0.148077\n-0.995585 -0.110261 -0.170072 -0.984363 -0.139206 -0.107941\n-0.999051 -0.177430 -0.051842 -0.984363 -0.139206 -0.107941\n-1.008117 -0.074182 -0.102314 -0.984363 -0.139206 -0.107941\n-1.008117 -0.074182 -0.102314 -0.992803 -0.110153 -0.046994\n-0.999051 -0.177430 -0.051842 -0.992803 -0.110153 -0.046994\n-1.010683 -0.102329 0.017874 -0.992803 -0.110153 -0.046994\n-0.999051 -0.177430 -0.051842 -0.988778 -0.149338 -0.004110\n-0.998750 -0.181968 0.040711 -0.988778 -0.149338 -0.004110\n-1.010683 -0.102329 0.017874 -0.988778 -0.149338 -0.004110\n-1.010683 -0.102329 0.017874 -0.989577 -0.131350 0.059037\n-0.998750 -0.181968 0.040711 -0.989577 -0.131350 0.059037\n-1.000731 -0.134830 0.112381 -0.989577 -0.131350 0.059037\n-0.998750 -0.181968 0.040711 -0.984193 -0.159230 0.077523\n-0.991670 -0.193689 0.106516 -0.984193 -0.159230 0.077523\n-1.000731 -0.134830 0.112381 -0.984193 -0.159230 0.077523\n-1.000731 -0.134830 0.112381 -0.974998 -0.164928 0.148918\n-0.991670 -0.193689 0.106516 -0.974998 -0.164928 0.148918\n-0.994748 -0.119021 0.169059 -0.974998 -0.164928 0.148918\n-0.991670 -0.193689 0.106516 -0.975248 -0.164222 0.148063\n-0.980282 -0.216948 0.155728 -0.975248 -0.164222 0.148063\n-0.994748 -0.119021 0.169059 -0.975248 -0.164222 0.148063\n-0.994748 -0.119021 0.169059 -0.966365 -0.169128 0.193740\n-0.980282 -0.216948 0.155728 -0.966365 -0.169128 0.193740\n-0.968818 -0.167227 0.256316 -0.966365 -0.169128 0.193740\n-0.980282 -0.216948 0.155728 -0.962443 -0.183272 0.200285\n-0.963468 -0.239873 0.215548 -0.962443 -0.183272 0.200285\n-0.968818 -0.167227 0.256316 -0.962443 -0.183272 0.200285\n-0.968818 -0.167227 0.256316 -0.932049 -0.227084 0.282342\n-0.963468 -0.239873 0.215548 -0.932049 -0.227084 0.282342\n-0.943354 -0.174522 0.334510 -0.932049 -0.227084 0.282342\n-0.963468 -0.239873 0.215548 -0.943677 -0.195482 0.266948\n-0.934976 -0.253748 0.306109 -0.943677 -0.195482 0.266948\n-0.943354 -0.174522 0.334510 -0.943677 -0.195482 0.266948\n-0.880784 -0.336490 0.378505 -0.842700 -0.265991 0.468087\n-0.821358 -0.383886 0.458557 -0.842700 -0.265991 0.468087\n-0.905573 -0.279089 0.366495 -0.842700 -0.265991 0.468087\n-0.905573 -0.279089 0.366495 -0.855744 -0.369615 0.362060\n-0.821358 -0.383886 0.458557 -0.855744 -0.369615 0.362060\n-0.853017 -0.317588 0.451410 -0.855744 -0.369615 0.362060\n-0.813378 0.105143 -0.599693 -0.853043 0.039177 -0.520369\n-0.902483 -0.042549 -0.464743 -0.853043 0.039177 -0.520369\n-0.916014 -0.002255 -0.439527 -0.853043 0.039177 -0.520369\n-0.902483 -0.042549 -0.464743 -0.926525 -0.081260 -0.367352\n-0.975066 -0.087917 -0.271640 -0.926525 -0.081260 -0.367352\n-0.916014 -0.002255 -0.439527 -0.926525 -0.081260 -0.367352\n-0.975066 -0.087917 -0.271640 -0.966133 -0.128908 -0.223540\n-0.963693 -0.161718 -0.278236 -0.966133 -0.128908 -0.223540\n-0.995585 -0.110261 -0.170072 -0.966133 -0.128908 -0.223540\n-0.963693 -0.161718 -0.278236 -0.963931 -0.173889 -0.201492\n-0.977307 -0.232382 -0.152124 -0.963931 -0.173889 -0.201492\n-0.995585 -0.110261 -0.170072 -0.963931 -0.173889 -0.201492\n-0.995585 -0.110261 -0.170072 -0.978797 -0.164448 -0.122118\n-0.977307 -0.232382 -0.152124 -0.978797 -0.164448 -0.122118\n-0.999051 -0.177430 -0.051842 -0.978797 -0.164448 -0.122118\n-0.998750 -0.181968 0.040711 -0.977042 -0.201484 0.069227\n-0.984493 -0.232604 0.094552 -0.977042 -0.201484 0.069227\n-0.991670 -0.193689 0.106516 -0.977042 -0.201484 0.069227\n-0.984493 -0.232604 0.094552 -0.969352 -0.215212 0.118493\n-0.979185 -0.246454 0.112822 -0.969352 -0.215212 0.118493\n-0.991670 -0.193689 0.106516 -0.969352 -0.215212 0.118493\n-0.991670 -0.193689 0.106516 -0.968951 -0.214603 0.122795\n-0.979185 -0.246454 0.112822 -0.968951 -0.214603 0.122795\n-0.980282 -0.216948 0.155728 -0.968951 -0.214603 0.122795\n-0.979185 -0.246454 0.112822 -0.961488 -0.237333 0.138617\n-0.968686 -0.266332 0.151607 -0.961488 -0.237333 0.138617\n-0.980282 -0.216948 0.155728 -0.961488 -0.237333 0.138617\n-0.980282 -0.216948 0.155728 -0.954801 -0.238949 0.176800\n-0.968686 -0.266332 0.151607 -0.954801 -0.238949 0.176800\n-0.963468 -0.239873 0.215548 -0.954801 -0.238949 0.176800\n-0.968686 -0.266332 0.151607 -0.944650 -0.268681 0.188275\n-0.947545 -0.287120 0.228017 -0.944650 -0.268681 0.188275\n-0.963468 -0.239873 0.215548 -0.944650 -0.268681 0.188275\n-0.963468 -0.239873 0.215548 -0.934468 -0.247348 0.256104\n-0.947545 -0.287120 0.228017 -0.934468 -0.247348 0.256104\n-0.934976 -0.253748 0.306109 -0.934468 -0.247348 0.256104\n-0.947545 -0.287120 0.228017 -0.919565 -0.285481 0.270001\n-0.917308 -0.334784 0.280601 -0.919565 -0.285481 0.270001\n-0.934976 -0.253748 0.306109 -0.919565 -0.285481 0.270001\n-0.934976 -0.253748 0.306109 -0.901827 -0.295778 0.314999\n-0.917308 -0.334784 0.280601 -0.901827 -0.295778 0.314999\n-0.905573 -0.279089 0.366495 -0.901827 -0.295778 0.314999\n-0.917308 -0.334784 0.280601 -0.890626 -0.316260 0.326750\n-0.880784 -0.336490 0.378505 -0.890626 -0.316260 0.326750\n-0.905573 -0.279089 0.366495 -0.890626 -0.316260 0.326750\n-0.720497 -0.575270 0.426873 -0.770880 -0.476283 0.422964\n-0.725577 -0.480468 0.524366 -0.770880 -0.476283 0.422964\n-0.821358 -0.383886 0.458557 -0.770880 -0.476283 0.422964\n-0.623567 -0.802134 0.004119 -0.690597 -0.712301 0.125314\n-0.629899 -0.748424 0.274519 -0.690597 -0.712301 0.125314\n-0.731347 -0.650367 0.272809 -0.690597 -0.712301 0.125314\n-0.434957 -0.913248 -0.095196 -0.544378 -0.832573 -0.102346\n-0.505484 -0.881139 0.018735 -0.544378 -0.832573 -0.102346\n-0.623567 -0.802134 0.004119 -0.544378 -0.832573 -0.102346\n-0.720497 -0.575270 0.426873 -0.672564 -0.547770 0.497601\n-0.650063 -0.627939 0.464093 -0.672564 -0.547770 0.497601\n-0.725577 -0.480468 0.524366 -0.672564 -0.547770 0.497601\n-0.704142 -0.643942 0.348989 -0.675066 -0.617912 0.403076\n-0.650063 -0.627939 0.464093 -0.675066 -0.617912 0.403076\n-0.720497 -0.575270 0.426873 -0.675066 -0.617912 0.403076\n-0.731347 -0.650367 0.272809 -0.666471 -0.684370 0.295728\n-0.629899 -0.748424 0.274519 -0.666471 -0.684370 0.295728\n-0.704142 -0.643942 0.348989 -0.666471 -0.684370 0.295728\n-0.629899 -0.748424 0.274519 -0.611631 -0.698885 0.370766\n-0.559285 -0.783637 0.324630 -0.611631 -0.698885 0.370766\n-0.704142 -0.643942 0.348989 -0.611631 -0.698885 0.370766\n-0.704142 -0.643942 0.348989 -0.607363 -0.696451 0.382186\n-0.559285 -0.783637 0.324630 -0.607363 -0.696451 0.382186\n-0.650063 -0.627939 0.464093 -0.607363 -0.696451 0.382186\n-0.559285 -0.783637 0.324630 -0.597483 -0.699514 0.392038\n-0.522063 -0.784590 0.379658 -0.597483 -0.699514 0.392038\n-0.650063 -0.627939 0.464093 -0.597483 -0.699514 0.392038\n-0.559285 -0.783637 0.324630 -0.437218 -0.854347 0.280947\n-0.357212 -0.860649 0.404914 -0.437218 -0.854347 0.280947\n-0.522063 -0.784590 0.379658 -0.437218 -0.854347 0.280947\n-0.522063 -0.784590 0.379658 -0.435253 -0.819833 0.372059\n-0.357212 -0.860649 0.404914 -0.435253 -0.819833 0.372059\n-0.385760 -0.824189 0.451855 -0.435253 -0.819833 0.372059\n-0.357212 -0.860649 0.404914 -0.256763 -0.832695 0.490603\n-0.135313 -0.844629 0.548237 -0.256763 -0.832695 0.490603\n-0.385760 -0.824189 0.451855 -0.256763 -0.832695 0.490603\n-0.526228 -0.845610 0.200746 -0.551733 -0.790464 0.266002\n-0.484830 -0.847319 0.281535 -0.551733 -0.790464 0.266002\n-0.629899 -0.748424 0.274519 -0.551733 -0.790464 0.266002\n-0.629899 -0.748424 0.274519 -0.556564 -0.800699 0.221625\n-0.484830 -0.847319 0.281535 -0.556564 -0.800699 0.221625\n-0.559285 -0.783637 0.324630 -0.556564 -0.800699 0.221625\n-0.484830 -0.847319 0.281535 -0.492784 -0.802994 0.335209\n-0.440849 -0.849737 0.340397 -0.492784 -0.802994 0.335209\n-0.559285 -0.783637 0.324630 -0.492784 -0.802994 0.335209\n-0.559285 -0.783637 0.324630 -0.473619 -0.731676 0.490240\n-0.440849 -0.849737 0.340397 -0.473619 -0.731676 0.490240\n-0.357212 -0.860649 0.404914 -0.473619 -0.731676 0.490240\n-0.440849 -0.849737 0.340397 -0.277206 -0.939671 0.200440\n-0.193768 -0.906535 0.415835 -0.277206 -0.939671 0.200440\n-0.357212 -0.860649 0.404914 -0.277206 -0.939671 0.200440\n-0.357212 -0.860649 0.404914 -0.264715 -0.823434 0.501879\n-0.193768 -0.906535 0.415835 -0.264715 -0.823434 0.501879\n-0.135313 -0.844629 0.548237 -0.264715 -0.823434 0.501879\n-0.193768 -0.906535 0.415835 -0.079148 -0.889167 0.450687\n0.037874 -0.916696 0.436468 -0.079148 -0.889167 0.450687\n-0.135313 -0.844629 0.548237 -0.079148 -0.889167 0.450687\n-0.623567 -0.802134 0.004119 -0.562545 -0.813342 0.148383\n-0.505484 -0.881139 0.018735 -0.562545 -0.813342 0.148383\n-0.629899 -0.748424 0.274519 -0.562545 -0.813342 0.148383\n-0.629899 -0.748424 0.274519 -0.654226 -0.752827 0.072391\n-0.505484 -0.881139 0.018735 -0.654226 -0.752827 0.072391\n-0.526228 -0.845610 0.200746 -0.654226 -0.752827 0.072391\n-0.484830 -0.847319 0.281535 -0.395964 -0.880786 0.259671\n-0.339004 -0.896477 0.337158 -0.395964 -0.880786 0.259671\n-0.440849 -0.849737 0.340397 -0.395964 -0.880786 0.259671\n-0.440849 -0.849737 0.340397 -0.340158 -0.777810 0.528492\n-0.339004 -0.896477 0.337158 -0.340158 -0.777810 0.528492\n-0.193768 -0.906535 0.415835 -0.340158 -0.777810 0.528492\n-0.505484 -0.881139 0.018735 -0.484245 -0.867455 0.114140\n-0.405124 -0.921497 0.137800 -0.484245 -0.867455 0.114140\n-0.526228 -0.845610 0.200746 -0.484245 -0.867455 0.114140\n-0.526228 -0.845610 0.200746 -0.439985 -0.873827 0.206976\n-0.405124 -0.921497 0.137800 -0.439985 -0.873827 0.206976\n-0.484830 -0.847319 0.281535 -0.439985 -0.873827 0.206976\n-0.339004 -0.896477 0.337158 -0.245157 -0.909280 0.336314\n-0.166472 -0.953775 0.308013 -0.245157 -0.909280 0.336314\n-0.193768 -0.906535 0.415835 -0.245157 -0.909280 0.336314\n-0.166472 -0.953775 0.308013 -0.093463 -0.920419 0.379597\n-0.003142 -0.958936 0.335713 -0.093463 -0.920419 0.379597\n-0.193768 -0.906535 0.415835 -0.093463 -0.920419 0.379597\n-0.193768 -0.906535 0.415835 -0.076514 -0.908044 0.411827\n-0.003142 -0.958936 0.335713 -0.076514 -0.908044 0.411827\n0.037874 -0.916696 0.436468 -0.076514 -0.908044 0.411827\n-0.434957 -0.913248 -0.095196 -0.293103 -0.952124 0.086891\n-0.138689 -1.003196 -0.081447 -0.293103 -0.952124 0.086891\n-0.505484 -0.881139 0.018735 -0.293103 -0.952124 0.086891\n-0.505484 -0.881139 0.018735 -0.326439 -0.944153 -0.044873\n-0.138689 -1.003196 -0.081447 -0.326439 -0.944153 -0.044873\n-0.405124 -0.921497 0.137800 -0.326439 -0.944153 -0.044873\n-0.405124 -0.921497 0.137800 -0.225710 -0.911055 0.345011\n-0.003806 -0.994657 0.207157 -0.225710 -0.911055 0.345011\n-0.484830 -0.847319 0.281535 -0.225710 -0.911055 0.345011\n-0.484830 -0.847319 0.281535 -0.300157 -0.952319 -0.054720\n-0.003806 -0.994657 0.207157 -0.300157 -0.952319 -0.054720\n-0.339004 -0.896477 0.337158 -0.300157 -0.952319 -0.054720\n-0.003806 -0.994657 0.207157 -0.335945 -0.927135 -0.166016\n-0.166472 -0.953775 0.308013 -0.335945 -0.927135 -0.166016\n-0.339004 -0.896477 0.337158 -0.335945 -0.927135 -0.166016\n-0.138689 -1.003196 -0.081447 -0.198292 -0.972589 0.121452\n-0.003806 -0.994657 0.207157 -0.198292 -0.972589 0.121452\n-0.405124 -0.921497 0.137800 -0.198292 -0.972589 0.121452\n-0.003806 -0.994657 0.207157 -0.119372 -0.972178 0.201546\n-0.017527 -0.982006 0.260056 -0.119372 -0.972178 0.201546\n-0.166472 -0.953775 0.308013 -0.119372 -0.972178 0.201546\n-0.166472 -0.953775 0.308013 -0.081689 -0.948885 0.304869\n-0.017527 -0.982006 0.260056 -0.081689 -0.948885 0.304869\n-0.003142 -0.958936 0.335713 -0.081689 -0.948885 0.304869\n-0.017527 -0.982006 0.260056 0.056430 -0.957939 0.281369\n0.133759 -0.960145 0.304140 0.056430 -0.957939 0.281369\n-0.003142 -0.958936 0.335713 0.056430 -0.957939 0.281369\n-0.003142 -0.958936 0.335713 0.074702 -0.930138 0.359531\n0.133759 -0.960145 0.304140 0.074702 -0.930138 0.359531\n0.037874 -0.916696 0.436468 0.074702 -0.930138 0.359531\n0.133759 -0.960145 0.304140 0.143445 -0.904772 0.401013\n0.247455 -0.883392 0.436641 0.143445 -0.904772 0.401013\n0.037874 -0.916696 0.436468 0.143445 -0.904772 0.401013\n-0.417488 -0.911065 -0.167140 -0.248286 -0.964538 -0.089552\n-0.271480 -0.938170 -0.280014 -0.248286 -0.964538 -0.089552\n-0.434957 -0.913248 -0.095196 -0.248286 -0.964538 -0.089552\n-0.271480 -0.938170 -0.280014 -0.243918 -0.966020 -0.085489\n-0.094421 -0.988720 -0.213982 -0.243918 -0.966020 -0.085489\n-0.434957 -0.913248 -0.095196 -0.243918 -0.966020 -0.085489\n-0.434957 -0.913248 -0.095196 -0.276621 -0.940951 -0.195170\n-0.094421 -0.988720 -0.213982 -0.276621 -0.940951 -0.195170\n-0.138689 -1.003196 -0.081447 -0.276621 -0.940951 -0.195170\n-0.003806 -0.994657 0.207157 0.067206 -0.966290 0.248531\n0.133759 -0.960145 0.304140 0.067206 -0.966290 0.248531\n-0.017527 -0.982006 0.260056 0.067206 -0.966290 0.248531\n0.133759 -0.960145 0.304140 0.162015 -0.907805 0.386835\n0.263626 -0.904442 0.380469 0.162015 -0.907805 0.386835\n0.247455 -0.883392 0.436641 0.162015 -0.907805 0.386835\n0.263626 -0.904442 0.380469 0.319618 -0.853379 0.411812\n0.399943 -0.845187 0.397461 0.319618 -0.853379 0.411812\n0.247455 -0.883392 0.436641 0.319618 -0.853379 0.411812\n0.247455 -0.883392 0.436641 0.312723 -0.878972 0.360017\n0.399943 -0.845187 0.397461 0.312723 -0.878972 0.360017\n0.291722 -0.859466 0.456605 0.312723 -0.878972 0.360017\n0.399943 -0.845187 0.397461 0.341627 -0.839554 0.422422\n0.404424 -0.835781 0.412532 0.341627 -0.839554 0.422422\n0.291722 -0.859466 0.456605 0.341627 -0.839554 0.422422\n-0.094421 -0.988720 -0.213982 -0.040935 -0.991687 -0.121990\n0.034243 -1.014196 -0.050060 -0.040935 -0.991687 -0.121990\n-0.138689 -1.003196 -0.081447 -0.040935 -0.991687 -0.121990\n0.034243 -1.014196 -0.050060 -0.089040 -0.985378 0.145264\n0.127404 -1.006069 0.062171 -0.089040 -0.985378 0.145264\n-0.138689 -1.003196 -0.081447 -0.089040 -0.985378 0.145264\n-0.138689 -1.003196 -0.081447 -0.035732 -0.998291 0.046238\n0.127404 -1.006069 0.062171 -0.035732 -0.998291 0.046238\n-0.003806 -0.994657 0.207157 -0.035732 -0.998291 0.046238\n0.127404 -1.006069 0.062171 0.056657 -0.989999 0.129195\n0.095409 -0.987302 0.220006 0.056657 -0.989999 0.129195\n-0.003806 -0.994657 0.207157 0.056657 -0.989999 0.129195\n0.095409 -0.987302 0.220006 0.029914 -0.949452 0.312485\n0.132829 -0.973959 0.256965 0.029914 -0.949452 0.312485\n-0.003806 -0.994657 0.207157 0.029914 -0.949452 0.312485\n-0.003806 -0.994657 0.207157 0.043215 -0.959033 0.279979\n0.132829 -0.973959 0.256965 0.043215 -0.959033 0.279979\n0.133759 -0.960145 0.304140 0.043215 -0.959033 0.279979\n0.132829 -0.973959 0.256965 0.198364 -0.941676 0.271841\n0.245395 -0.929620 0.328420 0.198364 -0.941676 0.271841\n0.133759 -0.960145 0.304140 0.198364 -0.941676 0.271841\n0.133759 -0.960145 0.304140 0.165580 -0.909274 0.381843\n0.245395 -0.929620 0.328420 0.165580 -0.909274 0.381843\n0.263626 -0.904442 0.380469 0.165580 -0.909274 0.381843\n0.245395 -0.929620 0.328420 0.304996 -0.894814 0.326015\n0.342619 -0.877250 0.381203 0.304996 -0.894814 0.326015\n0.263626 -0.904442 0.380469 0.304996 -0.894814 0.326015\n0.263626 -0.904442 0.380469 0.256300 -0.760652 0.596421\n0.342619 -0.877250 0.381203 0.256300 -0.760652 0.596421\n0.399943 -0.845187 0.397461 0.256300 -0.760652 0.596421\n-0.082709 -0.882380 -0.496826 -0.204468 -0.890209 -0.407089\n-0.057973 -0.928647 -0.408074 -0.204468 -0.890209 -0.407089\n-0.271480 -0.938170 -0.280014 -0.204468 -0.890209 -0.407089\n-0.057973 -0.928647 -0.408074 -0.112238 -0.959477 -0.258471\n0.021918 -0.953831 -0.349281 -0.112238 -0.959477 -0.258471\n-0.271480 -0.938170 -0.280014 -0.112238 -0.959477 -0.258471\n-0.271480 -0.938170 -0.280014 -0.132775 -0.926157 -0.352993\n0.021918 -0.953831 -0.349281 -0.132775 -0.926157 -0.352993\n-0.094421 -0.988720 -0.213982 -0.132775 -0.926157 -0.352993\n0.021918 -0.953831 -0.349281 0.060917 -0.977942 -0.199798\n0.034243 -1.014196 -0.050060 0.060917 -0.977942 -0.199798\n-0.094421 -0.988720 -0.213982 0.060917 -0.977942 -0.199798\n0.021918 -0.953831 -0.349281 0.113923 -0.972950 -0.200975\n0.208624 -0.992864 -0.054481 0.113923 -0.972950 -0.200975\n0.034243 -1.014196 -0.050060 0.113923 -0.972950 -0.200975\n0.208624 -0.992864 -0.054481 0.120666 -0.992289 -0.028308\n0.127404 -1.006069 0.062171 0.120666 -0.992289 -0.028308\n0.034243 -1.014196 -0.050060 0.120666 -0.992289 -0.028308\n0.127404 -1.006069 0.062171 -0.146799 0.978320 -0.146080\n0.064240 -1.006588 0.122170 -0.146799 0.978320 -0.146080\n0.095409 -0.987302 0.220006 -0.146799 0.978320 -0.146080\n0.342619 -0.877250 0.381203 -0.374289 0.853279 -0.363073\n0.369679 -0.854630 0.406468 -0.374289 0.853279 -0.363073\n0.399943 -0.845187 0.397461 -0.374289 0.853279 -0.363073\n0.399943 -0.845187 0.397461 -0.380101 0.831192 -0.405761\n0.369679 -0.854630 0.406468 -0.380101 0.831192 -0.405761\n0.404424 -0.835781 0.412532 -0.380101 0.831192 -0.405761\n0.064240 -1.006588 0.122170 -0.072339 0.982671 -0.170659\n0.020872 -1.000997 0.172744 -0.072339 0.982671 -0.170659\n0.095409 -0.987302 0.220006 -0.072339 0.982671 -0.170659\n0.095409 -0.987302 0.220006 0.112666 0.892693 -0.436356\n0.020872 -1.000997 0.172744 0.112666 0.892693 -0.436356\n0.132829 -0.973959 0.256965 0.112666 0.892693 -0.436356\n0.132829 -0.973959 0.256965 -0.472807 0.854662 0.214490\n0.206803 -0.945849 0.308017 -0.472807 0.854662 0.214490\n0.245395 -0.929620 0.328420 -0.472807 0.854662 0.214490\n0.245395 -0.929620 0.328420 0.428831 0.107883 -0.896920\n0.206803 -0.945849 0.308017 0.428831 0.107883 -0.896920\n0.342619 -0.877250 0.381203 0.428831 0.107883 -0.896920\n0.206803 -0.945849 0.308017 -0.334353 0.912682 -0.234991\n0.270645 -0.906148 0.371375 -0.334353 0.912682 -0.234991\n0.342619 -0.877250 0.381203 -0.334353 0.912682 -0.234991\n0.342619 -0.877250 0.381203 -0.276034 0.843946 -0.459957\n0.270645 -0.906148 0.371375 -0.276034 0.843946 -0.459957\n0.369679 -0.854630 0.406468 -0.276034 0.843946 -0.459957\n0.270645 -0.906148 0.371375 -0.365116 0.889351 -0.275220\n0.324044 -0.874188 0.403810 -0.365116 0.889351 -0.275220\n0.369679 -0.854630 0.406468 -0.365116 0.889351 -0.275220\n0.324044 -0.874188 0.403810 -0.298677 0.772985 -0.559720\n0.403557 -0.834131 0.416700 -0.298677 0.772985 -0.559720\n0.369679 -0.854630 0.406468 -0.298677 0.772985 -0.559720\n0.324044 -0.874188 0.403810 0.403000 -0.880398 0.249982\n0.454265 -0.815149 0.401805 0.403000 -0.880398 0.249982\n0.403557 -0.834131 0.416700 0.403000 -0.880398 0.249982\n0.238663 -0.933974 0.320943 0.405448 -0.886748 0.222014\n0.454265 -0.815149 0.401805 0.405448 -0.886748 0.222014\n0.324044 -0.874188 0.403810 0.405448 -0.886748 0.222014\n0.280840 -0.932382 0.289939 0.362580 -0.815349 0.451377\n0.556750 -0.763298 0.373734 0.362580 -0.815349 0.451377\n0.238663 -0.933974 0.320943 0.362580 -0.815349 0.451377\n0.435791 -0.910648 0.114354 0.419359 -0.869038 0.262511\n0.545531 -0.838378 0.178294 0.419359 -0.869038 0.262511\n0.280840 -0.932382 0.289939 0.419359 -0.869038 0.262511\n0.528404 -0.867724 0.010785 0.551763 -0.819725 0.153655\n0.620002 -0.804700 0.018087 0.551763 -0.819725 0.153655\n0.435791 -0.910648 0.114354 0.551763 -0.819725 0.153655\n0.565997 -0.838835 -0.090969 0.567960 -0.822714 -0.023745\n0.620002 -0.804700 0.018087 0.567960 -0.822714 -0.023745\n0.528404 -0.867724 0.010785 0.567960 -0.822714 -0.023745\n0.572056 -0.820728 -0.177282 0.591385 -0.796550 -0.125583\n0.646927 -0.773190 -0.126228 0.591385 -0.796550 -0.125583\n0.565997 -0.838835 -0.090969 0.591385 -0.796550 -0.125583\n0.600873 -0.780863 -0.247942 0.613043 -0.768439 -0.183519\n0.646927 -0.773190 -0.126228 0.613043 -0.768439 -0.183519\n0.572056 -0.820728 -0.177282 0.613043 -0.768439 -0.183519\n0.715494 -0.595037 -0.407763 0.720693 -0.593220 -0.358737\n0.763178 -0.579411 -0.337807 0.720693 -0.593220 -0.358737\n0.710536 -0.639339 -0.344464 0.720693 -0.593220 -0.358737\n0.238663 -0.933974 0.320943 0.463961 -0.883715 0.061544\n0.556750 -0.763298 0.373734 0.463961 -0.883715 0.061544\n0.454265 -0.815149 0.401805 0.463961 -0.883715 0.061544\n0.712928 -0.638040 0.341921 0.637324 -0.740391 0.213632\n0.672558 -0.663706 0.373406 0.637324 -0.740391 0.213632\n0.556750 -0.763298 0.373734 0.637324 -0.740391 0.213632\n0.280840 -0.932382 0.289939 0.403638 -0.839231 0.364374\n0.546786 -0.811010 0.274881 0.403638 -0.839231 0.364374\n0.556750 -0.763298 0.373734 0.403638 -0.839231 0.364374\n0.546786 -0.811010 0.274881 0.634488 -0.719194 0.283169\n0.712928 -0.638040 0.341921 0.634488 -0.719194 0.283169\n0.556750 -0.763298 0.373734 0.634488 -0.719194 0.283169\n0.712928 -0.638040 0.341921 0.691336 -0.607410 0.391290\n0.743361 -0.573910 0.387704 0.691336 -0.607410 0.391290\n0.672558 -0.663706 0.373406 0.691336 -0.607410 0.391290\n0.546786 -0.811010 0.274881 0.540301 -0.699980 0.467015\n0.659426 -0.720137 0.280769 0.540301 -0.699980 0.467015\n0.712928 -0.638040 0.341921 0.540301 -0.699980 0.467015\n0.712928 -0.638040 0.341921 0.722204 -0.594777 0.353075\n0.762429 -0.573578 0.349258 0.722204 -0.594777 0.353075\n0.743361 -0.573910 0.387704 0.722204 -0.594777 0.353075\n0.762429 -0.573578 0.349258 0.751075 -0.548282 0.367795\n0.776209 -0.532239 0.382743 0.751075 -0.548282 0.367795\n0.743361 -0.573910 0.387704 0.751075 -0.548282 0.367795\n0.280840 -0.932382 0.289939 0.414084 -0.877156 0.243169\n0.545531 -0.838378 0.178294 0.414084 -0.877156 0.243169\n0.546786 -0.811010 0.274881 0.414084 -0.877156 0.243169\n0.659426 -0.720137 0.280769 0.682821 -0.667015 0.298071\n0.730869 -0.654825 0.263262 0.682821 -0.667015 0.298071\n0.712928 -0.638040 0.341921 0.682821 -0.667015 0.298071\n0.730869 -0.654825 0.263262 0.730049 -0.615113 0.297768\n0.773056 -0.601047 0.270921 0.730049 -0.615113 0.297768\n0.712928 -0.638040 0.341921 0.730049 -0.615113 0.297768\n0.712928 -0.638040 0.341921 0.736490 -0.600914 0.310620\n0.773056 -0.601047 0.270921 0.736490 -0.600914 0.310620\n0.762429 -0.573578 0.349258 0.736490 -0.600914 0.310620\n0.773056 -0.601047 0.270921 0.814422 -0.504175 0.287271\n0.776209 -0.532239 0.382743 0.814422 -0.504175 0.287271\n0.762429 -0.573578 0.349258 0.814422 -0.504175 0.287271\n0.545531 -0.838378 0.178294 0.648562 -0.734498 0.199700\n0.700772 -0.733092 0.061365 0.648562 -0.734498 0.199700\n0.546786 -0.811010 0.274881 0.648562 -0.734498 0.199700\n0.700772 -0.733092 0.061365 0.675809 -0.699583 0.232091\n0.768953 -0.658084 0.088928 0.675809 -0.699583 0.232091\n0.546786 -0.811010 0.274881 0.675809 -0.699583 0.232091\n0.546786 -0.811010 0.274881 0.621246 -0.776759 0.103434\n0.768953 -0.658084 0.088928 0.621246 -0.776759 0.103434\n0.659426 -0.720137 0.280769 0.621246 -0.776759 0.103434\n0.768953 -0.658084 0.088928 0.687175 -0.707889 0.163351\n0.730869 -0.654825 0.263262 0.687175 -0.707889 0.163351\n0.659426 -0.720137 0.280769 0.687175 -0.707889 0.163351\n0.773056 -0.601047 0.270921 0.735942 -0.585689 0.339643\n0.798575 -0.545573 0.311288 0.735942 -0.585689 0.339643\n0.776209 -0.532239 0.382743 0.735942 -0.585689 0.339643\n0.798575 -0.545573 0.311288 0.789984 -0.508747 0.342200\n0.808089 -0.484304 0.380412 0.789984 -0.508747 0.342200\n0.776209 -0.532239 0.382743 0.789984 -0.508747 0.342200\n0.776209 -0.532239 0.382743 0.777956 -0.498809 0.382065\n0.808089 -0.484304 0.380412 0.777956 -0.498809 0.382065\n0.790001 -0.488628 0.411598 0.777956 -0.498809 0.382065\n0.435791 -0.910648 0.114354 0.522525 -0.850206 0.064161\n0.620002 -0.804700 0.018087 0.522525 -0.850206 0.064161\n0.545531 -0.838378 0.178294 0.522525 -0.850206 0.064161\n0.620002 -0.804700 0.018087 0.619756 -0.774740 0.125222\n0.700772 -0.733092 0.061365 0.619756 -0.774740 0.125222\n0.545531 -0.838378 0.178294 0.619756 -0.774740 0.125222\n0.768953 -0.658084 0.088928 0.773487 -0.607616 0.180332\n0.822006 -0.590414 0.089381 0.773487 -0.607616 0.180332\n0.730869 -0.654825 0.263262 0.773487 -0.607616 0.180332\n0.822006 -0.590414 0.089381 0.771701 -0.610469 0.178339\n0.823643 -0.544391 0.239838 0.771701 -0.610469 0.178339\n0.730869 -0.654825 0.263262 0.771701 -0.610469 0.178339\n0.730869 -0.654825 0.263262 0.772539 -0.623295 0.121186\n0.823643 -0.544391 0.239838 0.772539 -0.623295 0.121186\n0.773056 -0.601047 0.270921 0.772539 -0.623295 0.121186\n0.773056 -0.601047 0.270921 0.786987 -0.556246 0.266912\n0.823643 -0.544391 0.239838 0.786987 -0.556246 0.266912\n0.798575 -0.545573 0.311288 0.786987 -0.556246 0.266912\n0.823643 -0.544391 0.239838 0.818088 -0.503047 0.278704\n0.837476 -0.475032 0.324423 0.818088 -0.503047 0.278704\n0.798575 -0.545573 0.311288 0.818088 -0.503047 0.278704\n0.798575 -0.545573 0.311288 0.797197 -0.502060 0.335281\n0.837476 -0.475032 0.324423 0.797197 -0.502060 0.335281\n0.808089 -0.484304 0.380412 0.797197 -0.502060 0.335281\n0.837476 -0.475032 0.324423 0.813646 -0.464038 0.350212\n0.829179 -0.448032 0.379473 0.813646 -0.464038 0.350212\n0.808089 -0.484304 0.380412 0.813646 -0.464038 0.350212\n0.620002 -0.804700 0.018087 0.662076 -0.749424 0.004355\n0.722092 -0.714671 -0.009947 0.662076 -0.749424 0.004355\n0.700772 -0.733092 0.061365 0.662076 -0.749424 0.004355\n0.722092 -0.714671 -0.009947 0.757211 -0.650560 0.058337\n0.801465 -0.623843 -0.027301 0.757211 -0.650560 0.058337\n0.700772 -0.733092 0.061365 0.757211 -0.650560 0.058337\n0.700772 -0.733092 0.061365 0.738501 -0.674205 0.007955\n0.801465 -0.623843 -0.027301 0.738501 -0.674205 0.007955\n0.768953 -0.658084 0.088928 0.738501 -0.674205 0.007955\n0.801465 -0.623843 -0.027301 0.786275 -0.616691 0.038262\n0.822006 -0.590414 0.089381 0.786275 -0.616691 0.038262\n0.768953 -0.658084 0.088928 0.786275 -0.616691 0.038262\n0.822006 -0.590414 0.089381 0.787645 -0.591527 0.172372\n0.851440 -0.528477 0.167434 0.787645 -0.591527 0.172372\n0.823643 -0.544391 0.239838 0.787645 -0.591527 0.172372\n0.851440 -0.528477 0.167434 0.847668 -0.483104 0.219246\n0.883382 -0.434039 0.252027 0.847668 -0.483104 0.219246\n0.823643 -0.544391 0.239838 0.847668 -0.483104 0.219246\n0.823643 -0.544391 0.239838 0.837376 -0.481830 0.258152\n0.883382 -0.434039 0.252027 0.837376 -0.481830 0.258152\n0.837476 -0.475032 0.324423 0.837376 -0.481830 0.258152\n0.837476 -0.475032 0.324423 0.858069 -0.398000 0.324519\n0.856630 -0.372163 0.399938 0.858069 -0.398000 0.324519\n0.829179 -0.448032 0.379473 0.858069 -0.398000 0.324519\n0.565997 -0.838835 -0.090969 0.613696 -0.787451 -0.057432\n0.646927 -0.773190 -0.126228 0.613696 -0.787451 -0.057432\n0.620002 -0.804700 0.018087 0.613696 -0.787451 -0.057432\n0.646927 -0.773190 -0.126228 0.644289 -0.763369 -0.046466\n0.709804 -0.723506 -0.070633 0.644289 -0.763369 -0.046466\n0.620002 -0.804700 0.018087 0.644289 -0.763369 -0.046466\n0.620002 -0.804700 0.018087 0.657583 -0.753014 -0.023533\n0.709804 -0.723506 -0.070633 0.657583 -0.753014 -0.023533\n0.722092 -0.714671 -0.009947 0.657583 -0.753014 -0.023533\n0.709804 -0.723506 -0.070633 0.746670 -0.662943 -0.054684\n0.801465 -0.623843 -0.027301 0.746670 -0.662943 -0.054684\n0.722092 -0.714671 -0.009947 0.746670 -0.662943 -0.054684\n0.801465 -0.623843 -0.027301 0.797261 -0.602768 0.032339\n0.844736 -0.564318 0.015415 0.797261 -0.602768 0.032339\n0.822006 -0.590414 0.089381 0.797261 -0.602768 0.032339\n0.844736 -0.564318 0.015415 0.847067 -0.526217 0.074653\n0.877689 -0.511631 0.012881 0.847067 -0.526217 0.074653\n0.822006 -0.590414 0.089381 0.847067 -0.526217 0.074653\n0.822006 -0.590414 0.089381 0.851865 -0.516245 0.088416\n0.877689 -0.511631 0.012881 0.851865 -0.516245 0.088416\n0.851440 -0.528477 0.167434 0.851865 -0.516245 0.088416\n0.877689 -0.511631 0.012881 0.821782 -0.564430 0.078054\n0.869454 -0.505429 0.144441 0.821782 -0.564430 0.078054\n0.851440 -0.528477 0.167434 0.821782 -0.564430 0.078054\n0.851440 -0.528477 0.167434 0.859034 -0.470742 0.201153\n0.869454 -0.505429 0.144441 0.859034 -0.470742 0.201153\n0.883382 -0.434039 0.252027 0.859034 -0.470742 0.201153\n0.883382 -0.434039 0.252027 0.859702 -0.398581 0.319446\n0.909356 -0.339045 0.300651 0.859702 -0.398581 0.319446\n0.837476 -0.475032 0.324423 0.859702 -0.398581 0.319446\n0.837476 -0.475032 0.324423 0.858750 -0.397371 0.323489\n0.909356 -0.339045 0.300651 0.858750 -0.397371 0.323489\n0.856630 -0.372163 0.399938 0.858750 -0.397371 0.323489\n0.909356 -0.339045 0.300651 0.885733 -0.262609 0.382770\n0.946285 -0.191131 0.316677 0.885733 -0.262609 0.382770\n0.856630 -0.372163 0.399938 0.885733 -0.262609 0.382770\n0.709804 -0.723506 -0.070633 0.747865 -0.660973 -0.061744\n0.803458 -0.616561 -0.081111 0.747865 -0.660973 -0.061744\n0.801465 -0.623843 -0.027301 0.747865 -0.660973 -0.061744\n0.803458 -0.616561 -0.081111 0.812428 -0.581038 -0.048536\n0.851422 -0.553050 -0.038571 0.812428 -0.581038 -0.048536\n0.801465 -0.623843 -0.027301 0.812428 -0.581038 -0.048536\n0.801465 -0.623843 -0.027301 0.815401 -0.578558 -0.019774\n0.851422 -0.553050 -0.038571 0.815401 -0.578558 -0.019774\n0.844736 -0.564318 0.015415 0.815401 -0.578558 -0.019774\n0.851422 -0.553050 -0.038571 0.847684 -0.530470 -0.005738\n0.877689 -0.511631 0.012881 0.847684 -0.530470 -0.005738\n0.844736 -0.564318 0.015415 0.847684 -0.530470 -0.005738\n0.877689 -0.511631 0.012881 0.876641 -0.474900 0.077268\n0.900097 -0.449144 0.142707 0.876641 -0.474900 0.077268\n0.869454 -0.505429 0.144441 0.876641 -0.474900 0.077268\n0.900097 -0.449144 0.142707 -0.835176 0.463810 0.295570\n0.924376 -0.399831 0.133926 -0.835176 0.463810 0.295570\n0.869454 -0.505429 0.144441 -0.835176 0.463810 0.295570\n0.869454 -0.505429 0.144441 0.880150 -0.440040 0.178047\n0.924376 -0.399831 0.133926 0.880150 -0.440040 0.178047\n0.883382 -0.434039 0.252027 0.880150 -0.440040 0.178047\n0.924376 -0.399831 0.133926 0.905143 -0.371549 0.206561\n0.947068 -0.303108 0.208470 0.905143 -0.371549 0.206561\n0.883382 -0.434039 0.252027 0.905143 -0.371549 0.206561\n0.883382 -0.434039 0.252027 0.903283 -0.363582 0.227791\n0.947068 -0.303108 0.208470 0.903283 -0.363582 0.227791\n0.909356 -0.339045 0.300651 0.903283 -0.363582 0.227791\n0.947068 -0.303108 0.208470 0.921607 -0.281376 0.267336\n0.957691 -0.225854 0.253159 0.921607 -0.281376 0.267336\n0.909356 -0.339045 0.300651 0.921607 -0.281376 0.267336\n0.957691 -0.225854 0.253159 0.914896 -0.261720 0.307355\n0.946285 -0.191131 0.316677 0.914896 -0.261720 0.307355\n0.909356 -0.339045 0.300651 0.914896 -0.261720 0.307355\n0.600873 -0.780863 -0.247942 0.677167 -0.704687 -0.211802\n0.761718 -0.631247 -0.231485 0.677167 -0.704687 -0.211802\n0.646927 -0.773190 -0.126228 0.677167 -0.704687 -0.211802\n0.761718 -0.631247 -0.231485 0.651536 -0.714968 -0.253618\n0.739812 -0.679909 -0.150578 0.651536 -0.714968 -0.253618\n0.646927 -0.773190 -0.126228 0.651536 -0.714968 -0.253618\n0.646927 -0.773190 -0.126228 0.684553 -0.716574 -0.133823\n0.739812 -0.679909 -0.150578 0.684553 -0.716574 -0.133823\n0.709804 -0.723506 -0.070633 0.684553 -0.716574 -0.133823\n0.739812 -0.679909 -0.150578 0.749975 -0.656995 -0.076776\n0.802149 -0.612977 -0.114399 0.749975 -0.656995 -0.076776\n0.709804 -0.723506 -0.070633 0.749975 -0.656995 -0.076776\n0.709804 -0.723506 -0.070633 0.743608 -0.661034 -0.100411\n0.802149 -0.612977 -0.114399 0.743608 -0.661034 -0.100411\n0.803458 -0.616561 -0.081111 0.743608 -0.661034 -0.100411\n0.803458 -0.616561 -0.081111 0.823432 -0.559800 -0.092651\n0.802149 -0.612977 -0.114399 0.823432 -0.559800 -0.092651\n0.851422 -0.553050 -0.038571 0.823432 -0.559800 -0.092651\n0.802149 -0.612977 -0.114399 0.862834 -0.468136 -0.190698\n0.901624 -0.467897 -0.020467 0.862834 -0.468136 -0.190698\n0.851422 -0.553050 -0.038571 0.862834 -0.468136 -0.190698\n0.851422 -0.553050 -0.038571 0.864301 -0.501577 -0.037481\n0.901624 -0.467897 -0.020467 0.864301 -0.501577 -0.037481\n0.877689 -0.511631 0.012881 0.864301 -0.501577 -0.037481\n0.901624 -0.467897 -0.020467 0.885582 -0.463667 0.027510\n0.918932 -0.433380 0.004117 0.885582 -0.463667 0.027510\n0.877689 -0.511631 0.012881 0.885582 -0.463667 0.027510\n0.877689 -0.511631 0.012881 0.885721 -0.459190 0.068139\n0.918932 -0.433380 0.004117 0.885721 -0.459190 0.068139\n0.900097 -0.449144 0.142707 0.885721 -0.459190 0.068139\n0.918932 -0.433380 0.004117 0.899862 -0.429958 0.073386\n0.924376 -0.399831 0.133926 0.899862 -0.429958 0.073386\n0.900097 -0.449144 0.142707 0.899862 -0.429958 0.073386\n0.600873 -0.780863 -0.247942 0.672450 -0.694880 -0.254859\n0.710536 -0.639339 -0.344464 0.672450 -0.694880 -0.254859\n0.761718 -0.631247 -0.231485 0.672450 -0.694880 -0.254859\n0.761718 -0.631247 -0.231485 0.751471 -0.635147 -0.178551\n0.796394 -0.609521 -0.162823 0.751471 -0.635147 -0.178551\n0.739812 -0.679909 -0.150578 0.751471 -0.635147 -0.178551\n0.739812 -0.679909 -0.150578 0.760525 -0.634970 -0.135700\n0.796394 -0.609521 -0.162823 0.760525 -0.634970 -0.135700\n0.802149 -0.612977 -0.114399 0.760525 -0.634970 -0.135700\n0.802149 -0.612977 -0.114399 0.757944 -0.629770 0.170028\n0.863858 -0.529016 -0.078499 0.757944 -0.629770 0.170028\n0.901624 -0.467897 -0.020467 0.757944 -0.629770 0.170028\n0.918932 -0.433380 0.004117 0.943075 -0.329441 0.045596\n0.989111 -0.225208 0.056673 0.943075 -0.329441 0.045596\n0.924376 -0.399831 0.133926 0.943075 -0.329441 0.045596\n0.989111 -0.225208 0.056673 0.942964 -0.329915 0.044432\n0.978828 -0.246695 0.115362 0.942964 -0.329915 0.044432\n0.924376 -0.399831 0.133926 0.942964 -0.329915 0.044432\n0.924376 -0.399831 0.133926 0.939304 -0.318555 0.127401\n0.978828 -0.246695 0.115362 0.939304 -0.318555 0.127401\n0.947068 -0.303108 0.208470 0.939304 -0.318555 0.127401\n0.978828 -0.246695 0.115362 0.951939 -0.254385 0.170591\n0.978170 -0.200875 0.187362 0.951939 -0.254385 0.170591\n0.947068 -0.303108 0.208470 0.951939 -0.254385 0.170591\n0.947068 -0.303108 0.208470 0.947917 -0.246814 0.201334\n0.978170 -0.200875 0.187362 0.947917 -0.246814 0.201334\n0.957691 -0.225854 0.253159 0.947917 -0.246814 0.201334\n0.978170 -0.200875 0.187362 0.955023 -0.195364 0.223078\n0.970618 -0.166013 0.250222 0.955023 -0.195364 0.223078\n0.957691 -0.225854 0.253159 0.955023 -0.195364 0.223078\n0.957691 -0.225854 0.253159 0.942912 -0.190281 0.273333\n0.970618 -0.166013 0.250222 0.942912 -0.190281 0.273333\n0.946285 -0.191131 0.316677 0.942912 -0.190281 0.273333\n0.970618 -0.166013 0.250222 0.944904 -0.160393 0.285359\n0.962928 -0.123065 0.299827 0.944904 -0.160393 0.285359\n0.946285 -0.191131 0.316677 0.944904 -0.160393 0.285359\n0.946285 -0.191131 0.316677 0.926084 -0.139661 0.350518\n0.962928 -0.123065 0.299827 0.926084 -0.139661 0.350518\n0.915913 -0.148431 0.413937 0.926084 -0.139661 0.350518\n0.710536 -0.639339 -0.344464 0.734934 -0.613477 -0.288996\n0.763178 -0.579411 -0.337807 0.734934 -0.613477 -0.288996\n0.761718 -0.631247 -0.231485 0.734934 -0.613477 -0.288996\n0.763178 -0.579411 -0.337807 0.766964 -0.580879 -0.272664\n0.817002 -0.538968 -0.272567 0.766964 -0.580879 -0.272664\n0.761718 -0.631247 -0.231485 0.766964 -0.580879 -0.272664\n0.761718 -0.631247 -0.231485 0.791052 -0.571305 -0.218742\n0.817002 -0.538968 -0.272567 0.791052 -0.571305 -0.218742\n0.796394 -0.609521 -0.162823 0.791052 -0.571305 -0.218742\n0.817002 -0.538968 -0.272567 0.799095 -0.562699 -0.211699\n0.829601 -0.566681 -0.151349 0.799095 -0.562699 -0.211699\n0.796394 -0.609521 -0.162823 0.799095 -0.562699 -0.211699\n0.796394 -0.609521 -0.162823 0.800342 -0.583734 -0.136775\n0.829601 -0.566681 -0.151349 0.800342 -0.583734 -0.136775\n0.802149 -0.612977 -0.114399 0.800342 -0.583734 -0.136775\n0.829601 -0.566681 -0.151349 0.821096 -0.562807 -0.095135\n0.863858 -0.529016 -0.078499 0.821096 -0.562807 -0.095135\n0.802149 -0.612977 -0.114399 0.821096 -0.562807 -0.095135\n0.863858 -0.529016 -0.078499 0.874960 -0.479960 -0.063901\n0.911889 -0.442967 -0.067150 0.874960 -0.479960 -0.063901\n0.901624 -0.467897 -0.020467 0.874960 -0.479960 -0.063901\n0.911889 -0.442967 -0.067150 0.914168 -0.405048 -0.015275\n0.950956 -0.356021 -0.034700 0.914168 -0.405048 -0.015275\n0.901624 -0.467897 -0.020467 0.914168 -0.405048 -0.015275\n0.901624 -0.467897 -0.020467 0.909917 -0.409573 -0.065578\n0.950956 -0.356021 -0.034700 0.909917 -0.409573 -0.065578\n0.918932 -0.433380 0.004117 0.909917 -0.409573 -0.065578\n0.950956 -0.356021 -0.034700 0.932699 -0.355446 0.061088\n0.974229 -0.288330 0.003820 0.932699 -0.355446 0.061088\n0.918932 -0.433380 0.004117 0.932699 -0.355446 0.061088\n0.918932 -0.433380 0.004117 0.922493 -0.351353 0.159870\n0.974229 -0.288330 0.003820 0.922493 -0.351353 0.159870\n0.989111 -0.225208 0.056673 0.922493 -0.351353 0.159870\n0.989111 -0.225208 0.056673 0.973180 -0.210155 0.093572\n0.996090 -0.174217 0.098613 0.973180 -0.210155 0.093572\n0.978828 -0.246695 0.115362 0.973180 -0.210155 0.093572\n0.978828 -0.246695 0.115362 0.970381 -0.199693 0.135955\n0.996090 -0.174217 0.098613 0.970381 -0.199693 0.135955\n0.978170 -0.200875 0.187362 0.970381 -0.199693 0.135955\n0.996090 -0.174217 0.098613 0.980984 -0.093842 0.169892\n0.970618 -0.166013 0.250222 0.980984 -0.093842 0.169892\n0.978170 -0.200875 0.187362 0.980984 -0.093842 0.169892\n0.715494 -0.595037 -0.407763 0.730458 -0.574291 -0.369622\n0.758851 -0.548309 -0.394682 0.730458 -0.574291 -0.369622\n0.763178 -0.579411 -0.337807 0.730458 -0.574291 -0.369622\n0.758851 -0.548309 -0.394682 0.791946 -0.508346 -0.338239\n0.817002 -0.538968 -0.272567 0.791946 -0.508346 -0.338239\n0.763178 -0.579411 -0.337807 0.791946 -0.508346 -0.338239\n0.817002 -0.538968 -0.272567 0.797379 -0.564999 -0.212046\n0.848502 -0.519419 -0.206203 0.797379 -0.564999 -0.212046\n0.829601 -0.566681 -0.151349 0.797379 -0.564999 -0.212046\n0.848502 -0.519419 -0.206203 0.841890 -0.516845 -0.155219\n0.877849 -0.496059 -0.124815 0.841890 -0.516845 -0.155219\n0.829601 -0.566681 -0.151349 0.841890 -0.516845 -0.155219\n0.829601 -0.566681 -0.151349 0.840292 -0.528217 -0.122046\n0.877849 -0.496059 -0.124815 0.840292 -0.528217 -0.122046\n0.863858 -0.529016 -0.078499 0.840292 -0.528217 -0.122046\n0.877849 -0.496059 -0.124815 0.874887 -0.478313 -0.076086\n0.911889 -0.442967 -0.067150 0.874887 -0.478313 -0.076086\n0.863858 -0.529016 -0.078499 0.874887 -0.478313 -0.076086\n0.911889 -0.442967 -0.067150 0.920235 -0.382415 -0.083221\n0.955077 -0.332106 -0.099022 0.920235 -0.382415 -0.083221\n0.950956 -0.356021 -0.034700 0.920235 -0.382415 -0.083221\n0.955077 -0.332106 -0.099022 0.949326 -0.309572 -0.054275\n0.977567 -0.275131 -0.030619 0.949326 -0.309572 -0.054275\n0.950956 -0.356021 -0.034700 0.949326 -0.309572 -0.054275\n0.950956 -0.356021 -0.034700 0.949972 -0.311151 -0.027188\n0.977567 -0.275131 -0.030619 0.949972 -0.311151 -0.027188\n0.974229 -0.288330 0.003820 0.949972 -0.311151 -0.027188\n0.977567 -0.275131 -0.030619 0.969320 -0.245801 -0.000267\n0.992960 -0.214479 0.017329 0.969320 -0.245801 -0.000267\n0.974229 -0.288330 0.003820 0.969320 -0.245801 -0.000267\n0.974229 -0.288330 0.003820 0.967808 -0.250300 0.026424\n0.992960 -0.214479 0.017329 0.967808 -0.250300 0.026424\n0.989111 -0.225208 0.056673 0.967808 -0.250300 0.026424\n0.992960 -0.214479 0.017329 0.983444 -0.174572 0.048603\n0.996090 -0.174217 0.098613 0.983444 -0.174572 0.048603\n0.989111 -0.225208 0.056673 0.983444 -0.174572 0.048603\n0.996090 -0.174217 0.098613 0.968327 -0.180557 0.172458\n0.998981 -0.111973 0.147549 0.968327 -0.180557 0.172458\n0.970618 -0.166013 0.250222 0.968327 -0.180557 0.172458\n0.998981 -0.111973 0.147549 0.971282 -0.124264 0.202903\n0.986891 -0.070015 0.231119 0.971282 -0.124264 0.202903\n0.970618 -0.166013 0.250222 0.971282 -0.124264 0.202903\n0.970618 -0.166013 0.250222 0.962132 -0.113800 0.247691\n0.986891 -0.070015 0.231119 0.962132 -0.113800 0.247691\n0.962928 -0.123065 0.299827 0.962132 -0.113800 0.247691\n0.986891 -0.070015 0.231119 0.960069 -0.091056 0.264532\n0.976422 -0.047903 0.276726 0.960069 -0.091056 0.264532\n0.962928 -0.123065 0.299827 0.960069 -0.091056 0.264532\n0.962928 -0.123065 0.299827 0.949245 -0.076659 0.305052\n0.976422 -0.047903 0.276726 0.949245 -0.076659 0.305052\n0.949409 -0.076048 0.353710 0.949245 -0.076659 0.305052\n0.976422 -0.047903 0.276726 0.946194 -0.025827 0.322566\n0.943177 -0.004562 0.377714 0.946194 -0.025827 0.322566\n0.949409 -0.076048 0.353710 0.946194 -0.025827 0.322566\n0.597976 0.801550 0.179483 0.536839 0.827464 0.164642\n0.491036 0.867935 0.194536 0.536839 0.827464 0.164642\n0.576533 0.808115 0.216405 0.536839 0.827464 0.164642\n0.784096 0.593639 -0.255064 0.729487 0.670325 -0.136061\n0.674835 0.709062 -0.272213 0.729487 0.670325 -0.136061\n0.650222 0.778035 -0.064367 0.729487 0.670325 -0.136061\n0.809886 0.467532 -0.397203 0.762157 0.518949 -0.387051\n0.753726 0.505988 -0.456227 0.762157 0.518949 -0.387051\n0.778365 0.561762 -0.332932 0.762157 0.518949 -0.387051\n0.576533 0.808115 0.216405 0.477615 0.852384 0.212896\n0.387741 0.912058 0.223781 0.477615 0.852384 0.212896\n0.414983 0.878381 0.297503 0.477615 0.852384 0.212896\n0.576533 0.808115 0.216405 0.453587 0.795310 0.402170\n0.491036 0.867935 0.194536 0.453587 0.795310 0.402170\n0.387741 0.912058 0.223781 0.453587 0.795310 0.402170\n0.491036 0.867935 0.194536 0.404482 0.913124 0.050976\n0.266042 0.970728 0.138494 0.404482 0.913124 0.050976\n0.387741 0.912058 0.223781 0.404482 0.913124 0.050976\n0.597976 0.801550 0.179483 0.531861 0.845324 0.050509\n0.418177 0.918298 0.118864 0.531861 0.845324 0.050509\n0.491036 0.867935 0.194536 0.531861 0.845324 0.050509\n0.418177 0.918298 0.118864 0.396051 0.893157 0.213105\n0.357026 0.941612 0.134797 0.396051 0.893157 0.213105\n0.491036 0.867935 0.194536 0.396051 0.893157 0.213105\n0.491036 0.867935 0.194536 0.293222 0.864442 0.408363\n0.357026 0.941612 0.134797 0.293222 0.864442 0.408363\n0.266042 0.970728 0.138494 0.293222 0.864442 0.408363\n0.418177 0.918298 0.118864 0.365125 0.930082 0.040379\n0.288914 0.974058 0.003346 0.365125 0.930082 0.040379\n0.357026 0.941612 0.134797 0.365125 0.930082 0.040379\n0.357026 0.941612 0.134797 0.306691 0.948827 0.075284\n0.288914 0.974058 0.003346 0.306691 0.948827 0.075284\n0.266042 0.970728 0.138494 0.306691 0.948827 0.075284\n0.288914 0.974058 0.003346 0.242725 0.967920 0.064929\n0.175558 0.999758 0.043991 0.242725 0.967920 0.064929\n0.266042 0.970728 0.138494 0.242725 0.967920 0.064929\n0.650222 0.778035 -0.064367 0.498929 0.860586 -0.102280\n0.382547 0.941233 0.003043 0.498929 0.860586 -0.102280\n0.568890 0.839778 0.058388 0.498929 0.860586 -0.102280\n0.568890 0.839778 0.058388 0.471165 0.881547 0.029624\n0.382547 0.941233 0.003043 0.471165 0.881547 0.029624\n0.418177 0.918298 0.118864 0.471165 0.881547 0.029624\n0.382547 0.941233 0.003043 0.329884 0.940214 0.084703\n0.288914 0.974058 0.003346 0.329884 0.940214 0.084703\n0.418177 0.918298 0.118864 0.329884 0.940214 0.084703\n0.288914 0.974058 0.003346 0.194250 0.977956 -0.076611\n0.084757 1.012036 -0.029498 0.194250 0.977956 -0.076611\n0.175558 0.999758 0.043991 0.194250 0.977956 -0.076611\n0.650222 0.778035 -0.064367 0.532805 0.842903 0.075048\n0.564309 0.836917 -0.115747 0.532805 0.842903 0.075048\n0.382547 0.941233 0.003043 0.532805 0.842903 0.075048\n0.382547 0.941233 0.003043 0.328843 0.938958 -0.101092\n0.226272 0.980614 -0.139531 0.328843 0.938958 -0.101092\n0.288914 0.974058 0.003346 0.328843 0.938958 -0.101092\n0.674835 0.709062 -0.272213 0.626420 0.758964 -0.177681\n0.564309 0.836917 -0.115747 0.626420 0.758964 -0.177681\n0.650222 0.778035 -0.064367 0.626420 0.758964 -0.177681\n0.564309 0.836917 -0.115747 0.440313 0.891215 -0.108902\n0.328109 0.948315 -0.159106 0.440313 0.891215 -0.108902\n0.382547 0.941233 0.003043 0.440313 0.891215 -0.108902\n0.382547 0.941233 0.003043 0.291987 0.954762 -0.056329\n0.328109 0.948315 -0.159106 0.291987 0.954762 -0.056329\n0.226272 0.980614 -0.139531 0.291987 0.954762 -0.056329\n0.288914 0.974058 0.003346 0.188612 0.981329 -0.037666\n0.226272 0.980614 -0.139531 0.188612 0.981329 -0.037666\n0.084757 1.012036 -0.029498 0.188612 0.981329 -0.037666\n0.226272 0.980614 -0.139531 0.062520 0.978025 -0.198892\n-0.111081 0.991263 -0.193207 0.062520 0.978025 -0.198892\n0.084757 1.012036 -0.029498 0.062520 0.978025 -0.198892\n-0.111081 0.991263 -0.193207 -0.012275 0.993699 -0.111407\n-0.138139 0.997343 -0.135997 -0.012275 0.993699 -0.111407\n0.084757 1.012036 -0.029498 -0.012275 0.993699 -0.111407\n0.674835 0.709062 -0.272213 0.614049 0.765598 -0.191841\n0.572644 0.784554 -0.298034 0.614049 0.765598 -0.191841\n0.564309 0.836917 -0.115747 0.614049 0.765598 -0.191841\n0.564309 0.836917 -0.115747 0.449238 0.863929 -0.227623\n0.572644 0.784554 -0.298034 0.449238 0.863929 -0.227623\n0.328109 0.948315 -0.159106 0.449238 0.863929 -0.227623\n0.784096 0.593639 -0.255064 0.713027 0.628910 -0.309943\n0.778365 0.561762 -0.332932 0.713027 0.628910 -0.309943\n0.674835 0.709062 -0.272213 0.713027 0.628910 -0.309943\n0.572644 0.784554 -0.298034 0.474855 0.861523 -0.179696\n0.380357 0.885744 -0.321027 0.474855 0.861523 -0.179696\n0.328109 0.948315 -0.159106 0.474855 0.861523 -0.179696\n0.380357 0.885744 -0.321027 0.319762 0.913924 -0.249990\n0.270384 0.920721 -0.333822 0.319762 0.913924 -0.249990\n0.328109 0.948315 -0.159106 0.319762 0.913924 -0.249990\n0.328109 0.948315 -0.159106 0.253270 0.939163 -0.232008\n0.270384 0.920721 -0.333822 0.253270 0.939163 -0.232008\n0.226272 0.980614 -0.139531 0.253270 0.939163 -0.232008\n0.226272 0.980614 -0.139531 0.069705 0.966685 -0.246294\n-0.119286 0.973627 -0.264751 0.069705 0.966685 -0.246294\n-0.111081 0.991263 -0.193207 0.069705 0.966685 -0.246294\n0.778365 0.561762 -0.332932 0.730830 0.625899 -0.272282\n0.696554 0.643399 -0.364857 0.730830 0.625899 -0.272282\n0.674835 0.709062 -0.272213 0.730830 0.625899 -0.272282\n0.696554 0.643399 -0.364857 0.630910 0.695064 -0.344728\n0.574832 0.759600 -0.353336 0.630910 0.695064 -0.344728\n0.674835 0.709062 -0.272213 0.630910 0.695064 -0.344728\n0.674835 0.709062 -0.272213 0.614562 0.727887 -0.304127\n0.574832 0.759600 -0.353336 0.614562 0.727887 -0.304127\n0.572644 0.784554 -0.298034 0.614562 0.727887 -0.304127\n0.572644 0.784554 -0.298034 0.468852 0.811916 -0.347808\n0.574832 0.759600 -0.353336 0.468852 0.811916 -0.347808\n0.380357 0.885744 -0.321027 0.468852 0.811916 -0.347808\n0.270384 0.920721 -0.333822 0.080941 0.957515 -0.276791\n-0.119286 0.973627 -0.264751 0.080941 0.957515 -0.276791\n0.226272 0.980614 -0.139531 0.080941 0.957515 -0.276791\n0.778365 0.561762 -0.332932 0.720870 0.565948 -0.400061\n0.753726 0.505988 -0.456227 0.720870 0.565948 -0.400061\n0.696554 0.643399 -0.364857 0.720870 0.565948 -0.400061\n0.753726 0.505988 -0.456227 0.699500 0.574057 -0.425628\n0.650152 0.651895 -0.429659 0.699500 0.574057 -0.425628\n0.696554 0.643399 -0.364857 0.699500 0.574057 -0.425628\n0.696554 0.643399 -0.364857 0.626771 0.692052 -0.358080\n0.650152 0.651895 -0.429659 0.626771 0.692052 -0.358080\n0.574832 0.759600 -0.353336 0.626771 0.692052 -0.358080\n0.650152 0.651895 -0.429659 0.552542 0.703327 -0.447245\n0.465859 0.768644 -0.473744 0.552542 0.703327 -0.447245\n0.574832 0.759600 -0.353336 0.552542 0.703327 -0.447245\n0.465859 0.768644 -0.473744 0.492743 0.779168 -0.387429\n0.420426 0.831571 -0.404973 0.492743 0.779168 -0.387429\n0.574832 0.759600 -0.353336 0.492743 0.779168 -0.387429\n0.574832 0.759600 -0.353336 0.483579 0.822337 -0.299856\n0.420426 0.831571 -0.404973 0.483579 0.822337 -0.299856\n0.380357 0.885744 -0.321027 0.483579 0.822337 -0.299856\n0.270384 0.920721 -0.333822 0.087841 0.965746 -0.244171\n0.115097 0.907426 -0.442269 0.087841 0.965746 -0.244171\n-0.119286 0.973627 -0.264751 0.087841 0.965746 -0.244171\n-0.119286 0.973627 -0.264751 0.214642 0.973442 -0.079621\n0.115097 0.907426 -0.442269 0.214642 0.973442 -0.079621\n-0.042897 0.948957 -0.360432 0.214642 0.973442 -0.079621\n-0.042897 0.948957 -0.360432 -0.154920 0.919684 -0.360807\n-0.145259 0.888038 -0.471763 -0.154920 0.919684 -0.360807\n-0.119286 0.973627 -0.264751 -0.154920 0.919684 -0.360807\n0.753726 0.505988 -0.456227 0.691214 0.571262 -0.442587\n0.655410 0.570364 -0.526682 0.691214 0.571262 -0.442587\n0.650152 0.651895 -0.429659 0.691214 0.571262 -0.442587\n0.465859 0.768644 -0.473744 0.383570 0.793425 -0.472600\n0.310690 0.824497 -0.505913 0.383570 0.793425 -0.472600\n0.420426 0.831571 -0.404973 0.383570 0.793425 -0.472600\n0.420426 0.831571 -0.404973 0.315770 0.858779 -0.403471\n0.310690 0.824497 -0.505913 0.315770 0.858779 -0.403471\n0.380357 0.885744 -0.321027 0.315770 0.858779 -0.403471\n0.380357 0.885744 -0.321027 0.319600 0.856964 -0.404313\n0.310690 0.824497 -0.505913 0.319600 0.856964 -0.404313\n0.270384 0.920721 -0.333822 0.319600 0.856964 -0.404313\n0.310690 0.824497 -0.505913 0.228365 0.871566 -0.433846\n0.115097 0.907426 -0.442269 0.228365 0.871566 -0.433846\n0.270384 0.920721 -0.333822 0.228365 0.871566 -0.433846\n0.115097 0.907426 -0.442269 -0.007471 0.885822 -0.463966\n0.118110 0.889074 -0.477355 -0.007471 0.885822 -0.463966\n-0.042897 0.948957 -0.360432 -0.007471 0.885822 -0.463966\n0.118110 0.889074 -0.477355 0.004921 0.892780 -0.450466\n-0.043387 0.853841 -0.548949 0.004921 0.892780 -0.450466\n-0.042897 0.948957 -0.360432 0.004921 0.892780 -0.450466\n-0.043387 0.853841 -0.548949 -0.041490 0.892070 -0.449988\n-0.145259 0.888038 -0.471763 -0.041490 0.892070 -0.449988\n-0.042897 0.948957 -0.360432 -0.041490 0.892070 -0.449988\n0.655410 0.570364 -0.526682 0.541831 0.657695 -0.523314\n0.465859 0.768644 -0.473744 0.541831 0.657695 -0.523314\n0.650152 0.651895 -0.429659 0.541831 0.657695 -0.523314\n0.310690 0.824497 -0.505913 0.175153 0.825212 -0.536980\n0.276959 0.764262 -0.609482 0.175153 0.825212 -0.536980\n0.115097 0.907426 -0.442269 0.175153 0.825212 -0.536980\n0.276959 0.764262 -0.609482 0.321088 0.850234 -0.417139\n0.118110 0.889074 -0.477355 0.321088 0.850234 -0.417139\n0.115097 0.907426 -0.442269 0.321088 0.850234 -0.417139\n-0.720637 0.617872 0.362197 -0.714083 0.567807 0.409488\n-0.770633 0.543868 0.377630 -0.714083 0.567807 0.409488\n-0.720166 0.539160 0.472164 -0.714083 0.567807 0.409488\n-0.705233 0.656155 0.323076 -0.731587 0.608511 0.307400\n-0.771428 0.573996 0.328173 -0.731587 0.608511 0.307400\n-0.720637 0.617872 0.362197 -0.731587 0.608511 0.307400\n-0.689520 0.705883 0.241997 -0.738518 0.644133 0.199207\n-0.802982 0.583959 0.215598 -0.738518 0.644133 0.199207\n-0.736709 0.637358 0.288627 -0.738518 0.644133 0.199207\n-0.369123 0.930715 -0.172593 -0.456089 0.868523 -0.194036\n-0.468813 0.849746 -0.300696 -0.456089 0.868523 -0.194036\n-0.511469 0.872145 -0.100170 -0.456089 0.868523 -0.194036\n-0.720637 0.617872 0.362197 -0.736243 0.572597 0.360665\n-0.771428 0.573996 0.328173 -0.736243 0.572597 0.360665\n-0.770633 0.543868 0.377630 -0.736243 0.572597 0.360665\n-0.771428 0.573996 0.328173 -0.784361 0.524061 0.331871\n-0.814812 0.532633 0.290957 -0.784361 0.524061 0.331871\n-0.770633 0.543868 0.377630 -0.784361 0.524061 0.331871\n-0.770633 0.543868 0.377630 -0.790762 0.511131 0.336810\n-0.814812 0.532633 0.290957 -0.790762 0.511131 0.336810\n-0.820616 0.473981 0.366336 -0.790762 0.511131 0.336810\n-0.814812 0.532633 0.290957 -0.810326 0.491082 0.319704\n-0.850404 0.461583 0.309881 -0.810326 0.491082 0.319704\n-0.820616 0.473981 0.366336 -0.810326 0.491082 0.319704\n-0.705233 0.656155 0.323076 -0.724320 0.604191 0.332135\n-0.736709 0.637358 0.288627 -0.724320 0.604191 0.332135\n-0.771428 0.573996 0.328173 -0.724320 0.604191 0.332135\n-0.736709 0.637358 0.288627 -0.772624 0.581860 0.253950\n-0.814812 0.532633 0.290957 -0.772624 0.581860 0.253950\n-0.771428 0.573996 0.328173 -0.772624 0.581860 0.253950\n-0.814812 0.532633 0.290957 -0.836122 0.486399 0.253606\n-0.844352 0.526424 0.205471 -0.836122 0.486399 0.253606\n-0.850404 0.461583 0.309881 -0.836122 0.486399 0.253606\n-0.736709 0.637358 0.288627 -0.768076 0.578908 0.273722\n-0.802982 0.583959 0.215598 -0.768076 0.578908 0.273722\n-0.814812 0.532633 0.290957 -0.768076 0.578908 0.273722\n-0.802982 0.583959 0.215598 -0.807705 0.538529 0.240000\n-0.844352 0.526424 0.205471 -0.807705 0.538529 0.240000\n-0.814812 0.532633 0.290957 -0.807705 0.538529 0.240000\n-0.844352 0.526424 0.205471 -0.850686 0.467245 0.240866\n-0.895887 0.436118 0.198641 -0.850686 0.467245 0.240866\n-0.850404 0.461583 0.309881 -0.850686 0.467245 0.240866\n-0.689520 0.705883 0.241997 -0.739157 0.648374 0.182367\n-0.685472 0.728530 0.177889 -0.739157 0.648374 0.182367\n-0.802982 0.583959 0.215598 -0.739157 0.648374 0.182367\n-0.685472 0.728530 0.177889 -0.748585 0.646665 0.146440\n-0.827606 0.574857 0.129914 -0.748585 0.646665 0.146440\n-0.802982 0.583959 0.215598 -0.748585 0.646665 0.146440\n-0.802982 0.583959 0.215598 -0.813719 0.554298 0.174971\n-0.827606 0.574857 0.129914 -0.813719 0.554298 0.174971\n-0.844352 0.526424 0.205471 -0.813719 0.554298 0.174971\n-0.827606 0.574857 0.129914 -0.836786 0.526075 0.151767\n-0.849227 0.548014 0.103753 -0.836786 0.526075 0.151767\n-0.844352 0.526424 0.205471 -0.836786 0.526075 0.151767\n-0.849227 0.548014 0.103753 -0.839204 0.522402 0.151104\n-0.880179 0.487754 0.140190 -0.839204 0.522402 0.151104\n-0.844352 0.526424 0.205471 -0.839204 0.522402 0.151104\n-0.844352 0.526424 0.205471 -0.858889 0.475811 0.189505\n-0.880179 0.487754 0.140190 -0.858889 0.475811 0.189505\n-0.895887 0.436118 0.198641 -0.858889 0.475811 0.189505\n-0.880179 0.487754 0.140190 -0.884479 0.441130 0.151991\n-0.912979 0.430880 0.114384 -0.884479 0.441130 0.151991\n-0.895887 0.436118 0.198641 -0.884479 0.441130 0.151991\n-0.685472 0.728530 0.177889 -0.745500 0.659554 0.096017\n-0.672184 0.757235 0.083883 -0.745500 0.659554 0.096017\n-0.827606 0.574857 0.129914 -0.745500 0.659554 0.096017\n-0.880179 0.487754 0.140190 -0.872625 0.487089 0.035637\n-0.871329 0.518573 -0.064342 -0.872625 0.487089 0.035637\n-0.912979 0.430880 0.114384 -0.872625 0.487089 0.035637\n-0.511469 0.872145 -0.100170 -0.645693 0.758223 -0.090435\n-0.780173 0.647945 -0.061395 -0.645693 0.758223 -0.090435\n-0.672184 0.757235 0.083883 -0.645693 0.758223 -0.090435\n-0.672184 0.757235 0.083883 -0.751420 0.656659 0.064560\n-0.780173 0.647945 -0.061395 -0.751420 0.656659 0.064560\n-0.827606 0.574857 0.129914 -0.751420 0.656659 0.064560\n-0.827606 0.574857 0.129914 -0.794537 0.606229 0.034603\n-0.780173 0.647945 -0.061395 -0.794537 0.606229 0.034603\n-0.849227 0.548014 0.103753 -0.794537 0.606229 0.034603\n-0.780173 0.647945 -0.061395 -0.786133 0.616466 0.044311\n-0.831833 0.581239 -0.049873 -0.786133 0.616466 0.044311\n-0.849227 0.548014 0.103753 -0.786133 0.616466 0.044311\n-0.849227 0.548014 0.103753 -0.890064 0.455831 -0.002197\n-0.831833 0.581239 -0.049873 -0.890064 0.455831 -0.002197\n-0.880179 0.487754 0.140190 -0.890064 0.455831 -0.002197\n-0.880179 0.487754 0.140190 -0.849620 0.525684 0.042448\n-0.831833 0.581239 -0.049873 -0.849620 0.525684 0.042448\n-0.871329 0.518573 -0.064342 -0.849620 0.525684 0.042448\n-0.871329 0.518573 -0.064342 -0.935122 0.351391 -0.045507\n-0.897479 0.431108 -0.202358 -0.935122 0.351391 -0.045507\n-0.912979 0.430880 0.114384 -0.935122 0.351391 -0.045507\n-0.511469 0.872145 -0.100170 -0.644095 0.763316 -0.049909\n-0.590084 0.798188 -0.216721 -0.644095 0.763316 -0.049909\n-0.780173 0.647945 -0.061395 -0.644095 0.763316 -0.049909\n-0.590084 0.798188 -0.216721 -0.666616 0.738456 -0.101517\n-0.733625 0.668580 -0.216948 -0.666616 0.738456 -0.101517\n-0.780173 0.647945 -0.061395 -0.666616 0.738456 -0.101517\n-0.780173 0.647945 -0.061395 -0.793649 0.587064 -0.159614\n-0.733625 0.668580 -0.216948 -0.793649 0.587064 -0.159614\n-0.831833 0.581239 -0.049873 -0.793649 0.587064 -0.159614\n-0.733625 0.668580 -0.216948 -0.750299 0.653591 -0.099354\n-0.792886 0.603239 -0.199264 -0.750299 0.653591 -0.099354\n-0.831833 0.581239 -0.049873 -0.750299 0.653591 -0.099354\n-0.792886 0.603239 -0.199264 -0.946966 0.242164 -0.211215\n-0.781790 0.595419 -0.257974 -0.946966 0.242164 -0.211215\n-0.831833 0.581239 -0.049873 -0.946966 0.242164 -0.211215\n-0.831833 0.581239 -0.049873 -0.818227 0.552437 -0.159114\n-0.781790 0.595419 -0.257974 -0.818227 0.552437 -0.159114\n-0.871329 0.518573 -0.064342 -0.818227 0.552437 -0.159114\n-0.781790 0.595419 -0.257974 -0.783741 0.609263 -0.120615\n-0.846557 0.522126 -0.207357 -0.783741 0.609263 -0.120615\n-0.871329 0.518573 -0.064342 -0.783741 0.609263 -0.120615\n-0.871329 0.518573 -0.064342 -0.867525 0.477753 -0.138394\n-0.846557 0.522126 -0.207357 -0.867525 0.477753 -0.138394\n-0.897479 0.431108 -0.202358 -0.867525 0.477753 -0.138394\n-0.511469 0.872145 -0.100170 -0.497431 0.844110 -0.200103\n-0.468813 0.849746 -0.300696 -0.497431 0.844110 -0.200103\n-0.590084 0.798188 -0.216721 -0.497431 0.844110 -0.200103\n-0.468813 0.849746 -0.300696 -0.556571 0.759057 -0.337730\n-0.467045 0.794746 -0.427222 -0.556571 0.759057 -0.337730\n-0.590084 0.798188 -0.216721 -0.556571 0.759057 -0.337730\n-0.590084 0.798188 -0.216721 -0.621123 0.688549 -0.374309\n-0.467045 0.794746 -0.427222 -0.621123 0.688549 -0.374309\n-0.733625 0.668580 -0.216948 -0.621123 0.688549 -0.374309\n-0.467045 0.794746 -0.427222 -0.512280 0.847137 -0.141166\n-0.671677 0.687212 -0.329939 -0.512280 0.847137 -0.141166\n-0.733625 0.668580 -0.216948 -0.512280 0.847137 -0.141166\n-0.733625 0.668580 -0.216948 -0.744407 0.591060 -0.310656\n-0.671677 0.687212 -0.329939 -0.744407 0.591060 -0.310656\n-0.792886 0.603239 -0.199264 -0.744407 0.591060 -0.310656\n-0.671677 0.687212 -0.329939 -0.706041 0.672159 -0.222954\n-0.781790 0.595419 -0.257974 -0.706041 0.672159 -0.222954\n-0.792886 0.603239 -0.199264 -0.706041 0.672159 -0.222954\n-0.846557 0.522126 -0.207357 -0.843392 0.456269 -0.283740\n-0.857227 0.402504 -0.367999 -0.843392 0.456269 -0.283740\n-0.897479 0.431108 -0.202358 -0.843392 0.456269 -0.283740\n-0.369123 0.930715 -0.172593 -0.314142 0.893677 -0.320399\n-0.227241 0.878874 -0.456303 -0.314142 0.893677 -0.320399\n-0.468813 0.849746 -0.300696 -0.314142 0.893677 -0.320399\n-0.468813 0.849746 -0.300696 -0.345861 0.858727 -0.378111\n-0.346768 0.805207 -0.513483 -0.345861 0.858727 -0.378111\n-0.467045 0.794746 -0.427222 -0.345861 0.858727 -0.378111\n-0.467045 0.794746 -0.427222 -0.554571 0.770096 -0.315284\n-0.606830 0.694428 -0.426379 -0.554571 0.770096 -0.315284\n-0.671677 0.687212 -0.329939 -0.554571 0.770096 -0.315284\n-0.671677 0.687212 -0.329939 -0.726746 0.519125 -0.449834\n-0.606830 0.694428 -0.426379 -0.726746 0.519125 -0.449834\n-0.781790 0.595419 -0.257974 -0.726746 0.519125 -0.449834\n-0.606830 0.694428 -0.426379 -0.712549 0.574789 -0.402358\n-0.609654 0.629534 -0.514082 -0.712549 0.574789 -0.402358\n-0.781790 0.595419 -0.257974 -0.712549 0.574789 -0.402358\n-0.781790 0.595419 -0.257974 -0.793989 0.366810 -0.484800\n-0.609654 0.629534 -0.514082 -0.793989 0.366810 -0.484800\n-0.846557 0.522126 -0.207357 -0.793989 0.366810 -0.484800\n-0.609654 0.629534 -0.514082 -0.736997 0.564640 -0.371506\n-0.857227 0.402504 -0.367999 -0.736997 0.564640 -0.371506\n-0.846557 0.522126 -0.207357 -0.736997 0.564640 -0.371506\n-0.225196 0.921735 -0.363266 -0.436896 0.820597 -0.368433\n-0.227241 0.878874 -0.456303 -0.436896 0.820597 -0.368433\n-0.369123 0.930715 -0.172593 -0.436896 0.820597 -0.368433\n-0.227241 0.878874 -0.456303 -0.347445 0.857775 -0.378820\n-0.346768 0.805207 -0.513483 -0.347445 0.857775 -0.378820\n-0.468813 0.849746 -0.300696 -0.347445 0.857775 -0.378820\n-0.346768 0.805207 -0.513483 -0.434057 0.738723 -0.515638\n-0.534497 0.694529 -0.514017 -0.434057 0.738723 -0.515638\n-0.467045 0.794746 -0.427222 -0.434057 0.738723 -0.515638\n-0.467045 0.794746 -0.427222 -0.526979 0.730650 -0.434102\n-0.534497 0.694529 -0.514017 -0.526979 0.730650 -0.434102\n-0.606830 0.694428 -0.426379 -0.526979 0.730650 -0.434102\n-0.534497 0.694529 -0.514017 -0.575621 0.666092 -0.474323\n-0.609654 0.629534 -0.514082 -0.575621 0.666092 -0.474323\n-0.606830 0.694428 -0.426379 -0.575621 0.666092 -0.474323\n-0.609654 0.629534 -0.514082 -0.730227 0.489875 -0.476225\n-0.616865 0.510783 -0.625180 -0.730227 0.489875 -0.476225\n-0.857227 0.402504 -0.367999 -0.730227 0.489875 -0.476225\n-0.616865 0.510783 -0.625180 -0.727602 0.500258 -0.469401\n-0.740705 0.357653 -0.596416 -0.727602 0.500258 -0.469401\n-0.857227 0.402504 -0.367999 -0.727602 0.500258 -0.469401\n-0.205411 0.900128 -0.424084 -0.363243 0.834364 -0.414597\n-0.220818 0.851677 -0.508091 -0.363243 0.834364 -0.414597\n-0.225196 0.921735 -0.363266 -0.363243 0.834364 -0.414597\n-0.225196 0.921735 -0.363266 0.371038 0.840294 -0.395269\n-0.220818 0.851677 -0.508091 0.371038 0.840294 -0.395269\n-0.227241 0.878874 -0.456303 0.371038 0.840294 -0.395269\n-0.220818 0.851677 -0.508091 -0.310033 0.825346 -0.471893\n-0.318293 0.784025 -0.562375 -0.310033 0.825346 -0.471893\n-0.227241 0.878874 -0.456303 -0.310033 0.825346 -0.471893\n-0.227241 0.878874 -0.456303 -0.262430 0.820272 -0.508217\n-0.318293 0.784025 -0.562375 -0.262430 0.820272 -0.508217\n-0.346768 0.805207 -0.513483 -0.262430 0.820272 -0.508217\n-0.318293 0.784025 -0.562375 -0.363433 0.758848 -0.540431\n-0.340043 0.753113 -0.591154 -0.363433 0.758848 -0.540431\n-0.346768 0.805207 -0.513483 -0.363433 0.758848 -0.540431\n-0.346768 0.805207 -0.513483 -0.430109 0.732088 -0.528256\n-0.340043 0.753113 -0.591154 -0.430109 0.732088 -0.528256\n-0.534497 0.694529 -0.514017 -0.430109 0.732088 -0.528256\n-0.340043 0.753113 -0.591154 -0.435376 0.700370 -0.565623\n-0.503147 0.629160 -0.619089 -0.435376 0.700370 -0.565623\n-0.534497 0.694529 -0.514017 -0.435376 0.700370 -0.565623\n-0.534497 0.694529 -0.514017 -0.544200 0.629838 -0.554212\n-0.503147 0.629160 -0.619089 -0.544200 0.629838 -0.554212\n-0.609654 0.629534 -0.514082 -0.544200 0.629838 -0.554212\n-0.609654 0.629534 -0.514082 -0.571450 0.578883 -0.581670\n-0.503147 0.629160 -0.619089 -0.571450 0.578883 -0.581670\n-0.616865 0.510783 -0.625180 -0.571450 0.578883 -0.581670\n-0.616865 0.510783 -0.625180 -0.659838 0.416100 -0.625679\n-0.598844 0.412123 -0.709797 -0.659838 0.416100 -0.625679\n-0.740705 0.357653 -0.596416 -0.659838 0.416100 -0.625679\n-0.598844 0.412123 -0.709797 -0.663304 0.305427 -0.683185\n-0.762673 0.255891 -0.620581 -0.663304 0.305427 -0.683185\n-0.740705 0.357653 -0.596416 -0.663304 0.305427 -0.683185\n-0.205411 0.900128 -0.424084 0.358091 -0.835728 0.416329\n-0.258660 0.815778 -0.547607 0.358091 -0.835728 0.416329\n-0.220818 0.851677 -0.508091 0.358091 -0.835728 0.416329\n-0.258660 0.815778 -0.547607 0.229687 -0.819697 0.524730\n-0.253705 0.814056 -0.552466 0.229687 -0.819697 0.524730\n-0.220818 0.851677 -0.508091 0.229687 -0.819697 0.524730\n-0.220818 0.851677 -0.508091 -0.312158 0.826149 -0.469079\n-0.253705 0.814056 -0.552466 -0.312158 0.826149 -0.469079\n-0.318293 0.784025 -0.562375 -0.312158 0.826149 -0.469079\n-0.340043 0.753113 -0.591154 -0.396639 0.664628 -0.633204\n-0.419664 0.588694 -0.713858 -0.396639 0.664628 -0.633204\n-0.503147 0.629160 -0.619089 -0.396639 0.664628 -0.633204\n-0.503147 0.629160 -0.619089 -0.533256 0.545531 -0.646556\n-0.488845 0.518963 -0.723864 -0.533256 0.545531 -0.646556\n-0.616865 0.510783 -0.625180 -0.533256 0.545531 -0.646556\n-0.488845 0.518963 -0.723864 -0.554257 0.481228 -0.679131\n-0.598844 0.412123 -0.709797 -0.554257 0.481228 -0.679131\n-0.616865 0.510783 -0.625180 -0.554257 0.481228 -0.679131\n-0.598844 0.412123 -0.709797 -0.699449 0.392338 -0.597362\n-0.670377 0.290058 -0.706210 -0.699449 0.392338 -0.597362\n-0.762673 0.255891 -0.620581 -0.699449 0.392338 -0.597362\n-0.670377 0.290058 -0.706210 -0.700665 0.138697 -0.699880\n-0.813378 0.105143 -0.599693 -0.700665 0.138697 -0.699880\n-0.762673 0.255891 -0.620581 -0.700665 0.138697 -0.699880\n-0.762673 0.255891 -0.620581 -0.836445 0.211276 -0.505690\n-0.813378 0.105143 -0.599693 -0.836445 0.211276 -0.505690\n-0.884876 0.076611 -0.493352 -0.836445 0.211276 -0.505690\n-0.194639 0.899737 -0.429954 -0.214259 0.866459 -0.450935\n-0.208537 0.862777 -0.494368 -0.214259 0.866459 -0.450935\n-0.205411 0.900128 -0.424084 -0.214259 0.866459 -0.450935\n-0.208537 0.862777 -0.494368 -0.328993 0.839877 -0.431706\n-0.258660 0.815778 -0.547607 -0.328993 0.839877 -0.431706\n-0.205411 0.900128 -0.424084 -0.328993 0.839877 -0.431706\n-0.258660 0.815778 -0.547607 0.276256 -0.781918 0.558827\n-0.274247 0.774379 -0.597827 0.276256 -0.781918 0.558827\n-0.253705 0.814056 -0.552466 0.276256 -0.781918 0.558827\n-0.253705 0.814056 -0.552466 -0.277927 0.781886 -0.558042\n-0.274247 0.774379 -0.597827 -0.277927 0.781886 -0.558042\n-0.318293 0.784025 -0.562375 -0.277927 0.781886 -0.558042\n-0.274247 0.774379 -0.597827 -0.338165 0.713058 -0.614160\n-0.358476 0.660101 -0.684129 -0.338165 0.713058 -0.614160\n-0.318293 0.784025 -0.562375 -0.338165 0.713058 -0.614160\n-0.358476 0.660101 -0.684129 -0.784305 -0.286376 0.550322\n-0.363886 0.634527 -0.705148 -0.784305 -0.286376 0.550322\n-0.318293 0.784025 -0.562375 -0.784305 -0.286376 0.550322\n-0.318293 0.784025 -0.562375 -0.043150 0.696862 -0.715906\n-0.363886 0.634527 -0.705148 -0.043150 0.696862 -0.715906\n-0.340043 0.753113 -0.591154 -0.043150 0.696862 -0.715906\n-0.340043 0.753113 -0.591154 -0.452302 0.663665 -0.595795\n-0.363886 0.634527 -0.705148 -0.452302 0.663665 -0.595795\n-0.419664 0.588694 -0.713858 -0.452302 0.663665 -0.595795\n-0.419664 0.588694 -0.713858 -0.479406 0.571229 -0.666234\n-0.488845 0.518963 -0.723864 -0.479406 0.571229 -0.666234\n-0.503147 0.629160 -0.619089 -0.479406 0.571229 -0.666234\n-0.488845 0.518963 -0.723864 -0.540469 0.464044 -0.701824\n-0.507582 0.433217 -0.766130 -0.540469 0.464044 -0.701824\n-0.598844 0.412123 -0.709797 -0.540469 0.464044 -0.701824\n-0.507582 0.433217 -0.766130 -0.550317 0.299596 -0.779355\n-0.670377 0.290058 -0.706210 -0.550317 0.299596 -0.779355\n-0.598844 0.412123 -0.709797 -0.550317 0.299596 -0.779355\n-0.670377 0.290058 -0.706210 -0.808847 0.355866 -0.468109\n-0.726226 0.192304 -0.684022 -0.808847 0.355866 -0.468109\n-0.813378 0.105143 -0.599693 -0.808847 0.355866 -0.468109\n-0.208537 0.862777 -0.494368 -0.214717 0.823614 -0.524935\n-0.220829 0.809689 -0.572634 -0.214717 0.823614 -0.524935\n-0.258660 0.815778 -0.547607 -0.214717 0.823614 -0.524935\n-0.220829 0.809689 -0.572634 -0.267769 0.761665 -0.590057\n-0.248284 0.738252 -0.652388 -0.267769 0.761665 -0.590057\n-0.258660 0.815778 -0.547607 -0.267769 0.761665 -0.590057\n-0.258660 0.815778 -0.547607 -0.162061 0.785520 -0.597239\n-0.248284 0.738252 -0.652388 -0.162061 0.785520 -0.597239\n-0.274247 0.774379 -0.597827 -0.162061 0.785520 -0.597239\n-0.248284 0.738252 -0.652388 -0.313969 0.716011 -0.623499\n-0.319602 0.676638 -0.687232 -0.313969 0.716011 -0.623499\n-0.274247 0.774379 -0.597827 -0.313969 0.716011 -0.623499\n-0.274247 0.774379 -0.597827 -0.352471 0.715399 -0.603298\n-0.319602 0.676638 -0.687232 -0.352471 0.715399 -0.603298\n-0.358476 0.660101 -0.684129 -0.352471 0.715399 -0.603298\n-0.358476 0.660101 -0.684129 0.725259 -0.522191 0.448683\n-0.388633 0.556389 -0.756087 0.725259 -0.522191 0.448683\n-0.363886 0.634527 -0.705148 0.725259 -0.522191 0.448683\n-0.388633 0.556389 -0.756087 0.349537 -0.586836 0.730375\n-0.378545 0.552802 -0.763796 0.349537 -0.586836 0.730375\n-0.363886 0.634527 -0.705148 0.349537 -0.586836 0.730375\n-0.363886 0.634527 -0.705148 -0.367654 0.584830 -0.723052\n-0.378545 0.552802 -0.763796 -0.367654 0.584830 -0.723052\n-0.419664 0.588694 -0.713858 -0.367654 0.584830 -0.723052\n-0.419664 0.588694 -0.713858 -0.388588 0.496873 -0.775962\n-0.392704 0.404882 -0.845059 -0.388588 0.496873 -0.775962\n-0.488845 0.518963 -0.723864 -0.388588 0.496873 -0.775962\n-0.488845 0.518963 -0.723864 -0.416434 0.473553 -0.776100\n-0.392704 0.404882 -0.845059 -0.416434 0.473553 -0.776100\n-0.507582 0.433217 -0.766130 -0.416434 0.473553 -0.776100\n-0.392704 0.404882 -0.845059 -0.454293 0.389694 -0.801097\n-0.508327 0.335896 -0.813049 -0.454293 0.389694 -0.801097\n-0.507582 0.433217 -0.766130 -0.454293 0.389694 -0.801097\n-0.507582 0.433217 -0.766130 -0.582461 0.356618 -0.730453\n-0.508327 0.335896 -0.813049 -0.582461 0.356618 -0.730453\n-0.670377 0.290058 -0.706210 -0.582461 0.356618 -0.730453\n-0.670377 0.290058 -0.706210 -0.572777 0.144083 -0.806949\n-0.508327 0.335896 -0.813049 -0.572777 0.144083 -0.806949\n-0.726226 0.192304 -0.684022 -0.572777 0.144083 -0.806949\n-0.508327 0.335896 -0.813049 -0.598479 0.214620 -0.771856\n-0.714934 0.130027 -0.710095 -0.598479 0.214620 -0.771856\n-0.726226 0.192304 -0.684022 -0.598479 0.214620 -0.771856\n-0.726226 0.192304 -0.684022 -0.754433 0.132351 -0.642895\n-0.714934 0.130027 -0.710095 -0.754433 0.132351 -0.642895\n-0.813378 0.105143 -0.599693 -0.754433 0.132351 -0.642895\n-0.714934 0.130027 -0.710095 -0.754182 0.116399 -0.646267\n-0.789314 0.049358 -0.637824 -0.754182 0.116399 -0.646267\n-0.813378 0.105143 -0.599693 -0.754182 0.116399 -0.646267\n-0.880784 -0.336490 0.378505 -0.834840 -0.389221 0.389292\n-0.832112 -0.455295 0.364098 -0.834840 -0.389221 0.389292\n-0.821358 -0.383886 0.458557 -0.834840 -0.389221 0.389292\n-0.917308 -0.334784 0.280601 -0.873242 -0.368043 0.319362\n-0.875096 -0.428030 0.288563 -0.873242 -0.368043 0.319362\n-0.880784 -0.336490 0.378505 -0.873242 -0.368043 0.319362\n-0.968686 -0.266332 0.151607 -0.943083 -0.275730 0.185924\n-0.945437 -0.319192 0.191145 -0.943083 -0.275730 0.185924\n-0.947545 -0.287120 0.228017 -0.943083 -0.275730 0.185924\n-0.984493 -0.232604 0.094552 -0.960056 -0.269715 0.074473\n-0.966629 -0.289574 0.118520 -0.960056 -0.269715 0.074473\n-0.979185 -0.246454 0.112822 -0.960056 -0.269715 0.074473\n-0.998750 -0.181968 0.040711 -0.973162 -0.225567 0.045551\n-0.976438 -0.275483 0.054305 -0.973162 -0.225567 0.045551\n-0.984493 -0.232604 0.094552 -0.973162 -0.225567 0.045551\n-0.999051 -0.177430 -0.051842 -0.972392 -0.233207 -0.008275\n-0.976438 -0.275483 0.054305 -0.972392 -0.233207 -0.008275\n-0.998750 -0.181968 0.040711 -0.972392 -0.233207 -0.008275\n-0.963693 -0.161718 -0.278236 -0.951096 -0.214115 -0.222646\n-0.940028 -0.268320 -0.276808 -0.951096 -0.214115 -0.222646\n-0.977307 -0.232382 -0.152124 -0.951096 -0.214115 -0.222646\n-0.902483 -0.042549 -0.464743 -0.932302 -0.038938 -0.359580\n-0.937467 -0.148142 -0.362602 -0.932302 -0.038938 -0.359580\n-0.975066 -0.087917 -0.271640 -0.932302 -0.038938 -0.359580\n-0.821358 -0.383886 0.458557 -0.759809 -0.474080 0.444902\n-0.832112 -0.455295 0.364098 -0.759809 -0.474080 0.444902\n-0.720497 -0.575270 0.426873 -0.759809 -0.474080 0.444902\n-0.832112 -0.455295 0.364098 -0.769548 -0.527965 0.359233\n-0.819647 -0.532421 0.277447 -0.769548 -0.527965 0.359233\n-0.720497 -0.575270 0.426873 -0.769548 -0.527965 0.359233\n-0.819647 -0.532421 0.277447 -0.753644 -0.563407 0.338517\n-0.704142 -0.643942 0.348989 -0.753644 -0.563407 0.338517\n-0.720497 -0.575270 0.426873 -0.753644 -0.563407 0.338517\n-0.880784 -0.336490 0.378505 -0.853377 -0.391366 0.344356\n-0.875096 -0.428030 0.288563 -0.853377 -0.391366 0.344356\n-0.832112 -0.455295 0.364098 -0.853377 -0.391366 0.344356\n-0.875096 -0.428030 0.288563 -0.828523 -0.472137 0.301058\n-0.819647 -0.532421 0.277447 -0.828523 -0.472137 0.301058\n-0.832112 -0.455295 0.364098 -0.828523 -0.472137 0.301058\n-0.819647 -0.532421 0.277447 -0.753058 -0.576261 0.317532\n-0.731347 -0.650367 0.272809 -0.753058 -0.576261 0.317532\n-0.704142 -0.643942 0.348989 -0.753058 -0.576261 0.317532\n-0.947545 -0.287120 0.228017 -0.916550 -0.326209 0.231349\n-0.945437 -0.319192 0.191145 -0.916550 -0.326209 0.231349\n-0.917308 -0.334784 0.280601 -0.916550 -0.326209 0.231349\n-0.945437 -0.319192 0.191145 -0.906264 -0.359534 0.222307\n-0.893859 -0.420891 0.236935 -0.906264 -0.359534 0.222307\n-0.917308 -0.334784 0.280601 -0.906264 -0.359534 0.222307\n-0.917308 -0.334784 0.280601 -0.885703 -0.377931 0.269627\n-0.893859 -0.420891 0.236935 -0.885703 -0.377931 0.269627\n-0.875096 -0.428030 0.288563 -0.885703 -0.377931 0.269627\n-0.875096 -0.428030 0.288563 -0.846047 -0.475132 0.241774\n-0.893859 -0.420891 0.236935 -0.846047 -0.475132 0.241774\n-0.819647 -0.532421 0.277447 -0.846047 -0.475132 0.241774\n-0.893859 -0.420891 0.236935 -0.847804 -0.495173 0.189822\n-0.804996 -0.579470 0.220154 -0.847804 -0.495173 0.189822\n-0.819647 -0.532421 0.277447 -0.847804 -0.495173 0.189822\n-0.819647 -0.532421 0.277447 -0.762449 -0.581930 0.282895\n-0.804996 -0.579470 0.220154 -0.762449 -0.581930 0.282895\n-0.731347 -0.650367 0.272809 -0.762449 -0.581930 0.282895\n-0.968686 -0.266332 0.151607 -0.940444 -0.311060 0.137138\n-0.937547 -0.365772 0.139598 -0.940444 -0.311060 0.137138\n-0.945437 -0.319192 0.191145 -0.940444 -0.311060 0.137138\n-0.945437 -0.319192 0.191145 -0.907313 -0.371528 0.196849\n-0.937547 -0.365772 0.139598 -0.907313 -0.371528 0.196849\n-0.893859 -0.420891 0.236935 -0.907313 -0.371528 0.196849\n-0.893859 -0.420891 0.236935 -0.844644 -0.494909 0.204064\n-0.838040 -0.558540 0.134144 -0.844644 -0.494909 0.204064\n-0.804996 -0.579470 0.220154 -0.844644 -0.494909 0.204064\n-0.804996 -0.579470 0.220154 -0.749130 -0.632855 0.195700\n-0.768564 -0.653626 0.119809 -0.749130 -0.632855 0.195700\n-0.731347 -0.650367 0.272809 -0.749130 -0.632855 0.195700\n-0.731347 -0.650367 0.272809 -0.635316 -0.753178 0.170578\n-0.768564 -0.653626 0.119809 -0.635316 -0.753178 0.170578\n-0.623567 -0.802134 0.004119 -0.635316 -0.753178 0.170578\n-0.979185 -0.246454 0.112822 -0.956935 -0.262176 0.124652\n-0.966629 -0.289574 0.118520 -0.956935 -0.262176 0.124652\n-0.968686 -0.266332 0.151607 -0.956935 -0.262176 0.124652\n-0.966629 -0.289574 0.118520 -0.936070 -0.312618 0.161380\n-0.937547 -0.365772 0.139598 -0.936070 -0.312618 0.161380\n-0.968686 -0.266332 0.151607 -0.936070 -0.312618 0.161380\n-0.937547 -0.365772 0.139598 -0.897324 -0.406158 0.172756\n-0.913710 -0.429604 0.113341 -0.897324 -0.406158 0.172756\n-0.893859 -0.420891 0.236935 -0.897324 -0.406158 0.172756\n-0.913710 -0.429604 0.113341 -0.867694 -0.466306 0.172237\n-0.866261 -0.519728 0.108384 -0.867694 -0.466306 0.172237\n-0.893859 -0.420891 0.236935 -0.867694 -0.466306 0.172237\n-0.893859 -0.420891 0.236935 -0.850172 -0.489521 0.193848\n-0.866261 -0.519728 0.108384 -0.850172 -0.489521 0.193848\n-0.838040 -0.558540 0.134144 -0.850172 -0.489521 0.193848\n-0.838040 -0.558540 0.134144 -0.786098 -0.597963 0.156493\n-0.768564 -0.653626 0.119809 -0.786098 -0.597963 0.156493\n-0.804996 -0.579470 0.220154 -0.786098 -0.597963 0.156493\n-0.984493 -0.232604 0.094552 -0.960476 -0.263807 0.088831\n-0.976438 -0.275483 0.054305 -0.960476 -0.263807 0.088831\n-0.966629 -0.289574 0.118520 -0.960476 -0.263807 0.088831\n-0.976438 -0.275483 0.054305 -0.950567 -0.300214 0.079328\n-0.958677 -0.332560 0.051131 -0.950567 -0.300214 0.079328\n-0.966629 -0.289574 0.118520 -0.950567 -0.300214 0.079328\n-0.966629 -0.289574 0.118520 -0.938486 -0.330499 0.100073\n-0.958677 -0.332560 0.051131 -0.938486 -0.330499 0.100073\n-0.937547 -0.365772 0.139598 -0.938486 -0.330499 0.100073\n-0.958677 -0.332560 0.051131 -0.925664 -0.369250 0.082463\n-0.934874 -0.396588 0.031616 -0.925664 -0.369250 0.082463\n-0.937547 -0.365772 0.139598 -0.925664 -0.369250 0.082463\n-0.937547 -0.365772 0.139598 -0.921362 -0.379206 0.085411\n-0.934874 -0.396588 0.031616 -0.921362 -0.379206 0.085411\n-0.913710 -0.429604 0.113341 -0.921362 -0.379206 0.085411\n-0.934874 -0.396588 0.031616 -0.907221 -0.415253 0.067186\n-0.909102 -0.452266 0.035489 -0.907221 -0.415253 0.067186\n-0.913710 -0.429604 0.113341 -0.907221 -0.415253 0.067186\n-0.913710 -0.429604 0.113341 -0.879804 -0.467834 0.084115\n-0.909102 -0.452266 0.035489 -0.879804 -0.467834 0.084115\n-0.866261 -0.519728 0.108384 -0.879804 -0.467834 0.084115\n-0.866261 -0.519728 0.108384 -0.831681 -0.548828 0.084234\n-0.833655 -0.579175 0.042990 -0.831681 -0.548828 0.084234\n-0.838040 -0.558540 0.134144 -0.831681 -0.548828 0.084234\n-0.838040 -0.558540 0.134144 -0.796641 -0.596660 0.096747\n-0.833655 -0.579175 0.042990 -0.796641 -0.596660 0.096747\n-0.768564 -0.653626 0.119809 -0.796641 -0.596660 0.096747\n-0.833655 -0.579175 0.042990 -0.730760 -0.681391 -0.041195\n-0.623567 -0.802134 0.004119 -0.730760 -0.681391 -0.041195\n-0.768564 -0.653626 0.119809 -0.730760 -0.681391 -0.041195\n-0.621507 -0.798491 -0.091718 -0.524045 -0.850574 -0.043593\n-0.434957 -0.913248 -0.095196 -0.524045 -0.850574 -0.043593\n-0.623567 -0.802134 0.004119 -0.524045 -0.850574 -0.043593\n-0.976438 -0.275483 0.054305 -0.954672 -0.297543 0.008324\n-0.966003 -0.311718 -0.044071 -0.954672 -0.297543 0.008324\n-0.958677 -0.332560 0.051131 -0.954672 -0.297543 0.008324\n-0.966003 -0.311718 -0.044071 -0.945918 -0.324402 0.001770\n-0.951473 -0.354064 -0.040123 -0.945918 -0.324402 0.001770\n-0.958677 -0.332560 0.051131 -0.945918 -0.324402 0.001770\n-0.958677 -0.332560 0.051131 -0.936418 -0.350777 0.008735\n-0.951473 -0.354064 -0.040123 -0.936418 -0.350777 0.008735\n-0.934874 -0.396588 0.031616 -0.936418 -0.350777 0.008735\n-0.951473 -0.354064 -0.040123 -0.915512 -0.401440 -0.026133\n-0.923074 -0.415907 -0.085013 -0.915512 -0.401440 -0.026133\n-0.934874 -0.396588 0.031616 -0.915512 -0.401440 -0.026133\n-0.934874 -0.396588 0.031616 -0.906696 -0.421212 -0.021966\n-0.923074 -0.415907 -0.085013 -0.906696 -0.421212 -0.021966\n-0.909102 -0.452266 0.035489 -0.906696 -0.421212 -0.021966\n-0.923074 -0.415907 -0.085013 -0.931063 -0.364851 -0.002135\n-0.907460 -0.456087 -0.027793 -0.931063 -0.364851 -0.002135\n-0.909102 -0.452266 0.035489 -0.931063 -0.364851 -0.002135\n-0.909102 -0.452266 0.035489 -0.848914 -0.528439 0.009873\n-0.907460 -0.456087 -0.027793 -0.848914 -0.528439 0.009873\n-0.866261 -0.519728 0.108384 -0.848914 -0.528439 0.009873\n-0.907460 -0.456087 -0.027793 -0.873410 -0.485554 0.037326\n-0.877803 -0.510201 -0.037784 -0.873410 -0.485554 0.037326\n-0.866261 -0.519728 0.108384 -0.873410 -0.485554 0.037326\n-0.866261 -0.519728 0.108384 -0.859676 -0.509662 0.034670\n-0.877803 -0.510201 -0.037784 -0.859676 -0.509662 0.034670\n-0.833655 -0.579175 0.042990 -0.859676 -0.509662 0.034670\n-0.833655 -0.579175 0.042990 -0.730783 -0.681341 -0.041603\n-0.621507 -0.798491 -0.091718 -0.730783 -0.681341 -0.041603\n-0.623567 -0.802134 0.004119 -0.730783 -0.681341 -0.041603\n-0.621507 -0.798491 -0.091718 -0.519937 -0.840617 -0.151753\n-0.417488 -0.911065 -0.167140 -0.519937 -0.840617 -0.151753\n-0.434957 -0.913248 -0.095196 -0.519937 -0.840617 -0.151753\n-0.999051 -0.177430 -0.051842 -0.958471 -0.279950 -0.054419\n-0.977307 -0.232382 -0.152124 -0.958471 -0.279950 -0.054419\n-0.976438 -0.275483 0.054305 -0.958471 -0.279950 -0.054419\n-0.977307 -0.232382 -0.152124 -0.965624 -0.255238 -0.049230\n-0.960683 -0.296285 -0.146885 -0.965624 -0.255238 -0.049230\n-0.976438 -0.275483 0.054305 -0.965624 -0.255238 -0.049230\n-0.976438 -0.275483 0.054305 -0.992321 -0.103999 -0.066958\n-0.960683 -0.296285 -0.146885 -0.992321 -0.103999 -0.066958\n-0.966003 -0.311718 -0.044071 -0.992321 -0.103999 -0.066958\n-0.960683 -0.296285 -0.146885 -0.932976 -0.345720 -0.100170\n-0.939746 -0.345132 -0.173298 -0.932976 -0.345720 -0.100170\n-0.966003 -0.311718 -0.044071 -0.932976 -0.345720 -0.100170\n-0.966003 -0.311718 -0.044071 -0.937621 -0.331490 -0.104793\n-0.939746 -0.345132 -0.173298 -0.937621 -0.331490 -0.104793\n-0.951473 -0.354064 -0.040123 -0.937621 -0.331490 -0.104793\n-0.939746 -0.345132 -0.173298 -0.965191 -0.241187 -0.101164\n-0.941525 -0.368053 -0.101683 -0.965191 -0.241187 -0.101164\n-0.951473 -0.354064 -0.040123 -0.965191 -0.241187 -0.101164\n-0.951473 -0.354064 -0.040123 -0.923575 -0.378155 -0.063312\n-0.941525 -0.368053 -0.101683 -0.923575 -0.378155 -0.063312\n-0.923074 -0.415907 -0.085013 -0.923575 -0.378155 -0.063312\n-0.923074 -0.415907 -0.085013 -0.895590 -0.440151 -0.064690\n-0.892790 -0.477857 -0.082762 -0.895590 -0.440151 -0.064690\n-0.907460 -0.456087 -0.027793 -0.895590 -0.440151 -0.064690\n-0.907460 -0.456087 -0.027793 -0.879614 -0.473332 -0.047285\n-0.892790 -0.477857 -0.082762 -0.879614 -0.473332 -0.047285\n-0.877803 -0.510201 -0.037784 -0.879614 -0.473332 -0.047285\n-0.877803 -0.510201 -0.037784 -0.807672 -0.586625 -0.059473\n-0.791065 -0.617279 -0.159541 -0.807672 -0.586625 -0.059473\n-0.833655 -0.579175 0.042990 -0.807672 -0.586625 -0.059473\n-0.833655 -0.579175 0.042990 -0.725650 -0.687672 -0.023214\n-0.791065 -0.617279 -0.159541 -0.725650 -0.687672 -0.023214\n-0.621507 -0.798491 -0.091718 -0.725650 -0.687672 -0.023214\n-0.791065 -0.617279 -0.159541 -0.620707 -0.707361 -0.338176\n-0.414803 -0.869802 -0.321955 -0.620707 -0.707361 -0.338176\n-0.621507 -0.798491 -0.091718 -0.620707 -0.707361 -0.338176\n-0.621507 -0.798491 -0.091718 -0.533410 -0.814976 -0.226470\n-0.414803 -0.869802 -0.321955 -0.533410 -0.814976 -0.226470\n-0.417488 -0.911065 -0.167140 -0.533410 -0.814976 -0.226470\n-0.977307 -0.232382 -0.152124 -0.942718 -0.262154 -0.206295\n-0.940028 -0.268320 -0.276808 -0.942718 -0.262154 -0.206295\n-0.960683 -0.296285 -0.146885 -0.942718 -0.262154 -0.206295\n-0.940028 -0.268320 -0.276808 -0.940266 -0.269848 -0.207561\n-0.930137 -0.327125 -0.245166 -0.940266 -0.269848 -0.207561\n-0.960683 -0.296285 -0.146885 -0.940266 -0.269848 -0.207561\n-0.960683 -0.296285 -0.146885 -0.935129 -0.293441 -0.198561\n-0.930137 -0.327125 -0.245166 -0.935129 -0.293441 -0.198561\n-0.939746 -0.345132 -0.173298 -0.935129 -0.293441 -0.198561\n-0.939746 -0.345132 -0.173298 -0.926456 -0.351201 -0.135414\n-0.927394 -0.382236 -0.161580 -0.926456 -0.351201 -0.135414\n-0.941525 -0.368053 -0.101683 -0.926456 -0.351201 -0.135414\n-0.941525 -0.368053 -0.101683 -0.911138 -0.393711 -0.121734\n-0.927394 -0.382236 -0.161580 -0.911138 -0.393711 -0.121734\n-0.923074 -0.415907 -0.085013 -0.911138 -0.393711 -0.121734\n-0.927394 -0.382236 -0.161580 -0.909491 -0.397023 -0.123283\n-0.905826 -0.440751 -0.132251 -0.909491 -0.397023 -0.123283\n-0.923074 -0.415907 -0.085013 -0.909491 -0.397023 -0.123283\n-0.923074 -0.415907 -0.085013 -0.893005 -0.439977 -0.094673\n-0.905826 -0.440751 -0.132251 -0.893005 -0.439977 -0.094673\n-0.892790 -0.477857 -0.082762 -0.893005 -0.439977 -0.094673\n-0.892790 -0.477857 -0.082762 -0.831418 -0.543820 -0.114032\n-0.791065 -0.617279 -0.159541 -0.831418 -0.543820 -0.114032\n-0.877803 -0.510201 -0.037784 -0.831418 -0.543820 -0.114032\n-0.791065 -0.617279 -0.159541 -0.613631 -0.743689 -0.265299\n-0.482657 -0.761642 -0.468204 -0.613631 -0.743689 -0.265299\n-0.414803 -0.869802 -0.321955 -0.613631 -0.743689 -0.265299\n-0.414803 -0.869802 -0.321955 -0.199220 -0.946033 -0.255603\n-0.261616 -0.862187 -0.469534 -0.199220 -0.946033 -0.255603\n-0.417488 -0.911065 -0.167140 -0.199220 -0.946033 -0.255603\n-0.261616 -0.862187 -0.469534 -0.428864 -0.830560 -0.355311\n-0.271480 -0.938170 -0.280014 -0.428864 -0.830560 -0.355311\n-0.417488 -0.911065 -0.167140 -0.428864 -0.830560 -0.355311\n-0.930137 -0.327125 -0.245166 -0.904781 -0.368593 -0.213333\n-0.927394 -0.382236 -0.161580 -0.904781 -0.368593 -0.213333\n-0.939746 -0.345132 -0.173298 -0.904781 -0.368593 -0.213333\n-0.905826 -0.440751 -0.132251 -0.873425 -0.471122 -0.123182\n-0.870126 -0.500274 -0.157728 -0.873425 -0.471122 -0.123182\n-0.892790 -0.477857 -0.082762 -0.873425 -0.471122 -0.123182\n-0.870126 -0.500274 -0.157728 -0.826301 -0.557043 -0.083241\n-0.791065 -0.617279 -0.159541 -0.826301 -0.557043 -0.083241\n-0.892790 -0.477857 -0.082762 -0.826301 -0.557043 -0.083241\n-0.482657 -0.761642 -0.468204 -0.375547 -0.819899 -0.432123\n-0.261616 -0.862187 -0.469534 -0.375547 -0.819899 -0.432123\n-0.414803 -0.869802 -0.321955 -0.375547 -0.819899 -0.432123\n-0.975066 -0.087917 -0.271640 -0.942810 -0.117411 -0.311968\n-0.937467 -0.148142 -0.362602 -0.942810 -0.117411 -0.311968\n-0.963693 -0.161718 -0.278236 -0.942810 -0.117411 -0.311968\n-0.963693 -0.161718 -0.278236 -0.923711 -0.209351 -0.320825\n-0.937467 -0.148142 -0.362602 -0.923711 -0.209351 -0.320825\n-0.940028 -0.268320 -0.276808 -0.923711 -0.209351 -0.320825\n-0.937467 -0.148142 -0.362602 -0.916413 -0.219428 -0.334722\n-0.902913 -0.292542 -0.362545 -0.916413 -0.219428 -0.334722\n-0.940028 -0.268320 -0.276808 -0.916413 -0.219428 -0.334722\n-0.940028 -0.268320 -0.276808 -0.900514 -0.313570 -0.301243\n-0.902913 -0.292542 -0.362545 -0.900514 -0.313570 -0.301243\n-0.930137 -0.327125 -0.245166 -0.900514 -0.313570 -0.301243\n-0.902913 -0.292542 -0.362545 -0.902568 -0.308579 -0.300249\n-0.893455 -0.371541 -0.309786 -0.902568 -0.308579 -0.300249\n-0.930137 -0.327125 -0.245166 -0.902568 -0.308579 -0.300249\n-0.930137 -0.327125 -0.245166 -0.888395 -0.396130 -0.232026\n-0.893455 -0.371541 -0.309786 -0.888395 -0.396130 -0.232026\n-0.927394 -0.382236 -0.161580 -0.888395 -0.396130 -0.232026\n-0.927394 -0.382236 -0.161580 -0.869784 -0.436204 -0.230656\n-0.893455 -0.371541 -0.309786 -0.869784 -0.436204 -0.230656\n-0.905826 -0.440751 -0.132251 -0.869784 -0.436204 -0.230656\n-0.893455 -0.371541 -0.309786 -0.871888 -0.432643 -0.229414\n-0.834111 -0.528134 -0.240009 -0.871888 -0.432643 -0.229414\n-0.905826 -0.440751 -0.132251 -0.871888 -0.432643 -0.229414\n-0.905826 -0.440751 -0.132251 -0.874399 -0.421736 -0.239930\n-0.834111 -0.528134 -0.240009 -0.874399 -0.421736 -0.239930\n-0.870126 -0.500274 -0.157728 -0.874399 -0.421736 -0.239930\n-0.870126 -0.500274 -0.157728 -0.817508 -0.549731 -0.171690\n-0.834111 -0.528134 -0.240009 -0.817508 -0.549731 -0.171690\n-0.791065 -0.617279 -0.159541 -0.817508 -0.549731 -0.171690\n-0.834111 -0.528134 -0.240009 -0.722202 -0.621943 -0.302672\n-0.631412 -0.675049 -0.421781 -0.722202 -0.621943 -0.302672\n-0.791065 -0.617279 -0.159541 -0.722202 -0.621943 -0.302672\n-0.791065 -0.617279 -0.159541 -0.530168 -0.836506 -0.138493\n-0.631412 -0.675049 -0.421781 -0.530168 -0.836506 -0.138493\n-0.482657 -0.761642 -0.468204 -0.530168 -0.836506 -0.138493\n-0.261616 -0.862187 -0.469534 -0.160211 -0.913284 -0.374494\n-0.082709 -0.882380 -0.496826 -0.160211 -0.913284 -0.374494\n-0.271480 -0.938170 -0.280014 -0.160211 -0.913284 -0.374494\n-0.902483 -0.042549 -0.464743 -0.898165 -0.113336 -0.424800\n-0.882164 -0.080559 -0.497563 -0.898165 -0.113336 -0.424800\n-0.937467 -0.148142 -0.362602 -0.898165 -0.113336 -0.424800\n-0.937467 -0.148142 -0.362602 -0.870871 -0.208573 -0.445064\n-0.840848 -0.324370 -0.469074 -0.870871 -0.208573 -0.445064\n-0.902913 -0.292542 -0.362545 -0.870871 -0.208573 -0.445064\n-0.902913 -0.292542 -0.362545 -0.848875 -0.360076 -0.386984\n-0.840848 -0.324370 -0.469074 -0.848875 -0.360076 -0.386984\n-0.893455 -0.371541 -0.309786 -0.848875 -0.360076 -0.386984\n-0.840848 -0.324370 -0.469074 -0.845446 -0.367066 -0.387921\n-0.808538 -0.439556 -0.430498 -0.845446 -0.367066 -0.387921\n-0.893455 -0.371541 -0.309786 -0.845446 -0.367066 -0.387921\n-0.893455 -0.371541 -0.309786 -0.827693 -0.458102 -0.324139\n-0.808538 -0.439556 -0.430498 -0.827693 -0.458102 -0.324139\n-0.834111 -0.528134 -0.240009 -0.827693 -0.458102 -0.324139\n-0.834111 -0.528134 -0.240009 -0.747557 -0.295329 -0.594928\n-0.469722 -0.622959 -0.650810 -0.747557 -0.295329 -0.594928\n-0.631412 -0.675049 -0.421781 -0.747557 -0.295329 -0.594928\n-0.631412 -0.675049 -0.421781 -0.546654 -0.669334 -0.503151\n-0.453679 -0.730982 -0.540475 -0.546654 -0.669334 -0.503151\n-0.482657 -0.761642 -0.468204 -0.546654 -0.669334 -0.503151\n-0.482657 -0.761642 -0.468204 -0.364782 -0.795549 -0.483772\n-0.453679 -0.730982 -0.540475 -0.364782 -0.795549 -0.483772\n-0.261616 -0.862187 -0.469534 -0.364782 -0.795549 -0.483772\n-0.453679 -0.730982 -0.540475 -0.290690 -0.748074 -0.596561\n-0.128843 -0.809688 -0.600064 -0.290690 -0.748074 -0.596561\n-0.261616 -0.862187 -0.469534 -0.290690 -0.748074 -0.596561\n-0.261616 -0.862187 -0.469534 -0.173241 -0.840059 -0.514090\n-0.128843 -0.809688 -0.600064 -0.173241 -0.840059 -0.514090\n-0.082709 -0.882380 -0.496826 -0.173241 -0.840059 -0.514090\n-0.882164 -0.080559 -0.497563 -0.747497 -0.418484 -0.515867\n-0.746706 -0.094588 -0.682463 -0.747497 -0.418484 -0.515867\n-0.937467 -0.148142 -0.362602 -0.747497 -0.418484 -0.515867\n-0.746706 -0.094588 -0.682463 -0.846316 -0.104768 -0.522276\n-0.752175 -0.205605 -0.651330 -0.846316 -0.104768 -0.522276\n-0.937467 -0.148142 -0.362602 -0.846316 -0.104768 -0.522276\n-0.937467 -0.148142 -0.362602 -0.845199 -0.154230 -0.511715\n-0.752175 -0.205605 -0.651330 -0.845199 -0.154230 -0.511715\n-0.840848 -0.324370 -0.469074 -0.845199 -0.154230 -0.511715\n-0.752175 -0.205605 -0.651330 -0.727145 -0.356955 -0.586382\n-0.637510 -0.322334 -0.722463 -0.727145 -0.356955 -0.586382\n-0.840848 -0.324370 -0.469074 -0.727145 -0.356955 -0.586382\n-0.840848 -0.324370 -0.469074 -0.715309 -0.393946 -0.577182\n-0.637510 -0.322334 -0.722463 -0.715309 -0.393946 -0.577182\n-0.808538 -0.439556 -0.430498 -0.715309 -0.393946 -0.577182\n-0.637510 -0.322334 -0.722463 -0.733869 -0.361583 -0.575060\n-0.624776 -0.494070 -0.630730 -0.733869 -0.361583 -0.575060\n-0.808538 -0.439556 -0.430498 -0.733869 -0.361583 -0.575060\n-0.808538 -0.439556 -0.430498 -0.629411 -0.668878 -0.395531\n-0.624776 -0.494070 -0.630730 -0.629411 -0.668878 -0.395531\n-0.834111 -0.528134 -0.240009 -0.629411 -0.668878 -0.395531\n-0.624776 -0.494070 -0.630730 -0.648225 -0.645693 -0.403590\n-0.535393 -0.575864 -0.643433 -0.648225 -0.645693 -0.403590\n-0.834111 -0.528134 -0.240009 -0.648225 -0.645693 -0.403590\n-0.834111 -0.528134 -0.240009 -0.573493 -0.747015 -0.336266\n-0.535393 -0.575864 -0.643433 -0.573493 -0.747015 -0.336266\n-0.469722 -0.622959 -0.650810 -0.573493 -0.747015 -0.336266\n-0.469722 -0.622959 -0.650810 -0.470052 -0.728974 -0.497642\n-0.370008 -0.688221 -0.649398 -0.470052 -0.728974 -0.497642\n-0.631412 -0.675049 -0.421781 -0.470052 -0.728974 -0.497642\n-0.631412 -0.675049 -0.421781 -0.585026 -0.493889 -0.643287\n-0.370008 -0.688221 -0.649398 -0.585026 -0.493889 -0.643287\n-0.453679 -0.730982 -0.540475 -0.585026 -0.493889 -0.643287\n-0.370008 -0.688221 -0.649398 -0.344586 -0.753157 -0.560371\n-0.256629 -0.753447 -0.631451 -0.344586 -0.753157 -0.560371\n-0.453679 -0.730982 -0.540475 -0.344586 -0.753157 -0.560371\n-0.256629 -0.753447 -0.631451 -0.284569 -0.870581 -0.401383\n-0.128843 -0.809688 -0.600064 -0.284569 -0.870581 -0.401383\n-0.453679 -0.730982 -0.540475 -0.284569 -0.870581 -0.401383\n-0.128843 -0.809688 -0.600064 -0.095390 -0.833483 -0.544249\n-0.030558 -0.842564 -0.566942 -0.095390 -0.833483 -0.544249\n-0.082709 -0.882380 -0.496826 -0.095390 -0.833483 -0.544249\n0.064240 -1.006588 0.122170 0.001136 0.994051 -0.108912\n-0.049044 -1.012764 0.064620 0.001136 0.994051 -0.108912\n0.020872 -1.000997 0.172744 0.001136 0.994051 -0.108912\n0.127404 -1.006069 0.062171 -0.000793 0.999969 0.007818\n0.033802 -1.004494 -0.148729 -0.000793 0.999969 0.007818\n0.064240 -1.006588 0.122170 -0.000793 0.999969 0.007818\n0.021918 -0.953831 -0.349281 -0.020535 -0.992749 -0.118440\n0.155164 -0.965272 -0.276488 -0.020535 -0.992749 -0.118440\n0.208624 -0.992864 -0.054481 -0.020535 -0.992749 -0.118440\n0.206803 -0.945849 0.308017 0.181424 -0.905171 0.384384\n0.238663 -0.933974 0.320943 0.181424 -0.905171 0.384384\n0.270645 -0.906148 0.371375 0.181424 -0.905171 0.384384\n0.270645 -0.906148 0.371375 0.381336 -0.890178 0.249332\n0.238663 -0.933974 0.320943 0.381336 -0.890178 0.249332\n0.324044 -0.874188 0.403810 0.381336 -0.890178 0.249332\n0.206803 -0.945849 0.308017 0.410876 -0.890716 -0.194438\n0.023512 -1.000908 0.172921 0.410876 -0.890716 -0.194438\n0.238663 -0.933974 0.320943 0.410876 -0.890716 -0.194438\n0.132829 -0.973959 0.256965 0.617578 -0.321858 -0.717638\n0.020872 -1.000997 0.172744 0.617578 -0.321858 -0.717638\n0.206803 -0.945849 0.308017 0.617578 -0.321858 -0.717638\n0.020872 -1.000997 0.172744 0.006631 -0.929136 0.369679\n0.023512 -1.000908 0.172921 0.006631 -0.929136 0.369679\n0.206803 -0.945849 0.308017 0.006631 -0.929136 0.369679\n0.023512 -1.000908 0.172921 0.031725 -0.927221 0.373168\n0.076612 -0.997600 0.176627 0.031725 -0.927221 0.373168\n0.238663 -0.933974 0.320943 0.031725 -0.927221 0.373168\n0.238663 -0.933974 0.320943 0.190126 -0.959171 0.209387\n0.076612 -0.997600 0.176627 0.190126 -0.959171 0.209387\n0.280840 -0.932382 0.289939 0.190126 -0.959171 0.209387\n0.020872 -1.000997 0.172744 0.027599 -0.995515 0.090490\n-0.049044 -1.012764 0.064620 0.027599 -0.995515 0.090490\n0.023512 -1.000908 0.172921 0.027599 -0.995515 0.090490\n-0.049044 -1.012764 0.064620 -0.051854 -0.988372 0.142937\n-0.032170 -1.013269 0.067246 -0.051854 -0.988372 0.142937\n0.023512 -1.000908 0.172921 -0.051854 -0.988372 0.142937\n-0.032170 -1.013269 0.067246 0.055906 -0.994648 0.086891\n0.076612 -0.997600 0.176627 0.055906 -0.994648 0.086891\n0.023512 -1.000908 0.172921 0.055906 -0.994648 0.086891\n-0.049044 -1.012764 0.064620 -0.033622 -0.999153 0.023719\n-0.050106 -1.014644 -0.016084 -0.033622 -0.999153 0.023719\n-0.032170 -1.013269 0.067246 -0.033622 -0.999153 0.023719\n-0.032170 -1.013269 0.067246 0.072204 -0.994880 0.070715\n0.121482 -1.008475 -0.022187 0.072204 -0.994880 0.070715\n0.076612 -0.997600 0.176627 0.072204 -0.994880 0.070715\n0.121482 -1.008475 -0.022187 0.247288 -0.962851 0.108478\n0.280840 -0.932382 0.289939 0.247288 -0.962851 0.108478\n0.076612 -0.997600 0.176627 0.247288 -0.962851 0.108478\n0.064240 -1.006588 0.122170 -0.061856 0.997977 0.014664\n0.033802 -1.004494 -0.148729 -0.061856 0.997977 0.014664\n-0.049044 -1.012764 0.064620 -0.061856 0.997977 0.014664\n0.033802 -1.004494 -0.148729 -0.152724 0.988046 -0.021006\n-0.050106 -1.014644 -0.016084 -0.152724 0.988046 -0.021006\n-0.049044 -1.012764 0.064620 -0.152724 0.988046 -0.021006\n-0.050106 -1.014644 -0.016084 0.053831 -0.998538 0.004885\n-0.013853 -1.012988 -0.077042 0.053831 -0.998538 0.004885\n-0.032170 -1.013269 0.067246 0.053831 -0.998538 0.004885\n-0.013853 -1.012988 -0.077042 0.032449 -0.999471 0.002169\n0.121482 -1.008475 -0.022187 0.032449 -0.999471 0.002169\n-0.032170 -1.013269 0.067246 0.032449 -0.999471 0.002169\n0.121482 -1.008475 -0.022187 0.253719 -0.961575 0.104883\n0.435791 -0.910648 0.114354 0.253719 -0.961575 0.104883\n0.280840 -0.932382 0.289939 0.253719 -0.961575 0.104883\n0.127404 -1.006069 0.062171 -0.092234 0.994562 0.048361\n0.208624 -0.992864 -0.054481 -0.092234 0.994562 0.048361\n0.033802 -1.004494 -0.148729 -0.092234 0.994562 0.048361\n0.033802 -1.004494 -0.148729 0.098544 0.985553 0.137748\n0.013514 -0.993757 -0.211033 0.098544 0.985553 0.137748\n-0.050106 -1.014644 -0.016084 0.098544 0.985553 0.137748\n-0.050106 -1.014644 -0.016084 -0.280239 -0.940489 -0.192215\n0.013514 -0.993757 -0.211033 -0.280239 -0.940489 -0.192215\n-0.013853 -1.012988 -0.077042 -0.280239 -0.940489 -0.192215\n0.013514 -0.993757 -0.211033 0.161698 -0.980940 -0.107757\n0.062571 -0.980370 -0.259289 0.161698 -0.980940 -0.107757\n-0.013853 -1.012988 -0.077042 0.161698 -0.980940 -0.107757\n0.062571 -0.980370 -0.259289 0.069373 -0.986628 -0.147491\n0.125498 -0.978193 -0.244255 0.069373 -0.986628 -0.147491\n-0.013853 -1.012988 -0.077042 0.069373 -0.986628 -0.147491\n-0.013853 -1.012988 -0.077042 0.086856 -0.987295 -0.133060\n0.125498 -0.978193 -0.244255 0.086856 -0.987295 -0.133060\n0.121482 -1.008475 -0.022187 0.086856 -0.987295 -0.133060\n0.121482 -1.008475 -0.022187 0.285888 -0.957849 0.028165\n0.420326 -0.921113 -0.084549 0.285888 -0.957849 0.028165\n0.435791 -0.910648 0.114354 0.285888 -0.957849 0.028165\n0.420326 -0.921113 -0.084549 0.433083 -0.901249 0.013742\n0.528404 -0.867724 0.010785 0.433083 -0.901249 0.013742\n0.435791 -0.910648 0.114354 0.433083 -0.901249 0.013742\n0.033802 -1.004494 -0.148729 -0.071471 0.978800 0.191946\n0.066059 -0.981400 -0.254484 -0.071471 0.978800 0.191946\n0.013514 -0.993757 -0.211033 -0.071471 0.978800 0.191946\n0.066059 -0.981400 -0.254484 -0.035189 0.971650 0.233788\n0.062571 -0.980370 -0.259289 -0.035189 0.971650 0.233788\n0.013514 -0.993757 -0.211033 -0.035189 0.971650 0.233788\n0.125498 -0.978193 -0.244255 0.254000 -0.958939 -0.126170\n0.420326 -0.921113 -0.084549 0.254000 -0.958939 -0.126170\n0.121482 -1.008475 -0.022187 0.254000 -0.958939 -0.126170\n0.420326 -0.921113 -0.084549 0.494931 -0.865571 -0.076353\n0.505907 -0.864722 -0.169072 0.494931 -0.865571 -0.076353\n0.528404 -0.867724 0.010785 0.494931 -0.865571 -0.076353\n0.505907 -0.864722 -0.169072 0.474087 -0.877367 -0.073943\n0.565997 -0.838835 -0.090969 0.474087 -0.877367 -0.073943\n0.528404 -0.867724 0.010785 0.474087 -0.877367 -0.073943\n0.208624 -0.992864 -0.054481 -0.149783 0.976112 0.157385\n0.155164 -0.965272 -0.276488 -0.149783 0.976112 0.157385\n0.033802 -1.004494 -0.148729 -0.149783 0.976112 0.157385\n0.033802 -1.004494 -0.148729 -0.134110 0.975889 0.172204\n0.155164 -0.965272 -0.276488 -0.134110 0.975889 0.172204\n0.066059 -0.981400 -0.254484 -0.134110 0.975889 0.172204\n0.155164 -0.965272 -0.276488 -0.104119 0.954854 0.278234\n0.153589 -0.960432 -0.293686 -0.104119 0.954854 0.278234\n0.066059 -0.981400 -0.254484 -0.104119 0.954854 0.278234\n0.066059 -0.981400 -0.254484 -0.103416 0.954523 0.279626\n0.153589 -0.960432 -0.293686 -0.103416 0.954523 0.279626\n0.062571 -0.980370 -0.259289 -0.103416 0.954523 0.279626\n0.062571 -0.980370 -0.259289 0.101078 -0.953174 -0.285032\n0.153589 -0.960432 -0.293686 0.101078 -0.953174 -0.285032\n0.125498 -0.978193 -0.244255 0.101078 -0.953174 -0.285032\n0.153589 -0.960432 -0.293686 0.250786 -0.947588 -0.197950\n0.328934 -0.911735 -0.304652 0.250786 -0.947588 -0.197950\n0.125498 -0.978193 -0.244255 0.250786 -0.947588 -0.197950\n0.125498 -0.978193 -0.244255 0.266150 -0.952019 -0.151073\n0.328934 -0.911735 -0.304652 0.266150 -0.952019 -0.151073\n0.420326 -0.921113 -0.084549 0.266150 -0.952019 -0.151073\n0.328934 -0.911735 -0.304652 0.392579 -0.897431 -0.201244\n0.505907 -0.864722 -0.169072 0.392579 -0.897431 -0.201244\n0.420326 -0.921113 -0.084549 0.392579 -0.897431 -0.201244\n0.505907 -0.864722 -0.169072 0.584711 -0.789083 -0.188312\n0.536986 -0.813957 -0.285293 0.584711 -0.789083 -0.188312\n0.565997 -0.838835 -0.090969 0.584711 -0.789083 -0.188312\n0.565997 -0.838835 -0.090969 0.343999 -0.923528 -0.169588\n0.536986 -0.813957 -0.285293 0.343999 -0.923528 -0.169588\n0.572056 -0.820728 -0.177282 0.343999 -0.923528 -0.169588\n0.536986 -0.813957 -0.285293 0.549906 -0.803246 -0.228906\n0.600873 -0.780863 -0.247942 0.549906 -0.803246 -0.228906\n0.572056 -0.820728 -0.177282 0.549906 -0.803246 -0.228906\n0.021918 -0.953831 -0.349281 0.098119 -0.939808 -0.327313\n0.178396 -0.943253 -0.332747 0.098119 -0.939808 -0.327313\n0.155164 -0.965272 -0.276488 0.098119 -0.939808 -0.327313\n0.178396 -0.943253 -0.332747 0.228005 -0.934959 -0.271781\n0.235889 -0.924304 -0.349698 0.228005 -0.934959 -0.271781\n0.155164 -0.965272 -0.276488 0.228005 -0.934959 -0.271781\n0.155164 -0.965272 -0.276488 -0.217603 0.934167 0.282808\n0.235889 -0.924304 -0.349698 -0.217603 0.934167 0.282808\n0.153589 -0.960432 -0.293686 -0.217603 0.934167 0.282808\n0.235889 -0.924304 -0.349698 0.341791 -0.934389 -0.100478\n0.360261 -0.877197 -0.364704 0.341791 -0.934389 -0.100478\n0.153589 -0.960432 -0.293686 0.341791 -0.934389 -0.100478\n0.153589 -0.960432 -0.293686 0.222610 -0.890774 -0.396191\n0.360261 -0.877197 -0.364704 0.222610 -0.890774 -0.396191\n0.328934 -0.911735 -0.304652 0.222610 -0.890774 -0.396191\n0.360261 -0.877197 -0.364704 0.387659 -0.871884 -0.299230\n0.438594 -0.849588 -0.343666 0.387659 -0.871884 -0.299230\n0.328934 -0.911735 -0.304652 0.387659 -0.871884 -0.299230\n0.328934 -0.911735 -0.304652 0.414253 -0.879058 -0.235906\n0.438594 -0.849588 -0.343666 0.414253 -0.879058 -0.235906\n0.505907 -0.864722 -0.169072 0.414253 -0.879058 -0.235906\n0.438594 -0.849588 -0.343666 0.540814 -0.794106 -0.277338\n0.524199 -0.768897 -0.407780 0.540814 -0.794106 -0.277338\n0.505907 -0.864722 -0.169072 0.540814 -0.794106 -0.277338\n0.505907 -0.864722 -0.169072 0.170342 -0.918898 -0.355822\n0.524199 -0.768897 -0.407780 0.170342 -0.918898 -0.355822\n0.536986 -0.813957 -0.285293 0.170342 -0.918898 -0.355822\n0.524199 -0.768897 -0.407780 0.483263 -0.804093 -0.346254\n0.559953 -0.781403 -0.328836 0.483263 -0.804093 -0.346254\n0.536986 -0.813957 -0.285293 0.483263 -0.804093 -0.346254\n0.559953 -0.781403 -0.328836 0.565835 -0.775139 -0.281054\n0.600873 -0.780863 -0.247942 0.565835 -0.775139 -0.281054\n0.536986 -0.813957 -0.285293 0.565835 -0.775139 -0.281054\n-0.057973 -0.928647 -0.408074 0.056657 -0.887570 -0.457175\n0.186039 -0.877514 -0.477106 0.056657 -0.887570 -0.457175\n0.021918 -0.953831 -0.349281 0.056657 -0.887570 -0.457175\n0.021918 -0.953831 -0.349281 0.104396 -0.907179 -0.407588\n0.186039 -0.877514 -0.477106 0.104396 -0.907179 -0.407588\n0.178396 -0.943253 -0.332747 0.104396 -0.907179 -0.407588\n0.186039 -0.877514 -0.477106 0.217673 -0.892552 -0.394929\n0.305482 -0.880040 -0.405564 0.217673 -0.892552 -0.394929\n0.178396 -0.943253 -0.332747 0.217673 -0.892552 -0.394929\n0.178396 -0.943253 -0.332747 0.128775 -0.849073 -0.512340\n0.305482 -0.880040 -0.405564 0.128775 -0.849073 -0.512340\n0.235889 -0.924304 -0.349698 0.128775 -0.849073 -0.512340\n0.235889 -0.924304 -0.349698 0.297674 -0.893235 -0.336929\n0.305482 -0.880040 -0.405564 0.297674 -0.893235 -0.336929\n0.360261 -0.877197 -0.364704 0.297674 -0.893235 -0.336929\n0.305482 -0.880040 -0.405564 0.353706 -0.837804 -0.415904\n0.417939 -0.830375 -0.409970 0.353706 -0.837804 -0.415904\n0.360261 -0.877197 -0.364704 0.353706 -0.837804 -0.415904\n0.360261 -0.877197 -0.364704 0.395353 -0.841965 -0.367139\n0.417939 -0.830375 -0.409970 0.395353 -0.841965 -0.367139\n0.438594 -0.849588 -0.343666 0.395353 -0.841965 -0.367139\n0.417939 -0.830375 -0.409970 0.479274 -0.791745 -0.378730\n0.454482 -0.787413 -0.453540 0.479274 -0.791745 -0.378730\n0.438594 -0.849588 -0.343666 0.479274 -0.791745 -0.378730\n0.438594 -0.849588 -0.343666 0.464237 -0.797942 -0.384411\n0.454482 -0.787413 -0.453540 0.464237 -0.797942 -0.384411\n0.524199 -0.768897 -0.407780 0.464237 -0.797942 -0.384411\n0.559953 -0.781403 -0.328836 0.647822 -0.689881 -0.323096\n0.664539 -0.633225 -0.435529 0.647822 -0.689881 -0.323096\n0.600873 -0.780863 -0.247942 0.647822 -0.689881 -0.323096\n0.664539 -0.633225 -0.435529 0.606674 -0.711673 -0.354213\n0.710536 -0.639339 -0.344464 0.606674 -0.711673 -0.354213\n0.600873 -0.780863 -0.247942 0.606674 -0.711673 -0.354213\n-0.082709 -0.882380 -0.496826 0.050617 -0.879751 -0.472732\n0.186039 -0.877514 -0.477106 0.050617 -0.879751 -0.472732\n-0.057973 -0.928647 -0.408074 0.050617 -0.879751 -0.472732\n0.186039 -0.877514 -0.477106 0.254426 -0.853420 -0.454908\n0.321949 -0.833723 -0.483245 0.254426 -0.853420 -0.454908\n0.305482 -0.880040 -0.405564 0.254426 -0.853420 -0.454908\n0.321949 -0.833723 -0.483245 0.371882 -0.829865 -0.415966\n0.425866 -0.794145 -0.469301 0.371882 -0.829865 -0.415966\n0.305482 -0.880040 -0.405564 0.371882 -0.829865 -0.415966\n0.305482 -0.880040 -0.405564 0.344713 -0.820931 -0.455243\n0.425866 -0.794145 -0.469301 0.344713 -0.820931 -0.455243\n0.417939 -0.830375 -0.409970 0.344713 -0.820931 -0.455243\n0.425866 -0.794145 -0.469301 0.424299 -0.796936 -0.429957\n0.454482 -0.787413 -0.453540 0.424299 -0.796936 -0.429957\n0.417939 -0.830375 -0.409970 0.424299 -0.796936 -0.429957\n0.524199 -0.768897 -0.407780 0.601600 -0.700731 -0.383475\n0.664539 -0.633225 -0.435529 0.601600 -0.700731 -0.383475\n0.559953 -0.781403 -0.328836 0.601600 -0.700731 -0.383475\n0.664539 -0.633225 -0.435529 0.678581 -0.625689 -0.384761\n0.715494 -0.595037 -0.407763 0.678581 -0.625689 -0.384761\n0.710536 -0.639339 -0.344464 0.678581 -0.625689 -0.384761\n-0.030558 -0.842564 -0.566942 0.050108 -0.884031 -0.464734\n0.186039 -0.877514 -0.477106 0.050108 -0.884031 -0.464734\n-0.082709 -0.882380 -0.496826 0.050108 -0.884031 -0.464734\n0.191465 -0.822889 -0.564328 0.244226 -0.828611 -0.503743\n0.321949 -0.833723 -0.483245 0.244226 -0.828611 -0.503743\n0.186039 -0.877514 -0.477106 0.244226 -0.828611 -0.503743\n0.321949 -0.833723 -0.483245 0.356351 -0.730304 -0.582812\n0.423535 -0.633623 -0.671872 0.356351 -0.730304 -0.582812\n0.425866 -0.794145 -0.469301 0.356351 -0.730304 -0.582812\n0.423535 -0.633623 -0.671872 -0.454695 -0.700590 -0.549933\n0.434001 -0.728062 -0.560215 -0.454695 -0.700590 -0.549933\n0.425866 -0.794145 -0.469301 -0.454695 -0.700590 -0.549933\n0.425866 -0.794145 -0.469301 0.449085 -0.741366 -0.498697\n0.434001 -0.728062 -0.560215 0.449085 -0.741366 -0.498697\n0.454482 -0.787413 -0.453540 0.449085 -0.741366 -0.498697\n0.434001 -0.728062 -0.560215 0.440858 -0.745723 -0.499542\n0.482021 -0.715153 -0.537106 0.440858 -0.745723 -0.499542\n0.454482 -0.787413 -0.453540 0.440858 -0.745723 -0.499542\n0.454482 -0.787413 -0.453540 0.499909 -0.729816 -0.466326\n0.482021 -0.715153 -0.537106 0.499909 -0.729816 -0.466326\n0.524199 -0.768897 -0.407780 0.499909 -0.729816 -0.466326\n0.524199 -0.768897 -0.407780 0.565160 -0.680112 -0.466950\n0.482021 -0.715153 -0.537106 0.565160 -0.680112 -0.466950\n0.664539 -0.633225 -0.435529 0.565160 -0.680112 -0.466950\n0.482021 -0.715153 -0.537106 0.563483 -0.687634 -0.457871\n0.645112 -0.611333 -0.492315 0.563483 -0.687634 -0.457871\n0.664539 -0.633225 -0.435529 0.563483 -0.687634 -0.457871\n0.645112 -0.611333 -0.492315 0.657946 -0.599229 -0.456104\n0.691813 -0.579918 -0.466220 0.657946 -0.599229 -0.456104\n0.664539 -0.633225 -0.435529 0.657946 -0.599229 -0.456104\n0.664539 -0.633225 -0.435529 0.679674 -0.594848 -0.429184\n0.691813 -0.579918 -0.466220 0.679674 -0.594848 -0.429184\n0.715494 -0.595037 -0.407763 0.679674 -0.594848 -0.429184\n0.691813 -0.579918 -0.466220 0.701685 -0.567350 -0.430989\n0.720437 -0.549459 -0.459714 0.701685 -0.567350 -0.430989\n0.715494 -0.595037 -0.407763 0.701685 -0.567350 -0.430989\n0.996090 -0.174217 0.098613 0.987736 -0.122240 0.097133\n1.006745 -0.128050 0.048363 0.987736 -0.122240 0.097133\n0.998981 -0.111973 0.147549 0.987736 -0.122240 0.097133\n0.992960 -0.214479 0.017329 0.983508 -0.174258 0.048445\n1.006745 -0.128050 0.048363 0.983508 -0.174258 0.048445\n0.996090 -0.174217 0.098613 0.983508 -0.174258 0.048445\n0.977567 -0.275131 -0.030619 0.973377 -0.227930 -0.024175\n0.998333 -0.187137 -0.024146 0.973377 -0.227930 -0.024175\n0.992960 -0.214479 0.017329 0.973377 -0.227930 -0.024175\n0.877849 -0.496059 -0.124815 0.891064 -0.436601 -0.124039\n0.924284 -0.393660 -0.151665 0.891064 -0.436601 -0.124039\n0.911889 -0.442967 -0.067150 0.891064 -0.436601 -0.124039\n0.848502 -0.519419 -0.206203 0.860055 -0.480236 -0.172276\n0.888908 -0.448132 -0.203202 0.860055 -0.480236 -0.172276\n0.877849 -0.496059 -0.124815 0.860055 -0.480236 -0.172276\n0.817002 -0.538968 -0.272567 0.830574 -0.499019 -0.247239\n0.842895 -0.485749 -0.292996 0.830574 -0.499019 -0.247239\n0.848502 -0.519419 -0.206203 0.830574 -0.499019 -0.247239\n0.758851 -0.548309 -0.394682 0.789413 -0.513315 -0.336652\n0.842895 -0.485749 -0.292996 0.789413 -0.513315 -0.336652\n0.817002 -0.538968 -0.272567 0.789413 -0.513315 -0.336652\n0.943177 -0.004562 0.377714 0.951012 0.009458 0.309009\n0.976422 -0.047903 0.276726 0.951012 0.009458 0.309009\n0.949777 0.062652 0.355345 0.951012 0.009458 0.309009\n0.976422 -0.047903 0.276726 0.958791 0.030181 0.282505\n0.989696 0.068667 0.219220 0.958791 0.030181 0.282505\n0.949777 0.062652 0.355345 0.958791 0.030181 0.282505\n0.986891 -0.070015 0.231119 0.974598 -0.000500 0.223961\n0.989696 0.068667 0.219220 0.974598 -0.000500 0.223961\n0.976422 -0.047903 0.276726 0.974598 -0.000500 0.223961\n0.998981 -0.111973 0.147549 0.983210 -0.059961 0.172345\n1.000365 -0.002976 0.177576 0.983210 -0.059961 0.172345\n0.986891 -0.070015 0.231119 0.983210 -0.059961 0.172345\n0.986891 -0.070015 0.231119 0.969325 0.001479 0.245777\n1.000365 -0.002976 0.177576 0.969325 0.001479 0.245777\n0.989696 0.068667 0.219220 0.969325 0.001479 0.245777\n1.000365 -0.002976 0.177576 0.978237 0.026011 0.205855\n0.996800 0.063373 0.186132 0.978237 0.026011 0.205855\n0.989696 0.068667 0.219220 0.978237 0.026011 0.205855\n0.996800 0.063373 0.186132 0.974423 0.120002 0.189998\n0.981719 0.180575 0.189450 0.974423 0.120002 0.189998\n0.989696 0.068667 0.219220 0.974423 0.120002 0.189998\n1.006745 -0.128050 0.048363 0.995847 -0.035714 0.083743\n1.000365 -0.002976 0.177576 0.995847 -0.035714 0.083743\n0.998981 -0.111973 0.147549 0.995847 -0.035714 0.083743\n1.000365 -0.002976 0.177576 0.985404 0.031366 0.167319\n1.006607 0.028571 0.134899 0.985404 0.031366 0.167319\n0.996800 0.063373 0.186132 0.985404 0.031366 0.167319\n1.006607 0.028571 0.134899 0.986748 0.124004 0.104648\n0.981719 0.180575 0.189450 0.986748 0.124004 0.104648\n0.996800 0.063373 0.186132 0.986748 0.124004 0.104648\n1.006745 -0.128050 0.048363 0.975071 -0.133425 0.177300\n1.011589 -0.062719 0.070885 0.975071 -0.133425 0.177300\n1.000365 -0.002976 0.177576 0.975071 -0.133425 0.177300\n1.011589 -0.062719 0.070885 0.992044 -0.031354 0.121928\n1.006607 0.028571 0.134899 0.992044 -0.031354 0.121928\n1.000365 -0.002976 0.177576 0.992044 -0.031354 0.121928\n1.006607 0.028571 0.134899 0.982896 0.107186 0.149754\n1.005028 0.130062 0.072618 0.982896 0.107186 0.149754\n0.981719 0.180575 0.189450 0.982896 0.107186 0.149754\n1.005028 0.130062 0.072618 0.978834 0.161785 0.125337\n0.982255 0.228541 0.123351 0.978834 0.161785 0.125337\n0.981719 0.180575 0.189450 0.978834 0.161785 0.125337\n1.011589 -0.062719 0.070885 0.998654 0.021353 0.047276\n1.013822 0.058849 -0.031191 0.998654 0.021353 0.047276\n1.006607 0.028571 0.134899 0.998654 0.021353 0.047276\n1.013822 0.058849 -0.031191 0.997522 0.047413 0.051978\n1.005028 0.130062 0.072618 0.997522 0.047413 0.051978\n1.006607 0.028571 0.134899 0.997522 0.047413 0.051978\n1.005028 0.130062 0.072618 0.979517 0.179169 0.091900\n0.998476 0.184312 0.036688 0.979517 0.179169 0.091900\n0.982255 0.228541 0.123351 0.979517 0.179169 0.091900\n0.998476 0.184312 0.036688 0.975039 0.208606 0.076039\n0.978775 0.260010 0.081640 0.975039 0.208606 0.076039\n0.982255 0.228541 0.123351 0.975039 0.208606 0.076039\n0.992960 -0.214479 0.017329 0.986222 -0.164280 0.019451\n0.998333 -0.187137 -0.024146 0.986222 -0.164280 0.019451\n1.006745 -0.128050 0.048363 0.986222 -0.164280 0.019451\n0.998333 -0.187137 -0.024146 0.990604 -0.136715 -0.003520\n1.011368 -0.092561 -0.028952 0.990604 -0.136715 -0.003520\n1.006745 -0.128050 0.048363 0.990604 -0.136715 -0.003520\n1.006745 -0.128050 0.048363 0.996425 -0.081526 0.022161\n1.011368 -0.092561 -0.028952 0.996425 -0.081526 0.022161\n1.011589 -0.062719 0.070885 0.996425 -0.081526 0.022161\n1.011368 -0.092561 -0.028952 0.999866 -0.016167 0.002618\n1.013822 0.058849 -0.031191 0.999866 -0.016167 0.002618\n1.011589 -0.062719 0.070885 0.999866 -0.016167 0.002618\n1.013822 0.058849 -0.031191 0.992684 0.120735 0.001269\n0.998476 0.184312 0.036688 0.992684 0.120735 0.001269\n1.005028 0.130062 0.072618 0.992684 0.120735 0.001269\n0.998476 0.184312 0.036688 0.970165 0.241773 0.018050\n0.987732 0.233580 -0.045786 0.970165 0.241773 0.018050\n0.978775 0.260010 0.081640 0.970165 0.241773 0.018050\n0.987732 0.233580 -0.045786 0.963733 0.266578 0.012453\n0.973007 0.287243 -0.054952 0.963733 0.266578 0.012453\n0.978775 0.260010 0.081640 0.963733 0.266578 0.012453\n1.011368 -0.092561 -0.028952 0.999748 -0.016430 -0.015321\n1.012848 0.036783 -0.071118 0.999748 -0.016430 -0.015321\n1.013822 0.058849 -0.031191 0.999748 -0.016430 -0.015321\n1.012848 0.036783 -0.071118 0.994473 0.079720 -0.068329\n1.005389 0.124259 -0.077617 0.994473 0.079720 -0.068329\n1.013822 0.058849 -0.031191 0.994473 0.079720 -0.068329\n1.013822 0.058849 -0.031191 0.992243 0.124206 -0.005247\n1.005389 0.124259 -0.077617 0.992243 0.124206 -0.005247\n0.998476 0.184312 0.036688 0.992243 0.124206 -0.005247\n1.005389 0.124259 -0.077617 0.982218 0.184007 -0.037272\n0.994406 0.176008 -0.111579 0.982218 0.184007 -0.037272\n0.998476 0.184312 0.036688 0.982218 0.184007 -0.037272\n0.998476 0.184312 0.036688 0.987212 0.155341 -0.035803\n0.994406 0.176008 -0.111579 0.987212 0.155341 -0.035803\n0.987732 0.233580 -0.045786 0.987212 0.155341 -0.035803\n0.955077 -0.332106 -0.099022 0.959929 -0.263122 -0.096451\n0.977348 -0.230379 -0.154878 0.959929 -0.263122 -0.096451\n0.977567 -0.275131 -0.030619 0.959929 -0.263122 -0.096451\n0.977567 -0.275131 -0.030619 0.971314 -0.223183 -0.082087\n0.977348 -0.230379 -0.154878 0.971314 -0.223183 -0.082087\n0.998333 -0.187137 -0.024146 0.971314 -0.223183 -0.082087\n0.977348 -0.230379 -0.154878 0.976333 -0.195744 -0.091969\n0.992342 -0.157575 -0.150663 0.976333 -0.195744 -0.091969\n0.998333 -0.187137 -0.024146 0.976333 -0.195744 -0.091969\n0.998333 -0.187137 -0.024146 0.986948 -0.140070 -0.079463\n0.992342 -0.157575 -0.150663 0.986948 -0.140070 -0.079463\n1.011368 -0.092561 -0.028952 0.986948 -0.140070 -0.079463\n0.992342 -0.157575 -0.150663 0.987943 -0.129075 -0.085492\n1.000410 -0.097486 -0.148144 0.987943 -0.129075 -0.085492\n1.011368 -0.092561 -0.028952 0.987943 -0.129075 -0.085492\n1.011368 -0.092561 -0.028952 0.995129 -0.040660 -0.089806\n1.000410 -0.097486 -0.148144 0.995129 -0.040660 -0.089806\n1.012848 0.036783 -0.071118 0.995129 -0.040660 -0.089806\n1.000410 -0.097486 -0.148144 0.993423 -0.028386 -0.110926\n0.997697 -0.030507 -0.189580 0.993423 -0.028386 -0.110926\n1.012848 0.036783 -0.071118 0.993423 -0.028386 -0.110926\n0.997697 -0.030507 -0.189580 0.983465 0.071497 -0.166389\n1.005389 0.124259 -0.077617 0.983465 0.071497 -0.166389\n1.012848 0.036783 -0.071118 0.983465 0.071497 -0.166389\n0.994406 0.176008 -0.111579 0.967676 0.230110 -0.103211\n0.970212 0.257011 -0.157815 0.967676 0.230110 -0.103211\n0.987732 0.233580 -0.045786 0.967676 0.230110 -0.103211\n0.987732 0.233580 -0.045786 0.963804 0.247569 -0.098954\n0.970212 0.257011 -0.157815 0.963804 0.247569 -0.098954\n0.973007 0.287243 -0.054952 0.963804 0.247569 -0.098954\n0.970212 0.257011 -0.157815 0.951963 0.285821 -0.109875\n0.948752 0.333988 -0.143505 0.951963 0.285821 -0.109875\n0.973007 0.287243 -0.054952 0.951963 0.285821 -0.109875\n0.911889 -0.442967 -0.067150 0.919168 -0.383671 -0.089037\n0.924284 -0.393660 -0.151665 0.919168 -0.383671 -0.089037\n0.955077 -0.332106 -0.099022 0.919168 -0.383671 -0.089037\n0.924284 -0.393660 -0.151665 0.930221 -0.332514 -0.155318\n0.925756 -0.362934 -0.208630 0.930221 -0.332514 -0.155318\n0.955077 -0.332106 -0.099022 0.930221 -0.332514 -0.155318\n0.955077 -0.332106 -0.099022 0.939793 -0.297802 -0.167642\n0.925756 -0.362934 -0.208630 0.939793 -0.297802 -0.167642\n0.977348 -0.230379 -0.154878 0.939793 -0.297802 -0.167642\n0.925756 -0.362934 -0.208630 0.937648 -0.283261 -0.201443\n0.974307 -0.211397 -0.195727 0.937648 -0.283261 -0.201443\n0.977348 -0.230379 -0.154878 0.937648 -0.283261 -0.201443\n0.977348 -0.230379 -0.154878 0.968544 -0.190173 -0.160488\n0.974307 -0.211397 -0.195727 0.968544 -0.190173 -0.160488\n0.992342 -0.157575 -0.150663 0.968544 -0.190173 -0.160488\n0.974307 -0.211397 -0.195727 0.962676 -0.119078 -0.243053\n1.000410 -0.097486 -0.148144 0.962676 -0.119078 -0.243053\n0.992342 -0.157575 -0.150663 0.962676 -0.119078 -0.243053\n0.997697 -0.030507 -0.189580 0.977024 0.090902 -0.192771\n0.963103 0.076711 -0.314354 0.977024 0.090902 -0.192771\n1.005389 0.124259 -0.077617 0.977024 0.090902 -0.192771\n0.963103 0.076711 -0.314354 0.978111 0.082113 -0.191200\n0.994406 0.176008 -0.111579 0.978111 0.082113 -0.191200\n1.005389 0.124259 -0.077617 0.978111 0.082113 -0.191200\n0.994406 0.176008 -0.111579 0.967332 0.199991 -0.155798\n0.973151 0.200092 -0.212631 0.967332 0.199991 -0.155798\n0.970212 0.257011 -0.157815 0.967332 0.199991 -0.155798\n0.973151 0.200092 -0.212631 0.944353 0.252167 -0.211208\n0.940050 0.282503 -0.262239 0.944353 0.252167 -0.211208\n0.970212 0.257011 -0.157815 0.944353 0.252167 -0.211208\n0.940050 0.282503 -0.262239 0.946434 0.241416 -0.214433\n0.950101 0.301928 -0.196010 0.946434 0.241416 -0.214433\n0.970212 0.257011 -0.157815 0.946434 0.241416 -0.214433\n0.970212 0.257011 -0.157815 0.944016 0.291793 -0.153917\n0.950101 0.301928 -0.196010 0.944016 0.291793 -0.153917\n0.948752 0.333988 -0.143505 0.944016 0.291793 -0.153917\n0.950101 0.301928 -0.196010 0.922813 0.338890 -0.183220\n0.928270 0.380518 -0.160601 0.922813 0.338890 -0.183220\n0.948752 0.333988 -0.143505 0.922813 0.338890 -0.183220\n0.877849 -0.496059 -0.124815 0.886549 -0.439727 -0.143771\n0.888908 -0.448132 -0.203202 0.886549 -0.439727 -0.143771\n0.924284 -0.393660 -0.151665 0.886549 -0.439727 -0.143771\n0.888908 -0.448132 -0.203202 0.896140 -0.399840 -0.192512\n0.925756 -0.362934 -0.208630 0.896140 -0.399840 -0.192512\n0.924284 -0.393660 -0.151665 0.896140 -0.399840 -0.192512\n0.925756 -0.362934 -0.208630 0.935099 -0.281236 -0.215632\n0.966114 -0.207584 -0.236229 0.935099 -0.281236 -0.215632\n0.974307 -0.211397 -0.195727 0.935099 -0.281236 -0.215632\n0.974307 -0.211397 -0.195727 0.968656 -0.134825 -0.208634\n0.966114 -0.207584 -0.236229 0.968656 -0.134825 -0.208634\n1.000410 -0.097486 -0.148144 0.968656 -0.134825 -0.208634\n0.966114 -0.207584 -0.236229 0.965459 -0.112858 -0.234846\n0.955298 -0.107325 -0.328875 0.965459 -0.112858 -0.234846\n1.000410 -0.097486 -0.148144 0.965459 -0.112858 -0.234846\n1.000410 -0.097486 -0.148144 0.966063 -0.106463 -0.235345\n0.955298 -0.107325 -0.328875 0.966063 -0.106463 -0.235345\n0.997697 -0.030507 -0.189580 0.966063 -0.106463 -0.235345\n0.955298 -0.107325 -0.328875 0.950907 0.033107 -0.307701\n0.912926 0.033971 -0.444615 0.950907 0.033107 -0.307701\n0.997697 -0.030507 -0.189580 0.950907 0.033107 -0.307701\n0.997697 -0.030507 -0.189580 0.938830 -0.085352 -0.333636\n0.912926 0.033971 -0.444615 0.938830 -0.085352 -0.333636\n0.963103 0.076711 -0.314354 0.938830 -0.085352 -0.333636\n0.963103 0.076711 -0.314354 0.979273 0.075280 -0.188033\n0.973151 0.200092 -0.212631 0.979273 0.075280 -0.188033\n0.994406 0.176008 -0.111579 0.979273 0.075280 -0.188033\n0.973151 0.200092 -0.212631 0.942686 0.237615 -0.234270\n0.948242 0.226768 -0.285805 0.942686 0.237615 -0.234270\n0.940050 0.282503 -0.262239 0.942686 0.237615 -0.234270\n0.940050 0.282503 -0.262239 0.932095 0.284046 -0.224761\n0.934314 0.319438 -0.239349 0.932095 0.284046 -0.224761\n0.950101 0.301928 -0.196010 0.932095 0.284046 -0.224761\n0.950101 0.301928 -0.196010 0.918545 0.343394 -0.195847\n0.934314 0.319438 -0.239349 0.918545 0.343394 -0.195847\n0.928270 0.380518 -0.160601 0.918545 0.343394 -0.195847\n0.934314 0.319438 -0.239349 0.915199 0.349425 -0.200782\n0.909192 0.386153 -0.237756 0.915199 0.349425 -0.200782\n0.928270 0.380518 -0.160601 0.915199 0.349425 -0.200782\n0.848502 -0.519419 -0.206203 0.849287 -0.471378 -0.237726\n0.842895 -0.485749 -0.292996 0.849287 -0.471378 -0.237726\n0.888908 -0.448132 -0.203202 0.849287 -0.471378 -0.237726\n0.842895 -0.485749 -0.292996 0.853623 -0.459779 -0.244807\n0.881510 -0.423021 -0.276159 0.853623 -0.459779 -0.244807\n0.888908 -0.448132 -0.203202 0.853623 -0.459779 -0.244807\n0.888908 -0.448132 -0.203202 0.888447 -0.398730 -0.227326\n0.881510 -0.423021 -0.276159 0.888447 -0.398730 -0.227326\n0.925756 -0.362934 -0.208630 0.888447 -0.398730 -0.227326\n0.881510 -0.423021 -0.276159 0.894495 -0.358587 -0.267009\n0.905700 -0.326890 -0.324225 0.894495 -0.358587 -0.267009\n0.925756 -0.362934 -0.208630 0.894495 -0.358587 -0.267009\n0.925756 -0.362934 -0.208630 0.925591 -0.284762 -0.249384\n0.905700 -0.326890 -0.324225 0.925591 -0.284762 -0.249384\n0.966114 -0.207584 -0.236229 0.925591 -0.284762 -0.249384\n0.905700 -0.326890 -0.324225 0.890640 -0.129516 -0.435874\n0.779824 -0.154178 -0.632752 0.890640 -0.129516 -0.435874\n0.966114 -0.207584 -0.236229 0.890640 -0.129516 -0.435874\n0.966114 -0.207584 -0.236229 0.842377 -0.313893 -0.438033\n0.779824 -0.154178 -0.632752 0.842377 -0.313893 -0.438033\n0.955298 -0.107325 -0.328875 0.842377 -0.313893 -0.438033\n0.779824 -0.154178 -0.632752 0.867287 -0.127924 -0.481091\n0.816471 -0.011694 -0.604575 0.867287 -0.127924 -0.481091\n0.955298 -0.107325 -0.328875 0.867287 -0.127924 -0.481091\n0.955298 -0.107325 -0.328875 0.865091 -0.136064 -0.482809\n0.816471 -0.011694 -0.604575 0.865091 -0.136064 -0.482809\n0.912926 0.033971 -0.444615 0.865091 -0.136064 -0.482809\n0.912926 0.033971 -0.444615 0.923010 0.069690 -0.378413\n0.921732 0.141359 -0.403359 0.923010 0.069690 -0.378413\n0.963103 0.076711 -0.314354 0.923010 0.069690 -0.378413\n0.963103 0.076711 -0.314354 0.935345 0.176553 -0.306528\n0.921732 0.141359 -0.403359 0.935345 0.176553 -0.306528\n0.973151 0.200092 -0.212631 0.935345 0.176553 -0.306528\n0.921732 0.141359 -0.403359 0.952467 0.100293 -0.287660\n0.948242 0.226768 -0.285805 0.952467 0.100293 -0.287660\n0.973151 0.200092 -0.212631 0.952467 0.100293 -0.287660\n0.948242 0.226768 -0.285805 0.915013 0.263615 -0.305382\n0.921840 0.240570 -0.352998 0.915013 0.263615 -0.305382\n0.940050 0.282503 -0.262239 0.915013 0.263615 -0.305382\n0.934314 0.319438 -0.239349 0.893963 0.343507 -0.287808\n0.876835 0.396663 -0.325716 0.893963 0.343507 -0.287808\n0.909192 0.386153 -0.237756 0.893963 0.343507 -0.287808\n0.842895 -0.485749 -0.292996 0.837636 -0.422826 -0.345810\n0.857855 -0.366607 -0.402437 0.837636 -0.422826 -0.345810\n0.881510 -0.423021 -0.276159 0.837636 -0.422826 -0.345810\n0.881510 -0.423021 -0.276159 0.861736 -0.383136 -0.332593\n0.857855 -0.366607 -0.402437 0.861736 -0.383136 -0.332593\n0.905700 -0.326890 -0.324225 0.861736 -0.383136 -0.332593\n0.857855 -0.366607 -0.402437 0.876565 -0.167287 -0.451276\n0.779824 -0.154178 -0.632752 0.876565 -0.167287 -0.451276\n0.905700 -0.326890 -0.324225 0.876565 -0.167287 -0.451276\n0.816471 -0.011694 -0.604575 0.850061 0.043164 -0.524912\n0.805852 0.058337 -0.616012 0.850061 0.043164 -0.524912\n0.912926 0.033971 -0.444615 0.850061 0.043164 -0.524912\n0.912926 0.033971 -0.444615 0.849241 0.127233 -0.512447\n0.805852 0.058337 -0.616012 0.849241 0.127233 -0.512447\n0.921732 0.141359 -0.403359 0.849241 0.127233 -0.512447\n0.921732 0.141359 -0.403359 0.928868 0.166857 -0.330701\n0.921840 0.240570 -0.352998 0.928868 0.166857 -0.330701\n0.948242 0.226768 -0.285805 0.928868 0.166857 -0.330701\n0.921840 0.240570 -0.352998 0.903790 0.289582 -0.315128\n0.889622 0.328551 -0.364554 0.903790 0.289582 -0.315128\n0.940050 0.282503 -0.262239 0.903790 0.289582 -0.315128\n0.940050 0.282503 -0.262239 0.898324 0.323637 -0.297107\n0.889622 0.328551 -0.364554 0.898324 0.323637 -0.297107\n0.934314 0.319438 -0.239349 0.898324 0.323637 -0.297107\n0.889622 0.328551 -0.364554 0.894506 0.336047 -0.294841\n0.876835 0.396663 -0.325716 0.894506 0.336047 -0.294841\n0.934314 0.319438 -0.239349 0.894506 0.336047 -0.294841\n0.758851 -0.548309 -0.394682 0.808510 -0.425643 -0.406374\n0.736990 -0.494062 -0.494994 0.808510 -0.425643 -0.406374\n0.842895 -0.485749 -0.292996 0.808510 -0.425643 -0.406374\n0.736990 -0.494062 -0.494994 0.785519 -0.478737 -0.392136\n0.819688 -0.389998 -0.456383 0.785519 -0.478737 -0.392136\n0.842895 -0.485749 -0.292996 0.785519 -0.478737 -0.392136\n0.842895 -0.485749 -0.292996 0.809593 -0.448983 -0.378118\n0.819688 -0.389998 -0.456383 0.809593 -0.448983 -0.378118\n0.857855 -0.366607 -0.402437 0.809593 -0.448983 -0.378118\n0.819688 -0.389998 -0.456383 0.836987 -0.276127 -0.472448\n0.791233 -0.266567 -0.578933 0.836987 -0.276127 -0.472448\n0.857855 -0.366607 -0.402437 0.836987 -0.276127 -0.472448\n0.857855 -0.366607 -0.402437 0.911106 -0.099095 -0.400082\n0.791233 -0.266567 -0.578933 0.911106 -0.099095 -0.400082\n0.779824 -0.154178 -0.632752 0.911106 -0.099095 -0.400082\n0.791233 -0.266567 -0.578933 0.746311 -0.224321 -0.626657\n0.729051 -0.176031 -0.685397 0.746311 -0.224321 -0.626657\n0.779824 -0.154178 -0.632752 0.746311 -0.224321 -0.626657\n0.729051 -0.176031 -0.685397 0.736957 -0.102806 -0.668075\n0.715495 -0.051622 -0.719495 0.736957 -0.102806 -0.668075\n0.779824 -0.154178 -0.632752 0.736957 -0.102806 -0.668075\n0.779824 -0.154178 -0.632752 0.761094 -0.068188 -0.645048\n0.715495 -0.051622 -0.719495 0.761094 -0.068188 -0.645048\n0.816471 -0.011694 -0.604575 0.761094 -0.068188 -0.645048\n0.715495 -0.051622 -0.719495 0.750207 0.005771 -0.661178\n0.805852 0.058337 -0.616012 0.750207 0.005771 -0.661178\n0.816471 -0.011694 -0.604575 0.750207 0.005771 -0.661178\n0.805852 0.058337 -0.616012 0.866530 0.059775 -0.495533\n0.866826 0.194655 -0.492943 0.866530 0.059775 -0.495533\n0.921732 0.141359 -0.403359 0.866530 0.059775 -0.495533\n0.921732 0.141359 -0.403359 0.884311 0.210570 -0.416719\n0.866826 0.194655 -0.492943 0.884311 0.210570 -0.416719\n0.921840 0.240570 -0.352998 0.884311 0.210570 -0.416719\n0.866826 0.194655 -0.492943 0.898148 0.165479 -0.407365\n0.868951 0.225921 -0.475557 0.898148 0.165479 -0.407365\n0.921840 0.240570 -0.352998 0.898148 0.165479 -0.407365\n0.868951 0.225921 -0.475557 0.873086 0.266064 -0.408572\n0.889622 0.328551 -0.364554 0.873086 0.266064 -0.408572\n0.921840 0.240570 -0.352998 0.873086 0.266064 -0.408572\n0.889622 0.328551 -0.364554 0.852201 0.370589 -0.369347\n0.838264 0.421274 -0.390018 0.852201 0.370589 -0.369347\n0.876835 0.396663 -0.325716 0.852201 0.370589 -0.369347\n0.720437 -0.549459 -0.459714 0.749394 -0.500212 -0.433816\n0.736990 -0.494062 -0.494994 0.749394 -0.500212 -0.433816\n0.758851 -0.548309 -0.394682 0.749394 -0.500212 -0.433816\n0.736990 -0.494062 -0.494994 0.769922 -0.440542 -0.461673\n0.751968 -0.431328 -0.529879 0.769922 -0.440542 -0.461673\n0.819688 -0.389998 -0.456383 0.769922 -0.440542 -0.461673\n0.751968 -0.431328 -0.529879 0.776762 -0.381095 -0.501405\n0.776416 -0.348375 -0.555053 0.776762 -0.381095 -0.501405\n0.819688 -0.389998 -0.456383 0.776762 -0.381095 -0.501405\n0.776416 -0.348375 -0.555053 0.839871 -0.258408 -0.477328\n0.775203 -0.281809 -0.593225 0.839871 -0.258408 -0.477328\n0.819688 -0.389998 -0.456383 0.839871 -0.258408 -0.477328\n0.819688 -0.389998 -0.456383 0.784430 -0.336467 -0.521019\n0.775203 -0.281809 -0.593225 0.784430 -0.336467 -0.521019\n0.791233 -0.266567 -0.578933 0.784430 -0.336467 -0.521019\n0.791233 -0.266567 -0.578933 -0.546937 -0.767861 -0.333540\n0.676359 -0.110402 -0.750081 -0.546937 -0.767861 -0.333540\n0.729051 -0.176031 -0.685397 -0.546937 -0.767861 -0.333540\n0.729051 -0.176031 -0.685397 0.711350 -0.112634 -0.693754\n0.676359 -0.110402 -0.750081 0.711350 -0.112634 -0.693754\n0.715495 -0.051622 -0.719495 0.711350 -0.112634 -0.693754\n0.715495 -0.051622 -0.719495 0.730336 0.041530 -0.681825\n0.778570 0.121257 -0.641403 0.730336 0.041530 -0.681825\n0.805852 0.058337 -0.616012 0.730336 0.041530 -0.681825\n0.805852 0.058337 -0.616012 0.821776 0.132707 -0.554142\n0.778570 0.121257 -0.641403 0.821776 0.132707 -0.554142\n0.866826 0.194655 -0.492943 0.821776 0.132707 -0.554142\n0.868951 0.225921 -0.475557 0.892444 0.236083 -0.384458\n0.872029 0.325646 -0.407174 0.892444 0.236083 -0.384458\n0.889622 0.328551 -0.364554 0.892444 0.236083 -0.384458\n0.889622 0.328551 -0.364554 0.850465 0.367772 -0.376103\n0.872029 0.325646 -0.407174 0.850465 0.367772 -0.376103\n0.838264 0.421274 -0.390018 0.850465 0.367772 -0.376103\n0.806133 0.438088 -0.436463 0.807090 0.432728 -0.401686\n0.809886 0.467532 -0.397203 0.807090 0.432728 -0.401686\n0.838264 0.421274 -0.390018 0.807090 0.432728 -0.401686\n0.562680 0.393057 -0.749112 0.589515 0.433138 -0.681809\n0.552653 0.507201 -0.685269 0.589515 0.433138 -0.681809\n0.650027 0.459125 -0.631617 0.589515 0.433138 -0.681809\n0.428171 0.370874 -0.843441 0.455772 0.464666 -0.759182\n0.552653 0.507201 -0.685269 0.455772 0.464666 -0.759182\n0.562680 0.393057 -0.749112 0.455772 0.464666 -0.759182\n0.277951 0.292626 -0.932408 0.359498 0.310394 -0.880009\n0.272306 0.330031 -0.921520 0.359498 0.310394 -0.880009\n0.428171 0.370874 -0.843441 0.359498 0.310394 -0.880009\n0.138887 0.054226 -1.005008 0.180488 0.110504 -0.977350\n0.118862 0.148406 -0.998057 0.180488 0.110504 -0.977350\n0.248200 0.078021 -0.982131 0.180488 0.110504 -0.977350\n0.025844 -0.001463 -1.015678 0.064140 0.060647 -0.996096\n-0.004869 0.086796 -1.012282 0.064140 0.060647 -0.996096\n0.138887 0.054226 -1.005008 0.064140 0.060647 -0.996096\n0.806133 0.438088 -0.436463 0.771658 0.471234 -0.427179\n0.753726 0.505988 -0.456227 0.771658 0.471234 -0.427179\n0.809886 0.467532 -0.397203 0.771658 0.471234 -0.427179\n0.782322 0.350170 -0.545550 0.717963 0.457014 -0.525041\n0.650027 0.459125 -0.631617 0.717963 0.457014 -0.525041\n0.806133 0.438088 -0.436463 0.717963 0.457014 -0.525041\n0.650027 0.459125 -0.631617 0.711808 0.474039 -0.518282\n0.626302 0.544888 -0.585759 0.711808 0.474039 -0.518282\n0.806133 0.438088 -0.436463 0.711808 0.474039 -0.518282\n0.806133 0.438088 -0.436463 0.713935 0.379796 -0.588262\n0.626302 0.544888 -0.585759 0.713935 0.379796 -0.588262\n0.753726 0.505988 -0.456227 0.713935 0.379796 -0.588262\n0.626302 0.544888 -0.585759 0.696345 0.467396 -0.544651\n0.655410 0.570364 -0.526682 0.696345 0.467396 -0.544651\n0.753726 0.505988 -0.456227 0.696345 0.467396 -0.544651\n0.552653 0.507201 -0.685269 0.594210 0.504155 -0.626692\n0.547796 0.551755 -0.654031 0.594210 0.504155 -0.626692\n0.650027 0.459125 -0.631617 0.594210 0.504155 -0.626692\n0.650027 0.459125 -0.631617 0.592399 0.501165 -0.630790\n0.547796 0.551755 -0.654031 0.592399 0.501165 -0.630790\n0.626302 0.544888 -0.585759 0.592399 0.501165 -0.630790\n0.626302 0.544888 -0.585759 0.579321 0.604932 -0.546300\n0.518060 0.656995 -0.576405 0.579321 0.604932 -0.546300\n0.655410 0.570364 -0.526682 0.579321 0.604932 -0.546300\n0.655410 0.570364 -0.526682 0.587601 0.679164 -0.439841\n0.518060 0.656995 -0.576405 0.587601 0.679164 -0.439841\n0.465859 0.768644 -0.473744 0.587601 0.679164 -0.439841\n0.547796 0.551755 -0.654031 0.571641 0.558420 -0.601160\n0.535786 0.600303 -0.620355 0.571641 0.558420 -0.601160\n0.626302 0.544888 -0.585759 0.571641 0.558420 -0.601160\n0.626302 0.544888 -0.585759 0.579183 0.604821 -0.546570\n0.535786 0.600303 -0.620355 0.579183 0.604821 -0.546570\n0.518060 0.656995 -0.576405 0.579183 0.604821 -0.546570\n0.518060 0.656995 -0.576405 0.379244 0.716111 -0.585968\n0.310690 0.824497 -0.505913 0.379244 0.716111 -0.585968\n0.465859 0.768644 -0.473744 0.379244 0.716111 -0.585968\n0.428171 0.370874 -0.843441 0.527193 0.392843 -0.753487\n0.419462 0.397485 -0.835660 0.527193 0.392843 -0.753487\n0.552653 0.507201 -0.685269 0.527193 0.392843 -0.753487\n0.419462 0.397485 -0.835660 0.695124 -0.712472 -0.095843\n0.499602 0.464541 -0.752908 0.695124 -0.712472 -0.095843\n0.552653 0.507201 -0.685269 0.695124 -0.712472 -0.095843\n0.499602 0.464541 -0.752908 0.459600 0.542895 -0.702875\n0.547796 0.551755 -0.654031 0.459600 0.542895 -0.702875\n0.552653 0.507201 -0.685269 0.459600 0.542895 -0.702875\n0.535786 0.600303 -0.620355 0.274433 0.641301 -0.716533\n0.310690 0.824497 -0.505913 0.274433 0.641301 -0.716533\n0.518060 0.656995 -0.576405 0.274433 0.641301 -0.716533\n0.499602 0.464541 -0.752908 0.834845 0.141729 -0.531928\n0.512792 0.494972 -0.724098 0.834845 0.141729 -0.531928\n0.547796 0.551755 -0.654031 0.834845 0.141729 -0.531928\n0.512792 0.494972 -0.724098 0.503775 0.530594 -0.681676\n0.467469 0.538455 -0.723748 0.503775 0.530594 -0.681676\n0.547796 0.551755 -0.654031 0.503775 0.530594 -0.681676\n0.547796 0.551755 -0.654031 0.478590 0.577303 -0.661569\n0.467469 0.538455 -0.723748 0.478590 0.577303 -0.661569\n0.535786 0.600303 -0.620355 0.478590 0.577303 -0.661569\n0.467469 0.538455 -0.723748 0.478772 0.577132 -0.661587\n0.421302 0.610575 -0.694244 0.478772 0.577132 -0.661587\n0.535786 0.600303 -0.620355 0.478772 0.577132 -0.661587\n0.421302 0.610575 -0.694244 0.425929 0.709599 -0.561297\n0.276959 0.764262 -0.609482 0.425929 0.709599 -0.561297\n0.535786 0.600303 -0.620355 0.425929 0.709599 -0.561297\n0.535786 0.600303 -0.620355 0.428595 0.713354 -0.554466\n0.276959 0.764262 -0.609482 0.428595 0.713354 -0.554466\n0.310690 0.824497 -0.505913 0.428595 0.713354 -0.554466\n0.428171 0.370874 -0.843441 0.338956 0.364521 -0.867314\n0.272306 0.330031 -0.921520 0.338956 0.364521 -0.867314\n0.419462 0.397485 -0.835660 0.338956 0.364521 -0.867314\n0.272306 0.330031 -0.921520 0.331824 0.376867 -0.864791\n0.415233 0.407976 -0.832711 0.331824 0.376867 -0.864791\n0.419462 0.397485 -0.835660 0.331824 0.376867 -0.864791\n0.419462 0.397485 -0.835660 0.467391 0.408770 -0.783870\n0.415233 0.407976 -0.832711 0.467391 0.408770 -0.783870\n0.499602 0.464541 -0.752908 0.467391 0.408770 -0.783870\n0.415233 0.407976 -0.832711 0.330154 0.569544 -0.752741\n0.512792 0.494972 -0.724098 0.330154 0.569544 -0.752741\n0.499602 0.464541 -0.752908 0.330154 0.569544 -0.752741\n0.272306 0.330031 -0.921520 0.333774 0.373903 -0.865327\n0.387832 0.441705 -0.828706 0.333774 0.373903 -0.865327\n0.415233 0.407976 -0.832711 0.333774 0.373903 -0.865327\n0.415233 0.407976 -0.832711 0.448945 0.455965 -0.768468\n0.387832 0.441705 -0.828706 0.448945 0.455965 -0.768468\n0.512792 0.494972 -0.724098 0.448945 0.455965 -0.768468\n0.512792 0.494972 -0.724098 0.442070 0.466955 -0.765851\n0.387832 0.441705 -0.828706 0.442070 0.466955 -0.765851\n0.467469 0.538455 -0.723748 0.442070 0.466955 -0.765851\n0.387832 0.441705 -0.828706 0.404366 0.498806 -0.766603\n0.357044 0.570376 -0.761224 0.404366 0.498806 -0.766603\n0.467469 0.538455 -0.723748 0.404366 0.498806 -0.766603\n0.467469 0.538455 -0.723748 0.406751 0.556694 -0.724324\n0.357044 0.570376 -0.761224 0.406751 0.556694 -0.724324\n0.421302 0.610575 -0.694244 0.406751 0.556694 -0.724324\n0.421302 0.610575 -0.694244 0.301513 0.661755 -0.686418\n0.357044 0.570376 -0.761224 0.301513 0.661755 -0.686418\n0.276959 0.764262 -0.609482 0.301513 0.661755 -0.686418\n0.357044 0.570376 -0.761224 0.185688 0.652021 -0.735111\n0.177157 0.794790 -0.607615 0.185688 0.652021 -0.735111\n0.276959 0.764262 -0.609482 0.185688 0.652021 -0.735111\n0.177157 0.794790 -0.607615 0.246109 0.834717 -0.492624\n0.118110 0.889074 -0.477355 0.246109 0.834717 -0.492624\n0.276959 0.764262 -0.609482 0.246109 0.834717 -0.492624\n0.263705 0.226944 -0.954582 0.119969 0.294099 -0.948216\n0.272306 0.330031 -0.921520 0.119969 0.294099 -0.948216\n0.277951 0.292626 -0.932408 0.119969 0.294099 -0.948216\n0.272306 0.330031 -0.921520 0.365019 0.342047 -0.865890\n0.303649 0.431845 -0.868089 0.365019 0.342047 -0.865890\n0.387832 0.441705 -0.828706 0.365019 0.342047 -0.865890\n0.303649 0.431845 -0.868089 0.332592 0.456488 -0.825228\n0.316905 0.511217 -0.818841 0.332592 0.456488 -0.825228\n0.387832 0.441705 -0.828706 0.332592 0.456488 -0.825228\n0.387832 0.441705 -0.828706 0.381083 0.499282 -0.778135\n0.316905 0.511217 -0.818841 0.381083 0.499282 -0.778135\n0.357044 0.570376 -0.761224 0.381083 0.499282 -0.778135\n0.276192 0.189164 -0.959274 -0.619860 -0.295162 0.727085\n0.251757 0.276169 -0.944786 -0.619860 -0.295162 0.727085\n0.263705 0.226944 -0.954582 -0.619860 -0.295162 0.727085\n0.263705 0.226944 -0.954582 0.337398 0.261845 -0.904212\n0.251757 0.276169 -0.944786 0.337398 0.261845 -0.904212\n0.272306 0.330031 -0.921520 0.337398 0.261845 -0.904212\n0.251757 0.276169 -0.944786 0.226816 0.311985 -0.922616\n0.193217 0.345013 -0.935898 0.226816 0.311985 -0.922616\n0.272306 0.330031 -0.921520 0.226816 0.311985 -0.922616\n0.272306 0.330031 -0.921520 0.236065 0.393590 -0.888460\n0.193217 0.345013 -0.935898 0.236065 0.393590 -0.888460\n0.303649 0.431845 -0.868089 0.236065 0.393590 -0.888460\n0.193217 0.345013 -0.935898 0.225651 0.404956 -0.886054\n0.161058 0.459012 -0.891986 0.225651 0.404956 -0.886054\n0.303649 0.431845 -0.868089 0.225651 0.404956 -0.886054\n0.303649 0.431845 -0.868089 0.233567 0.484186 -0.843214\n0.161058 0.459012 -0.891986 0.233567 0.484186 -0.843214\n0.316905 0.511217 -0.818841 0.233567 0.484186 -0.843214\n0.161058 0.459012 -0.891986 0.247130 0.458389 -0.853701\n0.198551 0.537727 -0.838867 0.247130 0.458389 -0.853701\n0.316905 0.511217 -0.818841 0.247130 0.458389 -0.853701\n0.316905 0.511217 -0.818841 0.260262 0.577228 -0.773997\n0.198551 0.537727 -0.838867 0.260262 0.577228 -0.773997\n0.357044 0.570376 -0.761224 0.260262 0.577228 -0.773997\n0.198551 0.537727 -0.838867 0.263804 0.569962 -0.778171\n0.184044 0.620928 -0.782845 0.263804 0.569962 -0.778171\n0.357044 0.570376 -0.761224 0.263804 0.569962 -0.778171\n0.184044 0.620928 -0.782845 0.287594 0.708624 -0.644315\n0.101267 0.742774 -0.685786 0.287594 0.708624 -0.644315\n0.357044 0.570376 -0.761224 0.287594 0.708624 -0.644315\n0.357044 0.570376 -0.761224 0.250947 0.675646 -0.693201\n0.101267 0.742774 -0.685786 0.250947 0.675646 -0.693201\n0.177157 0.794790 -0.607615 0.250947 0.675646 -0.693201\n0.271672 0.144379 -0.968308 0.090206 0.188182 -0.977983\n0.251757 0.276169 -0.944786 0.090206 0.188182 -0.977983\n0.276192 0.189164 -0.959274 0.090206 0.188182 -0.977983\n0.193217 0.345013 -0.935898 0.133486 0.388797 -0.911602\n0.059346 0.392073 -0.935430 0.133486 0.388797 -0.911602\n0.161058 0.459012 -0.891986 0.133486 0.388797 -0.911602\n0.059346 0.392073 -0.935430 0.069955 0.466096 -0.881964\n-0.020004 0.479035 -0.895766 0.069955 0.466096 -0.881964\n0.161058 0.459012 -0.891986 0.069955 0.466096 -0.881964\n-0.020004 0.479035 -0.895766 0.071395 0.480617 -0.874019\n-0.000469 0.539696 -0.860813 0.071395 0.480617 -0.874019\n0.161058 0.459012 -0.891986 0.071395 0.480617 -0.874019\n0.161058 0.459012 -0.891986 0.098472 0.524002 -0.846005\n-0.000469 0.539696 -0.860813 0.098472 0.524002 -0.846005\n0.198551 0.537727 -0.838867 0.098472 0.524002 -0.846005\n-0.000469 0.539696 -0.860813 0.100515 0.486468 -0.867897\n0.047210 0.581109 -0.832079 0.100515 0.486468 -0.867897\n0.198551 0.537727 -0.838867 0.100515 0.486468 -0.867897\n0.198551 0.537727 -0.838867 0.126697 0.569125 -0.812431\n0.047210 0.581109 -0.832079 0.126697 0.569125 -0.812431\n0.184044 0.620928 -0.782845 0.126697 0.569125 -0.812431\n0.047210 0.581109 -0.832079 0.100059 0.619160 -0.778864\n0.040417 0.674824 -0.758452 0.100059 0.619160 -0.778864\n0.184044 0.620928 -0.782845 0.100059 0.619160 -0.778864\n0.184044 0.620928 -0.782845 0.126826 0.669313 -0.732076\n0.040417 0.674824 -0.758452 0.126826 0.669313 -0.732076\n0.101267 0.742774 -0.685786 0.126826 0.669313 -0.732076\n0.177157 0.794790 -0.607615 0.070381 0.822938 -0.563755\n-0.043387 0.853841 -0.548949 0.070381 0.822938 -0.563755\n0.118110 0.889074 -0.477355 0.070381 0.822938 -0.563755\n0.248200 0.078021 -0.982131 0.192773 0.134287 -0.972011\n0.118862 0.148406 -0.998057 0.192773 0.134287 -0.972011\n0.271672 0.144379 -0.968308 0.192773 0.134287 -0.972011\n0.118862 0.148406 -0.998057 0.192690 0.102356 -0.975907\n0.176529 0.190447 -0.982262 0.192690 0.102356 -0.975907\n0.271672 0.144379 -0.968308 0.192690 0.102356 -0.975907\n0.271672 0.144379 -0.968308 0.238687 0.205466 -0.949111\n0.176529 0.190447 -0.982262 0.238687 0.205466 -0.949111\n0.251757 0.276169 -0.944786 0.238687 0.205466 -0.949111\n0.176529 0.190447 -0.982262 0.163459 0.271231 -0.948533\n0.088898 0.238819 -0.983531 0.163459 0.271231 -0.948533\n0.251757 0.276169 -0.944786 0.163459 0.271231 -0.948533\n0.251757 0.276169 -0.944786 0.165646 0.263548 -0.950318\n0.088898 0.238819 -0.983531 0.165646 0.263548 -0.950318\n0.193217 0.345013 -0.935898 0.165646 0.263548 -0.950318\n0.088898 0.238819 -0.983531 0.072599 0.347947 -0.934699\n-0.045005 0.334731 -0.958228 0.072599 0.347947 -0.934699\n0.193217 0.345013 -0.935898 0.072599 0.347947 -0.934699\n0.193217 0.345013 -0.935898 0.080431 0.238428 -0.967824\n-0.045005 0.334731 -0.958228 0.080431 0.238428 -0.967824\n0.059346 0.392073 -0.935430 0.080431 0.238428 -0.967824\n-0.045005 0.334731 -0.958228 -0.033712 0.421624 -0.906144\n-0.133824 0.408826 -0.920448 -0.033712 0.421624 -0.906144\n0.059346 0.392073 -0.935430 -0.033712 0.421624 -0.906144\n0.059346 0.392073 -0.935430 -0.038041 0.385735 -0.921825\n-0.133824 0.408826 -0.920448 -0.038041 0.385735 -0.921825\n-0.020004 0.479035 -0.895766 -0.038041 0.385735 -0.921825\n-0.133824 0.408826 -0.920448 -0.107949 0.480886 -0.870113\n-0.197738 0.466113 -0.880857 -0.107949 0.480886 -0.870113\n-0.020004 0.479035 -0.895766 -0.107949 0.480886 -0.870113\n-0.020004 0.479035 -0.895766 -0.108920 0.522382 -0.845727\n-0.197738 0.466113 -0.880857 -0.108920 0.522382 -0.845727\n-0.000469 0.539696 -0.860813 -0.108920 0.522382 -0.845727\n-0.197738 0.466113 -0.880857 -0.075540 0.445519 -0.892080\n-0.115330 0.553296 -0.844295 -0.075540 0.445519 -0.892080\n-0.000469 0.539696 -0.860813 -0.075540 0.445519 -0.892080\n-0.000469 0.539696 -0.860813 -0.043235 0.602657 -0.796828\n-0.115330 0.553296 -0.844295 -0.043235 0.602657 -0.796828\n0.047210 0.581109 -0.832079 -0.043235 0.602657 -0.796828\n-0.115330 0.553296 -0.844295 -0.046831 0.618281 -0.784561\n-0.060892 0.710757 -0.723455 -0.046831 0.618281 -0.784561\n0.047210 0.581109 -0.832079 -0.046831 0.618281 -0.784561\n0.047210 0.581109 -0.832079 -0.053958 0.614464 -0.787098\n-0.060892 0.710757 -0.723455 -0.053958 0.614464 -0.787098\n0.040417 0.674824 -0.758452 -0.053958 0.614464 -0.787098\n0.040417 0.674824 -0.758452 0.017750 0.722839 -0.690789\n-0.060892 0.710757 -0.723455 0.017750 0.722839 -0.690789\n0.101267 0.742774 -0.685786 0.017750 0.722839 -0.690789\n0.101267 0.742774 -0.685786 0.058006 0.804244 -0.591461\n-0.043387 0.853841 -0.548949 0.058006 0.804244 -0.591461\n0.177157 0.794790 -0.607615 0.058006 0.804244 -0.591461\n0.138887 0.054226 -1.005008 0.070273 0.088271 -0.993615\n-0.004869 0.086796 -1.012282 0.070273 0.088271 -0.993615\n0.118862 0.148406 -0.998057 0.070273 0.088271 -0.993615\n0.118862 0.148406 -0.998057 0.122823 0.196980 -0.972683\n0.088898 0.238819 -0.983531 0.122823 0.196980 -0.972683\n0.176529 0.190447 -0.982262 0.122823 0.196980 -0.972683\n-0.197738 0.466113 -0.880857 -0.113723 0.473734 -0.873295\n-0.186053 0.514356 -0.856209 -0.113723 0.473734 -0.873295\n-0.115330 0.553296 -0.844295 -0.113723 0.473734 -0.873295\n-0.115330 0.553296 -0.844295 -0.229751 0.641270 -0.732112\n-0.186053 0.514356 -0.856209 -0.229751 0.641270 -0.732112\n-0.060892 0.710757 -0.723455 -0.229751 0.641270 -0.732112\n-0.186053 0.514356 -0.856209 0.103978 0.510635 -0.853487\n-0.178428 0.569161 -0.822490 0.103978 0.510635 -0.853487\n-0.060892 0.710757 -0.723455 0.103978 0.510635 -0.853487\n-0.178428 0.569161 -0.822490 0.000657 0.572776 -0.819712\n-0.143840 0.659682 -0.759211 0.000657 0.572776 -0.819712\n-0.060892 0.710757 -0.723455 0.000657 0.572776 -0.819712\n-0.060892 0.710757 -0.723455 0.021734 0.713668 -0.700147\n-0.032453 0.769089 -0.663115 0.021734 0.713668 -0.700147\n0.101267 0.742774 -0.685786 0.021734 0.713668 -0.700147\n0.101267 0.742774 -0.685786 0.057980 0.804233 -0.591479\n-0.032453 0.769089 -0.663115 0.057980 0.804233 -0.591479\n-0.043387 0.853841 -0.548949 0.057980 0.804233 -0.591479\n-0.032453 0.769089 -0.663115 -0.068409 0.797907 -0.598887\n-0.140826 0.822758 -0.579231 -0.068409 0.797907 -0.598887\n-0.043387 0.853841 -0.548949 -0.068409 0.797907 -0.598887\n-0.140826 0.822758 -0.579231 -0.108975 0.847586 -0.519348\n-0.145259 0.888038 -0.471763 -0.108975 0.847586 -0.519348\n-0.043387 0.853841 -0.548949 -0.108975 0.847586 -0.519348\n-0.004869 0.086796 -1.012282 0.042914 0.142131 -0.988917\n-0.025736 0.174406 -1.000596 0.042914 0.142131 -0.988917\n0.118862 0.148406 -0.998057 0.042914 0.142131 -0.988917\n0.118862 0.148406 -0.998057 0.048571 0.174114 -0.983527\n-0.025736 0.174406 -1.000596 0.048571 0.174114 -0.983527\n0.088898 0.238819 -0.983531 0.048571 0.174114 -0.983527\n-0.025736 0.174406 -1.000596 -0.016830 0.283929 -0.958698\n-0.123561 0.239228 -0.979680 -0.016830 0.283929 -0.958698\n0.088898 0.238819 -0.983531 -0.016830 0.283929 -0.958698\n0.088898 0.238819 -0.983531 -0.017178 0.232562 -0.972430\n-0.123561 0.239228 -0.979680 -0.017178 0.232562 -0.972430\n-0.045005 0.334731 -0.958228 -0.017178 0.232562 -0.972430\n-0.123561 0.239228 -0.979680 -0.122330 0.312241 -0.942094\n-0.204411 0.313630 -0.944523 -0.122330 0.312241 -0.942094\n-0.045005 0.334731 -0.958228 -0.122330 0.312241 -0.942094\n-0.045005 0.334731 -0.958228 -0.124010 0.328732 -0.936246\n-0.204411 0.313630 -0.944523 -0.124010 0.328732 -0.936246\n-0.133824 0.408826 -0.920448 -0.124010 0.328732 -0.936246\n-0.204411 0.313630 -0.944523 -0.162821 0.353676 -0.921088\n-0.217375 0.383261 -0.915495 -0.162821 0.353676 -0.921088\n-0.133824 0.408826 -0.920448 -0.162821 0.353676 -0.921088\n-0.133824 0.408826 -0.920448 -0.179968 0.415419 -0.891649\n-0.217375 0.383261 -0.915495 -0.179968 0.415419 -0.891649\n-0.197738 0.466113 -0.880857 -0.179968 0.415419 -0.891649\n-0.143840 0.659682 -0.759211 -0.106029 0.680054 -0.725455\n-0.078373 0.723999 -0.708487 -0.106029 0.680054 -0.725455\n-0.060892 0.710757 -0.723455 -0.106029 0.680054 -0.725455\n-0.060892 0.710757 -0.723455 -0.036378 0.727014 -0.685659\n-0.078373 0.723999 -0.708487 -0.036378 0.727014 -0.685659\n-0.032453 0.769089 -0.663115 -0.036378 0.727014 -0.685659\n-0.078373 0.723999 -0.708487 -0.082432 0.747368 -0.659277\n-0.123478 0.778486 -0.641081 -0.082432 0.747368 -0.659277\n-0.032453 0.769089 -0.663115 -0.082432 0.747368 -0.659277\n-0.032453 0.769089 -0.663115 -0.060377 0.803573 -0.592136\n-0.123478 0.778486 -0.641081 -0.060377 0.803573 -0.592136\n-0.140826 0.822758 -0.579231 -0.060377 0.803573 -0.592136\n-0.140826 0.822758 -0.579231 -0.151205 0.842071 -0.517739\n-0.208537 0.862777 -0.494368 -0.151205 0.842071 -0.517739\n-0.145259 0.888038 -0.471763 -0.151205 0.842071 -0.517739\n-0.140826 0.822758 -0.579231 -0.179043 0.827043 -0.532864\n-0.220829 0.809689 -0.572634 -0.179043 0.827043 -0.532864\n-0.208537 0.862777 -0.494368 -0.179043 0.827043 -0.532864\n-0.140826 0.822758 -0.579231 -0.176705 0.776224 -0.605188\n-0.123478 0.778486 -0.641081 -0.176705 0.776224 -0.605188\n-0.220829 0.809689 -0.572634 -0.176705 0.776224 -0.605188\n-0.123478 0.778486 -0.641081 -0.206891 0.745173 -0.633966\n-0.178809 0.704902 -0.709516 -0.206891 0.745173 -0.633966\n-0.220829 0.809689 -0.572634 -0.206891 0.745173 -0.633966\n-0.178809 0.704902 -0.709516 -0.152260 0.761669 -0.629823\n-0.248284 0.738252 -0.652388 -0.152260 0.761669 -0.629823\n-0.220829 0.809689 -0.572634 -0.152260 0.761669 -0.629823\n-0.078373 0.723999 -0.708487 -0.176917 0.704199 -0.687607\n-0.102106 0.675682 -0.751864 -0.176917 0.704199 -0.687607\n-0.123478 0.778486 -0.641081 -0.176917 0.704199 -0.687607\n-0.102106 0.675682 -0.751864 -0.105685 0.718660 -0.687284\n-0.178809 0.704902 -0.709516 -0.105685 0.718660 -0.687284\n-0.123478 0.778486 -0.641081 -0.105685 0.718660 -0.687284\n-0.143840 0.659682 -0.759211 0.144965 -0.699463 0.699812\n-0.102106 0.675682 -0.751864 0.144965 -0.699463 0.699812\n-0.078373 0.723999 -0.708487 0.144965 -0.699463 0.699812\n-0.178809 0.704902 -0.709516 -0.247887 0.674618 -0.695300\n-0.248226 0.629817 -0.757619 -0.247887 0.674618 -0.695300\n-0.248284 0.738252 -0.652388 -0.247887 0.674618 -0.695300\n-0.248226 0.629817 -0.757619 -0.243415 0.675409 -0.696112\n-0.319602 0.676638 -0.687232 -0.243415 0.675409 -0.696112\n-0.248284 0.738252 -0.652388 -0.243415 0.675409 -0.696112\n-0.178428 0.569161 -0.822490 0.616274 -0.595634 0.515196\n-0.163411 0.603269 -0.801022 0.616274 -0.595634 0.515196\n-0.143840 0.659682 -0.759211 0.616274 -0.595634 0.515196\n-0.143840 0.659682 -0.759211 0.097635 -0.614234 0.783061\n-0.163411 0.603269 -0.801022 0.097635 -0.614234 0.783061\n-0.102106 0.675682 -0.751864 0.097635 -0.614234 0.783061\n-0.163411 0.603269 -0.801022 -0.232877 0.673435 -0.701608\n-0.216596 0.580516 -0.805207 -0.232877 0.673435 -0.701608\n-0.102106 0.675682 -0.751864 -0.232877 0.673435 -0.701608\n-0.102106 0.675682 -0.751864 -0.175044 0.633193 -0.753940\n-0.216596 0.580516 -0.805207 -0.175044 0.633193 -0.753940\n-0.178809 0.704902 -0.709516 -0.175044 0.633193 -0.753940\n-0.216596 0.580516 -0.805207 -0.157337 0.631741 -0.759045\n-0.248226 0.629817 -0.757619 -0.157337 0.631741 -0.759045\n-0.178809 0.704902 -0.709516 -0.157337 0.631741 -0.759045\n-0.248226 0.629817 -0.757619 -0.293100 0.631860 -0.717527\n-0.317416 0.595884 -0.759237 -0.293100 0.631860 -0.717527\n-0.319602 0.676638 -0.687232 -0.293100 0.631860 -0.717527\n-0.317416 0.595884 -0.759237 -0.322618 0.625055 -0.710791\n-0.358476 0.660101 -0.684129 -0.322618 0.625055 -0.710791\n-0.319602 0.676638 -0.687232 -0.322618 0.625055 -0.710791\n-0.178428 0.569161 -0.822490 -0.238861 0.590432 -0.770932\n-0.255459 0.532397 -0.826780 -0.238861 0.590432 -0.770932\n-0.163411 0.603269 -0.801022 -0.238861 0.590432 -0.770932\n-0.163411 0.603269 -0.801022 -0.147334 0.501262 -0.852660\n-0.255459 0.532397 -0.826780 -0.147334 0.501262 -0.852660\n-0.216596 0.580516 -0.805207 -0.147334 0.501262 -0.852660\n-0.216596 0.580516 -0.805207 -0.264631 0.576460 -0.773088\n-0.317416 0.595884 -0.759237 -0.264631 0.576460 -0.773088\n-0.248226 0.629817 -0.757619 -0.264631 0.576460 -0.773088\n-0.317416 0.595884 -0.759237 -0.360229 0.602578 -0.712134\n-0.373570 0.561826 -0.759650 -0.360229 0.602578 -0.712134\n-0.358476 0.660101 -0.684129 -0.360229 0.602578 -0.712134\n-0.373570 0.561826 -0.759650 -0.382652 0.599189 -0.703243\n-0.388633 0.556389 -0.756087 -0.382652 0.599189 -0.703243\n-0.358476 0.660101 -0.684129 -0.382652 0.599189 -0.703243\n-0.186053 0.514356 -0.856209 -0.273715 0.531335 -0.801725\n-0.303435 0.449220 -0.859302 -0.273715 0.531335 -0.801725\n-0.178428 0.569161 -0.822490 -0.273715 0.531335 -0.801725\n-0.178428 0.569161 -0.822490 -0.159806 0.438059 -0.884628\n-0.303435 0.449220 -0.859302 -0.159806 0.438059 -0.884628\n-0.255459 0.532397 -0.826780 -0.159806 0.438059 -0.884628\n-0.303435 0.449220 -0.859302 -0.354623 0.510761 -0.783176\n-0.377742 0.421369 -0.843819 -0.354623 0.510761 -0.783176\n-0.255459 0.532397 -0.826780 -0.354623 0.510761 -0.783176\n-0.377742 0.421369 -0.843819 0.464620 -0.389697 -0.795150\n-0.316595 0.480766 -0.837199 0.464620 -0.389697 -0.795150\n-0.255459 0.532397 -0.826780 0.464620 -0.389697 -0.795150\n-0.255459 0.532397 -0.826780 -0.424135 0.632927 -0.647698\n-0.316595 0.480766 -0.837199 -0.424135 0.632927 -0.647698\n-0.216596 0.580516 -0.805207 -0.424135 0.632927 -0.647698\n-0.316595 0.480766 -0.837199 -0.330043 0.571764 -0.751104\n-0.340545 0.474980 -0.831080 -0.330043 0.571764 -0.751104\n-0.216596 0.580516 -0.805207 -0.330043 0.571764 -0.751104\n-0.216596 0.580516 -0.805207 -0.283849 0.529375 -0.799495\n-0.340545 0.474980 -0.831080 -0.283849 0.529375 -0.799495\n-0.317416 0.595884 -0.759237 -0.283849 0.529375 -0.799495\n-0.340545 0.474980 -0.831080 -0.314829 0.528648 -0.788298\n-0.373570 0.561826 -0.759650 -0.314829 0.528648 -0.788298\n-0.317416 0.595884 -0.759237 -0.314829 0.528648 -0.788298\n-0.197738 0.466113 -0.880857 -0.976473 0.208611 0.054611\n-0.217375 0.383261 -0.915495 -0.976473 0.208611 0.054611\n-0.186053 0.514356 -0.856209 -0.976473 0.208611 0.054611\n-0.186053 0.514356 -0.856209 -0.224404 0.445557 -0.866673\n-0.217375 0.383261 -0.915495 -0.224404 0.445557 -0.866673\n-0.303435 0.449220 -0.859302 -0.224404 0.445557 -0.866673\n-0.316595 0.480766 -0.837199 -0.320816 0.442054 -0.837655\n-0.346662 0.420645 -0.857411 -0.320816 0.442054 -0.837655\n-0.340545 0.474980 -0.831080 -0.320816 0.442054 -0.837655\n-0.340545 0.474980 -0.831080 -0.530396 0.409039 -0.742541\n-0.346248 0.411111 -0.862190 -0.530396 0.409039 -0.742541\n-0.373570 0.561826 -0.759650 -0.530396 0.409039 -0.742541\n-0.373570 0.561826 -0.759650 -0.362000 0.478611 -0.799929\n-0.346248 0.411111 -0.862190 -0.362000 0.478611 -0.799929\n-0.388633 0.556389 -0.756087 -0.362000 0.478611 -0.799929\n-0.346248 0.411111 -0.862190 0.439955 -0.442399 0.781487\n-0.378545 0.552802 -0.763796 0.439955 -0.442399 0.781487\n-0.388633 0.556389 -0.756087 0.439955 -0.442399 0.781487\n-0.204411 0.313630 -0.944523 -0.345131 0.305680 -0.887381\n-0.303435 0.449220 -0.859302 -0.345131 0.305680 -0.887381\n-0.217375 0.383261 -0.915495 -0.345131 0.305680 -0.887381\n-0.377742 0.421369 -0.843819 -0.157225 0.051954 0.986195\n-0.452738 0.322269 -0.850554 -0.157225 0.051954 0.986195\n-0.316595 0.480766 -0.837199 -0.157225 0.051954 0.986195\n-0.452738 0.322269 -0.850554 0.409326 -0.419849 0.810049\n-0.384944 0.332507 -0.879505 0.409326 -0.419849 0.810049\n-0.316595 0.480766 -0.837199 0.409326 -0.419849 0.810049\n-0.316595 0.480766 -0.837199 0.778493 -0.188017 -0.598831\n-0.384944 0.332507 -0.879505 0.778493 -0.188017 -0.598831\n-0.346662 0.420645 -0.857411 0.778493 -0.188017 -0.598831\n-0.346662 0.420645 -0.857411 0.094776 -0.442757 0.891618\n-0.346248 0.411111 -0.862190 0.094776 -0.442757 0.891618\n-0.340545 0.474980 -0.831080 0.094776 -0.442757 0.891618\n-0.346248 0.411111 -0.862190 0.315165 -0.491801 0.811667\n-0.341035 0.410719 -0.864452 0.315165 -0.491801 0.811667\n-0.378545 0.552802 -0.763796 0.315165 -0.491801 0.811667\n-0.378545 0.552802 -0.763796 -0.568906 0.370091 -0.734424\n-0.341035 0.410719 -0.864452 -0.568906 0.370091 -0.734424\n-0.419664 0.588694 -0.713858 -0.568906 0.370091 -0.734424\n-0.341035 0.410719 -0.864452 -0.352271 0.508947 -0.785415\n-0.392704 0.404882 -0.845059 -0.352271 0.508947 -0.785415\n-0.419664 0.588694 -0.713858 -0.352271 0.508947 -0.785415\n-0.123561 0.239228 -0.979680 -0.182428 0.250976 -0.950648\n-0.220899 0.200544 -0.971214 -0.182428 0.250976 -0.950648\n-0.204411 0.313630 -0.944523 -0.182428 0.250976 -0.950648\n-0.204411 0.313630 -0.944523 -0.394204 0.265163 -0.879939\n-0.220899 0.200544 -0.971214 -0.394204 0.265163 -0.879939\n-0.303435 0.449220 -0.859302 -0.394204 0.265163 -0.879939\n-0.220899 0.200544 -0.971214 -0.290149 0.310995 -0.905039\n-0.344116 0.179425 -0.938969 -0.290149 0.310995 -0.905039\n-0.303435 0.449220 -0.859302 -0.290149 0.310995 -0.905039\n-0.303435 0.449220 -0.859302 -0.304377 0.311687 -0.900115\n-0.344116 0.179425 -0.938969 -0.304377 0.311687 -0.900115\n-0.377742 0.421369 -0.843819 -0.304377 0.311687 -0.900115\n-0.344116 0.179425 -0.938969 -0.317755 0.308446 -0.896601\n-0.446139 0.261952 -0.874421 -0.317755 0.308446 -0.896601\n-0.377742 0.421369 -0.843819 -0.317755 0.308446 -0.896601\n-0.377742 0.421369 -0.843819 -0.335917 0.314552 -0.887816\n-0.446139 0.261952 -0.874421 -0.335917 0.314552 -0.887816\n-0.452738 0.322269 -0.850554 -0.335917 0.314552 -0.887816\n-0.384944 0.332507 -0.879505 0.335068 -0.363432 0.869279\n-0.368023 0.319124 -0.891622 0.335068 -0.363432 0.869279\n-0.346662 0.420645 -0.857411 0.335068 -0.363432 0.869279\n-0.346662 0.420645 -0.857411 0.504760 -0.369166 0.780342\n-0.368023 0.319124 -0.891622 0.504760 -0.369166 0.780342\n-0.346248 0.411111 -0.862190 0.504760 -0.369166 0.780342\n-0.346248 0.411111 -0.862190 0.348516 -0.359470 0.865632\n-0.368023 0.319124 -0.891622 0.348516 -0.359470 0.865632\n-0.341035 0.410719 -0.864452 0.348516 -0.359470 0.865632\n-0.368023 0.319124 -0.891622 0.382919 -0.364608 0.848784\n-0.344838 0.338816 -0.893623 0.382919 -0.364608 0.848784\n-0.341035 0.410719 -0.864452 0.382919 -0.364608 0.848784\n-0.344838 0.338816 -0.893623 -0.362929 0.366729 -0.856617\n-0.392704 0.404882 -0.845059 -0.362929 0.366729 -0.856617\n-0.341035 0.410719 -0.864452 -0.362929 0.366729 -0.856617\n-0.025736 0.174406 -1.000596 -0.132395 0.117747 -0.984178\n-0.220899 0.200544 -0.971214 -0.132395 0.117747 -0.984178\n-0.123561 0.239228 -0.979680 -0.132395 0.117747 -0.984178\n-0.446139 0.261952 -0.874421 0.139299 -0.351133 0.925906\n-0.428493 0.208645 -0.897292 0.139299 -0.351133 0.925906\n-0.452738 0.322269 -0.850554 0.139299 -0.351133 0.925906\n-0.452738 0.322269 -0.850554 0.412339 -0.269928 0.870124\n-0.428493 0.208645 -0.897292 0.412339 -0.269928 0.870124\n-0.384944 0.332507 -0.879505 0.412339 -0.269928 0.870124\n-0.428493 0.208645 -0.897292 0.356268 -0.254374 0.899092\n-0.425386 0.204045 -0.899824 0.356268 -0.254374 0.899092\n-0.384944 0.332507 -0.879505 0.356268 -0.254374 0.899092\n-0.384944 0.332507 -0.879505 0.412140 -0.267514 0.870963\n-0.425386 0.204045 -0.899824 0.412140 -0.267514 0.870963\n-0.368023 0.319124 -0.891622 0.412140 -0.267514 0.870963\n-0.425386 0.204045 -0.899824 -0.417947 0.270153 -0.867374\n-0.438150 0.203987 -0.893692 -0.417947 0.270153 -0.867374\n-0.368023 0.319124 -0.891622 -0.417947 0.270153 -0.867374\n-0.438150 0.203987 -0.893692 0.478150 -0.306028 0.823237\n-0.396806 0.243042 -0.903187 0.478150 -0.306028 0.823237\n-0.368023 0.319124 -0.891622 0.478150 -0.306028 0.823237\n-0.368023 0.319124 -0.891622 0.292816 -0.251021 0.922631\n-0.396806 0.243042 -0.903187 0.292816 -0.251021 0.922631\n-0.344838 0.338816 -0.893623 0.292816 -0.251021 0.922631\n-0.396806 0.243042 -0.903187 -0.425818 0.315730 -0.847935\n-0.417199 0.233581 -0.896469 -0.425818 0.315730 -0.847935\n-0.344838 0.338816 -0.893623 -0.425818 0.315730 -0.847935\n-0.344838 0.338816 -0.893623 -0.425330 0.315405 -0.848301\n-0.417199 0.233581 -0.896469 -0.425330 0.315405 -0.848301\n-0.392704 0.404882 -0.845059 -0.425330 0.315405 -0.848301\n-0.417199 0.233581 -0.896469 -0.480727 0.314403 -0.818567\n-0.521506 0.196044 -0.849629 -0.480727 0.314403 -0.818567\n-0.392704 0.404882 -0.845059 -0.480727 0.314403 -0.818567\n-0.392704 0.404882 -0.845059 -0.401796 0.266977 -0.875947\n-0.521506 0.196044 -0.849629 -0.401796 0.266977 -0.875947\n-0.508327 0.335896 -0.813049 -0.401796 0.266977 -0.875947\n-0.004869 0.086796 -1.012282 0.022194 0.137376 -0.990270\n-0.035844 0.126782 -1.007429 0.022194 0.137376 -0.990270\n-0.025736 0.174406 -1.000596 0.022194 0.137376 -0.990270\n-0.025736 0.174406 -1.000596 -0.124897 0.166841 -0.978041\n-0.035844 0.126782 -1.007429 -0.124897 0.166841 -0.978041\n-0.220899 0.200544 -0.971214 -0.124897 0.166841 -0.978041\n-0.035844 0.126782 -1.007429 -0.100351 0.224165 -0.969371\n-0.145945 0.113997 -0.998988 -0.100351 0.224165 -0.969371\n-0.220899 0.200544 -0.971214 -0.100351 0.224165 -0.969371\n-0.145945 0.113997 -0.998988 -0.202246 0.136068 -0.969836\n-0.268437 0.125055 -0.971892 -0.202246 0.136068 -0.969836\n-0.220899 0.200544 -0.971214 -0.202246 0.136068 -0.969836\n-0.220899 0.200544 -0.971214 -0.278206 0.183661 -0.942799\n-0.268437 0.125055 -0.971892 -0.278206 0.183661 -0.942799\n-0.344116 0.179425 -0.938969 -0.278206 0.183661 -0.942799\n-0.344116 0.179425 -0.938969 -0.412378 0.187489 -0.891512\n-0.406597 0.110956 -0.924467 -0.412378 0.187489 -0.891512\n-0.446139 0.261952 -0.874421 -0.412378 0.187489 -0.891512\n-0.446139 0.261952 -0.874421 0.815740 0.022053 0.577999\n-0.406597 0.110956 -0.924467 0.815740 0.022053 0.577999\n-0.428493 0.208645 -0.897292 0.815740 0.022053 0.577999\n-0.406597 0.110956 -0.924467 -0.384342 0.166459 -0.908060\n-0.438413 0.136151 -0.906382 -0.384342 0.166459 -0.908060\n-0.428493 0.208645 -0.897292 -0.384342 0.166459 -0.908060\n-0.428493 0.208645 -0.897292 0.456847 -0.171954 0.872767\n-0.438413 0.136151 -0.906382 0.456847 -0.171954 0.872767\n-0.425386 0.204045 -0.899824 0.456847 -0.171954 0.872767\n-0.438150 0.203987 -0.893692 -0.384757 0.187586 -0.903755\n-0.417199 0.233581 -0.896469 -0.384757 0.187586 -0.903755\n-0.396806 0.243042 -0.903187 -0.384757 0.187586 -0.903755\n-0.521506 0.196044 -0.849629 -0.621290 0.252563 -0.741762\n-0.714934 0.130027 -0.710095 -0.621290 0.252563 -0.741762\n-0.508327 0.335896 -0.813049 -0.621290 0.252563 -0.741762\n-0.145945 0.113997 -0.998988 -0.208194 0.081964 -0.974647\n-0.220359 0.010883 -0.991764 -0.208194 0.081964 -0.974647\n-0.268437 0.125055 -0.971892 -0.208194 0.081964 -0.974647\n-0.406597 0.110956 -0.924467 -0.441147 0.084255 -0.893471\n-0.490894 0.065481 -0.887134 -0.441147 0.084255 -0.893471\n-0.438413 0.136151 -0.906382 -0.441147 0.084255 -0.893471\n-0.438413 0.136151 -0.906382 -0.547077 0.183846 -0.816644\n-0.490894 0.065481 -0.887134 -0.547077 0.183846 -0.816644\n-0.425386 0.204045 -0.899824 -0.547077 0.183846 -0.816644\n-0.490894 0.065481 -0.887134 -0.496358 0.156455 -0.853903\n-0.531699 0.066595 -0.863211 -0.496358 0.156455 -0.853903\n-0.425386 0.204045 -0.899824 -0.496358 0.156455 -0.853903\n-0.425386 0.204045 -0.899824 -0.431460 0.094741 -0.897143\n-0.531699 0.066595 -0.863211 -0.431460 0.094741 -0.897143\n-0.438150 0.203987 -0.893692 -0.431460 0.094741 -0.897143\n-0.531699 0.066595 -0.863211 -0.415892 0.082245 -0.905687\n-0.531981 0.070486 -0.862728 -0.415892 0.082245 -0.905687\n-0.438150 0.203987 -0.893692 -0.415892 0.082245 -0.905687\n-0.438150 0.203987 -0.893692 -0.814472 0.579424 0.030062\n-0.531981 0.070486 -0.862728 -0.814472 0.579424 0.030062\n-0.417199 0.233581 -0.896469 -0.814472 0.579424 0.030062\n-0.531981 0.070486 -0.862728 -0.518667 0.192698 -0.832978\n-0.557421 0.073037 -0.846297 -0.518667 0.192698 -0.832978\n-0.417199 0.233581 -0.896469 -0.518667 0.192698 -0.832978\n-0.417199 0.233581 -0.896469 -0.438279 0.103782 -0.892828\n-0.557421 0.073037 -0.846297 -0.438279 0.103782 -0.892828\n-0.521506 0.196044 -0.849629 -0.438279 0.103782 -0.892828\n-0.521506 0.196044 -0.849629 -0.612578 0.157879 -0.774482\n-0.557421 0.073037 -0.846297 -0.612578 0.157879 -0.774482\n-0.714934 0.130027 -0.710095 -0.612578 0.157879 -0.774482\n-0.557421 0.073037 -0.846297 -0.629742 0.100415 -0.770287\n-0.715289 0.057591 -0.719247 -0.629742 0.100415 -0.770287\n-0.714934 0.130027 -0.710095 -0.629742 0.100415 -0.770287\n-0.715289 0.057591 -0.719247 -0.741471 0.087690 -0.665230\n-0.789314 0.049358 -0.637824 -0.741471 0.087690 -0.665230\n-0.714934 0.130027 -0.710095 -0.741471 0.087690 -0.665230\n-0.004869 0.086796 -1.012282 -0.092728 0.048865 -0.994492\n-0.044553 -0.033316 -1.014483 -0.092728 0.048865 -0.994492\n-0.035844 0.126782 -1.007429 -0.092728 0.048865 -0.994492\n-0.044553 -0.033316 -1.014483 -0.081932 0.048320 -0.995466\n-0.145945 0.113997 -0.998988 -0.081932 0.048320 -0.995466\n-0.035844 0.126782 -1.007429 -0.081932 0.048320 -0.995466\n-0.220359 0.010883 -0.991764 -0.318535 0.030759 -0.947412\n-0.364828 -0.068513 -0.945768 -0.318535 0.030759 -0.947412\n-0.268437 0.125055 -0.971892 -0.318535 0.030759 -0.947412\n-0.268437 0.125055 -0.971892 -0.364245 0.055922 -0.929623\n-0.364828 -0.068513 -0.945768 -0.364245 0.055922 -0.929623\n-0.344116 0.179425 -0.938969 -0.364245 0.055922 -0.929623\n-0.364828 -0.068513 -0.945768 -0.338349 0.054029 -0.939468\n-0.446915 -0.002888 -0.912431 -0.338349 0.054029 -0.939468\n-0.344116 0.179425 -0.938969 -0.338349 0.054029 -0.939468\n-0.344116 0.179425 -0.938969 -0.186493 -0.037748 -0.981731\n-0.446915 -0.002888 -0.912431 -0.186493 -0.037748 -0.981731\n-0.406597 0.110956 -0.924467 -0.186493 -0.037748 -0.981731\n-0.406597 0.110956 -0.924467 -0.429804 0.056943 -0.901125\n-0.446915 -0.002888 -0.912431 -0.429804 0.056943 -0.901125\n-0.490894 0.065481 -0.887134 -0.429804 0.056943 -0.901125\n-0.446915 -0.002888 -0.912431 -0.477083 0.018222 -0.878669\n-0.525614 0.010809 -0.869416 -0.477083 0.018222 -0.878669\n-0.490894 0.065481 -0.887134 -0.477083 0.018222 -0.878669\n-0.490894 0.065481 -0.887134 -0.504514 0.040905 -0.862434\n-0.525614 0.010809 -0.869416 -0.504514 0.040905 -0.862434\n-0.531699 0.066595 -0.863211 -0.504514 0.040905 -0.862434\n-0.531699 0.066595 -0.863211 -0.328972 -0.139776 0.933938\n-0.525614 0.010809 -0.869416 -0.328972 -0.139776 0.933938\n-0.531981 0.070486 -0.862728 -0.328972 -0.139776 0.933938\n-0.525614 0.010809 -0.869416 -0.564441 0.032223 -0.824844\n-0.545682 -0.018548 -0.856830 -0.564441 0.032223 -0.824844\n-0.531981 0.070486 -0.862728 -0.564441 0.032223 -0.824844\n-0.531981 0.070486 -0.862728 -0.540394 0.027455 -0.840964\n-0.545682 -0.018548 -0.856830 -0.540394 0.027455 -0.840964\n-0.557421 0.073037 -0.846297 -0.540394 0.027455 -0.840964\n-0.545682 -0.018548 -0.856830 -0.559260 0.023622 -0.828656\n-0.596884 -0.012405 -0.822099 -0.559260 0.023622 -0.828656\n-0.557421 0.073037 -0.846297 -0.559260 0.023622 -0.828656\n-0.596884 -0.012405 -0.822099 -0.629601 0.071703 -0.773603\n-0.715289 0.057591 -0.719247 -0.629601 0.071703 -0.773603\n-0.557421 0.073037 -0.846297 -0.629601 0.071703 -0.773603\n-0.715289 0.057591 -0.719247 -0.739379 -0.010087 -0.673214\n-0.746706 -0.094588 -0.682463 -0.739379 -0.010087 -0.673214\n-0.789314 0.049358 -0.637824 -0.739379 -0.010087 -0.673214\n-0.596884 -0.012405 -0.822099 -0.657337 -0.004634 -0.753582\n-0.643066 -0.090864 -0.781333 -0.657337 -0.004634 -0.753582\n-0.715289 0.057591 -0.719247 -0.657337 -0.004634 -0.753582\n-0.446915 -0.002888 -0.912431 -0.484566 -0.039929 -0.873843\n-0.437055 -0.057031 -0.915424 -0.484566 -0.039929 -0.873843\n-0.525614 0.010809 -0.869416 -0.484566 -0.039929 -0.873843\n-0.145945 0.113997 -0.998988 -0.100079 0.002517 -0.994976\n-0.130034 -0.114152 -1.001165 -0.100079 0.002517 -0.994976\n-0.220359 0.010883 -0.991764 -0.100079 0.002517 -0.994976\n-0.789314 0.049358 -0.637824 -0.807432 -0.056902 -0.587210\n-0.746706 -0.094588 -0.682463 -0.807432 -0.056902 -0.587210\n-0.882164 -0.080559 -0.497563 -0.807432 -0.056902 -0.587210\n-0.715289 0.057591 -0.719247 -0.689280 -0.032647 -0.723759\n-0.643066 -0.090864 -0.781333 -0.689280 -0.032647 -0.723759\n-0.746706 -0.094588 -0.682463 -0.689280 -0.032647 -0.723759\n-0.643066 -0.090864 -0.781333 -0.679469 -0.151259 -0.717943\n-0.637820 -0.226596 -0.757701 -0.679469 -0.151259 -0.717943\n-0.746706 -0.094588 -0.682463 -0.679469 -0.151259 -0.717943\n-0.746706 -0.094588 -0.682463 -0.687828 -0.164382 -0.707015\n-0.637820 -0.226596 -0.757701 -0.687828 -0.164382 -0.707015\n-0.752175 -0.205605 -0.651330 -0.687828 -0.164382 -0.707015\n-0.545682 -0.018548 -0.856830 -0.566497 -0.091419 -0.818977\n-0.521262 -0.150848 -0.858954 -0.566497 -0.091419 -0.818977\n-0.596884 -0.012405 -0.822099 -0.566497 -0.091419 -0.818977\n-0.596884 -0.012405 -0.822099 -0.566877 -0.091705 -0.818682\n-0.521262 -0.150848 -0.858954 -0.566877 -0.091705 -0.818682\n-0.643066 -0.090864 -0.781333 -0.566877 -0.091705 -0.818682\n-0.643066 -0.090864 -0.781333 -0.585562 -0.160956 -0.794488\n-0.521262 -0.150848 -0.858954 -0.585562 -0.160956 -0.794488\n-0.637820 -0.226596 -0.757701 -0.585562 -0.160956 -0.794488\n-0.637820 -0.226596 -0.757701 -0.683322 -0.254141 -0.684458\n-0.637510 -0.322334 -0.722463 -0.683322 -0.254141 -0.684458\n-0.752175 -0.205605 -0.651330 -0.683322 -0.254141 -0.684458\n-0.525614 0.010809 -0.869416 -0.476149 -0.050876 -0.877891\n-0.466886 -0.128358 -0.893204 -0.476149 -0.050876 -0.877891\n-0.545682 -0.018548 -0.856830 -0.476149 -0.050876 -0.877891\n-0.545682 -0.018548 -0.856830 -0.507392 -0.079883 -0.858005\n-0.466886 -0.128358 -0.893204 -0.507392 -0.079883 -0.858005\n-0.521262 -0.150848 -0.858954 -0.507392 -0.079883 -0.858005\n-0.466886 -0.128358 -0.893204 -0.464832 -0.192312 -0.864261\n-0.499718 -0.251116 -0.848230 -0.464832 -0.192312 -0.864261\n-0.521262 -0.150848 -0.858954 -0.464832 -0.192312 -0.864261\n-0.521262 -0.150848 -0.858954 -0.561794 -0.206393 -0.801118\n-0.499718 -0.251116 -0.848230 -0.561794 -0.206393 -0.801118\n-0.637820 -0.226596 -0.757701 -0.561794 -0.206393 -0.801118\n-0.499718 -0.251116 -0.848230 -0.560256 -0.287711 -0.776747\n-0.637510 -0.322334 -0.722463 -0.560256 -0.287711 -0.776747\n-0.637820 -0.226596 -0.757701 -0.560256 -0.287711 -0.776747\n-0.525614 0.010809 -0.869416 -0.497000 -0.061785 -0.865548\n-0.437055 -0.057031 -0.915424 -0.497000 -0.061785 -0.865548\n-0.466886 -0.128358 -0.893204 -0.497000 -0.061785 -0.865548\n-0.437055 -0.057031 -0.915424 -0.420167 -0.105069 -0.901344\n-0.407620 -0.153652 -0.917883 -0.420167 -0.105069 -0.901344\n-0.466886 -0.128358 -0.893204 -0.420167 -0.105069 -0.901344\n-0.466886 -0.128358 -0.893204 -0.448019 -0.199458 -0.871490\n-0.407620 -0.153652 -0.917883 -0.448019 -0.199458 -0.871490\n-0.499718 -0.251116 -0.848230 -0.448019 -0.199458 -0.871490\n-0.407620 -0.153652 -0.917883 -0.445531 -0.202258 -0.872120\n-0.397014 -0.254920 -0.899815 -0.445531 -0.202258 -0.872120\n-0.499718 -0.251116 -0.848230 -0.445531 -0.202258 -0.872120\n-0.397014 -0.254920 -0.899815 -0.439268 -0.278774 -0.854007\n-0.467140 -0.336959 -0.836965 -0.439268 -0.278774 -0.854007\n-0.499718 -0.251116 -0.848230 -0.439268 -0.278774 -0.854007\n-0.499718 -0.251116 -0.848230 -0.548506 -0.310064 -0.776532\n-0.467140 -0.336959 -0.836965 -0.548506 -0.310064 -0.776532\n-0.637510 -0.322334 -0.722463 -0.548506 -0.310064 -0.776532\n-0.467140 -0.336959 -0.836965 -0.528724 -0.430078 -0.731768\n-0.624776 -0.494070 -0.630730 -0.528724 -0.430078 -0.731768\n-0.637510 -0.322334 -0.722463 -0.528724 -0.430078 -0.731768\n-0.437055 -0.057031 -0.915424 -0.361041 -0.086365 -0.928542\n-0.319554 -0.153700 -0.952120 -0.361041 -0.086365 -0.928542\n-0.407620 -0.153652 -0.917883 -0.361041 -0.086365 -0.928542\n-0.319554 -0.153700 -0.952120 -0.357262 -0.168334 -0.918710\n-0.324479 -0.202525 -0.941259 -0.357262 -0.168334 -0.918710\n-0.407620 -0.153652 -0.917883 -0.357262 -0.168334 -0.918710\n-0.324479 -0.202525 -0.941259 -0.372698 -0.200674 -0.905994\n-0.397014 -0.254920 -0.899815 -0.372698 -0.200674 -0.905994\n-0.407620 -0.153652 -0.917883 -0.372698 -0.200674 -0.905994\n-0.467140 -0.336959 -0.836965 -0.598424 -0.347306 -0.721988\n-0.459703 -0.409790 -0.808094 -0.598424 -0.347306 -0.721988\n-0.624776 -0.494070 -0.630730 -0.598424 -0.347306 -0.721988\n-0.446915 -0.002888 -0.912431 -0.389966 -0.020117 -0.920610\n-0.364828 -0.068513 -0.945768 -0.389966 -0.020117 -0.920610\n-0.437055 -0.057031 -0.915424 -0.389966 -0.020117 -0.920610\n-0.364828 -0.068513 -0.945768 -0.402874 -0.146752 -0.903414\n-0.319554 -0.153700 -0.952120 -0.402874 -0.146752 -0.903414\n-0.437055 -0.057031 -0.915424 -0.402874 -0.146752 -0.903414\n-0.319554 -0.153700 -0.952120 -0.271179 -0.182865 -0.944998\n-0.230225 -0.216635 -0.965576 -0.271179 -0.182865 -0.944998\n-0.324479 -0.202525 -0.941259 -0.271179 -0.182865 -0.944998\n-0.324479 -0.202525 -0.941259 -0.281550 -0.324500 -0.903011\n-0.230225 -0.216635 -0.965576 -0.281550 -0.324500 -0.903011\n-0.397014 -0.254920 -0.899815 -0.281550 -0.324500 -0.903011\n-0.230225 -0.216635 -0.965576 -0.305049 -0.249644 -0.919033\n-0.292425 -0.342523 -0.910735 -0.305049 -0.249644 -0.919033\n-0.397014 -0.254920 -0.899815 -0.305049 -0.249644 -0.919033\n-0.397014 -0.254920 -0.899815 -0.374952 -0.340165 -0.862380\n-0.292425 -0.342523 -0.910735 -0.374952 -0.340165 -0.862380\n-0.467140 -0.336959 -0.836965 -0.374952 -0.340165 -0.862380\n-0.467140 -0.336959 -0.836965 -0.370736 -0.374718 -0.849789\n-0.292425 -0.342523 -0.910735 -0.370736 -0.374718 -0.849789\n-0.459703 -0.409790 -0.808094 -0.370736 -0.374718 -0.849789\n-0.292425 -0.342523 -0.910735 -0.352115 -0.408962 -0.841882\n-0.372764 -0.509826 -0.795861 -0.352115 -0.408962 -0.841882\n-0.459703 -0.409790 -0.808094 -0.352115 -0.408962 -0.841882\n-0.459703 -0.409790 -0.808094 -0.492424 -0.513856 -0.702475\n-0.372764 -0.509826 -0.795861 -0.492424 -0.513856 -0.702475\n-0.624776 -0.494070 -0.630730 -0.492424 -0.513856 -0.702475\n-0.372764 -0.509826 -0.795861 -0.510476 -0.443421 -0.736744\n-0.535393 -0.575864 -0.643433 -0.510476 -0.443421 -0.736744\n-0.624776 -0.494070 -0.630730 -0.510476 -0.443421 -0.736744\n-0.364828 -0.068513 -0.945768 -0.295812 -0.086279 -0.951342\n-0.243326 -0.126645 -0.978276 -0.295812 -0.086279 -0.951342\n-0.319554 -0.153700 -0.952120 -0.295812 -0.086279 -0.951342\n-0.243326 -0.126645 -0.978276 -0.241165 -0.231639 -0.942435\n-0.136610 -0.248189 -0.975711 -0.241165 -0.231639 -0.942435\n-0.319554 -0.153700 -0.952120 -0.241165 -0.231639 -0.942435\n-0.319554 -0.153700 -0.952120 -0.068776 0.114272 -0.991066\n-0.136610 -0.248189 -0.975711 -0.068776 0.114272 -0.991066\n-0.230225 -0.216635 -0.965576 -0.068776 0.114272 -0.991066\n-0.136610 -0.248189 -0.975711 -0.195727 -0.278700 -0.940222\n-0.143744 -0.332569 -0.949214 -0.195727 -0.278700 -0.940222\n-0.230225 -0.216635 -0.965576 -0.195727 -0.278700 -0.940222\n-0.230225 -0.216635 -0.965576 -0.220727 -0.295820 -0.929392\n-0.143744 -0.332569 -0.949214 -0.220727 -0.295820 -0.929392\n-0.292425 -0.342523 -0.910735 -0.220727 -0.295820 -0.929392\n-0.143744 -0.332569 -0.949214 -0.213064 -0.347500 -0.913152\n-0.178348 -0.418914 -0.908281 -0.213064 -0.347500 -0.913152\n-0.292425 -0.342523 -0.910735 -0.213064 -0.347500 -0.913152\n-0.292425 -0.342523 -0.910735 -0.281487 -0.447608 -0.848771\n-0.178348 -0.418914 -0.908281 -0.281487 -0.447608 -0.848771\n-0.372764 -0.509826 -0.795861 -0.281487 -0.447608 -0.848771\n-0.178348 -0.418914 -0.908281 -0.260072 -0.479928 -0.837873\n-0.202236 -0.584758 -0.805872 -0.260072 -0.479928 -0.837873\n-0.372764 -0.509826 -0.795861 -0.260072 -0.479928 -0.837873\n-0.372764 -0.509826 -0.795861 -0.336486 -0.678533 -0.652970\n-0.202236 -0.584758 -0.805872 -0.336486 -0.678533 -0.652970\n-0.535393 -0.575864 -0.643433 -0.336486 -0.678533 -0.652970\n-0.202236 -0.584758 -0.805872 -0.403615 -0.436891 -0.803879\n-0.469722 -0.622959 -0.650810 -0.403615 -0.436891 -0.803879\n-0.535393 -0.575864 -0.643433 -0.403615 -0.436891 -0.803879\n-0.220359 0.010883 -0.991764 -0.279276 -0.047411 -0.959040\n-0.243326 -0.126645 -0.978276 -0.279276 -0.047411 -0.959040\n-0.364828 -0.068513 -0.945768 -0.279276 -0.047411 -0.959040\n-0.243326 -0.126645 -0.978276 -0.141990 -0.145338 -0.979140\n-0.068785 -0.217019 -0.990173 -0.141990 -0.145338 -0.979140\n-0.136610 -0.248189 -0.975711 -0.141990 -0.145338 -0.979140\n-0.136610 -0.248189 -0.975711 -0.048106 -0.295544 -0.954117\n0.044191 -0.340470 -0.956242 -0.048106 -0.295544 -0.954117\n-0.143744 -0.332569 -0.949214 -0.048106 -0.295544 -0.954117\n0.044191 -0.340470 -0.956242 -0.051324 -0.411280 -0.910063\n0.075375 -0.415034 -0.924303 -0.051324 -0.411280 -0.910063\n-0.143744 -0.332569 -0.949214 -0.051324 -0.411280 -0.910063\n-0.143744 -0.332569 -0.949214 -0.051194 -0.410977 -0.910207\n0.075375 -0.415034 -0.924303 -0.051194 -0.410977 -0.910207\n-0.178348 -0.418914 -0.908281 -0.051194 -0.410977 -0.910207\n0.075375 -0.415034 -0.924303 -0.050143 -0.434524 -0.899263\n-0.003985 -0.547442 -0.855899 -0.050143 -0.434524 -0.899263\n-0.178348 -0.418914 -0.908281 -0.050143 -0.434524 -0.899263\n-0.178348 -0.418914 -0.908281 -0.119248 -0.509162 -0.852369\n-0.003985 -0.547442 -0.855899 -0.119248 -0.509162 -0.852369\n-0.202236 -0.584758 -0.805872 -0.119248 -0.509162 -0.852369\n-0.003985 -0.547442 -0.855899 -0.076895 -0.628792 -0.773762\n0.054944 -0.664168 -0.766899 -0.076895 -0.628792 -0.773762\n-0.202236 -0.584758 -0.805872 -0.076895 -0.628792 -0.773762\n0.054944 -0.664168 -0.766899 -0.180092 -0.836920 -0.516848\n-0.469722 -0.622959 -0.650810 -0.180092 -0.836920 -0.516848\n-0.202236 -0.584758 -0.805872 -0.180092 -0.836920 -0.516848\n-0.220359 0.010883 -0.991764 -0.190817 -0.064193 -0.979525\n-0.130034 -0.114152 -1.001165 -0.190817 -0.064193 -0.979525\n-0.243326 -0.126645 -0.978276 -0.190817 -0.064193 -0.979525\n-0.130034 -0.114152 -1.001165 -0.172003 -0.205366 -0.963452\n-0.068785 -0.217019 -0.990173 -0.172003 -0.205366 -0.963452\n-0.243326 -0.126645 -0.978276 -0.172003 -0.205366 -0.963452\n-0.068785 -0.217019 -0.990173 -0.057989 -0.313573 -0.947792\n0.044191 -0.340470 -0.956242 -0.057989 -0.313573 -0.947792\n-0.136610 -0.248189 -0.975711 -0.057989 -0.313573 -0.947792\n0.075375 -0.415034 -0.924303 0.068594 -0.490050 -0.868991\n0.153992 -0.525609 -0.855741 0.068594 -0.490050 -0.868991\n-0.003985 -0.547442 -0.855899 0.068594 -0.490050 -0.868991\n0.153992 -0.525609 -0.855741 0.084750 -0.607519 -0.789771\n0.197388 -0.651304 -0.754396 0.084750 -0.607519 -0.789771\n-0.003985 -0.547442 -0.855899 0.084750 -0.607519 -0.789771\n-0.003985 -0.547442 -0.855899 0.122552 -0.561894 -0.818081\n0.197388 -0.651304 -0.754396 0.122552 -0.561894 -0.818081\n0.054944 -0.664168 -0.766899 0.122552 -0.561894 -0.818081\n0.054944 -0.664168 -0.766899 -0.212663 -0.648434 -0.730963\n0.047067 -0.721829 -0.713456 -0.212663 -0.648434 -0.730963\n-0.469722 -0.622959 -0.650810 -0.212663 -0.648434 -0.730963\n-0.469722 -0.622959 -0.650810 -0.167621 -0.276586 -0.946257\n0.047067 -0.721829 -0.713456 -0.167621 -0.276586 -0.946257\n-0.370008 -0.688221 -0.649398 -0.167621 -0.276586 -0.946257\n0.047067 -0.721829 -0.713456 -0.170370 -0.525498 -0.833562\n-0.256629 -0.753447 -0.631451 -0.170370 -0.525498 -0.833562\n-0.370008 -0.688221 -0.649398 -0.170370 -0.525498 -0.833562\n-0.145945 0.113997 -0.998988 -0.152814 -0.001225 -0.988254\n-0.044553 -0.033316 -1.014483 -0.152814 -0.001225 -0.988254\n-0.130034 -0.114152 -1.001165 -0.152814 -0.001225 -0.988254\n-0.044553 -0.033316 -1.014483 -0.032686 -0.128731 -0.991141\n-0.009616 -0.224949 -0.990746 -0.032686 -0.128731 -0.991141\n-0.130034 -0.114152 -1.001165 -0.032686 -0.128731 -0.991141\n-0.130034 -0.114152 -1.001165 -0.025879 -0.121439 -0.992262\n-0.009616 -0.224949 -0.990746 -0.025879 -0.121439 -0.992262\n-0.068785 -0.217019 -0.990173 -0.025879 -0.121439 -0.992262\n-0.068785 -0.217019 -0.990173 0.085900 -0.190192 -0.977982\n0.078565 -0.345372 -0.952269 0.085900 -0.190192 -0.977982\n0.044191 -0.340470 -0.956242 0.085900 -0.190192 -0.977982\n0.078565 -0.345372 -0.952269 0.050847 -0.388914 -0.919870\n0.108087 -0.409509 -0.923521 0.050847 -0.388914 -0.919870\n0.044191 -0.340470 -0.956242 0.050847 -0.388914 -0.919870\n0.044191 -0.340470 -0.956242 0.083458 -0.362668 -0.928174\n0.108087 -0.409509 -0.923521 0.083458 -0.362668 -0.928174\n0.075375 -0.415034 -0.924303 0.083458 -0.362668 -0.928174\n0.108087 -0.409509 -0.923521 0.102007 -0.480585 -0.870995\n0.181978 -0.515732 -0.856257 0.102007 -0.480585 -0.870995\n0.075375 -0.415034 -0.924303 0.102007 -0.480585 -0.870995\n0.075375 -0.415034 -0.924303 0.141501 -0.447053 -0.883245\n0.181978 -0.515732 -0.856257 0.141501 -0.447053 -0.883245\n0.153992 -0.525609 -0.855741 0.141501 -0.447053 -0.883245\n0.181978 -0.515732 -0.856257 0.174974 -0.538806 -0.824058\n0.213548 -0.537392 -0.835391 0.174974 -0.538806 -0.824058\n0.153992 -0.525609 -0.855741 0.174974 -0.538806 -0.824058\n0.213548 -0.537392 -0.835391 0.153858 -0.590532 -0.792211\n0.244596 -0.592355 -0.788390 0.153858 -0.590532 -0.792211\n0.153992 -0.525609 -0.855741 0.153858 -0.590532 -0.792211\n0.153992 -0.525609 -0.855741 0.159201 -0.585775 -0.794684\n0.244596 -0.592355 -0.788390 0.159201 -0.585775 -0.794684\n0.197388 -0.651304 -0.754396 0.159201 -0.585775 -0.794684\n0.197388 -0.651304 -0.754396 0.124855 -0.683574 -0.719123\n0.047067 -0.721829 -0.713456 0.124855 -0.683574 -0.719123\n0.054944 -0.664168 -0.766899 0.124855 -0.683574 -0.719123\n0.047067 -0.721829 -0.713456 -0.126842 -0.672585 -0.729069\n0.010989 -0.770083 -0.662663 -0.126842 -0.672585 -0.729069\n-0.256629 -0.753447 -0.631451 -0.126842 -0.672585 -0.729069\n0.010989 -0.770083 -0.662663 -0.126198 -0.686422 -0.716170\n-0.128843 -0.809688 -0.600064 -0.126198 -0.686422 -0.716170\n-0.256629 -0.753447 -0.631451 -0.126198 -0.686422 -0.716170\n-0.044553 -0.033316 -1.014483 -0.130034 -0.145201 -0.980820\n0.007139 -0.109345 -1.010081 -0.130034 -0.145201 -0.980820\n-0.009616 -0.224949 -0.990746 -0.130034 -0.145201 -0.980820\n-0.009616 -0.224949 -0.990746 -0.054652 -0.339988 -0.938840\n0.078565 -0.345372 -0.952269 -0.054652 -0.339988 -0.938840\n-0.068785 -0.217019 -0.990173 -0.054652 -0.339988 -0.938840\n0.181978 -0.515732 -0.856257 -0.094830 0.615498 0.782413\n0.244596 -0.592355 -0.788390 -0.094830 0.615498 0.782413\n0.213548 -0.537392 -0.835391 -0.094830 0.615498 0.782413\n0.244596 -0.592355 -0.788390 -0.288113 0.640995 0.711418\n0.200569 -0.641866 -0.761611 -0.288113 0.640995 0.711418\n0.197388 -0.651304 -0.754396 -0.288113 0.640995 0.711418\n0.200569 -0.641866 -0.761611 -0.118145 0.627927 0.769253\n0.121638 -0.699967 -0.726307 -0.118145 0.627927 0.769253\n0.197388 -0.651304 -0.754396 -0.118145 0.627927 0.769253\n0.197388 -0.651304 -0.754396 -0.004978 -0.494079 -0.869403\n0.121638 -0.699967 -0.726307 -0.004978 -0.494079 -0.869403\n0.047067 -0.721829 -0.713456 -0.004978 -0.494079 -0.869403\n0.121638 -0.699967 -0.726307 0.111944 -0.758925 -0.641484\n0.010989 -0.770083 -0.662663 0.111944 -0.758925 -0.641484\n0.047067 -0.721829 -0.713456 0.111944 -0.758925 -0.641484\n0.007139 -0.109345 -1.010081 0.006710 -0.165907 -0.986119\n0.065222 -0.155812 -1.001868 0.006710 -0.165907 -0.986119\n-0.009616 -0.224949 -0.990746 0.006710 -0.165907 -0.986119\n0.065222 -0.155812 -1.001868 0.039506 -0.200253 -0.978947\n0.092197 -0.217595 -0.988141 0.039506 -0.200253 -0.978947\n-0.009616 -0.224949 -0.990746 0.039506 -0.200253 -0.978947\n0.092197 -0.217595 -0.988141 0.044629 -0.278065 -0.959525\n0.126120 -0.284199 -0.967262 0.044629 -0.278065 -0.959525\n-0.009616 -0.224949 -0.990746 0.044629 -0.278065 -0.959525\n-0.009616 -0.224949 -0.990746 0.047377 -0.272365 -0.961027\n0.126120 -0.284199 -0.967262 0.047377 -0.272365 -0.961027\n0.078565 -0.345372 -0.952269 0.047377 -0.272365 -0.961027\n0.126120 -0.284199 -0.967262 0.178969 -0.363223 -0.914352\n0.168090 -0.467737 -0.886137 0.178969 -0.363223 -0.914352\n0.078565 -0.345372 -0.952269 0.178969 -0.363223 -0.914352\n0.078565 -0.345372 -0.952269 0.310167 -0.266302 -0.912623\n0.168090 -0.467737 -0.886137 0.310167 -0.266302 -0.912623\n0.108087 -0.409509 -0.923521 0.310167 -0.266302 -0.912623\n0.168090 -0.467737 -0.886137 0.073668 -0.483928 -0.872001\n0.159459 -0.525437 -0.854845 0.073668 -0.483928 -0.872001\n0.108087 -0.409509 -0.923521 0.073668 -0.483928 -0.872001\n0.108087 -0.409509 -0.923521 -0.141990 0.457185 0.877964\n0.159459 -0.525437 -0.854845 -0.141990 0.457185 0.877964\n0.181978 -0.515732 -0.856257 -0.141990 0.457185 0.877964\n0.159459 -0.525437 -0.854845 -0.189886 0.558100 0.807755\n0.182957 -0.618482 -0.785034 -0.189886 0.558100 0.807755\n0.181978 -0.515732 -0.856257 -0.189886 0.558100 0.807755\n0.181978 -0.515732 -0.856257 -0.192467 0.557797 0.807353\n0.182957 -0.618482 -0.785034 -0.192467 0.557797 0.807353\n0.244596 -0.592355 -0.788390 -0.192467 0.557797 0.807353\n0.244596 -0.592355 -0.788390 -0.214959 0.605576 0.766205\n0.182957 -0.618482 -0.785034 -0.214959 0.605576 0.766205\n0.200569 -0.641866 -0.761611 -0.214959 0.605576 0.766205\n0.182957 -0.618482 -0.785034 -0.140002 0.646103 0.750300\n0.121638 -0.699967 -0.726307 -0.140002 0.646103 0.750300\n0.200569 -0.641866 -0.761611 -0.140002 0.646103 0.750300\n0.121638 -0.699967 -0.726307 -0.238991 0.831837 0.500929\n0.097847 -0.711278 -0.718875 -0.238991 0.831837 0.500929\n0.010989 -0.770083 -0.662663 -0.238991 0.831837 0.500929\n0.097847 -0.711278 -0.718875 0.047621 -0.726062 -0.685979\n0.029458 -0.776285 -0.654817 0.047621 -0.726062 -0.685979\n0.010989 -0.770083 -0.662663 0.047621 -0.726062 -0.685979\n0.010989 -0.770083 -0.662663 -0.054294 -0.784575 -0.617652\n-0.030558 -0.842564 -0.566942 -0.054294 -0.784575 -0.617652\n-0.128843 -0.809688 -0.600064 -0.054294 -0.784575 -0.617652\n0.126120 -0.284199 -0.967262 0.073442 -0.389086 -0.918269\n0.184220 -0.331515 -0.942567 0.073442 -0.389086 -0.918269\n0.168090 -0.467737 -0.886137 0.073442 -0.389086 -0.918269\n0.184220 -0.331515 -0.942567 0.171046 -0.394288 -0.902929\n0.243022 -0.415256 -0.894860 0.171046 -0.394288 -0.902929\n0.168090 -0.467737 -0.886137 0.171046 -0.394288 -0.902929\n0.159459 -0.525437 -0.854845 -0.067298 0.587861 0.806158\n0.168314 -0.643535 -0.767987 -0.067298 0.587861 0.806158\n0.182957 -0.618482 -0.785034 -0.067298 0.587861 0.806158\n0.182957 -0.618482 -0.785034 -0.206380 -0.465122 -0.860853\n0.168314 -0.643535 -0.767987 -0.206380 -0.465122 -0.860853\n0.121638 -0.699967 -0.726307 -0.206380 -0.465122 -0.860853\n0.168314 -0.643535 -0.767987 -0.050033 0.619816 0.783151\n0.097847 -0.711278 -0.718875 -0.050033 0.619816 0.783151\n0.121638 -0.699967 -0.726307 -0.050033 0.619816 0.783151\n0.029458 -0.776285 -0.654817 -0.009471 -0.795215 -0.606254\n-0.030558 -0.842564 -0.566942 -0.009471 -0.795215 -0.606254\n0.010989 -0.770083 -0.662663 -0.009471 -0.795215 -0.606254\n0.872029 0.325646 -0.407174 0.826064 0.368224 -0.426649\n0.837101 0.325339 -0.475066 0.826064 0.368224 -0.426649\n0.838264 0.421274 -0.390018 0.826064 0.368224 -0.426649\n0.868951 0.225921 -0.475557 0.854215 0.275839 -0.440714\n0.837101 0.325339 -0.475066 0.854215 0.275839 -0.440714\n0.872029 0.325646 -0.407174 0.854215 0.275839 -0.440714\n0.866826 0.194655 -0.492943 0.834261 0.223563 -0.504012\n0.824034 0.233158 -0.546696 0.834261 0.223563 -0.504012\n0.868951 0.225921 -0.475557 0.834261 0.223563 -0.504012\n0.715495 -0.051622 -0.719495 0.774541 0.003128 -0.632516\n0.715463 0.058641 -0.718989 0.774541 0.003128 -0.632516\n0.778570 0.121257 -0.641403 0.774541 0.003128 -0.632516\n0.676359 -0.110402 -0.750081 0.670892 -0.062183 -0.738943\n0.650729 -0.040915 -0.779198 0.670892 -0.062183 -0.738943\n0.715495 -0.051622 -0.719495 0.670892 -0.062183 -0.738943\n0.791233 -0.266567 -0.578933 0.783773 -0.095923 -0.613594\n0.684033 -0.179612 -0.729458 0.783773 -0.095923 -0.613594\n0.676359 -0.110402 -0.750081 0.783773 -0.095923 -0.613594\n0.736990 -0.494062 -0.494994 0.707365 -0.464942 -0.532413\n0.679828 -0.491484 -0.573192 0.707365 -0.464942 -0.532413\n0.751968 -0.431328 -0.529879 0.707365 -0.464942 -0.532413\n0.720437 -0.549459 -0.459714 0.676938 -0.528524 -0.512267\n0.679828 -0.491484 -0.573192 0.676938 -0.528524 -0.512267\n0.736990 -0.494062 -0.494994 0.676938 -0.528524 -0.512267\n0.838264 0.421274 -0.390018 0.820639 0.373483 -0.432507\n0.837101 0.325339 -0.475066 0.820639 0.373483 -0.432507\n0.806133 0.438088 -0.436463 0.820639 0.373483 -0.432507\n0.837101 0.325339 -0.475066 0.790191 0.381310 -0.479793\n0.782322 0.350170 -0.545550 0.790191 0.381310 -0.479793\n0.806133 0.438088 -0.436463 0.790191 0.381310 -0.479793\n0.868951 0.225921 -0.475557 0.826826 0.267332 -0.494866\n0.824034 0.233158 -0.546696 0.826826 0.267332 -0.494866\n0.837101 0.325339 -0.475066 0.826826 0.267332 -0.494866\n0.837101 0.325339 -0.475066 0.802360 0.291125 -0.521023\n0.824034 0.233158 -0.546696 0.802360 0.291125 -0.521023\n0.782322 0.350170 -0.545550 0.802360 0.291125 -0.521023\n0.824034 0.233158 -0.546696 0.731512 0.266911 -0.627414\n0.658817 0.351373 -0.689035 0.731512 0.266911 -0.627414\n0.782322 0.350170 -0.545550 0.731512 0.266911 -0.627414\n0.782322 0.350170 -0.545550 0.703175 0.378195 -0.602091\n0.658817 0.351373 -0.689035 0.703175 0.378195 -0.602091\n0.650027 0.459125 -0.631617 0.703175 0.378195 -0.602091\n0.658817 0.351373 -0.689035 0.604644 0.412422 -0.681406\n0.562680 0.393057 -0.749112 0.604644 0.412422 -0.681406\n0.650027 0.459125 -0.631617 0.604644 0.412422 -0.681406\n0.824034 0.233158 -0.546696 0.737997 0.309273 -0.599759\n0.702970 0.233982 -0.695239 0.737997 0.309273 -0.599759\n0.658817 0.351373 -0.689035 0.737997 0.309273 -0.599759\n0.866826 0.194655 -0.492943 0.820387 0.136615 -0.555249\n0.778570 0.121257 -0.641403 0.820387 0.136615 -0.555249\n0.824034 0.233158 -0.546696 0.820387 0.136615 -0.555249\n0.778570 0.121257 -0.641403 0.757813 0.213827 -0.616439\n0.702970 0.233982 -0.695239 0.757813 0.213827 -0.616439\n0.824034 0.233158 -0.546696 0.757813 0.213827 -0.616439\n0.702970 0.233982 -0.695239 0.646863 0.280771 -0.709038\n0.624495 0.237701 -0.765359 0.646863 0.280771 -0.709038\n0.658817 0.351373 -0.689035 0.646863 0.280771 -0.709038\n0.658817 0.351373 -0.689035 0.597415 0.314842 -0.737543\n0.624495 0.237701 -0.765359 0.597415 0.314842 -0.737543\n0.562680 0.393057 -0.749112 0.597415 0.314842 -0.737543\n0.624495 0.237701 -0.765359 0.536315 0.296057 -0.790390\n0.450538 0.322553 -0.851614 0.536315 0.296057 -0.790390\n0.562680 0.393057 -0.749112 0.536315 0.296057 -0.790390\n0.562680 0.393057 -0.749112 0.494321 0.362448 -0.790113\n0.450538 0.322553 -0.851614 0.494321 0.362448 -0.790113\n0.428171 0.370874 -0.843441 0.494321 0.362448 -0.790113\n0.778570 0.121257 -0.641403 0.707548 0.144119 -0.691813\n0.715463 0.058641 -0.718989 0.707548 0.144119 -0.691813\n0.702970 0.233982 -0.695239 0.707548 0.144119 -0.691813\n0.715463 0.058641 -0.718989 0.635631 0.147918 -0.757689\n0.566469 0.081803 -0.839460 0.635631 0.147918 -0.757689\n0.702970 0.233982 -0.695239 0.635631 0.147918 -0.757689\n0.566469 0.081803 -0.839460 0.688785 0.066345 -0.721923\n0.584547 0.164077 -0.814650 0.688785 0.066345 -0.721923\n0.702970 0.233982 -0.695239 0.688785 0.066345 -0.721923\n0.702970 0.233982 -0.695239 0.663910 0.132498 -0.735981\n0.584547 0.164077 -0.814650 0.663910 0.132498 -0.735981\n0.624495 0.237701 -0.765359 0.663910 0.132498 -0.735981\n0.624495 0.237701 -0.765359 0.531407 0.274952 -0.801254\n0.505270 0.190496 -0.860631 0.531407 0.274952 -0.801254\n0.450538 0.322553 -0.851614 0.531407 0.274952 -0.801254\n0.715495 -0.051622 -0.719495 0.678095 0.003571 -0.734965\n0.650729 -0.040915 -0.779198 0.678095 0.003571 -0.734965\n0.715463 0.058641 -0.718989 0.678095 0.003571 -0.734965\n0.650729 -0.040915 -0.779198 0.632974 0.055420 -0.772187\n0.566469 0.081803 -0.839460 0.632974 0.055420 -0.772187\n0.715463 0.058641 -0.718989 0.632974 0.055420 -0.772187\n0.584547 0.164077 -0.814650 0.545788 0.241112 -0.802484\n0.505270 0.190496 -0.860631 0.545788 0.241112 -0.802484\n0.624495 0.237701 -0.765359 0.545788 0.241112 -0.802484\n0.505270 0.190496 -0.860631 0.442194 0.242234 -0.863590\n0.375654 0.250658 -0.910124 0.442194 0.242234 -0.863590\n0.450538 0.322553 -0.851614 0.442194 0.242234 -0.863590\n0.450538 0.322553 -0.851614 0.373167 0.320019 -0.870824\n0.375654 0.250658 -0.910124 0.373167 0.320019 -0.870824\n0.428171 0.370874 -0.843441 0.373167 0.320019 -0.870824\n0.375654 0.250658 -0.910124 0.344256 0.335921 -0.876724\n0.277951 0.292626 -0.932408 0.344256 0.335921 -0.876724\n0.428171 0.370874 -0.843441 0.344256 0.335921 -0.876724\n0.676359 -0.110402 -0.750081 0.414682 -0.217315 -0.883636\n0.684033 -0.179612 -0.729458 0.414682 -0.217315 -0.883636\n0.650729 -0.040915 -0.779198 0.414682 -0.217315 -0.883636\n0.684033 -0.179612 -0.729458 0.643533 -0.116755 -0.756461\n0.594203 -0.104170 -0.817522 0.643533 -0.116755 -0.756461\n0.650729 -0.040915 -0.779198 0.643533 -0.116755 -0.756461\n0.594203 -0.104170 -0.817522 0.575384 -0.018771 -0.817668\n0.512248 -0.008998 -0.877378 0.575384 -0.018771 -0.817668\n0.650729 -0.040915 -0.779198 0.575384 -0.018771 -0.817668\n0.650729 -0.040915 -0.779198 0.577730 -0.004134 -0.816218\n0.512248 -0.008998 -0.877378 0.577730 -0.004134 -0.816218\n0.566469 0.081803 -0.839460 0.577730 -0.004134 -0.816218\n0.512248 -0.008998 -0.877378 0.542971 0.026278 -0.839340\n0.501790 0.022019 -0.883172 0.542971 0.026278 -0.839340\n0.566469 0.081803 -0.839460 0.542971 0.026278 -0.839340\n0.566469 0.081803 -0.839460 0.439566 0.169407 -0.882090\n0.501790 0.022019 -0.883172 0.439566 0.169407 -0.882090\n0.584547 0.164077 -0.814650 0.439566 0.169407 -0.882090\n0.501790 0.022019 -0.883172 0.546581 0.083498 -0.833233\n0.477651 0.092561 -0.891938 0.546581 0.083498 -0.833233\n0.584547 0.164077 -0.814650 0.546581 0.083498 -0.833233\n0.584547 0.164077 -0.814650 0.527711 0.119995 -0.840905\n0.477651 0.092561 -0.891938 0.527711 0.119995 -0.840905\n0.505270 0.190496 -0.860631 0.527711 0.119995 -0.840905\n0.477651 0.092561 -0.891938 0.442375 0.157484 -0.882895\n0.387757 0.136863 -0.929078 0.442375 0.157484 -0.882895\n0.505270 0.190496 -0.860631 0.442375 0.157484 -0.882895\n0.505270 0.190496 -0.860631 0.426785 0.192562 -0.883615\n0.387757 0.136863 -0.929078 0.426785 0.192562 -0.883615\n0.375654 0.250658 -0.910124 0.426785 0.192562 -0.883615\n0.387757 0.136863 -0.929078 0.327589 0.189025 -0.925719\n0.263705 0.226944 -0.954582 0.327589 0.189025 -0.925719\n0.375654 0.250658 -0.910124 0.327589 0.189025 -0.925719\n0.375654 0.250658 -0.910124 0.313399 0.242033 -0.918260\n0.263705 0.226944 -0.954582 0.313399 0.242033 -0.918260\n0.277951 0.292626 -0.932408 0.313399 0.242033 -0.918260\n0.791233 -0.266567 -0.578933 0.746428 -0.185897 -0.638974\n0.775203 -0.281809 -0.593225 0.746428 -0.185897 -0.638974\n0.684033 -0.179612 -0.729458 0.746428 -0.185897 -0.638974\n0.501790 0.022019 -0.883172 0.460188 0.047308 -0.886560\n0.446702 0.008234 -0.912503 0.460188 0.047308 -0.886560\n0.477651 0.092561 -0.891938 0.460188 0.047308 -0.886560\n0.477651 0.092561 -0.891938 0.410567 0.071006 -0.909061\n0.446702 0.008234 -0.912503 0.410567 0.071006 -0.909061\n0.387757 0.136863 -0.929078 0.410567 0.071006 -0.909061\n0.446702 0.008234 -0.912503 0.413633 0.072607 -0.907544\n0.354654 0.083013 -0.948473 0.413633 0.072607 -0.907544\n0.387757 0.136863 -0.929078 0.413633 0.072607 -0.907544\n0.387757 0.136863 -0.929078 0.303770 0.152027 -0.940538\n0.354654 0.083013 -0.948473 0.303770 0.152027 -0.940538\n0.263705 0.226944 -0.954582 0.303770 0.152027 -0.940538\n0.776416 -0.348375 -0.555053 0.663208 -0.363177 -0.654413\n0.622182 -0.262040 -0.759273 0.663208 -0.363177 -0.654413\n0.775203 -0.281809 -0.593225 0.663208 -0.363177 -0.654413\n0.775203 -0.281809 -0.593225 0.690214 -0.275961 -0.668917\n0.622182 -0.262040 -0.759273 0.690214 -0.275961 -0.668917\n0.684033 -0.179612 -0.729458 0.690214 -0.275961 -0.668917\n0.684033 -0.179612 -0.729458 0.608985 -0.177322 -0.773107\n0.622182 -0.262040 -0.759273 0.608985 -0.177322 -0.773107\n0.594203 -0.104170 -0.817522 0.608985 -0.177322 -0.773107\n0.594203 -0.104170 -0.817522 0.341974 -0.271345 -0.899681\n0.622182 -0.262040 -0.759273 0.341974 -0.271345 -0.899681\n0.512248 -0.008998 -0.877378 0.341974 -0.271345 -0.899681\n0.622182 -0.262040 -0.759273 0.631982 -0.084971 -0.770311\n0.500328 -0.147622 -0.871866 0.631982 -0.084971 -0.770311\n0.512248 -0.008998 -0.877378 0.631982 -0.084971 -0.770311\n0.512248 -0.008998 -0.877378 0.327557 -0.065641 -0.942549\n0.500328 -0.147622 -0.871866 0.327557 -0.065641 -0.942549\n0.501790 0.022019 -0.883172 0.327557 -0.065641 -0.942549\n0.500328 -0.147622 -0.871866 0.548017 -0.060326 -0.834289\n0.467786 -0.090109 -0.897401 0.548017 -0.060326 -0.834289\n0.501790 0.022019 -0.883172 0.548017 -0.060326 -0.834289\n0.501790 0.022019 -0.883172 0.476106 -0.032873 -0.878773\n0.467786 -0.090109 -0.897401 0.476106 -0.032873 -0.878773\n0.446702 0.008234 -0.912503 0.476106 -0.032873 -0.878773\n0.467786 -0.090109 -0.897401 0.460577 -0.037440 -0.886830\n0.439559 -0.080318 -0.912474 0.460577 -0.037440 -0.886830\n0.446702 0.008234 -0.912503 0.460577 -0.037440 -0.886830\n0.439559 -0.080318 -0.912474 0.427404 -0.034770 -0.903392\n0.395569 -0.018929 -0.935649 0.427404 -0.034770 -0.903392\n0.446702 0.008234 -0.912503 0.427404 -0.034770 -0.903392\n0.446702 0.008234 -0.912503 0.393276 0.042303 -0.918447\n0.395569 -0.018929 -0.935649 0.393276 0.042303 -0.918447\n0.354654 0.083013 -0.948473 0.393276 0.042303 -0.918447\n0.354654 0.083013 -0.948473 0.356786 0.186596 -0.915361\n0.271672 0.144379 -0.968308 0.356786 0.186596 -0.915361\n0.263705 0.226944 -0.954582 0.356786 0.186596 -0.915361\n0.263705 0.226944 -0.954582 -0.174090 -0.177810 0.968543\n0.271672 0.144379 -0.968308 -0.174090 -0.177810 0.968543\n0.276192 0.189164 -0.959274 -0.174090 -0.177810 0.968543\n0.751968 -0.431328 -0.529879 0.663696 -0.389420 -0.638639\n0.558058 -0.445200 -0.722939 0.663696 -0.389420 -0.638639\n0.776416 -0.348375 -0.555053 0.663696 -0.389420 -0.638639\n0.776416 -0.348375 -0.555053 0.663749 -0.362198 -0.654408\n0.558058 -0.445200 -0.722939 0.663749 -0.362198 -0.654408\n0.622182 -0.262040 -0.759273 0.663749 -0.362198 -0.654408\n0.558058 -0.445200 -0.722939 0.524184 -0.338534 -0.781426\n0.430477 -0.318123 -0.863573 0.524184 -0.338534 -0.781426\n0.622182 -0.262040 -0.759273 0.524184 -0.338534 -0.781426\n0.430477 -0.318123 -0.863573 0.518345 -0.252102 -0.817168\n0.500328 -0.147622 -0.871866 0.518345 -0.252102 -0.817168\n0.622182 -0.262040 -0.759273 0.518345 -0.252102 -0.817168\n0.500328 -0.147622 -0.871866 0.455831 -0.132825 -0.880100\n0.452833 -0.178892 -0.891746 0.455831 -0.132825 -0.880100\n0.467786 -0.090109 -0.897401 0.455831 -0.132825 -0.880100\n0.452833 -0.178892 -0.891746 -0.341703 0.116940 0.932504\n0.461376 -0.159473 -0.891051 -0.341703 0.116940 0.932504\n0.467786 -0.090109 -0.897401 -0.341703 0.116940 0.932504\n0.467786 -0.090109 -0.897401 0.434319 -0.121835 -0.892481\n0.461376 -0.159473 -0.891051 0.434319 -0.121835 -0.892481\n0.439559 -0.080318 -0.912474 0.434319 -0.121835 -0.892481\n0.395569 -0.018929 -0.935649 0.291192 -0.003476 -0.956658\n0.331719 -0.103119 -0.954778 0.291192 -0.003476 -0.956658\n0.354654 0.083013 -0.948473 0.291192 -0.003476 -0.956658\n0.331719 -0.103119 -0.954778 0.301667 -0.004877 -0.953401\n0.248200 0.078021 -0.982131 0.301667 -0.004877 -0.953401\n0.354654 0.083013 -0.948473 0.301667 -0.004877 -0.953401\n0.354654 0.083013 -0.948473 0.296171 0.093248 -0.950572\n0.248200 0.078021 -0.982131 0.296171 0.093248 -0.950572\n0.271672 0.144379 -0.968308 0.296171 0.093248 -0.950572\n0.679828 -0.491484 -0.573192 0.675786 -0.339249 -0.654388\n0.558058 -0.445200 -0.722939 0.675786 -0.339249 -0.654388\n0.751968 -0.431328 -0.529879 0.675786 -0.339249 -0.654388\n0.430477 -0.318123 -0.863573 0.501457 -0.245785 -0.829537\n0.414635 -0.262264 -0.889700 0.501457 -0.245785 -0.829537\n0.500328 -0.147622 -0.871866 0.501457 -0.245785 -0.829537\n0.500328 -0.147622 -0.871866 0.511094 -0.254311 -0.821041\n0.414635 -0.262264 -0.889700 0.511094 -0.254311 -0.821041\n0.452833 -0.178892 -0.891746 0.511094 -0.254311 -0.821041\n0.461376 -0.159473 -0.891051 0.231049 -0.194330 -0.953337\n0.395569 -0.018929 -0.935649 0.231049 -0.194330 -0.953337\n0.439559 -0.080318 -0.912474 0.231049 -0.194330 -0.953337\n0.331719 -0.103119 -0.954778 0.344128 0.016910 -0.938770\n0.262584 -0.063811 -0.979413 0.344128 0.016910 -0.938770\n0.248200 0.078021 -0.982131 0.344128 0.016910 -0.938770\n0.262584 -0.063811 -0.979413 0.204433 0.001974 -0.978879\n0.138887 0.054226 -1.005008 0.204433 0.001974 -0.978879\n0.248200 0.078021 -0.982131 0.204433 0.001974 -0.978879\n0.679828 -0.491484 -0.573192 0.613583 -0.460660 -0.641333\n0.543019 -0.513693 -0.688129 0.613583 -0.460660 -0.641333\n0.558058 -0.445200 -0.722939 0.613583 -0.460660 -0.641333\n0.543019 -0.513693 -0.688129 0.471205 -0.479648 -0.740205\n0.468253 -0.408937 -0.803605 0.471205 -0.479648 -0.740205\n0.558058 -0.445200 -0.722939 0.471205 -0.479648 -0.740205\n0.558058 -0.445200 -0.722939 0.583069 -0.264670 -0.768102\n0.468253 -0.408937 -0.803605 0.583069 -0.264670 -0.768102\n0.430477 -0.318123 -0.863573 0.583069 -0.264670 -0.768102\n0.468253 -0.408937 -0.803605 0.482070 -0.334260 -0.809864\n0.423668 -0.364140 -0.848634 0.482070 -0.334260 -0.809864\n0.430477 -0.318123 -0.863573 0.482070 -0.334260 -0.809864\n0.430477 -0.318123 -0.863573 0.296576 -0.334314 -0.894582\n0.423668 -0.364140 -0.848634 0.296576 -0.334314 -0.894582\n0.414635 -0.262264 -0.889700 0.296576 -0.334314 -0.894582\n0.423668 -0.364140 -0.848634 -0.299638 0.333721 0.893783\n0.430216 -0.310089 -0.866620 -0.299638 0.333721 0.893783\n0.414635 -0.262264 -0.889700 -0.299638 0.333721 0.893783\n0.414635 -0.262264 -0.889700 -0.489161 0.244658 0.837176\n0.430216 -0.310089 -0.866620 -0.489161 0.244658 0.837176\n0.452833 -0.178892 -0.891746 -0.489161 0.244658 0.837176\n0.430216 -0.310089 -0.866620 -0.263932 0.225123 0.937902\n0.451475 -0.252551 -0.874448 -0.263932 0.225123 0.937902\n0.452833 -0.178892 -0.891746 -0.263932 0.225123 0.937902\n0.452833 -0.178892 -0.891746 -0.529020 0.203239 0.823913\n0.451475 -0.252551 -0.874448 -0.529020 0.203239 0.823913\n0.461376 -0.159473 -0.891051 -0.529020 0.203239 0.823913\n0.451475 -0.252551 -0.874448 0.447584 -0.202959 -0.870905\n0.412701 -0.220759 -0.901784 0.447584 -0.202959 -0.870905\n0.461376 -0.159473 -0.891051 0.447584 -0.202959 -0.870905\n0.461376 -0.159473 -0.891051 0.360579 -0.124492 -0.924383\n0.412701 -0.220759 -0.901784 0.360579 -0.124492 -0.924383\n0.395569 -0.018929 -0.935649 0.360579 -0.124492 -0.924383\n0.412701 -0.220759 -0.901784 0.421355 -0.115167 -0.899553\n0.331719 -0.103119 -0.954778 0.421355 -0.115167 -0.899553\n0.395569 -0.018929 -0.935649 0.421355 -0.115167 -0.899553\n0.262584 -0.063811 -0.979413 0.203759 0.001237 -0.979020\n0.142777 -0.056486 -1.004338 0.203759 0.001237 -0.979020\n0.138887 0.054226 -1.005008 0.203759 0.001237 -0.979020\n0.142777 -0.056486 -1.004338 0.095273 -0.002675 -0.995448\n0.025844 -0.001463 -1.015678 0.095273 -0.002675 -0.995448\n0.138887 0.054226 -1.005008 0.095273 -0.002675 -0.995448\n0.720437 -0.549459 -0.459714 0.691089 -0.512832 -0.509313\n0.661833 -0.574341 -0.514180 0.691089 -0.512832 -0.509313\n0.679828 -0.491484 -0.573192 0.691089 -0.512832 -0.509313\n0.661833 -0.574341 -0.514180 0.627902 -0.537356 -0.563016\n0.583106 -0.576869 -0.599567 0.627902 -0.537356 -0.563016\n0.679828 -0.491484 -0.573192 0.627902 -0.537356 -0.563016\n0.679828 -0.491484 -0.573192 0.605307 -0.492513 -0.625327\n0.583106 -0.576869 -0.599567 0.605307 -0.492513 -0.625327\n0.543019 -0.513693 -0.688129 0.605307 -0.492513 -0.625327\n0.543019 -0.513693 -0.688129 0.391877 -0.540783 -0.744302\n0.537542 -0.542532 -0.670059 0.391877 -0.540783 -0.744302\n0.468253 -0.408937 -0.803605 0.391877 -0.540783 -0.744302\n0.537542 -0.542532 -0.670059 -0.137090 0.663835 0.735207\n0.497505 -0.443768 -0.766701 -0.137090 0.663835 0.735207\n0.468253 -0.408937 -0.803605 -0.137090 0.663835 0.735207\n0.468253 -0.408937 -0.803605 -0.203500 -0.787409 -0.581872\n0.497505 -0.443768 -0.766701 -0.203500 -0.787409 -0.581872\n0.423668 -0.364140 -0.848634 -0.203500 -0.787409 -0.581872\n0.412701 -0.220759 -0.901784 0.418510 -0.117584 -0.900569\n0.376491 -0.209975 -0.920020 0.418510 -0.117584 -0.900569\n0.331719 -0.103119 -0.954778 0.418510 -0.117584 -0.900569\n0.029458 -0.776285 -0.654817 0.095462 -0.824982 -0.557039\n0.092855 -0.760589 -0.667199 0.095462 -0.824982 -0.557039\n-0.030558 -0.842564 -0.566942 0.095462 -0.824982 -0.557039\n0.097847 -0.711278 -0.718875 0.045234 -0.724909 -0.687358\n0.092855 -0.760589 -0.667199 0.045234 -0.724909 -0.687358\n0.029458 -0.776285 -0.654817 0.045234 -0.724909 -0.687358\n0.168314 -0.643535 -0.767987 0.115713 -0.659101 -0.743099\n0.175454 -0.665491 -0.747401 0.115713 -0.659101 -0.743099\n0.097847 -0.711278 -0.718875 0.115713 -0.659101 -0.743099\n0.159459 -0.525437 -0.854845 0.556388 -0.464831 -0.688741\n0.175454 -0.665491 -0.747401 0.556388 -0.464831 -0.688741\n0.168314 -0.643535 -0.767987 0.556388 -0.464831 -0.688741\n0.092855 -0.760589 -0.667199 0.097183 -0.825772 -0.555568\n0.186039 -0.877514 -0.477106 0.097183 -0.825772 -0.555568\n-0.030558 -0.842564 -0.566942 0.097183 -0.825772 -0.555568\n0.092855 -0.760589 -0.667199 0.017154 -0.847868 -0.529929\n0.191465 -0.822889 -0.564328 0.017154 -0.847868 -0.529929\n0.186039 -0.877514 -0.477106 0.017154 -0.847868 -0.529929\n0.097847 -0.711278 -0.718875 0.178685 -0.720391 -0.670156\n0.175454 -0.665491 -0.747401 0.178685 -0.720391 -0.670156\n0.092855 -0.760589 -0.667199 0.178685 -0.720391 -0.670156\n0.175454 -0.665491 -0.747401 0.178778 -0.720422 -0.670097\n0.271574 -0.703666 -0.680716 0.178778 -0.720422 -0.670097\n0.092855 -0.760589 -0.667199 0.178778 -0.720422 -0.670097\n0.092855 -0.760589 -0.667199 0.190258 -0.748260 -0.635538\n0.271574 -0.703666 -0.680716 0.190258 -0.748260 -0.635538\n0.191465 -0.822889 -0.564328 0.190258 -0.748260 -0.635538\n0.191465 -0.822889 -0.564328 0.295258 -0.761577 -0.576909\n0.271574 -0.703666 -0.680716 0.295258 -0.761577 -0.576909\n0.321949 -0.833723 -0.483245 0.295258 -0.761577 -0.576909\n0.159459 -0.525437 -0.854845 0.577913 -0.454168 -0.678047\n0.168090 -0.467737 -0.886137 0.577913 -0.454168 -0.678047\n0.175454 -0.665491 -0.747401 0.577913 -0.454168 -0.678047\n0.168090 -0.467737 -0.886137 -0.000905 -0.574340 -0.818616\n0.204922 -0.608301 -0.787559 -0.000905 -0.574340 -0.818616\n0.175454 -0.665491 -0.747401 -0.000905 -0.574340 -0.818616\n0.204922 -0.608301 -0.787559 0.224447 -0.634803 -0.739357\n0.281505 -0.645135 -0.732685 0.224447 -0.634803 -0.739357\n0.175454 -0.665491 -0.747401 0.224447 -0.634803 -0.739357\n0.175454 -0.665491 -0.747401 0.226576 -0.667898 -0.708925\n0.281505 -0.645135 -0.732685 0.226576 -0.667898 -0.708925\n0.271574 -0.703666 -0.680716 0.226576 -0.667898 -0.708925\n0.168090 -0.467737 -0.886137 0.260066 -0.507819 -0.821271\n0.243022 -0.415256 -0.894860 0.260066 -0.507819 -0.821271\n0.204922 -0.608301 -0.787559 0.260066 -0.507819 -0.821271\n0.281505 -0.645135 -0.732685 0.258830 -0.665511 -0.700073\n0.302651 -0.662738 -0.708133 0.258830 -0.665511 -0.700073\n0.271574 -0.703666 -0.680716 0.258830 -0.665511 -0.700073\n0.271574 -0.703666 -0.680716 0.422664 -0.703602 -0.571227\n0.302651 -0.662738 -0.708133 0.422664 -0.703602 -0.571227\n0.321949 -0.833723 -0.483245 0.422664 -0.703602 -0.571227\n0.302651 -0.662738 -0.708133 0.351570 -0.730444 -0.585535\n0.423535 -0.633623 -0.671872 0.351570 -0.730444 -0.585535\n0.321949 -0.833723 -0.483245 0.351570 -0.730444 -0.585535\n0.243022 -0.415256 -0.894860 0.111946 -0.499564 -0.859013\n0.267948 -0.520239 -0.830558 0.111946 -0.499564 -0.859013\n0.204922 -0.608301 -0.787559 0.111946 -0.499564 -0.859013\n0.204922 -0.608301 -0.787559 0.276206 -0.574062 -0.770820\n0.267948 -0.520239 -0.830558 0.276206 -0.574062 -0.770820\n0.281505 -0.645135 -0.732685 0.276206 -0.574062 -0.770820\n0.267948 -0.520239 -0.830558 0.246537 -0.581050 -0.775629\n0.312535 -0.536372 -0.804300 0.246537 -0.581050 -0.775629\n0.281505 -0.645135 -0.732685 0.246537 -0.581050 -0.775629\n0.312535 -0.536372 -0.804300 0.331237 -0.582998 -0.741886\n0.408452 -0.587809 -0.721054 0.331237 -0.582998 -0.741886\n0.281505 -0.645135 -0.732685 0.331237 -0.582998 -0.741886\n0.281505 -0.645135 -0.732685 0.338218 -0.602266 -0.723107\n0.408452 -0.587809 -0.721054 0.338218 -0.602266 -0.723107\n0.302651 -0.662738 -0.708133 0.338218 -0.602266 -0.723107\n0.408452 -0.587809 -0.721054 0.358516 -0.625701 -0.692795\n0.423535 -0.633623 -0.671872 0.358516 -0.625701 -0.692795\n0.302651 -0.662738 -0.708133 0.358516 -0.625701 -0.692795\n0.423535 -0.633623 -0.671872 0.417572 -0.674094 -0.609287\n0.483736 -0.641594 -0.621794 0.417572 -0.674094 -0.609287\n0.434001 -0.728062 -0.560215 0.417572 -0.674094 -0.609287\n0.316297 -0.432497 -0.863235 0.311151 -0.477474 -0.821708\n0.312535 -0.536372 -0.804300 0.311151 -0.477474 -0.821708\n0.267948 -0.520239 -0.830558 0.311151 -0.477474 -0.821708\n0.312535 -0.536372 -0.804300 0.317691 -0.598208 -0.735676\n0.367029 -0.535025 -0.781862 0.317691 -0.598208 -0.735676\n0.408452 -0.587809 -0.721054 0.317691 -0.598208 -0.735676\n0.408452 -0.587809 -0.721054 0.437429 -0.587165 -0.681098\n0.481042 -0.601301 -0.662802 0.437429 -0.587165 -0.681098\n0.423535 -0.633623 -0.671872 0.437429 -0.587165 -0.681098\n0.423535 -0.633623 -0.671872 0.450525 -0.621836 -0.640584\n0.481042 -0.601301 -0.662802 0.450525 -0.621836 -0.640584\n0.483736 -0.641594 -0.621794 0.450525 -0.621836 -0.640584\n0.483736 -0.641594 -0.621794 0.461441 -0.675228 -0.575447\n0.521046 -0.663563 -0.566097 0.461441 -0.675228 -0.575447\n0.434001 -0.728062 -0.560215 0.461441 -0.675228 -0.575447\n0.434001 -0.728062 -0.560215 0.459695 -0.673213 -0.579193\n0.521046 -0.663563 -0.566097 0.459695 -0.673213 -0.579193\n0.482021 -0.715153 -0.537106 0.459695 -0.673213 -0.579193\n0.092197 -0.217595 -0.988141 0.151792 -0.224445 -0.962592\n0.192700 -0.275082 -0.958889 0.151792 -0.224445 -0.962592\n0.126120 -0.284199 -0.967262 0.151792 -0.224445 -0.962592\n0.126120 -0.284199 -0.967262 0.159009 -0.296284 -0.941771\n0.192700 -0.275082 -0.958889 0.159009 -0.296284 -0.941771\n0.184220 -0.331515 -0.942567 0.159009 -0.296284 -0.941771\n0.184220 -0.331515 -0.942567 0.297511 -0.306248 -0.904267\n0.192700 -0.275082 -0.958889 0.297511 -0.306248 -0.904267\n0.243022 -0.415256 -0.894860 0.297511 -0.306248 -0.904267\n0.192700 -0.275082 -0.958889 0.280365 -0.313732 -0.907176\n0.386440 -0.294148 -0.892419 0.280365 -0.313732 -0.907176\n0.243022 -0.415256 -0.894860 0.280365 -0.313732 -0.907176\n0.243022 -0.415256 -0.894860 0.368937 -0.420195 -0.829049\n0.386440 -0.294148 -0.892419 0.368937 -0.420195 -0.829049\n0.267948 -0.520239 -0.830558 0.368937 -0.420195 -0.829049\n0.386440 -0.294148 -0.892419 -0.885131 0.397848 -0.241373\n0.316297 -0.432497 -0.863235 -0.885131 0.397848 -0.241373\n0.267948 -0.520239 -0.830558 -0.885131 0.397848 -0.241373\n0.316297 -0.432497 -0.863235 0.316791 -0.476707 -0.819996\n0.341989 -0.431524 -0.853874 0.316791 -0.476707 -0.819996\n0.312535 -0.536372 -0.804300 0.316791 -0.476707 -0.819996\n0.341989 -0.431524 -0.853874 0.225865 -0.467539 -0.854630\n0.341354 -0.488459 -0.822895 0.225865 -0.467539 -0.854630\n0.312535 -0.536372 -0.804300 0.225865 -0.467539 -0.854630\n0.312535 -0.536372 -0.804300 0.338182 -0.510292 -0.790718\n0.341354 -0.488459 -0.822895 0.338182 -0.510292 -0.790718\n0.367029 -0.535025 -0.781862 0.338182 -0.510292 -0.790718\n0.367029 -0.535025 -0.781862 0.411291 -0.530852 -0.740969\n0.470462 -0.528638 -0.729026 0.411291 -0.530852 -0.740969\n0.408452 -0.587809 -0.721054 0.411291 -0.530852 -0.740969\n0.408452 -0.587809 -0.721054 0.450060 -0.564839 -0.691667\n0.470462 -0.528638 -0.729026 0.450060 -0.564839 -0.691667\n0.481042 -0.601301 -0.662802 0.450060 -0.564839 -0.691667\n0.470462 -0.528638 -0.729026 0.478001 -0.552625 -0.682730\n0.516687 -0.577540 -0.657079 0.478001 -0.552625 -0.682730\n0.481042 -0.601301 -0.662802 0.478001 -0.552625 -0.682730\n0.481042 -0.601301 -0.662802 0.500581 -0.600831 -0.623234\n0.516687 -0.577540 -0.657079 0.500581 -0.600831 -0.623234\n0.483736 -0.641594 -0.621794 0.500581 -0.600831 -0.623234\n0.516687 -0.577540 -0.657079 0.498805 -0.600746 -0.624738\n0.538179 -0.610227 -0.608488 0.498805 -0.600746 -0.624738\n0.483736 -0.641594 -0.621794 0.498805 -0.600746 -0.624738\n0.483736 -0.641594 -0.621794 0.506853 -0.630246 -0.588124\n0.538179 -0.610227 -0.608488 0.506853 -0.630246 -0.588124\n0.521046 -0.663563 -0.566097 0.506853 -0.630246 -0.588124\n0.538179 -0.610227 -0.608488 0.578191 -0.613357 -0.538041\n0.645112 -0.611333 -0.492315 0.578191 -0.613357 -0.538041\n0.521046 -0.663563 -0.566097 0.578191 -0.613357 -0.538041\n0.521046 -0.663563 -0.566097 0.563105 -0.685398 -0.461675\n0.645112 -0.611333 -0.492315 0.563105 -0.685398 -0.461675\n0.482021 -0.715153 -0.537106 0.563105 -0.685398 -0.461675\n0.065222 -0.155812 -1.001868 0.118296 -0.165870 -0.979027\n0.176041 -0.160390 -0.987702 0.118296 -0.165870 -0.979027\n0.092197 -0.217595 -0.988141 0.118296 -0.165870 -0.979027\n0.092197 -0.217595 -0.988141 0.154808 -0.219506 -0.963251\n0.176041 -0.160390 -0.987702 0.154808 -0.219506 -0.963251\n0.192700 -0.275082 -0.958889 0.154808 -0.219506 -0.963251\n0.176041 -0.160390 -0.987702 0.269355 -0.197665 -0.942537\n0.376491 -0.209975 -0.920020 0.269355 -0.197665 -0.942537\n0.192700 -0.275082 -0.958889 0.269355 -0.197665 -0.942537\n0.376491 -0.209975 -0.920020 0.289776 -0.269791 -0.918283\n0.391785 -0.247537 -0.904158 0.289776 -0.269791 -0.918283\n0.192700 -0.275082 -0.958889 0.289776 -0.269791 -0.918283\n0.192700 -0.275082 -0.958889 0.289510 -0.264840 -0.919806\n0.391785 -0.247537 -0.904158 0.289510 -0.264840 -0.919806\n0.386440 -0.294148 -0.892419 0.289510 -0.264840 -0.919806\n0.386440 -0.294148 -0.892419 0.332055 -0.352884 -0.874764\n0.341989 -0.431524 -0.853874 0.332055 -0.352884 -0.874764\n0.316297 -0.432497 -0.863235 0.332055 -0.352884 -0.874764\n0.341354 -0.488459 -0.822895 0.427508 -0.453424 -0.782076\n0.470462 -0.528638 -0.729026 0.427508 -0.453424 -0.782076\n0.367029 -0.535025 -0.781862 0.427508 -0.453424 -0.782076\n0.516687 -0.577540 -0.657079 0.543130 -0.565517 -0.620645\n0.583106 -0.576869 -0.599567 0.543130 -0.565517 -0.620645\n0.538179 -0.610227 -0.608488 0.543130 -0.565517 -0.620645\n0.538179 -0.610227 -0.608488 0.570554 -0.626388 -0.531136\n0.583106 -0.576869 -0.599567 0.570554 -0.626388 -0.531136\n0.645112 -0.611333 -0.492315 0.570554 -0.626388 -0.531136\n0.583106 -0.576869 -0.599567 0.602200 -0.590061 -0.537758\n0.661833 -0.574341 -0.514180 0.602200 -0.590061 -0.537758\n0.645112 -0.611333 -0.492315 0.602200 -0.590061 -0.537758\n0.661833 -0.574341 -0.514180 0.658282 -0.580692 -0.479022\n0.691813 -0.579918 -0.466220 0.658282 -0.580692 -0.479022\n0.645112 -0.611333 -0.492315 0.658282 -0.580692 -0.479022\n0.007139 -0.109345 -1.010081 0.126056 -0.017743 -0.991865\n0.176041 -0.160390 -0.987702 0.126056 -0.017743 -0.991865\n0.065222 -0.155812 -1.001868 0.126056 -0.017743 -0.991865\n0.386440 -0.294148 -0.892419 0.343304 -0.355055 -0.869528\n0.405025 -0.395323 -0.843769 0.343304 -0.355055 -0.869528\n0.341989 -0.431524 -0.853874 0.343304 -0.355055 -0.869528\n0.341989 -0.431524 -0.853874 0.384914 -0.444432 -0.808901\n0.405025 -0.395323 -0.843769 0.384914 -0.444432 -0.808901\n0.341354 -0.488459 -0.822895 0.384914 -0.444432 -0.808901\n0.341354 -0.488459 -0.822895 0.422284 -0.463304 -0.779119\n0.405025 -0.395323 -0.843769 0.422284 -0.463304 -0.779119\n0.470462 -0.528638 -0.729026 0.422284 -0.463304 -0.779119\n0.405025 -0.395323 -0.843769 0.390756 -0.482760 -0.783743\n0.492731 -0.470660 -0.753636 0.390756 -0.482760 -0.783743\n0.470462 -0.528638 -0.729026 0.390756 -0.482760 -0.783743\n0.492731 -0.470660 -0.753636 0.513665 -0.494817 -0.700931\n0.537542 -0.542532 -0.670059 0.513665 -0.494817 -0.700931\n0.470462 -0.528638 -0.729026 0.513665 -0.494817 -0.700931\n0.470462 -0.528638 -0.729026 0.487730 -0.543769 -0.682961\n0.537542 -0.542532 -0.670059 0.487730 -0.543769 -0.682961\n0.516687 -0.577540 -0.657079 0.487730 -0.543769 -0.682961\n0.516687 -0.577540 -0.657079 0.546706 -0.557360 -0.624870\n0.537542 -0.542532 -0.670059 0.546706 -0.557360 -0.624870\n0.583106 -0.576869 -0.599567 0.546706 -0.557360 -0.624870\n-0.044553 -0.033316 -1.014483 0.007049 -0.053024 -0.998568\n0.025844 -0.001463 -1.015678 0.007049 -0.053024 -0.998568\n0.007139 -0.109345 -1.010081 0.007049 -0.053024 -0.998568\n0.025844 -0.001463 -1.015678 0.066805 -0.063239 -0.995760\n0.142777 -0.056486 -1.004338 0.066805 -0.063239 -0.995760\n0.007139 -0.109345 -1.010081 0.066805 -0.063239 -0.995760\n0.007139 -0.109345 -1.010081 0.091946 -0.128658 -0.987417\n0.142777 -0.056486 -1.004338 0.091946 -0.128658 -0.987417\n0.176041 -0.160390 -0.987702 0.091946 -0.128658 -0.987417\n0.142777 -0.056486 -1.004338 0.197345 -0.093072 -0.975906\n0.262584 -0.063811 -0.979413 0.197345 -0.093072 -0.975906\n0.176041 -0.160390 -0.987702 0.197345 -0.093072 -0.975906\n0.176041 -0.160390 -0.987702 0.277861 -0.167802 -0.945852\n0.262584 -0.063811 -0.979413 0.277861 -0.167802 -0.945852\n0.376491 -0.209975 -0.920020 0.277861 -0.167802 -0.945852\n0.262584 -0.063811 -0.979413 0.214129 -0.219862 -0.951740\n0.331719 -0.103119 -0.954778 0.214129 -0.219862 -0.951740\n0.376491 -0.209975 -0.920020 0.214129 -0.219862 -0.951740\n0.376491 -0.209975 -0.920020 0.385203 -0.221466 -0.895863\n0.412701 -0.220759 -0.901784 0.385203 -0.221466 -0.895863\n0.391785 -0.247537 -0.904158 0.385203 -0.221466 -0.895863\n0.391785 -0.247537 -0.904158 0.438525 -0.266443 -0.858315\n0.412701 -0.220759 -0.901784 0.438525 -0.266443 -0.858315\n0.386440 -0.294148 -0.892419 0.438525 -0.266443 -0.858315\n0.412701 -0.220759 -0.901784 0.406850 -0.257426 -0.876473\n0.451475 -0.252551 -0.874448 0.406850 -0.257426 -0.876473\n0.386440 -0.294148 -0.892419 0.406850 -0.257426 -0.876473\n0.451475 -0.252551 -0.874448 0.413557 -0.271057 -0.869194\n0.430216 -0.310089 -0.866620 0.413557 -0.271057 -0.869194\n0.386440 -0.294148 -0.892419 0.413557 -0.271057 -0.869194\n0.386440 -0.294148 -0.892419 0.381166 -0.342840 -0.858588\n0.430216 -0.310089 -0.866620 0.381166 -0.342840 -0.858588\n0.405025 -0.395323 -0.843769 0.381166 -0.342840 -0.858588\n0.430216 -0.310089 -0.866620 0.327723 -0.333813 -0.883836\n0.423668 -0.364140 -0.848634 0.327723 -0.333813 -0.883836\n0.405025 -0.395323 -0.843769 0.327723 -0.333813 -0.883836\n0.423668 -0.364140 -0.848634 0.455958 -0.396872 -0.796615\n0.497505 -0.443768 -0.766701 0.455958 -0.396872 -0.796615\n0.405025 -0.395323 -0.843769 0.455958 -0.396872 -0.796615\n0.405025 -0.395323 -0.843769 0.416512 -0.456042 -0.786475\n0.497505 -0.443768 -0.766701 0.416512 -0.456042 -0.786475\n0.492731 -0.470660 -0.753636 0.416512 -0.456042 -0.786475\n0.492731 -0.470660 -0.753636 0.580662 -0.436860 -0.687012\n0.497505 -0.443768 -0.766701 0.580662 -0.436860 -0.687012\n0.537542 -0.542532 -0.670059 0.580662 -0.436860 -0.687012\n0.537542 -0.542532 -0.670059 0.590885 -0.505952 -0.628385\n0.543019 -0.513693 -0.688129 0.590885 -0.505952 -0.628385\n0.583106 -0.576869 -0.599567 0.590885 -0.505952 -0.628385\n0.661833 -0.574341 -0.514180 0.684807 -0.538730 -0.490723\n0.720437 -0.549459 -0.459714 0.684807 -0.538730 -0.490723\n0.691813 -0.579918 -0.466220 0.684807 -0.538730 -0.490723\n3 0 1 2\n3 3 4 5\n3 6 7 8\n3 9 10 11\n3 12 13 14\n3 15 16 17\n3 18 19 20\n3 21 22 23\n3 24 25 26\n3 27 28 29\n3 30 31 32\n3 33 34 35\n3 36 37 38\n3 39 40 41\n3 42 43 44\n3 45 46 47\n3 48 49 50\n3 51 52 53\n3 54 55 56\n3 57 58 59\n3 60 61 62\n3 63 64 65\n3 66 67 68\n3 69 70 71\n3 72 73 74\n3 75 76 77\n3 78 79 80\n3 81 82 83\n3 84 85 86\n3 87 88 89\n3 90 91 92\n3 93 94 95\n3 96 97 98\n3 99 100 101\n3 102 103 104\n3 105 106 107\n3 108 109 110\n3 111 112 113\n3 114 115 116\n3 117 118 119\n3 120 121 122\n3 123 124 125\n3 126 127 128\n3 129 130 131\n3 132 133 134\n3 135 136 137\n3 138 139 140\n3 141 142 143\n3 144 145 146\n3 147 148 149\n3 150 151 152\n3 153 154 155\n3 156 157 158\n3 159 160 161\n3 162 163 164\n3 165 166 167\n3 168 169 170\n3 171 172 173\n3 174 175 176\n3 177 178 179\n3 180 181 182\n3 183 184 185\n3 186 187 188\n3 189 190 191\n3 192 193 194\n3 195 196 197\n3 198 199 200\n3 201 202 203\n3 204 205 206\n3 207 208 209\n3 210 211 212\n3 213 214 215\n3 216 217 218\n3 219 220 221\n3 222 223 224\n3 225 226 227\n3 228 229 230\n3 231 232 233\n3 234 235 236\n3 237 238 239\n3 240 241 242\n3 243 244 245\n3 246 247 248\n3 249 250 251\n3 252 253 254\n3 255 256 257\n3 258 259 260\n3 261 262 263\n3 264 265 266\n3 267 268 269\n3 270 271 272\n3 273 274 275\n3 276 277 278\n3 279 280 281\n3 282 283 284\n3 285 286 287\n3 288 289 290\n3 291 292 293\n3 294 295 296\n3 297 298 299\n3 300 301 302\n3 303 304 305\n3 306 307 308\n3 309 310 311\n3 312 313 314\n3 315 316 317\n3 318 319 320\n3 321 322 323\n3 324 325 326\n3 327 328 329\n3 330 331 332\n3 333 334 335\n3 336 337 338\n3 339 340 341\n3 342 343 344\n3 345 346 347\n3 348 349 350\n3 351 352 353\n3 354 355 356\n3 357 358 359\n3 360 361 362\n3 363 364 365\n3 366 367 368\n3 369 370 371\n3 372 373 374\n3 375 376 377\n3 378 379 380\n3 381 382 383\n3 384 385 386\n3 387 388 389\n3 390 391 392\n3 393 394 395\n3 396 397 398\n3 399 400 401\n3 402 403 404\n3 405 406 407\n3 408 409 410\n3 411 412 413\n3 414 415 416\n3 417 418 419\n3 420 421 422\n3 423 424 425\n3 426 427 428\n3 429 430 431\n3 432 433 434\n3 435 436 437\n3 438 439 440\n3 441 442 443\n3 444 445 446\n3 447 448 449\n3 450 451 452\n3 453 454 455\n3 456 457 458\n3 459 460 461\n3 462 463 464\n3 465 466 467\n3 468 469 470\n3 471 472 473\n3 474 475 476\n3 477 478 479\n3 480 481 482\n3 483 484 485\n3 486 487 488\n3 489 490 491\n3 492 493 494\n3 495 496 497\n3 498 499 500\n3 501 502 503\n3 504 505 506\n3 507 508 509\n3 510 511 512\n3 513 514 515\n3 516 517 518\n3 519 520 521\n3 522 523 524\n3 525 526 527\n3 528 529 530\n3 531 532 533\n3 534 535 536\n3 537 538 539\n3 540 541 542\n3 543 544 545\n3 546 547 548\n3 549 550 551\n3 552 553 554\n3 555 556 557\n3 558 559 560\n3 561 562 563\n3 564 565 566\n3 567 568 569\n3 570 571 572\n3 573 574 575\n3 576 577 578\n3 579 580 581\n3 582 583 584\n3 585 586 587\n3 588 589 590\n3 591 592 593\n3 594 595 596\n3 597 598 599\n3 600 601 602\n3 603 604 605\n3 606 607 608\n3 609 610 611\n3 612 613 614\n3 615 616 617\n3 618 619 620\n3 621 622 623\n3 624 625 626\n3 627 628 629\n3 630 631 632\n3 633 634 635\n3 636 637 638\n3 639 640 641\n3 642 643 644\n3 645 646 647\n3 648 649 650\n3 651 652 653\n3 654 655 656\n3 657 658 659\n3 660 661 662\n3 663 664 665\n3 666 667 668\n3 669 670 671\n3 672 673 674\n3 675 676 677\n3 678 679 680\n3 681 682 683\n3 684 685 686\n3 687 688 689\n3 690 691 692\n3 693 694 695\n3 696 697 698\n3 699 700 701\n3 702 703 704\n3 705 706 707\n3 708 709 710\n3 711 712 713\n3 714 715 716\n3 717 718 719\n3 720 721 722\n3 723 724 725\n3 726 727 728\n3 729 730 731\n3 732 733 734\n3 735 736 737\n3 738 739 740\n3 741 742 743\n3 744 745 746\n3 747 748 749\n3 750 751 752\n3 753 754 755\n3 756 757 758\n3 759 760 761\n3 762 763 764\n3 765 766 767\n3 768 769 770\n3 771 772 773\n3 774 775 776\n3 777 778 779\n3 780 781 782\n3 783 784 785\n3 786 787 788\n3 789 790 791\n3 792 793 794\n3 795 796 797\n3 798 799 800\n3 801 802 803\n3 804 805 806\n3 807 808 809\n3 810 811 812\n3 813 814 815\n3 816 817 818\n3 819 820 821\n3 822 823 824\n3 825 826 827\n3 828 829 830\n3 831 832 833\n3 834 835 836\n3 837 838 839\n3 840 841 842\n3 843 844 845\n3 846 847 848\n3 849 850 851\n3 852 853 854\n3 855 856 857\n3 858 859 860\n3 861 862 863\n3 864 865 866\n3 867 868 869\n3 870 871 872\n3 873 874 875\n3 876 877 878\n3 879 880 881\n3 882 883 884\n3 885 886 887\n3 888 889 890\n3 891 892 893\n3 894 895 896\n3 897 898 899\n3 900 901 902\n3 903 904 905\n3 906 907 908\n3 909 910 911\n3 912 913 914\n3 915 916 917\n3 918 919 920\n3 921 922 923\n3 924 925 926\n3 927 928 929\n3 930 931 932\n3 933 934 935\n3 936 937 938\n3 939 940 941\n3 942 943 944\n3 945 946 947\n3 948 949 950\n3 951 952 953\n3 954 955 956\n3 957 958 959\n3 960 961 962\n3 963 964 965\n3 966 967 968\n3 969 970 971\n3 972 973 974\n3 975 976 977\n3 978 979 980\n3 981 982 983\n3 984 985 986\n3 987 988 989\n3 990 991 992\n3 993 994 995\n3 996 997 998\n3 999 1000 1001\n3 1002 1003 1004\n3 1005 1006 1007\n3 1008 1009 1010\n3 1011 1012 1013\n3 1014 1015 1016\n3 1017 1018 1019\n3 1020 1021 1022\n3 1023 1024 1025\n3 1026 1027 1028\n3 1029 1030 1031\n3 1032 1033 1034\n3 1035 1036 1037\n3 1038 1039 1040\n3 1041 1042 1043\n3 1044 1045 1046\n3 1047 1048 1049\n3 1050 1051 1052\n3 1053 1054 1055\n3 1056 1057 1058\n3 1059 1060 1061\n3 1062 1063 1064\n3 1065 1066 1067\n3 1068 1069 1070\n3 1071 1072 1073\n3 1074 1075 1076\n3 1077 1078 1079\n3 1080 1081 1082\n3 1083 1084 1085\n3 1086 1087 1088\n3 1089 1090 1091\n3 1092 1093 1094\n3 1095 1096 1097\n3 1098 1099 1100\n3 1101 1102 1103\n3 1104 1105 1106\n3 1107 1108 1109\n3 1110 1111 1112\n3 1113 1114 1115\n3 1116 1117 1118\n3 1119 1120 1121\n3 1122 1123 1124\n3 1125 1126 1127\n3 1128 1129 1130\n3 1131 1132 1133\n3 1134 1135 1136\n3 1137 1138 1139\n3 1140 1141 1142\n3 1143 1144 1145\n3 1146 1147 1148\n3 1149 1150 1151\n3 1152 1153 1154\n3 1155 1156 1157\n3 1158 1159 1160\n3 1161 1162 1163\n3 1164 1165 1166\n3 1167 1168 1169\n3 1170 1171 1172\n3 1173 1174 1175\n3 1176 1177 1178\n3 1179 1180 1181\n3 1182 1183 1184\n3 1185 1186 1187\n3 1188 1189 1190\n3 1191 1192 1193\n3 1194 1195 1196\n3 1197 1198 1199\n3 1200 1201 1202\n3 1203 1204 1205\n3 1206 1207 1208\n3 1209 1210 1211\n3 1212 1213 1214\n3 1215 1216 1217\n3 1218 1219 1220\n3 1221 1222 1223\n3 1224 1225 1226\n3 1227 1228 1229\n3 1230 1231 1232\n3 1233 1234 1235\n3 1236 1237 1238\n3 1239 1240 1241\n3 1242 1243 1244\n3 1245 1246 1247\n3 1248 1249 1250\n3 1251 1252 1253\n3 1254 1255 1256\n3 1257 1258 1259\n3 1260 1261 1262\n3 1263 1264 1265\n3 1266 1267 1268\n3 1269 1270 1271\n3 1272 1273 1274\n3 1275 1276 1277\n3 1278 1279 1280\n3 1281 1282 1283\n3 1284 1285 1286\n3 1287 1288 1289\n3 1290 1291 1292\n3 1293 1294 1295\n3 1296 1297 1298\n3 1299 1300 1301\n3 1302 1303 1304\n3 1305 1306 1307\n3 1308 1309 1310\n3 1311 1312 1313\n3 1314 1315 1316\n3 1317 1318 1319\n3 1320 1321 1322\n3 1323 1324 1325\n3 1326 1327 1328\n3 1329 1330 1331\n3 1332 1333 1334\n3 1335 1336 1337\n3 1338 1339 1340\n3 1341 1342 1343\n3 1344 1345 1346\n3 1347 1348 1349\n3 1350 1351 1352\n3 1353 1354 1355\n3 1356 1357 1358\n3 1359 1360 1361\n3 1362 1363 1364\n3 1365 1366 1367\n3 1368 1369 1370\n3 1371 1372 1373\n3 1374 1375 1376\n3 1377 1378 1379\n3 1380 1381 1382\n3 1383 1384 1385\n3 1386 1387 1388\n3 1389 1390 1391\n3 1392 1393 1394\n3 1395 1396 1397\n3 1398 1399 1400\n3 1401 1402 1403\n3 1404 1405 1406\n3 1407 1408 1409\n3 1410 1411 1412\n3 1413 1414 1415\n3 1416 1417 1418\n3 1419 1420 1421\n3 1422 1423 1424\n3 1425 1426 1427\n3 1428 1429 1430\n3 1431 1432 1433\n3 1434 1435 1436\n3 1437 1438 1439\n3 1440 1441 1442\n3 1443 1444 1445\n3 1446 1447 1448\n3 1449 1450 1451\n3 1452 1453 1454\n3 1455 1456 1457\n3 1458 1459 1460\n3 1461 1462 1463\n3 1464 1465 1466\n3 1467 1468 1469\n3 1470 1471 1472\n3 1473 1474 1475\n3 1476 1477 1478\n3 1479 1480 1481\n3 1482 1483 1484\n3 1485 1486 1487\n3 1488 1489 1490\n3 1491 1492 1493\n3 1494 1495 1496\n3 1497 1498 1499\n3 1500 1501 1502\n3 1503 1504 1505\n3 1506 1507 1508\n3 1509 1510 1511\n3 1512 1513 1514\n3 1515 1516 1517\n3 1518 1519 1520\n3 1521 1522 1523\n3 1524 1525 1526\n3 1527 1528 1529\n3 1530 1531 1532\n3 1533 1534 1535\n3 1536 1537 1538\n3 1539 1540 1541\n3 1542 1543 1544\n3 1545 1546 1547\n3 1548 1549 1550\n3 1551 1552 1553\n3 1554 1555 1556\n3 1557 1558 1559\n3 1560 1561 1562\n3 1563 1564 1565\n3 1566 1567 1568\n3 1569 1570 1571\n3 1572 1573 1574\n3 1575 1576 1577\n3 1578 1579 1580\n3 1581 1582 1583\n3 1584 1585 1586\n3 1587 1588 1589\n3 1590 1591 1592\n3 1593 1594 1595\n3 1596 1597 1598\n3 1599 1600 1601\n3 1602 1603 1604\n3 1605 1606 1607\n3 1608 1609 1610\n3 1611 1612 1613\n3 1614 1615 1616\n3 1617 1618 1619\n3 1620 1621 1622\n3 1623 1624 1625\n3 1626 1627 1628\n3 1629 1630 1631\n3 1632 1633 1634\n3 1635 1636 1637\n3 1638 1639 1640\n3 1641 1642 1643\n3 1644 1645 1646\n3 1647 1648 1649\n3 1650 1651 1652\n3 1653 1654 1655\n3 1656 1657 1658\n3 1659 1660 1661\n3 1662 1663 1664\n3 1665 1666 1667\n3 1668 1669 1670\n3 1671 1672 1673\n3 1674 1675 1676\n3 1677 1678 1679\n3 1680 1681 1682\n3 1683 1684 1685\n3 1686 1687 1688\n3 1689 1690 1691\n3 1692 1693 1694\n3 1695 1696 1697\n3 1698 1699 1700\n3 1701 1702 1703\n3 1704 1705 1706\n3 1707 1708 1709\n3 1710 1711 1712\n3 1713 1714 1715\n3 1716 1717 1718\n3 1719 1720 1721\n3 1722 1723 1724\n3 1725 1726 1727\n3 1728 1729 1730\n3 1731 1732 1733\n3 1734 1735 1736\n3 1737 1738 1739\n3 1740 1741 1742\n3 1743 1744 1745\n3 1746 1747 1748\n3 1749 1750 1751\n3 1752 1753 1754\n3 1755 1756 1757\n3 1758 1759 1760\n3 1761 1762 1763\n3 1764 1765 1766\n3 1767 1768 1769\n3 1770 1771 1772\n3 1773 1774 1775\n3 1776 1777 1778\n3 1779 1780 1781\n3 1782 1783 1784\n3 1785 1786 1787\n3 1788 1789 1790\n3 1791 1792 1793\n3 1794 1795 1796\n3 1797 1798 1799\n3 1800 1801 1802\n3 1803 1804 1805\n3 1806 1807 1808\n3 1809 1810 1811\n3 1812 1813 1814\n3 1815 1816 1817\n3 1818 1819 1820\n3 1821 1822 1823\n3 1824 1825 1826\n3 1827 1828 1829\n3 1830 1831 1832\n3 1833 1834 1835\n3 1836 1837 1838\n3 1839 1840 1841\n3 1842 1843 1844\n3 1845 1846 1847\n3 1848 1849 1850\n3 1851 1852 1853\n3 1854 1855 1856\n3 1857 1858 1859\n3 1860 1861 1862\n3 1863 1864 1865\n3 1866 1867 1868\n3 1869 1870 1871\n3 1872 1873 1874\n3 1875 1876 1877\n3 1878 1879 1880\n3 1881 1882 1883\n3 1884 1885 1886\n3 1887 1888 1889\n3 1890 1891 1892\n3 1893 1894 1895\n3 1896 1897 1898\n3 1899 1900 1901\n3 1902 1903 1904\n3 1905 1906 1907\n3 1908 1909 1910\n3 1911 1912 1913\n3 1914 1915 1916\n3 1917 1918 1919\n3 1920 1921 1922\n3 1923 1924 1925\n3 1926 1927 1928\n3 1929 1930 1931\n3 1932 1933 1934\n3 1935 1936 1937\n3 1938 1939 1940\n3 1941 1942 1943\n3 1944 1945 1946\n3 1947 1948 1949\n3 1950 1951 1952\n3 1953 1954 1955\n3 1956 1957 1958\n3 1959 1960 1961\n3 1962 1963 1964\n3 1965 1966 1967\n3 1968 1969 1970\n3 1971 1972 1973\n3 1974 1975 1976\n3 1977 1978 1979\n3 1980 1981 1982\n3 1983 1984 1985\n3 1986 1987 1988\n3 1989 1990 1991\n3 1992 1993 1994\n3 1995 1996 1997\n3 1998 1999 2000\n3 2001 2002 2003\n3 2004 2005 2006\n3 2007 2008 2009\n3 2010 2011 2012\n3 2013 2014 2015\n3 2016 2017 2018\n3 2019 2020 2021\n3 2022 2023 2024\n3 2025 2026 2027\n3 2028 2029 2030\n3 2031 2032 2033\n3 2034 2035 2036\n3 2037 2038 2039\n3 2040 2041 2042\n3 2043 2044 2045\n3 2046 2047 2048\n3 2049 2050 2051\n3 2052 2053 2054\n3 2055 2056 2057\n3 2058 2059 2060\n3 2061 2062 2063\n3 2064 2065 2066\n3 2067 2068 2069\n3 2070 2071 2072\n3 2073 2074 2075\n3 2076 2077 2078\n3 2079 2080 2081\n3 2082 2083 2084\n3 2085 2086 2087\n3 2088 2089 2090\n3 2091 2092 2093\n3 2094 2095 2096\n3 2097 2098 2099\n3 2100 2101 2102\n3 2103 2104 2105\n3 2106 2107 2108\n3 2109 2110 2111\n3 2112 2113 2114\n3 2115 2116 2117\n3 2118 2119 2120\n3 2121 2122 2123\n3 2124 2125 2126\n3 2127 2128 2129\n3 2130 2131 2132\n3 2133 2134 2135\n3 2136 2137 2138\n3 2139 2140 2141\n3 2142 2143 2144\n3 2145 2146 2147\n3 2148 2149 2150\n3 2151 2152 2153\n3 2154 2155 2156\n3 2157 2158 2159\n3 2160 2161 2162\n3 2163 2164 2165\n3 2166 2167 2168\n3 2169 2170 2171\n3 2172 2173 2174\n3 2175 2176 2177\n3 2178 2179 2180\n3 2181 2182 2183\n3 2184 2185 2186\n3 2187 2188 2189\n3 2190 2191 2192\n3 2193 2194 2195\n3 2196 2197 2198\n3 2199 2200 2201\n3 2202 2203 2204\n3 2205 2206 2207\n3 2208 2209 2210\n3 2211 2212 2213\n3 2214 2215 2216\n3 2217 2218 2219\n3 2220 2221 2222\n3 2223 2224 2225\n3 2226 2227 2228\n3 2229 2230 2231\n3 2232 2233 2234\n3 2235 2236 2237\n3 2238 2239 2240\n3 2241 2242 2243\n3 2244 2245 2246\n3 2247 2248 2249\n3 2250 2251 2252\n3 2253 2254 2255\n3 2256 2257 2258\n3 2259 2260 2261\n3 2262 2263 2264\n3 2265 2266 2267\n3 2268 2269 2270\n3 2271 2272 2273\n3 2274 2275 2276\n3 2277 2278 2279\n3 2280 2281 2282\n3 2283 2284 2285\n3 2286 2287 2288\n3 2289 2290 2291\n3 2292 2293 2294\n3 2295 2296 2297\n3 2298 2299 2300\n3 2301 2302 2303\n3 2304 2305 2306\n3 2307 2308 2309\n3 2310 2311 2312\n3 2313 2314 2315\n3 2316 2317 2318\n3 2319 2320 2321\n3 2322 2323 2324\n3 2325 2326 2327\n3 2328 2329 2330\n3 2331 2332 2333\n3 2334 2335 2336\n3 2337 2338 2339\n3 2340 2341 2342\n3 2343 2344 2345\n3 2346 2347 2348\n3 2349 2350 2351\n3 2352 2353 2354\n3 2355 2356 2357\n3 2358 2359 2360\n3 2361 2362 2363\n3 2364 2365 2366\n3 2367 2368 2369\n3 2370 2371 2372\n3 2373 2374 2375\n3 2376 2377 2378\n3 2379 2380 2381\n3 2382 2383 2384\n3 2385 2386 2387\n3 2388 2389 2390\n3 2391 2392 2393\n3 2394 2395 2396\n3 2397 2398 2399\n3 2400 2401 2402\n3 2403 2404 2405\n3 2406 2407 2408\n3 2409 2410 2411\n3 2412 2413 2414\n3 2415 2416 2417\n3 2418 2419 2420\n3 2421 2422 2423\n3 2424 2425 2426\n3 2427 2428 2429\n3 2430 2431 2432\n3 2433 2434 2435\n3 2436 2437 2438\n3 2439 2440 2441\n3 2442 2443 2444\n3 2445 2446 2447\n3 2448 2449 2450\n3 2451 2452 2453\n3 2454 2455 2456\n3 2457 2458 2459\n3 2460 2461 2462\n3 2463 2464 2465\n3 2466 2467 2468\n3 2469 2470 2471\n3 2472 2473 2474\n3 2475 2476 2477\n3 2478 2479 2480\n3 2481 2482 2483\n3 2484 2485 2486\n3 2487 2488 2489\n3 2490 2491 2492\n3 2493 2494 2495\n3 2496 2497 2498\n3 2499 2500 2501\n3 2502 2503 2504\n3 2505 2506 2507\n3 2508 2509 2510\n3 2511 2512 2513\n3 2514 2515 2516\n3 2517 2518 2519\n3 2520 2521 2522\n3 2523 2524 2525\n3 2526 2527 2528\n3 2529 2530 2531\n3 2532 2533 2534\n3 2535 2536 2537\n3 2538 2539 2540\n3 2541 2542 2543\n3 2544 2545 2546\n3 2547 2548 2549\n3 2550 2551 2552\n3 2553 2554 2555\n3 2556 2557 2558\n3 2559 2560 2561\n3 2562 2563 2564\n3 2565 2566 2567\n3 2568 2569 2570\n3 2571 2572 2573\n3 2574 2575 2576\n3 2577 2578 2579\n3 2580 2581 2582\n3 2583 2584 2585\n3 2586 2587 2588\n3 2589 2590 2591\n3 2592 2593 2594\n3 2595 2596 2597\n3 2598 2599 2600\n3 2601 2602 2603\n3 2604 2605 2606\n3 2607 2608 2609\n3 2610 2611 2612\n3 2613 2614 2615\n3 2616 2617 2618\n3 2619 2620 2621\n3 2622 2623 2624\n3 2625 2626 2627\n3 2628 2629 2630\n3 2631 2632 2633\n3 2634 2635 2636\n3 2637 2638 2639\n3 2640 2641 2642\n3 2643 2644 2645\n3 2646 2647 2648\n3 2649 2650 2651\n3 2652 2653 2654\n3 2655 2656 2657\n3 2658 2659 2660\n3 2661 2662 2663\n3 2664 2665 2666\n3 2667 2668 2669\n3 2670 2671 2672\n3 2673 2674 2675\n3 2676 2677 2678\n3 2679 2680 2681\n3 2682 2683 2684\n3 2685 2686 2687\n3 2688 2689 2690\n3 2691 2692 2693\n3 2694 2695 2696\n3 2697 2698 2699\n3 2700 2701 2702\n3 2703 2704 2705\n3 2706 2707 2708\n3 2709 2710 2711\n3 2712 2713 2714\n3 2715 2716 2717\n3 2718 2719 2720\n3 2721 2722 2723\n3 2724 2725 2726\n3 2727 2728 2729\n3 2730 2731 2732\n3 2733 2734 2735\n3 2736 2737 2738\n3 2739 2740 2741\n3 2742 2743 2744\n3 2745 2746 2747\n3 2748 2749 2750\n3 2751 2752 2753\n3 2754 2755 2756\n3 2757 2758 2759\n3 2760 2761 2762\n3 2763 2764 2765\n3 2766 2767 2768\n3 2769 2770 2771\n3 2772 2773 2774\n3 2775 2776 2777\n3 2778 2779 2780\n3 2781 2782 2783\n3 2784 2785 2786\n3 2787 2788 2789\n3 2790 2791 2792\n3 2793 2794 2795\n3 2796 2797 2798\n3 2799 2800 2801\n3 2802 2803 2804\n3 2805 2806 2807\n3 2808 2809 2810\n3 2811 2812 2813\n3 2814 2815 2816\n3 2817 2818 2819\n3 2820 2821 2822\n3 2823 2824 2825\n3 2826 2827 2828\n3 2829 2830 2831\n3 2832 2833 2834\n3 2835 2836 2837\n3 2838 2839 2840\n3 2841 2842 2843\n3 2844 2845 2846\n3 2847 2848 2849\n3 2850 2851 2852\n3 2853 2854 2855\n3 2856 2857 2858\n3 2859 2860 2861\n3 2862 2863 2864\n3 2865 2866 2867\n3 2868 2869 2870\n3 2871 2872 2873\n3 2874 2875 2876\n3 2877 2878 2879\n3 2880 2881 2882\n3 2883 2884 2885\n3 2886 2887 2888\n3 2889 2890 2891\n3 2892 2893 2894\n3 2895 2896 2897\n3 2898 2899 2900\n3 2901 2902 2903\n3 2904 2905 2906\n3 2907 2908 2909\n3 2910 2911 2912\n3 2913 2914 2915\n3 2916 2917 2918\n3 2919 2920 2921\n3 2922 2923 2924\n3 2925 2926 2927\n3 2928 2929 2930\n3 2931 2932 2933\n3 2934 2935 2936\n3 2937 2938 2939\n3 2940 2941 2942\n3 2943 2944 2945\n3 2946 2947 2948\n3 2949 2950 2951\n3 2952 2953 2954\n3 2955 2956 2957\n3 2958 2959 2960\n3 2961 2962 2963\n3 2964 2965 2966\n3 2967 2968 2969\n3 2970 2971 2972\n3 2973 2974 2975\n3 2976 2977 2978\n3 2979 2980 2981\n3 2982 2983 2984\n3 2985 2986 2987\n3 2988 2989 2990\n3 2991 2992 2993\n3 2994 2995 2996\n3 2997 2998 2999\n3 3000 3001 3002\n3 3003 3004 3005\n3 3006 3007 3008\n3 3009 3010 3011\n3 3012 3013 3014\n3 3015 3016 3017\n3 3018 3019 3020\n3 3021 3022 3023\n3 3024 3025 3026\n3 3027 3028 3029\n3 3030 3031 3032\n3 3033 3034 3035\n3 3036 3037 3038\n3 3039 3040 3041\n3 3042 3043 3044\n3 3045 3046 3047\n3 3048 3049 3050\n3 3051 3052 3053\n3 3054 3055 3056\n3 3057 3058 3059\n3 3060 3061 3062\n3 3063 3064 3065\n3 3066 3067 3068\n3 3069 3070 3071\n3 3072 3073 3074\n3 3075 3076 3077\n3 3078 3079 3080\n3 3081 3082 3083\n3 3084 3085 3086\n3 3087 3088 3089\n3 3090 3091 3092\n3 3093 3094 3095\n3 3096 3097 3098\n3 3099 3100 3101\n3 3102 3103 3104\n3 3105 3106 3107\n3 3108 3109 3110\n3 3111 3112 3113\n3 3114 3115 3116\n3 3117 3118 3119\n3 3120 3121 3122\n3 3123 3124 3125\n3 3126 3127 3128\n3 3129 3130 3131\n3 3132 3133 3134\n3 3135 3136 3137\n3 3138 3139 3140\n3 3141 3142 3143\n3 3144 3145 3146\n3 3147 3148 3149\n3 3150 3151 3152\n3 3153 3154 3155\n3 3156 3157 3158\n3 3159 3160 3161\n3 3162 3163 3164\n3 3165 3166 3167\n3 3168 3169 3170\n3 3171 3172 3173\n3 3174 3175 3176\n3 3177 3178 3179\n3 3180 3181 3182\n3 3183 3184 3185\n3 3186 3187 3188\n3 3189 3190 3191\n3 3192 3193 3194\n3 3195 3196 3197\n3 3198 3199 3200\n3 3201 3202 3203\n3 3204 3205 3206\n3 3207 3208 3209\n3 3210 3211 3212\n3 3213 3214 3215\n3 3216 3217 3218\n3 3219 3220 3221\n3 3222 3223 3224\n3 3225 3226 3227\n3 3228 3229 3230\n3 3231 3232 3233\n3 3234 3235 3236\n3 3237 3238 3239\n3 3240 3241 3242\n3 3243 3244 3245\n3 3246 3247 3248\n3 3249 3250 3251\n3 3252 3253 3254\n3 3255 3256 3257\n3 3258 3259 3260\n3 3261 3262 3263\n3 3264 3265 3266\n3 3267 3268 3269\n3 3270 3271 3272\n3 3273 3274 3275\n3 3276 3277 3278\n3 3279 3280 3281\n3 3282 3283 3284\n3 3285 3286 3287\n3 3288 3289 3290\n3 3291 3292 3293\n3 3294 3295 3296\n3 3297 3298 3299\n3 3300 3301 3302\n3 3303 3304 3305\n3 3306 3307 3308\n3 3309 3310 3311\n3 3312 3313 3314\n3 3315 3316 3317\n3 3318 3319 3320\n3 3321 3322 3323\n3 3324 3325 3326\n3 3327 3328 3329\n3 3330 3331 3332\n3 3333 3334 3335\n3 3336 3337 3338\n3 3339 3340 3341\n3 3342 3343 3344\n3 3345 3346 3347\n3 3348 3349 3350\n3 3351 3352 3353\n3 3354 3355 3356\n3 3357 3358 3359\n3 3360 3361 3362\n3 3363 3364 3365\n3 3366 3367 3368\n3 3369 3370 3371\n3 3372 3373 3374\n3 3375 3376 3377\n3 3378 3379 3380\n3 3381 3382 3383\n3 3384 3385 3386\n3 3387 3388 3389\n3 3390 3391 3392\n3 3393 3394 3395\n3 3396 3397 3398\n3 3399 3400 3401\n3 3402 3403 3404\n3 3405 3406 3407\n3 3408 3409 3410\n3 3411 3412 3413\n3 3414 3415 3416\n3 3417 3418 3419\n3 3420 3421 3422\n3 3423 3424 3425\n3 3426 3427 3428\n3 3429 3430 3431\n3 3432 3433 3434\n3 3435 3436 3437\n3 3438 3439 3440\n3 3441 3442 3443\n3 3444 3445 3446\n3 3447 3448 3449\n3 3450 3451 3452\n3 3453 3454 3455\n3 3456 3457 3458\n3 3459 3460 3461\n3 3462 3463 3464\n3 3465 3466 3467\n3 3468 3469 3470\n3 3471 3472 3473\n3 3474 3475 3476\n3 3477 3478 3479\n3 3480 3481 3482\n3 3483 3484 3485\n3 3486 3487 3488\n3 3489 3490 3491\n3 3492 3493 3494\n3 3495 3496 3497\n3 3498 3499 3500\n3 3501 3502 3503\n3 3504 3505 3506\n3 3507 3508 3509\n3 3510 3511 3512\n3 3513 3514 3515\n3 3516 3517 3518\n3 3519 3520 3521\n3 3522 3523 3524\n3 3525 3526 3527\n3 3528 3529 3530\n3 3531 3532 3533\n3 3534 3535 3536\n3 3537 3538 3539\n3 3540 3541 3542\n3 3543 3544 3545\n3 3546 3547 3548\n3 3549 3550 3551\n3 3552 3553 3554\n3 3555 3556 3557\n3 3558 3559 3560\n3 3561 3562 3563\n3 3564 3565 3566\n3 3567 3568 3569\n3 3570 3571 3572\n3 3573 3574 3575\n3 3576 3577 3578\n3 3579 3580 3581\n3 3582 3583 3584\n3 3585 3586 3587\n3 3588 3589 3590\n3 3591 3592 3593\n3 3594 3595 3596\n3 3597 3598 3599\n3 3600 3601 3602\n3 3603 3604 3605\n3 3606 3607 3608\n3 3609 3610 3611\n3 3612 3613 3614\n3 3615 3616 3617\n3 3618 3619 3620\n3 3621 3622 3623\n3 3624 3625 3626\n3 3627 3628 3629\n3 3630 3631 3632\n3 3633 3634 3635\n3 3636 3637 3638\n3 3639 3640 3641\n3 3642 3643 3644\n3 3645 3646 3647\n3 3648 3649 3650\n3 3651 3652 3653\n3 3654 3655 3656\n3 3657 3658 3659\n3 3660 3661 3662\n3 3663 3664 3665\n3 3666 3667 3668\n3 3669 3670 3671\n3 3672 3673 3674\n3 3675 3676 3677\n3 3678 3679 3680\n3 3681 3682 3683\n3 3684 3685 3686\n3 3687 3688 3689\n3 3690 3691 3692\n3 3693 3694 3695\n3 3696 3697 3698\n3 3699 3700 3701\n3 3702 3703 3704\n3 3705 3706 3707\n3 3708 3709 3710\n3 3711 3712 3713\n3 3714 3715 3716\n3 3717 3718 3719\n3 3720 3721 3722\n3 3723 3724 3725\n3 3726 3727 3728\n3 3729 3730 3731\n3 3732 3733 3734\n3 3735 3736 3737\n3 3738 3739 3740\n3 3741 3742 3743\n3 3744 3745 3746\n3 3747 3748 3749\n3 3750 3751 3752\n3 3753 3754 3755\n3 3756 3757 3758\n3 3759 3760 3761\n3 3762 3763 3764\n3 3765 3766 3767\n3 3768 3769 3770\n3 3771 3772 3773\n3 3774 3775 3776\n3 3777 3778 3779\n3 3780 3781 3782\n3 3783 3784 3785\n3 3786 3787 3788\n3 3789 3790 3791\n3 3792 3793 3794\n3 3795 3796 3797\n3 3798 3799 3800\n3 3801 3802 3803\n3 3804 3805 3806\n3 3807 3808 3809\n3 3810 3811 3812\n3 3813 3814 3815\n3 3816 3817 3818\n3 3819 3820 3821\n3 3822 3823 3824\n3 3825 3826 3827\n3 3828 3829 3830\n3 3831 3832 3833\n3 3834 3835 3836\n3 3837 3838 3839\n3 3840 3841 3842\n3 3843 3844 3845\n3 3846 3847 3848\n3 3849 3850 3851\n3 3852 3853 3854\n3 3855 3856 3857\n3 3858 3859 3860\n3 3861 3862 3863\n3 3864 3865 3866\n3 3867 3868 3869\n3 3870 3871 3872\n3 3873 3874 3875\n3 3876 3877 3878\n3 3879 3880 3881\n3 3882 3883 3884\n3 3885 3886 3887\n3 3888 3889 3890\n3 3891 3892 3893\n3 3894 3895 3896\n3 3897 3898 3899\n3 3900 3901 3902\n3 3903 3904 3905\n3 3906 3907 3908\n3 3909 3910 3911\n3 3912 3913 3914\n3 3915 3916 3917\n3 3918 3919 3920\n3 3921 3922 3923\n3 3924 3925 3926\n3 3927 3928 3929\n3 3930 3931 3932\n3 3933 3934 3935\n3 3936 3937 3938\n3 3939 3940 3941\n3 3942 3943 3944\n3 3945 3946 3947\n3 3948 3949 3950\n3 3951 3952 3953\n3 3954 3955 3956\n3 3957 3958 3959\n3 3960 3961 3962\n3 3963 3964 3965\n3 3966 3967 3968\n3 3969 3970 3971\n3 3972 3973 3974\n3 3975 3976 3977\n3 3978 3979 3980\n3 3981 3982 3983\n3 3984 3985 3986\n3 3987 3988 3989\n3 3990 3991 3992\n3 3993 3994 3995\n3 3996 3997 3998\n3 3999 4000 4001\n3 4002 4003 4004\n3 4005 4006 4007\n3 4008 4009 4010\n3 4011 4012 4013\n3 4014 4015 4016\n3 4017 4018 4019\n3 4020 4021 4022\n3 4023 4024 4025\n3 4026 4027 4028\n3 4029 4030 4031\n3 4032 4033 4034\n3 4035 4036 4037\n3 4038 4039 4040\n3 4041 4042 4043\n3 4044 4045 4046\n3 4047 4048 4049\n3 4050 4051 4052\n3 4053 4054 4055\n3 4056 4057 4058\n3 4059 4060 4061\n3 4062 4063 4064\n3 4065 4066 4067\n3 4068 4069 4070\n3 4071 4072 4073\n3 4074 4075 4076\n3 4077 4078 4079\n3 4080 4081 4082\n3 4083 4084 4085\n3 4086 4087 4088\n3 4089 4090 4091\n3 4092 4093 4094\n3 4095 4096 4097\n3 4098 4099 4100\n3 4101 4102 4103\n3 4104 4105 4106\n3 4107 4108 4109\n3 4110 4111 4112\n3 4113 4114 4115\n3 4116 4117 4118\n3 4119 4120 4121\n3 4122 4123 4124\n3 4125 4126 4127\n3 4128 4129 4130\n3 4131 4132 4133\n3 4134 4135 4136\n3 4137 4138 4139\n3 4140 4141 4142\n3 4143 4144 4145\n3 4146 4147 4148\n3 4149 4150 4151\n3 4152 4153 4154\n3 4155 4156 4157\n3 4158 4159 4160\n3 4161 4162 4163\n3 4164 4165 4166\n3 4167 4168 4169\n3 4170 4171 4172\n3 4173 4174 4175\n3 4176 4177 4178\n3 4179 4180 4181\n3 4182 4183 4184\n3 4185 4186 4187\n3 4188 4189 4190\n3 4191 4192 4193\n3 4194 4195 4196\n3 4197 4198 4199\n3 4200 4201 4202\n3 4203 4204 4205\n3 4206 4207 4208\n3 4209 4210 4211\n3 4212 4213 4214\n3 4215 4216 4217\n3 4218 4219 4220\n3 4221 4222 4223\n3 4224 4225 4226\n3 4227 4228 4229\n3 4230 4231 4232\n3 4233 4234 4235\n3 4236 4237 4238\n3 4239 4240 4241\n3 4242 4243 4244\n3 4245 4246 4247\n3 4248 4249 4250\n3 4251 4252 4253\n3 4254 4255 4256\n3 4257 4258 4259\n3 4260 4261 4262\n3 4263 4264 4265\n3 4266 4267 4268\n3 4269 4270 4271\n3 4272 4273 4274\n3 4275 4276 4277\n3 4278 4279 4280\n3 4281 4282 4283\n3 4284 4285 4286\n3 4287 4288 4289\n3 4290 4291 4292\n3 4293 4294 4295\n3 4296 4297 4298\n3 4299 4300 4301\n3 4302 4303 4304\n3 4305 4306 4307\n3 4308 4309 4310\n3 4311 4312 4313\n3 4314 4315 4316\n3 4317 4318 4319\n3 4320 4321 4322\n3 4323 4324 4325\n3 4326 4327 4328\n3 4329 4330 4331\n3 4332 4333 4334\n3 4335 4336 4337\n3 4338 4339 4340\n3 4341 4342 4343\n3 4344 4345 4346\n3 4347 4348 4349\n3 4350 4351 4352\n3 4353 4354 4355\n3 4356 4357 4358\n3 4359 4360 4361\n3 4362 4363 4364\n3 4365 4366 4367\n3 4368 4369 4370\n3 4371 4372 4373\n3 4374 4375 4376\n3 4377 4378 4379\n3 4380 4381 4382\n3 4383 4384 4385\n3 4386 4387 4388\n3 4389 4390 4391\n3 4392 4393 4394\n3 4395 4396 4397\n3 4398 4399 4400\n3 4401 4402 4403\n3 4404 4405 4406\n3 4407 4408 4409\n3 4410 4411 4412\n3 4413 4414 4415\n3 4416 4417 4418\n3 4419 4420 4421\n3 4422 4423 4424\n3 4425 4426 4427\n3 4428 4429 4430\n3 4431 4432 4433\n3 4434 4435 4436\n3 4437 4438 4439\n3 4440 4441 4442\n3 4443 4444 4445\n3 4446 4447 4448\n3 4449 4450 4451\n3 4452 4453 4454\n3 4455 4456 4457\n3 4458 4459 4460\n3 4461 4462 4463\n3 4464 4465 4466\n3 4467 4468 4469\n3 4470 4471 4472\n3 4473 4474 4475\n3 4476 4477 4478\n3 4479 4480 4481\n3 4482 4483 4484\n3 4485 4486 4487\n3 4488 4489 4490\n3 4491 4492 4493\n3 4494 4495 4496\n3 4497 4498 4499\n3 4500 4501 4502\n3 4503 4504 4505\n3 4506 4507 4508\n3 4509 4510 4511\n3 4512 4513 4514\n3 4515 4516 4517\n3 4518 4519 4520\n3 4521 4522 4523\n3 4524 4525 4526\n3 4527 4528 4529\n3 4530 4531 4532\n3 4533 4534 4535\n3 4536 4537 4538\n3 4539 4540 4541\n3 4542 4543 4544\n3 4545 4546 4547\n3 4548 4549 4550\n3 4551 4552 4553\n3 4554 4555 4556\n3 4557 4558 4559\n3 4560 4561 4562\n3 4563 4564 4565\n3 4566 4567 4568\n3 4569 4570 4571\n3 4572 4573 4574\n3 4575 4576 4577\n3 4578 4579 4580\n3 4581 4582 4583\n3 4584 4585 4586\n3 4587 4588 4589\n3 4590 4591 4592\n3 4593 4594 4595\n3 4596 4597 4598\n3 4599 4600 4601\n3 4602 4603 4604\n3 4605 4606 4607\n3 4608 4609 4610\n3 4611 4612 4613\n3 4614 4615 4616\n3 4617 4618 4619\n3 4620 4621 4622\n3 4623 4624 4625\n3 4626 4627 4628\n3 4629 4630 4631\n3 4632 4633 4634\n3 4635 4636 4637\n3 4638 4639 4640\n3 4641 4642 4643\n3 4644 4645 4646\n3 4647 4648 4649\n3 4650 4651 4652\n3 4653 4654 4655\n3 4656 4657 4658\n3 4659 4660 4661\n3 4662 4663 4664\n3 4665 4666 4667\n3 4668 4669 4670\n3 4671 4672 4673\n3 4674 4675 4676\n3 4677 4678 4679\n3 4680 4681 4682\n3 4683 4684 4685\n3 4686 4687 4688\n3 4689 4690 4691\n3 4692 4693 4694\n3 4695 4696 4697\n3 4698 4699 4700\n3 4701 4702 4703\n3 4704 4705 4706\n3 4707 4708 4709\n3 4710 4711 4712\n3 4713 4714 4715\n3 4716 4717 4718\n3 4719 4720 4721\n3 4722 4723 4724\n3 4725 4726 4727\n3 4728 4729 4730\n3 4731 4732 4733\n3 4734 4735 4736\n3 4737 4738 4739\n3 4740 4741 4742\n3 4743 4744 4745\n3 4746 4747 4748\n3 4749 4750 4751\n3 4752 4753 4754\n3 4755 4756 4757\n3 4758 4759 4760\n3 4761 4762 4763\n3 4764 4765 4766\n3 4767 4768 4769\n3 4770 4771 4772\n3 4773 4774 4775\n3 4776 4777 4778\n3 4779 4780 4781\n3 4782 4783 4784\n3 4785 4786 4787\n3 4788 4789 4790\n3 4791 4792 4793\n3 4794 4795 4796\n3 4797 4798 4799\n3 4800 4801 4802\n3 4803 4804 4805\n3 4806 4807 4808\n3 4809 4810 4811\n3 4812 4813 4814\n3 4815 4816 4817\n3 4818 4819 4820\n3 4821 4822 4823\n3 4824 4825 4826\n3 4827 4828 4829\n3 4830 4831 4832\n3 4833 4834 4835\n3 4836 4837 4838\n3 4839 4840 4841\n3 4842 4843 4844\n3 4845 4846 4847\n3 4848 4849 4850\n3 4851 4852 4853\n3 4854 4855 4856\n3 4857 4858 4859\n3 4860 4861 4862\n3 4863 4864 4865\n3 4866 4867 4868\n3 4869 4870 4871\n3 4872 4873 4874\n3 4875 4876 4877\n3 4878 4879 4880\n3 4881 4882 4883\n3 4884 4885 4886\n3 4887 4888 4889\n3 4890 4891 4892\n3 4893 4894 4895\n3 4896 4897 4898\n3 4899 4900 4901\n3 4902 4903 4904\n3 4905 4906 4907\n3 4908 4909 4910\n3 4911 4912 4913\n3 4914 4915 4916\n3 4917 4918 4919\n3 4920 4921 4922\n3 4923 4924 4925\n3 4926 4927 4928\n3 4929 4930 4931\n3 4932 4933 4934\n3 4935 4936 4937\n3 4938 4939 4940\n3 4941 4942 4943\n3 4944 4945 4946\n3 4947 4948 4949\n3 4950 4951 4952\n3 4953 4954 4955\n3 4956 4957 4958\n3 4959 4960 4961\n3 4962 4963 4964\n3 4965 4966 4967\n3 4968 4969 4970\n3 4971 4972 4973\n3 4974 4975 4976\n3 4977 4978 4979\n3 4980 4981 4982\n3 4983 4984 4985\n3 4986 4987 4988\n3 4989 4990 4991\n3 4992 4993 4994\n3 4995 4996 4997\n3 4998 4999 5000\n3 5001 5002 5003\n3 5004 5005 5006\n3 5007 5008 5009\n3 5010 5011 5012\n3 5013 5014 5015\n3 5016 5017 5018\n3 5019 5020 5021\n3 5022 5023 5024\n3 5025 5026 5027\n3 5028 5029 5030\n3 5031 5032 5033\n3 5034 5035 5036\n3 5037 5038 5039\n3 5040 5041 5042\n3 5043 5044 5045\n3 5046 5047 5048\n3 5049 5050 5051\n3 5052 5053 5054\n3 5055 5056 5057\n3 5058 5059 5060\n3 5061 5062 5063\n3 5064 5065 5066\n3 5067 5068 5069\n3 5070 5071 5072\n3 5073 5074 5075\n3 5076 5077 5078\n3 5079 5080 5081\n3 5082 5083 5084\n3 5085 5086 5087\n3 5088 5089 5090\n3 5091 5092 5093\n3 5094 5095 5096\n3 5097 5098 5099\n3 5100 5101 5102\n3 5103 5104 5105\n3 5106 5107 5108\n3 5109 5110 5111\n3 5112 5113 5114\n3 5115 5116 5117\n3 5118 5119 5120\n3 5121 5122 5123\n3 5124 5125 5126\n3 5127 5128 5129\n3 5130 5131 5132\n3 5133 5134 5135\n3 5136 5137 5138\n3 5139 5140 5141\n3 5142 5143 5144\n3 5145 5146 5147\n3 5148 5149 5150\n3 5151 5152 5153\n3 5154 5155 5156\n3 5157 5158 5159\n3 5160 5161 5162\n3 5163 5164 5165\n3 5166 5167 5168\n3 5169 5170 5171\n3 5172 5173 5174\n3 5175 5176 5177\n3 5178 5179 5180\n3 5181 5182 5183\n3 5184 5185 5186\n3 5187 5188 5189\n3 5190 5191 5192\n3 5193 5194 5195\n3 5196 5197 5198\n3 5199 5200 5201\n3 5202 5203 5204\n3 5205 5206 5207\n3 5208 5209 5210\n3 5211 5212 5213\n3 5214 5215 5216\n3 5217 5218 5219\n3 5220 5221 5222\n3 5223 5224 5225\n3 5226 5227 5228\n3 5229 5230 5231\n3 5232 5233 5234\n3 5235 5236 5237\n3 5238 5239 5240\n3 5241 5242 5243\n3 5244 5245 5246\n3 5247 5248 5249\n3 5250 5251 5252\n3 5253 5254 5255\n3 5256 5257 5258\n3 5259 5260 5261\n3 5262 5263 5264\n3 5265 5266 5267\n3 5268 5269 5270\n3 5271 5272 5273\n3 5274 5275 5276\n3 5277 5278 5279\n3 5280 5281 5282\n3 5283 5284 5285\n3 5286 5287 5288\n3 5289 5290 5291\n3 5292 5293 5294\n3 5295 5296 5297\n3 5298 5299 5300\n3 5301 5302 5303\n3 5304 5305 5306\n3 5307 5308 5309\n3 5310 5311 5312\n3 5313 5314 5315\n3 5316 5317 5318\n3 5319 5320 5321\n3 5322 5323 5324\n3 5325 5326 5327\n3 5328 5329 5330\n3 5331 5332 5333\n3 5334 5335 5336\n3 5337 5338 5339\n3 5340 5341 5342\n3 5343 5344 5345\n3 5346 5347 5348\n3 5349 5350 5351\n3 5352 5353 5354\n3 5355 5356 5357\n3 5358 5359 5360\n3 5361 5362 5363\n3 5364 5365 5366\n3 5367 5368 5369\n3 5370 5371 5372\n3 5373 5374 5375\n3 5376 5377 5378\n3 5379 5380 5381\n3 5382 5383 5384\n3 5385 5386 5387\n3 5388 5389 5390\n3 5391 5392 5393\n3 5394 5395 5396\n3 5397 5398 5399\n3 5400 5401 5402\n3 5403 5404 5405\n3 5406 5407 5408\n3 5409 5410 5411\n3 5412 5413 5414\n3 5415 5416 5417\n3 5418 5419 5420\n3 5421 5422 5423\n3 5424 5425 5426\n3 5427 5428 5429\n3 5430 5431 5432\n3 5433 5434 5435\n3 5436 5437 5438\n3 5439 5440 5441\n3 5442 5443 5444\n3 5445 5446 5447\n3 5448 5449 5450\n3 5451 5452 5453\n3 5454 5455 5456\n3 5457 5458 5459\n3 5460 5461 5462\n3 5463 5464 5465\n3 5466 5467 5468\n3 5469 5470 5471\n3 5472 5473 5474\n3 5475 5476 5477\n3 5478 5479 5480\n3 5481 5482 5483\n3 5484 5485 5486\n3 5487 5488 5489\n3 5490 5491 5492\n3 5493 5494 5495\n3 5496 5497 5498\n3 5499 5500 5501\n3 5502 5503 5504\n3 5505 5506 5507\n3 5508 5509 5510\n3 5511 5512 5513\n3 5514 5515 5516\n3 5517 5518 5519\n3 5520 5521 5522\n3 5523 5524 5525\n3 5526 5527 5528\n3 5529 5530 5531\n3 5532 5533 5534\n3 5535 5536 5537\n3 5538 5539 5540\n3 5541 5542 5543\n3 5544 5545 5546\n3 5547 5548 5549\n3 5550 5551 5552\n3 5553 5554 5555\n3 5556 5557 5558\n3 5559 5560 5561\n3 5562 5563 5564\n3 5565 5566 5567\n3 5568 5569 5570\n3 5571 5572 5573\n3 5574 5575 5576\n3 5577 5578 5579\n3 5580 5581 5582\n3 5583 5584 5585\n3 5586 5587 5588\n3 5589 5590 5591\n3 5592 5593 5594\n3 5595 5596 5597\n3 5598 5599 5600\n3 5601 5602 5603\n3 5604 5605 5606\n3 5607 5608 5609\n3 5610 5611 5612\n3 5613 5614 5615\n3 5616 5617 5618\n3 5619 5620 5621\n3 5622 5623 5624\n3 5625 5626 5627\n3 5628 5629 5630\n3 5631 5632 5633\n3 5634 5635 5636\n3 5637 5638 5639\n3 5640 5641 5642\n3 5643 5644 5645\n3 5646 5647 5648\n3 5649 5650 5651\n3 5652 5653 5654\n3 5655 5656 5657\n3 5658 5659 5660\n3 5661 5662 5663\n3 5664 5665 5666\n3 5667 5668 5669\n3 5670 5671 5672\n3 5673 5674 5675\n3 5676 5677 5678\n3 5679 5680 5681\n3 5682 5683 5684\n3 5685 5686 5687\n3 5688 5689 5690\n3 5691 5692 5693\n3 5694 5695 5696\n3 5697 5698 5699\n3 5700 5701 5702\n3 5703 5704 5705\n3 5706 5707 5708\n3 5709 5710 5711\n3 5712 5713 5714\n3 5715 5716 5717\n3 5718 5719 5720\n3 5721 5722 5723\n3 5724 5725 5726\n3 5727 5728 5729\n3 5730 5731 5732\n3 5733 5734 5735\n3 5736 5737 5738\n3 5739 5740 5741\n3 5742 5743 5744\n3 5745 5746 5747\n3 5748 5749 5750\n3 5751 5752 5753\n3 5754 5755 5756\n3 5757 5758 5759\n3 5760 5761 5762\n3 5763 5764 5765\n3 5766 5767 5768\n3 5769 5770 5771\n3 5772 5773 5774\n3 5775 5776 5777\n3 5778 5779 5780\n3 5781 5782 5783\n3 5784 5785 5786\n3 5787 5788 5789\n3 5790 5791 5792\n3 5793 5794 5795\n3 5796 5797 5798\n3 5799 5800 5801\n3 5802 5803 5804\n3 5805 5806 5807\n3 5808 5809 5810\n3 5811 5812 5813\n3 5814 5815 5816\n3 5817 5818 5819\n3 5820 5821 5822\n3 5823 5824 5825\n3 5826 5827 5828\n3 5829 5830 5831\n3 5832 5833 5834\n3 5835 5836 5837\n3 5838 5839 5840\n3 5841 5842 5843\n3 5844 5845 5846\n3 5847 5848 5849\n3 5850 5851 5852\n3 5853 5854 5855\n3 5856 5857 5858\n3 5859 5860 5861\n3 5862 5863 5864\n3 5865 5866 5867\n3 5868 5869 5870\n3 5871 5872 5873\n3 5874 5875 5876\n3 5877 5878 5879\n3 5880 5881 5882\n3 5883 5884 5885\n3 5886 5887 5888\n3 5889 5890 5891\n3 5892 5893 5894\n3 5895 5896 5897\n3 5898 5899 5900\n3 5901 5902 5903\n3 5904 5905 5906\n3 5907 5908 5909\n3 5910 5911 5912\n3 5913 5914 5915\n3 5916 5917 5918\n3 5919 5920 5921\n3 5922 5923 5924\n3 5925 5926 5927\n3 5928 5929 5930\n3 5931 5932 5933\n3 5934 5935 5936\n3 5937 5938 5939\n3 5940 5941 5942\n3 5943 5944 5945\n3 5946 5947 5948\n3 5949 5950 5951\n3 5952 5953 5954\n3 5955 5956 5957\n3 5958 5959 5960\n3 5961 5962 5963\n3 5964 5965 5966\n3 5967 5968 5969\n3 5970 5971 5972\n3 5973 5974 5975\n3 5976 5977 5978\n3 5979 5980 5981\n3 5982 5983 5984\n3 5985 5986 5987\n3 5988 5989 5990\n3 5991 5992 5993\n3 5994 5995 5996\n3 5997 5998 5999\n3 6000 6001 6002\n3 6003 6004 6005\n3 6006 6007 6008\n3 6009 6010 6011\n3 6012 6013 6014\n3 6015 6016 6017\n3 6018 6019 6020\n3 6021 6022 6023\n3 6024 6025 6026\n3 6027 6028 6029\n3 6030 6031 6032\n3 6033 6034 6035\n3 6036 6037 6038\n3 6039 6040 6041\n3 6042 6043 6044\n3 6045 6046 6047\n3 6048 6049 6050\n3 6051 6052 6053\n3 6054 6055 6056\n3 6057 6058 6059\n3 6060 6061 6062\n3 6063 6064 6065\n3 6066 6067 6068\n3 6069 6070 6071\n3 6072 6073 6074\n3 6075 6076 6077\n");

      _export("__useDefault", __useDefault);

      _export("default", __useDefault);
    }
  };
});
$__System.register("31", [], function (_export, _context) {
  "use strict";

  var __useDefault;

  return {
    setters: [],
    execute: function () {
      _export("__useDefault", __useDefault = "\r\nvarying vec4 vColor;\r\n\r\nvoid main () {\r\n\tgl_FragColor = vColor;\r\n}");

      _export("__useDefault", __useDefault);

      _export("default", __useDefault);
    }
  };
});
$__System.register("32", [], function (_export, _context) {
  "use strict";

  var __useDefault;

  return {
    setters: [],
    execute: function () {
      _export("__useDefault", __useDefault = "uniform float tone;\r\nuniform float strength;\r\nuniform sampler2D texBase;\r\nuniform sampler2D texBlur;\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main(void) {\r\n\tfloat treshold = .7;\r\n\tfloat range = .5;\r\n\tfloat intensity = .1;\r\n  // gl_FragColor = texture2D(texBase, vUv) + smoothstep(treshold, treshold+range, texture2D(texBlur, vUv)) * intensity;\r\n  gl_FragColor = texture2D(texBase, vUv) + texture2D(texBlur, vUv) * 2.;\r\n}\r\n");

      _export("__useDefault", __useDefault);

      _export("default", __useDefault);
    }
  };
});
$__System.register("33", [], function (_export, _context) {
  "use strict";

  var __useDefault;

  return {
    setters: [],
    execute: function () {
      _export("__useDefault", __useDefault = "varying vec2 vUv;\r\n\r\nvoid main(void) {\r\n  vUv = uv;\r\n  gl_Position = vec4(position, 1.0);\r\n}\r\n");

      _export("__useDefault", __useDefault);

      _export("default", __useDefault);
    }
  };
});
$__System.register("34", [], function (_export, _context) {
  "use strict";

  var __useDefault;

  return {
    setters: [],
    execute: function () {
      _export("__useDefault", __useDefault = "uniform float minBright, brighty;\r\nuniform sampler2D texture;\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main(void) {\r\n  gl_FragColor = clamp(texture2D(texture, vUv), 0., 1.);\r\n}\r\n");

      _export("__useDefault", __useDefault);

      _export("default", __useDefault);
    }
  };
});
$__System.register("35", [], function (_export, _context) {
  "use strict";

  var __useDefault;

  return {
    setters: [],
    execute: function () {
      _export("__useDefault", __useDefault = "varying vec2 vUv;\r\n\r\nvoid main(void) {\r\n  vUv = uv;\r\n  gl_Position = vec4(position, 1.0);\r\n}\r\n");

      _export("__useDefault", __useDefault);

      _export("default", __useDefault);
    }
  };
});
$__System.register("36", [], function (_export, _context) {
  "use strict";

  var __useDefault;

  return {
    setters: [],
    execute: function () {
      _export("__useDefault", __useDefault = "uniform vec2 resolution;\r\nuniform vec2 direction;\r\nuniform sampler2D texture;\r\nuniform float weight[10];\r\n\r\nvarying vec2 vUv;\r\n\r\n// #pragma glslify: blur13 = require('glsl-fast-gaussian-blur/13')\r\n// #pragma glslify: blur9 = require('glsl-fast-gaussian-blur/9')\r\n// #pragma glslify: blur5 = require('glsl-fast-gaussian-blur/5')\r\n\r\nvec4 blur9(sampler2D image, vec2 uv, vec2 resolution, vec2 direction) {\r\n  vec4 color = vec4(0.0);\r\n  vec2 off1 = vec2(0.5846153846) * direction;\r\n  vec2 off2 = vec2(0.52307692308) * direction;\r\n  color += texture2D(image, uv) * 0.2270270270;\r\n  color += texture2D(image, uv + (off1 / resolution)) * 0.3162162162;\r\n  color += texture2D(image, uv - (off1 / resolution)) * 0.3162162162;\r\n  color += texture2D(image, uv + (off2 / resolution)) * 0.0702702703;\r\n  color += texture2D(image, uv - (off2 / resolution)) * 0.0702702703;\r\n  return color;\r\n}\r\n\r\nfloat gaussianPdf(in float x, in float sigma) {\r\n  return 0.39894 * exp( -0.5 * x * x/(sigma * sigma))/sigma;\r\n}\r\n\r\nvoid main(void) {\r\n  gl_FragColor = blur9(texture, vUv, resolution, direction);\r\n}\r\n");

      _export("__useDefault", __useDefault);

      _export("default", __useDefault);
    }
  };
});
$__System.register("37", [], function (_export, _context) {
  "use strict";

  var __useDefault;

  return {
    setters: [],
    execute: function () {
      _export("__useDefault", __useDefault = "varying vec2 vUv;\r\n\r\nvoid main(void) {\r\n  vUv = uv;\r\n  gl_Position = vec4(position, 1.0);\r\n}\r\n");

      _export("__useDefault", __useDefault);

      _export("default", __useDefault);
    }
  };
});
$__System.register("38", [], function (_export, _context) {
  "use strict";

  var __useDefault;

  return {
    setters: [],
    execute: function () {
      _export("__useDefault", __useDefault = "\r\n\r\nuniform sampler2D frametarget;\r\nuniform vec2 resolution, mouse;\r\nuniform float time;\r\nvarying vec2 vUv;\r\n\r\nvoid main () {\r\n\tvec4 color = edgeSD(frametarget, vUv, resolution);\r\n\tgl_FragColor = clamp(color, 0., 1.);\r\n}\r\n");

      _export("__useDefault", __useDefault);

      _export("default", __useDefault);
    }
  };
});
$__System.register("39", [], function (_export, _context) {
  "use strict";

  var __useDefault;

  return {
    setters: [],
    execute: function () {
      _export("__useDefault", __useDefault = "\r\nvarying vec2 vUv;\r\n\r\nvoid main () {\r\n\tvUv = uv;\r\n\tgl_Position = vec4(uv * 2. - 1., 0., 1.);\r\n}");

      _export("__useDefault", __useDefault);

      _export("default", __useDefault);
    }
  };
});
$__System.register("3a", [], function (_export, _context) {
  "use strict";

  var __useDefault;

  return {
    setters: [],
    execute: function () {
      _export("__useDefault", __useDefault = "\r\nuniform sampler2D framebuffer, frametarget, frameedge, bloom, blur, textTexture, creditTexture, cookieTexture, jobsTexture;\r\nuniform vec2 resolution, mouse;\r\nuniform vec3 Scratch, Texting, Bloom, ExtraBloom, Circle, Circle2, Circle3, TextingScreen, Credits, Cookie, Rideau;\r\nuniform float time;\r\nvarying vec2 vUv;\r\n\r\nvoid main () {\r\n\r\n\tvec2 uv = vUv;\r\n\tuv = uv * 2. - 1.;\r\n\tvec2 p = uv;\r\n\tp.x *= resolution.x/resolution.y;\r\n\t// uv *= 1.-.5*sin(Circle.y*PI);\r\n\t// uv *= rot(Circle.y*TAU);\r\n\t// uv = mix(uv, .1/uv, sin(Circle.y*PI));\r\n\tuv = uv * .5 + .5;\r\n\t// uv.x *= resolution.y/resolution.x;\r\n\r\n\tvec4 color = texture2D(frametarget, uv);\r\n\tvec4 blu = texture2D(blur, uv) * (Bloom.y + ExtraBloom.y);\r\n\tvec4 edgy = texture2D(frameedge, uv);\r\n\tedgy = clamp(abs(edgy), 0., 1.);\r\n\r\n\tvec2 uvtext = uv*2.-1.;\r\n\tuvtext.x *= resolution.x/resolution.y;\r\n\tuvtext.x += (random(floor(uvtext.yy*64.+time)/64.)*2.-1.) * Scratch.y;\r\n\tuvtext = uvtext * .5 + .5;\r\n\tvec4 title = texture2D(textTexture, uvtext);\r\n\tvec4 credit = texture2D(creditTexture, uvtext);\r\n\tvec4 jobs = texture2D(jobsTexture, uvtext);\r\n\r\n\tfloat lod = 64.;\r\n\tfloat zip = 1.-abs(sin(random(floor(uv.yy*lod)/lod) + time * 2. + uv.y * 4.));\r\n\tvec4 creds = mix(credit, jobs, zip);\r\n\r\n\tvec4 cookie = texture2D(cookieTexture, uvtext);\r\n\r\n\tcolor = blu + edgy;\r\n\r\n\tcolor = mix(color, 1.-color, smoothstep(Circle.y+.01,Circle.y, length(p)));\r\n\tcolor = mix(color, 1.-color, smoothstep(Circle2.y+.01,Circle2.y, length(p)));\r\n\tcolor = mix(color, 1.-color, smoothstep(Circle3.y+.01,Circle3.y, length(p)));\r\n\r\n\tcolor = mix(color, 1.-color, title.r * TextingScreen.y);\r\n\tcolor = mix(color, 1.-color, creds.r * Credits.y);\r\n\tcolor = mix(color, 1.-color, cookie.r * Cookie.y);\r\n\r\n\tcolor *= Rideau.y;\r\n\r\n\tgl_FragColor = color;\r\n}\r\n");

      _export("__useDefault", __useDefault);

      _export("default", __useDefault);
    }
  };
});
$__System.register("3b", [], function (_export, _context) {
  "use strict";

  var __useDefault;

  return {
    setters: [],
    execute: function () {
      _export("__useDefault", __useDefault = "\r\nvarying vec2 vUV;\r\nvarying vec3 vNormal, vView;\r\n\r\nvoid main () {\r\n\tgl_FragColor = vec4(1);\r\n}");

      _export("__useDefault", __useDefault);

      _export("default", __useDefault);
    }
  };
});
$__System.register("3c", [], function (_export, _context) {
  "use strict";

  var __useDefault;

  return {
    setters: [],
    execute: function () {
      _export("__useDefault", __useDefault = "\r\nattribute vec2 anchor, quantity;\r\nuniform vec3 cameraPos, cameraTarget, Points, Scratch, Dust, Curves, CurveOut, CurveTwist, CurveCurve, CurveRolling;\r\nuniform vec2 resolution;\r\nuniform float time;\r\nvarying vec2 vUV;\r\nvarying vec3 vNormal, vView;\r\n\r\nvoid displace (inout vec3 p, float y) {\r\n\tp.xz *= rot(y);\r\n\tp.yz *= rot(y);\r\n\tvec3 dir = normalize(p);\r\n\tp += dir * CurveOut.y * sin(y*2.) * 4.;\r\n\tp.x += 1.*CurveTwist.y;\r\n\tp.xz *= rot((p.y+p.z) * CurveTwist.y * .5+CurveRolling.y);\r\n\tp.xy *= rot((p.x+p.z) * CurveTwist.y * 1.+CurveRolling.y);\r\n\tp.x -= 1.*CurveTwist.y;\r\n}\r\n\r\nvoid main () {\r\n\r\n\tfloat salt = random(quantity.xx);\r\n\tfloat size = .02 * Curves.y;\r\n\r\n\tfloat y = sin(time + anchor.y);\r\n\tfloat fade = y*.5+.5;\r\n\tvec3 pos = normalize(position);//mix(vec3(0), position, fade);\r\n\t// vec3 forward = normalize(cameraPos - pos);\r\n\t// vec3 right = normalize(cross(forward, vec3(0,1,0)));\r\n\t// vec3 up = normalize(cross(right, forward));\r\n\r\n\tvec3 next = pos;\r\n\r\n\ty = anchor.y + time * 4. + quantity.x;\r\n\tdisplace(pos, y);\r\n\r\n\ty = anchor.y + time * 4. + quantity.x + .01;\r\n\tdisplace(next, y);\r\n\r\n\tvec3 up = normalize(pos);\r\n\tvec3 forward = normalize(next-pos);\r\n\tvec3 right = normalize(cross(up, forward));\r\n\r\n\tpos += (anchor.x * right + anchor.y * forward) * size;\r\n\r\n\tvView = cameraPos - pos;\r\n\tvUV = anchor;\r\n\r\n\tgl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(pos, 1);\r\n}\r\n");

      _export("__useDefault", __useDefault);

      _export("default", __useDefault);
    }
  };
});
$__System.register("3d", [], function (_export, _context) {
  "use strict";

  var __useDefault;

  return {
    setters: [],
    execute: function () {
      _export("__useDefault", __useDefault = "\r\nattribute vec2 anchor, quantity;\r\nattribute vec3 color, next;\r\nuniform vec3 cameraPos, cameraTarget, Geo, Cracking, Itching, Rolling;\r\nuniform vec2 resolution;\r\nuniform float time;\r\nvarying vec2 vUV;\r\nvarying vec4 vColor;\r\n\r\nvoid main () {\r\n\r\n\tfloat size = 0.001;\r\n\tfloat salt = random(quantity.xx);\r\n\tsize += Itching.y*.005;\r\n\tsize *= step(.7, salt);\r\n\r\n\tvec3 pos = position;\r\n\tvec3 nxt = next;\r\n\r\n\tmat2 rr = rot(Rolling.y + quantity.y);\r\n\r\n\tvec3 offset = normalize(position) * Cracking.y * salt;\r\n\tfloat r = (random(anchor.yy+fract(time))*2.-1.);\r\n\toffset *= 1. + smoothstep(.8, .9, abs(anchor.y))*r*.2 * Itching.y*smoothstep(.5, 1., salt);\r\n\tpos += offset;\r\n\tnxt += offset;\r\n\r\n\tpos.xy *= rr;\r\n\tpos.xz *= rr;\r\n\tnxt.xy *= rr;\r\n\tnxt.xz *= rr;\r\n\r\n\tfloat y = anchor.y * .5 + .5;\r\n\tvec4 sPos = projectionMatrix * viewMatrix * modelMatrix * vec4(pos, 1);\r\n\tvec4 sNxt = projectionMatrix * viewMatrix * modelMatrix * vec4(nxt, 1);\r\n\tvec2 forward = normalize(sNxt.xy-sPos.xy);\r\n\tvec2 right = vec2(forward.y, -forward.x);\r\n\tvec2 zw = mix(sPos.zw, sNxt.zw, y);\r\n\tgl_Position = vec4(mix(sPos.xy, sNxt.xy, y) + right * anchor.x * size, zw);\r\n\r\n\t// pos.xy += anchor * size;\r\n\tvColor = vec4(1);\r\n\r\n\t// gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(pos, 1);\r\n}\r\n");

      _export("__useDefault", __useDefault);

      _export("default", __useDefault);
    }
  };
});
$__System.register("3e", [], function (_export, _context) {
  "use strict";

  var __useDefault;

  return {
    setters: [],
    execute: function () {
      _export("__useDefault", __useDefault = "\r\nvarying vec2 vUV;\r\nvarying vec3 vNormal, vView;\r\n\r\nvoid main () {\r\n\tvec3 color = abs(vNormal);\r\n\t// float lod = 4.;\r\n\t// color = floor(color*lod)/lod;\r\n\tcolor = vec3(luminance(color));\r\n\t\r\n\tgl_FragColor = clamp(vec4(color,1), 0., 1.);\r\n}\r\n");

      _export("__useDefault", __useDefault);

      _export("default", __useDefault);
    }
  };
});
$__System.register("3f", [], function (_export, _context) {
  "use strict";

  var __useDefault;

  return {
    setters: [],
    execute: function () {
      _export("__useDefault", __useDefault = "\r\nattribute vec2 anchor, quantity;\r\nattribute vec3 color, next;\r\nuniform vec3 cameraPos, cameraTarget, Geo, EggBreak, Crack, Cracking, Scratching, CurveTwist;\r\nuniform vec2 resolution;\r\nuniform float time;\r\nvarying vec2 vUV;\r\nvarying vec3 vNormal, vView;\r\n\r\nvoid main () {\r\n\r\n\tvec3 pos = position * Geo.y;\r\n\tfloat l = mod(time, 1.);\r\n\tfloat fade = smoothstep(1., .5, length(pos-Crack));\r\n\tfade = mix(fade, 1., CurveTwist.y);\r\n\t// pos += normal * random(pos.xy) * fade;\r\n\t// pos.y += sin(l*PI) * fade * .2;\r\n\t// pos.xz += normal.xz * l * fade;\r\n\tfloat salt = random(pos.xy);\r\n\tfloat curry = random(normal.xy);\r\n\tpos.xyz += normal * salt * fade * .1 * Scratching.y;\r\n\tfade = smoothstep(-.5, 0., pos.y);\r\n\tfade = mix(fade, 1., CurveTwist.y);\r\n\tpos.xyz += normal * (Cracking.y+curry*Cracking.y) * fade;\r\n\t// pos.y = mix(pos.y, -1., (1.-sin(Cracking.y * PI + curry))*Cracking.y * fade);\r\n\tvView = cameraPos - pos;\r\n\tvUV = anchor;\r\n\tvNormal = normal;\r\n\r\n\tgl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(pos, 1);\r\n}\r\n");

      _export("__useDefault", __useDefault);

      _export("default", __useDefault);
    }
  };
});
$__System.register("40", [], function (_export, _context) {
  "use strict";

  var __useDefault;

  return {
    setters: [],
    execute: function () {
      _export("__useDefault", __useDefault = "\r\nuniform sampler2D textTexture;\r\nuniform vec3 Scratch, Texting;\r\nuniform float time;\r\nvarying vec2 vUV;\r\n\r\nvoid main () {\r\n\tvec2 uv = vUV;\r\n\tuv.x = 1.-uv.x;\r\n\r\n\t// float fade = .02/abs(uv.y*2.-1.-.02);\r\n\tfloat fade = smoothstep(.05, .5, abs(uv.y*2.-1.-.02));\r\n\r\n\tuv.xy += (random(floor((uv.yy+uv.xx)*128.)/128.)*2.-1.) * Scratch.y * fade;\r\n\r\n\tvec4 color = texture2D(textTexture, uv);\r\n\tgl_FragColor = color * Texting.y;\r\n}");

      _export("__useDefault", __useDefault);

      _export("default", __useDefault);
    }
  };
});
$__System.register("41", [], function (_export, _context) {
  "use strict";

  var __useDefault;

  return {
    setters: [],
    execute: function () {
      _export("__useDefault", __useDefault = "\r\nuniform vec3 cameraPos, cameraTarget;\r\nuniform vec2 resolution;\r\nuniform float time;\r\nuniform vec3 Text, Texting;\r\nvarying vec2 vUV;\r\n\r\nvoid main () {\r\n\r\n\tvec3 pos = position + Text;\r\n\tvUV = uv;\r\n\tgl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(pos, 1);\r\n}\r\n");

      _export("__useDefault", __useDefault);

      _export("default", __useDefault);
    }
  };
});
$__System.register("42", [], function (_export, _context) {
  "use strict";

  var __useDefault;

  return {
    setters: [],
    execute: function () {
      _export("__useDefault", __useDefault = "\r\nattribute vec2 anchor, quantity;\r\nuniform vec3 cameraPos, cameraTarget, Points, Scratching, Dust;\r\nuniform vec2 resolution;\r\nuniform float time;\r\nvarying vec2 vUV;\r\nvarying vec4 vColor;\r\n\r\nvoid main () {\r\n\r\n\tfloat salt = random(quantity.xx);\r\n\tfloat size = .005;\r\n\tsize *= .1+.9*salt;\r\n\tsize *= Points.y + Dust.y;\r\n\tsize *= smoothstep(.0, .5, Scratching.y + Dust.y);\r\n\tsize *= 1. + 4.*random(quantity.xx+fract(time));\r\n\r\n\r\n\tvec3 pos = position;\r\n\tvec3 dir = normalize(pos);\r\n\tpos = dir;\r\n\tpos += dir * Scratching.y * 2. * salt;\r\n\tpos += dir * Dust.y * 2. * salt;\r\n\tpos.y += sin(Scratching.y*PI)*.1 * salt;// - Scratching.y * .9 * salt;\r\n\t// pos.y = mix(pos.y, -1., Dust.y);\r\n\tvec3 forward = normalize(cameraPos - pos);\r\n\r\n\tvec3 u = vec3(0,1,0);\r\n\tu.xy *= rot(time);\r\n\tvec3 right = normalize(cross(forward, u));\r\n\tvec3 up = normalize(cross(right, forward));\r\n\r\n\tsize *= smoothstep(.5,1.,length(pos-cameraPos));\r\n\r\n\r\n\tpos += (anchor.x * right + anchor.y * up) * size;\r\n\tpos += up * sin((anchor.x-salt) * TAU + time) * size;\r\n\tpos += right * sin((anchor.y+salt) * TAU + time) * size;\r\n\tvColor = vec4(1);\r\n\tvUV = anchor;\r\n\r\n\tgl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(pos, 1);\r\n}\r\n");

      _export("__useDefault", __useDefault);

      _export("default", __useDefault);
    }
  };
});
$__System.register("d", ["3", "26", "27", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "2b", "2c", "2d", "2e", "2f", "3a", "3b", "3c", "3d", "3e", "3f"], function (_export) {
  var THREE, _Object$assign, descriptors, mesh_geo_ply, shader_color_frag, shader_filter_bloom_bloom_frag, shader_filter_bloom_bloom_vert, shader_filter_bloom_bright_frag, shader_filter_bloom_bright_vert, shader_filter_bloom_gaussian_blur_frag, shader_filter_bloom_gaussian_blur_vert, shader_filter_edge_frag, shader_filter_fullscreen_vert, shader_mesh_text_frag, shader_mesh_text_vert, shader_particle_dust_vert, makeAnimations, OBJLoader, PLYLoader, shaderHeader, animation_scene_json, shader_filter_render_frag, shader_line_curves_frag, shader_line_curves_vert, shader_line_eggcrack_vert, shader_mesh_egg_frag, shader_mesh_egg_vert, plyLoader, objLoader, fontLoader;

  return {
    setters: [function (_3) {
      THREE = _3;
    }, function (_) {
      _Object$assign = _["default"];
    }, function (_2) {
      descriptors = _2["default"];
    }, function (_4) {
      mesh_geo_ply = _4["default"];
    }, function (_5) {
      shader_color_frag = _5["default"];
    }, function (_6) {
      shader_filter_bloom_bloom_frag = _6["default"];
    }, function (_7) {
      shader_filter_bloom_bloom_vert = _7["default"];
    }, function (_8) {
      shader_filter_bloom_bright_frag = _8["default"];
    }, function (_9) {
      shader_filter_bloom_bright_vert = _9["default"];
    }, function (_10) {
      shader_filter_bloom_gaussian_blur_frag = _10["default"];
    }, function (_11) {
      shader_filter_bloom_gaussian_blur_vert = _11["default"];
    }, function (_12) {
      shader_filter_edge_frag = _12["default"];
    }, function (_13) {
      shader_filter_fullscreen_vert = _13["default"];
    }, function (_14) {
      shader_mesh_text_frag = _14["default"];
    }, function (_15) {
      shader_mesh_text_vert = _15["default"];
    }, function (_16) {
      shader_particle_dust_vert = _16["default"];
    }, function (_b) {
      makeAnimations = _b["default"];
    }, function (_c) {
      OBJLoader = _c.OBJLoader;
    }, function (_d) {
      PLYLoader = _d.PLYLoader;
    }, function (_e) {
      shaderHeader = _e["default"];
    }, function (_f) {
      animation_scene_json = _f["default"];
    }, function (_a) {
      shader_filter_render_frag = _a["default"];
    }, function (_b2) {
      shader_line_curves_frag = _b2["default"];
    }, function (_c2) {
      shader_line_curves_vert = _c2["default"];
    }, function (_d2) {
      shader_line_eggcrack_vert = _d2["default"];
    }, function (_e2) {
      shader_mesh_egg_frag = _e2["default"];
    }, function (_f2) {
      shader_mesh_egg_vert = _f2["default"];
    }],
    execute: function () {
      /* eslint-disable */
      /* This file is generated with "npm run assets", do not edit by hand. */
      "use strict";

      plyLoader = new PLYLoader();
      objLoader = new OBJLoader();
      fontLoader = new THREE.FontLoader();

      _export("default", {
        animations: makeAnimations(JSON.parse(animation_scene_json)),
        geometries: {
          geo: plyLoader.parse(mesh_geo_ply)
        },
        fonts: {},
        shaders: {
          dust: new THREE.ShaderMaterial(_Object$assign({}, descriptors.shaders.dust, {
            vertexShader: shaderHeader + shader_particle_dust_vert,
            fragmentShader: shaderHeader + shader_color_frag
          })),
          egg: new THREE.ShaderMaterial(_Object$assign({}, descriptors.shaders.egg, {
            vertexShader: shaderHeader + shader_mesh_egg_vert,
            fragmentShader: shaderHeader + shader_mesh_egg_frag
          })),
          eggcrack: new THREE.ShaderMaterial(_Object$assign({}, descriptors.shaders.eggcrack, {
            vertexShader: shaderHeader + shader_line_eggcrack_vert,
            fragmentShader: shaderHeader + shader_color_frag
          })),
          curves: new THREE.ShaderMaterial(_Object$assign({}, descriptors.shaders.curves, {
            vertexShader: shaderHeader + shader_line_curves_vert,
            fragmentShader: shaderHeader + shader_line_curves_frag
          })),
          text: new THREE.ShaderMaterial(_Object$assign({}, descriptors.shaders.text, {
            vertexShader: shaderHeader + shader_mesh_text_vert,
            fragmentShader: shaderHeader + shader_mesh_text_frag
          })),
          bright: new THREE.ShaderMaterial(_Object$assign({}, descriptors.shaders.bright, {
            vertexShader: shaderHeader + shader_filter_bloom_bright_vert,
            fragmentShader: shaderHeader + shader_filter_bloom_bright_frag
          })),
          gaussian_blur: new THREE.ShaderMaterial(_Object$assign({}, descriptors.shaders.gaussian_blur, {
            vertexShader: shaderHeader + shader_filter_bloom_gaussian_blur_vert,
            fragmentShader: shaderHeader + shader_filter_bloom_gaussian_blur_frag
          })),
          bloom: new THREE.ShaderMaterial(_Object$assign({}, descriptors.shaders.bloom, {
            vertexShader: shaderHeader + shader_filter_bloom_bloom_vert,
            fragmentShader: shaderHeader + shader_filter_bloom_bloom_frag
          })),
          render: new THREE.ShaderMaterial(_Object$assign({}, descriptors.shaders.render, {
            vertexShader: shaderHeader + shader_filter_fullscreen_vert,
            fragmentShader: shaderHeader + shader_filter_render_frag
          })),
          edge: new THREE.ShaderMaterial(_Object$assign({}, descriptors.shaders.edge, {
            vertexShader: shaderHeader + shader_filter_fullscreen_vert,
            fragmentShader: shaderHeader + shader_filter_edge_frag
          }))
        },
        load: function load(callback) {
          return callback();
        }
      });
    }
  };
});

$__System.register("43", [], function (_export) {
  "use strict";

  var Mouse;
  return {
    setters: [],
    execute: function () {
      Mouse = {};

      Mouse.x = 0;
      Mouse.y = 0;
      Mouse.down = false;

      // Pan
      Mouse.panX = 0;
      Mouse.panY = 0;
      Mouse.panStartX = 0;
      Mouse.panStartY = 0;
      Mouse.panStarted = false;

      Mouse.onMove = function (event) {
        Mouse.x = event.clientX;
        Mouse.y = event.clientY;
        if (Mouse.panStarted) {
          Mouse.panX = Mouse.x - Mouse.panStartX;
          Mouse.panY = Mouse.y - Mouse.panStartY;
        }
      };

      Mouse.onClic = function (event) {
        Mouse.x = event.clientX;
        Mouse.y = event.clientY;
        Mouse.down = true;

        // Pan
        Mouse.panStartX = Mouse.x - Mouse.panX;
        Mouse.panStartY = Mouse.y - Mouse.panY;
        Mouse.panStarted = true;
      };

      Mouse.onMouseUp = function (event) {
        Mouse.down = false;
        Mouse.panStarted = false;
      };

      _export("default", Mouse);
    }
  };
});

$__System.register('44', ['3', '9', '17', '43', '45', 'b', 'd'], function (_export) {
	var THREE, clamp, lerp, lerpArray, lerpVector, lerpVectorArray, saturate, parameters, Mouse, engine, _Object$keys, assets, keys, deltas, params, uniformsToUpdate, uniforms;

	function initUniforms() {
		keys = _Object$keys(assets.animations.actions);
		keys.forEach(function (name) {
			uniforms[name] = { value: [0, 0, 0] };
			deltas[name] = [0, 0, 0];
		});
		params = _Object$keys(parameters.debug);
		params.forEach(function (name) {
			var param = parameters.debug[name];
			var type = typeof param;
			if (type == 'number') {
				uniforms[name] = { value: param };
			} else if (type == 'boolean') {
				uniforms[name] = { value: param ? 1 : 0 };
			}
		});
	}

	function updateUniforms(elapsed) {
		var dt = Math.max(0.01, Math.min(1., elapsed - uniforms.time.value));
		uniforms.time.value = elapsed;
		uniforms.cameraPos.value = engine.camera.position;
		uniforms.cameraTarget.value = engine.target;
		uniforms.mouse.value[0] = Mouse.x;
		uniforms.mouse.value[1] = Mouse.y;
		keys.forEach(function (name) {
			var pos = assets.animations.getPosition(name, elapsed);
			// deltas[name] = lerpArray(deltas[name], pos, 10.*dt);
			uniforms[name].value = pos;
		});
		params.forEach(function (name) {
			var param = parameters.debug[name];
			var type = typeof param;
			if (type == 'number') {
				uniforms[name].value = param;
			} else if (type == 'boolean') {
				uniforms[name].value = param ? 1 : 0;
			}
		});
		uniformsToUpdate.forEach(function (item) {
			return item.time.value = elapsed;
		});
	}

	function resizeUniforms(width, height) {
		uniforms.resolution.value[0] = width;
		uniforms.resolution.value[1] = height;
		uniformsToUpdate.forEach(function (item) {
			return item.resolution.value = [width, height];
		});
	}

	return {
		setters: [function (_) {
			THREE = _;
		}, function (_3) {
			clamp = _3.clamp;
			lerp = _3.lerp;
			lerpArray = _3.lerpArray;
			lerpVector = _3.lerpVector;
			lerpVectorArray = _3.lerpVectorArray;
			saturate = _3.saturate;
		}, function (_2) {
			parameters = _2['default'];
		}, function (_5) {
			Mouse = _5['default'];
		}, function (_4) {
			engine = _4.engine;
		}, function (_b) {
			_Object$keys = _b['default'];
		}, function (_d) {
			assets = _d['default'];
		}],
		execute: function () {
			'use strict';

			_export('initUniforms', initUniforms);

			_export('updateUniforms', updateUniforms);

			_export('resizeUniforms', resizeUniforms);

			keys = [];
			deltas = {};
			params = [];
			uniformsToUpdate = [];

			_export('uniformsToUpdate', uniformsToUpdate);

			uniforms = {
				time: { value: 0 },
				resolution: { value: [window.innerWidth, window.innerHeight] },
				mouse: { value: [window.innerWidth / 2, window.innerHeight / 2] },
				cameraPos: { value: [0, 0, 0] },
				cameraTarget: { value: [0, 0, 0] },
				framebuffer: { value: 0 },
				frametarget: { value: 0 },
				blur: { value: 0 },
				bloom: { value: 0 }
			};

			_export('uniforms', uniforms);
		}
	};
});

$__System.registerDynamic("46", [], true, function ($__require, exports, module) {
  var global = this || self,
      GLOBAL = global;
  // 7.2.1 RequireObjectCoercible(argument)
  module.exports = function (it) {
    if (it == undefined) throw TypeError("Can't call method on  " + it);
    return it;
  };
});
$__System.registerDynamic('20', ['46'], true, function ($__require, exports, module) {
  var global = this || self,
      GLOBAL = global;
  /* */
  var defined = $__require('46');
  module.exports = function (it) {
    return Object(defined(it));
  };
});
$__System.registerDynamic('47', [], true, function ($__require, exports, module) {
  var global = this || self,
      GLOBAL = global;
  // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
  var global = module.exports = typeof window != 'undefined' && window.Math == Math ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')();
  if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef
});
$__System.registerDynamic('48', [], true, function ($__require, exports, module) {
  var global = this || self,
      GLOBAL = global;
  /* */
  module.exports = function (it) {
    if (typeof it != 'function') throw TypeError(it + ' is not a function!');
    return it;
  };
});
$__System.registerDynamic('49', ['48'], true, function ($__require, exports, module) {
  var global = this || self,
      GLOBAL = global;
  /* */
  var aFunction = $__require('48');
  module.exports = function (fn, that, length) {
    aFunction(fn);
    if (that === undefined) return fn;
    switch (length) {
      case 1:
        return function (a) {
          return fn.call(that, a);
        };
      case 2:
        return function (a, b) {
          return fn.call(that, a, b);
        };
      case 3:
        return function (a, b, c) {
          return fn.call(that, a, b, c);
        };
    }
    return function () {
      return fn.apply(that, arguments);
    };
  };
});
$__System.registerDynamic('23', ['47', '25', '49'], true, function ($__require, exports, module) {
  var global = this || self,
      GLOBAL = global;
  /* */
  var global = $__require('47'),
      core = $__require('25'),
      ctx = $__require('49'),
      PROTOTYPE = 'prototype';
  var $export = function (type, name, source) {
    var IS_FORCED = type & $export.F,
        IS_GLOBAL = type & $export.G,
        IS_STATIC = type & $export.S,
        IS_PROTO = type & $export.P,
        IS_BIND = type & $export.B,
        IS_WRAP = type & $export.W,
        exports = IS_GLOBAL ? core : core[name] || (core[name] = {}),
        target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE],
        key,
        own,
        out;
    if (IS_GLOBAL) source = name;
    for (key in source) {
      own = !IS_FORCED && target && key in target;
      if (own && key in exports) continue;
      out = own ? target[key] : source[key];
      exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key] : IS_BIND && own ? ctx(out, global) : IS_WRAP && target[key] == out ? function (C) {
        var F = function (param) {
          return this instanceof C ? new C(param) : C(param);
        };
        F[PROTOTYPE] = C[PROTOTYPE];
        return F;
      }(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;
      if (IS_PROTO) (exports[PROTOTYPE] || (exports[PROTOTYPE] = {}))[key] = out;
    }
  };
  $export.F = 1;
  $export.G = 2;
  $export.S = 4;
  $export.P = 8;
  $export.B = 16;
  $export.W = 32;
  module.exports = $export;
});
$__System.registerDynamic("21", [], true, function ($__require, exports, module) {
  var global = this || self,
      GLOBAL = global;
  /* */
  module.exports = function (exec) {
    try {
      return !!exec();
    } catch (e) {
      return true;
    }
  };
});
$__System.registerDynamic('4a', ['23', '25', '21'], true, function ($__require, exports, module) {
    var global = this || self,
        GLOBAL = global;
    /* */
    var $export = $__require('23'),
        core = $__require('25'),
        fails = $__require('21');
    module.exports = function (KEY, exec) {
        var fn = (core.Object || {})[KEY] || Object[KEY],
            exp = {};
        exp[KEY] = exec(fn);
        $export($export.S + $export.F * fails(function () {
            fn(1);
        }), 'Object', exp);
    };
});
$__System.registerDynamic('4b', ['20', '4a'], true, function ($__require, exports, module) {
  var global = this || self,
      GLOBAL = global;
  /* */
  var toObject = $__require('20');
  $__require('4a')('keys', function ($keys) {
    return function keys(it) {
      return $keys(toObject(it));
    };
  });
});
$__System.registerDynamic('25', [], true, function ($__require, exports, module) {
  var global = this || self,
      GLOBAL = global;
  /* */
  var core = module.exports = { version: '1.2.6' };
  if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef
});
$__System.registerDynamic('4c', ['4b', '25'], true, function ($__require, exports, module) {
  var global = this || self,
      GLOBAL = global;
  /* */
  $__require('4b');
  module.exports = $__require('25').Object.keys;
});
$__System.registerDynamic("b", ["4c"], true, function ($__require, exports, module) {
  var global = this || self,
      GLOBAL = global;
  /* */
  module.exports = { "default": $__require("4c"), __esModule: true };
});
(function() {
var define = $__System.amdDefine;
(function(global, factory) {
  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : typeof define === 'function' && define.amd ? define("4d", ["exports"], factory) : (global = global || self, factory(global.THREE = {}));
}(this, function(exports) {
  'use strict';
  if (Number.EPSILON === undefined) {
    Number.EPSILON = Math.pow(2, -52);
  }
  if (Number.isInteger === undefined) {
    Number.isInteger = function(value) {
      return typeof value === 'number' && isFinite(value) && Math.floor(value) === value;
    };
  }
  if (Math.sign === undefined) {
    Math.sign = function(x) {
      return (x < 0) ? -1 : (x > 0) ? 1 : +x;
    };
  }
  if ('name' in Function.prototype === false) {
    Object.defineProperty(Function.prototype, 'name', {get: function() {
        return this.toString().match(/^\s*function\s*([^\(\s]*)/)[1];
      }});
  }
  if (Object.assign === undefined) {
    (function() {
      Object.assign = function(target) {
        if (target === undefined || target === null) {
          throw new TypeError('Cannot convert undefined or null to object');
        }
        var output = Object(target);
        for (var index = 1; index < arguments.length; index++) {
          var source = arguments[index];
          if (source !== undefined && source !== null) {
            for (var nextKey in source) {
              if (Object.prototype.hasOwnProperty.call(source, nextKey)) {
                output[nextKey] = source[nextKey];
              }
            }
          }
        }
        return output;
      };
    })();
  }
  function EventDispatcher() {}
  Object.assign(EventDispatcher.prototype, {
    addEventListener: function(type, listener) {
      if (this._listeners === undefined)
        this._listeners = {};
      var listeners = this._listeners;
      if (listeners[type] === undefined) {
        listeners[type] = [];
      }
      if (listeners[type].indexOf(listener) === -1) {
        listeners[type].push(listener);
      }
    },
    hasEventListener: function(type, listener) {
      if (this._listeners === undefined)
        return false;
      var listeners = this._listeners;
      return listeners[type] !== undefined && listeners[type].indexOf(listener) !== -1;
    },
    removeEventListener: function(type, listener) {
      if (this._listeners === undefined)
        return;
      var listeners = this._listeners;
      var listenerArray = listeners[type];
      if (listenerArray !== undefined) {
        var index = listenerArray.indexOf(listener);
        if (index !== -1) {
          listenerArray.splice(index, 1);
        }
      }
    },
    dispatchEvent: function(event) {
      if (this._listeners === undefined)
        return;
      var listeners = this._listeners;
      var listenerArray = listeners[event.type];
      if (listenerArray !== undefined) {
        event.target = this;
        var array = listenerArray.slice(0);
        for (var i = 0,
            l = array.length; i < l; i++) {
          array[i].call(this, event);
        }
      }
    }
  });
  var REVISION = '102';
  var MOUSE = {
    LEFT: 0,
    MIDDLE: 1,
    RIGHT: 2
  };
  var CullFaceNone = 0;
  var CullFaceBack = 1;
  var CullFaceFront = 2;
  var CullFaceFrontBack = 3;
  var FrontFaceDirectionCW = 0;
  var FrontFaceDirectionCCW = 1;
  var BasicShadowMap = 0;
  var PCFShadowMap = 1;
  var PCFSoftShadowMap = 2;
  var FrontSide = 0;
  var BackSide = 1;
  var DoubleSide = 2;
  var FlatShading = 1;
  var SmoothShading = 2;
  var NoColors = 0;
  var FaceColors = 1;
  var VertexColors = 2;
  var NoBlending = 0;
  var NormalBlending = 1;
  var AdditiveBlending = 2;
  var SubtractiveBlending = 3;
  var MultiplyBlending = 4;
  var CustomBlending = 5;
  var AddEquation = 100;
  var SubtractEquation = 101;
  var ReverseSubtractEquation = 102;
  var MinEquation = 103;
  var MaxEquation = 104;
  var ZeroFactor = 200;
  var OneFactor = 201;
  var SrcColorFactor = 202;
  var OneMinusSrcColorFactor = 203;
  var SrcAlphaFactor = 204;
  var OneMinusSrcAlphaFactor = 205;
  var DstAlphaFactor = 206;
  var OneMinusDstAlphaFactor = 207;
  var DstColorFactor = 208;
  var OneMinusDstColorFactor = 209;
  var SrcAlphaSaturateFactor = 210;
  var NeverDepth = 0;
  var AlwaysDepth = 1;
  var LessDepth = 2;
  var LessEqualDepth = 3;
  var EqualDepth = 4;
  var GreaterEqualDepth = 5;
  var GreaterDepth = 6;
  var NotEqualDepth = 7;
  var MultiplyOperation = 0;
  var MixOperation = 1;
  var AddOperation = 2;
  var NoToneMapping = 0;
  var LinearToneMapping = 1;
  var ReinhardToneMapping = 2;
  var Uncharted2ToneMapping = 3;
  var CineonToneMapping = 4;
  var ACESFilmicToneMapping = 5;
  var UVMapping = 300;
  var CubeReflectionMapping = 301;
  var CubeRefractionMapping = 302;
  var EquirectangularReflectionMapping = 303;
  var EquirectangularRefractionMapping = 304;
  var SphericalReflectionMapping = 305;
  var CubeUVReflectionMapping = 306;
  var CubeUVRefractionMapping = 307;
  var RepeatWrapping = 1000;
  var ClampToEdgeWrapping = 1001;
  var MirroredRepeatWrapping = 1002;
  var NearestFilter = 1003;
  var NearestMipMapNearestFilter = 1004;
  var NearestMipMapLinearFilter = 1005;
  var LinearFilter = 1006;
  var LinearMipMapNearestFilter = 1007;
  var LinearMipMapLinearFilter = 1008;
  var UnsignedByteType = 1009;
  var ByteType = 1010;
  var ShortType = 1011;
  var UnsignedShortType = 1012;
  var IntType = 1013;
  var UnsignedIntType = 1014;
  var FloatType = 1015;
  var HalfFloatType = 1016;
  var UnsignedShort4444Type = 1017;
  var UnsignedShort5551Type = 1018;
  var UnsignedShort565Type = 1019;
  var UnsignedInt248Type = 1020;
  var AlphaFormat = 1021;
  var RGBFormat = 1022;
  var RGBAFormat = 1023;
  var LuminanceFormat = 1024;
  var LuminanceAlphaFormat = 1025;
  var RGBEFormat = RGBAFormat;
  var DepthFormat = 1026;
  var DepthStencilFormat = 1027;
  var RedFormat = 1028;
  var RGB_S3TC_DXT1_Format = 33776;
  var RGBA_S3TC_DXT1_Format = 33777;
  var RGBA_S3TC_DXT3_Format = 33778;
  var RGBA_S3TC_DXT5_Format = 33779;
  var RGB_PVRTC_4BPPV1_Format = 35840;
  var RGB_PVRTC_2BPPV1_Format = 35841;
  var RGBA_PVRTC_4BPPV1_Format = 35842;
  var RGBA_PVRTC_2BPPV1_Format = 35843;
  var RGB_ETC1_Format = 36196;
  var RGBA_ASTC_4x4_Format = 37808;
  var RGBA_ASTC_5x4_Format = 37809;
  var RGBA_ASTC_5x5_Format = 37810;
  var RGBA_ASTC_6x5_Format = 37811;
  var RGBA_ASTC_6x6_Format = 37812;
  var RGBA_ASTC_8x5_Format = 37813;
  var RGBA_ASTC_8x6_Format = 37814;
  var RGBA_ASTC_8x8_Format = 37815;
  var RGBA_ASTC_10x5_Format = 37816;
  var RGBA_ASTC_10x6_Format = 37817;
  var RGBA_ASTC_10x8_Format = 37818;
  var RGBA_ASTC_10x10_Format = 37819;
  var RGBA_ASTC_12x10_Format = 37820;
  var RGBA_ASTC_12x12_Format = 37821;
  var LoopOnce = 2200;
  var LoopRepeat = 2201;
  var LoopPingPong = 2202;
  var InterpolateDiscrete = 2300;
  var InterpolateLinear = 2301;
  var InterpolateSmooth = 2302;
  var ZeroCurvatureEnding = 2400;
  var ZeroSlopeEnding = 2401;
  var WrapAroundEnding = 2402;
  var TrianglesDrawMode = 0;
  var TriangleStripDrawMode = 1;
  var TriangleFanDrawMode = 2;
  var LinearEncoding = 3000;
  var sRGBEncoding = 3001;
  var GammaEncoding = 3007;
  var RGBEEncoding = 3002;
  var LogLuvEncoding = 3003;
  var RGBM7Encoding = 3004;
  var RGBM16Encoding = 3005;
  var RGBDEncoding = 3006;
  var BasicDepthPacking = 3200;
  var RGBADepthPacking = 3201;
  var TangentSpaceNormalMap = 0;
  var ObjectSpaceNormalMap = 1;
  var _Math = {
    DEG2RAD: Math.PI / 180,
    RAD2DEG: 180 / Math.PI,
    generateUUID: (function() {
      var lut = [];
      for (var i = 0; i < 256; i++) {
        lut[i] = (i < 16 ? '0' : '') + (i).toString(16);
      }
      return function generateUUID() {
        var d0 = Math.random() * 0xffffffff | 0;
        var d1 = Math.random() * 0xffffffff | 0;
        var d2 = Math.random() * 0xffffffff | 0;
        var d3 = Math.random() * 0xffffffff | 0;
        var uuid = lut[d0 & 0xff] + lut[d0 >> 8 & 0xff] + lut[d0 >> 16 & 0xff] + lut[d0 >> 24 & 0xff] + '-' + lut[d1 & 0xff] + lut[d1 >> 8 & 0xff] + '-' + lut[d1 >> 16 & 0x0f | 0x40] + lut[d1 >> 24 & 0xff] + '-' + lut[d2 & 0x3f | 0x80] + lut[d2 >> 8 & 0xff] + '-' + lut[d2 >> 16 & 0xff] + lut[d2 >> 24 & 0xff] + lut[d3 & 0xff] + lut[d3 >> 8 & 0xff] + lut[d3 >> 16 & 0xff] + lut[d3 >> 24 & 0xff];
        return uuid.toUpperCase();
      };
    })(),
    clamp: function(value, min, max) {
      return Math.max(min, Math.min(max, value));
    },
    euclideanModulo: function(n, m) {
      return ((n % m) + m) % m;
    },
    mapLinear: function(x, a1, a2, b1, b2) {
      return b1 + (x - a1) * (b2 - b1) / (a2 - a1);
    },
    lerp: function(x, y, t) {
      return (1 - t) * x + t * y;
    },
    smoothstep: function(x, min, max) {
      if (x <= min)
        return 0;
      if (x >= max)
        return 1;
      x = (x - min) / (max - min);
      return x * x * (3 - 2 * x);
    },
    smootherstep: function(x, min, max) {
      if (x <= min)
        return 0;
      if (x >= max)
        return 1;
      x = (x - min) / (max - min);
      return x * x * x * (x * (x * 6 - 15) + 10);
    },
    randInt: function(low, high) {
      return low + Math.floor(Math.random() * (high - low + 1));
    },
    randFloat: function(low, high) {
      return low + Math.random() * (high - low);
    },
    randFloatSpread: function(range) {
      return range * (0.5 - Math.random());
    },
    degToRad: function(degrees) {
      return degrees * _Math.DEG2RAD;
    },
    radToDeg: function(radians) {
      return radians * _Math.RAD2DEG;
    },
    isPowerOfTwo: function(value) {
      return (value & (value - 1)) === 0 && value !== 0;
    },
    ceilPowerOfTwo: function(value) {
      return Math.pow(2, Math.ceil(Math.log(value) / Math.LN2));
    },
    floorPowerOfTwo: function(value) {
      return Math.pow(2, Math.floor(Math.log(value) / Math.LN2));
    }
  };
  function Vector2(x, y) {
    this.x = x || 0;
    this.y = y || 0;
  }
  Object.defineProperties(Vector2.prototype, {
    "width": {
      get: function() {
        return this.x;
      },
      set: function(value) {
        this.x = value;
      }
    },
    "height": {
      get: function() {
        return this.y;
      },
      set: function(value) {
        this.y = value;
      }
    }
  });
  Object.assign(Vector2.prototype, {
    isVector2: true,
    set: function(x, y) {
      this.x = x;
      this.y = y;
      return this;
    },
    setScalar: function(scalar) {
      this.x = scalar;
      this.y = scalar;
      return this;
    },
    setX: function(x) {
      this.x = x;
      return this;
    },
    setY: function(y) {
      this.y = y;
      return this;
    },
    setComponent: function(index, value) {
      switch (index) {
        case 0:
          this.x = value;
          break;
        case 1:
          this.y = value;
          break;
        default:
          throw new Error('index is out of range: ' + index);
      }
      return this;
    },
    getComponent: function(index) {
      switch (index) {
        case 0:
          return this.x;
        case 1:
          return this.y;
        default:
          throw new Error('index is out of range: ' + index);
      }
    },
    clone: function() {
      return new this.constructor(this.x, this.y);
    },
    copy: function(v) {
      this.x = v.x;
      this.y = v.y;
      return this;
    },
    add: function(v, w) {
      if (w !== undefined) {
        console.warn('THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.');
        return this.addVectors(v, w);
      }
      this.x += v.x;
      this.y += v.y;
      return this;
    },
    addScalar: function(s) {
      this.x += s;
      this.y += s;
      return this;
    },
    addVectors: function(a, b) {
      this.x = a.x + b.x;
      this.y = a.y + b.y;
      return this;
    },
    addScaledVector: function(v, s) {
      this.x += v.x * s;
      this.y += v.y * s;
      return this;
    },
    sub: function(v, w) {
      if (w !== undefined) {
        console.warn('THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.');
        return this.subVectors(v, w);
      }
      this.x -= v.x;
      this.y -= v.y;
      return this;
    },
    subScalar: function(s) {
      this.x -= s;
      this.y -= s;
      return this;
    },
    subVectors: function(a, b) {
      this.x = a.x - b.x;
      this.y = a.y - b.y;
      return this;
    },
    multiply: function(v) {
      this.x *= v.x;
      this.y *= v.y;
      return this;
    },
    multiplyScalar: function(scalar) {
      this.x *= scalar;
      this.y *= scalar;
      return this;
    },
    divide: function(v) {
      this.x /= v.x;
      this.y /= v.y;
      return this;
    },
    divideScalar: function(scalar) {
      return this.multiplyScalar(1 / scalar);
    },
    applyMatrix3: function(m) {
      var x = this.x,
          y = this.y;
      var e = m.elements;
      this.x = e[0] * x + e[3] * y + e[6];
      this.y = e[1] * x + e[4] * y + e[7];
      return this;
    },
    min: function(v) {
      this.x = Math.min(this.x, v.x);
      this.y = Math.min(this.y, v.y);
      return this;
    },
    max: function(v) {
      this.x = Math.max(this.x, v.x);
      this.y = Math.max(this.y, v.y);
      return this;
    },
    clamp: function(min, max) {
      this.x = Math.max(min.x, Math.min(max.x, this.x));
      this.y = Math.max(min.y, Math.min(max.y, this.y));
      return this;
    },
    clampScalar: function() {
      var min = new Vector2();
      var max = new Vector2();
      return function clampScalar(minVal, maxVal) {
        min.set(minVal, minVal);
        max.set(maxVal, maxVal);
        return this.clamp(min, max);
      };
    }(),
    clampLength: function(min, max) {
      var length = this.length();
      return this.divideScalar(length || 1).multiplyScalar(Math.max(min, Math.min(max, length)));
    },
    floor: function() {
      this.x = Math.floor(this.x);
      this.y = Math.floor(this.y);
      return this;
    },
    ceil: function() {
      this.x = Math.ceil(this.x);
      this.y = Math.ceil(this.y);
      return this;
    },
    round: function() {
      this.x = Math.round(this.x);
      this.y = Math.round(this.y);
      return this;
    },
    roundToZero: function() {
      this.x = (this.x < 0) ? Math.ceil(this.x) : Math.floor(this.x);
      this.y = (this.y < 0) ? Math.ceil(this.y) : Math.floor(this.y);
      return this;
    },
    negate: function() {
      this.x = -this.x;
      this.y = -this.y;
      return this;
    },
    dot: function(v) {
      return this.x * v.x + this.y * v.y;
    },
    cross: function(v) {
      return this.x * v.y - this.y * v.x;
    },
    lengthSq: function() {
      return this.x * this.x + this.y * this.y;
    },
    length: function() {
      return Math.sqrt(this.x * this.x + this.y * this.y);
    },
    manhattanLength: function() {
      return Math.abs(this.x) + Math.abs(this.y);
    },
    normalize: function() {
      return this.divideScalar(this.length() || 1);
    },
    angle: function() {
      var angle = Math.atan2(this.y, this.x);
      if (angle < 0)
        angle += 2 * Math.PI;
      return angle;
    },
    distanceTo: function(v) {
      return Math.sqrt(this.distanceToSquared(v));
    },
    distanceToSquared: function(v) {
      var dx = this.x - v.x,
          dy = this.y - v.y;
      return dx * dx + dy * dy;
    },
    manhattanDistanceTo: function(v) {
      return Math.abs(this.x - v.x) + Math.abs(this.y - v.y);
    },
    setLength: function(length) {
      return this.normalize().multiplyScalar(length);
    },
    lerp: function(v, alpha) {
      this.x += (v.x - this.x) * alpha;
      this.y += (v.y - this.y) * alpha;
      return this;
    },
    lerpVectors: function(v1, v2, alpha) {
      return this.subVectors(v2, v1).multiplyScalar(alpha).add(v1);
    },
    equals: function(v) {
      return ((v.x === this.x) && (v.y === this.y));
    },
    fromArray: function(array, offset) {
      if (offset === undefined)
        offset = 0;
      this.x = array[offset];
      this.y = array[offset + 1];
      return this;
    },
    toArray: function(array, offset) {
      if (array === undefined)
        array = [];
      if (offset === undefined)
        offset = 0;
      array[offset] = this.x;
      array[offset + 1] = this.y;
      return array;
    },
    fromBufferAttribute: function(attribute, index, offset) {
      if (offset !== undefined) {
        console.warn('THREE.Vector2: offset has been removed from .fromBufferAttribute().');
      }
      this.x = attribute.getX(index);
      this.y = attribute.getY(index);
      return this;
    },
    rotateAround: function(center, angle) {
      var c = Math.cos(angle),
          s = Math.sin(angle);
      var x = this.x - center.x;
      var y = this.y - center.y;
      this.x = x * c - y * s + center.x;
      this.y = x * s + y * c + center.y;
      return this;
    }
  });
  function Matrix4() {
    this.elements = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];
    if (arguments.length > 0) {
      console.error('THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.');
    }
  }
  Object.assign(Matrix4.prototype, {
    isMatrix4: true,
    set: function(n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44) {
      var te = this.elements;
      te[0] = n11;
      te[4] = n12;
      te[8] = n13;
      te[12] = n14;
      te[1] = n21;
      te[5] = n22;
      te[9] = n23;
      te[13] = n24;
      te[2] = n31;
      te[6] = n32;
      te[10] = n33;
      te[14] = n34;
      te[3] = n41;
      te[7] = n42;
      te[11] = n43;
      te[15] = n44;
      return this;
    },
    identity: function() {
      this.set(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
      return this;
    },
    clone: function() {
      return new Matrix4().fromArray(this.elements);
    },
    copy: function(m) {
      var te = this.elements;
      var me = m.elements;
      te[0] = me[0];
      te[1] = me[1];
      te[2] = me[2];
      te[3] = me[3];
      te[4] = me[4];
      te[5] = me[5];
      te[6] = me[6];
      te[7] = me[7];
      te[8] = me[8];
      te[9] = me[9];
      te[10] = me[10];
      te[11] = me[11];
      te[12] = me[12];
      te[13] = me[13];
      te[14] = me[14];
      te[15] = me[15];
      return this;
    },
    copyPosition: function(m) {
      var te = this.elements,
          me = m.elements;
      te[12] = me[12];
      te[13] = me[13];
      te[14] = me[14];
      return this;
    },
    extractBasis: function(xAxis, yAxis, zAxis) {
      xAxis.setFromMatrixColumn(this, 0);
      yAxis.setFromMatrixColumn(this, 1);
      zAxis.setFromMatrixColumn(this, 2);
      return this;
    },
    makeBasis: function(xAxis, yAxis, zAxis) {
      this.set(xAxis.x, yAxis.x, zAxis.x, 0, xAxis.y, yAxis.y, zAxis.y, 0, xAxis.z, yAxis.z, zAxis.z, 0, 0, 0, 0, 1);
      return this;
    },
    extractRotation: function() {
      var v1 = new Vector3();
      return function extractRotation(m) {
        var te = this.elements;
        var me = m.elements;
        var scaleX = 1 / v1.setFromMatrixColumn(m, 0).length();
        var scaleY = 1 / v1.setFromMatrixColumn(m, 1).length();
        var scaleZ = 1 / v1.setFromMatrixColumn(m, 2).length();
        te[0] = me[0] * scaleX;
        te[1] = me[1] * scaleX;
        te[2] = me[2] * scaleX;
        te[3] = 0;
        te[4] = me[4] * scaleY;
        te[5] = me[5] * scaleY;
        te[6] = me[6] * scaleY;
        te[7] = 0;
        te[8] = me[8] * scaleZ;
        te[9] = me[9] * scaleZ;
        te[10] = me[10] * scaleZ;
        te[11] = 0;
        te[12] = 0;
        te[13] = 0;
        te[14] = 0;
        te[15] = 1;
        return this;
      };
    }(),
    makeRotationFromEuler: function(euler) {
      if (!(euler && euler.isEuler)) {
        console.error('THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.');
      }
      var te = this.elements;
      var x = euler.x,
          y = euler.y,
          z = euler.z;
      var a = Math.cos(x),
          b = Math.sin(x);
      var c = Math.cos(y),
          d = Math.sin(y);
      var e = Math.cos(z),
          f = Math.sin(z);
      if (euler.order === 'XYZ') {
        var ae = a * e,
            af = a * f,
            be = b * e,
            bf = b * f;
        te[0] = c * e;
        te[4] = -c * f;
        te[8] = d;
        te[1] = af + be * d;
        te[5] = ae - bf * d;
        te[9] = -b * c;
        te[2] = bf - ae * d;
        te[6] = be + af * d;
        te[10] = a * c;
      } else if (euler.order === 'YXZ') {
        var ce = c * e,
            cf = c * f,
            de = d * e,
            df = d * f;
        te[0] = ce + df * b;
        te[4] = de * b - cf;
        te[8] = a * d;
        te[1] = a * f;
        te[5] = a * e;
        te[9] = -b;
        te[2] = cf * b - de;
        te[6] = df + ce * b;
        te[10] = a * c;
      } else if (euler.order === 'ZXY') {
        var ce = c * e,
            cf = c * f,
            de = d * e,
            df = d * f;
        te[0] = ce - df * b;
        te[4] = -a * f;
        te[8] = de + cf * b;
        te[1] = cf + de * b;
        te[5] = a * e;
        te[9] = df - ce * b;
        te[2] = -a * d;
        te[6] = b;
        te[10] = a * c;
      } else if (euler.order === 'ZYX') {
        var ae = a * e,
            af = a * f,
            be = b * e,
            bf = b * f;
        te[0] = c * e;
        te[4] = be * d - af;
        te[8] = ae * d + bf;
        te[1] = c * f;
        te[5] = bf * d + ae;
        te[9] = af * d - be;
        te[2] = -d;
        te[6] = b * c;
        te[10] = a * c;
      } else if (euler.order === 'YZX') {
        var ac = a * c,
            ad = a * d,
            bc = b * c,
            bd = b * d;
        te[0] = c * e;
        te[4] = bd - ac * f;
        te[8] = bc * f + ad;
        te[1] = f;
        te[5] = a * e;
        te[9] = -b * e;
        te[2] = -d * e;
        te[6] = ad * f + bc;
        te[10] = ac - bd * f;
      } else if (euler.order === 'XZY') {
        var ac = a * c,
            ad = a * d,
            bc = b * c,
            bd = b * d;
        te[0] = c * e;
        te[4] = -f;
        te[8] = d * e;
        te[1] = ac * f + bd;
        te[5] = a * e;
        te[9] = ad * f - bc;
        te[2] = bc * f - ad;
        te[6] = b * e;
        te[10] = bd * f + ac;
      }
      te[3] = 0;
      te[7] = 0;
      te[11] = 0;
      te[12] = 0;
      te[13] = 0;
      te[14] = 0;
      te[15] = 1;
      return this;
    },
    makeRotationFromQuaternion: function() {
      var zero = new Vector3(0, 0, 0);
      var one = new Vector3(1, 1, 1);
      return function makeRotationFromQuaternion(q) {
        return this.compose(zero, q, one);
      };
    }(),
    lookAt: function() {
      var x = new Vector3();
      var y = new Vector3();
      var z = new Vector3();
      return function lookAt(eye, target, up) {
        var te = this.elements;
        z.subVectors(eye, target);
        if (z.lengthSq() === 0) {
          z.z = 1;
        }
        z.normalize();
        x.crossVectors(up, z);
        if (x.lengthSq() === 0) {
          if (Math.abs(up.z) === 1) {
            z.x += 0.0001;
          } else {
            z.z += 0.0001;
          }
          z.normalize();
          x.crossVectors(up, z);
        }
        x.normalize();
        y.crossVectors(z, x);
        te[0] = x.x;
        te[4] = y.x;
        te[8] = z.x;
        te[1] = x.y;
        te[5] = y.y;
        te[9] = z.y;
        te[2] = x.z;
        te[6] = y.z;
        te[10] = z.z;
        return this;
      };
    }(),
    multiply: function(m, n) {
      if (n !== undefined) {
        console.warn('THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.');
        return this.multiplyMatrices(m, n);
      }
      return this.multiplyMatrices(this, m);
    },
    premultiply: function(m) {
      return this.multiplyMatrices(m, this);
    },
    multiplyMatrices: function(a, b) {
      var ae = a.elements;
      var be = b.elements;
      var te = this.elements;
      var a11 = ae[0],
          a12 = ae[4],
          a13 = ae[8],
          a14 = ae[12];
      var a21 = ae[1],
          a22 = ae[5],
          a23 = ae[9],
          a24 = ae[13];
      var a31 = ae[2],
          a32 = ae[6],
          a33 = ae[10],
          a34 = ae[14];
      var a41 = ae[3],
          a42 = ae[7],
          a43 = ae[11],
          a44 = ae[15];
      var b11 = be[0],
          b12 = be[4],
          b13 = be[8],
          b14 = be[12];
      var b21 = be[1],
          b22 = be[5],
          b23 = be[9],
          b24 = be[13];
      var b31 = be[2],
          b32 = be[6],
          b33 = be[10],
          b34 = be[14];
      var b41 = be[3],
          b42 = be[7],
          b43 = be[11],
          b44 = be[15];
      te[0] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;
      te[4] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;
      te[8] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;
      te[12] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;
      te[1] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;
      te[5] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;
      te[9] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;
      te[13] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;
      te[2] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;
      te[6] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;
      te[10] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;
      te[14] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;
      te[3] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;
      te[7] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;
      te[11] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;
      te[15] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;
      return this;
    },
    multiplyScalar: function(s) {
      var te = this.elements;
      te[0] *= s;
      te[4] *= s;
      te[8] *= s;
      te[12] *= s;
      te[1] *= s;
      te[5] *= s;
      te[9] *= s;
      te[13] *= s;
      te[2] *= s;
      te[6] *= s;
      te[10] *= s;
      te[14] *= s;
      te[3] *= s;
      te[7] *= s;
      te[11] *= s;
      te[15] *= s;
      return this;
    },
    applyToBufferAttribute: function() {
      var v1 = new Vector3();
      return function applyToBufferAttribute(attribute) {
        for (var i = 0,
            l = attribute.count; i < l; i++) {
          v1.x = attribute.getX(i);
          v1.y = attribute.getY(i);
          v1.z = attribute.getZ(i);
          v1.applyMatrix4(this);
          attribute.setXYZ(i, v1.x, v1.y, v1.z);
        }
        return attribute;
      };
    }(),
    determinant: function() {
      var te = this.elements;
      var n11 = te[0],
          n12 = te[4],
          n13 = te[8],
          n14 = te[12];
      var n21 = te[1],
          n22 = te[5],
          n23 = te[9],
          n24 = te[13];
      var n31 = te[2],
          n32 = te[6],
          n33 = te[10],
          n34 = te[14];
      var n41 = te[3],
          n42 = te[7],
          n43 = te[11],
          n44 = te[15];
      return (n41 * (+n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34) + n42 * (+n11 * n23 * n34 - n11 * n24 * n33 + n14 * n21 * n33 - n13 * n21 * n34 + n13 * n24 * n31 - n14 * n23 * n31) + n43 * (+n11 * n24 * n32 - n11 * n22 * n34 - n14 * n21 * n32 + n12 * n21 * n34 + n14 * n22 * n31 - n12 * n24 * n31) + n44 * (-n13 * n22 * n31 - n11 * n23 * n32 + n11 * n22 * n33 + n13 * n21 * n32 - n12 * n21 * n33 + n12 * n23 * n31));
    },
    transpose: function() {
      var te = this.elements;
      var tmp;
      tmp = te[1];
      te[1] = te[4];
      te[4] = tmp;
      tmp = te[2];
      te[2] = te[8];
      te[8] = tmp;
      tmp = te[6];
      te[6] = te[9];
      te[9] = tmp;
      tmp = te[3];
      te[3] = te[12];
      te[12] = tmp;
      tmp = te[7];
      te[7] = te[13];
      te[13] = tmp;
      tmp = te[11];
      te[11] = te[14];
      te[14] = tmp;
      return this;
    },
    setPosition: function(v) {
      var te = this.elements;
      te[12] = v.x;
      te[13] = v.y;
      te[14] = v.z;
      return this;
    },
    getInverse: function(m, throwOnDegenerate) {
      var te = this.elements,
          me = m.elements,
          n11 = me[0],
          n21 = me[1],
          n31 = me[2],
          n41 = me[3],
          n12 = me[4],
          n22 = me[5],
          n32 = me[6],
          n42 = me[7],
          n13 = me[8],
          n23 = me[9],
          n33 = me[10],
          n43 = me[11],
          n14 = me[12],
          n24 = me[13],
          n34 = me[14],
          n44 = me[15],
          t11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,
          t12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,
          t13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,
          t14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;
      var det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;
      if (det === 0) {
        var msg = "THREE.Matrix4: .getInverse() can't invert matrix, determinant is 0";
        if (throwOnDegenerate === true) {
          throw new Error(msg);
        } else {
          console.warn(msg);
        }
        return this.identity();
      }
      var detInv = 1 / det;
      te[0] = t11 * detInv;
      te[1] = (n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44) * detInv;
      te[2] = (n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44) * detInv;
      te[3] = (n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43) * detInv;
      te[4] = t12 * detInv;
      te[5] = (n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44) * detInv;
      te[6] = (n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44) * detInv;
      te[7] = (n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43) * detInv;
      te[8] = t13 * detInv;
      te[9] = (n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44) * detInv;
      te[10] = (n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44) * detInv;
      te[11] = (n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43) * detInv;
      te[12] = t14 * detInv;
      te[13] = (n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34) * detInv;
      te[14] = (n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34) * detInv;
      te[15] = (n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33) * detInv;
      return this;
    },
    scale: function(v) {
      var te = this.elements;
      var x = v.x,
          y = v.y,
          z = v.z;
      te[0] *= x;
      te[4] *= y;
      te[8] *= z;
      te[1] *= x;
      te[5] *= y;
      te[9] *= z;
      te[2] *= x;
      te[6] *= y;
      te[10] *= z;
      te[3] *= x;
      te[7] *= y;
      te[11] *= z;
      return this;
    },
    getMaxScaleOnAxis: function() {
      var te = this.elements;
      var scaleXSq = te[0] * te[0] + te[1] * te[1] + te[2] * te[2];
      var scaleYSq = te[4] * te[4] + te[5] * te[5] + te[6] * te[6];
      var scaleZSq = te[8] * te[8] + te[9] * te[9] + te[10] * te[10];
      return Math.sqrt(Math.max(scaleXSq, scaleYSq, scaleZSq));
    },
    makeTranslation: function(x, y, z) {
      this.set(1, 0, 0, x, 0, 1, 0, y, 0, 0, 1, z, 0, 0, 0, 1);
      return this;
    },
    makeRotationX: function(theta) {
      var c = Math.cos(theta),
          s = Math.sin(theta);
      this.set(1, 0, 0, 0, 0, c, -s, 0, 0, s, c, 0, 0, 0, 0, 1);
      return this;
    },
    makeRotationY: function(theta) {
      var c = Math.cos(theta),
          s = Math.sin(theta);
      this.set(c, 0, s, 0, 0, 1, 0, 0, -s, 0, c, 0, 0, 0, 0, 1);
      return this;
    },
    makeRotationZ: function(theta) {
      var c = Math.cos(theta),
          s = Math.sin(theta);
      this.set(c, -s, 0, 0, s, c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
      return this;
    },
    makeRotationAxis: function(axis, angle) {
      var c = Math.cos(angle);
      var s = Math.sin(angle);
      var t = 1 - c;
      var x = axis.x,
          y = axis.y,
          z = axis.z;
      var tx = t * x,
          ty = t * y;
      this.set(tx * x + c, tx * y - s * z, tx * z + s * y, 0, tx * y + s * z, ty * y + c, ty * z - s * x, 0, tx * z - s * y, ty * z + s * x, t * z * z + c, 0, 0, 0, 0, 1);
      return this;
    },
    makeScale: function(x, y, z) {
      this.set(x, 0, 0, 0, 0, y, 0, 0, 0, 0, z, 0, 0, 0, 0, 1);
      return this;
    },
    makeShear: function(x, y, z) {
      this.set(1, y, z, 0, x, 1, z, 0, x, y, 1, 0, 0, 0, 0, 1);
      return this;
    },
    compose: function(position, quaternion, scale) {
      var te = this.elements;
      var x = quaternion._x,
          y = quaternion._y,
          z = quaternion._z,
          w = quaternion._w;
      var x2 = x + x,
          y2 = y + y,
          z2 = z + z;
      var xx = x * x2,
          xy = x * y2,
          xz = x * z2;
      var yy = y * y2,
          yz = y * z2,
          zz = z * z2;
      var wx = w * x2,
          wy = w * y2,
          wz = w * z2;
      var sx = scale.x,
          sy = scale.y,
          sz = scale.z;
      te[0] = (1 - (yy + zz)) * sx;
      te[1] = (xy + wz) * sx;
      te[2] = (xz - wy) * sx;
      te[3] = 0;
      te[4] = (xy - wz) * sy;
      te[5] = (1 - (xx + zz)) * sy;
      te[6] = (yz + wx) * sy;
      te[7] = 0;
      te[8] = (xz + wy) * sz;
      te[9] = (yz - wx) * sz;
      te[10] = (1 - (xx + yy)) * sz;
      te[11] = 0;
      te[12] = position.x;
      te[13] = position.y;
      te[14] = position.z;
      te[15] = 1;
      return this;
    },
    decompose: function() {
      var vector = new Vector3();
      var matrix = new Matrix4();
      return function decompose(position, quaternion, scale) {
        var te = this.elements;
        var sx = vector.set(te[0], te[1], te[2]).length();
        var sy = vector.set(te[4], te[5], te[6]).length();
        var sz = vector.set(te[8], te[9], te[10]).length();
        var det = this.determinant();
        if (det < 0)
          sx = -sx;
        position.x = te[12];
        position.y = te[13];
        position.z = te[14];
        matrix.copy(this);
        var invSX = 1 / sx;
        var invSY = 1 / sy;
        var invSZ = 1 / sz;
        matrix.elements[0] *= invSX;
        matrix.elements[1] *= invSX;
        matrix.elements[2] *= invSX;
        matrix.elements[4] *= invSY;
        matrix.elements[5] *= invSY;
        matrix.elements[6] *= invSY;
        matrix.elements[8] *= invSZ;
        matrix.elements[9] *= invSZ;
        matrix.elements[10] *= invSZ;
        quaternion.setFromRotationMatrix(matrix);
        scale.x = sx;
        scale.y = sy;
        scale.z = sz;
        return this;
      };
    }(),
    makePerspective: function(left, right, top, bottom, near, far) {
      if (far === undefined) {
        console.warn('THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.');
      }
      var te = this.elements;
      var x = 2 * near / (right - left);
      var y = 2 * near / (top - bottom);
      var a = (right + left) / (right - left);
      var b = (top + bottom) / (top - bottom);
      var c = -(far + near) / (far - near);
      var d = -2 * far * near / (far - near);
      te[0] = x;
      te[4] = 0;
      te[8] = a;
      te[12] = 0;
      te[1] = 0;
      te[5] = y;
      te[9] = b;
      te[13] = 0;
      te[2] = 0;
      te[6] = 0;
      te[10] = c;
      te[14] = d;
      te[3] = 0;
      te[7] = 0;
      te[11] = -1;
      te[15] = 0;
      return this;
    },
    makeOrthographic: function(left, right, top, bottom, near, far) {
      var te = this.elements;
      var w = 1.0 / (right - left);
      var h = 1.0 / (top - bottom);
      var p = 1.0 / (far - near);
      var x = (right + left) * w;
      var y = (top + bottom) * h;
      var z = (far + near) * p;
      te[0] = 2 * w;
      te[4] = 0;
      te[8] = 0;
      te[12] = -x;
      te[1] = 0;
      te[5] = 2 * h;
      te[9] = 0;
      te[13] = -y;
      te[2] = 0;
      te[6] = 0;
      te[10] = -2 * p;
      te[14] = -z;
      te[3] = 0;
      te[7] = 0;
      te[11] = 0;
      te[15] = 1;
      return this;
    },
    equals: function(matrix) {
      var te = this.elements;
      var me = matrix.elements;
      for (var i = 0; i < 16; i++) {
        if (te[i] !== me[i])
          return false;
      }
      return true;
    },
    fromArray: function(array, offset) {
      if (offset === undefined)
        offset = 0;
      for (var i = 0; i < 16; i++) {
        this.elements[i] = array[i + offset];
      }
      return this;
    },
    toArray: function(array, offset) {
      if (array === undefined)
        array = [];
      if (offset === undefined)
        offset = 0;
      var te = this.elements;
      array[offset] = te[0];
      array[offset + 1] = te[1];
      array[offset + 2] = te[2];
      array[offset + 3] = te[3];
      array[offset + 4] = te[4];
      array[offset + 5] = te[5];
      array[offset + 6] = te[6];
      array[offset + 7] = te[7];
      array[offset + 8] = te[8];
      array[offset + 9] = te[9];
      array[offset + 10] = te[10];
      array[offset + 11] = te[11];
      array[offset + 12] = te[12];
      array[offset + 13] = te[13];
      array[offset + 14] = te[14];
      array[offset + 15] = te[15];
      return array;
    }
  });
  function Quaternion(x, y, z, w) {
    this._x = x || 0;
    this._y = y || 0;
    this._z = z || 0;
    this._w = (w !== undefined) ? w : 1;
  }
  Object.assign(Quaternion, {
    slerp: function(qa, qb, qm, t) {
      return qm.copy(qa).slerp(qb, t);
    },
    slerpFlat: function(dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t) {
      var x0 = src0[srcOffset0 + 0],
          y0 = src0[srcOffset0 + 1],
          z0 = src0[srcOffset0 + 2],
          w0 = src0[srcOffset0 + 3],
          x1 = src1[srcOffset1 + 0],
          y1 = src1[srcOffset1 + 1],
          z1 = src1[srcOffset1 + 2],
          w1 = src1[srcOffset1 + 3];
      if (w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1) {
        var s = 1 - t,
            cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1,
            dir = (cos >= 0 ? 1 : -1),
            sqrSin = 1 - cos * cos;
        if (sqrSin > Number.EPSILON) {
          var sin = Math.sqrt(sqrSin),
              len = Math.atan2(sin, cos * dir);
          s = Math.sin(s * len) / sin;
          t = Math.sin(t * len) / sin;
        }
        var tDir = t * dir;
        x0 = x0 * s + x1 * tDir;
        y0 = y0 * s + y1 * tDir;
        z0 = z0 * s + z1 * tDir;
        w0 = w0 * s + w1 * tDir;
        if (s === 1 - t) {
          var f = 1 / Math.sqrt(x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0);
          x0 *= f;
          y0 *= f;
          z0 *= f;
          w0 *= f;
        }
      }
      dst[dstOffset] = x0;
      dst[dstOffset + 1] = y0;
      dst[dstOffset + 2] = z0;
      dst[dstOffset + 3] = w0;
    }
  });
  Object.defineProperties(Quaternion.prototype, {
    x: {
      get: function() {
        return this._x;
      },
      set: function(value) {
        this._x = value;
        this.onChangeCallback();
      }
    },
    y: {
      get: function() {
        return this._y;
      },
      set: function(value) {
        this._y = value;
        this.onChangeCallback();
      }
    },
    z: {
      get: function() {
        return this._z;
      },
      set: function(value) {
        this._z = value;
        this.onChangeCallback();
      }
    },
    w: {
      get: function() {
        return this._w;
      },
      set: function(value) {
        this._w = value;
        this.onChangeCallback();
      }
    }
  });
  Object.assign(Quaternion.prototype, {
    isQuaternion: true,
    set: function(x, y, z, w) {
      this._x = x;
      this._y = y;
      this._z = z;
      this._w = w;
      this.onChangeCallback();
      return this;
    },
    clone: function() {
      return new this.constructor(this._x, this._y, this._z, this._w);
    },
    copy: function(quaternion) {
      this._x = quaternion.x;
      this._y = quaternion.y;
      this._z = quaternion.z;
      this._w = quaternion.w;
      this.onChangeCallback();
      return this;
    },
    setFromEuler: function(euler, update) {
      if (!(euler && euler.isEuler)) {
        throw new Error('THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.');
      }
      var x = euler._x,
          y = euler._y,
          z = euler._z,
          order = euler.order;
      var cos = Math.cos;
      var sin = Math.sin;
      var c1 = cos(x / 2);
      var c2 = cos(y / 2);
      var c3 = cos(z / 2);
      var s1 = sin(x / 2);
      var s2 = sin(y / 2);
      var s3 = sin(z / 2);
      if (order === 'XYZ') {
        this._x = s1 * c2 * c3 + c1 * s2 * s3;
        this._y = c1 * s2 * c3 - s1 * c2 * s3;
        this._z = c1 * c2 * s3 + s1 * s2 * c3;
        this._w = c1 * c2 * c3 - s1 * s2 * s3;
      } else if (order === 'YXZ') {
        this._x = s1 * c2 * c3 + c1 * s2 * s3;
        this._y = c1 * s2 * c3 - s1 * c2 * s3;
        this._z = c1 * c2 * s3 - s1 * s2 * c3;
        this._w = c1 * c2 * c3 + s1 * s2 * s3;
      } else if (order === 'ZXY') {
        this._x = s1 * c2 * c3 - c1 * s2 * s3;
        this._y = c1 * s2 * c3 + s1 * c2 * s3;
        this._z = c1 * c2 * s3 + s1 * s2 * c3;
        this._w = c1 * c2 * c3 - s1 * s2 * s3;
      } else if (order === 'ZYX') {
        this._x = s1 * c2 * c3 - c1 * s2 * s3;
        this._y = c1 * s2 * c3 + s1 * c2 * s3;
        this._z = c1 * c2 * s3 - s1 * s2 * c3;
        this._w = c1 * c2 * c3 + s1 * s2 * s3;
      } else if (order === 'YZX') {
        this._x = s1 * c2 * c3 + c1 * s2 * s3;
        this._y = c1 * s2 * c3 + s1 * c2 * s3;
        this._z = c1 * c2 * s3 - s1 * s2 * c3;
        this._w = c1 * c2 * c3 - s1 * s2 * s3;
      } else if (order === 'XZY') {
        this._x = s1 * c2 * c3 - c1 * s2 * s3;
        this._y = c1 * s2 * c3 - s1 * c2 * s3;
        this._z = c1 * c2 * s3 + s1 * s2 * c3;
        this._w = c1 * c2 * c3 + s1 * s2 * s3;
      }
      if (update !== false)
        this.onChangeCallback();
      return this;
    },
    setFromAxisAngle: function(axis, angle) {
      var halfAngle = angle / 2,
          s = Math.sin(halfAngle);
      this._x = axis.x * s;
      this._y = axis.y * s;
      this._z = axis.z * s;
      this._w = Math.cos(halfAngle);
      this.onChangeCallback();
      return this;
    },
    setFromRotationMatrix: function(m) {
      var te = m.elements,
          m11 = te[0],
          m12 = te[4],
          m13 = te[8],
          m21 = te[1],
          m22 = te[5],
          m23 = te[9],
          m31 = te[2],
          m32 = te[6],
          m33 = te[10],
          trace = m11 + m22 + m33,
          s;
      if (trace > 0) {
        s = 0.5 / Math.sqrt(trace + 1.0);
        this._w = 0.25 / s;
        this._x = (m32 - m23) * s;
        this._y = (m13 - m31) * s;
        this._z = (m21 - m12) * s;
      } else if (m11 > m22 && m11 > m33) {
        s = 2.0 * Math.sqrt(1.0 + m11 - m22 - m33);
        this._w = (m32 - m23) / s;
        this._x = 0.25 * s;
        this._y = (m12 + m21) / s;
        this._z = (m13 + m31) / s;
      } else if (m22 > m33) {
        s = 2.0 * Math.sqrt(1.0 + m22 - m11 - m33);
        this._w = (m13 - m31) / s;
        this._x = (m12 + m21) / s;
        this._y = 0.25 * s;
        this._z = (m23 + m32) / s;
      } else {
        s = 2.0 * Math.sqrt(1.0 + m33 - m11 - m22);
        this._w = (m21 - m12) / s;
        this._x = (m13 + m31) / s;
        this._y = (m23 + m32) / s;
        this._z = 0.25 * s;
      }
      this.onChangeCallback();
      return this;
    },
    setFromUnitVectors: function() {
      var v1 = new Vector3();
      var r;
      var EPS = 0.000001;
      return function setFromUnitVectors(vFrom, vTo) {
        if (v1 === undefined)
          v1 = new Vector3();
        r = vFrom.dot(vTo) + 1;
        if (r < EPS) {
          r = 0;
          if (Math.abs(vFrom.x) > Math.abs(vFrom.z)) {
            v1.set(-vFrom.y, vFrom.x, 0);
          } else {
            v1.set(0, -vFrom.z, vFrom.y);
          }
        } else {
          v1.crossVectors(vFrom, vTo);
        }
        this._x = v1.x;
        this._y = v1.y;
        this._z = v1.z;
        this._w = r;
        return this.normalize();
      };
    }(),
    angleTo: function(q) {
      return 2 * Math.acos(Math.abs(_Math.clamp(this.dot(q), -1, 1)));
    },
    rotateTowards: function(q, step) {
      var angle = this.angleTo(q);
      if (angle === 0)
        return this;
      var t = Math.min(1, step / angle);
      this.slerp(q, t);
      return this;
    },
    inverse: function() {
      return this.conjugate();
    },
    conjugate: function() {
      this._x *= -1;
      this._y *= -1;
      this._z *= -1;
      this.onChangeCallback();
      return this;
    },
    dot: function(v) {
      return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;
    },
    lengthSq: function() {
      return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;
    },
    length: function() {
      return Math.sqrt(this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w);
    },
    normalize: function() {
      var l = this.length();
      if (l === 0) {
        this._x = 0;
        this._y = 0;
        this._z = 0;
        this._w = 1;
      } else {
        l = 1 / l;
        this._x = this._x * l;
        this._y = this._y * l;
        this._z = this._z * l;
        this._w = this._w * l;
      }
      this.onChangeCallback();
      return this;
    },
    multiply: function(q, p) {
      if (p !== undefined) {
        console.warn('THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.');
        return this.multiplyQuaternions(q, p);
      }
      return this.multiplyQuaternions(this, q);
    },
    premultiply: function(q) {
      return this.multiplyQuaternions(q, this);
    },
    multiplyQuaternions: function(a, b) {
      var qax = a._x,
          qay = a._y,
          qaz = a._z,
          qaw = a._w;
      var qbx = b._x,
          qby = b._y,
          qbz = b._z,
          qbw = b._w;
      this._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;
      this._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;
      this._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;
      this._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;
      this.onChangeCallback();
      return this;
    },
    slerp: function(qb, t) {
      if (t === 0)
        return this;
      if (t === 1)
        return this.copy(qb);
      var x = this._x,
          y = this._y,
          z = this._z,
          w = this._w;
      var cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;
      if (cosHalfTheta < 0) {
        this._w = -qb._w;
        this._x = -qb._x;
        this._y = -qb._y;
        this._z = -qb._z;
        cosHalfTheta = -cosHalfTheta;
      } else {
        this.copy(qb);
      }
      if (cosHalfTheta >= 1.0) {
        this._w = w;
        this._x = x;
        this._y = y;
        this._z = z;
        return this;
      }
      var sqrSinHalfTheta = 1.0 - cosHalfTheta * cosHalfTheta;
      if (sqrSinHalfTheta <= Number.EPSILON) {
        var s = 1 - t;
        this._w = s * w + t * this._w;
        this._x = s * x + t * this._x;
        this._y = s * y + t * this._y;
        this._z = s * z + t * this._z;
        return this.normalize();
      }
      var sinHalfTheta = Math.sqrt(sqrSinHalfTheta);
      var halfTheta = Math.atan2(sinHalfTheta, cosHalfTheta);
      var ratioA = Math.sin((1 - t) * halfTheta) / sinHalfTheta,
          ratioB = Math.sin(t * halfTheta) / sinHalfTheta;
      this._w = (w * ratioA + this._w * ratioB);
      this._x = (x * ratioA + this._x * ratioB);
      this._y = (y * ratioA + this._y * ratioB);
      this._z = (z * ratioA + this._z * ratioB);
      this.onChangeCallback();
      return this;
    },
    equals: function(quaternion) {
      return (quaternion._x === this._x) && (quaternion._y === this._y) && (quaternion._z === this._z) && (quaternion._w === this._w);
    },
    fromArray: function(array, offset) {
      if (offset === undefined)
        offset = 0;
      this._x = array[offset];
      this._y = array[offset + 1];
      this._z = array[offset + 2];
      this._w = array[offset + 3];
      this.onChangeCallback();
      return this;
    },
    toArray: function(array, offset) {
      if (array === undefined)
        array = [];
      if (offset === undefined)
        offset = 0;
      array[offset] = this._x;
      array[offset + 1] = this._y;
      array[offset + 2] = this._z;
      array[offset + 3] = this._w;
      return array;
    },
    onChange: function(callback) {
      this.onChangeCallback = callback;
      return this;
    },
    onChangeCallback: function() {}
  });
  function Vector3(x, y, z) {
    this.x = x || 0;
    this.y = y || 0;
    this.z = z || 0;
  }
  Object.assign(Vector3.prototype, {
    isVector3: true,
    set: function(x, y, z) {
      this.x = x;
      this.y = y;
      this.z = z;
      return this;
    },
    setScalar: function(scalar) {
      this.x = scalar;
      this.y = scalar;
      this.z = scalar;
      return this;
    },
    setX: function(x) {
      this.x = x;
      return this;
    },
    setY: function(y) {
      this.y = y;
      return this;
    },
    setZ: function(z) {
      this.z = z;
      return this;
    },
    setComponent: function(index, value) {
      switch (index) {
        case 0:
          this.x = value;
          break;
        case 1:
          this.y = value;
          break;
        case 2:
          this.z = value;
          break;
        default:
          throw new Error('index is out of range: ' + index);
      }
      return this;
    },
    getComponent: function(index) {
      switch (index) {
        case 0:
          return this.x;
        case 1:
          return this.y;
        case 2:
          return this.z;
        default:
          throw new Error('index is out of range: ' + index);
      }
    },
    clone: function() {
      return new this.constructor(this.x, this.y, this.z);
    },
    copy: function(v) {
      this.x = v.x;
      this.y = v.y;
      this.z = v.z;
      return this;
    },
    add: function(v, w) {
      if (w !== undefined) {
        console.warn('THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.');
        return this.addVectors(v, w);
      }
      this.x += v.x;
      this.y += v.y;
      this.z += v.z;
      return this;
    },
    addScalar: function(s) {
      this.x += s;
      this.y += s;
      this.z += s;
      return this;
    },
    addVectors: function(a, b) {
      this.x = a.x + b.x;
      this.y = a.y + b.y;
      this.z = a.z + b.z;
      return this;
    },
    addScaledVector: function(v, s) {
      this.x += v.x * s;
      this.y += v.y * s;
      this.z += v.z * s;
      return this;
    },
    sub: function(v, w) {
      if (w !== undefined) {
        console.warn('THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.');
        return this.subVectors(v, w);
      }
      this.x -= v.x;
      this.y -= v.y;
      this.z -= v.z;
      return this;
    },
    subScalar: function(s) {
      this.x -= s;
      this.y -= s;
      this.z -= s;
      return this;
    },
    subVectors: function(a, b) {
      this.x = a.x - b.x;
      this.y = a.y - b.y;
      this.z = a.z - b.z;
      return this;
    },
    multiply: function(v, w) {
      if (w !== undefined) {
        console.warn('THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.');
        return this.multiplyVectors(v, w);
      }
      this.x *= v.x;
      this.y *= v.y;
      this.z *= v.z;
      return this;
    },
    multiplyScalar: function(scalar) {
      this.x *= scalar;
      this.y *= scalar;
      this.z *= scalar;
      return this;
    },
    multiplyVectors: function(a, b) {
      this.x = a.x * b.x;
      this.y = a.y * b.y;
      this.z = a.z * b.z;
      return this;
    },
    applyEuler: function() {
      var quaternion = new Quaternion();
      return function applyEuler(euler) {
        if (!(euler && euler.isEuler)) {
          console.error('THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.');
        }
        return this.applyQuaternion(quaternion.setFromEuler(euler));
      };
    }(),
    applyAxisAngle: function() {
      var quaternion = new Quaternion();
      return function applyAxisAngle(axis, angle) {
        return this.applyQuaternion(quaternion.setFromAxisAngle(axis, angle));
      };
    }(),
    applyMatrix3: function(m) {
      var x = this.x,
          y = this.y,
          z = this.z;
      var e = m.elements;
      this.x = e[0] * x + e[3] * y + e[6] * z;
      this.y = e[1] * x + e[4] * y + e[7] * z;
      this.z = e[2] * x + e[5] * y + e[8] * z;
      return this;
    },
    applyMatrix4: function(m) {
      var x = this.x,
          y = this.y,
          z = this.z;
      var e = m.elements;
      var w = 1 / (e[3] * x + e[7] * y + e[11] * z + e[15]);
      this.x = (e[0] * x + e[4] * y + e[8] * z + e[12]) * w;
      this.y = (e[1] * x + e[5] * y + e[9] * z + e[13]) * w;
      this.z = (e[2] * x + e[6] * y + e[10] * z + e[14]) * w;
      return this;
    },
    applyQuaternion: function(q) {
      var x = this.x,
          y = this.y,
          z = this.z;
      var qx = q.x,
          qy = q.y,
          qz = q.z,
          qw = q.w;
      var ix = qw * x + qy * z - qz * y;
      var iy = qw * y + qz * x - qx * z;
      var iz = qw * z + qx * y - qy * x;
      var iw = -qx * x - qy * y - qz * z;
      this.x = ix * qw + iw * -qx + iy * -qz - iz * -qy;
      this.y = iy * qw + iw * -qy + iz * -qx - ix * -qz;
      this.z = iz * qw + iw * -qz + ix * -qy - iy * -qx;
      return this;
    },
    project: function(camera) {
      return this.applyMatrix4(camera.matrixWorldInverse).applyMatrix4(camera.projectionMatrix);
    },
    unproject: function() {
      var matrix = new Matrix4();
      return function unproject(camera) {
        return this.applyMatrix4(matrix.getInverse(camera.projectionMatrix)).applyMatrix4(camera.matrixWorld);
      };
    }(),
    transformDirection: function(m) {
      var x = this.x,
          y = this.y,
          z = this.z;
      var e = m.elements;
      this.x = e[0] * x + e[4] * y + e[8] * z;
      this.y = e[1] * x + e[5] * y + e[9] * z;
      this.z = e[2] * x + e[6] * y + e[10] * z;
      return this.normalize();
    },
    divide: function(v) {
      this.x /= v.x;
      this.y /= v.y;
      this.z /= v.z;
      return this;
    },
    divideScalar: function(scalar) {
      return this.multiplyScalar(1 / scalar);
    },
    min: function(v) {
      this.x = Math.min(this.x, v.x);
      this.y = Math.min(this.y, v.y);
      this.z = Math.min(this.z, v.z);
      return this;
    },
    max: function(v) {
      this.x = Math.max(this.x, v.x);
      this.y = Math.max(this.y, v.y);
      this.z = Math.max(this.z, v.z);
      return this;
    },
    clamp: function(min, max) {
      this.x = Math.max(min.x, Math.min(max.x, this.x));
      this.y = Math.max(min.y, Math.min(max.y, this.y));
      this.z = Math.max(min.z, Math.min(max.z, this.z));
      return this;
    },
    clampScalar: function() {
      var min = new Vector3();
      var max = new Vector3();
      return function clampScalar(minVal, maxVal) {
        min.set(minVal, minVal, minVal);
        max.set(maxVal, maxVal, maxVal);
        return this.clamp(min, max);
      };
    }(),
    clampLength: function(min, max) {
      var length = this.length();
      return this.divideScalar(length || 1).multiplyScalar(Math.max(min, Math.min(max, length)));
    },
    floor: function() {
      this.x = Math.floor(this.x);
      this.y = Math.floor(this.y);
      this.z = Math.floor(this.z);
      return this;
    },
    ceil: function() {
      this.x = Math.ceil(this.x);
      this.y = Math.ceil(this.y);
      this.z = Math.ceil(this.z);
      return this;
    },
    round: function() {
      this.x = Math.round(this.x);
      this.y = Math.round(this.y);
      this.z = Math.round(this.z);
      return this;
    },
    roundToZero: function() {
      this.x = (this.x < 0) ? Math.ceil(this.x) : Math.floor(this.x);
      this.y = (this.y < 0) ? Math.ceil(this.y) : Math.floor(this.y);
      this.z = (this.z < 0) ? Math.ceil(this.z) : Math.floor(this.z);
      return this;
    },
    negate: function() {
      this.x = -this.x;
      this.y = -this.y;
      this.z = -this.z;
      return this;
    },
    dot: function(v) {
      return this.x * v.x + this.y * v.y + this.z * v.z;
    },
    lengthSq: function() {
      return this.x * this.x + this.y * this.y + this.z * this.z;
    },
    length: function() {
      return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);
    },
    manhattanLength: function() {
      return Math.abs(this.x) + Math.abs(this.y) + Math.abs(this.z);
    },
    normalize: function() {
      return this.divideScalar(this.length() || 1);
    },
    setLength: function(length) {
      return this.normalize().multiplyScalar(length);
    },
    lerp: function(v, alpha) {
      this.x += (v.x - this.x) * alpha;
      this.y += (v.y - this.y) * alpha;
      this.z += (v.z - this.z) * alpha;
      return this;
    },
    lerpVectors: function(v1, v2, alpha) {
      return this.subVectors(v2, v1).multiplyScalar(alpha).add(v1);
    },
    cross: function(v, w) {
      if (w !== undefined) {
        console.warn('THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.');
        return this.crossVectors(v, w);
      }
      return this.crossVectors(this, v);
    },
    crossVectors: function(a, b) {
      var ax = a.x,
          ay = a.y,
          az = a.z;
      var bx = b.x,
          by = b.y,
          bz = b.z;
      this.x = ay * bz - az * by;
      this.y = az * bx - ax * bz;
      this.z = ax * by - ay * bx;
      return this;
    },
    projectOnVector: function(vector) {
      var scalar = vector.dot(this) / vector.lengthSq();
      return this.copy(vector).multiplyScalar(scalar);
    },
    projectOnPlane: function() {
      var v1 = new Vector3();
      return function projectOnPlane(planeNormal) {
        v1.copy(this).projectOnVector(planeNormal);
        return this.sub(v1);
      };
    }(),
    reflect: function() {
      var v1 = new Vector3();
      return function reflect(normal) {
        return this.sub(v1.copy(normal).multiplyScalar(2 * this.dot(normal)));
      };
    }(),
    angleTo: function(v) {
      var theta = this.dot(v) / (Math.sqrt(this.lengthSq() * v.lengthSq()));
      return Math.acos(_Math.clamp(theta, -1, 1));
    },
    distanceTo: function(v) {
      return Math.sqrt(this.distanceToSquared(v));
    },
    distanceToSquared: function(v) {
      var dx = this.x - v.x,
          dy = this.y - v.y,
          dz = this.z - v.z;
      return dx * dx + dy * dy + dz * dz;
    },
    manhattanDistanceTo: function(v) {
      return Math.abs(this.x - v.x) + Math.abs(this.y - v.y) + Math.abs(this.z - v.z);
    },
    setFromSpherical: function(s) {
      return this.setFromSphericalCoords(s.radius, s.phi, s.theta);
    },
    setFromSphericalCoords: function(radius, phi, theta) {
      var sinPhiRadius = Math.sin(phi) * radius;
      this.x = sinPhiRadius * Math.sin(theta);
      this.y = Math.cos(phi) * radius;
      this.z = sinPhiRadius * Math.cos(theta);
      return this;
    },
    setFromCylindrical: function(c) {
      return this.setFromCylindricalCoords(c.radius, c.theta, c.y);
    },
    setFromCylindricalCoords: function(radius, theta, y) {
      this.x = radius * Math.sin(theta);
      this.y = y;
      this.z = radius * Math.cos(theta);
      return this;
    },
    setFromMatrixPosition: function(m) {
      var e = m.elements;
      this.x = e[12];
      this.y = e[13];
      this.z = e[14];
      return this;
    },
    setFromMatrixScale: function(m) {
      var sx = this.setFromMatrixColumn(m, 0).length();
      var sy = this.setFromMatrixColumn(m, 1).length();
      var sz = this.setFromMatrixColumn(m, 2).length();
      this.x = sx;
      this.y = sy;
      this.z = sz;
      return this;
    },
    setFromMatrixColumn: function(m, index) {
      return this.fromArray(m.elements, index * 4);
    },
    equals: function(v) {
      return ((v.x === this.x) && (v.y === this.y) && (v.z === this.z));
    },
    fromArray: function(array, offset) {
      if (offset === undefined)
        offset = 0;
      this.x = array[offset];
      this.y = array[offset + 1];
      this.z = array[offset + 2];
      return this;
    },
    toArray: function(array, offset) {
      if (array === undefined)
        array = [];
      if (offset === undefined)
        offset = 0;
      array[offset] = this.x;
      array[offset + 1] = this.y;
      array[offset + 2] = this.z;
      return array;
    },
    fromBufferAttribute: function(attribute, index, offset) {
      if (offset !== undefined) {
        console.warn('THREE.Vector3: offset has been removed from .fromBufferAttribute().');
      }
      this.x = attribute.getX(index);
      this.y = attribute.getY(index);
      this.z = attribute.getZ(index);
      return this;
    }
  });
  function Matrix3() {
    this.elements = [1, 0, 0, 0, 1, 0, 0, 0, 1];
    if (arguments.length > 0) {
      console.error('THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.');
    }
  }
  Object.assign(Matrix3.prototype, {
    isMatrix3: true,
    set: function(n11, n12, n13, n21, n22, n23, n31, n32, n33) {
      var te = this.elements;
      te[0] = n11;
      te[1] = n21;
      te[2] = n31;
      te[3] = n12;
      te[4] = n22;
      te[5] = n32;
      te[6] = n13;
      te[7] = n23;
      te[8] = n33;
      return this;
    },
    identity: function() {
      this.set(1, 0, 0, 0, 1, 0, 0, 0, 1);
      return this;
    },
    clone: function() {
      return new this.constructor().fromArray(this.elements);
    },
    copy: function(m) {
      var te = this.elements;
      var me = m.elements;
      te[0] = me[0];
      te[1] = me[1];
      te[2] = me[2];
      te[3] = me[3];
      te[4] = me[4];
      te[5] = me[5];
      te[6] = me[6];
      te[7] = me[7];
      te[8] = me[8];
      return this;
    },
    setFromMatrix4: function(m) {
      var me = m.elements;
      this.set(me[0], me[4], me[8], me[1], me[5], me[9], me[2], me[6], me[10]);
      return this;
    },
    applyToBufferAttribute: function() {
      var v1 = new Vector3();
      return function applyToBufferAttribute(attribute) {
        for (var i = 0,
            l = attribute.count; i < l; i++) {
          v1.x = attribute.getX(i);
          v1.y = attribute.getY(i);
          v1.z = attribute.getZ(i);
          v1.applyMatrix3(this);
          attribute.setXYZ(i, v1.x, v1.y, v1.z);
        }
        return attribute;
      };
    }(),
    multiply: function(m) {
      return this.multiplyMatrices(this, m);
    },
    premultiply: function(m) {
      return this.multiplyMatrices(m, this);
    },
    multiplyMatrices: function(a, b) {
      var ae = a.elements;
      var be = b.elements;
      var te = this.elements;
      var a11 = ae[0],
          a12 = ae[3],
          a13 = ae[6];
      var a21 = ae[1],
          a22 = ae[4],
          a23 = ae[7];
      var a31 = ae[2],
          a32 = ae[5],
          a33 = ae[8];
      var b11 = be[0],
          b12 = be[3],
          b13 = be[6];
      var b21 = be[1],
          b22 = be[4],
          b23 = be[7];
      var b31 = be[2],
          b32 = be[5],
          b33 = be[8];
      te[0] = a11 * b11 + a12 * b21 + a13 * b31;
      te[3] = a11 * b12 + a12 * b22 + a13 * b32;
      te[6] = a11 * b13 + a12 * b23 + a13 * b33;
      te[1] = a21 * b11 + a22 * b21 + a23 * b31;
      te[4] = a21 * b12 + a22 * b22 + a23 * b32;
      te[7] = a21 * b13 + a22 * b23 + a23 * b33;
      te[2] = a31 * b11 + a32 * b21 + a33 * b31;
      te[5] = a31 * b12 + a32 * b22 + a33 * b32;
      te[8] = a31 * b13 + a32 * b23 + a33 * b33;
      return this;
    },
    multiplyScalar: function(s) {
      var te = this.elements;
      te[0] *= s;
      te[3] *= s;
      te[6] *= s;
      te[1] *= s;
      te[4] *= s;
      te[7] *= s;
      te[2] *= s;
      te[5] *= s;
      te[8] *= s;
      return this;
    },
    determinant: function() {
      var te = this.elements;
      var a = te[0],
          b = te[1],
          c = te[2],
          d = te[3],
          e = te[4],
          f = te[5],
          g = te[6],
          h = te[7],
          i = te[8];
      return a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;
    },
    getInverse: function(matrix, throwOnDegenerate) {
      if (matrix && matrix.isMatrix4) {
        console.error("THREE.Matrix3: .getInverse() no longer takes a Matrix4 argument.");
      }
      var me = matrix.elements,
          te = this.elements,
          n11 = me[0],
          n21 = me[1],
          n31 = me[2],
          n12 = me[3],
          n22 = me[4],
          n32 = me[5],
          n13 = me[6],
          n23 = me[7],
          n33 = me[8],
          t11 = n33 * n22 - n32 * n23,
          t12 = n32 * n13 - n33 * n12,
          t13 = n23 * n12 - n22 * n13,
          det = n11 * t11 + n21 * t12 + n31 * t13;
      if (det === 0) {
        var msg = "THREE.Matrix3: .getInverse() can't invert matrix, determinant is 0";
        if (throwOnDegenerate === true) {
          throw new Error(msg);
        } else {
          console.warn(msg);
        }
        return this.identity();
      }
      var detInv = 1 / det;
      te[0] = t11 * detInv;
      te[1] = (n31 * n23 - n33 * n21) * detInv;
      te[2] = (n32 * n21 - n31 * n22) * detInv;
      te[3] = t12 * detInv;
      te[4] = (n33 * n11 - n31 * n13) * detInv;
      te[5] = (n31 * n12 - n32 * n11) * detInv;
      te[6] = t13 * detInv;
      te[7] = (n21 * n13 - n23 * n11) * detInv;
      te[8] = (n22 * n11 - n21 * n12) * detInv;
      return this;
    },
    transpose: function() {
      var tmp,
          m = this.elements;
      tmp = m[1];
      m[1] = m[3];
      m[3] = tmp;
      tmp = m[2];
      m[2] = m[6];
      m[6] = tmp;
      tmp = m[5];
      m[5] = m[7];
      m[7] = tmp;
      return this;
    },
    getNormalMatrix: function(matrix4) {
      return this.setFromMatrix4(matrix4).getInverse(this).transpose();
    },
    transposeIntoArray: function(r) {
      var m = this.elements;
      r[0] = m[0];
      r[1] = m[3];
      r[2] = m[6];
      r[3] = m[1];
      r[4] = m[4];
      r[5] = m[7];
      r[6] = m[2];
      r[7] = m[5];
      r[8] = m[8];
      return this;
    },
    setUvTransform: function(tx, ty, sx, sy, rotation, cx, cy) {
      var c = Math.cos(rotation);
      var s = Math.sin(rotation);
      this.set(sx * c, sx * s, -sx * (c * cx + s * cy) + cx + tx, -sy * s, sy * c, -sy * (-s * cx + c * cy) + cy + ty, 0, 0, 1);
    },
    scale: function(sx, sy) {
      var te = this.elements;
      te[0] *= sx;
      te[3] *= sx;
      te[6] *= sx;
      te[1] *= sy;
      te[4] *= sy;
      te[7] *= sy;
      return this;
    },
    rotate: function(theta) {
      var c = Math.cos(theta);
      var s = Math.sin(theta);
      var te = this.elements;
      var a11 = te[0],
          a12 = te[3],
          a13 = te[6];
      var a21 = te[1],
          a22 = te[4],
          a23 = te[7];
      te[0] = c * a11 + s * a21;
      te[3] = c * a12 + s * a22;
      te[6] = c * a13 + s * a23;
      te[1] = -s * a11 + c * a21;
      te[4] = -s * a12 + c * a22;
      te[7] = -s * a13 + c * a23;
      return this;
    },
    translate: function(tx, ty) {
      var te = this.elements;
      te[0] += tx * te[2];
      te[3] += tx * te[5];
      te[6] += tx * te[8];
      te[1] += ty * te[2];
      te[4] += ty * te[5];
      te[7] += ty * te[8];
      return this;
    },
    equals: function(matrix) {
      var te = this.elements;
      var me = matrix.elements;
      for (var i = 0; i < 9; i++) {
        if (te[i] !== me[i])
          return false;
      }
      return true;
    },
    fromArray: function(array, offset) {
      if (offset === undefined)
        offset = 0;
      for (var i = 0; i < 9; i++) {
        this.elements[i] = array[i + offset];
      }
      return this;
    },
    toArray: function(array, offset) {
      if (array === undefined)
        array = [];
      if (offset === undefined)
        offset = 0;
      var te = this.elements;
      array[offset] = te[0];
      array[offset + 1] = te[1];
      array[offset + 2] = te[2];
      array[offset + 3] = te[3];
      array[offset + 4] = te[4];
      array[offset + 5] = te[5];
      array[offset + 6] = te[6];
      array[offset + 7] = te[7];
      array[offset + 8] = te[8];
      return array;
    }
  });
  var _canvas;
  var ImageUtils = {getDataURL: function(image) {
      var canvas;
      if (typeof HTMLCanvasElement == 'undefined') {
        return image.src;
      } else if (image instanceof HTMLCanvasElement) {
        canvas = image;
      } else {
        if (_canvas === undefined)
          _canvas = document.createElementNS('http://www.w3.org/1999/xhtml', 'canvas');
        _canvas.width = image.width;
        _canvas.height = image.height;
        var context = _canvas.getContext('2d');
        if (image instanceof ImageData) {
          context.putImageData(image, 0, 0);
        } else {
          context.drawImage(image, 0, 0, image.width, image.height);
        }
        canvas = _canvas;
      }
      if (canvas.width > 2048 || canvas.height > 2048) {
        return canvas.toDataURL('image/jpeg', 0.6);
      } else {
        return canvas.toDataURL('image/png');
      }
    }};
  var textureId = 0;
  function Texture(image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding) {
    Object.defineProperty(this, 'id', {value: textureId++});
    this.uuid = _Math.generateUUID();
    this.name = '';
    this.image = image !== undefined ? image : Texture.DEFAULT_IMAGE;
    this.mipmaps = [];
    this.mapping = mapping !== undefined ? mapping : Texture.DEFAULT_MAPPING;
    this.wrapS = wrapS !== undefined ? wrapS : ClampToEdgeWrapping;
    this.wrapT = wrapT !== undefined ? wrapT : ClampToEdgeWrapping;
    this.magFilter = magFilter !== undefined ? magFilter : LinearFilter;
    this.minFilter = minFilter !== undefined ? minFilter : LinearMipMapLinearFilter;
    this.anisotropy = anisotropy !== undefined ? anisotropy : 1;
    this.format = format !== undefined ? format : RGBAFormat;
    this.type = type !== undefined ? type : UnsignedByteType;
    this.offset = new Vector2(0, 0);
    this.repeat = new Vector2(1, 1);
    this.center = new Vector2(0, 0);
    this.rotation = 0;
    this.matrixAutoUpdate = true;
    this.matrix = new Matrix3();
    this.generateMipmaps = true;
    this.premultiplyAlpha = false;
    this.flipY = true;
    this.unpackAlignment = 4;
    this.encoding = encoding !== undefined ? encoding : LinearEncoding;
    this.version = 0;
    this.onUpdate = null;
  }
  Texture.DEFAULT_IMAGE = undefined;
  Texture.DEFAULT_MAPPING = UVMapping;
  Texture.prototype = Object.assign(Object.create(EventDispatcher.prototype), {
    constructor: Texture,
    isTexture: true,
    updateMatrix: function() {
      this.matrix.setUvTransform(this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y);
    },
    clone: function() {
      return new this.constructor().copy(this);
    },
    copy: function(source) {
      this.name = source.name;
      this.image = source.image;
      this.mipmaps = source.mipmaps.slice(0);
      this.mapping = source.mapping;
      this.wrapS = source.wrapS;
      this.wrapT = source.wrapT;
      this.magFilter = source.magFilter;
      this.minFilter = source.minFilter;
      this.anisotropy = source.anisotropy;
      this.format = source.format;
      this.type = source.type;
      this.offset.copy(source.offset);
      this.repeat.copy(source.repeat);
      this.center.copy(source.center);
      this.rotation = source.rotation;
      this.matrixAutoUpdate = source.matrixAutoUpdate;
      this.matrix.copy(source.matrix);
      this.generateMipmaps = source.generateMipmaps;
      this.premultiplyAlpha = source.premultiplyAlpha;
      this.flipY = source.flipY;
      this.unpackAlignment = source.unpackAlignment;
      this.encoding = source.encoding;
      return this;
    },
    toJSON: function(meta) {
      var isRootObject = (meta === undefined || typeof meta === 'string');
      if (!isRootObject && meta.textures[this.uuid] !== undefined) {
        return meta.textures[this.uuid];
      }
      var output = {
        metadata: {
          version: 4.5,
          type: 'Texture',
          generator: 'Texture.toJSON'
        },
        uuid: this.uuid,
        name: this.name,
        mapping: this.mapping,
        repeat: [this.repeat.x, this.repeat.y],
        offset: [this.offset.x, this.offset.y],
        center: [this.center.x, this.center.y],
        rotation: this.rotation,
        wrap: [this.wrapS, this.wrapT],
        format: this.format,
        type: this.type,
        encoding: this.encoding,
        minFilter: this.minFilter,
        magFilter: this.magFilter,
        anisotropy: this.anisotropy,
        flipY: this.flipY,
        premultiplyAlpha: this.premultiplyAlpha,
        unpackAlignment: this.unpackAlignment
      };
      if (this.image !== undefined) {
        var image = this.image;
        if (image.uuid === undefined) {
          image.uuid = _Math.generateUUID();
        }
        if (!isRootObject && meta.images[image.uuid] === undefined) {
          var url;
          if (Array.isArray(image)) {
            url = [];
            for (var i = 0,
                l = image.length; i < l; i++) {
              url.push(ImageUtils.getDataURL(image[i]));
            }
          } else {
            url = ImageUtils.getDataURL(image);
          }
          meta.images[image.uuid] = {
            uuid: image.uuid,
            url: url
          };
        }
        output.image = image.uuid;
      }
      if (!isRootObject) {
        meta.textures[this.uuid] = output;
      }
      return output;
    },
    dispose: function() {
      this.dispatchEvent({type: 'dispose'});
    },
    transformUv: function(uv) {
      if (this.mapping !== UVMapping)
        return uv;
      uv.applyMatrix3(this.matrix);
      if (uv.x < 0 || uv.x > 1) {
        switch (this.wrapS) {
          case RepeatWrapping:
            uv.x = uv.x - Math.floor(uv.x);
            break;
          case ClampToEdgeWrapping:
            uv.x = uv.x < 0 ? 0 : 1;
            break;
          case MirroredRepeatWrapping:
            if (Math.abs(Math.floor(uv.x) % 2) === 1) {
              uv.x = Math.ceil(uv.x) - uv.x;
            } else {
              uv.x = uv.x - Math.floor(uv.x);
            }
            break;
        }
      }
      if (uv.y < 0 || uv.y > 1) {
        switch (this.wrapT) {
          case RepeatWrapping:
            uv.y = uv.y - Math.floor(uv.y);
            break;
          case ClampToEdgeWrapping:
            uv.y = uv.y < 0 ? 0 : 1;
            break;
          case MirroredRepeatWrapping:
            if (Math.abs(Math.floor(uv.y) % 2) === 1) {
              uv.y = Math.ceil(uv.y) - uv.y;
            } else {
              uv.y = uv.y - Math.floor(uv.y);
            }
            break;
        }
      }
      if (this.flipY) {
        uv.y = 1 - uv.y;
      }
      return uv;
    }
  });
  Object.defineProperty(Texture.prototype, "needsUpdate", {set: function(value) {
      if (value === true)
        this.version++;
    }});
  function Vector4(x, y, z, w) {
    this.x = x || 0;
    this.y = y || 0;
    this.z = z || 0;
    this.w = (w !== undefined) ? w : 1;
  }
  Object.assign(Vector4.prototype, {
    isVector4: true,
    set: function(x, y, z, w) {
      this.x = x;
      this.y = y;
      this.z = z;
      this.w = w;
      return this;
    },
    setScalar: function(scalar) {
      this.x = scalar;
      this.y = scalar;
      this.z = scalar;
      this.w = scalar;
      return this;
    },
    setX: function(x) {
      this.x = x;
      return this;
    },
    setY: function(y) {
      this.y = y;
      return this;
    },
    setZ: function(z) {
      this.z = z;
      return this;
    },
    setW: function(w) {
      this.w = w;
      return this;
    },
    setComponent: function(index, value) {
      switch (index) {
        case 0:
          this.x = value;
          break;
        case 1:
          this.y = value;
          break;
        case 2:
          this.z = value;
          break;
        case 3:
          this.w = value;
          break;
        default:
          throw new Error('index is out of range: ' + index);
      }
      return this;
    },
    getComponent: function(index) {
      switch (index) {
        case 0:
          return this.x;
        case 1:
          return this.y;
        case 2:
          return this.z;
        case 3:
          return this.w;
        default:
          throw new Error('index is out of range: ' + index);
      }
    },
    clone: function() {
      return new this.constructor(this.x, this.y, this.z, this.w);
    },
    copy: function(v) {
      this.x = v.x;
      this.y = v.y;
      this.z = v.z;
      this.w = (v.w !== undefined) ? v.w : 1;
      return this;
    },
    add: function(v, w) {
      if (w !== undefined) {
        console.warn('THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.');
        return this.addVectors(v, w);
      }
      this.x += v.x;
      this.y += v.y;
      this.z += v.z;
      this.w += v.w;
      return this;
    },
    addScalar: function(s) {
      this.x += s;
      this.y += s;
      this.z += s;
      this.w += s;
      return this;
    },
    addVectors: function(a, b) {
      this.x = a.x + b.x;
      this.y = a.y + b.y;
      this.z = a.z + b.z;
      this.w = a.w + b.w;
      return this;
    },
    addScaledVector: function(v, s) {
      this.x += v.x * s;
      this.y += v.y * s;
      this.z += v.z * s;
      this.w += v.w * s;
      return this;
    },
    sub: function(v, w) {
      if (w !== undefined) {
        console.warn('THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.');
        return this.subVectors(v, w);
      }
      this.x -= v.x;
      this.y -= v.y;
      this.z -= v.z;
      this.w -= v.w;
      return this;
    },
    subScalar: function(s) {
      this.x -= s;
      this.y -= s;
      this.z -= s;
      this.w -= s;
      return this;
    },
    subVectors: function(a, b) {
      this.x = a.x - b.x;
      this.y = a.y - b.y;
      this.z = a.z - b.z;
      this.w = a.w - b.w;
      return this;
    },
    multiplyScalar: function(scalar) {
      this.x *= scalar;
      this.y *= scalar;
      this.z *= scalar;
      this.w *= scalar;
      return this;
    },
    applyMatrix4: function(m) {
      var x = this.x,
          y = this.y,
          z = this.z,
          w = this.w;
      var e = m.elements;
      this.x = e[0] * x + e[4] * y + e[8] * z + e[12] * w;
      this.y = e[1] * x + e[5] * y + e[9] * z + e[13] * w;
      this.z = e[2] * x + e[6] * y + e[10] * z + e[14] * w;
      this.w = e[3] * x + e[7] * y + e[11] * z + e[15] * w;
      return this;
    },
    divideScalar: function(scalar) {
      return this.multiplyScalar(1 / scalar);
    },
    setAxisAngleFromQuaternion: function(q) {
      this.w = 2 * Math.acos(q.w);
      var s = Math.sqrt(1 - q.w * q.w);
      if (s < 0.0001) {
        this.x = 1;
        this.y = 0;
        this.z = 0;
      } else {
        this.x = q.x / s;
        this.y = q.y / s;
        this.z = q.z / s;
      }
      return this;
    },
    setAxisAngleFromRotationMatrix: function(m) {
      var angle,
          x,
          y,
          z,
          epsilon = 0.01,
          epsilon2 = 0.1,
          te = m.elements,
          m11 = te[0],
          m12 = te[4],
          m13 = te[8],
          m21 = te[1],
          m22 = te[5],
          m23 = te[9],
          m31 = te[2],
          m32 = te[6],
          m33 = te[10];
      if ((Math.abs(m12 - m21) < epsilon) && (Math.abs(m13 - m31) < epsilon) && (Math.abs(m23 - m32) < epsilon)) {
        if ((Math.abs(m12 + m21) < epsilon2) && (Math.abs(m13 + m31) < epsilon2) && (Math.abs(m23 + m32) < epsilon2) && (Math.abs(m11 + m22 + m33 - 3) < epsilon2)) {
          this.set(1, 0, 0, 0);
          return this;
        }
        angle = Math.PI;
        var xx = (m11 + 1) / 2;
        var yy = (m22 + 1) / 2;
        var zz = (m33 + 1) / 2;
        var xy = (m12 + m21) / 4;
        var xz = (m13 + m31) / 4;
        var yz = (m23 + m32) / 4;
        if ((xx > yy) && (xx > zz)) {
          if (xx < epsilon) {
            x = 0;
            y = 0.707106781;
            z = 0.707106781;
          } else {
            x = Math.sqrt(xx);
            y = xy / x;
            z = xz / x;
          }
        } else if (yy > zz) {
          if (yy < epsilon) {
            x = 0.707106781;
            y = 0;
            z = 0.707106781;
          } else {
            y = Math.sqrt(yy);
            x = xy / y;
            z = yz / y;
          }
        } else {
          if (zz < epsilon) {
            x = 0.707106781;
            y = 0.707106781;
            z = 0;
          } else {
            z = Math.sqrt(zz);
            x = xz / z;
            y = yz / z;
          }
        }
        this.set(x, y, z, angle);
        return this;
      }
      var s = Math.sqrt((m32 - m23) * (m32 - m23) + (m13 - m31) * (m13 - m31) + (m21 - m12) * (m21 - m12));
      if (Math.abs(s) < 0.001)
        s = 1;
      this.x = (m32 - m23) / s;
      this.y = (m13 - m31) / s;
      this.z = (m21 - m12) / s;
      this.w = Math.acos((m11 + m22 + m33 - 1) / 2);
      return this;
    },
    min: function(v) {
      this.x = Math.min(this.x, v.x);
      this.y = Math.min(this.y, v.y);
      this.z = Math.min(this.z, v.z);
      this.w = Math.min(this.w, v.w);
      return this;
    },
    max: function(v) {
      this.x = Math.max(this.x, v.x);
      this.y = Math.max(this.y, v.y);
      this.z = Math.max(this.z, v.z);
      this.w = Math.max(this.w, v.w);
      return this;
    },
    clamp: function(min, max) {
      this.x = Math.max(min.x, Math.min(max.x, this.x));
      this.y = Math.max(min.y, Math.min(max.y, this.y));
      this.z = Math.max(min.z, Math.min(max.z, this.z));
      this.w = Math.max(min.w, Math.min(max.w, this.w));
      return this;
    },
    clampScalar: function() {
      var min,
          max;
      return function clampScalar(minVal, maxVal) {
        if (min === undefined) {
          min = new Vector4();
          max = new Vector4();
        }
        min.set(minVal, minVal, minVal, minVal);
        max.set(maxVal, maxVal, maxVal, maxVal);
        return this.clamp(min, max);
      };
    }(),
    clampLength: function(min, max) {
      var length = this.length();
      return this.divideScalar(length || 1).multiplyScalar(Math.max(min, Math.min(max, length)));
    },
    floor: function() {
      this.x = Math.floor(this.x);
      this.y = Math.floor(this.y);
      this.z = Math.floor(this.z);
      this.w = Math.floor(this.w);
      return this;
    },
    ceil: function() {
      this.x = Math.ceil(this.x);
      this.y = Math.ceil(this.y);
      this.z = Math.ceil(this.z);
      this.w = Math.ceil(this.w);
      return this;
    },
    round: function() {
      this.x = Math.round(this.x);
      this.y = Math.round(this.y);
      this.z = Math.round(this.z);
      this.w = Math.round(this.w);
      return this;
    },
    roundToZero: function() {
      this.x = (this.x < 0) ? Math.ceil(this.x) : Math.floor(this.x);
      this.y = (this.y < 0) ? Math.ceil(this.y) : Math.floor(this.y);
      this.z = (this.z < 0) ? Math.ceil(this.z) : Math.floor(this.z);
      this.w = (this.w < 0) ? Math.ceil(this.w) : Math.floor(this.w);
      return this;
    },
    negate: function() {
      this.x = -this.x;
      this.y = -this.y;
      this.z = -this.z;
      this.w = -this.w;
      return this;
    },
    dot: function(v) {
      return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;
    },
    lengthSq: function() {
      return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;
    },
    length: function() {
      return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w);
    },
    manhattanLength: function() {
      return Math.abs(this.x) + Math.abs(this.y) + Math.abs(this.z) + Math.abs(this.w);
    },
    normalize: function() {
      return this.divideScalar(this.length() || 1);
    },
    setLength: function(length) {
      return this.normalize().multiplyScalar(length);
    },
    lerp: function(v, alpha) {
      this.x += (v.x - this.x) * alpha;
      this.y += (v.y - this.y) * alpha;
      this.z += (v.z - this.z) * alpha;
      this.w += (v.w - this.w) * alpha;
      return this;
    },
    lerpVectors: function(v1, v2, alpha) {
      return this.subVectors(v2, v1).multiplyScalar(alpha).add(v1);
    },
    equals: function(v) {
      return ((v.x === this.x) && (v.y === this.y) && (v.z === this.z) && (v.w === this.w));
    },
    fromArray: function(array, offset) {
      if (offset === undefined)
        offset = 0;
      this.x = array[offset];
      this.y = array[offset + 1];
      this.z = array[offset + 2];
      this.w = array[offset + 3];
      return this;
    },
    toArray: function(array, offset) {
      if (array === undefined)
        array = [];
      if (offset === undefined)
        offset = 0;
      array[offset] = this.x;
      array[offset + 1] = this.y;
      array[offset + 2] = this.z;
      array[offset + 3] = this.w;
      return array;
    },
    fromBufferAttribute: function(attribute, index, offset) {
      if (offset !== undefined) {
        console.warn('THREE.Vector4: offset has been removed from .fromBufferAttribute().');
      }
      this.x = attribute.getX(index);
      this.y = attribute.getY(index);
      this.z = attribute.getZ(index);
      this.w = attribute.getW(index);
      return this;
    }
  });
  function WebGLRenderTarget(width, height, options) {
    this.width = width;
    this.height = height;
    this.scissor = new Vector4(0, 0, width, height);
    this.scissorTest = false;
    this.viewport = new Vector4(0, 0, width, height);
    options = options || {};
    this.texture = new Texture(undefined, undefined, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding);
    this.texture.generateMipmaps = options.generateMipmaps !== undefined ? options.generateMipmaps : false;
    this.texture.minFilter = options.minFilter !== undefined ? options.minFilter : LinearFilter;
    this.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true;
    this.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true;
    this.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null;
  }
  WebGLRenderTarget.prototype = Object.assign(Object.create(EventDispatcher.prototype), {
    constructor: WebGLRenderTarget,
    isWebGLRenderTarget: true,
    setSize: function(width, height) {
      if (this.width !== width || this.height !== height) {
        this.width = width;
        this.height = height;
        this.dispose();
      }
      this.viewport.set(0, 0, width, height);
      this.scissor.set(0, 0, width, height);
    },
    clone: function() {
      return new this.constructor().copy(this);
    },
    copy: function(source) {
      this.width = source.width;
      this.height = source.height;
      this.viewport.copy(source.viewport);
      this.texture = source.texture.clone();
      this.depthBuffer = source.depthBuffer;
      this.stencilBuffer = source.stencilBuffer;
      this.depthTexture = source.depthTexture;
      return this;
    },
    dispose: function() {
      this.dispatchEvent({type: 'dispose'});
    }
  });
  function WebGLMultisampleRenderTarget(width, height, options) {
    WebGLRenderTarget.call(this, width, height, options);
    this.samples = 4;
  }
  WebGLMultisampleRenderTarget.prototype = Object.assign(Object.create(WebGLRenderTarget.prototype), {
    constructor: WebGLMultisampleRenderTarget,
    isWebGLMultisampleRenderTarget: true,
    copy: function(source) {
      WebGLRenderTarget.prototype.copy.call(this, source);
      this.samples = source.samples;
      return this;
    }
  });
  function WebGLRenderTargetCube(width, height, options) {
    WebGLRenderTarget.call(this, width, height, options);
  }
  WebGLRenderTargetCube.prototype = Object.create(WebGLRenderTarget.prototype);
  WebGLRenderTargetCube.prototype.constructor = WebGLRenderTargetCube;
  WebGLRenderTargetCube.prototype.isWebGLRenderTargetCube = true;
  function DataTexture(data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding) {
    Texture.call(this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding);
    this.image = {
      data: data,
      width: width,
      height: height
    };
    this.magFilter = magFilter !== undefined ? magFilter : NearestFilter;
    this.minFilter = minFilter !== undefined ? minFilter : NearestFilter;
    this.generateMipmaps = false;
    this.flipY = false;
    this.unpackAlignment = 1;
  }
  DataTexture.prototype = Object.create(Texture.prototype);
  DataTexture.prototype.constructor = DataTexture;
  DataTexture.prototype.isDataTexture = true;
  function Box3(min, max) {
    this.min = (min !== undefined) ? min : new Vector3(+Infinity, +Infinity, +Infinity);
    this.max = (max !== undefined) ? max : new Vector3(-Infinity, -Infinity, -Infinity);
  }
  Object.assign(Box3.prototype, {
    isBox3: true,
    set: function(min, max) {
      this.min.copy(min);
      this.max.copy(max);
      return this;
    },
    setFromArray: function(array) {
      var minX = +Infinity;
      var minY = +Infinity;
      var minZ = +Infinity;
      var maxX = -Infinity;
      var maxY = -Infinity;
      var maxZ = -Infinity;
      for (var i = 0,
          l = array.length; i < l; i += 3) {
        var x = array[i];
        var y = array[i + 1];
        var z = array[i + 2];
        if (x < minX)
          minX = x;
        if (y < minY)
          minY = y;
        if (z < minZ)
          minZ = z;
        if (x > maxX)
          maxX = x;
        if (y > maxY)
          maxY = y;
        if (z > maxZ)
          maxZ = z;
      }
      this.min.set(minX, minY, minZ);
      this.max.set(maxX, maxY, maxZ);
      return this;
    },
    setFromBufferAttribute: function(attribute) {
      var minX = +Infinity;
      var minY = +Infinity;
      var minZ = +Infinity;
      var maxX = -Infinity;
      var maxY = -Infinity;
      var maxZ = -Infinity;
      for (var i = 0,
          l = attribute.count; i < l; i++) {
        var x = attribute.getX(i);
        var y = attribute.getY(i);
        var z = attribute.getZ(i);
        if (x < minX)
          minX = x;
        if (y < minY)
          minY = y;
        if (z < minZ)
          minZ = z;
        if (x > maxX)
          maxX = x;
        if (y > maxY)
          maxY = y;
        if (z > maxZ)
          maxZ = z;
      }
      this.min.set(minX, minY, minZ);
      this.max.set(maxX, maxY, maxZ);
      return this;
    },
    setFromPoints: function(points) {
      this.makeEmpty();
      for (var i = 0,
          il = points.length; i < il; i++) {
        this.expandByPoint(points[i]);
      }
      return this;
    },
    setFromCenterAndSize: function() {
      var v1 = new Vector3();
      return function setFromCenterAndSize(center, size) {
        var halfSize = v1.copy(size).multiplyScalar(0.5);
        this.min.copy(center).sub(halfSize);
        this.max.copy(center).add(halfSize);
        return this;
      };
    }(),
    setFromObject: function(object) {
      this.makeEmpty();
      return this.expandByObject(object);
    },
    clone: function() {
      return new this.constructor().copy(this);
    },
    copy: function(box) {
      this.min.copy(box.min);
      this.max.copy(box.max);
      return this;
    },
    makeEmpty: function() {
      this.min.x = this.min.y = this.min.z = +Infinity;
      this.max.x = this.max.y = this.max.z = -Infinity;
      return this;
    },
    isEmpty: function() {
      return (this.max.x < this.min.x) || (this.max.y < this.min.y) || (this.max.z < this.min.z);
    },
    getCenter: function(target) {
      if (target === undefined) {
        console.warn('THREE.Box3: .getCenter() target is now required');
        target = new Vector3();
      }
      return this.isEmpty() ? target.set(0, 0, 0) : target.addVectors(this.min, this.max).multiplyScalar(0.5);
    },
    getSize: function(target) {
      if (target === undefined) {
        console.warn('THREE.Box3: .getSize() target is now required');
        target = new Vector3();
      }
      return this.isEmpty() ? target.set(0, 0, 0) : target.subVectors(this.max, this.min);
    },
    expandByPoint: function(point) {
      this.min.min(point);
      this.max.max(point);
      return this;
    },
    expandByVector: function(vector) {
      this.min.sub(vector);
      this.max.add(vector);
      return this;
    },
    expandByScalar: function(scalar) {
      this.min.addScalar(-scalar);
      this.max.addScalar(scalar);
      return this;
    },
    expandByObject: function() {
      var scope,
          i,
          l;
      var v1 = new Vector3();
      function traverse(node) {
        var geometry = node.geometry;
        if (geometry !== undefined) {
          if (geometry.isGeometry) {
            var vertices = geometry.vertices;
            for (i = 0, l = vertices.length; i < l; i++) {
              v1.copy(vertices[i]);
              v1.applyMatrix4(node.matrixWorld);
              scope.expandByPoint(v1);
            }
          } else if (geometry.isBufferGeometry) {
            var attribute = geometry.attributes.position;
            if (attribute !== undefined) {
              for (i = 0, l = attribute.count; i < l; i++) {
                v1.fromBufferAttribute(attribute, i).applyMatrix4(node.matrixWorld);
                scope.expandByPoint(v1);
              }
            }
          }
        }
      }
      return function expandByObject(object) {
        scope = this;
        object.updateMatrixWorld(true);
        object.traverse(traverse);
        return this;
      };
    }(),
    containsPoint: function(point) {
      return point.x < this.min.x || point.x > this.max.x || point.y < this.min.y || point.y > this.max.y || point.z < this.min.z || point.z > this.max.z ? false : true;
    },
    containsBox: function(box) {
      return this.min.x <= box.min.x && box.max.x <= this.max.x && this.min.y <= box.min.y && box.max.y <= this.max.y && this.min.z <= box.min.z && box.max.z <= this.max.z;
    },
    getParameter: function(point, target) {
      if (target === undefined) {
        console.warn('THREE.Box3: .getParameter() target is now required');
        target = new Vector3();
      }
      return target.set((point.x - this.min.x) / (this.max.x - this.min.x), (point.y - this.min.y) / (this.max.y - this.min.y), (point.z - this.min.z) / (this.max.z - this.min.z));
    },
    intersectsBox: function(box) {
      return box.max.x < this.min.x || box.min.x > this.max.x || box.max.y < this.min.y || box.min.y > this.max.y || box.max.z < this.min.z || box.min.z > this.max.z ? false : true;
    },
    intersectsSphere: (function() {
      var closestPoint = new Vector3();
      return function intersectsSphere(sphere) {
        this.clampPoint(sphere.center, closestPoint);
        return closestPoint.distanceToSquared(sphere.center) <= (sphere.radius * sphere.radius);
      };
    })(),
    intersectsPlane: function(plane) {
      var min,
          max;
      if (plane.normal.x > 0) {
        min = plane.normal.x * this.min.x;
        max = plane.normal.x * this.max.x;
      } else {
        min = plane.normal.x * this.max.x;
        max = plane.normal.x * this.min.x;
      }
      if (plane.normal.y > 0) {
        min += plane.normal.y * this.min.y;
        max += plane.normal.y * this.max.y;
      } else {
        min += plane.normal.y * this.max.y;
        max += plane.normal.y * this.min.y;
      }
      if (plane.normal.z > 0) {
        min += plane.normal.z * this.min.z;
        max += plane.normal.z * this.max.z;
      } else {
        min += plane.normal.z * this.max.z;
        max += plane.normal.z * this.min.z;
      }
      return (min <= -plane.constant && max >= -plane.constant);
    },
    intersectsTriangle: (function() {
      var v0 = new Vector3();
      var v1 = new Vector3();
      var v2 = new Vector3();
      var f0 = new Vector3();
      var f1 = new Vector3();
      var f2 = new Vector3();
      var testAxis = new Vector3();
      var center = new Vector3();
      var extents = new Vector3();
      var triangleNormal = new Vector3();
      function satForAxes(axes) {
        var i,
            j;
        for (i = 0, j = axes.length - 3; i <= j; i += 3) {
          testAxis.fromArray(axes, i);
          var r = extents.x * Math.abs(testAxis.x) + extents.y * Math.abs(testAxis.y) + extents.z * Math.abs(testAxis.z);
          var p0 = v0.dot(testAxis);
          var p1 = v1.dot(testAxis);
          var p2 = v2.dot(testAxis);
          if (Math.max(-Math.max(p0, p1, p2), Math.min(p0, p1, p2)) > r) {
            return false;
          }
        }
        return true;
      }
      return function intersectsTriangle(triangle) {
        if (this.isEmpty()) {
          return false;
        }
        this.getCenter(center);
        extents.subVectors(this.max, center);
        v0.subVectors(triangle.a, center);
        v1.subVectors(triangle.b, center);
        v2.subVectors(triangle.c, center);
        f0.subVectors(v1, v0);
        f1.subVectors(v2, v1);
        f2.subVectors(v0, v2);
        var axes = [0, -f0.z, f0.y, 0, -f1.z, f1.y, 0, -f2.z, f2.y, f0.z, 0, -f0.x, f1.z, 0, -f1.x, f2.z, 0, -f2.x, -f0.y, f0.x, 0, -f1.y, f1.x, 0, -f2.y, f2.x, 0];
        if (!satForAxes(axes)) {
          return false;
        }
        axes = [1, 0, 0, 0, 1, 0, 0, 0, 1];
        if (!satForAxes(axes)) {
          return false;
        }
        triangleNormal.crossVectors(f0, f1);
        axes = [triangleNormal.x, triangleNormal.y, triangleNormal.z];
        return satForAxes(axes);
      };
    })(),
    clampPoint: function(point, target) {
      if (target === undefined) {
        console.warn('THREE.Box3: .clampPoint() target is now required');
        target = new Vector3();
      }
      return target.copy(point).clamp(this.min, this.max);
    },
    distanceToPoint: function() {
      var v1 = new Vector3();
      return function distanceToPoint(point) {
        var clampedPoint = v1.copy(point).clamp(this.min, this.max);
        return clampedPoint.sub(point).length();
      };
    }(),
    getBoundingSphere: function() {
      var v1 = new Vector3();
      return function getBoundingSphere(target) {
        if (target === undefined) {
          console.warn('THREE.Box3: .getBoundingSphere() target is now required');
          target = new Sphere();
        }
        this.getCenter(target.center);
        target.radius = this.getSize(v1).length() * 0.5;
        return target;
      };
    }(),
    intersect: function(box) {
      this.min.max(box.min);
      this.max.min(box.max);
      if (this.isEmpty())
        this.makeEmpty();
      return this;
    },
    union: function(box) {
      this.min.min(box.min);
      this.max.max(box.max);
      return this;
    },
    applyMatrix4: function() {
      var points = [new Vector3(), new Vector3(), new Vector3(), new Vector3(), new Vector3(), new Vector3(), new Vector3(), new Vector3()];
      return function applyMatrix4(matrix) {
        if (this.isEmpty())
          return this;
        points[0].set(this.min.x, this.min.y, this.min.z).applyMatrix4(matrix);
        points[1].set(this.min.x, this.min.y, this.max.z).applyMatrix4(matrix);
        points[2].set(this.min.x, this.max.y, this.min.z).applyMatrix4(matrix);
        points[3].set(this.min.x, this.max.y, this.max.z).applyMatrix4(matrix);
        points[4].set(this.max.x, this.min.y, this.min.z).applyMatrix4(matrix);
        points[5].set(this.max.x, this.min.y, this.max.z).applyMatrix4(matrix);
        points[6].set(this.max.x, this.max.y, this.min.z).applyMatrix4(matrix);
        points[7].set(this.max.x, this.max.y, this.max.z).applyMatrix4(matrix);
        this.setFromPoints(points);
        return this;
      };
    }(),
    translate: function(offset) {
      this.min.add(offset);
      this.max.add(offset);
      return this;
    },
    equals: function(box) {
      return box.min.equals(this.min) && box.max.equals(this.max);
    }
  });
  function Sphere(center, radius) {
    this.center = (center !== undefined) ? center : new Vector3();
    this.radius = (radius !== undefined) ? radius : 0;
  }
  Object.assign(Sphere.prototype, {
    set: function(center, radius) {
      this.center.copy(center);
      this.radius = radius;
      return this;
    },
    setFromPoints: function() {
      var box = new Box3();
      return function setFromPoints(points, optionalCenter) {
        var center = this.center;
        if (optionalCenter !== undefined) {
          center.copy(optionalCenter);
        } else {
          box.setFromPoints(points).getCenter(center);
        }
        var maxRadiusSq = 0;
        for (var i = 0,
            il = points.length; i < il; i++) {
          maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(points[i]));
        }
        this.radius = Math.sqrt(maxRadiusSq);
        return this;
      };
    }(),
    clone: function() {
      return new this.constructor().copy(this);
    },
    copy: function(sphere) {
      this.center.copy(sphere.center);
      this.radius = sphere.radius;
      return this;
    },
    empty: function() {
      return (this.radius <= 0);
    },
    containsPoint: function(point) {
      return (point.distanceToSquared(this.center) <= (this.radius * this.radius));
    },
    distanceToPoint: function(point) {
      return (point.distanceTo(this.center) - this.radius);
    },
    intersectsSphere: function(sphere) {
      var radiusSum = this.radius + sphere.radius;
      return sphere.center.distanceToSquared(this.center) <= (radiusSum * radiusSum);
    },
    intersectsBox: function(box) {
      return box.intersectsSphere(this);
    },
    intersectsPlane: function(plane) {
      return Math.abs(plane.distanceToPoint(this.center)) <= this.radius;
    },
    clampPoint: function(point, target) {
      var deltaLengthSq = this.center.distanceToSquared(point);
      if (target === undefined) {
        console.warn('THREE.Sphere: .clampPoint() target is now required');
        target = new Vector3();
      }
      target.copy(point);
      if (deltaLengthSq > (this.radius * this.radius)) {
        target.sub(this.center).normalize();
        target.multiplyScalar(this.radius).add(this.center);
      }
      return target;
    },
    getBoundingBox: function(target) {
      if (target === undefined) {
        console.warn('THREE.Sphere: .getBoundingBox() target is now required');
        target = new Box3();
      }
      target.set(this.center, this.center);
      target.expandByScalar(this.radius);
      return target;
    },
    applyMatrix4: function(matrix) {
      this.center.applyMatrix4(matrix);
      this.radius = this.radius * matrix.getMaxScaleOnAxis();
      return this;
    },
    translate: function(offset) {
      this.center.add(offset);
      return this;
    },
    equals: function(sphere) {
      return sphere.center.equals(this.center) && (sphere.radius === this.radius);
    }
  });
  function Plane(normal, constant) {
    this.normal = (normal !== undefined) ? normal : new Vector3(1, 0, 0);
    this.constant = (constant !== undefined) ? constant : 0;
  }
  Object.assign(Plane.prototype, {
    set: function(normal, constant) {
      this.normal.copy(normal);
      this.constant = constant;
      return this;
    },
    setComponents: function(x, y, z, w) {
      this.normal.set(x, y, z);
      this.constant = w;
      return this;
    },
    setFromNormalAndCoplanarPoint: function(normal, point) {
      this.normal.copy(normal);
      this.constant = -point.dot(this.normal);
      return this;
    },
    setFromCoplanarPoints: function() {
      var v1 = new Vector3();
      var v2 = new Vector3();
      return function setFromCoplanarPoints(a, b, c) {
        var normal = v1.subVectors(c, b).cross(v2.subVectors(a, b)).normalize();
        this.setFromNormalAndCoplanarPoint(normal, a);
        return this;
      };
    }(),
    clone: function() {
      return new this.constructor().copy(this);
    },
    copy: function(plane) {
      this.normal.copy(plane.normal);
      this.constant = plane.constant;
      return this;
    },
    normalize: function() {
      var inverseNormalLength = 1.0 / this.normal.length();
      this.normal.multiplyScalar(inverseNormalLength);
      this.constant *= inverseNormalLength;
      return this;
    },
    negate: function() {
      this.constant *= -1;
      this.normal.negate();
      return this;
    },
    distanceToPoint: function(point) {
      return this.normal.dot(point) + this.constant;
    },
    distanceToSphere: function(sphere) {
      return this.distanceToPoint(sphere.center) - sphere.radius;
    },
    projectPoint: function(point, target) {
      if (target === undefined) {
        console.warn('THREE.Plane: .projectPoint() target is now required');
        target = new Vector3();
      }
      return target.copy(this.normal).multiplyScalar(-this.distanceToPoint(point)).add(point);
    },
    intersectLine: function() {
      var v1 = new Vector3();
      return function intersectLine(line, target) {
        if (target === undefined) {
          console.warn('THREE.Plane: .intersectLine() target is now required');
          target = new Vector3();
        }
        var direction = line.delta(v1);
        var denominator = this.normal.dot(direction);
        if (denominator === 0) {
          if (this.distanceToPoint(line.start) === 0) {
            return target.copy(line.start);
          }
          return undefined;
        }
        var t = -(line.start.dot(this.normal) + this.constant) / denominator;
        if (t < 0 || t > 1) {
          return undefined;
        }
        return target.copy(direction).multiplyScalar(t).add(line.start);
      };
    }(),
    intersectsLine: function(line) {
      var startSign = this.distanceToPoint(line.start);
      var endSign = this.distanceToPoint(line.end);
      return (startSign < 0 && endSign > 0) || (endSign < 0 && startSign > 0);
    },
    intersectsBox: function(box) {
      return box.intersectsPlane(this);
    },
    intersectsSphere: function(sphere) {
      return sphere.intersectsPlane(this);
    },
    coplanarPoint: function(target) {
      if (target === undefined) {
        console.warn('THREE.Plane: .coplanarPoint() target is now required');
        target = new Vector3();
      }
      return target.copy(this.normal).multiplyScalar(-this.constant);
    },
    applyMatrix4: function() {
      var v1 = new Vector3();
      var m1 = new Matrix3();
      return function applyMatrix4(matrix, optionalNormalMatrix) {
        var normalMatrix = optionalNormalMatrix || m1.getNormalMatrix(matrix);
        var referencePoint = this.coplanarPoint(v1).applyMatrix4(matrix);
        var normal = this.normal.applyMatrix3(normalMatrix).normalize();
        this.constant = -referencePoint.dot(normal);
        return this;
      };
    }(),
    translate: function(offset) {
      this.constant -= offset.dot(this.normal);
      return this;
    },
    equals: function(plane) {
      return plane.normal.equals(this.normal) && (plane.constant === this.constant);
    }
  });
  function Frustum(p0, p1, p2, p3, p4, p5) {
    this.planes = [(p0 !== undefined) ? p0 : new Plane(), (p1 !== undefined) ? p1 : new Plane(), (p2 !== undefined) ? p2 : new Plane(), (p3 !== undefined) ? p3 : new Plane(), (p4 !== undefined) ? p4 : new Plane(), (p5 !== undefined) ? p5 : new Plane()];
  }
  Object.assign(Frustum.prototype, {
    set: function(p0, p1, p2, p3, p4, p5) {
      var planes = this.planes;
      planes[0].copy(p0);
      planes[1].copy(p1);
      planes[2].copy(p2);
      planes[3].copy(p3);
      planes[4].copy(p4);
      planes[5].copy(p5);
      return this;
    },
    clone: function() {
      return new this.constructor().copy(this);
    },
    copy: function(frustum) {
      var planes = this.planes;
      for (var i = 0; i < 6; i++) {
        planes[i].copy(frustum.planes[i]);
      }
      return this;
    },
    setFromMatrix: function(m) {
      var planes = this.planes;
      var me = m.elements;
      var me0 = me[0],
          me1 = me[1],
          me2 = me[2],
          me3 = me[3];
      var me4 = me[4],
          me5 = me[5],
          me6 = me[6],
          me7 = me[7];
      var me8 = me[8],
          me9 = me[9],
          me10 = me[10],
          me11 = me[11];
      var me12 = me[12],
          me13 = me[13],
          me14 = me[14],
          me15 = me[15];
      planes[0].setComponents(me3 - me0, me7 - me4, me11 - me8, me15 - me12).normalize();
      planes[1].setComponents(me3 + me0, me7 + me4, me11 + me8, me15 + me12).normalize();
      planes[2].setComponents(me3 + me1, me7 + me5, me11 + me9, me15 + me13).normalize();
      planes[3].setComponents(me3 - me1, me7 - me5, me11 - me9, me15 - me13).normalize();
      planes[4].setComponents(me3 - me2, me7 - me6, me11 - me10, me15 - me14).normalize();
      planes[5].setComponents(me3 + me2, me7 + me6, me11 + me10, me15 + me14).normalize();
      return this;
    },
    intersectsObject: function() {
      var sphere = new Sphere();
      return function intersectsObject(object) {
        var geometry = object.geometry;
        if (geometry.boundingSphere === null)
          geometry.computeBoundingSphere();
        sphere.copy(geometry.boundingSphere).applyMatrix4(object.matrixWorld);
        return this.intersectsSphere(sphere);
      };
    }(),
    intersectsSprite: function() {
      var sphere = new Sphere();
      return function intersectsSprite(sprite) {
        sphere.center.set(0, 0, 0);
        sphere.radius = 0.7071067811865476;
        sphere.applyMatrix4(sprite.matrixWorld);
        return this.intersectsSphere(sphere);
      };
    }(),
    intersectsSphere: function(sphere) {
      var planes = this.planes;
      var center = sphere.center;
      var negRadius = -sphere.radius;
      for (var i = 0; i < 6; i++) {
        var distance = planes[i].distanceToPoint(center);
        if (distance < negRadius) {
          return false;
        }
      }
      return true;
    },
    intersectsBox: function() {
      var p = new Vector3();
      return function intersectsBox(box) {
        var planes = this.planes;
        for (var i = 0; i < 6; i++) {
          var plane = planes[i];
          p.x = plane.normal.x > 0 ? box.max.x : box.min.x;
          p.y = plane.normal.y > 0 ? box.max.y : box.min.y;
          p.z = plane.normal.z > 0 ? box.max.z : box.min.z;
          if (plane.distanceToPoint(p) < 0) {
            return false;
          }
        }
        return true;
      };
    }(),
    containsPoint: function(point) {
      var planes = this.planes;
      for (var i = 0; i < 6; i++) {
        if (planes[i].distanceToPoint(point) < 0) {
          return false;
        }
      }
      return true;
    }
  });
  var alphamap_fragment = "#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif";
  var alphamap_pars_fragment = "#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif";
  var alphatest_fragment = "#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif";
  var aomap_fragment = "#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\n\t#endif\n#endif";
  var aomap_pars_fragment = "#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif";
  var begin_vertex = "vec3 transformed = vec3( position );";
  var beginnormal_vertex = "vec3 objectNormal = vec3( normal );\n#ifdef USE_TANGENT\n\tvec3 objectTangent = vec3( tangent.xyz );\n#endif";
  var bsdfs = "vec2 integrateSpecularBRDF( const in float dotNV, const in float roughness ) {\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\treturn vec2( -1.04, 1.04 ) * a004 + r.zw;\n}\nfloat punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\tif( cutoffDistance > 0.0 ) {\n\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t}\n\treturn distanceFalloff;\n#else\n\tif( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\t}\n\treturn 1.0;\n#endif\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE  = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS  = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\nvec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\n\treturn specularColor * brdf.x + brdf.y;\n}\nvoid BRDF_Specular_Multiscattering_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tvec3 F = F_Schlick( specularColor, dotNV );\n\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\n\tvec3 FssEss = F * brdf.x + brdf.y;\n\tfloat Ess = brdf.x + brdf.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = specularColor + ( 1.0 - specularColor ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}";
  var bumpmap_pars_fragment = "#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\t\tfDet *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif";
  var clipping_planes_fragment = "#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\tif ( clipped ) discard;\n\t#endif\n#endif";
  var clipping_planes_pars_fragment = "#if NUM_CLIPPING_PLANES > 0\n\t#if ! defined( PHYSICAL ) && ! defined( PHONG ) && ! defined( MATCAP )\n\t\tvarying vec3 vViewPosition;\n\t#endif\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif";
  var clipping_planes_pars_vertex = "#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG ) && ! defined( MATCAP )\n\tvarying vec3 vViewPosition;\n#endif";
  var clipping_planes_vertex = "#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG ) && ! defined( MATCAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif";
  var color_fragment = "#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif";
  var color_pars_fragment = "#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif";
  var color_pars_vertex = "#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif";
  var color_vertex = "#ifdef USE_COLOR\n\tvColor.xyz = color.xyz;\n#endif";
  var common = "#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat linearToRelativeLuminance( const in vec3 color ) {\n\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\n\treturn dot( weights, color.rgb );\n}";
  var cube_uv_reflection_fragment = "#ifdef ENVMAP_TYPE_CUBE_UV\n#define cubeUV_textureSize (1024.0)\nint getFaceFromDirection(vec3 direction) {\n\tvec3 absDirection = abs(direction);\n\tint face = -1;\n\tif( absDirection.x > absDirection.z ) {\n\t\tif(absDirection.x > absDirection.y )\n\t\t\tface = direction.x > 0.0 ? 0 : 3;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\telse {\n\t\tif(absDirection.z > absDirection.y )\n\t\t\tface = direction.z > 0.0 ? 2 : 5;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\treturn face;\n}\n#define cubeUV_maxLods1  (log2(cubeUV_textureSize*0.25) - 1.0)\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\n\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\n\tfloat dxRoughness = dFdx(roughness);\n\tfloat dyRoughness = dFdy(roughness);\n\tvec3 dx = dFdx( vec * scale * dxRoughness );\n\tvec3 dy = dFdy( vec * scale * dyRoughness );\n\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\n\td = clamp(d, 1.0, cubeUV_rangeClamp);\n\tfloat mipLevel = 0.5 * log2(d);\n\treturn vec2(floor(mipLevel), fract(mipLevel));\n}\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\n\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\n\tfloat a = 16.0 * cubeUV_rcpTextureSize;\n\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\n\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\n\tfloat powScale = exp2_packed.x * exp2_packed.y;\n\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\n\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\n\tbool bRes = mipLevel == 0.0;\n\tscale =  bRes && (scale < a) ? a : scale;\n\tvec3 r;\n\tvec2 offset;\n\tint face = getFaceFromDirection(direction);\n\tfloat rcpPowScale = 1.0 / powScale;\n\tif( face == 0) {\n\t\tr = vec3(direction.x, -direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 1) {\n\t\tr = vec3(direction.y, direction.x, direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 2) {\n\t\tr = vec3(direction.z, direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 3) {\n\t\tr = vec3(direction.x, direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse if( face == 4) {\n\t\tr = vec3(direction.y, direction.x, -direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse {\n\t\tr = vec3(direction.z, -direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\tr = normalize(r);\n\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\n\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\n\tvec2 base = offset + vec2( texelOffset );\n\treturn base + s * ( scale - 2.0 * texelOffset );\n}\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\nvec4 textureCubeUV( sampler2D envMap, vec3 reflectedDirection, float roughness ) {\n\tfloat roughnessVal = roughness* cubeUV_maxLods3;\n\tfloat r1 = floor(roughnessVal);\n\tfloat r2 = r1 + 1.0;\n\tfloat t = fract(roughnessVal);\n\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\n\tfloat s = mipInfo.y;\n\tfloat level0 = mipInfo.x;\n\tfloat level1 = level0 + 1.0;\n\tlevel1 = level1 > 5.0 ? 5.0 : level1;\n\tlevel0 += min( floor( s + 0.5 ), 5.0 );\n\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\n\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\n\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\n\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\n\tvec4 result = mix(color10, color20, t);\n\treturn vec4(result.rgb, 1.0);\n}\n#endif";
  var defaultnormal_vertex = "vec3 transformedNormal = normalMatrix * objectNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = normalMatrix * objectTangent;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif";
  var displacementmap_pars_vertex = "#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif";
  var displacementmap_vertex = "#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\n#endif";
  var emissivemap_fragment = "#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif";
  var emissivemap_pars_fragment = "#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif";
  var encodings_fragment = "gl_FragColor = linearToOutputTexel( gl_FragColor );";
  var encodings_pars_fragment = "\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( gammaFactor ) ), value.a );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( 1.0 / gammaFactor ) ), value.a );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * value.a * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = min( floor( D ) / 255.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value )  {\n\tvec3 Xp_Y_XYZp = cLogLuvM * value.rgb;\n\tXp_Y_XYZp = max( Xp_Y_XYZp, vec3( 1e-6, 1e-6, 1e-6 ) );\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract( Le );\n\tvResult.z = ( Le - ( floor( vResult.w * 255.0 ) ) / 255.0 ) / 255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2( ( Le - 127.0 ) / 2.0 );\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = cLogLuvInverseM * Xp_Y_XYZp.rgb;\n\treturn vec4( max( vRGB, 0.0 ), 1.0 );\n}";
  var envmap_fragment = "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\treflectVec = normalize( reflectVec );\n\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\treflectVec = normalize( reflectVec );\n\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\n\t\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\tenvColor = envMapTexelToLinear( envColor );\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif";
  var envmap_pars_fragment = "#if defined( USE_ENVMAP ) || defined( PHYSICAL )\n\tuniform float reflectivity;\n\tuniform float envMapIntensity;\n#endif\n#ifdef USE_ENVMAP\n\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\n\t\tvarying vec3 vWorldPosition;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\tuniform float flipEnvMap;\n\tuniform int maxMipLevel;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL )\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif";
  var envmap_pars_vertex = "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif";
  var envmap_vertex = "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif";
  var fog_vertex = "#ifdef USE_FOG\n\tfogDepth = -mvPosition.z;\n#endif";
  var fog_pars_vertex = "#ifdef USE_FOG\n\tvarying float fogDepth;\n#endif";
  var fog_fragment = "#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif";
  var fog_pars_fragment = "#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float fogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif";
  var gradientmap_pars_fragment = "#ifdef TOON\n\tuniform sampler2D gradientMap;\n\tvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\t\tfloat dotNL = dot( normal, lightDirection );\n\t\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t\t#ifdef USE_GRADIENTMAP\n\t\t\treturn texture2D( gradientMap, coord ).rgb;\n\t\t#else\n\t\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t\t#endif\n\t}\n#endif";
  var lightmap_fragment = "#ifdef USE_LIGHTMAP\n\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n#endif";
  var lightmap_pars_fragment = "#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif";
  var lights_lambert_vertex = "vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\nvIndirectFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n\tvIndirectBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\n#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvIndirectFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvIndirectBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n#endif";
  var lights_pars_begin = "uniform vec3 ambientLightColor;\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t\tfloat shadowCameraNear;\n\t\tfloat shadowCameraFar;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight  ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif";
  var envmap_physical_pars_fragment = "#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, queryVec, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar + 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent ));\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV;\n\t\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif";
  var lights_phong_fragment = "BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;";
  var lights_phong_pars_fragment = "varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifdef TOON\n\t\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#else\n\t\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\t\tvec3 irradiance = dotNL * directLight.color;\n\t#endif\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)";
  var lights_physical_fragment = "PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\n#ifdef STANDARD\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.clearCoat = saturate( clearCoat );\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\n#endif";
  var lights_physical_pars_fragment = "struct PhysicalMaterial {\n\tvec3\tdiffuseColor;\n\tfloat\tspecularRoughness;\n\tvec3\tspecularColor;\n\t#ifndef STANDARD\n\t\tfloat clearCoat;\n\t\tfloat clearCoatRoughness;\n\t#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.specularRoughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3(    0, 1,    0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifndef STANDARD\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\n\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\t#ifndef STANDARD\n\t\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifndef ENVMAP_TYPE_CUBE_UV\n\t\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\t#endif\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifndef STANDARD\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\tfloat dotNL = dotNV;\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\tfloat clearCoatInv = 1.0 - clearCoatDHR;\n\t#if defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec3 singleScattering = vec3( 0.0 );\n\t\tvec3 multiScattering = vec3( 0.0 );\n\t\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\t\tBRDF_Specular_Multiscattering_Environment( geometry, material.specularColor, material.specularRoughness, singleScattering, multiScattering );\n\t\tvec3 diffuse = material.diffuseColor;\n\t\treflectedLight.indirectSpecular += clearCoatInv * radiance * singleScattering;\n\t\treflectedLight.indirectDiffuse += multiScattering * cosineWeightedIrradiance;\n\t\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n\t#else\n\t\treflectedLight.indirectSpecular += clearCoatInv * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\n\t#endif\n\t#ifndef STANDARD\n\t\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\n#define Material_BlinnShininessExponent( material )   GGXRoughnessToBlinnExponent( material.specularRoughness )\n#define Material_ClearCoat_BlinnShininessExponent( material )   GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}";
  var lights_fragment_begin = "\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = normalize( vViewPosition );\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearCoatRadiance = vec3( 0.0 );\n#endif";
  var lights_fragment_maps = "#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tirradiance += getLightProbeIndirectIrradiance( geometry, maxMipLevel );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tradiance += getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), maxMipLevel );\n\t#ifndef STANDARD\n\t\tclearCoatRadiance += getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), maxMipLevel );\n\t#endif\n#endif";
  var lights_fragment_end = "#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, irradiance, clearCoatRadiance, geometry, material, reflectedLight );\n#endif";
  var logdepthbuf_fragment = "#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif";
  var logdepthbuf_pars_fragment = "#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n#endif";
  var logdepthbuf_pars_vertex = "#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#else\n\t\tuniform float logDepthBufFC;\n\t#endif\n#endif";
  var logdepthbuf_vertex = "#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t#else\n\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\tgl_Position.z *= gl_Position.w;\n\t#endif\n#endif";
  var map_fragment = "#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif";
  var map_pars_fragment = "#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif";
  var map_particle_fragment = "#ifdef USE_MAP\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n\tvec4 mapTexel = texture2D( map, uv );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif";
  var map_particle_pars_fragment = "#ifdef USE_MAP\n\tuniform mat3 uvTransform;\n\tuniform sampler2D map;\n#endif";
  var metalnessmap_fragment = "float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif";
  var metalnessmap_pars_fragment = "#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif";
  var morphnormal_vertex = "#ifdef USE_MORPHNORMALS\n\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\n\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\n\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\n\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\n#endif";
  var morphtarget_pars_vertex = "#ifdef USE_MORPHTARGETS\n\t#ifndef USE_MORPHNORMALS\n\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif";
  var morphtarget_vertex = "#ifdef USE_MORPHTARGETS\n\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\n\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\n\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\n\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\n\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\n\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\n\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n\t#endif\n#endif";
  var normal_fragment_begin = "#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#endif\n\t#ifdef USE_TANGENT\n\t\tvec3 tangent = normalize( vTangent );\n\t\tvec3 bitangent = normalize( vBitangent );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\ttangent = tangent * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t\tbitangent = bitangent * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t#endif\n\t#endif\n#endif";
  var normal_fragment_maps = "#ifdef USE_NORMALMAP\n\t#ifdef OBJECTSPACE_NORMALMAP\n\t\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\t#ifdef FLIP_SIDED\n\t\t\tnormal = - normal;\n\t\t#endif\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t#endif\n\t\tnormal = normalize( normalMatrix * normal );\n\t#else\n\t\t#ifdef USE_TANGENT\n\t\t\tmat3 vTBN = mat3( tangent, bitangent, normal );\n\t\t\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\t\tmapN.xy = normalScale * mapN.xy;\n\t\t\tnormal = normalize( vTBN * mapN );\n\t\t#else\n\t\t\tnormal = perturbNormal2Arb( -vViewPosition, normal );\n\t\t#endif\n\t#endif\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif";
  var normalmap_pars_fragment = "#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n\t#ifdef OBJECTSPACE_NORMALMAP\n\t\tuniform mat3 normalMatrix;\n\t#else\n\t\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\n\t\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\t\tvec2 st0 = dFdx( vUv.st );\n\t\t\tvec2 st1 = dFdy( vUv.st );\n\t\t\tfloat scale = sign( st1.t * st0.s - st0.t * st1.s );\n\t\t\tvec3 S = normalize( ( q0 * st1.t - q1 * st0.t ) * scale );\n\t\t\tvec3 T = normalize( ( - q0 * st1.s + q1 * st0.s ) * scale );\n\t\t\tvec3 N = normalize( surf_norm );\n\t\t\tmat3 tsn = mat3( S, T, N );\n\t\t\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\t\tmapN.xy *= normalScale;\n\t\t\tmapN.xy *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t\treturn normalize( tsn * mapN );\n\t\t}\n\t#endif\n#endif";
  var packing = "vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256.,  256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}";
  var premultiplied_alpha_fragment = "#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif";
  var project_vertex = "vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\ngl_Position = projectionMatrix * mvPosition;";
  var dithering_fragment = "#if defined( DITHERING )\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif";
  var dithering_pars_fragment = "#if defined( DITHERING )\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif";
  var roughnessmap_fragment = "float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif";
  var roughnessmap_pars_fragment = "#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif";
  var shadowmap_pars_fragment = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\n\t\tconst vec2 offset = vec2( 0.0, 1.0 );\n\t\tvec2 texelSize = vec2( 1.0 ) / size;\n\t\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\n\t\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\n\t\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\n\t\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\n\t\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\n\t\tvec2 f = fract( uv * size + 0.5 );\n\t\tfloat a = mix( lb, lt, f.y );\n\t\tfloat b = mix( rb, rt, f.y );\n\t\tfloat c = mix( a, b, f.x );\n\t\treturn c;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tshadow = (\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif";
  var shadowmap_pars_vertex = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n#endif";
  var shadowmap_vertex = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n#endif";
  var shadowmask_pars_fragment = "float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tDirectionalLight directionalLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tSpotLight spotLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tPointLight pointLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#endif\n\t#endif\n\treturn shadow;\n}";
  var skinbase_vertex = "#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif";
  var skinning_pars_vertex = "#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif";
  var skinning_vertex = "#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif";
  var skinnormal_vertex = "#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix  = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif";
  var specularmap_fragment = "float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif";
  var specularmap_pars_fragment = "#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif";
  var tonemapping_fragment = "#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif";
  var tonemapping_pars_fragment = "#ifndef saturate\n\t#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\nvec3 Uncharted2ToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( ( color * ( 2.51 * color + 0.03 ) ) / ( color * ( 2.43 * color + 0.59 ) + 0.14 ) );\n}";
  var uv_pars_fragment = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n#endif";
  var uv_pars_vertex = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n\tuniform mat3 uvTransform;\n#endif";
  var uv_vertex = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n#endif";
  var uv2_pars_fragment = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif";
  var uv2_pars_vertex = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n#endif";
  var uv2_vertex = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = uv2;\n#endif";
  var worldpos_vertex = "#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n#endif";
  var background_frag = "uniform sampler2D t2D;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n}";
  var background_vert = "varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}";
  var cube_frag = "uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldDirection;\nvoid main() {\n\tvec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\tgl_FragColor.a *= opacity;\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n}";
  var cube_vert = "varying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\tgl_Position.z = gl_Position.w;\n}";
  var depth_frag = "#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <logdepthbuf_fragment>\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - gl_FragCoord.z ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\n\t#endif\n}";
  var depth_vert = "#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n}";
  var distanceRGBA_frag = "#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main () {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}";
  var distanceRGBA_vert = "#define DISTANCE\nvarying vec3 vWorldPosition;\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\tvWorldPosition = worldPosition.xyz;\n}";
  var equirect_frag = "uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV;\n\tsampleUV.y = asin( clamp( direction.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tvec4 texColor = texture2D( tEquirect, sampleUV );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n}";
  var equirect_vert = "varying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}";
  var linedashed_frag = "uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <color_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}";
  var linedashed_vert = "uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}";
  var meshbasic_frag = "uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include <aomap_fragment>\n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}";
  var meshbasic_vert = "#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_ENVMAP\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <envmap_vertex>\n\t#include <fog_vertex>\n}";
  var meshlambert_frag = "uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <emissivemap_fragment>\n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.indirectDiffuse += ( gl_FrontFacing ) ? vIndirectFront : vIndirectBack;\n\t#else\n\t\treflectedLight.indirectDiffuse += vIndirectFront;\n\t#endif\n\t#include <lightmap_fragment>\n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}";
  var meshlambert_vert = "#define LAMBERT\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <lights_lambert_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}";
  var meshmatcap_frag = "#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\n\t#ifdef USE_MATCAP\n\t\tvec4 matcapColor = texture2D( matcap, uv );\n\t\tmatcapColor = matcapTexelToLinear( matcapColor );\n\t#else\n\t\tvec4 matcapColor = vec4( 1.0 );\n\t#endif\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}";
  var meshmatcap_vert = "#define MATCAP\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#ifndef FLAT_SHADED\n\t\tvNormal = normalize( transformedNormal );\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n\tvViewPosition = - mvPosition.xyz;\n}";
  var meshphong_frag = "#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <gradientmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <lights_phong_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_phong_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}";
  var meshphong_vert = "#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}";
  var meshphysical_frag = "#define PHYSICAL\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifndef STANDARD\n\tuniform float clearCoat;\n\tuniform float clearCoatRoughness;\n#endif\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <bsdfs>\n#include <cube_uv_reflection_fragment>\n#include <envmap_pars_fragment>\n#include <envmap_physical_pars_fragment>\n#include <fog_pars_fragment>\n#include <lights_pars_begin>\n#include <lights_physical_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <roughnessmap_pars_fragment>\n#include <metalnessmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <roughnessmap_fragment>\n\t#include <metalnessmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_physical_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}";
  var meshphysical_vert = "#define PHYSICAL\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}";
  var normal_frag = "#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || ( defined( USE_NORMALMAP ) && ! defined( OBJECTSPACE_NORMALMAP ) )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include <packing>\n#include <uv_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\nvoid main() {\n\t#include <logdepthbuf_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}";
  var normal_vert = "#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || ( defined( USE_NORMALMAP ) && ! defined( OBJECTSPACE_NORMALMAP ) )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || ( defined( USE_NORMALMAP ) && ! defined( OBJECTSPACE_NORMALMAP ) )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}";
  var points_frag = "uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <color_pars_fragment>\n#include <map_particle_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_particle_fragment>\n\t#include <color_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}";
  var points_vert = "uniform float size;\nuniform float scale;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <fog_vertex>\n}";
  var shadow_frag = "uniform vec3 color;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include <fog_fragment>\n}";
  var shadow_vert = "#include <fog_pars_vertex>\n#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}";
  var sprite_frag = "uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}";
  var sprite_vert = "uniform float rotation;\nuniform vec2 center;\n#include <common>\n#include <uv_pars_vertex>\n#include <fog_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\tvec2 scale;\n\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\n\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}";
  var ShaderChunk = {
    alphamap_fragment: alphamap_fragment,
    alphamap_pars_fragment: alphamap_pars_fragment,
    alphatest_fragment: alphatest_fragment,
    aomap_fragment: aomap_fragment,
    aomap_pars_fragment: aomap_pars_fragment,
    begin_vertex: begin_vertex,
    beginnormal_vertex: beginnormal_vertex,
    bsdfs: bsdfs,
    bumpmap_pars_fragment: bumpmap_pars_fragment,
    clipping_planes_fragment: clipping_planes_fragment,
    clipping_planes_pars_fragment: clipping_planes_pars_fragment,
    clipping_planes_pars_vertex: clipping_planes_pars_vertex,
    clipping_planes_vertex: clipping_planes_vertex,
    color_fragment: color_fragment,
    color_pars_fragment: color_pars_fragment,
    color_pars_vertex: color_pars_vertex,
    color_vertex: color_vertex,
    common: common,
    cube_uv_reflection_fragment: cube_uv_reflection_fragment,
    defaultnormal_vertex: defaultnormal_vertex,
    displacementmap_pars_vertex: displacementmap_pars_vertex,
    displacementmap_vertex: displacementmap_vertex,
    emissivemap_fragment: emissivemap_fragment,
    emissivemap_pars_fragment: emissivemap_pars_fragment,
    encodings_fragment: encodings_fragment,
    encodings_pars_fragment: encodings_pars_fragment,
    envmap_fragment: envmap_fragment,
    envmap_pars_fragment: envmap_pars_fragment,
    envmap_pars_vertex: envmap_pars_vertex,
    envmap_physical_pars_fragment: envmap_physical_pars_fragment,
    envmap_vertex: envmap_vertex,
    fog_vertex: fog_vertex,
    fog_pars_vertex: fog_pars_vertex,
    fog_fragment: fog_fragment,
    fog_pars_fragment: fog_pars_fragment,
    gradientmap_pars_fragment: gradientmap_pars_fragment,
    lightmap_fragment: lightmap_fragment,
    lightmap_pars_fragment: lightmap_pars_fragment,
    lights_lambert_vertex: lights_lambert_vertex,
    lights_pars_begin: lights_pars_begin,
    lights_phong_fragment: lights_phong_fragment,
    lights_phong_pars_fragment: lights_phong_pars_fragment,
    lights_physical_fragment: lights_physical_fragment,
    lights_physical_pars_fragment: lights_physical_pars_fragment,
    lights_fragment_begin: lights_fragment_begin,
    lights_fragment_maps: lights_fragment_maps,
    lights_fragment_end: lights_fragment_end,
    logdepthbuf_fragment: logdepthbuf_fragment,
    logdepthbuf_pars_fragment: logdepthbuf_pars_fragment,
    logdepthbuf_pars_vertex: logdepthbuf_pars_vertex,
    logdepthbuf_vertex: logdepthbuf_vertex,
    map_fragment: map_fragment,
    map_pars_fragment: map_pars_fragment,
    map_particle_fragment: map_particle_fragment,
    map_particle_pars_fragment: map_particle_pars_fragment,
    metalnessmap_fragment: metalnessmap_fragment,
    metalnessmap_pars_fragment: metalnessmap_pars_fragment,
    morphnormal_vertex: morphnormal_vertex,
    morphtarget_pars_vertex: morphtarget_pars_vertex,
    morphtarget_vertex: morphtarget_vertex,
    normal_fragment_begin: normal_fragment_begin,
    normal_fragment_maps: normal_fragment_maps,
    normalmap_pars_fragment: normalmap_pars_fragment,
    packing: packing,
    premultiplied_alpha_fragment: premultiplied_alpha_fragment,
    project_vertex: project_vertex,
    dithering_fragment: dithering_fragment,
    dithering_pars_fragment: dithering_pars_fragment,
    roughnessmap_fragment: roughnessmap_fragment,
    roughnessmap_pars_fragment: roughnessmap_pars_fragment,
    shadowmap_pars_fragment: shadowmap_pars_fragment,
    shadowmap_pars_vertex: shadowmap_pars_vertex,
    shadowmap_vertex: shadowmap_vertex,
    shadowmask_pars_fragment: shadowmask_pars_fragment,
    skinbase_vertex: skinbase_vertex,
    skinning_pars_vertex: skinning_pars_vertex,
    skinning_vertex: skinning_vertex,
    skinnormal_vertex: skinnormal_vertex,
    specularmap_fragment: specularmap_fragment,
    specularmap_pars_fragment: specularmap_pars_fragment,
    tonemapping_fragment: tonemapping_fragment,
    tonemapping_pars_fragment: tonemapping_pars_fragment,
    uv_pars_fragment: uv_pars_fragment,
    uv_pars_vertex: uv_pars_vertex,
    uv_vertex: uv_vertex,
    uv2_pars_fragment: uv2_pars_fragment,
    uv2_pars_vertex: uv2_pars_vertex,
    uv2_vertex: uv2_vertex,
    worldpos_vertex: worldpos_vertex,
    background_frag: background_frag,
    background_vert: background_vert,
    cube_frag: cube_frag,
    cube_vert: cube_vert,
    depth_frag: depth_frag,
    depth_vert: depth_vert,
    distanceRGBA_frag: distanceRGBA_frag,
    distanceRGBA_vert: distanceRGBA_vert,
    equirect_frag: equirect_frag,
    equirect_vert: equirect_vert,
    linedashed_frag: linedashed_frag,
    linedashed_vert: linedashed_vert,
    meshbasic_frag: meshbasic_frag,
    meshbasic_vert: meshbasic_vert,
    meshlambert_frag: meshlambert_frag,
    meshlambert_vert: meshlambert_vert,
    meshmatcap_frag: meshmatcap_frag,
    meshmatcap_vert: meshmatcap_vert,
    meshphong_frag: meshphong_frag,
    meshphong_vert: meshphong_vert,
    meshphysical_frag: meshphysical_frag,
    meshphysical_vert: meshphysical_vert,
    normal_frag: normal_frag,
    normal_vert: normal_vert,
    points_frag: points_frag,
    points_vert: points_vert,
    shadow_frag: shadow_frag,
    shadow_vert: shadow_vert,
    sprite_frag: sprite_frag,
    sprite_vert: sprite_vert
  };
  function cloneUniforms(src) {
    var dst = {};
    for (var u in src) {
      dst[u] = {};
      for (var p in src[u]) {
        var property = src[u][p];
        if (property && (property.isColor || property.isMatrix3 || property.isMatrix4 || property.isVector2 || property.isVector3 || property.isVector4 || property.isTexture)) {
          dst[u][p] = property.clone();
        } else if (Array.isArray(property)) {
          dst[u][p] = property.slice();
        } else {
          dst[u][p] = property;
        }
      }
    }
    return dst;
  }
  function mergeUniforms(uniforms) {
    var merged = {};
    for (var u = 0; u < uniforms.length; u++) {
      var tmp = cloneUniforms(uniforms[u]);
      for (var p in tmp) {
        merged[p] = tmp[p];
      }
    }
    return merged;
  }
  var UniformsUtils = {
    clone: cloneUniforms,
    merge: mergeUniforms
  };
  var ColorKeywords = {
    'aliceblue': 0xF0F8FF,
    'antiquewhite': 0xFAEBD7,
    'aqua': 0x00FFFF,
    'aquamarine': 0x7FFFD4,
    'azure': 0xF0FFFF,
    'beige': 0xF5F5DC,
    'bisque': 0xFFE4C4,
    'black': 0x000000,
    'blanchedalmond': 0xFFEBCD,
    'blue': 0x0000FF,
    'blueviolet': 0x8A2BE2,
    'brown': 0xA52A2A,
    'burlywood': 0xDEB887,
    'cadetblue': 0x5F9EA0,
    'chartreuse': 0x7FFF00,
    'chocolate': 0xD2691E,
    'coral': 0xFF7F50,
    'cornflowerblue': 0x6495ED,
    'cornsilk': 0xFFF8DC,
    'crimson': 0xDC143C,
    'cyan': 0x00FFFF,
    'darkblue': 0x00008B,
    'darkcyan': 0x008B8B,
    'darkgoldenrod': 0xB8860B,
    'darkgray': 0xA9A9A9,
    'darkgreen': 0x006400,
    'darkgrey': 0xA9A9A9,
    'darkkhaki': 0xBDB76B,
    'darkmagenta': 0x8B008B,
    'darkolivegreen': 0x556B2F,
    'darkorange': 0xFF8C00,
    'darkorchid': 0x9932CC,
    'darkred': 0x8B0000,
    'darksalmon': 0xE9967A,
    'darkseagreen': 0x8FBC8F,
    'darkslateblue': 0x483D8B,
    'darkslategray': 0x2F4F4F,
    'darkslategrey': 0x2F4F4F,
    'darkturquoise': 0x00CED1,
    'darkviolet': 0x9400D3,
    'deeppink': 0xFF1493,
    'deepskyblue': 0x00BFFF,
    'dimgray': 0x696969,
    'dimgrey': 0x696969,
    'dodgerblue': 0x1E90FF,
    'firebrick': 0xB22222,
    'floralwhite': 0xFFFAF0,
    'forestgreen': 0x228B22,
    'fuchsia': 0xFF00FF,
    'gainsboro': 0xDCDCDC,
    'ghostwhite': 0xF8F8FF,
    'gold': 0xFFD700,
    'goldenrod': 0xDAA520,
    'gray': 0x808080,
    'green': 0x008000,
    'greenyellow': 0xADFF2F,
    'grey': 0x808080,
    'honeydew': 0xF0FFF0,
    'hotpink': 0xFF69B4,
    'indianred': 0xCD5C5C,
    'indigo': 0x4B0082,
    'ivory': 0xFFFFF0,
    'khaki': 0xF0E68C,
    'lavender': 0xE6E6FA,
    'lavenderblush': 0xFFF0F5,
    'lawngreen': 0x7CFC00,
    'lemonchiffon': 0xFFFACD,
    'lightblue': 0xADD8E6,
    'lightcoral': 0xF08080,
    'lightcyan': 0xE0FFFF,
    'lightgoldenrodyellow': 0xFAFAD2,
    'lightgray': 0xD3D3D3,
    'lightgreen': 0x90EE90,
    'lightgrey': 0xD3D3D3,
    'lightpink': 0xFFB6C1,
    'lightsalmon': 0xFFA07A,
    'lightseagreen': 0x20B2AA,
    'lightskyblue': 0x87CEFA,
    'lightslategray': 0x778899,
    'lightslategrey': 0x778899,
    'lightsteelblue': 0xB0C4DE,
    'lightyellow': 0xFFFFE0,
    'lime': 0x00FF00,
    'limegreen': 0x32CD32,
    'linen': 0xFAF0E6,
    'magenta': 0xFF00FF,
    'maroon': 0x800000,
    'mediumaquamarine': 0x66CDAA,
    'mediumblue': 0x0000CD,
    'mediumorchid': 0xBA55D3,
    'mediumpurple': 0x9370DB,
    'mediumseagreen': 0x3CB371,
    'mediumslateblue': 0x7B68EE,
    'mediumspringgreen': 0x00FA9A,
    'mediumturquoise': 0x48D1CC,
    'mediumvioletred': 0xC71585,
    'midnightblue': 0x191970,
    'mintcream': 0xF5FFFA,
    'mistyrose': 0xFFE4E1,
    'moccasin': 0xFFE4B5,
    'navajowhite': 0xFFDEAD,
    'navy': 0x000080,
    'oldlace': 0xFDF5E6,
    'olive': 0x808000,
    'olivedrab': 0x6B8E23,
    'orange': 0xFFA500,
    'orangered': 0xFF4500,
    'orchid': 0xDA70D6,
    'palegoldenrod': 0xEEE8AA,
    'palegreen': 0x98FB98,
    'paleturquoise': 0xAFEEEE,
    'palevioletred': 0xDB7093,
    'papayawhip': 0xFFEFD5,
    'peachpuff': 0xFFDAB9,
    'peru': 0xCD853F,
    'pink': 0xFFC0CB,
    'plum': 0xDDA0DD,
    'powderblue': 0xB0E0E6,
    'purple': 0x800080,
    'rebeccapurple': 0x663399,
    'red': 0xFF0000,
    'rosybrown': 0xBC8F8F,
    'royalblue': 0x4169E1,
    'saddlebrown': 0x8B4513,
    'salmon': 0xFA8072,
    'sandybrown': 0xF4A460,
    'seagreen': 0x2E8B57,
    'seashell': 0xFFF5EE,
    'sienna': 0xA0522D,
    'silver': 0xC0C0C0,
    'skyblue': 0x87CEEB,
    'slateblue': 0x6A5ACD,
    'slategray': 0x708090,
    'slategrey': 0x708090,
    'snow': 0xFFFAFA,
    'springgreen': 0x00FF7F,
    'steelblue': 0x4682B4,
    'tan': 0xD2B48C,
    'teal': 0x008080,
    'thistle': 0xD8BFD8,
    'tomato': 0xFF6347,
    'turquoise': 0x40E0D0,
    'violet': 0xEE82EE,
    'wheat': 0xF5DEB3,
    'white': 0xFFFFFF,
    'whitesmoke': 0xF5F5F5,
    'yellow': 0xFFFF00,
    'yellowgreen': 0x9ACD32
  };
  function Color(r, g, b) {
    if (g === undefined && b === undefined) {
      return this.set(r);
    }
    return this.setRGB(r, g, b);
  }
  Object.assign(Color.prototype, {
    isColor: true,
    r: 1,
    g: 1,
    b: 1,
    set: function(value) {
      if (value && value.isColor) {
        this.copy(value);
      } else if (typeof value === 'number') {
        this.setHex(value);
      } else if (typeof value === 'string') {
        this.setStyle(value);
      }
      return this;
    },
    setScalar: function(scalar) {
      this.r = scalar;
      this.g = scalar;
      this.b = scalar;
      return this;
    },
    setHex: function(hex) {
      hex = Math.floor(hex);
      this.r = (hex >> 16 & 255) / 255;
      this.g = (hex >> 8 & 255) / 255;
      this.b = (hex & 255) / 255;
      return this;
    },
    setRGB: function(r, g, b) {
      this.r = r;
      this.g = g;
      this.b = b;
      return this;
    },
    setHSL: function() {
      function hue2rgb(p, q, t) {
        if (t < 0)
          t += 1;
        if (t > 1)
          t -= 1;
        if (t < 1 / 6)
          return p + (q - p) * 6 * t;
        if (t < 1 / 2)
          return q;
        if (t < 2 / 3)
          return p + (q - p) * 6 * (2 / 3 - t);
        return p;
      }
      return function setHSL(h, s, l) {
        h = _Math.euclideanModulo(h, 1);
        s = _Math.clamp(s, 0, 1);
        l = _Math.clamp(l, 0, 1);
        if (s === 0) {
          this.r = this.g = this.b = l;
        } else {
          var p = l <= 0.5 ? l * (1 + s) : l + s - (l * s);
          var q = (2 * l) - p;
          this.r = hue2rgb(q, p, h + 1 / 3);
          this.g = hue2rgb(q, p, h);
          this.b = hue2rgb(q, p, h - 1 / 3);
        }
        return this;
      };
    }(),
    setStyle: function(style) {
      function handleAlpha(string) {
        if (string === undefined)
          return;
        if (parseFloat(string) < 1) {
          console.warn('THREE.Color: Alpha component of ' + style + ' will be ignored.');
        }
      }
      var m;
      if (m = /^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec(style)) {
        var color;
        var name = m[1];
        var components = m[2];
        switch (name) {
          case 'rgb':
          case 'rgba':
            if (color = /^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(components)) {
              this.r = Math.min(255, parseInt(color[1], 10)) / 255;
              this.g = Math.min(255, parseInt(color[2], 10)) / 255;
              this.b = Math.min(255, parseInt(color[3], 10)) / 255;
              handleAlpha(color[5]);
              return this;
            }
            if (color = /^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(components)) {
              this.r = Math.min(100, parseInt(color[1], 10)) / 100;
              this.g = Math.min(100, parseInt(color[2], 10)) / 100;
              this.b = Math.min(100, parseInt(color[3], 10)) / 100;
              handleAlpha(color[5]);
              return this;
            }
            break;
          case 'hsl':
          case 'hsla':
            if (color = /^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(components)) {
              var h = parseFloat(color[1]) / 360;
              var s = parseInt(color[2], 10) / 100;
              var l = parseInt(color[3], 10) / 100;
              handleAlpha(color[5]);
              return this.setHSL(h, s, l);
            }
            break;
        }
      } else if (m = /^\#([A-Fa-f0-9]+)$/.exec(style)) {
        var hex = m[1];
        var size = hex.length;
        if (size === 3) {
          this.r = parseInt(hex.charAt(0) + hex.charAt(0), 16) / 255;
          this.g = parseInt(hex.charAt(1) + hex.charAt(1), 16) / 255;
          this.b = parseInt(hex.charAt(2) + hex.charAt(2), 16) / 255;
          return this;
        } else if (size === 6) {
          this.r = parseInt(hex.charAt(0) + hex.charAt(1), 16) / 255;
          this.g = parseInt(hex.charAt(2) + hex.charAt(3), 16) / 255;
          this.b = parseInt(hex.charAt(4) + hex.charAt(5), 16) / 255;
          return this;
        }
      }
      if (style && style.length > 0) {
        var hex = ColorKeywords[style];
        if (hex !== undefined) {
          this.setHex(hex);
        } else {
          console.warn('THREE.Color: Unknown color ' + style);
        }
      }
      return this;
    },
    clone: function() {
      return new this.constructor(this.r, this.g, this.b);
    },
    copy: function(color) {
      this.r = color.r;
      this.g = color.g;
      this.b = color.b;
      return this;
    },
    copyGammaToLinear: function(color, gammaFactor) {
      if (gammaFactor === undefined)
        gammaFactor = 2.0;
      this.r = Math.pow(color.r, gammaFactor);
      this.g = Math.pow(color.g, gammaFactor);
      this.b = Math.pow(color.b, gammaFactor);
      return this;
    },
    copyLinearToGamma: function(color, gammaFactor) {
      if (gammaFactor === undefined)
        gammaFactor = 2.0;
      var safeInverse = (gammaFactor > 0) ? (1.0 / gammaFactor) : 1.0;
      this.r = Math.pow(color.r, safeInverse);
      this.g = Math.pow(color.g, safeInverse);
      this.b = Math.pow(color.b, safeInverse);
      return this;
    },
    convertGammaToLinear: function(gammaFactor) {
      this.copyGammaToLinear(this, gammaFactor);
      return this;
    },
    convertLinearToGamma: function(gammaFactor) {
      this.copyLinearToGamma(this, gammaFactor);
      return this;
    },
    copySRGBToLinear: function() {
      function SRGBToLinear(c) {
        return (c < 0.04045) ? c * 0.0773993808 : Math.pow(c * 0.9478672986 + 0.0521327014, 2.4);
      }
      return function copySRGBToLinear(color) {
        this.r = SRGBToLinear(color.r);
        this.g = SRGBToLinear(color.g);
        this.b = SRGBToLinear(color.b);
        return this;
      };
    }(),
    copyLinearToSRGB: function() {
      function LinearToSRGB(c) {
        return (c < 0.0031308) ? c * 12.92 : 1.055 * (Math.pow(c, 0.41666)) - 0.055;
      }
      return function copyLinearToSRGB(color) {
        this.r = LinearToSRGB(color.r);
        this.g = LinearToSRGB(color.g);
        this.b = LinearToSRGB(color.b);
        return this;
      };
    }(),
    convertSRGBToLinear: function() {
      this.copySRGBToLinear(this);
      return this;
    },
    convertLinearToSRGB: function() {
      this.copyLinearToSRGB(this);
      return this;
    },
    getHex: function() {
      return (this.r * 255) << 16 ^ (this.g * 255) << 8 ^ (this.b * 255) << 0;
    },
    getHexString: function() {
      return ('000000' + this.getHex().toString(16)).slice(-6);
    },
    getHSL: function(target) {
      if (target === undefined) {
        console.warn('THREE.Color: .getHSL() target is now required');
        target = {
          h: 0,
          s: 0,
          l: 0
        };
      }
      var r = this.r,
          g = this.g,
          b = this.b;
      var max = Math.max(r, g, b);
      var min = Math.min(r, g, b);
      var hue,
          saturation;
      var lightness = (min + max) / 2.0;
      if (min === max) {
        hue = 0;
        saturation = 0;
      } else {
        var delta = max - min;
        saturation = lightness <= 0.5 ? delta / (max + min) : delta / (2 - max - min);
        switch (max) {
          case r:
            hue = (g - b) / delta + (g < b ? 6 : 0);
            break;
          case g:
            hue = (b - r) / delta + 2;
            break;
          case b:
            hue = (r - g) / delta + 4;
            break;
        }
        hue /= 6;
      }
      target.h = hue;
      target.s = saturation;
      target.l = lightness;
      return target;
    },
    getStyle: function() {
      return 'rgb(' + ((this.r * 255) | 0) + ',' + ((this.g * 255) | 0) + ',' + ((this.b * 255) | 0) + ')';
    },
    offsetHSL: function() {
      var hsl = {};
      return function(h, s, l) {
        this.getHSL(hsl);
        hsl.h += h;
        hsl.s += s;
        hsl.l += l;
        this.setHSL(hsl.h, hsl.s, hsl.l);
        return this;
      };
    }(),
    add: function(color) {
      this.r += color.r;
      this.g += color.g;
      this.b += color.b;
      return this;
    },
    addColors: function(color1, color2) {
      this.r = color1.r + color2.r;
      this.g = color1.g + color2.g;
      this.b = color1.b + color2.b;
      return this;
    },
    addScalar: function(s) {
      this.r += s;
      this.g += s;
      this.b += s;
      return this;
    },
    sub: function(color) {
      this.r = Math.max(0, this.r - color.r);
      this.g = Math.max(0, this.g - color.g);
      this.b = Math.max(0, this.b - color.b);
      return this;
    },
    multiply: function(color) {
      this.r *= color.r;
      this.g *= color.g;
      this.b *= color.b;
      return this;
    },
    multiplyScalar: function(s) {
      this.r *= s;
      this.g *= s;
      this.b *= s;
      return this;
    },
    lerp: function(color, alpha) {
      this.r += (color.r - this.r) * alpha;
      this.g += (color.g - this.g) * alpha;
      this.b += (color.b - this.b) * alpha;
      return this;
    },
    lerpHSL: function() {
      var hslA = {
        h: 0,
        s: 0,
        l: 0
      };
      var hslB = {
        h: 0,
        s: 0,
        l: 0
      };
      return function lerpHSL(color, alpha) {
        this.getHSL(hslA);
        color.getHSL(hslB);
        var h = _Math.lerp(hslA.h, hslB.h, alpha);
        var s = _Math.lerp(hslA.s, hslB.s, alpha);
        var l = _Math.lerp(hslA.l, hslB.l, alpha);
        this.setHSL(h, s, l);
        return this;
      };
    }(),
    equals: function(c) {
      return (c.r === this.r) && (c.g === this.g) && (c.b === this.b);
    },
    fromArray: function(array, offset) {
      if (offset === undefined)
        offset = 0;
      this.r = array[offset];
      this.g = array[offset + 1];
      this.b = array[offset + 2];
      return this;
    },
    toArray: function(array, offset) {
      if (array === undefined)
        array = [];
      if (offset === undefined)
        offset = 0;
      array[offset] = this.r;
      array[offset + 1] = this.g;
      array[offset + 2] = this.b;
      return array;
    },
    toJSON: function() {
      return this.getHex();
    }
  });
  var UniformsLib = {
    common: {
      diffuse: {value: new Color(0xeeeeee)},
      opacity: {value: 1.0},
      map: {value: null},
      uvTransform: {value: new Matrix3()},
      alphaMap: {value: null}
    },
    specularmap: {specularMap: {value: null}},
    envmap: {
      envMap: {value: null},
      flipEnvMap: {value: -1},
      reflectivity: {value: 1.0},
      refractionRatio: {value: 0.98},
      maxMipLevel: {value: 0}
    },
    aomap: {
      aoMap: {value: null},
      aoMapIntensity: {value: 1}
    },
    lightmap: {
      lightMap: {value: null},
      lightMapIntensity: {value: 1}
    },
    emissivemap: {emissiveMap: {value: null}},
    bumpmap: {
      bumpMap: {value: null},
      bumpScale: {value: 1}
    },
    normalmap: {
      normalMap: {value: null},
      normalScale: {value: new Vector2(1, 1)}
    },
    displacementmap: {
      displacementMap: {value: null},
      displacementScale: {value: 1},
      displacementBias: {value: 0}
    },
    roughnessmap: {roughnessMap: {value: null}},
    metalnessmap: {metalnessMap: {value: null}},
    gradientmap: {gradientMap: {value: null}},
    fog: {
      fogDensity: {value: 0.00025},
      fogNear: {value: 1},
      fogFar: {value: 2000},
      fogColor: {value: new Color(0xffffff)}
    },
    lights: {
      ambientLightColor: {value: []},
      directionalLights: {
        value: [],
        properties: {
          direction: {},
          color: {},
          shadow: {},
          shadowBias: {},
          shadowRadius: {},
          shadowMapSize: {}
        }
      },
      directionalShadowMap: {value: []},
      directionalShadowMatrix: {value: []},
      spotLights: {
        value: [],
        properties: {
          color: {},
          position: {},
          direction: {},
          distance: {},
          coneCos: {},
          penumbraCos: {},
          decay: {},
          shadow: {},
          shadowBias: {},
          shadowRadius: {},
          shadowMapSize: {}
        }
      },
      spotShadowMap: {value: []},
      spotShadowMatrix: {value: []},
      pointLights: {
        value: [],
        properties: {
          color: {},
          position: {},
          decay: {},
          distance: {},
          shadow: {},
          shadowBias: {},
          shadowRadius: {},
          shadowMapSize: {},
          shadowCameraNear: {},
          shadowCameraFar: {}
        }
      },
      pointShadowMap: {value: []},
      pointShadowMatrix: {value: []},
      hemisphereLights: {
        value: [],
        properties: {
          direction: {},
          skyColor: {},
          groundColor: {}
        }
      },
      rectAreaLights: {
        value: [],
        properties: {
          color: {},
          position: {},
          width: {},
          height: {}
        }
      }
    },
    points: {
      diffuse: {value: new Color(0xeeeeee)},
      opacity: {value: 1.0},
      size: {value: 1.0},
      scale: {value: 1.0},
      map: {value: null},
      uvTransform: {value: new Matrix3()}
    },
    sprite: {
      diffuse: {value: new Color(0xeeeeee)},
      opacity: {value: 1.0},
      center: {value: new Vector2(0.5, 0.5)},
      rotation: {value: 0.0},
      map: {value: null},
      uvTransform: {value: new Matrix3()}
    }
  };
  var ShaderLib = {
    basic: {
      uniforms: mergeUniforms([UniformsLib.common, UniformsLib.specularmap, UniformsLib.envmap, UniformsLib.aomap, UniformsLib.lightmap, UniformsLib.fog]),
      vertexShader: ShaderChunk.meshbasic_vert,
      fragmentShader: ShaderChunk.meshbasic_frag
    },
    lambert: {
      uniforms: mergeUniforms([UniformsLib.common, UniformsLib.specularmap, UniformsLib.envmap, UniformsLib.aomap, UniformsLib.lightmap, UniformsLib.emissivemap, UniformsLib.fog, UniformsLib.lights, {emissive: {value: new Color(0x000000)}}]),
      vertexShader: ShaderChunk.meshlambert_vert,
      fragmentShader: ShaderChunk.meshlambert_frag
    },
    phong: {
      uniforms: mergeUniforms([UniformsLib.common, UniformsLib.specularmap, UniformsLib.envmap, UniformsLib.aomap, UniformsLib.lightmap, UniformsLib.emissivemap, UniformsLib.bumpmap, UniformsLib.normalmap, UniformsLib.displacementmap, UniformsLib.gradientmap, UniformsLib.fog, UniformsLib.lights, {
        emissive: {value: new Color(0x000000)},
        specular: {value: new Color(0x111111)},
        shininess: {value: 30}
      }]),
      vertexShader: ShaderChunk.meshphong_vert,
      fragmentShader: ShaderChunk.meshphong_frag
    },
    standard: {
      uniforms: mergeUniforms([UniformsLib.common, UniformsLib.envmap, UniformsLib.aomap, UniformsLib.lightmap, UniformsLib.emissivemap, UniformsLib.bumpmap, UniformsLib.normalmap, UniformsLib.displacementmap, UniformsLib.roughnessmap, UniformsLib.metalnessmap, UniformsLib.fog, UniformsLib.lights, {
        emissive: {value: new Color(0x000000)},
        roughness: {value: 0.5},
        metalness: {value: 0.5},
        envMapIntensity: {value: 1}
      }]),
      vertexShader: ShaderChunk.meshphysical_vert,
      fragmentShader: ShaderChunk.meshphysical_frag
    },
    matcap: {
      uniforms: mergeUniforms([UniformsLib.common, UniformsLib.bumpmap, UniformsLib.normalmap, UniformsLib.displacementmap, UniformsLib.fog, {matcap: {value: null}}]),
      vertexShader: ShaderChunk.meshmatcap_vert,
      fragmentShader: ShaderChunk.meshmatcap_frag
    },
    points: {
      uniforms: mergeUniforms([UniformsLib.points, UniformsLib.fog]),
      vertexShader: ShaderChunk.points_vert,
      fragmentShader: ShaderChunk.points_frag
    },
    dashed: {
      uniforms: mergeUniforms([UniformsLib.common, UniformsLib.fog, {
        scale: {value: 1},
        dashSize: {value: 1},
        totalSize: {value: 2}
      }]),
      vertexShader: ShaderChunk.linedashed_vert,
      fragmentShader: ShaderChunk.linedashed_frag
    },
    depth: {
      uniforms: mergeUniforms([UniformsLib.common, UniformsLib.displacementmap]),
      vertexShader: ShaderChunk.depth_vert,
      fragmentShader: ShaderChunk.depth_frag
    },
    normal: {
      uniforms: mergeUniforms([UniformsLib.common, UniformsLib.bumpmap, UniformsLib.normalmap, UniformsLib.displacementmap, {opacity: {value: 1.0}}]),
      vertexShader: ShaderChunk.normal_vert,
      fragmentShader: ShaderChunk.normal_frag
    },
    sprite: {
      uniforms: mergeUniforms([UniformsLib.sprite, UniformsLib.fog]),
      vertexShader: ShaderChunk.sprite_vert,
      fragmentShader: ShaderChunk.sprite_frag
    },
    background: {
      uniforms: {
        uvTransform: {value: new Matrix3()},
        t2D: {value: null}
      },
      vertexShader: ShaderChunk.background_vert,
      fragmentShader: ShaderChunk.background_frag
    },
    cube: {
      uniforms: {
        tCube: {value: null},
        tFlip: {value: -1},
        opacity: {value: 1.0}
      },
      vertexShader: ShaderChunk.cube_vert,
      fragmentShader: ShaderChunk.cube_frag
    },
    equirect: {
      uniforms: {tEquirect: {value: null}},
      vertexShader: ShaderChunk.equirect_vert,
      fragmentShader: ShaderChunk.equirect_frag
    },
    distanceRGBA: {
      uniforms: mergeUniforms([UniformsLib.common, UniformsLib.displacementmap, {
        referencePosition: {value: new Vector3()},
        nearDistance: {value: 1},
        farDistance: {value: 1000}
      }]),
      vertexShader: ShaderChunk.distanceRGBA_vert,
      fragmentShader: ShaderChunk.distanceRGBA_frag
    },
    shadow: {
      uniforms: mergeUniforms([UniformsLib.lights, UniformsLib.fog, {
        color: {value: new Color(0x00000)},
        opacity: {value: 1.0}
      }]),
      vertexShader: ShaderChunk.shadow_vert,
      fragmentShader: ShaderChunk.shadow_frag
    }
  };
  ShaderLib.physical = {
    uniforms: mergeUniforms([ShaderLib.standard.uniforms, {
      clearCoat: {value: 0},
      clearCoatRoughness: {value: 0}
    }]),
    vertexShader: ShaderChunk.meshphysical_vert,
    fragmentShader: ShaderChunk.meshphysical_frag
  };
  function WebGLAnimation() {
    var context = null;
    var isAnimating = false;
    var animationLoop = null;
    function onAnimationFrame(time, frame) {
      if (isAnimating === false)
        return;
      animationLoop(time, frame);
      context.requestAnimationFrame(onAnimationFrame);
    }
    return {
      start: function() {
        if (isAnimating === true)
          return;
        if (animationLoop === null)
          return;
        context.requestAnimationFrame(onAnimationFrame);
        isAnimating = true;
      },
      stop: function() {
        isAnimating = false;
      },
      setAnimationLoop: function(callback) {
        animationLoop = callback;
      },
      setContext: function(value) {
        context = value;
      }
    };
  }
  function WebGLAttributes(gl) {
    var buffers = new WeakMap();
    function createBuffer(attribute, bufferType) {
      var array = attribute.array;
      var usage = attribute.dynamic ? 35048 : 35044;
      var buffer = gl.createBuffer();
      gl.bindBuffer(bufferType, buffer);
      gl.bufferData(bufferType, array, usage);
      attribute.onUploadCallback();
      var type = 5126;
      if (array instanceof Float32Array) {
        type = 5126;
      } else if (array instanceof Float64Array) {
        console.warn('THREE.WebGLAttributes: Unsupported data buffer format: Float64Array.');
      } else if (array instanceof Uint16Array) {
        type = 5123;
      } else if (array instanceof Int16Array) {
        type = 5122;
      } else if (array instanceof Uint32Array) {
        type = 5125;
      } else if (array instanceof Int32Array) {
        type = 5124;
      } else if (array instanceof Int8Array) {
        type = 5120;
      } else if (array instanceof Uint8Array) {
        type = 5121;
      }
      return {
        buffer: buffer,
        type: type,
        bytesPerElement: array.BYTES_PER_ELEMENT,
        version: attribute.version
      };
    }
    function updateBuffer(buffer, attribute, bufferType) {
      var array = attribute.array;
      var updateRange = attribute.updateRange;
      gl.bindBuffer(bufferType, buffer);
      if (attribute.dynamic === false) {
        gl.bufferData(bufferType, array, 35044);
      } else if (updateRange.count === -1) {
        gl.bufferSubData(bufferType, 0, array);
      } else if (updateRange.count === 0) {
        console.error('THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually.');
      } else {
        gl.bufferSubData(bufferType, updateRange.offset * array.BYTES_PER_ELEMENT, array.subarray(updateRange.offset, updateRange.offset + updateRange.count));
        updateRange.count = -1;
      }
    }
    function get(attribute) {
      if (attribute.isInterleavedBufferAttribute)
        attribute = attribute.data;
      return buffers.get(attribute);
    }
    function remove(attribute) {
      if (attribute.isInterleavedBufferAttribute)
        attribute = attribute.data;
      var data = buffers.get(attribute);
      if (data) {
        gl.deleteBuffer(data.buffer);
        buffers.delete(attribute);
      }
    }
    function update(attribute, bufferType) {
      if (attribute.isInterleavedBufferAttribute)
        attribute = attribute.data;
      var data = buffers.get(attribute);
      if (data === undefined) {
        buffers.set(attribute, createBuffer(attribute, bufferType));
      } else if (data.version < attribute.version) {
        updateBuffer(data.buffer, attribute, bufferType);
        data.version = attribute.version;
      }
    }
    return {
      get: get,
      remove: remove,
      update: update
    };
  }
  function Face3(a, b, c, normal, color, materialIndex) {
    this.a = a;
    this.b = b;
    this.c = c;
    this.normal = (normal && normal.isVector3) ? normal : new Vector3();
    this.vertexNormals = Array.isArray(normal) ? normal : [];
    this.color = (color && color.isColor) ? color : new Color();
    this.vertexColors = Array.isArray(color) ? color : [];
    this.materialIndex = materialIndex !== undefined ? materialIndex : 0;
  }
  Object.assign(Face3.prototype, {
    clone: function() {
      return new this.constructor().copy(this);
    },
    copy: function(source) {
      this.a = source.a;
      this.b = source.b;
      this.c = source.c;
      this.normal.copy(source.normal);
      this.color.copy(source.color);
      this.materialIndex = source.materialIndex;
      for (var i = 0,
          il = source.vertexNormals.length; i < il; i++) {
        this.vertexNormals[i] = source.vertexNormals[i].clone();
      }
      for (var i = 0,
          il = source.vertexColors.length; i < il; i++) {
        this.vertexColors[i] = source.vertexColors[i].clone();
      }
      return this;
    }
  });
  function Euler(x, y, z, order) {
    this._x = x || 0;
    this._y = y || 0;
    this._z = z || 0;
    this._order = order || Euler.DefaultOrder;
  }
  Euler.RotationOrders = ['XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX'];
  Euler.DefaultOrder = 'XYZ';
  Object.defineProperties(Euler.prototype, {
    x: {
      get: function() {
        return this._x;
      },
      set: function(value) {
        this._x = value;
        this.onChangeCallback();
      }
    },
    y: {
      get: function() {
        return this._y;
      },
      set: function(value) {
        this._y = value;
        this.onChangeCallback();
      }
    },
    z: {
      get: function() {
        return this._z;
      },
      set: function(value) {
        this._z = value;
        this.onChangeCallback();
      }
    },
    order: {
      get: function() {
        return this._order;
      },
      set: function(value) {
        this._order = value;
        this.onChangeCallback();
      }
    }
  });
  Object.assign(Euler.prototype, {
    isEuler: true,
    set: function(x, y, z, order) {
      this._x = x;
      this._y = y;
      this._z = z;
      this._order = order || this._order;
      this.onChangeCallback();
      return this;
    },
    clone: function() {
      return new this.constructor(this._x, this._y, this._z, this._order);
    },
    copy: function(euler) {
      this._x = euler._x;
      this._y = euler._y;
      this._z = euler._z;
      this._order = euler._order;
      this.onChangeCallback();
      return this;
    },
    setFromRotationMatrix: function(m, order, update) {
      var clamp = _Math.clamp;
      var te = m.elements;
      var m11 = te[0],
          m12 = te[4],
          m13 = te[8];
      var m21 = te[1],
          m22 = te[5],
          m23 = te[9];
      var m31 = te[2],
          m32 = te[6],
          m33 = te[10];
      order = order || this._order;
      if (order === 'XYZ') {
        this._y = Math.asin(clamp(m13, -1, 1));
        if (Math.abs(m13) < 0.99999) {
          this._x = Math.atan2(-m23, m33);
          this._z = Math.atan2(-m12, m11);
        } else {
          this._x = Math.atan2(m32, m22);
          this._z = 0;
        }
      } else if (order === 'YXZ') {
        this._x = Math.asin(-clamp(m23, -1, 1));
        if (Math.abs(m23) < 0.99999) {
          this._y = Math.atan2(m13, m33);
          this._z = Math.atan2(m21, m22);
        } else {
          this._y = Math.atan2(-m31, m11);
          this._z = 0;
        }
      } else if (order === 'ZXY') {
        this._x = Math.asin(clamp(m32, -1, 1));
        if (Math.abs(m32) < 0.99999) {
          this._y = Math.atan2(-m31, m33);
          this._z = Math.atan2(-m12, m22);
        } else {
          this._y = 0;
          this._z = Math.atan2(m21, m11);
        }
      } else if (order === 'ZYX') {
        this._y = Math.asin(-clamp(m31, -1, 1));
        if (Math.abs(m31) < 0.99999) {
          this._x = Math.atan2(m32, m33);
          this._z = Math.atan2(m21, m11);
        } else {
          this._x = 0;
          this._z = Math.atan2(-m12, m22);
        }
      } else if (order === 'YZX') {
        this._z = Math.asin(clamp(m21, -1, 1));
        if (Math.abs(m21) < 0.99999) {
          this._x = Math.atan2(-m23, m22);
          this._y = Math.atan2(-m31, m11);
        } else {
          this._x = 0;
          this._y = Math.atan2(m13, m33);
        }
      } else if (order === 'XZY') {
        this._z = Math.asin(-clamp(m12, -1, 1));
        if (Math.abs(m12) < 0.99999) {
          this._x = Math.atan2(m32, m22);
          this._y = Math.atan2(m13, m11);
        } else {
          this._x = Math.atan2(-m23, m33);
          this._y = 0;
        }
      } else {
        console.warn('THREE.Euler: .setFromRotationMatrix() given unsupported order: ' + order);
      }
      this._order = order;
      if (update !== false)
        this.onChangeCallback();
      return this;
    },
    setFromQuaternion: function() {
      var matrix = new Matrix4();
      return function setFromQuaternion(q, order, update) {
        matrix.makeRotationFromQuaternion(q);
        return this.setFromRotationMatrix(matrix, order, update);
      };
    }(),
    setFromVector3: function(v, order) {
      return this.set(v.x, v.y, v.z, order || this._order);
    },
    reorder: function() {
      var q = new Quaternion();
      return function reorder(newOrder) {
        q.setFromEuler(this);
        return this.setFromQuaternion(q, newOrder);
      };
    }(),
    equals: function(euler) {
      return (euler._x === this._x) && (euler._y === this._y) && (euler._z === this._z) && (euler._order === this._order);
    },
    fromArray: function(array) {
      this._x = array[0];
      this._y = array[1];
      this._z = array[2];
      if (array[3] !== undefined)
        this._order = array[3];
      this.onChangeCallback();
      return this;
    },
    toArray: function(array, offset) {
      if (array === undefined)
        array = [];
      if (offset === undefined)
        offset = 0;
      array[offset] = this._x;
      array[offset + 1] = this._y;
      array[offset + 2] = this._z;
      array[offset + 3] = this._order;
      return array;
    },
    toVector3: function(optionalResult) {
      if (optionalResult) {
        return optionalResult.set(this._x, this._y, this._z);
      } else {
        return new Vector3(this._x, this._y, this._z);
      }
    },
    onChange: function(callback) {
      this.onChangeCallback = callback;
      return this;
    },
    onChangeCallback: function() {}
  });
  function Layers() {
    this.mask = 1 | 0;
  }
  Object.assign(Layers.prototype, {
    set: function(channel) {
      this.mask = 1 << channel | 0;
    },
    enable: function(channel) {
      this.mask |= 1 << channel | 0;
    },
    toggle: function(channel) {
      this.mask ^= 1 << channel | 0;
    },
    disable: function(channel) {
      this.mask &= ~(1 << channel | 0);
    },
    test: function(layers) {
      return (this.mask & layers.mask) !== 0;
    }
  });
  var object3DId = 0;
  function Object3D() {
    Object.defineProperty(this, 'id', {value: object3DId++});
    this.uuid = _Math.generateUUID();
    this.name = '';
    this.type = 'Object3D';
    this.parent = null;
    this.children = [];
    this.up = Object3D.DefaultUp.clone();
    var position = new Vector3();
    var rotation = new Euler();
    var quaternion = new Quaternion();
    var scale = new Vector3(1, 1, 1);
    function onRotationChange() {
      quaternion.setFromEuler(rotation, false);
    }
    function onQuaternionChange() {
      rotation.setFromQuaternion(quaternion, undefined, false);
    }
    rotation.onChange(onRotationChange);
    quaternion.onChange(onQuaternionChange);
    Object.defineProperties(this, {
      position: {
        configurable: true,
        enumerable: true,
        value: position
      },
      rotation: {
        configurable: true,
        enumerable: true,
        value: rotation
      },
      quaternion: {
        configurable: true,
        enumerable: true,
        value: quaternion
      },
      scale: {
        configurable: true,
        enumerable: true,
        value: scale
      },
      modelViewMatrix: {value: new Matrix4()},
      normalMatrix: {value: new Matrix3()}
    });
    this.matrix = new Matrix4();
    this.matrixWorld = new Matrix4();
    this.matrixAutoUpdate = Object3D.DefaultMatrixAutoUpdate;
    this.matrixWorldNeedsUpdate = false;
    this.layers = new Layers();
    this.visible = true;
    this.castShadow = false;
    this.receiveShadow = false;
    this.frustumCulled = true;
    this.renderOrder = 0;
    this.userData = {};
  }
  Object3D.DefaultUp = new Vector3(0, 1, 0);
  Object3D.DefaultMatrixAutoUpdate = true;
  Object3D.prototype = Object.assign(Object.create(EventDispatcher.prototype), {
    constructor: Object3D,
    isObject3D: true,
    onBeforeRender: function() {},
    onAfterRender: function() {},
    applyMatrix: function(matrix) {
      this.matrix.multiplyMatrices(matrix, this.matrix);
      this.matrix.decompose(this.position, this.quaternion, this.scale);
    },
    applyQuaternion: function(q) {
      this.quaternion.premultiply(q);
      return this;
    },
    setRotationFromAxisAngle: function(axis, angle) {
      this.quaternion.setFromAxisAngle(axis, angle);
    },
    setRotationFromEuler: function(euler) {
      this.quaternion.setFromEuler(euler, true);
    },
    setRotationFromMatrix: function(m) {
      this.quaternion.setFromRotationMatrix(m);
    },
    setRotationFromQuaternion: function(q) {
      this.quaternion.copy(q);
    },
    rotateOnAxis: function() {
      var q1 = new Quaternion();
      return function rotateOnAxis(axis, angle) {
        q1.setFromAxisAngle(axis, angle);
        this.quaternion.multiply(q1);
        return this;
      };
    }(),
    rotateOnWorldAxis: function() {
      var q1 = new Quaternion();
      return function rotateOnWorldAxis(axis, angle) {
        q1.setFromAxisAngle(axis, angle);
        this.quaternion.premultiply(q1);
        return this;
      };
    }(),
    rotateX: function() {
      var v1 = new Vector3(1, 0, 0);
      return function rotateX(angle) {
        return this.rotateOnAxis(v1, angle);
      };
    }(),
    rotateY: function() {
      var v1 = new Vector3(0, 1, 0);
      return function rotateY(angle) {
        return this.rotateOnAxis(v1, angle);
      };
    }(),
    rotateZ: function() {
      var v1 = new Vector3(0, 0, 1);
      return function rotateZ(angle) {
        return this.rotateOnAxis(v1, angle);
      };
    }(),
    translateOnAxis: function() {
      var v1 = new Vector3();
      return function translateOnAxis(axis, distance) {
        v1.copy(axis).applyQuaternion(this.quaternion);
        this.position.add(v1.multiplyScalar(distance));
        return this;
      };
    }(),
    translateX: function() {
      var v1 = new Vector3(1, 0, 0);
      return function translateX(distance) {
        return this.translateOnAxis(v1, distance);
      };
    }(),
    translateY: function() {
      var v1 = new Vector3(0, 1, 0);
      return function translateY(distance) {
        return this.translateOnAxis(v1, distance);
      };
    }(),
    translateZ: function() {
      var v1 = new Vector3(0, 0, 1);
      return function translateZ(distance) {
        return this.translateOnAxis(v1, distance);
      };
    }(),
    localToWorld: function(vector) {
      return vector.applyMatrix4(this.matrixWorld);
    },
    worldToLocal: function() {
      var m1 = new Matrix4();
      return function worldToLocal(vector) {
        return vector.applyMatrix4(m1.getInverse(this.matrixWorld));
      };
    }(),
    lookAt: function() {
      var q1 = new Quaternion();
      var m1 = new Matrix4();
      var target = new Vector3();
      var position = new Vector3();
      return function lookAt(x, y, z) {
        if (x.isVector3) {
          target.copy(x);
        } else {
          target.set(x, y, z);
        }
        var parent = this.parent;
        this.updateWorldMatrix(true, false);
        position.setFromMatrixPosition(this.matrixWorld);
        if (this.isCamera || this.isLight) {
          m1.lookAt(position, target, this.up);
        } else {
          m1.lookAt(target, position, this.up);
        }
        this.quaternion.setFromRotationMatrix(m1);
        if (parent) {
          m1.extractRotation(parent.matrixWorld);
          q1.setFromRotationMatrix(m1);
          this.quaternion.premultiply(q1.inverse());
        }
      };
    }(),
    add: function(object) {
      if (arguments.length > 1) {
        for (var i = 0; i < arguments.length; i++) {
          this.add(arguments[i]);
        }
        return this;
      }
      if (object === this) {
        console.error("THREE.Object3D.add: object can't be added as a child of itself.", object);
        return this;
      }
      if ((object && object.isObject3D)) {
        if (object.parent !== null) {
          object.parent.remove(object);
        }
        object.parent = this;
        object.dispatchEvent({type: 'added'});
        this.children.push(object);
      } else {
        console.error("THREE.Object3D.add: object not an instance of THREE.Object3D.", object);
      }
      return this;
    },
    remove: function(object) {
      if (arguments.length > 1) {
        for (var i = 0; i < arguments.length; i++) {
          this.remove(arguments[i]);
        }
        return this;
      }
      var index = this.children.indexOf(object);
      if (index !== -1) {
        object.parent = null;
        object.dispatchEvent({type: 'removed'});
        this.children.splice(index, 1);
      }
      return this;
    },
    getObjectById: function(id) {
      return this.getObjectByProperty('id', id);
    },
    getObjectByName: function(name) {
      return this.getObjectByProperty('name', name);
    },
    getObjectByProperty: function(name, value) {
      if (this[name] === value)
        return this;
      for (var i = 0,
          l = this.children.length; i < l; i++) {
        var child = this.children[i];
        var object = child.getObjectByProperty(name, value);
        if (object !== undefined) {
          return object;
        }
      }
      return undefined;
    },
    getWorldPosition: function(target) {
      if (target === undefined) {
        console.warn('THREE.Object3D: .getWorldPosition() target is now required');
        target = new Vector3();
      }
      this.updateMatrixWorld(true);
      return target.setFromMatrixPosition(this.matrixWorld);
    },
    getWorldQuaternion: function() {
      var position = new Vector3();
      var scale = new Vector3();
      return function getWorldQuaternion(target) {
        if (target === undefined) {
          console.warn('THREE.Object3D: .getWorldQuaternion() target is now required');
          target = new Quaternion();
        }
        this.updateMatrixWorld(true);
        this.matrixWorld.decompose(position, target, scale);
        return target;
      };
    }(),
    getWorldScale: function() {
      var position = new Vector3();
      var quaternion = new Quaternion();
      return function getWorldScale(target) {
        if (target === undefined) {
          console.warn('THREE.Object3D: .getWorldScale() target is now required');
          target = new Vector3();
        }
        this.updateMatrixWorld(true);
        this.matrixWorld.decompose(position, quaternion, target);
        return target;
      };
    }(),
    getWorldDirection: function(target) {
      if (target === undefined) {
        console.warn('THREE.Object3D: .getWorldDirection() target is now required');
        target = new Vector3();
      }
      this.updateMatrixWorld(true);
      var e = this.matrixWorld.elements;
      return target.set(e[8], e[9], e[10]).normalize();
    },
    raycast: function() {},
    traverse: function(callback) {
      callback(this);
      var children = this.children;
      for (var i = 0,
          l = children.length; i < l; i++) {
        children[i].traverse(callback);
      }
    },
    traverseVisible: function(callback) {
      if (this.visible === false)
        return;
      callback(this);
      var children = this.children;
      for (var i = 0,
          l = children.length; i < l; i++) {
        children[i].traverseVisible(callback);
      }
    },
    traverseAncestors: function(callback) {
      var parent = this.parent;
      if (parent !== null) {
        callback(parent);
        parent.traverseAncestors(callback);
      }
    },
    updateMatrix: function() {
      this.matrix.compose(this.position, this.quaternion, this.scale);
      this.matrixWorldNeedsUpdate = true;
    },
    updateMatrixWorld: function(force) {
      if (this.matrixAutoUpdate)
        this.updateMatrix();
      if (this.matrixWorldNeedsUpdate || force) {
        if (this.parent === null) {
          this.matrixWorld.copy(this.matrix);
        } else {
          this.matrixWorld.multiplyMatrices(this.parent.matrixWorld, this.matrix);
        }
        this.matrixWorldNeedsUpdate = false;
        force = true;
      }
      var children = this.children;
      for (var i = 0,
          l = children.length; i < l; i++) {
        children[i].updateMatrixWorld(force);
      }
    },
    updateWorldMatrix: function(updateParents, updateChildren) {
      var parent = this.parent;
      if (updateParents === true && parent !== null) {
        parent.updateWorldMatrix(true, false);
      }
      if (this.matrixAutoUpdate)
        this.updateMatrix();
      if (this.parent === null) {
        this.matrixWorld.copy(this.matrix);
      } else {
        this.matrixWorld.multiplyMatrices(this.parent.matrixWorld, this.matrix);
      }
      if (updateChildren === true) {
        var children = this.children;
        for (var i = 0,
            l = children.length; i < l; i++) {
          children[i].updateWorldMatrix(false, true);
        }
      }
    },
    toJSON: function(meta) {
      var isRootObject = (meta === undefined || typeof meta === 'string');
      var output = {};
      if (isRootObject) {
        meta = {
          geometries: {},
          materials: {},
          textures: {},
          images: {},
          shapes: {}
        };
        output.metadata = {
          version: 4.5,
          type: 'Object',
          generator: 'Object3D.toJSON'
        };
      }
      var object = {};
      object.uuid = this.uuid;
      object.type = this.type;
      if (this.name !== '')
        object.name = this.name;
      if (this.castShadow === true)
        object.castShadow = true;
      if (this.receiveShadow === true)
        object.receiveShadow = true;
      if (this.visible === false)
        object.visible = false;
      if (this.frustumCulled === false)
        object.frustumCulled = false;
      if (this.renderOrder !== 0)
        object.renderOrder = this.renderOrder;
      if (JSON.stringify(this.userData) !== '{}')
        object.userData = this.userData;
      object.layers = this.layers.mask;
      object.matrix = this.matrix.toArray();
      if (this.matrixAutoUpdate === false)
        object.matrixAutoUpdate = false;
      if (this.isMesh && this.drawMode !== TrianglesDrawMode)
        object.drawMode = this.drawMode;
      function serialize(library, element) {
        if (library[element.uuid] === undefined) {
          library[element.uuid] = element.toJSON(meta);
        }
        return element.uuid;
      }
      if (this.isMesh || this.isLine || this.isPoints) {
        object.geometry = serialize(meta.geometries, this.geometry);
        var parameters = this.geometry.parameters;
        if (parameters !== undefined && parameters.shapes !== undefined) {
          var shapes = parameters.shapes;
          if (Array.isArray(shapes)) {
            for (var i = 0,
                l = shapes.length; i < l; i++) {
              var shape = shapes[i];
              serialize(meta.shapes, shape);
            }
          } else {
            serialize(meta.shapes, shapes);
          }
        }
      }
      if (this.material !== undefined) {
        if (Array.isArray(this.material)) {
          var uuids = [];
          for (var i = 0,
              l = this.material.length; i < l; i++) {
            uuids.push(serialize(meta.materials, this.material[i]));
          }
          object.material = uuids;
        } else {
          object.material = serialize(meta.materials, this.material);
        }
      }
      if (this.children.length > 0) {
        object.children = [];
        for (var i = 0; i < this.children.length; i++) {
          object.children.push(this.children[i].toJSON(meta).object);
        }
      }
      if (isRootObject) {
        var geometries = extractFromCache(meta.geometries);
        var materials = extractFromCache(meta.materials);
        var textures = extractFromCache(meta.textures);
        var images = extractFromCache(meta.images);
        var shapes = extractFromCache(meta.shapes);
        if (geometries.length > 0)
          output.geometries = geometries;
        if (materials.length > 0)
          output.materials = materials;
        if (textures.length > 0)
          output.textures = textures;
        if (images.length > 0)
          output.images = images;
        if (shapes.length > 0)
          output.shapes = shapes;
      }
      output.object = object;
      return output;
      function extractFromCache(cache) {
        var values = [];
        for (var key in cache) {
          var data = cache[key];
          delete data.metadata;
          values.push(data);
        }
        return values;
      }
    },
    clone: function(recursive) {
      return new this.constructor().copy(this, recursive);
    },
    copy: function(source, recursive) {
      if (recursive === undefined)
        recursive = true;
      this.name = source.name;
      this.up.copy(source.up);
      this.position.copy(source.position);
      this.quaternion.copy(source.quaternion);
      this.scale.copy(source.scale);
      this.matrix.copy(source.matrix);
      this.matrixWorld.copy(source.matrixWorld);
      this.matrixAutoUpdate = source.matrixAutoUpdate;
      this.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;
      this.layers.mask = source.layers.mask;
      this.visible = source.visible;
      this.castShadow = source.castShadow;
      this.receiveShadow = source.receiveShadow;
      this.frustumCulled = source.frustumCulled;
      this.renderOrder = source.renderOrder;
      this.userData = JSON.parse(JSON.stringify(source.userData));
      if (recursive === true) {
        for (var i = 0; i < source.children.length; i++) {
          var child = source.children[i];
          this.add(child.clone());
        }
      }
      return this;
    }
  });
  var geometryId = 0;
  function Geometry() {
    Object.defineProperty(this, 'id', {value: geometryId += 2});
    this.uuid = _Math.generateUUID();
    this.name = '';
    this.type = 'Geometry';
    this.vertices = [];
    this.colors = [];
    this.faces = [];
    this.faceVertexUvs = [[]];
    this.morphTargets = [];
    this.morphNormals = [];
    this.skinWeights = [];
    this.skinIndices = [];
    this.lineDistances = [];
    this.boundingBox = null;
    this.boundingSphere = null;
    this.elementsNeedUpdate = false;
    this.verticesNeedUpdate = false;
    this.uvsNeedUpdate = false;
    this.normalsNeedUpdate = false;
    this.colorsNeedUpdate = false;
    this.lineDistancesNeedUpdate = false;
    this.groupsNeedUpdate = false;
  }
  Geometry.prototype = Object.assign(Object.create(EventDispatcher.prototype), {
    constructor: Geometry,
    isGeometry: true,
    applyMatrix: function(matrix) {
      var normalMatrix = new Matrix3().getNormalMatrix(matrix);
      for (var i = 0,
          il = this.vertices.length; i < il; i++) {
        var vertex = this.vertices[i];
        vertex.applyMatrix4(matrix);
      }
      for (var i = 0,
          il = this.faces.length; i < il; i++) {
        var face = this.faces[i];
        face.normal.applyMatrix3(normalMatrix).normalize();
        for (var j = 0,
            jl = face.vertexNormals.length; j < jl; j++) {
          face.vertexNormals[j].applyMatrix3(normalMatrix).normalize();
        }
      }
      if (this.boundingBox !== null) {
        this.computeBoundingBox();
      }
      if (this.boundingSphere !== null) {
        this.computeBoundingSphere();
      }
      this.verticesNeedUpdate = true;
      this.normalsNeedUpdate = true;
      return this;
    },
    rotateX: function() {
      var m1 = new Matrix4();
      return function rotateX(angle) {
        m1.makeRotationX(angle);
        this.applyMatrix(m1);
        return this;
      };
    }(),
    rotateY: function() {
      var m1 = new Matrix4();
      return function rotateY(angle) {
        m1.makeRotationY(angle);
        this.applyMatrix(m1);
        return this;
      };
    }(),
    rotateZ: function() {
      var m1 = new Matrix4();
      return function rotateZ(angle) {
        m1.makeRotationZ(angle);
        this.applyMatrix(m1);
        return this;
      };
    }(),
    translate: function() {
      var m1 = new Matrix4();
      return function translate(x, y, z) {
        m1.makeTranslation(x, y, z);
        this.applyMatrix(m1);
        return this;
      };
    }(),
    scale: function() {
      var m1 = new Matrix4();
      return function scale(x, y, z) {
        m1.makeScale(x, y, z);
        this.applyMatrix(m1);
        return this;
      };
    }(),
    lookAt: function() {
      var obj = new Object3D();
      return function lookAt(vector) {
        obj.lookAt(vector);
        obj.updateMatrix();
        this.applyMatrix(obj.matrix);
      };
    }(),
    fromBufferGeometry: function(geometry) {
      var scope = this;
      var indices = geometry.index !== null ? geometry.index.array : undefined;
      var attributes = geometry.attributes;
      var positions = attributes.position.array;
      var normals = attributes.normal !== undefined ? attributes.normal.array : undefined;
      var colors = attributes.color !== undefined ? attributes.color.array : undefined;
      var uvs = attributes.uv !== undefined ? attributes.uv.array : undefined;
      var uvs2 = attributes.uv2 !== undefined ? attributes.uv2.array : undefined;
      if (uvs2 !== undefined)
        this.faceVertexUvs[1] = [];
      for (var i = 0,
          j = 0; i < positions.length; i += 3, j += 2) {
        scope.vertices.push(new Vector3().fromArray(positions, i));
        if (colors !== undefined) {
          scope.colors.push(new Color().fromArray(colors, i));
        }
      }
      function addFace(a, b, c, materialIndex) {
        var vertexColors = (colors === undefined) ? [] : [scope.colors[a].clone(), scope.colors[b].clone(), scope.colors[c].clone()];
        var vertexNormals = (normals === undefined) ? [] : [new Vector3().fromArray(normals, a * 3), new Vector3().fromArray(normals, b * 3), new Vector3().fromArray(normals, c * 3)];
        var face = new Face3(a, b, c, vertexNormals, vertexColors, materialIndex);
        scope.faces.push(face);
        if (uvs !== undefined) {
          scope.faceVertexUvs[0].push([new Vector2().fromArray(uvs, a * 2), new Vector2().fromArray(uvs, b * 2), new Vector2().fromArray(uvs, c * 2)]);
        }
        if (uvs2 !== undefined) {
          scope.faceVertexUvs[1].push([new Vector2().fromArray(uvs2, a * 2), new Vector2().fromArray(uvs2, b * 2), new Vector2().fromArray(uvs2, c * 2)]);
        }
      }
      var groups = geometry.groups;
      if (groups.length > 0) {
        for (var i = 0; i < groups.length; i++) {
          var group = groups[i];
          var start = group.start;
          var count = group.count;
          for (var j = start,
              jl = start + count; j < jl; j += 3) {
            if (indices !== undefined) {
              addFace(indices[j], indices[j + 1], indices[j + 2], group.materialIndex);
            } else {
              addFace(j, j + 1, j + 2, group.materialIndex);
            }
          }
        }
      } else {
        if (indices !== undefined) {
          for (var i = 0; i < indices.length; i += 3) {
            addFace(indices[i], indices[i + 1], indices[i + 2]);
          }
        } else {
          for (var i = 0; i < positions.length / 3; i += 3) {
            addFace(i, i + 1, i + 2);
          }
        }
      }
      this.computeFaceNormals();
      if (geometry.boundingBox !== null) {
        this.boundingBox = geometry.boundingBox.clone();
      }
      if (geometry.boundingSphere !== null) {
        this.boundingSphere = geometry.boundingSphere.clone();
      }
      return this;
    },
    center: function() {
      var offset = new Vector3();
      return function center() {
        this.computeBoundingBox();
        this.boundingBox.getCenter(offset).negate();
        this.translate(offset.x, offset.y, offset.z);
        return this;
      };
    }(),
    normalize: function() {
      this.computeBoundingSphere();
      var center = this.boundingSphere.center;
      var radius = this.boundingSphere.radius;
      var s = radius === 0 ? 1 : 1.0 / radius;
      var matrix = new Matrix4();
      matrix.set(s, 0, 0, -s * center.x, 0, s, 0, -s * center.y, 0, 0, s, -s * center.z, 0, 0, 0, 1);
      this.applyMatrix(matrix);
      return this;
    },
    computeFaceNormals: function() {
      var cb = new Vector3(),
          ab = new Vector3();
      for (var f = 0,
          fl = this.faces.length; f < fl; f++) {
        var face = this.faces[f];
        var vA = this.vertices[face.a];
        var vB = this.vertices[face.b];
        var vC = this.vertices[face.c];
        cb.subVectors(vC, vB);
        ab.subVectors(vA, vB);
        cb.cross(ab);
        cb.normalize();
        face.normal.copy(cb);
      }
    },
    computeVertexNormals: function(areaWeighted) {
      if (areaWeighted === undefined)
        areaWeighted = true;
      var v,
          vl,
          f,
          fl,
          face,
          vertices;
      vertices = new Array(this.vertices.length);
      for (v = 0, vl = this.vertices.length; v < vl; v++) {
        vertices[v] = new Vector3();
      }
      if (areaWeighted) {
        var vA,
            vB,
            vC;
        var cb = new Vector3(),
            ab = new Vector3();
        for (f = 0, fl = this.faces.length; f < fl; f++) {
          face = this.faces[f];
          vA = this.vertices[face.a];
          vB = this.vertices[face.b];
          vC = this.vertices[face.c];
          cb.subVectors(vC, vB);
          ab.subVectors(vA, vB);
          cb.cross(ab);
          vertices[face.a].add(cb);
          vertices[face.b].add(cb);
          vertices[face.c].add(cb);
        }
      } else {
        this.computeFaceNormals();
        for (f = 0, fl = this.faces.length; f < fl; f++) {
          face = this.faces[f];
          vertices[face.a].add(face.normal);
          vertices[face.b].add(face.normal);
          vertices[face.c].add(face.normal);
        }
      }
      for (v = 0, vl = this.vertices.length; v < vl; v++) {
        vertices[v].normalize();
      }
      for (f = 0, fl = this.faces.length; f < fl; f++) {
        face = this.faces[f];
        var vertexNormals = face.vertexNormals;
        if (vertexNormals.length === 3) {
          vertexNormals[0].copy(vertices[face.a]);
          vertexNormals[1].copy(vertices[face.b]);
          vertexNormals[2].copy(vertices[face.c]);
        } else {
          vertexNormals[0] = vertices[face.a].clone();
          vertexNormals[1] = vertices[face.b].clone();
          vertexNormals[2] = vertices[face.c].clone();
        }
      }
      if (this.faces.length > 0) {
        this.normalsNeedUpdate = true;
      }
    },
    computeFlatVertexNormals: function() {
      var f,
          fl,
          face;
      this.computeFaceNormals();
      for (f = 0, fl = this.faces.length; f < fl; f++) {
        face = this.faces[f];
        var vertexNormals = face.vertexNormals;
        if (vertexNormals.length === 3) {
          vertexNormals[0].copy(face.normal);
          vertexNormals[1].copy(face.normal);
          vertexNormals[2].copy(face.normal);
        } else {
          vertexNormals[0] = face.normal.clone();
          vertexNormals[1] = face.normal.clone();
          vertexNormals[2] = face.normal.clone();
        }
      }
      if (this.faces.length > 0) {
        this.normalsNeedUpdate = true;
      }
    },
    computeMorphNormals: function() {
      var i,
          il,
          f,
          fl,
          face;
      for (f = 0, fl = this.faces.length; f < fl; f++) {
        face = this.faces[f];
        if (!face.__originalFaceNormal) {
          face.__originalFaceNormal = face.normal.clone();
        } else {
          face.__originalFaceNormal.copy(face.normal);
        }
        if (!face.__originalVertexNormals)
          face.__originalVertexNormals = [];
        for (i = 0, il = face.vertexNormals.length; i < il; i++) {
          if (!face.__originalVertexNormals[i]) {
            face.__originalVertexNormals[i] = face.vertexNormals[i].clone();
          } else {
            face.__originalVertexNormals[i].copy(face.vertexNormals[i]);
          }
        }
      }
      var tmpGeo = new Geometry();
      tmpGeo.faces = this.faces;
      for (i = 0, il = this.morphTargets.length; i < il; i++) {
        if (!this.morphNormals[i]) {
          this.morphNormals[i] = {};
          this.morphNormals[i].faceNormals = [];
          this.morphNormals[i].vertexNormals = [];
          var dstNormalsFace = this.morphNormals[i].faceNormals;
          var dstNormalsVertex = this.morphNormals[i].vertexNormals;
          var faceNormal,
              vertexNormals;
          for (f = 0, fl = this.faces.length; f < fl; f++) {
            faceNormal = new Vector3();
            vertexNormals = {
              a: new Vector3(),
              b: new Vector3(),
              c: new Vector3()
            };
            dstNormalsFace.push(faceNormal);
            dstNormalsVertex.push(vertexNormals);
          }
        }
        var morphNormals = this.morphNormals[i];
        tmpGeo.vertices = this.morphTargets[i].vertices;
        tmpGeo.computeFaceNormals();
        tmpGeo.computeVertexNormals();
        var faceNormal,
            vertexNormals;
        for (f = 0, fl = this.faces.length; f < fl; f++) {
          face = this.faces[f];
          faceNormal = morphNormals.faceNormals[f];
          vertexNormals = morphNormals.vertexNormals[f];
          faceNormal.copy(face.normal);
          vertexNormals.a.copy(face.vertexNormals[0]);
          vertexNormals.b.copy(face.vertexNormals[1]);
          vertexNormals.c.copy(face.vertexNormals[2]);
        }
      }
      for (f = 0, fl = this.faces.length; f < fl; f++) {
        face = this.faces[f];
        face.normal = face.__originalFaceNormal;
        face.vertexNormals = face.__originalVertexNormals;
      }
    },
    computeBoundingBox: function() {
      if (this.boundingBox === null) {
        this.boundingBox = new Box3();
      }
      this.boundingBox.setFromPoints(this.vertices);
    },
    computeBoundingSphere: function() {
      if (this.boundingSphere === null) {
        this.boundingSphere = new Sphere();
      }
      this.boundingSphere.setFromPoints(this.vertices);
    },
    merge: function(geometry, matrix, materialIndexOffset) {
      if (!(geometry && geometry.isGeometry)) {
        console.error('THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.', geometry);
        return;
      }
      var normalMatrix,
          vertexOffset = this.vertices.length,
          vertices1 = this.vertices,
          vertices2 = geometry.vertices,
          faces1 = this.faces,
          faces2 = geometry.faces,
          uvs1 = this.faceVertexUvs[0],
          uvs2 = geometry.faceVertexUvs[0],
          colors1 = this.colors,
          colors2 = geometry.colors;
      if (materialIndexOffset === undefined)
        materialIndexOffset = 0;
      if (matrix !== undefined) {
        normalMatrix = new Matrix3().getNormalMatrix(matrix);
      }
      for (var i = 0,
          il = vertices2.length; i < il; i++) {
        var vertex = vertices2[i];
        var vertexCopy = vertex.clone();
        if (matrix !== undefined)
          vertexCopy.applyMatrix4(matrix);
        vertices1.push(vertexCopy);
      }
      for (var i = 0,
          il = colors2.length; i < il; i++) {
        colors1.push(colors2[i].clone());
      }
      for (i = 0, il = faces2.length; i < il; i++) {
        var face = faces2[i],
            faceCopy,
            normal,
            color,
            faceVertexNormals = face.vertexNormals,
            faceVertexColors = face.vertexColors;
        faceCopy = new Face3(face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset);
        faceCopy.normal.copy(face.normal);
        if (normalMatrix !== undefined) {
          faceCopy.normal.applyMatrix3(normalMatrix).normalize();
        }
        for (var j = 0,
            jl = faceVertexNormals.length; j < jl; j++) {
          normal = faceVertexNormals[j].clone();
          if (normalMatrix !== undefined) {
            normal.applyMatrix3(normalMatrix).normalize();
          }
          faceCopy.vertexNormals.push(normal);
        }
        faceCopy.color.copy(face.color);
        for (var j = 0,
            jl = faceVertexColors.length; j < jl; j++) {
          color = faceVertexColors[j];
          faceCopy.vertexColors.push(color.clone());
        }
        faceCopy.materialIndex = face.materialIndex + materialIndexOffset;
        faces1.push(faceCopy);
      }
      for (i = 0, il = uvs2.length; i < il; i++) {
        var uv = uvs2[i],
            uvCopy = [];
        if (uv === undefined) {
          continue;
        }
        for (var j = 0,
            jl = uv.length; j < jl; j++) {
          uvCopy.push(uv[j].clone());
        }
        uvs1.push(uvCopy);
      }
    },
    mergeMesh: function(mesh) {
      if (!(mesh && mesh.isMesh)) {
        console.error('THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh);
        return;
      }
      if (mesh.matrixAutoUpdate)
        mesh.updateMatrix();
      this.merge(mesh.geometry, mesh.matrix);
    },
    mergeVertices: function() {
      var verticesMap = {};
      var unique = [],
          changes = [];
      var v,
          key;
      var precisionPoints = 4;
      var precision = Math.pow(10, precisionPoints);
      var i,
          il,
          face;
      var indices,
          j,
          jl;
      for (i = 0, il = this.vertices.length; i < il; i++) {
        v = this.vertices[i];
        key = Math.round(v.x * precision) + '_' + Math.round(v.y * precision) + '_' + Math.round(v.z * precision);
        if (verticesMap[key] === undefined) {
          verticesMap[key] = i;
          unique.push(this.vertices[i]);
          changes[i] = unique.length - 1;
        } else {
          changes[i] = changes[verticesMap[key]];
        }
      }
      var faceIndicesToRemove = [];
      for (i = 0, il = this.faces.length; i < il; i++) {
        face = this.faces[i];
        face.a = changes[face.a];
        face.b = changes[face.b];
        face.c = changes[face.c];
        indices = [face.a, face.b, face.c];
        for (var n = 0; n < 3; n++) {
          if (indices[n] === indices[(n + 1) % 3]) {
            faceIndicesToRemove.push(i);
            break;
          }
        }
      }
      for (i = faceIndicesToRemove.length - 1; i >= 0; i--) {
        var idx = faceIndicesToRemove[i];
        this.faces.splice(idx, 1);
        for (j = 0, jl = this.faceVertexUvs.length; j < jl; j++) {
          this.faceVertexUvs[j].splice(idx, 1);
        }
      }
      var diff = this.vertices.length - unique.length;
      this.vertices = unique;
      return diff;
    },
    setFromPoints: function(points) {
      this.vertices = [];
      for (var i = 0,
          l = points.length; i < l; i++) {
        var point = points[i];
        this.vertices.push(new Vector3(point.x, point.y, point.z || 0));
      }
      return this;
    },
    sortFacesByMaterialIndex: function() {
      var faces = this.faces;
      var length = faces.length;
      for (var i = 0; i < length; i++) {
        faces[i]._id = i;
      }
      function materialIndexSort(a, b) {
        return a.materialIndex - b.materialIndex;
      }
      faces.sort(materialIndexSort);
      var uvs1 = this.faceVertexUvs[0];
      var uvs2 = this.faceVertexUvs[1];
      var newUvs1,
          newUvs2;
      if (uvs1 && uvs1.length === length)
        newUvs1 = [];
      if (uvs2 && uvs2.length === length)
        newUvs2 = [];
      for (var i = 0; i < length; i++) {
        var id = faces[i]._id;
        if (newUvs1)
          newUvs1.push(uvs1[id]);
        if (newUvs2)
          newUvs2.push(uvs2[id]);
      }
      if (newUvs1)
        this.faceVertexUvs[0] = newUvs1;
      if (newUvs2)
        this.faceVertexUvs[1] = newUvs2;
    },
    toJSON: function() {
      var data = {metadata: {
          version: 4.5,
          type: 'Geometry',
          generator: 'Geometry.toJSON'
        }};
      data.uuid = this.uuid;
      data.type = this.type;
      if (this.name !== '')
        data.name = this.name;
      if (this.parameters !== undefined) {
        var parameters = this.parameters;
        for (var key in parameters) {
          if (parameters[key] !== undefined)
            data[key] = parameters[key];
        }
        return data;
      }
      var vertices = [];
      for (var i = 0; i < this.vertices.length; i++) {
        var vertex = this.vertices[i];
        vertices.push(vertex.x, vertex.y, vertex.z);
      }
      var faces = [];
      var normals = [];
      var normalsHash = {};
      var colors = [];
      var colorsHash = {};
      var uvs = [];
      var uvsHash = {};
      for (var i = 0; i < this.faces.length; i++) {
        var face = this.faces[i];
        var hasMaterial = true;
        var hasFaceUv = false;
        var hasFaceVertexUv = this.faceVertexUvs[0][i] !== undefined;
        var hasFaceNormal = face.normal.length() > 0;
        var hasFaceVertexNormal = face.vertexNormals.length > 0;
        var hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1;
        var hasFaceVertexColor = face.vertexColors.length > 0;
        var faceType = 0;
        faceType = setBit(faceType, 0, 0);
        faceType = setBit(faceType, 1, hasMaterial);
        faceType = setBit(faceType, 2, hasFaceUv);
        faceType = setBit(faceType, 3, hasFaceVertexUv);
        faceType = setBit(faceType, 4, hasFaceNormal);
        faceType = setBit(faceType, 5, hasFaceVertexNormal);
        faceType = setBit(faceType, 6, hasFaceColor);
        faceType = setBit(faceType, 7, hasFaceVertexColor);
        faces.push(faceType);
        faces.push(face.a, face.b, face.c);
        faces.push(face.materialIndex);
        if (hasFaceVertexUv) {
          var faceVertexUvs = this.faceVertexUvs[0][i];
          faces.push(getUvIndex(faceVertexUvs[0]), getUvIndex(faceVertexUvs[1]), getUvIndex(faceVertexUvs[2]));
        }
        if (hasFaceNormal) {
          faces.push(getNormalIndex(face.normal));
        }
        if (hasFaceVertexNormal) {
          var vertexNormals = face.vertexNormals;
          faces.push(getNormalIndex(vertexNormals[0]), getNormalIndex(vertexNormals[1]), getNormalIndex(vertexNormals[2]));
        }
        if (hasFaceColor) {
          faces.push(getColorIndex(face.color));
        }
        if (hasFaceVertexColor) {
          var vertexColors = face.vertexColors;
          faces.push(getColorIndex(vertexColors[0]), getColorIndex(vertexColors[1]), getColorIndex(vertexColors[2]));
        }
      }
      function setBit(value, position, enabled) {
        return enabled ? value | (1 << position) : value & (~(1 << position));
      }
      function getNormalIndex(normal) {
        var hash = normal.x.toString() + normal.y.toString() + normal.z.toString();
        if (normalsHash[hash] !== undefined) {
          return normalsHash[hash];
        }
        normalsHash[hash] = normals.length / 3;
        normals.push(normal.x, normal.y, normal.z);
        return normalsHash[hash];
      }
      function getColorIndex(color) {
        var hash = color.r.toString() + color.g.toString() + color.b.toString();
        if (colorsHash[hash] !== undefined) {
          return colorsHash[hash];
        }
        colorsHash[hash] = colors.length;
        colors.push(color.getHex());
        return colorsHash[hash];
      }
      function getUvIndex(uv) {
        var hash = uv.x.toString() + uv.y.toString();
        if (uvsHash[hash] !== undefined) {
          return uvsHash[hash];
        }
        uvsHash[hash] = uvs.length / 2;
        uvs.push(uv.x, uv.y);
        return uvsHash[hash];
      }
      data.data = {};
      data.data.vertices = vertices;
      data.data.normals = normals;
      if (colors.length > 0)
        data.data.colors = colors;
      if (uvs.length > 0)
        data.data.uvs = [uvs];
      data.data.faces = faces;
      return data;
    },
    clone: function() {
      return new Geometry().copy(this);
    },
    copy: function(source) {
      var i,
          il,
          j,
          jl,
          k,
          kl;
      this.vertices = [];
      this.colors = [];
      this.faces = [];
      this.faceVertexUvs = [[]];
      this.morphTargets = [];
      this.morphNormals = [];
      this.skinWeights = [];
      this.skinIndices = [];
      this.lineDistances = [];
      this.boundingBox = null;
      this.boundingSphere = null;
      this.name = source.name;
      var vertices = source.vertices;
      for (i = 0, il = vertices.length; i < il; i++) {
        this.vertices.push(vertices[i].clone());
      }
      var colors = source.colors;
      for (i = 0, il = colors.length; i < il; i++) {
        this.colors.push(colors[i].clone());
      }
      var faces = source.faces;
      for (i = 0, il = faces.length; i < il; i++) {
        this.faces.push(faces[i].clone());
      }
      for (i = 0, il = source.faceVertexUvs.length; i < il; i++) {
        var faceVertexUvs = source.faceVertexUvs[i];
        if (this.faceVertexUvs[i] === undefined) {
          this.faceVertexUvs[i] = [];
        }
        for (j = 0, jl = faceVertexUvs.length; j < jl; j++) {
          var uvs = faceVertexUvs[j],
              uvsCopy = [];
          for (k = 0, kl = uvs.length; k < kl; k++) {
            var uv = uvs[k];
            uvsCopy.push(uv.clone());
          }
          this.faceVertexUvs[i].push(uvsCopy);
        }
      }
      var morphTargets = source.morphTargets;
      for (i = 0, il = morphTargets.length; i < il; i++) {
        var morphTarget = {};
        morphTarget.name = morphTargets[i].name;
        if (morphTargets[i].vertices !== undefined) {
          morphTarget.vertices = [];
          for (j = 0, jl = morphTargets[i].vertices.length; j < jl; j++) {
            morphTarget.vertices.push(morphTargets[i].vertices[j].clone());
          }
        }
        if (morphTargets[i].normals !== undefined) {
          morphTarget.normals = [];
          for (j = 0, jl = morphTargets[i].normals.length; j < jl; j++) {
            morphTarget.normals.push(morphTargets[i].normals[j].clone());
          }
        }
        this.morphTargets.push(morphTarget);
      }
      var morphNormals = source.morphNormals;
      for (i = 0, il = morphNormals.length; i < il; i++) {
        var morphNormal = {};
        if (morphNormals[i].vertexNormals !== undefined) {
          morphNormal.vertexNormals = [];
          for (j = 0, jl = morphNormals[i].vertexNormals.length; j < jl; j++) {
            var srcVertexNormal = morphNormals[i].vertexNormals[j];
            var destVertexNormal = {};
            destVertexNormal.a = srcVertexNormal.a.clone();
            destVertexNormal.b = srcVertexNormal.b.clone();
            destVertexNormal.c = srcVertexNormal.c.clone();
            morphNormal.vertexNormals.push(destVertexNormal);
          }
        }
        if (morphNormals[i].faceNormals !== undefined) {
          morphNormal.faceNormals = [];
          for (j = 0, jl = morphNormals[i].faceNormals.length; j < jl; j++) {
            morphNormal.faceNormals.push(morphNormals[i].faceNormals[j].clone());
          }
        }
        this.morphNormals.push(morphNormal);
      }
      var skinWeights = source.skinWeights;
      for (i = 0, il = skinWeights.length; i < il; i++) {
        this.skinWeights.push(skinWeights[i].clone());
      }
      var skinIndices = source.skinIndices;
      for (i = 0, il = skinIndices.length; i < il; i++) {
        this.skinIndices.push(skinIndices[i].clone());
      }
      var lineDistances = source.lineDistances;
      for (i = 0, il = lineDistances.length; i < il; i++) {
        this.lineDistances.push(lineDistances[i]);
      }
      var boundingBox = source.boundingBox;
      if (boundingBox !== null) {
        this.boundingBox = boundingBox.clone();
      }
      var boundingSphere = source.boundingSphere;
      if (boundingSphere !== null) {
        this.boundingSphere = boundingSphere.clone();
      }
      this.elementsNeedUpdate = source.elementsNeedUpdate;
      this.verticesNeedUpdate = source.verticesNeedUpdate;
      this.uvsNeedUpdate = source.uvsNeedUpdate;
      this.normalsNeedUpdate = source.normalsNeedUpdate;
      this.colorsNeedUpdate = source.colorsNeedUpdate;
      this.lineDistancesNeedUpdate = source.lineDistancesNeedUpdate;
      this.groupsNeedUpdate = source.groupsNeedUpdate;
      return this;
    },
    dispose: function() {
      this.dispatchEvent({type: 'dispose'});
    }
  });
  function BufferAttribute(array, itemSize, normalized) {
    if (Array.isArray(array)) {
      throw new TypeError('THREE.BufferAttribute: array should be a Typed Array.');
    }
    this.name = '';
    this.array = array;
    this.itemSize = itemSize;
    this.count = array !== undefined ? array.length / itemSize : 0;
    this.normalized = normalized === true;
    this.dynamic = false;
    this.updateRange = {
      offset: 0,
      count: -1
    };
    this.version = 0;
  }
  Object.defineProperty(BufferAttribute.prototype, 'needsUpdate', {set: function(value) {
      if (value === true)
        this.version++;
    }});
  Object.assign(BufferAttribute.prototype, {
    isBufferAttribute: true,
    onUploadCallback: function() {},
    setArray: function(array) {
      if (Array.isArray(array)) {
        throw new TypeError('THREE.BufferAttribute: array should be a Typed Array.');
      }
      this.count = array !== undefined ? array.length / this.itemSize : 0;
      this.array = array;
      return this;
    },
    setDynamic: function(value) {
      this.dynamic = value;
      return this;
    },
    copy: function(source) {
      this.name = source.name;
      this.array = new source.array.constructor(source.array);
      this.itemSize = source.itemSize;
      this.count = source.count;
      this.normalized = source.normalized;
      this.dynamic = source.dynamic;
      return this;
    },
    copyAt: function(index1, attribute, index2) {
      index1 *= this.itemSize;
      index2 *= attribute.itemSize;
      for (var i = 0,
          l = this.itemSize; i < l; i++) {
        this.array[index1 + i] = attribute.array[index2 + i];
      }
      return this;
    },
    copyArray: function(array) {
      this.array.set(array);
      return this;
    },
    copyColorsArray: function(colors) {
      var array = this.array,
          offset = 0;
      for (var i = 0,
          l = colors.length; i < l; i++) {
        var color = colors[i];
        if (color === undefined) {
          console.warn('THREE.BufferAttribute.copyColorsArray(): color is undefined', i);
          color = new Color();
        }
        array[offset++] = color.r;
        array[offset++] = color.g;
        array[offset++] = color.b;
      }
      return this;
    },
    copyVector2sArray: function(vectors) {
      var array = this.array,
          offset = 0;
      for (var i = 0,
          l = vectors.length; i < l; i++) {
        var vector = vectors[i];
        if (vector === undefined) {
          console.warn('THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i);
          vector = new Vector2();
        }
        array[offset++] = vector.x;
        array[offset++] = vector.y;
      }
      return this;
    },
    copyVector3sArray: function(vectors) {
      var array = this.array,
          offset = 0;
      for (var i = 0,
          l = vectors.length; i < l; i++) {
        var vector = vectors[i];
        if (vector === undefined) {
          console.warn('THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i);
          vector = new Vector3();
        }
        array[offset++] = vector.x;
        array[offset++] = vector.y;
        array[offset++] = vector.z;
      }
      return this;
    },
    copyVector4sArray: function(vectors) {
      var array = this.array,
          offset = 0;
      for (var i = 0,
          l = vectors.length; i < l; i++) {
        var vector = vectors[i];
        if (vector === undefined) {
          console.warn('THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i);
          vector = new Vector4();
        }
        array[offset++] = vector.x;
        array[offset++] = vector.y;
        array[offset++] = vector.z;
        array[offset++] = vector.w;
      }
      return this;
    },
    set: function(value, offset) {
      if (offset === undefined)
        offset = 0;
      this.array.set(value, offset);
      return this;
    },
    getX: function(index) {
      return this.array[index * this.itemSize];
    },
    setX: function(index, x) {
      this.array[index * this.itemSize] = x;
      return this;
    },
    getY: function(index) {
      return this.array[index * this.itemSize + 1];
    },
    setY: function(index, y) {
      this.array[index * this.itemSize + 1] = y;
      return this;
    },
    getZ: function(index) {
      return this.array[index * this.itemSize + 2];
    },
    setZ: function(index, z) {
      this.array[index * this.itemSize + 2] = z;
      return this;
    },
    getW: function(index) {
      return this.array[index * this.itemSize + 3];
    },
    setW: function(index, w) {
      this.array[index * this.itemSize + 3] = w;
      return this;
    },
    setXY: function(index, x, y) {
      index *= this.itemSize;
      this.array[index + 0] = x;
      this.array[index + 1] = y;
      return this;
    },
    setXYZ: function(index, x, y, z) {
      index *= this.itemSize;
      this.array[index + 0] = x;
      this.array[index + 1] = y;
      this.array[index + 2] = z;
      return this;
    },
    setXYZW: function(index, x, y, z, w) {
      index *= this.itemSize;
      this.array[index + 0] = x;
      this.array[index + 1] = y;
      this.array[index + 2] = z;
      this.array[index + 3] = w;
      return this;
    },
    onUpload: function(callback) {
      this.onUploadCallback = callback;
      return this;
    },
    clone: function() {
      return new this.constructor(this.array, this.itemSize).copy(this);
    }
  });
  function Int8BufferAttribute(array, itemSize, normalized) {
    BufferAttribute.call(this, new Int8Array(array), itemSize, normalized);
  }
  Int8BufferAttribute.prototype = Object.create(BufferAttribute.prototype);
  Int8BufferAttribute.prototype.constructor = Int8BufferAttribute;
  function Uint8BufferAttribute(array, itemSize, normalized) {
    BufferAttribute.call(this, new Uint8Array(array), itemSize, normalized);
  }
  Uint8BufferAttribute.prototype = Object.create(BufferAttribute.prototype);
  Uint8BufferAttribute.prototype.constructor = Uint8BufferAttribute;
  function Uint8ClampedBufferAttribute(array, itemSize, normalized) {
    BufferAttribute.call(this, new Uint8ClampedArray(array), itemSize, normalized);
  }
  Uint8ClampedBufferAttribute.prototype = Object.create(BufferAttribute.prototype);
  Uint8ClampedBufferAttribute.prototype.constructor = Uint8ClampedBufferAttribute;
  function Int16BufferAttribute(array, itemSize, normalized) {
    BufferAttribute.call(this, new Int16Array(array), itemSize, normalized);
  }
  Int16BufferAttribute.prototype = Object.create(BufferAttribute.prototype);
  Int16BufferAttribute.prototype.constructor = Int16BufferAttribute;
  function Uint16BufferAttribute(array, itemSize, normalized) {
    BufferAttribute.call(this, new Uint16Array(array), itemSize, normalized);
  }
  Uint16BufferAttribute.prototype = Object.create(BufferAttribute.prototype);
  Uint16BufferAttribute.prototype.constructor = Uint16BufferAttribute;
  function Int32BufferAttribute(array, itemSize, normalized) {
    BufferAttribute.call(this, new Int32Array(array), itemSize, normalized);
  }
  Int32BufferAttribute.prototype = Object.create(BufferAttribute.prototype);
  Int32BufferAttribute.prototype.constructor = Int32BufferAttribute;
  function Uint32BufferAttribute(array, itemSize, normalized) {
    BufferAttribute.call(this, new Uint32Array(array), itemSize, normalized);
  }
  Uint32BufferAttribute.prototype = Object.create(BufferAttribute.prototype);
  Uint32BufferAttribute.prototype.constructor = Uint32BufferAttribute;
  function Float32BufferAttribute(array, itemSize, normalized) {
    BufferAttribute.call(this, new Float32Array(array), itemSize, normalized);
  }
  Float32BufferAttribute.prototype = Object.create(BufferAttribute.prototype);
  Float32BufferAttribute.prototype.constructor = Float32BufferAttribute;
  function Float64BufferAttribute(array, itemSize, normalized) {
    BufferAttribute.call(this, new Float64Array(array), itemSize, normalized);
  }
  Float64BufferAttribute.prototype = Object.create(BufferAttribute.prototype);
  Float64BufferAttribute.prototype.constructor = Float64BufferAttribute;
  function DirectGeometry() {
    this.vertices = [];
    this.normals = [];
    this.colors = [];
    this.uvs = [];
    this.uvs2 = [];
    this.groups = [];
    this.morphTargets = {};
    this.skinWeights = [];
    this.skinIndices = [];
    this.boundingBox = null;
    this.boundingSphere = null;
    this.verticesNeedUpdate = false;
    this.normalsNeedUpdate = false;
    this.colorsNeedUpdate = false;
    this.uvsNeedUpdate = false;
    this.groupsNeedUpdate = false;
  }
  Object.assign(DirectGeometry.prototype, {
    computeGroups: function(geometry) {
      var group;
      var groups = [];
      var materialIndex = undefined;
      var faces = geometry.faces;
      for (var i = 0; i < faces.length; i++) {
        var face = faces[i];
        if (face.materialIndex !== materialIndex) {
          materialIndex = face.materialIndex;
          if (group !== undefined) {
            group.count = (i * 3) - group.start;
            groups.push(group);
          }
          group = {
            start: i * 3,
            materialIndex: materialIndex
          };
        }
      }
      if (group !== undefined) {
        group.count = (i * 3) - group.start;
        groups.push(group);
      }
      this.groups = groups;
    },
    fromGeometry: function(geometry) {
      var faces = geometry.faces;
      var vertices = geometry.vertices;
      var faceVertexUvs = geometry.faceVertexUvs;
      var hasFaceVertexUv = faceVertexUvs[0] && faceVertexUvs[0].length > 0;
      var hasFaceVertexUv2 = faceVertexUvs[1] && faceVertexUvs[1].length > 0;
      var morphTargets = geometry.morphTargets;
      var morphTargetsLength = morphTargets.length;
      var morphTargetsPosition;
      if (morphTargetsLength > 0) {
        morphTargetsPosition = [];
        for (var i = 0; i < morphTargetsLength; i++) {
          morphTargetsPosition[i] = {
            name: morphTargets[i].name,
            data: []
          };
        }
        this.morphTargets.position = morphTargetsPosition;
      }
      var morphNormals = geometry.morphNormals;
      var morphNormalsLength = morphNormals.length;
      var morphTargetsNormal;
      if (morphNormalsLength > 0) {
        morphTargetsNormal = [];
        for (var i = 0; i < morphNormalsLength; i++) {
          morphTargetsNormal[i] = {
            name: morphNormals[i].name,
            data: []
          };
        }
        this.morphTargets.normal = morphTargetsNormal;
      }
      var skinIndices = geometry.skinIndices;
      var skinWeights = geometry.skinWeights;
      var hasSkinIndices = skinIndices.length === vertices.length;
      var hasSkinWeights = skinWeights.length === vertices.length;
      if (vertices.length > 0 && faces.length === 0) {
        console.error('THREE.DirectGeometry: Faceless geometries are not supported.');
      }
      for (var i = 0; i < faces.length; i++) {
        var face = faces[i];
        this.vertices.push(vertices[face.a], vertices[face.b], vertices[face.c]);
        var vertexNormals = face.vertexNormals;
        if (vertexNormals.length === 3) {
          this.normals.push(vertexNormals[0], vertexNormals[1], vertexNormals[2]);
        } else {
          var normal = face.normal;
          this.normals.push(normal, normal, normal);
        }
        var vertexColors = face.vertexColors;
        if (vertexColors.length === 3) {
          this.colors.push(vertexColors[0], vertexColors[1], vertexColors[2]);
        } else {
          var color = face.color;
          this.colors.push(color, color, color);
        }
        if (hasFaceVertexUv === true) {
          var vertexUvs = faceVertexUvs[0][i];
          if (vertexUvs !== undefined) {
            this.uvs.push(vertexUvs[0], vertexUvs[1], vertexUvs[2]);
          } else {
            console.warn('THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', i);
            this.uvs.push(new Vector2(), new Vector2(), new Vector2());
          }
        }
        if (hasFaceVertexUv2 === true) {
          var vertexUvs = faceVertexUvs[1][i];
          if (vertexUvs !== undefined) {
            this.uvs2.push(vertexUvs[0], vertexUvs[1], vertexUvs[2]);
          } else {
            console.warn('THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', i);
            this.uvs2.push(new Vector2(), new Vector2(), new Vector2());
          }
        }
        for (var j = 0; j < morphTargetsLength; j++) {
          var morphTarget = morphTargets[j].vertices;
          morphTargetsPosition[j].data.push(morphTarget[face.a], morphTarget[face.b], morphTarget[face.c]);
        }
        for (var j = 0; j < morphNormalsLength; j++) {
          var morphNormal = morphNormals[j].vertexNormals[i];
          morphTargetsNormal[j].data.push(morphNormal.a, morphNormal.b, morphNormal.c);
        }
        if (hasSkinIndices) {
          this.skinIndices.push(skinIndices[face.a], skinIndices[face.b], skinIndices[face.c]);
        }
        if (hasSkinWeights) {
          this.skinWeights.push(skinWeights[face.a], skinWeights[face.b], skinWeights[face.c]);
        }
      }
      this.computeGroups(geometry);
      this.verticesNeedUpdate = geometry.verticesNeedUpdate;
      this.normalsNeedUpdate = geometry.normalsNeedUpdate;
      this.colorsNeedUpdate = geometry.colorsNeedUpdate;
      this.uvsNeedUpdate = geometry.uvsNeedUpdate;
      this.groupsNeedUpdate = geometry.groupsNeedUpdate;
      return this;
    }
  });
  function arrayMax(array) {
    if (array.length === 0)
      return -Infinity;
    var max = array[0];
    for (var i = 1,
        l = array.length; i < l; ++i) {
      if (array[i] > max)
        max = array[i];
    }
    return max;
  }
  var bufferGeometryId = 1;
  function BufferGeometry() {
    Object.defineProperty(this, 'id', {value: bufferGeometryId += 2});
    this.uuid = _Math.generateUUID();
    this.name = '';
    this.type = 'BufferGeometry';
    this.index = null;
    this.attributes = {};
    this.morphAttributes = {};
    this.groups = [];
    this.boundingBox = null;
    this.boundingSphere = null;
    this.drawRange = {
      start: 0,
      count: Infinity
    };
    this.userData = {};
  }
  BufferGeometry.prototype = Object.assign(Object.create(EventDispatcher.prototype), {
    constructor: BufferGeometry,
    isBufferGeometry: true,
    getIndex: function() {
      return this.index;
    },
    setIndex: function(index) {
      if (Array.isArray(index)) {
        this.index = new (arrayMax(index) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute)(index, 1);
      } else {
        this.index = index;
      }
    },
    addAttribute: function(name, attribute) {
      if (!(attribute && attribute.isBufferAttribute) && !(attribute && attribute.isInterleavedBufferAttribute)) {
        console.warn('THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).');
        return this.addAttribute(name, new BufferAttribute(arguments[1], arguments[2]));
      }
      if (name === 'index') {
        console.warn('THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.');
        this.setIndex(attribute);
        return this;
      }
      this.attributes[name] = attribute;
      return this;
    },
    getAttribute: function(name) {
      return this.attributes[name];
    },
    removeAttribute: function(name) {
      delete this.attributes[name];
      return this;
    },
    addGroup: function(start, count, materialIndex) {
      this.groups.push({
        start: start,
        count: count,
        materialIndex: materialIndex !== undefined ? materialIndex : 0
      });
    },
    clearGroups: function() {
      this.groups = [];
    },
    setDrawRange: function(start, count) {
      this.drawRange.start = start;
      this.drawRange.count = count;
    },
    applyMatrix: function(matrix) {
      var position = this.attributes.position;
      if (position !== undefined) {
        matrix.applyToBufferAttribute(position);
        position.needsUpdate = true;
      }
      var normal = this.attributes.normal;
      if (normal !== undefined) {
        var normalMatrix = new Matrix3().getNormalMatrix(matrix);
        normalMatrix.applyToBufferAttribute(normal);
        normal.needsUpdate = true;
      }
      var tangent = this.attributes.tangent;
      if (tangent !== undefined) {
        var normalMatrix = new Matrix3().getNormalMatrix(matrix);
        normalMatrix.applyToBufferAttribute(tangent);
        tangent.needsUpdate = true;
      }
      if (this.boundingBox !== null) {
        this.computeBoundingBox();
      }
      if (this.boundingSphere !== null) {
        this.computeBoundingSphere();
      }
      return this;
    },
    rotateX: function() {
      var m1 = new Matrix4();
      return function rotateX(angle) {
        m1.makeRotationX(angle);
        this.applyMatrix(m1);
        return this;
      };
    }(),
    rotateY: function() {
      var m1 = new Matrix4();
      return function rotateY(angle) {
        m1.makeRotationY(angle);
        this.applyMatrix(m1);
        return this;
      };
    }(),
    rotateZ: function() {
      var m1 = new Matrix4();
      return function rotateZ(angle) {
        m1.makeRotationZ(angle);
        this.applyMatrix(m1);
        return this;
      };
    }(),
    translate: function() {
      var m1 = new Matrix4();
      return function translate(x, y, z) {
        m1.makeTranslation(x, y, z);
        this.applyMatrix(m1);
        return this;
      };
    }(),
    scale: function() {
      var m1 = new Matrix4();
      return function scale(x, y, z) {
        m1.makeScale(x, y, z);
        this.applyMatrix(m1);
        return this;
      };
    }(),
    lookAt: function() {
      var obj = new Object3D();
      return function lookAt(vector) {
        obj.lookAt(vector);
        obj.updateMatrix();
        this.applyMatrix(obj.matrix);
      };
    }(),
    center: function() {
      var offset = new Vector3();
      return function center() {
        this.computeBoundingBox();
        this.boundingBox.getCenter(offset).negate();
        this.translate(offset.x, offset.y, offset.z);
        return this;
      };
    }(),
    setFromObject: function(object) {
      var geometry = object.geometry;
      if (object.isPoints || object.isLine) {
        var positions = new Float32BufferAttribute(geometry.vertices.length * 3, 3);
        var colors = new Float32BufferAttribute(geometry.colors.length * 3, 3);
        this.addAttribute('position', positions.copyVector3sArray(geometry.vertices));
        this.addAttribute('color', colors.copyColorsArray(geometry.colors));
        if (geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length) {
          var lineDistances = new Float32BufferAttribute(geometry.lineDistances.length, 1);
          this.addAttribute('lineDistance', lineDistances.copyArray(geometry.lineDistances));
        }
        if (geometry.boundingSphere !== null) {
          this.boundingSphere = geometry.boundingSphere.clone();
        }
        if (geometry.boundingBox !== null) {
          this.boundingBox = geometry.boundingBox.clone();
        }
      } else if (object.isMesh) {
        if (geometry && geometry.isGeometry) {
          this.fromGeometry(geometry);
        }
      }
      return this;
    },
    setFromPoints: function(points) {
      var position = [];
      for (var i = 0,
          l = points.length; i < l; i++) {
        var point = points[i];
        position.push(point.x, point.y, point.z || 0);
      }
      this.addAttribute('position', new Float32BufferAttribute(position, 3));
      return this;
    },
    updateFromObject: function(object) {
      var geometry = object.geometry;
      if (object.isMesh) {
        var direct = geometry.__directGeometry;
        if (geometry.elementsNeedUpdate === true) {
          direct = undefined;
          geometry.elementsNeedUpdate = false;
        }
        if (direct === undefined) {
          return this.fromGeometry(geometry);
        }
        direct.verticesNeedUpdate = geometry.verticesNeedUpdate;
        direct.normalsNeedUpdate = geometry.normalsNeedUpdate;
        direct.colorsNeedUpdate = geometry.colorsNeedUpdate;
        direct.uvsNeedUpdate = geometry.uvsNeedUpdate;
        direct.groupsNeedUpdate = geometry.groupsNeedUpdate;
        geometry.verticesNeedUpdate = false;
        geometry.normalsNeedUpdate = false;
        geometry.colorsNeedUpdate = false;
        geometry.uvsNeedUpdate = false;
        geometry.groupsNeedUpdate = false;
        geometry = direct;
      }
      var attribute;
      if (geometry.verticesNeedUpdate === true) {
        attribute = this.attributes.position;
        if (attribute !== undefined) {
          attribute.copyVector3sArray(geometry.vertices);
          attribute.needsUpdate = true;
        }
        geometry.verticesNeedUpdate = false;
      }
      if (geometry.normalsNeedUpdate === true) {
        attribute = this.attributes.normal;
        if (attribute !== undefined) {
          attribute.copyVector3sArray(geometry.normals);
          attribute.needsUpdate = true;
        }
        geometry.normalsNeedUpdate = false;
      }
      if (geometry.colorsNeedUpdate === true) {
        attribute = this.attributes.color;
        if (attribute !== undefined) {
          attribute.copyColorsArray(geometry.colors);
          attribute.needsUpdate = true;
        }
        geometry.colorsNeedUpdate = false;
      }
      if (geometry.uvsNeedUpdate) {
        attribute = this.attributes.uv;
        if (attribute !== undefined) {
          attribute.copyVector2sArray(geometry.uvs);
          attribute.needsUpdate = true;
        }
        geometry.uvsNeedUpdate = false;
      }
      if (geometry.lineDistancesNeedUpdate) {
        attribute = this.attributes.lineDistance;
        if (attribute !== undefined) {
          attribute.copyArray(geometry.lineDistances);
          attribute.needsUpdate = true;
        }
        geometry.lineDistancesNeedUpdate = false;
      }
      if (geometry.groupsNeedUpdate) {
        geometry.computeGroups(object.geometry);
        this.groups = geometry.groups;
        geometry.groupsNeedUpdate = false;
      }
      return this;
    },
    fromGeometry: function(geometry) {
      geometry.__directGeometry = new DirectGeometry().fromGeometry(geometry);
      return this.fromDirectGeometry(geometry.__directGeometry);
    },
    fromDirectGeometry: function(geometry) {
      var positions = new Float32Array(geometry.vertices.length * 3);
      this.addAttribute('position', new BufferAttribute(positions, 3).copyVector3sArray(geometry.vertices));
      if (geometry.normals.length > 0) {
        var normals = new Float32Array(geometry.normals.length * 3);
        this.addAttribute('normal', new BufferAttribute(normals, 3).copyVector3sArray(geometry.normals));
      }
      if (geometry.colors.length > 0) {
        var colors = new Float32Array(geometry.colors.length * 3);
        this.addAttribute('color', new BufferAttribute(colors, 3).copyColorsArray(geometry.colors));
      }
      if (geometry.uvs.length > 0) {
        var uvs = new Float32Array(geometry.uvs.length * 2);
        this.addAttribute('uv', new BufferAttribute(uvs, 2).copyVector2sArray(geometry.uvs));
      }
      if (geometry.uvs2.length > 0) {
        var uvs2 = new Float32Array(geometry.uvs2.length * 2);
        this.addAttribute('uv2', new BufferAttribute(uvs2, 2).copyVector2sArray(geometry.uvs2));
      }
      this.groups = geometry.groups;
      for (var name in geometry.morphTargets) {
        var array = [];
        var morphTargets = geometry.morphTargets[name];
        for (var i = 0,
            l = morphTargets.length; i < l; i++) {
          var morphTarget = morphTargets[i];
          var attribute = new Float32BufferAttribute(morphTarget.data.length * 3, 3);
          attribute.name = morphTarget.name;
          array.push(attribute.copyVector3sArray(morphTarget.data));
        }
        this.morphAttributes[name] = array;
      }
      if (geometry.skinIndices.length > 0) {
        var skinIndices = new Float32BufferAttribute(geometry.skinIndices.length * 4, 4);
        this.addAttribute('skinIndex', skinIndices.copyVector4sArray(geometry.skinIndices));
      }
      if (geometry.skinWeights.length > 0) {
        var skinWeights = new Float32BufferAttribute(geometry.skinWeights.length * 4, 4);
        this.addAttribute('skinWeight', skinWeights.copyVector4sArray(geometry.skinWeights));
      }
      if (geometry.boundingSphere !== null) {
        this.boundingSphere = geometry.boundingSphere.clone();
      }
      if (geometry.boundingBox !== null) {
        this.boundingBox = geometry.boundingBox.clone();
      }
      return this;
    },
    computeBoundingBox: function() {
      if (this.boundingBox === null) {
        this.boundingBox = new Box3();
      }
      var position = this.attributes.position;
      if (position !== undefined) {
        this.boundingBox.setFromBufferAttribute(position);
      } else {
        this.boundingBox.makeEmpty();
      }
      if (isNaN(this.boundingBox.min.x) || isNaN(this.boundingBox.min.y) || isNaN(this.boundingBox.min.z)) {
        console.error('THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.', this);
      }
    },
    computeBoundingSphere: function() {
      var box = new Box3();
      var vector = new Vector3();
      return function computeBoundingSphere() {
        if (this.boundingSphere === null) {
          this.boundingSphere = new Sphere();
        }
        var position = this.attributes.position;
        if (position) {
          var center = this.boundingSphere.center;
          box.setFromBufferAttribute(position);
          box.getCenter(center);
          var maxRadiusSq = 0;
          for (var i = 0,
              il = position.count; i < il; i++) {
            vector.x = position.getX(i);
            vector.y = position.getY(i);
            vector.z = position.getZ(i);
            maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(vector));
          }
          this.boundingSphere.radius = Math.sqrt(maxRadiusSq);
          if (isNaN(this.boundingSphere.radius)) {
            console.error('THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.', this);
          }
        }
      };
    }(),
    computeFaceNormals: function() {},
    computeVertexNormals: function() {
      var index = this.index;
      var attributes = this.attributes;
      if (attributes.position) {
        var positions = attributes.position.array;
        if (attributes.normal === undefined) {
          this.addAttribute('normal', new BufferAttribute(new Float32Array(positions.length), 3));
        } else {
          var array = attributes.normal.array;
          for (var i = 0,
              il = array.length; i < il; i++) {
            array[i] = 0;
          }
        }
        var normals = attributes.normal.array;
        var vA,
            vB,
            vC;
        var pA = new Vector3(),
            pB = new Vector3(),
            pC = new Vector3();
        var cb = new Vector3(),
            ab = new Vector3();
        if (index) {
          var indices = index.array;
          for (var i = 0,
              il = index.count; i < il; i += 3) {
            vA = indices[i + 0] * 3;
            vB = indices[i + 1] * 3;
            vC = indices[i + 2] * 3;
            pA.fromArray(positions, vA);
            pB.fromArray(positions, vB);
            pC.fromArray(positions, vC);
            cb.subVectors(pC, pB);
            ab.subVectors(pA, pB);
            cb.cross(ab);
            normals[vA] += cb.x;
            normals[vA + 1] += cb.y;
            normals[vA + 2] += cb.z;
            normals[vB] += cb.x;
            normals[vB + 1] += cb.y;
            normals[vB + 2] += cb.z;
            normals[vC] += cb.x;
            normals[vC + 1] += cb.y;
            normals[vC + 2] += cb.z;
          }
        } else {
          for (var i = 0,
              il = positions.length; i < il; i += 9) {
            pA.fromArray(positions, i);
            pB.fromArray(positions, i + 3);
            pC.fromArray(positions, i + 6);
            cb.subVectors(pC, pB);
            ab.subVectors(pA, pB);
            cb.cross(ab);
            normals[i] = cb.x;
            normals[i + 1] = cb.y;
            normals[i + 2] = cb.z;
            normals[i + 3] = cb.x;
            normals[i + 4] = cb.y;
            normals[i + 5] = cb.z;
            normals[i + 6] = cb.x;
            normals[i + 7] = cb.y;
            normals[i + 8] = cb.z;
          }
        }
        this.normalizeNormals();
        attributes.normal.needsUpdate = true;
      }
    },
    merge: function(geometry, offset) {
      if (!(geometry && geometry.isBufferGeometry)) {
        console.error('THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry);
        return;
      }
      if (offset === undefined) {
        offset = 0;
        console.warn('THREE.BufferGeometry.merge(): Overwriting original geometry, starting at offset=0. ' + 'Use BufferGeometryUtils.mergeBufferGeometries() for lossless merge.');
      }
      var attributes = this.attributes;
      for (var key in attributes) {
        if (geometry.attributes[key] === undefined)
          continue;
        var attribute1 = attributes[key];
        var attributeArray1 = attribute1.array;
        var attribute2 = geometry.attributes[key];
        var attributeArray2 = attribute2.array;
        var attributeSize = attribute2.itemSize;
        for (var i = 0,
            j = attributeSize * offset; i < attributeArray2.length; i++, j++) {
          attributeArray1[j] = attributeArray2[i];
        }
      }
      return this;
    },
    normalizeNormals: function() {
      var vector = new Vector3();
      return function normalizeNormals() {
        var normals = this.attributes.normal;
        for (var i = 0,
            il = normals.count; i < il; i++) {
          vector.x = normals.getX(i);
          vector.y = normals.getY(i);
          vector.z = normals.getZ(i);
          vector.normalize();
          normals.setXYZ(i, vector.x, vector.y, vector.z);
        }
      };
    }(),
    toNonIndexed: function() {
      function convertBufferAttribute(attribute, indices) {
        var array = attribute.array;
        var itemSize = attribute.itemSize;
        var array2 = new array.constructor(indices.length * itemSize);
        var index = 0,
            index2 = 0;
        for (var i = 0,
            l = indices.length; i < l; i++) {
          index = indices[i] * itemSize;
          for (var j = 0; j < itemSize; j++) {
            array2[index2++] = array[index++];
          }
        }
        return new BufferAttribute(array2, itemSize);
      }
      if (this.index === null) {
        console.warn('THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.');
        return this;
      }
      var geometry2 = new BufferGeometry();
      var indices = this.index.array;
      var attributes = this.attributes;
      for (var name in attributes) {
        var attribute = attributes[name];
        var newAttribute = convertBufferAttribute(attribute, indices);
        geometry2.addAttribute(name, newAttribute);
      }
      var morphAttributes = this.morphAttributes;
      for (name in morphAttributes) {
        var morphArray = [];
        var morphAttribute = morphAttributes[name];
        for (var i = 0,
            il = morphAttribute.length; i < il; i++) {
          var attribute = morphAttribute[i];
          var newAttribute = convertBufferAttribute(attribute, indices);
          morphArray.push(newAttribute);
        }
        geometry2.morphAttributes[name] = morphArray;
      }
      var groups = this.groups;
      for (var i = 0,
          l = groups.length; i < l; i++) {
        var group = groups[i];
        geometry2.addGroup(group.start, group.count, group.materialIndex);
      }
      return geometry2;
    },
    toJSON: function() {
      var data = {metadata: {
          version: 4.5,
          type: 'BufferGeometry',
          generator: 'BufferGeometry.toJSON'
        }};
      data.uuid = this.uuid;
      data.type = this.type;
      if (this.name !== '')
        data.name = this.name;
      if (Object.keys(this.userData).length > 0)
        data.userData = this.userData;
      if (this.parameters !== undefined) {
        var parameters = this.parameters;
        for (var key in parameters) {
          if (parameters[key] !== undefined)
            data[key] = parameters[key];
        }
        return data;
      }
      data.data = {attributes: {}};
      var index = this.index;
      if (index !== null) {
        data.data.index = {
          type: index.array.constructor.name,
          array: Array.prototype.slice.call(index.array)
        };
      }
      var attributes = this.attributes;
      for (var key in attributes) {
        var attribute = attributes[key];
        var attributeData = {
          itemSize: attribute.itemSize,
          type: attribute.array.constructor.name,
          array: Array.prototype.slice.call(attribute.array),
          normalized: attribute.normalized
        };
        if (attribute.name !== '')
          attributeData.name = attribute.name;
        data.data.attributes[key] = attributeData;
      }
      var morphAttributes = {};
      var hasMorphAttributes = false;
      for (var key in this.morphAttributes) {
        var attributeArray = this.morphAttributes[key];
        var array = [];
        for (var i = 0,
            il = attributeArray.length; i < il; i++) {
          var attribute = attributeArray[i];
          var attributeData = {
            itemSize: attribute.itemSize,
            type: attribute.array.constructor.name,
            array: Array.prototype.slice.call(attribute.array),
            normalized: attribute.normalized
          };
          if (attribute.name !== '')
            attributeData.name = attribute.name;
          array.push(attributeData);
        }
        if (array.length > 0) {
          morphAttributes[key] = array;
          hasMorphAttributes = true;
        }
      }
      if (hasMorphAttributes)
        data.data.morphAttributes = morphAttributes;
      var groups = this.groups;
      if (groups.length > 0) {
        data.data.groups = JSON.parse(JSON.stringify(groups));
      }
      var boundingSphere = this.boundingSphere;
      if (boundingSphere !== null) {
        data.data.boundingSphere = {
          center: boundingSphere.center.toArray(),
          radius: boundingSphere.radius
        };
      }
      return data;
    },
    clone: function() {
      return new BufferGeometry().copy(this);
    },
    copy: function(source) {
      var name,
          i,
          l;
      this.index = null;
      this.attributes = {};
      this.morphAttributes = {};
      this.groups = [];
      this.boundingBox = null;
      this.boundingSphere = null;
      this.name = source.name;
      var index = source.index;
      if (index !== null) {
        this.setIndex(index.clone());
      }
      var attributes = source.attributes;
      for (name in attributes) {
        var attribute = attributes[name];
        this.addAttribute(name, attribute.clone());
      }
      var morphAttributes = source.morphAttributes;
      for (name in morphAttributes) {
        var array = [];
        var morphAttribute = morphAttributes[name];
        for (i = 0, l = morphAttribute.length; i < l; i++) {
          array.push(morphAttribute[i].clone());
        }
        this.morphAttributes[name] = array;
      }
      var groups = source.groups;
      for (i = 0, l = groups.length; i < l; i++) {
        var group = groups[i];
        this.addGroup(group.start, group.count, group.materialIndex);
      }
      var boundingBox = source.boundingBox;
      if (boundingBox !== null) {
        this.boundingBox = boundingBox.clone();
      }
      var boundingSphere = source.boundingSphere;
      if (boundingSphere !== null) {
        this.boundingSphere = boundingSphere.clone();
      }
      this.drawRange.start = source.drawRange.start;
      this.drawRange.count = source.drawRange.count;
      this.userData = source.userData;
      return this;
    },
    dispose: function() {
      this.dispatchEvent({type: 'dispose'});
    }
  });
  function BoxGeometry(width, height, depth, widthSegments, heightSegments, depthSegments) {
    Geometry.call(this);
    this.type = 'BoxGeometry';
    this.parameters = {
      width: width,
      height: height,
      depth: depth,
      widthSegments: widthSegments,
      heightSegments: heightSegments,
      depthSegments: depthSegments
    };
    this.fromBufferGeometry(new BoxBufferGeometry(width, height, depth, widthSegments, heightSegments, depthSegments));
    this.mergeVertices();
  }
  BoxGeometry.prototype = Object.create(Geometry.prototype);
  BoxGeometry.prototype.constructor = BoxGeometry;
  function BoxBufferGeometry(width, height, depth, widthSegments, heightSegments, depthSegments) {
    BufferGeometry.call(this);
    this.type = 'BoxBufferGeometry';
    this.parameters = {
      width: width,
      height: height,
      depth: depth,
      widthSegments: widthSegments,
      heightSegments: heightSegments,
      depthSegments: depthSegments
    };
    var scope = this;
    width = width || 1;
    height = height || 1;
    depth = depth || 1;
    widthSegments = Math.floor(widthSegments) || 1;
    heightSegments = Math.floor(heightSegments) || 1;
    depthSegments = Math.floor(depthSegments) || 1;
    var indices = [];
    var vertices = [];
    var normals = [];
    var uvs = [];
    var numberOfVertices = 0;
    var groupStart = 0;
    buildPlane('z', 'y', 'x', -1, -1, depth, height, width, depthSegments, heightSegments, 0);
    buildPlane('z', 'y', 'x', 1, -1, depth, height, -width, depthSegments, heightSegments, 1);
    buildPlane('x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2);
    buildPlane('x', 'z', 'y', 1, -1, width, depth, -height, widthSegments, depthSegments, 3);
    buildPlane('x', 'y', 'z', 1, -1, width, height, depth, widthSegments, heightSegments, 4);
    buildPlane('x', 'y', 'z', -1, -1, width, height, -depth, widthSegments, heightSegments, 5);
    this.setIndex(indices);
    this.addAttribute('position', new Float32BufferAttribute(vertices, 3));
    this.addAttribute('normal', new Float32BufferAttribute(normals, 3));
    this.addAttribute('uv', new Float32BufferAttribute(uvs, 2));
    function buildPlane(u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex) {
      var segmentWidth = width / gridX;
      var segmentHeight = height / gridY;
      var widthHalf = width / 2;
      var heightHalf = height / 2;
      var depthHalf = depth / 2;
      var gridX1 = gridX + 1;
      var gridY1 = gridY + 1;
      var vertexCounter = 0;
      var groupCount = 0;
      var ix,
          iy;
      var vector = new Vector3();
      for (iy = 0; iy < gridY1; iy++) {
        var y = iy * segmentHeight - heightHalf;
        for (ix = 0; ix < gridX1; ix++) {
          var x = ix * segmentWidth - widthHalf;
          vector[u] = x * udir;
          vector[v] = y * vdir;
          vector[w] = depthHalf;
          vertices.push(vector.x, vector.y, vector.z);
          vector[u] = 0;
          vector[v] = 0;
          vector[w] = depth > 0 ? 1 : -1;
          normals.push(vector.x, vector.y, vector.z);
          uvs.push(ix / gridX);
          uvs.push(1 - (iy / gridY));
          vertexCounter += 1;
        }
      }
      for (iy = 0; iy < gridY; iy++) {
        for (ix = 0; ix < gridX; ix++) {
          var a = numberOfVertices + ix + gridX1 * iy;
          var b = numberOfVertices + ix + gridX1 * (iy + 1);
          var c = numberOfVertices + (ix + 1) + gridX1 * (iy + 1);
          var d = numberOfVertices + (ix + 1) + gridX1 * iy;
          indices.push(a, b, d);
          indices.push(b, c, d);
          groupCount += 6;
        }
      }
      scope.addGroup(groupStart, groupCount, materialIndex);
      groupStart += groupCount;
      numberOfVertices += vertexCounter;
    }
  }
  BoxBufferGeometry.prototype = Object.create(BufferGeometry.prototype);
  BoxBufferGeometry.prototype.constructor = BoxBufferGeometry;
  function PlaneGeometry(width, height, widthSegments, heightSegments) {
    Geometry.call(this);
    this.type = 'PlaneGeometry';
    this.parameters = {
      width: width,
      height: height,
      widthSegments: widthSegments,
      heightSegments: heightSegments
    };
    this.fromBufferGeometry(new PlaneBufferGeometry(width, height, widthSegments, heightSegments));
    this.mergeVertices();
  }
  PlaneGeometry.prototype = Object.create(Geometry.prototype);
  PlaneGeometry.prototype.constructor = PlaneGeometry;
  function PlaneBufferGeometry(width, height, widthSegments, heightSegments) {
    BufferGeometry.call(this);
    this.type = 'PlaneBufferGeometry';
    this.parameters = {
      width: width,
      height: height,
      widthSegments: widthSegments,
      heightSegments: heightSegments
    };
    width = width || 1;
    height = height || 1;
    var width_half = width / 2;
    var height_half = height / 2;
    var gridX = Math.floor(widthSegments) || 1;
    var gridY = Math.floor(heightSegments) || 1;
    var gridX1 = gridX + 1;
    var gridY1 = gridY + 1;
    var segment_width = width / gridX;
    var segment_height = height / gridY;
    var ix,
        iy;
    var indices = [];
    var vertices = [];
    var normals = [];
    var uvs = [];
    for (iy = 0; iy < gridY1; iy++) {
      var y = iy * segment_height - height_half;
      for (ix = 0; ix < gridX1; ix++) {
        var x = ix * segment_width - width_half;
        vertices.push(x, -y, 0);
        normals.push(0, 0, 1);
        uvs.push(ix / gridX);
        uvs.push(1 - (iy / gridY));
      }
    }
    for (iy = 0; iy < gridY; iy++) {
      for (ix = 0; ix < gridX; ix++) {
        var a = ix + gridX1 * iy;
        var b = ix + gridX1 * (iy + 1);
        var c = (ix + 1) + gridX1 * (iy + 1);
        var d = (ix + 1) + gridX1 * iy;
        indices.push(a, b, d);
        indices.push(b, c, d);
      }
    }
    this.setIndex(indices);
    this.addAttribute('position', new Float32BufferAttribute(vertices, 3));
    this.addAttribute('normal', new Float32BufferAttribute(normals, 3));
    this.addAttribute('uv', new Float32BufferAttribute(uvs, 2));
  }
  PlaneBufferGeometry.prototype = Object.create(BufferGeometry.prototype);
  PlaneBufferGeometry.prototype.constructor = PlaneBufferGeometry;
  var materialId = 0;
  function Material() {
    Object.defineProperty(this, 'id', {value: materialId++});
    this.uuid = _Math.generateUUID();
    this.name = '';
    this.type = 'Material';
    this.fog = true;
    this.lights = true;
    this.blending = NormalBlending;
    this.side = FrontSide;
    this.flatShading = false;
    this.vertexTangents = false;
    this.vertexColors = NoColors;
    this.opacity = 1;
    this.transparent = false;
    this.blendSrc = SrcAlphaFactor;
    this.blendDst = OneMinusSrcAlphaFactor;
    this.blendEquation = AddEquation;
    this.blendSrcAlpha = null;
    this.blendDstAlpha = null;
    this.blendEquationAlpha = null;
    this.depthFunc = LessEqualDepth;
    this.depthTest = true;
    this.depthWrite = true;
    this.clippingPlanes = null;
    this.clipIntersection = false;
    this.clipShadows = false;
    this.shadowSide = null;
    this.colorWrite = true;
    this.precision = null;
    this.polygonOffset = false;
    this.polygonOffsetFactor = 0;
    this.polygonOffsetUnits = 0;
    this.dithering = false;
    this.alphaTest = 0;
    this.premultipliedAlpha = false;
    this.visible = true;
    this.userData = {};
    this.needsUpdate = true;
  }
  Material.prototype = Object.assign(Object.create(EventDispatcher.prototype), {
    constructor: Material,
    isMaterial: true,
    onBeforeCompile: function() {},
    setValues: function(values) {
      if (values === undefined)
        return;
      for (var key in values) {
        var newValue = values[key];
        if (newValue === undefined) {
          console.warn("THREE.Material: '" + key + "' parameter is undefined.");
          continue;
        }
        if (key === 'shading') {
          console.warn('THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.');
          this.flatShading = (newValue === FlatShading) ? true : false;
          continue;
        }
        var currentValue = this[key];
        if (currentValue === undefined) {
          console.warn("THREE." + this.type + ": '" + key + "' is not a property of this material.");
          continue;
        }
        if (currentValue && currentValue.isColor) {
          currentValue.set(newValue);
        } else if ((currentValue && currentValue.isVector3) && (newValue && newValue.isVector3)) {
          currentValue.copy(newValue);
        } else {
          this[key] = newValue;
        }
      }
    },
    toJSON: function(meta) {
      var isRoot = (meta === undefined || typeof meta === 'string');
      if (isRoot) {
        meta = {
          textures: {},
          images: {}
        };
      }
      var data = {metadata: {
          version: 4.5,
          type: 'Material',
          generator: 'Material.toJSON'
        }};
      data.uuid = this.uuid;
      data.type = this.type;
      if (this.name !== '')
        data.name = this.name;
      if (this.color && this.color.isColor)
        data.color = this.color.getHex();
      if (this.roughness !== undefined)
        data.roughness = this.roughness;
      if (this.metalness !== undefined)
        data.metalness = this.metalness;
      if (this.emissive && this.emissive.isColor)
        data.emissive = this.emissive.getHex();
      if (this.emissiveIntensity !== 1)
        data.emissiveIntensity = this.emissiveIntensity;
      if (this.specular && this.specular.isColor)
        data.specular = this.specular.getHex();
      if (this.shininess !== undefined)
        data.shininess = this.shininess;
      if (this.clearCoat !== undefined)
        data.clearCoat = this.clearCoat;
      if (this.clearCoatRoughness !== undefined)
        data.clearCoatRoughness = this.clearCoatRoughness;
      if (this.map && this.map.isTexture)
        data.map = this.map.toJSON(meta).uuid;
      if (this.alphaMap && this.alphaMap.isTexture)
        data.alphaMap = this.alphaMap.toJSON(meta).uuid;
      if (this.lightMap && this.lightMap.isTexture)
        data.lightMap = this.lightMap.toJSON(meta).uuid;
      if (this.aoMap && this.aoMap.isTexture) {
        data.aoMap = this.aoMap.toJSON(meta).uuid;
        data.aoMapIntensity = this.aoMapIntensity;
      }
      if (this.bumpMap && this.bumpMap.isTexture) {
        data.bumpMap = this.bumpMap.toJSON(meta).uuid;
        data.bumpScale = this.bumpScale;
      }
      if (this.normalMap && this.normalMap.isTexture) {
        data.normalMap = this.normalMap.toJSON(meta).uuid;
        data.normalMapType = this.normalMapType;
        data.normalScale = this.normalScale.toArray();
      }
      if (this.displacementMap && this.displacementMap.isTexture) {
        data.displacementMap = this.displacementMap.toJSON(meta).uuid;
        data.displacementScale = this.displacementScale;
        data.displacementBias = this.displacementBias;
      }
      if (this.roughnessMap && this.roughnessMap.isTexture)
        data.roughnessMap = this.roughnessMap.toJSON(meta).uuid;
      if (this.metalnessMap && this.metalnessMap.isTexture)
        data.metalnessMap = this.metalnessMap.toJSON(meta).uuid;
      if (this.emissiveMap && this.emissiveMap.isTexture)
        data.emissiveMap = this.emissiveMap.toJSON(meta).uuid;
      if (this.specularMap && this.specularMap.isTexture)
        data.specularMap = this.specularMap.toJSON(meta).uuid;
      if (this.envMap && this.envMap.isTexture) {
        data.envMap = this.envMap.toJSON(meta).uuid;
        data.reflectivity = this.reflectivity;
        if (this.combine !== undefined)
          data.combine = this.combine;
        if (this.envMapIntensity !== undefined)
          data.envMapIntensity = this.envMapIntensity;
      }
      if (this.gradientMap && this.gradientMap.isTexture) {
        data.gradientMap = this.gradientMap.toJSON(meta).uuid;
      }
      if (this.size !== undefined)
        data.size = this.size;
      if (this.sizeAttenuation !== undefined)
        data.sizeAttenuation = this.sizeAttenuation;
      if (this.blending !== NormalBlending)
        data.blending = this.blending;
      if (this.flatShading === true)
        data.flatShading = this.flatShading;
      if (this.side !== FrontSide)
        data.side = this.side;
      if (this.vertexColors !== NoColors)
        data.vertexColors = this.vertexColors;
      if (this.opacity < 1)
        data.opacity = this.opacity;
      if (this.transparent === true)
        data.transparent = this.transparent;
      data.depthFunc = this.depthFunc;
      data.depthTest = this.depthTest;
      data.depthWrite = this.depthWrite;
      if (this.rotation !== 0)
        data.rotation = this.rotation;
      if (this.polygonOffset === true)
        data.polygonOffset = true;
      if (this.polygonOffsetFactor !== 0)
        data.polygonOffsetFactor = this.polygonOffsetFactor;
      if (this.polygonOffsetUnits !== 0)
        data.polygonOffsetUnits = this.polygonOffsetUnits;
      if (this.linewidth !== 1)
        data.linewidth = this.linewidth;
      if (this.dashSize !== undefined)
        data.dashSize = this.dashSize;
      if (this.gapSize !== undefined)
        data.gapSize = this.gapSize;
      if (this.scale !== undefined)
        data.scale = this.scale;
      if (this.dithering === true)
        data.dithering = true;
      if (this.alphaTest > 0)
        data.alphaTest = this.alphaTest;
      if (this.premultipliedAlpha === true)
        data.premultipliedAlpha = this.premultipliedAlpha;
      if (this.wireframe === true)
        data.wireframe = this.wireframe;
      if (this.wireframeLinewidth > 1)
        data.wireframeLinewidth = this.wireframeLinewidth;
      if (this.wireframeLinecap !== 'round')
        data.wireframeLinecap = this.wireframeLinecap;
      if (this.wireframeLinejoin !== 'round')
        data.wireframeLinejoin = this.wireframeLinejoin;
      if (this.morphTargets === true)
        data.morphTargets = true;
      if (this.skinning === true)
        data.skinning = true;
      if (this.visible === false)
        data.visible = false;
      if (JSON.stringify(this.userData) !== '{}')
        data.userData = this.userData;
      function extractFromCache(cache) {
        var values = [];
        for (var key in cache) {
          var data = cache[key];
          delete data.metadata;
          values.push(data);
        }
        return values;
      }
      if (isRoot) {
        var textures = extractFromCache(meta.textures);
        var images = extractFromCache(meta.images);
        if (textures.length > 0)
          data.textures = textures;
        if (images.length > 0)
          data.images = images;
      }
      return data;
    },
    clone: function() {
      return new this.constructor().copy(this);
    },
    copy: function(source) {
      this.name = source.name;
      this.fog = source.fog;
      this.lights = source.lights;
      this.blending = source.blending;
      this.side = source.side;
      this.flatShading = source.flatShading;
      this.vertexColors = source.vertexColors;
      this.opacity = source.opacity;
      this.transparent = source.transparent;
      this.blendSrc = source.blendSrc;
      this.blendDst = source.blendDst;
      this.blendEquation = source.blendEquation;
      this.blendSrcAlpha = source.blendSrcAlpha;
      this.blendDstAlpha = source.blendDstAlpha;
      this.blendEquationAlpha = source.blendEquationAlpha;
      this.depthFunc = source.depthFunc;
      this.depthTest = source.depthTest;
      this.depthWrite = source.depthWrite;
      this.colorWrite = source.colorWrite;
      this.precision = source.precision;
      this.polygonOffset = source.polygonOffset;
      this.polygonOffsetFactor = source.polygonOffsetFactor;
      this.polygonOffsetUnits = source.polygonOffsetUnits;
      this.dithering = source.dithering;
      this.alphaTest = source.alphaTest;
      this.premultipliedAlpha = source.premultipliedAlpha;
      this.visible = source.visible;
      this.userData = JSON.parse(JSON.stringify(source.userData));
      this.clipShadows = source.clipShadows;
      this.clipIntersection = source.clipIntersection;
      var srcPlanes = source.clippingPlanes,
          dstPlanes = null;
      if (srcPlanes !== null) {
        var n = srcPlanes.length;
        dstPlanes = new Array(n);
        for (var i = 0; i !== n; ++i)
          dstPlanes[i] = srcPlanes[i].clone();
      }
      this.clippingPlanes = dstPlanes;
      this.shadowSide = source.shadowSide;
      return this;
    },
    dispose: function() {
      this.dispatchEvent({type: 'dispose'});
    }
  });
  var default_vertex = "void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}";
  var default_fragment = "void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}";
  function ShaderMaterial(parameters) {
    Material.call(this);
    this.type = 'ShaderMaterial';
    this.defines = {};
    this.uniforms = {};
    this.vertexShader = default_vertex;
    this.fragmentShader = default_fragment;
    this.linewidth = 1;
    this.wireframe = false;
    this.wireframeLinewidth = 1;
    this.fog = false;
    this.lights = false;
    this.clipping = false;
    this.skinning = false;
    this.morphTargets = false;
    this.morphNormals = false;
    this.extensions = {
      derivatives: false,
      fragDepth: false,
      drawBuffers: false,
      shaderTextureLOD: false
    };
    this.defaultAttributeValues = {
      'color': [1, 1, 1],
      'uv': [0, 0],
      'uv2': [0, 0]
    };
    this.index0AttributeName = undefined;
    this.uniformsNeedUpdate = false;
    if (parameters !== undefined) {
      if (parameters.attributes !== undefined) {
        console.error('THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.');
      }
      this.setValues(parameters);
    }
  }
  ShaderMaterial.prototype = Object.create(Material.prototype);
  ShaderMaterial.prototype.constructor = ShaderMaterial;
  ShaderMaterial.prototype.isShaderMaterial = true;
  ShaderMaterial.prototype.copy = function(source) {
    Material.prototype.copy.call(this, source);
    this.fragmentShader = source.fragmentShader;
    this.vertexShader = source.vertexShader;
    this.uniforms = cloneUniforms(source.uniforms);
    this.defines = Object.assign({}, source.defines);
    this.wireframe = source.wireframe;
    this.wireframeLinewidth = source.wireframeLinewidth;
    this.lights = source.lights;
    this.clipping = source.clipping;
    this.skinning = source.skinning;
    this.morphTargets = source.morphTargets;
    this.morphNormals = source.morphNormals;
    this.extensions = source.extensions;
    return this;
  };
  ShaderMaterial.prototype.toJSON = function(meta) {
    var data = Material.prototype.toJSON.call(this, meta);
    data.uniforms = {};
    for (var name in this.uniforms) {
      var uniform = this.uniforms[name];
      var value = uniform.value;
      if (value && value.isTexture) {
        data.uniforms[name] = {
          type: 't',
          value: value.toJSON(meta).uuid
        };
      } else if (value && value.isColor) {
        data.uniforms[name] = {
          type: 'c',
          value: value.getHex()
        };
      } else if (value && value.isVector2) {
        data.uniforms[name] = {
          type: 'v2',
          value: value.toArray()
        };
      } else if (value && value.isVector3) {
        data.uniforms[name] = {
          type: 'v3',
          value: value.toArray()
        };
      } else if (value && value.isVector4) {
        data.uniforms[name] = {
          type: 'v4',
          value: value.toArray()
        };
      } else if (value && value.isMatrix3) {
        data.uniforms[name] = {
          type: 'm3',
          value: value.toArray()
        };
      } else if (value && value.isMatrix4) {
        data.uniforms[name] = {
          type: 'm4',
          value: value.toArray()
        };
      } else {
        data.uniforms[name] = {value: value};
      }
    }
    if (Object.keys(this.defines).length > 0)
      data.defines = this.defines;
    data.vertexShader = this.vertexShader;
    data.fragmentShader = this.fragmentShader;
    var extensions = {};
    for (var key in this.extensions) {
      if (this.extensions[key] === true)
        extensions[key] = true;
    }
    if (Object.keys(extensions).length > 0)
      data.extensions = extensions;
    return data;
  };
  function Ray(origin, direction) {
    this.origin = (origin !== undefined) ? origin : new Vector3();
    this.direction = (direction !== undefined) ? direction : new Vector3();
  }
  Object.assign(Ray.prototype, {
    set: function(origin, direction) {
      this.origin.copy(origin);
      this.direction.copy(direction);
      return this;
    },
    clone: function() {
      return new this.constructor().copy(this);
    },
    copy: function(ray) {
      this.origin.copy(ray.origin);
      this.direction.copy(ray.direction);
      return this;
    },
    at: function(t, target) {
      if (target === undefined) {
        console.warn('THREE.Ray: .at() target is now required');
        target = new Vector3();
      }
      return target.copy(this.direction).multiplyScalar(t).add(this.origin);
    },
    lookAt: function(v) {
      this.direction.copy(v).sub(this.origin).normalize();
      return this;
    },
    recast: function() {
      var v1 = new Vector3();
      return function recast(t) {
        this.origin.copy(this.at(t, v1));
        return this;
      };
    }(),
    closestPointToPoint: function(point, target) {
      if (target === undefined) {
        console.warn('THREE.Ray: .closestPointToPoint() target is now required');
        target = new Vector3();
      }
      target.subVectors(point, this.origin);
      var directionDistance = target.dot(this.direction);
      if (directionDistance < 0) {
        return target.copy(this.origin);
      }
      return target.copy(this.direction).multiplyScalar(directionDistance).add(this.origin);
    },
    distanceToPoint: function(point) {
      return Math.sqrt(this.distanceSqToPoint(point));
    },
    distanceSqToPoint: function() {
      var v1 = new Vector3();
      return function distanceSqToPoint(point) {
        var directionDistance = v1.subVectors(point, this.origin).dot(this.direction);
        if (directionDistance < 0) {
          return this.origin.distanceToSquared(point);
        }
        v1.copy(this.direction).multiplyScalar(directionDistance).add(this.origin);
        return v1.distanceToSquared(point);
      };
    }(),
    distanceSqToSegment: function() {
      var segCenter = new Vector3();
      var segDir = new Vector3();
      var diff = new Vector3();
      return function distanceSqToSegment(v0, v1, optionalPointOnRay, optionalPointOnSegment) {
        segCenter.copy(v0).add(v1).multiplyScalar(0.5);
        segDir.copy(v1).sub(v0).normalize();
        diff.copy(this.origin).sub(segCenter);
        var segExtent = v0.distanceTo(v1) * 0.5;
        var a01 = -this.direction.dot(segDir);
        var b0 = diff.dot(this.direction);
        var b1 = -diff.dot(segDir);
        var c = diff.lengthSq();
        var det = Math.abs(1 - a01 * a01);
        var s0,
            s1,
            sqrDist,
            extDet;
        if (det > 0) {
          s0 = a01 * b1 - b0;
          s1 = a01 * b0 - b1;
          extDet = segExtent * det;
          if (s0 >= 0) {
            if (s1 >= -extDet) {
              if (s1 <= extDet) {
                var invDet = 1 / det;
                s0 *= invDet;
                s1 *= invDet;
                sqrDist = s0 * (s0 + a01 * s1 + 2 * b0) + s1 * (a01 * s0 + s1 + 2 * b1) + c;
              } else {
                s1 = segExtent;
                s0 = Math.max(0, -(a01 * s1 + b0));
                sqrDist = -s0 * s0 + s1 * (s1 + 2 * b1) + c;
              }
            } else {
              s1 = -segExtent;
              s0 = Math.max(0, -(a01 * s1 + b0));
              sqrDist = -s0 * s0 + s1 * (s1 + 2 * b1) + c;
            }
          } else {
            if (s1 <= -extDet) {
              s0 = Math.max(0, -(-a01 * segExtent + b0));
              s1 = (s0 > 0) ? -segExtent : Math.min(Math.max(-segExtent, -b1), segExtent);
              sqrDist = -s0 * s0 + s1 * (s1 + 2 * b1) + c;
            } else if (s1 <= extDet) {
              s0 = 0;
              s1 = Math.min(Math.max(-segExtent, -b1), segExtent);
              sqrDist = s1 * (s1 + 2 * b1) + c;
            } else {
              s0 = Math.max(0, -(a01 * segExtent + b0));
              s1 = (s0 > 0) ? segExtent : Math.min(Math.max(-segExtent, -b1), segExtent);
              sqrDist = -s0 * s0 + s1 * (s1 + 2 * b1) + c;
            }
          }
        } else {
          s1 = (a01 > 0) ? -segExtent : segExtent;
          s0 = Math.max(0, -(a01 * s1 + b0));
          sqrDist = -s0 * s0 + s1 * (s1 + 2 * b1) + c;
        }
        if (optionalPointOnRay) {
          optionalPointOnRay.copy(this.direction).multiplyScalar(s0).add(this.origin);
        }
        if (optionalPointOnSegment) {
          optionalPointOnSegment.copy(segDir).multiplyScalar(s1).add(segCenter);
        }
        return sqrDist;
      };
    }(),
    intersectSphere: function() {
      var v1 = new Vector3();
      return function intersectSphere(sphere, target) {
        v1.subVectors(sphere.center, this.origin);
        var tca = v1.dot(this.direction);
        var d2 = v1.dot(v1) - tca * tca;
        var radius2 = sphere.radius * sphere.radius;
        if (d2 > radius2)
          return null;
        var thc = Math.sqrt(radius2 - d2);
        var t0 = tca - thc;
        var t1 = tca + thc;
        if (t0 < 0 && t1 < 0)
          return null;
        if (t0 < 0)
          return this.at(t1, target);
        return this.at(t0, target);
      };
    }(),
    intersectsSphere: function(sphere) {
      return this.distanceSqToPoint(sphere.center) <= (sphere.radius * sphere.radius);
    },
    distanceToPlane: function(plane) {
      var denominator = plane.normal.dot(this.direction);
      if (denominator === 0) {
        if (plane.distanceToPoint(this.origin) === 0) {
          return 0;
        }
        return null;
      }
      var t = -(this.origin.dot(plane.normal) + plane.constant) / denominator;
      return t >= 0 ? t : null;
    },
    intersectPlane: function(plane, target) {
      var t = this.distanceToPlane(plane);
      if (t === null) {
        return null;
      }
      return this.at(t, target);
    },
    intersectsPlane: function(plane) {
      var distToPoint = plane.distanceToPoint(this.origin);
      if (distToPoint === 0) {
        return true;
      }
      var denominator = plane.normal.dot(this.direction);
      if (denominator * distToPoint < 0) {
        return true;
      }
      return false;
    },
    intersectBox: function(box, target) {
      var tmin,
          tmax,
          tymin,
          tymax,
          tzmin,
          tzmax;
      var invdirx = 1 / this.direction.x,
          invdiry = 1 / this.direction.y,
          invdirz = 1 / this.direction.z;
      var origin = this.origin;
      if (invdirx >= 0) {
        tmin = (box.min.x - origin.x) * invdirx;
        tmax = (box.max.x - origin.x) * invdirx;
      } else {
        tmin = (box.max.x - origin.x) * invdirx;
        tmax = (box.min.x - origin.x) * invdirx;
      }
      if (invdiry >= 0) {
        tymin = (box.min.y - origin.y) * invdiry;
        tymax = (box.max.y - origin.y) * invdiry;
      } else {
        tymin = (box.max.y - origin.y) * invdiry;
        tymax = (box.min.y - origin.y) * invdiry;
      }
      if ((tmin > tymax) || (tymin > tmax))
        return null;
      if (tymin > tmin || tmin !== tmin)
        tmin = tymin;
      if (tymax < tmax || tmax !== tmax)
        tmax = tymax;
      if (invdirz >= 0) {
        tzmin = (box.min.z - origin.z) * invdirz;
        tzmax = (box.max.z - origin.z) * invdirz;
      } else {
        tzmin = (box.max.z - origin.z) * invdirz;
        tzmax = (box.min.z - origin.z) * invdirz;
      }
      if ((tmin > tzmax) || (tzmin > tmax))
        return null;
      if (tzmin > tmin || tmin !== tmin)
        tmin = tzmin;
      if (tzmax < tmax || tmax !== tmax)
        tmax = tzmax;
      if (tmax < 0)
        return null;
      return this.at(tmin >= 0 ? tmin : tmax, target);
    },
    intersectsBox: (function() {
      var v = new Vector3();
      return function intersectsBox(box) {
        return this.intersectBox(box, v) !== null;
      };
    })(),
    intersectTriangle: function() {
      var diff = new Vector3();
      var edge1 = new Vector3();
      var edge2 = new Vector3();
      var normal = new Vector3();
      return function intersectTriangle(a, b, c, backfaceCulling, target) {
        edge1.subVectors(b, a);
        edge2.subVectors(c, a);
        normal.crossVectors(edge1, edge2);
        var DdN = this.direction.dot(normal);
        var sign;
        if (DdN > 0) {
          if (backfaceCulling)
            return null;
          sign = 1;
        } else if (DdN < 0) {
          sign = -1;
          DdN = -DdN;
        } else {
          return null;
        }
        diff.subVectors(this.origin, a);
        var DdQxE2 = sign * this.direction.dot(edge2.crossVectors(diff, edge2));
        if (DdQxE2 < 0) {
          return null;
        }
        var DdE1xQ = sign * this.direction.dot(edge1.cross(diff));
        if (DdE1xQ < 0) {
          return null;
        }
        if (DdQxE2 + DdE1xQ > DdN) {
          return null;
        }
        var QdN = -sign * diff.dot(normal);
        if (QdN < 0) {
          return null;
        }
        return this.at(QdN / DdN, target);
      };
    }(),
    applyMatrix4: function(matrix4) {
      this.origin.applyMatrix4(matrix4);
      this.direction.transformDirection(matrix4);
      return this;
    },
    equals: function(ray) {
      return ray.origin.equals(this.origin) && ray.direction.equals(this.direction);
    }
  });
  function Triangle(a, b, c) {
    this.a = (a !== undefined) ? a : new Vector3();
    this.b = (b !== undefined) ? b : new Vector3();
    this.c = (c !== undefined) ? c : new Vector3();
  }
  Object.assign(Triangle, {
    getNormal: function() {
      var v0 = new Vector3();
      return function getNormal(a, b, c, target) {
        if (target === undefined) {
          console.warn('THREE.Triangle: .getNormal() target is now required');
          target = new Vector3();
        }
        target.subVectors(c, b);
        v0.subVectors(a, b);
        target.cross(v0);
        var targetLengthSq = target.lengthSq();
        if (targetLengthSq > 0) {
          return target.multiplyScalar(1 / Math.sqrt(targetLengthSq));
        }
        return target.set(0, 0, 0);
      };
    }(),
    getBarycoord: function() {
      var v0 = new Vector3();
      var v1 = new Vector3();
      var v2 = new Vector3();
      return function getBarycoord(point, a, b, c, target) {
        v0.subVectors(c, a);
        v1.subVectors(b, a);
        v2.subVectors(point, a);
        var dot00 = v0.dot(v0);
        var dot01 = v0.dot(v1);
        var dot02 = v0.dot(v2);
        var dot11 = v1.dot(v1);
        var dot12 = v1.dot(v2);
        var denom = (dot00 * dot11 - dot01 * dot01);
        if (target === undefined) {
          console.warn('THREE.Triangle: .getBarycoord() target is now required');
          target = new Vector3();
        }
        if (denom === 0) {
          return target.set(-2, -1, -1);
        }
        var invDenom = 1 / denom;
        var u = (dot11 * dot02 - dot01 * dot12) * invDenom;
        var v = (dot00 * dot12 - dot01 * dot02) * invDenom;
        return target.set(1 - u - v, v, u);
      };
    }(),
    containsPoint: function() {
      var v1 = new Vector3();
      return function containsPoint(point, a, b, c) {
        Triangle.getBarycoord(point, a, b, c, v1);
        return (v1.x >= 0) && (v1.y >= 0) && ((v1.x + v1.y) <= 1);
      };
    }(),
    getUV: function() {
      var barycoord = new Vector3();
      return function getUV(point, p1, p2, p3, uv1, uv2, uv3, target) {
        this.getBarycoord(point, p1, p2, p3, barycoord);
        target.set(0, 0);
        target.addScaledVector(uv1, barycoord.x);
        target.addScaledVector(uv2, barycoord.y);
        target.addScaledVector(uv3, barycoord.z);
        return target;
      };
    }()
  });
  Object.assign(Triangle.prototype, {
    set: function(a, b, c) {
      this.a.copy(a);
      this.b.copy(b);
      this.c.copy(c);
      return this;
    },
    setFromPointsAndIndices: function(points, i0, i1, i2) {
      this.a.copy(points[i0]);
      this.b.copy(points[i1]);
      this.c.copy(points[i2]);
      return this;
    },
    clone: function() {
      return new this.constructor().copy(this);
    },
    copy: function(triangle) {
      this.a.copy(triangle.a);
      this.b.copy(triangle.b);
      this.c.copy(triangle.c);
      return this;
    },
    getArea: function() {
      var v0 = new Vector3();
      var v1 = new Vector3();
      return function getArea() {
        v0.subVectors(this.c, this.b);
        v1.subVectors(this.a, this.b);
        return v0.cross(v1).length() * 0.5;
      };
    }(),
    getMidpoint: function(target) {
      if (target === undefined) {
        console.warn('THREE.Triangle: .getMidpoint() target is now required');
        target = new Vector3();
      }
      return target.addVectors(this.a, this.b).add(this.c).multiplyScalar(1 / 3);
    },
    getNormal: function(target) {
      return Triangle.getNormal(this.a, this.b, this.c, target);
    },
    getPlane: function(target) {
      if (target === undefined) {
        console.warn('THREE.Triangle: .getPlane() target is now required');
        target = new Vector3();
      }
      return target.setFromCoplanarPoints(this.a, this.b, this.c);
    },
    getBarycoord: function(point, target) {
      return Triangle.getBarycoord(point, this.a, this.b, this.c, target);
    },
    containsPoint: function(point) {
      return Triangle.containsPoint(point, this.a, this.b, this.c);
    },
    getUV: function(point, uv1, uv2, uv3, result) {
      return Triangle.getUV(point, this.a, this.b, this.c, uv1, uv2, uv3, result);
    },
    intersectsBox: function(box) {
      return box.intersectsTriangle(this);
    },
    closestPointToPoint: function() {
      var vab = new Vector3();
      var vac = new Vector3();
      var vbc = new Vector3();
      var vap = new Vector3();
      var vbp = new Vector3();
      var vcp = new Vector3();
      return function closestPointToPoint(p, target) {
        if (target === undefined) {
          console.warn('THREE.Triangle: .closestPointToPoint() target is now required');
          target = new Vector3();
        }
        var a = this.a,
            b = this.b,
            c = this.c;
        var v,
            w;
        vab.subVectors(b, a);
        vac.subVectors(c, a);
        vap.subVectors(p, a);
        var d1 = vab.dot(vap);
        var d2 = vac.dot(vap);
        if (d1 <= 0 && d2 <= 0) {
          return target.copy(a);
        }
        vbp.subVectors(p, b);
        var d3 = vab.dot(vbp);
        var d4 = vac.dot(vbp);
        if (d3 >= 0 && d4 <= d3) {
          return target.copy(b);
        }
        var vc = d1 * d4 - d3 * d2;
        if (vc <= 0 && d1 >= 0 && d3 <= 0) {
          v = d1 / (d1 - d3);
          return target.copy(a).addScaledVector(vab, v);
        }
        vcp.subVectors(p, c);
        var d5 = vab.dot(vcp);
        var d6 = vac.dot(vcp);
        if (d6 >= 0 && d5 <= d6) {
          return target.copy(c);
        }
        var vb = d5 * d2 - d1 * d6;
        if (vb <= 0 && d2 >= 0 && d6 <= 0) {
          w = d2 / (d2 - d6);
          return target.copy(a).addScaledVector(vac, w);
        }
        var va = d3 * d6 - d5 * d4;
        if (va <= 0 && (d4 - d3) >= 0 && (d5 - d6) >= 0) {
          vbc.subVectors(c, b);
          w = (d4 - d3) / ((d4 - d3) + (d5 - d6));
          return target.copy(b).addScaledVector(vbc, w);
        }
        var denom = 1 / (va + vb + vc);
        v = vb * denom;
        w = vc * denom;
        return target.copy(a).addScaledVector(vab, v).addScaledVector(vac, w);
      };
    }(),
    equals: function(triangle) {
      return triangle.a.equals(this.a) && triangle.b.equals(this.b) && triangle.c.equals(this.c);
    }
  });
  function MeshBasicMaterial(parameters) {
    Material.call(this);
    this.type = 'MeshBasicMaterial';
    this.color = new Color(0xffffff);
    this.map = null;
    this.lightMap = null;
    this.lightMapIntensity = 1.0;
    this.aoMap = null;
    this.aoMapIntensity = 1.0;
    this.specularMap = null;
    this.alphaMap = null;
    this.envMap = null;
    this.combine = MultiplyOperation;
    this.reflectivity = 1;
    this.refractionRatio = 0.98;
    this.wireframe = false;
    this.wireframeLinewidth = 1;
    this.wireframeLinecap = 'round';
    this.wireframeLinejoin = 'round';
    this.skinning = false;
    this.morphTargets = false;
    this.lights = false;
    this.setValues(parameters);
  }
  MeshBasicMaterial.prototype = Object.create(Material.prototype);
  MeshBasicMaterial.prototype.constructor = MeshBasicMaterial;
  MeshBasicMaterial.prototype.isMeshBasicMaterial = true;
  MeshBasicMaterial.prototype.copy = function(source) {
    Material.prototype.copy.call(this, source);
    this.color.copy(source.color);
    this.map = source.map;
    this.lightMap = source.lightMap;
    this.lightMapIntensity = source.lightMapIntensity;
    this.aoMap = source.aoMap;
    this.aoMapIntensity = source.aoMapIntensity;
    this.specularMap = source.specularMap;
    this.alphaMap = source.alphaMap;
    this.envMap = source.envMap;
    this.combine = source.combine;
    this.reflectivity = source.reflectivity;
    this.refractionRatio = source.refractionRatio;
    this.wireframe = source.wireframe;
    this.wireframeLinewidth = source.wireframeLinewidth;
    this.wireframeLinecap = source.wireframeLinecap;
    this.wireframeLinejoin = source.wireframeLinejoin;
    this.skinning = source.skinning;
    this.morphTargets = source.morphTargets;
    return this;
  };
  function Mesh(geometry, material) {
    Object3D.call(this);
    this.type = 'Mesh';
    this.geometry = geometry !== undefined ? geometry : new BufferGeometry();
    this.material = material !== undefined ? material : new MeshBasicMaterial({color: Math.random() * 0xffffff});
    this.drawMode = TrianglesDrawMode;
    this.updateMorphTargets();
  }
  Mesh.prototype = Object.assign(Object.create(Object3D.prototype), {
    constructor: Mesh,
    isMesh: true,
    setDrawMode: function(value) {
      this.drawMode = value;
    },
    copy: function(source) {
      Object3D.prototype.copy.call(this, source);
      this.drawMode = source.drawMode;
      if (source.morphTargetInfluences !== undefined) {
        this.morphTargetInfluences = source.morphTargetInfluences.slice();
      }
      if (source.morphTargetDictionary !== undefined) {
        this.morphTargetDictionary = Object.assign({}, source.morphTargetDictionary);
      }
      return this;
    },
    updateMorphTargets: function() {
      var geometry = this.geometry;
      var m,
          ml,
          name;
      if (geometry.isBufferGeometry) {
        var morphAttributes = geometry.morphAttributes;
        var keys = Object.keys(morphAttributes);
        if (keys.length > 0) {
          var morphAttribute = morphAttributes[keys[0]];
          if (morphAttribute !== undefined) {
            this.morphTargetInfluences = [];
            this.morphTargetDictionary = {};
            for (m = 0, ml = morphAttribute.length; m < ml; m++) {
              name = morphAttribute[m].name || String(m);
              this.morphTargetInfluences.push(0);
              this.morphTargetDictionary[name] = m;
            }
          }
        }
      } else {
        var morphTargets = geometry.morphTargets;
        if (morphTargets !== undefined && morphTargets.length > 0) {
          console.error('THREE.Mesh.updateMorphTargets() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.');
        }
      }
    },
    raycast: (function() {
      var inverseMatrix = new Matrix4();
      var ray = new Ray();
      var sphere = new Sphere();
      var vA = new Vector3();
      var vB = new Vector3();
      var vC = new Vector3();
      var tempA = new Vector3();
      var tempB = new Vector3();
      var tempC = new Vector3();
      var uvA = new Vector2();
      var uvB = new Vector2();
      var uvC = new Vector2();
      var intersectionPoint = new Vector3();
      var intersectionPointWorld = new Vector3();
      function checkIntersection(object, material, raycaster, ray, pA, pB, pC, point) {
        var intersect;
        if (material.side === BackSide) {
          intersect = ray.intersectTriangle(pC, pB, pA, true, point);
        } else {
          intersect = ray.intersectTriangle(pA, pB, pC, material.side !== DoubleSide, point);
        }
        if (intersect === null)
          return null;
        intersectionPointWorld.copy(point);
        intersectionPointWorld.applyMatrix4(object.matrixWorld);
        var distance = raycaster.ray.origin.distanceTo(intersectionPointWorld);
        if (distance < raycaster.near || distance > raycaster.far)
          return null;
        return {
          distance: distance,
          point: intersectionPointWorld.clone(),
          object: object
        };
      }
      function checkBufferGeometryIntersection(object, material, raycaster, ray, position, uv, a, b, c) {
        vA.fromBufferAttribute(position, a);
        vB.fromBufferAttribute(position, b);
        vC.fromBufferAttribute(position, c);
        var intersection = checkIntersection(object, material, raycaster, ray, vA, vB, vC, intersectionPoint);
        if (intersection) {
          if (uv) {
            uvA.fromBufferAttribute(uv, a);
            uvB.fromBufferAttribute(uv, b);
            uvC.fromBufferAttribute(uv, c);
            intersection.uv = Triangle.getUV(intersectionPoint, vA, vB, vC, uvA, uvB, uvC, new Vector2());
          }
          var face = new Face3(a, b, c);
          Triangle.getNormal(vA, vB, vC, face.normal);
          intersection.face = face;
        }
        return intersection;
      }
      return function raycast(raycaster, intersects) {
        var geometry = this.geometry;
        var material = this.material;
        var matrixWorld = this.matrixWorld;
        if (material === undefined)
          return;
        if (geometry.boundingSphere === null)
          geometry.computeBoundingSphere();
        sphere.copy(geometry.boundingSphere);
        sphere.applyMatrix4(matrixWorld);
        if (raycaster.ray.intersectsSphere(sphere) === false)
          return;
        inverseMatrix.getInverse(matrixWorld);
        ray.copy(raycaster.ray).applyMatrix4(inverseMatrix);
        if (geometry.boundingBox !== null) {
          if (ray.intersectsBox(geometry.boundingBox) === false)
            return;
        }
        var intersection;
        if (geometry.isBufferGeometry) {
          var a,
              b,
              c;
          var index = geometry.index;
          var position = geometry.attributes.position;
          var uv = geometry.attributes.uv;
          var groups = geometry.groups;
          var drawRange = geometry.drawRange;
          var i,
              j,
              il,
              jl;
          var group,
              groupMaterial;
          var start,
              end;
          if (index !== null) {
            if (Array.isArray(material)) {
              for (i = 0, il = groups.length; i < il; i++) {
                group = groups[i];
                groupMaterial = material[group.materialIndex];
                start = Math.max(group.start, drawRange.start);
                end = Math.min((group.start + group.count), (drawRange.start + drawRange.count));
                for (j = start, jl = end; j < jl; j += 3) {
                  a = index.getX(j);
                  b = index.getX(j + 1);
                  c = index.getX(j + 2);
                  intersection = checkBufferGeometryIntersection(this, groupMaterial, raycaster, ray, position, uv, a, b, c);
                  if (intersection) {
                    intersection.faceIndex = Math.floor(j / 3);
                    intersection.face.materialIndex = group.materialIndex;
                    intersects.push(intersection);
                  }
                }
              }
            } else {
              start = Math.max(0, drawRange.start);
              end = Math.min(index.count, (drawRange.start + drawRange.count));
              for (i = start, il = end; i < il; i += 3) {
                a = index.getX(i);
                b = index.getX(i + 1);
                c = index.getX(i + 2);
                intersection = checkBufferGeometryIntersection(this, material, raycaster, ray, position, uv, a, b, c);
                if (intersection) {
                  intersection.faceIndex = Math.floor(i / 3);
                  intersects.push(intersection);
                }
              }
            }
          } else if (position !== undefined) {
            if (Array.isArray(material)) {
              for (i = 0, il = groups.length; i < il; i++) {
                group = groups[i];
                groupMaterial = material[group.materialIndex];
                start = Math.max(group.start, drawRange.start);
                end = Math.min((group.start + group.count), (drawRange.start + drawRange.count));
                for (j = start, jl = end; j < jl; j += 3) {
                  a = j;
                  b = j + 1;
                  c = j + 2;
                  intersection = checkBufferGeometryIntersection(this, groupMaterial, raycaster, ray, position, uv, a, b, c);
                  if (intersection) {
                    intersection.faceIndex = Math.floor(j / 3);
                    intersection.face.materialIndex = group.materialIndex;
                    intersects.push(intersection);
                  }
                }
              }
            } else {
              start = Math.max(0, drawRange.start);
              end = Math.min(position.count, (drawRange.start + drawRange.count));
              for (i = start, il = end; i < il; i += 3) {
                a = i;
                b = i + 1;
                c = i + 2;
                intersection = checkBufferGeometryIntersection(this, material, raycaster, ray, position, uv, a, b, c);
                if (intersection) {
                  intersection.faceIndex = Math.floor(i / 3);
                  intersects.push(intersection);
                }
              }
            }
          }
        } else if (geometry.isGeometry) {
          var fvA,
              fvB,
              fvC;
          var isMultiMaterial = Array.isArray(material);
          var vertices = geometry.vertices;
          var faces = geometry.faces;
          var uvs;
          var faceVertexUvs = geometry.faceVertexUvs[0];
          if (faceVertexUvs.length > 0)
            uvs = faceVertexUvs;
          for (var f = 0,
              fl = faces.length; f < fl; f++) {
            var face = faces[f];
            var faceMaterial = isMultiMaterial ? material[face.materialIndex] : material;
            if (faceMaterial === undefined)
              continue;
            fvA = vertices[face.a];
            fvB = vertices[face.b];
            fvC = vertices[face.c];
            if (faceMaterial.morphTargets === true) {
              var morphTargets = geometry.morphTargets;
              var morphInfluences = this.morphTargetInfluences;
              vA.set(0, 0, 0);
              vB.set(0, 0, 0);
              vC.set(0, 0, 0);
              for (var t = 0,
                  tl = morphTargets.length; t < tl; t++) {
                var influence = morphInfluences[t];
                if (influence === 0)
                  continue;
                var targets = morphTargets[t].vertices;
                vA.addScaledVector(tempA.subVectors(targets[face.a], fvA), influence);
                vB.addScaledVector(tempB.subVectors(targets[face.b], fvB), influence);
                vC.addScaledVector(tempC.subVectors(targets[face.c], fvC), influence);
              }
              vA.add(fvA);
              vB.add(fvB);
              vC.add(fvC);
              fvA = vA;
              fvB = vB;
              fvC = vC;
            }
            intersection = checkIntersection(this, faceMaterial, raycaster, ray, fvA, fvB, fvC, intersectionPoint);
            if (intersection) {
              if (uvs && uvs[f]) {
                var uvs_f = uvs[f];
                uvA.copy(uvs_f[0]);
                uvB.copy(uvs_f[1]);
                uvC.copy(uvs_f[2]);
                intersection.uv = Triangle.getUV(intersectionPoint, fvA, fvB, fvC, uvA, uvB, uvC, new Vector2());
              }
              intersection.face = face;
              intersection.faceIndex = f;
              intersects.push(intersection);
            }
          }
        }
      };
    }()),
    clone: function() {
      return new this.constructor(this.geometry, this.material).copy(this);
    }
  });
  function WebGLBackground(renderer, state, objects, premultipliedAlpha) {
    var clearColor = new Color(0x000000);
    var clearAlpha = 0;
    var planeMesh;
    var boxMesh;
    var currentBackground = null;
    var currentBackgroundVersion = 0;
    function render(renderList, scene, camera, forceClear) {
      var background = scene.background;
      if (background === null) {
        setClear(clearColor, clearAlpha);
        currentBackground = null;
        currentBackgroundVersion = 0;
      } else if (background && background.isColor) {
        setClear(background, 1);
        forceClear = true;
        currentBackground = null;
        currentBackgroundVersion = 0;
      }
      if (renderer.autoClear || forceClear) {
        renderer.clear(renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil);
      }
      if (background && (background.isCubeTexture || background.isWebGLRenderTargetCube)) {
        if (boxMesh === undefined) {
          boxMesh = new Mesh(new BoxBufferGeometry(1, 1, 1), new ShaderMaterial({
            type: 'BackgroundCubeMaterial',
            uniforms: cloneUniforms(ShaderLib.cube.uniforms),
            vertexShader: ShaderLib.cube.vertexShader,
            fragmentShader: ShaderLib.cube.fragmentShader,
            side: BackSide,
            depthTest: false,
            depthWrite: false,
            fog: false
          }));
          boxMesh.geometry.removeAttribute('normal');
          boxMesh.geometry.removeAttribute('uv');
          boxMesh.onBeforeRender = function(renderer, scene, camera) {
            this.matrixWorld.copyPosition(camera.matrixWorld);
          };
          Object.defineProperty(boxMesh.material, 'map', {get: function() {
              return this.uniforms.tCube.value;
            }});
          objects.update(boxMesh);
        }
        var texture = background.isWebGLRenderTargetCube ? background.texture : background;
        boxMesh.material.uniforms.tCube.value = texture;
        boxMesh.material.uniforms.tFlip.value = (background.isWebGLRenderTargetCube) ? 1 : -1;
        if (currentBackground !== background || currentBackgroundVersion !== texture.version) {
          boxMesh.material.needsUpdate = true;
          currentBackground = background;
          currentBackgroundVersion = texture.version;
        }
        renderList.unshift(boxMesh, boxMesh.geometry, boxMesh.material, 0, 0, null);
      } else if (background && background.isTexture) {
        if (planeMesh === undefined) {
          planeMesh = new Mesh(new PlaneBufferGeometry(2, 2), new ShaderMaterial({
            type: 'BackgroundMaterial',
            uniforms: cloneUniforms(ShaderLib.background.uniforms),
            vertexShader: ShaderLib.background.vertexShader,
            fragmentShader: ShaderLib.background.fragmentShader,
            side: FrontSide,
            depthTest: false,
            depthWrite: false,
            fog: false
          }));
          planeMesh.geometry.removeAttribute('normal');
          Object.defineProperty(planeMesh.material, 'map', {get: function() {
              return this.uniforms.t2D.value;
            }});
          objects.update(planeMesh);
        }
        planeMesh.material.uniforms.t2D.value = background;
        if (background.matrixAutoUpdate === true) {
          background.updateMatrix();
        }
        planeMesh.material.uniforms.uvTransform.value.copy(background.matrix);
        if (currentBackground !== background || currentBackgroundVersion !== background.version) {
          planeMesh.material.needsUpdate = true;
          currentBackground = background;
          currentBackgroundVersion = background.version;
        }
        renderList.unshift(planeMesh, planeMesh.geometry, planeMesh.material, 0, 0, null);
      }
    }
    function setClear(color, alpha) {
      state.buffers.color.setClear(color.r, color.g, color.b, alpha, premultipliedAlpha);
    }
    return {
      getClearColor: function() {
        return clearColor;
      },
      setClearColor: function(color, alpha) {
        clearColor.set(color);
        clearAlpha = alpha !== undefined ? alpha : 1;
        setClear(clearColor, clearAlpha);
      },
      getClearAlpha: function() {
        return clearAlpha;
      },
      setClearAlpha: function(alpha) {
        clearAlpha = alpha;
        setClear(clearColor, clearAlpha);
      },
      render: render
    };
  }
  function WebGLBufferRenderer(gl, extensions, info, capabilities) {
    var mode;
    function setMode(value) {
      mode = value;
    }
    function render(start, count) {
      gl.drawArrays(mode, start, count);
      info.update(count, mode);
    }
    function renderInstances(geometry, start, count) {
      var extension;
      if (capabilities.isWebGL2) {
        extension = gl;
      } else {
        extension = extensions.get('ANGLE_instanced_arrays');
        if (extension === null) {
          console.error('THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.');
          return;
        }
      }
      extension[capabilities.isWebGL2 ? 'drawArraysInstanced' : 'drawArraysInstancedANGLE'](mode, start, count, geometry.maxInstancedCount);
      info.update(count, mode, geometry.maxInstancedCount);
    }
    this.setMode = setMode;
    this.render = render;
    this.renderInstances = renderInstances;
  }
  function WebGLCapabilities(gl, extensions, parameters) {
    var maxAnisotropy;
    function getMaxAnisotropy() {
      if (maxAnisotropy !== undefined)
        return maxAnisotropy;
      var extension = extensions.get('EXT_texture_filter_anisotropic');
      if (extension !== null) {
        maxAnisotropy = gl.getParameter(extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT);
      } else {
        maxAnisotropy = 0;
      }
      return maxAnisotropy;
    }
    function getMaxPrecision(precision) {
      if (precision === 'highp') {
        if (gl.getShaderPrecisionFormat(35633, 36338).precision > 0 && gl.getShaderPrecisionFormat(35632, 36338).precision > 0) {
          return 'highp';
        }
        precision = 'mediump';
      }
      if (precision === 'mediump') {
        if (gl.getShaderPrecisionFormat(35633, 36337).precision > 0 && gl.getShaderPrecisionFormat(35632, 36337).precision > 0) {
          return 'mediump';
        }
      }
      return 'lowp';
    }
    var isWebGL2 = typeof WebGL2RenderingContext !== 'undefined' && gl instanceof WebGL2RenderingContext;
    var precision = parameters.precision !== undefined ? parameters.precision : 'highp';
    var maxPrecision = getMaxPrecision(precision);
    if (maxPrecision !== precision) {
      console.warn('THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.');
      precision = maxPrecision;
    }
    var logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true;
    var maxTextures = gl.getParameter(34930);
    var maxVertexTextures = gl.getParameter(35660);
    var maxTextureSize = gl.getParameter(3379);
    var maxCubemapSize = gl.getParameter(34076);
    var maxAttributes = gl.getParameter(34921);
    var maxVertexUniforms = gl.getParameter(36347);
    var maxVaryings = gl.getParameter(36348);
    var maxFragmentUniforms = gl.getParameter(36349);
    var vertexTextures = maxVertexTextures > 0;
    var floatFragmentTextures = isWebGL2 || !!extensions.get('OES_texture_float');
    var floatVertexTextures = vertexTextures && floatFragmentTextures;
    var maxSamples = isWebGL2 ? gl.getParameter(36183) : 0;
    return {
      isWebGL2: isWebGL2,
      getMaxAnisotropy: getMaxAnisotropy,
      getMaxPrecision: getMaxPrecision,
      precision: precision,
      logarithmicDepthBuffer: logarithmicDepthBuffer,
      maxTextures: maxTextures,
      maxVertexTextures: maxVertexTextures,
      maxTextureSize: maxTextureSize,
      maxCubemapSize: maxCubemapSize,
      maxAttributes: maxAttributes,
      maxVertexUniforms: maxVertexUniforms,
      maxVaryings: maxVaryings,
      maxFragmentUniforms: maxFragmentUniforms,
      vertexTextures: vertexTextures,
      floatFragmentTextures: floatFragmentTextures,
      floatVertexTextures: floatVertexTextures,
      maxSamples: maxSamples
    };
  }
  function WebGLClipping() {
    var scope = this,
        globalState = null,
        numGlobalPlanes = 0,
        localClippingEnabled = false,
        renderingShadows = false,
        plane = new Plane(),
        viewNormalMatrix = new Matrix3(),
        uniform = {
          value: null,
          needsUpdate: false
        };
    this.uniform = uniform;
    this.numPlanes = 0;
    this.numIntersection = 0;
    this.init = function(planes, enableLocalClipping, camera) {
      var enabled = planes.length !== 0 || enableLocalClipping || numGlobalPlanes !== 0 || localClippingEnabled;
      localClippingEnabled = enableLocalClipping;
      globalState = projectPlanes(planes, camera, 0);
      numGlobalPlanes = planes.length;
      return enabled;
    };
    this.beginShadows = function() {
      renderingShadows = true;
      projectPlanes(null);
    };
    this.endShadows = function() {
      renderingShadows = false;
      resetGlobalState();
    };
    this.setState = function(planes, clipIntersection, clipShadows, camera, cache, fromCache) {
      if (!localClippingEnabled || planes === null || planes.length === 0 || renderingShadows && !clipShadows) {
        if (renderingShadows) {
          projectPlanes(null);
        } else {
          resetGlobalState();
        }
      } else {
        var nGlobal = renderingShadows ? 0 : numGlobalPlanes,
            lGlobal = nGlobal * 4,
            dstArray = cache.clippingState || null;
        uniform.value = dstArray;
        dstArray = projectPlanes(planes, camera, lGlobal, fromCache);
        for (var i = 0; i !== lGlobal; ++i) {
          dstArray[i] = globalState[i];
        }
        cache.clippingState = dstArray;
        this.numIntersection = clipIntersection ? this.numPlanes : 0;
        this.numPlanes += nGlobal;
      }
    };
    function resetGlobalState() {
      if (uniform.value !== globalState) {
        uniform.value = globalState;
        uniform.needsUpdate = numGlobalPlanes > 0;
      }
      scope.numPlanes = numGlobalPlanes;
      scope.numIntersection = 0;
    }
    function projectPlanes(planes, camera, dstOffset, skipTransform) {
      var nPlanes = planes !== null ? planes.length : 0,
          dstArray = null;
      if (nPlanes !== 0) {
        dstArray = uniform.value;
        if (skipTransform !== true || dstArray === null) {
          var flatSize = dstOffset + nPlanes * 4,
              viewMatrix = camera.matrixWorldInverse;
          viewNormalMatrix.getNormalMatrix(viewMatrix);
          if (dstArray === null || dstArray.length < flatSize) {
            dstArray = new Float32Array(flatSize);
          }
          for (var i = 0,
              i4 = dstOffset; i !== nPlanes; ++i, i4 += 4) {
            plane.copy(planes[i]).applyMatrix4(viewMatrix, viewNormalMatrix);
            plane.normal.toArray(dstArray, i4);
            dstArray[i4 + 3] = plane.constant;
          }
        }
        uniform.value = dstArray;
        uniform.needsUpdate = true;
      }
      scope.numPlanes = nPlanes;
      return dstArray;
    }
  }
  function WebGLExtensions(gl) {
    var extensions = {};
    return {get: function(name) {
        if (extensions[name] !== undefined) {
          return extensions[name];
        }
        var extension;
        switch (name) {
          case 'WEBGL_depth_texture':
            extension = gl.getExtension('WEBGL_depth_texture') || gl.getExtension('MOZ_WEBGL_depth_texture') || gl.getExtension('WEBKIT_WEBGL_depth_texture');
            break;
          case 'EXT_texture_filter_anisotropic':
            extension = gl.getExtension('EXT_texture_filter_anisotropic') || gl.getExtension('MOZ_EXT_texture_filter_anisotropic') || gl.getExtension('WEBKIT_EXT_texture_filter_anisotropic');
            break;
          case 'WEBGL_compressed_texture_s3tc':
            extension = gl.getExtension('WEBGL_compressed_texture_s3tc') || gl.getExtension('MOZ_WEBGL_compressed_texture_s3tc') || gl.getExtension('WEBKIT_WEBGL_compressed_texture_s3tc');
            break;
          case 'WEBGL_compressed_texture_pvrtc':
            extension = gl.getExtension('WEBGL_compressed_texture_pvrtc') || gl.getExtension('WEBKIT_WEBGL_compressed_texture_pvrtc');
            break;
          default:
            extension = gl.getExtension(name);
        }
        if (extension === null) {
          console.warn('THREE.WebGLRenderer: ' + name + ' extension not supported.');
        }
        extensions[name] = extension;
        return extension;
      }};
  }
  function WebGLGeometries(gl, attributes, info) {
    var geometries = {};
    var wireframeAttributes = {};
    function onGeometryDispose(event) {
      var geometry = event.target;
      var buffergeometry = geometries[geometry.id];
      if (buffergeometry.index !== null) {
        attributes.remove(buffergeometry.index);
      }
      for (var name in buffergeometry.attributes) {
        attributes.remove(buffergeometry.attributes[name]);
      }
      geometry.removeEventListener('dispose', onGeometryDispose);
      delete geometries[geometry.id];
      var attribute = wireframeAttributes[buffergeometry.id];
      if (attribute) {
        attributes.remove(attribute);
        delete wireframeAttributes[buffergeometry.id];
      }
      info.memory.geometries--;
    }
    function get(object, geometry) {
      var buffergeometry = geometries[geometry.id];
      if (buffergeometry)
        return buffergeometry;
      geometry.addEventListener('dispose', onGeometryDispose);
      if (geometry.isBufferGeometry) {
        buffergeometry = geometry;
      } else if (geometry.isGeometry) {
        if (geometry._bufferGeometry === undefined) {
          geometry._bufferGeometry = new BufferGeometry().setFromObject(object);
        }
        buffergeometry = geometry._bufferGeometry;
      }
      geometries[geometry.id] = buffergeometry;
      info.memory.geometries++;
      return buffergeometry;
    }
    function update(geometry) {
      var index = geometry.index;
      var geometryAttributes = geometry.attributes;
      if (index !== null) {
        attributes.update(index, 34963);
      }
      for (var name in geometryAttributes) {
        attributes.update(geometryAttributes[name], 34962);
      }
      var morphAttributes = geometry.morphAttributes;
      for (var name in morphAttributes) {
        var array = morphAttributes[name];
        for (var i = 0,
            l = array.length; i < l; i++) {
          attributes.update(array[i], 34962);
        }
      }
    }
    function getWireframeAttribute(geometry) {
      var attribute = wireframeAttributes[geometry.id];
      if (attribute)
        return attribute;
      var indices = [];
      var geometryIndex = geometry.index;
      var geometryAttributes = geometry.attributes;
      if (geometryIndex !== null) {
        var array = geometryIndex.array;
        for (var i = 0,
            l = array.length; i < l; i += 3) {
          var a = array[i + 0];
          var b = array[i + 1];
          var c = array[i + 2];
          indices.push(a, b, b, c, c, a);
        }
      } else {
        var array = geometryAttributes.position.array;
        for (var i = 0,
            l = (array.length / 3) - 1; i < l; i += 3) {
          var a = i + 0;
          var b = i + 1;
          var c = i + 2;
          indices.push(a, b, b, c, c, a);
        }
      }
      attribute = new (arrayMax(indices) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute)(indices, 1);
      attributes.update(attribute, 34963);
      wireframeAttributes[geometry.id] = attribute;
      return attribute;
    }
    return {
      get: get,
      update: update,
      getWireframeAttribute: getWireframeAttribute
    };
  }
  function WebGLIndexedBufferRenderer(gl, extensions, info, capabilities) {
    var mode;
    function setMode(value) {
      mode = value;
    }
    var type,
        bytesPerElement;
    function setIndex(value) {
      type = value.type;
      bytesPerElement = value.bytesPerElement;
    }
    function render(start, count) {
      gl.drawElements(mode, count, type, start * bytesPerElement);
      info.update(count, mode);
    }
    function renderInstances(geometry, start, count) {
      var extension;
      if (capabilities.isWebGL2) {
        extension = gl;
      } else {
        var extension = extensions.get('ANGLE_instanced_arrays');
        if (extension === null) {
          console.error('THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.');
          return;
        }
      }
      extension[capabilities.isWebGL2 ? 'drawElementsInstanced' : 'drawElementsInstancedANGLE'](mode, count, type, start * bytesPerElement, geometry.maxInstancedCount);
      info.update(count, mode, geometry.maxInstancedCount);
    }
    this.setMode = setMode;
    this.setIndex = setIndex;
    this.render = render;
    this.renderInstances = renderInstances;
  }
  function WebGLInfo(gl) {
    var memory = {
      geometries: 0,
      textures: 0
    };
    var render = {
      frame: 0,
      calls: 0,
      triangles: 0,
      points: 0,
      lines: 0
    };
    function update(count, mode, instanceCount) {
      instanceCount = instanceCount || 1;
      render.calls++;
      switch (mode) {
        case 4:
          render.triangles += instanceCount * (count / 3);
          break;
        case 5:
        case 6:
          render.triangles += instanceCount * (count - 2);
          break;
        case 1:
          render.lines += instanceCount * (count / 2);
          break;
        case 3:
          render.lines += instanceCount * (count - 1);
          break;
        case 2:
          render.lines += instanceCount * count;
          break;
        case 0:
          render.points += instanceCount * count;
          break;
        default:
          console.error('THREE.WebGLInfo: Unknown draw mode:', mode);
          break;
      }
    }
    function reset() {
      render.frame++;
      render.calls = 0;
      render.triangles = 0;
      render.points = 0;
      render.lines = 0;
    }
    return {
      memory: memory,
      render: render,
      programs: null,
      autoReset: true,
      reset: reset,
      update: update
    };
  }
  function absNumericalSort(a, b) {
    return Math.abs(b[1]) - Math.abs(a[1]);
  }
  function WebGLMorphtargets(gl) {
    var influencesList = {};
    var morphInfluences = new Float32Array(8);
    function update(object, geometry, material, program) {
      var objectInfluences = object.morphTargetInfluences;
      var length = objectInfluences.length;
      var influences = influencesList[geometry.id];
      if (influences === undefined) {
        influences = [];
        for (var i = 0; i < length; i++) {
          influences[i] = [i, 0];
        }
        influencesList[geometry.id] = influences;
      }
      var morphTargets = material.morphTargets && geometry.morphAttributes.position;
      var morphNormals = material.morphNormals && geometry.morphAttributes.normal;
      for (var i = 0; i < length; i++) {
        var influence = influences[i];
        if (influence[1] !== 0) {
          if (morphTargets)
            geometry.removeAttribute('morphTarget' + i);
          if (morphNormals)
            geometry.removeAttribute('morphNormal' + i);
        }
      }
      for (var i = 0; i < length; i++) {
        var influence = influences[i];
        influence[0] = i;
        influence[1] = objectInfluences[i];
      }
      influences.sort(absNumericalSort);
      for (var i = 0; i < 8; i++) {
        var influence = influences[i];
        if (influence) {
          var index = influence[0];
          var value = influence[1];
          if (value) {
            if (morphTargets)
              geometry.addAttribute('morphTarget' + i, morphTargets[index]);
            if (morphNormals)
              geometry.addAttribute('morphNormal' + i, morphNormals[index]);
            morphInfluences[i] = value;
            continue;
          }
        }
        morphInfluences[i] = 0;
      }
      program.getUniforms().setValue(gl, 'morphTargetInfluences', morphInfluences);
    }
    return {update: update};
  }
  function WebGLObjects(geometries, info) {
    var updateList = {};
    function update(object) {
      var frame = info.render.frame;
      var geometry = object.geometry;
      var buffergeometry = geometries.get(object, geometry);
      if (updateList[buffergeometry.id] !== frame) {
        if (geometry.isGeometry) {
          buffergeometry.updateFromObject(object);
        }
        geometries.update(buffergeometry);
        updateList[buffergeometry.id] = frame;
      }
      return buffergeometry;
    }
    function dispose() {
      updateList = {};
    }
    return {
      update: update,
      dispose: dispose
    };
  }
  function CubeTexture(images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding) {
    images = images !== undefined ? images : [];
    mapping = mapping !== undefined ? mapping : CubeReflectionMapping;
    format = format !== undefined ? format : RGBFormat;
    Texture.call(this, images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding);
    this.flipY = false;
  }
  CubeTexture.prototype = Object.create(Texture.prototype);
  CubeTexture.prototype.constructor = CubeTexture;
  CubeTexture.prototype.isCubeTexture = true;
  Object.defineProperty(CubeTexture.prototype, 'images', {
    get: function() {
      return this.image;
    },
    set: function(value) {
      this.image = value;
    }
  });
  function DataTexture3D(data, width, height, depth) {
    Texture.call(this, null);
    this.image = {
      data: data,
      width: width,
      height: height,
      depth: depth
    };
    this.magFilter = NearestFilter;
    this.minFilter = NearestFilter;
    this.wrapR = ClampToEdgeWrapping;
    this.generateMipmaps = false;
    this.flipY = false;
  }
  DataTexture3D.prototype = Object.create(Texture.prototype);
  DataTexture3D.prototype.constructor = DataTexture3D;
  DataTexture3D.prototype.isDataTexture3D = true;
  var emptyTexture = new Texture();
  var emptyTexture3d = new DataTexture3D();
  var emptyCubeTexture = new CubeTexture();
  function UniformContainer() {
    this.seq = [];
    this.map = {};
  }
  var arrayCacheF32 = [];
  var arrayCacheI32 = [];
  var mat4array = new Float32Array(16);
  var mat3array = new Float32Array(9);
  var mat2array = new Float32Array(4);
  function flatten(array, nBlocks, blockSize) {
    var firstElem = array[0];
    if (firstElem <= 0 || firstElem > 0)
      return array;
    var n = nBlocks * blockSize,
        r = arrayCacheF32[n];
    if (r === undefined) {
      r = new Float32Array(n);
      arrayCacheF32[n] = r;
    }
    if (nBlocks !== 0) {
      firstElem.toArray(r, 0);
      for (var i = 1,
          offset = 0; i !== nBlocks; ++i) {
        offset += blockSize;
        array[i].toArray(r, offset);
      }
    }
    return r;
  }
  function arraysEqual(a, b) {
    if (a.length !== b.length)
      return false;
    for (var i = 0,
        l = a.length; i < l; i++) {
      if (a[i] !== b[i])
        return false;
    }
    return true;
  }
  function copyArray(a, b) {
    for (var i = 0,
        l = b.length; i < l; i++) {
      a[i] = b[i];
    }
  }
  function allocTexUnits(renderer, n) {
    var r = arrayCacheI32[n];
    if (r === undefined) {
      r = new Int32Array(n);
      arrayCacheI32[n] = r;
    }
    for (var i = 0; i !== n; ++i)
      r[i] = renderer.allocTextureUnit();
    return r;
  }
  function setValue1f(gl, v) {
    var cache = this.cache;
    if (cache[0] === v)
      return;
    gl.uniform1f(this.addr, v);
    cache[0] = v;
  }
  function setValue1i(gl, v) {
    var cache = this.cache;
    if (cache[0] === v)
      return;
    gl.uniform1i(this.addr, v);
    cache[0] = v;
  }
  function setValue2fv(gl, v) {
    var cache = this.cache;
    if (v.x !== undefined) {
      if (cache[0] !== v.x || cache[1] !== v.y) {
        gl.uniform2f(this.addr, v.x, v.y);
        cache[0] = v.x;
        cache[1] = v.y;
      }
    } else {
      if (arraysEqual(cache, v))
        return;
      gl.uniform2fv(this.addr, v);
      copyArray(cache, v);
    }
  }
  function setValue3fv(gl, v) {
    var cache = this.cache;
    if (v.x !== undefined) {
      if (cache[0] !== v.x || cache[1] !== v.y || cache[2] !== v.z) {
        gl.uniform3f(this.addr, v.x, v.y, v.z);
        cache[0] = v.x;
        cache[1] = v.y;
        cache[2] = v.z;
      }
    } else if (v.r !== undefined) {
      if (cache[0] !== v.r || cache[1] !== v.g || cache[2] !== v.b) {
        gl.uniform3f(this.addr, v.r, v.g, v.b);
        cache[0] = v.r;
        cache[1] = v.g;
        cache[2] = v.b;
      }
    } else {
      if (arraysEqual(cache, v))
        return;
      gl.uniform3fv(this.addr, v);
      copyArray(cache, v);
    }
  }
  function setValue4fv(gl, v) {
    var cache = this.cache;
    if (v.x !== undefined) {
      if (cache[0] !== v.x || cache[1] !== v.y || cache[2] !== v.z || cache[3] !== v.w) {
        gl.uniform4f(this.addr, v.x, v.y, v.z, v.w);
        cache[0] = v.x;
        cache[1] = v.y;
        cache[2] = v.z;
        cache[3] = v.w;
      }
    } else {
      if (arraysEqual(cache, v))
        return;
      gl.uniform4fv(this.addr, v);
      copyArray(cache, v);
    }
  }
  function setValue2fm(gl, v) {
    var cache = this.cache;
    var elements = v.elements;
    if (elements === undefined) {
      if (arraysEqual(cache, v))
        return;
      gl.uniformMatrix2fv(this.addr, false, v);
      copyArray(cache, v);
    } else {
      if (arraysEqual(cache, elements))
        return;
      mat2array.set(elements);
      gl.uniformMatrix2fv(this.addr, false, mat2array);
      copyArray(cache, elements);
    }
  }
  function setValue3fm(gl, v) {
    var cache = this.cache;
    var elements = v.elements;
    if (elements === undefined) {
      if (arraysEqual(cache, v))
        return;
      gl.uniformMatrix3fv(this.addr, false, v);
      copyArray(cache, v);
    } else {
      if (arraysEqual(cache, elements))
        return;
      mat3array.set(elements);
      gl.uniformMatrix3fv(this.addr, false, mat3array);
      copyArray(cache, elements);
    }
  }
  function setValue4fm(gl, v) {
    var cache = this.cache;
    var elements = v.elements;
    if (elements === undefined) {
      if (arraysEqual(cache, v))
        return;
      gl.uniformMatrix4fv(this.addr, false, v);
      copyArray(cache, v);
    } else {
      if (arraysEqual(cache, elements))
        return;
      mat4array.set(elements);
      gl.uniformMatrix4fv(this.addr, false, mat4array);
      copyArray(cache, elements);
    }
  }
  function setValueT1(gl, v, renderer) {
    var cache = this.cache;
    var unit = renderer.allocTextureUnit();
    if (cache[0] !== unit) {
      gl.uniform1i(this.addr, unit);
      cache[0] = unit;
    }
    renderer.setTexture2D(v || emptyTexture, unit);
  }
  function setValueT3D1(gl, v, renderer) {
    var cache = this.cache;
    var unit = renderer.allocTextureUnit();
    if (cache[0] !== unit) {
      gl.uniform1i(this.addr, unit);
      cache[0] = unit;
    }
    renderer.setTexture3D(v || emptyTexture3d, unit);
  }
  function setValueT6(gl, v, renderer) {
    var cache = this.cache;
    var unit = renderer.allocTextureUnit();
    if (cache[0] !== unit) {
      gl.uniform1i(this.addr, unit);
      cache[0] = unit;
    }
    renderer.setTextureCube(v || emptyCubeTexture, unit);
  }
  function setValue2iv(gl, v) {
    var cache = this.cache;
    if (arraysEqual(cache, v))
      return;
    gl.uniform2iv(this.addr, v);
    copyArray(cache, v);
  }
  function setValue3iv(gl, v) {
    var cache = this.cache;
    if (arraysEqual(cache, v))
      return;
    gl.uniform3iv(this.addr, v);
    copyArray(cache, v);
  }
  function setValue4iv(gl, v) {
    var cache = this.cache;
    if (arraysEqual(cache, v))
      return;
    gl.uniform4iv(this.addr, v);
    copyArray(cache, v);
  }
  function getSingularSetter(type) {
    switch (type) {
      case 0x1406:
        return setValue1f;
      case 0x8b50:
        return setValue2fv;
      case 0x8b51:
        return setValue3fv;
      case 0x8b52:
        return setValue4fv;
      case 0x8b5a:
        return setValue2fm;
      case 0x8b5b:
        return setValue3fm;
      case 0x8b5c:
        return setValue4fm;
      case 0x8b5e:
      case 0x8d66:
        return setValueT1;
      case 0x8B5F:
        return setValueT3D1;
      case 0x8b60:
        return setValueT6;
      case 0x1404:
      case 0x8b56:
        return setValue1i;
      case 0x8b53:
      case 0x8b57:
        return setValue2iv;
      case 0x8b54:
      case 0x8b58:
        return setValue3iv;
      case 0x8b55:
      case 0x8b59:
        return setValue4iv;
    }
  }
  function setValue1fv(gl, v) {
    var cache = this.cache;
    if (arraysEqual(cache, v))
      return;
    gl.uniform1fv(this.addr, v);
    copyArray(cache, v);
  }
  function setValue1iv(gl, v) {
    var cache = this.cache;
    if (arraysEqual(cache, v))
      return;
    gl.uniform1iv(this.addr, v);
    copyArray(cache, v);
  }
  function setValueV2a(gl, v) {
    var cache = this.cache;
    var data = flatten(v, this.size, 2);
    if (arraysEqual(cache, data))
      return;
    gl.uniform2fv(this.addr, data);
    this.updateCache(data);
  }
  function setValueV3a(gl, v) {
    var cache = this.cache;
    var data = flatten(v, this.size, 3);
    if (arraysEqual(cache, data))
      return;
    gl.uniform3fv(this.addr, data);
    this.updateCache(data);
  }
  function setValueV4a(gl, v) {
    var cache = this.cache;
    var data = flatten(v, this.size, 4);
    if (arraysEqual(cache, data))
      return;
    gl.uniform4fv(this.addr, data);
    this.updateCache(data);
  }
  function setValueM2a(gl, v) {
    var cache = this.cache;
    var data = flatten(v, this.size, 4);
    if (arraysEqual(cache, data))
      return;
    gl.uniformMatrix2fv(this.addr, false, data);
    this.updateCache(data);
  }
  function setValueM3a(gl, v) {
    var cache = this.cache;
    var data = flatten(v, this.size, 9);
    if (arraysEqual(cache, data))
      return;
    gl.uniformMatrix3fv(this.addr, false, data);
    this.updateCache(data);
  }
  function setValueM4a(gl, v) {
    var cache = this.cache;
    var data = flatten(v, this.size, 16);
    if (arraysEqual(cache, data))
      return;
    gl.uniformMatrix4fv(this.addr, false, data);
    this.updateCache(data);
  }
  function setValueT1a(gl, v, renderer) {
    var cache = this.cache;
    var n = v.length;
    var units = allocTexUnits(renderer, n);
    if (arraysEqual(cache, units) === false) {
      gl.uniform1iv(this.addr, units);
      copyArray(cache, units);
    }
    for (var i = 0; i !== n; ++i) {
      renderer.setTexture2D(v[i] || emptyTexture, units[i]);
    }
  }
  function setValueT6a(gl, v, renderer) {
    var cache = this.cache;
    var n = v.length;
    var units = allocTexUnits(renderer, n);
    if (arraysEqual(cache, units) === false) {
      gl.uniform1iv(this.addr, units);
      copyArray(cache, units);
    }
    for (var i = 0; i !== n; ++i) {
      renderer.setTextureCube(v[i] || emptyCubeTexture, units[i]);
    }
  }
  function getPureArraySetter(type) {
    switch (type) {
      case 0x1406:
        return setValue1fv;
      case 0x8b50:
        return setValueV2a;
      case 0x8b51:
        return setValueV3a;
      case 0x8b52:
        return setValueV4a;
      case 0x8b5a:
        return setValueM2a;
      case 0x8b5b:
        return setValueM3a;
      case 0x8b5c:
        return setValueM4a;
      case 0x8b5e:
        return setValueT1a;
      case 0x8b60:
        return setValueT6a;
      case 0x1404:
      case 0x8b56:
        return setValue1iv;
      case 0x8b53:
      case 0x8b57:
        return setValue2iv;
      case 0x8b54:
      case 0x8b58:
        return setValue3iv;
      case 0x8b55:
      case 0x8b59:
        return setValue4iv;
    }
  }
  function SingleUniform(id, activeInfo, addr) {
    this.id = id;
    this.addr = addr;
    this.cache = [];
    this.setValue = getSingularSetter(activeInfo.type);
  }
  function PureArrayUniform(id, activeInfo, addr) {
    this.id = id;
    this.addr = addr;
    this.cache = [];
    this.size = activeInfo.size;
    this.setValue = getPureArraySetter(activeInfo.type);
  }
  PureArrayUniform.prototype.updateCache = function(data) {
    var cache = this.cache;
    if (data instanceof Float32Array && cache.length !== data.length) {
      this.cache = new Float32Array(data.length);
    }
    copyArray(cache, data);
  };
  function StructuredUniform(id) {
    this.id = id;
    UniformContainer.call(this);
  }
  StructuredUniform.prototype.setValue = function(gl, value, renderer) {
    var seq = this.seq;
    for (var i = 0,
        n = seq.length; i !== n; ++i) {
      var u = seq[i];
      u.setValue(gl, value[u.id], renderer);
    }
  };
  var RePathPart = /([\w\d_]+)(\])?(\[|\.)?/g;
  function addUniform(container, uniformObject) {
    container.seq.push(uniformObject);
    container.map[uniformObject.id] = uniformObject;
  }
  function parseUniform(activeInfo, addr, container) {
    var path = activeInfo.name,
        pathLength = path.length;
    RePathPart.lastIndex = 0;
    while (true) {
      var match = RePathPart.exec(path),
          matchEnd = RePathPart.lastIndex,
          id = match[1],
          idIsIndex = match[2] === ']',
          subscript = match[3];
      if (idIsIndex)
        id = id | 0;
      if (subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength) {
        addUniform(container, subscript === undefined ? new SingleUniform(id, activeInfo, addr) : new PureArrayUniform(id, activeInfo, addr));
        break;
      } else {
        var map = container.map,
            next = map[id];
        if (next === undefined) {
          next = new StructuredUniform(id);
          addUniform(container, next);
        }
        container = next;
      }
    }
  }
  function WebGLUniforms(gl, program, renderer) {
    UniformContainer.call(this);
    this.renderer = renderer;
    var n = gl.getProgramParameter(program, 35718);
    for (var i = 0; i < n; ++i) {
      var info = gl.getActiveUniform(program, i),
          addr = gl.getUniformLocation(program, info.name);
      parseUniform(info, addr, this);
    }
  }
  WebGLUniforms.prototype.setValue = function(gl, name, value) {
    var u = this.map[name];
    if (u !== undefined)
      u.setValue(gl, value, this.renderer);
  };
  WebGLUniforms.prototype.setOptional = function(gl, object, name) {
    var v = object[name];
    if (v !== undefined)
      this.setValue(gl, name, v);
  };
  WebGLUniforms.upload = function(gl, seq, values, renderer) {
    for (var i = 0,
        n = seq.length; i !== n; ++i) {
      var u = seq[i],
          v = values[u.id];
      if (v.needsUpdate !== false) {
        u.setValue(gl, v.value, renderer);
      }
    }
  };
  WebGLUniforms.seqWithValue = function(seq, values) {
    var r = [];
    for (var i = 0,
        n = seq.length; i !== n; ++i) {
      var u = seq[i];
      if (u.id in values)
        r.push(u);
    }
    return r;
  };
  function addLineNumbers(string) {
    var lines = string.split('\n');
    for (var i = 0; i < lines.length; i++) {
      lines[i] = (i + 1) + ': ' + lines[i];
    }
    return lines.join('\n');
  }
  function WebGLShader(gl, type, string) {
    var shader = gl.createShader(type);
    gl.shaderSource(shader, string);
    gl.compileShader(shader);
    if (gl.getShaderParameter(shader, 35713) === false) {
      console.error('THREE.WebGLShader: Shader couldn\'t compile.');
    }
    if (gl.getShaderInfoLog(shader) !== '') {
      console.warn('THREE.WebGLShader: gl.getShaderInfoLog()', type === 35633 ? 'vertex' : 'fragment', gl.getShaderInfoLog(shader), addLineNumbers(string));
    }
    return shader;
  }
  var programIdCount = 0;
  function getEncodingComponents(encoding) {
    switch (encoding) {
      case LinearEncoding:
        return ['Linear', '( value )'];
      case sRGBEncoding:
        return ['sRGB', '( value )'];
      case RGBEEncoding:
        return ['RGBE', '( value )'];
      case RGBM7Encoding:
        return ['RGBM', '( value, 7.0 )'];
      case RGBM16Encoding:
        return ['RGBM', '( value, 16.0 )'];
      case RGBDEncoding:
        return ['RGBD', '( value, 256.0 )'];
      case GammaEncoding:
        return ['Gamma', '( value, float( GAMMA_FACTOR ) )'];
      default:
        throw new Error('unsupported encoding: ' + encoding);
    }
  }
  function getTexelDecodingFunction(functionName, encoding) {
    var components = getEncodingComponents(encoding);
    return 'vec4 ' + functionName + '( vec4 value ) { return ' + components[0] + 'ToLinear' + components[1] + '; }';
  }
  function getTexelEncodingFunction(functionName, encoding) {
    var components = getEncodingComponents(encoding);
    return 'vec4 ' + functionName + '( vec4 value ) { return LinearTo' + components[0] + components[1] + '; }';
  }
  function getToneMappingFunction(functionName, toneMapping) {
    var toneMappingName;
    switch (toneMapping) {
      case LinearToneMapping:
        toneMappingName = 'Linear';
        break;
      case ReinhardToneMapping:
        toneMappingName = 'Reinhard';
        break;
      case Uncharted2ToneMapping:
        toneMappingName = 'Uncharted2';
        break;
      case CineonToneMapping:
        toneMappingName = 'OptimizedCineon';
        break;
      case ACESFilmicToneMapping:
        toneMappingName = 'ACESFilmic';
        break;
      default:
        throw new Error('unsupported toneMapping: ' + toneMapping);
    }
    return 'vec3 ' + functionName + '( vec3 color ) { return ' + toneMappingName + 'ToneMapping( color ); }';
  }
  function generateExtensions(extensions, parameters, rendererExtensions) {
    extensions = extensions || {};
    var chunks = [(extensions.derivatives || parameters.envMapCubeUV || parameters.bumpMap || (parameters.normalMap && !parameters.objectSpaceNormalMap) || parameters.flatShading) ? '#extension GL_OES_standard_derivatives : enable' : '', (extensions.fragDepth || parameters.logarithmicDepthBuffer) && rendererExtensions.get('EXT_frag_depth') ? '#extension GL_EXT_frag_depth : enable' : '', (extensions.drawBuffers) && rendererExtensions.get('WEBGL_draw_buffers') ? '#extension GL_EXT_draw_buffers : require' : '', (extensions.shaderTextureLOD || parameters.envMap) && rendererExtensions.get('EXT_shader_texture_lod') ? '#extension GL_EXT_shader_texture_lod : enable' : ''];
    return chunks.filter(filterEmptyLine).join('\n');
  }
  function generateDefines(defines) {
    var chunks = [];
    for (var name in defines) {
      var value = defines[name];
      if (value === false)
        continue;
      chunks.push('#define ' + name + ' ' + value);
    }
    return chunks.join('\n');
  }
  function fetchAttributeLocations(gl, program) {
    var attributes = {};
    var n = gl.getProgramParameter(program, 35721);
    for (var i = 0; i < n; i++) {
      var info = gl.getActiveAttrib(program, i);
      var name = info.name;
      attributes[name] = gl.getAttribLocation(program, name);
    }
    return attributes;
  }
  function filterEmptyLine(string) {
    return string !== '';
  }
  function replaceLightNums(string, parameters) {
    return string.replace(/NUM_DIR_LIGHTS/g, parameters.numDirLights).replace(/NUM_SPOT_LIGHTS/g, parameters.numSpotLights).replace(/NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g, parameters.numPointLights).replace(/NUM_HEMI_LIGHTS/g, parameters.numHemiLights);
  }
  function replaceClippingPlaneNums(string, parameters) {
    return string.replace(/NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g, (parameters.numClippingPlanes - parameters.numClipIntersection));
  }
  function parseIncludes(string) {
    var pattern = /^[ \t]*#include +<([\w\d./]+)>/gm;
    function replace(match, include) {
      var replace = ShaderChunk[include];
      if (replace === undefined) {
        throw new Error('Can not resolve #include <' + include + '>');
      }
      return parseIncludes(replace);
    }
    return string.replace(pattern, replace);
  }
  function unrollLoops(string) {
    var pattern = /#pragma unroll_loop[\s]+?for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g;
    function replace(match, start, end, snippet) {
      var unroll = '';
      for (var i = parseInt(start); i < parseInt(end); i++) {
        unroll += snippet.replace(/\[ i \]/g, '[ ' + i + ' ]');
      }
      return unroll;
    }
    return string.replace(pattern, replace);
  }
  function WebGLProgram(renderer, extensions, code, material, shader, parameters, capabilities) {
    var gl = renderer.context;
    var defines = material.defines;
    var vertexShader = shader.vertexShader;
    var fragmentShader = shader.fragmentShader;
    var shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';
    if (parameters.shadowMapType === PCFShadowMap) {
      shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF';
    } else if (parameters.shadowMapType === PCFSoftShadowMap) {
      shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT';
    }
    var envMapTypeDefine = 'ENVMAP_TYPE_CUBE';
    var envMapModeDefine = 'ENVMAP_MODE_REFLECTION';
    var envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';
    if (parameters.envMap) {
      switch (material.envMap.mapping) {
        case CubeReflectionMapping:
        case CubeRefractionMapping:
          envMapTypeDefine = 'ENVMAP_TYPE_CUBE';
          break;
        case CubeUVReflectionMapping:
        case CubeUVRefractionMapping:
          envMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';
          break;
        case EquirectangularReflectionMapping:
        case EquirectangularRefractionMapping:
          envMapTypeDefine = 'ENVMAP_TYPE_EQUIREC';
          break;
        case SphericalReflectionMapping:
          envMapTypeDefine = 'ENVMAP_TYPE_SPHERE';
          break;
      }
      switch (material.envMap.mapping) {
        case CubeRefractionMapping:
        case EquirectangularRefractionMapping:
          envMapModeDefine = 'ENVMAP_MODE_REFRACTION';
          break;
      }
      switch (material.combine) {
        case MultiplyOperation:
          envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';
          break;
        case MixOperation:
          envMapBlendingDefine = 'ENVMAP_BLENDING_MIX';
          break;
        case AddOperation:
          envMapBlendingDefine = 'ENVMAP_BLENDING_ADD';
          break;
      }
    }
    var gammaFactorDefine = (renderer.gammaFactor > 0) ? renderer.gammaFactor : 1.0;
    var customExtensions = capabilities.isWebGL2 ? '' : generateExtensions(material.extensions, parameters, extensions);
    var customDefines = generateDefines(defines);
    var program = gl.createProgram();
    var prefixVertex,
        prefixFragment;
    if (material.isRawShaderMaterial) {
      prefixVertex = [customDefines].filter(filterEmptyLine).join('\n');
      if (prefixVertex.length > 0) {
        prefixVertex += '\n';
      }
      prefixFragment = [customExtensions, customDefines].filter(filterEmptyLine).join('\n');
      if (prefixFragment.length > 0) {
        prefixFragment += '\n';
      }
    } else {
      prefixVertex = ['precision ' + parameters.precision + ' float;', 'precision ' + parameters.precision + ' int;', '#define SHADER_NAME ' + shader.name, customDefines, parameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '', '#define GAMMA_FACTOR ' + gammaFactorDefine, '#define MAX_BONES ' + parameters.maxBones, (parameters.useFog && parameters.fog) ? '#define USE_FOG' : '', (parameters.useFog && parameters.fogExp) ? '#define FOG_EXP2' : '', parameters.map ? '#define USE_MAP' : '', parameters.envMap ? '#define USE_ENVMAP' : '', parameters.envMap ? '#define ' + envMapModeDefine : '', parameters.lightMap ? '#define USE_LIGHTMAP' : '', parameters.aoMap ? '#define USE_AOMAP' : '', parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '', parameters.bumpMap ? '#define USE_BUMPMAP' : '', parameters.normalMap ? '#define USE_NORMALMAP' : '', (parameters.normalMap && parameters.objectSpaceNormalMap) ? '#define OBJECTSPACE_NORMALMAP' : '', parameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '', parameters.specularMap ? '#define USE_SPECULARMAP' : '', parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '', parameters.metalnessMap ? '#define USE_METALNESSMAP' : '', parameters.alphaMap ? '#define USE_ALPHAMAP' : '', parameters.vertexTangents ? '#define USE_TANGENT' : '', parameters.vertexColors ? '#define USE_COLOR' : '', parameters.flatShading ? '#define FLAT_SHADED' : '', parameters.skinning ? '#define USE_SKINNING' : '', parameters.useVertexTexture ? '#define BONE_TEXTURE' : '', parameters.morphTargets ? '#define USE_MORPHTARGETS' : '', parameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '', parameters.doubleSided ? '#define DOUBLE_SIDED' : '', parameters.flipSided ? '#define FLIP_SIDED' : '', parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '', parameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '', parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', parameters.logarithmicDepthBuffer && (capabilities.isWebGL2 || extensions.get('EXT_frag_depth')) ? '#define USE_LOGDEPTHBUF_EXT' : '', 'uniform mat4 modelMatrix;', 'uniform mat4 modelViewMatrix;', 'uniform mat4 projectionMatrix;', 'uniform mat4 viewMatrix;', 'uniform mat3 normalMatrix;', 'uniform vec3 cameraPosition;', 'attribute vec3 position;', 'attribute vec3 normal;', 'attribute vec2 uv;', '#ifdef USE_TANGENT', '	attribute vec4 tangent;', '#endif', '#ifdef USE_COLOR', '	attribute vec3 color;', '#endif', '#ifdef USE_MORPHTARGETS', '	attribute vec3 morphTarget0;', '	attribute vec3 morphTarget1;', '	attribute vec3 morphTarget2;', '	attribute vec3 morphTarget3;', '	#ifdef USE_MORPHNORMALS', '		attribute vec3 morphNormal0;', '		attribute vec3 morphNormal1;', '		attribute vec3 morphNormal2;', '		attribute vec3 morphNormal3;', '	#else', '		attribute vec3 morphTarget4;', '		attribute vec3 morphTarget5;', '		attribute vec3 morphTarget6;', '		attribute vec3 morphTarget7;', '	#endif', '#endif', '#ifdef USE_SKINNING', '	attribute vec4 skinIndex;', '	attribute vec4 skinWeight;', '#endif', '\n'].filter(filterEmptyLine).join('\n');
      prefixFragment = [customExtensions, 'precision ' + parameters.precision + ' float;', 'precision ' + parameters.precision + ' int;', '#define SHADER_NAME ' + shader.name, customDefines, parameters.alphaTest ? '#define ALPHATEST ' + parameters.alphaTest + (parameters.alphaTest % 1 ? '' : '.0') : '', '#define GAMMA_FACTOR ' + gammaFactorDefine, (parameters.useFog && parameters.fog) ? '#define USE_FOG' : '', (parameters.useFog && parameters.fogExp) ? '#define FOG_EXP2' : '', parameters.map ? '#define USE_MAP' : '', parameters.matcap ? '#define USE_MATCAP' : '', parameters.envMap ? '#define USE_ENVMAP' : '', parameters.envMap ? '#define ' + envMapTypeDefine : '', parameters.envMap ? '#define ' + envMapModeDefine : '', parameters.envMap ? '#define ' + envMapBlendingDefine : '', parameters.lightMap ? '#define USE_LIGHTMAP' : '', parameters.aoMap ? '#define USE_AOMAP' : '', parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '', parameters.bumpMap ? '#define USE_BUMPMAP' : '', parameters.normalMap ? '#define USE_NORMALMAP' : '', (parameters.normalMap && parameters.objectSpaceNormalMap) ? '#define OBJECTSPACE_NORMALMAP' : '', parameters.specularMap ? '#define USE_SPECULARMAP' : '', parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '', parameters.metalnessMap ? '#define USE_METALNESSMAP' : '', parameters.alphaMap ? '#define USE_ALPHAMAP' : '', parameters.vertexTangents ? '#define USE_TANGENT' : '', parameters.vertexColors ? '#define USE_COLOR' : '', parameters.gradientMap ? '#define USE_GRADIENTMAP' : '', parameters.flatShading ? '#define FLAT_SHADED' : '', parameters.doubleSided ? '#define DOUBLE_SIDED' : '', parameters.flipSided ? '#define FLIP_SIDED' : '', parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '', parameters.premultipliedAlpha ? '#define PREMULTIPLIED_ALPHA' : '', parameters.physicallyCorrectLights ? '#define PHYSICALLY_CORRECT_LIGHTS' : '', parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', parameters.logarithmicDepthBuffer && (capabilities.isWebGL2 || extensions.get('EXT_frag_depth')) ? '#define USE_LOGDEPTHBUF_EXT' : '', parameters.envMap && (capabilities.isWebGL2 || extensions.get('EXT_shader_texture_lod')) ? '#define TEXTURE_LOD_EXT' : '', 'uniform mat4 viewMatrix;', 'uniform vec3 cameraPosition;', (parameters.toneMapping !== NoToneMapping) ? '#define TONE_MAPPING' : '', (parameters.toneMapping !== NoToneMapping) ? ShaderChunk['tonemapping_pars_fragment'] : '', (parameters.toneMapping !== NoToneMapping) ? getToneMappingFunction('toneMapping', parameters.toneMapping) : '', parameters.dithering ? '#define DITHERING' : '', (parameters.outputEncoding || parameters.mapEncoding || parameters.matcapEncoding || parameters.envMapEncoding || parameters.emissiveMapEncoding) ? ShaderChunk['encodings_pars_fragment'] : '', parameters.mapEncoding ? getTexelDecodingFunction('mapTexelToLinear', parameters.mapEncoding) : '', parameters.matcapEncoding ? getTexelDecodingFunction('matcapTexelToLinear', parameters.matcapEncoding) : '', parameters.envMapEncoding ? getTexelDecodingFunction('envMapTexelToLinear', parameters.envMapEncoding) : '', parameters.emissiveMapEncoding ? getTexelDecodingFunction('emissiveMapTexelToLinear', parameters.emissiveMapEncoding) : '', parameters.outputEncoding ? getTexelEncodingFunction('linearToOutputTexel', parameters.outputEncoding) : '', parameters.depthPacking ? '#define DEPTH_PACKING ' + material.depthPacking : '', '\n'].filter(filterEmptyLine).join('\n');
    }
    vertexShader = parseIncludes(vertexShader);
    vertexShader = replaceLightNums(vertexShader, parameters);
    vertexShader = replaceClippingPlaneNums(vertexShader, parameters);
    fragmentShader = parseIncludes(fragmentShader);
    fragmentShader = replaceLightNums(fragmentShader, parameters);
    fragmentShader = replaceClippingPlaneNums(fragmentShader, parameters);
    vertexShader = unrollLoops(vertexShader);
    fragmentShader = unrollLoops(fragmentShader);
    if (capabilities.isWebGL2 && !material.isRawShaderMaterial) {
      var isGLSL3ShaderMaterial = false;
      var versionRegex = /^\s*#version\s+300\s+es\s*\n/;
      if (material.isShaderMaterial && vertexShader.match(versionRegex) !== null && fragmentShader.match(versionRegex) !== null) {
        isGLSL3ShaderMaterial = true;
        vertexShader = vertexShader.replace(versionRegex, '');
        fragmentShader = fragmentShader.replace(versionRegex, '');
      }
      prefixVertex = ['#version 300 es\n', '#define attribute in', '#define varying out', '#define texture2D texture'].join('\n') + '\n' + prefixVertex;
      prefixFragment = ['#version 300 es\n', '#define varying in', isGLSL3ShaderMaterial ? '' : 'out highp vec4 pc_fragColor;', isGLSL3ShaderMaterial ? '' : '#define gl_FragColor pc_fragColor', '#define gl_FragDepthEXT gl_FragDepth', '#define texture2D texture', '#define textureCube texture', '#define texture2DProj textureProj', '#define texture2DLodEXT textureLod', '#define texture2DProjLodEXT textureProjLod', '#define textureCubeLodEXT textureLod', '#define texture2DGradEXT textureGrad', '#define texture2DProjGradEXT textureProjGrad', '#define textureCubeGradEXT textureGrad'].join('\n') + '\n' + prefixFragment;
    }
    var vertexGlsl = prefixVertex + vertexShader;
    var fragmentGlsl = prefixFragment + fragmentShader;
    var glVertexShader = WebGLShader(gl, 35633, vertexGlsl);
    var glFragmentShader = WebGLShader(gl, 35632, fragmentGlsl);
    gl.attachShader(program, glVertexShader);
    gl.attachShader(program, glFragmentShader);
    if (material.index0AttributeName !== undefined) {
      gl.bindAttribLocation(program, 0, material.index0AttributeName);
    } else if (parameters.morphTargets === true) {
      gl.bindAttribLocation(program, 0, 'position');
    }
    gl.linkProgram(program);
    var programLog = gl.getProgramInfoLog(program).trim();
    var vertexLog = gl.getShaderInfoLog(glVertexShader).trim();
    var fragmentLog = gl.getShaderInfoLog(glFragmentShader).trim();
    var runnable = true;
    var haveDiagnostics = true;
    if (gl.getProgramParameter(program, 35714) === false) {
      runnable = false;
      console.error('THREE.WebGLProgram: shader error: ', gl.getError(), '35715', gl.getProgramParameter(program, 35715), 'gl.getProgramInfoLog', programLog, vertexLog, fragmentLog);
    } else if (programLog !== '') {
      console.warn('THREE.WebGLProgram: gl.getProgramInfoLog()', programLog);
    } else if (vertexLog === '' || fragmentLog === '') {
      haveDiagnostics = false;
    }
    if (haveDiagnostics) {
      this.diagnostics = {
        runnable: runnable,
        material: material,
        programLog: programLog,
        vertexShader: {
          log: vertexLog,
          prefix: prefixVertex
        },
        fragmentShader: {
          log: fragmentLog,
          prefix: prefixFragment
        }
      };
    }
    gl.deleteShader(glVertexShader);
    gl.deleteShader(glFragmentShader);
    var cachedUniforms;
    this.getUniforms = function() {
      if (cachedUniforms === undefined) {
        cachedUniforms = new WebGLUniforms(gl, program, renderer);
      }
      return cachedUniforms;
    };
    var cachedAttributes;
    this.getAttributes = function() {
      if (cachedAttributes === undefined) {
        cachedAttributes = fetchAttributeLocations(gl, program);
      }
      return cachedAttributes;
    };
    this.destroy = function() {
      gl.deleteProgram(program);
      this.program = undefined;
    };
    Object.defineProperties(this, {
      uniforms: {get: function() {
          console.warn('THREE.WebGLProgram: .uniforms is now .getUniforms().');
          return this.getUniforms();
        }},
      attributes: {get: function() {
          console.warn('THREE.WebGLProgram: .attributes is now .getAttributes().');
          return this.getAttributes();
        }}
    });
    this.name = shader.name;
    this.id = programIdCount++;
    this.code = code;
    this.usedTimes = 1;
    this.program = program;
    this.vertexShader = glVertexShader;
    this.fragmentShader = glFragmentShader;
    return this;
  }
  function WebGLPrograms(renderer, extensions, capabilities) {
    var programs = [];
    var shaderIDs = {
      MeshDepthMaterial: 'depth',
      MeshDistanceMaterial: 'distanceRGBA',
      MeshNormalMaterial: 'normal',
      MeshBasicMaterial: 'basic',
      MeshLambertMaterial: 'lambert',
      MeshPhongMaterial: 'phong',
      MeshToonMaterial: 'phong',
      MeshStandardMaterial: 'physical',
      MeshPhysicalMaterial: 'physical',
      MeshMatcapMaterial: 'matcap',
      LineBasicMaterial: 'basic',
      LineDashedMaterial: 'dashed',
      PointsMaterial: 'points',
      ShadowMaterial: 'shadow',
      SpriteMaterial: 'sprite'
    };
    var parameterNames = ["precision", "supportsVertexTextures", "map", "mapEncoding", "matcap", "matcapEncoding", "envMap", "envMapMode", "envMapEncoding", "lightMap", "aoMap", "emissiveMap", "emissiveMapEncoding", "bumpMap", "normalMap", "objectSpaceNormalMap", "displacementMap", "specularMap", "roughnessMap", "metalnessMap", "gradientMap", "alphaMap", "combine", "vertexColors", "vertexTangents", "fog", "useFog", "fogExp", "flatShading", "sizeAttenuation", "logarithmicDepthBuffer", "skinning", "maxBones", "useVertexTexture", "morphTargets", "morphNormals", "maxMorphTargets", "maxMorphNormals", "premultipliedAlpha", "numDirLights", "numPointLights", "numSpotLights", "numHemiLights", "numRectAreaLights", "shadowMapEnabled", "shadowMapType", "toneMapping", 'physicallyCorrectLights', "alphaTest", "doubleSided", "flipSided", "numClippingPlanes", "numClipIntersection", "depthPacking", "dithering"];
    function allocateBones(object) {
      var skeleton = object.skeleton;
      var bones = skeleton.bones;
      if (capabilities.floatVertexTextures) {
        return 1024;
      } else {
        var nVertexUniforms = capabilities.maxVertexUniforms;
        var nVertexMatrices = Math.floor((nVertexUniforms - 20) / 4);
        var maxBones = Math.min(nVertexMatrices, bones.length);
        if (maxBones < bones.length) {
          console.warn('THREE.WebGLRenderer: Skeleton has ' + bones.length + ' bones. This GPU supports ' + maxBones + '.');
          return 0;
        }
        return maxBones;
      }
    }
    function getTextureEncodingFromMap(map, gammaOverrideLinear) {
      var encoding;
      if (!map) {
        encoding = LinearEncoding;
      } else if (map.isTexture) {
        encoding = map.encoding;
      } else if (map.isWebGLRenderTarget) {
        console.warn("THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead.");
        encoding = map.texture.encoding;
      }
      if (encoding === LinearEncoding && gammaOverrideLinear) {
        encoding = GammaEncoding;
      }
      return encoding;
    }
    this.getParameters = function(material, lights, shadows, fog, nClipPlanes, nClipIntersection, object) {
      var shaderID = shaderIDs[material.type];
      var maxBones = object.isSkinnedMesh ? allocateBones(object) : 0;
      var precision = capabilities.precision;
      if (material.precision !== null) {
        precision = capabilities.getMaxPrecision(material.precision);
        if (precision !== material.precision) {
          console.warn('THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.');
        }
      }
      var currentRenderTarget = renderer.getRenderTarget();
      var parameters = {
        shaderID: shaderID,
        precision: precision,
        supportsVertexTextures: capabilities.vertexTextures,
        outputEncoding: getTextureEncodingFromMap((!currentRenderTarget) ? null : currentRenderTarget.texture, renderer.gammaOutput),
        map: !!material.map,
        mapEncoding: getTextureEncodingFromMap(material.map, renderer.gammaInput),
        matcap: !!material.matcap,
        matcapEncoding: getTextureEncodingFromMap(material.matcap, renderer.gammaInput),
        envMap: !!material.envMap,
        envMapMode: material.envMap && material.envMap.mapping,
        envMapEncoding: getTextureEncodingFromMap(material.envMap, renderer.gammaInput),
        envMapCubeUV: (!!material.envMap) && ((material.envMap.mapping === CubeUVReflectionMapping) || (material.envMap.mapping === CubeUVRefractionMapping)),
        lightMap: !!material.lightMap,
        aoMap: !!material.aoMap,
        emissiveMap: !!material.emissiveMap,
        emissiveMapEncoding: getTextureEncodingFromMap(material.emissiveMap, renderer.gammaInput),
        bumpMap: !!material.bumpMap,
        normalMap: !!material.normalMap,
        objectSpaceNormalMap: material.normalMapType === ObjectSpaceNormalMap,
        displacementMap: !!material.displacementMap,
        roughnessMap: !!material.roughnessMap,
        metalnessMap: !!material.metalnessMap,
        specularMap: !!material.specularMap,
        alphaMap: !!material.alphaMap,
        gradientMap: !!material.gradientMap,
        combine: material.combine,
        vertexTangents: (material.normalMap && material.vertexTangents),
        vertexColors: material.vertexColors,
        fog: !!fog,
        useFog: material.fog,
        fogExp: (fog && fog.isFogExp2),
        flatShading: material.flatShading,
        sizeAttenuation: material.sizeAttenuation,
        logarithmicDepthBuffer: capabilities.logarithmicDepthBuffer,
        skinning: material.skinning && maxBones > 0,
        maxBones: maxBones,
        useVertexTexture: capabilities.floatVertexTextures,
        morphTargets: material.morphTargets,
        morphNormals: material.morphNormals,
        maxMorphTargets: renderer.maxMorphTargets,
        maxMorphNormals: renderer.maxMorphNormals,
        numDirLights: lights.directional.length,
        numPointLights: lights.point.length,
        numSpotLights: lights.spot.length,
        numRectAreaLights: lights.rectArea.length,
        numHemiLights: lights.hemi.length,
        numClippingPlanes: nClipPlanes,
        numClipIntersection: nClipIntersection,
        dithering: material.dithering,
        shadowMapEnabled: renderer.shadowMap.enabled && object.receiveShadow && shadows.length > 0,
        shadowMapType: renderer.shadowMap.type,
        toneMapping: renderer.toneMapping,
        physicallyCorrectLights: renderer.physicallyCorrectLights,
        premultipliedAlpha: material.premultipliedAlpha,
        alphaTest: material.alphaTest,
        doubleSided: material.side === DoubleSide,
        flipSided: material.side === BackSide,
        depthPacking: (material.depthPacking !== undefined) ? material.depthPacking : false
      };
      return parameters;
    };
    this.getProgramCode = function(material, parameters) {
      var array = [];
      if (parameters.shaderID) {
        array.push(parameters.shaderID);
      } else {
        array.push(material.fragmentShader);
        array.push(material.vertexShader);
      }
      if (material.defines !== undefined) {
        for (var name in material.defines) {
          array.push(name);
          array.push(material.defines[name]);
        }
      }
      for (var i = 0; i < parameterNames.length; i++) {
        array.push(parameters[parameterNames[i]]);
      }
      array.push(material.onBeforeCompile.toString());
      array.push(renderer.gammaOutput);
      array.push(renderer.gammaFactor);
      return array.join();
    };
    this.acquireProgram = function(material, shader, parameters, code) {
      var program;
      for (var p = 0,
          pl = programs.length; p < pl; p++) {
        var programInfo = programs[p];
        if (programInfo.code === code) {
          program = programInfo;
          ++program.usedTimes;
          break;
        }
      }
      if (program === undefined) {
        program = new WebGLProgram(renderer, extensions, code, material, shader, parameters, capabilities);
        programs.push(program);
      }
      return program;
    };
    this.releaseProgram = function(program) {
      if (--program.usedTimes === 0) {
        var i = programs.indexOf(program);
        programs[i] = programs[programs.length - 1];
        programs.pop();
        program.destroy();
      }
    };
    this.programs = programs;
  }
  function WebGLProperties() {
    var properties = new WeakMap();
    function get(object) {
      var map = properties.get(object);
      if (map === undefined) {
        map = {};
        properties.set(object, map);
      }
      return map;
    }
    function remove(object) {
      properties.delete(object);
    }
    function update(object, key, value) {
      properties.get(object)[key] = value;
    }
    function dispose() {
      properties = new WeakMap();
    }
    return {
      get: get,
      remove: remove,
      update: update,
      dispose: dispose
    };
  }
  function painterSortStable(a, b) {
    if (a.groupOrder !== b.groupOrder) {
      return a.groupOrder - b.groupOrder;
    } else if (a.renderOrder !== b.renderOrder) {
      return a.renderOrder - b.renderOrder;
    } else if (a.program && b.program && a.program !== b.program) {
      return a.program.id - b.program.id;
    } else if (a.material.id !== b.material.id) {
      return a.material.id - b.material.id;
    } else if (a.z !== b.z) {
      return a.z - b.z;
    } else {
      return a.id - b.id;
    }
  }
  function reversePainterSortStable(a, b) {
    if (a.groupOrder !== b.groupOrder) {
      return a.groupOrder - b.groupOrder;
    } else if (a.renderOrder !== b.renderOrder) {
      return a.renderOrder - b.renderOrder;
    } else if (a.z !== b.z) {
      return b.z - a.z;
    } else {
      return a.id - b.id;
    }
  }
  function WebGLRenderList() {
    var renderItems = [];
    var renderItemsIndex = 0;
    var opaque = [];
    var transparent = [];
    function init() {
      renderItemsIndex = 0;
      opaque.length = 0;
      transparent.length = 0;
    }
    function getNextRenderItem(object, geometry, material, groupOrder, z, group) {
      var renderItem = renderItems[renderItemsIndex];
      if (renderItem === undefined) {
        renderItem = {
          id: object.id,
          object: object,
          geometry: geometry,
          material: material,
          program: material.program,
          groupOrder: groupOrder,
          renderOrder: object.renderOrder,
          z: z,
          group: group
        };
        renderItems[renderItemsIndex] = renderItem;
      } else {
        renderItem.id = object.id;
        renderItem.object = object;
        renderItem.geometry = geometry;
        renderItem.material = material;
        renderItem.program = material.program;
        renderItem.groupOrder = groupOrder;
        renderItem.renderOrder = object.renderOrder;
        renderItem.z = z;
        renderItem.group = group;
      }
      renderItemsIndex++;
      return renderItem;
    }
    function push(object, geometry, material, groupOrder, z, group) {
      var renderItem = getNextRenderItem(object, geometry, material, groupOrder, z, group);
      (material.transparent === true ? transparent : opaque).push(renderItem);
    }
    function unshift(object, geometry, material, groupOrder, z, group) {
      var renderItem = getNextRenderItem(object, geometry, material, groupOrder, z, group);
      (material.transparent === true ? transparent : opaque).unshift(renderItem);
    }
    function sort() {
      if (opaque.length > 1)
        opaque.sort(painterSortStable);
      if (transparent.length > 1)
        transparent.sort(reversePainterSortStable);
    }
    return {
      opaque: opaque,
      transparent: transparent,
      init: init,
      push: push,
      unshift: unshift,
      sort: sort
    };
  }
  function WebGLRenderLists() {
    var lists = {};
    function onSceneDispose(event) {
      var scene = event.target;
      scene.removeEventListener('dispose', onSceneDispose);
      delete lists[scene.id];
    }
    function get(scene, camera) {
      var cameras = lists[scene.id];
      var list;
      if (cameras === undefined) {
        list = new WebGLRenderList();
        lists[scene.id] = {};
        lists[scene.id][camera.id] = list;
        scene.addEventListener('dispose', onSceneDispose);
      } else {
        list = cameras[camera.id];
        if (list === undefined) {
          list = new WebGLRenderList();
          cameras[camera.id] = list;
        }
      }
      return list;
    }
    function dispose() {
      lists = {};
    }
    return {
      get: get,
      dispose: dispose
    };
  }
  function UniformsCache() {
    var lights = {};
    return {get: function(light) {
        if (lights[light.id] !== undefined) {
          return lights[light.id];
        }
        var uniforms;
        switch (light.type) {
          case 'DirectionalLight':
            uniforms = {
              direction: new Vector3(),
              color: new Color(),
              shadow: false,
              shadowBias: 0,
              shadowRadius: 1,
              shadowMapSize: new Vector2()
            };
            break;
          case 'SpotLight':
            uniforms = {
              position: new Vector3(),
              direction: new Vector3(),
              color: new Color(),
              distance: 0,
              coneCos: 0,
              penumbraCos: 0,
              decay: 0,
              shadow: false,
              shadowBias: 0,
              shadowRadius: 1,
              shadowMapSize: new Vector2()
            };
            break;
          case 'PointLight':
            uniforms = {
              position: new Vector3(),
              color: new Color(),
              distance: 0,
              decay: 0,
              shadow: false,
              shadowBias: 0,
              shadowRadius: 1,
              shadowMapSize: new Vector2(),
              shadowCameraNear: 1,
              shadowCameraFar: 1000
            };
            break;
          case 'HemisphereLight':
            uniforms = {
              direction: new Vector3(),
              skyColor: new Color(),
              groundColor: new Color()
            };
            break;
          case 'RectAreaLight':
            uniforms = {
              color: new Color(),
              position: new Vector3(),
              halfWidth: new Vector3(),
              halfHeight: new Vector3()
            };
            break;
        }
        lights[light.id] = uniforms;
        return uniforms;
      }};
  }
  var count = 0;
  function WebGLLights() {
    var cache = new UniformsCache();
    var state = {
      id: count++,
      hash: {
        stateID: -1,
        directionalLength: -1,
        pointLength: -1,
        spotLength: -1,
        rectAreaLength: -1,
        hemiLength: -1,
        shadowsLength: -1
      },
      ambient: [0, 0, 0],
      directional: [],
      directionalShadowMap: [],
      directionalShadowMatrix: [],
      spot: [],
      spotShadowMap: [],
      spotShadowMatrix: [],
      rectArea: [],
      point: [],
      pointShadowMap: [],
      pointShadowMatrix: [],
      hemi: []
    };
    var vector3 = new Vector3();
    var matrix4 = new Matrix4();
    var matrix42 = new Matrix4();
    function setup(lights, shadows, camera) {
      var r = 0,
          g = 0,
          b = 0;
      var directionalLength = 0;
      var pointLength = 0;
      var spotLength = 0;
      var rectAreaLength = 0;
      var hemiLength = 0;
      var viewMatrix = camera.matrixWorldInverse;
      for (var i = 0,
          l = lights.length; i < l; i++) {
        var light = lights[i];
        var color = light.color;
        var intensity = light.intensity;
        var distance = light.distance;
        var shadowMap = (light.shadow && light.shadow.map) ? light.shadow.map.texture : null;
        if (light.isAmbientLight) {
          r += color.r * intensity;
          g += color.g * intensity;
          b += color.b * intensity;
        } else if (light.isDirectionalLight) {
          var uniforms = cache.get(light);
          uniforms.color.copy(light.color).multiplyScalar(light.intensity);
          uniforms.direction.setFromMatrixPosition(light.matrixWorld);
          vector3.setFromMatrixPosition(light.target.matrixWorld);
          uniforms.direction.sub(vector3);
          uniforms.direction.transformDirection(viewMatrix);
          uniforms.shadow = light.castShadow;
          if (light.castShadow) {
            var shadow = light.shadow;
            uniforms.shadowBias = shadow.bias;
            uniforms.shadowRadius = shadow.radius;
            uniforms.shadowMapSize = shadow.mapSize;
          }
          state.directionalShadowMap[directionalLength] = shadowMap;
          state.directionalShadowMatrix[directionalLength] = light.shadow.matrix;
          state.directional[directionalLength] = uniforms;
          directionalLength++;
        } else if (light.isSpotLight) {
          var uniforms = cache.get(light);
          uniforms.position.setFromMatrixPosition(light.matrixWorld);
          uniforms.position.applyMatrix4(viewMatrix);
          uniforms.color.copy(color).multiplyScalar(intensity);
          uniforms.distance = distance;
          uniforms.direction.setFromMatrixPosition(light.matrixWorld);
          vector3.setFromMatrixPosition(light.target.matrixWorld);
          uniforms.direction.sub(vector3);
          uniforms.direction.transformDirection(viewMatrix);
          uniforms.coneCos = Math.cos(light.angle);
          uniforms.penumbraCos = Math.cos(light.angle * (1 - light.penumbra));
          uniforms.decay = light.decay;
          uniforms.shadow = light.castShadow;
          if (light.castShadow) {
            var shadow = light.shadow;
            uniforms.shadowBias = shadow.bias;
            uniforms.shadowRadius = shadow.radius;
            uniforms.shadowMapSize = shadow.mapSize;
          }
          state.spotShadowMap[spotLength] = shadowMap;
          state.spotShadowMatrix[spotLength] = light.shadow.matrix;
          state.spot[spotLength] = uniforms;
          spotLength++;
        } else if (light.isRectAreaLight) {
          var uniforms = cache.get(light);
          uniforms.color.copy(color).multiplyScalar(intensity);
          uniforms.position.setFromMatrixPosition(light.matrixWorld);
          uniforms.position.applyMatrix4(viewMatrix);
          matrix42.identity();
          matrix4.copy(light.matrixWorld);
          matrix4.premultiply(viewMatrix);
          matrix42.extractRotation(matrix4);
          uniforms.halfWidth.set(light.width * 0.5, 0.0, 0.0);
          uniforms.halfHeight.set(0.0, light.height * 0.5, 0.0);
          uniforms.halfWidth.applyMatrix4(matrix42);
          uniforms.halfHeight.applyMatrix4(matrix42);
          state.rectArea[rectAreaLength] = uniforms;
          rectAreaLength++;
        } else if (light.isPointLight) {
          var uniforms = cache.get(light);
          uniforms.position.setFromMatrixPosition(light.matrixWorld);
          uniforms.position.applyMatrix4(viewMatrix);
          uniforms.color.copy(light.color).multiplyScalar(light.intensity);
          uniforms.distance = light.distance;
          uniforms.decay = light.decay;
          uniforms.shadow = light.castShadow;
          if (light.castShadow) {
            var shadow = light.shadow;
            uniforms.shadowBias = shadow.bias;
            uniforms.shadowRadius = shadow.radius;
            uniforms.shadowMapSize = shadow.mapSize;
            uniforms.shadowCameraNear = shadow.camera.near;
            uniforms.shadowCameraFar = shadow.camera.far;
          }
          state.pointShadowMap[pointLength] = shadowMap;
          state.pointShadowMatrix[pointLength] = light.shadow.matrix;
          state.point[pointLength] = uniforms;
          pointLength++;
        } else if (light.isHemisphereLight) {
          var uniforms = cache.get(light);
          uniforms.direction.setFromMatrixPosition(light.matrixWorld);
          uniforms.direction.transformDirection(viewMatrix);
          uniforms.direction.normalize();
          uniforms.skyColor.copy(light.color).multiplyScalar(intensity);
          uniforms.groundColor.copy(light.groundColor).multiplyScalar(intensity);
          state.hemi[hemiLength] = uniforms;
          hemiLength++;
        }
      }
      state.ambient[0] = r;
      state.ambient[1] = g;
      state.ambient[2] = b;
      state.directional.length = directionalLength;
      state.spot.length = spotLength;
      state.rectArea.length = rectAreaLength;
      state.point.length = pointLength;
      state.hemi.length = hemiLength;
      state.hash.stateID = state.id;
      state.hash.directionalLength = directionalLength;
      state.hash.pointLength = pointLength;
      state.hash.spotLength = spotLength;
      state.hash.rectAreaLength = rectAreaLength;
      state.hash.hemiLength = hemiLength;
      state.hash.shadowsLength = shadows.length;
    }
    return {
      setup: setup,
      state: state
    };
  }
  function WebGLRenderState() {
    var lights = new WebGLLights();
    var lightsArray = [];
    var shadowsArray = [];
    function init() {
      lightsArray.length = 0;
      shadowsArray.length = 0;
    }
    function pushLight(light) {
      lightsArray.push(light);
    }
    function pushShadow(shadowLight) {
      shadowsArray.push(shadowLight);
    }
    function setupLights(camera) {
      lights.setup(lightsArray, shadowsArray, camera);
    }
    var state = {
      lightsArray: lightsArray,
      shadowsArray: shadowsArray,
      lights: lights
    };
    return {
      init: init,
      state: state,
      setupLights: setupLights,
      pushLight: pushLight,
      pushShadow: pushShadow
    };
  }
  function WebGLRenderStates() {
    var renderStates = {};
    function onSceneDispose(event) {
      var scene = event.target;
      scene.removeEventListener('dispose', onSceneDispose);
      delete renderStates[scene.id];
    }
    function get(scene, camera) {
      var renderState;
      if (renderStates[scene.id] === undefined) {
        renderState = new WebGLRenderState();
        renderStates[scene.id] = {};
        renderStates[scene.id][camera.id] = renderState;
        scene.addEventListener('dispose', onSceneDispose);
      } else {
        if (renderStates[scene.id][camera.id] === undefined) {
          renderState = new WebGLRenderState();
          renderStates[scene.id][camera.id] = renderState;
        } else {
          renderState = renderStates[scene.id][camera.id];
        }
      }
      return renderState;
    }
    function dispose() {
      renderStates = {};
    }
    return {
      get: get,
      dispose: dispose
    };
  }
  function MeshDepthMaterial(parameters) {
    Material.call(this);
    this.type = 'MeshDepthMaterial';
    this.depthPacking = BasicDepthPacking;
    this.skinning = false;
    this.morphTargets = false;
    this.map = null;
    this.alphaMap = null;
    this.displacementMap = null;
    this.displacementScale = 1;
    this.displacementBias = 0;
    this.wireframe = false;
    this.wireframeLinewidth = 1;
    this.fog = false;
    this.lights = false;
    this.setValues(parameters);
  }
  MeshDepthMaterial.prototype = Object.create(Material.prototype);
  MeshDepthMaterial.prototype.constructor = MeshDepthMaterial;
  MeshDepthMaterial.prototype.isMeshDepthMaterial = true;
  MeshDepthMaterial.prototype.copy = function(source) {
    Material.prototype.copy.call(this, source);
    this.depthPacking = source.depthPacking;
    this.skinning = source.skinning;
    this.morphTargets = source.morphTargets;
    this.map = source.map;
    this.alphaMap = source.alphaMap;
    this.displacementMap = source.displacementMap;
    this.displacementScale = source.displacementScale;
    this.displacementBias = source.displacementBias;
    this.wireframe = source.wireframe;
    this.wireframeLinewidth = source.wireframeLinewidth;
    return this;
  };
  function MeshDistanceMaterial(parameters) {
    Material.call(this);
    this.type = 'MeshDistanceMaterial';
    this.referencePosition = new Vector3();
    this.nearDistance = 1;
    this.farDistance = 1000;
    this.skinning = false;
    this.morphTargets = false;
    this.map = null;
    this.alphaMap = null;
    this.displacementMap = null;
    this.displacementScale = 1;
    this.displacementBias = 0;
    this.fog = false;
    this.lights = false;
    this.setValues(parameters);
  }
  MeshDistanceMaterial.prototype = Object.create(Material.prototype);
  MeshDistanceMaterial.prototype.constructor = MeshDistanceMaterial;
  MeshDistanceMaterial.prototype.isMeshDistanceMaterial = true;
  MeshDistanceMaterial.prototype.copy = function(source) {
    Material.prototype.copy.call(this, source);
    this.referencePosition.copy(source.referencePosition);
    this.nearDistance = source.nearDistance;
    this.farDistance = source.farDistance;
    this.skinning = source.skinning;
    this.morphTargets = source.morphTargets;
    this.map = source.map;
    this.alphaMap = source.alphaMap;
    this.displacementMap = source.displacementMap;
    this.displacementScale = source.displacementScale;
    this.displacementBias = source.displacementBias;
    return this;
  };
  function WebGLShadowMap(_renderer, _objects, maxTextureSize) {
    var _frustum = new Frustum(),
        _projScreenMatrix = new Matrix4(),
        _shadowMapSize = new Vector2(),
        _maxShadowMapSize = new Vector2(maxTextureSize, maxTextureSize),
        _lookTarget = new Vector3(),
        _lightPositionWorld = new Vector3(),
        _MorphingFlag = 1,
        _SkinningFlag = 2,
        _NumberOfMaterialVariants = (_MorphingFlag | _SkinningFlag) + 1,
        _depthMaterials = new Array(_NumberOfMaterialVariants),
        _distanceMaterials = new Array(_NumberOfMaterialVariants),
        _materialCache = {};
    var shadowSide = {
      0: BackSide,
      1: FrontSide,
      2: DoubleSide
    };
    var cubeDirections = [new Vector3(1, 0, 0), new Vector3(-1, 0, 0), new Vector3(0, 0, 1), new Vector3(0, 0, -1), new Vector3(0, 1, 0), new Vector3(0, -1, 0)];
    var cubeUps = [new Vector3(0, 1, 0), new Vector3(0, 1, 0), new Vector3(0, 1, 0), new Vector3(0, 1, 0), new Vector3(0, 0, 1), new Vector3(0, 0, -1)];
    var cube2DViewPorts = [new Vector4(), new Vector4(), new Vector4(), new Vector4(), new Vector4(), new Vector4()];
    for (var i = 0; i !== _NumberOfMaterialVariants; ++i) {
      var useMorphing = (i & _MorphingFlag) !== 0;
      var useSkinning = (i & _SkinningFlag) !== 0;
      var depthMaterial = new MeshDepthMaterial({
        depthPacking: RGBADepthPacking,
        morphTargets: useMorphing,
        skinning: useSkinning
      });
      _depthMaterials[i] = depthMaterial;
      var distanceMaterial = new MeshDistanceMaterial({
        morphTargets: useMorphing,
        skinning: useSkinning
      });
      _distanceMaterials[i] = distanceMaterial;
    }
    var scope = this;
    this.enabled = false;
    this.autoUpdate = true;
    this.needsUpdate = false;
    this.type = PCFShadowMap;
    this.render = function(lights, scene, camera) {
      if (scope.enabled === false)
        return;
      if (scope.autoUpdate === false && scope.needsUpdate === false)
        return;
      if (lights.length === 0)
        return;
      var currentRenderTarget = _renderer.getRenderTarget();
      var _state = _renderer.state;
      _state.setBlending(NoBlending);
      _state.buffers.color.setClear(1, 1, 1, 1);
      _state.buffers.depth.setTest(true);
      _state.setScissorTest(false);
      var faceCount;
      for (var i = 0,
          il = lights.length; i < il; i++) {
        var light = lights[i];
        var shadow = light.shadow;
        var isPointLight = light && light.isPointLight;
        if (shadow === undefined) {
          console.warn('THREE.WebGLShadowMap:', light, 'has no shadow.');
          continue;
        }
        var shadowCamera = shadow.camera;
        _shadowMapSize.copy(shadow.mapSize);
        _shadowMapSize.min(_maxShadowMapSize);
        if (isPointLight) {
          var vpWidth = _shadowMapSize.x;
          var vpHeight = _shadowMapSize.y;
          cube2DViewPorts[0].set(vpWidth * 2, vpHeight, vpWidth, vpHeight);
          cube2DViewPorts[1].set(0, vpHeight, vpWidth, vpHeight);
          cube2DViewPorts[2].set(vpWidth * 3, vpHeight, vpWidth, vpHeight);
          cube2DViewPorts[3].set(vpWidth, vpHeight, vpWidth, vpHeight);
          cube2DViewPorts[4].set(vpWidth * 3, 0, vpWidth, vpHeight);
          cube2DViewPorts[5].set(vpWidth, 0, vpWidth, vpHeight);
          _shadowMapSize.x *= 4.0;
          _shadowMapSize.y *= 2.0;
        }
        if (shadow.map === null) {
          var pars = {
            minFilter: NearestFilter,
            magFilter: NearestFilter,
            format: RGBAFormat
          };
          shadow.map = new WebGLRenderTarget(_shadowMapSize.x, _shadowMapSize.y, pars);
          shadow.map.texture.name = light.name + ".shadowMap";
          shadowCamera.updateProjectionMatrix();
        }
        if (shadow.isSpotLightShadow) {
          shadow.update(light);
        }
        var shadowMap = shadow.map;
        var shadowMatrix = shadow.matrix;
        _lightPositionWorld.setFromMatrixPosition(light.matrixWorld);
        shadowCamera.position.copy(_lightPositionWorld);
        if (isPointLight) {
          faceCount = 6;
          shadowMatrix.makeTranslation(-_lightPositionWorld.x, -_lightPositionWorld.y, -_lightPositionWorld.z);
        } else {
          faceCount = 1;
          _lookTarget.setFromMatrixPosition(light.target.matrixWorld);
          shadowCamera.lookAt(_lookTarget);
          shadowCamera.updateMatrixWorld();
          shadowMatrix.set(0.5, 0.0, 0.0, 0.5, 0.0, 0.5, 0.0, 0.5, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.0, 1.0);
          shadowMatrix.multiply(shadowCamera.projectionMatrix);
          shadowMatrix.multiply(shadowCamera.matrixWorldInverse);
        }
        _renderer.setRenderTarget(shadowMap);
        _renderer.clear();
        for (var face = 0; face < faceCount; face++) {
          if (isPointLight) {
            _lookTarget.copy(shadowCamera.position);
            _lookTarget.add(cubeDirections[face]);
            shadowCamera.up.copy(cubeUps[face]);
            shadowCamera.lookAt(_lookTarget);
            shadowCamera.updateMatrixWorld();
            var vpDimensions = cube2DViewPorts[face];
            _state.viewport(vpDimensions);
          }
          _projScreenMatrix.multiplyMatrices(shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse);
          _frustum.setFromMatrix(_projScreenMatrix);
          renderObject(scene, camera, shadowCamera, isPointLight);
        }
      }
      scope.needsUpdate = false;
      _renderer.setRenderTarget(currentRenderTarget);
    };
    function getDepthMaterial(object, material, isPointLight, lightPositionWorld, shadowCameraNear, shadowCameraFar) {
      var geometry = object.geometry;
      var result = null;
      var materialVariants = _depthMaterials;
      var customMaterial = object.customDepthMaterial;
      if (isPointLight) {
        materialVariants = _distanceMaterials;
        customMaterial = object.customDistanceMaterial;
      }
      if (!customMaterial) {
        var useMorphing = false;
        if (material.morphTargets) {
          if (geometry && geometry.isBufferGeometry) {
            useMorphing = geometry.morphAttributes && geometry.morphAttributes.position && geometry.morphAttributes.position.length > 0;
          } else if (geometry && geometry.isGeometry) {
            useMorphing = geometry.morphTargets && geometry.morphTargets.length > 0;
          }
        }
        if (object.isSkinnedMesh && material.skinning === false) {
          console.warn('THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:', object);
        }
        var useSkinning = object.isSkinnedMesh && material.skinning;
        var variantIndex = 0;
        if (useMorphing)
          variantIndex |= _MorphingFlag;
        if (useSkinning)
          variantIndex |= _SkinningFlag;
        result = materialVariants[variantIndex];
      } else {
        result = customMaterial;
      }
      if (_renderer.localClippingEnabled && material.clipShadows === true && material.clippingPlanes.length !== 0) {
        var keyA = result.uuid,
            keyB = material.uuid;
        var materialsForVariant = _materialCache[keyA];
        if (materialsForVariant === undefined) {
          materialsForVariant = {};
          _materialCache[keyA] = materialsForVariant;
        }
        var cachedMaterial = materialsForVariant[keyB];
        if (cachedMaterial === undefined) {
          cachedMaterial = result.clone();
          materialsForVariant[keyB] = cachedMaterial;
        }
        result = cachedMaterial;
      }
      result.visible = material.visible;
      result.wireframe = material.wireframe;
      result.side = (material.shadowSide != null) ? material.shadowSide : shadowSide[material.side];
      result.clipShadows = material.clipShadows;
      result.clippingPlanes = material.clippingPlanes;
      result.clipIntersection = material.clipIntersection;
      result.wireframeLinewidth = material.wireframeLinewidth;
      result.linewidth = material.linewidth;
      if (isPointLight && result.isMeshDistanceMaterial) {
        result.referencePosition.copy(lightPositionWorld);
        result.nearDistance = shadowCameraNear;
        result.farDistance = shadowCameraFar;
      }
      return result;
    }
    function renderObject(object, camera, shadowCamera, isPointLight) {
      if (object.visible === false)
        return;
      var visible = object.layers.test(camera.layers);
      if (visible && (object.isMesh || object.isLine || object.isPoints)) {
        if (object.castShadow && (!object.frustumCulled || _frustum.intersectsObject(object))) {
          object.modelViewMatrix.multiplyMatrices(shadowCamera.matrixWorldInverse, object.matrixWorld);
          var geometry = _objects.update(object);
          var material = object.material;
          if (Array.isArray(material)) {
            var groups = geometry.groups;
            for (var k = 0,
                kl = groups.length; k < kl; k++) {
              var group = groups[k];
              var groupMaterial = material[group.materialIndex];
              if (groupMaterial && groupMaterial.visible) {
                var depthMaterial = getDepthMaterial(object, groupMaterial, isPointLight, _lightPositionWorld, shadowCamera.near, shadowCamera.far);
                _renderer.renderBufferDirect(shadowCamera, null, geometry, depthMaterial, object, group);
              }
            }
          } else if (material.visible) {
            var depthMaterial = getDepthMaterial(object, material, isPointLight, _lightPositionWorld, shadowCamera.near, shadowCamera.far);
            _renderer.renderBufferDirect(shadowCamera, null, geometry, depthMaterial, object, null);
          }
        }
      }
      var children = object.children;
      for (var i = 0,
          l = children.length; i < l; i++) {
        renderObject(children[i], camera, shadowCamera, isPointLight);
      }
    }
  }
  function WebGLState(gl, extensions, utils, capabilities) {
    function ColorBuffer() {
      var locked = false;
      var color = new Vector4();
      var currentColorMask = null;
      var currentColorClear = new Vector4(0, 0, 0, 0);
      return {
        setMask: function(colorMask) {
          if (currentColorMask !== colorMask && !locked) {
            gl.colorMask(colorMask, colorMask, colorMask, colorMask);
            currentColorMask = colorMask;
          }
        },
        setLocked: function(lock) {
          locked = lock;
        },
        setClear: function(r, g, b, a, premultipliedAlpha) {
          if (premultipliedAlpha === true) {
            r *= a;
            g *= a;
            b *= a;
          }
          color.set(r, g, b, a);
          if (currentColorClear.equals(color) === false) {
            gl.clearColor(r, g, b, a);
            currentColorClear.copy(color);
          }
        },
        reset: function() {
          locked = false;
          currentColorMask = null;
          currentColorClear.set(-1, 0, 0, 0);
        }
      };
    }
    function DepthBuffer() {
      var locked = false;
      var currentDepthMask = null;
      var currentDepthFunc = null;
      var currentDepthClear = null;
      return {
        setTest: function(depthTest) {
          if (depthTest) {
            enable(2929);
          } else {
            disable(2929);
          }
        },
        setMask: function(depthMask) {
          if (currentDepthMask !== depthMask && !locked) {
            gl.depthMask(depthMask);
            currentDepthMask = depthMask;
          }
        },
        setFunc: function(depthFunc) {
          if (currentDepthFunc !== depthFunc) {
            if (depthFunc) {
              switch (depthFunc) {
                case NeverDepth:
                  gl.depthFunc(512);
                  break;
                case AlwaysDepth:
                  gl.depthFunc(519);
                  break;
                case LessDepth:
                  gl.depthFunc(513);
                  break;
                case LessEqualDepth:
                  gl.depthFunc(515);
                  break;
                case EqualDepth:
                  gl.depthFunc(514);
                  break;
                case GreaterEqualDepth:
                  gl.depthFunc(518);
                  break;
                case GreaterDepth:
                  gl.depthFunc(516);
                  break;
                case NotEqualDepth:
                  gl.depthFunc(517);
                  break;
                default:
                  gl.depthFunc(515);
              }
            } else {
              gl.depthFunc(515);
            }
            currentDepthFunc = depthFunc;
          }
        },
        setLocked: function(lock) {
          locked = lock;
        },
        setClear: function(depth) {
          if (currentDepthClear !== depth) {
            gl.clearDepth(depth);
            currentDepthClear = depth;
          }
        },
        reset: function() {
          locked = false;
          currentDepthMask = null;
          currentDepthFunc = null;
          currentDepthClear = null;
        }
      };
    }
    function StencilBuffer() {
      var locked = false;
      var currentStencilMask = null;
      var currentStencilFunc = null;
      var currentStencilRef = null;
      var currentStencilFuncMask = null;
      var currentStencilFail = null;
      var currentStencilZFail = null;
      var currentStencilZPass = null;
      var currentStencilClear = null;
      return {
        setTest: function(stencilTest) {
          if (stencilTest) {
            enable(2960);
          } else {
            disable(2960);
          }
        },
        setMask: function(stencilMask) {
          if (currentStencilMask !== stencilMask && !locked) {
            gl.stencilMask(stencilMask);
            currentStencilMask = stencilMask;
          }
        },
        setFunc: function(stencilFunc, stencilRef, stencilMask) {
          if (currentStencilFunc !== stencilFunc || currentStencilRef !== stencilRef || currentStencilFuncMask !== stencilMask) {
            gl.stencilFunc(stencilFunc, stencilRef, stencilMask);
            currentStencilFunc = stencilFunc;
            currentStencilRef = stencilRef;
            currentStencilFuncMask = stencilMask;
          }
        },
        setOp: function(stencilFail, stencilZFail, stencilZPass) {
          if (currentStencilFail !== stencilFail || currentStencilZFail !== stencilZFail || currentStencilZPass !== stencilZPass) {
            gl.stencilOp(stencilFail, stencilZFail, stencilZPass);
            currentStencilFail = stencilFail;
            currentStencilZFail = stencilZFail;
            currentStencilZPass = stencilZPass;
          }
        },
        setLocked: function(lock) {
          locked = lock;
        },
        setClear: function(stencil) {
          if (currentStencilClear !== stencil) {
            gl.clearStencil(stencil);
            currentStencilClear = stencil;
          }
        },
        reset: function() {
          locked = false;
          currentStencilMask = null;
          currentStencilFunc = null;
          currentStencilRef = null;
          currentStencilFuncMask = null;
          currentStencilFail = null;
          currentStencilZFail = null;
          currentStencilZPass = null;
          currentStencilClear = null;
        }
      };
    }
    var colorBuffer = new ColorBuffer();
    var depthBuffer = new DepthBuffer();
    var stencilBuffer = new StencilBuffer();
    var maxVertexAttributes = gl.getParameter(34921);
    var newAttributes = new Uint8Array(maxVertexAttributes);
    var enabledAttributes = new Uint8Array(maxVertexAttributes);
    var attributeDivisors = new Uint8Array(maxVertexAttributes);
    var enabledCapabilities = {};
    var compressedTextureFormats = null;
    var currentProgram = null;
    var currentBlendingEnabled = null;
    var currentBlending = null;
    var currentBlendEquation = null;
    var currentBlendSrc = null;
    var currentBlendDst = null;
    var currentBlendEquationAlpha = null;
    var currentBlendSrcAlpha = null;
    var currentBlendDstAlpha = null;
    var currentPremultipledAlpha = false;
    var currentFlipSided = null;
    var currentCullFace = null;
    var currentLineWidth = null;
    var currentPolygonOffsetFactor = null;
    var currentPolygonOffsetUnits = null;
    var maxTextures = gl.getParameter(35661);
    var lineWidthAvailable = false;
    var version = 0;
    var glVersion = gl.getParameter(7938);
    if (glVersion.indexOf('WebGL') !== -1) {
      version = parseFloat(/^WebGL\ ([0-9])/.exec(glVersion)[1]);
      lineWidthAvailable = (version >= 1.0);
    } else if (glVersion.indexOf('OpenGL ES') !== -1) {
      version = parseFloat(/^OpenGL\ ES\ ([0-9])/.exec(glVersion)[1]);
      lineWidthAvailable = (version >= 2.0);
    }
    var currentTextureSlot = null;
    var currentBoundTextures = {};
    var currentScissor = new Vector4();
    var currentViewport = new Vector4();
    function createTexture(type, target, count) {
      var data = new Uint8Array(4);
      var texture = gl.createTexture();
      gl.bindTexture(type, texture);
      gl.texParameteri(type, 10241, 9728);
      gl.texParameteri(type, 10240, 9728);
      for (var i = 0; i < count; i++) {
        gl.texImage2D(target + i, 0, 6408, 1, 1, 0, 6408, 5121, data);
      }
      return texture;
    }
    var emptyTextures = {};
    emptyTextures[3553] = createTexture(3553, 3553, 1);
    emptyTextures[34067] = createTexture(34067, 34069, 6);
    colorBuffer.setClear(0, 0, 0, 1);
    depthBuffer.setClear(1);
    stencilBuffer.setClear(0);
    enable(2929);
    depthBuffer.setFunc(LessEqualDepth);
    setFlipSided(false);
    setCullFace(CullFaceBack);
    enable(2884);
    setBlending(NoBlending);
    function initAttributes() {
      for (var i = 0,
          l = newAttributes.length; i < l; i++) {
        newAttributes[i] = 0;
      }
    }
    function enableAttribute(attribute) {
      enableAttributeAndDivisor(attribute, 0);
    }
    function enableAttributeAndDivisor(attribute, meshPerAttribute) {
      newAttributes[attribute] = 1;
      if (enabledAttributes[attribute] === 0) {
        gl.enableVertexAttribArray(attribute);
        enabledAttributes[attribute] = 1;
      }
      if (attributeDivisors[attribute] !== meshPerAttribute) {
        var extension = capabilities.isWebGL2 ? gl : extensions.get('ANGLE_instanced_arrays');
        extension[capabilities.isWebGL2 ? 'vertexAttribDivisor' : 'vertexAttribDivisorANGLE'](attribute, meshPerAttribute);
        attributeDivisors[attribute] = meshPerAttribute;
      }
    }
    function disableUnusedAttributes() {
      for (var i = 0,
          l = enabledAttributes.length; i !== l; ++i) {
        if (enabledAttributes[i] !== newAttributes[i]) {
          gl.disableVertexAttribArray(i);
          enabledAttributes[i] = 0;
        }
      }
    }
    function enable(id) {
      if (enabledCapabilities[id] !== true) {
        gl.enable(id);
        enabledCapabilities[id] = true;
      }
    }
    function disable(id) {
      if (enabledCapabilities[id] !== false) {
        gl.disable(id);
        enabledCapabilities[id] = false;
      }
    }
    function getCompressedTextureFormats() {
      if (compressedTextureFormats === null) {
        compressedTextureFormats = [];
        if (extensions.get('WEBGL_compressed_texture_pvrtc') || extensions.get('WEBGL_compressed_texture_s3tc') || extensions.get('WEBGL_compressed_texture_etc1') || extensions.get('WEBGL_compressed_texture_astc')) {
          var formats = gl.getParameter(34467);
          for (var i = 0; i < formats.length; i++) {
            compressedTextureFormats.push(formats[i]);
          }
        }
      }
      return compressedTextureFormats;
    }
    function useProgram(program) {
      if (currentProgram !== program) {
        gl.useProgram(program);
        currentProgram = program;
        return true;
      }
      return false;
    }
    function setBlending(blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha) {
      if (blending === NoBlending) {
        if (currentBlendingEnabled) {
          disable(3042);
          currentBlendingEnabled = false;
        }
        return;
      }
      if (!currentBlendingEnabled) {
        enable(3042);
        currentBlendingEnabled = true;
      }
      if (blending !== CustomBlending) {
        if (blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha) {
          if (currentBlendEquation !== AddEquation || currentBlendEquationAlpha !== AddEquation) {
            gl.blendEquation(32774);
            currentBlendEquation = AddEquation;
            currentBlendEquationAlpha = AddEquation;
          }
          if (premultipliedAlpha) {
            switch (blending) {
              case NormalBlending:
                gl.blendFuncSeparate(1, 771, 1, 771);
                break;
              case AdditiveBlending:
                gl.blendFunc(1, 1);
                break;
              case SubtractiveBlending:
                gl.blendFuncSeparate(0, 0, 769, 771);
                break;
              case MultiplyBlending:
                gl.blendFuncSeparate(0, 768, 0, 770);
                break;
              default:
                console.error('THREE.WebGLState: Invalid blending: ', blending);
                break;
            }
          } else {
            switch (blending) {
              case NormalBlending:
                gl.blendFuncSeparate(770, 771, 1, 771);
                break;
              case AdditiveBlending:
                gl.blendFunc(770, 1);
                break;
              case SubtractiveBlending:
                gl.blendFunc(0, 769);
                break;
              case MultiplyBlending:
                gl.blendFunc(0, 768);
                break;
              default:
                console.error('THREE.WebGLState: Invalid blending: ', blending);
                break;
            }
          }
          currentBlendSrc = null;
          currentBlendDst = null;
          currentBlendSrcAlpha = null;
          currentBlendDstAlpha = null;
          currentBlending = blending;
          currentPremultipledAlpha = premultipliedAlpha;
        }
        return;
      }
      blendEquationAlpha = blendEquationAlpha || blendEquation;
      blendSrcAlpha = blendSrcAlpha || blendSrc;
      blendDstAlpha = blendDstAlpha || blendDst;
      if (blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha) {
        gl.blendEquationSeparate(utils.convert(blendEquation), utils.convert(blendEquationAlpha));
        currentBlendEquation = blendEquation;
        currentBlendEquationAlpha = blendEquationAlpha;
      }
      if (blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha) {
        gl.blendFuncSeparate(utils.convert(blendSrc), utils.convert(blendDst), utils.convert(blendSrcAlpha), utils.convert(blendDstAlpha));
        currentBlendSrc = blendSrc;
        currentBlendDst = blendDst;
        currentBlendSrcAlpha = blendSrcAlpha;
        currentBlendDstAlpha = blendDstAlpha;
      }
      currentBlending = blending;
      currentPremultipledAlpha = null;
    }
    function setMaterial(material, frontFaceCW) {
      material.side === DoubleSide ? disable(2884) : enable(2884);
      var flipSided = (material.side === BackSide);
      if (frontFaceCW)
        flipSided = !flipSided;
      setFlipSided(flipSided);
      (material.blending === NormalBlending && material.transparent === false) ? setBlending(NoBlending) : setBlending(material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha);
      depthBuffer.setFunc(material.depthFunc);
      depthBuffer.setTest(material.depthTest);
      depthBuffer.setMask(material.depthWrite);
      colorBuffer.setMask(material.colorWrite);
      setPolygonOffset(material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits);
    }
    function setFlipSided(flipSided) {
      if (currentFlipSided !== flipSided) {
        if (flipSided) {
          gl.frontFace(2304);
        } else {
          gl.frontFace(2305);
        }
        currentFlipSided = flipSided;
      }
    }
    function setCullFace(cullFace) {
      if (cullFace !== CullFaceNone) {
        enable(2884);
        if (cullFace !== currentCullFace) {
          if (cullFace === CullFaceBack) {
            gl.cullFace(1029);
          } else if (cullFace === CullFaceFront) {
            gl.cullFace(1028);
          } else {
            gl.cullFace(1032);
          }
        }
      } else {
        disable(2884);
      }
      currentCullFace = cullFace;
    }
    function setLineWidth(width) {
      if (width !== currentLineWidth) {
        if (lineWidthAvailable)
          gl.lineWidth(width);
        currentLineWidth = width;
      }
    }
    function setPolygonOffset(polygonOffset, factor, units) {
      if (polygonOffset) {
        enable(32823);
        if (currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units) {
          gl.polygonOffset(factor, units);
          currentPolygonOffsetFactor = factor;
          currentPolygonOffsetUnits = units;
        }
      } else {
        disable(32823);
      }
    }
    function setScissorTest(scissorTest) {
      if (scissorTest) {
        enable(3089);
      } else {
        disable(3089);
      }
    }
    function activeTexture(webglSlot) {
      if (webglSlot === undefined)
        webglSlot = 33984 + maxTextures - 1;
      if (currentTextureSlot !== webglSlot) {
        gl.activeTexture(webglSlot);
        currentTextureSlot = webglSlot;
      }
    }
    function bindTexture(webglType, webglTexture) {
      if (currentTextureSlot === null) {
        activeTexture();
      }
      var boundTexture = currentBoundTextures[currentTextureSlot];
      if (boundTexture === undefined) {
        boundTexture = {
          type: undefined,
          texture: undefined
        };
        currentBoundTextures[currentTextureSlot] = boundTexture;
      }
      if (boundTexture.type !== webglType || boundTexture.texture !== webglTexture) {
        gl.bindTexture(webglType, webglTexture || emptyTextures[webglType]);
        boundTexture.type = webglType;
        boundTexture.texture = webglTexture;
      }
    }
    function compressedTexImage2D() {
      try {
        gl.compressedTexImage2D.apply(gl, arguments);
      } catch (error) {
        console.error('THREE.WebGLState:', error);
      }
    }
    function texImage2D() {
      try {
        gl.texImage2D.apply(gl, arguments);
      } catch (error) {
        console.error('THREE.WebGLState:', error);
      }
    }
    function texImage3D() {
      try {
        gl.texImage3D.apply(gl, arguments);
      } catch (error) {
        console.error('THREE.WebGLState:', error);
      }
    }
    function scissor(scissor) {
      if (currentScissor.equals(scissor) === false) {
        gl.scissor(scissor.x, scissor.y, scissor.z, scissor.w);
        currentScissor.copy(scissor);
      }
    }
    function viewport(viewport) {
      if (currentViewport.equals(viewport) === false) {
        gl.viewport(viewport.x, viewport.y, viewport.z, viewport.w);
        currentViewport.copy(viewport);
      }
    }
    function reset() {
      for (var i = 0; i < enabledAttributes.length; i++) {
        if (enabledAttributes[i] === 1) {
          gl.disableVertexAttribArray(i);
          enabledAttributes[i] = 0;
        }
      }
      enabledCapabilities = {};
      compressedTextureFormats = null;
      currentTextureSlot = null;
      currentBoundTextures = {};
      currentProgram = null;
      currentBlending = null;
      currentFlipSided = null;
      currentCullFace = null;
      colorBuffer.reset();
      depthBuffer.reset();
      stencilBuffer.reset();
    }
    return {
      buffers: {
        color: colorBuffer,
        depth: depthBuffer,
        stencil: stencilBuffer
      },
      initAttributes: initAttributes,
      enableAttribute: enableAttribute,
      enableAttributeAndDivisor: enableAttributeAndDivisor,
      disableUnusedAttributes: disableUnusedAttributes,
      enable: enable,
      disable: disable,
      getCompressedTextureFormats: getCompressedTextureFormats,
      useProgram: useProgram,
      setBlending: setBlending,
      setMaterial: setMaterial,
      setFlipSided: setFlipSided,
      setCullFace: setCullFace,
      setLineWidth: setLineWidth,
      setPolygonOffset: setPolygonOffset,
      setScissorTest: setScissorTest,
      activeTexture: activeTexture,
      bindTexture: bindTexture,
      compressedTexImage2D: compressedTexImage2D,
      texImage2D: texImage2D,
      texImage3D: texImage3D,
      scissor: scissor,
      viewport: viewport,
      reset: reset
    };
  }
  function WebGLTextures(_gl, extensions, state, properties, capabilities, utils, info) {
    var _videoTextures = {};
    var _canvas;
    var useOffscreenCanvas = typeof OffscreenCanvas !== 'undefined';
    function createCanvas(width, height) {
      return useOffscreenCanvas ? new OffscreenCanvas(width, height) : document.createElementNS('http://www.w3.org/1999/xhtml', 'canvas');
    }
    function resizeImage(image, needsPowerOfTwo, needsNewCanvas, maxSize) {
      var scale = 1;
      if (image.width > maxSize || image.height > maxSize) {
        scale = maxSize / Math.max(image.width, image.height);
      }
      if (scale < 1 || needsPowerOfTwo === true) {
        if (image instanceof ImageBitmap || image instanceof HTMLImageElement || image instanceof HTMLCanvasElement) {
          var floor = needsPowerOfTwo ? _Math.floorPowerOfTwo : Math.floor;
          var width = floor(scale * image.width);
          var height = floor(scale * image.height);
          if (_canvas === undefined)
            _canvas = createCanvas(width, height);
          var canvas = needsNewCanvas ? createCanvas(width, height) : _canvas;
          canvas.width = width;
          canvas.height = height;
          var context = canvas.getContext('2d');
          context.drawImage(image, 0, 0, width, height);
          console.warn('THREE.WebGLRenderer: Texture has been resized from (' + image.width + 'x' + image.height + ') to (' + width + 'x' + height + ').');
          return useOffscreenCanvas ? canvas.transferToImageBitmap() : canvas;
        } else {
          if ('data' in image) {
            console.warn('THREE.WebGLRenderer: Image in DataTexture is too big (' + image.width + 'x' + image.height + ').');
          }
          return image;
        }
      }
      return image;
    }
    function isPowerOfTwo(image) {
      return _Math.isPowerOfTwo(image.width) && _Math.isPowerOfTwo(image.height);
    }
    function textureNeedsPowerOfTwo(texture) {
      if (capabilities.isWebGL2)
        return false;
      return (texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping) || (texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter);
    }
    function textureNeedsGenerateMipmaps(texture, supportsMips) {
      return texture.generateMipmaps && supportsMips && texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter;
    }
    function generateMipmap(target, texture, width, height) {
      _gl.generateMipmap(target);
      var textureProperties = properties.get(texture);
      textureProperties.__maxMipLevel = Math.log(Math.max(width, height)) * Math.LOG2E;
    }
    function getInternalFormat(glFormat, glType) {
      if (!capabilities.isWebGL2)
        return glFormat;
      var internalFormat = glFormat;
      if (glFormat === 6403) {
        if (glType === 5126)
          internalFormat = 33326;
        if (glType === 5131)
          internalFormat = 33325;
        if (glType === 5121)
          internalFormat = 33321;
      }
      if (glFormat === 6407) {
        if (glType === 5126)
          internalFormat = 34837;
        if (glType === 5131)
          internalFormat = 34843;
        if (glType === 5121)
          internalFormat = 32849;
      }
      if (glFormat === 6408) {
        if (glType === 5126)
          internalFormat = 34836;
        if (glType === 5131)
          internalFormat = 34842;
        if (glType === 5121)
          internalFormat = 32856;
      }
      if (internalFormat === 33325 || internalFormat === 33326 || internalFormat === 34842 || internalFormat === 34836) {
        extensions.get('EXT_color_buffer_float');
      } else if (internalFormat === 34843 || internalFormat === 34837) {
        console.warn('THREE.WebGLRenderer: Floating point textures with RGB format not supported. Please use RGBA instead.');
      }
      return internalFormat;
    }
    function filterFallback(f) {
      if (f === NearestFilter || f === NearestMipMapNearestFilter || f === NearestMipMapLinearFilter) {
        return 9728;
      }
      return 9729;
    }
    function onTextureDispose(event) {
      var texture = event.target;
      texture.removeEventListener('dispose', onTextureDispose);
      deallocateTexture(texture);
      if (texture.isVideoTexture) {
        delete _videoTextures[texture.id];
      }
      info.memory.textures--;
    }
    function onRenderTargetDispose(event) {
      var renderTarget = event.target;
      renderTarget.removeEventListener('dispose', onRenderTargetDispose);
      deallocateRenderTarget(renderTarget);
      info.memory.textures--;
    }
    function deallocateTexture(texture) {
      var textureProperties = properties.get(texture);
      if (textureProperties.__webglInit === undefined)
        return;
      _gl.deleteTexture(textureProperties.__webglTexture);
      properties.remove(texture);
    }
    function deallocateRenderTarget(renderTarget) {
      var renderTargetProperties = properties.get(renderTarget);
      var textureProperties = properties.get(renderTarget.texture);
      if (!renderTarget)
        return;
      if (textureProperties.__webglTexture !== undefined) {
        _gl.deleteTexture(textureProperties.__webglTexture);
      }
      if (renderTarget.depthTexture) {
        renderTarget.depthTexture.dispose();
      }
      if (renderTarget.isWebGLRenderTargetCube) {
        for (var i = 0; i < 6; i++) {
          _gl.deleteFramebuffer(renderTargetProperties.__webglFramebuffer[i]);
          if (renderTargetProperties.__webglDepthbuffer)
            _gl.deleteRenderbuffer(renderTargetProperties.__webglDepthbuffer[i]);
        }
      } else {
        _gl.deleteFramebuffer(renderTargetProperties.__webglFramebuffer);
        if (renderTargetProperties.__webglDepthbuffer)
          _gl.deleteRenderbuffer(renderTargetProperties.__webglDepthbuffer);
      }
      properties.remove(renderTarget.texture);
      properties.remove(renderTarget);
    }
    function setTexture2D(texture, slot) {
      var textureProperties = properties.get(texture);
      if (texture.isVideoTexture)
        updateVideoTexture(texture);
      if (texture.version > 0 && textureProperties.__version !== texture.version) {
        var image = texture.image;
        if (image === undefined) {
          console.warn('THREE.WebGLRenderer: Texture marked for update but image is undefined');
        } else if (image.complete === false) {
          console.warn('THREE.WebGLRenderer: Texture marked for update but image is incomplete');
        } else {
          uploadTexture(textureProperties, texture, slot);
          return;
        }
      }
      state.activeTexture(33984 + slot);
      state.bindTexture(3553, textureProperties.__webglTexture);
    }
    function setTexture3D(texture, slot) {
      var textureProperties = properties.get(texture);
      if (texture.version > 0 && textureProperties.__version !== texture.version) {
        uploadTexture(textureProperties, texture, slot);
        return;
      }
      state.activeTexture(33984 + slot);
      state.bindTexture(32879, textureProperties.__webglTexture);
    }
    function setTextureCube(texture, slot) {
      var textureProperties = properties.get(texture);
      if (texture.image.length === 6) {
        if (texture.version > 0 && textureProperties.__version !== texture.version) {
          initTexture(textureProperties, texture);
          state.activeTexture(33984 + slot);
          state.bindTexture(34067, textureProperties.__webglTexture);
          _gl.pixelStorei(37440, texture.flipY);
          var isCompressed = (texture && texture.isCompressedTexture);
          var isDataTexture = (texture.image[0] && texture.image[0].isDataTexture);
          var cubeImage = [];
          for (var i = 0; i < 6; i++) {
            if (!isCompressed && !isDataTexture) {
              cubeImage[i] = resizeImage(texture.image[i], false, true, capabilities.maxCubemapSize);
            } else {
              cubeImage[i] = isDataTexture ? texture.image[i].image : texture.image[i];
            }
          }
          var image = cubeImage[0],
              supportsMips = isPowerOfTwo(image) || capabilities.isWebGL2,
              glFormat = utils.convert(texture.format),
              glType = utils.convert(texture.type),
              glInternalFormat = getInternalFormat(glFormat, glType);
          setTextureParameters(34067, texture, supportsMips);
          for (var i = 0; i < 6; i++) {
            if (!isCompressed) {
              if (isDataTexture) {
                state.texImage2D(34069 + i, 0, glInternalFormat, cubeImage[i].width, cubeImage[i].height, 0, glFormat, glType, cubeImage[i].data);
              } else {
                state.texImage2D(34069 + i, 0, glInternalFormat, glFormat, glType, cubeImage[i]);
              }
            } else {
              var mipmap,
                  mipmaps = cubeImage[i].mipmaps;
              for (var j = 0,
                  jl = mipmaps.length; j < jl; j++) {
                mipmap = mipmaps[j];
                if (texture.format !== RGBAFormat && texture.format !== RGBFormat) {
                  if (state.getCompressedTextureFormats().indexOf(glFormat) > -1) {
                    state.compressedTexImage2D(34069 + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data);
                  } else {
                    console.warn('THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()');
                  }
                } else {
                  state.texImage2D(34069 + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data);
                }
              }
            }
          }
          if (!isCompressed) {
            textureProperties.__maxMipLevel = 0;
          } else {
            textureProperties.__maxMipLevel = mipmaps.length - 1;
          }
          if (textureNeedsGenerateMipmaps(texture, supportsMips)) {
            generateMipmap(34067, texture, image.width, image.height);
          }
          textureProperties.__version = texture.version;
          if (texture.onUpdate)
            texture.onUpdate(texture);
        } else {
          state.activeTexture(33984 + slot);
          state.bindTexture(34067, textureProperties.__webglTexture);
        }
      }
    }
    function setTextureCubeDynamic(texture, slot) {
      state.activeTexture(33984 + slot);
      state.bindTexture(34067, properties.get(texture).__webglTexture);
    }
    function setTextureParameters(textureType, texture, supportsMips) {
      var extension;
      if (supportsMips) {
        _gl.texParameteri(textureType, 10242, utils.convert(texture.wrapS));
        _gl.texParameteri(textureType, 10243, utils.convert(texture.wrapT));
        if (textureType === 32879) {
          _gl.texParameteri(textureType, 32882, utils.convert(texture.wrapR));
        }
        _gl.texParameteri(textureType, 10240, utils.convert(texture.magFilter));
        _gl.texParameteri(textureType, 10241, utils.convert(texture.minFilter));
      } else {
        _gl.texParameteri(textureType, 10242, 33071);
        _gl.texParameteri(textureType, 10243, 33071);
        if (textureType === 32879) {
          _gl.texParameteri(textureType, 32882, 33071);
        }
        if (texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping) {
          console.warn('THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.');
        }
        _gl.texParameteri(textureType, 10240, filterFallback(texture.magFilter));
        _gl.texParameteri(textureType, 10241, filterFallback(texture.minFilter));
        if (texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter) {
          console.warn('THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.');
        }
      }
      extension = extensions.get('EXT_texture_filter_anisotropic');
      if (extension) {
        if (texture.type === FloatType && extensions.get('OES_texture_float_linear') === null)
          return;
        if (texture.type === HalfFloatType && (capabilities.isWebGL2 || extensions.get('OES_texture_half_float_linear')) === null)
          return;
        if (texture.anisotropy > 1 || properties.get(texture).__currentAnisotropy) {
          _gl.texParameterf(textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min(texture.anisotropy, capabilities.getMaxAnisotropy()));
          properties.get(texture).__currentAnisotropy = texture.anisotropy;
        }
      }
    }
    function initTexture(textureProperties, texture) {
      if (textureProperties.__webglInit === undefined) {
        textureProperties.__webglInit = true;
        texture.addEventListener('dispose', onTextureDispose);
        textureProperties.__webglTexture = _gl.createTexture();
        info.memory.textures++;
      }
    }
    function uploadTexture(textureProperties, texture, slot) {
      var textureType = (texture.isDataTexture3D) ? 32879 : 3553;
      initTexture(textureProperties, texture);
      state.activeTexture(33984 + slot);
      state.bindTexture(textureType, textureProperties.__webglTexture);
      _gl.pixelStorei(37440, texture.flipY);
      _gl.pixelStorei(37441, texture.premultiplyAlpha);
      _gl.pixelStorei(3317, texture.unpackAlignment);
      var needsPowerOfTwo = textureNeedsPowerOfTwo(texture) && isPowerOfTwo(texture.image) === false;
      var image = resizeImage(texture.image, needsPowerOfTwo, false, capabilities.maxTextureSize);
      var supportsMips = isPowerOfTwo(image) || capabilities.isWebGL2,
          glFormat = utils.convert(texture.format),
          glType = utils.convert(texture.type),
          glInternalFormat = getInternalFormat(glFormat, glType);
      setTextureParameters(textureType, texture, supportsMips);
      var mipmap,
          mipmaps = texture.mipmaps;
      if (texture.isDepthTexture) {
        glInternalFormat = 6402;
        if (texture.type === FloatType) {
          if (!capabilities.isWebGL2)
            throw new Error('Float Depth Texture only supported in WebGL2.0');
          glInternalFormat = 36012;
        } else if (capabilities.isWebGL2) {
          glInternalFormat = 33189;
        }
        if (texture.format === DepthFormat && glInternalFormat === 6402) {
          if (texture.type !== UnsignedShortType && texture.type !== UnsignedIntType) {
            console.warn('THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.');
            texture.type = UnsignedShortType;
            glType = utils.convert(texture.type);
          }
        }
        if (texture.format === DepthStencilFormat) {
          glInternalFormat = 34041;
          if (texture.type !== UnsignedInt248Type) {
            console.warn('THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.');
            texture.type = UnsignedInt248Type;
            glType = utils.convert(texture.type);
          }
        }
        state.texImage2D(3553, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null);
      } else if (texture.isDataTexture) {
        if (mipmaps.length > 0 && supportsMips) {
          for (var i = 0,
              il = mipmaps.length; i < il; i++) {
            mipmap = mipmaps[i];
            state.texImage2D(3553, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data);
          }
          texture.generateMipmaps = false;
          textureProperties.__maxMipLevel = mipmaps.length - 1;
        } else {
          state.texImage2D(3553, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data);
          textureProperties.__maxMipLevel = 0;
        }
      } else if (texture.isCompressedTexture) {
        for (var i = 0,
            il = mipmaps.length; i < il; i++) {
          mipmap = mipmaps[i];
          if (texture.format !== RGBAFormat && texture.format !== RGBFormat) {
            if (state.getCompressedTextureFormats().indexOf(glFormat) > -1) {
              state.compressedTexImage2D(3553, i, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data);
            } else {
              console.warn('THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()');
            }
          } else {
            state.texImage2D(3553, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data);
          }
        }
        textureProperties.__maxMipLevel = mipmaps.length - 1;
      } else if (texture.isDataTexture3D) {
        state.texImage3D(32879, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data);
        textureProperties.__maxMipLevel = 0;
      } else {
        if (mipmaps.length > 0 && supportsMips) {
          for (var i = 0,
              il = mipmaps.length; i < il; i++) {
            mipmap = mipmaps[i];
            state.texImage2D(3553, i, glInternalFormat, glFormat, glType, mipmap);
          }
          texture.generateMipmaps = false;
          textureProperties.__maxMipLevel = mipmaps.length - 1;
        } else {
          state.texImage2D(3553, 0, glInternalFormat, glFormat, glType, image);
          textureProperties.__maxMipLevel = 0;
        }
      }
      if (textureNeedsGenerateMipmaps(texture, supportsMips)) {
        generateMipmap(3553, texture, image.width, image.height);
      }
      textureProperties.__version = texture.version;
      if (texture.onUpdate)
        texture.onUpdate(texture);
    }
    function setupFrameBufferTexture(framebuffer, renderTarget, attachment, textureTarget) {
      var glFormat = utils.convert(renderTarget.texture.format);
      var glType = utils.convert(renderTarget.texture.type);
      var glInternalFormat = getInternalFormat(glFormat, glType);
      state.texImage2D(textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null);
      _gl.bindFramebuffer(36160, framebuffer);
      _gl.framebufferTexture2D(36160, attachment, textureTarget, properties.get(renderTarget.texture).__webglTexture, 0);
      _gl.bindFramebuffer(36160, null);
    }
    function setupRenderBufferStorage(renderbuffer, renderTarget, isMultisample) {
      _gl.bindRenderbuffer(36161, renderbuffer);
      if (renderTarget.depthBuffer && !renderTarget.stencilBuffer) {
        if (isMultisample) {
          var samples = getRenderTargetSamples(renderTarget);
          _gl.renderbufferStorageMultisample(36161, samples, 33189, renderTarget.width, renderTarget.height);
        } else {
          _gl.renderbufferStorage(36161, 33189, renderTarget.width, renderTarget.height);
        }
        _gl.framebufferRenderbuffer(36160, 36096, 36161, renderbuffer);
      } else if (renderTarget.depthBuffer && renderTarget.stencilBuffer) {
        if (isMultisample) {
          var samples = getRenderTargetSamples(renderTarget);
          _gl.renderbufferStorageMultisample(36161, samples, 34041, renderTarget.width, renderTarget.height);
        } else {
          _gl.renderbufferStorage(36161, 34041, renderTarget.width, renderTarget.height);
        }
        _gl.framebufferRenderbuffer(36160, 33306, 36161, renderbuffer);
      } else {
        var glFormat = utils.convert(renderTarget.texture.format);
        var glType = utils.convert(renderTarget.texture.type);
        var glInternalFormat = getInternalFormat(glFormat, glType);
        if (isMultisample) {
          var samples = getRenderTargetSamples(renderTarget);
          _gl.renderbufferStorageMultisample(36161, samples, glInternalFormat, renderTarget.width, renderTarget.height);
        } else {
          _gl.renderbufferStorage(36161, glInternalFormat, renderTarget.width, renderTarget.height);
        }
      }
      _gl.bindRenderbuffer(36161, null);
    }
    function setupDepthTexture(framebuffer, renderTarget) {
      var isCube = (renderTarget && renderTarget.isWebGLRenderTargetCube);
      if (isCube)
        throw new Error('Depth Texture with cube render targets is not supported');
      _gl.bindFramebuffer(36160, framebuffer);
      if (!(renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture)) {
        throw new Error('renderTarget.depthTexture must be an instance of THREE.DepthTexture');
      }
      if (!properties.get(renderTarget.depthTexture).__webglTexture || renderTarget.depthTexture.image.width !== renderTarget.width || renderTarget.depthTexture.image.height !== renderTarget.height) {
        renderTarget.depthTexture.image.width = renderTarget.width;
        renderTarget.depthTexture.image.height = renderTarget.height;
        renderTarget.depthTexture.needsUpdate = true;
      }
      setTexture2D(renderTarget.depthTexture, 0);
      var webglDepthTexture = properties.get(renderTarget.depthTexture).__webglTexture;
      if (renderTarget.depthTexture.format === DepthFormat) {
        _gl.framebufferTexture2D(36160, 36096, 3553, webglDepthTexture, 0);
      } else if (renderTarget.depthTexture.format === DepthStencilFormat) {
        _gl.framebufferTexture2D(36160, 33306, 3553, webglDepthTexture, 0);
      } else {
        throw new Error('Unknown depthTexture format');
      }
    }
    function setupDepthRenderbuffer(renderTarget) {
      var renderTargetProperties = properties.get(renderTarget);
      var isCube = (renderTarget.isWebGLRenderTargetCube === true);
      if (renderTarget.depthTexture) {
        if (isCube)
          throw new Error('target.depthTexture not supported in Cube render targets');
        setupDepthTexture(renderTargetProperties.__webglFramebuffer, renderTarget);
      } else {
        if (isCube) {
          renderTargetProperties.__webglDepthbuffer = [];
          for (var i = 0; i < 6; i++) {
            _gl.bindFramebuffer(36160, renderTargetProperties.__webglFramebuffer[i]);
            renderTargetProperties.__webglDepthbuffer[i] = _gl.createRenderbuffer();
            setupRenderBufferStorage(renderTargetProperties.__webglDepthbuffer[i], renderTarget);
          }
        } else {
          _gl.bindFramebuffer(36160, renderTargetProperties.__webglFramebuffer);
          renderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();
          setupRenderBufferStorage(renderTargetProperties.__webglDepthbuffer, renderTarget);
        }
      }
      _gl.bindFramebuffer(36160, null);
    }
    function setupRenderTarget(renderTarget) {
      var renderTargetProperties = properties.get(renderTarget);
      var textureProperties = properties.get(renderTarget.texture);
      renderTarget.addEventListener('dispose', onRenderTargetDispose);
      textureProperties.__webglTexture = _gl.createTexture();
      info.memory.textures++;
      var isCube = (renderTarget.isWebGLRenderTargetCube === true);
      var isMultisample = (renderTarget.isWebGLMultisampleRenderTarget === true);
      var supportsMips = isPowerOfTwo(renderTarget) || capabilities.isWebGL2;
      if (isCube) {
        renderTargetProperties.__webglFramebuffer = [];
        for (var i = 0; i < 6; i++) {
          renderTargetProperties.__webglFramebuffer[i] = _gl.createFramebuffer();
        }
      } else {
        renderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();
        if (isMultisample) {
          if (capabilities.isWebGL2) {
            renderTargetProperties.__webglMultisampledFramebuffer = _gl.createFramebuffer();
            renderTargetProperties.__webglColorRenderbuffer = _gl.createRenderbuffer();
            _gl.bindRenderbuffer(36161, renderTargetProperties.__webglColorRenderbuffer);
            var glFormat = utils.convert(renderTarget.texture.format);
            var glType = utils.convert(renderTarget.texture.type);
            var glInternalFormat = getInternalFormat(glFormat, glType);
            var samples = getRenderTargetSamples(renderTarget);
            _gl.renderbufferStorageMultisample(36161, samples, glInternalFormat, renderTarget.width, renderTarget.height);
            _gl.bindFramebuffer(36160, renderTargetProperties.__webglMultisampledFramebuffer);
            _gl.framebufferRenderbuffer(36160, 36064, 36161, renderTargetProperties.__webglColorRenderbuffer);
            _gl.bindRenderbuffer(36161, null);
            if (renderTarget.depthBuffer) {
              renderTargetProperties.__webglDepthRenderbuffer = _gl.createRenderbuffer();
              setupRenderBufferStorage(renderTargetProperties.__webglDepthRenderbuffer, renderTarget, true);
            }
            _gl.bindFramebuffer(36160, null);
          } else {
            console.warn('THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.');
          }
        }
      }
      if (isCube) {
        state.bindTexture(34067, textureProperties.__webglTexture);
        setTextureParameters(34067, renderTarget.texture, supportsMips);
        for (var i = 0; i < 6; i++) {
          setupFrameBufferTexture(renderTargetProperties.__webglFramebuffer[i], renderTarget, 36064, 34069 + i);
        }
        if (textureNeedsGenerateMipmaps(renderTarget.texture, supportsMips)) {
          generateMipmap(34067, renderTarget.texture, renderTarget.width, renderTarget.height);
        }
        state.bindTexture(34067, null);
      } else {
        state.bindTexture(3553, textureProperties.__webglTexture);
        setTextureParameters(3553, renderTarget.texture, supportsMips);
        setupFrameBufferTexture(renderTargetProperties.__webglFramebuffer, renderTarget, 36064, 3553);
        if (textureNeedsGenerateMipmaps(renderTarget.texture, supportsMips)) {
          generateMipmap(3553, renderTarget.texture, renderTarget.width, renderTarget.height);
        }
        state.bindTexture(3553, null);
      }
      if (renderTarget.depthBuffer) {
        setupDepthRenderbuffer(renderTarget);
      }
    }
    function updateRenderTargetMipmap(renderTarget) {
      var texture = renderTarget.texture;
      var supportsMips = isPowerOfTwo(renderTarget) || capabilities.isWebGL2;
      if (textureNeedsGenerateMipmaps(texture, supportsMips)) {
        var target = renderTarget.isWebGLRenderTargetCube ? 34067 : 3553;
        var webglTexture = properties.get(texture).__webglTexture;
        state.bindTexture(target, webglTexture);
        generateMipmap(target, texture, renderTarget.width, renderTarget.height);
        state.bindTexture(target, null);
      }
    }
    function updateMultisampleRenderTarget(renderTarget) {
      if (renderTarget.isWebGLMultisampleRenderTarget) {
        if (capabilities.isWebGL2) {
          var renderTargetProperties = properties.get(renderTarget);
          _gl.bindFramebuffer(36008, renderTargetProperties.__webglMultisampledFramebuffer);
          _gl.bindFramebuffer(36009, renderTargetProperties.__webglFramebuffer);
          var width = renderTarget.width;
          var height = renderTarget.height;
          var mask = 16384;
          if (renderTarget.depthBuffer)
            mask |= 256;
          if (renderTarget.stencilBuffer)
            mask |= 1024;
          _gl.blitFramebuffer(0, 0, width, height, 0, 0, width, height, mask, 9728);
        } else {
          console.warn('THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.');
        }
      }
    }
    function getRenderTargetSamples(renderTarget) {
      return (capabilities.isWebGL2 && renderTarget.isWebGLMultisampleRenderTarget) ? Math.min(capabilities.maxSamples, renderTarget.samples) : 0;
    }
    function updateVideoTexture(texture) {
      var id = texture.id;
      var frame = info.render.frame;
      if (_videoTextures[id] !== frame) {
        _videoTextures[id] = frame;
        texture.update();
      }
    }
    this.setTexture2D = setTexture2D;
    this.setTexture3D = setTexture3D;
    this.setTextureCube = setTextureCube;
    this.setTextureCubeDynamic = setTextureCubeDynamic;
    this.setupRenderTarget = setupRenderTarget;
    this.updateRenderTargetMipmap = updateRenderTargetMipmap;
    this.updateMultisampleRenderTarget = updateMultisampleRenderTarget;
  }
  function WebGLUtils(gl, extensions, capabilities) {
    function convert(p) {
      var extension;
      if (p === RepeatWrapping)
        return 10497;
      if (p === ClampToEdgeWrapping)
        return 33071;
      if (p === MirroredRepeatWrapping)
        return 33648;
      if (p === NearestFilter)
        return 9728;
      if (p === NearestMipMapNearestFilter)
        return 9984;
      if (p === NearestMipMapLinearFilter)
        return 9986;
      if (p === LinearFilter)
        return 9729;
      if (p === LinearMipMapNearestFilter)
        return 9985;
      if (p === LinearMipMapLinearFilter)
        return 9987;
      if (p === UnsignedByteType)
        return 5121;
      if (p === UnsignedShort4444Type)
        return 32819;
      if (p === UnsignedShort5551Type)
        return 32820;
      if (p === UnsignedShort565Type)
        return 33635;
      if (p === ByteType)
        return 5120;
      if (p === ShortType)
        return 5122;
      if (p === UnsignedShortType)
        return 5123;
      if (p === IntType)
        return 5124;
      if (p === UnsignedIntType)
        return 5125;
      if (p === FloatType)
        return 5126;
      if (p === HalfFloatType) {
        if (capabilities.isWebGL2)
          return 5131;
        extension = extensions.get('OES_texture_half_float');
        if (extension !== null)
          return extension.HALF_FLOAT_OES;
      }
      if (p === AlphaFormat)
        return 6406;
      if (p === RGBFormat)
        return 6407;
      if (p === RGBAFormat)
        return 6408;
      if (p === LuminanceFormat)
        return 6409;
      if (p === LuminanceAlphaFormat)
        return 6410;
      if (p === DepthFormat)
        return 6402;
      if (p === DepthStencilFormat)
        return 34041;
      if (p === RedFormat)
        return 6403;
      if (p === AddEquation)
        return 32774;
      if (p === SubtractEquation)
        return 32778;
      if (p === ReverseSubtractEquation)
        return 32779;
      if (p === ZeroFactor)
        return 0;
      if (p === OneFactor)
        return 1;
      if (p === SrcColorFactor)
        return 768;
      if (p === OneMinusSrcColorFactor)
        return 769;
      if (p === SrcAlphaFactor)
        return 770;
      if (p === OneMinusSrcAlphaFactor)
        return 771;
      if (p === DstAlphaFactor)
        return 772;
      if (p === OneMinusDstAlphaFactor)
        return 773;
      if (p === DstColorFactor)
        return 774;
      if (p === OneMinusDstColorFactor)
        return 775;
      if (p === SrcAlphaSaturateFactor)
        return 776;
      if (p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format || p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format) {
        extension = extensions.get('WEBGL_compressed_texture_s3tc');
        if (extension !== null) {
          if (p === RGB_S3TC_DXT1_Format)
            return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;
          if (p === RGBA_S3TC_DXT1_Format)
            return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;
          if (p === RGBA_S3TC_DXT3_Format)
            return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;
          if (p === RGBA_S3TC_DXT5_Format)
            return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;
        }
      }
      if (p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format || p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format) {
        extension = extensions.get('WEBGL_compressed_texture_pvrtc');
        if (extension !== null) {
          if (p === RGB_PVRTC_4BPPV1_Format)
            return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;
          if (p === RGB_PVRTC_2BPPV1_Format)
            return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;
          if (p === RGBA_PVRTC_4BPPV1_Format)
            return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;
          if (p === RGBA_PVRTC_2BPPV1_Format)
            return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;
        }
      }
      if (p === RGB_ETC1_Format) {
        extension = extensions.get('WEBGL_compressed_texture_etc1');
        if (extension !== null)
          return extension.COMPRESSED_RGB_ETC1_WEBGL;
      }
      if (p === RGBA_ASTC_4x4_Format || p === RGBA_ASTC_5x4_Format || p === RGBA_ASTC_5x5_Format || p === RGBA_ASTC_6x5_Format || p === RGBA_ASTC_6x6_Format || p === RGBA_ASTC_8x5_Format || p === RGBA_ASTC_8x6_Format || p === RGBA_ASTC_8x8_Format || p === RGBA_ASTC_10x5_Format || p === RGBA_ASTC_10x6_Format || p === RGBA_ASTC_10x8_Format || p === RGBA_ASTC_10x10_Format || p === RGBA_ASTC_12x10_Format || p === RGBA_ASTC_12x12_Format) {
        extension = extensions.get('WEBGL_compressed_texture_astc');
        if (extension !== null) {
          return p;
        }
      }
      if (p === MinEquation || p === MaxEquation) {
        if (capabilities.isWebGL2) {
          if (p === MinEquation)
            return 32775;
          if (p === MaxEquation)
            return 32776;
        }
        extension = extensions.get('EXT_blend_minmax');
        if (extension !== null) {
          if (p === MinEquation)
            return extension.MIN_EXT;
          if (p === MaxEquation)
            return extension.MAX_EXT;
        }
      }
      if (p === UnsignedInt248Type) {
        if (capabilities.isWebGL2)
          return 34042;
        extension = extensions.get('WEBGL_depth_texture');
        if (extension !== null)
          return extension.UNSIGNED_INT_24_8_WEBGL;
      }
      return 0;
    }
    return {convert: convert};
  }
  function Group() {
    Object3D.call(this);
    this.type = 'Group';
  }
  Group.prototype = Object.assign(Object.create(Object3D.prototype), {
    constructor: Group,
    isGroup: true
  });
  function Camera() {
    Object3D.call(this);
    this.type = 'Camera';
    this.matrixWorldInverse = new Matrix4();
    this.projectionMatrix = new Matrix4();
    this.projectionMatrixInverse = new Matrix4();
  }
  Camera.prototype = Object.assign(Object.create(Object3D.prototype), {
    constructor: Camera,
    isCamera: true,
    copy: function(source, recursive) {
      Object3D.prototype.copy.call(this, source, recursive);
      this.matrixWorldInverse.copy(source.matrixWorldInverse);
      this.projectionMatrix.copy(source.projectionMatrix);
      this.projectionMatrixInverse.copy(source.projectionMatrixInverse);
      return this;
    },
    getWorldDirection: function(target) {
      if (target === undefined) {
        console.warn('THREE.Camera: .getWorldDirection() target is now required');
        target = new Vector3();
      }
      this.updateMatrixWorld(true);
      var e = this.matrixWorld.elements;
      return target.set(-e[8], -e[9], -e[10]).normalize();
    },
    updateMatrixWorld: function(force) {
      Object3D.prototype.updateMatrixWorld.call(this, force);
      this.matrixWorldInverse.getInverse(this.matrixWorld);
    },
    clone: function() {
      return new this.constructor().copy(this);
    }
  });
  function PerspectiveCamera(fov, aspect, near, far) {
    Camera.call(this);
    this.type = 'PerspectiveCamera';
    this.fov = fov !== undefined ? fov : 50;
    this.zoom = 1;
    this.near = near !== undefined ? near : 0.1;
    this.far = far !== undefined ? far : 2000;
    this.focus = 10;
    this.aspect = aspect !== undefined ? aspect : 1;
    this.view = null;
    this.filmGauge = 35;
    this.filmOffset = 0;
    this.updateProjectionMatrix();
  }
  PerspectiveCamera.prototype = Object.assign(Object.create(Camera.prototype), {
    constructor: PerspectiveCamera,
    isPerspectiveCamera: true,
    copy: function(source, recursive) {
      Camera.prototype.copy.call(this, source, recursive);
      this.fov = source.fov;
      this.zoom = source.zoom;
      this.near = source.near;
      this.far = source.far;
      this.focus = source.focus;
      this.aspect = source.aspect;
      this.view = source.view === null ? null : Object.assign({}, source.view);
      this.filmGauge = source.filmGauge;
      this.filmOffset = source.filmOffset;
      return this;
    },
    setFocalLength: function(focalLength) {
      var vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;
      this.fov = _Math.RAD2DEG * 2 * Math.atan(vExtentSlope);
      this.updateProjectionMatrix();
    },
    getFocalLength: function() {
      var vExtentSlope = Math.tan(_Math.DEG2RAD * 0.5 * this.fov);
      return 0.5 * this.getFilmHeight() / vExtentSlope;
    },
    getEffectiveFOV: function() {
      return _Math.RAD2DEG * 2 * Math.atan(Math.tan(_Math.DEG2RAD * 0.5 * this.fov) / this.zoom);
    },
    getFilmWidth: function() {
      return this.filmGauge * Math.min(this.aspect, 1);
    },
    getFilmHeight: function() {
      return this.filmGauge / Math.max(this.aspect, 1);
    },
    setViewOffset: function(fullWidth, fullHeight, x, y, width, height) {
      this.aspect = fullWidth / fullHeight;
      if (this.view === null) {
        this.view = {
          enabled: true,
          fullWidth: 1,
          fullHeight: 1,
          offsetX: 0,
          offsetY: 0,
          width: 1,
          height: 1
        };
      }
      this.view.enabled = true;
      this.view.fullWidth = fullWidth;
      this.view.fullHeight = fullHeight;
      this.view.offsetX = x;
      this.view.offsetY = y;
      this.view.width = width;
      this.view.height = height;
      this.updateProjectionMatrix();
    },
    clearViewOffset: function() {
      if (this.view !== null) {
        this.view.enabled = false;
      }
      this.updateProjectionMatrix();
    },
    updateProjectionMatrix: function() {
      var near = this.near,
          top = near * Math.tan(_Math.DEG2RAD * 0.5 * this.fov) / this.zoom,
          height = 2 * top,
          width = this.aspect * height,
          left = -0.5 * width,
          view = this.view;
      if (this.view !== null && this.view.enabled) {
        var fullWidth = view.fullWidth,
            fullHeight = view.fullHeight;
        left += view.offsetX * width / fullWidth;
        top -= view.offsetY * height / fullHeight;
        width *= view.width / fullWidth;
        height *= view.height / fullHeight;
      }
      var skew = this.filmOffset;
      if (skew !== 0)
        left += near * skew / this.getFilmWidth();
      this.projectionMatrix.makePerspective(left, left + width, top, top - height, near, this.far);
      this.projectionMatrixInverse.getInverse(this.projectionMatrix);
    },
    toJSON: function(meta) {
      var data = Object3D.prototype.toJSON.call(this, meta);
      data.object.fov = this.fov;
      data.object.zoom = this.zoom;
      data.object.near = this.near;
      data.object.far = this.far;
      data.object.focus = this.focus;
      data.object.aspect = this.aspect;
      if (this.view !== null)
        data.object.view = Object.assign({}, this.view);
      data.object.filmGauge = this.filmGauge;
      data.object.filmOffset = this.filmOffset;
      return data;
    }
  });
  function ArrayCamera(array) {
    PerspectiveCamera.call(this);
    this.cameras = array || [];
  }
  ArrayCamera.prototype = Object.assign(Object.create(PerspectiveCamera.prototype), {
    constructor: ArrayCamera,
    isArrayCamera: true
  });
  var cameraLPos = new Vector3();
  var cameraRPos = new Vector3();
  function setProjectionFromUnion(camera, cameraL, cameraR) {
    cameraLPos.setFromMatrixPosition(cameraL.matrixWorld);
    cameraRPos.setFromMatrixPosition(cameraR.matrixWorld);
    var ipd = cameraLPos.distanceTo(cameraRPos);
    var projL = cameraL.projectionMatrix.elements;
    var projR = cameraR.projectionMatrix.elements;
    var near = projL[14] / (projL[10] - 1);
    var far = projL[14] / (projL[10] + 1);
    var topFov = (projL[9] + 1) / projL[5];
    var bottomFov = (projL[9] - 1) / projL[5];
    var leftFov = (projL[8] - 1) / projL[0];
    var rightFov = (projR[8] + 1) / projR[0];
    var left = near * leftFov;
    var right = near * rightFov;
    var zOffset = ipd / (-leftFov + rightFov);
    var xOffset = zOffset * -leftFov;
    cameraL.matrixWorld.decompose(camera.position, camera.quaternion, camera.scale);
    camera.translateX(xOffset);
    camera.translateZ(zOffset);
    camera.matrixWorld.compose(camera.position, camera.quaternion, camera.scale);
    camera.matrixWorldInverse.getInverse(camera.matrixWorld);
    var near2 = near + zOffset;
    var far2 = far + zOffset;
    var left2 = left - xOffset;
    var right2 = right + (ipd - xOffset);
    var top2 = topFov * far / far2 * near2;
    var bottom2 = bottomFov * far / far2 * near2;
    camera.projectionMatrix.makePerspective(left2, right2, top2, bottom2, near2, far2);
  }
  function WebVRManager(renderer) {
    var scope = this;
    var device = null;
    var frameData = null;
    var poseTarget = null;
    var controllers = [];
    var standingMatrix = new Matrix4();
    var standingMatrixInverse = new Matrix4();
    var framebufferScaleFactor = 1.0;
    var frameOfReferenceType = 'stage';
    if (typeof window !== 'undefined' && 'VRFrameData' in window) {
      frameData = new window.VRFrameData();
      window.addEventListener('vrdisplaypresentchange', onVRDisplayPresentChange, false);
    }
    var matrixWorldInverse = new Matrix4();
    var tempQuaternion = new Quaternion();
    var tempPosition = new Vector3();
    var cameraL = new PerspectiveCamera();
    cameraL.bounds = new Vector4(0.0, 0.0, 0.5, 1.0);
    cameraL.layers.enable(1);
    var cameraR = new PerspectiveCamera();
    cameraR.bounds = new Vector4(0.5, 0.0, 0.5, 1.0);
    cameraR.layers.enable(2);
    var cameraVR = new ArrayCamera([cameraL, cameraR]);
    cameraVR.layers.enable(1);
    cameraVR.layers.enable(2);
    function isPresenting() {
      return device !== null && device.isPresenting === true;
    }
    var currentSize = new Vector2(),
        currentPixelRatio;
    function onVRDisplayPresentChange() {
      if (isPresenting()) {
        var eyeParameters = device.getEyeParameters('left');
        var renderWidth = eyeParameters.renderWidth * framebufferScaleFactor;
        var renderHeight = eyeParameters.renderHeight * framebufferScaleFactor;
        currentPixelRatio = renderer.getPixelRatio();
        renderer.getSize(currentSize);
        renderer.setDrawingBufferSize(renderWidth * 2, renderHeight, 1);
        animation.start();
      } else {
        if (scope.enabled) {
          renderer.setDrawingBufferSize(currentSize.width, currentSize.height, currentPixelRatio);
        }
        animation.stop();
      }
    }
    var triggers = [];
    function findGamepad(id) {
      var gamepads = navigator.getGamepads && navigator.getGamepads();
      for (var i = 0,
          j = 0,
          l = gamepads.length; i < l; i++) {
        var gamepad = gamepads[i];
        if (gamepad && (gamepad.id === 'Daydream Controller' || gamepad.id === 'Gear VR Controller' || gamepad.id === 'Oculus Go Controller' || gamepad.id === 'OpenVR Gamepad' || gamepad.id.startsWith('Oculus Touch') || gamepad.id.startsWith('Spatial Controller'))) {
          if (j === id)
            return gamepad;
          j++;
        }
      }
    }
    function updateControllers() {
      for (var i = 0; i < controllers.length; i++) {
        var controller = controllers[i];
        var gamepad = findGamepad(i);
        if (gamepad !== undefined && gamepad.pose !== undefined) {
          if (gamepad.pose === null)
            return;
          var pose = gamepad.pose;
          if (pose.hasPosition === false)
            controller.position.set(0.2, -0.6, -0.05);
          if (pose.position !== null)
            controller.position.fromArray(pose.position);
          if (pose.orientation !== null)
            controller.quaternion.fromArray(pose.orientation);
          controller.matrix.compose(controller.position, controller.quaternion, controller.scale);
          controller.matrix.premultiply(standingMatrix);
          controller.matrix.decompose(controller.position, controller.quaternion, controller.scale);
          controller.matrixWorldNeedsUpdate = true;
          controller.visible = true;
          var buttonId = gamepad.id === 'Daydream Controller' ? 0 : 1;
          if (triggers[i] !== gamepad.buttons[buttonId].pressed) {
            triggers[i] = gamepad.buttons[buttonId].pressed;
            if (triggers[i] === true) {
              controller.dispatchEvent({type: 'selectstart'});
            } else {
              controller.dispatchEvent({type: 'selectend'});
              controller.dispatchEvent({type: 'select'});
            }
          }
        } else {
          controller.visible = false;
        }
      }
    }
    this.enabled = false;
    this.getController = function(id) {
      var controller = controllers[id];
      if (controller === undefined) {
        controller = new Group();
        controller.matrixAutoUpdate = false;
        controller.visible = false;
        controllers[id] = controller;
      }
      return controller;
    };
    this.getDevice = function() {
      return device;
    };
    this.setDevice = function(value) {
      if (value !== undefined)
        device = value;
      animation.setContext(value);
    };
    this.setFramebufferScaleFactor = function(value) {
      framebufferScaleFactor = value;
    };
    this.setFrameOfReferenceType = function(value) {
      frameOfReferenceType = value;
    };
    this.setPoseTarget = function(object) {
      if (object !== undefined)
        poseTarget = object;
    };
    this.getCamera = function(camera) {
      var userHeight = frameOfReferenceType === 'stage' ? 1.6 : 0;
      if (isPresenting() === false) {
        camera.position.set(0, userHeight, 0);
        camera.rotation.set(0, 0, 0);
        return camera;
      }
      device.depthNear = camera.near;
      device.depthFar = camera.far;
      device.getFrameData(frameData);
      if (frameOfReferenceType === 'stage') {
        var stageParameters = device.stageParameters;
        if (stageParameters) {
          standingMatrix.fromArray(stageParameters.sittingToStandingTransform);
        } else {
          standingMatrix.makeTranslation(0, userHeight, 0);
        }
      }
      var pose = frameData.pose;
      var poseObject = poseTarget !== null ? poseTarget : camera;
      poseObject.matrix.copy(standingMatrix);
      poseObject.matrix.decompose(poseObject.position, poseObject.quaternion, poseObject.scale);
      if (pose.orientation !== null) {
        tempQuaternion.fromArray(pose.orientation);
        poseObject.quaternion.multiply(tempQuaternion);
      }
      if (pose.position !== null) {
        tempQuaternion.setFromRotationMatrix(standingMatrix);
        tempPosition.fromArray(pose.position);
        tempPosition.applyQuaternion(tempQuaternion);
        poseObject.position.add(tempPosition);
      }
      poseObject.updateMatrixWorld();
      cameraL.near = camera.near;
      cameraR.near = camera.near;
      cameraL.far = camera.far;
      cameraR.far = camera.far;
      cameraL.matrixWorldInverse.fromArray(frameData.leftViewMatrix);
      cameraR.matrixWorldInverse.fromArray(frameData.rightViewMatrix);
      standingMatrixInverse.getInverse(standingMatrix);
      if (frameOfReferenceType === 'stage') {
        cameraL.matrixWorldInverse.multiply(standingMatrixInverse);
        cameraR.matrixWorldInverse.multiply(standingMatrixInverse);
      }
      var parent = poseObject.parent;
      if (parent !== null) {
        matrixWorldInverse.getInverse(parent.matrixWorld);
        cameraL.matrixWorldInverse.multiply(matrixWorldInverse);
        cameraR.matrixWorldInverse.multiply(matrixWorldInverse);
      }
      cameraL.matrixWorld.getInverse(cameraL.matrixWorldInverse);
      cameraR.matrixWorld.getInverse(cameraR.matrixWorldInverse);
      cameraL.projectionMatrix.fromArray(frameData.leftProjectionMatrix);
      cameraR.projectionMatrix.fromArray(frameData.rightProjectionMatrix);
      setProjectionFromUnion(cameraVR, cameraL, cameraR);
      var layers = device.getLayers();
      if (layers.length) {
        var layer = layers[0];
        if (layer.leftBounds !== null && layer.leftBounds.length === 4) {
          cameraL.bounds.fromArray(layer.leftBounds);
        }
        if (layer.rightBounds !== null && layer.rightBounds.length === 4) {
          cameraR.bounds.fromArray(layer.rightBounds);
        }
      }
      updateControllers();
      return cameraVR;
    };
    this.getStandingMatrix = function() {
      return standingMatrix;
    };
    this.isPresenting = isPresenting;
    var animation = new WebGLAnimation();
    this.setAnimationLoop = function(callback) {
      animation.setAnimationLoop(callback);
    };
    this.submitFrame = function() {
      if (isPresenting())
        device.submitFrame();
    };
    this.dispose = function() {
      if (typeof window !== 'undefined') {
        window.removeEventListener('vrdisplaypresentchange', onVRDisplayPresentChange);
      }
    };
  }
  function WebXRManager(renderer) {
    var gl = renderer.context;
    var device = null;
    var session = null;
    var framebufferScaleFactor = 1.0;
    var frameOfReference = null;
    var frameOfReferenceType = 'stage';
    var pose = null;
    var controllers = [];
    var inputSources = [];
    function isPresenting() {
      return session !== null && frameOfReference !== null;
    }
    var cameraL = new PerspectiveCamera();
    cameraL.layers.enable(1);
    cameraL.viewport = new Vector4();
    var cameraR = new PerspectiveCamera();
    cameraR.layers.enable(2);
    cameraR.viewport = new Vector4();
    var cameraVR = new ArrayCamera([cameraL, cameraR]);
    cameraVR.layers.enable(1);
    cameraVR.layers.enable(2);
    this.enabled = false;
    this.getController = function(id) {
      var controller = controllers[id];
      if (controller === undefined) {
        controller = new Group();
        controller.matrixAutoUpdate = false;
        controller.visible = false;
        controllers[id] = controller;
      }
      return controller;
    };
    this.getDevice = function() {
      return device;
    };
    this.setDevice = function(value) {
      if (value !== undefined)
        device = value;
      if (value instanceof XRDevice)
        gl.setCompatibleXRDevice(value);
    };
    function onSessionEvent(event) {
      var controller = controllers[inputSources.indexOf(event.inputSource)];
      if (controller)
        controller.dispatchEvent({type: event.type});
    }
    function onSessionEnd() {
      renderer.setFramebuffer(null);
      renderer.setRenderTarget(renderer.getRenderTarget());
      animation.stop();
    }
    this.setFramebufferScaleFactor = function(value) {
      framebufferScaleFactor = value;
    };
    this.setFrameOfReferenceType = function(value) {
      frameOfReferenceType = value;
    };
    this.setSession = function(value) {
      session = value;
      if (session !== null) {
        session.addEventListener('select', onSessionEvent);
        session.addEventListener('selectstart', onSessionEvent);
        session.addEventListener('selectend', onSessionEvent);
        session.addEventListener('end', onSessionEnd);
        session.baseLayer = new XRWebGLLayer(session, gl, {framebufferScaleFactor: framebufferScaleFactor});
        session.requestFrameOfReference(frameOfReferenceType).then(function(value) {
          frameOfReference = value;
          renderer.setFramebuffer(session.baseLayer.framebuffer);
          animation.setContext(session);
          animation.start();
        });
        inputSources = session.getInputSources();
        session.addEventListener('inputsourceschange', function() {
          inputSources = session.getInputSources();
          console.log(inputSources);
          for (var i = 0; i < controllers.length; i++) {
            var controller = controllers[i];
            controller.userData.inputSource = inputSources[i];
          }
        });
      }
    };
    function updateCamera(camera, parent) {
      if (parent === null) {
        camera.matrixWorld.copy(camera.matrix);
      } else {
        camera.matrixWorld.multiplyMatrices(parent.matrixWorld, camera.matrix);
      }
      camera.matrixWorldInverse.getInverse(camera.matrixWorld);
    }
    this.getCamera = function(camera) {
      if (isPresenting()) {
        var parent = camera.parent;
        var cameras = cameraVR.cameras;
        updateCamera(cameraVR, parent);
        for (var i = 0; i < cameras.length; i++) {
          updateCamera(cameras[i], parent);
        }
        camera.matrixWorld.copy(cameraVR.matrixWorld);
        var children = camera.children;
        for (var i = 0,
            l = children.length; i < l; i++) {
          children[i].updateMatrixWorld(true);
        }
        setProjectionFromUnion(cameraVR, cameraL, cameraR);
        return cameraVR;
      }
      return camera;
    };
    this.isPresenting = isPresenting;
    var onAnimationFrameCallback = null;
    function onAnimationFrame(time, frame) {
      pose = frame.getDevicePose(frameOfReference);
      if (pose !== null) {
        var layer = session.baseLayer;
        var views = frame.views;
        for (var i = 0; i < views.length; i++) {
          var view = views[i];
          var viewport = layer.getViewport(view);
          var viewMatrix = pose.getViewMatrix(view);
          var camera = cameraVR.cameras[i];
          camera.matrix.fromArray(viewMatrix).getInverse(camera.matrix);
          camera.projectionMatrix.fromArray(view.projectionMatrix);
          camera.viewport.set(viewport.x, viewport.y, viewport.width, viewport.height);
          if (i === 0) {
            cameraVR.matrix.copy(camera.matrix);
          }
        }
      }
      for (var i = 0; i < controllers.length; i++) {
        var controller = controllers[i];
        var inputSource = inputSources[i];
        if (inputSource) {
          var inputPose = frame.getInputPose(inputSource, frameOfReference);
          if (inputPose !== null) {
            if ('targetRay' in inputPose) {
              controller.matrix.elements = inputPose.targetRay.transformMatrix;
            } else if ('pointerMatrix' in inputPose) {
              controller.matrix.elements = inputPose.pointerMatrix;
            }
            controller.matrix.decompose(controller.position, controller.rotation, controller.scale);
            controller.visible = true;
            continue;
          }
        }
        controller.visible = false;
      }
      if (onAnimationFrameCallback)
        onAnimationFrameCallback(time);
    }
    var animation = new WebGLAnimation();
    animation.setAnimationLoop(onAnimationFrame);
    this.setAnimationLoop = function(callback) {
      onAnimationFrameCallback = callback;
    };
    this.dispose = function() {};
    this.getStandingMatrix = function() {
      console.warn('THREE.WebXRManager: getStandingMatrix() is no longer needed.');
      return new THREE.Matrix4();
    };
    this.submitFrame = function() {};
  }
  function WebGLRenderer(parameters) {
    console.log('THREE.WebGLRenderer', REVISION);
    parameters = parameters || {};
    var _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElementNS('http://www.w3.org/1999/xhtml', 'canvas'),
        _context = parameters.context !== undefined ? parameters.context : null,
        _alpha = parameters.alpha !== undefined ? parameters.alpha : false,
        _depth = parameters.depth !== undefined ? parameters.depth : true,
        _stencil = parameters.stencil !== undefined ? parameters.stencil : true,
        _antialias = parameters.antialias !== undefined ? parameters.antialias : false,
        _premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,
        _preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false,
        _powerPreference = parameters.powerPreference !== undefined ? parameters.powerPreference : 'default';
    var currentRenderList = null;
    var currentRenderState = null;
    this.domElement = _canvas;
    this.context = null;
    this.autoClear = true;
    this.autoClearColor = true;
    this.autoClearDepth = true;
    this.autoClearStencil = true;
    this.sortObjects = true;
    this.clippingPlanes = [];
    this.localClippingEnabled = false;
    this.gammaFactor = 2.0;
    this.gammaInput = false;
    this.gammaOutput = false;
    this.physicallyCorrectLights = false;
    this.toneMapping = LinearToneMapping;
    this.toneMappingExposure = 1.0;
    this.toneMappingWhitePoint = 1.0;
    this.maxMorphTargets = 8;
    this.maxMorphNormals = 4;
    var _this = this,
        _isContextLost = false,
        _framebuffer = null,
        _currentRenderTarget = null,
        _currentFramebuffer = null,
        _currentMaterialId = -1,
        _currentGeometryProgram = {
          geometry: null,
          program: null,
          wireframe: false
        },
        _currentCamera = null,
        _currentArrayCamera = null,
        _currentViewport = new Vector4(),
        _currentScissor = new Vector4(),
        _currentScissorTest = null,
        _usedTextureUnits = 0,
        _width = _canvas.width,
        _height = _canvas.height,
        _pixelRatio = 1,
        _viewport = new Vector4(0, 0, _width, _height),
        _scissor = new Vector4(0, 0, _width, _height),
        _scissorTest = false,
        _frustum = new Frustum(),
        _clipping = new WebGLClipping(),
        _clippingEnabled = false,
        _localClippingEnabled = false,
        _projScreenMatrix = new Matrix4(),
        _vector3 = new Vector3();
    function getTargetPixelRatio() {
      return _currentRenderTarget === null ? _pixelRatio : 1;
    }
    var _gl;
    try {
      var contextAttributes = {
        alpha: _alpha,
        depth: _depth,
        stencil: _stencil,
        antialias: _antialias,
        premultipliedAlpha: _premultipliedAlpha,
        preserveDrawingBuffer: _preserveDrawingBuffer,
        powerPreference: _powerPreference
      };
      _canvas.addEventListener('webglcontextlost', onContextLost, false);
      _canvas.addEventListener('webglcontextrestored', onContextRestore, false);
      _gl = _context || _canvas.getContext('webgl', contextAttributes) || _canvas.getContext('experimental-webgl', contextAttributes);
      if (_gl === null) {
        if (_canvas.getContext('webgl') !== null) {
          throw new Error('Error creating WebGL context with your selected attributes.');
        } else {
          throw new Error('Error creating WebGL context.');
        }
      }
      if (_gl.getShaderPrecisionFormat === undefined) {
        _gl.getShaderPrecisionFormat = function() {
          return {
            'rangeMin': 1,
            'rangeMax': 1,
            'precision': 1
          };
        };
      }
    } catch (error) {
      console.error('THREE.WebGLRenderer: ' + error.message);
      throw error;
    }
    var extensions,
        capabilities,
        state,
        info;
    var properties,
        textures,
        attributes,
        geometries,
        objects;
    var programCache,
        renderLists,
        renderStates;
    var background,
        morphtargets,
        bufferRenderer,
        indexedBufferRenderer;
    var utils;
    function initGLContext() {
      extensions = new WebGLExtensions(_gl);
      capabilities = new WebGLCapabilities(_gl, extensions, parameters);
      if (!capabilities.isWebGL2) {
        extensions.get('WEBGL_depth_texture');
        extensions.get('OES_texture_float');
        extensions.get('OES_texture_half_float');
        extensions.get('OES_texture_half_float_linear');
        extensions.get('OES_standard_derivatives');
        extensions.get('OES_element_index_uint');
        extensions.get('ANGLE_instanced_arrays');
      }
      extensions.get('OES_texture_float_linear');
      utils = new WebGLUtils(_gl, extensions, capabilities);
      state = new WebGLState(_gl, extensions, utils, capabilities);
      state.scissor(_currentScissor.copy(_scissor).multiplyScalar(_pixelRatio));
      state.viewport(_currentViewport.copy(_viewport).multiplyScalar(_pixelRatio));
      info = new WebGLInfo(_gl);
      properties = new WebGLProperties();
      textures = new WebGLTextures(_gl, extensions, state, properties, capabilities, utils, info);
      attributes = new WebGLAttributes(_gl);
      geometries = new WebGLGeometries(_gl, attributes, info);
      objects = new WebGLObjects(geometries, info);
      morphtargets = new WebGLMorphtargets(_gl);
      programCache = new WebGLPrograms(_this, extensions, capabilities);
      renderLists = new WebGLRenderLists();
      renderStates = new WebGLRenderStates();
      background = new WebGLBackground(_this, state, objects, _premultipliedAlpha);
      bufferRenderer = new WebGLBufferRenderer(_gl, extensions, info, capabilities);
      indexedBufferRenderer = new WebGLIndexedBufferRenderer(_gl, extensions, info, capabilities);
      info.programs = programCache.programs;
      _this.context = _gl;
      _this.capabilities = capabilities;
      _this.extensions = extensions;
      _this.properties = properties;
      _this.renderLists = renderLists;
      _this.state = state;
      _this.info = info;
    }
    initGLContext();
    var vr = null;
    if (typeof navigator !== 'undefined') {
      vr = ('xr' in navigator) ? new WebXRManager(_this) : new WebVRManager(_this);
    }
    this.vr = vr;
    var shadowMap = new WebGLShadowMap(_this, objects, capabilities.maxTextureSize);
    this.shadowMap = shadowMap;
    this.getContext = function() {
      return _gl;
    };
    this.getContextAttributes = function() {
      return _gl.getContextAttributes();
    };
    this.forceContextLoss = function() {
      var extension = extensions.get('WEBGL_lose_context');
      if (extension)
        extension.loseContext();
    };
    this.forceContextRestore = function() {
      var extension = extensions.get('WEBGL_lose_context');
      if (extension)
        extension.restoreContext();
    };
    this.getPixelRatio = function() {
      return _pixelRatio;
    };
    this.setPixelRatio = function(value) {
      if (value === undefined)
        return;
      _pixelRatio = value;
      this.setSize(_width, _height, false);
    };
    this.getSize = function(target) {
      if (target === undefined) {
        console.warn('WebGLRenderer: .getsize() now requires a Vector2 as an argument');
        target = new Vector2();
      }
      return target.set(_width, _height);
    };
    this.setSize = function(width, height, updateStyle) {
      if (vr.isPresenting()) {
        console.warn('THREE.WebGLRenderer: Can\'t change size while VR device is presenting.');
        return;
      }
      _width = width;
      _height = height;
      _canvas.width = width * _pixelRatio;
      _canvas.height = height * _pixelRatio;
      if (updateStyle !== false) {
        _canvas.style.width = width + 'px';
        _canvas.style.height = height + 'px';
      }
      this.setViewport(0, 0, width, height);
    };
    this.getDrawingBufferSize = function(target) {
      if (target === undefined) {
        console.warn('WebGLRenderer: .getdrawingBufferSize() now requires a Vector2 as an argument');
        target = new Vector2();
      }
      return target.set(_width * _pixelRatio, _height * _pixelRatio);
    };
    this.setDrawingBufferSize = function(width, height, pixelRatio) {
      _width = width;
      _height = height;
      _pixelRatio = pixelRatio;
      _canvas.width = width * pixelRatio;
      _canvas.height = height * pixelRatio;
      this.setViewport(0, 0, width, height);
    };
    this.getCurrentViewport = function(target) {
      if (target === undefined) {
        console.warn('WebGLRenderer: .getCurrentViewport() now requires a Vector4 as an argument');
        target = new Vector4();
      }
      return target.copy(_currentViewport);
    };
    this.getViewport = function(target) {
      return target.copy(_viewport);
    };
    this.setViewport = function(x, y, width, height) {
      if (x.isVector4) {
        _viewport.set(x.x, x.y, x.z, x.w);
      } else {
        _viewport.set(x, y, width, height);
      }
      state.viewport(_currentViewport.copy(_viewport).multiplyScalar(_pixelRatio));
    };
    this.getScissor = function(target) {
      return target.copy(_scissor);
    };
    this.setScissor = function(x, y, width, height) {
      if (x.isVector4) {
        _scissor.set(x.x, x.y, x.z, x.w);
      } else {
        _scissor.set(x, y, width, height);
      }
      state.scissor(_currentScissor.copy(_scissor).multiplyScalar(_pixelRatio));
    };
    this.getScissorTest = function() {
      return _scissorTest;
    };
    this.setScissorTest = function(boolean) {
      state.setScissorTest(_scissorTest = boolean);
    };
    this.getClearColor = function() {
      return background.getClearColor();
    };
    this.setClearColor = function() {
      background.setClearColor.apply(background, arguments);
    };
    this.getClearAlpha = function() {
      return background.getClearAlpha();
    };
    this.setClearAlpha = function() {
      background.setClearAlpha.apply(background, arguments);
    };
    this.clear = function(color, depth, stencil) {
      var bits = 0;
      if (color === undefined || color)
        bits |= 16384;
      if (depth === undefined || depth)
        bits |= 256;
      if (stencil === undefined || stencil)
        bits |= 1024;
      _gl.clear(bits);
    };
    this.clearColor = function() {
      this.clear(true, false, false);
    };
    this.clearDepth = function() {
      this.clear(false, true, false);
    };
    this.clearStencil = function() {
      this.clear(false, false, true);
    };
    this.dispose = function() {
      _canvas.removeEventListener('webglcontextlost', onContextLost, false);
      _canvas.removeEventListener('webglcontextrestored', onContextRestore, false);
      renderLists.dispose();
      renderStates.dispose();
      properties.dispose();
      objects.dispose();
      vr.dispose();
      animation.stop();
    };
    function onContextLost(event) {
      event.preventDefault();
      console.log('THREE.WebGLRenderer: Context Lost.');
      _isContextLost = true;
    }
    function onContextRestore() {
      console.log('THREE.WebGLRenderer: Context Restored.');
      _isContextLost = false;
      initGLContext();
    }
    function onMaterialDispose(event) {
      var material = event.target;
      material.removeEventListener('dispose', onMaterialDispose);
      deallocateMaterial(material);
    }
    function deallocateMaterial(material) {
      releaseMaterialProgramReference(material);
      properties.remove(material);
    }
    function releaseMaterialProgramReference(material) {
      var programInfo = properties.get(material).program;
      material.program = undefined;
      if (programInfo !== undefined) {
        programCache.releaseProgram(programInfo);
      }
    }
    function renderObjectImmediate(object, program) {
      object.render(function(object) {
        _this.renderBufferImmediate(object, program);
      });
    }
    this.renderBufferImmediate = function(object, program) {
      state.initAttributes();
      var buffers = properties.get(object);
      if (object.hasPositions && !buffers.position)
        buffers.position = _gl.createBuffer();
      if (object.hasNormals && !buffers.normal)
        buffers.normal = _gl.createBuffer();
      if (object.hasUvs && !buffers.uv)
        buffers.uv = _gl.createBuffer();
      if (object.hasColors && !buffers.color)
        buffers.color = _gl.createBuffer();
      var programAttributes = program.getAttributes();
      if (object.hasPositions) {
        _gl.bindBuffer(34962, buffers.position);
        _gl.bufferData(34962, object.positionArray, 35048);
        state.enableAttribute(programAttributes.position);
        _gl.vertexAttribPointer(programAttributes.position, 3, 5126, false, 0, 0);
      }
      if (object.hasNormals) {
        _gl.bindBuffer(34962, buffers.normal);
        _gl.bufferData(34962, object.normalArray, 35048);
        state.enableAttribute(programAttributes.normal);
        _gl.vertexAttribPointer(programAttributes.normal, 3, 5126, false, 0, 0);
      }
      if (object.hasUvs) {
        _gl.bindBuffer(34962, buffers.uv);
        _gl.bufferData(34962, object.uvArray, 35048);
        state.enableAttribute(programAttributes.uv);
        _gl.vertexAttribPointer(programAttributes.uv, 2, 5126, false, 0, 0);
      }
      if (object.hasColors) {
        _gl.bindBuffer(34962, buffers.color);
        _gl.bufferData(34962, object.colorArray, 35048);
        state.enableAttribute(programAttributes.color);
        _gl.vertexAttribPointer(programAttributes.color, 3, 5126, false, 0, 0);
      }
      state.disableUnusedAttributes();
      _gl.drawArrays(4, 0, object.count);
      object.count = 0;
    };
    this.renderBufferDirect = function(camera, fog, geometry, material, object, group) {
      var frontFaceCW = (object.isMesh && object.matrixWorld.determinant() < 0);
      state.setMaterial(material, frontFaceCW);
      var program = setProgram(camera, fog, material, object);
      var updateBuffers = false;
      if (_currentGeometryProgram.geometry !== geometry.id || _currentGeometryProgram.program !== program.id || _currentGeometryProgram.wireframe !== (material.wireframe === true)) {
        _currentGeometryProgram.geometry = geometry.id;
        _currentGeometryProgram.program = program.id;
        _currentGeometryProgram.wireframe = material.wireframe === true;
        updateBuffers = true;
      }
      if (object.morphTargetInfluences) {
        morphtargets.update(object, geometry, material, program);
        updateBuffers = true;
      }
      var index = geometry.index;
      var position = geometry.attributes.position;
      var rangeFactor = 1;
      if (material.wireframe === true) {
        index = geometries.getWireframeAttribute(geometry);
        rangeFactor = 2;
      }
      var attribute;
      var renderer = bufferRenderer;
      if (index !== null) {
        attribute = attributes.get(index);
        renderer = indexedBufferRenderer;
        renderer.setIndex(attribute);
      }
      if (updateBuffers) {
        setupVertexAttributes(material, program, geometry);
        if (index !== null) {
          _gl.bindBuffer(34963, attribute.buffer);
        }
      }
      var dataCount = Infinity;
      if (index !== null) {
        dataCount = index.count;
      } else if (position !== undefined) {
        dataCount = position.count;
      }
      var rangeStart = geometry.drawRange.start * rangeFactor;
      var rangeCount = geometry.drawRange.count * rangeFactor;
      var groupStart = group !== null ? group.start * rangeFactor : 0;
      var groupCount = group !== null ? group.count * rangeFactor : Infinity;
      var drawStart = Math.max(rangeStart, groupStart);
      var drawEnd = Math.min(dataCount, rangeStart + rangeCount, groupStart + groupCount) - 1;
      var drawCount = Math.max(0, drawEnd - drawStart + 1);
      if (drawCount === 0)
        return;
      if (object.isMesh) {
        if (material.wireframe === true) {
          state.setLineWidth(material.wireframeLinewidth * getTargetPixelRatio());
          renderer.setMode(1);
        } else {
          switch (object.drawMode) {
            case TrianglesDrawMode:
              renderer.setMode(4);
              break;
            case TriangleStripDrawMode:
              renderer.setMode(5);
              break;
            case TriangleFanDrawMode:
              renderer.setMode(6);
              break;
          }
        }
      } else if (object.isLine) {
        var lineWidth = material.linewidth;
        if (lineWidth === undefined)
          lineWidth = 1;
        state.setLineWidth(lineWidth * getTargetPixelRatio());
        if (object.isLineSegments) {
          renderer.setMode(1);
        } else if (object.isLineLoop) {
          renderer.setMode(2);
        } else {
          renderer.setMode(3);
        }
      } else if (object.isPoints) {
        renderer.setMode(0);
      } else if (object.isSprite) {
        renderer.setMode(4);
      }
      if (geometry && geometry.isInstancedBufferGeometry) {
        if (geometry.maxInstancedCount > 0) {
          renderer.renderInstances(geometry, drawStart, drawCount);
        }
      } else {
        renderer.render(drawStart, drawCount);
      }
    };
    function setupVertexAttributes(material, program, geometry) {
      if (geometry && geometry.isInstancedBufferGeometry && !capabilities.isWebGL2) {
        if (extensions.get('ANGLE_instanced_arrays') === null) {
          console.error('THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.');
          return;
        }
      }
      state.initAttributes();
      var geometryAttributes = geometry.attributes;
      var programAttributes = program.getAttributes();
      var materialDefaultAttributeValues = material.defaultAttributeValues;
      for (var name in programAttributes) {
        var programAttribute = programAttributes[name];
        if (programAttribute >= 0) {
          var geometryAttribute = geometryAttributes[name];
          if (geometryAttribute !== undefined) {
            var normalized = geometryAttribute.normalized;
            var size = geometryAttribute.itemSize;
            var attribute = attributes.get(geometryAttribute);
            if (attribute === undefined)
              continue;
            var buffer = attribute.buffer;
            var type = attribute.type;
            var bytesPerElement = attribute.bytesPerElement;
            if (geometryAttribute.isInterleavedBufferAttribute) {
              var data = geometryAttribute.data;
              var stride = data.stride;
              var offset = geometryAttribute.offset;
              if (data && data.isInstancedInterleavedBuffer) {
                state.enableAttributeAndDivisor(programAttribute, data.meshPerAttribute);
                if (geometry.maxInstancedCount === undefined) {
                  geometry.maxInstancedCount = data.meshPerAttribute * data.count;
                }
              } else {
                state.enableAttribute(programAttribute);
              }
              _gl.bindBuffer(34962, buffer);
              _gl.vertexAttribPointer(programAttribute, size, type, normalized, stride * bytesPerElement, offset * bytesPerElement);
            } else {
              if (geometryAttribute.isInstancedBufferAttribute) {
                state.enableAttributeAndDivisor(programAttribute, geometryAttribute.meshPerAttribute);
                if (geometry.maxInstancedCount === undefined) {
                  geometry.maxInstancedCount = geometryAttribute.meshPerAttribute * geometryAttribute.count;
                }
              } else {
                state.enableAttribute(programAttribute);
              }
              _gl.bindBuffer(34962, buffer);
              _gl.vertexAttribPointer(programAttribute, size, type, normalized, 0, 0);
            }
          } else if (materialDefaultAttributeValues !== undefined) {
            var value = materialDefaultAttributeValues[name];
            if (value !== undefined) {
              switch (value.length) {
                case 2:
                  _gl.vertexAttrib2fv(programAttribute, value);
                  break;
                case 3:
                  _gl.vertexAttrib3fv(programAttribute, value);
                  break;
                case 4:
                  _gl.vertexAttrib4fv(programAttribute, value);
                  break;
                default:
                  _gl.vertexAttrib1fv(programAttribute, value);
              }
            }
          }
        }
      }
      state.disableUnusedAttributes();
    }
    this.compile = function(scene, camera) {
      currentRenderState = renderStates.get(scene, camera);
      currentRenderState.init();
      scene.traverse(function(object) {
        if (object.isLight) {
          currentRenderState.pushLight(object);
          if (object.castShadow) {
            currentRenderState.pushShadow(object);
          }
        }
      });
      currentRenderState.setupLights(camera);
      scene.traverse(function(object) {
        if (object.material) {
          if (Array.isArray(object.material)) {
            for (var i = 0; i < object.material.length; i++) {
              initMaterial(object.material[i], scene.fog, object);
            }
          } else {
            initMaterial(object.material, scene.fog, object);
          }
        }
      });
    };
    var onAnimationFrameCallback = null;
    function onAnimationFrame(time) {
      if (vr.isPresenting())
        return;
      if (onAnimationFrameCallback)
        onAnimationFrameCallback(time);
    }
    var animation = new WebGLAnimation();
    animation.setAnimationLoop(onAnimationFrame);
    if (typeof window !== 'undefined')
      animation.setContext(window);
    this.setAnimationLoop = function(callback) {
      onAnimationFrameCallback = callback;
      vr.setAnimationLoop(callback);
      animation.start();
    };
    this.render = function(scene, camera) {
      var renderTarget,
          forceClear;
      if (arguments[2] !== undefined) {
        console.warn('THREE.WebGLRenderer.render(): the renderTarget argument has been removed. Use .setRenderTarget() instead.');
        renderTarget = arguments[2];
      }
      if (arguments[3] !== undefined) {
        console.warn('THREE.WebGLRenderer.render(): the forceClear argument has been removed. Use .clear() instead.');
        forceClear = arguments[3];
      }
      if (!(camera && camera.isCamera)) {
        console.error('THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.');
        return;
      }
      if (_isContextLost)
        return;
      _currentGeometryProgram.geometry = null;
      _currentGeometryProgram.program = null;
      _currentGeometryProgram.wireframe = false;
      _currentMaterialId = -1;
      _currentCamera = null;
      if (scene.autoUpdate === true)
        scene.updateMatrixWorld();
      if (camera.parent === null)
        camera.updateMatrixWorld();
      if (vr.enabled) {
        camera = vr.getCamera(camera);
      }
      currentRenderState = renderStates.get(scene, camera);
      currentRenderState.init();
      scene.onBeforeRender(_this, scene, camera, renderTarget || _currentRenderTarget);
      _projScreenMatrix.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse);
      _frustum.setFromMatrix(_projScreenMatrix);
      _localClippingEnabled = this.localClippingEnabled;
      _clippingEnabled = _clipping.init(this.clippingPlanes, _localClippingEnabled, camera);
      currentRenderList = renderLists.get(scene, camera);
      currentRenderList.init();
      projectObject(scene, camera, 0, _this.sortObjects);
      if (_this.sortObjects === true) {
        currentRenderList.sort();
      }
      if (_clippingEnabled)
        _clipping.beginShadows();
      var shadowsArray = currentRenderState.state.shadowsArray;
      shadowMap.render(shadowsArray, scene, camera);
      currentRenderState.setupLights(camera);
      if (_clippingEnabled)
        _clipping.endShadows();
      if (this.info.autoReset)
        this.info.reset();
      if (renderTarget !== undefined) {
        this.setRenderTarget(renderTarget);
      }
      background.render(currentRenderList, scene, camera, forceClear);
      var opaqueObjects = currentRenderList.opaque;
      var transparentObjects = currentRenderList.transparent;
      if (scene.overrideMaterial) {
        var overrideMaterial = scene.overrideMaterial;
        if (opaqueObjects.length)
          renderObjects(opaqueObjects, scene, camera, overrideMaterial);
        if (transparentObjects.length)
          renderObjects(transparentObjects, scene, camera, overrideMaterial);
      } else {
        if (opaqueObjects.length)
          renderObjects(opaqueObjects, scene, camera);
        if (transparentObjects.length)
          renderObjects(transparentObjects, scene, camera);
      }
      if (_currentRenderTarget !== null) {
        textures.updateRenderTargetMipmap(_currentRenderTarget);
        textures.updateMultisampleRenderTarget(_currentRenderTarget);
      }
      state.buffers.depth.setTest(true);
      state.buffers.depth.setMask(true);
      state.buffers.color.setMask(true);
      state.setPolygonOffset(false);
      scene.onAfterRender(_this, scene, camera);
      if (vr.enabled) {
        vr.submitFrame();
      }
      currentRenderList = null;
      currentRenderState = null;
    };
    function projectObject(object, camera, groupOrder, sortObjects) {
      if (object.visible === false)
        return;
      var visible = object.layers.test(camera.layers);
      if (visible) {
        if (object.isGroup) {
          groupOrder = object.renderOrder;
        } else if (object.isLight) {
          currentRenderState.pushLight(object);
          if (object.castShadow) {
            currentRenderState.pushShadow(object);
          }
        } else if (object.isSprite) {
          if (!object.frustumCulled || _frustum.intersectsSprite(object)) {
            if (sortObjects) {
              _vector3.setFromMatrixPosition(object.matrixWorld).applyMatrix4(_projScreenMatrix);
            }
            var geometry = objects.update(object);
            var material = object.material;
            currentRenderList.push(object, geometry, material, groupOrder, _vector3.z, null);
          }
        } else if (object.isImmediateRenderObject) {
          if (sortObjects) {
            _vector3.setFromMatrixPosition(object.matrixWorld).applyMatrix4(_projScreenMatrix);
          }
          currentRenderList.push(object, null, object.material, groupOrder, _vector3.z, null);
        } else if (object.isMesh || object.isLine || object.isPoints) {
          if (object.isSkinnedMesh) {
            object.skeleton.update();
          }
          if (!object.frustumCulled || _frustum.intersectsObject(object)) {
            if (sortObjects) {
              _vector3.setFromMatrixPosition(object.matrixWorld).applyMatrix4(_projScreenMatrix);
            }
            var geometry = objects.update(object);
            var material = object.material;
            if (Array.isArray(material)) {
              var groups = geometry.groups;
              for (var i = 0,
                  l = groups.length; i < l; i++) {
                var group = groups[i];
                var groupMaterial = material[group.materialIndex];
                if (groupMaterial && groupMaterial.visible) {
                  currentRenderList.push(object, geometry, groupMaterial, groupOrder, _vector3.z, group);
                }
              }
            } else if (material.visible) {
              currentRenderList.push(object, geometry, material, groupOrder, _vector3.z, null);
            }
          }
        }
      }
      var children = object.children;
      for (var i = 0,
          l = children.length; i < l; i++) {
        projectObject(children[i], camera, groupOrder, sortObjects);
      }
    }
    function renderObjects(renderList, scene, camera, overrideMaterial) {
      for (var i = 0,
          l = renderList.length; i < l; i++) {
        var renderItem = renderList[i];
        var object = renderItem.object;
        var geometry = renderItem.geometry;
        var material = overrideMaterial === undefined ? renderItem.material : overrideMaterial;
        var group = renderItem.group;
        if (camera.isArrayCamera) {
          _currentArrayCamera = camera;
          var cameras = camera.cameras;
          for (var j = 0,
              jl = cameras.length; j < jl; j++) {
            var camera2 = cameras[j];
            if (object.layers.test(camera2.layers)) {
              if ('viewport' in camera2) {
                state.viewport(_currentViewport.copy(camera2.viewport));
              } else {
                var bounds = camera2.bounds;
                var x = bounds.x * _width;
                var y = bounds.y * _height;
                var width = bounds.z * _width;
                var height = bounds.w * _height;
                state.viewport(_currentViewport.set(x, y, width, height).multiplyScalar(_pixelRatio));
              }
              currentRenderState.setupLights(camera2);
              renderObject(object, scene, camera2, geometry, material, group);
            }
          }
        } else {
          _currentArrayCamera = null;
          renderObject(object, scene, camera, geometry, material, group);
        }
      }
    }
    function renderObject(object, scene, camera, geometry, material, group) {
      object.onBeforeRender(_this, scene, camera, geometry, material, group);
      currentRenderState = renderStates.get(scene, _currentArrayCamera || camera);
      object.modelViewMatrix.multiplyMatrices(camera.matrixWorldInverse, object.matrixWorld);
      object.normalMatrix.getNormalMatrix(object.modelViewMatrix);
      if (object.isImmediateRenderObject) {
        state.setMaterial(material);
        var program = setProgram(camera, scene.fog, material, object);
        _currentGeometryProgram.geometry = null;
        _currentGeometryProgram.program = null;
        _currentGeometryProgram.wireframe = false;
        renderObjectImmediate(object, program);
      } else {
        _this.renderBufferDirect(camera, scene.fog, geometry, material, object, group);
      }
      object.onAfterRender(_this, scene, camera, geometry, material, group);
      currentRenderState = renderStates.get(scene, _currentArrayCamera || camera);
    }
    function initMaterial(material, fog, object) {
      var materialProperties = properties.get(material);
      var lights = currentRenderState.state.lights;
      var shadowsArray = currentRenderState.state.shadowsArray;
      var lightsHash = materialProperties.lightsHash;
      var lightsStateHash = lights.state.hash;
      var parameters = programCache.getParameters(material, lights.state, shadowsArray, fog, _clipping.numPlanes, _clipping.numIntersection, object);
      var code = programCache.getProgramCode(material, parameters);
      var program = materialProperties.program;
      var programChange = true;
      if (program === undefined) {
        material.addEventListener('dispose', onMaterialDispose);
      } else if (program.code !== code) {
        releaseMaterialProgramReference(material);
      } else if (lightsHash.stateID !== lightsStateHash.stateID || lightsHash.directionalLength !== lightsStateHash.directionalLength || lightsHash.pointLength !== lightsStateHash.pointLength || lightsHash.spotLength !== lightsStateHash.spotLength || lightsHash.rectAreaLength !== lightsStateHash.rectAreaLength || lightsHash.hemiLength !== lightsStateHash.hemiLength || lightsHash.shadowsLength !== lightsStateHash.shadowsLength) {
        lightsHash.stateID = lightsStateHash.stateID;
        lightsHash.directionalLength = lightsStateHash.directionalLength;
        lightsHash.pointLength = lightsStateHash.pointLength;
        lightsHash.spotLength = lightsStateHash.spotLength;
        lightsHash.rectAreaLength = lightsStateHash.rectAreaLength;
        lightsHash.hemiLength = lightsStateHash.hemiLength;
        lightsHash.shadowsLength = lightsStateHash.shadowsLength;
        programChange = false;
      } else if (parameters.shaderID !== undefined) {
        return;
      } else {
        programChange = false;
      }
      if (programChange) {
        if (parameters.shaderID) {
          var shader = ShaderLib[parameters.shaderID];
          materialProperties.shader = {
            name: material.type,
            uniforms: cloneUniforms(shader.uniforms),
            vertexShader: shader.vertexShader,
            fragmentShader: shader.fragmentShader
          };
        } else {
          materialProperties.shader = {
            name: material.type,
            uniforms: material.uniforms,
            vertexShader: material.vertexShader,
            fragmentShader: material.fragmentShader
          };
        }
        material.onBeforeCompile(materialProperties.shader, _this);
        code = programCache.getProgramCode(material, parameters);
        program = programCache.acquireProgram(material, materialProperties.shader, parameters, code);
        materialProperties.program = program;
        material.program = program;
      }
      var programAttributes = program.getAttributes();
      if (material.morphTargets) {
        material.numSupportedMorphTargets = 0;
        for (var i = 0; i < _this.maxMorphTargets; i++) {
          if (programAttributes['morphTarget' + i] >= 0) {
            material.numSupportedMorphTargets++;
          }
        }
      }
      if (material.morphNormals) {
        material.numSupportedMorphNormals = 0;
        for (var i = 0; i < _this.maxMorphNormals; i++) {
          if (programAttributes['morphNormal' + i] >= 0) {
            material.numSupportedMorphNormals++;
          }
        }
      }
      var uniforms = materialProperties.shader.uniforms;
      if (!material.isShaderMaterial && !material.isRawShaderMaterial || material.clipping === true) {
        materialProperties.numClippingPlanes = _clipping.numPlanes;
        materialProperties.numIntersection = _clipping.numIntersection;
        uniforms.clippingPlanes = _clipping.uniform;
      }
      materialProperties.fog = fog;
      if (lightsHash === undefined) {
        materialProperties.lightsHash = lightsHash = {};
      }
      lightsHash.stateID = lightsStateHash.stateID;
      lightsHash.directionalLength = lightsStateHash.directionalLength;
      lightsHash.pointLength = lightsStateHash.pointLength;
      lightsHash.spotLength = lightsStateHash.spotLength;
      lightsHash.rectAreaLength = lightsStateHash.rectAreaLength;
      lightsHash.hemiLength = lightsStateHash.hemiLength;
      lightsHash.shadowsLength = lightsStateHash.shadowsLength;
      if (material.lights) {
        uniforms.ambientLightColor.value = lights.state.ambient;
        uniforms.directionalLights.value = lights.state.directional;
        uniforms.spotLights.value = lights.state.spot;
        uniforms.rectAreaLights.value = lights.state.rectArea;
        uniforms.pointLights.value = lights.state.point;
        uniforms.hemisphereLights.value = lights.state.hemi;
        uniforms.directionalShadowMap.value = lights.state.directionalShadowMap;
        uniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix;
        uniforms.spotShadowMap.value = lights.state.spotShadowMap;
        uniforms.spotShadowMatrix.value = lights.state.spotShadowMatrix;
        uniforms.pointShadowMap.value = lights.state.pointShadowMap;
        uniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix;
      }
      var progUniforms = materialProperties.program.getUniforms(),
          uniformsList = WebGLUniforms.seqWithValue(progUniforms.seq, uniforms);
      materialProperties.uniformsList = uniformsList;
    }
    function setProgram(camera, fog, material, object) {
      _usedTextureUnits = 0;
      var materialProperties = properties.get(material);
      var lights = currentRenderState.state.lights;
      var lightsHash = materialProperties.lightsHash;
      var lightsStateHash = lights.state.hash;
      if (_clippingEnabled) {
        if (_localClippingEnabled || camera !== _currentCamera) {
          var useCache = camera === _currentCamera && material.id === _currentMaterialId;
          _clipping.setState(material.clippingPlanes, material.clipIntersection, material.clipShadows, camera, materialProperties, useCache);
        }
      }
      if (material.needsUpdate === false) {
        if (materialProperties.program === undefined) {
          material.needsUpdate = true;
        } else if (material.fog && materialProperties.fog !== fog) {
          material.needsUpdate = true;
        } else if (material.lights && (lightsHash.stateID !== lightsStateHash.stateID || lightsHash.directionalLength !== lightsStateHash.directionalLength || lightsHash.pointLength !== lightsStateHash.pointLength || lightsHash.spotLength !== lightsStateHash.spotLength || lightsHash.rectAreaLength !== lightsStateHash.rectAreaLength || lightsHash.hemiLength !== lightsStateHash.hemiLength || lightsHash.shadowsLength !== lightsStateHash.shadowsLength)) {
          material.needsUpdate = true;
        } else if (materialProperties.numClippingPlanes !== undefined && (materialProperties.numClippingPlanes !== _clipping.numPlanes || materialProperties.numIntersection !== _clipping.numIntersection)) {
          material.needsUpdate = true;
        }
      }
      if (material.needsUpdate) {
        initMaterial(material, fog, object);
        material.needsUpdate = false;
      }
      var refreshProgram = false;
      var refreshMaterial = false;
      var refreshLights = false;
      var program = materialProperties.program,
          p_uniforms = program.getUniforms(),
          m_uniforms = materialProperties.shader.uniforms;
      if (state.useProgram(program.program)) {
        refreshProgram = true;
        refreshMaterial = true;
        refreshLights = true;
      }
      if (material.id !== _currentMaterialId) {
        _currentMaterialId = material.id;
        refreshMaterial = true;
      }
      if (refreshProgram || _currentCamera !== camera) {
        p_uniforms.setValue(_gl, 'projectionMatrix', camera.projectionMatrix);
        if (capabilities.logarithmicDepthBuffer) {
          p_uniforms.setValue(_gl, 'logDepthBufFC', 2.0 / (Math.log(camera.far + 1.0) / Math.LN2));
        }
        if (_currentCamera !== camera) {
          _currentCamera = camera;
          refreshMaterial = true;
          refreshLights = true;
        }
        if (material.isShaderMaterial || material.isMeshPhongMaterial || material.isMeshStandardMaterial || material.envMap) {
          var uCamPos = p_uniforms.map.cameraPosition;
          if (uCamPos !== undefined) {
            uCamPos.setValue(_gl, _vector3.setFromMatrixPosition(camera.matrixWorld));
          }
        }
        if (material.isMeshPhongMaterial || material.isMeshLambertMaterial || material.isMeshBasicMaterial || material.isMeshStandardMaterial || material.isShaderMaterial || material.skinning) {
          p_uniforms.setValue(_gl, 'viewMatrix', camera.matrixWorldInverse);
        }
      }
      if (material.skinning) {
        p_uniforms.setOptional(_gl, object, 'bindMatrix');
        p_uniforms.setOptional(_gl, object, 'bindMatrixInverse');
        var skeleton = object.skeleton;
        if (skeleton) {
          var bones = skeleton.bones;
          if (capabilities.floatVertexTextures) {
            if (skeleton.boneTexture === undefined) {
              var size = Math.sqrt(bones.length * 4);
              size = _Math.ceilPowerOfTwo(size);
              size = Math.max(size, 4);
              var boneMatrices = new Float32Array(size * size * 4);
              boneMatrices.set(skeleton.boneMatrices);
              var boneTexture = new DataTexture(boneMatrices, size, size, RGBAFormat, FloatType);
              boneTexture.needsUpdate = true;
              skeleton.boneMatrices = boneMatrices;
              skeleton.boneTexture = boneTexture;
              skeleton.boneTextureSize = size;
            }
            p_uniforms.setValue(_gl, 'boneTexture', skeleton.boneTexture);
            p_uniforms.setValue(_gl, 'boneTextureSize', skeleton.boneTextureSize);
          } else {
            p_uniforms.setOptional(_gl, skeleton, 'boneMatrices');
          }
        }
      }
      if (refreshMaterial) {
        p_uniforms.setValue(_gl, 'toneMappingExposure', _this.toneMappingExposure);
        p_uniforms.setValue(_gl, 'toneMappingWhitePoint', _this.toneMappingWhitePoint);
        if (material.lights) {
          markUniformsLightsNeedsUpdate(m_uniforms, refreshLights);
        }
        if (fog && material.fog) {
          refreshUniformsFog(m_uniforms, fog);
        }
        if (material.isMeshBasicMaterial) {
          refreshUniformsCommon(m_uniforms, material);
        } else if (material.isMeshLambertMaterial) {
          refreshUniformsCommon(m_uniforms, material);
          refreshUniformsLambert(m_uniforms, material);
        } else if (material.isMeshPhongMaterial) {
          refreshUniformsCommon(m_uniforms, material);
          if (material.isMeshToonMaterial) {
            refreshUniformsToon(m_uniforms, material);
          } else {
            refreshUniformsPhong(m_uniforms, material);
          }
        } else if (material.isMeshStandardMaterial) {
          refreshUniformsCommon(m_uniforms, material);
          if (material.isMeshPhysicalMaterial) {
            refreshUniformsPhysical(m_uniforms, material);
          } else {
            refreshUniformsStandard(m_uniforms, material);
          }
        } else if (material.isMeshMatcapMaterial) {
          refreshUniformsCommon(m_uniforms, material);
          refreshUniformsMatcap(m_uniforms, material);
        } else if (material.isMeshDepthMaterial) {
          refreshUniformsCommon(m_uniforms, material);
          refreshUniformsDepth(m_uniforms, material);
        } else if (material.isMeshDistanceMaterial) {
          refreshUniformsCommon(m_uniforms, material);
          refreshUniformsDistance(m_uniforms, material);
        } else if (material.isMeshNormalMaterial) {
          refreshUniformsCommon(m_uniforms, material);
          refreshUniformsNormal(m_uniforms, material);
        } else if (material.isLineBasicMaterial) {
          refreshUniformsLine(m_uniforms, material);
          if (material.isLineDashedMaterial) {
            refreshUniformsDash(m_uniforms, material);
          }
        } else if (material.isPointsMaterial) {
          refreshUniformsPoints(m_uniforms, material);
        } else if (material.isSpriteMaterial) {
          refreshUniformsSprites(m_uniforms, material);
        } else if (material.isShadowMaterial) {
          m_uniforms.color.value = material.color;
          m_uniforms.opacity.value = material.opacity;
        }
        if (m_uniforms.ltc_1 !== undefined)
          m_uniforms.ltc_1.value = UniformsLib.LTC_1;
        if (m_uniforms.ltc_2 !== undefined)
          m_uniforms.ltc_2.value = UniformsLib.LTC_2;
        WebGLUniforms.upload(_gl, materialProperties.uniformsList, m_uniforms, _this);
      }
      if (material.isShaderMaterial && material.uniformsNeedUpdate === true) {
        WebGLUniforms.upload(_gl, materialProperties.uniformsList, m_uniforms, _this);
        material.uniformsNeedUpdate = false;
      }
      if (material.isSpriteMaterial) {
        p_uniforms.setValue(_gl, 'center', object.center);
      }
      p_uniforms.setValue(_gl, 'modelViewMatrix', object.modelViewMatrix);
      p_uniforms.setValue(_gl, 'normalMatrix', object.normalMatrix);
      p_uniforms.setValue(_gl, 'modelMatrix', object.matrixWorld);
      return program;
    }
    function refreshUniformsCommon(uniforms, material) {
      uniforms.opacity.value = material.opacity;
      if (material.color) {
        uniforms.diffuse.value = material.color;
      }
      if (material.emissive) {
        uniforms.emissive.value.copy(material.emissive).multiplyScalar(material.emissiveIntensity);
      }
      if (material.map) {
        uniforms.map.value = material.map;
      }
      if (material.alphaMap) {
        uniforms.alphaMap.value = material.alphaMap;
      }
      if (material.specularMap) {
        uniforms.specularMap.value = material.specularMap;
      }
      if (material.envMap) {
        uniforms.envMap.value = material.envMap;
        uniforms.flipEnvMap.value = material.envMap.isCubeTexture ? -1 : 1;
        uniforms.reflectivity.value = material.reflectivity;
        uniforms.refractionRatio.value = material.refractionRatio;
        uniforms.maxMipLevel.value = properties.get(material.envMap).__maxMipLevel;
      }
      if (material.lightMap) {
        uniforms.lightMap.value = material.lightMap;
        uniforms.lightMapIntensity.value = material.lightMapIntensity;
      }
      if (material.aoMap) {
        uniforms.aoMap.value = material.aoMap;
        uniforms.aoMapIntensity.value = material.aoMapIntensity;
      }
      var uvScaleMap;
      if (material.map) {
        uvScaleMap = material.map;
      } else if (material.specularMap) {
        uvScaleMap = material.specularMap;
      } else if (material.displacementMap) {
        uvScaleMap = material.displacementMap;
      } else if (material.normalMap) {
        uvScaleMap = material.normalMap;
      } else if (material.bumpMap) {
        uvScaleMap = material.bumpMap;
      } else if (material.roughnessMap) {
        uvScaleMap = material.roughnessMap;
      } else if (material.metalnessMap) {
        uvScaleMap = material.metalnessMap;
      } else if (material.alphaMap) {
        uvScaleMap = material.alphaMap;
      } else if (material.emissiveMap) {
        uvScaleMap = material.emissiveMap;
      }
      if (uvScaleMap !== undefined) {
        if (uvScaleMap.isWebGLRenderTarget) {
          uvScaleMap = uvScaleMap.texture;
        }
        if (uvScaleMap.matrixAutoUpdate === true) {
          uvScaleMap.updateMatrix();
        }
        uniforms.uvTransform.value.copy(uvScaleMap.matrix);
      }
    }
    function refreshUniformsLine(uniforms, material) {
      uniforms.diffuse.value = material.color;
      uniforms.opacity.value = material.opacity;
    }
    function refreshUniformsDash(uniforms, material) {
      uniforms.dashSize.value = material.dashSize;
      uniforms.totalSize.value = material.dashSize + material.gapSize;
      uniforms.scale.value = material.scale;
    }
    function refreshUniformsPoints(uniforms, material) {
      uniforms.diffuse.value = material.color;
      uniforms.opacity.value = material.opacity;
      uniforms.size.value = material.size * _pixelRatio;
      uniforms.scale.value = _height * 0.5;
      uniforms.map.value = material.map;
      if (material.map !== null) {
        if (material.map.matrixAutoUpdate === true) {
          material.map.updateMatrix();
        }
        uniforms.uvTransform.value.copy(material.map.matrix);
      }
    }
    function refreshUniformsSprites(uniforms, material) {
      uniforms.diffuse.value = material.color;
      uniforms.opacity.value = material.opacity;
      uniforms.rotation.value = material.rotation;
      uniforms.map.value = material.map;
      if (material.map !== null) {
        if (material.map.matrixAutoUpdate === true) {
          material.map.updateMatrix();
        }
        uniforms.uvTransform.value.copy(material.map.matrix);
      }
    }
    function refreshUniformsFog(uniforms, fog) {
      uniforms.fogColor.value = fog.color;
      if (fog.isFog) {
        uniforms.fogNear.value = fog.near;
        uniforms.fogFar.value = fog.far;
      } else if (fog.isFogExp2) {
        uniforms.fogDensity.value = fog.density;
      }
    }
    function refreshUniformsLambert(uniforms, material) {
      if (material.emissiveMap) {
        uniforms.emissiveMap.value = material.emissiveMap;
      }
    }
    function refreshUniformsPhong(uniforms, material) {
      uniforms.specular.value = material.specular;
      uniforms.shininess.value = Math.max(material.shininess, 1e-4);
      if (material.emissiveMap) {
        uniforms.emissiveMap.value = material.emissiveMap;
      }
      if (material.bumpMap) {
        uniforms.bumpMap.value = material.bumpMap;
        uniforms.bumpScale.value = material.bumpScale;
        if (material.side === BackSide)
          uniforms.bumpScale.value *= -1;
      }
      if (material.normalMap) {
        uniforms.normalMap.value = material.normalMap;
        uniforms.normalScale.value.copy(material.normalScale);
        if (material.side === BackSide)
          uniforms.normalScale.value.negate();
      }
      if (material.displacementMap) {
        uniforms.displacementMap.value = material.displacementMap;
        uniforms.displacementScale.value = material.displacementScale;
        uniforms.displacementBias.value = material.displacementBias;
      }
    }
    function refreshUniformsToon(uniforms, material) {
      refreshUniformsPhong(uniforms, material);
      if (material.gradientMap) {
        uniforms.gradientMap.value = material.gradientMap;
      }
    }
    function refreshUniformsStandard(uniforms, material) {
      uniforms.roughness.value = material.roughness;
      uniforms.metalness.value = material.metalness;
      if (material.roughnessMap) {
        uniforms.roughnessMap.value = material.roughnessMap;
      }
      if (material.metalnessMap) {
        uniforms.metalnessMap.value = material.metalnessMap;
      }
      if (material.emissiveMap) {
        uniforms.emissiveMap.value = material.emissiveMap;
      }
      if (material.bumpMap) {
        uniforms.bumpMap.value = material.bumpMap;
        uniforms.bumpScale.value = material.bumpScale;
        if (material.side === BackSide)
          uniforms.bumpScale.value *= -1;
      }
      if (material.normalMap) {
        uniforms.normalMap.value = material.normalMap;
        uniforms.normalScale.value.copy(material.normalScale);
        if (material.side === BackSide)
          uniforms.normalScale.value.negate();
      }
      if (material.displacementMap) {
        uniforms.displacementMap.value = material.displacementMap;
        uniforms.displacementScale.value = material.displacementScale;
        uniforms.displacementBias.value = material.displacementBias;
      }
      if (material.envMap) {
        uniforms.envMapIntensity.value = material.envMapIntensity;
      }
    }
    function refreshUniformsPhysical(uniforms, material) {
      refreshUniformsStandard(uniforms, material);
      uniforms.reflectivity.value = material.reflectivity;
      uniforms.clearCoat.value = material.clearCoat;
      uniforms.clearCoatRoughness.value = material.clearCoatRoughness;
    }
    function refreshUniformsMatcap(uniforms, material) {
      if (material.matcap) {
        uniforms.matcap.value = material.matcap;
      }
      if (material.bumpMap) {
        uniforms.bumpMap.value = material.bumpMap;
        uniforms.bumpScale.value = material.bumpScale;
        if (material.side === BackSide)
          uniforms.bumpScale.value *= -1;
      }
      if (material.normalMap) {
        uniforms.normalMap.value = material.normalMap;
        uniforms.normalScale.value.copy(material.normalScale);
        if (material.side === BackSide)
          uniforms.normalScale.value.negate();
      }
      if (material.displacementMap) {
        uniforms.displacementMap.value = material.displacementMap;
        uniforms.displacementScale.value = material.displacementScale;
        uniforms.displacementBias.value = material.displacementBias;
      }
    }
    function refreshUniformsDepth(uniforms, material) {
      if (material.displacementMap) {
        uniforms.displacementMap.value = material.displacementMap;
        uniforms.displacementScale.value = material.displacementScale;
        uniforms.displacementBias.value = material.displacementBias;
      }
    }
    function refreshUniformsDistance(uniforms, material) {
      if (material.displacementMap) {
        uniforms.displacementMap.value = material.displacementMap;
        uniforms.displacementScale.value = material.displacementScale;
        uniforms.displacementBias.value = material.displacementBias;
      }
      uniforms.referencePosition.value.copy(material.referencePosition);
      uniforms.nearDistance.value = material.nearDistance;
      uniforms.farDistance.value = material.farDistance;
    }
    function refreshUniformsNormal(uniforms, material) {
      if (material.bumpMap) {
        uniforms.bumpMap.value = material.bumpMap;
        uniforms.bumpScale.value = material.bumpScale;
        if (material.side === BackSide)
          uniforms.bumpScale.value *= -1;
      }
      if (material.normalMap) {
        uniforms.normalMap.value = material.normalMap;
        uniforms.normalScale.value.copy(material.normalScale);
        if (material.side === BackSide)
          uniforms.normalScale.value.negate();
      }
      if (material.displacementMap) {
        uniforms.displacementMap.value = material.displacementMap;
        uniforms.displacementScale.value = material.displacementScale;
        uniforms.displacementBias.value = material.displacementBias;
      }
    }
    function markUniformsLightsNeedsUpdate(uniforms, value) {
      uniforms.ambientLightColor.needsUpdate = value;
      uniforms.directionalLights.needsUpdate = value;
      uniforms.pointLights.needsUpdate = value;
      uniforms.spotLights.needsUpdate = value;
      uniforms.rectAreaLights.needsUpdate = value;
      uniforms.hemisphereLights.needsUpdate = value;
    }
    function allocTextureUnit() {
      var textureUnit = _usedTextureUnits;
      if (textureUnit >= capabilities.maxTextures) {
        console.warn('THREE.WebGLRenderer: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures);
      }
      _usedTextureUnits += 1;
      return textureUnit;
    }
    this.allocTextureUnit = allocTextureUnit;
    this.setTexture2D = (function() {
      var warned = false;
      return function setTexture2D(texture, slot) {
        if (texture && texture.isWebGLRenderTarget) {
          if (!warned) {
            console.warn("THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead.");
            warned = true;
          }
          texture = texture.texture;
        }
        textures.setTexture2D(texture, slot);
      };
    }());
    this.setTexture3D = (function() {
      return function setTexture3D(texture, slot) {
        textures.setTexture3D(texture, slot);
      };
    }());
    this.setTexture = (function() {
      var warned = false;
      return function setTexture(texture, slot) {
        if (!warned) {
          console.warn("THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead.");
          warned = true;
        }
        textures.setTexture2D(texture, slot);
      };
    }());
    this.setTextureCube = (function() {
      var warned = false;
      return function setTextureCube(texture, slot) {
        if (texture && texture.isWebGLRenderTargetCube) {
          if (!warned) {
            console.warn("THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead.");
            warned = true;
          }
          texture = texture.texture;
        }
        if ((texture && texture.isCubeTexture) || (Array.isArray(texture.image) && texture.image.length === 6)) {
          textures.setTextureCube(texture, slot);
        } else {
          textures.setTextureCubeDynamic(texture, slot);
        }
      };
    }());
    this.setFramebuffer = function(value) {
      _framebuffer = value;
    };
    this.getRenderTarget = function() {
      return _currentRenderTarget;
    };
    this.setRenderTarget = function(renderTarget, activeCubeFace, activeMipMapLevel) {
      _currentRenderTarget = renderTarget;
      if (renderTarget && properties.get(renderTarget).__webglFramebuffer === undefined) {
        textures.setupRenderTarget(renderTarget);
      }
      var framebuffer = _framebuffer;
      var isCube = false;
      if (renderTarget) {
        var __webglFramebuffer = properties.get(renderTarget).__webglFramebuffer;
        if (renderTarget.isWebGLRenderTargetCube) {
          framebuffer = __webglFramebuffer[activeCubeFace || 0];
          isCube = true;
        } else if (renderTarget.isWebGLMultisampleRenderTarget) {
          framebuffer = properties.get(renderTarget).__webglMultisampledFramebuffer;
        } else {
          framebuffer = __webglFramebuffer;
        }
        _currentViewport.copy(renderTarget.viewport);
        _currentScissor.copy(renderTarget.scissor);
        _currentScissorTest = renderTarget.scissorTest;
      } else {
        _currentViewport.copy(_viewport).multiplyScalar(_pixelRatio);
        _currentScissor.copy(_scissor).multiplyScalar(_pixelRatio);
        _currentScissorTest = _scissorTest;
      }
      if (_currentFramebuffer !== framebuffer) {
        _gl.bindFramebuffer(36160, framebuffer);
        _currentFramebuffer = framebuffer;
      }
      state.viewport(_currentViewport);
      state.scissor(_currentScissor);
      state.setScissorTest(_currentScissorTest);
      if (isCube) {
        var textureProperties = properties.get(renderTarget.texture);
        _gl.framebufferTexture2D(36160, 36064, 34069 + activeCubeFace || 0, textureProperties.__webglTexture, activeMipMapLevel || 0);
      }
    };
    this.readRenderTargetPixels = function(renderTarget, x, y, width, height, buffer) {
      if (!(renderTarget && renderTarget.isWebGLRenderTarget)) {
        console.error('THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.');
        return;
      }
      var framebuffer = properties.get(renderTarget).__webglFramebuffer;
      if (framebuffer) {
        var restore = false;
        if (framebuffer !== _currentFramebuffer) {
          _gl.bindFramebuffer(36160, framebuffer);
          restore = true;
        }
        try {
          var texture = renderTarget.texture;
          var textureFormat = texture.format;
          var textureType = texture.type;
          if (textureFormat !== RGBAFormat && utils.convert(textureFormat) !== _gl.getParameter(35739)) {
            console.error('THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.');
            return;
          }
          if (textureType !== UnsignedByteType && utils.convert(textureType) !== _gl.getParameter(35738) && !(textureType === FloatType && (capabilities.isWebGL2 || extensions.get('OES_texture_float') || extensions.get('WEBGL_color_buffer_float'))) && !(textureType === HalfFloatType && (capabilities.isWebGL2 ? extensions.get('EXT_color_buffer_float') : extensions.get('EXT_color_buffer_half_float')))) {
            console.error('THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.');
            return;
          }
          if (_gl.checkFramebufferStatus(36160) === 36053) {
            if ((x >= 0 && x <= (renderTarget.width - width)) && (y >= 0 && y <= (renderTarget.height - height))) {
              _gl.readPixels(x, y, width, height, utils.convert(textureFormat), utils.convert(textureType), buffer);
            }
          } else {
            console.error('THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.');
          }
        } finally {
          if (restore) {
            _gl.bindFramebuffer(36160, _currentFramebuffer);
          }
        }
      }
    };
    this.copyFramebufferToTexture = function(position, texture, level) {
      var width = texture.image.width;
      var height = texture.image.height;
      var glFormat = utils.convert(texture.format);
      this.setTexture2D(texture, 0);
      _gl.copyTexImage2D(3553, level || 0, glFormat, position.x, position.y, width, height, 0);
    };
    this.copyTextureToTexture = function(position, srcTexture, dstTexture, level) {
      var width = srcTexture.image.width;
      var height = srcTexture.image.height;
      var glFormat = utils.convert(dstTexture.format);
      var glType = utils.convert(dstTexture.type);
      this.setTexture2D(dstTexture, 0);
      if (srcTexture.isDataTexture) {
        _gl.texSubImage2D(3553, level || 0, position.x, position.y, width, height, glFormat, glType, srcTexture.image.data);
      } else {
        _gl.texSubImage2D(3553, level || 0, position.x, position.y, glFormat, glType, srcTexture.image);
      }
    };
  }
  function FogExp2(color, density) {
    this.name = '';
    this.color = new Color(color);
    this.density = (density !== undefined) ? density : 0.00025;
  }
  Object.assign(FogExp2.prototype, {
    isFogExp2: true,
    clone: function() {
      return new FogExp2(this.color, this.density);
    },
    toJSON: function() {
      return {
        type: 'FogExp2',
        color: this.color.getHex(),
        density: this.density
      };
    }
  });
  function Fog(color, near, far) {
    this.name = '';
    this.color = new Color(color);
    this.near = (near !== undefined) ? near : 1;
    this.far = (far !== undefined) ? far : 1000;
  }
  Object.assign(Fog.prototype, {
    isFog: true,
    clone: function() {
      return new Fog(this.color, this.near, this.far);
    },
    toJSON: function() {
      return {
        type: 'Fog',
        color: this.color.getHex(),
        near: this.near,
        far: this.far
      };
    }
  });
  function Scene() {
    Object3D.call(this);
    this.type = 'Scene';
    this.background = null;
    this.fog = null;
    this.overrideMaterial = null;
    this.autoUpdate = true;
  }
  Scene.prototype = Object.assign(Object.create(Object3D.prototype), {
    constructor: Scene,
    isScene: true,
    copy: function(source, recursive) {
      Object3D.prototype.copy.call(this, source, recursive);
      if (source.background !== null)
        this.background = source.background.clone();
      if (source.fog !== null)
        this.fog = source.fog.clone();
      if (source.overrideMaterial !== null)
        this.overrideMaterial = source.overrideMaterial.clone();
      this.autoUpdate = source.autoUpdate;
      this.matrixAutoUpdate = source.matrixAutoUpdate;
      return this;
    },
    toJSON: function(meta) {
      var data = Object3D.prototype.toJSON.call(this, meta);
      if (this.background !== null)
        data.object.background = this.background.toJSON(meta);
      if (this.fog !== null)
        data.object.fog = this.fog.toJSON();
      return data;
    },
    dispose: function() {
      this.dispatchEvent({type: 'dispose'});
    }
  });
  function InterleavedBuffer(array, stride) {
    this.array = array;
    this.stride = stride;
    this.count = array !== undefined ? array.length / stride : 0;
    this.dynamic = false;
    this.updateRange = {
      offset: 0,
      count: -1
    };
    this.version = 0;
  }
  Object.defineProperty(InterleavedBuffer.prototype, 'needsUpdate', {set: function(value) {
      if (value === true)
        this.version++;
    }});
  Object.assign(InterleavedBuffer.prototype, {
    isInterleavedBuffer: true,
    onUploadCallback: function() {},
    setArray: function(array) {
      if (Array.isArray(array)) {
        throw new TypeError('THREE.BufferAttribute: array should be a Typed Array.');
      }
      this.count = array !== undefined ? array.length / this.stride : 0;
      this.array = array;
      return this;
    },
    setDynamic: function(value) {
      this.dynamic = value;
      return this;
    },
    copy: function(source) {
      this.array = new source.array.constructor(source.array);
      this.count = source.count;
      this.stride = source.stride;
      this.dynamic = source.dynamic;
      return this;
    },
    copyAt: function(index1, attribute, index2) {
      index1 *= this.stride;
      index2 *= attribute.stride;
      for (var i = 0,
          l = this.stride; i < l; i++) {
        this.array[index1 + i] = attribute.array[index2 + i];
      }
      return this;
    },
    set: function(value, offset) {
      if (offset === undefined)
        offset = 0;
      this.array.set(value, offset);
      return this;
    },
    clone: function() {
      return new this.constructor().copy(this);
    },
    onUpload: function(callback) {
      this.onUploadCallback = callback;
      return this;
    }
  });
  function InterleavedBufferAttribute(interleavedBuffer, itemSize, offset, normalized) {
    this.data = interleavedBuffer;
    this.itemSize = itemSize;
    this.offset = offset;
    this.normalized = normalized === true;
  }
  Object.defineProperties(InterleavedBufferAttribute.prototype, {
    count: {get: function() {
        return this.data.count;
      }},
    array: {get: function() {
        return this.data.array;
      }}
  });
  Object.assign(InterleavedBufferAttribute.prototype, {
    isInterleavedBufferAttribute: true,
    setX: function(index, x) {
      this.data.array[index * this.data.stride + this.offset] = x;
      return this;
    },
    setY: function(index, y) {
      this.data.array[index * this.data.stride + this.offset + 1] = y;
      return this;
    },
    setZ: function(index, z) {
      this.data.array[index * this.data.stride + this.offset + 2] = z;
      return this;
    },
    setW: function(index, w) {
      this.data.array[index * this.data.stride + this.offset + 3] = w;
      return this;
    },
    getX: function(index) {
      return this.data.array[index * this.data.stride + this.offset];
    },
    getY: function(index) {
      return this.data.array[index * this.data.stride + this.offset + 1];
    },
    getZ: function(index) {
      return this.data.array[index * this.data.stride + this.offset + 2];
    },
    getW: function(index) {
      return this.data.array[index * this.data.stride + this.offset + 3];
    },
    setXY: function(index, x, y) {
      index = index * this.data.stride + this.offset;
      this.data.array[index + 0] = x;
      this.data.array[index + 1] = y;
      return this;
    },
    setXYZ: function(index, x, y, z) {
      index = index * this.data.stride + this.offset;
      this.data.array[index + 0] = x;
      this.data.array[index + 1] = y;
      this.data.array[index + 2] = z;
      return this;
    },
    setXYZW: function(index, x, y, z, w) {
      index = index * this.data.stride + this.offset;
      this.data.array[index + 0] = x;
      this.data.array[index + 1] = y;
      this.data.array[index + 2] = z;
      this.data.array[index + 3] = w;
      return this;
    }
  });
  function SpriteMaterial(parameters) {
    Material.call(this);
    this.type = 'SpriteMaterial';
    this.color = new Color(0xffffff);
    this.map = null;
    this.rotation = 0;
    this.sizeAttenuation = true;
    this.lights = false;
    this.transparent = true;
    this.setValues(parameters);
  }
  SpriteMaterial.prototype = Object.create(Material.prototype);
  SpriteMaterial.prototype.constructor = SpriteMaterial;
  SpriteMaterial.prototype.isSpriteMaterial = true;
  SpriteMaterial.prototype.copy = function(source) {
    Material.prototype.copy.call(this, source);
    this.color.copy(source.color);
    this.map = source.map;
    this.rotation = source.rotation;
    this.sizeAttenuation = source.sizeAttenuation;
    return this;
  };
  var geometry;
  function Sprite(material) {
    Object3D.call(this);
    this.type = 'Sprite';
    if (geometry === undefined) {
      geometry = new BufferGeometry();
      var float32Array = new Float32Array([-0.5, -0.5, 0, 0, 0, 0.5, -0.5, 0, 1, 0, 0.5, 0.5, 0, 1, 1, -0.5, 0.5, 0, 0, 1]);
      var interleavedBuffer = new InterleavedBuffer(float32Array, 5);
      geometry.setIndex([0, 1, 2, 0, 2, 3]);
      geometry.addAttribute('position', new InterleavedBufferAttribute(interleavedBuffer, 3, 0, false));
      geometry.addAttribute('uv', new InterleavedBufferAttribute(interleavedBuffer, 2, 3, false));
    }
    this.geometry = geometry;
    this.material = (material !== undefined) ? material : new SpriteMaterial();
    this.center = new Vector2(0.5, 0.5);
  }
  Sprite.prototype = Object.assign(Object.create(Object3D.prototype), {
    constructor: Sprite,
    isSprite: true,
    raycast: (function() {
      var intersectPoint = new Vector3();
      var worldScale = new Vector3();
      var mvPosition = new Vector3();
      var alignedPosition = new Vector2();
      var rotatedPosition = new Vector2();
      var viewWorldMatrix = new Matrix4();
      var vA = new Vector3();
      var vB = new Vector3();
      var vC = new Vector3();
      var uvA = new Vector2();
      var uvB = new Vector2();
      var uvC = new Vector2();
      function transformVertex(vertexPosition, mvPosition, center, scale, sin, cos) {
        alignedPosition.subVectors(vertexPosition, center).addScalar(0.5).multiply(scale);
        if (sin !== undefined) {
          rotatedPosition.x = (cos * alignedPosition.x) - (sin * alignedPosition.y);
          rotatedPosition.y = (sin * alignedPosition.x) + (cos * alignedPosition.y);
        } else {
          rotatedPosition.copy(alignedPosition);
        }
        vertexPosition.copy(mvPosition);
        vertexPosition.x += rotatedPosition.x;
        vertexPosition.y += rotatedPosition.y;
        vertexPosition.applyMatrix4(viewWorldMatrix);
      }
      return function raycast(raycaster, intersects) {
        worldScale.setFromMatrixScale(this.matrixWorld);
        viewWorldMatrix.getInverse(this.modelViewMatrix).premultiply(this.matrixWorld);
        mvPosition.setFromMatrixPosition(this.modelViewMatrix);
        var rotation = this.material.rotation;
        var sin,
            cos;
        if (rotation !== 0) {
          cos = Math.cos(rotation);
          sin = Math.sin(rotation);
        }
        var center = this.center;
        transformVertex(vA.set(-0.5, -0.5, 0), mvPosition, center, worldScale, sin, cos);
        transformVertex(vB.set(0.5, -0.5, 0), mvPosition, center, worldScale, sin, cos);
        transformVertex(vC.set(0.5, 0.5, 0), mvPosition, center, worldScale, sin, cos);
        uvA.set(0, 0);
        uvB.set(1, 0);
        uvC.set(1, 1);
        var intersect = raycaster.ray.intersectTriangle(vA, vB, vC, false, intersectPoint);
        if (intersect === null) {
          transformVertex(vB.set(-0.5, 0.5, 0), mvPosition, center, worldScale, sin, cos);
          uvB.set(0, 1);
          intersect = raycaster.ray.intersectTriangle(vA, vC, vB, false, intersectPoint);
          if (intersect === null) {
            return;
          }
        }
        var distance = raycaster.ray.origin.distanceTo(intersectPoint);
        if (distance < raycaster.near || distance > raycaster.far)
          return;
        intersects.push({
          distance: distance,
          point: intersectPoint.clone(),
          uv: Triangle.getUV(intersectPoint, vA, vB, vC, uvA, uvB, uvC, new Vector2()),
          face: null,
          object: this
        });
      };
    }()),
    clone: function() {
      return new this.constructor(this.material).copy(this);
    },
    copy: function(source) {
      Object3D.prototype.copy.call(this, source);
      if (source.center !== undefined)
        this.center.copy(source.center);
      return this;
    }
  });
  function LOD() {
    Object3D.call(this);
    this.type = 'LOD';
    Object.defineProperties(this, {levels: {
        enumerable: true,
        value: []
      }});
  }
  LOD.prototype = Object.assign(Object.create(Object3D.prototype), {
    constructor: LOD,
    copy: function(source) {
      Object3D.prototype.copy.call(this, source, false);
      var levels = source.levels;
      for (var i = 0,
          l = levels.length; i < l; i++) {
        var level = levels[i];
        this.addLevel(level.object.clone(), level.distance);
      }
      return this;
    },
    addLevel: function(object, distance) {
      if (distance === undefined)
        distance = 0;
      distance = Math.abs(distance);
      var levels = this.levels;
      for (var l = 0; l < levels.length; l++) {
        if (distance < levels[l].distance) {
          break;
        }
      }
      levels.splice(l, 0, {
        distance: distance,
        object: object
      });
      this.add(object);
    },
    getObjectForDistance: function(distance) {
      var levels = this.levels;
      for (var i = 1,
          l = levels.length; i < l; i++) {
        if (distance < levels[i].distance) {
          break;
        }
      }
      return levels[i - 1].object;
    },
    raycast: (function() {
      var matrixPosition = new Vector3();
      return function raycast(raycaster, intersects) {
        matrixPosition.setFromMatrixPosition(this.matrixWorld);
        var distance = raycaster.ray.origin.distanceTo(matrixPosition);
        this.getObjectForDistance(distance).raycast(raycaster, intersects);
      };
    }()),
    update: function() {
      var v1 = new Vector3();
      var v2 = new Vector3();
      return function update(camera) {
        var levels = this.levels;
        if (levels.length > 1) {
          v1.setFromMatrixPosition(camera.matrixWorld);
          v2.setFromMatrixPosition(this.matrixWorld);
          var distance = v1.distanceTo(v2);
          levels[0].object.visible = true;
          for (var i = 1,
              l = levels.length; i < l; i++) {
            if (distance >= levels[i].distance) {
              levels[i - 1].object.visible = false;
              levels[i].object.visible = true;
            } else {
              break;
            }
          }
          for (; i < l; i++) {
            levels[i].object.visible = false;
          }
        }
      };
    }(),
    toJSON: function(meta) {
      var data = Object3D.prototype.toJSON.call(this, meta);
      data.object.levels = [];
      var levels = this.levels;
      for (var i = 0,
          l = levels.length; i < l; i++) {
        var level = levels[i];
        data.object.levels.push({
          object: level.object.uuid,
          distance: level.distance
        });
      }
      return data;
    }
  });
  function SkinnedMesh(geometry, material) {
    if (geometry && geometry.isGeometry) {
      console.error('THREE.SkinnedMesh no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.');
    }
    Mesh.call(this, geometry, material);
    this.type = 'SkinnedMesh';
    this.bindMode = 'attached';
    this.bindMatrix = new Matrix4();
    this.bindMatrixInverse = new Matrix4();
  }
  SkinnedMesh.prototype = Object.assign(Object.create(Mesh.prototype), {
    constructor: SkinnedMesh,
    isSkinnedMesh: true,
    bind: function(skeleton, bindMatrix) {
      this.skeleton = skeleton;
      if (bindMatrix === undefined) {
        this.updateMatrixWorld(true);
        this.skeleton.calculateInverses();
        bindMatrix = this.matrixWorld;
      }
      this.bindMatrix.copy(bindMatrix);
      this.bindMatrixInverse.getInverse(bindMatrix);
    },
    pose: function() {
      this.skeleton.pose();
    },
    normalizeSkinWeights: function() {
      var vector = new Vector4();
      var skinWeight = this.geometry.attributes.skinWeight;
      for (var i = 0,
          l = skinWeight.count; i < l; i++) {
        vector.x = skinWeight.getX(i);
        vector.y = skinWeight.getY(i);
        vector.z = skinWeight.getZ(i);
        vector.w = skinWeight.getW(i);
        var scale = 1.0 / vector.manhattanLength();
        if (scale !== Infinity) {
          vector.multiplyScalar(scale);
        } else {
          vector.set(1, 0, 0, 0);
        }
        skinWeight.setXYZW(i, vector.x, vector.y, vector.z, vector.w);
      }
    },
    updateMatrixWorld: function(force) {
      Mesh.prototype.updateMatrixWorld.call(this, force);
      if (this.bindMode === 'attached') {
        this.bindMatrixInverse.getInverse(this.matrixWorld);
      } else if (this.bindMode === 'detached') {
        this.bindMatrixInverse.getInverse(this.bindMatrix);
      } else {
        console.warn('THREE.SkinnedMesh: Unrecognized bindMode: ' + this.bindMode);
      }
    },
    clone: function() {
      return new this.constructor(this.geometry, this.material).copy(this);
    }
  });
  function Skeleton(bones, boneInverses) {
    bones = bones || [];
    this.bones = bones.slice(0);
    this.boneMatrices = new Float32Array(this.bones.length * 16);
    if (boneInverses === undefined) {
      this.calculateInverses();
    } else {
      if (this.bones.length === boneInverses.length) {
        this.boneInverses = boneInverses.slice(0);
      } else {
        console.warn('THREE.Skeleton boneInverses is the wrong length.');
        this.boneInverses = [];
        for (var i = 0,
            il = this.bones.length; i < il; i++) {
          this.boneInverses.push(new Matrix4());
        }
      }
    }
  }
  Object.assign(Skeleton.prototype, {
    calculateInverses: function() {
      this.boneInverses = [];
      for (var i = 0,
          il = this.bones.length; i < il; i++) {
        var inverse = new Matrix4();
        if (this.bones[i]) {
          inverse.getInverse(this.bones[i].matrixWorld);
        }
        this.boneInverses.push(inverse);
      }
    },
    pose: function() {
      var bone,
          i,
          il;
      for (i = 0, il = this.bones.length; i < il; i++) {
        bone = this.bones[i];
        if (bone) {
          bone.matrixWorld.getInverse(this.boneInverses[i]);
        }
      }
      for (i = 0, il = this.bones.length; i < il; i++) {
        bone = this.bones[i];
        if (bone) {
          if (bone.parent && bone.parent.isBone) {
            bone.matrix.getInverse(bone.parent.matrixWorld);
            bone.matrix.multiply(bone.matrixWorld);
          } else {
            bone.matrix.copy(bone.matrixWorld);
          }
          bone.matrix.decompose(bone.position, bone.quaternion, bone.scale);
        }
      }
    },
    update: (function() {
      var offsetMatrix = new Matrix4();
      var identityMatrix = new Matrix4();
      return function update() {
        var bones = this.bones;
        var boneInverses = this.boneInverses;
        var boneMatrices = this.boneMatrices;
        var boneTexture = this.boneTexture;
        for (var i = 0,
            il = bones.length; i < il; i++) {
          var matrix = bones[i] ? bones[i].matrixWorld : identityMatrix;
          offsetMatrix.multiplyMatrices(matrix, boneInverses[i]);
          offsetMatrix.toArray(boneMatrices, i * 16);
        }
        if (boneTexture !== undefined) {
          boneTexture.needsUpdate = true;
        }
      };
    })(),
    clone: function() {
      return new Skeleton(this.bones, this.boneInverses);
    },
    getBoneByName: function(name) {
      for (var i = 0,
          il = this.bones.length; i < il; i++) {
        var bone = this.bones[i];
        if (bone.name === name) {
          return bone;
        }
      }
      return undefined;
    }
  });
  function Bone() {
    Object3D.call(this);
    this.type = 'Bone';
  }
  Bone.prototype = Object.assign(Object.create(Object3D.prototype), {
    constructor: Bone,
    isBone: true
  });
  function LineBasicMaterial(parameters) {
    Material.call(this);
    this.type = 'LineBasicMaterial';
    this.color = new Color(0xffffff);
    this.linewidth = 1;
    this.linecap = 'round';
    this.linejoin = 'round';
    this.lights = false;
    this.setValues(parameters);
  }
  LineBasicMaterial.prototype = Object.create(Material.prototype);
  LineBasicMaterial.prototype.constructor = LineBasicMaterial;
  LineBasicMaterial.prototype.isLineBasicMaterial = true;
  LineBasicMaterial.prototype.copy = function(source) {
    Material.prototype.copy.call(this, source);
    this.color.copy(source.color);
    this.linewidth = source.linewidth;
    this.linecap = source.linecap;
    this.linejoin = source.linejoin;
    return this;
  };
  function Line(geometry, material, mode) {
    if (mode === 1) {
      console.error('THREE.Line: parameter THREE.LinePieces no longer supported. Use THREE.LineSegments instead.');
    }
    Object3D.call(this);
    this.type = 'Line';
    this.geometry = geometry !== undefined ? geometry : new BufferGeometry();
    this.material = material !== undefined ? material : new LineBasicMaterial({color: Math.random() * 0xffffff});
  }
  Line.prototype = Object.assign(Object.create(Object3D.prototype), {
    constructor: Line,
    isLine: true,
    computeLineDistances: (function() {
      var start = new Vector3();
      var end = new Vector3();
      return function computeLineDistances() {
        var geometry = this.geometry;
        if (geometry.isBufferGeometry) {
          if (geometry.index === null) {
            var positionAttribute = geometry.attributes.position;
            var lineDistances = [0];
            for (var i = 1,
                l = positionAttribute.count; i < l; i++) {
              start.fromBufferAttribute(positionAttribute, i - 1);
              end.fromBufferAttribute(positionAttribute, i);
              lineDistances[i] = lineDistances[i - 1];
              lineDistances[i] += start.distanceTo(end);
            }
            geometry.addAttribute('lineDistance', new Float32BufferAttribute(lineDistances, 1));
          } else {
            console.warn('THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.');
          }
        } else if (geometry.isGeometry) {
          var vertices = geometry.vertices;
          var lineDistances = geometry.lineDistances;
          lineDistances[0] = 0;
          for (var i = 1,
              l = vertices.length; i < l; i++) {
            lineDistances[i] = lineDistances[i - 1];
            lineDistances[i] += vertices[i - 1].distanceTo(vertices[i]);
          }
        }
        return this;
      };
    }()),
    raycast: (function() {
      var inverseMatrix = new Matrix4();
      var ray = new Ray();
      var sphere = new Sphere();
      return function raycast(raycaster, intersects) {
        var precision = raycaster.linePrecision;
        var geometry = this.geometry;
        var matrixWorld = this.matrixWorld;
        if (geometry.boundingSphere === null)
          geometry.computeBoundingSphere();
        sphere.copy(geometry.boundingSphere);
        sphere.applyMatrix4(matrixWorld);
        sphere.radius += precision;
        if (raycaster.ray.intersectsSphere(sphere) === false)
          return;
        inverseMatrix.getInverse(matrixWorld);
        ray.copy(raycaster.ray).applyMatrix4(inverseMatrix);
        var localPrecision = precision / ((this.scale.x + this.scale.y + this.scale.z) / 3);
        var localPrecisionSq = localPrecision * localPrecision;
        var vStart = new Vector3();
        var vEnd = new Vector3();
        var interSegment = new Vector3();
        var interRay = new Vector3();
        var step = (this && this.isLineSegments) ? 2 : 1;
        if (geometry.isBufferGeometry) {
          var index = geometry.index;
          var attributes = geometry.attributes;
          var positions = attributes.position.array;
          if (index !== null) {
            var indices = index.array;
            for (var i = 0,
                l = indices.length - 1; i < l; i += step) {
              var a = indices[i];
              var b = indices[i + 1];
              vStart.fromArray(positions, a * 3);
              vEnd.fromArray(positions, b * 3);
              var distSq = ray.distanceSqToSegment(vStart, vEnd, interRay, interSegment);
              if (distSq > localPrecisionSq)
                continue;
              interRay.applyMatrix4(this.matrixWorld);
              var distance = raycaster.ray.origin.distanceTo(interRay);
              if (distance < raycaster.near || distance > raycaster.far)
                continue;
              intersects.push({
                distance: distance,
                point: interSegment.clone().applyMatrix4(this.matrixWorld),
                index: i,
                face: null,
                faceIndex: null,
                object: this
              });
            }
          } else {
            for (var i = 0,
                l = positions.length / 3 - 1; i < l; i += step) {
              vStart.fromArray(positions, 3 * i);
              vEnd.fromArray(positions, 3 * i + 3);
              var distSq = ray.distanceSqToSegment(vStart, vEnd, interRay, interSegment);
              if (distSq > localPrecisionSq)
                continue;
              interRay.applyMatrix4(this.matrixWorld);
              var distance = raycaster.ray.origin.distanceTo(interRay);
              if (distance < raycaster.near || distance > raycaster.far)
                continue;
              intersects.push({
                distance: distance,
                point: interSegment.clone().applyMatrix4(this.matrixWorld),
                index: i,
                face: null,
                faceIndex: null,
                object: this
              });
            }
          }
        } else if (geometry.isGeometry) {
          var vertices = geometry.vertices;
          var nbVertices = vertices.length;
          for (var i = 0; i < nbVertices - 1; i += step) {
            var distSq = ray.distanceSqToSegment(vertices[i], vertices[i + 1], interRay, interSegment);
            if (distSq > localPrecisionSq)
              continue;
            interRay.applyMatrix4(this.matrixWorld);
            var distance = raycaster.ray.origin.distanceTo(interRay);
            if (distance < raycaster.near || distance > raycaster.far)
              continue;
            intersects.push({
              distance: distance,
              point: interSegment.clone().applyMatrix4(this.matrixWorld),
              index: i,
              face: null,
              faceIndex: null,
              object: this
            });
          }
        }
      };
    }()),
    copy: function(source) {
      Object3D.prototype.copy.call(this, source);
      this.geometry.copy(source.geometry);
      this.material.copy(source.material);
      return this;
    },
    clone: function() {
      return new this.constructor().copy(this);
    }
  });
  function LineSegments(geometry, material) {
    Line.call(this, geometry, material);
    this.type = 'LineSegments';
  }
  LineSegments.prototype = Object.assign(Object.create(Line.prototype), {
    constructor: LineSegments,
    isLineSegments: true,
    computeLineDistances: (function() {
      var start = new Vector3();
      var end = new Vector3();
      return function computeLineDistances() {
        var geometry = this.geometry;
        if (geometry.isBufferGeometry) {
          if (geometry.index === null) {
            var positionAttribute = geometry.attributes.position;
            var lineDistances = [];
            for (var i = 0,
                l = positionAttribute.count; i < l; i += 2) {
              start.fromBufferAttribute(positionAttribute, i);
              end.fromBufferAttribute(positionAttribute, i + 1);
              lineDistances[i] = (i === 0) ? 0 : lineDistances[i - 1];
              lineDistances[i + 1] = lineDistances[i] + start.distanceTo(end);
            }
            geometry.addAttribute('lineDistance', new Float32BufferAttribute(lineDistances, 1));
          } else {
            console.warn('THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.');
          }
        } else if (geometry.isGeometry) {
          var vertices = geometry.vertices;
          var lineDistances = geometry.lineDistances;
          for (var i = 0,
              l = vertices.length; i < l; i += 2) {
            start.copy(vertices[i]);
            end.copy(vertices[i + 1]);
            lineDistances[i] = (i === 0) ? 0 : lineDistances[i - 1];
            lineDistances[i + 1] = lineDistances[i] + start.distanceTo(end);
          }
        }
        return this;
      };
    }())
  });
  function LineLoop(geometry, material) {
    Line.call(this, geometry, material);
    this.type = 'LineLoop';
  }
  LineLoop.prototype = Object.assign(Object.create(Line.prototype), {
    constructor: LineLoop,
    isLineLoop: true
  });
  function PointsMaterial(parameters) {
    Material.call(this);
    this.type = 'PointsMaterial';
    this.color = new Color(0xffffff);
    this.map = null;
    this.size = 1;
    this.sizeAttenuation = true;
    this.morphTargets = false;
    this.lights = false;
    this.setValues(parameters);
  }
  PointsMaterial.prototype = Object.create(Material.prototype);
  PointsMaterial.prototype.constructor = PointsMaterial;
  PointsMaterial.prototype.isPointsMaterial = true;
  PointsMaterial.prototype.copy = function(source) {
    Material.prototype.copy.call(this, source);
    this.color.copy(source.color);
    this.map = source.map;
    this.size = source.size;
    this.sizeAttenuation = source.sizeAttenuation;
    this.morphTargets = source.morphTargets;
    return this;
  };
  function Points(geometry, material) {
    Object3D.call(this);
    this.type = 'Points';
    this.geometry = geometry !== undefined ? geometry : new BufferGeometry();
    this.material = material !== undefined ? material : new PointsMaterial({color: Math.random() * 0xffffff});
  }
  Points.prototype = Object.assign(Object.create(Object3D.prototype), {
    constructor: Points,
    isPoints: true,
    raycast: (function() {
      var inverseMatrix = new Matrix4();
      var ray = new Ray();
      var sphere = new Sphere();
      return function raycast(raycaster, intersects) {
        var object = this;
        var geometry = this.geometry;
        var matrixWorld = this.matrixWorld;
        var threshold = raycaster.params.Points.threshold;
        if (geometry.boundingSphere === null)
          geometry.computeBoundingSphere();
        sphere.copy(geometry.boundingSphere);
        sphere.applyMatrix4(matrixWorld);
        sphere.radius += threshold;
        if (raycaster.ray.intersectsSphere(sphere) === false)
          return;
        inverseMatrix.getInverse(matrixWorld);
        ray.copy(raycaster.ray).applyMatrix4(inverseMatrix);
        var localThreshold = threshold / ((this.scale.x + this.scale.y + this.scale.z) / 3);
        var localThresholdSq = localThreshold * localThreshold;
        var position = new Vector3();
        var intersectPoint = new Vector3();
        function testPoint(point, index) {
          var rayPointDistanceSq = ray.distanceSqToPoint(point);
          if (rayPointDistanceSq < localThresholdSq) {
            ray.closestPointToPoint(point, intersectPoint);
            intersectPoint.applyMatrix4(matrixWorld);
            var distance = raycaster.ray.origin.distanceTo(intersectPoint);
            if (distance < raycaster.near || distance > raycaster.far)
              return;
            intersects.push({
              distance: distance,
              distanceToRay: Math.sqrt(rayPointDistanceSq),
              point: intersectPoint.clone(),
              index: index,
              face: null,
              object: object
            });
          }
        }
        if (geometry.isBufferGeometry) {
          var index = geometry.index;
          var attributes = geometry.attributes;
          var positions = attributes.position.array;
          if (index !== null) {
            var indices = index.array;
            for (var i = 0,
                il = indices.length; i < il; i++) {
              var a = indices[i];
              position.fromArray(positions, a * 3);
              testPoint(position, a);
            }
          } else {
            for (var i = 0,
                l = positions.length / 3; i < l; i++) {
              position.fromArray(positions, i * 3);
              testPoint(position, i);
            }
          }
        } else {
          var vertices = geometry.vertices;
          for (var i = 0,
              l = vertices.length; i < l; i++) {
            testPoint(vertices[i], i);
          }
        }
      };
    }()),
    clone: function() {
      return new this.constructor(this.geometry, this.material).copy(this);
    }
  });
  function VideoTexture(video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy) {
    Texture.call(this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy);
    this.format = format !== undefined ? format : RGBFormat;
    this.minFilter = minFilter !== undefined ? minFilter : LinearFilter;
    this.magFilter = magFilter !== undefined ? magFilter : LinearFilter;
    this.generateMipmaps = false;
  }
  VideoTexture.prototype = Object.assign(Object.create(Texture.prototype), {
    constructor: VideoTexture,
    isVideoTexture: true,
    update: function() {
      var video = this.image;
      if (video.readyState >= video.HAVE_CURRENT_DATA) {
        this.needsUpdate = true;
      }
    }
  });
  function CompressedTexture(mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding) {
    Texture.call(this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding);
    this.image = {
      width: width,
      height: height
    };
    this.mipmaps = mipmaps;
    this.flipY = false;
    this.generateMipmaps = false;
  }
  CompressedTexture.prototype = Object.create(Texture.prototype);
  CompressedTexture.prototype.constructor = CompressedTexture;
  CompressedTexture.prototype.isCompressedTexture = true;
  function CanvasTexture(canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy) {
    Texture.call(this, canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy);
    this.needsUpdate = true;
  }
  CanvasTexture.prototype = Object.create(Texture.prototype);
  CanvasTexture.prototype.constructor = CanvasTexture;
  CanvasTexture.prototype.isCanvasTexture = true;
  function DepthTexture(width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format) {
    format = format !== undefined ? format : DepthFormat;
    if (format !== DepthFormat && format !== DepthStencilFormat) {
      throw new Error('DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat');
    }
    if (type === undefined && format === DepthFormat)
      type = UnsignedShortType;
    if (type === undefined && format === DepthStencilFormat)
      type = UnsignedInt248Type;
    Texture.call(this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy);
    this.image = {
      width: width,
      height: height
    };
    this.magFilter = magFilter !== undefined ? magFilter : NearestFilter;
    this.minFilter = minFilter !== undefined ? minFilter : NearestFilter;
    this.flipY = false;
    this.generateMipmaps = false;
  }
  DepthTexture.prototype = Object.create(Texture.prototype);
  DepthTexture.prototype.constructor = DepthTexture;
  DepthTexture.prototype.isDepthTexture = true;
  function WireframeGeometry(geometry) {
    BufferGeometry.call(this);
    this.type = 'WireframeGeometry';
    var vertices = [];
    var i,
        j,
        l,
        o,
        ol;
    var edge = [0, 0],
        edges = {},
        e,
        edge1,
        edge2;
    var key,
        keys = ['a', 'b', 'c'];
    var vertex;
    if (geometry && geometry.isGeometry) {
      var faces = geometry.faces;
      for (i = 0, l = faces.length; i < l; i++) {
        var face = faces[i];
        for (j = 0; j < 3; j++) {
          edge1 = face[keys[j]];
          edge2 = face[keys[(j + 1) % 3]];
          edge[0] = Math.min(edge1, edge2);
          edge[1] = Math.max(edge1, edge2);
          key = edge[0] + ',' + edge[1];
          if (edges[key] === undefined) {
            edges[key] = {
              index1: edge[0],
              index2: edge[1]
            };
          }
        }
      }
      for (key in edges) {
        e = edges[key];
        vertex = geometry.vertices[e.index1];
        vertices.push(vertex.x, vertex.y, vertex.z);
        vertex = geometry.vertices[e.index2];
        vertices.push(vertex.x, vertex.y, vertex.z);
      }
    } else if (geometry && geometry.isBufferGeometry) {
      var position,
          indices,
          groups;
      var group,
          start,
          count;
      var index1,
          index2;
      vertex = new Vector3();
      if (geometry.index !== null) {
        position = geometry.attributes.position;
        indices = geometry.index;
        groups = geometry.groups;
        if (groups.length === 0) {
          groups = [{
            start: 0,
            count: indices.count,
            materialIndex: 0
          }];
        }
        for (o = 0, ol = groups.length; o < ol; ++o) {
          group = groups[o];
          start = group.start;
          count = group.count;
          for (i = start, l = (start + count); i < l; i += 3) {
            for (j = 0; j < 3; j++) {
              edge1 = indices.getX(i + j);
              edge2 = indices.getX(i + (j + 1) % 3);
              edge[0] = Math.min(edge1, edge2);
              edge[1] = Math.max(edge1, edge2);
              key = edge[0] + ',' + edge[1];
              if (edges[key] === undefined) {
                edges[key] = {
                  index1: edge[0],
                  index2: edge[1]
                };
              }
            }
          }
        }
        for (key in edges) {
          e = edges[key];
          vertex.fromBufferAttribute(position, e.index1);
          vertices.push(vertex.x, vertex.y, vertex.z);
          vertex.fromBufferAttribute(position, e.index2);
          vertices.push(vertex.x, vertex.y, vertex.z);
        }
      } else {
        position = geometry.attributes.position;
        for (i = 0, l = (position.count / 3); i < l; i++) {
          for (j = 0; j < 3; j++) {
            index1 = 3 * i + j;
            vertex.fromBufferAttribute(position, index1);
            vertices.push(vertex.x, vertex.y, vertex.z);
            index2 = 3 * i + ((j + 1) % 3);
            vertex.fromBufferAttribute(position, index2);
            vertices.push(vertex.x, vertex.y, vertex.z);
          }
        }
      }
    }
    this.addAttribute('position', new Float32BufferAttribute(vertices, 3));
  }
  WireframeGeometry.prototype = Object.create(BufferGeometry.prototype);
  WireframeGeometry.prototype.constructor = WireframeGeometry;
  function ParametricGeometry(func, slices, stacks) {
    Geometry.call(this);
    this.type = 'ParametricGeometry';
    this.parameters = {
      func: func,
      slices: slices,
      stacks: stacks
    };
    this.fromBufferGeometry(new ParametricBufferGeometry(func, slices, stacks));
    this.mergeVertices();
  }
  ParametricGeometry.prototype = Object.create(Geometry.prototype);
  ParametricGeometry.prototype.constructor = ParametricGeometry;
  function ParametricBufferGeometry(func, slices, stacks) {
    BufferGeometry.call(this);
    this.type = 'ParametricBufferGeometry';
    this.parameters = {
      func: func,
      slices: slices,
      stacks: stacks
    };
    var indices = [];
    var vertices = [];
    var normals = [];
    var uvs = [];
    var EPS = 0.00001;
    var normal = new Vector3();
    var p0 = new Vector3(),
        p1 = new Vector3();
    var pu = new Vector3(),
        pv = new Vector3();
    var i,
        j;
    if (func.length < 3) {
      console.error('THREE.ParametricGeometry: Function must now modify a Vector3 as third parameter.');
    }
    var sliceCount = slices + 1;
    for (i = 0; i <= stacks; i++) {
      var v = i / stacks;
      for (j = 0; j <= slices; j++) {
        var u = j / slices;
        func(u, v, p0);
        vertices.push(p0.x, p0.y, p0.z);
        if (u - EPS >= 0) {
          func(u - EPS, v, p1);
          pu.subVectors(p0, p1);
        } else {
          func(u + EPS, v, p1);
          pu.subVectors(p1, p0);
        }
        if (v - EPS >= 0) {
          func(u, v - EPS, p1);
          pv.subVectors(p0, p1);
        } else {
          func(u, v + EPS, p1);
          pv.subVectors(p1, p0);
        }
        normal.crossVectors(pu, pv).normalize();
        normals.push(normal.x, normal.y, normal.z);
        uvs.push(u, v);
      }
    }
    for (i = 0; i < stacks; i++) {
      for (j = 0; j < slices; j++) {
        var a = i * sliceCount + j;
        var b = i * sliceCount + j + 1;
        var c = (i + 1) * sliceCount + j + 1;
        var d = (i + 1) * sliceCount + j;
        indices.push(a, b, d);
        indices.push(b, c, d);
      }
    }
    this.setIndex(indices);
    this.addAttribute('position', new Float32BufferAttribute(vertices, 3));
    this.addAttribute('normal', new Float32BufferAttribute(normals, 3));
    this.addAttribute('uv', new Float32BufferAttribute(uvs, 2));
  }
  ParametricBufferGeometry.prototype = Object.create(BufferGeometry.prototype);
  ParametricBufferGeometry.prototype.constructor = ParametricBufferGeometry;
  function PolyhedronGeometry(vertices, indices, radius, detail) {
    Geometry.call(this);
    this.type = 'PolyhedronGeometry';
    this.parameters = {
      vertices: vertices,
      indices: indices,
      radius: radius,
      detail: detail
    };
    this.fromBufferGeometry(new PolyhedronBufferGeometry(vertices, indices, radius, detail));
    this.mergeVertices();
  }
  PolyhedronGeometry.prototype = Object.create(Geometry.prototype);
  PolyhedronGeometry.prototype.constructor = PolyhedronGeometry;
  function PolyhedronBufferGeometry(vertices, indices, radius, detail) {
    BufferGeometry.call(this);
    this.type = 'PolyhedronBufferGeometry';
    this.parameters = {
      vertices: vertices,
      indices: indices,
      radius: radius,
      detail: detail
    };
    radius = radius || 1;
    detail = detail || 0;
    var vertexBuffer = [];
    var uvBuffer = [];
    subdivide(detail);
    appplyRadius(radius);
    generateUVs();
    this.addAttribute('position', new Float32BufferAttribute(vertexBuffer, 3));
    this.addAttribute('normal', new Float32BufferAttribute(vertexBuffer.slice(), 3));
    this.addAttribute('uv', new Float32BufferAttribute(uvBuffer, 2));
    if (detail === 0) {
      this.computeVertexNormals();
    } else {
      this.normalizeNormals();
    }
    function subdivide(detail) {
      var a = new Vector3();
      var b = new Vector3();
      var c = new Vector3();
      for (var i = 0; i < indices.length; i += 3) {
        getVertexByIndex(indices[i + 0], a);
        getVertexByIndex(indices[i + 1], b);
        getVertexByIndex(indices[i + 2], c);
        subdivideFace(a, b, c, detail);
      }
    }
    function subdivideFace(a, b, c, detail) {
      var cols = Math.pow(2, detail);
      var v = [];
      var i,
          j;
      for (i = 0; i <= cols; i++) {
        v[i] = [];
        var aj = a.clone().lerp(c, i / cols);
        var bj = b.clone().lerp(c, i / cols);
        var rows = cols - i;
        for (j = 0; j <= rows; j++) {
          if (j === 0 && i === cols) {
            v[i][j] = aj;
          } else {
            v[i][j] = aj.clone().lerp(bj, j / rows);
          }
        }
      }
      for (i = 0; i < cols; i++) {
        for (j = 0; j < 2 * (cols - i) - 1; j++) {
          var k = Math.floor(j / 2);
          if (j % 2 === 0) {
            pushVertex(v[i][k + 1]);
            pushVertex(v[i + 1][k]);
            pushVertex(v[i][k]);
          } else {
            pushVertex(v[i][k + 1]);
            pushVertex(v[i + 1][k + 1]);
            pushVertex(v[i + 1][k]);
          }
        }
      }
    }
    function appplyRadius(radius) {
      var vertex = new Vector3();
      for (var i = 0; i < vertexBuffer.length; i += 3) {
        vertex.x = vertexBuffer[i + 0];
        vertex.y = vertexBuffer[i + 1];
        vertex.z = vertexBuffer[i + 2];
        vertex.normalize().multiplyScalar(radius);
        vertexBuffer[i + 0] = vertex.x;
        vertexBuffer[i + 1] = vertex.y;
        vertexBuffer[i + 2] = vertex.z;
      }
    }
    function generateUVs() {
      var vertex = new Vector3();
      for (var i = 0; i < vertexBuffer.length; i += 3) {
        vertex.x = vertexBuffer[i + 0];
        vertex.y = vertexBuffer[i + 1];
        vertex.z = vertexBuffer[i + 2];
        var u = azimuth(vertex) / 2 / Math.PI + 0.5;
        var v = inclination(vertex) / Math.PI + 0.5;
        uvBuffer.push(u, 1 - v);
      }
      correctUVs();
      correctSeam();
    }
    function correctSeam() {
      for (var i = 0; i < uvBuffer.length; i += 6) {
        var x0 = uvBuffer[i + 0];
        var x1 = uvBuffer[i + 2];
        var x2 = uvBuffer[i + 4];
        var max = Math.max(x0, x1, x2);
        var min = Math.min(x0, x1, x2);
        if (max > 0.9 && min < 0.1) {
          if (x0 < 0.2)
            uvBuffer[i + 0] += 1;
          if (x1 < 0.2)
            uvBuffer[i + 2] += 1;
          if (x2 < 0.2)
            uvBuffer[i + 4] += 1;
        }
      }
    }
    function pushVertex(vertex) {
      vertexBuffer.push(vertex.x, vertex.y, vertex.z);
    }
    function getVertexByIndex(index, vertex) {
      var stride = index * 3;
      vertex.x = vertices[stride + 0];
      vertex.y = vertices[stride + 1];
      vertex.z = vertices[stride + 2];
    }
    function correctUVs() {
      var a = new Vector3();
      var b = new Vector3();
      var c = new Vector3();
      var centroid = new Vector3();
      var uvA = new Vector2();
      var uvB = new Vector2();
      var uvC = new Vector2();
      for (var i = 0,
          j = 0; i < vertexBuffer.length; i += 9, j += 6) {
        a.set(vertexBuffer[i + 0], vertexBuffer[i + 1], vertexBuffer[i + 2]);
        b.set(vertexBuffer[i + 3], vertexBuffer[i + 4], vertexBuffer[i + 5]);
        c.set(vertexBuffer[i + 6], vertexBuffer[i + 7], vertexBuffer[i + 8]);
        uvA.set(uvBuffer[j + 0], uvBuffer[j + 1]);
        uvB.set(uvBuffer[j + 2], uvBuffer[j + 3]);
        uvC.set(uvBuffer[j + 4], uvBuffer[j + 5]);
        centroid.copy(a).add(b).add(c).divideScalar(3);
        var azi = azimuth(centroid);
        correctUV(uvA, j + 0, a, azi);
        correctUV(uvB, j + 2, b, azi);
        correctUV(uvC, j + 4, c, azi);
      }
    }
    function correctUV(uv, stride, vector, azimuth) {
      if ((azimuth < 0) && (uv.x === 1)) {
        uvBuffer[stride] = uv.x - 1;
      }
      if ((vector.x === 0) && (vector.z === 0)) {
        uvBuffer[stride] = azimuth / 2 / Math.PI + 0.5;
      }
    }
    function azimuth(vector) {
      return Math.atan2(vector.z, -vector.x);
    }
    function inclination(vector) {
      return Math.atan2(-vector.y, Math.sqrt((vector.x * vector.x) + (vector.z * vector.z)));
    }
  }
  PolyhedronBufferGeometry.prototype = Object.create(BufferGeometry.prototype);
  PolyhedronBufferGeometry.prototype.constructor = PolyhedronBufferGeometry;
  function TetrahedronGeometry(radius, detail) {
    Geometry.call(this);
    this.type = 'TetrahedronGeometry';
    this.parameters = {
      radius: radius,
      detail: detail
    };
    this.fromBufferGeometry(new TetrahedronBufferGeometry(radius, detail));
    this.mergeVertices();
  }
  TetrahedronGeometry.prototype = Object.create(Geometry.prototype);
  TetrahedronGeometry.prototype.constructor = TetrahedronGeometry;
  function TetrahedronBufferGeometry(radius, detail) {
    var vertices = [1, 1, 1, -1, -1, 1, -1, 1, -1, 1, -1, -1];
    var indices = [2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1];
    PolyhedronBufferGeometry.call(this, vertices, indices, radius, detail);
    this.type = 'TetrahedronBufferGeometry';
    this.parameters = {
      radius: radius,
      detail: detail
    };
  }
  TetrahedronBufferGeometry.prototype = Object.create(PolyhedronBufferGeometry.prototype);
  TetrahedronBufferGeometry.prototype.constructor = TetrahedronBufferGeometry;
  function OctahedronGeometry(radius, detail) {
    Geometry.call(this);
    this.type = 'OctahedronGeometry';
    this.parameters = {
      radius: radius,
      detail: detail
    };
    this.fromBufferGeometry(new OctahedronBufferGeometry(radius, detail));
    this.mergeVertices();
  }
  OctahedronGeometry.prototype = Object.create(Geometry.prototype);
  OctahedronGeometry.prototype.constructor = OctahedronGeometry;
  function OctahedronBufferGeometry(radius, detail) {
    var vertices = [1, 0, 0, -1, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0, 1, 0, 0, -1];
    var indices = [0, 2, 4, 0, 4, 3, 0, 3, 5, 0, 5, 2, 1, 2, 5, 1, 5, 3, 1, 3, 4, 1, 4, 2];
    PolyhedronBufferGeometry.call(this, vertices, indices, radius, detail);
    this.type = 'OctahedronBufferGeometry';
    this.parameters = {
      radius: radius,
      detail: detail
    };
  }
  OctahedronBufferGeometry.prototype = Object.create(PolyhedronBufferGeometry.prototype);
  OctahedronBufferGeometry.prototype.constructor = OctahedronBufferGeometry;
  function IcosahedronGeometry(radius, detail) {
    Geometry.call(this);
    this.type = 'IcosahedronGeometry';
    this.parameters = {
      radius: radius,
      detail: detail
    };
    this.fromBufferGeometry(new IcosahedronBufferGeometry(radius, detail));
    this.mergeVertices();
  }
  IcosahedronGeometry.prototype = Object.create(Geometry.prototype);
  IcosahedronGeometry.prototype.constructor = IcosahedronGeometry;
  function IcosahedronBufferGeometry(radius, detail) {
    var t = (1 + Math.sqrt(5)) / 2;
    var vertices = [-1, t, 0, 1, t, 0, -1, -t, 0, 1, -t, 0, 0, -1, t, 0, 1, t, 0, -1, -t, 0, 1, -t, t, 0, -1, t, 0, 1, -t, 0, -1, -t, 0, 1];
    var indices = [0, 11, 5, 0, 5, 1, 0, 1, 7, 0, 7, 10, 0, 10, 11, 1, 5, 9, 5, 11, 4, 11, 10, 2, 10, 7, 6, 7, 1, 8, 3, 9, 4, 3, 4, 2, 3, 2, 6, 3, 6, 8, 3, 8, 9, 4, 9, 5, 2, 4, 11, 6, 2, 10, 8, 6, 7, 9, 8, 1];
    PolyhedronBufferGeometry.call(this, vertices, indices, radius, detail);
    this.type = 'IcosahedronBufferGeometry';
    this.parameters = {
      radius: radius,
      detail: detail
    };
  }
  IcosahedronBufferGeometry.prototype = Object.create(PolyhedronBufferGeometry.prototype);
  IcosahedronBufferGeometry.prototype.constructor = IcosahedronBufferGeometry;
  function DodecahedronGeometry(radius, detail) {
    Geometry.call(this);
    this.type = 'DodecahedronGeometry';
    this.parameters = {
      radius: radius,
      detail: detail
    };
    this.fromBufferGeometry(new DodecahedronBufferGeometry(radius, detail));
    this.mergeVertices();
  }
  DodecahedronGeometry.prototype = Object.create(Geometry.prototype);
  DodecahedronGeometry.prototype.constructor = DodecahedronGeometry;
  function DodecahedronBufferGeometry(radius, detail) {
    var t = (1 + Math.sqrt(5)) / 2;
    var r = 1 / t;
    var vertices = [-1, -1, -1, -1, -1, 1, -1, 1, -1, -1, 1, 1, 1, -1, -1, 1, -1, 1, 1, 1, -1, 1, 1, 1, 0, -r, -t, 0, -r, t, 0, r, -t, 0, r, t, -r, -t, 0, -r, t, 0, r, -t, 0, r, t, 0, -t, 0, -r, t, 0, -r, -t, 0, r, t, 0, r];
    var indices = [3, 11, 7, 3, 7, 15, 3, 15, 13, 7, 19, 17, 7, 17, 6, 7, 6, 15, 17, 4, 8, 17, 8, 10, 17, 10, 6, 8, 0, 16, 8, 16, 2, 8, 2, 10, 0, 12, 1, 0, 1, 18, 0, 18, 16, 6, 10, 2, 6, 2, 13, 6, 13, 15, 2, 16, 18, 2, 18, 3, 2, 3, 13, 18, 1, 9, 18, 9, 11, 18, 11, 3, 4, 14, 12, 4, 12, 0, 4, 0, 8, 11, 9, 5, 11, 5, 19, 11, 19, 7, 19, 5, 14, 19, 14, 4, 19, 4, 17, 1, 12, 14, 1, 14, 5, 1, 5, 9];
    PolyhedronBufferGeometry.call(this, vertices, indices, radius, detail);
    this.type = 'DodecahedronBufferGeometry';
    this.parameters = {
      radius: radius,
      detail: detail
    };
  }
  DodecahedronBufferGeometry.prototype = Object.create(PolyhedronBufferGeometry.prototype);
  DodecahedronBufferGeometry.prototype.constructor = DodecahedronBufferGeometry;
  function TubeGeometry(path, tubularSegments, radius, radialSegments, closed, taper) {
    Geometry.call(this);
    this.type = 'TubeGeometry';
    this.parameters = {
      path: path,
      tubularSegments: tubularSegments,
      radius: radius,
      radialSegments: radialSegments,
      closed: closed
    };
    if (taper !== undefined)
      console.warn('THREE.TubeGeometry: taper has been removed.');
    var bufferGeometry = new TubeBufferGeometry(path, tubularSegments, radius, radialSegments, closed);
    this.tangents = bufferGeometry.tangents;
    this.normals = bufferGeometry.normals;
    this.binormals = bufferGeometry.binormals;
    this.fromBufferGeometry(bufferGeometry);
    this.mergeVertices();
  }
  TubeGeometry.prototype = Object.create(Geometry.prototype);
  TubeGeometry.prototype.constructor = TubeGeometry;
  function TubeBufferGeometry(path, tubularSegments, radius, radialSegments, closed) {
    BufferGeometry.call(this);
    this.type = 'TubeBufferGeometry';
    this.parameters = {
      path: path,
      tubularSegments: tubularSegments,
      radius: radius,
      radialSegments: radialSegments,
      closed: closed
    };
    tubularSegments = tubularSegments || 64;
    radius = radius || 1;
    radialSegments = radialSegments || 8;
    closed = closed || false;
    var frames = path.computeFrenetFrames(tubularSegments, closed);
    this.tangents = frames.tangents;
    this.normals = frames.normals;
    this.binormals = frames.binormals;
    var vertex = new Vector3();
    var normal = new Vector3();
    var uv = new Vector2();
    var P = new Vector3();
    var i,
        j;
    var vertices = [];
    var normals = [];
    var uvs = [];
    var indices = [];
    generateBufferData();
    this.setIndex(indices);
    this.addAttribute('position', new Float32BufferAttribute(vertices, 3));
    this.addAttribute('normal', new Float32BufferAttribute(normals, 3));
    this.addAttribute('uv', new Float32BufferAttribute(uvs, 2));
    function generateBufferData() {
      for (i = 0; i < tubularSegments; i++) {
        generateSegment(i);
      }
      generateSegment((closed === false) ? tubularSegments : 0);
      generateUVs();
      generateIndices();
    }
    function generateSegment(i) {
      P = path.getPointAt(i / tubularSegments, P);
      var N = frames.normals[i];
      var B = frames.binormals[i];
      for (j = 0; j <= radialSegments; j++) {
        var v = j / radialSegments * Math.PI * 2;
        var sin = Math.sin(v);
        var cos = -Math.cos(v);
        normal.x = (cos * N.x + sin * B.x);
        normal.y = (cos * N.y + sin * B.y);
        normal.z = (cos * N.z + sin * B.z);
        normal.normalize();
        normals.push(normal.x, normal.y, normal.z);
        vertex.x = P.x + radius * normal.x;
        vertex.y = P.y + radius * normal.y;
        vertex.z = P.z + radius * normal.z;
        vertices.push(vertex.x, vertex.y, vertex.z);
      }
    }
    function generateIndices() {
      for (j = 1; j <= tubularSegments; j++) {
        for (i = 1; i <= radialSegments; i++) {
          var a = (radialSegments + 1) * (j - 1) + (i - 1);
          var b = (radialSegments + 1) * j + (i - 1);
          var c = (radialSegments + 1) * j + i;
          var d = (radialSegments + 1) * (j - 1) + i;
          indices.push(a, b, d);
          indices.push(b, c, d);
        }
      }
    }
    function generateUVs() {
      for (i = 0; i <= tubularSegments; i++) {
        for (j = 0; j <= radialSegments; j++) {
          uv.x = i / tubularSegments;
          uv.y = j / radialSegments;
          uvs.push(uv.x, uv.y);
        }
      }
    }
  }
  TubeBufferGeometry.prototype = Object.create(BufferGeometry.prototype);
  TubeBufferGeometry.prototype.constructor = TubeBufferGeometry;
  TubeBufferGeometry.prototype.toJSON = function() {
    var data = BufferGeometry.prototype.toJSON.call(this);
    data.path = this.parameters.path.toJSON();
    return data;
  };
  function TorusKnotGeometry(radius, tube, tubularSegments, radialSegments, p, q, heightScale) {
    Geometry.call(this);
    this.type = 'TorusKnotGeometry';
    this.parameters = {
      radius: radius,
      tube: tube,
      tubularSegments: tubularSegments,
      radialSegments: radialSegments,
      p: p,
      q: q
    };
    if (heightScale !== undefined)
      console.warn('THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.');
    this.fromBufferGeometry(new TorusKnotBufferGeometry(radius, tube, tubularSegments, radialSegments, p, q));
    this.mergeVertices();
  }
  TorusKnotGeometry.prototype = Object.create(Geometry.prototype);
  TorusKnotGeometry.prototype.constructor = TorusKnotGeometry;
  function TorusKnotBufferGeometry(radius, tube, tubularSegments, radialSegments, p, q) {
    BufferGeometry.call(this);
    this.type = 'TorusKnotBufferGeometry';
    this.parameters = {
      radius: radius,
      tube: tube,
      tubularSegments: tubularSegments,
      radialSegments: radialSegments,
      p: p,
      q: q
    };
    radius = radius || 1;
    tube = tube || 0.4;
    tubularSegments = Math.floor(tubularSegments) || 64;
    radialSegments = Math.floor(radialSegments) || 8;
    p = p || 2;
    q = q || 3;
    var indices = [];
    var vertices = [];
    var normals = [];
    var uvs = [];
    var i,
        j;
    var vertex = new Vector3();
    var normal = new Vector3();
    var P1 = new Vector3();
    var P2 = new Vector3();
    var B = new Vector3();
    var T = new Vector3();
    var N = new Vector3();
    for (i = 0; i <= tubularSegments; ++i) {
      var u = i / tubularSegments * p * Math.PI * 2;
      calculatePositionOnCurve(u, p, q, radius, P1);
      calculatePositionOnCurve(u + 0.01, p, q, radius, P2);
      T.subVectors(P2, P1);
      N.addVectors(P2, P1);
      B.crossVectors(T, N);
      N.crossVectors(B, T);
      B.normalize();
      N.normalize();
      for (j = 0; j <= radialSegments; ++j) {
        var v = j / radialSegments * Math.PI * 2;
        var cx = -tube * Math.cos(v);
        var cy = tube * Math.sin(v);
        vertex.x = P1.x + (cx * N.x + cy * B.x);
        vertex.y = P1.y + (cx * N.y + cy * B.y);
        vertex.z = P1.z + (cx * N.z + cy * B.z);
        vertices.push(vertex.x, vertex.y, vertex.z);
        normal.subVectors(vertex, P1).normalize();
        normals.push(normal.x, normal.y, normal.z);
        uvs.push(i / tubularSegments);
        uvs.push(j / radialSegments);
      }
    }
    for (j = 1; j <= tubularSegments; j++) {
      for (i = 1; i <= radialSegments; i++) {
        var a = (radialSegments + 1) * (j - 1) + (i - 1);
        var b = (radialSegments + 1) * j + (i - 1);
        var c = (radialSegments + 1) * j + i;
        var d = (radialSegments + 1) * (j - 1) + i;
        indices.push(a, b, d);
        indices.push(b, c, d);
      }
    }
    this.setIndex(indices);
    this.addAttribute('position', new Float32BufferAttribute(vertices, 3));
    this.addAttribute('normal', new Float32BufferAttribute(normals, 3));
    this.addAttribute('uv', new Float32BufferAttribute(uvs, 2));
    function calculatePositionOnCurve(u, p, q, radius, position) {
      var cu = Math.cos(u);
      var su = Math.sin(u);
      var quOverP = q / p * u;
      var cs = Math.cos(quOverP);
      position.x = radius * (2 + cs) * 0.5 * cu;
      position.y = radius * (2 + cs) * su * 0.5;
      position.z = radius * Math.sin(quOverP) * 0.5;
    }
  }
  TorusKnotBufferGeometry.prototype = Object.create(BufferGeometry.prototype);
  TorusKnotBufferGeometry.prototype.constructor = TorusKnotBufferGeometry;
  function TorusGeometry(radius, tube, radialSegments, tubularSegments, arc) {
    Geometry.call(this);
    this.type = 'TorusGeometry';
    this.parameters = {
      radius: radius,
      tube: tube,
      radialSegments: radialSegments,
      tubularSegments: tubularSegments,
      arc: arc
    };
    this.fromBufferGeometry(new TorusBufferGeometry(radius, tube, radialSegments, tubularSegments, arc));
    this.mergeVertices();
  }
  TorusGeometry.prototype = Object.create(Geometry.prototype);
  TorusGeometry.prototype.constructor = TorusGeometry;
  function TorusBufferGeometry(radius, tube, radialSegments, tubularSegments, arc) {
    BufferGeometry.call(this);
    this.type = 'TorusBufferGeometry';
    this.parameters = {
      radius: radius,
      tube: tube,
      radialSegments: radialSegments,
      tubularSegments: tubularSegments,
      arc: arc
    };
    radius = radius || 1;
    tube = tube || 0.4;
    radialSegments = Math.floor(radialSegments) || 8;
    tubularSegments = Math.floor(tubularSegments) || 6;
    arc = arc || Math.PI * 2;
    var indices = [];
    var vertices = [];
    var normals = [];
    var uvs = [];
    var center = new Vector3();
    var vertex = new Vector3();
    var normal = new Vector3();
    var j,
        i;
    for (j = 0; j <= radialSegments; j++) {
      for (i = 0; i <= tubularSegments; i++) {
        var u = i / tubularSegments * arc;
        var v = j / radialSegments * Math.PI * 2;
        vertex.x = (radius + tube * Math.cos(v)) * Math.cos(u);
        vertex.y = (radius + tube * Math.cos(v)) * Math.sin(u);
        vertex.z = tube * Math.sin(v);
        vertices.push(vertex.x, vertex.y, vertex.z);
        center.x = radius * Math.cos(u);
        center.y = radius * Math.sin(u);
        normal.subVectors(vertex, center).normalize();
        normals.push(normal.x, normal.y, normal.z);
        uvs.push(i / tubularSegments);
        uvs.push(j / radialSegments);
      }
    }
    for (j = 1; j <= radialSegments; j++) {
      for (i = 1; i <= tubularSegments; i++) {
        var a = (tubularSegments + 1) * j + i - 1;
        var b = (tubularSegments + 1) * (j - 1) + i - 1;
        var c = (tubularSegments + 1) * (j - 1) + i;
        var d = (tubularSegments + 1) * j + i;
        indices.push(a, b, d);
        indices.push(b, c, d);
      }
    }
    this.setIndex(indices);
    this.addAttribute('position', new Float32BufferAttribute(vertices, 3));
    this.addAttribute('normal', new Float32BufferAttribute(normals, 3));
    this.addAttribute('uv', new Float32BufferAttribute(uvs, 2));
  }
  TorusBufferGeometry.prototype = Object.create(BufferGeometry.prototype);
  TorusBufferGeometry.prototype.constructor = TorusBufferGeometry;
  var Earcut = {triangulate: function(data, holeIndices, dim) {
      dim = dim || 2;
      var hasHoles = holeIndices && holeIndices.length,
          outerLen = hasHoles ? holeIndices[0] * dim : data.length,
          outerNode = linkedList(data, 0, outerLen, dim, true),
          triangles = [];
      if (!outerNode)
        return triangles;
      var minX,
          minY,
          maxX,
          maxY,
          x,
          y,
          invSize;
      if (hasHoles)
        outerNode = eliminateHoles(data, holeIndices, outerNode, dim);
      if (data.length > 80 * dim) {
        minX = maxX = data[0];
        minY = maxY = data[1];
        for (var i = dim; i < outerLen; i += dim) {
          x = data[i];
          y = data[i + 1];
          if (x < minX)
            minX = x;
          if (y < minY)
            minY = y;
          if (x > maxX)
            maxX = x;
          if (y > maxY)
            maxY = y;
        }
        invSize = Math.max(maxX - minX, maxY - minY);
        invSize = invSize !== 0 ? 1 / invSize : 0;
      }
      earcutLinked(outerNode, triangles, dim, minX, minY, invSize);
      return triangles;
    }};
  function linkedList(data, start, end, dim, clockwise) {
    var i,
        last;
    if (clockwise === (signedArea(data, start, end, dim) > 0)) {
      for (i = start; i < end; i += dim)
        last = insertNode(i, data[i], data[i + 1], last);
    } else {
      for (i = end - dim; i >= start; i -= dim)
        last = insertNode(i, data[i], data[i + 1], last);
    }
    if (last && equals(last, last.next)) {
      removeNode(last);
      last = last.next;
    }
    return last;
  }
  function filterPoints(start, end) {
    if (!start)
      return start;
    if (!end)
      end = start;
    var p = start,
        again;
    do {
      again = false;
      if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {
        removeNode(p);
        p = end = p.prev;
        if (p === p.next)
          break;
        again = true;
      } else {
        p = p.next;
      }
    } while (again || p !== end);
    return end;
  }
  function earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) {
    if (!ear)
      return;
    if (!pass && invSize)
      indexCurve(ear, minX, minY, invSize);
    var stop = ear,
        prev,
        next;
    while (ear.prev !== ear.next) {
      prev = ear.prev;
      next = ear.next;
      if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) {
        triangles.push(prev.i / dim);
        triangles.push(ear.i / dim);
        triangles.push(next.i / dim);
        removeNode(ear);
        ear = next.next;
        stop = next.next;
        continue;
      }
      ear = next;
      if (ear === stop) {
        if (!pass) {
          earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1);
        } else if (pass === 1) {
          ear = cureLocalIntersections(ear, triangles, dim);
          earcutLinked(ear, triangles, dim, minX, minY, invSize, 2);
        } else if (pass === 2) {
          splitEarcut(ear, triangles, dim, minX, minY, invSize);
        }
        break;
      }
    }
  }
  function isEar(ear) {
    var a = ear.prev,
        b = ear,
        c = ear.next;
    if (area(a, b, c) >= 0)
      return false;
    var p = ear.next.next;
    while (p !== ear.prev) {
      if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && area(p.prev, p, p.next) >= 0) {
        return false;
      }
      p = p.next;
    }
    return true;
  }
  function isEarHashed(ear, minX, minY, invSize) {
    var a = ear.prev,
        b = ear,
        c = ear.next;
    if (area(a, b, c) >= 0)
      return false;
    var minTX = a.x < b.x ? (a.x < c.x ? a.x : c.x) : (b.x < c.x ? b.x : c.x),
        minTY = a.y < b.y ? (a.y < c.y ? a.y : c.y) : (b.y < c.y ? b.y : c.y),
        maxTX = a.x > b.x ? (a.x > c.x ? a.x : c.x) : (b.x > c.x ? b.x : c.x),
        maxTY = a.y > b.y ? (a.y > c.y ? a.y : c.y) : (b.y > c.y ? b.y : c.y);
    var minZ = zOrder(minTX, minTY, minX, minY, invSize),
        maxZ = zOrder(maxTX, maxTY, minX, minY, invSize);
    var p = ear.nextZ;
    while (p && p.z <= maxZ) {
      if (p !== ear.prev && p !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && area(p.prev, p, p.next) >= 0)
        return false;
      p = p.nextZ;
    }
    p = ear.prevZ;
    while (p && p.z >= minZ) {
      if (p !== ear.prev && p !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && area(p.prev, p, p.next) >= 0)
        return false;
      p = p.prevZ;
    }
    return true;
  }
  function cureLocalIntersections(start, triangles, dim) {
    var p = start;
    do {
      var a = p.prev,
          b = p.next.next;
      if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {
        triangles.push(a.i / dim);
        triangles.push(p.i / dim);
        triangles.push(b.i / dim);
        removeNode(p);
        removeNode(p.next);
        p = start = b;
      }
      p = p.next;
    } while (p !== start);
    return p;
  }
  function splitEarcut(start, triangles, dim, minX, minY, invSize) {
    var a = start;
    do {
      var b = a.next.next;
      while (b !== a.prev) {
        if (a.i !== b.i && isValidDiagonal(a, b)) {
          var c = splitPolygon(a, b);
          a = filterPoints(a, a.next);
          c = filterPoints(c, c.next);
          earcutLinked(a, triangles, dim, minX, minY, invSize);
          earcutLinked(c, triangles, dim, minX, minY, invSize);
          return;
        }
        b = b.next;
      }
      a = a.next;
    } while (a !== start);
  }
  function eliminateHoles(data, holeIndices, outerNode, dim) {
    var queue = [],
        i,
        len,
        start,
        end,
        list;
    for (i = 0, len = holeIndices.length; i < len; i++) {
      start = holeIndices[i] * dim;
      end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;
      list = linkedList(data, start, end, dim, false);
      if (list === list.next)
        list.steiner = true;
      queue.push(getLeftmost(list));
    }
    queue.sort(compareX);
    for (i = 0; i < queue.length; i++) {
      eliminateHole(queue[i], outerNode);
      outerNode = filterPoints(outerNode, outerNode.next);
    }
    return outerNode;
  }
  function compareX(a, b) {
    return a.x - b.x;
  }
  function eliminateHole(hole, outerNode) {
    outerNode = findHoleBridge(hole, outerNode);
    if (outerNode) {
      var b = splitPolygon(outerNode, hole);
      filterPoints(b, b.next);
    }
  }
  function findHoleBridge(hole, outerNode) {
    var p = outerNode,
        hx = hole.x,
        hy = hole.y,
        qx = -Infinity,
        m;
    do {
      if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {
        var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);
        if (x <= hx && x > qx) {
          qx = x;
          if (x === hx) {
            if (hy === p.y)
              return p;
            if (hy === p.next.y)
              return p.next;
          }
          m = p.x < p.next.x ? p : p.next;
        }
      }
      p = p.next;
    } while (p !== outerNode);
    if (!m)
      return null;
    if (hx === qx)
      return m.prev;
    var stop = m,
        mx = m.x,
        my = m.y,
        tanMin = Infinity,
        tan;
    p = m.next;
    while (p !== stop) {
      if (hx >= p.x && p.x >= mx && hx !== p.x && pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {
        tan = Math.abs(hy - p.y) / (hx - p.x);
        if ((tan < tanMin || (tan === tanMin && p.x > m.x)) && locallyInside(p, hole)) {
          m = p;
          tanMin = tan;
        }
      }
      p = p.next;
    }
    return m;
  }
  function indexCurve(start, minX, minY, invSize) {
    var p = start;
    do {
      if (p.z === null)
        p.z = zOrder(p.x, p.y, minX, minY, invSize);
      p.prevZ = p.prev;
      p.nextZ = p.next;
      p = p.next;
    } while (p !== start);
    p.prevZ.nextZ = null;
    p.prevZ = null;
    sortLinked(p);
  }
  function sortLinked(list) {
    var i,
        p,
        q,
        e,
        tail,
        numMerges,
        pSize,
        qSize,
        inSize = 1;
    do {
      p = list;
      list = null;
      tail = null;
      numMerges = 0;
      while (p) {
        numMerges++;
        q = p;
        pSize = 0;
        for (i = 0; i < inSize; i++) {
          pSize++;
          q = q.nextZ;
          if (!q)
            break;
        }
        qSize = inSize;
        while (pSize > 0 || (qSize > 0 && q)) {
          if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {
            e = p;
            p = p.nextZ;
            pSize--;
          } else {
            e = q;
            q = q.nextZ;
            qSize--;
          }
          if (tail)
            tail.nextZ = e;
          else
            list = e;
          e.prevZ = tail;
          tail = e;
        }
        p = q;
      }
      tail.nextZ = null;
      inSize *= 2;
    } while (numMerges > 1);
    return list;
  }
  function zOrder(x, y, minX, minY, invSize) {
    x = 32767 * (x - minX) * invSize;
    y = 32767 * (y - minY) * invSize;
    x = (x | (x << 8)) & 0x00FF00FF;
    x = (x | (x << 4)) & 0x0F0F0F0F;
    x = (x | (x << 2)) & 0x33333333;
    x = (x | (x << 1)) & 0x55555555;
    y = (y | (y << 8)) & 0x00FF00FF;
    y = (y | (y << 4)) & 0x0F0F0F0F;
    y = (y | (y << 2)) & 0x33333333;
    y = (y | (y << 1)) & 0x55555555;
    return x | (y << 1);
  }
  function getLeftmost(start) {
    var p = start,
        leftmost = start;
    do {
      if (p.x < leftmost.x)
        leftmost = p;
      p = p.next;
    } while (p !== start);
    return leftmost;
  }
  function pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {
    return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 && (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 && (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0;
  }
  function isValidDiagonal(a, b) {
    return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b);
  }
  function area(p, q, r) {
    return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);
  }
  function equals(p1, p2) {
    return p1.x === p2.x && p1.y === p2.y;
  }
  function intersects(p1, q1, p2, q2) {
    if ((equals(p1, q1) && equals(p2, q2)) || (equals(p1, q2) && equals(p2, q1)))
      return true;
    return area(p1, q1, p2) > 0 !== area(p1, q1, q2) > 0 && area(p2, q2, p1) > 0 !== area(p2, q2, q1) > 0;
  }
  function intersectsPolygon(a, b) {
    var p = a;
    do {
      if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i && intersects(p, p.next, a, b)) {
        return true;
      }
      p = p.next;
    } while (p !== a);
    return false;
  }
  function locallyInside(a, b) {
    return area(a.prev, a, a.next) < 0 ? area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 : area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;
  }
  function middleInside(a, b) {
    var p = a,
        inside = false,
        px = (a.x + b.x) / 2,
        py = (a.y + b.y) / 2;
    do {
      if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y && (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x)) {
        inside = !inside;
      }
      p = p.next;
    } while (p !== a);
    return inside;
  }
  function splitPolygon(a, b) {
    var a2 = new Node(a.i, a.x, a.y),
        b2 = new Node(b.i, b.x, b.y),
        an = a.next,
        bp = b.prev;
    a.next = b;
    b.prev = a;
    a2.next = an;
    an.prev = a2;
    b2.next = a2;
    a2.prev = b2;
    bp.next = b2;
    b2.prev = bp;
    return b2;
  }
  function insertNode(i, x, y, last) {
    var p = new Node(i, x, y);
    if (!last) {
      p.prev = p;
      p.next = p;
    } else {
      p.next = last.next;
      p.prev = last;
      last.next.prev = p;
      last.next = p;
    }
    return p;
  }
  function removeNode(p) {
    p.next.prev = p.prev;
    p.prev.next = p.next;
    if (p.prevZ)
      p.prevZ.nextZ = p.nextZ;
    if (p.nextZ)
      p.nextZ.prevZ = p.prevZ;
  }
  function Node(i, x, y) {
    this.i = i;
    this.x = x;
    this.y = y;
    this.prev = null;
    this.next = null;
    this.z = null;
    this.prevZ = null;
    this.nextZ = null;
    this.steiner = false;
  }
  function signedArea(data, start, end, dim) {
    var sum = 0;
    for (var i = start,
        j = end - dim; i < end; i += dim) {
      sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);
      j = i;
    }
    return sum;
  }
  var ShapeUtils = {
    area: function(contour) {
      var n = contour.length;
      var a = 0.0;
      for (var p = n - 1,
          q = 0; q < n; p = q++) {
        a += contour[p].x * contour[q].y - contour[q].x * contour[p].y;
      }
      return a * 0.5;
    },
    isClockWise: function(pts) {
      return ShapeUtils.area(pts) < 0;
    },
    triangulateShape: function(contour, holes) {
      var vertices = [];
      var holeIndices = [];
      var faces = [];
      removeDupEndPts(contour);
      addContour(vertices, contour);
      var holeIndex = contour.length;
      holes.forEach(removeDupEndPts);
      for (var i = 0; i < holes.length; i++) {
        holeIndices.push(holeIndex);
        holeIndex += holes[i].length;
        addContour(vertices, holes[i]);
      }
      var triangles = Earcut.triangulate(vertices, holeIndices);
      for (var i = 0; i < triangles.length; i += 3) {
        faces.push(triangles.slice(i, i + 3));
      }
      return faces;
    }
  };
  function removeDupEndPts(points) {
    var l = points.length;
    if (l > 2 && points[l - 1].equals(points[0])) {
      points.pop();
    }
  }
  function addContour(vertices, contour) {
    for (var i = 0; i < contour.length; i++) {
      vertices.push(contour[i].x);
      vertices.push(contour[i].y);
    }
  }
  function ExtrudeGeometry(shapes, options) {
    Geometry.call(this);
    this.type = 'ExtrudeGeometry';
    this.parameters = {
      shapes: shapes,
      options: options
    };
    this.fromBufferGeometry(new ExtrudeBufferGeometry(shapes, options));
    this.mergeVertices();
  }
  ExtrudeGeometry.prototype = Object.create(Geometry.prototype);
  ExtrudeGeometry.prototype.constructor = ExtrudeGeometry;
  ExtrudeGeometry.prototype.toJSON = function() {
    var data = Geometry.prototype.toJSON.call(this);
    var shapes = this.parameters.shapes;
    var options = this.parameters.options;
    return toJSON(shapes, options, data);
  };
  function ExtrudeBufferGeometry(shapes, options) {
    BufferGeometry.call(this);
    this.type = 'ExtrudeBufferGeometry';
    this.parameters = {
      shapes: shapes,
      options: options
    };
    shapes = Array.isArray(shapes) ? shapes : [shapes];
    var scope = this;
    var verticesArray = [];
    var uvArray = [];
    for (var i = 0,
        l = shapes.length; i < l; i++) {
      var shape = shapes[i];
      addShape(shape);
    }
    this.addAttribute('position', new Float32BufferAttribute(verticesArray, 3));
    this.addAttribute('uv', new Float32BufferAttribute(uvArray, 2));
    this.computeVertexNormals();
    function addShape(shape) {
      var placeholder = [];
      var curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;
      var steps = options.steps !== undefined ? options.steps : 1;
      var depth = options.depth !== undefined ? options.depth : 100;
      var bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true;
      var bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6;
      var bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2;
      var bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3;
      var extrudePath = options.extrudePath;
      var uvgen = options.UVGenerator !== undefined ? options.UVGenerator : WorldUVGenerator;
      if (options.amount !== undefined) {
        console.warn('THREE.ExtrudeBufferGeometry: amount has been renamed to depth.');
        depth = options.amount;
      }
      var extrudePts,
          extrudeByPath = false;
      var splineTube,
          binormal,
          normal,
          position2;
      if (extrudePath) {
        extrudePts = extrudePath.getSpacedPoints(steps);
        extrudeByPath = true;
        bevelEnabled = false;
        splineTube = extrudePath.computeFrenetFrames(steps, false);
        binormal = new Vector3();
        normal = new Vector3();
        position2 = new Vector3();
      }
      if (!bevelEnabled) {
        bevelSegments = 0;
        bevelThickness = 0;
        bevelSize = 0;
      }
      var ahole,
          h,
          hl;
      var shapePoints = shape.extractPoints(curveSegments);
      var vertices = shapePoints.shape;
      var holes = shapePoints.holes;
      var reverse = !ShapeUtils.isClockWise(vertices);
      if (reverse) {
        vertices = vertices.reverse();
        for (h = 0, hl = holes.length; h < hl; h++) {
          ahole = holes[h];
          if (ShapeUtils.isClockWise(ahole)) {
            holes[h] = ahole.reverse();
          }
        }
      }
      var faces = ShapeUtils.triangulateShape(vertices, holes);
      var contour = vertices;
      for (h = 0, hl = holes.length; h < hl; h++) {
        ahole = holes[h];
        vertices = vertices.concat(ahole);
      }
      function scalePt2(pt, vec, size) {
        if (!vec)
          console.error("THREE.ExtrudeGeometry: vec does not exist");
        return vec.clone().multiplyScalar(size).add(pt);
      }
      var b,
          bs,
          t,
          z,
          vert,
          vlen = vertices.length,
          face,
          flen = faces.length;
      function getBevelVec(inPt, inPrev, inNext) {
        var v_trans_x,
            v_trans_y,
            shrink_by;
        var v_prev_x = inPt.x - inPrev.x,
            v_prev_y = inPt.y - inPrev.y;
        var v_next_x = inNext.x - inPt.x,
            v_next_y = inNext.y - inPt.y;
        var v_prev_lensq = (v_prev_x * v_prev_x + v_prev_y * v_prev_y);
        var collinear0 = (v_prev_x * v_next_y - v_prev_y * v_next_x);
        if (Math.abs(collinear0) > Number.EPSILON) {
          var v_prev_len = Math.sqrt(v_prev_lensq);
          var v_next_len = Math.sqrt(v_next_x * v_next_x + v_next_y * v_next_y);
          var ptPrevShift_x = (inPrev.x - v_prev_y / v_prev_len);
          var ptPrevShift_y = (inPrev.y + v_prev_x / v_prev_len);
          var ptNextShift_x = (inNext.x - v_next_y / v_next_len);
          var ptNextShift_y = (inNext.y + v_next_x / v_next_len);
          var sf = ((ptNextShift_x - ptPrevShift_x) * v_next_y - (ptNextShift_y - ptPrevShift_y) * v_next_x) / (v_prev_x * v_next_y - v_prev_y * v_next_x);
          v_trans_x = (ptPrevShift_x + v_prev_x * sf - inPt.x);
          v_trans_y = (ptPrevShift_y + v_prev_y * sf - inPt.y);
          var v_trans_lensq = (v_trans_x * v_trans_x + v_trans_y * v_trans_y);
          if (v_trans_lensq <= 2) {
            return new Vector2(v_trans_x, v_trans_y);
          } else {
            shrink_by = Math.sqrt(v_trans_lensq / 2);
          }
        } else {
          var direction_eq = false;
          if (v_prev_x > Number.EPSILON) {
            if (v_next_x > Number.EPSILON) {
              direction_eq = true;
            }
          } else {
            if (v_prev_x < -Number.EPSILON) {
              if (v_next_x < -Number.EPSILON) {
                direction_eq = true;
              }
            } else {
              if (Math.sign(v_prev_y) === Math.sign(v_next_y)) {
                direction_eq = true;
              }
            }
          }
          if (direction_eq) {
            v_trans_x = -v_prev_y;
            v_trans_y = v_prev_x;
            shrink_by = Math.sqrt(v_prev_lensq);
          } else {
            v_trans_x = v_prev_x;
            v_trans_y = v_prev_y;
            shrink_by = Math.sqrt(v_prev_lensq / 2);
          }
        }
        return new Vector2(v_trans_x / shrink_by, v_trans_y / shrink_by);
      }
      var contourMovements = [];
      for (var i = 0,
          il = contour.length,
          j = il - 1,
          k = i + 1; i < il; i++, j++, k++) {
        if (j === il)
          j = 0;
        if (k === il)
          k = 0;
        contourMovements[i] = getBevelVec(contour[i], contour[j], contour[k]);
      }
      var holesMovements = [],
          oneHoleMovements,
          verticesMovements = contourMovements.concat();
      for (h = 0, hl = holes.length; h < hl; h++) {
        ahole = holes[h];
        oneHoleMovements = [];
        for (i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i++, j++, k++) {
          if (j === il)
            j = 0;
          if (k === il)
            k = 0;
          oneHoleMovements[i] = getBevelVec(ahole[i], ahole[j], ahole[k]);
        }
        holesMovements.push(oneHoleMovements);
        verticesMovements = verticesMovements.concat(oneHoleMovements);
      }
      for (b = 0; b < bevelSegments; b++) {
        t = b / bevelSegments;
        z = bevelThickness * Math.cos(t * Math.PI / 2);
        bs = bevelSize * Math.sin(t * Math.PI / 2);
        for (i = 0, il = contour.length; i < il; i++) {
          vert = scalePt2(contour[i], contourMovements[i], bs);
          v(vert.x, vert.y, -z);
        }
        for (h = 0, hl = holes.length; h < hl; h++) {
          ahole = holes[h];
          oneHoleMovements = holesMovements[h];
          for (i = 0, il = ahole.length; i < il; i++) {
            vert = scalePt2(ahole[i], oneHoleMovements[i], bs);
            v(vert.x, vert.y, -z);
          }
        }
      }
      bs = bevelSize;
      for (i = 0; i < vlen; i++) {
        vert = bevelEnabled ? scalePt2(vertices[i], verticesMovements[i], bs) : vertices[i];
        if (!extrudeByPath) {
          v(vert.x, vert.y, 0);
        } else {
          normal.copy(splineTube.normals[0]).multiplyScalar(vert.x);
          binormal.copy(splineTube.binormals[0]).multiplyScalar(vert.y);
          position2.copy(extrudePts[0]).add(normal).add(binormal);
          v(position2.x, position2.y, position2.z);
        }
      }
      var s;
      for (s = 1; s <= steps; s++) {
        for (i = 0; i < vlen; i++) {
          vert = bevelEnabled ? scalePt2(vertices[i], verticesMovements[i], bs) : vertices[i];
          if (!extrudeByPath) {
            v(vert.x, vert.y, depth / steps * s);
          } else {
            normal.copy(splineTube.normals[s]).multiplyScalar(vert.x);
            binormal.copy(splineTube.binormals[s]).multiplyScalar(vert.y);
            position2.copy(extrudePts[s]).add(normal).add(binormal);
            v(position2.x, position2.y, position2.z);
          }
        }
      }
      for (b = bevelSegments - 1; b >= 0; b--) {
        t = b / bevelSegments;
        z = bevelThickness * Math.cos(t * Math.PI / 2);
        bs = bevelSize * Math.sin(t * Math.PI / 2);
        for (i = 0, il = contour.length; i < il; i++) {
          vert = scalePt2(contour[i], contourMovements[i], bs);
          v(vert.x, vert.y, depth + z);
        }
        for (h = 0, hl = holes.length; h < hl; h++) {
          ahole = holes[h];
          oneHoleMovements = holesMovements[h];
          for (i = 0, il = ahole.length; i < il; i++) {
            vert = scalePt2(ahole[i], oneHoleMovements[i], bs);
            if (!extrudeByPath) {
              v(vert.x, vert.y, depth + z);
            } else {
              v(vert.x, vert.y + extrudePts[steps - 1].y, extrudePts[steps - 1].x + z);
            }
          }
        }
      }
      buildLidFaces();
      buildSideFaces();
      function buildLidFaces() {
        var start = verticesArray.length / 3;
        if (bevelEnabled) {
          var layer = 0;
          var offset = vlen * layer;
          for (i = 0; i < flen; i++) {
            face = faces[i];
            f3(face[2] + offset, face[1] + offset, face[0] + offset);
          }
          layer = steps + bevelSegments * 2;
          offset = vlen * layer;
          for (i = 0; i < flen; i++) {
            face = faces[i];
            f3(face[0] + offset, face[1] + offset, face[2] + offset);
          }
        } else {
          for (i = 0; i < flen; i++) {
            face = faces[i];
            f3(face[2], face[1], face[0]);
          }
          for (i = 0; i < flen; i++) {
            face = faces[i];
            f3(face[0] + vlen * steps, face[1] + vlen * steps, face[2] + vlen * steps);
          }
        }
        scope.addGroup(start, verticesArray.length / 3 - start, 0);
      }
      function buildSideFaces() {
        var start = verticesArray.length / 3;
        var layeroffset = 0;
        sidewalls(contour, layeroffset);
        layeroffset += contour.length;
        for (h = 0, hl = holes.length; h < hl; h++) {
          ahole = holes[h];
          sidewalls(ahole, layeroffset);
          layeroffset += ahole.length;
        }
        scope.addGroup(start, verticesArray.length / 3 - start, 1);
      }
      function sidewalls(contour, layeroffset) {
        var j,
            k;
        i = contour.length;
        while (--i >= 0) {
          j = i;
          k = i - 1;
          if (k < 0)
            k = contour.length - 1;
          var s = 0,
              sl = steps + bevelSegments * 2;
          for (s = 0; s < sl; s++) {
            var slen1 = vlen * s;
            var slen2 = vlen * (s + 1);
            var a = layeroffset + j + slen1,
                b = layeroffset + k + slen1,
                c = layeroffset + k + slen2,
                d = layeroffset + j + slen2;
            f4(a, b, c, d);
          }
        }
      }
      function v(x, y, z) {
        placeholder.push(x);
        placeholder.push(y);
        placeholder.push(z);
      }
      function f3(a, b, c) {
        addVertex(a);
        addVertex(b);
        addVertex(c);
        var nextIndex = verticesArray.length / 3;
        var uvs = uvgen.generateTopUV(scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1);
        addUV(uvs[0]);
        addUV(uvs[1]);
        addUV(uvs[2]);
      }
      function f4(a, b, c, d) {
        addVertex(a);
        addVertex(b);
        addVertex(d);
        addVertex(b);
        addVertex(c);
        addVertex(d);
        var nextIndex = verticesArray.length / 3;
        var uvs = uvgen.generateSideWallUV(scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1);
        addUV(uvs[0]);
        addUV(uvs[1]);
        addUV(uvs[3]);
        addUV(uvs[1]);
        addUV(uvs[2]);
        addUV(uvs[3]);
      }
      function addVertex(index) {
        verticesArray.push(placeholder[index * 3 + 0]);
        verticesArray.push(placeholder[index * 3 + 1]);
        verticesArray.push(placeholder[index * 3 + 2]);
      }
      function addUV(vector2) {
        uvArray.push(vector2.x);
        uvArray.push(vector2.y);
      }
    }
  }
  ExtrudeBufferGeometry.prototype = Object.create(BufferGeometry.prototype);
  ExtrudeBufferGeometry.prototype.constructor = ExtrudeBufferGeometry;
  ExtrudeBufferGeometry.prototype.toJSON = function() {
    var data = BufferGeometry.prototype.toJSON.call(this);
    var shapes = this.parameters.shapes;
    var options = this.parameters.options;
    return toJSON(shapes, options, data);
  };
  var WorldUVGenerator = {
    generateTopUV: function(geometry, vertices, indexA, indexB, indexC) {
      var a_x = vertices[indexA * 3];
      var a_y = vertices[indexA * 3 + 1];
      var b_x = vertices[indexB * 3];
      var b_y = vertices[indexB * 3 + 1];
      var c_x = vertices[indexC * 3];
      var c_y = vertices[indexC * 3 + 1];
      return [new Vector2(a_x, a_y), new Vector2(b_x, b_y), new Vector2(c_x, c_y)];
    },
    generateSideWallUV: function(geometry, vertices, indexA, indexB, indexC, indexD) {
      var a_x = vertices[indexA * 3];
      var a_y = vertices[indexA * 3 + 1];
      var a_z = vertices[indexA * 3 + 2];
      var b_x = vertices[indexB * 3];
      var b_y = vertices[indexB * 3 + 1];
      var b_z = vertices[indexB * 3 + 2];
      var c_x = vertices[indexC * 3];
      var c_y = vertices[indexC * 3 + 1];
      var c_z = vertices[indexC * 3 + 2];
      var d_x = vertices[indexD * 3];
      var d_y = vertices[indexD * 3 + 1];
      var d_z = vertices[indexD * 3 + 2];
      if (Math.abs(a_y - b_y) < 0.01) {
        return [new Vector2(a_x, 1 - a_z), new Vector2(b_x, 1 - b_z), new Vector2(c_x, 1 - c_z), new Vector2(d_x, 1 - d_z)];
      } else {
        return [new Vector2(a_y, 1 - a_z), new Vector2(b_y, 1 - b_z), new Vector2(c_y, 1 - c_z), new Vector2(d_y, 1 - d_z)];
      }
    }
  };
  function toJSON(shapes, options, data) {
    data.shapes = [];
    if (Array.isArray(shapes)) {
      for (var i = 0,
          l = shapes.length; i < l; i++) {
        var shape = shapes[i];
        data.shapes.push(shape.uuid);
      }
    } else {
      data.shapes.push(shapes.uuid);
    }
    if (options.extrudePath !== undefined)
      data.options.extrudePath = options.extrudePath.toJSON();
    return data;
  }
  function TextGeometry(text, parameters) {
    Geometry.call(this);
    this.type = 'TextGeometry';
    this.parameters = {
      text: text,
      parameters: parameters
    };
    this.fromBufferGeometry(new TextBufferGeometry(text, parameters));
    this.mergeVertices();
  }
  TextGeometry.prototype = Object.create(Geometry.prototype);
  TextGeometry.prototype.constructor = TextGeometry;
  function TextBufferGeometry(text, parameters) {
    parameters = parameters || {};
    var font = parameters.font;
    if (!(font && font.isFont)) {
      console.error('THREE.TextGeometry: font parameter is not an instance of THREE.Font.');
      return new Geometry();
    }
    var shapes = font.generateShapes(text, parameters.size);
    parameters.depth = parameters.height !== undefined ? parameters.height : 50;
    if (parameters.bevelThickness === undefined)
      parameters.bevelThickness = 10;
    if (parameters.bevelSize === undefined)
      parameters.bevelSize = 8;
    if (parameters.bevelEnabled === undefined)
      parameters.bevelEnabled = false;
    ExtrudeBufferGeometry.call(this, shapes, parameters);
    this.type = 'TextBufferGeometry';
  }
  TextBufferGeometry.prototype = Object.create(ExtrudeBufferGeometry.prototype);
  TextBufferGeometry.prototype.constructor = TextBufferGeometry;
  function SphereGeometry(radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength) {
    Geometry.call(this);
    this.type = 'SphereGeometry';
    this.parameters = {
      radius: radius,
      widthSegments: widthSegments,
      heightSegments: heightSegments,
      phiStart: phiStart,
      phiLength: phiLength,
      thetaStart: thetaStart,
      thetaLength: thetaLength
    };
    this.fromBufferGeometry(new SphereBufferGeometry(radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength));
    this.mergeVertices();
  }
  SphereGeometry.prototype = Object.create(Geometry.prototype);
  SphereGeometry.prototype.constructor = SphereGeometry;
  function SphereBufferGeometry(radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength) {
    BufferGeometry.call(this);
    this.type = 'SphereBufferGeometry';
    this.parameters = {
      radius: radius,
      widthSegments: widthSegments,
      heightSegments: heightSegments,
      phiStart: phiStart,
      phiLength: phiLength,
      thetaStart: thetaStart,
      thetaLength: thetaLength
    };
    radius = radius || 1;
    widthSegments = Math.max(3, Math.floor(widthSegments) || 8);
    heightSegments = Math.max(2, Math.floor(heightSegments) || 6);
    phiStart = phiStart !== undefined ? phiStart : 0;
    phiLength = phiLength !== undefined ? phiLength : Math.PI * 2;
    thetaStart = thetaStart !== undefined ? thetaStart : 0;
    thetaLength = thetaLength !== undefined ? thetaLength : Math.PI;
    var thetaEnd = thetaStart + thetaLength;
    var ix,
        iy;
    var index = 0;
    var grid = [];
    var vertex = new Vector3();
    var normal = new Vector3();
    var indices = [];
    var vertices = [];
    var normals = [];
    var uvs = [];
    for (iy = 0; iy <= heightSegments; iy++) {
      var verticesRow = [];
      var v = iy / heightSegments;
      for (ix = 0; ix <= widthSegments; ix++) {
        var u = ix / widthSegments;
        vertex.x = -radius * Math.cos(phiStart + u * phiLength) * Math.sin(thetaStart + v * thetaLength);
        vertex.y = radius * Math.cos(thetaStart + v * thetaLength);
        vertex.z = radius * Math.sin(phiStart + u * phiLength) * Math.sin(thetaStart + v * thetaLength);
        vertices.push(vertex.x, vertex.y, vertex.z);
        normal.set(vertex.x, vertex.y, vertex.z).normalize();
        normals.push(normal.x, normal.y, normal.z);
        uvs.push(u, 1 - v);
        verticesRow.push(index++);
      }
      grid.push(verticesRow);
    }
    for (iy = 0; iy < heightSegments; iy++) {
      for (ix = 0; ix < widthSegments; ix++) {
        var a = grid[iy][ix + 1];
        var b = grid[iy][ix];
        var c = grid[iy + 1][ix];
        var d = grid[iy + 1][ix + 1];
        if (iy !== 0 || thetaStart > 0)
          indices.push(a, b, d);
        if (iy !== heightSegments - 1 || thetaEnd < Math.PI)
          indices.push(b, c, d);
      }
    }
    this.setIndex(indices);
    this.addAttribute('position', new Float32BufferAttribute(vertices, 3));
    this.addAttribute('normal', new Float32BufferAttribute(normals, 3));
    this.addAttribute('uv', new Float32BufferAttribute(uvs, 2));
  }
  SphereBufferGeometry.prototype = Object.create(BufferGeometry.prototype);
  SphereBufferGeometry.prototype.constructor = SphereBufferGeometry;
  function RingGeometry(innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength) {
    Geometry.call(this);
    this.type = 'RingGeometry';
    this.parameters = {
      innerRadius: innerRadius,
      outerRadius: outerRadius,
      thetaSegments: thetaSegments,
      phiSegments: phiSegments,
      thetaStart: thetaStart,
      thetaLength: thetaLength
    };
    this.fromBufferGeometry(new RingBufferGeometry(innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength));
    this.mergeVertices();
  }
  RingGeometry.prototype = Object.create(Geometry.prototype);
  RingGeometry.prototype.constructor = RingGeometry;
  function RingBufferGeometry(innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength) {
    BufferGeometry.call(this);
    this.type = 'RingBufferGeometry';
    this.parameters = {
      innerRadius: innerRadius,
      outerRadius: outerRadius,
      thetaSegments: thetaSegments,
      phiSegments: phiSegments,
      thetaStart: thetaStart,
      thetaLength: thetaLength
    };
    innerRadius = innerRadius || 0.5;
    outerRadius = outerRadius || 1;
    thetaStart = thetaStart !== undefined ? thetaStart : 0;
    thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;
    thetaSegments = thetaSegments !== undefined ? Math.max(3, thetaSegments) : 8;
    phiSegments = phiSegments !== undefined ? Math.max(1, phiSegments) : 1;
    var indices = [];
    var vertices = [];
    var normals = [];
    var uvs = [];
    var segment;
    var radius = innerRadius;
    var radiusStep = ((outerRadius - innerRadius) / phiSegments);
    var vertex = new Vector3();
    var uv = new Vector2();
    var j,
        i;
    for (j = 0; j <= phiSegments; j++) {
      for (i = 0; i <= thetaSegments; i++) {
        segment = thetaStart + i / thetaSegments * thetaLength;
        vertex.x = radius * Math.cos(segment);
        vertex.y = radius * Math.sin(segment);
        vertices.push(vertex.x, vertex.y, vertex.z);
        normals.push(0, 0, 1);
        uv.x = (vertex.x / outerRadius + 1) / 2;
        uv.y = (vertex.y / outerRadius + 1) / 2;
        uvs.push(uv.x, uv.y);
      }
      radius += radiusStep;
    }
    for (j = 0; j < phiSegments; j++) {
      var thetaSegmentLevel = j * (thetaSegments + 1);
      for (i = 0; i < thetaSegments; i++) {
        segment = i + thetaSegmentLevel;
        var a = segment;
        var b = segment + thetaSegments + 1;
        var c = segment + thetaSegments + 2;
        var d = segment + 1;
        indices.push(a, b, d);
        indices.push(b, c, d);
      }
    }
    this.setIndex(indices);
    this.addAttribute('position', new Float32BufferAttribute(vertices, 3));
    this.addAttribute('normal', new Float32BufferAttribute(normals, 3));
    this.addAttribute('uv', new Float32BufferAttribute(uvs, 2));
  }
  RingBufferGeometry.prototype = Object.create(BufferGeometry.prototype);
  RingBufferGeometry.prototype.constructor = RingBufferGeometry;
  function LatheGeometry(points, segments, phiStart, phiLength) {
    Geometry.call(this);
    this.type = 'LatheGeometry';
    this.parameters = {
      points: points,
      segments: segments,
      phiStart: phiStart,
      phiLength: phiLength
    };
    this.fromBufferGeometry(new LatheBufferGeometry(points, segments, phiStart, phiLength));
    this.mergeVertices();
  }
  LatheGeometry.prototype = Object.create(Geometry.prototype);
  LatheGeometry.prototype.constructor = LatheGeometry;
  function LatheBufferGeometry(points, segments, phiStart, phiLength) {
    BufferGeometry.call(this);
    this.type = 'LatheBufferGeometry';
    this.parameters = {
      points: points,
      segments: segments,
      phiStart: phiStart,
      phiLength: phiLength
    };
    segments = Math.floor(segments) || 12;
    phiStart = phiStart || 0;
    phiLength = phiLength || Math.PI * 2;
    phiLength = _Math.clamp(phiLength, 0, Math.PI * 2);
    var indices = [];
    var vertices = [];
    var uvs = [];
    var base;
    var inverseSegments = 1.0 / segments;
    var vertex = new Vector3();
    var uv = new Vector2();
    var i,
        j;
    for (i = 0; i <= segments; i++) {
      var phi = phiStart + i * inverseSegments * phiLength;
      var sin = Math.sin(phi);
      var cos = Math.cos(phi);
      for (j = 0; j <= (points.length - 1); j++) {
        vertex.x = points[j].x * sin;
        vertex.y = points[j].y;
        vertex.z = points[j].x * cos;
        vertices.push(vertex.x, vertex.y, vertex.z);
        uv.x = i / segments;
        uv.y = j / (points.length - 1);
        uvs.push(uv.x, uv.y);
      }
    }
    for (i = 0; i < segments; i++) {
      for (j = 0; j < (points.length - 1); j++) {
        base = j + i * points.length;
        var a = base;
        var b = base + points.length;
        var c = base + points.length + 1;
        var d = base + 1;
        indices.push(a, b, d);
        indices.push(b, c, d);
      }
    }
    this.setIndex(indices);
    this.addAttribute('position', new Float32BufferAttribute(vertices, 3));
    this.addAttribute('uv', new Float32BufferAttribute(uvs, 2));
    this.computeVertexNormals();
    if (phiLength === Math.PI * 2) {
      var normals = this.attributes.normal.array;
      var n1 = new Vector3();
      var n2 = new Vector3();
      var n = new Vector3();
      base = segments * points.length * 3;
      for (i = 0, j = 0; i < points.length; i++, j += 3) {
        n1.x = normals[j + 0];
        n1.y = normals[j + 1];
        n1.z = normals[j + 2];
        n2.x = normals[base + j + 0];
        n2.y = normals[base + j + 1];
        n2.z = normals[base + j + 2];
        n.addVectors(n1, n2).normalize();
        normals[j + 0] = normals[base + j + 0] = n.x;
        normals[j + 1] = normals[base + j + 1] = n.y;
        normals[j + 2] = normals[base + j + 2] = n.z;
      }
    }
  }
  LatheBufferGeometry.prototype = Object.create(BufferGeometry.prototype);
  LatheBufferGeometry.prototype.constructor = LatheBufferGeometry;
  function ShapeGeometry(shapes, curveSegments) {
    Geometry.call(this);
    this.type = 'ShapeGeometry';
    if (typeof curveSegments === 'object') {
      console.warn('THREE.ShapeGeometry: Options parameter has been removed.');
      curveSegments = curveSegments.curveSegments;
    }
    this.parameters = {
      shapes: shapes,
      curveSegments: curveSegments
    };
    this.fromBufferGeometry(new ShapeBufferGeometry(shapes, curveSegments));
    this.mergeVertices();
  }
  ShapeGeometry.prototype = Object.create(Geometry.prototype);
  ShapeGeometry.prototype.constructor = ShapeGeometry;
  ShapeGeometry.prototype.toJSON = function() {
    var data = Geometry.prototype.toJSON.call(this);
    var shapes = this.parameters.shapes;
    return toJSON$1(shapes, data);
  };
  function ShapeBufferGeometry(shapes, curveSegments) {
    BufferGeometry.call(this);
    this.type = 'ShapeBufferGeometry';
    this.parameters = {
      shapes: shapes,
      curveSegments: curveSegments
    };
    curveSegments = curveSegments || 12;
    var indices = [];
    var vertices = [];
    var normals = [];
    var uvs = [];
    var groupStart = 0;
    var groupCount = 0;
    if (Array.isArray(shapes) === false) {
      addShape(shapes);
    } else {
      for (var i = 0; i < shapes.length; i++) {
        addShape(shapes[i]);
        this.addGroup(groupStart, groupCount, i);
        groupStart += groupCount;
        groupCount = 0;
      }
    }
    this.setIndex(indices);
    this.addAttribute('position', new Float32BufferAttribute(vertices, 3));
    this.addAttribute('normal', new Float32BufferAttribute(normals, 3));
    this.addAttribute('uv', new Float32BufferAttribute(uvs, 2));
    function addShape(shape) {
      var i,
          l,
          shapeHole;
      var indexOffset = vertices.length / 3;
      var points = shape.extractPoints(curveSegments);
      var shapeVertices = points.shape;
      var shapeHoles = points.holes;
      if (ShapeUtils.isClockWise(shapeVertices) === false) {
        shapeVertices = shapeVertices.reverse();
      }
      for (i = 0, l = shapeHoles.length; i < l; i++) {
        shapeHole = shapeHoles[i];
        if (ShapeUtils.isClockWise(shapeHole) === true) {
          shapeHoles[i] = shapeHole.reverse();
        }
      }
      var faces = ShapeUtils.triangulateShape(shapeVertices, shapeHoles);
      for (i = 0, l = shapeHoles.length; i < l; i++) {
        shapeHole = shapeHoles[i];
        shapeVertices = shapeVertices.concat(shapeHole);
      }
      for (i = 0, l = shapeVertices.length; i < l; i++) {
        var vertex = shapeVertices[i];
        vertices.push(vertex.x, vertex.y, 0);
        normals.push(0, 0, 1);
        uvs.push(vertex.x, vertex.y);
      }
      for (i = 0, l = faces.length; i < l; i++) {
        var face = faces[i];
        var a = face[0] + indexOffset;
        var b = face[1] + indexOffset;
        var c = face[2] + indexOffset;
        indices.push(a, b, c);
        groupCount += 3;
      }
    }
  }
  ShapeBufferGeometry.prototype = Object.create(BufferGeometry.prototype);
  ShapeBufferGeometry.prototype.constructor = ShapeBufferGeometry;
  ShapeBufferGeometry.prototype.toJSON = function() {
    var data = BufferGeometry.prototype.toJSON.call(this);
    var shapes = this.parameters.shapes;
    return toJSON$1(shapes, data);
  };
  function toJSON$1(shapes, data) {
    data.shapes = [];
    if (Array.isArray(shapes)) {
      for (var i = 0,
          l = shapes.length; i < l; i++) {
        var shape = shapes[i];
        data.shapes.push(shape.uuid);
      }
    } else {
      data.shapes.push(shapes.uuid);
    }
    return data;
  }
  function EdgesGeometry(geometry, thresholdAngle) {
    BufferGeometry.call(this);
    this.type = 'EdgesGeometry';
    this.parameters = {thresholdAngle: thresholdAngle};
    thresholdAngle = (thresholdAngle !== undefined) ? thresholdAngle : 1;
    var vertices = [];
    var thresholdDot = Math.cos(_Math.DEG2RAD * thresholdAngle);
    var edge = [0, 0],
        edges = {},
        edge1,
        edge2;
    var key,
        keys = ['a', 'b', 'c'];
    var geometry2;
    if (geometry.isBufferGeometry) {
      geometry2 = new Geometry();
      geometry2.fromBufferGeometry(geometry);
    } else {
      geometry2 = geometry.clone();
    }
    geometry2.mergeVertices();
    geometry2.computeFaceNormals();
    var sourceVertices = geometry2.vertices;
    var faces = geometry2.faces;
    for (var i = 0,
        l = faces.length; i < l; i++) {
      var face = faces[i];
      for (var j = 0; j < 3; j++) {
        edge1 = face[keys[j]];
        edge2 = face[keys[(j + 1) % 3]];
        edge[0] = Math.min(edge1, edge2);
        edge[1] = Math.max(edge1, edge2);
        key = edge[0] + ',' + edge[1];
        if (edges[key] === undefined) {
          edges[key] = {
            index1: edge[0],
            index2: edge[1],
            face1: i,
            face2: undefined
          };
        } else {
          edges[key].face2 = i;
        }
      }
    }
    for (key in edges) {
      var e = edges[key];
      if (e.face2 === undefined || faces[e.face1].normal.dot(faces[e.face2].normal) <= thresholdDot) {
        var vertex = sourceVertices[e.index1];
        vertices.push(vertex.x, vertex.y, vertex.z);
        vertex = sourceVertices[e.index2];
        vertices.push(vertex.x, vertex.y, vertex.z);
      }
    }
    this.addAttribute('position', new Float32BufferAttribute(vertices, 3));
  }
  EdgesGeometry.prototype = Object.create(BufferGeometry.prototype);
  EdgesGeometry.prototype.constructor = EdgesGeometry;
  function CylinderGeometry(radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength) {
    Geometry.call(this);
    this.type = 'CylinderGeometry';
    this.parameters = {
      radiusTop: radiusTop,
      radiusBottom: radiusBottom,
      height: height,
      radialSegments: radialSegments,
      heightSegments: heightSegments,
      openEnded: openEnded,
      thetaStart: thetaStart,
      thetaLength: thetaLength
    };
    this.fromBufferGeometry(new CylinderBufferGeometry(radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength));
    this.mergeVertices();
  }
  CylinderGeometry.prototype = Object.create(Geometry.prototype);
  CylinderGeometry.prototype.constructor = CylinderGeometry;
  function CylinderBufferGeometry(radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength) {
    BufferGeometry.call(this);
    this.type = 'CylinderBufferGeometry';
    this.parameters = {
      radiusTop: radiusTop,
      radiusBottom: radiusBottom,
      height: height,
      radialSegments: radialSegments,
      heightSegments: heightSegments,
      openEnded: openEnded,
      thetaStart: thetaStart,
      thetaLength: thetaLength
    };
    var scope = this;
    radiusTop = radiusTop !== undefined ? radiusTop : 1;
    radiusBottom = radiusBottom !== undefined ? radiusBottom : 1;
    height = height || 1;
    radialSegments = Math.floor(radialSegments) || 8;
    heightSegments = Math.floor(heightSegments) || 1;
    openEnded = openEnded !== undefined ? openEnded : false;
    thetaStart = thetaStart !== undefined ? thetaStart : 0.0;
    thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;
    var indices = [];
    var vertices = [];
    var normals = [];
    var uvs = [];
    var index = 0;
    var indexArray = [];
    var halfHeight = height / 2;
    var groupStart = 0;
    generateTorso();
    if (openEnded === false) {
      if (radiusTop > 0)
        generateCap(true);
      if (radiusBottom > 0)
        generateCap(false);
    }
    this.setIndex(indices);
    this.addAttribute('position', new Float32BufferAttribute(vertices, 3));
    this.addAttribute('normal', new Float32BufferAttribute(normals, 3));
    this.addAttribute('uv', new Float32BufferAttribute(uvs, 2));
    function generateTorso() {
      var x,
          y;
      var normal = new Vector3();
      var vertex = new Vector3();
      var groupCount = 0;
      var slope = (radiusBottom - radiusTop) / height;
      for (y = 0; y <= heightSegments; y++) {
        var indexRow = [];
        var v = y / heightSegments;
        var radius = v * (radiusBottom - radiusTop) + radiusTop;
        for (x = 0; x <= radialSegments; x++) {
          var u = x / radialSegments;
          var theta = u * thetaLength + thetaStart;
          var sinTheta = Math.sin(theta);
          var cosTheta = Math.cos(theta);
          vertex.x = radius * sinTheta;
          vertex.y = -v * height + halfHeight;
          vertex.z = radius * cosTheta;
          vertices.push(vertex.x, vertex.y, vertex.z);
          normal.set(sinTheta, slope, cosTheta).normalize();
          normals.push(normal.x, normal.y, normal.z);
          uvs.push(u, 1 - v);
          indexRow.push(index++);
        }
        indexArray.push(indexRow);
      }
      for (x = 0; x < radialSegments; x++) {
        for (y = 0; y < heightSegments; y++) {
          var a = indexArray[y][x];
          var b = indexArray[y + 1][x];
          var c = indexArray[y + 1][x + 1];
          var d = indexArray[y][x + 1];
          indices.push(a, b, d);
          indices.push(b, c, d);
          groupCount += 6;
        }
      }
      scope.addGroup(groupStart, groupCount, 0);
      groupStart += groupCount;
    }
    function generateCap(top) {
      var x,
          centerIndexStart,
          centerIndexEnd;
      var uv = new Vector2();
      var vertex = new Vector3();
      var groupCount = 0;
      var radius = (top === true) ? radiusTop : radiusBottom;
      var sign = (top === true) ? 1 : -1;
      centerIndexStart = index;
      for (x = 1; x <= radialSegments; x++) {
        vertices.push(0, halfHeight * sign, 0);
        normals.push(0, sign, 0);
        uvs.push(0.5, 0.5);
        index++;
      }
      centerIndexEnd = index;
      for (x = 0; x <= radialSegments; x++) {
        var u = x / radialSegments;
        var theta = u * thetaLength + thetaStart;
        var cosTheta = Math.cos(theta);
        var sinTheta = Math.sin(theta);
        vertex.x = radius * sinTheta;
        vertex.y = halfHeight * sign;
        vertex.z = radius * cosTheta;
        vertices.push(vertex.x, vertex.y, vertex.z);
        normals.push(0, sign, 0);
        uv.x = (cosTheta * 0.5) + 0.5;
        uv.y = (sinTheta * 0.5 * sign) + 0.5;
        uvs.push(uv.x, uv.y);
        index++;
      }
      for (x = 0; x < radialSegments; x++) {
        var c = centerIndexStart + x;
        var i = centerIndexEnd + x;
        if (top === true) {
          indices.push(i, i + 1, c);
        } else {
          indices.push(i + 1, i, c);
        }
        groupCount += 3;
      }
      scope.addGroup(groupStart, groupCount, top === true ? 1 : 2);
      groupStart += groupCount;
    }
  }
  CylinderBufferGeometry.prototype = Object.create(BufferGeometry.prototype);
  CylinderBufferGeometry.prototype.constructor = CylinderBufferGeometry;
  function ConeGeometry(radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength) {
    CylinderGeometry.call(this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength);
    this.type = 'ConeGeometry';
    this.parameters = {
      radius: radius,
      height: height,
      radialSegments: radialSegments,
      heightSegments: heightSegments,
      openEnded: openEnded,
      thetaStart: thetaStart,
      thetaLength: thetaLength
    };
  }
  ConeGeometry.prototype = Object.create(CylinderGeometry.prototype);
  ConeGeometry.prototype.constructor = ConeGeometry;
  function ConeBufferGeometry(radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength) {
    CylinderBufferGeometry.call(this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength);
    this.type = 'ConeBufferGeometry';
    this.parameters = {
      radius: radius,
      height: height,
      radialSegments: radialSegments,
      heightSegments: heightSegments,
      openEnded: openEnded,
      thetaStart: thetaStart,
      thetaLength: thetaLength
    };
  }
  ConeBufferGeometry.prototype = Object.create(CylinderBufferGeometry.prototype);
  ConeBufferGeometry.prototype.constructor = ConeBufferGeometry;
  function CircleGeometry(radius, segments, thetaStart, thetaLength) {
    Geometry.call(this);
    this.type = 'CircleGeometry';
    this.parameters = {
      radius: radius,
      segments: segments,
      thetaStart: thetaStart,
      thetaLength: thetaLength
    };
    this.fromBufferGeometry(new CircleBufferGeometry(radius, segments, thetaStart, thetaLength));
    this.mergeVertices();
  }
  CircleGeometry.prototype = Object.create(Geometry.prototype);
  CircleGeometry.prototype.constructor = CircleGeometry;
  function CircleBufferGeometry(radius, segments, thetaStart, thetaLength) {
    BufferGeometry.call(this);
    this.type = 'CircleBufferGeometry';
    this.parameters = {
      radius: radius,
      segments: segments,
      thetaStart: thetaStart,
      thetaLength: thetaLength
    };
    radius = radius || 1;
    segments = segments !== undefined ? Math.max(3, segments) : 8;
    thetaStart = thetaStart !== undefined ? thetaStart : 0;
    thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;
    var indices = [];
    var vertices = [];
    var normals = [];
    var uvs = [];
    var i,
        s;
    var vertex = new Vector3();
    var uv = new Vector2();
    vertices.push(0, 0, 0);
    normals.push(0, 0, 1);
    uvs.push(0.5, 0.5);
    for (s = 0, i = 3; s <= segments; s++, i += 3) {
      var segment = thetaStart + s / segments * thetaLength;
      vertex.x = radius * Math.cos(segment);
      vertex.y = radius * Math.sin(segment);
      vertices.push(vertex.x, vertex.y, vertex.z);
      normals.push(0, 0, 1);
      uv.x = (vertices[i] / radius + 1) / 2;
      uv.y = (vertices[i + 1] / radius + 1) / 2;
      uvs.push(uv.x, uv.y);
    }
    for (i = 1; i <= segments; i++) {
      indices.push(i, i + 1, 0);
    }
    this.setIndex(indices);
    this.addAttribute('position', new Float32BufferAttribute(vertices, 3));
    this.addAttribute('normal', new Float32BufferAttribute(normals, 3));
    this.addAttribute('uv', new Float32BufferAttribute(uvs, 2));
  }
  CircleBufferGeometry.prototype = Object.create(BufferGeometry.prototype);
  CircleBufferGeometry.prototype.constructor = CircleBufferGeometry;
  var Geometries = Object.freeze({
    WireframeGeometry: WireframeGeometry,
    ParametricGeometry: ParametricGeometry,
    ParametricBufferGeometry: ParametricBufferGeometry,
    TetrahedronGeometry: TetrahedronGeometry,
    TetrahedronBufferGeometry: TetrahedronBufferGeometry,
    OctahedronGeometry: OctahedronGeometry,
    OctahedronBufferGeometry: OctahedronBufferGeometry,
    IcosahedronGeometry: IcosahedronGeometry,
    IcosahedronBufferGeometry: IcosahedronBufferGeometry,
    DodecahedronGeometry: DodecahedronGeometry,
    DodecahedronBufferGeometry: DodecahedronBufferGeometry,
    PolyhedronGeometry: PolyhedronGeometry,
    PolyhedronBufferGeometry: PolyhedronBufferGeometry,
    TubeGeometry: TubeGeometry,
    TubeBufferGeometry: TubeBufferGeometry,
    TorusKnotGeometry: TorusKnotGeometry,
    TorusKnotBufferGeometry: TorusKnotBufferGeometry,
    TorusGeometry: TorusGeometry,
    TorusBufferGeometry: TorusBufferGeometry,
    TextGeometry: TextGeometry,
    TextBufferGeometry: TextBufferGeometry,
    SphereGeometry: SphereGeometry,
    SphereBufferGeometry: SphereBufferGeometry,
    RingGeometry: RingGeometry,
    RingBufferGeometry: RingBufferGeometry,
    PlaneGeometry: PlaneGeometry,
    PlaneBufferGeometry: PlaneBufferGeometry,
    LatheGeometry: LatheGeometry,
    LatheBufferGeometry: LatheBufferGeometry,
    ShapeGeometry: ShapeGeometry,
    ShapeBufferGeometry: ShapeBufferGeometry,
    ExtrudeGeometry: ExtrudeGeometry,
    ExtrudeBufferGeometry: ExtrudeBufferGeometry,
    EdgesGeometry: EdgesGeometry,
    ConeGeometry: ConeGeometry,
    ConeBufferGeometry: ConeBufferGeometry,
    CylinderGeometry: CylinderGeometry,
    CylinderBufferGeometry: CylinderBufferGeometry,
    CircleGeometry: CircleGeometry,
    CircleBufferGeometry: CircleBufferGeometry,
    BoxGeometry: BoxGeometry,
    BoxBufferGeometry: BoxBufferGeometry
  });
  function ShadowMaterial(parameters) {
    Material.call(this);
    this.type = 'ShadowMaterial';
    this.color = new Color(0x000000);
    this.transparent = true;
    this.setValues(parameters);
  }
  ShadowMaterial.prototype = Object.create(Material.prototype);
  ShadowMaterial.prototype.constructor = ShadowMaterial;
  ShadowMaterial.prototype.isShadowMaterial = true;
  ShadowMaterial.prototype.copy = function(source) {
    Material.prototype.copy.call(this, source);
    this.color.copy(source.color);
    return this;
  };
  function RawShaderMaterial(parameters) {
    ShaderMaterial.call(this, parameters);
    this.type = 'RawShaderMaterial';
  }
  RawShaderMaterial.prototype = Object.create(ShaderMaterial.prototype);
  RawShaderMaterial.prototype.constructor = RawShaderMaterial;
  RawShaderMaterial.prototype.isRawShaderMaterial = true;
  function MeshStandardMaterial(parameters) {
    Material.call(this);
    this.defines = {'STANDARD': ''};
    this.type = 'MeshStandardMaterial';
    this.color = new Color(0xffffff);
    this.roughness = 0.5;
    this.metalness = 0.5;
    this.map = null;
    this.lightMap = null;
    this.lightMapIntensity = 1.0;
    this.aoMap = null;
    this.aoMapIntensity = 1.0;
    this.emissive = new Color(0x000000);
    this.emissiveIntensity = 1.0;
    this.emissiveMap = null;
    this.bumpMap = null;
    this.bumpScale = 1;
    this.normalMap = null;
    this.normalMapType = TangentSpaceNormalMap;
    this.normalScale = new Vector2(1, 1);
    this.displacementMap = null;
    this.displacementScale = 1;
    this.displacementBias = 0;
    this.roughnessMap = null;
    this.metalnessMap = null;
    this.alphaMap = null;
    this.envMap = null;
    this.envMapIntensity = 1.0;
    this.refractionRatio = 0.98;
    this.wireframe = false;
    this.wireframeLinewidth = 1;
    this.wireframeLinecap = 'round';
    this.wireframeLinejoin = 'round';
    this.skinning = false;
    this.morphTargets = false;
    this.morphNormals = false;
    this.setValues(parameters);
  }
  MeshStandardMaterial.prototype = Object.create(Material.prototype);
  MeshStandardMaterial.prototype.constructor = MeshStandardMaterial;
  MeshStandardMaterial.prototype.isMeshStandardMaterial = true;
  MeshStandardMaterial.prototype.copy = function(source) {
    Material.prototype.copy.call(this, source);
    this.defines = {'STANDARD': ''};
    this.color.copy(source.color);
    this.roughness = source.roughness;
    this.metalness = source.metalness;
    this.map = source.map;
    this.lightMap = source.lightMap;
    this.lightMapIntensity = source.lightMapIntensity;
    this.aoMap = source.aoMap;
    this.aoMapIntensity = source.aoMapIntensity;
    this.emissive.copy(source.emissive);
    this.emissiveMap = source.emissiveMap;
    this.emissiveIntensity = source.emissiveIntensity;
    this.bumpMap = source.bumpMap;
    this.bumpScale = source.bumpScale;
    this.normalMap = source.normalMap;
    this.normalMapType = source.normalMapType;
    this.normalScale.copy(source.normalScale);
    this.displacementMap = source.displacementMap;
    this.displacementScale = source.displacementScale;
    this.displacementBias = source.displacementBias;
    this.roughnessMap = source.roughnessMap;
    this.metalnessMap = source.metalnessMap;
    this.alphaMap = source.alphaMap;
    this.envMap = source.envMap;
    this.envMapIntensity = source.envMapIntensity;
    this.refractionRatio = source.refractionRatio;
    this.wireframe = source.wireframe;
    this.wireframeLinewidth = source.wireframeLinewidth;
    this.wireframeLinecap = source.wireframeLinecap;
    this.wireframeLinejoin = source.wireframeLinejoin;
    this.skinning = source.skinning;
    this.morphTargets = source.morphTargets;
    this.morphNormals = source.morphNormals;
    return this;
  };
  function MeshPhysicalMaterial(parameters) {
    MeshStandardMaterial.call(this);
    this.defines = {'PHYSICAL': ''};
    this.type = 'MeshPhysicalMaterial';
    this.reflectivity = 0.5;
    this.clearCoat = 0.0;
    this.clearCoatRoughness = 0.0;
    this.setValues(parameters);
  }
  MeshPhysicalMaterial.prototype = Object.create(MeshStandardMaterial.prototype);
  MeshPhysicalMaterial.prototype.constructor = MeshPhysicalMaterial;
  MeshPhysicalMaterial.prototype.isMeshPhysicalMaterial = true;
  MeshPhysicalMaterial.prototype.copy = function(source) {
    MeshStandardMaterial.prototype.copy.call(this, source);
    this.defines = {'PHYSICAL': ''};
    this.reflectivity = source.reflectivity;
    this.clearCoat = source.clearCoat;
    this.clearCoatRoughness = source.clearCoatRoughness;
    return this;
  };
  function MeshPhongMaterial(parameters) {
    Material.call(this);
    this.type = 'MeshPhongMaterial';
    this.color = new Color(0xffffff);
    this.specular = new Color(0x111111);
    this.shininess = 30;
    this.map = null;
    this.lightMap = null;
    this.lightMapIntensity = 1.0;
    this.aoMap = null;
    this.aoMapIntensity = 1.0;
    this.emissive = new Color(0x000000);
    this.emissiveIntensity = 1.0;
    this.emissiveMap = null;
    this.bumpMap = null;
    this.bumpScale = 1;
    this.normalMap = null;
    this.normalMapType = TangentSpaceNormalMap;
    this.normalScale = new Vector2(1, 1);
    this.displacementMap = null;
    this.displacementScale = 1;
    this.displacementBias = 0;
    this.specularMap = null;
    this.alphaMap = null;
    this.envMap = null;
    this.combine = MultiplyOperation;
    this.reflectivity = 1;
    this.refractionRatio = 0.98;
    this.wireframe = false;
    this.wireframeLinewidth = 1;
    this.wireframeLinecap = 'round';
    this.wireframeLinejoin = 'round';
    this.skinning = false;
    this.morphTargets = false;
    this.morphNormals = false;
    this.setValues(parameters);
  }
  MeshPhongMaterial.prototype = Object.create(Material.prototype);
  MeshPhongMaterial.prototype.constructor = MeshPhongMaterial;
  MeshPhongMaterial.prototype.isMeshPhongMaterial = true;
  MeshPhongMaterial.prototype.copy = function(source) {
    Material.prototype.copy.call(this, source);
    this.color.copy(source.color);
    this.specular.copy(source.specular);
    this.shininess = source.shininess;
    this.map = source.map;
    this.lightMap = source.lightMap;
    this.lightMapIntensity = source.lightMapIntensity;
    this.aoMap = source.aoMap;
    this.aoMapIntensity = source.aoMapIntensity;
    this.emissive.copy(source.emissive);
    this.emissiveMap = source.emissiveMap;
    this.emissiveIntensity = source.emissiveIntensity;
    this.bumpMap = source.bumpMap;
    this.bumpScale = source.bumpScale;
    this.normalMap = source.normalMap;
    this.normalMapType = source.normalMapType;
    this.normalScale.copy(source.normalScale);
    this.displacementMap = source.displacementMap;
    this.displacementScale = source.displacementScale;
    this.displacementBias = source.displacementBias;
    this.specularMap = source.specularMap;
    this.alphaMap = source.alphaMap;
    this.envMap = source.envMap;
    this.combine = source.combine;
    this.reflectivity = source.reflectivity;
    this.refractionRatio = source.refractionRatio;
    this.wireframe = source.wireframe;
    this.wireframeLinewidth = source.wireframeLinewidth;
    this.wireframeLinecap = source.wireframeLinecap;
    this.wireframeLinejoin = source.wireframeLinejoin;
    this.skinning = source.skinning;
    this.morphTargets = source.morphTargets;
    this.morphNormals = source.morphNormals;
    return this;
  };
  function MeshToonMaterial(parameters) {
    MeshPhongMaterial.call(this);
    this.defines = {'TOON': ''};
    this.type = 'MeshToonMaterial';
    this.gradientMap = null;
    this.setValues(parameters);
  }
  MeshToonMaterial.prototype = Object.create(MeshPhongMaterial.prototype);
  MeshToonMaterial.prototype.constructor = MeshToonMaterial;
  MeshToonMaterial.prototype.isMeshToonMaterial = true;
  MeshToonMaterial.prototype.copy = function(source) {
    MeshPhongMaterial.prototype.copy.call(this, source);
    this.gradientMap = source.gradientMap;
    return this;
  };
  function MeshNormalMaterial(parameters) {
    Material.call(this);
    this.type = 'MeshNormalMaterial';
    this.bumpMap = null;
    this.bumpScale = 1;
    this.normalMap = null;
    this.normalMapType = TangentSpaceNormalMap;
    this.normalScale = new Vector2(1, 1);
    this.displacementMap = null;
    this.displacementScale = 1;
    this.displacementBias = 0;
    this.wireframe = false;
    this.wireframeLinewidth = 1;
    this.fog = false;
    this.lights = false;
    this.skinning = false;
    this.morphTargets = false;
    this.morphNormals = false;
    this.setValues(parameters);
  }
  MeshNormalMaterial.prototype = Object.create(Material.prototype);
  MeshNormalMaterial.prototype.constructor = MeshNormalMaterial;
  MeshNormalMaterial.prototype.isMeshNormalMaterial = true;
  MeshNormalMaterial.prototype.copy = function(source) {
    Material.prototype.copy.call(this, source);
    this.bumpMap = source.bumpMap;
    this.bumpScale = source.bumpScale;
    this.normalMap = source.normalMap;
    this.normalMapType = source.normalMapType;
    this.normalScale.copy(source.normalScale);
    this.displacementMap = source.displacementMap;
    this.displacementScale = source.displacementScale;
    this.displacementBias = source.displacementBias;
    this.wireframe = source.wireframe;
    this.wireframeLinewidth = source.wireframeLinewidth;
    this.skinning = source.skinning;
    this.morphTargets = source.morphTargets;
    this.morphNormals = source.morphNormals;
    return this;
  };
  function MeshLambertMaterial(parameters) {
    Material.call(this);
    this.type = 'MeshLambertMaterial';
    this.color = new Color(0xffffff);
    this.map = null;
    this.lightMap = null;
    this.lightMapIntensity = 1.0;
    this.aoMap = null;
    this.aoMapIntensity = 1.0;
    this.emissive = new Color(0x000000);
    this.emissiveIntensity = 1.0;
    this.emissiveMap = null;
    this.specularMap = null;
    this.alphaMap = null;
    this.envMap = null;
    this.combine = MultiplyOperation;
    this.reflectivity = 1;
    this.refractionRatio = 0.98;
    this.wireframe = false;
    this.wireframeLinewidth = 1;
    this.wireframeLinecap = 'round';
    this.wireframeLinejoin = 'round';
    this.skinning = false;
    this.morphTargets = false;
    this.morphNormals = false;
    this.setValues(parameters);
  }
  MeshLambertMaterial.prototype = Object.create(Material.prototype);
  MeshLambertMaterial.prototype.constructor = MeshLambertMaterial;
  MeshLambertMaterial.prototype.isMeshLambertMaterial = true;
  MeshLambertMaterial.prototype.copy = function(source) {
    Material.prototype.copy.call(this, source);
    this.color.copy(source.color);
    this.map = source.map;
    this.lightMap = source.lightMap;
    this.lightMapIntensity = source.lightMapIntensity;
    this.aoMap = source.aoMap;
    this.aoMapIntensity = source.aoMapIntensity;
    this.emissive.copy(source.emissive);
    this.emissiveMap = source.emissiveMap;
    this.emissiveIntensity = source.emissiveIntensity;
    this.specularMap = source.specularMap;
    this.alphaMap = source.alphaMap;
    this.envMap = source.envMap;
    this.combine = source.combine;
    this.reflectivity = source.reflectivity;
    this.refractionRatio = source.refractionRatio;
    this.wireframe = source.wireframe;
    this.wireframeLinewidth = source.wireframeLinewidth;
    this.wireframeLinecap = source.wireframeLinecap;
    this.wireframeLinejoin = source.wireframeLinejoin;
    this.skinning = source.skinning;
    this.morphTargets = source.morphTargets;
    this.morphNormals = source.morphNormals;
    return this;
  };
  function MeshMatcapMaterial(parameters) {
    Material.call(this);
    this.defines = {'MATCAP': ''};
    this.type = 'MeshMatcapMaterial';
    this.color = new Color(0xffffff);
    this.matcap = null;
    this.map = null;
    this.bumpMap = null;
    this.bumpScale = 1;
    this.normalMap = null;
    this.normalMapType = TangentSpaceNormalMap;
    this.normalScale = new Vector2(1, 1);
    this.displacementMap = null;
    this.displacementScale = 1;
    this.displacementBias = 0;
    this.alphaMap = null;
    this.skinning = false;
    this.morphTargets = false;
    this.morphNormals = false;
    this.lights = false;
    this.setValues(parameters);
  }
  MeshMatcapMaterial.prototype = Object.create(Material.prototype);
  MeshMatcapMaterial.prototype.constructor = MeshMatcapMaterial;
  MeshMatcapMaterial.prototype.isMeshMatcapMaterial = true;
  MeshMatcapMaterial.prototype.copy = function(source) {
    Material.prototype.copy.call(this, source);
    this.defines = {'MATCAP': ''};
    this.color.copy(source.color);
    this.matcap = source.matcap;
    this.map = source.map;
    this.bumpMap = source.bumpMap;
    this.bumpScale = source.bumpScale;
    this.normalMap = source.normalMap;
    this.normalMapType = source.normalMapType;
    this.normalScale.copy(source.normalScale);
    this.displacementMap = source.displacementMap;
    this.displacementScale = source.displacementScale;
    this.displacementBias = source.displacementBias;
    this.alphaMap = source.alphaMap;
    this.skinning = source.skinning;
    this.morphTargets = source.morphTargets;
    this.morphNormals = source.morphNormals;
    return this;
  };
  function LineDashedMaterial(parameters) {
    LineBasicMaterial.call(this);
    this.type = 'LineDashedMaterial';
    this.scale = 1;
    this.dashSize = 3;
    this.gapSize = 1;
    this.setValues(parameters);
  }
  LineDashedMaterial.prototype = Object.create(LineBasicMaterial.prototype);
  LineDashedMaterial.prototype.constructor = LineDashedMaterial;
  LineDashedMaterial.prototype.isLineDashedMaterial = true;
  LineDashedMaterial.prototype.copy = function(source) {
    LineBasicMaterial.prototype.copy.call(this, source);
    this.scale = source.scale;
    this.dashSize = source.dashSize;
    this.gapSize = source.gapSize;
    return this;
  };
  var Materials = Object.freeze({
    ShadowMaterial: ShadowMaterial,
    SpriteMaterial: SpriteMaterial,
    RawShaderMaterial: RawShaderMaterial,
    ShaderMaterial: ShaderMaterial,
    PointsMaterial: PointsMaterial,
    MeshPhysicalMaterial: MeshPhysicalMaterial,
    MeshStandardMaterial: MeshStandardMaterial,
    MeshPhongMaterial: MeshPhongMaterial,
    MeshToonMaterial: MeshToonMaterial,
    MeshNormalMaterial: MeshNormalMaterial,
    MeshLambertMaterial: MeshLambertMaterial,
    MeshDepthMaterial: MeshDepthMaterial,
    MeshDistanceMaterial: MeshDistanceMaterial,
    MeshBasicMaterial: MeshBasicMaterial,
    MeshMatcapMaterial: MeshMatcapMaterial,
    LineDashedMaterial: LineDashedMaterial,
    LineBasicMaterial: LineBasicMaterial,
    Material: Material
  });
  var AnimationUtils = {
    arraySlice: function(array, from, to) {
      if (AnimationUtils.isTypedArray(array)) {
        return new array.constructor(array.subarray(from, to !== undefined ? to : array.length));
      }
      return array.slice(from, to);
    },
    convertArray: function(array, type, forceClone) {
      if (!array || !forceClone && array.constructor === type)
        return array;
      if (typeof type.BYTES_PER_ELEMENT === 'number') {
        return new type(array);
      }
      return Array.prototype.slice.call(array);
    },
    isTypedArray: function(object) {
      return ArrayBuffer.isView(object) && !(object instanceof DataView);
    },
    getKeyframeOrder: function(times) {
      function compareTime(i, j) {
        return times[i] - times[j];
      }
      var n = times.length;
      var result = new Array(n);
      for (var i = 0; i !== n; ++i)
        result[i] = i;
      result.sort(compareTime);
      return result;
    },
    sortedArray: function(values, stride, order) {
      var nValues = values.length;
      var result = new values.constructor(nValues);
      for (var i = 0,
          dstOffset = 0; dstOffset !== nValues; ++i) {
        var srcOffset = order[i] * stride;
        for (var j = 0; j !== stride; ++j) {
          result[dstOffset++] = values[srcOffset + j];
        }
      }
      return result;
    },
    flattenJSON: function(jsonKeys, times, values, valuePropertyName) {
      var i = 1,
          key = jsonKeys[0];
      while (key !== undefined && key[valuePropertyName] === undefined) {
        key = jsonKeys[i++];
      }
      if (key === undefined)
        return;
      var value = key[valuePropertyName];
      if (value === undefined)
        return;
      if (Array.isArray(value)) {
        do {
          value = key[valuePropertyName];
          if (value !== undefined) {
            times.push(key.time);
            values.push.apply(values, value);
          }
          key = jsonKeys[i++];
        } while (key !== undefined);
      } else if (value.toArray !== undefined) {
        do {
          value = key[valuePropertyName];
          if (value !== undefined) {
            times.push(key.time);
            value.toArray(values, values.length);
          }
          key = jsonKeys[i++];
        } while (key !== undefined);
      } else {
        do {
          value = key[valuePropertyName];
          if (value !== undefined) {
            times.push(key.time);
            values.push(value);
          }
          key = jsonKeys[i++];
        } while (key !== undefined);
      }
    }
  };
  function Interpolant(parameterPositions, sampleValues, sampleSize, resultBuffer) {
    this.parameterPositions = parameterPositions;
    this._cachedIndex = 0;
    this.resultBuffer = resultBuffer !== undefined ? resultBuffer : new sampleValues.constructor(sampleSize);
    this.sampleValues = sampleValues;
    this.valueSize = sampleSize;
  }
  Object.assign(Interpolant.prototype, {
    evaluate: function(t) {
      var pp = this.parameterPositions,
          i1 = this._cachedIndex,
          t1 = pp[i1],
          t0 = pp[i1 - 1];
      validate_interval: {
        seek: {
          var right;
          linear_scan: {
            forward_scan: if (!(t < t1)) {
              for (var giveUpAt = i1 + 2; ; ) {
                if (t1 === undefined) {
                  if (t < t0)
                    break forward_scan;
                  i1 = pp.length;
                  this._cachedIndex = i1;
                  return this.afterEnd_(i1 - 1, t, t0);
                }
                if (i1 === giveUpAt)
                  break;
                t0 = t1;
                t1 = pp[++i1];
                if (t < t1) {
                  break seek;
                }
              }
              right = pp.length;
              break linear_scan;
            }
            if (!(t >= t0)) {
              var t1global = pp[1];
              if (t < t1global) {
                i1 = 2;
                t0 = t1global;
              }
              for (var giveUpAt = i1 - 2; ; ) {
                if (t0 === undefined) {
                  this._cachedIndex = 0;
                  return this.beforeStart_(0, t, t1);
                }
                if (i1 === giveUpAt)
                  break;
                t1 = t0;
                t0 = pp[--i1 - 1];
                if (t >= t0) {
                  break seek;
                }
              }
              right = i1;
              i1 = 0;
              break linear_scan;
            }
            break validate_interval;
          }
          while (i1 < right) {
            var mid = (i1 + right) >>> 1;
            if (t < pp[mid]) {
              right = mid;
            } else {
              i1 = mid + 1;
            }
          }
          t1 = pp[i1];
          t0 = pp[i1 - 1];
          if (t0 === undefined) {
            this._cachedIndex = 0;
            return this.beforeStart_(0, t, t1);
          }
          if (t1 === undefined) {
            i1 = pp.length;
            this._cachedIndex = i1;
            return this.afterEnd_(i1 - 1, t0, t);
          }
        }
        this._cachedIndex = i1;
        this.intervalChanged_(i1, t0, t1);
      }
      return this.interpolate_(i1, t0, t, t1);
    },
    settings: null,
    DefaultSettings_: {},
    getSettings_: function() {
      return this.settings || this.DefaultSettings_;
    },
    copySampleValue_: function(index) {
      var result = this.resultBuffer,
          values = this.sampleValues,
          stride = this.valueSize,
          offset = index * stride;
      for (var i = 0; i !== stride; ++i) {
        result[i] = values[offset + i];
      }
      return result;
    },
    interpolate_: function() {
      throw new Error('call to abstract method');
    },
    intervalChanged_: function() {}
  });
  Object.assign(Interpolant.prototype, {
    beforeStart_: Interpolant.prototype.copySampleValue_,
    afterEnd_: Interpolant.prototype.copySampleValue_
  });
  function CubicInterpolant(parameterPositions, sampleValues, sampleSize, resultBuffer) {
    Interpolant.call(this, parameterPositions, sampleValues, sampleSize, resultBuffer);
    this._weightPrev = -0;
    this._offsetPrev = -0;
    this._weightNext = -0;
    this._offsetNext = -0;
  }
  CubicInterpolant.prototype = Object.assign(Object.create(Interpolant.prototype), {
    constructor: CubicInterpolant,
    DefaultSettings_: {
      endingStart: ZeroCurvatureEnding,
      endingEnd: ZeroCurvatureEnding
    },
    intervalChanged_: function(i1, t0, t1) {
      var pp = this.parameterPositions,
          iPrev = i1 - 2,
          iNext = i1 + 1,
          tPrev = pp[iPrev],
          tNext = pp[iNext];
      if (tPrev === undefined) {
        switch (this.getSettings_().endingStart) {
          case ZeroSlopeEnding:
            iPrev = i1;
            tPrev = 2 * t0 - t1;
            break;
          case WrapAroundEnding:
            iPrev = pp.length - 2;
            tPrev = t0 + pp[iPrev] - pp[iPrev + 1];
            break;
          default:
            iPrev = i1;
            tPrev = t1;
        }
      }
      if (tNext === undefined) {
        switch (this.getSettings_().endingEnd) {
          case ZeroSlopeEnding:
            iNext = i1;
            tNext = 2 * t1 - t0;
            break;
          case WrapAroundEnding:
            iNext = 1;
            tNext = t1 + pp[1] - pp[0];
            break;
          default:
            iNext = i1 - 1;
            tNext = t0;
        }
      }
      var halfDt = (t1 - t0) * 0.5,
          stride = this.valueSize;
      this._weightPrev = halfDt / (t0 - tPrev);
      this._weightNext = halfDt / (tNext - t1);
      this._offsetPrev = iPrev * stride;
      this._offsetNext = iNext * stride;
    },
    interpolate_: function(i1, t0, t, t1) {
      var result = this.resultBuffer,
          values = this.sampleValues,
          stride = this.valueSize,
          o1 = i1 * stride,
          o0 = o1 - stride,
          oP = this._offsetPrev,
          oN = this._offsetNext,
          wP = this._weightPrev,
          wN = this._weightNext,
          p = (t - t0) / (t1 - t0),
          pp = p * p,
          ppp = pp * p;
      var sP = -wP * ppp + 2 * wP * pp - wP * p;
      var s0 = (1 + wP) * ppp + (-1.5 - 2 * wP) * pp + (-0.5 + wP) * p + 1;
      var s1 = (-1 - wN) * ppp + (1.5 + wN) * pp + 0.5 * p;
      var sN = wN * ppp - wN * pp;
      for (var i = 0; i !== stride; ++i) {
        result[i] = sP * values[oP + i] + s0 * values[o0 + i] + s1 * values[o1 + i] + sN * values[oN + i];
      }
      return result;
    }
  });
  function LinearInterpolant(parameterPositions, sampleValues, sampleSize, resultBuffer) {
    Interpolant.call(this, parameterPositions, sampleValues, sampleSize, resultBuffer);
  }
  LinearInterpolant.prototype = Object.assign(Object.create(Interpolant.prototype), {
    constructor: LinearInterpolant,
    interpolate_: function(i1, t0, t, t1) {
      var result = this.resultBuffer,
          values = this.sampleValues,
          stride = this.valueSize,
          offset1 = i1 * stride,
          offset0 = offset1 - stride,
          weight1 = (t - t0) / (t1 - t0),
          weight0 = 1 - weight1;
      for (var i = 0; i !== stride; ++i) {
        result[i] = values[offset0 + i] * weight0 + values[offset1 + i] * weight1;
      }
      return result;
    }
  });
  function DiscreteInterpolant(parameterPositions, sampleValues, sampleSize, resultBuffer) {
    Interpolant.call(this, parameterPositions, sampleValues, sampleSize, resultBuffer);
  }
  DiscreteInterpolant.prototype = Object.assign(Object.create(Interpolant.prototype), {
    constructor: DiscreteInterpolant,
    interpolate_: function(i1) {
      return this.copySampleValue_(i1 - 1);
    }
  });
  function KeyframeTrack(name, times, values, interpolation) {
    if (name === undefined)
      throw new Error('THREE.KeyframeTrack: track name is undefined');
    if (times === undefined || times.length === 0)
      throw new Error('THREE.KeyframeTrack: no keyframes in track named ' + name);
    this.name = name;
    this.times = AnimationUtils.convertArray(times, this.TimeBufferType);
    this.values = AnimationUtils.convertArray(values, this.ValueBufferType);
    this.setInterpolation(interpolation || this.DefaultInterpolation);
  }
  Object.assign(KeyframeTrack, {toJSON: function(track) {
      var trackType = track.constructor;
      var json;
      if (trackType.toJSON !== undefined) {
        json = trackType.toJSON(track);
      } else {
        json = {
          'name': track.name,
          'times': AnimationUtils.convertArray(track.times, Array),
          'values': AnimationUtils.convertArray(track.values, Array)
        };
        var interpolation = track.getInterpolation();
        if (interpolation !== track.DefaultInterpolation) {
          json.interpolation = interpolation;
        }
      }
      json.type = track.ValueTypeName;
      return json;
    }});
  Object.assign(KeyframeTrack.prototype, {
    constructor: KeyframeTrack,
    TimeBufferType: Float32Array,
    ValueBufferType: Float32Array,
    DefaultInterpolation: InterpolateLinear,
    InterpolantFactoryMethodDiscrete: function(result) {
      return new DiscreteInterpolant(this.times, this.values, this.getValueSize(), result);
    },
    InterpolantFactoryMethodLinear: function(result) {
      return new LinearInterpolant(this.times, this.values, this.getValueSize(), result);
    },
    InterpolantFactoryMethodSmooth: function(result) {
      return new CubicInterpolant(this.times, this.values, this.getValueSize(), result);
    },
    setInterpolation: function(interpolation) {
      var factoryMethod;
      switch (interpolation) {
        case InterpolateDiscrete:
          factoryMethod = this.InterpolantFactoryMethodDiscrete;
          break;
        case InterpolateLinear:
          factoryMethod = this.InterpolantFactoryMethodLinear;
          break;
        case InterpolateSmooth:
          factoryMethod = this.InterpolantFactoryMethodSmooth;
          break;
      }
      if (factoryMethod === undefined) {
        var message = "unsupported interpolation for " + this.ValueTypeName + " keyframe track named " + this.name;
        if (this.createInterpolant === undefined) {
          if (interpolation !== this.DefaultInterpolation) {
            this.setInterpolation(this.DefaultInterpolation);
          } else {
            throw new Error(message);
          }
        }
        console.warn('THREE.KeyframeTrack:', message);
        return this;
      }
      this.createInterpolant = factoryMethod;
      return this;
    },
    getInterpolation: function() {
      switch (this.createInterpolant) {
        case this.InterpolantFactoryMethodDiscrete:
          return InterpolateDiscrete;
        case this.InterpolantFactoryMethodLinear:
          return InterpolateLinear;
        case this.InterpolantFactoryMethodSmooth:
          return InterpolateSmooth;
      }
    },
    getValueSize: function() {
      return this.values.length / this.times.length;
    },
    shift: function(timeOffset) {
      if (timeOffset !== 0.0) {
        var times = this.times;
        for (var i = 0,
            n = times.length; i !== n; ++i) {
          times[i] += timeOffset;
        }
      }
      return this;
    },
    scale: function(timeScale) {
      if (timeScale !== 1.0) {
        var times = this.times;
        for (var i = 0,
            n = times.length; i !== n; ++i) {
          times[i] *= timeScale;
        }
      }
      return this;
    },
    trim: function(startTime, endTime) {
      var times = this.times,
          nKeys = times.length,
          from = 0,
          to = nKeys - 1;
      while (from !== nKeys && times[from] < startTime) {
        ++from;
      }
      while (to !== -1 && times[to] > endTime) {
        --to;
      }
      ++to;
      if (from !== 0 || to !== nKeys) {
        if (from >= to)
          to = Math.max(to, 1), from = to - 1;
        var stride = this.getValueSize();
        this.times = AnimationUtils.arraySlice(times, from, to);
        this.values = AnimationUtils.arraySlice(this.values, from * stride, to * stride);
      }
      return this;
    },
    validate: function() {
      var valid = true;
      var valueSize = this.getValueSize();
      if (valueSize - Math.floor(valueSize) !== 0) {
        console.error('THREE.KeyframeTrack: Invalid value size in track.', this);
        valid = false;
      }
      var times = this.times,
          values = this.values,
          nKeys = times.length;
      if (nKeys === 0) {
        console.error('THREE.KeyframeTrack: Track is empty.', this);
        valid = false;
      }
      var prevTime = null;
      for (var i = 0; i !== nKeys; i++) {
        var currTime = times[i];
        if (typeof currTime === 'number' && isNaN(currTime)) {
          console.error('THREE.KeyframeTrack: Time is not a valid number.', this, i, currTime);
          valid = false;
          break;
        }
        if (prevTime !== null && prevTime > currTime) {
          console.error('THREE.KeyframeTrack: Out of order keys.', this, i, currTime, prevTime);
          valid = false;
          break;
        }
        prevTime = currTime;
      }
      if (values !== undefined) {
        if (AnimationUtils.isTypedArray(values)) {
          for (var i = 0,
              n = values.length; i !== n; ++i) {
            var value = values[i];
            if (isNaN(value)) {
              console.error('THREE.KeyframeTrack: Value is not a valid number.', this, i, value);
              valid = false;
              break;
            }
          }
        }
      }
      return valid;
    },
    optimize: function() {
      var times = this.times,
          values = this.values,
          stride = this.getValueSize(),
          smoothInterpolation = this.getInterpolation() === InterpolateSmooth,
          writeIndex = 1,
          lastIndex = times.length - 1;
      for (var i = 1; i < lastIndex; ++i) {
        var keep = false;
        var time = times[i];
        var timeNext = times[i + 1];
        if (time !== timeNext && (i !== 1 || time !== time[0])) {
          if (!smoothInterpolation) {
            var offset = i * stride,
                offsetP = offset - stride,
                offsetN = offset + stride;
            for (var j = 0; j !== stride; ++j) {
              var value = values[offset + j];
              if (value !== values[offsetP + j] || value !== values[offsetN + j]) {
                keep = true;
                break;
              }
            }
          } else {
            keep = true;
          }
        }
        if (keep) {
          if (i !== writeIndex) {
            times[writeIndex] = times[i];
            var readOffset = i * stride,
                writeOffset = writeIndex * stride;
            for (var j = 0; j !== stride; ++j) {
              values[writeOffset + j] = values[readOffset + j];
            }
          }
          ++writeIndex;
        }
      }
      if (lastIndex > 0) {
        times[writeIndex] = times[lastIndex];
        for (var readOffset = lastIndex * stride,
            writeOffset = writeIndex * stride,
            j = 0; j !== stride; ++j) {
          values[writeOffset + j] = values[readOffset + j];
        }
        ++writeIndex;
      }
      if (writeIndex !== times.length) {
        this.times = AnimationUtils.arraySlice(times, 0, writeIndex);
        this.values = AnimationUtils.arraySlice(values, 0, writeIndex * stride);
      }
      return this;
    },
    clone: function() {
      var times = AnimationUtils.arraySlice(this.times, 0);
      var values = AnimationUtils.arraySlice(this.values, 0);
      var TypedKeyframeTrack = this.constructor;
      var track = new TypedKeyframeTrack(this.name, times, values);
      track.createInterpolant = this.createInterpolant;
      return track;
    }
  });
  function BooleanKeyframeTrack(name, times, values) {
    KeyframeTrack.call(this, name, times, values);
  }
  BooleanKeyframeTrack.prototype = Object.assign(Object.create(KeyframeTrack.prototype), {
    constructor: BooleanKeyframeTrack,
    ValueTypeName: 'bool',
    ValueBufferType: Array,
    DefaultInterpolation: InterpolateDiscrete,
    InterpolantFactoryMethodLinear: undefined,
    InterpolantFactoryMethodSmooth: undefined
  });
  function ColorKeyframeTrack(name, times, values, interpolation) {
    KeyframeTrack.call(this, name, times, values, interpolation);
  }
  ColorKeyframeTrack.prototype = Object.assign(Object.create(KeyframeTrack.prototype), {
    constructor: ColorKeyframeTrack,
    ValueTypeName: 'color'
  });
  function NumberKeyframeTrack(name, times, values, interpolation) {
    KeyframeTrack.call(this, name, times, values, interpolation);
  }
  NumberKeyframeTrack.prototype = Object.assign(Object.create(KeyframeTrack.prototype), {
    constructor: NumberKeyframeTrack,
    ValueTypeName: 'number'
  });
  function QuaternionLinearInterpolant(parameterPositions, sampleValues, sampleSize, resultBuffer) {
    Interpolant.call(this, parameterPositions, sampleValues, sampleSize, resultBuffer);
  }
  QuaternionLinearInterpolant.prototype = Object.assign(Object.create(Interpolant.prototype), {
    constructor: QuaternionLinearInterpolant,
    interpolate_: function(i1, t0, t, t1) {
      var result = this.resultBuffer,
          values = this.sampleValues,
          stride = this.valueSize,
          offset = i1 * stride,
          alpha = (t - t0) / (t1 - t0);
      for (var end = offset + stride; offset !== end; offset += 4) {
        Quaternion.slerpFlat(result, 0, values, offset - stride, values, offset, alpha);
      }
      return result;
    }
  });
  function QuaternionKeyframeTrack(name, times, values, interpolation) {
    KeyframeTrack.call(this, name, times, values, interpolation);
  }
  QuaternionKeyframeTrack.prototype = Object.assign(Object.create(KeyframeTrack.prototype), {
    constructor: QuaternionKeyframeTrack,
    ValueTypeName: 'quaternion',
    DefaultInterpolation: InterpolateLinear,
    InterpolantFactoryMethodLinear: function(result) {
      return new QuaternionLinearInterpolant(this.times, this.values, this.getValueSize(), result);
    },
    InterpolantFactoryMethodSmooth: undefined
  });
  function StringKeyframeTrack(name, times, values, interpolation) {
    KeyframeTrack.call(this, name, times, values, interpolation);
  }
  StringKeyframeTrack.prototype = Object.assign(Object.create(KeyframeTrack.prototype), {
    constructor: StringKeyframeTrack,
    ValueTypeName: 'string',
    ValueBufferType: Array,
    DefaultInterpolation: InterpolateDiscrete,
    InterpolantFactoryMethodLinear: undefined,
    InterpolantFactoryMethodSmooth: undefined
  });
  function VectorKeyframeTrack(name, times, values, interpolation) {
    KeyframeTrack.call(this, name, times, values, interpolation);
  }
  VectorKeyframeTrack.prototype = Object.assign(Object.create(KeyframeTrack.prototype), {
    constructor: VectorKeyframeTrack,
    ValueTypeName: 'vector'
  });
  function AnimationClip(name, duration, tracks) {
    this.name = name;
    this.tracks = tracks;
    this.duration = (duration !== undefined) ? duration : -1;
    this.uuid = _Math.generateUUID();
    if (this.duration < 0) {
      this.resetDuration();
    }
  }
  function getTrackTypeForValueTypeName(typeName) {
    switch (typeName.toLowerCase()) {
      case 'scalar':
      case 'double':
      case 'float':
      case 'number':
      case 'integer':
        return NumberKeyframeTrack;
      case 'vector':
      case 'vector2':
      case 'vector3':
      case 'vector4':
        return VectorKeyframeTrack;
      case 'color':
        return ColorKeyframeTrack;
      case 'quaternion':
        return QuaternionKeyframeTrack;
      case 'bool':
      case 'boolean':
        return BooleanKeyframeTrack;
      case 'string':
        return StringKeyframeTrack;
    }
    throw new Error('THREE.KeyframeTrack: Unsupported typeName: ' + typeName);
  }
  function parseKeyframeTrack(json) {
    if (json.type === undefined) {
      throw new Error('THREE.KeyframeTrack: track type undefined, can not parse');
    }
    var trackType = getTrackTypeForValueTypeName(json.type);
    if (json.times === undefined) {
      var times = [],
          values = [];
      AnimationUtils.flattenJSON(json.keys, times, values, 'value');
      json.times = times;
      json.values = values;
    }
    if (trackType.parse !== undefined) {
      return trackType.parse(json);
    } else {
      return new trackType(json.name, json.times, json.values, json.interpolation);
    }
  }
  Object.assign(AnimationClip, {
    parse: function(json) {
      var tracks = [],
          jsonTracks = json.tracks,
          frameTime = 1.0 / (json.fps || 1.0);
      for (var i = 0,
          n = jsonTracks.length; i !== n; ++i) {
        tracks.push(parseKeyframeTrack(jsonTracks[i]).scale(frameTime));
      }
      return new AnimationClip(json.name, json.duration, tracks);
    },
    toJSON: function(clip) {
      var tracks = [],
          clipTracks = clip.tracks;
      var json = {
        'name': clip.name,
        'duration': clip.duration,
        'tracks': tracks,
        'uuid': clip.uuid
      };
      for (var i = 0,
          n = clipTracks.length; i !== n; ++i) {
        tracks.push(KeyframeTrack.toJSON(clipTracks[i]));
      }
      return json;
    },
    CreateFromMorphTargetSequence: function(name, morphTargetSequence, fps, noLoop) {
      var numMorphTargets = morphTargetSequence.length;
      var tracks = [];
      for (var i = 0; i < numMorphTargets; i++) {
        var times = [];
        var values = [];
        times.push((i + numMorphTargets - 1) % numMorphTargets, i, (i + 1) % numMorphTargets);
        values.push(0, 1, 0);
        var order = AnimationUtils.getKeyframeOrder(times);
        times = AnimationUtils.sortedArray(times, 1, order);
        values = AnimationUtils.sortedArray(values, 1, order);
        if (!noLoop && times[0] === 0) {
          times.push(numMorphTargets);
          values.push(values[0]);
        }
        tracks.push(new NumberKeyframeTrack('.morphTargetInfluences[' + morphTargetSequence[i].name + ']', times, values).scale(1.0 / fps));
      }
      return new AnimationClip(name, -1, tracks);
    },
    findByName: function(objectOrClipArray, name) {
      var clipArray = objectOrClipArray;
      if (!Array.isArray(objectOrClipArray)) {
        var o = objectOrClipArray;
        clipArray = o.geometry && o.geometry.animations || o.animations;
      }
      for (var i = 0; i < clipArray.length; i++) {
        if (clipArray[i].name === name) {
          return clipArray[i];
        }
      }
      return null;
    },
    CreateClipsFromMorphTargetSequences: function(morphTargets, fps, noLoop) {
      var animationToMorphTargets = {};
      var pattern = /^([\w-]*?)([\d]+)$/;
      for (var i = 0,
          il = morphTargets.length; i < il; i++) {
        var morphTarget = morphTargets[i];
        var parts = morphTarget.name.match(pattern);
        if (parts && parts.length > 1) {
          var name = parts[1];
          var animationMorphTargets = animationToMorphTargets[name];
          if (!animationMorphTargets) {
            animationToMorphTargets[name] = animationMorphTargets = [];
          }
          animationMorphTargets.push(morphTarget);
        }
      }
      var clips = [];
      for (var name in animationToMorphTargets) {
        clips.push(AnimationClip.CreateFromMorphTargetSequence(name, animationToMorphTargets[name], fps, noLoop));
      }
      return clips;
    },
    parseAnimation: function(animation, bones) {
      if (!animation) {
        console.error('THREE.AnimationClip: No animation in JSONLoader data.');
        return null;
      }
      var addNonemptyTrack = function(trackType, trackName, animationKeys, propertyName, destTracks) {
        if (animationKeys.length !== 0) {
          var times = [];
          var values = [];
          AnimationUtils.flattenJSON(animationKeys, times, values, propertyName);
          if (times.length !== 0) {
            destTracks.push(new trackType(trackName, times, values));
          }
        }
      };
      var tracks = [];
      var clipName = animation.name || 'default';
      var duration = animation.length || -1;
      var fps = animation.fps || 30;
      var hierarchyTracks = animation.hierarchy || [];
      for (var h = 0; h < hierarchyTracks.length; h++) {
        var animationKeys = hierarchyTracks[h].keys;
        if (!animationKeys || animationKeys.length === 0)
          continue;
        if (animationKeys[0].morphTargets) {
          var morphTargetNames = {};
          for (var k = 0; k < animationKeys.length; k++) {
            if (animationKeys[k].morphTargets) {
              for (var m = 0; m < animationKeys[k].morphTargets.length; m++) {
                morphTargetNames[animationKeys[k].morphTargets[m]] = -1;
              }
            }
          }
          for (var morphTargetName in morphTargetNames) {
            var times = [];
            var values = [];
            for (var m = 0; m !== animationKeys[k].morphTargets.length; ++m) {
              var animationKey = animationKeys[k];
              times.push(animationKey.time);
              values.push((animationKey.morphTarget === morphTargetName) ? 1 : 0);
            }
            tracks.push(new NumberKeyframeTrack('.morphTargetInfluence[' + morphTargetName + ']', times, values));
          }
          duration = morphTargetNames.length * (fps || 1.0);
        } else {
          var boneName = '.bones[' + bones[h].name + ']';
          addNonemptyTrack(VectorKeyframeTrack, boneName + '.position', animationKeys, 'pos', tracks);
          addNonemptyTrack(QuaternionKeyframeTrack, boneName + '.quaternion', animationKeys, 'rot', tracks);
          addNonemptyTrack(VectorKeyframeTrack, boneName + '.scale', animationKeys, 'scl', tracks);
        }
      }
      if (tracks.length === 0) {
        return null;
      }
      var clip = new AnimationClip(clipName, duration, tracks);
      return clip;
    }
  });
  Object.assign(AnimationClip.prototype, {
    resetDuration: function() {
      var tracks = this.tracks,
          duration = 0;
      for (var i = 0,
          n = tracks.length; i !== n; ++i) {
        var track = this.tracks[i];
        duration = Math.max(duration, track.times[track.times.length - 1]);
      }
      this.duration = duration;
      return this;
    },
    trim: function() {
      for (var i = 0; i < this.tracks.length; i++) {
        this.tracks[i].trim(0, this.duration);
      }
      return this;
    },
    validate: function() {
      var valid = true;
      for (var i = 0; i < this.tracks.length; i++) {
        valid = valid && this.tracks[i].validate();
      }
      return valid;
    },
    optimize: function() {
      for (var i = 0; i < this.tracks.length; i++) {
        this.tracks[i].optimize();
      }
      return this;
    },
    clone: function() {
      var tracks = [];
      for (var i = 0; i < this.tracks.length; i++) {
        tracks.push(this.tracks[i].clone());
      }
      return new AnimationClip(this.name, this.duration, tracks);
    }
  });
  var Cache = {
    enabled: false,
    files: {},
    add: function(key, file) {
      if (this.enabled === false)
        return;
      this.files[key] = file;
    },
    get: function(key) {
      if (this.enabled === false)
        return;
      return this.files[key];
    },
    remove: function(key) {
      delete this.files[key];
    },
    clear: function() {
      this.files = {};
    }
  };
  function LoadingManager(onLoad, onProgress, onError) {
    var scope = this;
    var isLoading = false;
    var itemsLoaded = 0;
    var itemsTotal = 0;
    var urlModifier = undefined;
    this.onStart = undefined;
    this.onLoad = onLoad;
    this.onProgress = onProgress;
    this.onError = onError;
    this.itemStart = function(url) {
      itemsTotal++;
      if (isLoading === false) {
        if (scope.onStart !== undefined) {
          scope.onStart(url, itemsLoaded, itemsTotal);
        }
      }
      isLoading = true;
    };
    this.itemEnd = function(url) {
      itemsLoaded++;
      if (scope.onProgress !== undefined) {
        scope.onProgress(url, itemsLoaded, itemsTotal);
      }
      if (itemsLoaded === itemsTotal) {
        isLoading = false;
        if (scope.onLoad !== undefined) {
          scope.onLoad();
        }
      }
    };
    this.itemError = function(url) {
      if (scope.onError !== undefined) {
        scope.onError(url);
      }
    };
    this.resolveURL = function(url) {
      if (urlModifier) {
        return urlModifier(url);
      }
      return url;
    };
    this.setURLModifier = function(transform) {
      urlModifier = transform;
      return this;
    };
  }
  var DefaultLoadingManager = new LoadingManager();
  var loading = {};
  function FileLoader(manager) {
    this.manager = (manager !== undefined) ? manager : DefaultLoadingManager;
  }
  Object.assign(FileLoader.prototype, {
    load: function(url, onLoad, onProgress, onError) {
      if (url === undefined)
        url = '';
      if (this.path !== undefined)
        url = this.path + url;
      url = this.manager.resolveURL(url);
      var scope = this;
      var cached = Cache.get(url);
      if (cached !== undefined) {
        scope.manager.itemStart(url);
        setTimeout(function() {
          if (onLoad)
            onLoad(cached);
          scope.manager.itemEnd(url);
        }, 0);
        return cached;
      }
      if (loading[url] !== undefined) {
        loading[url].push({
          onLoad: onLoad,
          onProgress: onProgress,
          onError: onError
        });
        return;
      }
      var dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/;
      var dataUriRegexResult = url.match(dataUriRegex);
      if (dataUriRegexResult) {
        var mimeType = dataUriRegexResult[1];
        var isBase64 = !!dataUriRegexResult[2];
        var data = dataUriRegexResult[3];
        data = decodeURIComponent(data);
        if (isBase64)
          data = atob(data);
        try {
          var response;
          var responseType = (this.responseType || '').toLowerCase();
          switch (responseType) {
            case 'arraybuffer':
            case 'blob':
              var view = new Uint8Array(data.length);
              for (var i = 0; i < data.length; i++) {
                view[i] = data.charCodeAt(i);
              }
              if (responseType === 'blob') {
                response = new Blob([view.buffer], {type: mimeType});
              } else {
                response = view.buffer;
              }
              break;
            case 'document':
              var parser = new DOMParser();
              response = parser.parseFromString(data, mimeType);
              break;
            case 'json':
              response = JSON.parse(data);
              break;
            default:
              response = data;
              break;
          }
          setTimeout(function() {
            if (onLoad)
              onLoad(response);
            scope.manager.itemEnd(url);
          }, 0);
        } catch (error) {
          setTimeout(function() {
            if (onError)
              onError(error);
            scope.manager.itemError(url);
            scope.manager.itemEnd(url);
          }, 0);
        }
      } else {
        loading[url] = [];
        loading[url].push({
          onLoad: onLoad,
          onProgress: onProgress,
          onError: onError
        });
        var request = new XMLHttpRequest();
        request.open('GET', url, true);
        request.addEventListener('load', function(event) {
          var response = this.response;
          Cache.add(url, response);
          var callbacks = loading[url];
          delete loading[url];
          if (this.status === 200 || this.status === 0) {
            if (this.status === 0)
              console.warn('THREE.FileLoader: HTTP Status 0 received.');
            for (var i = 0,
                il = callbacks.length; i < il; i++) {
              var callback = callbacks[i];
              if (callback.onLoad)
                callback.onLoad(response);
            }
            scope.manager.itemEnd(url);
          } else {
            for (var i = 0,
                il = callbacks.length; i < il; i++) {
              var callback = callbacks[i];
              if (callback.onError)
                callback.onError(event);
            }
            scope.manager.itemError(url);
            scope.manager.itemEnd(url);
          }
        }, false);
        request.addEventListener('progress', function(event) {
          var callbacks = loading[url];
          for (var i = 0,
              il = callbacks.length; i < il; i++) {
            var callback = callbacks[i];
            if (callback.onProgress)
              callback.onProgress(event);
          }
        }, false);
        request.addEventListener('error', function(event) {
          var callbacks = loading[url];
          delete loading[url];
          for (var i = 0,
              il = callbacks.length; i < il; i++) {
            var callback = callbacks[i];
            if (callback.onError)
              callback.onError(event);
          }
          scope.manager.itemError(url);
          scope.manager.itemEnd(url);
        }, false);
        request.addEventListener('abort', function(event) {
          var callbacks = loading[url];
          delete loading[url];
          for (var i = 0,
              il = callbacks.length; i < il; i++) {
            var callback = callbacks[i];
            if (callback.onError)
              callback.onError(event);
          }
          scope.manager.itemError(url);
          scope.manager.itemEnd(url);
        }, false);
        if (this.responseType !== undefined)
          request.responseType = this.responseType;
        if (this.withCredentials !== undefined)
          request.withCredentials = this.withCredentials;
        if (request.overrideMimeType)
          request.overrideMimeType(this.mimeType !== undefined ? this.mimeType : 'text/plain');
        for (var header in this.requestHeader) {
          request.setRequestHeader(header, this.requestHeader[header]);
        }
        request.send(null);
      }
      scope.manager.itemStart(url);
      return request;
    },
    setPath: function(value) {
      this.path = value;
      return this;
    },
    setResponseType: function(value) {
      this.responseType = value;
      return this;
    },
    setWithCredentials: function(value) {
      this.withCredentials = value;
      return this;
    },
    setMimeType: function(value) {
      this.mimeType = value;
      return this;
    },
    setRequestHeader: function(value) {
      this.requestHeader = value;
      return this;
    }
  });
  function AnimationLoader(manager) {
    this.manager = (manager !== undefined) ? manager : DefaultLoadingManager;
  }
  Object.assign(AnimationLoader.prototype, {
    load: function(url, onLoad, onProgress, onError) {
      var scope = this;
      var loader = new FileLoader(scope.manager);
      loader.setPath(scope.path);
      loader.load(url, function(text) {
        onLoad(scope.parse(JSON.parse(text)));
      }, onProgress, onError);
    },
    parse: function(json, onLoad) {
      var animations = [];
      for (var i = 0; i < json.length; i++) {
        var clip = AnimationClip.parse(json[i]);
        animations.push(clip);
      }
      onLoad(animations);
    },
    setPath: function(value) {
      this.path = value;
      return this;
    }
  });
  function CompressedTextureLoader(manager) {
    this.manager = (manager !== undefined) ? manager : DefaultLoadingManager;
    this._parser = null;
  }
  Object.assign(CompressedTextureLoader.prototype, {
    load: function(url, onLoad, onProgress, onError) {
      var scope = this;
      var images = [];
      var texture = new CompressedTexture();
      texture.image = images;
      var loader = new FileLoader(this.manager);
      loader.setPath(this.path);
      loader.setResponseType('arraybuffer');
      function loadTexture(i) {
        loader.load(url[i], function(buffer) {
          var texDatas = scope._parser(buffer, true);
          images[i] = {
            width: texDatas.width,
            height: texDatas.height,
            format: texDatas.format,
            mipmaps: texDatas.mipmaps
          };
          loaded += 1;
          if (loaded === 6) {
            if (texDatas.mipmapCount === 1)
              texture.minFilter = LinearFilter;
            texture.format = texDatas.format;
            texture.needsUpdate = true;
            if (onLoad)
              onLoad(texture);
          }
        }, onProgress, onError);
      }
      if (Array.isArray(url)) {
        var loaded = 0;
        for (var i = 0,
            il = url.length; i < il; ++i) {
          loadTexture(i);
        }
      } else {
        loader.load(url, function(buffer) {
          var texDatas = scope._parser(buffer, true);
          if (texDatas.isCubemap) {
            var faces = texDatas.mipmaps.length / texDatas.mipmapCount;
            for (var f = 0; f < faces; f++) {
              images[f] = {mipmaps: []};
              for (var i = 0; i < texDatas.mipmapCount; i++) {
                images[f].mipmaps.push(texDatas.mipmaps[f * texDatas.mipmapCount + i]);
                images[f].format = texDatas.format;
                images[f].width = texDatas.width;
                images[f].height = texDatas.height;
              }
            }
          } else {
            texture.image.width = texDatas.width;
            texture.image.height = texDatas.height;
            texture.mipmaps = texDatas.mipmaps;
          }
          if (texDatas.mipmapCount === 1) {
            texture.minFilter = LinearFilter;
          }
          texture.format = texDatas.format;
          texture.needsUpdate = true;
          if (onLoad)
            onLoad(texture);
        }, onProgress, onError);
      }
      return texture;
    },
    setPath: function(value) {
      this.path = value;
      return this;
    }
  });
  function DataTextureLoader(manager) {
    this.manager = (manager !== undefined) ? manager : DefaultLoadingManager;
    this._parser = null;
  }
  Object.assign(DataTextureLoader.prototype, {
    load: function(url, onLoad, onProgress, onError) {
      var scope = this;
      var texture = new DataTexture();
      var loader = new FileLoader(this.manager);
      loader.setResponseType('arraybuffer');
      loader.setPath(this.path);
      loader.load(url, function(buffer) {
        var texData = scope._parser(buffer);
        if (!texData)
          return;
        if (texData.image !== undefined) {
          texture.image = texData.image;
        } else if (texData.data !== undefined) {
          texture.image.width = texData.width;
          texture.image.height = texData.height;
          texture.image.data = texData.data;
        }
        texture.wrapS = texData.wrapS !== undefined ? texData.wrapS : ClampToEdgeWrapping;
        texture.wrapT = texData.wrapT !== undefined ? texData.wrapT : ClampToEdgeWrapping;
        texture.magFilter = texData.magFilter !== undefined ? texData.magFilter : LinearFilter;
        texture.minFilter = texData.minFilter !== undefined ? texData.minFilter : LinearMipMapLinearFilter;
        texture.anisotropy = texData.anisotropy !== undefined ? texData.anisotropy : 1;
        if (texData.format !== undefined) {
          texture.format = texData.format;
        }
        if (texData.type !== undefined) {
          texture.type = texData.type;
        }
        if (texData.mipmaps !== undefined) {
          texture.mipmaps = texData.mipmaps;
        }
        if (texData.mipmapCount === 1) {
          texture.minFilter = LinearFilter;
        }
        texture.needsUpdate = true;
        if (onLoad)
          onLoad(texture, texData);
      }, onProgress, onError);
      return texture;
    },
    setPath: function(value) {
      this.path = value;
      return this;
    }
  });
  function ImageLoader(manager) {
    this.manager = (manager !== undefined) ? manager : DefaultLoadingManager;
  }
  Object.assign(ImageLoader.prototype, {
    crossOrigin: 'anonymous',
    load: function(url, onLoad, onProgress, onError) {
      if (url === undefined)
        url = '';
      if (this.path !== undefined)
        url = this.path + url;
      url = this.manager.resolveURL(url);
      var scope = this;
      var cached = Cache.get(url);
      if (cached !== undefined) {
        scope.manager.itemStart(url);
        setTimeout(function() {
          if (onLoad)
            onLoad(cached);
          scope.manager.itemEnd(url);
        }, 0);
        return cached;
      }
      var image = document.createElementNS('http://www.w3.org/1999/xhtml', 'img');
      function onImageLoad() {
        image.removeEventListener('load', onImageLoad, false);
        image.removeEventListener('error', onImageError, false);
        Cache.add(url, this);
        if (onLoad)
          onLoad(this);
        scope.manager.itemEnd(url);
      }
      function onImageError(event) {
        image.removeEventListener('load', onImageLoad, false);
        image.removeEventListener('error', onImageError, false);
        if (onError)
          onError(event);
        scope.manager.itemError(url);
        scope.manager.itemEnd(url);
      }
      image.addEventListener('load', onImageLoad, false);
      image.addEventListener('error', onImageError, false);
      if (url.substr(0, 5) !== 'data:') {
        if (this.crossOrigin !== undefined)
          image.crossOrigin = this.crossOrigin;
      }
      scope.manager.itemStart(url);
      image.src = url;
      return image;
    },
    setCrossOrigin: function(value) {
      this.crossOrigin = value;
      return this;
    },
    setPath: function(value) {
      this.path = value;
      return this;
    }
  });
  function CubeTextureLoader(manager) {
    this.manager = (manager !== undefined) ? manager : DefaultLoadingManager;
  }
  Object.assign(CubeTextureLoader.prototype, {
    crossOrigin: 'anonymous',
    load: function(urls, onLoad, onProgress, onError) {
      var texture = new CubeTexture();
      var loader = new ImageLoader(this.manager);
      loader.setCrossOrigin(this.crossOrigin);
      loader.setPath(this.path);
      var loaded = 0;
      function loadTexture(i) {
        loader.load(urls[i], function(image) {
          texture.images[i] = image;
          loaded++;
          if (loaded === 6) {
            texture.needsUpdate = true;
            if (onLoad)
              onLoad(texture);
          }
        }, undefined, onError);
      }
      for (var i = 0; i < urls.length; ++i) {
        loadTexture(i);
      }
      return texture;
    },
    setCrossOrigin: function(value) {
      this.crossOrigin = value;
      return this;
    },
    setPath: function(value) {
      this.path = value;
      return this;
    }
  });
  function TextureLoader(manager) {
    this.manager = (manager !== undefined) ? manager : DefaultLoadingManager;
  }
  Object.assign(TextureLoader.prototype, {
    crossOrigin: 'anonymous',
    load: function(url, onLoad, onProgress, onError) {
      var texture = new Texture();
      var loader = new ImageLoader(this.manager);
      loader.setCrossOrigin(this.crossOrigin);
      loader.setPath(this.path);
      loader.load(url, function(image) {
        texture.image = image;
        var isJPEG = url.search(/\.jpe?g($|\?)/i) > 0 || url.search(/^data\:image\/jpeg/) === 0;
        texture.format = isJPEG ? RGBFormat : RGBAFormat;
        texture.needsUpdate = true;
        if (onLoad !== undefined) {
          onLoad(texture);
        }
      }, onProgress, onError);
      return texture;
    },
    setCrossOrigin: function(value) {
      this.crossOrigin = value;
      return this;
    },
    setPath: function(value) {
      this.path = value;
      return this;
    }
  });
  function Curve() {
    this.type = 'Curve';
    this.arcLengthDivisions = 200;
  }
  Object.assign(Curve.prototype, {
    getPoint: function() {
      console.warn('THREE.Curve: .getPoint() not implemented.');
      return null;
    },
    getPointAt: function(u, optionalTarget) {
      var t = this.getUtoTmapping(u);
      return this.getPoint(t, optionalTarget);
    },
    getPoints: function(divisions) {
      if (divisions === undefined)
        divisions = 5;
      var points = [];
      for (var d = 0; d <= divisions; d++) {
        points.push(this.getPoint(d / divisions));
      }
      return points;
    },
    getSpacedPoints: function(divisions) {
      if (divisions === undefined)
        divisions = 5;
      var points = [];
      for (var d = 0; d <= divisions; d++) {
        points.push(this.getPointAt(d / divisions));
      }
      return points;
    },
    getLength: function() {
      var lengths = this.getLengths();
      return lengths[lengths.length - 1];
    },
    getLengths: function(divisions) {
      if (divisions === undefined)
        divisions = this.arcLengthDivisions;
      if (this.cacheArcLengths && (this.cacheArcLengths.length === divisions + 1) && !this.needsUpdate) {
        return this.cacheArcLengths;
      }
      this.needsUpdate = false;
      var cache = [];
      var current,
          last = this.getPoint(0);
      var p,
          sum = 0;
      cache.push(0);
      for (p = 1; p <= divisions; p++) {
        current = this.getPoint(p / divisions);
        sum += current.distanceTo(last);
        cache.push(sum);
        last = current;
      }
      this.cacheArcLengths = cache;
      return cache;
    },
    updateArcLengths: function() {
      this.needsUpdate = true;
      this.getLengths();
    },
    getUtoTmapping: function(u, distance) {
      var arcLengths = this.getLengths();
      var i = 0,
          il = arcLengths.length;
      var targetArcLength;
      if (distance) {
        targetArcLength = distance;
      } else {
        targetArcLength = u * arcLengths[il - 1];
      }
      var low = 0,
          high = il - 1,
          comparison;
      while (low <= high) {
        i = Math.floor(low + (high - low) / 2);
        comparison = arcLengths[i] - targetArcLength;
        if (comparison < 0) {
          low = i + 1;
        } else if (comparison > 0) {
          high = i - 1;
        } else {
          high = i;
          break;
        }
      }
      i = high;
      if (arcLengths[i] === targetArcLength) {
        return i / (il - 1);
      }
      var lengthBefore = arcLengths[i];
      var lengthAfter = arcLengths[i + 1];
      var segmentLength = lengthAfter - lengthBefore;
      var segmentFraction = (targetArcLength - lengthBefore) / segmentLength;
      var t = (i + segmentFraction) / (il - 1);
      return t;
    },
    getTangent: function(t) {
      var delta = 0.0001;
      var t1 = t - delta;
      var t2 = t + delta;
      if (t1 < 0)
        t1 = 0;
      if (t2 > 1)
        t2 = 1;
      var pt1 = this.getPoint(t1);
      var pt2 = this.getPoint(t2);
      var vec = pt2.clone().sub(pt1);
      return vec.normalize();
    },
    getTangentAt: function(u) {
      var t = this.getUtoTmapping(u);
      return this.getTangent(t);
    },
    computeFrenetFrames: function(segments, closed) {
      var normal = new Vector3();
      var tangents = [];
      var normals = [];
      var binormals = [];
      var vec = new Vector3();
      var mat = new Matrix4();
      var i,
          u,
          theta;
      for (i = 0; i <= segments; i++) {
        u = i / segments;
        tangents[i] = this.getTangentAt(u);
        tangents[i].normalize();
      }
      normals[0] = new Vector3();
      binormals[0] = new Vector3();
      var min = Number.MAX_VALUE;
      var tx = Math.abs(tangents[0].x);
      var ty = Math.abs(tangents[0].y);
      var tz = Math.abs(tangents[0].z);
      if (tx <= min) {
        min = tx;
        normal.set(1, 0, 0);
      }
      if (ty <= min) {
        min = ty;
        normal.set(0, 1, 0);
      }
      if (tz <= min) {
        normal.set(0, 0, 1);
      }
      vec.crossVectors(tangents[0], normal).normalize();
      normals[0].crossVectors(tangents[0], vec);
      binormals[0].crossVectors(tangents[0], normals[0]);
      for (i = 1; i <= segments; i++) {
        normals[i] = normals[i - 1].clone();
        binormals[i] = binormals[i - 1].clone();
        vec.crossVectors(tangents[i - 1], tangents[i]);
        if (vec.length() > Number.EPSILON) {
          vec.normalize();
          theta = Math.acos(_Math.clamp(tangents[i - 1].dot(tangents[i]), -1, 1));
          normals[i].applyMatrix4(mat.makeRotationAxis(vec, theta));
        }
        binormals[i].crossVectors(tangents[i], normals[i]);
      }
      if (closed === true) {
        theta = Math.acos(_Math.clamp(normals[0].dot(normals[segments]), -1, 1));
        theta /= segments;
        if (tangents[0].dot(vec.crossVectors(normals[0], normals[segments])) > 0) {
          theta = -theta;
        }
        for (i = 1; i <= segments; i++) {
          normals[i].applyMatrix4(mat.makeRotationAxis(tangents[i], theta * i));
          binormals[i].crossVectors(tangents[i], normals[i]);
        }
      }
      return {
        tangents: tangents,
        normals: normals,
        binormals: binormals
      };
    },
    clone: function() {
      return new this.constructor().copy(this);
    },
    copy: function(source) {
      this.arcLengthDivisions = source.arcLengthDivisions;
      return this;
    },
    toJSON: function() {
      var data = {metadata: {
          version: 4.5,
          type: 'Curve',
          generator: 'Curve.toJSON'
        }};
      data.arcLengthDivisions = this.arcLengthDivisions;
      data.type = this.type;
      return data;
    },
    fromJSON: function(json) {
      this.arcLengthDivisions = json.arcLengthDivisions;
      return this;
    }
  });
  function EllipseCurve(aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation) {
    Curve.call(this);
    this.type = 'EllipseCurve';
    this.aX = aX || 0;
    this.aY = aY || 0;
    this.xRadius = xRadius || 1;
    this.yRadius = yRadius || 1;
    this.aStartAngle = aStartAngle || 0;
    this.aEndAngle = aEndAngle || 2 * Math.PI;
    this.aClockwise = aClockwise || false;
    this.aRotation = aRotation || 0;
  }
  EllipseCurve.prototype = Object.create(Curve.prototype);
  EllipseCurve.prototype.constructor = EllipseCurve;
  EllipseCurve.prototype.isEllipseCurve = true;
  EllipseCurve.prototype.getPoint = function(t, optionalTarget) {
    var point = optionalTarget || new Vector2();
    var twoPi = Math.PI * 2;
    var deltaAngle = this.aEndAngle - this.aStartAngle;
    var samePoints = Math.abs(deltaAngle) < Number.EPSILON;
    while (deltaAngle < 0)
      deltaAngle += twoPi;
    while (deltaAngle > twoPi)
      deltaAngle -= twoPi;
    if (deltaAngle < Number.EPSILON) {
      if (samePoints) {
        deltaAngle = 0;
      } else {
        deltaAngle = twoPi;
      }
    }
    if (this.aClockwise === true && !samePoints) {
      if (deltaAngle === twoPi) {
        deltaAngle = -twoPi;
      } else {
        deltaAngle = deltaAngle - twoPi;
      }
    }
    var angle = this.aStartAngle + t * deltaAngle;
    var x = this.aX + this.xRadius * Math.cos(angle);
    var y = this.aY + this.yRadius * Math.sin(angle);
    if (this.aRotation !== 0) {
      var cos = Math.cos(this.aRotation);
      var sin = Math.sin(this.aRotation);
      var tx = x - this.aX;
      var ty = y - this.aY;
      x = tx * cos - ty * sin + this.aX;
      y = tx * sin + ty * cos + this.aY;
    }
    return point.set(x, y);
  };
  EllipseCurve.prototype.copy = function(source) {
    Curve.prototype.copy.call(this, source);
    this.aX = source.aX;
    this.aY = source.aY;
    this.xRadius = source.xRadius;
    this.yRadius = source.yRadius;
    this.aStartAngle = source.aStartAngle;
    this.aEndAngle = source.aEndAngle;
    this.aClockwise = source.aClockwise;
    this.aRotation = source.aRotation;
    return this;
  };
  EllipseCurve.prototype.toJSON = function() {
    var data = Curve.prototype.toJSON.call(this);
    data.aX = this.aX;
    data.aY = this.aY;
    data.xRadius = this.xRadius;
    data.yRadius = this.yRadius;
    data.aStartAngle = this.aStartAngle;
    data.aEndAngle = this.aEndAngle;
    data.aClockwise = this.aClockwise;
    data.aRotation = this.aRotation;
    return data;
  };
  EllipseCurve.prototype.fromJSON = function(json) {
    Curve.prototype.fromJSON.call(this, json);
    this.aX = json.aX;
    this.aY = json.aY;
    this.xRadius = json.xRadius;
    this.yRadius = json.yRadius;
    this.aStartAngle = json.aStartAngle;
    this.aEndAngle = json.aEndAngle;
    this.aClockwise = json.aClockwise;
    this.aRotation = json.aRotation;
    return this;
  };
  function ArcCurve(aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise) {
    EllipseCurve.call(this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise);
    this.type = 'ArcCurve';
  }
  ArcCurve.prototype = Object.create(EllipseCurve.prototype);
  ArcCurve.prototype.constructor = ArcCurve;
  ArcCurve.prototype.isArcCurve = true;
  function CubicPoly() {
    var c0 = 0,
        c1 = 0,
        c2 = 0,
        c3 = 0;
    function init(x0, x1, t0, t1) {
      c0 = x0;
      c1 = t0;
      c2 = -3 * x0 + 3 * x1 - 2 * t0 - t1;
      c3 = 2 * x0 - 2 * x1 + t0 + t1;
    }
    return {
      initCatmullRom: function(x0, x1, x2, x3, tension) {
        init(x1, x2, tension * (x2 - x0), tension * (x3 - x1));
      },
      initNonuniformCatmullRom: function(x0, x1, x2, x3, dt0, dt1, dt2) {
        var t1 = (x1 - x0) / dt0 - (x2 - x0) / (dt0 + dt1) + (x2 - x1) / dt1;
        var t2 = (x2 - x1) / dt1 - (x3 - x1) / (dt1 + dt2) + (x3 - x2) / dt2;
        t1 *= dt1;
        t2 *= dt1;
        init(x1, x2, t1, t2);
      },
      calc: function(t) {
        var t2 = t * t;
        var t3 = t2 * t;
        return c0 + c1 * t + c2 * t2 + c3 * t3;
      }
    };
  }
  var tmp = new Vector3();
  var px = new CubicPoly(),
      py = new CubicPoly(),
      pz = new CubicPoly();
  function CatmullRomCurve3(points, closed, curveType, tension) {
    Curve.call(this);
    this.type = 'CatmullRomCurve3';
    this.points = points || [];
    this.closed = closed || false;
    this.curveType = curveType || 'centripetal';
    this.tension = tension || 0.5;
  }
  CatmullRomCurve3.prototype = Object.create(Curve.prototype);
  CatmullRomCurve3.prototype.constructor = CatmullRomCurve3;
  CatmullRomCurve3.prototype.isCatmullRomCurve3 = true;
  CatmullRomCurve3.prototype.getPoint = function(t, optionalTarget) {
    var point = optionalTarget || new Vector3();
    var points = this.points;
    var l = points.length;
    var p = (l - (this.closed ? 0 : 1)) * t;
    var intPoint = Math.floor(p);
    var weight = p - intPoint;
    if (this.closed) {
      intPoint += intPoint > 0 ? 0 : (Math.floor(Math.abs(intPoint) / l) + 1) * l;
    } else if (weight === 0 && intPoint === l - 1) {
      intPoint = l - 2;
      weight = 1;
    }
    var p0,
        p1,
        p2,
        p3;
    if (this.closed || intPoint > 0) {
      p0 = points[(intPoint - 1) % l];
    } else {
      tmp.subVectors(points[0], points[1]).add(points[0]);
      p0 = tmp;
    }
    p1 = points[intPoint % l];
    p2 = points[(intPoint + 1) % l];
    if (this.closed || intPoint + 2 < l) {
      p3 = points[(intPoint + 2) % l];
    } else {
      tmp.subVectors(points[l - 1], points[l - 2]).add(points[l - 1]);
      p3 = tmp;
    }
    if (this.curveType === 'centripetal' || this.curveType === 'chordal') {
      var pow = this.curveType === 'chordal' ? 0.5 : 0.25;
      var dt0 = Math.pow(p0.distanceToSquared(p1), pow);
      var dt1 = Math.pow(p1.distanceToSquared(p2), pow);
      var dt2 = Math.pow(p2.distanceToSquared(p3), pow);
      if (dt1 < 1e-4)
        dt1 = 1.0;
      if (dt0 < 1e-4)
        dt0 = dt1;
      if (dt2 < 1e-4)
        dt2 = dt1;
      px.initNonuniformCatmullRom(p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2);
      py.initNonuniformCatmullRom(p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2);
      pz.initNonuniformCatmullRom(p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2);
    } else if (this.curveType === 'catmullrom') {
      px.initCatmullRom(p0.x, p1.x, p2.x, p3.x, this.tension);
      py.initCatmullRom(p0.y, p1.y, p2.y, p3.y, this.tension);
      pz.initCatmullRom(p0.z, p1.z, p2.z, p3.z, this.tension);
    }
    point.set(px.calc(weight), py.calc(weight), pz.calc(weight));
    return point;
  };
  CatmullRomCurve3.prototype.copy = function(source) {
    Curve.prototype.copy.call(this, source);
    this.points = [];
    for (var i = 0,
        l = source.points.length; i < l; i++) {
      var point = source.points[i];
      this.points.push(point.clone());
    }
    this.closed = source.closed;
    this.curveType = source.curveType;
    this.tension = source.tension;
    return this;
  };
  CatmullRomCurve3.prototype.toJSON = function() {
    var data = Curve.prototype.toJSON.call(this);
    data.points = [];
    for (var i = 0,
        l = this.points.length; i < l; i++) {
      var point = this.points[i];
      data.points.push(point.toArray());
    }
    data.closed = this.closed;
    data.curveType = this.curveType;
    data.tension = this.tension;
    return data;
  };
  CatmullRomCurve3.prototype.fromJSON = function(json) {
    Curve.prototype.fromJSON.call(this, json);
    this.points = [];
    for (var i = 0,
        l = json.points.length; i < l; i++) {
      var point = json.points[i];
      this.points.push(new Vector3().fromArray(point));
    }
    this.closed = json.closed;
    this.curveType = json.curveType;
    this.tension = json.tension;
    return this;
  };
  function CatmullRom(t, p0, p1, p2, p3) {
    var v0 = (p2 - p0) * 0.5;
    var v1 = (p3 - p1) * 0.5;
    var t2 = t * t;
    var t3 = t * t2;
    return (2 * p1 - 2 * p2 + v0 + v1) * t3 + (-3 * p1 + 3 * p2 - 2 * v0 - v1) * t2 + v0 * t + p1;
  }
  function QuadraticBezierP0(t, p) {
    var k = 1 - t;
    return k * k * p;
  }
  function QuadraticBezierP1(t, p) {
    return 2 * (1 - t) * t * p;
  }
  function QuadraticBezierP2(t, p) {
    return t * t * p;
  }
  function QuadraticBezier(t, p0, p1, p2) {
    return QuadraticBezierP0(t, p0) + QuadraticBezierP1(t, p1) + QuadraticBezierP2(t, p2);
  }
  function CubicBezierP0(t, p) {
    var k = 1 - t;
    return k * k * k * p;
  }
  function CubicBezierP1(t, p) {
    var k = 1 - t;
    return 3 * k * k * t * p;
  }
  function CubicBezierP2(t, p) {
    return 3 * (1 - t) * t * t * p;
  }
  function CubicBezierP3(t, p) {
    return t * t * t * p;
  }
  function CubicBezier(t, p0, p1, p2, p3) {
    return CubicBezierP0(t, p0) + CubicBezierP1(t, p1) + CubicBezierP2(t, p2) + CubicBezierP3(t, p3);
  }
  function CubicBezierCurve(v0, v1, v2, v3) {
    Curve.call(this);
    this.type = 'CubicBezierCurve';
    this.v0 = v0 || new Vector2();
    this.v1 = v1 || new Vector2();
    this.v2 = v2 || new Vector2();
    this.v3 = v3 || new Vector2();
  }
  CubicBezierCurve.prototype = Object.create(Curve.prototype);
  CubicBezierCurve.prototype.constructor = CubicBezierCurve;
  CubicBezierCurve.prototype.isCubicBezierCurve = true;
  CubicBezierCurve.prototype.getPoint = function(t, optionalTarget) {
    var point = optionalTarget || new Vector2();
    var v0 = this.v0,
        v1 = this.v1,
        v2 = this.v2,
        v3 = this.v3;
    point.set(CubicBezier(t, v0.x, v1.x, v2.x, v3.x), CubicBezier(t, v0.y, v1.y, v2.y, v3.y));
    return point;
  };
  CubicBezierCurve.prototype.copy = function(source) {
    Curve.prototype.copy.call(this, source);
    this.v0.copy(source.v0);
    this.v1.copy(source.v1);
    this.v2.copy(source.v2);
    this.v3.copy(source.v3);
    return this;
  };
  CubicBezierCurve.prototype.toJSON = function() {
    var data = Curve.prototype.toJSON.call(this);
    data.v0 = this.v0.toArray();
    data.v1 = this.v1.toArray();
    data.v2 = this.v2.toArray();
    data.v3 = this.v3.toArray();
    return data;
  };
  CubicBezierCurve.prototype.fromJSON = function(json) {
    Curve.prototype.fromJSON.call(this, json);
    this.v0.fromArray(json.v0);
    this.v1.fromArray(json.v1);
    this.v2.fromArray(json.v2);
    this.v3.fromArray(json.v3);
    return this;
  };
  function CubicBezierCurve3(v0, v1, v2, v3) {
    Curve.call(this);
    this.type = 'CubicBezierCurve3';
    this.v0 = v0 || new Vector3();
    this.v1 = v1 || new Vector3();
    this.v2 = v2 || new Vector3();
    this.v3 = v3 || new Vector3();
  }
  CubicBezierCurve3.prototype = Object.create(Curve.prototype);
  CubicBezierCurve3.prototype.constructor = CubicBezierCurve3;
  CubicBezierCurve3.prototype.isCubicBezierCurve3 = true;
  CubicBezierCurve3.prototype.getPoint = function(t, optionalTarget) {
    var point = optionalTarget || new Vector3();
    var v0 = this.v0,
        v1 = this.v1,
        v2 = this.v2,
        v3 = this.v3;
    point.set(CubicBezier(t, v0.x, v1.x, v2.x, v3.x), CubicBezier(t, v0.y, v1.y, v2.y, v3.y), CubicBezier(t, v0.z, v1.z, v2.z, v3.z));
    return point;
  };
  CubicBezierCurve3.prototype.copy = function(source) {
    Curve.prototype.copy.call(this, source);
    this.v0.copy(source.v0);
    this.v1.copy(source.v1);
    this.v2.copy(source.v2);
    this.v3.copy(source.v3);
    return this;
  };
  CubicBezierCurve3.prototype.toJSON = function() {
    var data = Curve.prototype.toJSON.call(this);
    data.v0 = this.v0.toArray();
    data.v1 = this.v1.toArray();
    data.v2 = this.v2.toArray();
    data.v3 = this.v3.toArray();
    return data;
  };
  CubicBezierCurve3.prototype.fromJSON = function(json) {
    Curve.prototype.fromJSON.call(this, json);
    this.v0.fromArray(json.v0);
    this.v1.fromArray(json.v1);
    this.v2.fromArray(json.v2);
    this.v3.fromArray(json.v3);
    return this;
  };
  function LineCurve(v1, v2) {
    Curve.call(this);
    this.type = 'LineCurve';
    this.v1 = v1 || new Vector2();
    this.v2 = v2 || new Vector2();
  }
  LineCurve.prototype = Object.create(Curve.prototype);
  LineCurve.prototype.constructor = LineCurve;
  LineCurve.prototype.isLineCurve = true;
  LineCurve.prototype.getPoint = function(t, optionalTarget) {
    var point = optionalTarget || new Vector2();
    if (t === 1) {
      point.copy(this.v2);
    } else {
      point.copy(this.v2).sub(this.v1);
      point.multiplyScalar(t).add(this.v1);
    }
    return point;
  };
  LineCurve.prototype.getPointAt = function(u, optionalTarget) {
    return this.getPoint(u, optionalTarget);
  };
  LineCurve.prototype.getTangent = function() {
    var tangent = this.v2.clone().sub(this.v1);
    return tangent.normalize();
  };
  LineCurve.prototype.copy = function(source) {
    Curve.prototype.copy.call(this, source);
    this.v1.copy(source.v1);
    this.v2.copy(source.v2);
    return this;
  };
  LineCurve.prototype.toJSON = function() {
    var data = Curve.prototype.toJSON.call(this);
    data.v1 = this.v1.toArray();
    data.v2 = this.v2.toArray();
    return data;
  };
  LineCurve.prototype.fromJSON = function(json) {
    Curve.prototype.fromJSON.call(this, json);
    this.v1.fromArray(json.v1);
    this.v2.fromArray(json.v2);
    return this;
  };
  function LineCurve3(v1, v2) {
    Curve.call(this);
    this.type = 'LineCurve3';
    this.v1 = v1 || new Vector3();
    this.v2 = v2 || new Vector3();
  }
  LineCurve3.prototype = Object.create(Curve.prototype);
  LineCurve3.prototype.constructor = LineCurve3;
  LineCurve3.prototype.isLineCurve3 = true;
  LineCurve3.prototype.getPoint = function(t, optionalTarget) {
    var point = optionalTarget || new Vector3();
    if (t === 1) {
      point.copy(this.v2);
    } else {
      point.copy(this.v2).sub(this.v1);
      point.multiplyScalar(t).add(this.v1);
    }
    return point;
  };
  LineCurve3.prototype.getPointAt = function(u, optionalTarget) {
    return this.getPoint(u, optionalTarget);
  };
  LineCurve3.prototype.copy = function(source) {
    Curve.prototype.copy.call(this, source);
    this.v1.copy(source.v1);
    this.v2.copy(source.v2);
    return this;
  };
  LineCurve3.prototype.toJSON = function() {
    var data = Curve.prototype.toJSON.call(this);
    data.v1 = this.v1.toArray();
    data.v2 = this.v2.toArray();
    return data;
  };
  LineCurve3.prototype.fromJSON = function(json) {
    Curve.prototype.fromJSON.call(this, json);
    this.v1.fromArray(json.v1);
    this.v2.fromArray(json.v2);
    return this;
  };
  function QuadraticBezierCurve(v0, v1, v2) {
    Curve.call(this);
    this.type = 'QuadraticBezierCurve';
    this.v0 = v0 || new Vector2();
    this.v1 = v1 || new Vector2();
    this.v2 = v2 || new Vector2();
  }
  QuadraticBezierCurve.prototype = Object.create(Curve.prototype);
  QuadraticBezierCurve.prototype.constructor = QuadraticBezierCurve;
  QuadraticBezierCurve.prototype.isQuadraticBezierCurve = true;
  QuadraticBezierCurve.prototype.getPoint = function(t, optionalTarget) {
    var point = optionalTarget || new Vector2();
    var v0 = this.v0,
        v1 = this.v1,
        v2 = this.v2;
    point.set(QuadraticBezier(t, v0.x, v1.x, v2.x), QuadraticBezier(t, v0.y, v1.y, v2.y));
    return point;
  };
  QuadraticBezierCurve.prototype.copy = function(source) {
    Curve.prototype.copy.call(this, source);
    this.v0.copy(source.v0);
    this.v1.copy(source.v1);
    this.v2.copy(source.v2);
    return this;
  };
  QuadraticBezierCurve.prototype.toJSON = function() {
    var data = Curve.prototype.toJSON.call(this);
    data.v0 = this.v0.toArray();
    data.v1 = this.v1.toArray();
    data.v2 = this.v2.toArray();
    return data;
  };
  QuadraticBezierCurve.prototype.fromJSON = function(json) {
    Curve.prototype.fromJSON.call(this, json);
    this.v0.fromArray(json.v0);
    this.v1.fromArray(json.v1);
    this.v2.fromArray(json.v2);
    return this;
  };
  function QuadraticBezierCurve3(v0, v1, v2) {
    Curve.call(this);
    this.type = 'QuadraticBezierCurve3';
    this.v0 = v0 || new Vector3();
    this.v1 = v1 || new Vector3();
    this.v2 = v2 || new Vector3();
  }
  QuadraticBezierCurve3.prototype = Object.create(Curve.prototype);
  QuadraticBezierCurve3.prototype.constructor = QuadraticBezierCurve3;
  QuadraticBezierCurve3.prototype.isQuadraticBezierCurve3 = true;
  QuadraticBezierCurve3.prototype.getPoint = function(t, optionalTarget) {
    var point = optionalTarget || new Vector3();
    var v0 = this.v0,
        v1 = this.v1,
        v2 = this.v2;
    point.set(QuadraticBezier(t, v0.x, v1.x, v2.x), QuadraticBezier(t, v0.y, v1.y, v2.y), QuadraticBezier(t, v0.z, v1.z, v2.z));
    return point;
  };
  QuadraticBezierCurve3.prototype.copy = function(source) {
    Curve.prototype.copy.call(this, source);
    this.v0.copy(source.v0);
    this.v1.copy(source.v1);
    this.v2.copy(source.v2);
    return this;
  };
  QuadraticBezierCurve3.prototype.toJSON = function() {
    var data = Curve.prototype.toJSON.call(this);
    data.v0 = this.v0.toArray();
    data.v1 = this.v1.toArray();
    data.v2 = this.v2.toArray();
    return data;
  };
  QuadraticBezierCurve3.prototype.fromJSON = function(json) {
    Curve.prototype.fromJSON.call(this, json);
    this.v0.fromArray(json.v0);
    this.v1.fromArray(json.v1);
    this.v2.fromArray(json.v2);
    return this;
  };
  function SplineCurve(points) {
    Curve.call(this);
    this.type = 'SplineCurve';
    this.points = points || [];
  }
  SplineCurve.prototype = Object.create(Curve.prototype);
  SplineCurve.prototype.constructor = SplineCurve;
  SplineCurve.prototype.isSplineCurve = true;
  SplineCurve.prototype.getPoint = function(t, optionalTarget) {
    var point = optionalTarget || new Vector2();
    var points = this.points;
    var p = (points.length - 1) * t;
    var intPoint = Math.floor(p);
    var weight = p - intPoint;
    var p0 = points[intPoint === 0 ? intPoint : intPoint - 1];
    var p1 = points[intPoint];
    var p2 = points[intPoint > points.length - 2 ? points.length - 1 : intPoint + 1];
    var p3 = points[intPoint > points.length - 3 ? points.length - 1 : intPoint + 2];
    point.set(CatmullRom(weight, p0.x, p1.x, p2.x, p3.x), CatmullRom(weight, p0.y, p1.y, p2.y, p3.y));
    return point;
  };
  SplineCurve.prototype.copy = function(source) {
    Curve.prototype.copy.call(this, source);
    this.points = [];
    for (var i = 0,
        l = source.points.length; i < l; i++) {
      var point = source.points[i];
      this.points.push(point.clone());
    }
    return this;
  };
  SplineCurve.prototype.toJSON = function() {
    var data = Curve.prototype.toJSON.call(this);
    data.points = [];
    for (var i = 0,
        l = this.points.length; i < l; i++) {
      var point = this.points[i];
      data.points.push(point.toArray());
    }
    return data;
  };
  SplineCurve.prototype.fromJSON = function(json) {
    Curve.prototype.fromJSON.call(this, json);
    this.points = [];
    for (var i = 0,
        l = json.points.length; i < l; i++) {
      var point = json.points[i];
      this.points.push(new Vector2().fromArray(point));
    }
    return this;
  };
  var Curves = Object.freeze({
    ArcCurve: ArcCurve,
    CatmullRomCurve3: CatmullRomCurve3,
    CubicBezierCurve: CubicBezierCurve,
    CubicBezierCurve3: CubicBezierCurve3,
    EllipseCurve: EllipseCurve,
    LineCurve: LineCurve,
    LineCurve3: LineCurve3,
    QuadraticBezierCurve: QuadraticBezierCurve,
    QuadraticBezierCurve3: QuadraticBezierCurve3,
    SplineCurve: SplineCurve
  });
  function CurvePath() {
    Curve.call(this);
    this.type = 'CurvePath';
    this.curves = [];
    this.autoClose = false;
  }
  CurvePath.prototype = Object.assign(Object.create(Curve.prototype), {
    constructor: CurvePath,
    add: function(curve) {
      this.curves.push(curve);
    },
    closePath: function() {
      var startPoint = this.curves[0].getPoint(0);
      var endPoint = this.curves[this.curves.length - 1].getPoint(1);
      if (!startPoint.equals(endPoint)) {
        this.curves.push(new LineCurve(endPoint, startPoint));
      }
    },
    getPoint: function(t) {
      var d = t * this.getLength();
      var curveLengths = this.getCurveLengths();
      var i = 0;
      while (i < curveLengths.length) {
        if (curveLengths[i] >= d) {
          var diff = curveLengths[i] - d;
          var curve = this.curves[i];
          var segmentLength = curve.getLength();
          var u = segmentLength === 0 ? 0 : 1 - diff / segmentLength;
          return curve.getPointAt(u);
        }
        i++;
      }
      return null;
    },
    getLength: function() {
      var lens = this.getCurveLengths();
      return lens[lens.length - 1];
    },
    updateArcLengths: function() {
      this.needsUpdate = true;
      this.cacheLengths = null;
      this.getCurveLengths();
    },
    getCurveLengths: function() {
      if (this.cacheLengths && this.cacheLengths.length === this.curves.length) {
        return this.cacheLengths;
      }
      var lengths = [],
          sums = 0;
      for (var i = 0,
          l = this.curves.length; i < l; i++) {
        sums += this.curves[i].getLength();
        lengths.push(sums);
      }
      this.cacheLengths = lengths;
      return lengths;
    },
    getSpacedPoints: function(divisions) {
      if (divisions === undefined)
        divisions = 40;
      var points = [];
      for (var i = 0; i <= divisions; i++) {
        points.push(this.getPoint(i / divisions));
      }
      if (this.autoClose) {
        points.push(points[0]);
      }
      return points;
    },
    getPoints: function(divisions) {
      divisions = divisions || 12;
      var points = [],
          last;
      for (var i = 0,
          curves = this.curves; i < curves.length; i++) {
        var curve = curves[i];
        var resolution = (curve && curve.isEllipseCurve) ? divisions * 2 : (curve && (curve.isLineCurve || curve.isLineCurve3)) ? 1 : (curve && curve.isSplineCurve) ? divisions * curve.points.length : divisions;
        var pts = curve.getPoints(resolution);
        for (var j = 0; j < pts.length; j++) {
          var point = pts[j];
          if (last && last.equals(point))
            continue;
          points.push(point);
          last = point;
        }
      }
      if (this.autoClose && points.length > 1 && !points[points.length - 1].equals(points[0])) {
        points.push(points[0]);
      }
      return points;
    },
    copy: function(source) {
      Curve.prototype.copy.call(this, source);
      this.curves = [];
      for (var i = 0,
          l = source.curves.length; i < l; i++) {
        var curve = source.curves[i];
        this.curves.push(curve.clone());
      }
      this.autoClose = source.autoClose;
      return this;
    },
    toJSON: function() {
      var data = Curve.prototype.toJSON.call(this);
      data.autoClose = this.autoClose;
      data.curves = [];
      for (var i = 0,
          l = this.curves.length; i < l; i++) {
        var curve = this.curves[i];
        data.curves.push(curve.toJSON());
      }
      return data;
    },
    fromJSON: function(json) {
      Curve.prototype.fromJSON.call(this, json);
      this.autoClose = json.autoClose;
      this.curves = [];
      for (var i = 0,
          l = json.curves.length; i < l; i++) {
        var curve = json.curves[i];
        this.curves.push(new Curves[curve.type]().fromJSON(curve));
      }
      return this;
    }
  });
  function Path(points) {
    CurvePath.call(this);
    this.type = 'Path';
    this.currentPoint = new Vector2();
    if (points) {
      this.setFromPoints(points);
    }
  }
  Path.prototype = Object.assign(Object.create(CurvePath.prototype), {
    constructor: Path,
    setFromPoints: function(points) {
      this.moveTo(points[0].x, points[0].y);
      for (var i = 1,
          l = points.length; i < l; i++) {
        this.lineTo(points[i].x, points[i].y);
      }
    },
    moveTo: function(x, y) {
      this.currentPoint.set(x, y);
    },
    lineTo: function(x, y) {
      var curve = new LineCurve(this.currentPoint.clone(), new Vector2(x, y));
      this.curves.push(curve);
      this.currentPoint.set(x, y);
    },
    quadraticCurveTo: function(aCPx, aCPy, aX, aY) {
      var curve = new QuadraticBezierCurve(this.currentPoint.clone(), new Vector2(aCPx, aCPy), new Vector2(aX, aY));
      this.curves.push(curve);
      this.currentPoint.set(aX, aY);
    },
    bezierCurveTo: function(aCP1x, aCP1y, aCP2x, aCP2y, aX, aY) {
      var curve = new CubicBezierCurve(this.currentPoint.clone(), new Vector2(aCP1x, aCP1y), new Vector2(aCP2x, aCP2y), new Vector2(aX, aY));
      this.curves.push(curve);
      this.currentPoint.set(aX, aY);
    },
    splineThru: function(pts) {
      var npts = [this.currentPoint.clone()].concat(pts);
      var curve = new SplineCurve(npts);
      this.curves.push(curve);
      this.currentPoint.copy(pts[pts.length - 1]);
    },
    arc: function(aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise) {
      var x0 = this.currentPoint.x;
      var y0 = this.currentPoint.y;
      this.absarc(aX + x0, aY + y0, aRadius, aStartAngle, aEndAngle, aClockwise);
    },
    absarc: function(aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise) {
      this.absellipse(aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise);
    },
    ellipse: function(aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation) {
      var x0 = this.currentPoint.x;
      var y0 = this.currentPoint.y;
      this.absellipse(aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation);
    },
    absellipse: function(aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation) {
      var curve = new EllipseCurve(aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation);
      if (this.curves.length > 0) {
        var firstPoint = curve.getPoint(0);
        if (!firstPoint.equals(this.currentPoint)) {
          this.lineTo(firstPoint.x, firstPoint.y);
        }
      }
      this.curves.push(curve);
      var lastPoint = curve.getPoint(1);
      this.currentPoint.copy(lastPoint);
    },
    copy: function(source) {
      CurvePath.prototype.copy.call(this, source);
      this.currentPoint.copy(source.currentPoint);
      return this;
    },
    toJSON: function() {
      var data = CurvePath.prototype.toJSON.call(this);
      data.currentPoint = this.currentPoint.toArray();
      return data;
    },
    fromJSON: function(json) {
      CurvePath.prototype.fromJSON.call(this, json);
      this.currentPoint.fromArray(json.currentPoint);
      return this;
    }
  });
  function Shape(points) {
    Path.call(this, points);
    this.uuid = _Math.generateUUID();
    this.type = 'Shape';
    this.holes = [];
  }
  Shape.prototype = Object.assign(Object.create(Path.prototype), {
    constructor: Shape,
    getPointsHoles: function(divisions) {
      var holesPts = [];
      for (var i = 0,
          l = this.holes.length; i < l; i++) {
        holesPts[i] = this.holes[i].getPoints(divisions);
      }
      return holesPts;
    },
    extractPoints: function(divisions) {
      return {
        shape: this.getPoints(divisions),
        holes: this.getPointsHoles(divisions)
      };
    },
    copy: function(source) {
      Path.prototype.copy.call(this, source);
      this.holes = [];
      for (var i = 0,
          l = source.holes.length; i < l; i++) {
        var hole = source.holes[i];
        this.holes.push(hole.clone());
      }
      return this;
    },
    toJSON: function() {
      var data = Path.prototype.toJSON.call(this);
      data.uuid = this.uuid;
      data.holes = [];
      for (var i = 0,
          l = this.holes.length; i < l; i++) {
        var hole = this.holes[i];
        data.holes.push(hole.toJSON());
      }
      return data;
    },
    fromJSON: function(json) {
      Path.prototype.fromJSON.call(this, json);
      this.uuid = json.uuid;
      this.holes = [];
      for (var i = 0,
          l = json.holes.length; i < l; i++) {
        var hole = json.holes[i];
        this.holes.push(new Path().fromJSON(hole));
      }
      return this;
    }
  });
  function Light(color, intensity) {
    Object3D.call(this);
    this.type = 'Light';
    this.color = new Color(color);
    this.intensity = intensity !== undefined ? intensity : 1;
    this.receiveShadow = undefined;
  }
  Light.prototype = Object.assign(Object.create(Object3D.prototype), {
    constructor: Light,
    isLight: true,
    copy: function(source) {
      Object3D.prototype.copy.call(this, source);
      this.color.copy(source.color);
      this.intensity = source.intensity;
      return this;
    },
    toJSON: function(meta) {
      var data = Object3D.prototype.toJSON.call(this, meta);
      data.object.color = this.color.getHex();
      data.object.intensity = this.intensity;
      if (this.groundColor !== undefined)
        data.object.groundColor = this.groundColor.getHex();
      if (this.distance !== undefined)
        data.object.distance = this.distance;
      if (this.angle !== undefined)
        data.object.angle = this.angle;
      if (this.decay !== undefined)
        data.object.decay = this.decay;
      if (this.penumbra !== undefined)
        data.object.penumbra = this.penumbra;
      if (this.shadow !== undefined)
        data.object.shadow = this.shadow.toJSON();
      return data;
    }
  });
  function HemisphereLight(skyColor, groundColor, intensity) {
    Light.call(this, skyColor, intensity);
    this.type = 'HemisphereLight';
    this.castShadow = undefined;
    this.position.copy(Object3D.DefaultUp);
    this.updateMatrix();
    this.groundColor = new Color(groundColor);
  }
  HemisphereLight.prototype = Object.assign(Object.create(Light.prototype), {
    constructor: HemisphereLight,
    isHemisphereLight: true,
    copy: function(source) {
      Light.prototype.copy.call(this, source);
      this.groundColor.copy(source.groundColor);
      return this;
    }
  });
  function LightShadow(camera) {
    this.camera = camera;
    this.bias = 0;
    this.radius = 1;
    this.mapSize = new Vector2(512, 512);
    this.map = null;
    this.matrix = new Matrix4();
  }
  Object.assign(LightShadow.prototype, {
    copy: function(source) {
      this.camera = source.camera.clone();
      this.bias = source.bias;
      this.radius = source.radius;
      this.mapSize.copy(source.mapSize);
      return this;
    },
    clone: function() {
      return new this.constructor().copy(this);
    },
    toJSON: function() {
      var object = {};
      if (this.bias !== 0)
        object.bias = this.bias;
      if (this.radius !== 1)
        object.radius = this.radius;
      if (this.mapSize.x !== 512 || this.mapSize.y !== 512)
        object.mapSize = this.mapSize.toArray();
      object.camera = this.camera.toJSON(false).object;
      delete object.camera.matrix;
      return object;
    }
  });
  function SpotLightShadow() {
    LightShadow.call(this, new PerspectiveCamera(50, 1, 0.5, 500));
  }
  SpotLightShadow.prototype = Object.assign(Object.create(LightShadow.prototype), {
    constructor: SpotLightShadow,
    isSpotLightShadow: true,
    update: function(light) {
      var camera = this.camera;
      var fov = _Math.RAD2DEG * 2 * light.angle;
      var aspect = this.mapSize.width / this.mapSize.height;
      var far = light.distance || camera.far;
      if (fov !== camera.fov || aspect !== camera.aspect || far !== camera.far) {
        camera.fov = fov;
        camera.aspect = aspect;
        camera.far = far;
        camera.updateProjectionMatrix();
      }
    }
  });
  function SpotLight(color, intensity, distance, angle, penumbra, decay) {
    Light.call(this, color, intensity);
    this.type = 'SpotLight';
    this.position.copy(Object3D.DefaultUp);
    this.updateMatrix();
    this.target = new Object3D();
    Object.defineProperty(this, 'power', {
      get: function() {
        return this.intensity * Math.PI;
      },
      set: function(power) {
        this.intensity = power / Math.PI;
      }
    });
    this.distance = (distance !== undefined) ? distance : 0;
    this.angle = (angle !== undefined) ? angle : Math.PI / 3;
    this.penumbra = (penumbra !== undefined) ? penumbra : 0;
    this.decay = (decay !== undefined) ? decay : 1;
    this.shadow = new SpotLightShadow();
  }
  SpotLight.prototype = Object.assign(Object.create(Light.prototype), {
    constructor: SpotLight,
    isSpotLight: true,
    copy: function(source) {
      Light.prototype.copy.call(this, source);
      this.distance = source.distance;
      this.angle = source.angle;
      this.penumbra = source.penumbra;
      this.decay = source.decay;
      this.target = source.target.clone();
      this.shadow = source.shadow.clone();
      return this;
    }
  });
  function PointLight(color, intensity, distance, decay) {
    Light.call(this, color, intensity);
    this.type = 'PointLight';
    Object.defineProperty(this, 'power', {
      get: function() {
        return this.intensity * 4 * Math.PI;
      },
      set: function(power) {
        this.intensity = power / (4 * Math.PI);
      }
    });
    this.distance = (distance !== undefined) ? distance : 0;
    this.decay = (decay !== undefined) ? decay : 1;
    this.shadow = new LightShadow(new PerspectiveCamera(90, 1, 0.5, 500));
  }
  PointLight.prototype = Object.assign(Object.create(Light.prototype), {
    constructor: PointLight,
    isPointLight: true,
    copy: function(source) {
      Light.prototype.copy.call(this, source);
      this.distance = source.distance;
      this.decay = source.decay;
      this.shadow = source.shadow.clone();
      return this;
    }
  });
  function OrthographicCamera(left, right, top, bottom, near, far) {
    Camera.call(this);
    this.type = 'OrthographicCamera';
    this.zoom = 1;
    this.view = null;
    this.left = (left !== undefined) ? left : -1;
    this.right = (right !== undefined) ? right : 1;
    this.top = (top !== undefined) ? top : 1;
    this.bottom = (bottom !== undefined) ? bottom : -1;
    this.near = (near !== undefined) ? near : 0.1;
    this.far = (far !== undefined) ? far : 2000;
    this.updateProjectionMatrix();
  }
  OrthographicCamera.prototype = Object.assign(Object.create(Camera.prototype), {
    constructor: OrthographicCamera,
    isOrthographicCamera: true,
    copy: function(source, recursive) {
      Camera.prototype.copy.call(this, source, recursive);
      this.left = source.left;
      this.right = source.right;
      this.top = source.top;
      this.bottom = source.bottom;
      this.near = source.near;
      this.far = source.far;
      this.zoom = source.zoom;
      this.view = source.view === null ? null : Object.assign({}, source.view);
      return this;
    },
    setViewOffset: function(fullWidth, fullHeight, x, y, width, height) {
      if (this.view === null) {
        this.view = {
          enabled: true,
          fullWidth: 1,
          fullHeight: 1,
          offsetX: 0,
          offsetY: 0,
          width: 1,
          height: 1
        };
      }
      this.view.enabled = true;
      this.view.fullWidth = fullWidth;
      this.view.fullHeight = fullHeight;
      this.view.offsetX = x;
      this.view.offsetY = y;
      this.view.width = width;
      this.view.height = height;
      this.updateProjectionMatrix();
    },
    clearViewOffset: function() {
      if (this.view !== null) {
        this.view.enabled = false;
      }
      this.updateProjectionMatrix();
    },
    updateProjectionMatrix: function() {
      var dx = (this.right - this.left) / (2 * this.zoom);
      var dy = (this.top - this.bottom) / (2 * this.zoom);
      var cx = (this.right + this.left) / 2;
      var cy = (this.top + this.bottom) / 2;
      var left = cx - dx;
      var right = cx + dx;
      var top = cy + dy;
      var bottom = cy - dy;
      if (this.view !== null && this.view.enabled) {
        var zoomW = this.zoom / (this.view.width / this.view.fullWidth);
        var zoomH = this.zoom / (this.view.height / this.view.fullHeight);
        var scaleW = (this.right - this.left) / this.view.width;
        var scaleH = (this.top - this.bottom) / this.view.height;
        left += scaleW * (this.view.offsetX / zoomW);
        right = left + scaleW * (this.view.width / zoomW);
        top -= scaleH * (this.view.offsetY / zoomH);
        bottom = top - scaleH * (this.view.height / zoomH);
      }
      this.projectionMatrix.makeOrthographic(left, right, top, bottom, this.near, this.far);
      this.projectionMatrixInverse.getInverse(this.projectionMatrix);
    },
    toJSON: function(meta) {
      var data = Object3D.prototype.toJSON.call(this, meta);
      data.object.zoom = this.zoom;
      data.object.left = this.left;
      data.object.right = this.right;
      data.object.top = this.top;
      data.object.bottom = this.bottom;
      data.object.near = this.near;
      data.object.far = this.far;
      if (this.view !== null)
        data.object.view = Object.assign({}, this.view);
      return data;
    }
  });
  function DirectionalLightShadow() {
    LightShadow.call(this, new OrthographicCamera(-5, 5, 5, -5, 0.5, 500));
  }
  DirectionalLightShadow.prototype = Object.assign(Object.create(LightShadow.prototype), {constructor: DirectionalLightShadow});
  function DirectionalLight(color, intensity) {
    Light.call(this, color, intensity);
    this.type = 'DirectionalLight';
    this.position.copy(Object3D.DefaultUp);
    this.updateMatrix();
    this.target = new Object3D();
    this.shadow = new DirectionalLightShadow();
  }
  DirectionalLight.prototype = Object.assign(Object.create(Light.prototype), {
    constructor: DirectionalLight,
    isDirectionalLight: true,
    copy: function(source) {
      Light.prototype.copy.call(this, source);
      this.target = source.target.clone();
      this.shadow = source.shadow.clone();
      return this;
    }
  });
  function AmbientLight(color, intensity) {
    Light.call(this, color, intensity);
    this.type = 'AmbientLight';
    this.castShadow = undefined;
  }
  AmbientLight.prototype = Object.assign(Object.create(Light.prototype), {
    constructor: AmbientLight,
    isAmbientLight: true
  });
  function RectAreaLight(color, intensity, width, height) {
    Light.call(this, color, intensity);
    this.type = 'RectAreaLight';
    this.width = (width !== undefined) ? width : 10;
    this.height = (height !== undefined) ? height : 10;
  }
  RectAreaLight.prototype = Object.assign(Object.create(Light.prototype), {
    constructor: RectAreaLight,
    isRectAreaLight: true,
    copy: function(source) {
      Light.prototype.copy.call(this, source);
      this.width = source.width;
      this.height = source.height;
      return this;
    },
    toJSON: function(meta) {
      var data = Light.prototype.toJSON.call(this, meta);
      data.object.width = this.width;
      data.object.height = this.height;
      return data;
    }
  });
  function MaterialLoader(manager) {
    this.manager = (manager !== undefined) ? manager : DefaultLoadingManager;
    this.textures = {};
  }
  Object.assign(MaterialLoader.prototype, {
    load: function(url, onLoad, onProgress, onError) {
      var scope = this;
      var loader = new FileLoader(scope.manager);
      loader.setPath(scope.path);
      loader.load(url, function(text) {
        onLoad(scope.parse(JSON.parse(text)));
      }, onProgress, onError);
    },
    parse: function(json) {
      var textures = this.textures;
      function getTexture(name) {
        if (textures[name] === undefined) {
          console.warn('THREE.MaterialLoader: Undefined texture', name);
        }
        return textures[name];
      }
      var material = new Materials[json.type]();
      if (json.uuid !== undefined)
        material.uuid = json.uuid;
      if (json.name !== undefined)
        material.name = json.name;
      if (json.color !== undefined)
        material.color.setHex(json.color);
      if (json.roughness !== undefined)
        material.roughness = json.roughness;
      if (json.metalness !== undefined)
        material.metalness = json.metalness;
      if (json.emissive !== undefined)
        material.emissive.setHex(json.emissive);
      if (json.specular !== undefined)
        material.specular.setHex(json.specular);
      if (json.shininess !== undefined)
        material.shininess = json.shininess;
      if (json.clearCoat !== undefined)
        material.clearCoat = json.clearCoat;
      if (json.clearCoatRoughness !== undefined)
        material.clearCoatRoughness = json.clearCoatRoughness;
      if (json.vertexColors !== undefined)
        material.vertexColors = json.vertexColors;
      if (json.fog !== undefined)
        material.fog = json.fog;
      if (json.flatShading !== undefined)
        material.flatShading = json.flatShading;
      if (json.blending !== undefined)
        material.blending = json.blending;
      if (json.combine !== undefined)
        material.combine = json.combine;
      if (json.side !== undefined)
        material.side = json.side;
      if (json.opacity !== undefined)
        material.opacity = json.opacity;
      if (json.transparent !== undefined)
        material.transparent = json.transparent;
      if (json.alphaTest !== undefined)
        material.alphaTest = json.alphaTest;
      if (json.depthTest !== undefined)
        material.depthTest = json.depthTest;
      if (json.depthWrite !== undefined)
        material.depthWrite = json.depthWrite;
      if (json.colorWrite !== undefined)
        material.colorWrite = json.colorWrite;
      if (json.wireframe !== undefined)
        material.wireframe = json.wireframe;
      if (json.wireframeLinewidth !== undefined)
        material.wireframeLinewidth = json.wireframeLinewidth;
      if (json.wireframeLinecap !== undefined)
        material.wireframeLinecap = json.wireframeLinecap;
      if (json.wireframeLinejoin !== undefined)
        material.wireframeLinejoin = json.wireframeLinejoin;
      if (json.rotation !== undefined)
        material.rotation = json.rotation;
      if (json.linewidth !== 1)
        material.linewidth = json.linewidth;
      if (json.dashSize !== undefined)
        material.dashSize = json.dashSize;
      if (json.gapSize !== undefined)
        material.gapSize = json.gapSize;
      if (json.scale !== undefined)
        material.scale = json.scale;
      if (json.polygonOffset !== undefined)
        material.polygonOffset = json.polygonOffset;
      if (json.polygonOffsetFactor !== undefined)
        material.polygonOffsetFactor = json.polygonOffsetFactor;
      if (json.polygonOffsetUnits !== undefined)
        material.polygonOffsetUnits = json.polygonOffsetUnits;
      if (json.skinning !== undefined)
        material.skinning = json.skinning;
      if (json.morphTargets !== undefined)
        material.morphTargets = json.morphTargets;
      if (json.dithering !== undefined)
        material.dithering = json.dithering;
      if (json.visible !== undefined)
        material.visible = json.visible;
      if (json.userData !== undefined)
        material.userData = json.userData;
      if (json.uniforms !== undefined) {
        for (var name in json.uniforms) {
          var uniform = json.uniforms[name];
          material.uniforms[name] = {};
          switch (uniform.type) {
            case 't':
              material.uniforms[name].value = getTexture(uniform.value);
              break;
            case 'c':
              material.uniforms[name].value = new Color().setHex(uniform.value);
              break;
            case 'v2':
              material.uniforms[name].value = new Vector2().fromArray(uniform.value);
              break;
            case 'v3':
              material.uniforms[name].value = new Vector3().fromArray(uniform.value);
              break;
            case 'v4':
              material.uniforms[name].value = new Vector4().fromArray(uniform.value);
              break;
            case 'm3':
              material.uniforms[name].value = new Matrix3().fromArray(uniform.value);
            case 'm4':
              material.uniforms[name].value = new Matrix4().fromArray(uniform.value);
              break;
            default:
              material.uniforms[name].value = uniform.value;
          }
        }
      }
      if (json.defines !== undefined)
        material.defines = json.defines;
      if (json.vertexShader !== undefined)
        material.vertexShader = json.vertexShader;
      if (json.fragmentShader !== undefined)
        material.fragmentShader = json.fragmentShader;
      if (json.extensions !== undefined) {
        for (var key in json.extensions) {
          material.extensions[key] = json.extensions[key];
        }
      }
      if (json.shading !== undefined)
        material.flatShading = json.shading === 1;
      if (json.size !== undefined)
        material.size = json.size;
      if (json.sizeAttenuation !== undefined)
        material.sizeAttenuation = json.sizeAttenuation;
      if (json.map !== undefined)
        material.map = getTexture(json.map);
      if (json.alphaMap !== undefined) {
        material.alphaMap = getTexture(json.alphaMap);
        material.transparent = true;
      }
      if (json.bumpMap !== undefined)
        material.bumpMap = getTexture(json.bumpMap);
      if (json.bumpScale !== undefined)
        material.bumpScale = json.bumpScale;
      if (json.normalMap !== undefined)
        material.normalMap = getTexture(json.normalMap);
      if (json.normalMapType !== undefined)
        material.normalMapType = json.normalMapType;
      if (json.normalScale !== undefined) {
        var normalScale = json.normalScale;
        if (Array.isArray(normalScale) === false) {
          normalScale = [normalScale, normalScale];
        }
        material.normalScale = new Vector2().fromArray(normalScale);
      }
      if (json.displacementMap !== undefined)
        material.displacementMap = getTexture(json.displacementMap);
      if (json.displacementScale !== undefined)
        material.displacementScale = json.displacementScale;
      if (json.displacementBias !== undefined)
        material.displacementBias = json.displacementBias;
      if (json.roughnessMap !== undefined)
        material.roughnessMap = getTexture(json.roughnessMap);
      if (json.metalnessMap !== undefined)
        material.metalnessMap = getTexture(json.metalnessMap);
      if (json.emissiveMap !== undefined)
        material.emissiveMap = getTexture(json.emissiveMap);
      if (json.emissiveIntensity !== undefined)
        material.emissiveIntensity = json.emissiveIntensity;
      if (json.specularMap !== undefined)
        material.specularMap = getTexture(json.specularMap);
      if (json.envMap !== undefined)
        material.envMap = getTexture(json.envMap);
      if (json.envMapIntensity !== undefined)
        material.envMapIntensity = json.envMapIntensity;
      if (json.reflectivity !== undefined)
        material.reflectivity = json.reflectivity;
      if (json.lightMap !== undefined)
        material.lightMap = getTexture(json.lightMap);
      if (json.lightMapIntensity !== undefined)
        material.lightMapIntensity = json.lightMapIntensity;
      if (json.aoMap !== undefined)
        material.aoMap = getTexture(json.aoMap);
      if (json.aoMapIntensity !== undefined)
        material.aoMapIntensity = json.aoMapIntensity;
      if (json.gradientMap !== undefined)
        material.gradientMap = getTexture(json.gradientMap);
      return material;
    },
    setPath: function(value) {
      this.path = value;
      return this;
    },
    setTextures: function(value) {
      this.textures = value;
      return this;
    }
  });
  var LoaderUtils = {
    decodeText: function(array) {
      if (typeof TextDecoder !== 'undefined') {
        return new TextDecoder().decode(array);
      }
      var s = '';
      for (var i = 0,
          il = array.length; i < il; i++) {
        s += String.fromCharCode(array[i]);
      }
      return decodeURIComponent(escape(s));
    },
    extractUrlBase: function(url) {
      var index = url.lastIndexOf('/');
      if (index === -1)
        return './';
      return url.substr(0, index + 1);
    }
  };
  function BufferGeometryLoader(manager) {
    this.manager = (manager !== undefined) ? manager : DefaultLoadingManager;
  }
  Object.assign(BufferGeometryLoader.prototype, {
    load: function(url, onLoad, onProgress, onError) {
      var scope = this;
      var loader = new FileLoader(scope.manager);
      loader.setPath(scope.path);
      loader.load(url, function(text) {
        onLoad(scope.parse(JSON.parse(text)));
      }, onProgress, onError);
    },
    parse: function(json) {
      var geometry = new BufferGeometry();
      var index = json.data.index;
      if (index !== undefined) {
        var typedArray = new TYPED_ARRAYS[index.type](index.array);
        geometry.setIndex(new BufferAttribute(typedArray, 1));
      }
      var attributes = json.data.attributes;
      for (var key in attributes) {
        var attribute = attributes[key];
        var typedArray = new TYPED_ARRAYS[attribute.type](attribute.array);
        var bufferAttribute = new BufferAttribute(typedArray, attribute.itemSize, attribute.normalized);
        if (attribute.name !== undefined)
          bufferAttribute.name = attribute.name;
        geometry.addAttribute(key, bufferAttribute);
      }
      var morphAttributes = json.data.morphAttributes;
      if (morphAttributes) {
        for (var key in morphAttributes) {
          var attributeArray = morphAttributes[key];
          var array = [];
          for (var i = 0,
              il = attributeArray.length; i < il; i++) {
            var attribute = attributeArray[i];
            var typedArray = new TYPED_ARRAYS[attribute.type](attribute.array);
            var bufferAttribute = new BufferAttribute(typedArray, attribute.itemSize, attribute.normalized);
            if (attribute.name !== undefined)
              bufferAttribute.name = attribute.name;
            array.push(bufferAttribute);
          }
          geometry.morphAttributes[key] = array;
        }
      }
      var groups = json.data.groups || json.data.drawcalls || json.data.offsets;
      if (groups !== undefined) {
        for (var i = 0,
            n = groups.length; i !== n; ++i) {
          var group = groups[i];
          geometry.addGroup(group.start, group.count, group.materialIndex);
        }
      }
      var boundingSphere = json.data.boundingSphere;
      if (boundingSphere !== undefined) {
        var center = new Vector3();
        if (boundingSphere.center !== undefined) {
          center.fromArray(boundingSphere.center);
        }
        geometry.boundingSphere = new Sphere(center, boundingSphere.radius);
      }
      if (json.name)
        geometry.name = json.name;
      if (json.userData)
        geometry.userData = json.userData;
      return geometry;
    },
    setPath: function(value) {
      this.path = value;
      return this;
    }
  });
  var TYPED_ARRAYS = {
    Int8Array: Int8Array,
    Uint8Array: Uint8Array,
    Uint8ClampedArray: typeof Uint8ClampedArray !== 'undefined' ? Uint8ClampedArray : Uint8Array,
    Int16Array: Int16Array,
    Uint16Array: Uint16Array,
    Int32Array: Int32Array,
    Uint32Array: Uint32Array,
    Float32Array: Float32Array,
    Float64Array: Float64Array
  };
  function ObjectLoader(manager) {
    this.manager = (manager !== undefined) ? manager : DefaultLoadingManager;
    this.resourcePath = '';
  }
  Object.assign(ObjectLoader.prototype, {
    crossOrigin: 'anonymous',
    load: function(url, onLoad, onProgress, onError) {
      var scope = this;
      var path = (this.path === undefined) ? LoaderUtils.extractUrlBase(url) : this.path;
      this.resourcePath = this.resourcePath || path;
      var loader = new FileLoader(scope.manager);
      loader.setPath(this.path);
      loader.load(url, function(text) {
        var json = null;
        try {
          json = JSON.parse(text);
        } catch (error) {
          if (onError !== undefined)
            onError(error);
          console.error('THREE:ObjectLoader: Can\'t parse ' + url + '.', error.message);
          return;
        }
        var metadata = json.metadata;
        if (metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry') {
          console.error('THREE.ObjectLoader: Can\'t load ' + url);
          return;
        }
        scope.parse(json, onLoad);
      }, onProgress, onError);
    },
    setPath: function(value) {
      this.path = value;
      return this;
    },
    setResourcePath: function(value) {
      this.resourcePath = value;
      return this;
    },
    setCrossOrigin: function(value) {
      this.crossOrigin = value;
      return this;
    },
    parse: function(json, onLoad) {
      var shapes = this.parseShape(json.shapes);
      var geometries = this.parseGeometries(json.geometries, shapes);
      var images = this.parseImages(json.images, function() {
        if (onLoad !== undefined)
          onLoad(object);
      });
      var textures = this.parseTextures(json.textures, images);
      var materials = this.parseMaterials(json.materials, textures);
      var object = this.parseObject(json.object, geometries, materials);
      if (json.animations) {
        object.animations = this.parseAnimations(json.animations);
      }
      if (json.images === undefined || json.images.length === 0) {
        if (onLoad !== undefined)
          onLoad(object);
      }
      return object;
    },
    parseShape: function(json) {
      var shapes = {};
      if (json !== undefined) {
        for (var i = 0,
            l = json.length; i < l; i++) {
          var shape = new Shape().fromJSON(json[i]);
          shapes[shape.uuid] = shape;
        }
      }
      return shapes;
    },
    parseGeometries: function(json, shapes) {
      var geometries = {};
      if (json !== undefined) {
        var bufferGeometryLoader = new BufferGeometryLoader();
        for (var i = 0,
            l = json.length; i < l; i++) {
          var geometry;
          var data = json[i];
          switch (data.type) {
            case 'PlaneGeometry':
            case 'PlaneBufferGeometry':
              geometry = new Geometries[data.type](data.width, data.height, data.widthSegments, data.heightSegments);
              break;
            case 'BoxGeometry':
            case 'BoxBufferGeometry':
            case 'CubeGeometry':
              geometry = new Geometries[data.type](data.width, data.height, data.depth, data.widthSegments, data.heightSegments, data.depthSegments);
              break;
            case 'CircleGeometry':
            case 'CircleBufferGeometry':
              geometry = new Geometries[data.type](data.radius, data.segments, data.thetaStart, data.thetaLength);
              break;
            case 'CylinderGeometry':
            case 'CylinderBufferGeometry':
              geometry = new Geometries[data.type](data.radiusTop, data.radiusBottom, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength);
              break;
            case 'ConeGeometry':
            case 'ConeBufferGeometry':
              geometry = new Geometries[data.type](data.radius, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength);
              break;
            case 'SphereGeometry':
            case 'SphereBufferGeometry':
              geometry = new Geometries[data.type](data.radius, data.widthSegments, data.heightSegments, data.phiStart, data.phiLength, data.thetaStart, data.thetaLength);
              break;
            case 'DodecahedronGeometry':
            case 'DodecahedronBufferGeometry':
            case 'IcosahedronGeometry':
            case 'IcosahedronBufferGeometry':
            case 'OctahedronGeometry':
            case 'OctahedronBufferGeometry':
            case 'TetrahedronGeometry':
            case 'TetrahedronBufferGeometry':
              geometry = new Geometries[data.type](data.radius, data.detail);
              break;
            case 'RingGeometry':
            case 'RingBufferGeometry':
              geometry = new Geometries[data.type](data.innerRadius, data.outerRadius, data.thetaSegments, data.phiSegments, data.thetaStart, data.thetaLength);
              break;
            case 'TorusGeometry':
            case 'TorusBufferGeometry':
              geometry = new Geometries[data.type](data.radius, data.tube, data.radialSegments, data.tubularSegments, data.arc);
              break;
            case 'TorusKnotGeometry':
            case 'TorusKnotBufferGeometry':
              geometry = new Geometries[data.type](data.radius, data.tube, data.tubularSegments, data.radialSegments, data.p, data.q);
              break;
            case 'TubeGeometry':
            case 'TubeBufferGeometry':
              geometry = new Geometries[data.type](new Curves[data.path.type]().fromJSON(data.path), data.tubularSegments, data.radius, data.radialSegments, data.closed);
              break;
            case 'LatheGeometry':
            case 'LatheBufferGeometry':
              geometry = new Geometries[data.type](data.points, data.segments, data.phiStart, data.phiLength);
              break;
            case 'PolyhedronGeometry':
            case 'PolyhedronBufferGeometry':
              geometry = new Geometries[data.type](data.vertices, data.indices, data.radius, data.details);
              break;
            case 'ShapeGeometry':
            case 'ShapeBufferGeometry':
              var geometryShapes = [];
              for (var j = 0,
                  jl = data.shapes.length; j < jl; j++) {
                var shape = shapes[data.shapes[j]];
                geometryShapes.push(shape);
              }
              geometry = new Geometries[data.type](geometryShapes, data.curveSegments);
              break;
            case 'ExtrudeGeometry':
            case 'ExtrudeBufferGeometry':
              var geometryShapes = [];
              for (var j = 0,
                  jl = data.shapes.length; j < jl; j++) {
                var shape = shapes[data.shapes[j]];
                geometryShapes.push(shape);
              }
              var extrudePath = data.options.extrudePath;
              if (extrudePath !== undefined) {
                data.options.extrudePath = new Curves[extrudePath.type]().fromJSON(extrudePath);
              }
              geometry = new Geometries[data.type](geometryShapes, data.options);
              break;
            case 'BufferGeometry':
              geometry = bufferGeometryLoader.parse(data);
              break;
            case 'Geometry':
              if ('THREE' in window && 'LegacyJSONLoader' in THREE) {
                var geometryLoader = new THREE.LegacyJSONLoader();
                geometry = geometryLoader.parse(data, this.resourcePath).geometry;
              } else {
                console.error('THREE.ObjectLoader: You have to import LegacyJSONLoader in order load geometry data of type "Geometry".');
              }
              break;
            default:
              console.warn('THREE.ObjectLoader: Unsupported geometry type "' + data.type + '"');
              continue;
          }
          geometry.uuid = data.uuid;
          if (data.name !== undefined)
            geometry.name = data.name;
          if (geometry.isBufferGeometry === true && data.userData !== undefined)
            geometry.userData = data.userData;
          geometries[data.uuid] = geometry;
        }
      }
      return geometries;
    },
    parseMaterials: function(json, textures) {
      var cache = {};
      var materials = {};
      if (json !== undefined) {
        var loader = new MaterialLoader();
        loader.setTextures(textures);
        for (var i = 0,
            l = json.length; i < l; i++) {
          var data = json[i];
          if (data.type === 'MultiMaterial') {
            var array = [];
            for (var j = 0; j < data.materials.length; j++) {
              var material = data.materials[j];
              if (cache[material.uuid] === undefined) {
                cache[material.uuid] = loader.parse(material);
              }
              array.push(cache[material.uuid]);
            }
            materials[data.uuid] = array;
          } else {
            if (cache[data.uuid] === undefined) {
              cache[data.uuid] = loader.parse(data);
            }
            materials[data.uuid] = cache[data.uuid];
          }
        }
      }
      return materials;
    },
    parseAnimations: function(json) {
      var animations = [];
      for (var i = 0; i < json.length; i++) {
        var data = json[i];
        var clip = AnimationClip.parse(data);
        if (data.uuid !== undefined)
          clip.uuid = data.uuid;
        animations.push(clip);
      }
      return animations;
    },
    parseImages: function(json, onLoad) {
      var scope = this;
      var images = {};
      function loadImage(url) {
        scope.manager.itemStart(url);
        return loader.load(url, function() {
          scope.manager.itemEnd(url);
        }, undefined, function() {
          scope.manager.itemError(url);
          scope.manager.itemEnd(url);
        });
      }
      if (json !== undefined && json.length > 0) {
        var manager = new LoadingManager(onLoad);
        var loader = new ImageLoader(manager);
        loader.setCrossOrigin(this.crossOrigin);
        for (var i = 0,
            il = json.length; i < il; i++) {
          var image = json[i];
          var url = image.url;
          if (Array.isArray(url)) {
            images[image.uuid] = [];
            for (var j = 0,
                jl = url.length; j < jl; j++) {
              var currentUrl = url[j];
              var path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test(currentUrl) ? currentUrl : scope.resourcePath + currentUrl;
              images[image.uuid].push(loadImage(path));
            }
          } else {
            var path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test(image.url) ? image.url : scope.resourcePath + image.url;
            images[image.uuid] = loadImage(path);
          }
        }
      }
      return images;
    },
    parseTextures: function(json, images) {
      function parseConstant(value, type) {
        if (typeof value === 'number')
          return value;
        console.warn('THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value);
        return type[value];
      }
      var textures = {};
      if (json !== undefined) {
        for (var i = 0,
            l = json.length; i < l; i++) {
          var data = json[i];
          if (data.image === undefined) {
            console.warn('THREE.ObjectLoader: No "image" specified for', data.uuid);
          }
          if (images[data.image] === undefined) {
            console.warn('THREE.ObjectLoader: Undefined image', data.image);
          }
          var texture;
          if (Array.isArray(images[data.image])) {
            texture = new CubeTexture(images[data.image]);
          } else {
            texture = new Texture(images[data.image]);
          }
          texture.needsUpdate = true;
          texture.uuid = data.uuid;
          if (data.name !== undefined)
            texture.name = data.name;
          if (data.mapping !== undefined)
            texture.mapping = parseConstant(data.mapping, TEXTURE_MAPPING);
          if (data.offset !== undefined)
            texture.offset.fromArray(data.offset);
          if (data.repeat !== undefined)
            texture.repeat.fromArray(data.repeat);
          if (data.center !== undefined)
            texture.center.fromArray(data.center);
          if (data.rotation !== undefined)
            texture.rotation = data.rotation;
          if (data.wrap !== undefined) {
            texture.wrapS = parseConstant(data.wrap[0], TEXTURE_WRAPPING);
            texture.wrapT = parseConstant(data.wrap[1], TEXTURE_WRAPPING);
          }
          if (data.format !== undefined)
            texture.format = data.format;
          if (data.type !== undefined)
            texture.type = data.type;
          if (data.encoding !== undefined)
            texture.encoding = data.encoding;
          if (data.minFilter !== undefined)
            texture.minFilter = parseConstant(data.minFilter, TEXTURE_FILTER);
          if (data.magFilter !== undefined)
            texture.magFilter = parseConstant(data.magFilter, TEXTURE_FILTER);
          if (data.anisotropy !== undefined)
            texture.anisotropy = data.anisotropy;
          if (data.flipY !== undefined)
            texture.flipY = data.flipY;
          if (data.premultiplyAlpha !== undefined)
            texture.premultiplyAlpha = data.premultiplyAlpha;
          if (data.unpackAlignment !== undefined)
            texture.unpackAlignment = data.unpackAlignment;
          textures[data.uuid] = texture;
        }
      }
      return textures;
    },
    parseObject: function(data, geometries, materials) {
      var object;
      function getGeometry(name) {
        if (geometries[name] === undefined) {
          console.warn('THREE.ObjectLoader: Undefined geometry', name);
        }
        return geometries[name];
      }
      function getMaterial(name) {
        if (name === undefined)
          return undefined;
        if (Array.isArray(name)) {
          var array = [];
          for (var i = 0,
              l = name.length; i < l; i++) {
            var uuid = name[i];
            if (materials[uuid] === undefined) {
              console.warn('THREE.ObjectLoader: Undefined material', uuid);
            }
            array.push(materials[uuid]);
          }
          return array;
        }
        if (materials[name] === undefined) {
          console.warn('THREE.ObjectLoader: Undefined material', name);
        }
        return materials[name];
      }
      switch (data.type) {
        case 'Scene':
          object = new Scene();
          if (data.background !== undefined) {
            if (Number.isInteger(data.background)) {
              object.background = new Color(data.background);
            }
          }
          if (data.fog !== undefined) {
            if (data.fog.type === 'Fog') {
              object.fog = new Fog(data.fog.color, data.fog.near, data.fog.far);
            } else if (data.fog.type === 'FogExp2') {
              object.fog = new FogExp2(data.fog.color, data.fog.density);
            }
          }
          break;
        case 'PerspectiveCamera':
          object = new PerspectiveCamera(data.fov, data.aspect, data.near, data.far);
          if (data.focus !== undefined)
            object.focus = data.focus;
          if (data.zoom !== undefined)
            object.zoom = data.zoom;
          if (data.filmGauge !== undefined)
            object.filmGauge = data.filmGauge;
          if (data.filmOffset !== undefined)
            object.filmOffset = data.filmOffset;
          if (data.view !== undefined)
            object.view = Object.assign({}, data.view);
          break;
        case 'OrthographicCamera':
          object = new OrthographicCamera(data.left, data.right, data.top, data.bottom, data.near, data.far);
          if (data.zoom !== undefined)
            object.zoom = data.zoom;
          if (data.view !== undefined)
            object.view = Object.assign({}, data.view);
          break;
        case 'AmbientLight':
          object = new AmbientLight(data.color, data.intensity);
          break;
        case 'DirectionalLight':
          object = new DirectionalLight(data.color, data.intensity);
          break;
        case 'PointLight':
          object = new PointLight(data.color, data.intensity, data.distance, data.decay);
          break;
        case 'RectAreaLight':
          object = new RectAreaLight(data.color, data.intensity, data.width, data.height);
          break;
        case 'SpotLight':
          object = new SpotLight(data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay);
          break;
        case 'HemisphereLight':
          object = new HemisphereLight(data.color, data.groundColor, data.intensity);
          break;
        case 'SkinnedMesh':
          console.warn('THREE.ObjectLoader.parseObject() does not support SkinnedMesh yet.');
        case 'Mesh':
          var geometry = getGeometry(data.geometry);
          var material = getMaterial(data.material);
          if (geometry.bones && geometry.bones.length > 0) {
            object = new SkinnedMesh(geometry, material);
          } else {
            object = new Mesh(geometry, material);
          }
          if (data.drawMode !== undefined)
            object.setDrawMode(data.drawMode);
          break;
        case 'LOD':
          object = new LOD();
          break;
        case 'Line':
          object = new Line(getGeometry(data.geometry), getMaterial(data.material), data.mode);
          break;
        case 'LineLoop':
          object = new LineLoop(getGeometry(data.geometry), getMaterial(data.material));
          break;
        case 'LineSegments':
          object = new LineSegments(getGeometry(data.geometry), getMaterial(data.material));
          break;
        case 'PointCloud':
        case 'Points':
          object = new Points(getGeometry(data.geometry), getMaterial(data.material));
          break;
        case 'Sprite':
          object = new Sprite(getMaterial(data.material));
          break;
        case 'Group':
          object = new Group();
          break;
        default:
          object = new Object3D();
      }
      object.uuid = data.uuid;
      if (data.name !== undefined)
        object.name = data.name;
      if (data.matrix !== undefined) {
        object.matrix.fromArray(data.matrix);
        if (data.matrixAutoUpdate !== undefined)
          object.matrixAutoUpdate = data.matrixAutoUpdate;
        if (object.matrixAutoUpdate)
          object.matrix.decompose(object.position, object.quaternion, object.scale);
      } else {
        if (data.position !== undefined)
          object.position.fromArray(data.position);
        if (data.rotation !== undefined)
          object.rotation.fromArray(data.rotation);
        if (data.quaternion !== undefined)
          object.quaternion.fromArray(data.quaternion);
        if (data.scale !== undefined)
          object.scale.fromArray(data.scale);
      }
      if (data.castShadow !== undefined)
        object.castShadow = data.castShadow;
      if (data.receiveShadow !== undefined)
        object.receiveShadow = data.receiveShadow;
      if (data.shadow) {
        if (data.shadow.bias !== undefined)
          object.shadow.bias = data.shadow.bias;
        if (data.shadow.radius !== undefined)
          object.shadow.radius = data.shadow.radius;
        if (data.shadow.mapSize !== undefined)
          object.shadow.mapSize.fromArray(data.shadow.mapSize);
        if (data.shadow.camera !== undefined)
          object.shadow.camera = this.parseObject(data.shadow.camera);
      }
      if (data.visible !== undefined)
        object.visible = data.visible;
      if (data.frustumCulled !== undefined)
        object.frustumCulled = data.frustumCulled;
      if (data.renderOrder !== undefined)
        object.renderOrder = data.renderOrder;
      if (data.userData !== undefined)
        object.userData = data.userData;
      if (data.layers !== undefined)
        object.layers.mask = data.layers;
      if (data.children !== undefined) {
        var children = data.children;
        for (var i = 0; i < children.length; i++) {
          object.add(this.parseObject(children[i], geometries, materials));
        }
      }
      if (data.type === 'LOD') {
        var levels = data.levels;
        for (var l = 0; l < levels.length; l++) {
          var level = levels[l];
          var child = object.getObjectByProperty('uuid', level.object);
          if (child !== undefined) {
            object.addLevel(child, level.distance);
          }
        }
      }
      return object;
    }
  });
  var TEXTURE_MAPPING = {
    UVMapping: UVMapping,
    CubeReflectionMapping: CubeReflectionMapping,
    CubeRefractionMapping: CubeRefractionMapping,
    EquirectangularReflectionMapping: EquirectangularReflectionMapping,
    EquirectangularRefractionMapping: EquirectangularRefractionMapping,
    SphericalReflectionMapping: SphericalReflectionMapping,
    CubeUVReflectionMapping: CubeUVReflectionMapping,
    CubeUVRefractionMapping: CubeUVRefractionMapping
  };
  var TEXTURE_WRAPPING = {
    RepeatWrapping: RepeatWrapping,
    ClampToEdgeWrapping: ClampToEdgeWrapping,
    MirroredRepeatWrapping: MirroredRepeatWrapping
  };
  var TEXTURE_FILTER = {
    NearestFilter: NearestFilter,
    NearestMipMapNearestFilter: NearestMipMapNearestFilter,
    NearestMipMapLinearFilter: NearestMipMapLinearFilter,
    LinearFilter: LinearFilter,
    LinearMipMapNearestFilter: LinearMipMapNearestFilter,
    LinearMipMapLinearFilter: LinearMipMapLinearFilter
  };
  function ImageBitmapLoader(manager) {
    if (typeof createImageBitmap === 'undefined') {
      console.warn('THREE.ImageBitmapLoader: createImageBitmap() not supported.');
    }
    if (typeof fetch === 'undefined') {
      console.warn('THREE.ImageBitmapLoader: fetch() not supported.');
    }
    this.manager = manager !== undefined ? manager : DefaultLoadingManager;
    this.options = undefined;
  }
  ImageBitmapLoader.prototype = {
    constructor: ImageBitmapLoader,
    setOptions: function setOptions(options) {
      this.options = options;
      return this;
    },
    load: function(url, onLoad, onProgress, onError) {
      if (url === undefined)
        url = '';
      if (this.path !== undefined)
        url = this.path + url;
      url = this.manager.resolveURL(url);
      var scope = this;
      var cached = Cache.get(url);
      if (cached !== undefined) {
        scope.manager.itemStart(url);
        setTimeout(function() {
          if (onLoad)
            onLoad(cached);
          scope.manager.itemEnd(url);
        }, 0);
        return cached;
      }
      fetch(url).then(function(res) {
        return res.blob();
      }).then(function(blob) {
        return createImageBitmap(blob, scope.options);
      }).then(function(imageBitmap) {
        Cache.add(url, imageBitmap);
        if (onLoad)
          onLoad(imageBitmap);
        scope.manager.itemEnd(url);
      }).catch(function(e) {
        if (onError)
          onError(e);
        scope.manager.itemError(url);
        scope.manager.itemEnd(url);
      });
      scope.manager.itemStart(url);
    },
    setCrossOrigin: function() {
      return this;
    },
    setPath: function(value) {
      this.path = value;
      return this;
    }
  };
  function ShapePath() {
    this.type = 'ShapePath';
    this.color = new Color();
    this.subPaths = [];
    this.currentPath = null;
  }
  Object.assign(ShapePath.prototype, {
    moveTo: function(x, y) {
      this.currentPath = new Path();
      this.subPaths.push(this.currentPath);
      this.currentPath.moveTo(x, y);
    },
    lineTo: function(x, y) {
      this.currentPath.lineTo(x, y);
    },
    quadraticCurveTo: function(aCPx, aCPy, aX, aY) {
      this.currentPath.quadraticCurveTo(aCPx, aCPy, aX, aY);
    },
    bezierCurveTo: function(aCP1x, aCP1y, aCP2x, aCP2y, aX, aY) {
      this.currentPath.bezierCurveTo(aCP1x, aCP1y, aCP2x, aCP2y, aX, aY);
    },
    splineThru: function(pts) {
      this.currentPath.splineThru(pts);
    },
    toShapes: function(isCCW, noHoles) {
      function toShapesNoHoles(inSubpaths) {
        var shapes = [];
        for (var i = 0,
            l = inSubpaths.length; i < l; i++) {
          var tmpPath = inSubpaths[i];
          var tmpShape = new Shape();
          tmpShape.curves = tmpPath.curves;
          shapes.push(tmpShape);
        }
        return shapes;
      }
      function isPointInsidePolygon(inPt, inPolygon) {
        var polyLen = inPolygon.length;
        var inside = false;
        for (var p = polyLen - 1,
            q = 0; q < polyLen; p = q++) {
          var edgeLowPt = inPolygon[p];
          var edgeHighPt = inPolygon[q];
          var edgeDx = edgeHighPt.x - edgeLowPt.x;
          var edgeDy = edgeHighPt.y - edgeLowPt.y;
          if (Math.abs(edgeDy) > Number.EPSILON) {
            if (edgeDy < 0) {
              edgeLowPt = inPolygon[q];
              edgeDx = -edgeDx;
              edgeHighPt = inPolygon[p];
              edgeDy = -edgeDy;
            }
            if ((inPt.y < edgeLowPt.y) || (inPt.y > edgeHighPt.y))
              continue;
            if (inPt.y === edgeLowPt.y) {
              if (inPt.x === edgeLowPt.x)
                return true;
            } else {
              var perpEdge = edgeDy * (inPt.x - edgeLowPt.x) - edgeDx * (inPt.y - edgeLowPt.y);
              if (perpEdge === 0)
                return true;
              if (perpEdge < 0)
                continue;
              inside = !inside;
            }
          } else {
            if (inPt.y !== edgeLowPt.y)
              continue;
            if (((edgeHighPt.x <= inPt.x) && (inPt.x <= edgeLowPt.x)) || ((edgeLowPt.x <= inPt.x) && (inPt.x <= edgeHighPt.x)))
              return true;
          }
        }
        return inside;
      }
      var isClockWise = ShapeUtils.isClockWise;
      var subPaths = this.subPaths;
      if (subPaths.length === 0)
        return [];
      if (noHoles === true)
        return toShapesNoHoles(subPaths);
      var solid,
          tmpPath,
          tmpShape,
          shapes = [];
      if (subPaths.length === 1) {
        tmpPath = subPaths[0];
        tmpShape = new Shape();
        tmpShape.curves = tmpPath.curves;
        shapes.push(tmpShape);
        return shapes;
      }
      var holesFirst = !isClockWise(subPaths[0].getPoints());
      holesFirst = isCCW ? !holesFirst : holesFirst;
      var betterShapeHoles = [];
      var newShapes = [];
      var newShapeHoles = [];
      var mainIdx = 0;
      var tmpPoints;
      newShapes[mainIdx] = undefined;
      newShapeHoles[mainIdx] = [];
      for (var i = 0,
          l = subPaths.length; i < l; i++) {
        tmpPath = subPaths[i];
        tmpPoints = tmpPath.getPoints();
        solid = isClockWise(tmpPoints);
        solid = isCCW ? !solid : solid;
        if (solid) {
          if ((!holesFirst) && (newShapes[mainIdx]))
            mainIdx++;
          newShapes[mainIdx] = {
            s: new Shape(),
            p: tmpPoints
          };
          newShapes[mainIdx].s.curves = tmpPath.curves;
          if (holesFirst)
            mainIdx++;
          newShapeHoles[mainIdx] = [];
        } else {
          newShapeHoles[mainIdx].push({
            h: tmpPath,
            p: tmpPoints[0]
          });
        }
      }
      if (!newShapes[0])
        return toShapesNoHoles(subPaths);
      if (newShapes.length > 1) {
        var ambiguous = false;
        var toChange = [];
        for (var sIdx = 0,
            sLen = newShapes.length; sIdx < sLen; sIdx++) {
          betterShapeHoles[sIdx] = [];
        }
        for (var sIdx = 0,
            sLen = newShapes.length; sIdx < sLen; sIdx++) {
          var sho = newShapeHoles[sIdx];
          for (var hIdx = 0; hIdx < sho.length; hIdx++) {
            var ho = sho[hIdx];
            var hole_unassigned = true;
            for (var s2Idx = 0; s2Idx < newShapes.length; s2Idx++) {
              if (isPointInsidePolygon(ho.p, newShapes[s2Idx].p)) {
                if (sIdx !== s2Idx)
                  toChange.push({
                    froms: sIdx,
                    tos: s2Idx,
                    hole: hIdx
                  });
                if (hole_unassigned) {
                  hole_unassigned = false;
                  betterShapeHoles[s2Idx].push(ho);
                } else {
                  ambiguous = true;
                }
              }
            }
            if (hole_unassigned) {
              betterShapeHoles[sIdx].push(ho);
            }
          }
        }
        if (toChange.length > 0) {
          if (!ambiguous)
            newShapeHoles = betterShapeHoles;
        }
      }
      var tmpHoles;
      for (var i = 0,
          il = newShapes.length; i < il; i++) {
        tmpShape = newShapes[i].s;
        shapes.push(tmpShape);
        tmpHoles = newShapeHoles[i];
        for (var j = 0,
            jl = tmpHoles.length; j < jl; j++) {
          tmpShape.holes.push(tmpHoles[j].h);
        }
      }
      return shapes;
    }
  });
  function Font(data) {
    this.type = 'Font';
    this.data = data;
  }
  Object.assign(Font.prototype, {
    isFont: true,
    generateShapes: function(text, size) {
      if (size === undefined)
        size = 100;
      var shapes = [];
      var paths = createPaths(text, size, this.data);
      for (var p = 0,
          pl = paths.length; p < pl; p++) {
        Array.prototype.push.apply(shapes, paths[p].toShapes());
      }
      return shapes;
    }
  });
  function createPaths(text, size, data) {
    var chars = Array.from ? Array.from(text) : String(text).split('');
    var scale = size / data.resolution;
    var line_height = (data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness) * scale;
    var paths = [];
    var offsetX = 0,
        offsetY = 0;
    for (var i = 0; i < chars.length; i++) {
      var char = chars[i];
      if (char === '\n') {
        offsetX = 0;
        offsetY -= line_height;
      } else {
        var ret = createPath(char, scale, offsetX, offsetY, data);
        offsetX += ret.offsetX;
        paths.push(ret.path);
      }
    }
    return paths;
  }
  function createPath(char, scale, offsetX, offsetY, data) {
    var glyph = data.glyphs[char] || data.glyphs['?'];
    if (!glyph)
      return;
    var path = new ShapePath();
    var x,
        y,
        cpx,
        cpy,
        cpx1,
        cpy1,
        cpx2,
        cpy2;
    if (glyph.o) {
      var outline = glyph._cachedOutline || (glyph._cachedOutline = glyph.o.split(' '));
      for (var i = 0,
          l = outline.length; i < l; ) {
        var action = outline[i++];
        switch (action) {
          case 'm':
            x = outline[i++] * scale + offsetX;
            y = outline[i++] * scale + offsetY;
            path.moveTo(x, y);
            break;
          case 'l':
            x = outline[i++] * scale + offsetX;
            y = outline[i++] * scale + offsetY;
            path.lineTo(x, y);
            break;
          case 'q':
            cpx = outline[i++] * scale + offsetX;
            cpy = outline[i++] * scale + offsetY;
            cpx1 = outline[i++] * scale + offsetX;
            cpy1 = outline[i++] * scale + offsetY;
            path.quadraticCurveTo(cpx1, cpy1, cpx, cpy);
            break;
          case 'b':
            cpx = outline[i++] * scale + offsetX;
            cpy = outline[i++] * scale + offsetY;
            cpx1 = outline[i++] * scale + offsetX;
            cpy1 = outline[i++] * scale + offsetY;
            cpx2 = outline[i++] * scale + offsetX;
            cpy2 = outline[i++] * scale + offsetY;
            path.bezierCurveTo(cpx1, cpy1, cpx2, cpy2, cpx, cpy);
            break;
        }
      }
    }
    return {
      offsetX: glyph.ha * scale,
      path: path
    };
  }
  function FontLoader(manager) {
    this.manager = (manager !== undefined) ? manager : DefaultLoadingManager;
  }
  Object.assign(FontLoader.prototype, {
    load: function(url, onLoad, onProgress, onError) {
      var scope = this;
      var loader = new FileLoader(this.manager);
      loader.setPath(this.path);
      loader.load(url, function(text) {
        var json;
        try {
          json = JSON.parse(text);
        } catch (e) {
          console.warn('THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.');
          json = JSON.parse(text.substring(65, text.length - 2));
        }
        var font = scope.parse(json);
        if (onLoad)
          onLoad(font);
      }, onProgress, onError);
    },
    parse: function(json) {
      return new Font(json);
    },
    setPath: function(value) {
      this.path = value;
      return this;
    }
  });
  function Loader() {}
  Loader.Handlers = {
    handlers: [],
    add: function(regex, loader) {
      this.handlers.push(regex, loader);
    },
    get: function(file) {
      var handlers = this.handlers;
      for (var i = 0,
          l = handlers.length; i < l; i += 2) {
        var regex = handlers[i];
        var loader = handlers[i + 1];
        if (regex.test(file)) {
          return loader;
        }
      }
      return null;
    }
  };
  Object.assign(Loader.prototype, {
    crossOrigin: 'anonymous',
    onLoadStart: function() {},
    onLoadProgress: function() {},
    onLoadComplete: function() {},
    initMaterials: function(materials, texturePath, crossOrigin) {
      var array = [];
      for (var i = 0; i < materials.length; ++i) {
        array[i] = this.createMaterial(materials[i], texturePath, crossOrigin);
      }
      return array;
    },
    createMaterial: (function() {
      var BlendingMode = {
        NoBlending: NoBlending,
        NormalBlending: NormalBlending,
        AdditiveBlending: AdditiveBlending,
        SubtractiveBlending: SubtractiveBlending,
        MultiplyBlending: MultiplyBlending,
        CustomBlending: CustomBlending
      };
      var color = new Color();
      var textureLoader = new TextureLoader();
      var materialLoader = new MaterialLoader();
      return function createMaterial(m, texturePath, crossOrigin) {
        var textures = {};
        function loadTexture(path, repeat, offset, wrap, anisotropy) {
          var fullPath = texturePath + path;
          var loader = Loader.Handlers.get(fullPath);
          var texture;
          if (loader !== null) {
            texture = loader.load(fullPath);
          } else {
            textureLoader.setCrossOrigin(crossOrigin);
            texture = textureLoader.load(fullPath);
          }
          if (repeat !== undefined) {
            texture.repeat.fromArray(repeat);
            if (repeat[0] !== 1)
              texture.wrapS = RepeatWrapping;
            if (repeat[1] !== 1)
              texture.wrapT = RepeatWrapping;
          }
          if (offset !== undefined) {
            texture.offset.fromArray(offset);
          }
          if (wrap !== undefined) {
            if (wrap[0] === 'repeat')
              texture.wrapS = RepeatWrapping;
            if (wrap[0] === 'mirror')
              texture.wrapS = MirroredRepeatWrapping;
            if (wrap[1] === 'repeat')
              texture.wrapT = RepeatWrapping;
            if (wrap[1] === 'mirror')
              texture.wrapT = MirroredRepeatWrapping;
          }
          if (anisotropy !== undefined) {
            texture.anisotropy = anisotropy;
          }
          var uuid = _Math.generateUUID();
          textures[uuid] = texture;
          return uuid;
        }
        var json = {
          uuid: _Math.generateUUID(),
          type: 'MeshLambertMaterial'
        };
        for (var name in m) {
          var value = m[name];
          switch (name) {
            case 'DbgColor':
            case 'DbgIndex':
            case 'opticalDensity':
            case 'illumination':
              break;
            case 'DbgName':
              json.name = value;
              break;
            case 'blending':
              json.blending = BlendingMode[value];
              break;
            case 'colorAmbient':
            case 'mapAmbient':
              console.warn('THREE.Loader.createMaterial:', name, 'is no longer supported.');
              break;
            case 'colorDiffuse':
              json.color = color.fromArray(value).getHex();
              break;
            case 'colorSpecular':
              json.specular = color.fromArray(value).getHex();
              break;
            case 'colorEmissive':
              json.emissive = color.fromArray(value).getHex();
              break;
            case 'specularCoef':
              json.shininess = value;
              break;
            case 'shading':
              if (value.toLowerCase() === 'basic')
                json.type = 'MeshBasicMaterial';
              if (value.toLowerCase() === 'phong')
                json.type = 'MeshPhongMaterial';
              if (value.toLowerCase() === 'standard')
                json.type = 'MeshStandardMaterial';
              break;
            case 'mapDiffuse':
              json.map = loadTexture(value, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy);
              break;
            case 'mapDiffuseRepeat':
            case 'mapDiffuseOffset':
            case 'mapDiffuseWrap':
            case 'mapDiffuseAnisotropy':
              break;
            case 'mapEmissive':
              json.emissiveMap = loadTexture(value, m.mapEmissiveRepeat, m.mapEmissiveOffset, m.mapEmissiveWrap, m.mapEmissiveAnisotropy);
              break;
            case 'mapEmissiveRepeat':
            case 'mapEmissiveOffset':
            case 'mapEmissiveWrap':
            case 'mapEmissiveAnisotropy':
              break;
            case 'mapLight':
              json.lightMap = loadTexture(value, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy);
              break;
            case 'mapLightRepeat':
            case 'mapLightOffset':
            case 'mapLightWrap':
            case 'mapLightAnisotropy':
              break;
            case 'mapAO':
              json.aoMap = loadTexture(value, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy);
              break;
            case 'mapAORepeat':
            case 'mapAOOffset':
            case 'mapAOWrap':
            case 'mapAOAnisotropy':
              break;
            case 'mapBump':
              json.bumpMap = loadTexture(value, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy);
              break;
            case 'mapBumpScale':
              json.bumpScale = value;
              break;
            case 'mapBumpRepeat':
            case 'mapBumpOffset':
            case 'mapBumpWrap':
            case 'mapBumpAnisotropy':
              break;
            case 'mapNormal':
              json.normalMap = loadTexture(value, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy);
              break;
            case 'mapNormalFactor':
              json.normalScale = value;
              break;
            case 'mapNormalRepeat':
            case 'mapNormalOffset':
            case 'mapNormalWrap':
            case 'mapNormalAnisotropy':
              break;
            case 'mapSpecular':
              json.specularMap = loadTexture(value, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy);
              break;
            case 'mapSpecularRepeat':
            case 'mapSpecularOffset':
            case 'mapSpecularWrap':
            case 'mapSpecularAnisotropy':
              break;
            case 'mapMetalness':
              json.metalnessMap = loadTexture(value, m.mapMetalnessRepeat, m.mapMetalnessOffset, m.mapMetalnessWrap, m.mapMetalnessAnisotropy);
              break;
            case 'mapMetalnessRepeat':
            case 'mapMetalnessOffset':
            case 'mapMetalnessWrap':
            case 'mapMetalnessAnisotropy':
              break;
            case 'mapRoughness':
              json.roughnessMap = loadTexture(value, m.mapRoughnessRepeat, m.mapRoughnessOffset, m.mapRoughnessWrap, m.mapRoughnessAnisotropy);
              break;
            case 'mapRoughnessRepeat':
            case 'mapRoughnessOffset':
            case 'mapRoughnessWrap':
            case 'mapRoughnessAnisotropy':
              break;
            case 'mapAlpha':
              json.alphaMap = loadTexture(value, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy);
              break;
            case 'mapAlphaRepeat':
            case 'mapAlphaOffset':
            case 'mapAlphaWrap':
            case 'mapAlphaAnisotropy':
              break;
            case 'flipSided':
              json.side = BackSide;
              break;
            case 'doubleSided':
              json.side = DoubleSide;
              break;
            case 'transparency':
              console.warn('THREE.Loader.createMaterial: transparency has been renamed to opacity');
              json.opacity = value;
              break;
            case 'depthTest':
            case 'depthWrite':
            case 'colorWrite':
            case 'opacity':
            case 'reflectivity':
            case 'transparent':
            case 'visible':
            case 'wireframe':
              json[name] = value;
              break;
            case 'vertexColors':
              if (value === true)
                json.vertexColors = VertexColors;
              if (value === 'face')
                json.vertexColors = FaceColors;
              break;
            default:
              console.error('THREE.Loader.createMaterial: Unsupported', name, value);
              break;
          }
        }
        if (json.type === 'MeshBasicMaterial')
          delete json.emissive;
        if (json.type !== 'MeshPhongMaterial')
          delete json.specular;
        if (json.opacity < 1)
          json.transparent = true;
        materialLoader.setTextures(textures);
        return materialLoader.parse(json);
      };
    })()
  });
  var context;
  var AudioContext = {
    getContext: function() {
      if (context === undefined) {
        context = new (window.AudioContext || window.webkitAudioContext)();
      }
      return context;
    },
    setContext: function(value) {
      context = value;
    }
  };
  function AudioLoader(manager) {
    this.manager = (manager !== undefined) ? manager : DefaultLoadingManager;
  }
  Object.assign(AudioLoader.prototype, {
    load: function(url, onLoad, onProgress, onError) {
      var loader = new FileLoader(this.manager);
      loader.setResponseType('arraybuffer');
      loader.setPath(this.path);
      loader.load(url, function(buffer) {
        var bufferCopy = buffer.slice(0);
        var context = AudioContext.getContext();
        context.decodeAudioData(bufferCopy, function(audioBuffer) {
          onLoad(audioBuffer);
        });
      }, onProgress, onError);
    },
    setPath: function(value) {
      this.path = value;
      return this;
    }
  });
  function StereoCamera() {
    this.type = 'StereoCamera';
    this.aspect = 1;
    this.eyeSep = 0.064;
    this.cameraL = new PerspectiveCamera();
    this.cameraL.layers.enable(1);
    this.cameraL.matrixAutoUpdate = false;
    this.cameraR = new PerspectiveCamera();
    this.cameraR.layers.enable(2);
    this.cameraR.matrixAutoUpdate = false;
  }
  Object.assign(StereoCamera.prototype, {update: (function() {
      var instance,
          focus,
          fov,
          aspect,
          near,
          far,
          zoom,
          eyeSep;
      var eyeRight = new Matrix4();
      var eyeLeft = new Matrix4();
      return function update(camera) {
        var needsUpdate = instance !== this || focus !== camera.focus || fov !== camera.fov || aspect !== camera.aspect * this.aspect || near !== camera.near || far !== camera.far || zoom !== camera.zoom || eyeSep !== this.eyeSep;
        if (needsUpdate) {
          instance = this;
          focus = camera.focus;
          fov = camera.fov;
          aspect = camera.aspect * this.aspect;
          near = camera.near;
          far = camera.far;
          zoom = camera.zoom;
          var projectionMatrix = camera.projectionMatrix.clone();
          eyeSep = this.eyeSep / 2;
          var eyeSepOnProjection = eyeSep * near / focus;
          var ymax = (near * Math.tan(_Math.DEG2RAD * fov * 0.5)) / zoom;
          var xmin,
              xmax;
          eyeLeft.elements[12] = -eyeSep;
          eyeRight.elements[12] = eyeSep;
          xmin = -ymax * aspect + eyeSepOnProjection;
          xmax = ymax * aspect + eyeSepOnProjection;
          projectionMatrix.elements[0] = 2 * near / (xmax - xmin);
          projectionMatrix.elements[8] = (xmax + xmin) / (xmax - xmin);
          this.cameraL.projectionMatrix.copy(projectionMatrix);
          xmin = -ymax * aspect - eyeSepOnProjection;
          xmax = ymax * aspect - eyeSepOnProjection;
          projectionMatrix.elements[0] = 2 * near / (xmax - xmin);
          projectionMatrix.elements[8] = (xmax + xmin) / (xmax - xmin);
          this.cameraR.projectionMatrix.copy(projectionMatrix);
        }
        this.cameraL.matrixWorld.copy(camera.matrixWorld).multiply(eyeLeft);
        this.cameraR.matrixWorld.copy(camera.matrixWorld).multiply(eyeRight);
      };
    })()});
  function CubeCamera(near, far, cubeResolution, options) {
    Object3D.call(this);
    this.type = 'CubeCamera';
    var fov = 90,
        aspect = 1;
    var cameraPX = new PerspectiveCamera(fov, aspect, near, far);
    cameraPX.up.set(0, -1, 0);
    cameraPX.lookAt(new Vector3(1, 0, 0));
    this.add(cameraPX);
    var cameraNX = new PerspectiveCamera(fov, aspect, near, far);
    cameraNX.up.set(0, -1, 0);
    cameraNX.lookAt(new Vector3(-1, 0, 0));
    this.add(cameraNX);
    var cameraPY = new PerspectiveCamera(fov, aspect, near, far);
    cameraPY.up.set(0, 0, 1);
    cameraPY.lookAt(new Vector3(0, 1, 0));
    this.add(cameraPY);
    var cameraNY = new PerspectiveCamera(fov, aspect, near, far);
    cameraNY.up.set(0, 0, -1);
    cameraNY.lookAt(new Vector3(0, -1, 0));
    this.add(cameraNY);
    var cameraPZ = new PerspectiveCamera(fov, aspect, near, far);
    cameraPZ.up.set(0, -1, 0);
    cameraPZ.lookAt(new Vector3(0, 0, 1));
    this.add(cameraPZ);
    var cameraNZ = new PerspectiveCamera(fov, aspect, near, far);
    cameraNZ.up.set(0, -1, 0);
    cameraNZ.lookAt(new Vector3(0, 0, -1));
    this.add(cameraNZ);
    options = options || {
      format: RGBFormat,
      magFilter: LinearFilter,
      minFilter: LinearFilter
    };
    this.renderTarget = new WebGLRenderTargetCube(cubeResolution, cubeResolution, options);
    this.renderTarget.texture.name = "CubeCamera";
    this.update = function(renderer, scene) {
      if (this.parent === null)
        this.updateMatrixWorld();
      var currentRenderTarget = renderer.getRenderTarget();
      var renderTarget = this.renderTarget;
      var generateMipmaps = renderTarget.texture.generateMipmaps;
      renderTarget.texture.generateMipmaps = false;
      renderer.setRenderTarget(renderTarget, 0);
      renderer.render(scene, cameraPX);
      renderer.setRenderTarget(renderTarget, 1);
      renderer.render(scene, cameraNX);
      renderer.setRenderTarget(renderTarget, 2);
      renderer.render(scene, cameraPY);
      renderer.setRenderTarget(renderTarget, 3);
      renderer.render(scene, cameraNY);
      renderer.setRenderTarget(renderTarget, 4);
      renderer.render(scene, cameraPZ);
      renderTarget.texture.generateMipmaps = generateMipmaps;
      renderer.setRenderTarget(renderTarget, 5);
      renderer.render(scene, cameraNZ);
      renderer.setRenderTarget(currentRenderTarget);
    };
    this.clear = function(renderer, color, depth, stencil) {
      var currentRenderTarget = renderer.getRenderTarget();
      var renderTarget = this.renderTarget;
      for (var i = 0; i < 6; i++) {
        renderTarget.activeCubeFace = i;
        renderer.setRenderTarget(renderTarget);
        renderer.clear(color, depth, stencil);
      }
      renderer.setRenderTarget(currentRenderTarget);
    };
  }
  CubeCamera.prototype = Object.create(Object3D.prototype);
  CubeCamera.prototype.constructor = CubeCamera;
  function Clock(autoStart) {
    this.autoStart = (autoStart !== undefined) ? autoStart : true;
    this.startTime = 0;
    this.oldTime = 0;
    this.elapsedTime = 0;
    this.running = false;
  }
  Object.assign(Clock.prototype, {
    start: function() {
      this.startTime = (typeof performance === 'undefined' ? Date : performance).now();
      this.oldTime = this.startTime;
      this.elapsedTime = 0;
      this.running = true;
    },
    stop: function() {
      this.getElapsedTime();
      this.running = false;
      this.autoStart = false;
    },
    getElapsedTime: function() {
      this.getDelta();
      return this.elapsedTime;
    },
    getDelta: function() {
      var diff = 0;
      if (this.autoStart && !this.running) {
        this.start();
        return 0;
      }
      if (this.running) {
        var newTime = (typeof performance === 'undefined' ? Date : performance).now();
        diff = (newTime - this.oldTime) / 1000;
        this.oldTime = newTime;
        this.elapsedTime += diff;
      }
      return diff;
    }
  });
  function AudioListener() {
    Object3D.call(this);
    this.type = 'AudioListener';
    this.context = AudioContext.getContext();
    this.gain = this.context.createGain();
    this.gain.connect(this.context.destination);
    this.filter = null;
    this.timeDelta = 0;
  }
  AudioListener.prototype = Object.assign(Object.create(Object3D.prototype), {
    constructor: AudioListener,
    getInput: function() {
      return this.gain;
    },
    removeFilter: function() {
      if (this.filter !== null) {
        this.gain.disconnect(this.filter);
        this.filter.disconnect(this.context.destination);
        this.gain.connect(this.context.destination);
        this.filter = null;
      }
      return this;
    },
    getFilter: function() {
      return this.filter;
    },
    setFilter: function(value) {
      if (this.filter !== null) {
        this.gain.disconnect(this.filter);
        this.filter.disconnect(this.context.destination);
      } else {
        this.gain.disconnect(this.context.destination);
      }
      this.filter = value;
      this.gain.connect(this.filter);
      this.filter.connect(this.context.destination);
      return this;
    },
    getMasterVolume: function() {
      return this.gain.gain.value;
    },
    setMasterVolume: function(value) {
      this.gain.gain.setTargetAtTime(value, this.context.currentTime, 0.01);
      return this;
    },
    updateMatrixWorld: (function() {
      var position = new Vector3();
      var quaternion = new Quaternion();
      var scale = new Vector3();
      var orientation = new Vector3();
      var clock = new Clock();
      return function updateMatrixWorld(force) {
        Object3D.prototype.updateMatrixWorld.call(this, force);
        var listener = this.context.listener;
        var up = this.up;
        this.timeDelta = clock.getDelta();
        this.matrixWorld.decompose(position, quaternion, scale);
        orientation.set(0, 0, -1).applyQuaternion(quaternion);
        if (listener.positionX) {
          var endTime = this.context.currentTime + this.timeDelta;
          listener.positionX.linearRampToValueAtTime(position.x, endTime);
          listener.positionY.linearRampToValueAtTime(position.y, endTime);
          listener.positionZ.linearRampToValueAtTime(position.z, endTime);
          listener.forwardX.linearRampToValueAtTime(orientation.x, endTime);
          listener.forwardY.linearRampToValueAtTime(orientation.y, endTime);
          listener.forwardZ.linearRampToValueAtTime(orientation.z, endTime);
          listener.upX.linearRampToValueAtTime(up.x, endTime);
          listener.upY.linearRampToValueAtTime(up.y, endTime);
          listener.upZ.linearRampToValueAtTime(up.z, endTime);
        } else {
          listener.setPosition(position.x, position.y, position.z);
          listener.setOrientation(orientation.x, orientation.y, orientation.z, up.x, up.y, up.z);
        }
      };
    })()
  });
  function Audio(listener) {
    Object3D.call(this);
    this.type = 'Audio';
    this.listener = listener;
    this.context = listener.context;
    this.gain = this.context.createGain();
    this.gain.connect(listener.getInput());
    this.autoplay = false;
    this.buffer = null;
    this.detune = 0;
    this.loop = false;
    this.startTime = 0;
    this.offset = 0;
    this.playbackRate = 1;
    this.isPlaying = false;
    this.hasPlaybackControl = true;
    this.sourceType = 'empty';
    this.filters = [];
  }
  Audio.prototype = Object.assign(Object.create(Object3D.prototype), {
    constructor: Audio,
    getOutput: function() {
      return this.gain;
    },
    setNodeSource: function(audioNode) {
      this.hasPlaybackControl = false;
      this.sourceType = 'audioNode';
      this.source = audioNode;
      this.connect();
      return this;
    },
    setMediaElementSource: function(mediaElement) {
      this.hasPlaybackControl = false;
      this.sourceType = 'mediaNode';
      this.source = this.context.createMediaElementSource(mediaElement);
      this.connect();
      return this;
    },
    setBuffer: function(audioBuffer) {
      this.buffer = audioBuffer;
      this.sourceType = 'buffer';
      if (this.autoplay)
        this.play();
      return this;
    },
    play: function() {
      if (this.isPlaying === true) {
        console.warn('THREE.Audio: Audio is already playing.');
        return;
      }
      if (this.hasPlaybackControl === false) {
        console.warn('THREE.Audio: this Audio has no playback control.');
        return;
      }
      var source = this.context.createBufferSource();
      source.buffer = this.buffer;
      source.loop = this.loop;
      source.onended = this.onEnded.bind(this);
      this.startTime = this.context.currentTime;
      source.start(this.startTime, this.offset);
      this.isPlaying = true;
      this.source = source;
      this.setDetune(this.detune);
      this.setPlaybackRate(this.playbackRate);
      return this.connect();
    },
    pause: function() {
      if (this.hasPlaybackControl === false) {
        console.warn('THREE.Audio: this Audio has no playback control.');
        return;
      }
      if (this.isPlaying === true) {
        this.source.stop();
        this.source.onended = null;
        this.offset += (this.context.currentTime - this.startTime) * this.playbackRate;
        this.isPlaying = false;
      }
      return this;
    },
    stop: function() {
      if (this.hasPlaybackControl === false) {
        console.warn('THREE.Audio: this Audio has no playback control.');
        return;
      }
      this.source.stop();
      this.source.onended = null;
      this.offset = 0;
      this.isPlaying = false;
      return this;
    },
    connect: function() {
      if (this.filters.length > 0) {
        this.source.connect(this.filters[0]);
        for (var i = 1,
            l = this.filters.length; i < l; i++) {
          this.filters[i - 1].connect(this.filters[i]);
        }
        this.filters[this.filters.length - 1].connect(this.getOutput());
      } else {
        this.source.connect(this.getOutput());
      }
      return this;
    },
    disconnect: function() {
      if (this.filters.length > 0) {
        this.source.disconnect(this.filters[0]);
        for (var i = 1,
            l = this.filters.length; i < l; i++) {
          this.filters[i - 1].disconnect(this.filters[i]);
        }
        this.filters[this.filters.length - 1].disconnect(this.getOutput());
      } else {
        this.source.disconnect(this.getOutput());
      }
      return this;
    },
    getFilters: function() {
      return this.filters;
    },
    setFilters: function(value) {
      if (!value)
        value = [];
      if (this.isPlaying === true) {
        this.disconnect();
        this.filters = value;
        this.connect();
      } else {
        this.filters = value;
      }
      return this;
    },
    setDetune: function(value) {
      this.detune = value;
      if (this.source.detune === undefined)
        return;
      if (this.isPlaying === true) {
        this.source.detune.setTargetAtTime(this.detune, this.context.currentTime, 0.01);
      }
      return this;
    },
    getDetune: function() {
      return this.detune;
    },
    getFilter: function() {
      return this.getFilters()[0];
    },
    setFilter: function(filter) {
      return this.setFilters(filter ? [filter] : []);
    },
    setPlaybackRate: function(value) {
      if (this.hasPlaybackControl === false) {
        console.warn('THREE.Audio: this Audio has no playback control.');
        return;
      }
      this.playbackRate = value;
      if (this.isPlaying === true) {
        this.source.playbackRate.setTargetAtTime(this.playbackRate, this.context.currentTime, 0.01);
      }
      return this;
    },
    getPlaybackRate: function() {
      return this.playbackRate;
    },
    onEnded: function() {
      this.isPlaying = false;
    },
    getLoop: function() {
      if (this.hasPlaybackControl === false) {
        console.warn('THREE.Audio: this Audio has no playback control.');
        return false;
      }
      return this.loop;
    },
    setLoop: function(value) {
      if (this.hasPlaybackControl === false) {
        console.warn('THREE.Audio: this Audio has no playback control.');
        return;
      }
      this.loop = value;
      if (this.isPlaying === true) {
        this.source.loop = this.loop;
      }
      return this;
    },
    getVolume: function() {
      return this.gain.gain.value;
    },
    setVolume: function(value) {
      this.gain.gain.setTargetAtTime(value, this.context.currentTime, 0.01);
      return this;
    }
  });
  function PositionalAudio(listener) {
    Audio.call(this, listener);
    this.panner = this.context.createPanner();
    this.panner.connect(this.gain);
  }
  PositionalAudio.prototype = Object.assign(Object.create(Audio.prototype), {
    constructor: PositionalAudio,
    getOutput: function() {
      return this.panner;
    },
    getRefDistance: function() {
      return this.panner.refDistance;
    },
    setRefDistance: function(value) {
      this.panner.refDistance = value;
      return this;
    },
    getRolloffFactor: function() {
      return this.panner.rolloffFactor;
    },
    setRolloffFactor: function(value) {
      this.panner.rolloffFactor = value;
      return this;
    },
    getDistanceModel: function() {
      return this.panner.distanceModel;
    },
    setDistanceModel: function(value) {
      this.panner.distanceModel = value;
      return this;
    },
    getMaxDistance: function() {
      return this.panner.maxDistance;
    },
    setMaxDistance: function(value) {
      this.panner.maxDistance = value;
      return this;
    },
    setDirectionalCone: function(coneInnerAngle, coneOuterAngle, coneOuterGain) {
      this.panner.coneInnerAngle = coneInnerAngle;
      this.panner.coneOuterAngle = coneOuterAngle;
      this.panner.coneOuterGain = coneOuterGain;
      return this;
    },
    updateMatrixWorld: (function() {
      var position = new Vector3();
      var quaternion = new Quaternion();
      var scale = new Vector3();
      var orientation = new Vector3();
      return function updateMatrixWorld(force) {
        Object3D.prototype.updateMatrixWorld.call(this, force);
        if (this.hasPlaybackControl === true && this.isPlaying === false)
          return;
        this.matrixWorld.decompose(position, quaternion, scale);
        orientation.set(0, 0, 1).applyQuaternion(quaternion);
        var panner = this.panner;
        if (panner.positionX) {
          var endTime = this.context.currentTime + this.listener.timeDelta;
          panner.positionX.linearRampToValueAtTime(position.x, endTime);
          panner.positionY.linearRampToValueAtTime(position.y, endTime);
          panner.positionZ.linearRampToValueAtTime(position.z, endTime);
          panner.orientationX.linearRampToValueAtTime(orientation.x, endTime);
          panner.orientationY.linearRampToValueAtTime(orientation.y, endTime);
          panner.orientationZ.linearRampToValueAtTime(orientation.z, endTime);
        } else {
          panner.setPosition(position.x, position.y, position.z);
          panner.setOrientation(orientation.x, orientation.y, orientation.z);
        }
      };
    })()
  });
  function AudioAnalyser(audio, fftSize) {
    this.analyser = audio.context.createAnalyser();
    this.analyser.fftSize = fftSize !== undefined ? fftSize : 2048;
    this.data = new Uint8Array(this.analyser.frequencyBinCount);
    audio.getOutput().connect(this.analyser);
  }
  Object.assign(AudioAnalyser.prototype, {
    getFrequencyData: function() {
      this.analyser.getByteFrequencyData(this.data);
      return this.data;
    },
    getAverageFrequency: function() {
      var value = 0,
          data = this.getFrequencyData();
      for (var i = 0; i < data.length; i++) {
        value += data[i];
      }
      return value / data.length;
    }
  });
  function PropertyMixer(binding, typeName, valueSize) {
    this.binding = binding;
    this.valueSize = valueSize;
    var bufferType = Float64Array,
        mixFunction;
    switch (typeName) {
      case 'quaternion':
        mixFunction = this._slerp;
        break;
      case 'string':
      case 'bool':
        bufferType = Array;
        mixFunction = this._select;
        break;
      default:
        mixFunction = this._lerp;
    }
    this.buffer = new bufferType(valueSize * 4);
    this._mixBufferRegion = mixFunction;
    this.cumulativeWeight = 0;
    this.useCount = 0;
    this.referenceCount = 0;
  }
  Object.assign(PropertyMixer.prototype, {
    accumulate: function(accuIndex, weight) {
      var buffer = this.buffer,
          stride = this.valueSize,
          offset = accuIndex * stride + stride,
          currentWeight = this.cumulativeWeight;
      if (currentWeight === 0) {
        for (var i = 0; i !== stride; ++i) {
          buffer[offset + i] = buffer[i];
        }
        currentWeight = weight;
      } else {
        currentWeight += weight;
        var mix = weight / currentWeight;
        this._mixBufferRegion(buffer, offset, 0, mix, stride);
      }
      this.cumulativeWeight = currentWeight;
    },
    apply: function(accuIndex) {
      var stride = this.valueSize,
          buffer = this.buffer,
          offset = accuIndex * stride + stride,
          weight = this.cumulativeWeight,
          binding = this.binding;
      this.cumulativeWeight = 0;
      if (weight < 1) {
        var originalValueOffset = stride * 3;
        this._mixBufferRegion(buffer, offset, originalValueOffset, 1 - weight, stride);
      }
      for (var i = stride,
          e = stride + stride; i !== e; ++i) {
        if (buffer[i] !== buffer[i + stride]) {
          binding.setValue(buffer, offset);
          break;
        }
      }
    },
    saveOriginalState: function() {
      var binding = this.binding;
      var buffer = this.buffer,
          stride = this.valueSize,
          originalValueOffset = stride * 3;
      binding.getValue(buffer, originalValueOffset);
      for (var i = stride,
          e = originalValueOffset; i !== e; ++i) {
        buffer[i] = buffer[originalValueOffset + (i % stride)];
      }
      this.cumulativeWeight = 0;
    },
    restoreOriginalState: function() {
      var originalValueOffset = this.valueSize * 3;
      this.binding.setValue(this.buffer, originalValueOffset);
    },
    _select: function(buffer, dstOffset, srcOffset, t, stride) {
      if (t >= 0.5) {
        for (var i = 0; i !== stride; ++i) {
          buffer[dstOffset + i] = buffer[srcOffset + i];
        }
      }
    },
    _slerp: function(buffer, dstOffset, srcOffset, t) {
      Quaternion.slerpFlat(buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t);
    },
    _lerp: function(buffer, dstOffset, srcOffset, t, stride) {
      var s = 1 - t;
      for (var i = 0; i !== stride; ++i) {
        var j = dstOffset + i;
        buffer[j] = buffer[j] * s + buffer[srcOffset + i] * t;
      }
    }
  });
  var RESERVED_CHARS_RE = '\\[\\]\\.:\\/';
  function Composite(targetGroup, path, optionalParsedPath) {
    var parsedPath = optionalParsedPath || PropertyBinding.parseTrackName(path);
    this._targetGroup = targetGroup;
    this._bindings = targetGroup.subscribe_(path, parsedPath);
  }
  Object.assign(Composite.prototype, {
    getValue: function(array, offset) {
      this.bind();
      var firstValidIndex = this._targetGroup.nCachedObjects_,
          binding = this._bindings[firstValidIndex];
      if (binding !== undefined)
        binding.getValue(array, offset);
    },
    setValue: function(array, offset) {
      var bindings = this._bindings;
      for (var i = this._targetGroup.nCachedObjects_,
          n = bindings.length; i !== n; ++i) {
        bindings[i].setValue(array, offset);
      }
    },
    bind: function() {
      var bindings = this._bindings;
      for (var i = this._targetGroup.nCachedObjects_,
          n = bindings.length; i !== n; ++i) {
        bindings[i].bind();
      }
    },
    unbind: function() {
      var bindings = this._bindings;
      for (var i = this._targetGroup.nCachedObjects_,
          n = bindings.length; i !== n; ++i) {
        bindings[i].unbind();
      }
    }
  });
  function PropertyBinding(rootNode, path, parsedPath) {
    this.path = path;
    this.parsedPath = parsedPath || PropertyBinding.parseTrackName(path);
    this.node = PropertyBinding.findNode(rootNode, this.parsedPath.nodeName) || rootNode;
    this.rootNode = rootNode;
  }
  Object.assign(PropertyBinding, {
    Composite: Composite,
    create: function(root, path, parsedPath) {
      if (!(root && root.isAnimationObjectGroup)) {
        return new PropertyBinding(root, path, parsedPath);
      } else {
        return new PropertyBinding.Composite(root, path, parsedPath);
      }
    },
    sanitizeNodeName: (function() {
      var reservedRe = new RegExp('[' + RESERVED_CHARS_RE + ']', 'g');
      return function sanitizeNodeName(name) {
        return name.replace(/\s/g, '_').replace(reservedRe, '');
      };
    }()),
    parseTrackName: function() {
      var wordChar = '[^' + RESERVED_CHARS_RE + ']';
      var wordCharOrDot = '[^' + RESERVED_CHARS_RE.replace('\\.', '') + ']';
      var directoryRe = /((?:WC+[\/:])*)/.source.replace('WC', wordChar);
      var nodeRe = /(WCOD+)?/.source.replace('WCOD', wordCharOrDot);
      var objectRe = /(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace('WC', wordChar);
      var propertyRe = /\.(WC+)(?:\[(.+)\])?/.source.replace('WC', wordChar);
      var trackRe = new RegExp('' + '^' + directoryRe + nodeRe + objectRe + propertyRe + '$');
      var supportedObjectNames = ['material', 'materials', 'bones'];
      return function parseTrackName(trackName) {
        var matches = trackRe.exec(trackName);
        if (!matches) {
          throw new Error('PropertyBinding: Cannot parse trackName: ' + trackName);
        }
        var results = {
          nodeName: matches[2],
          objectName: matches[3],
          objectIndex: matches[4],
          propertyName: matches[5],
          propertyIndex: matches[6]
        };
        var lastDot = results.nodeName && results.nodeName.lastIndexOf('.');
        if (lastDot !== undefined && lastDot !== -1) {
          var objectName = results.nodeName.substring(lastDot + 1);
          if (supportedObjectNames.indexOf(objectName) !== -1) {
            results.nodeName = results.nodeName.substring(0, lastDot);
            results.objectName = objectName;
          }
        }
        if (results.propertyName === null || results.propertyName.length === 0) {
          throw new Error('PropertyBinding: can not parse propertyName from trackName: ' + trackName);
        }
        return results;
      };
    }(),
    findNode: function(root, nodeName) {
      if (!nodeName || nodeName === "" || nodeName === "root" || nodeName === "." || nodeName === -1 || nodeName === root.name || nodeName === root.uuid) {
        return root;
      }
      if (root.skeleton) {
        var bone = root.skeleton.getBoneByName(nodeName);
        if (bone !== undefined) {
          return bone;
        }
      }
      if (root.children) {
        var searchNodeSubtree = function(children) {
          for (var i = 0; i < children.length; i++) {
            var childNode = children[i];
            if (childNode.name === nodeName || childNode.uuid === nodeName) {
              return childNode;
            }
            var result = searchNodeSubtree(childNode.children);
            if (result)
              return result;
          }
          return null;
        };
        var subTreeNode = searchNodeSubtree(root.children);
        if (subTreeNode) {
          return subTreeNode;
        }
      }
      return null;
    }
  });
  Object.assign(PropertyBinding.prototype, {
    _getValue_unavailable: function() {},
    _setValue_unavailable: function() {},
    BindingType: {
      Direct: 0,
      EntireArray: 1,
      ArrayElement: 2,
      HasFromToArray: 3
    },
    Versioning: {
      None: 0,
      NeedsUpdate: 1,
      MatrixWorldNeedsUpdate: 2
    },
    GetterByBindingType: [function getValue_direct(buffer, offset) {
      buffer[offset] = this.node[this.propertyName];
    }, function getValue_array(buffer, offset) {
      var source = this.resolvedProperty;
      for (var i = 0,
          n = source.length; i !== n; ++i) {
        buffer[offset++] = source[i];
      }
    }, function getValue_arrayElement(buffer, offset) {
      buffer[offset] = this.resolvedProperty[this.propertyIndex];
    }, function getValue_toArray(buffer, offset) {
      this.resolvedProperty.toArray(buffer, offset);
    }],
    SetterByBindingTypeAndVersioning: [[function setValue_direct(buffer, offset) {
      this.targetObject[this.propertyName] = buffer[offset];
    }, function setValue_direct_setNeedsUpdate(buffer, offset) {
      this.targetObject[this.propertyName] = buffer[offset];
      this.targetObject.needsUpdate = true;
    }, function setValue_direct_setMatrixWorldNeedsUpdate(buffer, offset) {
      this.targetObject[this.propertyName] = buffer[offset];
      this.targetObject.matrixWorldNeedsUpdate = true;
    }], [function setValue_array(buffer, offset) {
      var dest = this.resolvedProperty;
      for (var i = 0,
          n = dest.length; i !== n; ++i) {
        dest[i] = buffer[offset++];
      }
    }, function setValue_array_setNeedsUpdate(buffer, offset) {
      var dest = this.resolvedProperty;
      for (var i = 0,
          n = dest.length; i !== n; ++i) {
        dest[i] = buffer[offset++];
      }
      this.targetObject.needsUpdate = true;
    }, function setValue_array_setMatrixWorldNeedsUpdate(buffer, offset) {
      var dest = this.resolvedProperty;
      for (var i = 0,
          n = dest.length; i !== n; ++i) {
        dest[i] = buffer[offset++];
      }
      this.targetObject.matrixWorldNeedsUpdate = true;
    }], [function setValue_arrayElement(buffer, offset) {
      this.resolvedProperty[this.propertyIndex] = buffer[offset];
    }, function setValue_arrayElement_setNeedsUpdate(buffer, offset) {
      this.resolvedProperty[this.propertyIndex] = buffer[offset];
      this.targetObject.needsUpdate = true;
    }, function setValue_arrayElement_setMatrixWorldNeedsUpdate(buffer, offset) {
      this.resolvedProperty[this.propertyIndex] = buffer[offset];
      this.targetObject.matrixWorldNeedsUpdate = true;
    }], [function setValue_fromArray(buffer, offset) {
      this.resolvedProperty.fromArray(buffer, offset);
    }, function setValue_fromArray_setNeedsUpdate(buffer, offset) {
      this.resolvedProperty.fromArray(buffer, offset);
      this.targetObject.needsUpdate = true;
    }, function setValue_fromArray_setMatrixWorldNeedsUpdate(buffer, offset) {
      this.resolvedProperty.fromArray(buffer, offset);
      this.targetObject.matrixWorldNeedsUpdate = true;
    }]],
    getValue: function getValue_unbound(targetArray, offset) {
      this.bind();
      this.getValue(targetArray, offset);
    },
    setValue: function getValue_unbound(sourceArray, offset) {
      this.bind();
      this.setValue(sourceArray, offset);
    },
    bind: function() {
      var targetObject = this.node,
          parsedPath = this.parsedPath,
          objectName = parsedPath.objectName,
          propertyName = parsedPath.propertyName,
          propertyIndex = parsedPath.propertyIndex;
      if (!targetObject) {
        targetObject = PropertyBinding.findNode(this.rootNode, parsedPath.nodeName) || this.rootNode;
        this.node = targetObject;
      }
      this.getValue = this._getValue_unavailable;
      this.setValue = this._setValue_unavailable;
      if (!targetObject) {
        console.error('THREE.PropertyBinding: Trying to update node for track: ' + this.path + ' but it wasn\'t found.');
        return;
      }
      if (objectName) {
        var objectIndex = parsedPath.objectIndex;
        switch (objectName) {
          case 'materials':
            if (!targetObject.material) {
              console.error('THREE.PropertyBinding: Can not bind to material as node does not have a material.', this);
              return;
            }
            if (!targetObject.material.materials) {
              console.error('THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.', this);
              return;
            }
            targetObject = targetObject.material.materials;
            break;
          case 'bones':
            if (!targetObject.skeleton) {
              console.error('THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.', this);
              return;
            }
            targetObject = targetObject.skeleton.bones;
            for (var i = 0; i < targetObject.length; i++) {
              if (targetObject[i].name === objectIndex) {
                objectIndex = i;
                break;
              }
            }
            break;
          default:
            if (targetObject[objectName] === undefined) {
              console.error('THREE.PropertyBinding: Can not bind to objectName of node undefined.', this);
              return;
            }
            targetObject = targetObject[objectName];
        }
        if (objectIndex !== undefined) {
          if (targetObject[objectIndex] === undefined) {
            console.error('THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.', this, targetObject);
            return;
          }
          targetObject = targetObject[objectIndex];
        }
      }
      var nodeProperty = targetObject[propertyName];
      if (nodeProperty === undefined) {
        var nodeName = parsedPath.nodeName;
        console.error('THREE.PropertyBinding: Trying to update property for track: ' + nodeName + '.' + propertyName + ' but it wasn\'t found.', targetObject);
        return;
      }
      var versioning = this.Versioning.None;
      this.targetObject = targetObject;
      if (targetObject.needsUpdate !== undefined) {
        versioning = this.Versioning.NeedsUpdate;
      } else if (targetObject.matrixWorldNeedsUpdate !== undefined) {
        versioning = this.Versioning.MatrixWorldNeedsUpdate;
      }
      var bindingType = this.BindingType.Direct;
      if (propertyIndex !== undefined) {
        if (propertyName === "morphTargetInfluences") {
          if (!targetObject.geometry) {
            console.error('THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.', this);
            return;
          }
          if (targetObject.geometry.isBufferGeometry) {
            if (!targetObject.geometry.morphAttributes) {
              console.error('THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.', this);
              return;
            }
            for (var i = 0; i < this.node.geometry.morphAttributes.position.length; i++) {
              if (targetObject.geometry.morphAttributes.position[i].name === propertyIndex) {
                propertyIndex = i;
                break;
              }
            }
          } else {
            if (!targetObject.geometry.morphTargets) {
              console.error('THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphTargets.', this);
              return;
            }
            for (var i = 0; i < this.node.geometry.morphTargets.length; i++) {
              if (targetObject.geometry.morphTargets[i].name === propertyIndex) {
                propertyIndex = i;
                break;
              }
            }
          }
        }
        bindingType = this.BindingType.ArrayElement;
        this.resolvedProperty = nodeProperty;
        this.propertyIndex = propertyIndex;
      } else if (nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined) {
        bindingType = this.BindingType.HasFromToArray;
        this.resolvedProperty = nodeProperty;
      } else if (Array.isArray(nodeProperty)) {
        bindingType = this.BindingType.EntireArray;
        this.resolvedProperty = nodeProperty;
      } else {
        this.propertyName = propertyName;
      }
      this.getValue = this.GetterByBindingType[bindingType];
      this.setValue = this.SetterByBindingTypeAndVersioning[bindingType][versioning];
    },
    unbind: function() {
      this.node = null;
      this.getValue = this._getValue_unbound;
      this.setValue = this._setValue_unbound;
    }
  });
  Object.assign(PropertyBinding.prototype, {
    _getValue_unbound: PropertyBinding.prototype.getValue,
    _setValue_unbound: PropertyBinding.prototype.setValue
  });
  function AnimationObjectGroup() {
    this.uuid = _Math.generateUUID();
    this._objects = Array.prototype.slice.call(arguments);
    this.nCachedObjects_ = 0;
    var indices = {};
    this._indicesByUUID = indices;
    for (var i = 0,
        n = arguments.length; i !== n; ++i) {
      indices[arguments[i].uuid] = i;
    }
    this._paths = [];
    this._parsedPaths = [];
    this._bindings = [];
    this._bindingsIndicesByPath = {};
    var scope = this;
    this.stats = {
      objects: {
        get total() {
          return scope._objects.length;
        },
        get inUse() {
          return this.total - scope.nCachedObjects_;
        }
      },
      get bindingsPerObject() {
        return scope._bindings.length;
      }
    };
  }
  Object.assign(AnimationObjectGroup.prototype, {
    isAnimationObjectGroup: true,
    add: function() {
      var objects = this._objects,
          nObjects = objects.length,
          nCachedObjects = this.nCachedObjects_,
          indicesByUUID = this._indicesByUUID,
          paths = this._paths,
          parsedPaths = this._parsedPaths,
          bindings = this._bindings,
          nBindings = bindings.length,
          knownObject = undefined;
      for (var i = 0,
          n = arguments.length; i !== n; ++i) {
        var object = arguments[i],
            uuid = object.uuid,
            index = indicesByUUID[uuid];
        if (index === undefined) {
          index = nObjects++;
          indicesByUUID[uuid] = index;
          objects.push(object);
          for (var j = 0,
              m = nBindings; j !== m; ++j) {
            bindings[j].push(new PropertyBinding(object, paths[j], parsedPaths[j]));
          }
        } else if (index < nCachedObjects) {
          knownObject = objects[index];
          var firstActiveIndex = --nCachedObjects,
              lastCachedObject = objects[firstActiveIndex];
          indicesByUUID[lastCachedObject.uuid] = index;
          objects[index] = lastCachedObject;
          indicesByUUID[uuid] = firstActiveIndex;
          objects[firstActiveIndex] = object;
          for (var j = 0,
              m = nBindings; j !== m; ++j) {
            var bindingsForPath = bindings[j],
                lastCached = bindingsForPath[firstActiveIndex],
                binding = bindingsForPath[index];
            bindingsForPath[index] = lastCached;
            if (binding === undefined) {
              binding = new PropertyBinding(object, paths[j], parsedPaths[j]);
            }
            bindingsForPath[firstActiveIndex] = binding;
          }
        } else if (objects[index] !== knownObject) {
          console.error('THREE.AnimationObjectGroup: Different objects with the same UUID ' + 'detected. Clean the caches or recreate your infrastructure when reloading scenes.');
        }
      }
      this.nCachedObjects_ = nCachedObjects;
    },
    remove: function() {
      var objects = this._objects,
          nCachedObjects = this.nCachedObjects_,
          indicesByUUID = this._indicesByUUID,
          bindings = this._bindings,
          nBindings = bindings.length;
      for (var i = 0,
          n = arguments.length; i !== n; ++i) {
        var object = arguments[i],
            uuid = object.uuid,
            index = indicesByUUID[uuid];
        if (index !== undefined && index >= nCachedObjects) {
          var lastCachedIndex = nCachedObjects++,
              firstActiveObject = objects[lastCachedIndex];
          indicesByUUID[firstActiveObject.uuid] = index;
          objects[index] = firstActiveObject;
          indicesByUUID[uuid] = lastCachedIndex;
          objects[lastCachedIndex] = object;
          for (var j = 0,
              m = nBindings; j !== m; ++j) {
            var bindingsForPath = bindings[j],
                firstActive = bindingsForPath[lastCachedIndex],
                binding = bindingsForPath[index];
            bindingsForPath[index] = firstActive;
            bindingsForPath[lastCachedIndex] = binding;
          }
        }
      }
      this.nCachedObjects_ = nCachedObjects;
    },
    uncache: function() {
      var objects = this._objects,
          nObjects = objects.length,
          nCachedObjects = this.nCachedObjects_,
          indicesByUUID = this._indicesByUUID,
          bindings = this._bindings,
          nBindings = bindings.length;
      for (var i = 0,
          n = arguments.length; i !== n; ++i) {
        var object = arguments[i],
            uuid = object.uuid,
            index = indicesByUUID[uuid];
        if (index !== undefined) {
          delete indicesByUUID[uuid];
          if (index < nCachedObjects) {
            var firstActiveIndex = --nCachedObjects,
                lastCachedObject = objects[firstActiveIndex],
                lastIndex = --nObjects,
                lastObject = objects[lastIndex];
            indicesByUUID[lastCachedObject.uuid] = index;
            objects[index] = lastCachedObject;
            indicesByUUID[lastObject.uuid] = firstActiveIndex;
            objects[firstActiveIndex] = lastObject;
            objects.pop();
            for (var j = 0,
                m = nBindings; j !== m; ++j) {
              var bindingsForPath = bindings[j],
                  lastCached = bindingsForPath[firstActiveIndex],
                  last = bindingsForPath[lastIndex];
              bindingsForPath[index] = lastCached;
              bindingsForPath[firstActiveIndex] = last;
              bindingsForPath.pop();
            }
          } else {
            var lastIndex = --nObjects,
                lastObject = objects[lastIndex];
            indicesByUUID[lastObject.uuid] = index;
            objects[index] = lastObject;
            objects.pop();
            for (var j = 0,
                m = nBindings; j !== m; ++j) {
              var bindingsForPath = bindings[j];
              bindingsForPath[index] = bindingsForPath[lastIndex];
              bindingsForPath.pop();
            }
          }
        }
      }
      this.nCachedObjects_ = nCachedObjects;
    },
    subscribe_: function(path, parsedPath) {
      var indicesByPath = this._bindingsIndicesByPath,
          index = indicesByPath[path],
          bindings = this._bindings;
      if (index !== undefined)
        return bindings[index];
      var paths = this._paths,
          parsedPaths = this._parsedPaths,
          objects = this._objects,
          nObjects = objects.length,
          nCachedObjects = this.nCachedObjects_,
          bindingsForPath = new Array(nObjects);
      index = bindings.length;
      indicesByPath[path] = index;
      paths.push(path);
      parsedPaths.push(parsedPath);
      bindings.push(bindingsForPath);
      for (var i = nCachedObjects,
          n = objects.length; i !== n; ++i) {
        var object = objects[i];
        bindingsForPath[i] = new PropertyBinding(object, path, parsedPath);
      }
      return bindingsForPath;
    },
    unsubscribe_: function(path) {
      var indicesByPath = this._bindingsIndicesByPath,
          index = indicesByPath[path];
      if (index !== undefined) {
        var paths = this._paths,
            parsedPaths = this._parsedPaths,
            bindings = this._bindings,
            lastBindingsIndex = bindings.length - 1,
            lastBindings = bindings[lastBindingsIndex],
            lastBindingsPath = path[lastBindingsIndex];
        indicesByPath[lastBindingsPath] = index;
        bindings[index] = lastBindings;
        bindings.pop();
        parsedPaths[index] = parsedPaths[lastBindingsIndex];
        parsedPaths.pop();
        paths[index] = paths[lastBindingsIndex];
        paths.pop();
      }
    }
  });
  function AnimationAction(mixer, clip, localRoot) {
    this._mixer = mixer;
    this._clip = clip;
    this._localRoot = localRoot || null;
    var tracks = clip.tracks,
        nTracks = tracks.length,
        interpolants = new Array(nTracks);
    var interpolantSettings = {
      endingStart: ZeroCurvatureEnding,
      endingEnd: ZeroCurvatureEnding
    };
    for (var i = 0; i !== nTracks; ++i) {
      var interpolant = tracks[i].createInterpolant(null);
      interpolants[i] = interpolant;
      interpolant.settings = interpolantSettings;
    }
    this._interpolantSettings = interpolantSettings;
    this._interpolants = interpolants;
    this._propertyBindings = new Array(nTracks);
    this._cacheIndex = null;
    this._byClipCacheIndex = null;
    this._timeScaleInterpolant = null;
    this._weightInterpolant = null;
    this.loop = LoopRepeat;
    this._loopCount = -1;
    this._startTime = null;
    this.time = 0;
    this.timeScale = 1;
    this._effectiveTimeScale = 1;
    this.weight = 1;
    this._effectiveWeight = 1;
    this.repetitions = Infinity;
    this.paused = false;
    this.enabled = true;
    this.clampWhenFinished = false;
    this.zeroSlopeAtStart = true;
    this.zeroSlopeAtEnd = true;
  }
  Object.assign(AnimationAction.prototype, {
    play: function() {
      this._mixer._activateAction(this);
      return this;
    },
    stop: function() {
      this._mixer._deactivateAction(this);
      return this.reset();
    },
    reset: function() {
      this.paused = false;
      this.enabled = true;
      this.time = 0;
      this._loopCount = -1;
      this._startTime = null;
      return this.stopFading().stopWarping();
    },
    isRunning: function() {
      return this.enabled && !this.paused && this.timeScale !== 0 && this._startTime === null && this._mixer._isActiveAction(this);
    },
    isScheduled: function() {
      return this._mixer._isActiveAction(this);
    },
    startAt: function(time) {
      this._startTime = time;
      return this;
    },
    setLoop: function(mode, repetitions) {
      this.loop = mode;
      this.repetitions = repetitions;
      return this;
    },
    setEffectiveWeight: function(weight) {
      this.weight = weight;
      this._effectiveWeight = this.enabled ? weight : 0;
      return this.stopFading();
    },
    getEffectiveWeight: function() {
      return this._effectiveWeight;
    },
    fadeIn: function(duration) {
      return this._scheduleFading(duration, 0, 1);
    },
    fadeOut: function(duration) {
      return this._scheduleFading(duration, 1, 0);
    },
    crossFadeFrom: function(fadeOutAction, duration, warp) {
      fadeOutAction.fadeOut(duration);
      this.fadeIn(duration);
      if (warp) {
        var fadeInDuration = this._clip.duration,
            fadeOutDuration = fadeOutAction._clip.duration,
            startEndRatio = fadeOutDuration / fadeInDuration,
            endStartRatio = fadeInDuration / fadeOutDuration;
        fadeOutAction.warp(1.0, startEndRatio, duration);
        this.warp(endStartRatio, 1.0, duration);
      }
      return this;
    },
    crossFadeTo: function(fadeInAction, duration, warp) {
      return fadeInAction.crossFadeFrom(this, duration, warp);
    },
    stopFading: function() {
      var weightInterpolant = this._weightInterpolant;
      if (weightInterpolant !== null) {
        this._weightInterpolant = null;
        this._mixer._takeBackControlInterpolant(weightInterpolant);
      }
      return this;
    },
    setEffectiveTimeScale: function(timeScale) {
      this.timeScale = timeScale;
      this._effectiveTimeScale = this.paused ? 0 : timeScale;
      return this.stopWarping();
    },
    getEffectiveTimeScale: function() {
      return this._effectiveTimeScale;
    },
    setDuration: function(duration) {
      this.timeScale = this._clip.duration / duration;
      return this.stopWarping();
    },
    syncWith: function(action) {
      this.time = action.time;
      this.timeScale = action.timeScale;
      return this.stopWarping();
    },
    halt: function(duration) {
      return this.warp(this._effectiveTimeScale, 0, duration);
    },
    warp: function(startTimeScale, endTimeScale, duration) {
      var mixer = this._mixer,
          now = mixer.time,
          interpolant = this._timeScaleInterpolant,
          timeScale = this.timeScale;
      if (interpolant === null) {
        interpolant = mixer._lendControlInterpolant();
        this._timeScaleInterpolant = interpolant;
      }
      var times = interpolant.parameterPositions,
          values = interpolant.sampleValues;
      times[0] = now;
      times[1] = now + duration;
      values[0] = startTimeScale / timeScale;
      values[1] = endTimeScale / timeScale;
      return this;
    },
    stopWarping: function() {
      var timeScaleInterpolant = this._timeScaleInterpolant;
      if (timeScaleInterpolant !== null) {
        this._timeScaleInterpolant = null;
        this._mixer._takeBackControlInterpolant(timeScaleInterpolant);
      }
      return this;
    },
    getMixer: function() {
      return this._mixer;
    },
    getClip: function() {
      return this._clip;
    },
    getRoot: function() {
      return this._localRoot || this._mixer._root;
    },
    _update: function(time, deltaTime, timeDirection, accuIndex) {
      if (!this.enabled) {
        this._updateWeight(time);
        return;
      }
      var startTime = this._startTime;
      if (startTime !== null) {
        var timeRunning = (time - startTime) * timeDirection;
        if (timeRunning < 0 || timeDirection === 0) {
          return;
        }
        this._startTime = null;
        deltaTime = timeDirection * timeRunning;
      }
      deltaTime *= this._updateTimeScale(time);
      var clipTime = this._updateTime(deltaTime);
      var weight = this._updateWeight(time);
      if (weight > 0) {
        var interpolants = this._interpolants;
        var propertyMixers = this._propertyBindings;
        for (var j = 0,
            m = interpolants.length; j !== m; ++j) {
          interpolants[j].evaluate(clipTime);
          propertyMixers[j].accumulate(accuIndex, weight);
        }
      }
    },
    _updateWeight: function(time) {
      var weight = 0;
      if (this.enabled) {
        weight = this.weight;
        var interpolant = this._weightInterpolant;
        if (interpolant !== null) {
          var interpolantValue = interpolant.evaluate(time)[0];
          weight *= interpolantValue;
          if (time > interpolant.parameterPositions[1]) {
            this.stopFading();
            if (interpolantValue === 0) {
              this.enabled = false;
            }
          }
        }
      }
      this._effectiveWeight = weight;
      return weight;
    },
    _updateTimeScale: function(time) {
      var timeScale = 0;
      if (!this.paused) {
        timeScale = this.timeScale;
        var interpolant = this._timeScaleInterpolant;
        if (interpolant !== null) {
          var interpolantValue = interpolant.evaluate(time)[0];
          timeScale *= interpolantValue;
          if (time > interpolant.parameterPositions[1]) {
            this.stopWarping();
            if (timeScale === 0) {
              this.paused = true;
            } else {
              this.timeScale = timeScale;
            }
          }
        }
      }
      this._effectiveTimeScale = timeScale;
      return timeScale;
    },
    _updateTime: function(deltaTime) {
      var time = this.time + deltaTime;
      var duration = this._clip.duration;
      var loop = this.loop;
      var loopCount = this._loopCount;
      var pingPong = (loop === LoopPingPong);
      if (deltaTime === 0) {
        if (loopCount === -1)
          return time;
        return (pingPong && (loopCount & 1) === 1) ? duration - time : time;
      }
      if (loop === LoopOnce) {
        if (loopCount === -1) {
          this._loopCount = 0;
          this._setEndings(true, true, false);
        }
        handle_stop: {
          if (time >= duration) {
            time = duration;
          } else if (time < 0) {
            time = 0;
          } else
            break handle_stop;
          if (this.clampWhenFinished)
            this.paused = true;
          else
            this.enabled = false;
          this._mixer.dispatchEvent({
            type: 'finished',
            action: this,
            direction: deltaTime < 0 ? -1 : 1
          });
        }
      } else {
        if (loopCount === -1) {
          if (deltaTime >= 0) {
            loopCount = 0;
            this._setEndings(true, this.repetitions === 0, pingPong);
          } else {
            this._setEndings(this.repetitions === 0, true, pingPong);
          }
        }
        if (time >= duration || time < 0) {
          var loopDelta = Math.floor(time / duration);
          time -= duration * loopDelta;
          loopCount += Math.abs(loopDelta);
          var pending = this.repetitions - loopCount;
          if (pending <= 0) {
            if (this.clampWhenFinished)
              this.paused = true;
            else
              this.enabled = false;
            time = deltaTime > 0 ? duration : 0;
            this._mixer.dispatchEvent({
              type: 'finished',
              action: this,
              direction: deltaTime > 0 ? 1 : -1
            });
          } else {
            if (pending === 1) {
              var atStart = deltaTime < 0;
              this._setEndings(atStart, !atStart, pingPong);
            } else {
              this._setEndings(false, false, pingPong);
            }
            this._loopCount = loopCount;
            this._mixer.dispatchEvent({
              type: 'loop',
              action: this,
              loopDelta: loopDelta
            });
          }
        }
        if (pingPong && (loopCount & 1) === 1) {
          this.time = time;
          return duration - time;
        }
      }
      this.time = time;
      return time;
    },
    _setEndings: function(atStart, atEnd, pingPong) {
      var settings = this._interpolantSettings;
      if (pingPong) {
        settings.endingStart = ZeroSlopeEnding;
        settings.endingEnd = ZeroSlopeEnding;
      } else {
        if (atStart) {
          settings.endingStart = this.zeroSlopeAtStart ? ZeroSlopeEnding : ZeroCurvatureEnding;
        } else {
          settings.endingStart = WrapAroundEnding;
        }
        if (atEnd) {
          settings.endingEnd = this.zeroSlopeAtEnd ? ZeroSlopeEnding : ZeroCurvatureEnding;
        } else {
          settings.endingEnd = WrapAroundEnding;
        }
      }
    },
    _scheduleFading: function(duration, weightNow, weightThen) {
      var mixer = this._mixer,
          now = mixer.time,
          interpolant = this._weightInterpolant;
      if (interpolant === null) {
        interpolant = mixer._lendControlInterpolant();
        this._weightInterpolant = interpolant;
      }
      var times = interpolant.parameterPositions,
          values = interpolant.sampleValues;
      times[0] = now;
      values[0] = weightNow;
      times[1] = now + duration;
      values[1] = weightThen;
      return this;
    }
  });
  function AnimationMixer(root) {
    this._root = root;
    this._initMemoryManager();
    this._accuIndex = 0;
    this.time = 0;
    this.timeScale = 1.0;
  }
  AnimationMixer.prototype = Object.assign(Object.create(EventDispatcher.prototype), {
    constructor: AnimationMixer,
    _bindAction: function(action, prototypeAction) {
      var root = action._localRoot || this._root,
          tracks = action._clip.tracks,
          nTracks = tracks.length,
          bindings = action._propertyBindings,
          interpolants = action._interpolants,
          rootUuid = root.uuid,
          bindingsByRoot = this._bindingsByRootAndName,
          bindingsByName = bindingsByRoot[rootUuid];
      if (bindingsByName === undefined) {
        bindingsByName = {};
        bindingsByRoot[rootUuid] = bindingsByName;
      }
      for (var i = 0; i !== nTracks; ++i) {
        var track = tracks[i],
            trackName = track.name,
            binding = bindingsByName[trackName];
        if (binding !== undefined) {
          bindings[i] = binding;
        } else {
          binding = bindings[i];
          if (binding !== undefined) {
            if (binding._cacheIndex === null) {
              ++binding.referenceCount;
              this._addInactiveBinding(binding, rootUuid, trackName);
            }
            continue;
          }
          var path = prototypeAction && prototypeAction._propertyBindings[i].binding.parsedPath;
          binding = new PropertyMixer(PropertyBinding.create(root, trackName, path), track.ValueTypeName, track.getValueSize());
          ++binding.referenceCount;
          this._addInactiveBinding(binding, rootUuid, trackName);
          bindings[i] = binding;
        }
        interpolants[i].resultBuffer = binding.buffer;
      }
    },
    _activateAction: function(action) {
      if (!this._isActiveAction(action)) {
        if (action._cacheIndex === null) {
          var rootUuid = (action._localRoot || this._root).uuid,
              clipUuid = action._clip.uuid,
              actionsForClip = this._actionsByClip[clipUuid];
          this._bindAction(action, actionsForClip && actionsForClip.knownActions[0]);
          this._addInactiveAction(action, clipUuid, rootUuid);
        }
        var bindings = action._propertyBindings;
        for (var i = 0,
            n = bindings.length; i !== n; ++i) {
          var binding = bindings[i];
          if (binding.useCount++ === 0) {
            this._lendBinding(binding);
            binding.saveOriginalState();
          }
        }
        this._lendAction(action);
      }
    },
    _deactivateAction: function(action) {
      if (this._isActiveAction(action)) {
        var bindings = action._propertyBindings;
        for (var i = 0,
            n = bindings.length; i !== n; ++i) {
          var binding = bindings[i];
          if (--binding.useCount === 0) {
            binding.restoreOriginalState();
            this._takeBackBinding(binding);
          }
        }
        this._takeBackAction(action);
      }
    },
    _initMemoryManager: function() {
      this._actions = [];
      this._nActiveActions = 0;
      this._actionsByClip = {};
      this._bindings = [];
      this._nActiveBindings = 0;
      this._bindingsByRootAndName = {};
      this._controlInterpolants = [];
      this._nActiveControlInterpolants = 0;
      var scope = this;
      this.stats = {
        actions: {
          get total() {
            return scope._actions.length;
          },
          get inUse() {
            return scope._nActiveActions;
          }
        },
        bindings: {
          get total() {
            return scope._bindings.length;
          },
          get inUse() {
            return scope._nActiveBindings;
          }
        },
        controlInterpolants: {
          get total() {
            return scope._controlInterpolants.length;
          },
          get inUse() {
            return scope._nActiveControlInterpolants;
          }
        }
      };
    },
    _isActiveAction: function(action) {
      var index = action._cacheIndex;
      return index !== null && index < this._nActiveActions;
    },
    _addInactiveAction: function(action, clipUuid, rootUuid) {
      var actions = this._actions,
          actionsByClip = this._actionsByClip,
          actionsForClip = actionsByClip[clipUuid];
      if (actionsForClip === undefined) {
        actionsForClip = {
          knownActions: [action],
          actionByRoot: {}
        };
        action._byClipCacheIndex = 0;
        actionsByClip[clipUuid] = actionsForClip;
      } else {
        var knownActions = actionsForClip.knownActions;
        action._byClipCacheIndex = knownActions.length;
        knownActions.push(action);
      }
      action._cacheIndex = actions.length;
      actions.push(action);
      actionsForClip.actionByRoot[rootUuid] = action;
    },
    _removeInactiveAction: function(action) {
      var actions = this._actions,
          lastInactiveAction = actions[actions.length - 1],
          cacheIndex = action._cacheIndex;
      lastInactiveAction._cacheIndex = cacheIndex;
      actions[cacheIndex] = lastInactiveAction;
      actions.pop();
      action._cacheIndex = null;
      var clipUuid = action._clip.uuid,
          actionsByClip = this._actionsByClip,
          actionsForClip = actionsByClip[clipUuid],
          knownActionsForClip = actionsForClip.knownActions,
          lastKnownAction = knownActionsForClip[knownActionsForClip.length - 1],
          byClipCacheIndex = action._byClipCacheIndex;
      lastKnownAction._byClipCacheIndex = byClipCacheIndex;
      knownActionsForClip[byClipCacheIndex] = lastKnownAction;
      knownActionsForClip.pop();
      action._byClipCacheIndex = null;
      var actionByRoot = actionsForClip.actionByRoot,
          rootUuid = (action._localRoot || this._root).uuid;
      delete actionByRoot[rootUuid];
      if (knownActionsForClip.length === 0) {
        delete actionsByClip[clipUuid];
      }
      this._removeInactiveBindingsForAction(action);
    },
    _removeInactiveBindingsForAction: function(action) {
      var bindings = action._propertyBindings;
      for (var i = 0,
          n = bindings.length; i !== n; ++i) {
        var binding = bindings[i];
        if (--binding.referenceCount === 0) {
          this._removeInactiveBinding(binding);
        }
      }
    },
    _lendAction: function(action) {
      var actions = this._actions,
          prevIndex = action._cacheIndex,
          lastActiveIndex = this._nActiveActions++,
          firstInactiveAction = actions[lastActiveIndex];
      action._cacheIndex = lastActiveIndex;
      actions[lastActiveIndex] = action;
      firstInactiveAction._cacheIndex = prevIndex;
      actions[prevIndex] = firstInactiveAction;
    },
    _takeBackAction: function(action) {
      var actions = this._actions,
          prevIndex = action._cacheIndex,
          firstInactiveIndex = --this._nActiveActions,
          lastActiveAction = actions[firstInactiveIndex];
      action._cacheIndex = firstInactiveIndex;
      actions[firstInactiveIndex] = action;
      lastActiveAction._cacheIndex = prevIndex;
      actions[prevIndex] = lastActiveAction;
    },
    _addInactiveBinding: function(binding, rootUuid, trackName) {
      var bindingsByRoot = this._bindingsByRootAndName,
          bindingByName = bindingsByRoot[rootUuid],
          bindings = this._bindings;
      if (bindingByName === undefined) {
        bindingByName = {};
        bindingsByRoot[rootUuid] = bindingByName;
      }
      bindingByName[trackName] = binding;
      binding._cacheIndex = bindings.length;
      bindings.push(binding);
    },
    _removeInactiveBinding: function(binding) {
      var bindings = this._bindings,
          propBinding = binding.binding,
          rootUuid = propBinding.rootNode.uuid,
          trackName = propBinding.path,
          bindingsByRoot = this._bindingsByRootAndName,
          bindingByName = bindingsByRoot[rootUuid],
          lastInactiveBinding = bindings[bindings.length - 1],
          cacheIndex = binding._cacheIndex;
      lastInactiveBinding._cacheIndex = cacheIndex;
      bindings[cacheIndex] = lastInactiveBinding;
      bindings.pop();
      delete bindingByName[trackName];
      remove_empty_map: {
        for (var _ in bindingByName)
          break remove_empty_map;
        delete bindingsByRoot[rootUuid];
      }
    },
    _lendBinding: function(binding) {
      var bindings = this._bindings,
          prevIndex = binding._cacheIndex,
          lastActiveIndex = this._nActiveBindings++,
          firstInactiveBinding = bindings[lastActiveIndex];
      binding._cacheIndex = lastActiveIndex;
      bindings[lastActiveIndex] = binding;
      firstInactiveBinding._cacheIndex = prevIndex;
      bindings[prevIndex] = firstInactiveBinding;
    },
    _takeBackBinding: function(binding) {
      var bindings = this._bindings,
          prevIndex = binding._cacheIndex,
          firstInactiveIndex = --this._nActiveBindings,
          lastActiveBinding = bindings[firstInactiveIndex];
      binding._cacheIndex = firstInactiveIndex;
      bindings[firstInactiveIndex] = binding;
      lastActiveBinding._cacheIndex = prevIndex;
      bindings[prevIndex] = lastActiveBinding;
    },
    _lendControlInterpolant: function() {
      var interpolants = this._controlInterpolants,
          lastActiveIndex = this._nActiveControlInterpolants++,
          interpolant = interpolants[lastActiveIndex];
      if (interpolant === undefined) {
        interpolant = new LinearInterpolant(new Float32Array(2), new Float32Array(2), 1, this._controlInterpolantsResultBuffer);
        interpolant.__cacheIndex = lastActiveIndex;
        interpolants[lastActiveIndex] = interpolant;
      }
      return interpolant;
    },
    _takeBackControlInterpolant: function(interpolant) {
      var interpolants = this._controlInterpolants,
          prevIndex = interpolant.__cacheIndex,
          firstInactiveIndex = --this._nActiveControlInterpolants,
          lastActiveInterpolant = interpolants[firstInactiveIndex];
      interpolant.__cacheIndex = firstInactiveIndex;
      interpolants[firstInactiveIndex] = interpolant;
      lastActiveInterpolant.__cacheIndex = prevIndex;
      interpolants[prevIndex] = lastActiveInterpolant;
    },
    _controlInterpolantsResultBuffer: new Float32Array(1),
    clipAction: function(clip, optionalRoot) {
      var root = optionalRoot || this._root,
          rootUuid = root.uuid,
          clipObject = typeof clip === 'string' ? AnimationClip.findByName(root, clip) : clip,
          clipUuid = clipObject !== null ? clipObject.uuid : clip,
          actionsForClip = this._actionsByClip[clipUuid],
          prototypeAction = null;
      if (actionsForClip !== undefined) {
        var existingAction = actionsForClip.actionByRoot[rootUuid];
        if (existingAction !== undefined) {
          return existingAction;
        }
        prototypeAction = actionsForClip.knownActions[0];
        if (clipObject === null)
          clipObject = prototypeAction._clip;
      }
      if (clipObject === null)
        return null;
      var newAction = new AnimationAction(this, clipObject, optionalRoot);
      this._bindAction(newAction, prototypeAction);
      this._addInactiveAction(newAction, clipUuid, rootUuid);
      return newAction;
    },
    existingAction: function(clip, optionalRoot) {
      var root = optionalRoot || this._root,
          rootUuid = root.uuid,
          clipObject = typeof clip === 'string' ? AnimationClip.findByName(root, clip) : clip,
          clipUuid = clipObject ? clipObject.uuid : clip,
          actionsForClip = this._actionsByClip[clipUuid];
      if (actionsForClip !== undefined) {
        return actionsForClip.actionByRoot[rootUuid] || null;
      }
      return null;
    },
    stopAllAction: function() {
      var actions = this._actions,
          nActions = this._nActiveActions,
          bindings = this._bindings,
          nBindings = this._nActiveBindings;
      this._nActiveActions = 0;
      this._nActiveBindings = 0;
      for (var i = 0; i !== nActions; ++i) {
        actions[i].reset();
      }
      for (var i = 0; i !== nBindings; ++i) {
        bindings[i].useCount = 0;
      }
      return this;
    },
    update: function(deltaTime) {
      deltaTime *= this.timeScale;
      var actions = this._actions,
          nActions = this._nActiveActions,
          time = this.time += deltaTime,
          timeDirection = Math.sign(deltaTime),
          accuIndex = this._accuIndex ^= 1;
      for (var i = 0; i !== nActions; ++i) {
        var action = actions[i];
        action._update(time, deltaTime, timeDirection, accuIndex);
      }
      var bindings = this._bindings,
          nBindings = this._nActiveBindings;
      for (var i = 0; i !== nBindings; ++i) {
        bindings[i].apply(accuIndex);
      }
      return this;
    },
    getRoot: function() {
      return this._root;
    },
    uncacheClip: function(clip) {
      var actions = this._actions,
          clipUuid = clip.uuid,
          actionsByClip = this._actionsByClip,
          actionsForClip = actionsByClip[clipUuid];
      if (actionsForClip !== undefined) {
        var actionsToRemove = actionsForClip.knownActions;
        for (var i = 0,
            n = actionsToRemove.length; i !== n; ++i) {
          var action = actionsToRemove[i];
          this._deactivateAction(action);
          var cacheIndex = action._cacheIndex,
              lastInactiveAction = actions[actions.length - 1];
          action._cacheIndex = null;
          action._byClipCacheIndex = null;
          lastInactiveAction._cacheIndex = cacheIndex;
          actions[cacheIndex] = lastInactiveAction;
          actions.pop();
          this._removeInactiveBindingsForAction(action);
        }
        delete actionsByClip[clipUuid];
      }
    },
    uncacheRoot: function(root) {
      var rootUuid = root.uuid,
          actionsByClip = this._actionsByClip;
      for (var clipUuid in actionsByClip) {
        var actionByRoot = actionsByClip[clipUuid].actionByRoot,
            action = actionByRoot[rootUuid];
        if (action !== undefined) {
          this._deactivateAction(action);
          this._removeInactiveAction(action);
        }
      }
      var bindingsByRoot = this._bindingsByRootAndName,
          bindingByName = bindingsByRoot[rootUuid];
      if (bindingByName !== undefined) {
        for (var trackName in bindingByName) {
          var binding = bindingByName[trackName];
          binding.restoreOriginalState();
          this._removeInactiveBinding(binding);
        }
      }
    },
    uncacheAction: function(clip, optionalRoot) {
      var action = this.existingAction(clip, optionalRoot);
      if (action !== null) {
        this._deactivateAction(action);
        this._removeInactiveAction(action);
      }
    }
  });
  function Uniform(value) {
    if (typeof value === 'string') {
      console.warn('THREE.Uniform: Type parameter is no longer needed.');
      value = arguments[1];
    }
    this.value = value;
  }
  Uniform.prototype.clone = function() {
    return new Uniform(this.value.clone === undefined ? this.value : this.value.clone());
  };
  function InstancedBufferGeometry() {
    BufferGeometry.call(this);
    this.type = 'InstancedBufferGeometry';
    this.maxInstancedCount = undefined;
  }
  InstancedBufferGeometry.prototype = Object.assign(Object.create(BufferGeometry.prototype), {
    constructor: InstancedBufferGeometry,
    isInstancedBufferGeometry: true,
    copy: function(source) {
      BufferGeometry.prototype.copy.call(this, source);
      this.maxInstancedCount = source.maxInstancedCount;
      return this;
    },
    clone: function() {
      return new this.constructor().copy(this);
    }
  });
  function InstancedInterleavedBuffer(array, stride, meshPerAttribute) {
    InterleavedBuffer.call(this, array, stride);
    this.meshPerAttribute = meshPerAttribute || 1;
  }
  InstancedInterleavedBuffer.prototype = Object.assign(Object.create(InterleavedBuffer.prototype), {
    constructor: InstancedInterleavedBuffer,
    isInstancedInterleavedBuffer: true,
    copy: function(source) {
      InterleavedBuffer.prototype.copy.call(this, source);
      this.meshPerAttribute = source.meshPerAttribute;
      return this;
    }
  });
  function InstancedBufferAttribute(array, itemSize, normalized, meshPerAttribute) {
    if (typeof(normalized) === 'number') {
      meshPerAttribute = normalized;
      normalized = false;
      console.error('THREE.InstancedBufferAttribute: The constructor now expects normalized as the third argument.');
    }
    BufferAttribute.call(this, array, itemSize, normalized);
    this.meshPerAttribute = meshPerAttribute || 1;
  }
  InstancedBufferAttribute.prototype = Object.assign(Object.create(BufferAttribute.prototype), {
    constructor: InstancedBufferAttribute,
    isInstancedBufferAttribute: true,
    copy: function(source) {
      BufferAttribute.prototype.copy.call(this, source);
      this.meshPerAttribute = source.meshPerAttribute;
      return this;
    }
  });
  function Raycaster(origin, direction, near, far) {
    this.ray = new Ray(origin, direction);
    this.near = near || 0;
    this.far = far || Infinity;
    this.params = {
      Mesh: {},
      Line: {},
      LOD: {},
      Points: {threshold: 1},
      Sprite: {}
    };
    Object.defineProperties(this.params, {PointCloud: {get: function() {
          console.warn('THREE.Raycaster: params.PointCloud has been renamed to params.Points.');
          return this.Points;
        }}});
  }
  function ascSort(a, b) {
    return a.distance - b.distance;
  }
  function intersectObject(object, raycaster, intersects, recursive) {
    if (object.visible === false)
      return;
    object.raycast(raycaster, intersects);
    if (recursive === true) {
      var children = object.children;
      for (var i = 0,
          l = children.length; i < l; i++) {
        intersectObject(children[i], raycaster, intersects, true);
      }
    }
  }
  Object.assign(Raycaster.prototype, {
    linePrecision: 1,
    set: function(origin, direction) {
      this.ray.set(origin, direction);
    },
    setFromCamera: function(coords, camera) {
      if ((camera && camera.isPerspectiveCamera)) {
        this.ray.origin.setFromMatrixPosition(camera.matrixWorld);
        this.ray.direction.set(coords.x, coords.y, 0.5).unproject(camera).sub(this.ray.origin).normalize();
      } else if ((camera && camera.isOrthographicCamera)) {
        this.ray.origin.set(coords.x, coords.y, (camera.near + camera.far) / (camera.near - camera.far)).unproject(camera);
        this.ray.direction.set(0, 0, -1).transformDirection(camera.matrixWorld);
      } else {
        console.error('THREE.Raycaster: Unsupported camera type.');
      }
    },
    intersectObject: function(object, recursive, optionalTarget) {
      var intersects = optionalTarget || [];
      intersectObject(object, this, intersects, recursive);
      intersects.sort(ascSort);
      return intersects;
    },
    intersectObjects: function(objects, recursive, optionalTarget) {
      var intersects = optionalTarget || [];
      if (Array.isArray(objects) === false) {
        console.warn('THREE.Raycaster.intersectObjects: objects is not an Array.');
        return intersects;
      }
      for (var i = 0,
          l = objects.length; i < l; i++) {
        intersectObject(objects[i], this, intersects, recursive);
      }
      intersects.sort(ascSort);
      return intersects;
    }
  });
  function Spherical(radius, phi, theta) {
    this.radius = (radius !== undefined) ? radius : 1.0;
    this.phi = (phi !== undefined) ? phi : 0;
    this.theta = (theta !== undefined) ? theta : 0;
    return this;
  }
  Object.assign(Spherical.prototype, {
    set: function(radius, phi, theta) {
      this.radius = radius;
      this.phi = phi;
      this.theta = theta;
      return this;
    },
    clone: function() {
      return new this.constructor().copy(this);
    },
    copy: function(other) {
      this.radius = other.radius;
      this.phi = other.phi;
      this.theta = other.theta;
      return this;
    },
    makeSafe: function() {
      var EPS = 0.000001;
      this.phi = Math.max(EPS, Math.min(Math.PI - EPS, this.phi));
      return this;
    },
    setFromVector3: function(v) {
      return this.setFromCartesianCoords(v.x, v.y, v.z);
    },
    setFromCartesianCoords: function(x, y, z) {
      this.radius = Math.sqrt(x * x + y * y + z * z);
      if (this.radius === 0) {
        this.theta = 0;
        this.phi = 0;
      } else {
        this.theta = Math.atan2(x, z);
        this.phi = Math.acos(_Math.clamp(y / this.radius, -1, 1));
      }
      return this;
    }
  });
  function Cylindrical(radius, theta, y) {
    this.radius = (radius !== undefined) ? radius : 1.0;
    this.theta = (theta !== undefined) ? theta : 0;
    this.y = (y !== undefined) ? y : 0;
    return this;
  }
  Object.assign(Cylindrical.prototype, {
    set: function(radius, theta, y) {
      this.radius = radius;
      this.theta = theta;
      this.y = y;
      return this;
    },
    clone: function() {
      return new this.constructor().copy(this);
    },
    copy: function(other) {
      this.radius = other.radius;
      this.theta = other.theta;
      this.y = other.y;
      return this;
    },
    setFromVector3: function(v) {
      return this.setFromCartesianCoords(v.x, v.y, v.z);
    },
    setFromCartesianCoords: function(x, y, z) {
      this.radius = Math.sqrt(x * x + z * z);
      this.theta = Math.atan2(x, z);
      this.y = y;
      return this;
    }
  });
  function Box2(min, max) {
    this.min = (min !== undefined) ? min : new Vector2(+Infinity, +Infinity);
    this.max = (max !== undefined) ? max : new Vector2(-Infinity, -Infinity);
  }
  Object.assign(Box2.prototype, {
    set: function(min, max) {
      this.min.copy(min);
      this.max.copy(max);
      return this;
    },
    setFromPoints: function(points) {
      this.makeEmpty();
      for (var i = 0,
          il = points.length; i < il; i++) {
        this.expandByPoint(points[i]);
      }
      return this;
    },
    setFromCenterAndSize: function() {
      var v1 = new Vector2();
      return function setFromCenterAndSize(center, size) {
        var halfSize = v1.copy(size).multiplyScalar(0.5);
        this.min.copy(center).sub(halfSize);
        this.max.copy(center).add(halfSize);
        return this;
      };
    }(),
    clone: function() {
      return new this.constructor().copy(this);
    },
    copy: function(box) {
      this.min.copy(box.min);
      this.max.copy(box.max);
      return this;
    },
    makeEmpty: function() {
      this.min.x = this.min.y = +Infinity;
      this.max.x = this.max.y = -Infinity;
      return this;
    },
    isEmpty: function() {
      return (this.max.x < this.min.x) || (this.max.y < this.min.y);
    },
    getCenter: function(target) {
      if (target === undefined) {
        console.warn('THREE.Box2: .getCenter() target is now required');
        target = new Vector2();
      }
      return this.isEmpty() ? target.set(0, 0) : target.addVectors(this.min, this.max).multiplyScalar(0.5);
    },
    getSize: function(target) {
      if (target === undefined) {
        console.warn('THREE.Box2: .getSize() target is now required');
        target = new Vector2();
      }
      return this.isEmpty() ? target.set(0, 0) : target.subVectors(this.max, this.min);
    },
    expandByPoint: function(point) {
      this.min.min(point);
      this.max.max(point);
      return this;
    },
    expandByVector: function(vector) {
      this.min.sub(vector);
      this.max.add(vector);
      return this;
    },
    expandByScalar: function(scalar) {
      this.min.addScalar(-scalar);
      this.max.addScalar(scalar);
      return this;
    },
    containsPoint: function(point) {
      return point.x < this.min.x || point.x > this.max.x || point.y < this.min.y || point.y > this.max.y ? false : true;
    },
    containsBox: function(box) {
      return this.min.x <= box.min.x && box.max.x <= this.max.x && this.min.y <= box.min.y && box.max.y <= this.max.y;
    },
    getParameter: function(point, target) {
      if (target === undefined) {
        console.warn('THREE.Box2: .getParameter() target is now required');
        target = new Vector2();
      }
      return target.set((point.x - this.min.x) / (this.max.x - this.min.x), (point.y - this.min.y) / (this.max.y - this.min.y));
    },
    intersectsBox: function(box) {
      return box.max.x < this.min.x || box.min.x > this.max.x || box.max.y < this.min.y || box.min.y > this.max.y ? false : true;
    },
    clampPoint: function(point, target) {
      if (target === undefined) {
        console.warn('THREE.Box2: .clampPoint() target is now required');
        target = new Vector2();
      }
      return target.copy(point).clamp(this.min, this.max);
    },
    distanceToPoint: function() {
      var v1 = new Vector2();
      return function distanceToPoint(point) {
        var clampedPoint = v1.copy(point).clamp(this.min, this.max);
        return clampedPoint.sub(point).length();
      };
    }(),
    intersect: function(box) {
      this.min.max(box.min);
      this.max.min(box.max);
      return this;
    },
    union: function(box) {
      this.min.min(box.min);
      this.max.max(box.max);
      return this;
    },
    translate: function(offset) {
      this.min.add(offset);
      this.max.add(offset);
      return this;
    },
    equals: function(box) {
      return box.min.equals(this.min) && box.max.equals(this.max);
    }
  });
  function Line3(start, end) {
    this.start = (start !== undefined) ? start : new Vector3();
    this.end = (end !== undefined) ? end : new Vector3();
  }
  Object.assign(Line3.prototype, {
    set: function(start, end) {
      this.start.copy(start);
      this.end.copy(end);
      return this;
    },
    clone: function() {
      return new this.constructor().copy(this);
    },
    copy: function(line) {
      this.start.copy(line.start);
      this.end.copy(line.end);
      return this;
    },
    getCenter: function(target) {
      if (target === undefined) {
        console.warn('THREE.Line3: .getCenter() target is now required');
        target = new Vector3();
      }
      return target.addVectors(this.start, this.end).multiplyScalar(0.5);
    },
    delta: function(target) {
      if (target === undefined) {
        console.warn('THREE.Line3: .delta() target is now required');
        target = new Vector3();
      }
      return target.subVectors(this.end, this.start);
    },
    distanceSq: function() {
      return this.start.distanceToSquared(this.end);
    },
    distance: function() {
      return this.start.distanceTo(this.end);
    },
    at: function(t, target) {
      if (target === undefined) {
        console.warn('THREE.Line3: .at() target is now required');
        target = new Vector3();
      }
      return this.delta(target).multiplyScalar(t).add(this.start);
    },
    closestPointToPointParameter: function() {
      var startP = new Vector3();
      var startEnd = new Vector3();
      return function closestPointToPointParameter(point, clampToLine) {
        startP.subVectors(point, this.start);
        startEnd.subVectors(this.end, this.start);
        var startEnd2 = startEnd.dot(startEnd);
        var startEnd_startP = startEnd.dot(startP);
        var t = startEnd_startP / startEnd2;
        if (clampToLine) {
          t = _Math.clamp(t, 0, 1);
        }
        return t;
      };
    }(),
    closestPointToPoint: function(point, clampToLine, target) {
      var t = this.closestPointToPointParameter(point, clampToLine);
      if (target === undefined) {
        console.warn('THREE.Line3: .closestPointToPoint() target is now required');
        target = new Vector3();
      }
      return this.delta(target).multiplyScalar(t).add(this.start);
    },
    applyMatrix4: function(matrix) {
      this.start.applyMatrix4(matrix);
      this.end.applyMatrix4(matrix);
      return this;
    },
    equals: function(line) {
      return line.start.equals(this.start) && line.end.equals(this.end);
    }
  });
  function ImmediateRenderObject(material) {
    Object3D.call(this);
    this.material = material;
    this.render = function() {};
  }
  ImmediateRenderObject.prototype = Object.create(Object3D.prototype);
  ImmediateRenderObject.prototype.constructor = ImmediateRenderObject;
  ImmediateRenderObject.prototype.isImmediateRenderObject = true;
  function VertexNormalsHelper(object, size, hex, linewidth) {
    this.object = object;
    this.size = (size !== undefined) ? size : 1;
    var color = (hex !== undefined) ? hex : 0xff0000;
    var width = (linewidth !== undefined) ? linewidth : 1;
    var nNormals = 0;
    var objGeometry = this.object.geometry;
    if (objGeometry && objGeometry.isGeometry) {
      nNormals = objGeometry.faces.length * 3;
    } else if (objGeometry && objGeometry.isBufferGeometry) {
      nNormals = objGeometry.attributes.normal.count;
    }
    var geometry = new BufferGeometry();
    var positions = new Float32BufferAttribute(nNormals * 2 * 3, 3);
    geometry.addAttribute('position', positions);
    LineSegments.call(this, geometry, new LineBasicMaterial({
      color: color,
      linewidth: width
    }));
    this.matrixAutoUpdate = false;
    this.update();
  }
  VertexNormalsHelper.prototype = Object.create(LineSegments.prototype);
  VertexNormalsHelper.prototype.constructor = VertexNormalsHelper;
  VertexNormalsHelper.prototype.update = (function() {
    var v1 = new Vector3();
    var v2 = new Vector3();
    var normalMatrix = new Matrix3();
    return function update() {
      var keys = ['a', 'b', 'c'];
      this.object.updateMatrixWorld(true);
      normalMatrix.getNormalMatrix(this.object.matrixWorld);
      var matrixWorld = this.object.matrixWorld;
      var position = this.geometry.attributes.position;
      var objGeometry = this.object.geometry;
      if (objGeometry && objGeometry.isGeometry) {
        var vertices = objGeometry.vertices;
        var faces = objGeometry.faces;
        var idx = 0;
        for (var i = 0,
            l = faces.length; i < l; i++) {
          var face = faces[i];
          for (var j = 0,
              jl = face.vertexNormals.length; j < jl; j++) {
            var vertex = vertices[face[keys[j]]];
            var normal = face.vertexNormals[j];
            v1.copy(vertex).applyMatrix4(matrixWorld);
            v2.copy(normal).applyMatrix3(normalMatrix).normalize().multiplyScalar(this.size).add(v1);
            position.setXYZ(idx, v1.x, v1.y, v1.z);
            idx = idx + 1;
            position.setXYZ(idx, v2.x, v2.y, v2.z);
            idx = idx + 1;
          }
        }
      } else if (objGeometry && objGeometry.isBufferGeometry) {
        var objPos = objGeometry.attributes.position;
        var objNorm = objGeometry.attributes.normal;
        var idx = 0;
        for (var j = 0,
            jl = objPos.count; j < jl; j++) {
          v1.set(objPos.getX(j), objPos.getY(j), objPos.getZ(j)).applyMatrix4(matrixWorld);
          v2.set(objNorm.getX(j), objNorm.getY(j), objNorm.getZ(j));
          v2.applyMatrix3(normalMatrix).normalize().multiplyScalar(this.size).add(v1);
          position.setXYZ(idx, v1.x, v1.y, v1.z);
          idx = idx + 1;
          position.setXYZ(idx, v2.x, v2.y, v2.z);
          idx = idx + 1;
        }
      }
      position.needsUpdate = true;
    };
  }());
  function SpotLightHelper(light, color) {
    Object3D.call(this);
    this.light = light;
    this.light.updateMatrixWorld();
    this.matrix = light.matrixWorld;
    this.matrixAutoUpdate = false;
    this.color = color;
    var geometry = new BufferGeometry();
    var positions = [0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, -1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, -1, 1];
    for (var i = 0,
        j = 1,
        l = 32; i < l; i++, j++) {
      var p1 = (i / l) * Math.PI * 2;
      var p2 = (j / l) * Math.PI * 2;
      positions.push(Math.cos(p1), Math.sin(p1), 1, Math.cos(p2), Math.sin(p2), 1);
    }
    geometry.addAttribute('position', new Float32BufferAttribute(positions, 3));
    var material = new LineBasicMaterial({fog: false});
    this.cone = new LineSegments(geometry, material);
    this.add(this.cone);
    this.update();
  }
  SpotLightHelper.prototype = Object.create(Object3D.prototype);
  SpotLightHelper.prototype.constructor = SpotLightHelper;
  SpotLightHelper.prototype.dispose = function() {
    this.cone.geometry.dispose();
    this.cone.material.dispose();
  };
  SpotLightHelper.prototype.update = function() {
    var vector = new Vector3();
    return function update() {
      this.light.updateMatrixWorld();
      var coneLength = this.light.distance ? this.light.distance : 1000;
      var coneWidth = coneLength * Math.tan(this.light.angle);
      this.cone.scale.set(coneWidth, coneWidth, coneLength);
      vector.setFromMatrixPosition(this.light.target.matrixWorld);
      this.cone.lookAt(vector);
      if (this.color !== undefined) {
        this.cone.material.color.set(this.color);
      } else {
        this.cone.material.color.copy(this.light.color);
      }
    };
  }();
  function getBoneList(object) {
    var boneList = [];
    if (object && object.isBone) {
      boneList.push(object);
    }
    for (var i = 0; i < object.children.length; i++) {
      boneList.push.apply(boneList, getBoneList(object.children[i]));
    }
    return boneList;
  }
  function SkeletonHelper(object) {
    var bones = getBoneList(object);
    var geometry = new BufferGeometry();
    var vertices = [];
    var colors = [];
    var color1 = new Color(0, 0, 1);
    var color2 = new Color(0, 1, 0);
    for (var i = 0; i < bones.length; i++) {
      var bone = bones[i];
      if (bone.parent && bone.parent.isBone) {
        vertices.push(0, 0, 0);
        vertices.push(0, 0, 0);
        colors.push(color1.r, color1.g, color1.b);
        colors.push(color2.r, color2.g, color2.b);
      }
    }
    geometry.addAttribute('position', new Float32BufferAttribute(vertices, 3));
    geometry.addAttribute('color', new Float32BufferAttribute(colors, 3));
    var material = new LineBasicMaterial({
      vertexColors: VertexColors,
      depthTest: false,
      depthWrite: false,
      transparent: true
    });
    LineSegments.call(this, geometry, material);
    this.root = object;
    this.bones = bones;
    this.matrix = object.matrixWorld;
    this.matrixAutoUpdate = false;
  }
  SkeletonHelper.prototype = Object.create(LineSegments.prototype);
  SkeletonHelper.prototype.constructor = SkeletonHelper;
  SkeletonHelper.prototype.updateMatrixWorld = function() {
    var vector = new Vector3();
    var boneMatrix = new Matrix4();
    var matrixWorldInv = new Matrix4();
    return function updateMatrixWorld(force) {
      var bones = this.bones;
      var geometry = this.geometry;
      var position = geometry.getAttribute('position');
      matrixWorldInv.getInverse(this.root.matrixWorld);
      for (var i = 0,
          j = 0; i < bones.length; i++) {
        var bone = bones[i];
        if (bone.parent && bone.parent.isBone) {
          boneMatrix.multiplyMatrices(matrixWorldInv, bone.matrixWorld);
          vector.setFromMatrixPosition(boneMatrix);
          position.setXYZ(j, vector.x, vector.y, vector.z);
          boneMatrix.multiplyMatrices(matrixWorldInv, bone.parent.matrixWorld);
          vector.setFromMatrixPosition(boneMatrix);
          position.setXYZ(j + 1, vector.x, vector.y, vector.z);
          j += 2;
        }
      }
      geometry.getAttribute('position').needsUpdate = true;
      Object3D.prototype.updateMatrixWorld.call(this, force);
    };
  }();
  function PointLightHelper(light, sphereSize, color) {
    this.light = light;
    this.light.updateMatrixWorld();
    this.color = color;
    var geometry = new SphereBufferGeometry(sphereSize, 4, 2);
    var material = new MeshBasicMaterial({
      wireframe: true,
      fog: false
    });
    Mesh.call(this, geometry, material);
    this.matrix = this.light.matrixWorld;
    this.matrixAutoUpdate = false;
    this.update();
  }
  PointLightHelper.prototype = Object.create(Mesh.prototype);
  PointLightHelper.prototype.constructor = PointLightHelper;
  PointLightHelper.prototype.dispose = function() {
    this.geometry.dispose();
    this.material.dispose();
  };
  PointLightHelper.prototype.update = function() {
    if (this.color !== undefined) {
      this.material.color.set(this.color);
    } else {
      this.material.color.copy(this.light.color);
    }
  };
  function RectAreaLightHelper(light, color) {
    this.type = 'RectAreaLightHelper';
    this.light = light;
    this.color = color;
    var positions = [1, 1, 0, -1, 1, 0, -1, -1, 0, 1, -1, 0, 1, 1, 0];
    var geometry = new BufferGeometry();
    geometry.addAttribute('position', new Float32BufferAttribute(positions, 3));
    geometry.computeBoundingSphere();
    var material = new LineBasicMaterial({fog: false});
    Line.call(this, geometry, material);
    var positions2 = [1, 1, 0, -1, 1, 0, -1, -1, 0, 1, 1, 0, -1, -1, 0, 1, -1, 0];
    var geometry2 = new BufferGeometry();
    geometry2.addAttribute('position', new Float32BufferAttribute(positions2, 3));
    geometry2.computeBoundingSphere();
    this.add(new Mesh(geometry2, new MeshBasicMaterial({
      side: BackSide,
      fog: false
    })));
    this.update();
  }
  RectAreaLightHelper.prototype = Object.create(Line.prototype);
  RectAreaLightHelper.prototype.constructor = RectAreaLightHelper;
  RectAreaLightHelper.prototype.update = function() {
    this.scale.set(0.5 * this.light.width, 0.5 * this.light.height, 1);
    if (this.color !== undefined) {
      this.material.color.set(this.color);
      this.children[0].material.color.set(this.color);
    } else {
      this.material.color.copy(this.light.color).multiplyScalar(this.light.intensity);
      var c = this.material.color;
      var max = Math.max(c.r, c.g, c.b);
      if (max > 1)
        c.multiplyScalar(1 / max);
      this.children[0].material.color.copy(this.material.color);
    }
  };
  RectAreaLightHelper.prototype.dispose = function() {
    this.geometry.dispose();
    this.material.dispose();
    this.children[0].geometry.dispose();
    this.children[0].material.dispose();
  };
  function HemisphereLightHelper(light, size, color) {
    Object3D.call(this);
    this.light = light;
    this.light.updateMatrixWorld();
    this.matrix = light.matrixWorld;
    this.matrixAutoUpdate = false;
    this.color = color;
    var geometry = new OctahedronBufferGeometry(size);
    geometry.rotateY(Math.PI * 0.5);
    this.material = new MeshBasicMaterial({
      wireframe: true,
      fog: false
    });
    if (this.color === undefined)
      this.material.vertexColors = VertexColors;
    var position = geometry.getAttribute('position');
    var colors = new Float32Array(position.count * 3);
    geometry.addAttribute('color', new BufferAttribute(colors, 3));
    this.add(new Mesh(geometry, this.material));
    this.update();
  }
  HemisphereLightHelper.prototype = Object.create(Object3D.prototype);
  HemisphereLightHelper.prototype.constructor = HemisphereLightHelper;
  HemisphereLightHelper.prototype.dispose = function() {
    this.children[0].geometry.dispose();
    this.children[0].material.dispose();
  };
  HemisphereLightHelper.prototype.update = function() {
    var vector = new Vector3();
    var color1 = new Color();
    var color2 = new Color();
    return function update() {
      var mesh = this.children[0];
      if (this.color !== undefined) {
        this.material.color.set(this.color);
      } else {
        var colors = mesh.geometry.getAttribute('color');
        color1.copy(this.light.color);
        color2.copy(this.light.groundColor);
        for (var i = 0,
            l = colors.count; i < l; i++) {
          var color = (i < (l / 2)) ? color1 : color2;
          colors.setXYZ(i, color.r, color.g, color.b);
        }
        colors.needsUpdate = true;
      }
      mesh.lookAt(vector.setFromMatrixPosition(this.light.matrixWorld).negate());
    };
  }();
  function GridHelper(size, divisions, color1, color2) {
    size = size || 10;
    divisions = divisions || 10;
    color1 = new Color(color1 !== undefined ? color1 : 0x444444);
    color2 = new Color(color2 !== undefined ? color2 : 0x888888);
    var center = divisions / 2;
    var step = size / divisions;
    var halfSize = size / 2;
    var vertices = [],
        colors = [];
    for (var i = 0,
        j = 0,
        k = -halfSize; i <= divisions; i++, k += step) {
      vertices.push(-halfSize, 0, k, halfSize, 0, k);
      vertices.push(k, 0, -halfSize, k, 0, halfSize);
      var color = i === center ? color1 : color2;
      color.toArray(colors, j);
      j += 3;
      color.toArray(colors, j);
      j += 3;
      color.toArray(colors, j);
      j += 3;
      color.toArray(colors, j);
      j += 3;
    }
    var geometry = new BufferGeometry();
    geometry.addAttribute('position', new Float32BufferAttribute(vertices, 3));
    geometry.addAttribute('color', new Float32BufferAttribute(colors, 3));
    var material = new LineBasicMaterial({vertexColors: VertexColors});
    LineSegments.call(this, geometry, material);
  }
  GridHelper.prototype = Object.create(LineSegments.prototype);
  GridHelper.prototype.constructor = GridHelper;
  function PolarGridHelper(radius, radials, circles, divisions, color1, color2) {
    radius = radius || 10;
    radials = radials || 16;
    circles = circles || 8;
    divisions = divisions || 64;
    color1 = new Color(color1 !== undefined ? color1 : 0x444444);
    color2 = new Color(color2 !== undefined ? color2 : 0x888888);
    var vertices = [];
    var colors = [];
    var x,
        z;
    var v,
        i,
        j,
        r,
        color;
    for (i = 0; i <= radials; i++) {
      v = (i / radials) * (Math.PI * 2);
      x = Math.sin(v) * radius;
      z = Math.cos(v) * radius;
      vertices.push(0, 0, 0);
      vertices.push(x, 0, z);
      color = (i & 1) ? color1 : color2;
      colors.push(color.r, color.g, color.b);
      colors.push(color.r, color.g, color.b);
    }
    for (i = 0; i <= circles; i++) {
      color = (i & 1) ? color1 : color2;
      r = radius - (radius / circles * i);
      for (j = 0; j < divisions; j++) {
        v = (j / divisions) * (Math.PI * 2);
        x = Math.sin(v) * r;
        z = Math.cos(v) * r;
        vertices.push(x, 0, z);
        colors.push(color.r, color.g, color.b);
        v = ((j + 1) / divisions) * (Math.PI * 2);
        x = Math.sin(v) * r;
        z = Math.cos(v) * r;
        vertices.push(x, 0, z);
        colors.push(color.r, color.g, color.b);
      }
    }
    var geometry = new BufferGeometry();
    geometry.addAttribute('position', new Float32BufferAttribute(vertices, 3));
    geometry.addAttribute('color', new Float32BufferAttribute(colors, 3));
    var material = new LineBasicMaterial({vertexColors: VertexColors});
    LineSegments.call(this, geometry, material);
  }
  PolarGridHelper.prototype = Object.create(LineSegments.prototype);
  PolarGridHelper.prototype.constructor = PolarGridHelper;
  function PositionalAudioHelper(audio, range, divisionsInnerAngle, divisionsOuterAngle) {
    this.audio = audio;
    this.range = range || 1;
    this.divisionsInnerAngle = divisionsInnerAngle || 16;
    this.divisionsOuterAngle = divisionsOuterAngle || 2;
    var geometry = new BufferGeometry();
    var divisions = this.divisionsInnerAngle + this.divisionsOuterAngle * 2;
    var positions = new Float32Array((divisions * 3 + 3) * 3);
    geometry.addAttribute('position', new BufferAttribute(positions, 3));
    var materialInnerAngle = new LineBasicMaterial({color: 0x00ff00});
    var materialOuterAngle = new LineBasicMaterial({color: 0xffff00});
    Line.call(this, geometry, [materialOuterAngle, materialInnerAngle]);
    this.update();
  }
  PositionalAudioHelper.prototype = Object.create(Line.prototype);
  PositionalAudioHelper.prototype.constructor = PositionalAudioHelper;
  PositionalAudioHelper.prototype.update = function() {
    var audio = this.audio;
    var range = this.range;
    var divisionsInnerAngle = this.divisionsInnerAngle;
    var divisionsOuterAngle = this.divisionsOuterAngle;
    var coneInnerAngle = _Math.degToRad(audio.panner.coneInnerAngle);
    var coneOuterAngle = _Math.degToRad(audio.panner.coneOuterAngle);
    var halfConeInnerAngle = coneInnerAngle / 2;
    var halfConeOuterAngle = coneOuterAngle / 2;
    var start = 0;
    var count = 0;
    var i,
        stride;
    var geometry = this.geometry;
    var positionAttribute = geometry.attributes.position;
    geometry.clearGroups();
    function generateSegment(from, to, divisions, materialIndex) {
      var step = (to - from) / divisions;
      positionAttribute.setXYZ(start, 0, 0, 0);
      count++;
      for (i = from; i < to; i += step) {
        stride = start + count;
        positionAttribute.setXYZ(stride, Math.sin(i) * range, 0, Math.cos(i) * range);
        positionAttribute.setXYZ(stride + 1, Math.sin(Math.min(i + step, to)) * range, 0, Math.cos(Math.min(i + step, to)) * range);
        positionAttribute.setXYZ(stride + 2, 0, 0, 0);
        count += 3;
      }
      geometry.addGroup(start, count, materialIndex);
      start += count;
      count = 0;
    }
    generateSegment(-halfConeOuterAngle, -halfConeInnerAngle, divisionsOuterAngle, 0);
    generateSegment(-halfConeInnerAngle, halfConeInnerAngle, divisionsInnerAngle, 1);
    generateSegment(halfConeInnerAngle, halfConeOuterAngle, divisionsOuterAngle, 0);
    positionAttribute.needsUpdate = true;
    if (coneInnerAngle === coneOuterAngle)
      this.material[0].visible = false;
  };
  PositionalAudioHelper.prototype.dispose = function() {
    this.geometry.dispose();
    this.material[0].dispose();
    this.material[1].dispose();
  };
  function FaceNormalsHelper(object, size, hex, linewidth) {
    this.object = object;
    this.size = (size !== undefined) ? size : 1;
    var color = (hex !== undefined) ? hex : 0xffff00;
    var width = (linewidth !== undefined) ? linewidth : 1;
    var nNormals = 0;
    var objGeometry = this.object.geometry;
    if (objGeometry && objGeometry.isGeometry) {
      nNormals = objGeometry.faces.length;
    } else {
      console.warn('THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.');
    }
    var geometry = new BufferGeometry();
    var positions = new Float32BufferAttribute(nNormals * 2 * 3, 3);
    geometry.addAttribute('position', positions);
    LineSegments.call(this, geometry, new LineBasicMaterial({
      color: color,
      linewidth: width
    }));
    this.matrixAutoUpdate = false;
    this.update();
  }
  FaceNormalsHelper.prototype = Object.create(LineSegments.prototype);
  FaceNormalsHelper.prototype.constructor = FaceNormalsHelper;
  FaceNormalsHelper.prototype.update = (function() {
    var v1 = new Vector3();
    var v2 = new Vector3();
    var normalMatrix = new Matrix3();
    return function update() {
      this.object.updateMatrixWorld(true);
      normalMatrix.getNormalMatrix(this.object.matrixWorld);
      var matrixWorld = this.object.matrixWorld;
      var position = this.geometry.attributes.position;
      var objGeometry = this.object.geometry;
      var vertices = objGeometry.vertices;
      var faces = objGeometry.faces;
      var idx = 0;
      for (var i = 0,
          l = faces.length; i < l; i++) {
        var face = faces[i];
        var normal = face.normal;
        v1.copy(vertices[face.a]).add(vertices[face.b]).add(vertices[face.c]).divideScalar(3).applyMatrix4(matrixWorld);
        v2.copy(normal).applyMatrix3(normalMatrix).normalize().multiplyScalar(this.size).add(v1);
        position.setXYZ(idx, v1.x, v1.y, v1.z);
        idx = idx + 1;
        position.setXYZ(idx, v2.x, v2.y, v2.z);
        idx = idx + 1;
      }
      position.needsUpdate = true;
    };
  }());
  function DirectionalLightHelper(light, size, color) {
    Object3D.call(this);
    this.light = light;
    this.light.updateMatrixWorld();
    this.matrix = light.matrixWorld;
    this.matrixAutoUpdate = false;
    this.color = color;
    if (size === undefined)
      size = 1;
    var geometry = new BufferGeometry();
    geometry.addAttribute('position', new Float32BufferAttribute([-size, size, 0, size, size, 0, size, -size, 0, -size, -size, 0, -size, size, 0], 3));
    var material = new LineBasicMaterial({fog: false});
    this.lightPlane = new Line(geometry, material);
    this.add(this.lightPlane);
    geometry = new BufferGeometry();
    geometry.addAttribute('position', new Float32BufferAttribute([0, 0, 0, 0, 0, 1], 3));
    this.targetLine = new Line(geometry, material);
    this.add(this.targetLine);
    this.update();
  }
  DirectionalLightHelper.prototype = Object.create(Object3D.prototype);
  DirectionalLightHelper.prototype.constructor = DirectionalLightHelper;
  DirectionalLightHelper.prototype.dispose = function() {
    this.lightPlane.geometry.dispose();
    this.lightPlane.material.dispose();
    this.targetLine.geometry.dispose();
    this.targetLine.material.dispose();
  };
  DirectionalLightHelper.prototype.update = function() {
    var v1 = new Vector3();
    var v2 = new Vector3();
    var v3 = new Vector3();
    return function update() {
      v1.setFromMatrixPosition(this.light.matrixWorld);
      v2.setFromMatrixPosition(this.light.target.matrixWorld);
      v3.subVectors(v2, v1);
      this.lightPlane.lookAt(v2);
      if (this.color !== undefined) {
        this.lightPlane.material.color.set(this.color);
        this.targetLine.material.color.set(this.color);
      } else {
        this.lightPlane.material.color.copy(this.light.color);
        this.targetLine.material.color.copy(this.light.color);
      }
      this.targetLine.lookAt(v2);
      this.targetLine.scale.z = v3.length();
    };
  }();
  function CameraHelper(camera) {
    var geometry = new BufferGeometry();
    var material = new LineBasicMaterial({
      color: 0xffffff,
      vertexColors: FaceColors
    });
    var vertices = [];
    var colors = [];
    var pointMap = {};
    var colorFrustum = new Color(0xffaa00);
    var colorCone = new Color(0xff0000);
    var colorUp = new Color(0x00aaff);
    var colorTarget = new Color(0xffffff);
    var colorCross = new Color(0x333333);
    addLine('n1', 'n2', colorFrustum);
    addLine('n2', 'n4', colorFrustum);
    addLine('n4', 'n3', colorFrustum);
    addLine('n3', 'n1', colorFrustum);
    addLine('f1', 'f2', colorFrustum);
    addLine('f2', 'f4', colorFrustum);
    addLine('f4', 'f3', colorFrustum);
    addLine('f3', 'f1', colorFrustum);
    addLine('n1', 'f1', colorFrustum);
    addLine('n2', 'f2', colorFrustum);
    addLine('n3', 'f3', colorFrustum);
    addLine('n4', 'f4', colorFrustum);
    addLine('p', 'n1', colorCone);
    addLine('p', 'n2', colorCone);
    addLine('p', 'n3', colorCone);
    addLine('p', 'n4', colorCone);
    addLine('u1', 'u2', colorUp);
    addLine('u2', 'u3', colorUp);
    addLine('u3', 'u1', colorUp);
    addLine('c', 't', colorTarget);
    addLine('p', 'c', colorCross);
    addLine('cn1', 'cn2', colorCross);
    addLine('cn3', 'cn4', colorCross);
    addLine('cf1', 'cf2', colorCross);
    addLine('cf3', 'cf4', colorCross);
    function addLine(a, b, color) {
      addPoint(a, color);
      addPoint(b, color);
    }
    function addPoint(id, color) {
      vertices.push(0, 0, 0);
      colors.push(color.r, color.g, color.b);
      if (pointMap[id] === undefined) {
        pointMap[id] = [];
      }
      pointMap[id].push((vertices.length / 3) - 1);
    }
    geometry.addAttribute('position', new Float32BufferAttribute(vertices, 3));
    geometry.addAttribute('color', new Float32BufferAttribute(colors, 3));
    LineSegments.call(this, geometry, material);
    this.camera = camera;
    if (this.camera.updateProjectionMatrix)
      this.camera.updateProjectionMatrix();
    this.matrix = camera.matrixWorld;
    this.matrixAutoUpdate = false;
    this.pointMap = pointMap;
    this.update();
  }
  CameraHelper.prototype = Object.create(LineSegments.prototype);
  CameraHelper.prototype.constructor = CameraHelper;
  CameraHelper.prototype.update = function() {
    var geometry,
        pointMap;
    var vector = new Vector3();
    var camera = new Camera();
    function setPoint(point, x, y, z) {
      vector.set(x, y, z).unproject(camera);
      var points = pointMap[point];
      if (points !== undefined) {
        var position = geometry.getAttribute('position');
        for (var i = 0,
            l = points.length; i < l; i++) {
          position.setXYZ(points[i], vector.x, vector.y, vector.z);
        }
      }
    }
    return function update() {
      geometry = this.geometry;
      pointMap = this.pointMap;
      var w = 1,
          h = 1;
      camera.projectionMatrix.copy(this.camera.projectionMatrix);
      setPoint('c', 0, 0, -1);
      setPoint('t', 0, 0, 1);
      setPoint('n1', -w, -h, -1);
      setPoint('n2', w, -h, -1);
      setPoint('n3', -w, h, -1);
      setPoint('n4', w, h, -1);
      setPoint('f1', -w, -h, 1);
      setPoint('f2', w, -h, 1);
      setPoint('f3', -w, h, 1);
      setPoint('f4', w, h, 1);
      setPoint('u1', w * 0.7, h * 1.1, -1);
      setPoint('u2', -w * 0.7, h * 1.1, -1);
      setPoint('u3', 0, h * 2, -1);
      setPoint('cf1', -w, 0, 1);
      setPoint('cf2', w, 0, 1);
      setPoint('cf3', 0, -h, 1);
      setPoint('cf4', 0, h, 1);
      setPoint('cn1', -w, 0, -1);
      setPoint('cn2', w, 0, -1);
      setPoint('cn3', 0, -h, -1);
      setPoint('cn4', 0, h, -1);
      geometry.getAttribute('position').needsUpdate = true;
    };
  }();
  function BoxHelper(object, color) {
    this.object = object;
    if (color === undefined)
      color = 0xffff00;
    var indices = new Uint16Array([0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7]);
    var positions = new Float32Array(8 * 3);
    var geometry = new BufferGeometry();
    geometry.setIndex(new BufferAttribute(indices, 1));
    geometry.addAttribute('position', new BufferAttribute(positions, 3));
    LineSegments.call(this, geometry, new LineBasicMaterial({color: color}));
    this.matrixAutoUpdate = false;
    this.update();
  }
  BoxHelper.prototype = Object.create(LineSegments.prototype);
  BoxHelper.prototype.constructor = BoxHelper;
  BoxHelper.prototype.update = (function() {
    var box = new Box3();
    return function update(object) {
      if (object !== undefined) {
        console.warn('THREE.BoxHelper: .update() has no longer arguments.');
      }
      if (this.object !== undefined) {
        box.setFromObject(this.object);
      }
      if (box.isEmpty())
        return;
      var min = box.min;
      var max = box.max;
      var position = this.geometry.attributes.position;
      var array = position.array;
      array[0] = max.x;
      array[1] = max.y;
      array[2] = max.z;
      array[3] = min.x;
      array[4] = max.y;
      array[5] = max.z;
      array[6] = min.x;
      array[7] = min.y;
      array[8] = max.z;
      array[9] = max.x;
      array[10] = min.y;
      array[11] = max.z;
      array[12] = max.x;
      array[13] = max.y;
      array[14] = min.z;
      array[15] = min.x;
      array[16] = max.y;
      array[17] = min.z;
      array[18] = min.x;
      array[19] = min.y;
      array[20] = min.z;
      array[21] = max.x;
      array[22] = min.y;
      array[23] = min.z;
      position.needsUpdate = true;
      this.geometry.computeBoundingSphere();
    };
  })();
  BoxHelper.prototype.setFromObject = function(object) {
    this.object = object;
    this.update();
    return this;
  };
  BoxHelper.prototype.copy = function(source) {
    LineSegments.prototype.copy.call(this, source);
    this.object = source.object;
    return this;
  };
  BoxHelper.prototype.clone = function() {
    return new this.constructor().copy(this);
  };
  function Box3Helper(box, hex) {
    this.type = 'Box3Helper';
    this.box = box;
    var color = (hex !== undefined) ? hex : 0xffff00;
    var indices = new Uint16Array([0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7]);
    var positions = [1, 1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1];
    var geometry = new BufferGeometry();
    geometry.setIndex(new BufferAttribute(indices, 1));
    geometry.addAttribute('position', new Float32BufferAttribute(positions, 3));
    LineSegments.call(this, geometry, new LineBasicMaterial({color: color}));
    this.geometry.computeBoundingSphere();
  }
  Box3Helper.prototype = Object.create(LineSegments.prototype);
  Box3Helper.prototype.constructor = Box3Helper;
  Box3Helper.prototype.updateMatrixWorld = function(force) {
    var box = this.box;
    if (box.isEmpty())
      return;
    box.getCenter(this.position);
    box.getSize(this.scale);
    this.scale.multiplyScalar(0.5);
    Object3D.prototype.updateMatrixWorld.call(this, force);
  };
  function PlaneHelper(plane, size, hex) {
    this.type = 'PlaneHelper';
    this.plane = plane;
    this.size = (size === undefined) ? 1 : size;
    var color = (hex !== undefined) ? hex : 0xffff00;
    var positions = [1, -1, 1, -1, 1, 1, -1, -1, 1, 1, 1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0];
    var geometry = new BufferGeometry();
    geometry.addAttribute('position', new Float32BufferAttribute(positions, 3));
    geometry.computeBoundingSphere();
    Line.call(this, geometry, new LineBasicMaterial({color: color}));
    var positions2 = [1, 1, 1, -1, 1, 1, -1, -1, 1, 1, 1, 1, -1, -1, 1, 1, -1, 1];
    var geometry2 = new BufferGeometry();
    geometry2.addAttribute('position', new Float32BufferAttribute(positions2, 3));
    geometry2.computeBoundingSphere();
    this.add(new Mesh(geometry2, new MeshBasicMaterial({
      color: color,
      opacity: 0.2,
      transparent: true,
      depthWrite: false
    })));
  }
  PlaneHelper.prototype = Object.create(Line.prototype);
  PlaneHelper.prototype.constructor = PlaneHelper;
  PlaneHelper.prototype.updateMatrixWorld = function(force) {
    var scale = -this.plane.constant;
    if (Math.abs(scale) < 1e-8)
      scale = 1e-8;
    this.scale.set(0.5 * this.size, 0.5 * this.size, scale);
    this.children[0].material.side = (scale < 0) ? BackSide : FrontSide;
    this.lookAt(this.plane.normal);
    Object3D.prototype.updateMatrixWorld.call(this, force);
  };
  var lineGeometry,
      coneGeometry;
  function ArrowHelper(dir, origin, length, color, headLength, headWidth) {
    Object3D.call(this);
    if (dir === undefined)
      dir = new Vector3(0, 0, 1);
    if (origin === undefined)
      origin = new Vector3(0, 0, 0);
    if (length === undefined)
      length = 1;
    if (color === undefined)
      color = 0xffff00;
    if (headLength === undefined)
      headLength = 0.2 * length;
    if (headWidth === undefined)
      headWidth = 0.2 * headLength;
    if (lineGeometry === undefined) {
      lineGeometry = new BufferGeometry();
      lineGeometry.addAttribute('position', new Float32BufferAttribute([0, 0, 0, 0, 1, 0], 3));
      coneGeometry = new CylinderBufferGeometry(0, 0.5, 1, 5, 1);
      coneGeometry.translate(0, -0.5, 0);
    }
    this.position.copy(origin);
    this.line = new Line(lineGeometry, new LineBasicMaterial({color: color}));
    this.line.matrixAutoUpdate = false;
    this.add(this.line);
    this.cone = new Mesh(coneGeometry, new MeshBasicMaterial({color: color}));
    this.cone.matrixAutoUpdate = false;
    this.add(this.cone);
    this.setDirection(dir);
    this.setLength(length, headLength, headWidth);
  }
  ArrowHelper.prototype = Object.create(Object3D.prototype);
  ArrowHelper.prototype.constructor = ArrowHelper;
  ArrowHelper.prototype.setDirection = (function() {
    var axis = new Vector3();
    var radians;
    return function setDirection(dir) {
      if (dir.y > 0.99999) {
        this.quaternion.set(0, 0, 0, 1);
      } else if (dir.y < -0.99999) {
        this.quaternion.set(1, 0, 0, 0);
      } else {
        axis.set(dir.z, 0, -dir.x).normalize();
        radians = Math.acos(dir.y);
        this.quaternion.setFromAxisAngle(axis, radians);
      }
    };
  }());
  ArrowHelper.prototype.setLength = function(length, headLength, headWidth) {
    if (headLength === undefined)
      headLength = 0.2 * length;
    if (headWidth === undefined)
      headWidth = 0.2 * headLength;
    this.line.scale.set(1, Math.max(0, length - headLength), 1);
    this.line.updateMatrix();
    this.cone.scale.set(headWidth, headLength, headWidth);
    this.cone.position.y = length;
    this.cone.updateMatrix();
  };
  ArrowHelper.prototype.setColor = function(color) {
    this.line.material.color.copy(color);
    this.cone.material.color.copy(color);
  };
  ArrowHelper.prototype.copy = function(source) {
    Object3D.prototype.copy.call(this, source, false);
    this.line.copy(source.line);
    this.cone.copy(source.cone);
    return this;
  };
  ArrowHelper.prototype.clone = function() {
    return new this.constructor().copy(this);
  };
  function AxesHelper(size) {
    size = size || 1;
    var vertices = [0, 0, 0, size, 0, 0, 0, 0, 0, 0, size, 0, 0, 0, 0, 0, 0, size];
    var colors = [1, 0, 0, 1, 0.6, 0, 0, 1, 0, 0.6, 1, 0, 0, 0, 1, 0, 0.6, 1];
    var geometry = new BufferGeometry();
    geometry.addAttribute('position', new Float32BufferAttribute(vertices, 3));
    geometry.addAttribute('color', new Float32BufferAttribute(colors, 3));
    var material = new LineBasicMaterial({vertexColors: VertexColors});
    LineSegments.call(this, geometry, material);
  }
  AxesHelper.prototype = Object.create(LineSegments.prototype);
  AxesHelper.prototype.constructor = AxesHelper;
  function Face4(a, b, c, d, normal, color, materialIndex) {
    console.warn('THREE.Face4 has been removed. A THREE.Face3 will be created instead.');
    return new Face3(a, b, c, normal, color, materialIndex);
  }
  var LineStrip = 0;
  var LinePieces = 1;
  function MeshFaceMaterial(materials) {
    console.warn('THREE.MeshFaceMaterial has been removed. Use an Array instead.');
    return materials;
  }
  function MultiMaterial(materials) {
    if (materials === undefined)
      materials = [];
    console.warn('THREE.MultiMaterial has been removed. Use an Array instead.');
    materials.isMultiMaterial = true;
    materials.materials = materials;
    materials.clone = function() {
      return materials.slice();
    };
    return materials;
  }
  function PointCloud(geometry, material) {
    console.warn('THREE.PointCloud has been renamed to THREE.Points.');
    return new Points(geometry, material);
  }
  function Particle(material) {
    console.warn('THREE.Particle has been renamed to THREE.Sprite.');
    return new Sprite(material);
  }
  function ParticleSystem(geometry, material) {
    console.warn('THREE.ParticleSystem has been renamed to THREE.Points.');
    return new Points(geometry, material);
  }
  function PointCloudMaterial(parameters) {
    console.warn('THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.');
    return new PointsMaterial(parameters);
  }
  function ParticleBasicMaterial(parameters) {
    console.warn('THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.');
    return new PointsMaterial(parameters);
  }
  function ParticleSystemMaterial(parameters) {
    console.warn('THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.');
    return new PointsMaterial(parameters);
  }
  function Vertex(x, y, z) {
    console.warn('THREE.Vertex has been removed. Use THREE.Vector3 instead.');
    return new Vector3(x, y, z);
  }
  function DynamicBufferAttribute(array, itemSize) {
    console.warn('THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.');
    return new BufferAttribute(array, itemSize).setDynamic(true);
  }
  function Int8Attribute(array, itemSize) {
    console.warn('THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.');
    return new Int8BufferAttribute(array, itemSize);
  }
  function Uint8Attribute(array, itemSize) {
    console.warn('THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.');
    return new Uint8BufferAttribute(array, itemSize);
  }
  function Uint8ClampedAttribute(array, itemSize) {
    console.warn('THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.');
    return new Uint8ClampedBufferAttribute(array, itemSize);
  }
  function Int16Attribute(array, itemSize) {
    console.warn('THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.');
    return new Int16BufferAttribute(array, itemSize);
  }
  function Uint16Attribute(array, itemSize) {
    console.warn('THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.');
    return new Uint16BufferAttribute(array, itemSize);
  }
  function Int32Attribute(array, itemSize) {
    console.warn('THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.');
    return new Int32BufferAttribute(array, itemSize);
  }
  function Uint32Attribute(array, itemSize) {
    console.warn('THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.');
    return new Uint32BufferAttribute(array, itemSize);
  }
  function Float32Attribute(array, itemSize) {
    console.warn('THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.');
    return new Float32BufferAttribute(array, itemSize);
  }
  function Float64Attribute(array, itemSize) {
    console.warn('THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.');
    return new Float64BufferAttribute(array, itemSize);
  }
  Curve.create = function(construct, getPoint) {
    console.log('THREE.Curve.create() has been deprecated');
    construct.prototype = Object.create(Curve.prototype);
    construct.prototype.constructor = construct;
    construct.prototype.getPoint = getPoint;
    return construct;
  };
  Object.assign(CurvePath.prototype, {
    createPointsGeometry: function(divisions) {
      console.warn('THREE.CurvePath: .createPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.');
      var pts = this.getPoints(divisions);
      return this.createGeometry(pts);
    },
    createSpacedPointsGeometry: function(divisions) {
      console.warn('THREE.CurvePath: .createSpacedPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.');
      var pts = this.getSpacedPoints(divisions);
      return this.createGeometry(pts);
    },
    createGeometry: function(points) {
      console.warn('THREE.CurvePath: .createGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.');
      var geometry = new Geometry();
      for (var i = 0,
          l = points.length; i < l; i++) {
        var point = points[i];
        geometry.vertices.push(new Vector3(point.x, point.y, point.z || 0));
      }
      return geometry;
    }
  });
  Object.assign(Path.prototype, {fromPoints: function(points) {
      console.warn('THREE.Path: .fromPoints() has been renamed to .setFromPoints().');
      this.setFromPoints(points);
    }});
  function ClosedSplineCurve3(points) {
    console.warn('THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.');
    CatmullRomCurve3.call(this, points);
    this.type = 'catmullrom';
    this.closed = true;
  }
  ClosedSplineCurve3.prototype = Object.create(CatmullRomCurve3.prototype);
  function SplineCurve3(points) {
    console.warn('THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.');
    CatmullRomCurve3.call(this, points);
    this.type = 'catmullrom';
  }
  SplineCurve3.prototype = Object.create(CatmullRomCurve3.prototype);
  function Spline(points) {
    console.warn('THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.');
    CatmullRomCurve3.call(this, points);
    this.type = 'catmullrom';
  }
  Spline.prototype = Object.create(CatmullRomCurve3.prototype);
  Object.assign(Spline.prototype, {
    initFromArray: function() {
      console.error('THREE.Spline: .initFromArray() has been removed.');
    },
    getControlPointsArray: function() {
      console.error('THREE.Spline: .getControlPointsArray() has been removed.');
    },
    reparametrizeByArcLength: function() {
      console.error('THREE.Spline: .reparametrizeByArcLength() has been removed.');
    }
  });
  function AxisHelper(size) {
    console.warn('THREE.AxisHelper has been renamed to THREE.AxesHelper.');
    return new AxesHelper(size);
  }
  function BoundingBoxHelper(object, color) {
    console.warn('THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.');
    return new BoxHelper(object, color);
  }
  function EdgesHelper(object, hex) {
    console.warn('THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.');
    return new LineSegments(new EdgesGeometry(object.geometry), new LineBasicMaterial({color: hex !== undefined ? hex : 0xffffff}));
  }
  GridHelper.prototype.setColors = function() {
    console.error('THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.');
  };
  SkeletonHelper.prototype.update = function() {
    console.error('THREE.SkeletonHelper: update() no longer needs to be called.');
  };
  function WireframeHelper(object, hex) {
    console.warn('THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.');
    return new LineSegments(new WireframeGeometry(object.geometry), new LineBasicMaterial({color: hex !== undefined ? hex : 0xffffff}));
  }
  Object.assign(Loader.prototype, {extractUrlBase: function(url) {
      console.warn('THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead.');
      return LoaderUtils.extractUrlBase(url);
    }});
  function XHRLoader(manager) {
    console.warn('THREE.XHRLoader has been renamed to THREE.FileLoader.');
    return new FileLoader(manager);
  }
  function BinaryTextureLoader(manager) {
    console.warn('THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.');
    return new DataTextureLoader(manager);
  }
  Object.assign(ObjectLoader.prototype, {setTexturePath: function(value) {
      console.warn('THREE.ObjectLoader: .setTexturePath() has been renamed to .setResourcePath().');
      return this.setResourcePath(value);
    }});
  Object.assign(Box2.prototype, {
    center: function(optionalTarget) {
      console.warn('THREE.Box2: .center() has been renamed to .getCenter().');
      return this.getCenter(optionalTarget);
    },
    empty: function() {
      console.warn('THREE.Box2: .empty() has been renamed to .isEmpty().');
      return this.isEmpty();
    },
    isIntersectionBox: function(box) {
      console.warn('THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().');
      return this.intersectsBox(box);
    },
    size: function(optionalTarget) {
      console.warn('THREE.Box2: .size() has been renamed to .getSize().');
      return this.getSize(optionalTarget);
    }
  });
  Object.assign(Box3.prototype, {
    center: function(optionalTarget) {
      console.warn('THREE.Box3: .center() has been renamed to .getCenter().');
      return this.getCenter(optionalTarget);
    },
    empty: function() {
      console.warn('THREE.Box3: .empty() has been renamed to .isEmpty().');
      return this.isEmpty();
    },
    isIntersectionBox: function(box) {
      console.warn('THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().');
      return this.intersectsBox(box);
    },
    isIntersectionSphere: function(sphere) {
      console.warn('THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().');
      return this.intersectsSphere(sphere);
    },
    size: function(optionalTarget) {
      console.warn('THREE.Box3: .size() has been renamed to .getSize().');
      return this.getSize(optionalTarget);
    }
  });
  Line3.prototype.center = function(optionalTarget) {
    console.warn('THREE.Line3: .center() has been renamed to .getCenter().');
    return this.getCenter(optionalTarget);
  };
  Object.assign(_Math, {
    random16: function() {
      console.warn('THREE.Math: .random16() has been deprecated. Use Math.random() instead.');
      return Math.random();
    },
    nearestPowerOfTwo: function(value) {
      console.warn('THREE.Math: .nearestPowerOfTwo() has been renamed to .floorPowerOfTwo().');
      return _Math.floorPowerOfTwo(value);
    },
    nextPowerOfTwo: function(value) {
      console.warn('THREE.Math: .nextPowerOfTwo() has been renamed to .ceilPowerOfTwo().');
      return _Math.ceilPowerOfTwo(value);
    }
  });
  Object.assign(Matrix3.prototype, {
    flattenToArrayOffset: function(array, offset) {
      console.warn("THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.");
      return this.toArray(array, offset);
    },
    multiplyVector3: function(vector) {
      console.warn('THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.');
      return vector.applyMatrix3(this);
    },
    multiplyVector3Array: function() {
      console.error('THREE.Matrix3: .multiplyVector3Array() has been removed.');
    },
    applyToBuffer: function(buffer) {
      console.warn('THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.');
      return this.applyToBufferAttribute(buffer);
    },
    applyToVector3Array: function() {
      console.error('THREE.Matrix3: .applyToVector3Array() has been removed.');
    }
  });
  Object.assign(Matrix4.prototype, {
    extractPosition: function(m) {
      console.warn('THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().');
      return this.copyPosition(m);
    },
    flattenToArrayOffset: function(array, offset) {
      console.warn("THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.");
      return this.toArray(array, offset);
    },
    getPosition: function() {
      var v1;
      return function getPosition() {
        if (v1 === undefined)
          v1 = new Vector3();
        console.warn('THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.');
        return v1.setFromMatrixColumn(this, 3);
      };
    }(),
    setRotationFromQuaternion: function(q) {
      console.warn('THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().');
      return this.makeRotationFromQuaternion(q);
    },
    multiplyToArray: function() {
      console.warn('THREE.Matrix4: .multiplyToArray() has been removed.');
    },
    multiplyVector3: function(vector) {
      console.warn('THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.');
      return vector.applyMatrix4(this);
    },
    multiplyVector4: function(vector) {
      console.warn('THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.');
      return vector.applyMatrix4(this);
    },
    multiplyVector3Array: function() {
      console.error('THREE.Matrix4: .multiplyVector3Array() has been removed.');
    },
    rotateAxis: function(v) {
      console.warn('THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.');
      v.transformDirection(this);
    },
    crossVector: function(vector) {
      console.warn('THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.');
      return vector.applyMatrix4(this);
    },
    translate: function() {
      console.error('THREE.Matrix4: .translate() has been removed.');
    },
    rotateX: function() {
      console.error('THREE.Matrix4: .rotateX() has been removed.');
    },
    rotateY: function() {
      console.error('THREE.Matrix4: .rotateY() has been removed.');
    },
    rotateZ: function() {
      console.error('THREE.Matrix4: .rotateZ() has been removed.');
    },
    rotateByAxis: function() {
      console.error('THREE.Matrix4: .rotateByAxis() has been removed.');
    },
    applyToBuffer: function(buffer) {
      console.warn('THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.');
      return this.applyToBufferAttribute(buffer);
    },
    applyToVector3Array: function() {
      console.error('THREE.Matrix4: .applyToVector3Array() has been removed.');
    },
    makeFrustum: function(left, right, bottom, top, near, far) {
      console.warn('THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.');
      return this.makePerspective(left, right, top, bottom, near, far);
    }
  });
  Plane.prototype.isIntersectionLine = function(line) {
    console.warn('THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().');
    return this.intersectsLine(line);
  };
  Quaternion.prototype.multiplyVector3 = function(vector) {
    console.warn('THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.');
    return vector.applyQuaternion(this);
  };
  Object.assign(Ray.prototype, {
    isIntersectionBox: function(box) {
      console.warn('THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().');
      return this.intersectsBox(box);
    },
    isIntersectionPlane: function(plane) {
      console.warn('THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().');
      return this.intersectsPlane(plane);
    },
    isIntersectionSphere: function(sphere) {
      console.warn('THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().');
      return this.intersectsSphere(sphere);
    }
  });
  Object.assign(Triangle.prototype, {
    area: function() {
      console.warn('THREE.Triangle: .area() has been renamed to .getArea().');
      return this.getArea();
    },
    barycoordFromPoint: function(point, target) {
      console.warn('THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().');
      return this.getBarycoord(point, target);
    },
    midpoint: function(target) {
      console.warn('THREE.Triangle: .midpoint() has been renamed to .getMidpoint().');
      return this.getMidpoint(target);
    },
    normal: function(target) {
      console.warn('THREE.Triangle: .normal() has been renamed to .getNormal().');
      return this.getNormal(target);
    },
    plane: function(target) {
      console.warn('THREE.Triangle: .plane() has been renamed to .getPlane().');
      return this.getPlane(target);
    }
  });
  Object.assign(Triangle, {
    barycoordFromPoint: function(point, a, b, c, target) {
      console.warn('THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().');
      return Triangle.getBarycoord(point, a, b, c, target);
    },
    normal: function(a, b, c, target) {
      console.warn('THREE.Triangle: .normal() has been renamed to .getNormal().');
      return Triangle.getNormal(a, b, c, target);
    }
  });
  Object.assign(Shape.prototype, {
    extractAllPoints: function(divisions) {
      console.warn('THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead.');
      return this.extractPoints(divisions);
    },
    extrude: function(options) {
      console.warn('THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.');
      return new ExtrudeGeometry(this, options);
    },
    makeGeometry: function(options) {
      console.warn('THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.');
      return new ShapeGeometry(this, options);
    }
  });
  Object.assign(Vector2.prototype, {
    fromAttribute: function(attribute, index, offset) {
      console.warn('THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().');
      return this.fromBufferAttribute(attribute, index, offset);
    },
    distanceToManhattan: function(v) {
      console.warn('THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo().');
      return this.manhattanDistanceTo(v);
    },
    lengthManhattan: function() {
      console.warn('THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength().');
      return this.manhattanLength();
    }
  });
  Object.assign(Vector3.prototype, {
    setEulerFromRotationMatrix: function() {
      console.error('THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.');
    },
    setEulerFromQuaternion: function() {
      console.error('THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.');
    },
    getPositionFromMatrix: function(m) {
      console.warn('THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().');
      return this.setFromMatrixPosition(m);
    },
    getScaleFromMatrix: function(m) {
      console.warn('THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().');
      return this.setFromMatrixScale(m);
    },
    getColumnFromMatrix: function(index, matrix) {
      console.warn('THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().');
      return this.setFromMatrixColumn(matrix, index);
    },
    applyProjection: function(m) {
      console.warn('THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.');
      return this.applyMatrix4(m);
    },
    fromAttribute: function(attribute, index, offset) {
      console.warn('THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().');
      return this.fromBufferAttribute(attribute, index, offset);
    },
    distanceToManhattan: function(v) {
      console.warn('THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo().');
      return this.manhattanDistanceTo(v);
    },
    lengthManhattan: function() {
      console.warn('THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength().');
      return this.manhattanLength();
    }
  });
  Object.assign(Vector4.prototype, {
    fromAttribute: function(attribute, index, offset) {
      console.warn('THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().');
      return this.fromBufferAttribute(attribute, index, offset);
    },
    lengthManhattan: function() {
      console.warn('THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength().');
      return this.manhattanLength();
    }
  });
  Object.assign(Geometry.prototype, {
    computeTangents: function() {
      console.error('THREE.Geometry: .computeTangents() has been removed.');
    },
    computeLineDistances: function() {
      console.error('THREE.Geometry: .computeLineDistances() has been removed. Use THREE.Line.computeLineDistances() instead.');
    }
  });
  Object.assign(Object3D.prototype, {
    getChildByName: function(name) {
      console.warn('THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().');
      return this.getObjectByName(name);
    },
    renderDepth: function() {
      console.warn('THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.');
    },
    translate: function(distance, axis) {
      console.warn('THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.');
      return this.translateOnAxis(axis, distance);
    },
    getWorldRotation: function() {
      console.error('THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.');
    }
  });
  Object.defineProperties(Object3D.prototype, {
    eulerOrder: {
      get: function() {
        console.warn('THREE.Object3D: .eulerOrder is now .rotation.order.');
        return this.rotation.order;
      },
      set: function(value) {
        console.warn('THREE.Object3D: .eulerOrder is now .rotation.order.');
        this.rotation.order = value;
      }
    },
    useQuaternion: {
      get: function() {
        console.warn('THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.');
      },
      set: function() {
        console.warn('THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.');
      }
    }
  });
  Object.defineProperties(LOD.prototype, {objects: {get: function() {
        console.warn('THREE.LOD: .objects has been renamed to .levels.');
        return this.levels;
      }}});
  Object.defineProperty(Skeleton.prototype, 'useVertexTexture', {
    get: function() {
      console.warn('THREE.Skeleton: useVertexTexture has been removed.');
    },
    set: function() {
      console.warn('THREE.Skeleton: useVertexTexture has been removed.');
    }
  });
  SkinnedMesh.prototype.initBones = function() {
    console.error('THREE.SkinnedMesh: initBones() has been removed.');
  };
  Object.defineProperty(Curve.prototype, '__arcLengthDivisions', {
    get: function() {
      console.warn('THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.');
      return this.arcLengthDivisions;
    },
    set: function(value) {
      console.warn('THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.');
      this.arcLengthDivisions = value;
    }
  });
  PerspectiveCamera.prototype.setLens = function(focalLength, filmGauge) {
    console.warn("THREE.PerspectiveCamera.setLens is deprecated. " + "Use .setFocalLength and .filmGauge for a photographic setup.");
    if (filmGauge !== undefined)
      this.filmGauge = filmGauge;
    this.setFocalLength(focalLength);
  };
  Object.defineProperties(Light.prototype, {
    onlyShadow: {set: function() {
        console.warn('THREE.Light: .onlyShadow has been removed.');
      }},
    shadowCameraFov: {set: function(value) {
        console.warn('THREE.Light: .shadowCameraFov is now .shadow.camera.fov.');
        this.shadow.camera.fov = value;
      }},
    shadowCameraLeft: {set: function(value) {
        console.warn('THREE.Light: .shadowCameraLeft is now .shadow.camera.left.');
        this.shadow.camera.left = value;
      }},
    shadowCameraRight: {set: function(value) {
        console.warn('THREE.Light: .shadowCameraRight is now .shadow.camera.right.');
        this.shadow.camera.right = value;
      }},
    shadowCameraTop: {set: function(value) {
        console.warn('THREE.Light: .shadowCameraTop is now .shadow.camera.top.');
        this.shadow.camera.top = value;
      }},
    shadowCameraBottom: {set: function(value) {
        console.warn('THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.');
        this.shadow.camera.bottom = value;
      }},
    shadowCameraNear: {set: function(value) {
        console.warn('THREE.Light: .shadowCameraNear is now .shadow.camera.near.');
        this.shadow.camera.near = value;
      }},
    shadowCameraFar: {set: function(value) {
        console.warn('THREE.Light: .shadowCameraFar is now .shadow.camera.far.');
        this.shadow.camera.far = value;
      }},
    shadowCameraVisible: {set: function() {
        console.warn('THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.');
      }},
    shadowBias: {set: function(value) {
        console.warn('THREE.Light: .shadowBias is now .shadow.bias.');
        this.shadow.bias = value;
      }},
    shadowDarkness: {set: function() {
        console.warn('THREE.Light: .shadowDarkness has been removed.');
      }},
    shadowMapWidth: {set: function(value) {
        console.warn('THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.');
        this.shadow.mapSize.width = value;
      }},
    shadowMapHeight: {set: function(value) {
        console.warn('THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.');
        this.shadow.mapSize.height = value;
      }}
  });
  Object.defineProperties(BufferAttribute.prototype, {
    length: {get: function() {
        console.warn('THREE.BufferAttribute: .length has been deprecated. Use .count instead.');
        return this.array.length;
      }},
    copyIndicesArray: function() {
      console.error('THREE.BufferAttribute: .copyIndicesArray() has been removed.');
    }
  });
  Object.assign(BufferGeometry.prototype, {
    addIndex: function(index) {
      console.warn('THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().');
      this.setIndex(index);
    },
    addDrawCall: function(start, count, indexOffset) {
      if (indexOffset !== undefined) {
        console.warn('THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.');
      }
      console.warn('THREE.BufferGeometry: .addDrawCall() is now .addGroup().');
      this.addGroup(start, count);
    },
    clearDrawCalls: function() {
      console.warn('THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().');
      this.clearGroups();
    },
    computeTangents: function() {
      console.warn('THREE.BufferGeometry: .computeTangents() has been removed.');
    },
    computeOffsets: function() {
      console.warn('THREE.BufferGeometry: .computeOffsets() has been removed.');
    }
  });
  Object.defineProperties(BufferGeometry.prototype, {
    drawcalls: {get: function() {
        console.error('THREE.BufferGeometry: .drawcalls has been renamed to .groups.');
        return this.groups;
      }},
    offsets: {get: function() {
        console.warn('THREE.BufferGeometry: .offsets has been renamed to .groups.');
        return this.groups;
      }}
  });
  Object.assign(ExtrudeBufferGeometry.prototype, {
    getArrays: function() {
      console.error('THREE.ExtrudeBufferGeometry: .getArrays() has been removed.');
    },
    addShapeList: function() {
      console.error('THREE.ExtrudeBufferGeometry: .addShapeList() has been removed.');
    },
    addShape: function() {
      console.error('THREE.ExtrudeBufferGeometry: .addShape() has been removed.');
    }
  });
  Object.defineProperties(Uniform.prototype, {
    dynamic: {set: function() {
        console.warn('THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.');
      }},
    onUpdate: {value: function() {
        console.warn('THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.');
        return this;
      }}
  });
  Object.defineProperties(Material.prototype, {
    wrapAround: {
      get: function() {
        console.warn('THREE.Material: .wrapAround has been removed.');
      },
      set: function() {
        console.warn('THREE.Material: .wrapAround has been removed.');
      }
    },
    overdraw: {
      get: function() {
        console.warn('THREE.Material: .overdraw has been removed.');
      },
      set: function() {
        console.warn('THREE.Material: .overdraw has been removed.');
      }
    },
    wrapRGB: {get: function() {
        console.warn('THREE.Material: .wrapRGB has been removed.');
        return new Color();
      }},
    shading: {
      get: function() {
        console.error('THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.');
      },
      set: function(value) {
        console.warn('THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.');
        this.flatShading = (value === FlatShading);
      }
    }
  });
  Object.defineProperties(MeshPhongMaterial.prototype, {metal: {
      get: function() {
        console.warn('THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.');
        return false;
      },
      set: function() {
        console.warn('THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead');
      }
    }});
  Object.defineProperties(ShaderMaterial.prototype, {derivatives: {
      get: function() {
        console.warn('THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.');
        return this.extensions.derivatives;
      },
      set: function(value) {
        console.warn('THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.');
        this.extensions.derivatives = value;
      }
    }});
  Object.assign(WebGLRenderer.prototype, {
    clearTarget: function(renderTarget, color, depth, stencil) {
      console.warn('THREE.WebGLRenderer: .clearTarget() has been deprecated. Use .setRenderTarget() and .clear() instead.');
      this.setRenderTarget(renderTarget);
      this.clear(color, depth, stencil);
    },
    animate: function(callback) {
      console.warn('THREE.WebGLRenderer: .animate() is now .setAnimationLoop().');
      this.setAnimationLoop(callback);
    },
    getCurrentRenderTarget: function() {
      console.warn('THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().');
      return this.getRenderTarget();
    },
    getMaxAnisotropy: function() {
      console.warn('THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy().');
      return this.capabilities.getMaxAnisotropy();
    },
    getPrecision: function() {
      console.warn('THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision.');
      return this.capabilities.precision;
    },
    resetGLState: function() {
      console.warn('THREE.WebGLRenderer: .resetGLState() is now .state.reset().');
      return this.state.reset();
    },
    supportsFloatTextures: function() {
      console.warn('THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \'OES_texture_float\' ).');
      return this.extensions.get('OES_texture_float');
    },
    supportsHalfFloatTextures: function() {
      console.warn('THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \'OES_texture_half_float\' ).');
      return this.extensions.get('OES_texture_half_float');
    },
    supportsStandardDerivatives: function() {
      console.warn('THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \'OES_standard_derivatives\' ).');
      return this.extensions.get('OES_standard_derivatives');
    },
    supportsCompressedTextureS3TC: function() {
      console.warn('THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \'WEBGL_compressed_texture_s3tc\' ).');
      return this.extensions.get('WEBGL_compressed_texture_s3tc');
    },
    supportsCompressedTexturePVRTC: function() {
      console.warn('THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \'WEBGL_compressed_texture_pvrtc\' ).');
      return this.extensions.get('WEBGL_compressed_texture_pvrtc');
    },
    supportsBlendMinMax: function() {
      console.warn('THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \'EXT_blend_minmax\' ).');
      return this.extensions.get('EXT_blend_minmax');
    },
    supportsVertexTextures: function() {
      console.warn('THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.');
      return this.capabilities.vertexTextures;
    },
    supportsInstancedArrays: function() {
      console.warn('THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \'ANGLE_instanced_arrays\' ).');
      return this.extensions.get('ANGLE_instanced_arrays');
    },
    enableScissorTest: function(boolean) {
      console.warn('THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().');
      this.setScissorTest(boolean);
    },
    initMaterial: function() {
      console.warn('THREE.WebGLRenderer: .initMaterial() has been removed.');
    },
    addPrePlugin: function() {
      console.warn('THREE.WebGLRenderer: .addPrePlugin() has been removed.');
    },
    addPostPlugin: function() {
      console.warn('THREE.WebGLRenderer: .addPostPlugin() has been removed.');
    },
    updateShadowMap: function() {
      console.warn('THREE.WebGLRenderer: .updateShadowMap() has been removed.');
    },
    setFaceCulling: function() {
      console.warn('THREE.WebGLRenderer: .setFaceCulling() has been removed.');
    }
  });
  Object.defineProperties(WebGLRenderer.prototype, {
    shadowMapEnabled: {
      get: function() {
        return this.shadowMap.enabled;
      },
      set: function(value) {
        console.warn('THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.');
        this.shadowMap.enabled = value;
      }
    },
    shadowMapType: {
      get: function() {
        return this.shadowMap.type;
      },
      set: function(value) {
        console.warn('THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.');
        this.shadowMap.type = value;
      }
    },
    shadowMapCullFace: {
      get: function() {
        console.warn('THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.');
        return undefined;
      },
      set: function() {
        console.warn('THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.');
      }
    }
  });
  Object.defineProperties(WebGLShadowMap.prototype, {
    cullFace: {
      get: function() {
        console.warn('THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.');
        return undefined;
      },
      set: function() {
        console.warn('THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.');
      }
    },
    renderReverseSided: {
      get: function() {
        console.warn('THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.');
        return undefined;
      },
      set: function() {
        console.warn('THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.');
      }
    },
    renderSingleSided: {
      get: function() {
        console.warn('THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.');
        return undefined;
      },
      set: function() {
        console.warn('THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.');
      }
    }
  });
  Object.defineProperties(WebGLRenderTargetCube.prototype, {
    activeCubeFace: {set: function() {
        console.warn('THREE.WebGLRenderTargetCube: .activeCubeFace has been removed. It is now the second parameter of WebGLRenderer.setRenderTarget().');
      }},
    activeMipMapLevel: {set: function() {
        console.warn('THREE.WebGLRenderTargetCube: .activeMipMapLevel has been removed. It is now the third parameter of WebGLRenderer.setRenderTarget().');
      }}
  });
  Object.defineProperties(WebGLRenderTarget.prototype, {
    wrapS: {
      get: function() {
        console.warn('THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.');
        return this.texture.wrapS;
      },
      set: function(value) {
        console.warn('THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.');
        this.texture.wrapS = value;
      }
    },
    wrapT: {
      get: function() {
        console.warn('THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.');
        return this.texture.wrapT;
      },
      set: function(value) {
        console.warn('THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.');
        this.texture.wrapT = value;
      }
    },
    magFilter: {
      get: function() {
        console.warn('THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.');
        return this.texture.magFilter;
      },
      set: function(value) {
        console.warn('THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.');
        this.texture.magFilter = value;
      }
    },
    minFilter: {
      get: function() {
        console.warn('THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.');
        return this.texture.minFilter;
      },
      set: function(value) {
        console.warn('THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.');
        this.texture.minFilter = value;
      }
    },
    anisotropy: {
      get: function() {
        console.warn('THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.');
        return this.texture.anisotropy;
      },
      set: function(value) {
        console.warn('THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.');
        this.texture.anisotropy = value;
      }
    },
    offset: {
      get: function() {
        console.warn('THREE.WebGLRenderTarget: .offset is now .texture.offset.');
        return this.texture.offset;
      },
      set: function(value) {
        console.warn('THREE.WebGLRenderTarget: .offset is now .texture.offset.');
        this.texture.offset = value;
      }
    },
    repeat: {
      get: function() {
        console.warn('THREE.WebGLRenderTarget: .repeat is now .texture.repeat.');
        return this.texture.repeat;
      },
      set: function(value) {
        console.warn('THREE.WebGLRenderTarget: .repeat is now .texture.repeat.');
        this.texture.repeat = value;
      }
    },
    format: {
      get: function() {
        console.warn('THREE.WebGLRenderTarget: .format is now .texture.format.');
        return this.texture.format;
      },
      set: function(value) {
        console.warn('THREE.WebGLRenderTarget: .format is now .texture.format.');
        this.texture.format = value;
      }
    },
    type: {
      get: function() {
        console.warn('THREE.WebGLRenderTarget: .type is now .texture.type.');
        return this.texture.type;
      },
      set: function(value) {
        console.warn('THREE.WebGLRenderTarget: .type is now .texture.type.');
        this.texture.type = value;
      }
    },
    generateMipmaps: {
      get: function() {
        console.warn('THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.');
        return this.texture.generateMipmaps;
      },
      set: function(value) {
        console.warn('THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.');
        this.texture.generateMipmaps = value;
      }
    }
  });
  Object.defineProperties(WebVRManager.prototype, {
    standing: {set: function() {
        console.warn('THREE.WebVRManager: .standing has been removed.');
      }},
    userHeight: {set: function() {
        console.warn('THREE.WebVRManager: .userHeight has been removed.');
      }}
  });
  Audio.prototype.load = function(file) {
    console.warn('THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.');
    var scope = this;
    var audioLoader = new AudioLoader();
    audioLoader.load(file, function(buffer) {
      scope.setBuffer(buffer);
    });
    return this;
  };
  AudioAnalyser.prototype.getData = function() {
    console.warn('THREE.AudioAnalyser: .getData() is now .getFrequencyData().');
    return this.getFrequencyData();
  };
  CubeCamera.prototype.updateCubeMap = function(renderer, scene) {
    console.warn('THREE.CubeCamera: .updateCubeMap() is now .update().');
    return this.update(renderer, scene);
  };
  var GeometryUtils = {
    merge: function(geometry1, geometry2, materialIndexOffset) {
      console.warn('THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.');
      var matrix;
      if (geometry2.isMesh) {
        geometry2.matrixAutoUpdate && geometry2.updateMatrix();
        matrix = geometry2.matrix;
        geometry2 = geometry2.geometry;
      }
      geometry1.merge(geometry2, matrix, materialIndexOffset);
    },
    center: function(geometry) {
      console.warn('THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.');
      return geometry.center();
    }
  };
  ImageUtils.crossOrigin = undefined;
  ImageUtils.loadTexture = function(url, mapping, onLoad, onError) {
    console.warn('THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.');
    var loader = new TextureLoader();
    loader.setCrossOrigin(this.crossOrigin);
    var texture = loader.load(url, onLoad, undefined, onError);
    if (mapping)
      texture.mapping = mapping;
    return texture;
  };
  ImageUtils.loadTextureCube = function(urls, mapping, onLoad, onError) {
    console.warn('THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.');
    var loader = new CubeTextureLoader();
    loader.setCrossOrigin(this.crossOrigin);
    var texture = loader.load(urls, onLoad, undefined, onError);
    if (mapping)
      texture.mapping = mapping;
    return texture;
  };
  ImageUtils.loadCompressedTexture = function() {
    console.error('THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.');
  };
  ImageUtils.loadCompressedTextureCube = function() {
    console.error('THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.');
  };
  function Projector() {
    console.error('THREE.Projector has been moved to /examples/js/renderers/Projector.js.');
    this.projectVector = function(vector, camera) {
      console.warn('THREE.Projector: .projectVector() is now vector.project().');
      vector.project(camera);
    };
    this.unprojectVector = function(vector, camera) {
      console.warn('THREE.Projector: .unprojectVector() is now vector.unproject().');
      vector.unproject(camera);
    };
    this.pickingRay = function() {
      console.error('THREE.Projector: .pickingRay() is now raycaster.setFromCamera().');
    };
  }
  function CanvasRenderer() {
    console.error('THREE.CanvasRenderer has been removed');
  }
  function JSONLoader() {
    console.error('THREE.JSONLoader has been removed.');
  }
  var SceneUtils = {
    createMultiMaterialObject: function() {
      console.error('THREE.SceneUtils has been moved to /examples/js/utils/SceneUtils.js');
    },
    detach: function() {
      console.error('THREE.SceneUtils has been moved to /examples/js/utils/SceneUtils.js');
    },
    attach: function() {
      console.error('THREE.SceneUtils has been moved to /examples/js/utils/SceneUtils.js');
    }
  };
  function LensFlare() {
    console.error('THREE.LensFlare has been moved to /examples/js/objects/Lensflare.js');
  }
  exports.WebGLMultisampleRenderTarget = WebGLMultisampleRenderTarget;
  exports.WebGLRenderTargetCube = WebGLRenderTargetCube;
  exports.WebGLRenderTarget = WebGLRenderTarget;
  exports.WebGLRenderer = WebGLRenderer;
  exports.ShaderLib = ShaderLib;
  exports.UniformsLib = UniformsLib;
  exports.UniformsUtils = UniformsUtils;
  exports.ShaderChunk = ShaderChunk;
  exports.FogExp2 = FogExp2;
  exports.Fog = Fog;
  exports.Scene = Scene;
  exports.Sprite = Sprite;
  exports.LOD = LOD;
  exports.SkinnedMesh = SkinnedMesh;
  exports.Skeleton = Skeleton;
  exports.Bone = Bone;
  exports.Mesh = Mesh;
  exports.LineSegments = LineSegments;
  exports.LineLoop = LineLoop;
  exports.Line = Line;
  exports.Points = Points;
  exports.Group = Group;
  exports.VideoTexture = VideoTexture;
  exports.DataTexture = DataTexture;
  exports.DataTexture3D = DataTexture3D;
  exports.CompressedTexture = CompressedTexture;
  exports.CubeTexture = CubeTexture;
  exports.CanvasTexture = CanvasTexture;
  exports.DepthTexture = DepthTexture;
  exports.Texture = Texture;
  exports.AnimationLoader = AnimationLoader;
  exports.CompressedTextureLoader = CompressedTextureLoader;
  exports.DataTextureLoader = DataTextureLoader;
  exports.CubeTextureLoader = CubeTextureLoader;
  exports.TextureLoader = TextureLoader;
  exports.ObjectLoader = ObjectLoader;
  exports.MaterialLoader = MaterialLoader;
  exports.BufferGeometryLoader = BufferGeometryLoader;
  exports.DefaultLoadingManager = DefaultLoadingManager;
  exports.LoadingManager = LoadingManager;
  exports.ImageLoader = ImageLoader;
  exports.ImageBitmapLoader = ImageBitmapLoader;
  exports.FontLoader = FontLoader;
  exports.FileLoader = FileLoader;
  exports.Loader = Loader;
  exports.LoaderUtils = LoaderUtils;
  exports.Cache = Cache;
  exports.AudioLoader = AudioLoader;
  exports.SpotLightShadow = SpotLightShadow;
  exports.SpotLight = SpotLight;
  exports.PointLight = PointLight;
  exports.RectAreaLight = RectAreaLight;
  exports.HemisphereLight = HemisphereLight;
  exports.DirectionalLightShadow = DirectionalLightShadow;
  exports.DirectionalLight = DirectionalLight;
  exports.AmbientLight = AmbientLight;
  exports.LightShadow = LightShadow;
  exports.Light = Light;
  exports.StereoCamera = StereoCamera;
  exports.PerspectiveCamera = PerspectiveCamera;
  exports.OrthographicCamera = OrthographicCamera;
  exports.CubeCamera = CubeCamera;
  exports.ArrayCamera = ArrayCamera;
  exports.Camera = Camera;
  exports.AudioListener = AudioListener;
  exports.PositionalAudio = PositionalAudio;
  exports.AudioContext = AudioContext;
  exports.AudioAnalyser = AudioAnalyser;
  exports.Audio = Audio;
  exports.VectorKeyframeTrack = VectorKeyframeTrack;
  exports.StringKeyframeTrack = StringKeyframeTrack;
  exports.QuaternionKeyframeTrack = QuaternionKeyframeTrack;
  exports.NumberKeyframeTrack = NumberKeyframeTrack;
  exports.ColorKeyframeTrack = ColorKeyframeTrack;
  exports.BooleanKeyframeTrack = BooleanKeyframeTrack;
  exports.PropertyMixer = PropertyMixer;
  exports.PropertyBinding = PropertyBinding;
  exports.KeyframeTrack = KeyframeTrack;
  exports.AnimationUtils = AnimationUtils;
  exports.AnimationObjectGroup = AnimationObjectGroup;
  exports.AnimationMixer = AnimationMixer;
  exports.AnimationClip = AnimationClip;
  exports.Uniform = Uniform;
  exports.InstancedBufferGeometry = InstancedBufferGeometry;
  exports.BufferGeometry = BufferGeometry;
  exports.Geometry = Geometry;
  exports.InterleavedBufferAttribute = InterleavedBufferAttribute;
  exports.InstancedInterleavedBuffer = InstancedInterleavedBuffer;
  exports.InterleavedBuffer = InterleavedBuffer;
  exports.InstancedBufferAttribute = InstancedBufferAttribute;
  exports.Face3 = Face3;
  exports.Object3D = Object3D;
  exports.Raycaster = Raycaster;
  exports.Layers = Layers;
  exports.EventDispatcher = EventDispatcher;
  exports.Clock = Clock;
  exports.QuaternionLinearInterpolant = QuaternionLinearInterpolant;
  exports.LinearInterpolant = LinearInterpolant;
  exports.DiscreteInterpolant = DiscreteInterpolant;
  exports.CubicInterpolant = CubicInterpolant;
  exports.Interpolant = Interpolant;
  exports.Triangle = Triangle;
  exports.Math = _Math;
  exports.Spherical = Spherical;
  exports.Cylindrical = Cylindrical;
  exports.Plane = Plane;
  exports.Frustum = Frustum;
  exports.Sphere = Sphere;
  exports.Ray = Ray;
  exports.Matrix4 = Matrix4;
  exports.Matrix3 = Matrix3;
  exports.Box3 = Box3;
  exports.Box2 = Box2;
  exports.Line3 = Line3;
  exports.Euler = Euler;
  exports.Vector4 = Vector4;
  exports.Vector3 = Vector3;
  exports.Vector2 = Vector2;
  exports.Quaternion = Quaternion;
  exports.Color = Color;
  exports.ImmediateRenderObject = ImmediateRenderObject;
  exports.VertexNormalsHelper = VertexNormalsHelper;
  exports.SpotLightHelper = SpotLightHelper;
  exports.SkeletonHelper = SkeletonHelper;
  exports.PointLightHelper = PointLightHelper;
  exports.RectAreaLightHelper = RectAreaLightHelper;
  exports.HemisphereLightHelper = HemisphereLightHelper;
  exports.GridHelper = GridHelper;
  exports.PolarGridHelper = PolarGridHelper;
  exports.PositionalAudioHelper = PositionalAudioHelper;
  exports.FaceNormalsHelper = FaceNormalsHelper;
  exports.DirectionalLightHelper = DirectionalLightHelper;
  exports.CameraHelper = CameraHelper;
  exports.BoxHelper = BoxHelper;
  exports.Box3Helper = Box3Helper;
  exports.PlaneHelper = PlaneHelper;
  exports.ArrowHelper = ArrowHelper;
  exports.AxesHelper = AxesHelper;
  exports.Shape = Shape;
  exports.Path = Path;
  exports.ShapePath = ShapePath;
  exports.Font = Font;
  exports.CurvePath = CurvePath;
  exports.Curve = Curve;
  exports.ImageUtils = ImageUtils;
  exports.ShapeUtils = ShapeUtils;
  exports.WebGLUtils = WebGLUtils;
  exports.WireframeGeometry = WireframeGeometry;
  exports.ParametricGeometry = ParametricGeometry;
  exports.ParametricBufferGeometry = ParametricBufferGeometry;
  exports.TetrahedronGeometry = TetrahedronGeometry;
  exports.TetrahedronBufferGeometry = TetrahedronBufferGeometry;
  exports.OctahedronGeometry = OctahedronGeometry;
  exports.OctahedronBufferGeometry = OctahedronBufferGeometry;
  exports.IcosahedronGeometry = IcosahedronGeometry;
  exports.IcosahedronBufferGeometry = IcosahedronBufferGeometry;
  exports.DodecahedronGeometry = DodecahedronGeometry;
  exports.DodecahedronBufferGeometry = DodecahedronBufferGeometry;
  exports.PolyhedronGeometry = PolyhedronGeometry;
  exports.PolyhedronBufferGeometry = PolyhedronBufferGeometry;
  exports.TubeGeometry = TubeGeometry;
  exports.TubeBufferGeometry = TubeBufferGeometry;
  exports.TorusKnotGeometry = TorusKnotGeometry;
  exports.TorusKnotBufferGeometry = TorusKnotBufferGeometry;
  exports.TorusGeometry = TorusGeometry;
  exports.TorusBufferGeometry = TorusBufferGeometry;
  exports.TextGeometry = TextGeometry;
  exports.TextBufferGeometry = TextBufferGeometry;
  exports.SphereGeometry = SphereGeometry;
  exports.SphereBufferGeometry = SphereBufferGeometry;
  exports.RingGeometry = RingGeometry;
  exports.RingBufferGeometry = RingBufferGeometry;
  exports.PlaneGeometry = PlaneGeometry;
  exports.PlaneBufferGeometry = PlaneBufferGeometry;
  exports.LatheGeometry = LatheGeometry;
  exports.LatheBufferGeometry = LatheBufferGeometry;
  exports.ShapeGeometry = ShapeGeometry;
  exports.ShapeBufferGeometry = ShapeBufferGeometry;
  exports.ExtrudeGeometry = ExtrudeGeometry;
  exports.ExtrudeBufferGeometry = ExtrudeBufferGeometry;
  exports.EdgesGeometry = EdgesGeometry;
  exports.ConeGeometry = ConeGeometry;
  exports.ConeBufferGeometry = ConeBufferGeometry;
  exports.CylinderGeometry = CylinderGeometry;
  exports.CylinderBufferGeometry = CylinderBufferGeometry;
  exports.CircleGeometry = CircleGeometry;
  exports.CircleBufferGeometry = CircleBufferGeometry;
  exports.BoxGeometry = BoxGeometry;
  exports.CubeGeometry = BoxGeometry;
  exports.BoxBufferGeometry = BoxBufferGeometry;
  exports.ShadowMaterial = ShadowMaterial;
  exports.SpriteMaterial = SpriteMaterial;
  exports.RawShaderMaterial = RawShaderMaterial;
  exports.ShaderMaterial = ShaderMaterial;
  exports.PointsMaterial = PointsMaterial;
  exports.MeshPhysicalMaterial = MeshPhysicalMaterial;
  exports.MeshStandardMaterial = MeshStandardMaterial;
  exports.MeshPhongMaterial = MeshPhongMaterial;
  exports.MeshToonMaterial = MeshToonMaterial;
  exports.MeshNormalMaterial = MeshNormalMaterial;
  exports.MeshLambertMaterial = MeshLambertMaterial;
  exports.MeshDepthMaterial = MeshDepthMaterial;
  exports.MeshDistanceMaterial = MeshDistanceMaterial;
  exports.MeshBasicMaterial = MeshBasicMaterial;
  exports.MeshMatcapMaterial = MeshMatcapMaterial;
  exports.LineDashedMaterial = LineDashedMaterial;
  exports.LineBasicMaterial = LineBasicMaterial;
  exports.Material = Material;
  exports.Float64BufferAttribute = Float64BufferAttribute;
  exports.Float32BufferAttribute = Float32BufferAttribute;
  exports.Uint32BufferAttribute = Uint32BufferAttribute;
  exports.Int32BufferAttribute = Int32BufferAttribute;
  exports.Uint16BufferAttribute = Uint16BufferAttribute;
  exports.Int16BufferAttribute = Int16BufferAttribute;
  exports.Uint8ClampedBufferAttribute = Uint8ClampedBufferAttribute;
  exports.Uint8BufferAttribute = Uint8BufferAttribute;
  exports.Int8BufferAttribute = Int8BufferAttribute;
  exports.BufferAttribute = BufferAttribute;
  exports.ArcCurve = ArcCurve;
  exports.CatmullRomCurve3 = CatmullRomCurve3;
  exports.CubicBezierCurve = CubicBezierCurve;
  exports.CubicBezierCurve3 = CubicBezierCurve3;
  exports.EllipseCurve = EllipseCurve;
  exports.LineCurve = LineCurve;
  exports.LineCurve3 = LineCurve3;
  exports.QuadraticBezierCurve = QuadraticBezierCurve;
  exports.QuadraticBezierCurve3 = QuadraticBezierCurve3;
  exports.SplineCurve = SplineCurve;
  exports.REVISION = REVISION;
  exports.MOUSE = MOUSE;
  exports.CullFaceNone = CullFaceNone;
  exports.CullFaceBack = CullFaceBack;
  exports.CullFaceFront = CullFaceFront;
  exports.CullFaceFrontBack = CullFaceFrontBack;
  exports.FrontFaceDirectionCW = FrontFaceDirectionCW;
  exports.FrontFaceDirectionCCW = FrontFaceDirectionCCW;
  exports.BasicShadowMap = BasicShadowMap;
  exports.PCFShadowMap = PCFShadowMap;
  exports.PCFSoftShadowMap = PCFSoftShadowMap;
  exports.FrontSide = FrontSide;
  exports.BackSide = BackSide;
  exports.DoubleSide = DoubleSide;
  exports.FlatShading = FlatShading;
  exports.SmoothShading = SmoothShading;
  exports.NoColors = NoColors;
  exports.FaceColors = FaceColors;
  exports.VertexColors = VertexColors;
  exports.NoBlending = NoBlending;
  exports.NormalBlending = NormalBlending;
  exports.AdditiveBlending = AdditiveBlending;
  exports.SubtractiveBlending = SubtractiveBlending;
  exports.MultiplyBlending = MultiplyBlending;
  exports.CustomBlending = CustomBlending;
  exports.AddEquation = AddEquation;
  exports.SubtractEquation = SubtractEquation;
  exports.ReverseSubtractEquation = ReverseSubtractEquation;
  exports.MinEquation = MinEquation;
  exports.MaxEquation = MaxEquation;
  exports.ZeroFactor = ZeroFactor;
  exports.OneFactor = OneFactor;
  exports.SrcColorFactor = SrcColorFactor;
  exports.OneMinusSrcColorFactor = OneMinusSrcColorFactor;
  exports.SrcAlphaFactor = SrcAlphaFactor;
  exports.OneMinusSrcAlphaFactor = OneMinusSrcAlphaFactor;
  exports.DstAlphaFactor = DstAlphaFactor;
  exports.OneMinusDstAlphaFactor = OneMinusDstAlphaFactor;
  exports.DstColorFactor = DstColorFactor;
  exports.OneMinusDstColorFactor = OneMinusDstColorFactor;
  exports.SrcAlphaSaturateFactor = SrcAlphaSaturateFactor;
  exports.NeverDepth = NeverDepth;
  exports.AlwaysDepth = AlwaysDepth;
  exports.LessDepth = LessDepth;
  exports.LessEqualDepth = LessEqualDepth;
  exports.EqualDepth = EqualDepth;
  exports.GreaterEqualDepth = GreaterEqualDepth;
  exports.GreaterDepth = GreaterDepth;
  exports.NotEqualDepth = NotEqualDepth;
  exports.MultiplyOperation = MultiplyOperation;
  exports.MixOperation = MixOperation;
  exports.AddOperation = AddOperation;
  exports.NoToneMapping = NoToneMapping;
  exports.LinearToneMapping = LinearToneMapping;
  exports.ReinhardToneMapping = ReinhardToneMapping;
  exports.Uncharted2ToneMapping = Uncharted2ToneMapping;
  exports.CineonToneMapping = CineonToneMapping;
  exports.ACESFilmicToneMapping = ACESFilmicToneMapping;
  exports.UVMapping = UVMapping;
  exports.CubeReflectionMapping = CubeReflectionMapping;
  exports.CubeRefractionMapping = CubeRefractionMapping;
  exports.EquirectangularReflectionMapping = EquirectangularReflectionMapping;
  exports.EquirectangularRefractionMapping = EquirectangularRefractionMapping;
  exports.SphericalReflectionMapping = SphericalReflectionMapping;
  exports.CubeUVReflectionMapping = CubeUVReflectionMapping;
  exports.CubeUVRefractionMapping = CubeUVRefractionMapping;
  exports.RepeatWrapping = RepeatWrapping;
  exports.ClampToEdgeWrapping = ClampToEdgeWrapping;
  exports.MirroredRepeatWrapping = MirroredRepeatWrapping;
  exports.NearestFilter = NearestFilter;
  exports.NearestMipMapNearestFilter = NearestMipMapNearestFilter;
  exports.NearestMipMapLinearFilter = NearestMipMapLinearFilter;
  exports.LinearFilter = LinearFilter;
  exports.LinearMipMapNearestFilter = LinearMipMapNearestFilter;
  exports.LinearMipMapLinearFilter = LinearMipMapLinearFilter;
  exports.UnsignedByteType = UnsignedByteType;
  exports.ByteType = ByteType;
  exports.ShortType = ShortType;
  exports.UnsignedShortType = UnsignedShortType;
  exports.IntType = IntType;
  exports.UnsignedIntType = UnsignedIntType;
  exports.FloatType = FloatType;
  exports.HalfFloatType = HalfFloatType;
  exports.UnsignedShort4444Type = UnsignedShort4444Type;
  exports.UnsignedShort5551Type = UnsignedShort5551Type;
  exports.UnsignedShort565Type = UnsignedShort565Type;
  exports.UnsignedInt248Type = UnsignedInt248Type;
  exports.AlphaFormat = AlphaFormat;
  exports.RGBFormat = RGBFormat;
  exports.RGBAFormat = RGBAFormat;
  exports.LuminanceFormat = LuminanceFormat;
  exports.LuminanceAlphaFormat = LuminanceAlphaFormat;
  exports.RGBEFormat = RGBEFormat;
  exports.DepthFormat = DepthFormat;
  exports.DepthStencilFormat = DepthStencilFormat;
  exports.RedFormat = RedFormat;
  exports.RGB_S3TC_DXT1_Format = RGB_S3TC_DXT1_Format;
  exports.RGBA_S3TC_DXT1_Format = RGBA_S3TC_DXT1_Format;
  exports.RGBA_S3TC_DXT3_Format = RGBA_S3TC_DXT3_Format;
  exports.RGBA_S3TC_DXT5_Format = RGBA_S3TC_DXT5_Format;
  exports.RGB_PVRTC_4BPPV1_Format = RGB_PVRTC_4BPPV1_Format;
  exports.RGB_PVRTC_2BPPV1_Format = RGB_PVRTC_2BPPV1_Format;
  exports.RGBA_PVRTC_4BPPV1_Format = RGBA_PVRTC_4BPPV1_Format;
  exports.RGBA_PVRTC_2BPPV1_Format = RGBA_PVRTC_2BPPV1_Format;
  exports.RGB_ETC1_Format = RGB_ETC1_Format;
  exports.RGBA_ASTC_4x4_Format = RGBA_ASTC_4x4_Format;
  exports.RGBA_ASTC_5x4_Format = RGBA_ASTC_5x4_Format;
  exports.RGBA_ASTC_5x5_Format = RGBA_ASTC_5x5_Format;
  exports.RGBA_ASTC_6x5_Format = RGBA_ASTC_6x5_Format;
  exports.RGBA_ASTC_6x6_Format = RGBA_ASTC_6x6_Format;
  exports.RGBA_ASTC_8x5_Format = RGBA_ASTC_8x5_Format;
  exports.RGBA_ASTC_8x6_Format = RGBA_ASTC_8x6_Format;
  exports.RGBA_ASTC_8x8_Format = RGBA_ASTC_8x8_Format;
  exports.RGBA_ASTC_10x5_Format = RGBA_ASTC_10x5_Format;
  exports.RGBA_ASTC_10x6_Format = RGBA_ASTC_10x6_Format;
  exports.RGBA_ASTC_10x8_Format = RGBA_ASTC_10x8_Format;
  exports.RGBA_ASTC_10x10_Format = RGBA_ASTC_10x10_Format;
  exports.RGBA_ASTC_12x10_Format = RGBA_ASTC_12x10_Format;
  exports.RGBA_ASTC_12x12_Format = RGBA_ASTC_12x12_Format;
  exports.LoopOnce = LoopOnce;
  exports.LoopRepeat = LoopRepeat;
  exports.LoopPingPong = LoopPingPong;
  exports.InterpolateDiscrete = InterpolateDiscrete;
  exports.InterpolateLinear = InterpolateLinear;
  exports.InterpolateSmooth = InterpolateSmooth;
  exports.ZeroCurvatureEnding = ZeroCurvatureEnding;
  exports.ZeroSlopeEnding = ZeroSlopeEnding;
  exports.WrapAroundEnding = WrapAroundEnding;
  exports.TrianglesDrawMode = TrianglesDrawMode;
  exports.TriangleStripDrawMode = TriangleStripDrawMode;
  exports.TriangleFanDrawMode = TriangleFanDrawMode;
  exports.LinearEncoding = LinearEncoding;
  exports.sRGBEncoding = sRGBEncoding;
  exports.GammaEncoding = GammaEncoding;
  exports.RGBEEncoding = RGBEEncoding;
  exports.LogLuvEncoding = LogLuvEncoding;
  exports.RGBM7Encoding = RGBM7Encoding;
  exports.RGBM16Encoding = RGBM16Encoding;
  exports.RGBDEncoding = RGBDEncoding;
  exports.BasicDepthPacking = BasicDepthPacking;
  exports.RGBADepthPacking = RGBADepthPacking;
  exports.TangentSpaceNormalMap = TangentSpaceNormalMap;
  exports.ObjectSpaceNormalMap = ObjectSpaceNormalMap;
  exports.Face4 = Face4;
  exports.LineStrip = LineStrip;
  exports.LinePieces = LinePieces;
  exports.MeshFaceMaterial = MeshFaceMaterial;
  exports.MultiMaterial = MultiMaterial;
  exports.PointCloud = PointCloud;
  exports.Particle = Particle;
  exports.ParticleSystem = ParticleSystem;
  exports.PointCloudMaterial = PointCloudMaterial;
  exports.ParticleBasicMaterial = ParticleBasicMaterial;
  exports.ParticleSystemMaterial = ParticleSystemMaterial;
  exports.Vertex = Vertex;
  exports.DynamicBufferAttribute = DynamicBufferAttribute;
  exports.Int8Attribute = Int8Attribute;
  exports.Uint8Attribute = Uint8Attribute;
  exports.Uint8ClampedAttribute = Uint8ClampedAttribute;
  exports.Int16Attribute = Int16Attribute;
  exports.Uint16Attribute = Uint16Attribute;
  exports.Int32Attribute = Int32Attribute;
  exports.Uint32Attribute = Uint32Attribute;
  exports.Float32Attribute = Float32Attribute;
  exports.Float64Attribute = Float64Attribute;
  exports.ClosedSplineCurve3 = ClosedSplineCurve3;
  exports.SplineCurve3 = SplineCurve3;
  exports.Spline = Spline;
  exports.AxisHelper = AxisHelper;
  exports.BoundingBoxHelper = BoundingBoxHelper;
  exports.EdgesHelper = EdgesHelper;
  exports.WireframeHelper = WireframeHelper;
  exports.XHRLoader = XHRLoader;
  exports.BinaryTextureLoader = BinaryTextureLoader;
  exports.GeometryUtils = GeometryUtils;
  exports.Projector = Projector;
  exports.CanvasRenderer = CanvasRenderer;
  exports.JSONLoader = JSONLoader;
  exports.SceneUtils = SceneUtils;
  exports.LensFlare = LensFlare;
  Object.defineProperty(exports, '__esModule', {value: true});
}));

})();
(function() {
var define = $__System.amdDefine;
define("3", ["4d"], function(main) {
  return main;
});

})();
$__System.register('9', ['3', 'b'], function (_export) {
	var BufferAttribute, Vector3, _Object$keys, sqrt3;

	function arrayVec3Distance(array, index, nextIndex) {
		return distance2(array[index], array[index + 1], array[index + 2], array[nextIndex], array[nextIndex + 1], array[nextIndex + 2]);
	}

	function getRandomPoints(count) {
		var points = [];
		for (var i = 0; i < count * 3; ++i) points.push(randomRange(-1, 1));
		return points;
	}

	function decimateAttributes(attributes, step) {
		step = step || 1;
		var att = {};
		var keys = _Object$keys(attributes);
		keys.forEach(function (name) {
			var size = attributes[name].itemSize;
			att[name] = { array: [], itemSize: size };
			for (var i = 0; i < attributes[name].array.length / size; i += step) {
				for (var x = 0; x < size; ++x) {
					var item = attributes[name].array[i * size + x];
					att[name].array.push(item);
				}
			}
		});
		return att;
	}

	function randomRange(min, max) {
		return min + Math.random() * (max - min);
	}

	function clamp(value, min, max) {
		return Math.max(min, Math.min(max, value));
	}

	function saturate(value) {
		return Math.max(0, Math.min(1, value));
	}

	//https://github.com/mattdesl/lerp/blob/master/index.js

	function lerp(v0, v1, t) {
		return v0 * (1 - t) + v1 * t;
	}

	function lerpArray(a0, a1, t) {
		for (var i = 0; i < a0.length; ++i) {
			a0[i] = lerp(a0[i], a1[i], t);
		}
		return a0;
	}

	function lerpArray2(a0, a1, t, diffTreshold) {
		for (var i = 0; i < a0.length; ++i) {
			if (Math.abs(a0[i] - a1[i]) > diffTreshold) a0[i] = a1[i];else a0[i] = lerp(a0[i], a1[i], t);
		}
		return a0;
	}

	function lerpVector(a0, a1, t) {
		a0.x = lerp(a0.x, a1.x, t);
		a0.y = lerp(a0.y, a1.y, t);
		a0.z = lerp(a0.z, a1.z, t);
		return a0;
	}

	function lerpVectorArray(a0, a1, t) {
		a0.x = lerp(a0.x, a1[0], t);
		a0.y = lerp(a0.y, a1[1], t);
		a0.z = lerp(a0.z, a1[2], t);
		return a0;
	}

	// Find the closest power of 2

	function closestPowerOfTwo(num) {
		return Math.pow(2, Math.ceil(Math.log(num) / Math.log(2)));
	}

	// Used to calculate length of vector from center of box to corner of box

	//

	function distance1(a, b) {
		return Math.sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y) + (a.z - b.z) * (a.z - b.z));
	}

	//

	function distance2(x, y, z, xx, yy, zz) {
		return Math.sqrt((x - xx) * (x - xx) + (y - yy) * (y - yy) + (z - zz) * (z - zz));
	}

	// Thank to Tomas Akenine-Möller
	// For sharing his Triangle Box Overlaping algorithm
	// http://fileadmin.cs.lth.se/cs/Personal/Tomas_Akenine-Moller/code/tribox3.txt

	function planeBoxOverlap(normal, vert, maxbox) {
		var vmin = new Vector3(0, 0, 0);
		var vmax = new Vector3(0, 0, 0);
		if (normal.x > 0) {
			vmin.x = -maxbox.x - vert.x;vmax.x = maxbox.x - vert.x;
		} else {
			vmin.x = maxbox.x - vert.x;vmax.x = -maxbox.x - vert.x;
		}
		if (normal.y > 0) {
			vmin.y = -maxbox.y - vert.y;vmax.y = maxbox.y - vert.y;
		} else {
			vmin.y = maxbox.y - vert.y;vmax.y = -maxbox.y - vert.y;
		}
		if (normal.z > 0) {
			vmin.z = -maxbox.z - vert.z;vmax.z = maxbox.z - vert.z;
		} else {
			vmin.z = maxbox.z - vert.z;vmax.z = -maxbox.z - vert.z;
		}
		var min = new Vector3(normal.x, normal.y, normal.z);
		var max = new Vector3(normal.x, normal.y, normal.z);
		if (min.dot(vmin) > 0) return 0;
		if (max.dot(vmax) >= 0) return 1;
		return 0;
	}

	function triangleArea(a, b, c) {
		var ab = new Vector3(a.x, a.y, a.z).sub(b);
		var ac = new Vector3(a.x, a.y, a.z).sub(c);
		return ab.cross(ac).length() / 2;
	}

	function triBoxOverlap(boxcenter, boxhalfsize, a, b, c) {
		var v0 = { x: 0, y: 0, z: 0 };
		var v1 = { x: 0, y: 0, z: 0 };
		var v2 = { x: 0, y: 0, z: 0 };
		var min, max, p0, p1, p2, rad, fex, fey, fez;
		var normal = new Vector3(0, 0, 0);
		var e0 = new Vector3(0, 0, 0);
		var e1 = new Vector3(0, 0, 0);
		var e2 = new Vector3(0, 0, 0);

		/* This is the fastest branch on Sun */
		/* move everything so that the boxcenter is in (0,0,0) */
		v0.x = a.x - boxcenter.x;v0.y = a.y - boxcenter.y;v0.z = a.z - boxcenter.z;
		v1.x = b.x - boxcenter.x;v1.y = b.y - boxcenter.y;v1.z = b.z - boxcenter.z;
		v2.x = c.x - boxcenter.x;v2.y = c.y - boxcenter.y;v2.z = c.z - boxcenter.z;
		/* compute triangle edges */
		e0.x = v1.x - v0.x;e0.y = v1.y - v0.y;e0.z = v1.z - v0.z;
		e1.x = v2.x - v1.x;e1.y = v2.y - v1.y;e1.z = v2.z - v1.z;
		e2.x = v0.x - v2.x;e2.y = v0.y - v2.y;e2.z = v0.z - v2.z;

		/* Bullet 3:  */
		/*  test the 9 tests first (this was faster) */
		fex = Math.abs(e0.x);
		fey = Math.abs(e0.y);
		fez = Math.abs(e0.z);
		//
		p0 = e0.z * v0.y - e0.y * v0.z;
		p2 = e0.z * v2.y - e0.y * v2.z;
		if (p0 < p2) {
			min = p0;max = p2;
		} else {
			min = p2;max = p0;
		}
		rad = fez * boxhalfsize.y + fey * boxhalfsize.z;
		if (min > rad || max < -rad) return 0;
		//
		p0 = -e0.z * v0.x + e0.x * v0.z;
		p2 = -e0.z * v2.x + e0.x * v2.z;
		if (p0 < p2) {
			min = p0;max = p2;
		} else {
			min = p2;max = p0;
		}
		rad = fez * boxhalfsize.x + fex * boxhalfsize.z;
		if (min > rad || max < -rad) return 0;
		//
		p1 = e0.y * v1.x - e0.x * v1.y;
		p2 = e0.y * v2.x - e0.x * v2.y;
		if (p2 < p1) {
			min = p2;max = p1;
		} else {
			min = p1;max = p2;
		}
		rad = fey * boxhalfsize.x + fex * boxhalfsize.y;
		if (min > rad || max < -rad) return 0;
		//
		fex = Math.abs(e1.x);
		fey = Math.abs(e1.y);
		fez = Math.abs(e1.z);
		//
		p0 = e1.z * v0.y - e1.y * v0.z;
		p2 = e1.z * v2.y - e1.y * v2.z;
		if (p0 < p2) {
			min = p0;max = p2;
		} else {
			min = p2;max = p0;
		}
		rad = fez * boxhalfsize.y + fey * boxhalfsize.z;
		if (min > rad || max < -rad) return 0;
		//
		p0 = -e1.z * v0.x + e1.x * v0.z;
		p2 = -e1.z * v2.x + e1.x * v2.z;
		if (p0 < p2) {
			min = p0;max = p2;
		} else {
			min = p2;max = p0;
		}
		rad = fez * boxhalfsize.x + fex * boxhalfsize.z;
		if (min > rad || max < -rad) return 0;
		//
		p0 = e1.y * v0.x - e1.x * v0.y;
		p1 = e1.y * v1.x - e1.x * v1.y;
		if (p0 < p1) {
			min = p0;max = p1;
		} else {
			min = p1;max = p0;
		}
		rad = fey * boxhalfsize.x + fex * boxhalfsize.y;
		if (min > rad || max < -rad) return 0;
		//
		fex = Math.abs(e2.x);
		fey = Math.abs(e2.y);
		fez = Math.abs(e2.z);
		//
		p0 = e2.z * v0.y - e2.y * v0.z;
		p1 = e2.z * v1.y - e2.y * v1.z;
		if (p0 < p1) {
			min = p0;max = p1;
		} else {
			min = p1;max = p0;
		}
		rad = fez * boxhalfsize.y + fey * boxhalfsize.z;
		if (min > rad || max < -rad) return 0;
		//
		p0 = -e2.z * v0.x + e2.x * v0.z;
		p1 = -e2.z * v1.x + e2.x * v1.z;
		if (p0 < p1) {
			min = p0;max = p1;
		} else {
			min = p1;max = p0;
		}
		rad = fez * boxhalfsize.x + fex * boxhalfsize.z;
		if (min > rad || max < -rad) return 0;
		//
		p1 = e2.y * v1.x - e2.x * v1.y;
		p2 = e2.y * v2.x - e2.x * v2.y;
		if (p2 < p1) {
			min = p2;max = p1;
		} else {
			min = p1;max = p2;
		}
		rad = fey * boxhalfsize.x + fex * boxhalfsize.y;
		if (min > rad || max < -rad) return 0;

		/* Bullet 1: */
		/*  first test overlap in the {x,y,z}-directions */
		/*  find min, max of the triangle each direction, and test for overlap in */
		/*  that direction -- this is equivalent to testing a minimal AABB around */
		/*  the triangle against the AABB */
		/* test in X-direction */
		min = Math.min(v0.x, Math.min(v1.x, v2.x));
		max = Math.max(v0.x, Math.max(v1.x, v2.x));
		if (min > boxhalfsize.x || max < -boxhalfsize.x) return 0;
		/* test in Y-direction */
		min = Math.min(v0.y, Math.min(v1.y, v2.y));
		max = Math.max(v0.y, Math.max(v1.y, v2.y));
		if (min > boxhalfsize.y || max < -boxhalfsize.y) return 0;
		/* test in Z-direction */
		min = Math.min(v0.z, Math.min(v1.z, v2.z));
		max = Math.max(v0.z, Math.max(v1.z, v2.z));
		if (min > boxhalfsize.z || max < -boxhalfsize.z) return 0;
		/* Bullet 2: */
		/*  test if the box intersects the plane of the triangle */
		/*  compute plane equation of triangle: normal*x+d=0 */
		normal.crossVectors(e0, e1);
		if (0 == planeBoxOverlap(normal, v0, boxhalfsize)) return 0;
		return 1; /* box and triangle overlaps */
	}

	return {
		setters: [function (_) {
			BufferAttribute = _.BufferAttribute;
			Vector3 = _.Vector3;
		}, function (_b) {
			_Object$keys = _b['default'];
		}],
		execute: function () {
			'use strict';

			_export('arrayVec3Distance', arrayVec3Distance);

			_export('getRandomPoints', getRandomPoints);

			_export('decimateAttributes', decimateAttributes);

			_export('randomRange', randomRange);

			_export('clamp', clamp);

			_export('saturate', saturate);

			_export('lerp', lerp);

			_export('lerpArray', lerpArray);

			_export('lerpArray2', lerpArray2);

			_export('lerpVector', lerpVector);

			_export('lerpVectorArray', lerpVectorArray);

			_export('closestPowerOfTwo', closestPowerOfTwo);

			_export('distance1', distance1);

			_export('distance2', distance2);

			_export('planeBoxOverlap', planeBoxOverlap);

			_export('triangleArea', triangleArea);

			_export('triBoxOverlap', triBoxOverlap);

			sqrt3 = Math.sqrt(3);

			_export('sqrt3', sqrt3);
		}
	};
});

$__System.register('45', ['2', '3', '4', '5', '6', '9', '13', '14', '16', '17', '44', 'b', 'a', 'd', '1c'], function (_export) {
	var timeline, THREE, makeText, renderer, FrameBuffer, clamp, lerp, lerpArray, lerpVector, lerpArray2, lerpVectorArray, saturate, Bloom, AnaglyphEffect, gui, parameters, uniforms, initUniforms, updateUniforms, resizeUniforms, _Object$keys, Geometry, assets, OrbitControls, engine, array;

	function initEngine() {

		engine.camera.position.x = 0.02;
		engine.camera.position.y = -0.05;
		engine.camera.position.z = 2.0;
		// engine.controls = new OrbitControls(engine.camera, renderer.domElement);
		// engine.controls.enableDamping = true;
		// engine.controls.dampingFactor = 0.1;
		// engine.controls.rotateSpeed = 0.1;

		initUniforms();

		engine.scene = new THREE.Scene();
		Geometry.create(Geometry.random(1000), [6, 6]).forEach(function (geometry) {
			return engine.scene.add(new THREE.Mesh(geometry, assets.shaders.dust));
		});
		Geometry.create(Geometry.random(10), [1, 200]).forEach(function (geometry) {
			return engine.scene.add(new THREE.Mesh(geometry, assets.shaders.curves));
		});
		Geometry.createLine(assets.geometries.geo, [1, 10]).forEach(function (geometry) {
			return engine.scene.add(new THREE.Mesh(geometry, assets.shaders.eggcrack));
		});
		engine.scene.add(new THREE.Mesh(new THREE.PlaneGeometry(1, 1), assets.shaders.text));
		engine.scene.add(new THREE.Mesh(assets.geometries.geo, assets.shaders.egg));

		// engine.framebuffer = new FrameBuffer({ material: assets.shaders.raymarching });
		engine.frametarget = new THREE.WebGLRenderTarget(window.innerWidth, window.innerHeight, {
			format: THREE.RGBAFormat,
			type: THREE.FloatType });
		engine.framebloom = new THREE.WebGLRenderTarget(window.innerWidth, window.innerHeight, {
			format: THREE.RGBAFormat,
			type: THREE.FloatType });
		engine.frameedge = new THREE.WebGLRenderTarget(window.innerWidth, window.innerHeight, {
			format: THREE.RGBAFormat,
			type: THREE.FloatType });
		engine.bloom = new Bloom(engine.frameedge.texture);

		engine.sceneedge = new THREE.Mesh(new THREE.PlaneGeometry(1, 1), assets.shaders.edge);
		engine.sceneedge.frustumCulled = false;
		engine.scenerender = new THREE.Mesh(new THREE.PlaneGeometry(1, 1), assets.shaders.render);
		engine.scenerender.frustumCulled = false;

		uniforms.frametarget = { value: engine.frametarget.texture };
		uniforms.frameedge = { value: engine.frameedge.texture };
		uniforms.framebloom = { value: engine.framebloom.texture };
		uniforms.blur = { value: engine.bloom.blurTarget.texture };
		uniforms.bloom = { value: engine.bloom.bloomTarget.texture };

		uniforms.textTexture = { value: makeText.createTexture([{
				text: 'HATCH',
				font: 'kanit',
				textAlign: 'center',
				fontSize: 196,
				fillStyle: 'white',
				textAlign: 'center',
				textBaseline: 'middle',
				width: 1024,
				height: 1024,
				shadowColor: 'rgba(0,0,0,.5)',
				shadowBlur: 4,
				offsetY: 10
			}]) };
		uniforms.creditTexture = { value: makeText.createTexture([{
				text: 'PONK\n50D\nKOLTES',
				font: 'bebasneue_bold',
				textAlign: 'center',
				fontSize: 196,
				fillStyle: 'white',
				textBaseline: 'middle',
				width: 1024,
				height: 1024,
				shadowColor: 'rgba(0,0,0,.5)',
				shadowBlur: 4,
				offsetY: 20
			}]) };
		uniforms.jobsTexture = { value: makeText.createTexture([{
				text: 'VISUAL\nMUSIC\nTOOL',
				font: 'bebasneue_bold',
				textAlign: 'center',
				fontSize: 196,
				fillStyle: 'white',
				textBaseline: 'middle',
				width: 1024,
				height: 1024,
				shadowColor: 'rgba(0,0,0,.5)',
				shadowBlur: 4,
				offsetY: 20
			}]) };
		uniforms.cookieTexture = { value: makeText.createTexture([{
				text: 'Cookie',
				font: 'bebasneue_bold',
				textAlign: 'center',
				fontSize: 300,
				fillStyle: 'white',
				textAlign: 'center',
				textBaseline: 'middle',
				width: 1024,
				height: 1024,
				shadowColor: 'rgba(0,0,0,.5)',
				shadowBlur: 4,
				offsetY: -40
			}, {
				text: 'Collective',
				fontSize: 180,
				offsetY: 130
			}]) };
		_Object$keys(assets.shaders).forEach(function (key) {
			return assets.shaders[key].uniforms = uniforms;
		});
		// gui.add(engine, 'screenshot');
		timeline.start();
	}

	function updateEngine(elapsed) {
		elapsed = timeline.getTime();
		// engine.controls.update();
		updateUniforms(elapsed);

		// engine.framebuffer.update();
		// uniforms.framebuffer.value = engine.framebuffer.getTexture();

		// record(scene, camera);

		renderer.clear();
		renderer.setRenderTarget(engine.frametarget);
		renderer.render(engine.scene, engine.camera);
		renderer.setRenderTarget(engine.frameedge);
		renderer.render(engine.sceneedge, engine.camera);
		// engine.anaglyph.render(engine.scene, engine.camera);
		renderer.setRenderTarget(null);
		engine.bloom.render(renderer);
		renderer.render(engine.scenerender, engine.camera);

		// array = lerpArray(array, assets.animations.getPosition('Camera', elapsed), .9);
		array = assets.animations.getPosition('Camera', elapsed);
		engine.camera.position.set(array[0], array[1], array[2]);

		engine.camera.fov = 60 + assets.animations.getPosition('ExtraFOV', elapsed)[1];
		engine.camera.updateProjectionMatrix();

		// array = lerpArray(array, assets.animations.getPosition('CameraTarget', elapsed), .9);
		array = assets.animations.getPosition('CameraTarget', elapsed);
		engine.target.set(array[0], array[1], array[2]);
		engine.camera.lookAt(engine.target);
	}

	function resizeEngine(width, height) {
		renderer.setSize(width, height);
		// engine.framebuffer.setSize(width,height);
		engine.camera.aspect = width / height;
		engine.camera.updateProjectionMatrix();
		engine.frametarget.setSize(width, height);
		engine.framebloom.setSize(width, height);
		engine.frameedge.setSize(width, height);
		// engine.anaglyph.setSize(width, height);
		resizeUniforms(width, height);
	}

	return {
		setters: [function (_2) {
			timeline = _2;
		}, function (_) {
			THREE = _;
		}, function (_3) {
			makeText = _3;
		}, function (_4) {
			renderer = _4['default'];
		}, function (_5) {
			FrameBuffer = _5['default'];
		}, function (_11) {
			clamp = _11.clamp;
			lerp = _11.lerp;
			lerpArray = _11.lerpArray;
			lerpVector = _11.lerpVector;
			lerpArray2 = _11.lerpArray2;
			lerpVectorArray = _11.lerpVectorArray;
			saturate = _11.saturate;
		}, function (_7) {
			Bloom = _7['default'];
		}, function (_8) {
			AnaglyphEffect = _8.AnaglyphEffect;
		}, function (_9) {
			gui = _9.gui;
		}, function (_6) {
			parameters = _6['default'];
		}, function (_10) {
			uniforms = _10.uniforms;
			initUniforms = _10.initUniforms;
			updateUniforms = _10.updateUniforms;
			resizeUniforms = _10.resizeUniforms;
		}, function (_b) {
			_Object$keys = _b['default'];
		}, function (_a) {
			Geometry = _a['default'];
		}, function (_d) {
			assets = _d['default'];
		}, function (_c) {
			OrbitControls = _c.OrbitControls;
		}],
		execute: function () {
			'use strict';

			_export('initEngine', initEngine);

			_export('updateEngine', updateEngine);

			_export('resizeEngine', resizeEngine);

			engine = {
				camera: new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 0.001, 1000),
				target: new THREE.Vector3(),
				scene: null,
				sceneedge: null,
				scenerender: null,
				controls: null,
				framebuffer: null,
				frametarget: null,
				framebloom: null,
				frameedge: null,
				anaglyph: null,
				bloom: null
			};

			_export('engine', engine);

			array = [0, 0, 0];

			engine.screenshot = function () {

				var w = parameters.debug.renderwidth;
				var h = parameters.debug.renderheight;
				resizeEngine(w, h);

				setTimeout(function () {

					var arr = renderer.domElement.toDataURL().split(','),
					    mime = arr[0].match(/:(.*?);/)[1],
					    bstr = atob(arr[1]),
					    n = bstr.length,
					    u8arr = new Uint8Array(n);
					while (n--) u8arr[n] = bstr.charCodeAt(n);
					var blob = new Blob([u8arr], { type: mime });
					var a = document.createElement("a"),
					    url = URL.createObjectURL(blob);
					a.href = url;
					a.download = "render.png";
					document.body.appendChild(a);
					a.click();
					setTimeout(function () {
						document.body.removeChild(a);
						window.URL.revokeObjectURL(url);
					}, 0);

					resizeEngine(window.innerWidth, window.innerHeight);
				}, 1000 * parameters.debug.renderdelay);
			};
		}
	};
});

$__System.register('4e', ['3', '43', '45', 'd'], function (_export) {
	'use strict';

	var THREE, Mouse, engine, initEngine, updateEngine, resizeEngine, assets;
	return {
		setters: [function (_) {
			THREE = _;
		}, function (_2) {
			Mouse = _2['default'];
		}, function (_3) {
			engine = _3.engine;
			initEngine = _3.initEngine;
			updateEngine = _3.updateEngine;
			resizeEngine = _3.resizeEngine;
		}, function (_d) {
			assets = _d['default'];
		}],
		execute: function () {
			_export('default', function () {

				assets.load(function () {
					initEngine();
					onWindowResize();
					window.addEventListener('resize', onWindowResize, false);
					window.addEventListener('mousemove', Mouse.onMove, false);
					requestAnimationFrame(animate);
				});

				function animate(elapsed) {
					updateEngine(elapsed / 1000);
					requestAnimationFrame(animate);
				}

				function onWindowResize() {
					resizeEngine(window.innerWidth, window.innerHeight);
				}
			});
		}
	};
});

$__System.register('1', ['4e'], function (_export) {
	'use strict';

	var demo, started;

	function start(event) {
		event.preventDefault();

		if (!started) {
			started = true;

			document.getElementById('overlay').remove();
			document.body.style.cursor = 'none';

			setTimeout(demo, 0);
		}
	}

	return {
		setters: [function (_e) {
			demo = _e['default'];
		}],
		execute: function () {
			started = false;
			document.getElementById('play').addEventListener('click', start);
		}
	};
});

})
(function(factory) {
  factory();
});