text: /**
   * @author mrdoob / http://mrdoob.com/
   * @author Larry Battle / http://bateru.com/news
   * @author bhouston / http://exocortex.com
   */
  
  var THREE = THREE || { REVISION: '59' };
  
  self.console = self.console || {
  
  	info: function () {},
  	log: function () {},
  	debug: function () {},
  	warn: function () {},
  	error: function () {}
  
  };
  
  String.prototype.trim = String.prototype.trim || function () {
  
  	return this.replace( /^\s+|\s+$/g, '' );
  
  };
  
  // based on https://github.com/documentcloud/underscore/blob/bf657be243a075b5e72acc8a83e6f12a564d8f55/underscore.js#L767
  THREE.extend = function ( obj, source ) {
  
  	// ECMAScript5 compatibility based on: http://www.nczonline.net/blog/2012/12/11/are-your-mixins-ecmascript-5-compatible/
  	if ( Object.keys ) {
  
  		var keys = Object.keys( source );
  
  		for (var i = 0, il = keys.length; i < il; i++) {
  
  			var prop = keys[i];
  			Object.defineProperty( obj, prop, Object.getOwnPropertyDescriptor( source, prop ) );
  
  		}
  
  	} else {
  
  		var safeHasOwnProperty = {}.hasOwnProperty;
  
  		for ( var prop in source ) {
  
  			if ( safeHasOwnProperty.call( source, prop ) ) {
  
  				obj[prop] = source[prop];
  
  			}
  
  		}
  
  	}
  
  	return obj;
  
  };
  
  // http://paulirish.com/2011/requestanimationframe-for-smart-animating/
  // http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating
  
  // requestAnimationFrame polyfill by Erik Möller
  // fixes from Paul Irish and Tino Zijdel
  // using 'self' instead of 'window' for compatibility with both NodeJS and IE10.
  ( function () {
  
  	var lastTime = 0;
  	var vendors = [ 'ms', 'moz', 'webkit', 'o' ];
  
  	for ( var x = 0; x < vendors.length && !self.requestAnimationFrame; ++ x ) {
  
  		self.requestAnimationFrame = self[ vendors[ x ] + 'RequestAnimationFrame' ];
  		self.cancelAnimationFrame = self[ vendors[ x ] + 'CancelAnimationFrame' ] || self[ vendors[ x ] + 'CancelRequestAnimationFrame' ];
  
  	}
  
  	if ( self.requestAnimationFrame === undefined && self['setTimeout'] !== undefined ) {
  
  		self.requestAnimationFrame = function ( callback ) {
  
  			var currTime = Date.now(), timeToCall = Math.max( 0, 16 - ( currTime - lastTime ) );
  			var id = self.setTimeout( function() { callback( currTime + timeToCall ); }, timeToCall );
  			lastTime = currTime + timeToCall;
  			return id;
  
  		};
  
  	}
  
  	if( self.cancelAnimationFrame === undefined && self['clearTimeout'] !== undefined ) {
  
  		self.cancelAnimationFrame = function ( id ) { self.clearTimeout( id ) };
  
  	}
  
  }() );
  
  // GL STATE CONSTANTS
  
  THREE.CullFaceNone = 0;
  THREE.CullFaceBack = 1;
  THREE.CullFaceFront = 2;
  THREE.CullFaceFrontBack = 3;
  
  THREE.FrontFaceDirectionCW = 0;
  THREE.FrontFaceDirectionCCW = 1;
  
  // SHADOWING TYPES
  
  THREE.BasicShadowMap = 0;
  THREE.PCFShadowMap = 1;
  THREE.PCFSoftShadowMap = 2;
  
  // MATERIAL CONSTANTS
  
  // side
  
  THREE.FrontSide = 0;
  THREE.BackSide = 1;
  THREE.DoubleSide = 2;
  
  // shading
  
  THREE.NoShading = 0;
  THREE.FlatShading = 1;
  THREE.SmoothShading = 2;
  
  // colors
  
  THREE.NoColors = 0;
  THREE.FaceColors = 1;
  THREE.VertexColors = 2;
  
  // blending modes
  
  THREE.NoBlending = 0;
  THREE.NormalBlending = 1;
  THREE.AdditiveBlending = 2;
  THREE.SubtractiveBlending = 3;
  THREE.MultiplyBlending = 4;
  THREE.CustomBlending = 5;
  
  // custom blending equations
  // (numbers start from 100 not to clash with other
  //  mappings to OpenGL constants defined in Texture.js)
  
  THREE.AddEquation = 100;
  THREE.SubtractEquation = 101;
  THREE.ReverseSubtractEquation = 102;
  
  // custom blending destination factors
  
  THREE.ZeroFactor = 200;
  THREE.OneFactor = 201;
  THREE.SrcColorFactor = 202;
  THREE.OneMinusSrcColorFactor = 203;
  THREE.SrcAlphaFactor = 204;
  THREE.OneMinusSrcAlphaFactor = 205;
  THREE.DstAlphaFactor = 206;
  THREE.OneMinusDstAlphaFactor = 207;
  
  // custom blending source factors
  
  //THREE.ZeroFactor = 200;
  //THREE.OneFactor = 201;
  //THREE.SrcAlphaFactor = 204;
  //THREE.OneMinusSrcAlphaFactor = 205;
  //THREE.DstAlphaFactor = 206;
  //THREE.OneMinusDstAlphaFactor = 207;
  THREE.DstColorFactor = 208;
  THREE.OneMinusDstColorFactor = 209;
  THREE.SrcAlphaSaturateFactor = 210;
  
  
  // TEXTURE CONSTANTS
  
  THREE.MultiplyOperation = 0;
  THREE.MixOperation = 1;
  THREE.AddOperation = 2;
  
  // Mapping modes
  
  THREE.UVMapping = function () {};
  
  THREE.CubeReflectionMapping = function () {};
  THREE.CubeRefractionMapping = function () {};
  
  THREE.SphericalReflectionMapping = function () {};
  THREE.SphericalRefractionMapping = function () {};
  
  // Wrapping modes
  
  THREE.RepeatWrapping = 1000;
  THREE.ClampToEdgeWrapping = 1001;
  THREE.MirroredRepeatWrapping = 1002;
  
  // Filters
  
  THREE.NearestFilter = 1003;
  THREE.NearestMipMapNearestFilter = 1004;
  THREE.NearestMipMapLinearFilter = 1005;
  THREE.LinearFilter = 1006;
  THREE.LinearMipMapNearestFilter = 1007;
  THREE.LinearMipMapLinearFilter = 1008;
  
  // Data types
  
  THREE.UnsignedByteType = 1009;
  THREE.ByteType = 1010;
  THREE.ShortType = 1011;
  THREE.UnsignedShortType = 1012;
  THREE.IntType = 1013;
  THREE.UnsignedIntType = 1014;
  THREE.FloatType = 1015;
  
  // Pixel types
  
  //THREE.UnsignedByteType = 1009;
  THREE.UnsignedShort4444Type = 1016;
  THREE.UnsignedShort5551Type = 1017;
  THREE.UnsignedShort565Type = 1018;
  
  // Pixel formats
  
  THREE.AlphaFormat = 1019;
  THREE.RGBFormat = 1020;
  THREE.RGBAFormat = 1021;
  THREE.LuminanceFormat = 1022;
  THREE.LuminanceAlphaFormat = 1023;
  
  // Compressed texture formats
  
  THREE.RGB_S3TC_DXT1_Format = 2001;
  THREE.RGBA_S3TC_DXT1_Format = 2002;
  THREE.RGBA_S3TC_DXT3_Format = 2003;
  THREE.RGBA_S3TC_DXT5_Format = 2004;
  
  /*
  // Potential future PVRTC compressed texture formats
  THREE.RGB_PVRTC_4BPPV1_Format = 2100;
  THREE.RGB_PVRTC_2BPPV1_Format = 2101;
  THREE.RGBA_PVRTC_4BPPV1_Format = 2102;
  THREE.RGBA_PVRTC_2BPPV1_Format = 2103;
  */
  