Skip to content

Instantly share code, notes, and snippets.

@lewisacidic
Created March 4, 2014 12:37
Show Gist options
  • Save lewisacidic/9345735 to your computer and use it in GitHub Desktop.
Save lewisacidic/9345735 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": ""
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"The IPython Notebook in Chemoinformatics\n",
"======="
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"Having been in the group for coming up to 6 months now, there are several problems that I think we face:\n",
"\n",
"- Not enough information shared in the group about the software/tools everyone uses\n",
"- Everything is written in different languages \n",
"- Difficult to follow even in languages I understand\n",
"- Hard to get help from people, as they don't necessarily know your software/tool\n",
"\n",
"Ideally, all code in the group should be written in the same language, held on a central server, and well documented. However, this is unfeasable, as most don't have time to learn a new language/tool or write documentation.\n",
"\n",
"I propose that we use Python where possible."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"Why Python?\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"- Python is used everywhere, and as such has needed to build up libraries to interact with code written in many other languages. Therefore, it is probably the easiest tool to interact with other languages. \n",
"- Easily readable - has been called executable pseudocode. This means even non Pythonistas may be able to follow the code \n",
"- Extremely *terse* (python code is shorter than the equivalent in almost all languages). This allows for a large boost to productivity.\n",
"- As it is built on C/C++, properly used it can be very fast\n",
"- It is on the way to becoming the *de facto* language of data science, starting to beat out Matlab, and challenging R. With this is coming well supported, modern libraries \n",
"- It is completely free and open source (unlike Matlab, .NET, etc.)\n",
"- It is cross platform, is used on anything from phones to supercomputers.\n",
"- The IPython project!"
]
},
{
"cell_type": "heading",
"level": 2,
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"IPython"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"- IPython at its core is an advanced Python interpreter.\n",
"- It is designed to be used to explore data, rather than writing long scripts."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"- Part of the Scientific Python libraries. The other parts are:\n",
" - NumPy (provides fast c array object)\n",
" - SciPy (implements many scientifically relevent functions such as FFT)\n",
" - Matplotlib (high quality graphing library)\n",
" - Sympy (symbolic mathematics)\n",
" - Pandas (provides Python with a R DataFrame object)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"- Features:\n",
" - Automatic caching of input and output\n",
" - Easier access to help and documentation\n",
" - Very thorough tab completion\n",
" - Extensions named magic functions provide easy access to useful functionality, and can be extended \n",
" - Access to other languages\n",
" - Running on a remote server\n",
" - Simple parallel processing support"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"Running IPython\n",
"------"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"- IPython can be run from the command line simply using `ipython`\n",
"- It can also be run in a client-server model.\n",
"- A server can be run from the command line, or on a remote server, such as a cluster.\n",
"- Allows for access to your machine from anywhere where you have a reasonably up to date browser, much better than ssh!\n",
"- This may be the easiest way to access High Performance Computing facilities\n",
"- [An example is shown using Amazon EC2 servers, which provide access to a 32-core, 60GB RAM virtual machine for roughly $0.27/hr](http://badhessian.org/2013/11/cluster-computing-for-027hr-using-amazon-ec2-and-ipython-notebook/)\n",
"- There are many clients, including:\n",
" - the traditional command line tool\n",
" - a qt based console\n",
" - *IPython notebook*"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"Input and output caching\n",
"-----"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"Very simple to retrieve output, as it is automatically saved in the `Out` list."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"1 + 1"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 1,
"text": [
"2"
]
}
],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"a = Out[1]\n",
"print a"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"2\n"
]
}
],
"prompt_number": 2
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"The previous result can be retrieved with an underscore."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"_ + 1"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 3,
"text": [
"3"
]
}
],
"prompt_number": 3
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"Documentation\n",
"------"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"IPython provides quick access to help with whatever you are doing. Documentation can be retrieved by appending a <code>?</code> to the object"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"numpy?"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [],
"prompt_number": 4
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"Extra information, for example source code can be retrieved with a second <code>?</code>"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"numpy??"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [],
"prompt_number": 5
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"Magic Functions\n",
"-----"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"Magic functions are called by prepending the name with a <code>%</code> sign. There are many magic functions:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%lsmagic"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"json": [
"{\"cell\": {\"prun\": \"ExecutionMagics\", \"file\": \"Other\", \"!\": \"OSMagics\", \"capture\": \"ExecutionMagics\", \"timeit\": \"ExecutionMagics\", \"script\": \"ScriptMagics\", \"ruby\": \"Other\", \"system\": \"OSMagics\", \"perl\": \"Other\", \"HTML\": \"Other\", \"bash\": \"Other\", \"python\": \"Other\", \"SVG\": \"Other\", \"javascript\": \"DisplayMagics\", \"writefile\": \"OSMagics\", \"pypy\": \"Other\", \"python3\": \"Other\", \"latex\": \"DisplayMagics\", \"sx\": \"OSMagics\", \"svg\": \"DisplayMagics\", \"html\": \"DisplayMagics\", \"sh\": \"Other\", \"time\": \"ExecutionMagics\", \"debug\": \"ExecutionMagics\"}, \"line\": {\"load\": \"CodeMagics\", \"psource\": \"NamespaceMagics\", \"lsmagic\": \"BasicMagics\", \"logstate\": \"LoggingMagics\", \"logstart\": \"LoggingMagics\", \"popd\": \"OSMagics\", \"ed\": \"Other\", \"pycat\": \"OSMagics\", \"loadpy\": \"CodeMagics\", \"install_ext\": \"ExtensionMagics\", \"cd\": \"OSMagics\", \"pastebin\": \"CodeMagics\", \"clear\": \"KernelMagics\", \"colors\": \"BasicMagics\", \"prun\": \"ExecutionMagics\", \"pushd\": \"OSMagics\", \"rep\": \"Other\", \"config\": \"ConfigMagics\", \"dirs\": \"OSMagics\", \"time\": \"ExecutionMagics\", \"who_ls\": \"NamespaceMagics\", \"install_profiles\": \"DeprecatedMagics\", \"macro\": \"ExecutionMagics\", \"autocall\": \"AutoMagics\", \"alias\": \"OSMagics\", \"bookmark\": \"OSMagics\", \"connect_info\": \"KernelMagics\", \"rehashx\": \"OSMagics\", \"pprint\": \"BasicMagics\", \"system\": \"OSMagics\", \"whos\": \"NamespaceMagics\", \"hist\": \"Other\", \"install_default_config\": \"DeprecatedMagics\", \"logoff\": \"LoggingMagics\", \"env\": \"OSMagics\", \"qtconsole\": \"KernelMagics\", \"load_ext\": \"ExtensionMagics\", \"save\": \"CodeMagics\", \"tb\": \"ExecutionMagics\", \"store\": \"StoreMagics\", \"more\": \"KernelMagics\", \"profile\": \"BasicMagics\", \"doctest_mode\": \"KernelMagics\", \"pylab\": \"PylabMagics\", \"run\": \"ExecutionMagics\", \"reset_selective\": \"NamespaceMagics\", \"pfile\": \"NamespaceMagics\", \"pinfo2\": \"NamespaceMagics\", \"pdef\": \"NamespaceMagics\", \"killbgscripts\": \"ScriptMagics\", \"who\": \"NamespaceMagics\", \"precision\": \"BasicMagics\", \"matplotlib\": \"PylabMagics\", \"quickref\": \"BasicMagics\", \"pinfo\": \"NamespaceMagics\", \"pwd\": \"OSMagics\", \"psearch\": \"NamespaceMagics\", \"autosave\": \"KernelMagics\", \"less\": \"KernelMagics\", \"sc\": \"OSMagics\", \"automagic\": \"AutoMagics\", \"reset\": \"NamespaceMagics\", \"sx\": \"OSMagics\", \"magic\": \"BasicMagics\", \"dhist\": \"OSMagics\", \"timeit\": \"ExecutionMagics\", \"edit\": \"KernelMagics\", \"logstop\": \"LoggingMagics\", \"gui\": \"BasicMagics\", \"xdel\": \"NamespaceMagics\", \"xmode\": \"BasicMagics\", \"notebook\": \"BasicMagics\", \"pdb\": \"ExecutionMagics\", \"recall\": \"HistoryMagics\", \"unalias\": \"OSMagics\", \"unload_ext\": \"ExtensionMagics\", \"alias_magic\": \"BasicMagics\", \"reload_ext\": \"ExtensionMagics\", \"man\": \"KernelMagics\", \"rerun\": \"HistoryMagics\", \"debug\": \"ExecutionMagics\", \"logon\": \"LoggingMagics\", \"page\": \"BasicMagics\", \"pdoc\": \"NamespaceMagics\", \"history\": \"HistoryMagics\"}}"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 6,
"text": [
"Available line magics:\n",
"%alias %alias_magic %autocall %automagic %autosave %bookmark %cd %clear %colors %config %connect_info %debug %dhist %dirs %doctest_mode %ed %edit %env %gui %hist %history %install_default_config %install_ext %install_profiles %killbgscripts %less %load %load_ext %loadpy %logoff %logon %logstart %logstate %logstop %lsmagic %macro %magic %man %matplotlib %more %notebook %page %pastebin %pdb %pdef %pdoc %pfile %pinfo %pinfo2 %popd %pprint %precision %profile %prun %psearch %psource %pushd %pwd %pycat %pylab %qtconsole %quickref %recall %rehashx %reload_ext %rep %rerun %reset %reset_selective %run %save %sc %store %sx %system %tb %time %timeit %unalias %unload_ext %who %who_ls %whos %xdel %xmode\n",
"\n",
"Available cell magics:\n",
"%%! %%HTML %%SVG %%bash %%capture %%debug %%file %%html %%javascript %%latex %%perl %%prun %%pypy %%python %%python3 %%ruby %%script %%sh %%svg %%sx %%system %%time %%timeit %%writefile\n",
"\n",
"Automagic is ON, % prefix IS NOT needed for line magics."
]
}
],
"prompt_number": 6
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"For example, timing:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import numpy\n",
"%timeit numpy.random.randn(100);"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"100000 loops, best of 3: 4.69 \u00b5s per loop\n"
]
}
],
"prompt_number": 7
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"Quickly uploading code snippets to share:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%pastebin 1-8"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 8,
"text": [
"u'https://gist.github.com/9114717'"
]
}
],
"prompt_number": 8
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"Access to your operating system's default shell\n",
"-----"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"Shell commands can be called by prepending a `!`"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"!head /Users/RichLewis/Dropbox/PhD/Data/Molecules/VOMICINE.sdf"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"VOMICINE\r\n",
" WLViewer 3D 0\r\n",
"\r\n",
" 52 57 0 0 0 0 0 0 0 0 0\r\n",
" -0.5086 0.1360 0.0023 C 0 0 0 0 0 0 0 0 0 1\r\n",
" 0.1160 1.4937 0.3699 C 0 0 0 0 0 0 0 0 0 2\r\n",
" -1.9897 0.4400 0.1613 C 0 0 0 0 0 0 0 0 0 3\r\n",
" -0.1618 -0.2109 -1.4278 C 0 0 0 0 0 0 0 0 0 4\r\n",
" -0.2312 -1.1594 0.8561 C 0 0 0 0 0 0 0 0 0 5\r\n",
" 1.2034 2.0561 -0.5446 C 0 0 0 0 0 0 0 0 0 6\r\n"
]
}
],
"prompt_number": 9
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"Python variables can be passed to the command line using a $:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"python_variable = '/Users/RichLewis/Dropbox/PhD/Data/Molecules/VOMICINE.sdf'"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [],
"prompt_number": 10
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"!echo $python_variable"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"/Users/RichLewis/Dropbox/PhD/Data/Molecules/VOMICINE.sdf\r\n"
]
}
],
"prompt_number": 11
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"Output can be retrieved easily"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"output = !standardize $python_variable -c /Users/RichLewis/Dropbox/PhD/Code/ChemAxon_Standardizer/StandMoleProt.xml "
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [],
"prompt_number": 12
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print output"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"['[CH3:26][N:18]1[CH2:12][CH2:5][C@:1]23[C@H:2]4[C@H:6]5[C@H:14]([CH2:20][C:15](=[O:22])[N:7]4[C:8]4=[C:3]2[CH:9]=[CH:17][CH:23]=[C:16]4[OH:24])[O:21][CH:28]=[CH:27][CH:19]([CH2:25]1)[C@H:13]5[CH2:10][C:4]3=[O:11]']\n"
]
}
],
"prompt_number": 13
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"External Language Support\n",
"------"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"Python as a language is regularly used as 'glue code', calling code from many different languages. This is usually implemented via modules in regular Python, and is clunky to use. IPython makes this incredibly easy, by wrapping the language in magic functions."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"For example, in R:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%load_ext rmagic"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [],
"prompt_number": 14
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%R \n",
"X <- 1:25; \n",
"print(X); \n",
"cat(\"Mean of X:\", mean(X));"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"text": [
" [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25\n",
"Mean of X: 13"
]
}
],
"prompt_number": 15
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"It is possible to pass in Python variables, and to retrieve them out. "
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"#python code\n",
"python_list = numpy.random.randn(25); python_list"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 16,
"text": [
"array([ 0.02557903, -1.79592947, -0.08469445, -0.01358823, 0.63965548,\n",
" 1.12969819, -0.29400007, 1.63285446, -0.48232015, -0.09628195,\n",
" -0.44504418, -0.26534777, -1.06649068, 1.47904791, -0.25800848,\n",
" 0.17157011, -0.61978214, 2.22710013, -0.01546392, -1.84784916,\n",
" 0.5585001 , 0.403791 , 0.76388498, 0.74774814, 1.2049856 ])"
]
}
],
"prompt_number": 16
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%R -i python_list -o R_output #R code imports the python data, and can process it\n",
"\n",
"print(head(python_list))\n",
"R_output <- mean(python_list)\n",
"print(lm(python_list~X))"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"text": [
"[1] 0.02557903 -1.79592947 -0.08469445 -0.01358823 0.63965548 1.12969819\n",
"\n",
"Call:\n",
"lm(formula = python_list ~ X)\n",
"\n",
"Coefficients:\n",
"(Intercept) X \n",
" -0.25100 0.03069 \n",
"\n"
]
}
],
"prompt_number": 17
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print R_output"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[ 0.14798458]\n"
]
}
],
"prompt_number": 18
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"Other languages supported include (see https://github.com/ipython/ipython/wiki/Extensions-Index):\n",
"\n",
"- SQL\n",
"- Octave\n",
"- Perl\n",
"- MATLAB\n",
"- *Mathematica*\n",
"- Fortran\n",
"- Javascript\n",
"- Jython (allows use of Java classes)\n",
"- IronPython (allows use of .NET classes)\n",
"- PyPy\n",
"- Cython"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"IPython Notebook\n",
"==="
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"- IPython notebook is HTML based, and is run in a browser.\n",
"- It features cells of IPython code that can be run individually, like *Mathematica*.\n",
"- Can be annotated in standard markdown (shorthand for writing HTML, used in blogs and wikis)\n",
"- It allows for rich content output to be returned inline."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"Examples - Images:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from IPython.display import *\n",
"Image(url='http://ipython.org/_static/IPy_header.png')"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"html": [
"<img src=\"http://ipython.org/_static/IPy_header.png\"/>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 19,
"text": [
"<IPython.core.display.Image at 0x10af7c3d0>"
]
}
],
"prompt_number": 19
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"Video:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"YouTubeVideo('DUCQ_HZamhs')"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"html": [
"\n",
" <iframe\n",
" width=\"400\"\n",
" height=300\"\n",
" src=\"http://www.youtube.com/embed/DUCQ_HZamhs\"\n",
" frameborder=\"0\"\n",
" allowfullscreen\n",
" ></iframe>\n",
" "
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 20,
"text": [
"<IPython.lib.display.YouTubeVideo at 0x10b39b750>"
]
}
],
"prompt_number": 20
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"Webpages:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"IFrame('http://www.ch.cam.ac.uk/group/bender/index',800,600)"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"html": [
"\n",
" <iframe\n",
" width=\"800\"\n",
" height=600\"\n",
" src=\"http://www.ch.cam.ac.uk/group/bender/index\"\n",
" frameborder=\"0\"\n",
" allowfullscreen\n",
" ></iframe>\n",
" "
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 21,
"text": [
"<IPython.lib.display.IFrame at 0x10f697e10>"
]
}
],
"prompt_number": 21
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"- Good for presenting your code in a document, and easily allowing others to understand how it works.\n",
"- Doing live demonstrations!"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"Graphing\n",
"-----\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"The rich display is most useful when working with plots. These can be generated inline:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import pylab as pl\n",
"X = numpy.random.randn(100)\n",
"Y = numpy.random.randn(100)\n",
"pl.scatter(X,Y)"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 22,
"text": [
"<matplotlib.collections.PathCollection at 0x10f6c11d0>"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0x10f690910>"
]
}
],
"prompt_number": 22
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"Most graphing (and other imaging) libraries should work out the box. Even other languages will plot inline!"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%R -i X -i Y plot(X,Y)"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\nMrzBttMNAAAAAElFTkSuQmCC\n"
}
],
"prompt_number": 23
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"Chemistry specific: Pybel\n",
"-----"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"Image(url='http://openbabel.org/babel130.png.pagespeed.ce.CGq65btOwU.png')"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"html": [
"<img src=\"http://openbabel.org/babel130.png.pagespeed.ce.CGq65btOwU.png\"/>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 24,
"text": [
"<IPython.core.display.Image at 0x10f6cf110>"
]
}
],
"prompt_number": 24
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"The OpenBabel library has Python bindings, which have been further wrapped to produce more Pythonic behaviour in the pybel module (used in BioSAR to calculate Molprint2D fingerprints). There is good support for the IPython interactive console."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import pybel\n",
"sdf_location = '/Users/RichLewis/Dropbox/PhD/Data/Molecules/VOMICINE.sdf'\n",
"sdf_file = pybel.readfile('sdf', sdf_location)\n",
"m = sdf_file.next()"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [],
"prompt_number": 25
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"Now the molecule can be rendered in 2D:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"m"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 26,
"svg": [
"<?xml version=\"1.0\"?>\n",
"<svg version=\"1.1\" id=\"topsvg\"\n",
"xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
"xmlns:cml=\"http://www.xml-cml.org/schema\" x=\"0\" y=\"0\" width=\"200px\" height=\"200px\" viewBox=\"0 0 100 100\">\n",
"<title>Multiple Molecules - Open Babel Depiction</title>\n",
"<rect x=\"0\" y=\"0\" width=\"100\" height=\"100\" fill=\"white\"/>\n",
"<text text-anchor=\"middle\" font-size=\"6\" fill =\"black\" font-family=\"sans-serif\"\n",
"x=\"50\" y=\"98\" >VOMICINE</text>\n",
"<g transform=\"translate(0,0)\">\n",
"<svg width=\"100\" height=\"100\" x=\"0\" y=\"0\" viewBox=\"0 0 367.496 349.598\"\n",
"font-family=\"sans-serif\" stroke=\"rgb(0,0,0)\" stroke-width=\"2\" stroke-linecap=\"round\">\n",
"<polygon points=\"179.95 179.95 183.95 217.45 175.95 217.45 \" stroke-width=\"2\" fill=\"rgb(0,0,0)\" stroke=\"rgb(0,0,0)\" />\n",
"<line x1=\"173.9\" y1=\"221.9\" x2=\"173.1\" y2=\"220.5\" stroke=\"rgb(0,0,0)\" stroke-width=\"1.0\"/>\n",
"<line x1=\"169.0\" y1=\"225.4\" x2=\"167.5\" y2=\"223.0\" stroke=\"rgb(0,0,0)\" stroke-width=\"1.0\"/>\n",
"<line x1=\"164.1\" y1=\"229.0\" x2=\"162.0\" y2=\"225.4\" stroke=\"rgb(0,0,0)\" stroke-width=\"1.0\"/>\n",
"<line x1=\"159.2\" y1=\"232.6\" x2=\"156.5\" y2=\"227.8\" stroke=\"rgb(0,0,0)\" stroke-width=\"1.0\"/>\n",
"<line x1=\"154.4\" y1=\"236.1\" x2=\"151.0\" y2=\"230.3\" stroke=\"rgb(0,0,0)\" stroke-width=\"1.0\"/>\n",
"<line x1=\"149.5\" y1=\"239.7\" x2=\"145.5\" y2=\"232.7\" stroke=\"rgb(0,0,0)\" stroke-width=\"1.0\"/>\n",
"<line x1=\"144.5\" y1=\"161.2\" x2=\"144.5\" y2=\"99.2\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"150.5\" y1=\"161.2\" x2=\"150.5\" y2=\"99.2\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<polygon points=\"147.474509 236.199271 112.998993 220.913624 116.998993 213.985421 \" stroke-width=\"2.000000\" fill=\"rgb(0,0,0)\" stroke=\"rgb(0,0,0)\" />\n",
"<polygon points=\"157.329831 265.054722 143.689200 237.492109 151.259819 234.906432 \" stroke-width=\"2.000000\" fill=\"rgb(0,0,0)\" stroke=\"rgb(0,0,0)\" />\n",
"<polygon points=\"114.998993 217.449522 92.895822 197.330884 99.024177 192.188583 \" stroke-width=\"2.000000\" fill=\"rgb(0,0,0)\" stroke=\"rgb(0,0,0)\" />\n",
"<line x1=\"213.6\" y1=\"256.8\" x2=\"234.2\" y2=\"270.0\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"210.4\" y1=\"261.8\" x2=\"231.0\" y2=\"275.0\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"274.9\" y1=\"194.8\" x2=\"289.4\" y2=\"214.6\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"108.5\" y1=\"131.2\" x2=\"77.5\" y2=\"77.5\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"180.0\" y1=\"217.4\" x2=\"170.0\" y2=\"239.8\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"169.8\" y1=\"152.1\" x2=\"193.9\" y2=\"147.9\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"169.8\" y1=\"152.1\" x2=\"191.0\" y2=\"93.9\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"147.5\" y1=\"236.2\" x2=\"100.9\" y2=\"277.1\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"230.9\" y1=\"134.1\" x2=\"216.5\" y2=\"114.3\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"115.0\" y1=\"180.0\" x2=\"84.0\" y2=\"126.3\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"115.0\" y1=\"180.0\" x2=\"90.5\" y2=\"180.0\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"144.2\" y1=\"137.3\" x2=\"159.9\" y2=\"118.5\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"144.2\" y1=\"137.3\" x2=\"135.8\" y2=\"114.3\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"115.0\" y1=\"217.4\" x2=\"107.4\" y2=\"240.8\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"157.3\" y1=\"265.1\" x2=\"213.3\" y2=\"291.8\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"268.2\" y1=\"130.2\" x2=\"278.1\" y2=\"107.8\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"94.5\" y1=\"189.9\" x2=\"96.1\" y2=\"189.7\" stroke=\"rgb(0,0,0)\" stroke-width=\"1.0\"/>\n",
"<line x1=\"93.4\" y1=\"186.0\" x2=\"96.3\" y2=\"185.6\" stroke=\"rgb(0,0,0)\" stroke-width=\"1.0\"/>\n",
"<line x1=\"92.3\" y1=\"182.1\" x2=\"96.4\" y2=\"181.5\" stroke=\"rgb(0,0,0)\" stroke-width=\"1.0\"/>\n",
"<line x1=\"91.1\" y1=\"178.2\" x2=\"96.5\" y2=\"177.5\" stroke=\"rgb(0,0,0)\" stroke-width=\"1.0\"/>\n",
"<line x1=\"90.0\" y1=\"174.2\" x2=\"96.6\" y2=\"173.4\" stroke=\"rgb(0,0,0)\" stroke-width=\"1.0\"/>\n",
"<line x1=\"88.8\" y1=\"170.3\" x2=\"96.8\" y2=\"169.3\" stroke=\"rgb(0,0,0)\" stroke-width=\"1.0\"/>\n",
"<line x1=\"186.0\" y1=\"275.3\" x2=\"176.1\" y2=\"297.7\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"186.0\" y1=\"275.3\" x2=\"200.4\" y2=\"295.2\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"290.2\" y1=\"160.5\" x2=\"314.6\" y2=\"158.0\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"291.7\" y1=\"237.0\" x2=\"287.0\" y2=\"247.5\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"96.0\" y1=\"165.1\" x2=\"80.2\" y2=\"146.4\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"96.0\" y1=\"165.1\" x2=\"71.8\" y2=\"169.4\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"77.5\" y1=\"77.5\" x2=\"77.5\" y2=\"53.0\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"77.5\" y1=\"77.5\" x2=\"98.7\" y2=\"65.2\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"77.5\" y1=\"77.5\" x2=\"53.0\" y2=\"77.5\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"80.1\" y1=\"226.8\" x2=\"55.7\" y2=\"225.1\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"91.5\" y1=\"260.6\" x2=\"73.0\" y2=\"276.7\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"180.0\" y1=\"217.4\" x2=\"180.0\" y2=\"180.0\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"180.0\" y1=\"180.0\" x2=\"215.6\" y2=\"168.4\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"215.6\" y1=\"168.4\" x2=\"237.7\" y2=\"198.7\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"213.3\" y1=\"177.4\" x2=\"228.3\" y2=\"198.1\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"237.7\" y1=\"198.7\" x2=\"223.3\" y2=\"218.5\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"203.3\" y1=\"225.0\" x2=\"180.0\" y2=\"217.4\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"147.5\" y1=\"161.2\" x2=\"180.0\" y2=\"180.0\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"180.0\" y1=\"217.4\" x2=\"147.5\" y2=\"236.2\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"147.5\" y1=\"236.2\" x2=\"115.0\" y2=\"217.4\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"115.0\" y1=\"217.4\" x2=\"115.0\" y2=\"180.0\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"115.0\" y1=\"180.0\" x2=\"147.5\" y2=\"161.2\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"230.9\" y1=\"134.1\" x2=\"268.2\" y2=\"130.2\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"237.6\" y1=\"140.6\" x2=\"262.9\" y2=\"138.0\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"268.2\" y1=\"130.2\" x2=\"290.2\" y2=\"160.5\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"290.2\" y1=\"160.5\" x2=\"274.9\" y2=\"194.8\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"281.2\" y1=\"163.1\" x2=\"270.8\" y2=\"186.4\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"274.9\" y1=\"194.8\" x2=\"237.7\" y2=\"198.7\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"215.6\" y1=\"168.4\" x2=\"230.9\" y2=\"134.1\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"186.0\" y1=\"275.3\" x2=\"157.3\" y2=\"265.1\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"157.3\" y1=\"265.1\" x2=\"147.5\" y2=\"236.2\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"214.1\" y1=\"241.9\" x2=\"212.0\" y2=\"259.3\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"212.0\" y1=\"259.3\" x2=\"186.0\" y2=\"275.3\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"91.5\" y1=\"260.6\" x2=\"111.8\" y2=\"270.7\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"135.8\" y1=\"272.3\" x2=\"157.3\" y2=\"265.1\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"115.0\" y1=\"217.4\" x2=\"96.0\" y2=\"194.8\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"96.0\" y1=\"194.8\" x2=\"80.1\" y2=\"226.8\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"80.1\" y1=\"226.8\" x2=\"91.5\" y2=\"260.6\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"88.8\" y1=\"230.1\" x2=\"96.4\" y2=\"252.6\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"169.8\" y1=\"152.1\" x2=\"180.0\" y2=\"180.0\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"96.0\" y1=\"194.8\" x2=\"96.0\" y2=\"165.1\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"96.0\" y1=\"165.1\" x2=\"106.6\" y2=\"152.4\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"127.8\" y1=\"140.2\" x2=\"144.2\" y2=\"137.3\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<line x1=\"144.2\" y1=\"137.3\" x2=\"169.8\" y2=\"152.1\" stroke=\"rgb(0,0,0)\" stroke-width=\"2.0\"/>\n",
"<text x=\"209.614166\" y=\"237.037504\" fill=\"rgb(12,12,255)\" stroke=\"rgb(12,12,255)\" stroke-width=\"1\" font-size=\"16\" >N</text>\n",
"<text x=\"141.474509\" y=\"94.201285\" fill=\"rgb(255,12,12)\" stroke=\"rgb(255,12,12)\" stroke-width=\"1\" font-size=\"16\" >O</text>\n",
"<text x=\"108.998993\" y=\"150.450529\" fill=\"rgb(12,12,255)\" stroke=\"rgb(12,12,255)\" stroke-width=\"1\" font-size=\"16\" >N</text>\n",
"<text x=\"117.489396\" y=\"284.457771\" fill=\"rgb(255,12,12)\" stroke=\"rgb(255,12,12)\" stroke-width=\"1\" font-size=\"16\" >O</text>\n",
"<text x=\"237.575205\" y=\"287.499308\" fill=\"rgb(255,12,12)\" stroke=\"rgb(255,12,12)\" stroke-width=\"1\" font-size=\"16\" >O</text>\n",
"<text x=\"290.991539\" y=\"233.117739\" fill=\"rgb(255,12,12)\" stroke=\"rgb(255,12,12)\" stroke-width=\"1\" font-size=\"16\" >O</text>\n",
"<text x=\"158.697607\" y=\"259.707017\" fill=\"rgb(191,191,191)\" stroke=\"rgb(191,191,191)\" stroke-width=\"1\" font-size=\"16\" >H</text>\n",
"<text x=\"200.749384\" y=\"153.605161\" fill=\"rgb(191,191,191)\" stroke=\"rgb(191,191,191)\" stroke-width=\"1\" font-size=\"16\" >H</text>\n",
"<text x=\"189.470755\" y=\"89.640880\" fill=\"rgb(191,191,191)\" stroke=\"rgb(191,191,191)\" stroke-width=\"1\" font-size=\"16\" >H</text>\n",
"<text x=\"85.090572\" y=\"293.653295\" fill=\"rgb(191,191,191)\" stroke=\"rgb(191,191,191)\" stroke-width=\"1\" font-size=\"16\" >H</text>\n",
"<text x=\"202.824935\" y=\"111.766820\" fill=\"rgb(191,191,191)\" stroke=\"rgb(191,191,191)\" stroke-width=\"1\" font-size=\"16\" >H</text>\n",
"<text x=\"71.499496\" y=\"122.998993\" fill=\"rgb(191,191,191)\" stroke=\"rgb(191,191,191)\" stroke-width=\"1\" font-size=\"16\" >H</text>\n",
"<text x=\"71.499496\" y=\"187.950026\" fill=\"rgb(191,191,191)\" stroke=\"rgb(191,191,191)\" stroke-width=\"1\" font-size=\"16\" >H</text>\n",
"<text x=\"162.272635\" y=\"116.580891\" fill=\"rgb(191,191,191)\" stroke=\"rgb(191,191,191)\" stroke-width=\"1\" font-size=\"16\" >H</text>\n",
"<text x=\"125.342840\" y=\"110.069172\" fill=\"rgb(191,191,191)\" stroke=\"rgb(191,191,191)\" stroke-width=\"1\" font-size=\"16\" >H</text>\n",
"<text x=\"97.432813\" y=\"261.120739\" fill=\"rgb(191,191,191)\" stroke=\"rgb(191,191,191)\" stroke-width=\"1\" font-size=\"16\" >H</text>\n",
"<text x=\"218.994379\" y=\"305.402177\" fill=\"rgb(191,191,191)\" stroke=\"rgb(191,191,191)\" stroke-width=\"1\" font-size=\"16\" >H</text>\n",
"<text x=\"277.413075\" y=\"103.927290\" fill=\"rgb(191,191,191)\" stroke=\"rgb(191,191,191)\" stroke-width=\"1\" font-size=\"16\" >H</text>\n",
"<text x=\"85.249467\" y=\"165.557273\" fill=\"rgb(191,191,191)\" stroke=\"rgb(191,191,191)\" stroke-width=\"1\" font-size=\"16\" >H</text>\n",
"<text x=\"164.782204\" y=\"317.598096\" fill=\"rgb(191,191,191)\" stroke=\"rgb(191,191,191)\" stroke-width=\"1\" font-size=\"16\" >H</text>\n",
"<text x=\"202.076274\" y=\"313.678331\" fill=\"rgb(191,191,191)\" stroke=\"rgb(191,191,191)\" stroke-width=\"1\" font-size=\"16\" >H</text>\n",
"<text x=\"321.496377\" y=\"164.602750\" fill=\"rgb(191,191,191)\" stroke=\"rgb(191,191,191)\" stroke-width=\"1\" font-size=\"16\" >H</text>\n",
"<text x=\"275.739119\" y=\"267.375234\" fill=\"rgb(191,191,191)\" stroke=\"rgb(191,191,191)\" stroke-width=\"1\" font-size=\"16\" >H</text>\n",
"<text x=\"65.855788\" y=\"144.414037\" fill=\"rgb(191,191,191)\" stroke=\"rgb(191,191,191)\" stroke-width=\"1\" font-size=\"16\" >H</text>\n",
"<text x=\"53.030205\" y=\"179.652037\" fill=\"rgb(191,191,191)\" stroke=\"rgb(191,191,191)\" stroke-width=\"1\" font-size=\"16\" >H</text>\n",
"<text x=\"71.499496\" y=\"48.000000\" fill=\"rgb(191,191,191)\" stroke=\"rgb(191,191,191)\" stroke-width=\"1\" font-size=\"16\" >H</text>\n",
"<text x=\"103.975013\" y=\"66.749748\" fill=\"rgb(191,191,191)\" stroke=\"rgb(191,191,191)\" stroke-width=\"1\" font-size=\"16\" >H</text>\n",
"<text x=\"34.000000\" y=\"85.499496\" fill=\"rgb(191,191,191)\" stroke=\"rgb(191,191,191)\" stroke-width=\"1\" font-size=\"16\" >H</text>\n",
"<text x=\"36.680736\" y=\"232.215552\" fill=\"rgb(191,191,191)\" stroke=\"rgb(191,191,191)\" stroke-width=\"1\" font-size=\"16\" >H</text>\n",
"<text x=\"57.248652\" y=\"293.254246\" fill=\"rgb(191,191,191)\" stroke=\"rgb(191,191,191)\" stroke-width=\"1\" font-size=\"16\" >H</text>\n",
"</svg>\n",
"</g>\n",
"</svg>\n",
"\n"
],
"text": [
"<pybel.Molecule at 0x10cc2e210>"
]
}
],
"prompt_number": 26
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"In the development release, a javascript viewer has been added."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"pybel.ipython_3d = True\n",
"\n",
"sdf_file = pybel.readfile('sdf', sdf_location)\n",
"m = sdf_file.next(); m"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"javascript": [
"\"use strict\";var THREE={REVISION:\"64\"};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,\"\")};THREE.extend=function(e,t){if(Object.keys)for(var n=Object.keys(t),r=0,i=n.length;r<i;r++){var s=n[r];Object.defineProperty(e,s,Object.getOwnPropertyDescriptor(t,s))}else for(s in n={}.hasOwnProperty,t)n.call(t,s)&&(e[s]=t[s]);return e};(function(){for(var e=0,t=[\"ms\",\"moz\",\"webkit\",\"o\"],n=0;n<t.length&&!self.requestAnimationFrame;++n)self.requestAnimationFrame=self[t[n]+\"RequestAnimationFrame\"],self.cancelAnimationFrame=self[t[n]+\"CancelAnimationFrame\"]||self[t[n]+\"CancelRequestAnimationFrame\"];void 0===self.requestAnimationFrame&&void 0!==self.setTimeout&&(self.requestAnimationFrame=function(t){var n=Date.now(),r=Math.max(0,16-(n-e)),i=self.setTimeout(function(){t(n+r)},r);e=n+r;return i});void 0===self.cancelAnimationFrame&&void 0!==self.clearTimeout&&(self.cancelAnimationFrame=function(e){self.clearTimeout(e)})})();THREE.CullFaceNone=0;THREE.CullFaceBack=1;THREE.CullFaceFront=2;THREE.CullFaceFrontBack=3;THREE.FrontFaceDirectionCW=0;THREE.FrontFaceDirectionCCW=1;THREE.BasicShadowMap=0;THREE.PCFShadowMap=1;THREE.PCFSoftShadowMap=2;THREE.FrontSide=0;THREE.BackSide=1;THREE.DoubleSide=2;THREE.NoShading=0;THREE.FlatShading=1;THREE.SmoothShading=2;THREE.NoColors=0;THREE.FaceColors=1;THREE.VertexColors=2;THREE.NoBlending=0;THREE.NormalBlending=1;THREE.AdditiveBlending=2;THREE.SubtractiveBlending=3;THREE.MultiplyBlending=4;THREE.CustomBlending=5;THREE.AddEquation=100;THREE.SubtractEquation=101;THREE.ReverseSubtractEquation=102;THREE.ZeroFactor=200;THREE.OneFactor=201;THREE.SrcColorFactor=202;THREE.OneMinusSrcColorFactor=203;THREE.SrcAlphaFactor=204;THREE.OneMinusSrcAlphaFactor=205;THREE.DstAlphaFactor=206;THREE.OneMinusDstAlphaFactor=207;THREE.DstColorFactor=208;THREE.OneMinusDstColorFactor=209;THREE.SrcAlphaSaturateFactor=210;THREE.MultiplyOperation=0;THREE.MixOperation=1;THREE.AddOperation=2;THREE.UVMapping=function(){};THREE.CubeReflectionMapping=function(){};THREE.CubeRefractionMapping=function(){};THREE.SphericalReflectionMapping=function(){};THREE.SphericalRefractionMapping=function(){};THREE.RepeatWrapping=1e3;THREE.ClampToEdgeWrapping=1001;THREE.MirroredRepeatWrapping=1002;THREE.NearestFilter=1003;THREE.NearestMipMapNearestFilter=1004;THREE.NearestMipMapLinearFilter=1005;THREE.LinearFilter=1006;THREE.LinearMipMapNearestFilter=1007;THREE.LinearMipMapLinearFilter=1008;THREE.UnsignedByteType=1009;THREE.ByteType=1010;THREE.ShortType=1011;THREE.UnsignedShortType=1012;THREE.IntType=1013;THREE.UnsignedIntType=1014;THREE.FloatType=1015;THREE.UnsignedShort4444Type=1016;THREE.UnsignedShort5551Type=1017;THREE.UnsignedShort565Type=1018;THREE.AlphaFormat=1019;THREE.RGBFormat=1020;THREE.RGBAFormat=1021;THREE.LuminanceFormat=1022;THREE.LuminanceAlphaFormat=1023;THREE.RGB_S3TC_DXT1_Format=2001;THREE.RGBA_S3TC_DXT1_Format=2002;THREE.RGBA_S3TC_DXT3_Format=2003;THREE.RGBA_S3TC_DXT5_Format=2004;THREE.Color=function(e){void 0!==e&&this.set(e);return this};THREE.Color.prototype={constructor:THREE.Color,r:1,g:1,b:1,set:function(e){e instanceof THREE.Color?this.copy(e):\"number\"===typeof e?this.setHex(e):\"string\"===typeof e&&this.setStyle(e);return this},setHex:function(e){e=Math.floor(e);this.r=(e>>16&255)/255;this.g=(e>>8&255)/255;this.b=(e&255)/255;return this},setRGB:function(e,t,n){this.r=e;this.g=t;this.b=n;return this},setHSL:function(e,t,n){if(0===t)this.r=this.g=this.b=n;else{var r=function(e,t,n){0>n&&(n+=1);1<n&&(n-=1);return n<1/6?e+6*(t-e)*n:.5>n?t:n<2/3?e+6*(t-e)*(2/3-n):e},t=.5>=n?n*(1+t):n+t-n*t,n=2*n-t;this.r=r(n,t,e+1/3);this.g=r(n,t,e);this.b=r(n,t,e-1/3)}return this},setStyle:function(e){if(/^rgb\\((\\d+), ?(\\d+), ?(\\d+)\\)$/i.test(e))return e=/^rgb\\((\\d+), ?(\\d+), ?(\\d+)\\)$/i.exec(e),this.r=Math.min(255,parseInt(e[1],10))/255,this.g=Math.min(255,parseInt(e[2],10))/255,this.b=Math.min(255,parseInt(e[3],10))/255,this;if(/^rgb\\((\\d+)\\%, ?(\\d+)\\%, ?(\\d+)\\%\\)$/i.test(e))return e=/^rgb\\((\\d+)\\%, ?(\\d+)\\%, ?(\\d+)\\%\\)$/i.exec(e),this.r=Math.min(100,parseInt(e[1],10))/100,this.g=Math.min(100,parseInt(e[2],10))/100,this.b=Math.min(100,parseInt(e[3],10))/100,this;if(/^\\#([0-9a-f]{6})$/i.test(e))return e=/^\\#([0-9a-f]{6})$/i.exec(e),this.setHex(parseInt(e[1],16)),this;if(/^\\#([0-9a-f])([0-9a-f])([0-9a-f])$/i.test(e))return e=/^\\#([0-9a-f])([0-9a-f])([0-9a-f])$/i.exec(e),this.setHex(parseInt(e[1]+e[1]+e[2]+e[2]+e[3]+e[3],16)),this;if(/^(\\w+)$/i.test(e))return this.setHex(THREE.ColorKeywords[e]),this},copy:function(e){this.r=e.r;this.g=e.g;this.b=e.b;return this},copyGammaToLinear:function(e){this.r=e.r*e.r;this.g=e.g*e.g;this.b=e.b*e.b;return this},copyLinearToGamma:function(e){this.r=Math.sqrt(e.r);this.g=Math.sqrt(e.g);this.b=Math.sqrt(e.b);return this},convertGammaToLinear:function(){var e=this.r,t=this.g,n=this.b;this.r=e*e;this.g=t*t;this.b=n*n;return this},convertLinearToGamma:function(){this.r=Math.sqrt(this.r);this.g=Math.sqrt(this.g);this.b=Math.sqrt(this.b);return this},getHex:function(){return 255*this.r<<16^255*this.g<<8^255*this.b<<0},getHexString:function(){return(\"000000\"+this.getHex().toString(16)).slice(-6)},getHSL:function(e){var e=e||{h:0,s:0,l:0},t=this.r,n=this.g,r=this.b,i=Math.max(t,n,r),s=Math.min(t,n,r),o,u=(s+i)/2;if(s===i)s=o=0;else{var a=i-s,s=.5>=u?a/(i+s):a/(2-i-s);switch(i){case t:o=(n-r)/a+(n<r?6:0);break;case n:o=(r-t)/a+2;break;case r:o=(t-n)/a+4}o/=6}e.h=o;e.s=s;e.l=u;return e},getStyle:function(){return\"rgb(\"+(255*this.r|0)+\",\"+(255*this.g|0)+\",\"+(255*this.b|0)+\")\"},offsetHSL:function(e,t,n){var r=this.getHSL();r.h+=e;r.s+=t;r.l+=n;this.setHSL(r.h,r.s,r.l);return this},add:function(e){this.r+=e.r;this.g+=e.g;this.b+=e.b;return this},addColors:function(e,t){this.r=e.r+t.r;this.g=e.g+t.g;this.b=e.b+t.b;return this},addScalar:function(e){this.r+=e;this.g+=e;this.b+=e;return this},multiply:function(e){this.r*=e.r;this.g*=e.g;this.b*=e.b;return this},multiplyScalar:function(e){this.r*=e;this.g*=e;this.b*=e;return this},lerp:function(e,t){this.r+=(e.r-this.r)*t;this.g+=(e.g-this.g)*t;this.b+=(e.b-this.b)*t;return this},equals:function(e){return e.r===this.r&&e.g===this.g&&e.b===this.b},fromArray:function(e){this.r=e[0];this.g=e[1];this.b=e[2];return this},toArray:function(){return[this.r,this.g,this.b]},clone:function(){return(new THREE.Color).setRGB(this.r,this.g,this.b)}};THREE.ColorKeywords={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};THREE.Quaternion=function(e,t,n,r){this._x=e||0;this._y=t||0;this._z=n||0;this._w=void 0!==r?r:1};THREE.Quaternion.prototype={constructor:THREE.Quaternion,_x:0,_y:0,_z:0,_w:0,_euler:void 0,_updateEuler:function(){void 0!==this._euler&&this._euler.setFromQuaternion(this,void 0,!1)},get x(){return this._x},set x(e){this._x=e;this._updateEuler()},get y(){return this._y},set y(e){this._y=e;this._updateEuler()},get z(){return this._z},set z(e){this._z=e;this._updateEuler()},get w(){return this._w},set w(e){this._w=e;this._updateEuler()},set:function(e,t,n,r){this._x=e;this._y=t;this._z=n;this._w=r;this._updateEuler();return this},copy:function(e){this._x=e._x;this._y=e._y;this._z=e._z;this._w=e._w;this._updateEuler();return this},setFromEuler:function(e,t){if(!1===e instanceof THREE.Euler)throw Error(\"ERROR: Quaternion's .setFromEuler() now expects a Euler rotation rather than a Vector3 and order. Please update your code.\");var n=Math.cos(e._x/2),r=Math.cos(e._y/2),i=Math.cos(e._z/2),s=Math.sin(e._x/2),o=Math.sin(e._y/2),u=Math.sin(e._z/2);\"XYZ\"===e.order?(this._x=s*r*i+n*o*u,this._y=n*o*i-s*r*u,this._z=n*r*u+s*o*i,this._w=n*r*i-s*o*u):\"YXZ\"===e.order?(this._x=s*r*i+n*o*u,this._y=n*o*i-s*r*u,this._z=n*r*u-s*o*i,this._w=n*r*i+s*o*u):\"ZXY\"===e.order?(this._x=s*r*i-n*o*u,this._y=n*o*i+s*r*u,this._z=n*r*u+s*o*i,this._w=n*r*i-s*o*u):\"ZYX\"===e.order?(this._x=s*r*i-n*o*u,this._y=n*o*i+s*r*u,this._z=n*r*u-s*o*i,this._w=n*r*i+s*o*u):\"YZX\"===e.order?(this._x=s*r*i+n*o*u,this._y=n*o*i+s*r*u,this._z=n*r*u-s*o*i,this._w=n*r*i-s*o*u):\"XZY\"===e.order&&(this._x=s*r*i-n*o*u,this._y=n*o*i-s*r*u,this._z=n*r*u+s*o*i,this._w=n*r*i+s*o*u);!1!==t&&this._updateEuler();return this},setFromAxisAngle:function(e,t){var n=t/2,r=Math.sin(n);this._x=e.x*r;this._y=e.y*r;this._z=e.z*r;this._w=Math.cos(n);this._updateEuler();return this},setFromRotationMatrix:function(e){var t=e.elements,n=t[0],e=t[4],r=t[8],i=t[1],s=t[5],o=t[9],u=t[2],a=t[6],t=t[10],f=n+s+t;0<f?(n=.5/Math.sqrt(f+1),this._w=.25/n,this._x=(a-o)*n,this._y=(r-u)*n,this._z=(i-e)*n):n>s&&n>t?(n=2*Math.sqrt(1+n-s-t),this._w=(a-o)/n,this._x=.25*n,this._y=(e+i)/n,this._z=(r+u)/n):s>t?(n=2*Math.sqrt(1+s-n-t),this._w=(r-u)/n,this._x=(e+i)/n,this._y=.25*n,this._z=(o+a)/n):(n=2*Math.sqrt(1+t-n-s),this._w=(i-e)/n,this._x=(r+u)/n,this._y=(o+a)/n,this._z=.25*n);this._updateEuler();return this},inverse:function(){this.conjugate().normalize();return this},conjugate:function(){this._x*=-1;this._y*=-1;this._z*=-1;this._updateEuler();return this},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 e=this.length();0===e?(this._z=this._y=this._x=0,this._w=1):(e=1/e,this._x*=e,this._y*=e,this._z*=e,this._w*=e);return this},multiply:function(e,t){return void 0!==t?(console.warn(\"DEPRECATED: Quaternion's .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.\"),this.multiplyQuaternions(e,t)):this.multiplyQuaternions(this,e)},multiplyQuaternions:function(e,t){var n=e._x,r=e._y,i=e._z,s=e._w,o=t._x,u=t._y,a=t._z,f=t._w;this._x=n*f+s*o+r*a-i*u;this._y=r*f+s*u+i*o-n*a;this._z=i*f+s*a+n*u-r*o;this._w=s*f-n*o-r*u-i*a;this._updateEuler();return this},multiplyVector3:function(e){console.warn(\"DEPRECATED: Quaternion's .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.\");return e.applyQuaternion(this)},slerp:function(e,t){var n=this._x,r=this._y,i=this._z,s=this._w,o=s*e._w+n*e._x+r*e._y+i*e._z;0>o?(this._w=-e._w,this._x=-e._x,this._y=-e._y,this._z=-e._z,o=-o):this.copy(e);if(1<=o)return this._w=s,this._x=n,this._y=r,this._z=i,this;var u=Math.acos(o),a=Math.sqrt(1-o*o);if(.001>Math.abs(a))return this._w=.5*(s+this._w),this._x=.5*(n+this._x),this._y=.5*(r+this._y),this._z=.5*(i+this._z),this;o=Math.sin((1-t)*u)/a;u=Math.sin(t*u)/a;this._w=s*o+this._w*u;this._x=n*o+this._x*u;this._y=r*o+this._y*u;this._z=i*o+this._z*u;this._updateEuler();return this},equals:function(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._w===this._w},fromArray:function(e){this._x=e[0];this._y=e[1];this._z=e[2];this._w=e[3];this._updateEuler();return this},toArray:function(){return[this._x,this._y,this._z,this._w]},clone:function(){return new THREE.Quaternion(this._x,this._y,this._z,this._w)}};THREE.Quaternion.slerp=function(e,t,n,r){return n.copy(e).slerp(t,r)};THREE.Vector2=function(e,t){this.x=e||0;this.y=t||0};THREE.Vector2.prototype={constructor:THREE.Vector2,set:function(e,t){this.x=e;this.y=t;return this},setX:function(e){this.x=e;return this},setY:function(e){this.y=e;return this},setComponent:function(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;default:throw Error(\"index is out of range: \"+e)}},getComponent:function(e){switch(e){case 0:return this.x;case 1:return this.y;default:throw Error(\"index is out of range: \"+e)}},copy:function(e){this.x=e.x;this.y=e.y;return this},add:function(e,t){if(void 0!==t)return console.warn(\"DEPRECATED: Vector2's .add() now only accepts one argument. Use .addVectors( a, b ) instead.\"),this.addVectors(e,t);this.x+=e.x;this.y+=e.y;return this},addVectors:function(e,t){this.x=e.x+t.x;this.y=e.y+t.y;return this},addScalar:function(e){this.x+=e;this.y+=e;return this},sub:function(e,t){if(void 0!==t)return console.warn(\"DEPRECATED: Vector2's .sub() now only accepts one argument. Use .subVectors( a, b ) instead.\"),this.subVectors(e,t);this.x-=e.x;this.y-=e.y;return this},subVectors:function(e,t){this.x=e.x-t.x;this.y=e.y-t.y;return this},multiplyScalar:function(e){this.x*=e;this.y*=e;return this},divideScalar:function(e){0!==e?(e=1/e,this.x*=e,this.y*=e):this.y=this.x=0;return this},min:function(e){this.x>e.x&&(this.x=e.x);this.y>e.y&&(this.y=e.y);return this},max:function(e){this.x<e.x&&(this.x=e.x);this.y<e.y&&(this.y=e.y);return this},clamp:function(e,t){this.x<e.x?this.x=e.x:this.x>t.x&&(this.x=t.x);this.y<e.y?this.y=e.y:this.y>t.y&&(this.y=t.y);return this},negate:function(){return this.multiplyScalar(-1)},dot:function(e){return this.x*e.x+this.y*e.y},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},normalize:function(){return this.divideScalar(this.length())},distanceTo:function(e){return Math.sqrt(this.distanceToSquared(e))},distanceToSquared:function(e){var t=this.x-e.x,e=this.y-e.y;return t*t+e*e},setLength:function(e){var t=this.length();0!==t&&e!==t&&this.multiplyScalar(e/t);return this},lerp:function(e,t){this.x+=(e.x-this.x)*t;this.y+=(e.y-this.y)*t;return this},equals:function(e){return e.x===this.x&&e.y===this.y},fromArray:function(e){this.x=e[0];this.y=e[1];return this},toArray:function(){return[this.x,this.y]},clone:function(){return new THREE.Vector2(this.x,this.y)}};THREE.Vector3=function(e,t,n){this.x=e||0;this.y=t||0;this.z=n||0};THREE.Vector3.prototype={constructor:THREE.Vector3,set:function(e,t,n){this.x=e;this.y=t;this.z=n;return this},setX:function(e){this.x=e;return this},setY:function(e){this.y=e;return this},setZ:function(e){this.z=e;return this},setComponent:function(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;default:throw Error(\"index is out of range: \"+e)}},getComponent:function(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw Error(\"index is out of range: \"+e)}},copy:function(e){this.x=e.x;this.y=e.y;this.z=e.z;return this},add:function(e,t){if(void 0!==t)return console.warn(\"DEPRECATED: Vector3's .add() now only accepts one argument. Use .addVectors( a, b ) instead.\"),this.addVectors(e,t);this.x+=e.x;this.y+=e.y;this.z+=e.z;return this},addScalar:function(e){this.x+=e;this.y+=e;this.z+=e;return this},addVectors:function(e,t){this.x=e.x+t.x;this.y=e.y+t.y;this.z=e.z+t.z;return this},sub:function(e,t){if(void 0!==t)return console.warn(\"DEPRECATED: Vector3's .sub() now only accepts one argument. Use .subVectors( a, b ) instead.\"),this.subVectors(e,t);this.x-=e.x;this.y-=e.y;this.z-=e.z;return this},subVectors:function(e,t){this.x=e.x-t.x;this.y=e.y-t.y;this.z=e.z-t.z;return this},multiply:function(e,t){if(void 0!==t)return console.warn(\"DEPRECATED: Vector3's .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.\"),this.multiplyVectors(e,t);this.x*=e.x;this.y*=e.y;this.z*=e.z;return this},multiplyScalar:function(e){this.x*=e;this.y*=e;this.z*=e;return this},multiplyVectors:function(e,t){this.x=e.x*t.x;this.y=e.y*t.y;this.z=e.z*t.z;return this},applyMatrix3:function(e){var t=this.x,n=this.y,r=this.z,e=e.elements;this.x=e[0]*t+e[3]*n+e[6]*r;this.y=e[1]*t+e[4]*n+e[7]*r;this.z=e[2]*t+e[5]*n+e[8]*r;return this},applyMatrix4:function(e){var t=this.x,n=this.y,r=this.z,e=e.elements;this.x=e[0]*t+e[4]*n+e[8]*r+e[12];this.y=e[1]*t+e[5]*n+e[9]*r+e[13];this.z=e[2]*t+e[6]*n+e[10]*r+e[14];return this},applyProjection:function(e){var t=this.x,n=this.y,r=this.z,e=e.elements,i=1/(e[3]*t+e[7]*n+e[11]*r+e[15]);this.x=(e[0]*t+e[4]*n+e[8]*r+e[12])*i;this.y=(e[1]*t+e[5]*n+e[9]*r+e[13])*i;this.z=(e[2]*t+e[6]*n+e[10]*r+e[14])*i;return this},applyQuaternion:function(e){var t=this.x,n=this.y,r=this.z,i=e.x,s=e.y,o=e.z,e=e.w,u=e*t+s*r-o*n,a=e*n+o*t-i*r,f=e*r+i*n-s*t,t=-i*t-s*n-o*r;this.x=u*e+t*-i+a*-o-f*-s;this.y=a*e+t*-s+f*-i-u*-o;this.z=f*e+t*-o+u*-s-a*-i;return this},transformDirection:function(e){var t=this.x,n=this.y,r=this.z,e=e.elements;this.x=e[0]*t+e[4]*n+e[8]*r;this.y=e[1]*t+e[5]*n+e[9]*r;this.z=e[2]*t+e[6]*n+e[10]*r;this.normalize();return this},divide:function(e){this.x/=e.x;this.y/=e.y;this.z/=e.z;return this},divideScalar:function(e){0!==e?(e=1/e,this.x*=e,this.y*=e,this.z*=e):this.z=this.y=this.x=0;return this},min:function(e){this.x>e.x&&(this.x=e.x);this.y>e.y&&(this.y=e.y);this.z>e.z&&(this.z=e.z);return this},max:function(e){this.x<e.x&&(this.x=e.x);this.y<e.y&&(this.y=e.y);this.z<e.z&&(this.z=e.z);return this},clamp:function(e,t){this.x<e.x?this.x=e.x:this.x>t.x&&(this.x=t.x);this.y<e.y?this.y=e.y:this.y>t.y&&(this.y=t.y);this.z<e.z?this.z=e.z:this.z>t.z&&(this.z=t.z);return this},negate:function(){return this.multiplyScalar(-1)},dot:function(e){return this.x*e.x+this.y*e.y+this.z*e.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)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length())},setLength:function(e){var t=this.length();0!==t&&e!==t&&this.multiplyScalar(e/t);return this},lerp:function(e,t){this.x+=(e.x-this.x)*t;this.y+=(e.y-this.y)*t;this.z+=(e.z-this.z)*t;return this},cross:function(e,t){if(void 0!==t)return console.warn(\"DEPRECATED: Vector3's .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.\"),this.crossVectors(e,t);var n=this.x,r=this.y,i=this.z;this.x=r*e.z-i*e.y;this.y=i*e.x-n*e.z;this.z=n*e.y-r*e.x;return this},crossVectors:function(e,t){var n=e.x,r=e.y,i=e.z,s=t.x,o=t.y,u=t.z;this.x=r*u-i*o;this.y=i*s-n*u;this.z=n*o-r*s;return this},angleTo:function(e){e=this.dot(e)/(this.length()*e.length());return Math.acos(THREE.Math.clamp(e,-1,1))},distanceTo:function(e){return Math.sqrt(this.distanceToSquared(e))},distanceToSquared:function(e){var t=this.x-e.x,n=this.y-e.y,e=this.z-e.z;return t*t+n*n+e*e},setEulerFromRotationMatrix:function(){console.error(\"REMOVED: Vector3's setEulerFromRotationMatrix has been removed in favor of Euler.setFromRotationMatrix(), please update your code.\")},setEulerFromQuaternion:function(){console.error(\"REMOVED: Vector3's setEulerFromQuaternion: has been removed in favor of Euler.setFromQuaternion(), please update your code.\")},getPositionFromMatrix:function(e){console.warn(\"DEPRECATED: Vector3's .getPositionFromMatrix() has been renamed to .setFromMatrixPosition(). Please update your code.\");return this.setFromMatrixPosition(e)},getScaleFromMatrix:function(e){console.warn(\"DEPRECATED: Vector3's .getScaleFromMatrix() has been renamed to .setFromMatrixScale(). Please update your code.\");return this.setFromMatrixScale(e)},getColumnFromMatrix:function(e,t){console.warn(\"DEPRECATED: Vector3's .getColumnFromMatrix() has been renamed to .setFromMatrixColumn(). Please update your code.\");return this.setFromMatrixColumn(e,t)},setFromMatrixPosition:function(e){this.x=e.elements[12];this.y=e.elements[13];this.z=e.elements[14];return this},setFromMatrixScale:function(e){var t=this.set(e.elements[0],e.elements[1],e.elements[2]).length(),n=this.set(e.elements[4],e.elements[5],e.elements[6]).length(),e=this.set(e.elements[8],e.elements[9],e.elements[10]).length();this.x=t;this.y=n;this.z=e;return this},setFromMatrixColumn:function(e,t){var n=4*e,r=t.elements;this.x=r[n];this.y=r[n+1];this.z=r[n+2];return this},equals:function(e){return e.x===this.x&&e.y===this.y&&e.z===this.z},fromArray:function(e){this.x=e[0];this.y=e[1];this.z=e[2];return this},toArray:function(){return[this.x,this.y,this.z]},clone:function(){return new THREE.Vector3(this.x,this.y,this.z)}};THREE.extend(THREE.Vector3.prototype,{applyEuler:function(){var e=new THREE.Quaternion;return function(t){!1===t instanceof THREE.Euler&&console.error(\"ERROR: Vector3's .applyEuler() now expects a Euler rotation rather than a Vector3 and order. Please update your code.\");this.applyQuaternion(e.setFromEuler(t));return this}}(),applyAxisAngle:function(){var e=new THREE.Quaternion;return function(t,n){this.applyQuaternion(e.setFromAxisAngle(t,n));return this}}(),projectOnVector:function(){var e=new THREE.Vector3;return function(t){e.copy(t).normalize();t=this.dot(e);return this.copy(e).multiplyScalar(t)}}(),projectOnPlane:function(){var e=new THREE.Vector3;return function(t){e.copy(this).projectOnVector(t);return this.sub(e)}}(),reflect:function(){var e=new THREE.Vector3;return function(t){e.copy(this).projectOnVector(t).multiplyScalar(2);return this.subVectors(e,this)}}()});THREE.Vector4=function(e,t,n,r){this.x=e||0;this.y=t||0;this.z=n||0;this.w=void 0!==r?r:1};THREE.Vector4.prototype={constructor:THREE.Vector4,set:function(e,t,n,r){this.x=e;this.y=t;this.z=n;this.w=r;return this},setX:function(e){this.x=e;return this},setY:function(e){this.y=e;return this},setZ:function(e){this.z=e;return this},setW:function(e){this.w=e;return this},setComponent:function(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;case 3:this.w=t;break;default:throw Error(\"index is out of range: \"+e)}},getComponent:function(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw Error(\"index is out of range: \"+e)}},copy:function(e){this.x=e.x;this.y=e.y;this.z=e.z;this.w=void 0!==e.w?e.w:1;return this},add:function(e,t){if(void 0!==t)return console.warn(\"DEPRECATED: Vector4's .add() now only accepts one argument. Use .addVectors( a, b ) instead.\"),this.addVectors(e,t);this.x+=e.x;this.y+=e.y;this.z+=e.z;this.w+=e.w;return this},addScalar:function(e){this.x+=e;this.y+=e;this.z+=e;this.w+=e;return this},addVectors:function(e,t){this.x=e.x+t.x;this.y=e.y+t.y;this.z=e.z+t.z;this.w=e.w+t.w;return this},sub:function(e,t){if(void 0!==t)return console.warn(\"DEPRECATED: Vector4's .sub() now only accepts one argument. Use .subVectors( a, b ) instead.\"),this.subVectors(e,t);this.x-=e.x;this.y-=e.y;this.z-=e.z;this.w-=e.w;return this},subVectors:function(e,t){this.x=e.x-t.x;this.y=e.y-t.y;this.z=e.z-t.z;this.w=e.w-t.w;return this},multiplyScalar:function(e){this.x*=e;this.y*=e;this.z*=e;this.w*=e;return this},applyMatrix4:function(e){var t=this.x,n=this.y,r=this.z,i=this.w,e=e.elements;this.x=e[0]*t+e[4]*n+e[8]*r+e[12]*i;this.y=e[1]*t+e[5]*n+e[9]*r+e[13]*i;this.z=e[2]*t+e[6]*n+e[10]*r+e[14]*i;this.w=e[3]*t+e[7]*n+e[11]*r+e[15]*i;return this},divideScalar:function(e){0!==e?(e=1/e,this.x*=e,this.y*=e,this.z*=e,this.w*=e):(this.z=this.y=this.x=0,this.w=1);return this},setAxisAngleFromQuaternion:function(e){this.w=2*Math.acos(e.w);var t=Math.sqrt(1-e.w*e.w);1e-4>t?(this.x=1,this.z=this.y=0):(this.x=e.x/t,this.y=e.y/t,this.z=e.z/t);return this},setAxisAngleFromRotationMatrix:function(e){var t,n,r,e=e.elements,i=e[0];r=e[4];var s=e[8],o=e[1],u=e[5],a=e[9];n=e[2];t=e[6];var f=e[10];if(.01>Math.abs(r-o)&&.01>Math.abs(s-n)&&.01>Math.abs(a-t)){if(.1>Math.abs(r+o)&&.1>Math.abs(s+n)&&.1>Math.abs(a+t)&&.1>Math.abs(i+u+f-3))return this.set(1,0,0,0),this;e=Math.PI;i=(i+1)/2;u=(u+1)/2;f=(f+1)/2;r=(r+o)/4;s=(s+n)/4;a=(a+t)/4;i>u&&i>f?.01>i?(t=0,r=n=.707106781):(t=Math.sqrt(i),n=r/t,r=s/t):u>f?.01>u?(t=.707106781,n=0,r=.707106781):(n=Math.sqrt(u),t=r/n,r=a/n):.01>f?(n=t=.707106781,r=0):(r=Math.sqrt(f),t=s/r,n=a/r);this.set(t,n,r,e);return this}e=Math.sqrt((t-a)*(t-a)+(s-n)*(s-n)+(o-r)*(o-r));.001>Math.abs(e)&&(e=1);this.x=(t-a)/e;this.y=(s-n)/e;this.z=(o-r)/e;this.w=Math.acos((i+u+f-1)/2);return this},min:function(e){this.x>e.x&&(this.x=e.x);this.y>e.y&&(this.y=e.y);this.z>e.z&&(this.z=e.z);this.w>e.w&&(this.w=e.w);return this},max:function(e){this.x<e.x&&(this.x=e.x);this.y<e.y&&(this.y=e.y);this.z<e.z&&(this.z=e.z);this.w<e.w&&(this.w=e.w);return this},clamp:function(e,t){this.x<e.x?this.x=e.x:this.x>t.x&&(this.x=t.x);this.y<e.y?this.y=e.y:this.y>t.y&&(this.y=t.y);this.z<e.z?this.z=e.z:this.z>t.z&&(this.z=t.z);this.w<e.w?this.w=e.w:this.w>t.w&&(this.w=t.w);return this},negate:function(){return this.multiplyScalar(-1)},dot:function(e){return this.x*e.x+this.y*e.y+this.z*e.z+this.w*e.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)},lengthManhattan: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())},setLength:function(e){var t=this.length();0!==t&&e!==t&&this.multiplyScalar(e/t);return this},lerp:function(e,t){this.x+=(e.x-this.x)*t;this.y+=(e.y-this.y)*t;this.z+=(e.z-this.z)*t;this.w+=(e.w-this.w)*t;return this},equals:function(e){return e.x===this.x&&e.y===this.y&&e.z===this.z&&e.w===this.w},fromArray:function(e){this.x=e[0];this.y=e[1];this.z=e[2];this.w=e[3];return this},toArray:function(){return[this.x,this.y,this.z,this.w]},clone:function(){return new THREE.Vector4(this.x,this.y,this.z,this.w)}};THREE.Euler=function(e,t,n,r){this._x=e||0;this._y=t||0;this._z=n||0;this._order=r||THREE.Euler.DefaultOrder};THREE.Euler.RotationOrders=\"XYZ YZX ZXY XZY YXZ ZYX\".split(\" \");THREE.Euler.DefaultOrder=\"XYZ\";THREE.Euler.prototype={constructor:THREE.Euler,_x:0,_y:0,_z:0,_order:THREE.Euler.DefaultOrder,_quaternion:void 0,_updateQuaternion:function(){void 0!==this._quaternion&&this._quaternion.setFromEuler(this,!1)},get x(){return this._x},set x(e){this._x=e;this._updateQuaternion()},get y(){return this._y},set y(e){this._y=e;this._updateQuaternion()},get z(){return this._z},set z(e){this._z=e;this._updateQuaternion()},get order(){return this._order},set order(e){this._order=e;this._updateQuaternion()},set:function(e,t,n,r){this._x=e;this._y=t;this._z=n;this._order=r||this._order;this._updateQuaternion();return this},copy:function(e){this._x=e._x;this._y=e._y;this._z=e._z;this._order=e._order;this._updateQuaternion();return this},setFromRotationMatrix:function(e,t){function n(e){return Math.min(Math.max(e,-1),1)}var r=e.elements,i=r[0],s=r[4],o=r[8],u=r[1],a=r[5],f=r[9],l=r[2],c=r[6],r=r[10],t=t||this._order;\"XYZ\"===t?(this._y=Math.asin(n(o)),.99999>Math.abs(o)?(this._x=Math.atan2(-f,r),this._z=Math.atan2(-s,i)):(this._x=Math.atan2(c,a),this._z=0)):\"YXZ\"===t?(this._x=Math.asin(-n(f)),.99999>Math.abs(f)?(this._y=Math.atan2(o,r),this._z=Math.atan2(u,a)):(this._y=Math.atan2(-l,i),this._z=0)):\"ZXY\"===t?(this._x=Math.asin(n(c)),.99999>Math.abs(c)?(this._y=Math.atan2(-l,r),this._z=Math.atan2(-s,a)):(this._y=0,this._z=Math.atan2(u,i))):\"ZYX\"===t?(this._y=Math.asin(-n(l)),.99999>Math.abs(l)?(this._x=Math.atan2(c,r),this._z=Math.atan2(u,i)):(this._x=0,this._z=Math.atan2(-s,a))):\"YZX\"===t?(this._z=Math.asin(n(u)),.99999>Math.abs(u)?(this._x=Math.atan2(-f,a),this._y=Math.atan2(-l,i)):(this._x=0,this._y=Math.atan2(o,r))):\"XZY\"===t?(this._z=Math.asin(-n(s)),.99999>Math.abs(s)?(this._x=Math.atan2(c,a),this._y=Math.atan2(o,i)):(this._x=Math.atan2(-f,r),this._y=0)):console.warn(\"WARNING: Euler.setFromRotationMatrix() given unsupported order: \"+t);this._order=t;this._updateQuaternion();return this},setFromQuaternion:function(e,t,n){function r(e){return Math.min(Math.max(e,-1),1)}var i=e.x*e.x,s=e.y*e.y,o=e.z*e.z,u=e.w*e.w,t=t||this._order;\"XYZ\"===t?(this._x=Math.atan2(2*(e.x*e.w-e.y*e.z),u-i-s+o),this._y=Math.asin(r(2*(e.x*e.z+e.y*e.w))),this._z=Math.atan2(2*(e.z*e.w-e.x*e.y),u+i-s-o)):\"YXZ\"===t?(this._x=Math.asin(r(2*(e.x*e.w-e.y*e.z))),this._y=Math.atan2(2*(e.x*e.z+e.y*e.w),u-i-s+o),this._z=Math.atan2(2*(e.x*e.y+e.z*e.w),u-i+s-o)):\"ZXY\"===t?(this._x=Math.asin(r(2*(e.x*e.w+e.y*e.z))),this._y=Math.atan2(2*(e.y*e.w-e.z*e.x),u-i-s+o),this._z=Math.atan2(2*(e.z*e.w-e.x*e.y),u-i+s-o)):\"ZYX\"===t?(this._x=Math.atan2(2*(e.x*e.w+e.z*e.y),u-i-s+o),this._y=Math.asin(r(2*(e.y*e.w-e.x*e.z))),this._z=Math.atan2(2*(e.x*e.y+e.z*e.w),u+i-s-o)):\"YZX\"===t?(this._x=Math.atan2(2*(e.x*e.w-e.z*e.y),u-i+s-o),this._y=Math.atan2(2*(e.y*e.w-e.x*e.z),u+i-s-o),this._z=Math.asin(r(2*(e.x*e.y+e.z*e.w)))):\"XZY\"===t?(this._x=Math.atan2(2*(e.x*e.w+e.y*e.z),u-i+s-o),this._y=Math.atan2(2*(e.x*e.z+e.y*e.w),u+i-s-o),this._z=Math.asin(r(2*(e.z*e.w-e.x*e.y)))):console.warn(\"WARNING: Euler.setFromQuaternion() given unsupported order: \"+t);this._order=t;!1!==n&&this._updateQuaternion();return this},reorder:function(){var e=new THREE.Quaternion;return function(t){e.setFromEuler(this);this.setFromQuaternion(e,t)}}(),fromArray:function(e){this._x=e[0];this._y=e[1];this._z=e[2];void 0!==e[3]&&(this._order=e[3]);this._updateQuaternion();return this},toArray:function(){return[this._x,this._y,this._z,this._order]},equals:function(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._order===this._order},clone:function(){return new THREE.Euler(this._x,this._y,this._z,this._order)}};THREE.Line3=function(e,t){this.start=void 0!==e?e:new THREE.Vector3;this.end=void 0!==t?t:new THREE.Vector3};THREE.Line3.prototype={constructor:THREE.Line3,set:function(e,t){this.start.copy(e);this.end.copy(t);return this},copy:function(e){this.start.copy(e.start);this.end.copy(e.end);return this},center:function(e){return(e||new THREE.Vector3).addVectors(this.start,this.end).multiplyScalar(.5)},delta:function(e){return(e||new THREE.Vector3).subVectors(this.end,this.start)},distanceSq:function(){return this.start.distanceToSquared(this.end)},distance:function(){return this.start.distanceTo(this.end)},at:function(e,t){var n=t||new THREE.Vector3;return this.delta(n).multiplyScalar(e).add(this.start)},closestPointToPointParameter:function(){var e=new THREE.Vector3,t=new THREE.Vector3;return function(n,r){e.subVectors(n,this.start);t.subVectors(this.end,this.start);var i=t.dot(t),i=t.dot(e)/i;r&&(i=THREE.Math.clamp(i,0,1));return i}}(),closestPointToPoint:function(e,t,n){e=this.closestPointToPointParameter(e,t);n=n||new THREE.Vector3;return this.delta(n).multiplyScalar(e).add(this.start)},applyMatrix4:function(e){this.start.applyMatrix4(e);this.end.applyMatrix4(e);return this},equals:function(e){return e.start.equals(this.start)&&e.end.equals(this.end)},clone:function(){return(new THREE.Line3).copy(this)}};THREE.Box2=function(e,t){this.min=void 0!==e?e:new THREE.Vector2(Infinity,Infinity);this.max=void 0!==t?t:new THREE.Vector2(-Infinity,-Infinity)};THREE.Box2.prototype={constructor:THREE.Box2,set:function(e,t){this.min.copy(e);this.max.copy(t);return this},setFromPoints:function(e){if(0<e.length){var t=e[0];this.min.copy(t);this.max.copy(t);for(var n=1,r=e.length;n<r;n++)t=e[n],t.x<this.min.x?this.min.x=t.x:t.x>this.max.x&&(this.max.x=t.x),t.y<this.min.y?this.min.y=t.y:t.y>this.max.y&&(this.max.y=t.y)}else this.makeEmpty();return this},setFromCenterAndSize:function(){var e=new THREE.Vector2;return function(t,n){var r=e.copy(n).multiplyScalar(.5);this.min.copy(t).sub(r);this.max.copy(t).add(r);return this}}(),copy:function(e){this.min.copy(e.min);this.max.copy(e.max);return this},makeEmpty:function(){this.min.x=this.min.y=Infinity;this.max.x=this.max.y=-Infinity;return this},empty:function(){return this.max.x<this.min.x||this.max.y<this.min.y},center:function(e){return(e||new THREE.Vector2).addVectors(this.min,this.max).multiplyScalar(.5)},size:function(e){return(e||new THREE.Vector2).subVectors(this.max,this.min)},expandByPoint:function(e){this.min.min(e);this.max.max(e);return this},expandByVector:function(e){this.min.sub(e);this.max.add(e);return this},expandByScalar:function(e){this.min.addScalar(-e);this.max.addScalar(e);return this},containsPoint:function(e){return e.x<this.min.x||e.x>this.max.x||e.y<this.min.y||e.y>this.max.y?!1:!0},containsBox:function(e){return this.min.x<=e.min.x&&e.max.x<=this.max.x&&this.min.y<=e.min.y&&e.max.y<=this.max.y?!0:!1},getParameter:function(e,t){return(t||new THREE.Vector2).set((e.x-this.min.x)/(this.max.x-this.min.x),(e.y-this.min.y)/(this.max.y-this.min.y))},isIntersectionBox:function(e){return e.max.x<this.min.x||e.min.x>this.max.x||e.max.y<this.min.y||e.min.y>this.max.y?!1:!0},clampPoint:function(e,t){return(t||new THREE.Vector2).copy(e).clamp(this.min,this.max)},distanceToPoint:function(){var e=new THREE.Vector2;return function(t){return e.copy(t).clamp(this.min,this.max).sub(t).length()}}(),intersect:function(e){this.min.max(e.min);this.max.min(e.max);return this},union:function(e){this.min.min(e.min);this.max.max(e.max);return this},translate:function(e){this.min.add(e);this.max.add(e);return this},equals:function(e){return e.min.equals(this.min)&&e.max.equals(this.max)},clone:function(){return(new THREE.Box2).copy(this)}};THREE.Box3=function(e,t){this.min=void 0!==e?e:new THREE.Vector3(Infinity,Infinity,Infinity);this.max=void 0!==t?t:new THREE.Vector3(-Infinity,-Infinity,-Infinity)};THREE.Box3.prototype={constructor:THREE.Box3,set:function(e,t){this.min.copy(e);this.max.copy(t);return this},addPoint:function(e){e.x<this.min.x?this.min.x=e.x:e.x>this.max.x&&(this.max.x=e.x);e.y<this.min.y?this.min.y=e.y:e.y>this.max.y&&(this.max.y=e.y);e.z<this.min.z?this.min.z=e.z:e.z>this.max.z&&(this.max.z=e.z)},setFromPoints:function(e){if(0<e.length){var t=e[0];this.min.copy(t);this.max.copy(t);for(var t=1,n=e.length;t<n;t++)this.addPoint(e[t])}else this.makeEmpty();return this},setFromCenterAndSize:function(){var e=new THREE.Vector3;return function(t,n){var r=e.copy(n).multiplyScalar(.5);this.min.copy(t).sub(r);this.max.copy(t).add(r);return this}}(),setFromObject:function(){var e=new THREE.Vector3;return function(t){var n=this;t.updateMatrixWorld(!0);this.makeEmpty();t.traverse(function(t){if(void 0!==t.geometry&&void 0!==t.geometry.vertices)for(var r=t.geometry.vertices,i=0,s=r.length;i<s;i++)e.copy(r[i]),e.applyMatrix4(t.matrixWorld),n.expandByPoint(e)});return this}}(),copy:function(e){this.min.copy(e.min);this.max.copy(e.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},empty:function(){return this.max.x<this.min.x||this.max.y<this.min.y||this.max.z<this.min.z},center:function(e){return(e||new THREE.Vector3).addVectors(this.min,this.max).multiplyScalar(.5)},size:function(e){return(e||new THREE.Vector3).subVectors(this.max,this.min)},expandByPoint:function(e){this.min.min(e);this.max.max(e);return this},expandByVector:function(e){this.min.sub(e);this.max.add(e);return this},expandByScalar:function(e){this.min.addScalar(-e);this.max.addScalar(e);return this},containsPoint:function(e){return e.x<this.min.x||e.x>this.max.x||e.y<this.min.y||e.y>this.max.y||e.z<this.min.z||e.z>this.max.z?!1:!0},containsBox:function(e){return this.min.x<=e.min.x&&e.max.x<=this.max.x&&this.min.y<=e.min.y&&e.max.y<=this.max.y&&this.min.z<=e.min.z&&e.max.z<=this.max.z?!0:!1},getParameter:function(e,t){return(t||new THREE.Vector3).set((e.x-this.min.x)/(this.max.x-this.min.x),(e.y-this.min.y)/(this.max.y-this.min.y),(e.z-this.min.z)/(this.max.z-this.min.z))},isIntersectionBox:function(e){return e.max.x<this.min.x||e.min.x>this.max.x||e.max.y<this.min.y||e.min.y>this.max.y||e.max.z<this.min.z||e.min.z>this.max.z?!1:!0},clampPoint:function(e,t){return(t||new THREE.Vector3).copy(e).clamp(this.min,this.max)},distanceToPoint:function(){var e=new THREE.Vector3;return function(t){return e.copy(t).clamp(this.min,this.max).sub(t).length()}}(),getBoundingSphere:function(){var e=new THREE.Vector3;return function(t){t=t||new THREE.Sphere;t.center=this.center();t.radius=.5*this.size(e).length();return t}}(),intersect:function(e){this.min.max(e.min);this.max.min(e.max);return this},union:function(e){this.min.min(e.min);this.max.max(e.max);return this},applyMatrix4:function(){var e=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];return function(t){e[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(t);e[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(t);e[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(t);e[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(t);e[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(t);e[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(t);e[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(t);e[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(t);this.makeEmpty();this.setFromPoints(e);return this}}(),translate:function(e){this.min.add(e);this.max.add(e);return this},equals:function(e){return e.min.equals(this.min)&&e.max.equals(this.max)},clone:function(){return(new THREE.Box3).copy(this)}};THREE.Matrix3=function(e,t,n,r,i,s,o,u,a){this.elements=new Float32Array(9);this.set(void 0!==e?e:1,t||0,n||0,r||0,void 0!==i?i:1,s||0,o||0,u||0,void 0!==a?a:1)};THREE.Matrix3.prototype={constructor:THREE.Matrix3,set:function(e,t,n,r,i,s,o,u,a){var f=this.elements;f[0]=e;f[3]=t;f[6]=n;f[1]=r;f[4]=i;f[7]=s;f[2]=o;f[5]=u;f[8]=a;return this},identity:function(){this.set(1,0,0,0,1,0,0,0,1);return this},copy:function(e){e=e.elements;this.set(e[0],e[3],e[6],e[1],e[4],e[7],e[2],e[5],e[8]);return this},multiplyVector3:function(e){console.warn(\"DEPRECATED: Matrix3's .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.\");return e.applyMatrix3(this)},multiplyVector3Array:function(){var e=new THREE.Vector3;return function(t){for(var n=0,r=t.length;n<r;n+=3)e.x=t[n],e.y=t[n+1],e.z=t[n+2],e.applyMatrix3(this),t[n]=e.x,t[n+1]=e.y,t[n+2]=e.z;return t}}(),multiplyScalar:function(e){var t=this.elements;t[0]*=e;t[3]*=e;t[6]*=e;t[1]*=e;t[4]*=e;t[7]*=e;t[2]*=e;t[5]*=e;t[8]*=e;return this},determinant:function(){var e=this.elements,t=e[0],n=e[1],r=e[2],i=e[3],s=e[4],o=e[5],u=e[6],a=e[7],e=e[8];return t*s*e-t*o*a-n*i*e+n*o*u+r*i*a-r*s*u},getInverse:function(e,t){var n=e.elements,r=this.elements;r[0]=n[10]*n[5]-n[6]*n[9];r[1]=-n[10]*n[1]+n[2]*n[9];r[2]=n[6]*n[1]-n[2]*n[5];r[3]=-n[10]*n[4]+n[6]*n[8];r[4]=n[10]*n[0]-n[2]*n[8];r[5]=-n[6]*n[0]+n[2]*n[4];r[6]=n[9]*n[4]-n[5]*n[8];r[7]=-n[9]*n[0]+n[1]*n[8];r[8]=n[5]*n[0]-n[1]*n[4];n=n[0]*r[0]+n[1]*r[3]+n[2]*r[6];if(0===n){if(t)throw Error(\"Matrix3.getInverse(): can't invert matrix, determinant is 0\");console.warn(\"Matrix3.getInverse(): can't invert matrix, determinant is 0\");this.identity();return this}this.multiplyScalar(1/n);return this},transpose:function(){var e,t=this.elements;e=t[1];t[1]=t[3];t[3]=e;e=t[2];t[2]=t[6];t[6]=e;e=t[5];t[5]=t[7];t[7]=e;return this},getNormalMatrix:function(e){this.getInverse(e).transpose();return this},transposeIntoArray:function(e){var t=this.elements;e[0]=t[0];e[1]=t[3];e[2]=t[6];e[3]=t[1];e[4]=t[4];e[5]=t[7];e[6]=t[2];e[7]=t[5];e[8]=t[8];return this},clone:function(){var e=this.elements;return new THREE.Matrix3(e[0],e[3],e[6],e[1],e[4],e[7],e[2],e[5],e[8])}};THREE.Matrix4=function(e,t,n,r,i,s,o,u,a,f,l,c,h,p,d,v){var m=this.elements=new Float32Array(16);m[0]=void 0!==e?e:1;m[4]=t||0;m[8]=n||0;m[12]=r||0;m[1]=i||0;m[5]=void 0!==s?s:1;m[9]=o||0;m[13]=u||0;m[2]=a||0;m[6]=f||0;m[10]=void 0!==l?l:1;m[14]=c||0;m[3]=h||0;m[7]=p||0;m[11]=d||0;m[15]=void 0!==v?v:1};THREE.Matrix4.prototype={constructor:THREE.Matrix4,set:function(e,t,n,r,i,s,o,u,a,f,l,c,h,p,d,v){var m=this.elements;m[0]=e;m[4]=t;m[8]=n;m[12]=r;m[1]=i;m[5]=s;m[9]=o;m[13]=u;m[2]=a;m[6]=f;m[10]=l;m[14]=c;m[3]=h;m[7]=p;m[11]=d;m[15]=v;return this},identity:function(){this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this},copy:function(e){this.elements.set(e.elements);return this},extractPosition:function(e){console.warn(\"DEPRECATED: Matrix4's .extractPosition() has been renamed to .copyPosition().\");return this.copyPosition(e)},copyPosition:function(e){var t=this.elements,e=e.elements;t[12]=e[12];t[13]=e[13];t[14]=e[14];return this},extractRotation:function(){var e=new THREE.Vector3;return function(t){var n=this.elements,t=t.elements,r=1/e.set(t[0],t[1],t[2]).length(),i=1/e.set(t[4],t[5],t[6]).length(),s=1/e.set(t[8],t[9],t[10]).length();n[0]=t[0]*r;n[1]=t[1]*r;n[2]=t[2]*r;n[4]=t[4]*i;n[5]=t[5]*i;n[6]=t[6]*i;n[8]=t[8]*s;n[9]=t[9]*s;n[10]=t[10]*s;return this}}(),makeRotationFromEuler:function(e){!1===e instanceof THREE.Euler&&console.error(\"ERROR: Matrix's .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order. Please update your code.\");var t=this.elements,n=e.x,r=e.y,i=e.z,s=Math.cos(n),n=Math.sin(n),o=Math.cos(r),r=Math.sin(r),u=Math.cos(i),i=Math.sin(i);if(\"XYZ\"===e.order){var e=s*u,a=s*i,f=n*u,l=n*i;t[0]=o*u;t[4]=-o*i;t[8]=r;t[1]=a+f*r;t[5]=e-l*r;t[9]=-n*o;t[2]=l-e*r;t[6]=f+a*r;t[10]=s*o}else\"YXZ\"===e.order?(e=o*u,a=o*i,f=r*u,l=r*i,t[0]=e+l*n,t[4]=f*n-a,t[8]=s*r,t[1]=s*i,t[5]=s*u,t[9]=-n,t[2]=a*n-f,t[6]=l+e*n,t[10]=s*o):\"ZXY\"===e.order?(e=o*u,a=o*i,f=r*u,l=r*i,t[0]=e-l*n,t[4]=-s*i,t[8]=f+a*n,t[1]=a+f*n,t[5]=s*u,t[9]=l-e*n,t[2]=-s*r,t[6]=n,t[10]=s*o):\"ZYX\"===e.order?(e=s*u,a=s*i,f=n*u,l=n*i,t[0]=o*u,t[4]=f*r-a,t[8]=e*r+l,t[1]=o*i,t[5]=l*r+e,t[9]=a*r-f,t[2]=-r,t[6]=n*o,t[10]=s*o):\"YZX\"===e.order?(e=s*o,a=s*r,f=n*o,l=n*r,t[0]=o*u,t[4]=l-e*i,t[8]=f*i+a,t[1]=i,t[5]=s*u,t[9]=-n*u,t[2]=-r*u,t[6]=a*i+f,t[10]=e-l*i):\"XZY\"===e.order&&(e=s*o,a=s*r,f=n*o,l=n*r,t[0]=o*u,t[4]=-i,t[8]=r*u,t[1]=e*i+l,t[5]=s*u,t[9]=a*i-f,t[2]=f*i-a,t[6]=n*u,t[10]=l*i+e);t[3]=0;t[7]=0;t[11]=0;t[12]=0;t[13]=0;t[14]=0;t[15]=1;return this},setRotationFromQuaternion:function(e){console.warn(\"DEPRECATED: Matrix4's .setRotationFromQuaternion() has been deprecated in favor of makeRotationFromQuaternion. Please update your code.\");return this.makeRotationFromQuaternion(e)},makeRotationFromQuaternion:function(e){var t=this.elements,n=e.x,r=e.y,i=e.z,s=e.w,o=n+n,u=r+r,a=i+i,e=n*o,f=n*u,n=n*a,l=r*u,r=r*a,i=i*a,o=s*o,u=s*u,s=s*a;t[0]=1-(l+i);t[4]=f-s;t[8]=n+u;t[1]=f+s;t[5]=1-(e+i);t[9]=r-o;t[2]=n-u;t[6]=r+o;t[10]=1-(e+l);t[3]=0;t[7]=0;t[11]=0;t[12]=0;t[13]=0;t[14]=0;t[15]=1;return this},lookAt:function(){var e=new THREE.Vector3,t=new THREE.Vector3,n=new THREE.Vector3;return function(r,i,s){var o=this.elements;n.subVectors(r,i).normalize();0===n.length()&&(n.z=1);e.crossVectors(s,n).normalize();0===e.length()&&(n.x+=1e-4,e.crossVectors(s,n).normalize());t.crossVectors(n,e);o[0]=e.x;o[4]=t.x;o[8]=n.x;o[1]=e.y;o[5]=t.y;o[9]=n.y;o[2]=e.z;o[6]=t.z;o[10]=n.z;return this}}(),multiply:function(e,t){return void 0!==t?(console.warn(\"DEPRECATED: Matrix4's .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.\"),this.multiplyMatrices(e,t)):this.multiplyMatrices(this,e)},multiplyMatrices:function(e,t){var n=e.elements,r=t.elements,i=this.elements,s=n[0],o=n[4],u=n[8],a=n[12],f=n[1],l=n[5],c=n[9],h=n[13],p=n[2],d=n[6],v=n[10],m=n[14],g=n[3],y=n[7],b=n[11],n=n[15],w=r[0],E=r[4],S=r[8],x=r[12],T=r[1],N=r[5],C=r[9],k=r[13],L=r[2],A=r[6],O=r[10],M=r[14],_=r[3],D=r[7],P=r[11],r=r[15];i[0]=s*w+o*T+u*L+a*_;i[4]=s*E+o*N+u*A+a*D;i[8]=s*S+o*C+u*O+a*P;i[12]=s*x+o*k+u*M+a*r;i[1]=f*w+l*T+c*L+h*_;i[5]=f*E+l*N+c*A+h*D;i[9]=f*S+l*C+c*O+h*P;i[13]=f*x+l*k+c*M+h*r;i[2]=p*w+d*T+v*L+m*_;i[6]=p*E+d*N+v*A+m*D;i[10]=p*S+d*C+v*O+m*P;i[14]=p*x+d*k+v*M+m*r;i[3]=g*w+y*T+b*L+n*_;i[7]=g*E+y*N+b*A+n*D;i[11]=g*S+y*C+b*O+n*P;i[15]=g*x+y*k+b*M+n*r;return this},multiplyToArray:function(e,t,n){var r=this.elements;this.multiplyMatrices(e,t);n[0]=r[0];n[1]=r[1];n[2]=r[2];n[3]=r[3];n[4]=r[4];n[5]=r[5];n[6]=r[6];n[7]=r[7];n[8]=r[8];n[9]=r[9];n[10]=r[10];n[11]=r[11];n[12]=r[12];n[13]=r[13];n[14]=r[14];n[15]=r[15];return this},multiplyScalar:function(e){var t=this.elements;t[0]*=e;t[4]*=e;t[8]*=e;t[12]*=e;t[1]*=e;t[5]*=e;t[9]*=e;t[13]*=e;t[2]*=e;t[6]*=e;t[10]*=e;t[14]*=e;t[3]*=e;t[7]*=e;t[11]*=e;t[15]*=e;return this},multiplyVector3:function(e){console.warn(\"DEPRECATED: Matrix4's .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) or vector.applyProjection( matrix ) instead.\");return e.applyProjection(this)},multiplyVector4:function(e){console.warn(\"DEPRECATED: Matrix4's .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.\");return e.applyMatrix4(this)},multiplyVector3Array:function(){var e=new THREE.Vector3;return function(t){for(var n=0,r=t.length;n<r;n+=3)e.x=t[n],e.y=t[n+1],e.z=t[n+2],e.applyProjection(this),t[n]=e.x,t[n+1]=e.y,t[n+2]=e.z;return t}}(),rotateAxis:function(e){console.warn(\"DEPRECATED: Matrix4's .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.\");e.transformDirection(this)},crossVector:function(e){console.warn(\"DEPRECATED: Matrix4's .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.\");return e.applyMatrix4(this)},determinant:function(){var e=this.elements,t=e[0],n=e[4],r=e[8],i=e[12],s=e[1],o=e[5],u=e[9],a=e[13],f=e[2],l=e[6],c=e[10],h=e[14];return e[3]*(+i*u*l-r*a*l-i*o*c+n*a*c+r*o*h-n*u*h)+e[7]*(+t*u*h-t*a*c+i*s*c-r*s*h+r*a*f-i*u*f)+e[11]*(+t*a*l-t*o*h-i*s*l+n*s*h+i*o*f-n*a*f)+e[15]*(-r*o*f-t*u*l+t*o*c+r*s*l-n*s*c+n*u*f)},transpose:function(){var e=this.elements,t;t=e[1];e[1]=e[4];e[4]=t;t=e[2];e[2]=e[8];e[8]=t;t=e[6];e[6]=e[9];e[9]=t;t=e[3];e[3]=e[12];e[12]=t;t=e[7];e[7]=e[13];e[13]=t;t=e[11];e[11]=e[14];e[14]=t;return this},flattenToArray:function(e){var t=this.elements;e[0]=t[0];e[1]=t[1];e[2]=t[2];e[3]=t[3];e[4]=t[4];e[5]=t[5];e[6]=t[6];e[7]=t[7];e[8]=t[8];e[9]=t[9];e[10]=t[10];e[11]=t[11];e[12]=t[12];e[13]=t[13];e[14]=t[14];e[15]=t[15];return e},flattenToArrayOffset:function(e,t){var n=this.elements;e[t]=n[0];e[t+1]=n[1];e[t+2]=n[2];e[t+3]=n[3];e[t+4]=n[4];e[t+5]=n[5];e[t+6]=n[6];e[t+7]=n[7];e[t+8]=n[8];e[t+9]=n[9];e[t+10]=n[10];e[t+11]=n[11];e[t+12]=n[12];e[t+13]=n[13];e[t+14]=n[14];e[t+15]=n[15];return e},getPosition:function(){var e=new THREE.Vector3;return function(){console.warn(\"DEPRECATED: Matrix4's .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.\");var t=this.elements;return e.set(t[12],t[13],t[14])}}(),setPosition:function(e){var t=this.elements;t[12]=e.x;t[13]=e.y;t[14]=e.z;return this},getInverse:function(e,t){var n=this.elements,r=e.elements,i=r[0],s=r[4],o=r[8],u=r[12],a=r[1],f=r[5],l=r[9],c=r[13],h=r[2],p=r[6],d=r[10],v=r[14],m=r[3],g=r[7],y=r[11],r=r[15];n[0]=l*v*g-c*d*g+c*p*y-f*v*y-l*p*r+f*d*r;n[4]=u*d*g-o*v*g-u*p*y+s*v*y+o*p*r-s*d*r;n[8]=o*c*g-u*l*g+u*f*y-s*c*y-o*f*r+s*l*r;n[12]=u*l*p-o*c*p-u*f*d+s*c*d+o*f*v-s*l*v;n[1]=c*d*m-l*v*m-c*h*y+a*v*y+l*h*r-a*d*r;n[5]=o*v*m-u*d*m+u*h*y-i*v*y-o*h*r+i*d*r;n[9]=u*l*m-o*c*m-u*a*y+i*c*y+o*a*r-i*l*r;n[13]=o*c*h-u*l*h+u*a*d-i*c*d-o*a*v+i*l*v;n[2]=f*v*m-c*p*m+c*h*g-a*v*g-f*h*r+a*p*r;n[6]=u*p*m-s*v*m-u*h*g+i*v*g+s*h*r-i*p*r;n[10]=s*c*m-u*f*m+u*a*g-i*c*g-s*a*r+i*f*r;n[14]=u*f*h-s*c*h-u*a*p+i*c*p+s*a*v-i*f*v;n[3]=l*p*m-f*d*m-l*h*g+a*d*g+f*h*y-a*p*y;n[7]=s*d*m-o*p*m+o*h*g-i*d*g-s*h*y+i*p*y;n[11]=o*f*m-s*l*m-o*a*g+i*l*g+s*a*y-i*f*y;n[15]=s*l*h-o*f*h+o*a*p-i*l*p-s*a*d+i*f*d;n=i*n[0]+a*n[4]+h*n[8]+m*n[12];if(0==n){if(t)throw Error(\"Matrix4.getInverse(): can't invert matrix, determinant is 0\");console.warn(\"Matrix4.getInverse(): can't invert matrix, determinant is 0\");this.identity();return this}this.multiplyScalar(1/n);return this},translate:function(){console.warn(\"DEPRECATED: Matrix4's .translate() has been removed.\")},rotateX:function(){console.warn(\"DEPRECATED: Matrix4's .rotateX() has been removed.\")},rotateY:function(){console.warn(\"DEPRECATED: Matrix4's .rotateY() has been removed.\")},rotateZ:function(){console.warn(\"DEPRECATED: Matrix4's .rotateZ() has been removed.\")},rotateByAxis:function(){console.warn(\"DEPRECATED: Matrix4's .rotateByAxis() has been removed.\")},scale:function(e){var t=this.elements,n=e.x,r=e.y,e=e.z;t[0]*=n;t[4]*=r;t[8]*=e;t[1]*=n;t[5]*=r;t[9]*=e;t[2]*=n;t[6]*=r;t[10]*=e;t[3]*=n;t[7]*=r;t[11]*=e;return this},getMaxScaleOnAxis:function(){var e=this.elements;return Math.sqrt(Math.max(e[0]*e[0]+e[1]*e[1]+e[2]*e[2],Math.max(e[4]*e[4]+e[5]*e[5]+e[6]*e[6],e[8]*e[8]+e[9]*e[9]+e[10]*e[10])))},makeTranslation:function(e,t,n){this.set(1,0,0,e,0,1,0,t,0,0,1,n,0,0,0,1);return this},makeRotationX:function(e){var t=Math.cos(e),e=Math.sin(e);this.set(1,0,0,0,0,t,-e,0,0,e,t,0,0,0,0,1);return this},makeRotationY:function(e){var t=Math.cos(e),e=Math.sin(e);this.set(t,0,e,0,0,1,0,0,-e,0,t,0,0,0,0,1);return this},makeRotationZ:function(e){var t=Math.cos(e),e=Math.sin(e);this.set(t,-e,0,0,e,t,0,0,0,0,1,0,0,0,0,1);return this},makeRotationAxis:function(e,t){var n=Math.cos(t),r=Math.sin(t),i=1-n,s=e.x,o=e.y,u=e.z,a=i*s,f=i*o;this.set(a*s+n,a*o-r*u,a*u+r*o,0,a*o+r*u,f*o+n,f*u-r*s,0,a*u-r*o,f*u+r*s,i*u*u+n,0,0,0,0,1);return this},makeScale:function(e,t,n){this.set(e,0,0,0,0,t,0,0,0,0,n,0,0,0,0,1);return this},compose:function(e,t,n){this.makeRotationFromQuaternion(t);this.scale(n);this.setPosition(e);return this},decompose:function(){var e=new THREE.Vector3,t=new THREE.Matrix4;return function(n,r,i){var s=this.elements,o=e.set(s[0],s[1],s[2]).length(),u=e.set(s[4],s[5],s[6]).length(),f=e.set(s[8],s[9],s[10]).length();n.x=s[12];n.y=s[13];n.z=s[14];t.elements.set(this.elements);var n=1/o,s=1/u,l=1/f;t.elements[0]*=n;t.elements[1]*=n;t.elements[2]*=n;t.elements[4]*=s;t.elements[5]*=s;t.elements[6]*=s;t.elements[8]*=l;t.elements[9]*=l;t.elements[10]*=l;r.setFromRotationMatrix(t);i.x=o;i.y=u;i.z=f;return this}}(),makeFrustum:function(e,t,n,r,i,s){var o=this.elements;o[0]=2*i/(t-e);o[4]=0;o[8]=(t+e)/(t-e);o[12]=0;o[1]=0;o[5]=2*i/(r-n);o[9]=(r+n)/(r-n);o[13]=0;o[2]=0;o[6]=0;o[10]=-(s+i)/(s-i);o[14]=-2*s*i/(s-i);o[3]=0;o[7]=0;o[11]=-1;o[15]=0;return this},makePerspective:function(e,t,n,r){var e=n*Math.tan(THREE.Math.degToRad(.5*e)),i=-e;return this.makeFrustum(i*t,e*t,i,e,n,r)},makeOrthographic:function(e,t,n,r,i,s){var o=this.elements,u=t-e,a=n-r,f=s-i;o[0]=2/u;o[4]=0;o[8]=0;o[12]=-((t+e)/u);o[1]=0;o[5]=2/a;o[9]=0;o[13]=-((n+r)/a);o[2]=0;o[6]=0;o[10]=-2/f;o[14]=-((s+i)/f);o[3]=0;o[7]=0;o[11]=0;o[15]=1;return this},fromArray:function(e){this.elements.set(e);return this},toArray:function(){var e=this.elements;return[e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7],e[8],e[9],e[10],e[11],e[12],e[13],e[14],e[15]]},clone:function(){var e=this.elements;return new THREE.Matrix4(e[0],e[4],e[8],e[12],e[1],e[5],e[9],e[13],e[2],e[6],e[10],e[14],e[3],e[7],e[11],e[15])}};THREE.Ray=function(e,t){this.origin=void 0!==e?e:new THREE.Vector3;this.direction=void 0!==t?t:new THREE.Vector3};THREE.Ray.prototype={constructor:THREE.Ray,set:function(e,t){this.origin.copy(e);this.direction.copy(t);return this},copy:function(e){this.origin.copy(e.origin);this.direction.copy(e.direction);return this},at:function(e,t){return(t||new THREE.Vector3).copy(this.direction).multiplyScalar(e).add(this.origin)},recast:function(){var e=new THREE.Vector3;return function(t){this.origin.copy(this.at(t,e));return this}}(),closestPointToPoint:function(e,t){var n=t||new THREE.Vector3;n.subVectors(e,this.origin);var r=n.dot(this.direction);return 0>r?n.copy(this.origin):n.copy(this.direction).multiplyScalar(r).add(this.origin)},distanceToPoint:function(){var e=new THREE.Vector3;return function(t){var n=e.subVectors(t,this.origin).dot(this.direction);if(0>n)return this.origin.distanceTo(t);e.copy(this.direction).multiplyScalar(n).add(this.origin);return e.distanceTo(t)}}(),distanceSqToSegment:function(e,t,n,r){var i=e.clone().add(t).multiplyScalar(.5),s=t.clone().sub(e).normalize(),o=.5*e.distanceTo(t),u=this.origin.clone().sub(i),e=-this.direction.dot(s),t=u.dot(this.direction),a=-u.dot(s),f=u.lengthSq(),l=Math.abs(1-e*e),c,h;0<=l?(u=e*a-t,c=e*t-a,h=o*l,0<=u?c>=-h?c<=h?(o=1/l,u*=o,c*=o,e=u*(u+e*c+2*t)+c*(e*u+c+2*a)+f):(c=o,u=Math.max(0,-(e*c+t)),e=-u*u+c*(c+2*a)+f):(c=-o,u=Math.max(0,-(e*c+t)),e=-u*u+c*(c+2*a)+f):c<=-h?(u=Math.max(0,-(-e*o+t)),c=0<u?-o:Math.min(Math.max(-o,-a),o),e=-u*u+c*(c+2*a)+f):c<=h?(u=0,c=Math.min(Math.max(-o,-a),o),e=c*(c+2*a)+f):(u=Math.max(0,-(e*o+t)),c=0<u?o:Math.min(Math.max(-o,-a),o),e=-u*u+c*(c+2*a)+f)):(c=0<e?-o:o,u=Math.max(0,-(e*c+t)),e=-u*u+c*(c+2*a)+f);n&&n.copy(this.direction.clone().multiplyScalar(u).add(this.origin));r&&r.copy(s.clone().multiplyScalar(c).add(i));return e},isIntersectionSphere:function(e){return this.distanceToPoint(e.center)<=e.radius},isIntersectionPlane:function(e){var t=e.distanceToPoint(this.origin);return 0===t||0>e.normal.dot(this.direction)*t?!0:!1},distanceToPlane:function(e){var t=e.normal.dot(this.direction);if(0==t)return 0==e.distanceToPoint(this.origin)?0:null;e=-(this.origin.dot(e.normal)+e.constant)/t;return 0<=e?e:null},intersectPlane:function(e,t){var n=this.distanceToPlane(e);return null===n?null:this.at(n,t)},isIntersectionBox:function(){var e=new THREE.Vector3;return function(t){return null!==this.intersectBox(t,e)}}(),intersectBox:function(e,t){var n,r,i,s,o;r=1/this.direction.x;s=1/this.direction.y;o=1/this.direction.z;var u=this.origin;0<=r?(n=(e.min.x-u.x)*r,r*=e.max.x-u.x):(n=(e.max.x-u.x)*r,r*=e.min.x-u.x);0<=s?(i=(e.min.y-u.y)*s,s*=e.max.y-u.y):(i=(e.max.y-u.y)*s,s*=e.min.y-u.y);if(n>s||i>r)return null;if(i>n||n!==n)n=i;if(s<r||r!==r)r=s;0<=o?(i=(e.min.z-u.z)*o,o*=e.max.z-u.z):(i=(e.max.z-u.z)*o,o*=e.min.z-u.z);if(n>o||i>r)return null;if(i>n||n!==n)n=i;if(o<r||r!==r)r=o;return 0>r?null:this.at(0<=n?n:r,t)},intersectTriangle:function(){var e=new THREE.Vector3,t=new THREE.Vector3,n=new THREE.Vector3,r=new THREE.Vector3;return function(i,s,o,u,f){t.subVectors(s,i);n.subVectors(o,i);r.crossVectors(t,n);s=this.direction.dot(r);if(0<s){if(u)return null;u=1}else if(0>s)u=-1,s=-s;else return null;e.subVectors(this.origin,i);i=u*this.direction.dot(n.crossVectors(e,n));if(0>i)return null;o=u*this.direction.dot(t.cross(e));if(0>o||i+o>s)return null;i=-u*e.dot(r);return 0>i?null:this.at(i/s,f)}}(),applyMatrix4:function(e){this.direction.add(this.origin).applyMatrix4(e);this.origin.applyMatrix4(e);this.direction.sub(this.origin);this.direction.normalize();return this},equals:function(e){return e.origin.equals(this.origin)&&e.direction.equals(this.direction)},clone:function(){return(new THREE.Ray).copy(this)}};THREE.Sphere=function(e,t){this.center=void 0!==e?e:new THREE.Vector3;this.radius=void 0!==t?t:0};THREE.Sphere.prototype={constructor:THREE.Sphere,set:function(e,t){this.center.copy(e);this.radius=t;return this},setFromPoints:function(){var e=new THREE.Box3;return function(t,n){var r=this.center;void 0!==n?r.copy(n):e.setFromPoints(t).center(r);for(var i=0,s=0,o=t.length;s<o;s++)i=Math.max(i,r.distanceToSquared(t[s]));this.radius=Math.sqrt(i);return this}}(),copy:function(e){this.center.copy(e.center);this.radius=e.radius;return this},empty:function(){return 0>=this.radius},containsPoint:function(e){return e.distanceToSquared(this.center)<=this.radius*this.radius},distanceToPoint:function(e){return e.distanceTo(this.center)-this.radius},intersectsSphere:function(e){var t=this.radius+e.radius;return e.center.distanceToSquared(this.center)<=t*t},clampPoint:function(e,t){var n=this.center.distanceToSquared(e),r=t||new THREE.Vector3;r.copy(e);n>this.radius*this.radius&&(r.sub(this.center).normalize(),r.multiplyScalar(this.radius).add(this.center));return r},getBoundingBox:function(e){e=e||new THREE.Box3;e.set(this.center,this.center);e.expandByScalar(this.radius);return e},applyMatrix4:function(e){this.center.applyMatrix4(e);this.radius*=e.getMaxScaleOnAxis();return this},translate:function(e){this.center.add(e);return this},equals:function(e){return e.center.equals(this.center)&&e.radius===this.radius},clone:function(){return(new THREE.Sphere).copy(this)}};THREE.Frustum=function(e,t,n,r,i,s){this.planes=[void 0!==e?e:new THREE.Plane,void 0!==t?t:new THREE.Plane,void 0!==n?n:new THREE.Plane,void 0!==r?r:new THREE.Plane,void 0!==i?i:new THREE.Plane,void 0!==s?s:new THREE.Plane]};THREE.Frustum.prototype={constructor:THREE.Frustum,set:function(e,t,n,r,i,s){var o=this.planes;o[0].copy(e);o[1].copy(t);o[2].copy(n);o[3].copy(r);o[4].copy(i);o[5].copy(s);return this},copy:function(e){for(var t=this.planes,n=0;6>n;n++)t[n].copy(e.planes[n]);return this},setFromMatrix:function(e){var t=this.planes,n=e.elements,e=n[0],r=n[1],i=n[2],s=n[3],o=n[4],u=n[5],a=n[6],f=n[7],l=n[8],c=n[9],h=n[10],p=n[11],d=n[12],v=n[13],m=n[14],n=n[15];t[0].setComponents(s-e,f-o,p-l,n-d).normalize();t[1].setComponents(s+e,f+o,p+l,n+d).normalize();t[2].setComponents(s+r,f+u,p+c,n+v).normalize();t[3].setComponents(s-r,f-u,p-c,n-v).normalize();t[4].setComponents(s-i,f-a,p-h,n-m).normalize();t[5].setComponents(s+i,f+a,p+h,n+m).normalize();return this},intersectsObject:function(){var e=new THREE.Sphere;return function(t){var n=t.geometry;null===n.boundingSphere&&n.computeBoundingSphere();e.copy(n.boundingSphere);e.applyMatrix4(t.matrixWorld);return this.intersectsSphere(e)}}(),intersectsSphere:function(e){for(var t=this.planes,n=e.center,e=-e.radius,r=0;6>r;r++)if(t[r].distanceToPoint(n)<e)return!1;return!0},intersectsBox:function(){var e=new THREE.Vector3,t=new THREE.Vector3;return function(n){for(var r=this.planes,i=0;6>i;i++){var s=r[i];e.x=0<s.normal.x?n.min.x:n.max.x;t.x=0<s.normal.x?n.max.x:n.min.x;e.y=0<s.normal.y?n.min.y:n.max.y;t.y=0<s.normal.y?n.max.y:n.min.y;e.z=0<s.normal.z?n.min.z:n.max.z;t.z=0<s.normal.z?n.max.z:n.min.z;var o=s.distanceToPoint(e),s=s.distanceToPoint(t);if(0>o&&0>s)return!1}return!0}}(),containsPoint:function(e){for(var t=this.planes,n=0;6>n;n++)if(0>t[n].distanceToPoint(e))return!1;return!0},clone:function(){return(new THREE.Frustum).copy(this)}};THREE.Plane=function(e,t){this.normal=void 0!==e?e:new THREE.Vector3(1,0,0);this.constant=void 0!==t?t:0};THREE.Plane.prototype={constructor:THREE.Plane,set:function(e,t){this.normal.copy(e);this.constant=t;return this},setComponents:function(e,t,n,r){this.normal.set(e,t,n);this.constant=r;return this},setFromNormalAndCoplanarPoint:function(e,t){this.normal.copy(e);this.constant=-t.dot(this.normal);return this},setFromCoplanarPoints:function(){var e=new THREE.Vector3,t=new THREE.Vector3;return function(n,r,i){r=e.subVectors(i,r).cross(t.subVectors(n,r)).normalize();this.setFromNormalAndCoplanarPoint(r,n);return this}}(),copy:function(e){this.normal.copy(e.normal);this.constant=e.constant;return this},normalize:function(){var e=1/this.normal.length();this.normal.multiplyScalar(e);this.constant*=e;return this},negate:function(){this.constant*=-1;this.normal.negate();return this},distanceToPoint:function(e){return this.normal.dot(e)+this.constant},distanceToSphere:function(e){return this.distanceToPoint(e.center)-e.radius},projectPoint:function(e,t){return this.orthoPoint(e,t).sub(e).negate()},orthoPoint:function(e,t){var n=this.distanceToPoint(e);return(t||new THREE.Vector3).copy(this.normal).multiplyScalar(n)},isIntersectionLine:function(e){var t=this.distanceToPoint(e.start),e=this.distanceToPoint(e.end);return 0>t&&0<e||0>e&&0<t},intersectLine:function(){var e=new THREE.Vector3;return function(t,n){var r=n||new THREE.Vector3,i=t.delta(e),s=this.normal.dot(i);if(0==s){if(0==this.distanceToPoint(t.start))return r.copy(t.start)}else return s=-(t.start.dot(this.normal)+this.constant)/s,0>s||1<s?void 0:r.copy(i).multiplyScalar(s).add(t.start)}}(),coplanarPoint:function(e){return(e||new THREE.Vector3).copy(this.normal).multiplyScalar(-this.constant)},applyMatrix4:function(){var e=new THREE.Vector3,t=new THREE.Vector3,n=new THREE.Matrix3;return function(r,i){var s=i||n.getNormalMatrix(r),s=e.copy(this.normal).applyMatrix3(s),o=this.coplanarPoint(t);o.applyMatrix4(r);this.setFromNormalAndCoplanarPoint(s,o);return this}}(),translate:function(e){this.constant-=e.dot(this.normal);return this},equals:function(e){return e.normal.equals(this.normal)&&e.constant==this.constant},clone:function(){return(new THREE.Plane).copy(this)}};THREE.Math={PI2:2*Math.PI,generateUUID:function(){var e=\"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\".split(\"\"),t=Array(36),n=0,r;return function(){for(var i=0;36>i;i++)8==i||13==i||18==i||23==i?t[i]=\"-\":14==i?t[i]=\"4\":(2>=n&&(n=33554432+16777216*Math.random()|0),r=n&15,n>>=4,t[i]=e[19==i?r&3|8:r]);return t.join(\"\")}}(),clamp:function(e,t,n){return e<t?t:e>n?n:e},clampBottom:function(e,t){return e<t?t:e},mapLinear:function(e,t,n,r,i){return r+(e-t)*(i-r)/(n-t)},smoothstep:function(e,t,n){if(e<=t)return 0;if(e>=n)return 1;e=(e-t)/(n-t);return e*e*(3-2*e)},smootherstep:function(e,t,n){if(e<=t)return 0;if(e>=n)return 1;e=(e-t)/(n-t);return e*e*e*(e*(6*e-15)+10)},random16:function(){return(65280*Math.random()+255*Math.random())/65535},randInt:function(e,t){return e+Math.floor(Math.random()*(t-e+1))},randFloat:function(e,t){return e+Math.random()*(t-e)},randFloatSpread:function(e){return e*(.5-Math.random())},sign:function(e){return 0>e?-1:0<e?1:0},degToRad:function(){var e=Math.PI/180;return function(t){return t*e}}(),radToDeg:function(){var e=180/Math.PI;return function(t){return t*e}}()};THREE.Spline=function(e){function t(e,t,n,r,i,s,o){e=.5*(n-e);r=.5*(r-t);return(2*(t-n)+e+r)*o+(-3*(t-n)-2*e-r)*s+e*i+t}this.points=e;var n=[],r={x:0,y:0,z:0},i,s,o,u,a,f,l,c,h;this.initFromArray=function(e){this.points=[];for(var t=0;t<e.length;t++)this.points[t]={x:e[t][0],y:e[t][1],z:e[t][2]}};this.getPoint=function(e){i=(this.points.length-1)*e;s=Math.floor(i);o=i-s;n[0]=0===s?s:s-1;n[1]=s;n[2]=s>this.points.length-2?this.points.length-1:s+1;n[3]=s>this.points.length-3?this.points.length-1:s+2;f=this.points[n[0]];l=this.points[n[1]];c=this.points[n[2]];h=this.points[n[3]];u=o*o;a=o*u;r.x=t(f.x,l.x,c.x,h.x,o,u,a);r.y=t(f.y,l.y,c.y,h.y,o,u,a);r.z=t(f.z,l.z,c.z,h.z,o,u,a);return r};this.getControlPointsArray=function(){var e,t,n=this.points.length,r=[];for(e=0;e<n;e++)t=this.points[e],r[e]=[t.x,t.y,t.z];return r};this.getLength=function(e){var t,n,r,i=t=t=0,s=new THREE.Vector3,o=new THREE.Vector3,u=[],a=0;u[0]=0;e||(e=100);n=this.points.length*e;s.copy(this.points[0]);for(e=1;e<n;e++)t=e/n,r=this.getPoint(t),o.copy(r),a+=o.distanceTo(s),s.copy(r),t*=this.points.length-1,t=Math.floor(t),t!=i&&(u[t]=a,i=t);u[u.length]=a;return{chunks:u,total:a}};this.reparametrizeByArcLength=function(e){var t,n,r,i,s,o,u=[],a=new THREE.Vector3,f=this.getLength();u.push(a.copy(this.points[0]).clone());for(t=1;t<this.points.length;t++){n=f.chunks[t]-f.chunks[t-1];o=Math.ceil(e*n/f.total);i=(t-1)/(this.points.length-1);s=t/(this.points.length-1);for(n=1;n<o-1;n++)r=i+n*(1/o)*(s-i),r=this.getPoint(r),u.push(a.copy(r).clone());u.push(a.copy(this.points[t]).clone())}this.points=u}};THREE.Triangle=function(e,t,n){this.a=void 0!==e?e:new THREE.Vector3;this.b=void 0!==t?t:new THREE.Vector3;this.c=void 0!==n?n:new THREE.Vector3};THREE.Triangle.normal=function(){var e=new THREE.Vector3;return function(t,n,r,i){i=i||new THREE.Vector3;i.subVectors(r,n);e.subVectors(t,n);i.cross(e);t=i.lengthSq();return 0<t?i.multiplyScalar(1/Math.sqrt(t)):i.set(0,0,0)}}();THREE.Triangle.barycoordFromPoint=function(){var e=new THREE.Vector3,t=new THREE.Vector3,n=new THREE.Vector3;return function(r,i,s,o,u){e.subVectors(o,i);t.subVectors(s,i);n.subVectors(r,i);var r=e.dot(e),i=e.dot(t),s=e.dot(n),f=t.dot(t),o=t.dot(n),l=r*f-i*i,u=u||new THREE.Vector3;if(0==l)return u.set(-2,-1,-1);l=1/l;f=(f*s-i*o)*l;r=(r*o-i*s)*l;return u.set(1-f-r,r,f)}}();THREE.Triangle.containsPoint=function(){var e=new THREE.Vector3;return function(t,n,r,i){t=THREE.Triangle.barycoordFromPoint(t,n,r,i,e);return 0<=t.x&&0<=t.y&&1>=t.x+t.y}}();THREE.Triangle.prototype={constructor:THREE.Triangle,set:function(e,t,n){this.a.copy(e);this.b.copy(t);this.c.copy(n);return this},setFromPointsAndIndices:function(e,t,n,r){this.a.copy(e[t]);this.b.copy(e[n]);this.c.copy(e[r]);return this},copy:function(e){this.a.copy(e.a);this.b.copy(e.b);this.c.copy(e.c);return this},area:function(){var e=new THREE.Vector3,t=new THREE.Vector3;return function(){e.subVectors(this.c,this.b);t.subVectors(this.a,this.b);return.5*e.cross(t).length()}}(),midpoint:function(e){return(e||new THREE.Vector3).addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)},normal:function(e){return THREE.Triangle.normal(this.a,this.b,this.c,e)},plane:function(e){return(e||new THREE.Plane).setFromCoplanarPoints(this.a,this.b,this.c)},barycoordFromPoint:function(e,t){return THREE.Triangle.barycoordFromPoint(e,this.a,this.b,this.c,t)},containsPoint:function(e){return THREE.Triangle.containsPoint(e,this.a,this.b,this.c)},equals:function(e){return e.a.equals(this.a)&&e.b.equals(this.b)&&e.c.equals(this.c)},clone:function(){return(new THREE.Triangle).copy(this)}};THREE.Vertex=function(e){console.warn(\"THREE.Vertex has been DEPRECATED. Use THREE.Vector3 instead.\");return e};THREE.UV=function(e,t){console.warn(\"THREE.UV has been DEPRECATED. Use THREE.Vector2 instead.\");return new THREE.Vector2(e,t)};THREE.Clock=function(e){this.autoStart=void 0!==e?e:!0;this.elapsedTime=this.oldTime=this.startTime=0;this.running=!1};THREE.Clock.prototype={constructor:THREE.Clock,start:function(){this.oldTime=this.startTime=void 0!==self.performance&&void 0!==self.performance.now?self.performance.now():Date.now();this.running=!0},stop:function(){this.getElapsedTime();this.running=!1},getElapsedTime:function(){this.getDelta();return this.elapsedTime},getDelta:function(){var e=0;this.autoStart&&!this.running&&this.start();if(this.running){var t=void 0!==self.performance&&void 0!==self.performance.now?self.performance.now():Date.now(),e=.001*(t-this.oldTime);this.oldTime=t;this.elapsedTime+=e}return e}};THREE.EventDispatcher=function(){};THREE.EventDispatcher.prototype={constructor:THREE.EventDispatcher,apply:function(e){e.addEventListener=THREE.EventDispatcher.prototype.addEventListener;e.hasEventListener=THREE.EventDispatcher.prototype.hasEventListener;e.removeEventListener=THREE.EventDispatcher.prototype.removeEventListener;e.dispatchEvent=THREE.EventDispatcher.prototype.dispatchEvent},addEventListener:function(e,t){void 0===this._listeners&&(this._listeners={});var n=this._listeners;void 0===n[e]&&(n[e]=[]);-1===n[e].indexOf(t)&&n[e].push(t)},hasEventListener:function(e,t){if(void 0===this._listeners)return!1;var n=this._listeners;return void 0!==n[e]&&-1!==n[e].indexOf(t)?!0:!1},removeEventListener:function(e,t){if(void 0!==this._listeners){var n=this._listeners[e];if(void 0!==n){var r=n.indexOf(t);-1!==r&&n.splice(r,1)}}},dispatchEvent:function(){var e=[];return function(t){if(void 0!==this._listeners){var n=this._listeners[t.type];if(void 0!==n){t.target=this;for(var r=n.length,i=0;i<r;i++)e[i]=n[i];for(i=0;i<r;i++)e[i].call(this,t)}}}}()};(function(e){e.Raycaster=function(t,n,r,i){this.ray=new e.Ray(t,n);this.near=r||0;this.far=i||Infinity};var t=new e.Sphere,n=new e.Ray;new e.Plane;new e.Vector3;var r=new e.Vector3,i=new e.Matrix4,s=function(e,t){return e.distance-t.distance},o=new e.Vector3,u=new e.Vector3,a=new e.Vector3,f=function(s,l,p){if(s instanceof e.Sprite){r.setFromMatrixPosition(s.matrixWorld);var v=l.ray.distanceToPoint(r);if(v>s.scale.x)return p;p.push({distance:v,point:s.position,face:null,object:s})}else if(s instanceof e.LOD)r.setFromMatrixPosition(s.matrixWorld),v=l.ray.origin.distanceTo(r),f(s.getObjectForDistance(v),l,p);else if(s instanceof e.Mesh){var m=s.geometry;null===m.boundingSphere&&m.computeBoundingSphere();t.copy(m.boundingSphere);t.applyMatrix4(s.matrixWorld);if(!1===l.ray.isIntersectionSphere(t))return p;i.getInverse(s.matrixWorld);n.copy(l.ray).applyMatrix4(i);if(null!==m.boundingBox&&!1===n.isIntersectionBox(m.boundingBox))return p;if(m instanceof e.BufferGeometry){var y=s.material;if(void 0===y||!1===m.dynamic)return p;var w,E,S=l.precision;if(void 0!==m.attributes.index)for(var x=m.offsets,T=m.attributes.index.array,N=m.attributes.position.array,C=m.offsets.length,L=m.attributes.index.array.length/3,L=0;L<C;++L)for(var v=x[L].start,A=x[L].index,m=v,O=v+x[L].count;m<O;m+=3)v=A+T[m],w=A+T[m+1],E=A+T[m+2],o.set(N[3*v],N[3*v+1],N[3*v+2]),u.set(N[3*w],N[3*w+1],N[3*w+2]),a.set(N[3*E],N[3*E+1],N[3*E+2]),w=y.side===e.BackSide?n.intersectTriangle(a,u,o,!0):n.intersectTriangle(o,u,a,y.side!==e.DoubleSide),null!==w&&(w.applyMatrix4(s.matrixWorld),v=l.ray.origin.distanceTo(w),v<S||v<l.near||v>l.far||p.push({distance:v,point:w,face:null,faceIndex:null,object:s}));else{N=m.attributes.position.array;L=m.attributes.position.array.length;for(m=0;m<L;m+=3)v=m,w=m+1,E=m+2,o.set(N[3*v],N[3*v+1],N[3*v+2]),u.set(N[3*w],N[3*w+1],N[3*w+2]),a.set(N[3*E],N[3*E+1],N[3*E+2]),w=y.side===e.BackSide?n.intersectTriangle(a,u,o,!0):n.intersectTriangle(o,u,a,y.side!==e.DoubleSide),null!==w&&(w.applyMatrix4(s.matrixWorld),v=l.ray.origin.distanceTo(w),v<S||v<l.near||v>l.far||p.push({distance:v,point:w,face:null,faceIndex:null,object:s}))}}else if(m instanceof e.Geometry){T=s.material instanceof e.MeshFaceMaterial;N=!0===T?s.material.materials:null;S=l.precision;x=m.vertices;C=0;for(L=m.faces.length;C<L;C++)A=m.faces[C],y=!0===T?N[A.materialIndex]:s.material,void 0!==y&&(v=x[A.a],w=x[A.b],E=x[A.c],w=y.side===e.BackSide?n.intersectTriangle(E,w,v,!0):n.intersectTriangle(v,w,E,y.side!==e.DoubleSide),null!==w&&(w.applyMatrix4(s.matrixWorld),v=l.ray.origin.distanceTo(w),v<S||v<l.near||v>l.far||p.push({distance:v,point:w,face:A,faceIndex:C,object:s})))}}else if(s instanceof e.Line){S=l.linePrecision;y=S*S;m=s.geometry;null===m.boundingSphere&&m.computeBoundingSphere();t.copy(m.boundingSphere);t.applyMatrix4(s.matrixWorld);if(!1===l.ray.isIntersectionSphere(t))return p;i.getInverse(s.matrixWorld);n.copy(l.ray).applyMatrix4(i);if(m instanceof e.Geometry){x=m.vertices;S=x.length;w=new e.Vector3;E=new e.Vector3;L=s.type===e.LineStrip?1:2;for(m=0;m<S-1;m+=L)n.distanceSqToSegment(x[m],x[m+1],E,w)>y||(v=n.origin.distanceTo(E),v<l.near||v>l.far||p.push({distance:v,point:w.clone().applyMatrix4(s.matrixWorld),face:null,faceIndex:null,object:s}))}}},l=function(e,t,n){for(var e=e.getDescendants(),r=0,i=e.length;r<i;r++)f(e[r],t,n)};e.Raycaster.prototype.precision=1e-4;e.Raycaster.prototype.linePrecision=1;e.Raycaster.prototype.set=function(e,t){this.ray.set(e,t)};e.Raycaster.prototype.intersectObject=function(e,t){var n=[];!0===t&&l(e,this,n);f(e,this,n);n.sort(s);return n};e.Raycaster.prototype.intersectObjects=function(e,t){for(var n=[],r=0,i=e.length;r<i;r++)f(e[r],this,n),!0===t&&l(e[r],this,n);n.sort(s);return n}})(THREE);THREE.Object3D=function(){this.id=THREE.Object3DIdCount++;this.uuid=THREE.Math.generateUUID();this.name=\"\";this.parent=void 0;this.children=[];this.up=new THREE.Vector3(0,1,0);this.position=new THREE.Vector3;this._rotation=new THREE.Euler;this._quaternion=new THREE.Quaternion;this.scale=new THREE.Vector3(1,1,1);this._rotation._quaternion=this.quaternion;this._quaternion._euler=this.rotation;this.renderDepth=null;this.rotationAutoUpdate=!0;this.matrix=new THREE.Matrix4;this.matrixWorld=new THREE.Matrix4;this.visible=this.matrixWorldNeedsUpdate=this.matrixAutoUpdate=!0;this.receiveShadow=this.castShadow=!1;this.frustumCulled=!0;this.userData={}};THREE.Object3D.prototype={constructor:THREE.Object3D,get rotation(){return this._rotation},set rotation(e){this._rotation=e;this._rotation._quaternion=this._quaternion;this._quaternion._euler=this._rotation;this._rotation._updateQuaternion()},get quaternion(){return this._quaternion},set quaternion(e){this._quaternion=e;this._quaternion._euler=this._rotation;this._rotation._quaternion=this._quaternion;this._quaternion._updateEuler()},get eulerOrder(){console.warn(\"DEPRECATED: Object3D's .eulerOrder has been moved to Object3D's .rotation.order.\");return this.rotation.order},set eulerOrder(e){console.warn(\"DEPRECATED: Object3D's .eulerOrder has been moved to Object3D's .rotation.order.\");this.rotation.order=e},get useQuaternion(){console.warn(\"DEPRECATED: Object3D's .useQuaternion has been removed. The library now uses quaternions by default.\")},set useQuaternion(e){console.warn(\"DEPRECATED: Object3D's .useQuaternion has been removed. The library now uses quaternions by default.\")},applyMatrix:function(){var e=new THREE.Matrix4;return function(t){this.matrix.multiplyMatrices(t,this.matrix);this.position.setFromMatrixPosition(this.matrix);this.scale.setFromMatrixScale(this.matrix);e.extractRotation(this.matrix);this.quaternion.setFromRotationMatrix(e)}}(),setRotationFromAxisAngle:function(e,t){this.quaternion.setFromAxisAngle(e,t)},setRotationFromEuler:function(e){this.quaternion.setFromEuler(e,!0)},setRotationFromMatrix:function(e){this.quaternion.setFromRotationMatrix(e)},setRotationFromQuaternion:function(e){this.quaternion.copy(e)},rotateOnAxis:function(){var e=new THREE.Quaternion;return function(t,n){e.setFromAxisAngle(t,n);this.quaternion.multiply(e);return this}}(),rotateX:function(){var e=new THREE.Vector3(1,0,0);return function(t){return this.rotateOnAxis(e,t)}}(),rotateY:function(){var e=new THREE.Vector3(0,1,0);return function(t){return this.rotateOnAxis(e,t)}}(),rotateZ:function(){var e=new THREE.Vector3(0,0,1);return function(t){return this.rotateOnAxis(e,t)}}(),translateOnAxis:function(){var e=new THREE.Vector3;return function(t,n){e.copy(t);e.applyQuaternion(this.quaternion);this.position.add(e.multiplyScalar(n));return this}}(),translate:function(e,t){console.warn(\"DEPRECATED: Object3D's .translate() has been removed. Use .translateOnAxis( axis, distance ) instead. Note args have been changed.\");return this.translateOnAxis(t,e)},translateX:function(){var e=new THREE.Vector3(1,0,0);return function(t){return this.translateOnAxis(e,t)}}(),translateY:function(){var e=new THREE.Vector3(0,1,0);return function(t){return this.translateOnAxis(e,t)}}(),translateZ:function(){var e=new THREE.Vector3(0,0,1);return function(t){return this.translateOnAxis(e,t)}}(),localToWorld:function(e){return e.applyMatrix4(this.matrixWorld)},worldToLocal:function(){var e=new THREE.Matrix4;return function(t){return t.applyMatrix4(e.getInverse(this.matrixWorld))}}(),lookAt:function(){var e=new THREE.Matrix4;return function(t){e.lookAt(t,this.position,this.up);this.quaternion.setFromRotationMatrix(e)}}(),add:function(e){if(e===this)console.warn(\"THREE.Object3D.add: An object can't be added as a child of itself.\");else if(e instanceof THREE.Object3D){void 0!==e.parent&&e.parent.remove(e);e.parent=this;e.dispatchEvent({type:\"added\"});this.children.push(e);for(var t=this;void 0!==t.parent;)t=t.parent;void 0!==t&&t instanceof THREE.Scene&&t.__addObject(e)}},remove:function(e){var t=this.children.indexOf(e);if(-1!==t){e.parent=void 0;e.dispatchEvent({type:\"removed\"});this.children.splice(t,1);for(t=this;void 0!==t.parent;)t=t.parent;void 0!==t&&t instanceof THREE.Scene&&t.__removeObject(e)}},traverse:function(e){e(this);for(var t=0,n=this.children.length;t<n;t++)this.children[t].traverse(e)},getObjectById:function(e,t){for(var n=0,r=this.children.length;n<r;n++){var i=this.children[n];if(i.id===e||!0===t&&(i=i.getObjectById(e,t),void 0!==i))return i}},getObjectByName:function(e,t){for(var n=0,r=this.children.length;n<r;n++){var i=this.children[n];if(i.name===e||!0===t&&(i=i.getObjectByName(e,t),void 0!==i))return i}},getChildByName:function(e,t){console.warn(\"DEPRECATED: Object3D's .getChildByName() has been renamed to .getObjectByName().\");return this.getObjectByName(e,t)},getDescendants:function(e){void 0===e&&(e=[]);Array.prototype.push.apply(e,this.children);for(var t=0,n=this.children.length;t<n;t++)this.children[t].getDescendants(e);return e},updateMatrix:function(){this.matrix.compose(this.position,this.quaternion,this.scale);this.matrixWorldNeedsUpdate=!0},updateMatrixWorld:function(e){!0===this.matrixAutoUpdate&&this.updateMatrix();if(!0===this.matrixWorldNeedsUpdate||!0===e)void 0===this.parent?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix),this.matrixWorldNeedsUpdate=!1,e=!0;for(var t=0,n=this.children.length;t<n;t++)this.children[t].updateMatrixWorld(e)},clone:function(e,t){void 0===e&&(e=new THREE.Object3D);void 0===t&&(t=!0);e.name=this.name;e.up.copy(this.up);e.position.copy(this.position);e.quaternion.copy(this.quaternion);e.scale.copy(this.scale);e.renderDepth=this.renderDepth;e.rotationAutoUpdate=this.rotationAutoUpdate;e.matrix.copy(this.matrix);e.matrixWorld.copy(this.matrixWorld);e.matrixAutoUpdate=this.matrixAutoUpdate;e.matrixWorldNeedsUpdate=this.matrixWorldNeedsUpdate;e.visible=this.visible;e.castShadow=this.castShadow;e.receiveShadow=this.receiveShadow;e.frustumCulled=this.frustumCulled;e.userData=JSON.parse(JSON.stringify(this.userData));if(!0===t)for(var n=0;n<this.children.length;n++)e.add(this.children[n].clone());return e}};THREE.EventDispatcher.prototype.apply(THREE.Object3D.prototype);THREE.Object3DIdCount=0;THREE.Projector=function(){function e(){if(a===l){var e=new THREE.RenderableVertex;f.push(e);l++;a++;return e}return f[a++]}function t(e,t){return e.z!==t.z?t.z-e.z:e.id!==t.id?e.id-t.id:0}function n(e,t){var n=0,r=1,i=e.z+e.w,s=t.z+t.w,o=-e.z+e.w,u=-t.z+t.w;if(0<=i&&0<=s&&0<=o&&0<=u)return!0;if(0>i&&0>s||0>o&&0>u)return!1;0>i?n=Math.max(n,i/(i-s)):0>s&&(r=Math.min(r,i/(i-s)));0>o?n=Math.max(n,o/(o-u)):0>u&&(r=Math.min(r,o/(o-u)));if(r<n)return!1;e.lerp(t,n);t.lerp(e,1-r);return!0}var r,i,s=[],o=0,u,a,f=[],l=0,c,h,p=[],d=0,v,m,g=[],y=0,b,w,E=[],S=0,x={objects:[],sprites:[],lights:[],elements:[]},T=new THREE.Vector3,N=new THREE.Vector4,C=new THREE.Box3(new THREE.Vector3(-1,-1,-1),new THREE.Vector3(1,1,1)),k=new THREE.Box3,L=Array(3),A=new THREE.Matrix4,O=new THREE.Matrix4,M,_=new THREE.Matrix4,D=new THREE.Matrix3,P=new THREE.Matrix3,H=new THREE.Vector3,B=new THREE.Frustum,j=new THREE.Vector4,F=new THREE.Vector4;this.projectVector=function(e,t){t.matrixWorldInverse.getInverse(t.matrixWorld);O.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse);return e.applyProjection(O)};this.unprojectVector=function(e,t){t.projectionMatrixInverse.getInverse(t.projectionMatrix);O.multiplyMatrices(t.matrixWorld,t.projectionMatrixInverse);return e.applyProjection(O)};this.pickingRay=function(e,t){e.z=-1;var n=new THREE.Vector3(e.x,e.y,1);this.unprojectVector(e,t);this.unprojectVector(n,t);n.sub(e).normalize();return new THREE.Raycaster(e,n)};var I=function(e){if(i===o){var t=new THREE.RenderableObject;s.push(t);o++;i++;r=t}else r=s[i++];r.id=e.id;r.object=e;null!==e.renderDepth?r.z=e.renderDepth:(T.setFromMatrixPosition(e.matrixWorld),T.applyProjection(O),r.z=T.z);return r},q=function(e){if(!1!==e.visible){e instanceof THREE.Light?x.lights.push(e):e instanceof THREE.Mesh||e instanceof THREE.Line?(!1===e.frustumCulled||!0===B.intersectsObject(e))&&x.objects.push(I(e)):e instanceof THREE.Sprite&&x.sprites.push(I(e));for(var t=0,n=e.children.length;t<n;t++)q(e.children[t])}};this.projectScene=function(r,s,o,l){var T=!1,I,U,W,X,V,$,Q,Y,Z,et,tt,nt;w=m=h=0;x.elements.length=0;!0===r.autoUpdate&&r.updateMatrixWorld();void 0===s.parent&&s.updateMatrixWorld();A.copy(s.matrixWorldInverse.getInverse(s.matrixWorld));O.multiplyMatrices(s.projectionMatrix,A);P.getNormalMatrix(A);B.setFromMatrix(O);i=0;x.objects.length=0;x.sprites.length=0;x.lights.length=0;q(r);!0===o&&x.objects.sort(t);r=0;for(o=x.objects.length;r<o;r++)if(Q=x.objects[r].object,M=Q.matrixWorld,a=0,Q instanceof THREE.Mesh){Y=Q.geometry;W=Y.vertices;Z=Y.faces;Y=Y.faceVertexUvs;D.getNormalMatrix(M);tt=Q.material instanceof THREE.MeshFaceMaterial;nt=!0===tt?Q.material:null;I=0;for(U=W.length;I<U;I++){u=e();u.positionWorld.copy(W[I]).applyMatrix4(M);u.positionScreen.copy(u.positionWorld).applyMatrix4(O);var rt=1/u.positionScreen.w;u.positionScreen.x*=rt;u.positionScreen.y*=rt;u.positionScreen.z*=rt;u.visible=!(-1>u.positionScreen.x||1<u.positionScreen.x||-1>u.positionScreen.y||1<u.positionScreen.y||-1>u.positionScreen.z||1<u.positionScreen.z)}W=0;for(I=Z.length;W<I;W++)if(U=Z[W],rt=!0===tt?nt.materials[U.materialIndex]:Q.material,void 0!==rt&&($=rt.side,X=f[U.a],V=f[U.b],et=f[U.c],L[0]=X.positionScreen,L[1]=V.positionScreen,L[2]=et.positionScreen,!0===X.visible||!0===V.visible||!0===et.visible||C.isIntersectionBox(k.setFromPoints(L))))if(T=0>(et.positionScreen.x-X.positionScreen.x)*(V.positionScreen.y-X.positionScreen.y)-(et.positionScreen.y-X.positionScreen.y)*(V.positionScreen.x-X.positionScreen.x),$===THREE.DoubleSide||T===($===THREE.FrontSide)){if(h===d){var it=new THREE.RenderableFace3;p.push(it);d++;h++;c=it}else c=p[h++];c.id=Q.id;c.v1.copy(X);c.v2.copy(V);c.v3.copy(et);c.normalModel.copy(U.normal);!1===T&&($===THREE.BackSide||$===THREE.DoubleSide)&&c.normalModel.negate();c.normalModel.applyMatrix3(D).normalize();c.normalModelView.copy(c.normalModel).applyMatrix3(P);c.centroidModel.copy(U.centroid).applyMatrix4(M);et=U.vertexNormals;X=0;for(V=Math.min(et.length,3);X<V;X++)it=c.vertexNormalsModel[X],it.copy(et[X]),!1===T&&($===THREE.BackSide||$===THREE.DoubleSide)&&it.negate(),it.applyMatrix3(D).normalize(),c.vertexNormalsModelView[X].copy(it).applyMatrix3(P);c.vertexNormalsLength=et.length;T=0;for(X=Math.min(Y.length,3);T<X;T++)if(et=Y[T][W],void 0!==et){V=0;for($=et.length;V<$;V++)c.uvs[T][V]=et[V]}c.color=U.color;c.material=rt;H.copy(c.centroidModel).applyProjection(O);c.z=H.z;x.elements.push(c)}}else if(Q instanceof THREE.Line){_.multiplyMatrices(O,M);W=Q.geometry.vertices;X=e();X.positionScreen.copy(W[0]).applyMatrix4(_);Z=Q.type===THREE.LinePieces?2:1;I=1;for(U=W.length;I<U;I++)X=e(),X.positionScreen.copy(W[I]).applyMatrix4(_),0<(I+1)%Z||(V=f[a-2],j.copy(X.positionScreen),F.copy(V.positionScreen),!0===n(j,F)&&(j.multiplyScalar(1/j.w),F.multiplyScalar(1/F.w),m===y?(Y=new THREE.RenderableLine,g.push(Y),y++,m++,v=Y):v=g[m++],v.id=Q.id,v.v1.positionScreen.copy(j),v.v2.positionScreen.copy(F),v.z=Math.max(j.z,F.z),v.material=Q.material,Q.material.vertexColors===THREE.VertexColors&&(v.vertexColors[0].copy(Q.geometry.colors[I]),v.vertexColors[1].copy(Q.geometry.colors[I-1])),x.elements.push(v)))}r=0;for(o=x.sprites.length;r<o;r++)Q=x.sprites[r].object,M=Q.matrixWorld,N.set(M.elements[12],M.elements[13],M.elements[14],1),N.applyMatrix4(O),rt=1/N.w,N.z*=rt,-1<=N.z&&1>=N.z&&(w===S?(Z=new THREE.RenderableSprite,E.push(Z),S++,w++,b=Z):b=E[w++],b.id=Q.id,b.x=N.x*rt,b.y=N.y*rt,b.z=N.z,b.object=Q,b.rotation=Q.rotation,b.scale.x=Q.scale.x*Math.abs(b.x-(N.x+s.projectionMatrix.elements[0])/(N.w+s.projectionMatrix.elements[12])),b.scale.y=Q.scale.y*Math.abs(b.y-(N.y+s.projectionMatrix.elements[5])/(N.w+s.projectionMatrix.elements[13])),b.material=Q.material,x.elements.push(b));!0===l&&x.elements.sort(t);return x}};THREE.Face3=function(e,t,n,r,i,s){this.a=e;this.b=t;this.c=n;this.normal=r instanceof THREE.Vector3?r:new THREE.Vector3;this.vertexNormals=r instanceof Array?r:[];this.color=i instanceof THREE.Color?i:new THREE.Color;this.vertexColors=i instanceof Array?i:[];this.vertexTangents=[];this.materialIndex=void 0!==s?s:0;this.centroid=new THREE.Vector3};THREE.Face3.prototype={constructor:THREE.Face3,clone:function(){var e=new THREE.Face3(this.a,this.b,this.c);e.normal.copy(this.normal);e.color.copy(this.color);e.centroid.copy(this.centroid);e.materialIndex=this.materialIndex;var t,n;t=0;for(n=this.vertexNormals.length;t<n;t++)e.vertexNormals[t]=this.vertexNormals[t].clone();t=0;for(n=this.vertexColors.length;t<n;t++)e.vertexColors[t]=this.vertexColors[t].clone();t=0;for(n=this.vertexTangents.length;t<n;t++)e.vertexTangents[t]=this.vertexTangents[t].clone();return e}};THREE.Face4=function(e,t,n,r,i,s,o){console.warn(\"THREE.Face4 has been removed. A THREE.Face3 will be created instead.\");return new THREE.Face3(e,t,n,i,s,o)};THREE.Geometry=function(){this.id=THREE.GeometryIdCount++;this.uuid=THREE.Math.generateUUID();this.name=\"\";this.vertices=[];this.colors=[];this.faces=[];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphColors=[];this.morphNormals=[];this.skinWeights=[];this.skinIndices=[];this.lineDistances=[];this.boundingSphere=this.boundingBox=null;this.hasTangents=!1;this.dynamic=!0;this.buffersNeedUpdate=this.lineDistancesNeedUpdate=this.colorsNeedUpdate=this.tangentsNeedUpdate=this.normalsNeedUpdate=this.uvsNeedUpdate=this.elementsNeedUpdate=this.verticesNeedUpdate=!1};THREE.Geometry.prototype={constructor:THREE.Geometry,applyMatrix:function(e){for(var t=(new THREE.Matrix3).getNormalMatrix(e),n=0,r=this.vertices.length;n<r;n++)this.vertices[n].applyMatrix4(e);n=0;for(r=this.faces.length;n<r;n++){var i=this.faces[n];i.normal.applyMatrix3(t).normalize();for(var s=0,o=i.vertexNormals.length;s<o;s++)i.vertexNormals[s].applyMatrix3(t).normalize();i.centroid.applyMatrix4(e)}this.boundingBox instanceof THREE.Box3&&this.computeBoundingBox();this.boundingSphere instanceof THREE.Sphere&&this.computeBoundingSphere()},computeCentroids:function(){var e,t,n;e=0;for(t=this.faces.length;e<t;e++)n=this.faces[e],n.centroid.set(0,0,0),n.centroid.add(this.vertices[n.a]),n.centroid.add(this.vertices[n.b]),n.centroid.add(this.vertices[n.c]),n.centroid.divideScalar(3)},computeFaceNormals:function(){for(var e=new THREE.Vector3,t=new THREE.Vector3,n=0,r=this.faces.length;n<r;n++){var i=this.faces[n],s=this.vertices[i.a],o=this.vertices[i.b];e.subVectors(this.vertices[i.c],o);t.subVectors(s,o);e.cross(t);e.normalize();i.normal.copy(e)}},computeVertexNormals:function(e){var t,n,r,i;if(void 0===this.__tmpVertices){i=this.__tmpVertices=Array(this.vertices.length);t=0;for(n=this.vertices.length;t<n;t++)i[t]=new THREE.Vector3;t=0;for(n=this.faces.length;t<n;t++)r=this.faces[t],r.vertexNormals=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3]}else{i=this.__tmpVertices;t=0;for(n=this.vertices.length;t<n;t++)i[t].set(0,0,0)}if(e){var s,o,u=new THREE.Vector3,a=new THREE.Vector3;new THREE.Vector3;new THREE.Vector3;new THREE.Vector3;t=0;for(n=this.faces.length;t<n;t++)r=this.faces[t],e=this.vertices[r.a],s=this.vertices[r.b],o=this.vertices[r.c],u.subVectors(o,s),a.subVectors(e,s),u.cross(a),i[r.a].add(u),i[r.b].add(u),i[r.c].add(u)}else{t=0;for(n=this.faces.length;t<n;t++)r=this.faces[t],i[r.a].add(r.normal),i[r.b].add(r.normal),i[r.c].add(r.normal)}t=0;for(n=this.vertices.length;t<n;t++)i[t].normalize();t=0;for(n=this.faces.length;t<n;t++)r=this.faces[t],r.vertexNormals[0].copy(i[r.a]),r.vertexNormals[1].copy(i[r.b]),r.vertexNormals[2].copy(i[r.c])},computeMorphNormals:function(){var e,t,n,r,i;n=0;for(r=this.faces.length;n<r;n++){i=this.faces[n];i.__originalFaceNormal?i.__originalFaceNormal.copy(i.normal):i.__originalFaceNormal=i.normal.clone();i.__originalVertexNormals||(i.__originalVertexNormals=[]);e=0;for(t=i.vertexNormals.length;e<t;e++)i.__originalVertexNormals[e]?i.__originalVertexNormals[e].copy(i.vertexNormals[e]):i.__originalVertexNormals[e]=i.vertexNormals[e].clone()}var s=new THREE.Geometry;s.faces=this.faces;e=0;for(t=this.morphTargets.length;e<t;e++){if(!this.morphNormals[e]){this.morphNormals[e]={};this.morphNormals[e].faceNormals=[];this.morphNormals[e].vertexNormals=[];i=this.morphNormals[e].faceNormals;var o=this.morphNormals[e].vertexNormals,u,a;n=0;for(r=this.faces.length;n<r;n++)u=new THREE.Vector3,a={a:new THREE.Vector3,b:new THREE.Vector3,c:new THREE.Vector3},i.push(u),o.push(a)}o=this.morphNormals[e];s.vertices=this.morphTargets[e].vertices;s.computeFaceNormals();s.computeVertexNormals();n=0;for(r=this.faces.length;n<r;n++)i=this.faces[n],u=o.faceNormals[n],a=o.vertexNormals[n],u.copy(i.normal),a.a.copy(i.vertexNormals[0]),a.b.copy(i.vertexNormals[1]),a.c.copy(i.vertexNormals[2])}n=0;for(r=this.faces.length;n<r;n++)i=this.faces[n],i.normal=i.__originalFaceNormal,i.vertexNormals=i.__originalVertexNormals},computeTangents:function(){var e,t,n,r,i,s,o,u,a,f,l,c,h,p,d,v,m,g=[],y=[];n=new THREE.Vector3;var b=new THREE.Vector3,w=new THREE.Vector3,E=new THREE.Vector3,S=new THREE.Vector3;e=0;for(t=this.vertices.length;e<t;e++)g[e]=new THREE.Vector3,y[e]=new THREE.Vector3;e=0;for(t=this.faces.length;e<t;e++)i=this.faces[e],s=this.faceVertexUvs[0][e],r=i.a,m=i.b,i=i.c,o=this.vertices[r],u=this.vertices[m],a=this.vertices[i],f=s[0],l=s[1],c=s[2],s=u.x-o.x,h=a.x-o.x,p=u.y-o.y,d=a.y-o.y,u=u.z-o.z,o=a.z-o.z,a=l.x-f.x,v=c.x-f.x,l=l.y-f.y,f=c.y-f.y,c=1/(a*f-v*l),n.set((f*s-l*h)*c,(f*p-l*d)*c,(f*u-l*o)*c),b.set((a*h-v*s)*c,(a*d-v*p)*c,(a*o-v*u)*c),g[r].add(n),g[m].add(n),g[i].add(n),y[r].add(b),y[m].add(b),y[i].add(b);b=[\"a\",\"b\",\"c\",\"d\"];e=0;for(t=this.faces.length;e<t;e++){i=this.faces[e];for(n=0;n<Math.min(i.vertexNormals.length,3);n++)S.copy(i.vertexNormals[n]),r=i[b[n]],m=g[r],w.copy(m),w.sub(S.multiplyScalar(S.dot(m))).normalize(),E.crossVectors(i.vertexNormals[n],m),r=E.dot(y[r]),r=0>r?-1:1,i.vertexTangents[n]=new THREE.Vector4(w.x,w.y,w.z,r)}this.hasTangents=!0},computeLineDistances:function(){for(var e=0,t=this.vertices,n=0,r=t.length;n<r;n++)0<n&&(e+=t[n].distanceTo(t[n-1])),this.lineDistances[n]=e},computeBoundingBox:function(){null===this.boundingBox&&(this.boundingBox=new THREE.Box3);this.boundingBox.setFromPoints(this.vertices)},computeBoundingSphere:function(){null===this.boundingSphere&&(this.boundingSphere=new THREE.Sphere);this.boundingSphere.setFromPoints(this.vertices)},mergeVertices:function(){var e={},t=[],n=[],r,i=Math.pow(10,4),s,o;this.__tmpVertices=void 0;s=0;for(o=this.vertices.length;s<o;s++)r=this.vertices[s],r=Math.round(r.x*i)+\"_\"+Math.round(r.y*i)+\"_\"+Math.round(r.z*i),void 0===e[r]?(e[r]=s,t.push(this.vertices[s]),n[s]=t.length-1):n[s]=n[e[r]];e=[];s=0;for(o=this.faces.length;s<o;s++){i=this.faces[s];i.a=n[i.a];i.b=n[i.b];i.c=n[i.c];i=[i.a,i.b,i.c];for(r=0;3>r;r++)if(i[r]==i[(r+1)%3]){e.push(s);break}}for(s=e.length-1;0<=s;s--){i=e[s];this.faces.splice(i,1);n=0;for(o=this.faceVertexUvs.length;n<o;n++)this.faceVertexUvs[n].splice(i,1)}s=this.vertices.length-t.length;this.vertices=t;return s},clone:function(){for(var e=new THREE.Geometry,t=this.vertices,n=0,r=t.length;n<r;n++)e.vertices.push(t[n].clone());t=this.faces;n=0;for(r=t.length;n<r;n++)e.faces.push(t[n].clone());t=this.faceVertexUvs[0];n=0;for(r=t.length;n<r;n++){for(var i=t[n],s=[],o=0,u=i.length;o<u;o++)s.push(new THREE.Vector2(i[o].x,i[o].y));e.faceVertexUvs[0].push(s)}return e},dispose:function(){this.dispatchEvent({type:\"dispose\"})}};THREE.EventDispatcher.prototype.apply(THREE.Geometry.prototype);THREE.GeometryIdCount=0;THREE.BufferGeometry=function(){this.id=THREE.GeometryIdCount++;this.uuid=THREE.Math.generateUUID();this.name=\"\";this.attributes={};this.dynamic=!0;this.offsets=[];this.boundingSphere=this.boundingBox=null;this.hasTangents=!1;this.morphTargets=[]};THREE.BufferGeometry.prototype={constructor:THREE.BufferGeometry,addAttribute:function(e,t,n,r){this.attributes[e]={itemSize:r,array:new t(n*r)}},applyMatrix:function(e){var t,n;this.attributes.position&&(t=this.attributes.position.array);this.attributes.normal&&(n=this.attributes.normal.array);void 0!==t&&(e.multiplyVector3Array(t),this.verticesNeedUpdate=!0);void 0!==n&&((new THREE.Matrix3).getNormalMatrix(e).multiplyVector3Array(n),this.normalizeNormals(),this.normalsNeedUpdate=!0)},computeBoundingBox:function(){null===this.boundingBox&&(this.boundingBox=new THREE.Box3);var e=this.attributes.position.array;if(e){var t=this.boundingBox,n,r,i;3<=e.length&&(t.min.x=t.max.x=e[0],t.min.y=t.max.y=e[1],t.min.z=t.max.z=e[2]);for(var s=3,o=e.length;s<o;s+=3)n=e[s],r=e[s+1],i=e[s+2],n<t.min.x?t.min.x=n:n>t.max.x&&(t.max.x=n),r<t.min.y?t.min.y=r:r>t.max.y&&(t.max.y=r),i<t.min.z?t.min.z=i:i>t.max.z&&(t.max.z=i)}if(void 0===e||0===e.length)this.boundingBox.min.set(0,0,0),this.boundingBox.max.set(0,0,0)},computeBoundingSphere:function(){var e=new THREE.Box3,t=new THREE.Vector3;return function(){null===this.boundingSphere&&(this.boundingSphere=new THREE.Sphere);var n=this.attributes.position.array;if(n){for(var r=this.boundingSphere.center,i=0,s=n.length;i<s;i+=3)t.set(n[i],n[i+1],n[i+2]),e.addPoint(t);e.center(r);for(var o=0,i=0,s=n.length;i<s;i+=3)t.set(n[i],n[i+1],n[i+2]),o=Math.max(o,r.distanceToSquared(t));this.boundingSphere.radius=Math.sqrt(o)}}}(),computeVertexNormals:function(){if(this.attributes.position){var e,t,n,r;e=this.attributes.position.array.length;if(void 0===this.attributes.normal)this.attributes.normal={itemSize:3,array:new Float32Array(e)};else{e=0;for(t=this.attributes.normal.array.length;e<t;e++)this.attributes.normal.array[e]=0}var i=this.attributes.position.array,s=this.attributes.normal.array,o,u,a,f,l,c,h=new THREE.Vector3,p=new THREE.Vector3,d=new THREE.Vector3,v=new THREE.Vector3,m=new THREE.Vector3;if(this.attributes.index){var g=this.attributes.index.array,y=this.offsets;n=0;for(r=y.length;n<r;++n){t=y[n].start;o=y[n].count;var b=y[n].index;e=t;for(t+=o;e<t;e+=3)o=b+g[e],u=b+g[e+1],a=b+g[e+2],f=i[3*o],l=i[3*o+1],c=i[3*o+2],h.set(f,l,c),f=i[3*u],l=i[3*u+1],c=i[3*u+2],p.set(f,l,c),f=i[3*a],l=i[3*a+1],c=i[3*a+2],d.set(f,l,c),v.subVectors(d,p),m.subVectors(h,p),v.cross(m),s[3*o]+=v.x,s[3*o+1]+=v.y,s[3*o+2]+=v.z,s[3*u]+=v.x,s[3*u+1]+=v.y,s[3*u+2]+=v.z,s[3*a]+=v.x,s[3*a+1]+=v.y,s[3*a+2]+=v.z}}else{e=0;for(t=i.length;e<t;e+=9)f=i[e],l=i[e+1],c=i[e+2],h.set(f,l,c),f=i[e+3],l=i[e+4],c=i[e+5],p.set(f,l,c),f=i[e+6],l=i[e+7],c=i[e+8],d.set(f,l,c),v.subVectors(d,p),m.subVectors(h,p),v.cross(m),s[e]=v.x,s[e+1]=v.y,s[e+2]=v.z,s[e+3]=v.x,s[e+4]=v.y,s[e+5]=v.z,s[e+6]=v.x,s[e+7]=v.y,s[e+8]=v.z}this.normalizeNormals();this.normalsNeedUpdate=!0}},normalizeNormals:function(){for(var e=this.attributes.normal.array,t,n,r,i=0,s=e.length;i<s;i+=3)t=e[i],n=e[i+1],r=e[i+2],t=1/Math.sqrt(t*t+n*n+r*r),e[i]*=t,e[i+1]*=t,e[i+2]*=t},computeTangents:function(){function e(e){B.x=r[3*e];B.y=r[3*e+1];B.z=r[3*e+2];j.copy(B);I=u[e];P.copy(I);P.sub(B.multiplyScalar(B.dot(I))).normalize();H.crossVectors(j,I);q=H.dot(a[e]);F=0>q?-1:1;o[4*e]=P.x;o[4*e+1]=P.y;o[4*e+2]=P.z;o[4*e+3]=F}if(void 0===this.attributes.index||void 0===this.attributes.position||void 0===this.attributes.normal||void 0===this.attributes.uv)console.warn(\"Missing required attributes (index, position, normal or uv) in BufferGeometry.computeTangents()\");else{var t=this.attributes.index.array,n=this.attributes.position.array,r=this.attributes.normal.array,i=this.attributes.uv.array,s=n.length/3;void 0===this.attributes.tangent&&(this.attributes.tangent={itemSize:4,array:new Float32Array(4*s)});for(var o=this.attributes.tangent.array,u=[],a=[],f=0;f<s;f++)u[f]=new THREE.Vector3,a[f]=new THREE.Vector3;var l,c,h,p,d,v,m,g,y,b,w,E,S,x,T,s=new THREE.Vector3,f=new THREE.Vector3,N,C,k,L,A,O,M,_=this.offsets;k=0;for(L=_.length;k<L;++k){C=_[k].start;A=_[k].count;var D=_[k].index;N=C;for(C+=A;N<C;N+=3)A=D+t[N],O=D+t[N+1],M=D+t[N+2],l=n[3*A],c=n[3*A+1],h=n[3*A+2],p=n[3*O],d=n[3*O+1],v=n[3*O+2],m=n[3*M],g=n[3*M+1],y=n[3*M+2],b=i[2*A],w=i[2*A+1],E=i[2*O],S=i[2*O+1],x=i[2*M],T=i[2*M+1],p-=l,l=m-l,d-=c,c=g-c,v-=h,h=y-h,E-=b,b=x-b,S-=w,w=T-w,T=1/(E*w-b*S),s.set((w*p-S*l)*T,(w*d-S*c)*T,(w*v-S*h)*T),f.set((E*l-b*p)*T,(E*c-b*d)*T,(E*h-b*v)*T),u[A].add(s),u[O].add(s),u[M].add(s),a[A].add(f),a[O].add(f),a[M].add(f)}var P=new THREE.Vector3,H=new THREE.Vector3,B=new THREE.Vector3,j=new THREE.Vector3,F,I,q;k=0;for(L=_.length;k<L;++k){C=_[k].start;A=_[k].count;D=_[k].index;N=C;for(C+=A;N<C;N+=3)A=D+t[N],O=D+t[N+1],M=D+t[N+2],e(A),e(O),e(M)}this.tangentsNeedUpdate=this.hasTangents=!0}},clone:function(){var e=new THREE.BufferGeometry,t=[Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array],n;for(n in this.attributes){for(var r=this.attributes[n],i=r.array,s={itemSize:r.itemSize,numItems:r.numItems,array:null},r=0,o=t.length;r<o;r++){var u=t[r];if(i instanceof u){s.array=new u(i);break}}e.attributes[n]=s}r=0;for(o=this.offsets.length;r<o;r++)t=this.offsets[r],e.offsets.push({start:t.start,index:t.index,count:t.count});return e},dispose:function(){this.dispatchEvent({type:\"dispose\"})}};THREE.EventDispatcher.prototype.apply(THREE.BufferGeometry.prototype);THREE.Camera=function(){THREE.Object3D.call(this);this.matrixWorldInverse=new THREE.Matrix4;this.projectionMatrix=new THREE.Matrix4;this.projectionMatrixInverse=new THREE.Matrix4};THREE.Camera.prototype=Object.create(THREE.Object3D.prototype);THREE.Camera.prototype.lookAt=function(){var e=new THREE.Matrix4;return function(t){e.lookAt(this.position,t,this.up);this.quaternion.setFromRotationMatrix(e)}}();THREE.Camera.prototype.clone=function(e){void 0===e&&(e=new THREE.Camera);THREE.Object3D.prototype.clone.call(this,e);e.matrixWorldInverse.copy(this.matrixWorldInverse);e.projectionMatrix.copy(this.projectionMatrix);e.projectionMatrixInverse.copy(this.projectionMatrixInverse);return e};THREE.OrthographicCamera=function(e,t,n,r,i,s){THREE.Camera.call(this);this.left=e;this.right=t;this.top=n;this.bottom=r;this.near=void 0!==i?i:.1;this.far=void 0!==s?s:2e3;this.updateProjectionMatrix()};THREE.OrthographicCamera.prototype=Object.create(THREE.Camera.prototype);THREE.OrthographicCamera.prototype.updateProjectionMatrix=function(){this.projectionMatrix.makeOrthographic(this.left,this.right,this.top,this.bottom,this.near,this.far)};THREE.OrthographicCamera.prototype.clone=function(){var e=new THREE.OrthographicCamera;THREE.Camera.prototype.clone.call(this,e);e.left=this.left;e.right=this.right;e.top=this.top;e.bottom=this.bottom;e.near=this.near;e.far=this.far;return e};THREE.PerspectiveCamera=function(e,t,n,r){THREE.Camera.call(this);this.fov=void 0!==e?e:50;this.aspect=void 0!==t?t:1;this.near=void 0!==n?n:.1;this.far=void 0!==r?r:2e3;this.updateProjectionMatrix()};THREE.PerspectiveCamera.prototype=Object.create(THREE.Camera.prototype);THREE.PerspectiveCamera.prototype.setLens=function(e,t){void 0===t&&(t=24);this.fov=2*THREE.Math.radToDeg(Math.atan(t/(2*e)));this.updateProjectionMatrix()};THREE.PerspectiveCamera.prototype.setViewOffset=function(e,t,n,r,i,s){this.fullWidth=e;this.fullHeight=t;this.x=n;this.y=r;this.width=i;this.height=s;this.updateProjectionMatrix()};THREE.PerspectiveCamera.prototype.updateProjectionMatrix=function(){if(this.fullWidth){var e=this.fullWidth/this.fullHeight,t=Math.tan(THREE.Math.degToRad(.5*this.fov))*this.near,n=-t,r=e*n,e=Math.abs(e*t-r),n=Math.abs(t-n);this.projectionMatrix.makeFrustum(r+this.x*e/this.fullWidth,r+(this.x+this.width)*e/this.fullWidth,t-(this.y+this.height)*n/this.fullHeight,t-this.y*n/this.fullHeight,this.near,this.far)}else this.projectionMatrix.makePerspective(this.fov,this.aspect,this.near,this.far)};THREE.PerspectiveCamera.prototype.clone=function(){var e=new THREE.PerspectiveCamera;THREE.Camera.prototype.clone.call(this,e);e.fov=this.fov;e.aspect=this.aspect;e.near=this.near;e.far=this.far;return e};THREE.Light=function(e){THREE.Object3D.call(this);this.color=new THREE.Color(e)};THREE.Light.prototype=Object.create(THREE.Object3D.prototype);THREE.Light.prototype.clone=function(e){void 0===e&&(e=new THREE.Light);THREE.Object3D.prototype.clone.call(this,e);e.color.copy(this.color);return e};THREE.AmbientLight=function(e){THREE.Light.call(this,e)};THREE.AmbientLight.prototype=Object.create(THREE.Light.prototype);THREE.AmbientLight.prototype.clone=function(){var e=new THREE.AmbientLight;THREE.Light.prototype.clone.call(this,e);return e};THREE.AreaLight=function(e,t){THREE.Light.call(this,e);this.normal=new THREE.Vector3(0,-1,0);this.right=new THREE.Vector3(1,0,0);this.intensity=void 0!==t?t:1;this.height=this.width=1;this.constantAttenuation=1.5;this.linearAttenuation=.5;this.quadraticAttenuation=.1};THREE.AreaLight.prototype=Object.create(THREE.Light.prototype);THREE.DirectionalLight=function(e,t){THREE.Light.call(this,e);this.position.set(0,1,0);this.target=new THREE.Object3D;this.intensity=void 0!==t?t:1;this.onlyShadow=this.castShadow=!1;this.shadowCameraNear=50;this.shadowCameraFar=5e3;this.shadowCameraLeft=-500;this.shadowCameraTop=this.shadowCameraRight=500;this.shadowCameraBottom=-500;this.shadowCameraVisible=!1;this.shadowBias=0;this.shadowDarkness=.5;this.shadowMapHeight=this.shadowMapWidth=512;this.shadowCascade=!1;this.shadowCascadeOffset=new THREE.Vector3(0,0,-1e3);this.shadowCascadeCount=2;this.shadowCascadeBias=[0,0,0];this.shadowCascadeWidth=[512,512,512];this.shadowCascadeHeight=[512,512,512];this.shadowCascadeNearZ=[-1,.99,.998];this.shadowCascadeFarZ=[.99,.998,1];this.shadowCascadeArray=[];this.shadowMatrix=this.shadowCamera=this.shadowMapSize=this.shadowMap=null};THREE.DirectionalLight.prototype=Object.create(THREE.Light.prototype);THREE.DirectionalLight.prototype.clone=function(){var e=new THREE.DirectionalLight;THREE.Light.prototype.clone.call(this,e);e.target=this.target.clone();e.intensity=this.intensity;e.castShadow=this.castShadow;e.onlyShadow=this.onlyShadow;return e};THREE.HemisphereLight=function(e,t,n){THREE.Light.call(this,e);this.position.set(0,100,0);this.groundColor=new THREE.Color(t);this.intensity=void 0!==n?n:1};THREE.HemisphereLight.prototype=Object.create(THREE.Light.prototype);THREE.HemisphereLight.prototype.clone=function(){var e=new THREE.HemisphereLight;THREE.Light.prototype.clone.call(this,e);e.groundColor.copy(this.groundColor);e.intensity=this.intensity;return e};THREE.PointLight=function(e,t,n){THREE.Light.call(this,e);this.intensity=void 0!==t?t:1;this.distance=void 0!==n?n:0};THREE.PointLight.prototype=Object.create(THREE.Light.prototype);THREE.PointLight.prototype.clone=function(){var e=new THREE.PointLight;THREE.Light.prototype.clone.call(this,e);e.intensity=this.intensity;e.distance=this.distance;return e};THREE.SpotLight=function(e,t,n,r,i){THREE.Light.call(this,e);this.position.set(0,1,0);this.target=new THREE.Object3D;this.intensity=void 0!==t?t:1;this.distance=void 0!==n?n:0;this.angle=void 0!==r?r:Math.PI/3;this.exponent=void 0!==i?i:10;this.onlyShadow=this.castShadow=!1;this.shadowCameraNear=50;this.shadowCameraFar=5e3;this.shadowCameraFov=50;this.shadowCameraVisible=!1;this.shadowBias=0;this.shadowDarkness=.5;this.shadowMapHeight=this.shadowMapWidth=512;this.shadowMatrix=this.shadowCamera=this.shadowMapSize=this.shadowMap=null};THREE.SpotLight.prototype=Object.create(THREE.Light.prototype);THREE.SpotLight.prototype.clone=function(){var e=new THREE.SpotLight;THREE.Light.prototype.clone.call(this,e);e.target=this.target.clone();e.intensity=this.intensity;e.distance=this.distance;e.angle=this.angle;e.exponent=this.exponent;e.castShadow=this.castShadow;e.onlyShadow=this.onlyShadow;return e};THREE.Loader=function(e){this.statusDomElement=(this.showStatus=e)?THREE.Loader.prototype.addStatusElement():null;this.onLoadStart=function(){};this.onLoadProgress=function(){};this.onLoadComplete=function(){}};THREE.Loader.prototype={constructor:THREE.Loader,crossOrigin:\"anonymous\",addStatusElement:function(){var e=document.createElement(\"div\");e.style.position=\"absolute\";e.style.right=\"0px\";e.style.top=\"0px\";e.style.fontSize=\"0.8em\";e.style.textAlign=\"left\";e.style.background=\"rgba(0,0,0,0.25)\";e.style.color=\"#fff\";e.style.width=\"120px\";e.style.padding=\"0.5em 0.5em 0.5em 0.5em\";e.style.zIndex=1e3;e.innerHTML=\"Loading ...\";return e},updateProgress:function(e){var t=\"Loaded \",t=e.total?t+((100*e.loaded/e.total).toFixed(0)+\"%\"):t+((e.loaded/1e3).toFixed(2)+\" KB\");this.statusDomElement.innerHTML=t},extractUrlBase:function(e){e=e.split(\"/\");e.pop();return(1>e.length?\".\":e.join(\"/\"))+\"/\"},initMaterials:function(e,t){for(var n=[],r=0;r<e.length;++r)n[r]=THREE.Loader.prototype.createMaterial(e[r],t);return n},needsTangents:function(e){for(var t=0,n=e.length;t<n;t++)if(e[t]instanceof THREE.ShaderMaterial)return!0;return!1},createMaterial:function(e,t){function n(e){e=Math.log(e)/Math.LN2;return Math.floor(e)==e}function r(e){e=Math.log(e)/Math.LN2;return Math.pow(2,Math.round(e))}function i(e,i,s,u,a,f,l){var p=/\\.dds$/i.test(s),v=t+\"/\"+s;if(p){var m=THREE.ImageUtils.loadCompressedTexture(v);e[i]=m}else m=document.createElement(\"canvas\"),e[i]=new THREE.Texture(m);e[i].sourceFile=s;u&&(e[i].repeat.set(u[0],u[1]),1!==u[0]&&(e[i].wrapS=THREE.RepeatWrapping),1!==u[1]&&(e[i].wrapT=THREE.RepeatWrapping));a&&e[i].offset.set(a[0],a[1]);f&&(s={repeat:THREE.RepeatWrapping,mirror:THREE.MirroredRepeatWrapping},void 0!==s[f[0]]&&(e[i].wrapS=s[f[0]]),void 0!==s[f[1]]&&(e[i].wrapT=s[f[1]]));l&&(e[i].anisotropy=l);if(!p){var g=e[i],e=new Image;e.onload=function(){if(!n(this.width)||!n(this.height)){var e=r(this.width),t=r(this.height);g.image.width=e;g.image.height=t;g.image.getContext(\"2d\").drawImage(this,0,0,e,t)}else g.image=this;g.needsUpdate=!0};e.crossOrigin=o.crossOrigin;e.src=v}}function s(e){return(255*e[0]<<16)+(255*e[1]<<8)+255*e[2]}var o=this,u=\"MeshLambertMaterial\",a={color:15658734,opacity:1,map:null,lightMap:null,normalMap:null,bumpMap:null,wireframe:!1};if(e.shading){var f=e.shading.toLowerCase();\"phong\"===f?u=\"MeshPhongMaterial\":\"basic\"===f&&(u=\"MeshBasicMaterial\")}void 0!==e.blending&&void 0!==THREE[e.blending]&&(a.blending=THREE[e.blending]);if(void 0!==e.transparent||1>e.opacity)a.transparent=e.transparent;void 0!==e.depthTest&&(a.depthTest=e.depthTest);void 0!==e.depthWrite&&(a.depthWrite=e.depthWrite);void 0!==e.visible&&(a.visible=e.visible);void 0!==e.flipSided&&(a.side=THREE.BackSide);void 0!==e.doubleSided&&(a.side=THREE.DoubleSide);void 0!==e.wireframe&&(a.wireframe=e.wireframe);void 0!==e.vertexColors&&(\"face\"===e.vertexColors?a.vertexColors=THREE.FaceColors:e.vertexColors&&(a.vertexColors=THREE.VertexColors));e.colorDiffuse?a.color=s(e.colorDiffuse):e.DbgColor&&(a.color=e.DbgColor);e.colorSpecular&&(a.specular=s(e.colorSpecular));e.colorAmbient&&(a.ambient=s(e.colorAmbient));e.transparency&&(a.opacity=e.transparency);e.specularCoef&&(a.shininess=e.specularCoef);e.mapDiffuse&&t&&i(a,\"map\",e.mapDiffuse,e.mapDiffuseRepeat,e.mapDiffuseOffset,e.mapDiffuseWrap,e.mapDiffuseAnisotropy);e.mapLight&&t&&i(a,\"lightMap\",e.mapLight,e.mapLightRepeat,e.mapLightOffset,e.mapLightWrap,e.mapLightAnisotropy);e.mapBump&&t&&i(a,\"bumpMap\",e.mapBump,e.mapBumpRepeat,e.mapBumpOffset,e.mapBumpWrap,e.mapBumpAnisotropy);e.mapNormal&&t&&i(a,\"normalMap\",e.mapNormal,e.mapNormalRepeat,e.mapNormalOffset,e.mapNormalWrap,e.mapNormalAnisotropy);e.mapSpecular&&t&&i(a,\"specularMap\",e.mapSpecular,e.mapSpecularRepeat,e.mapSpecularOffset,e.mapSpecularWrap,e.mapSpecularAnisotropy);e.mapBumpScale&&(a.bumpScale=e.mapBumpScale);e.mapNormal?(u=THREE.ShaderLib.normalmap,f=THREE.UniformsUtils.clone(u.uniforms),f.tNormal.value=a.normalMap,e.mapNormalFactor&&f.uNormalScale.value.set(e.mapNormalFactor,e.mapNormalFactor),a.map&&(f.tDiffuse.value=a.map,f.enableDiffuse.value=!0),a.specularMap&&(f.tSpecular.value=a.specularMap,f.enableSpecular.value=!0),a.lightMap&&(f.tAO.value=a.lightMap,f.enableAO.value=!0),f.uDiffuseColor.value.setHex(a.color),f.uSpecularColor.value.setHex(a.specular),f.uAmbientColor.value.setHex(a.ambient),f.uShininess.value=a.shininess,void 0!==a.opacity&&(f.uOpacity.value=a.opacity),u=new THREE.ShaderMaterial({fragmentShader:u.fragmentShader,vertexShader:u.vertexShader,uniforms:f,lights:!0,fog:!0}),a.transparent&&(u.transparent=!0)):u=new THREE[u](a);void 0!==e.DbgName&&(u.name=e.DbgName);return u}};THREE.XHRLoader=function(e){this.manager=void 0!==e?e:THREE.DefaultLoadingManager};THREE.XHRLoader.prototype={constructor:THREE.XHRLoader,load:function(e,t,n,r){var i=this,s=new XMLHttpRequest;void 0!==t&&s.addEventListener(\"load\",function(n){t(n.target.responseText);i.manager.itemEnd(e)},!1);void 0!==n&&s.addEventListener(\"progress\",function(e){n(e)},!1);void 0!==r&&s.addEventListener(\"error\",function(e){r(e)},!1);void 0!==this.crossOrigin&&(s.crossOrigin=this.crossOrigin);s.open(\"GET\",e,!0);s.send(null);i.manager.itemStart(e)},setCrossOrigin:function(e){this.crossOrigin=e}};THREE.ImageLoader=function(e){this.manager=void 0!==e?e:THREE.DefaultLoadingManager};THREE.ImageLoader.prototype={constructor:THREE.ImageLoader,load:function(e,t,n,r){var i=this,s=document.createElement(\"img\");void 0!==t&&s.addEventListener(\"load\",function(){i.manager.itemEnd(e);t(this)},!1);void 0!==n&&s.addEventListener(\"progress\",function(e){n(e)},!1);void 0!==r&&s.addEventListener(\"error\",function(e){r(e)},!1);void 0!==this.crossOrigin&&(s.crossOrigin=this.crossOrigin);s.src=e;i.manager.itemStart(e);return s},setCrossOrigin:function(e){this.crossOrigin=e}};THREE.JSONLoader=function(e){THREE.Loader.call(this,e);this.withCredentials=!1};THREE.JSONLoader.prototype=Object.create(THREE.Loader.prototype);THREE.JSONLoader.prototype.load=function(e,t,n){n=n&&\"string\"===typeof n?n:this.extractUrlBase(e);this.onLoadStart();this.loadAjaxJSON(this,e,t,n)};THREE.JSONLoader.prototype.loadAjaxJSON=function(e,t,n,r,i){var s=new XMLHttpRequest,o=0;s.onreadystatechange=function(){if(s.readyState===s.DONE)if(200===s.status||0===s.status){if(s.responseText){var u=JSON.parse(s.responseText),u=e.parse(u,r);n(u.geometry,u.materials)}else console.warn(\"THREE.JSONLoader: [\"+t+\"] seems to be unreachable or file there is empty\");e.onLoadComplete()}else console.error(\"THREE.JSONLoader: Couldn't load [\"+t+\"] [\"+s.status+\"]\");else s.readyState===s.LOADING?i&&(0===o&&(o=s.getResponseHeader(\"Content-Length\")),i({total:o,loaded:s.responseText.length})):s.readyState===s.HEADERS_RECEIVED&&void 0!==i&&(o=s.getResponseHeader(\"Content-Length\"))};s.open(\"GET\",t,!0);s.withCredentials=this.withCredentials;s.send(null)};THREE.JSONLoader.prototype.parse=function(e,t){var n=new THREE.Geometry,r=void 0!==e.scale?1/e.scale:1,i,s,o,u,a,f,l,c,h,p,d,v,m,g,y=e.faces;h=e.vertices;var b=e.normals,w=e.colors,E=0;if(void 0!==e.uvs){for(i=0;i<e.uvs.length;i++)e.uvs[i].length&&E++;for(i=0;i<E;i++)n.faceVertexUvs[i]=[]}u=0;for(a=h.length;u<a;)f=new THREE.Vector3,f.x=h[u++]*r,f.y=h[u++]*r,f.z=h[u++]*r,n.vertices.push(f);u=0;for(a=y.length;u<a;)if(h=y[u++],p=h&1,o=h&2,i=h&8,l=h&16,d=h&32,f=h&64,h&=128,p){p=new THREE.Face3;p.a=y[u];p.b=y[u+1];p.c=y[u+3];v=new THREE.Face3;v.a=y[u+1];v.b=y[u+2];v.c=y[u+3];u+=4;o&&(o=y[u++],p.materialIndex=o,v.materialIndex=o);o=n.faces.length;if(i)for(i=0;i<E;i++){m=e.uvs[i];n.faceVertexUvs[i][o]=[];n.faceVertexUvs[i][o+1]=[];for(s=0;4>s;s++)c=y[u++],g=m[2*c],c=m[2*c+1],g=new THREE.Vector2(g,c),2!==s&&n.faceVertexUvs[i][o].push(g),0!==s&&n.faceVertexUvs[i][o+1].push(g)}l&&(l=3*y[u++],p.normal.set(b[l++],b[l++],b[l]),v.normal.copy(p.normal));if(d)for(i=0;4>i;i++)l=3*y[u++],d=new THREE.Vector3(b[l++],b[l++],b[l]),2!==i&&p.vertexNormals.push(d),0!==i&&v.vertexNormals.push(d);f&&(f=y[u++],f=w[f],p.color.setHex(f),v.color.setHex(f));if(h)for(i=0;4>i;i++)f=y[u++],f=w[f],2!==i&&p.vertexColors.push(new THREE.Color(f)),0!==i&&v.vertexColors.push(new THREE.Color(f));n.faces.push(p);n.faces.push(v)}else{p=new THREE.Face3;p.a=y[u++];p.b=y[u++];p.c=y[u++];o&&(o=y[u++],p.materialIndex=o);o=n.faces.length;if(i)for(i=0;i<E;i++){m=e.uvs[i];n.faceVertexUvs[i][o]=[];for(s=0;3>s;s++)c=y[u++],g=m[2*c],c=m[2*c+1],g=new THREE.Vector2(g,c),n.faceVertexUvs[i][o].push(g)}l&&(l=3*y[u++],p.normal.set(b[l++],b[l++],b[l]));if(d)for(i=0;3>i;i++)l=3*y[u++],d=new THREE.Vector3(b[l++],b[l++],b[l]),p.vertexNormals.push(d);f&&(f=y[u++],p.color.setHex(w[f]));if(h)for(i=0;3>i;i++)f=y[u++],p.vertexColors.push(new THREE.Color(w[f]));n.faces.push(p)}if(e.skinWeights){u=0;for(a=e.skinWeights.length;u<a;u+=2)y=e.skinWeights[u],b=e.skinWeights[u+1],n.skinWeights.push(new THREE.Vector4(y,b,0,0))}if(e.skinIndices){u=0;for(a=e.skinIndices.length;u<a;u+=2)y=e.skinIndices[u],b=e.skinIndices[u+1],n.skinIndices.push(new THREE.Vector4(y,b,0,0))}n.bones=e.bones;n.animation=e.animation;n.animations=e.animations;if(void 0!==e.morphTargets){u=0;for(a=e.morphTargets.length;u<a;u++){n.morphTargets[u]={};n.morphTargets[u].name=e.morphTargets[u].name;n.morphTargets[u].vertices=[];w=n.morphTargets[u].vertices;E=e.morphTargets[u].vertices;y=0;for(b=E.length;y<b;y+=3)h=new THREE.Vector3,h.x=E[y]*r,h.y=E[y+1]*r,h.z=E[y+2]*r,w.push(h)}}if(void 0!==e.morphColors){u=0;for(a=e.morphColors.length;u<a;u++){n.morphColors[u]={};n.morphColors[u].name=e.morphColors[u].name;n.morphColors[u].colors=[];b=n.morphColors[u].colors;w=e.morphColors[u].colors;r=0;for(y=w.length;r<y;r+=3)E=new THREE.Color(16755200),E.setRGB(w[r],w[r+1],w[r+2]),b.push(E)}}n.computeCentroids();n.computeFaceNormals();n.computeBoundingSphere();if(void 0===e.materials)return{geometry:n};r=this.initMaterials(e.materials,t);this.needsTangents(r)&&n.computeTangents();return{geometry:n,materials:r}};THREE.LoadingManager=function(e,t,n){var r=this,i=0,s=0;this.onLoad=e;this.onProgress=t;this.onError=n;this.itemStart=function(){s++};this.itemEnd=function(e){i++;if(void 0!==r.onProgress)r.onProgress(e,i,s);if(i===s&&void 0!==r.onLoad)r.onLoad()}};THREE.DefaultLoadingManager=new THREE.LoadingManager;THREE.BufferGeometryLoader=function(e){this.manager=void 0!==e?e:THREE.DefaultLoadingManager};THREE.BufferGeometryLoader.prototype={constructor:THREE.BufferGeometryLoader,load:function(e,t){var n=this,r=new THREE.XHRLoader;r.setCrossOrigin(this.crossOrigin);r.load(e,function(e){t(n.parse(JSON.parse(e)))})},setCrossOrigin:function(e){this.crossOrigin=e},parse:function(e){var t=new THREE.BufferGeometry,n=e.attributes,r=e.offsets,e=e.boundingSphere,i;for(i in n){var s=n[i];t.attributes[i]={itemSize:s.itemSize,array:new self[s.type](s.array)}}void 0!==r&&(t.offsets=JSON.parse(JSON.stringify(r)));void 0!==e&&(t.boundingSphere=new THREE.Sphere((new THREE.Vector3).fromArray(void 0!==e.center?e.center:[0,0,0]),e.radius));return t}};THREE.GeometryLoader=function(e){this.manager=void 0!==e?e:THREE.DefaultLoadingManager};THREE.GeometryLoader.prototype={constructor:THREE.GeometryLoader,load:function(e,t){var n=this,r=new THREE.XHRLoader;r.setCrossOrigin(this.crossOrigin);r.load(e,function(e){t(n.parse(JSON.parse(e)))})},setCrossOrigin:function(e){this.crossOrigin=e},parse:function(){}};THREE.MaterialLoader=function(e){this.manager=void 0!==e?e:THREE.DefaultLoadingManager};THREE.MaterialLoader.prototype={constructor:THREE.MaterialLoader,load:function(e,t){var n=this,r=new THREE.XHRLoader;r.setCrossOrigin(this.crossOrigin);r.load(e,function(e){t(n.parse(JSON.parse(e)))})},setCrossOrigin:function(e){this.crossOrigin=e},parse:function(e){var t=new THREE[e.type];void 0!==e.color&&t.color.setHex(e.color);void 0!==e.ambient&&t.ambient.setHex(e.ambient);void 0!==e.emissive&&t.emissive.setHex(e.emissive);void 0!==e.specular&&t.specular.setHex(e.specular);void 0!==e.shininess&&(t.shininess=e.shininess);void 0!==e.vertexColors&&(t.vertexColors=e.vertexColors);void 0!==e.blending&&(t.blending=e.blending);void 0!==e.side&&(t.side=e.side);void 0!==e.opacity&&(t.opacity=e.opacity);void 0!==e.transparent&&(t.transparent=e.transparent);void 0!==e.wireframe&&(t.wireframe=e.wireframe);if(void 0!==e.materials)for(var n=0,r=e.materials.length;n<r;n++)t.materials.push(this.parse(e.materials[n]));return t}};THREE.ObjectLoader=function(e){this.manager=void 0!==e?e:THREE.DefaultLoadingManager};THREE.ObjectLoader.prototype={constructor:THREE.ObjectLoader,load:function(e,t){var n=this,r=new THREE.XHRLoader(n.manager);r.setCrossOrigin(this.crossOrigin);r.load(e,function(e){t(n.parse(JSON.parse(e)))})},setCrossOrigin:function(e){this.crossOrigin=e},parse:function(e){var t=this.parseGeometries(e.geometries),n=this.parseMaterials(e.materials);return this.parseObject(e.object,t,n)},parseGeometries:function(e){var t={};if(void 0!==e)for(var n=new THREE.JSONLoader,r=new THREE.BufferGeometryLoader,i=0,s=e.length;i<s;i++){var o,u=e[i];switch(u.type){case\"PlaneGeometry\":o=new THREE.PlaneGeometry(u.width,u.height,u.widthSegments,u.heightSegments);break;case\"CircleGeometry\":o=new THREE.CircleGeometry(u.radius,u.segments);break;case\"CubeGeometry\":o=new THREE.CubeGeometry(u.width,u.height,u.depth,u.widthSegments,u.heightSegments,u.depthSegments);break;case\"CylinderGeometry\":o=new THREE.CylinderGeometry(u.radiusTop,u.radiusBottom,u.height,u.radialSegments,u.heightSegments,u.openEnded);break;case\"SphereGeometry\":o=new THREE.SphereGeometry(u.radius,u.widthSegments,u.heightSegments,u.phiStart,u.phiLength,u.thetaStart,u.thetaLength);break;case\"IcosahedronGeometry\":o=new THREE.IcosahedronGeometry(u.radius,u.detail);break;case\"TorusGeometry\":o=new THREE.TorusGeometry(u.radius,u.tube,u.radialSegments,u.tubularSegments,u.arc);break;case\"TorusKnotGeometry\":o=new THREE.TorusKnotGeometry(u.radius,u.tube,u.radialSegments,u.tubularSegments,u.p,u.q,u.heightScale);break;case\"BufferGeometry\":o=r.parse(u.data);break;case\"Geometry\":o=n.parse(u.data).geometry}o.uuid=u.uuid;void 0!==u.name&&(o.name=u.name);t[u.uuid]=o}return t},parseMaterials:function(e){var t={};if(void 0!==e)for(var n=new THREE.MaterialLoader,r=0,i=e.length;r<i;r++){var s=e[r],o=n.parse(s);o.uuid=s.uuid;void 0!==s.name&&(o.name=s.name);t[s.uuid]=o}return t},parseObject:function(){var e=new THREE.Matrix4;return function(t,n,r){var i;switch(t.type){case\"Scene\":i=new THREE.Scene;break;case\"PerspectiveCamera\":i=new THREE.PerspectiveCamera(t.fov,t.aspect,t.near,t.far);break;case\"OrthographicCamera\":i=new THREE.OrthographicCamera(t.left,t.right,t.top,t.bottom,t.near,t.far);break;case\"AmbientLight\":i=new THREE.AmbientLight(t.color);break;case\"DirectionalLight\":i=new THREE.DirectionalLight(t.color,t.intensity);break;case\"PointLight\":i=new THREE.PointLight(t.color,t.intensity,t.distance);break;case\"SpotLight\":i=new THREE.SpotLight(t.color,t.intensity,t.distance,t.angle,t.exponent);break;case\"HemisphereLight\":i=new THREE.HemisphereLight(t.color,t.groundColor,t.intensity);break;case\"Mesh\":i=n[t.geometry];var s=r[t.material];void 0===i&&console.error(\"THREE.ObjectLoader: Undefined geometry \"+t.geometry);void 0===s&&console.error(\"THREE.ObjectLoader: Undefined material \"+t.material);i=new THREE.Mesh(i,s);break;case\"Sprite\":s=r[t.material];void 0===s&&console.error(\"THREE.ObjectLoader: Undefined material \"+t.material);i=new THREE.Sprite(s);break;default:i=new THREE.Object3D}i.uuid=t.uuid;void 0!==t.name&&(i.name=t.name);void 0!==t.matrix?(e.fromArray(t.matrix),e.decompose(i.position,i.quaternion,i.scale)):(void 0!==t.position&&i.position.fromArray(t.position),void 0!==t.rotation&&i.rotation.fromArray(t.rotation),void 0!==t.scale&&i.scale.fromArray(t.scale));void 0!==t.visible&&(i.visible=t.visible);void 0!==t.userData&&(i.userData=t.userData);if(void 0!==t.children)for(var o in t.children)i.add(this.parseObject(t.children[o],n,r));return i}}()};THREE.SceneLoader=function(){this.onLoadStart=function(){};this.onLoadProgress=function(){};this.onLoadComplete=function(){};this.callbackSync=function(){};this.callbackProgress=function(){};this.geometryHandlers={};this.hierarchyHandlers={};this.addGeometryHandler(\"ascii\",THREE.JSONLoader)};THREE.SceneLoader.prototype={constructor:THREE.SceneLoader,load:function(e,t){var n=this,r=new THREE.XHRLoader(n.manager);r.setCrossOrigin(this.crossOrigin);r.load(e,function(r){n.parse(JSON.parse(r),t,e)})},setCrossOrigin:function(e){this.crossOrigin=e},addGeometryHandler:function(e,t){this.geometryHandlers[e]={loaderClass:t}},addHierarchyHandler:function(e,t){this.hierarchyHandlers[e]={loaderClass:t}},parse:function(e,t,n){function r(e,t){return\"relativeToHTML\"==t?e:h+\"/\"+e}function i(){s(x.scene,N.objects)}function s(e,t){var n,i,o,a,f,l;for(l in t){var h=x.objects[l],m=t[l];if(void 0===h){if(m.type&&m.type in c.hierarchyHandlers){if(void 0===m.loading){n={type:1,url:1,material:1,position:1,rotation:1,scale:1,visible:1,children:1,userData:1,skin:1,morph:1,mirroredLoop:1,duration:1};var g={},b;for(b in m)b in n||(g[b]=m[b]);d=x.materials[m.material];m.loading=!0;n=c.hierarchyHandlers[m.type].loaderObject;n.options?n.load(r(m.url,N.urlBaseType),u(l,e,d,m)):n.load(r(m.url,N.urlBaseType),u(l,e,d,m),g)}}else if(void 0!==m.geometry){if(p=x.geometries[m.geometry]){h=!1;d=x.materials[m.material];h=d instanceof THREE.ShaderMaterial;i=m.position;o=m.rotation;a=m.scale;n=m.matrix;f=m.quaternion;m.material||(d=new THREE.MeshFaceMaterial(x.face_materials[m.geometry]));d instanceof THREE.MeshFaceMaterial&&0===d.materials.length&&(d=new THREE.MeshFaceMaterial(x.face_materials[m.geometry]));if(d instanceof THREE.MeshFaceMaterial)for(g=0;g<d.materials.length;g++)h=h||d.materials[g]instanceof THREE.ShaderMaterial;h&&p.computeTangents();m.skin?h=new THREE.SkinnedMesh(p,d):m.morph?(h=new THREE.MorphAnimMesh(p,d),void 0!==m.duration&&(h.duration=m.duration),void 0!==m.time&&(h.time=m.time),void 0!==m.mirroredLoop&&(h.mirroredLoop=m.mirroredLoop),d.morphNormals&&p.computeMorphNormals()):h=new THREE.Mesh(p,d);h.name=l;n?(h.matrixAutoUpdate=!1,h.matrix.set(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],n[8],n[9],n[10],n[11],n[12],n[13],n[14],n[15])):(h.position.fromArray(i),f?h.quaternion.fromArray(f):h.rotation.fromArray(o),h.scale.fromArray(a));h.visible=m.visible;h.castShadow=m.castShadow;h.receiveShadow=m.receiveShadow;e.add(h);x.objects[l]=h}}else if(\"AmbientLight\"===m.type||\"PointLight\"===m.type||\"DirectionalLight\"===m.type||\"SpotLight\"===m.type||\"HemisphereLight\"===m.type||\"AreaLight\"===m.type){g=m.color;n=m.intensity;i=m.distance;o=m.position;a=m.rotation;switch(m.type){case\"AmbientLight\":y=new THREE.AmbientLight(g);break;case\"PointLight\":y=new THREE.PointLight(g,n,i);y.position.fromArray(o);break;case\"DirectionalLight\":y=new THREE.DirectionalLight(g,n);y.position.fromArray(m.direction);break;case\"SpotLight\":y=new THREE.SpotLight(g,n,i,1);y.angle=m.angle;y.position.fromArray(o);y.target.set(o[0],o[1]-i,o[2]);y.target.applyEuler(new THREE.Euler(a[0],a[1],a[2],\"XYZ\"));break;case\"HemisphereLight\":y=new THREE.DirectionalLight(g,n,i);y.target.set(o[0],o[1]-i,o[2]);y.target.applyEuler(new THREE.Euler(a[0],a[1],a[2],\"XYZ\"));break;case\"AreaLight\":y=new THREE.AreaLight(g,n),y.position.fromArray(o),y.width=m.size,y.height=m.size_y}e.add(y);y.name=l;x.lights[l]=y;x.objects[l]=y}else\"PerspectiveCamera\"===m.type||\"OrthographicCamera\"===m.type?(i=m.position,o=m.rotation,f=m.quaternion,\"PerspectiveCamera\"===m.type?v=new THREE.PerspectiveCamera(m.fov,m.aspect,m.near,m.far):\"OrthographicCamera\"===m.type&&(v=new THREE.OrthographicCamera(m.left,m.right,m.top,m.bottom,m.near,m.far)),v.name=l,v.position.fromArray(i),void 0!==f?v.quaternion.fromArray(f):void 0!==o&&v.rotation.fromArray(o),e.add(v),x.cameras[l]=v,x.objects[l]=v):(i=m.position,o=m.rotation,a=m.scale,f=m.quaternion,h=new THREE.Object3D,h.name=l,h.position.fromArray(i),f?h.quaternion.fromArray(f):h.rotation.fromArray(o),h.scale.fromArray(a),h.visible=void 0!==m.visible?m.visible:!1,e.add(h),x.objects[l]=h,x.empties[l]=h);if(h){if(void 0!==m.userData)for(var w in m.userData)h.userData[w]=m.userData[w];if(void 0!==m.groups)for(g=0;g<m.groups.length;g++)n=m.groups[g],void 0===x.groups[n]&&(x.groups[n]=[]),x.groups[n].push(l)}}void 0!==h&&void 0!==m.children&&s(h,m.children)}}function o(e){return function(t,n){t.name=e;x.geometries[e]=t;x.face_materials[e]=n;i();b-=1;c.onLoadComplete();f()}}function u(e,t,n,r){return function(s){var s=s.content?s.content:s.dae?s.scene:s,o=r.rotation,u=r.quaternion,a=r.scale;s.position.fromArray(r.position);u?s.quaternion.fromArray(u):s.rotation.fromArray(o);s.scale.fromArray(a);n&&s.traverse(function(e){e.material=n});var l=void 0!==r.visible?r.visible:!0;s.traverse(function(e){e.visible=l});t.add(s);s.name=e;x.objects[e]=s;i();b-=1;c.onLoadComplete();f()}}function a(e){return function(t,n){t.name=e;x.geometries[e]=t;x.face_materials[e]=n}}function f(){c.callbackProgress({totalModels:E,totalTextures:S,loadedModels:E-b,loadedTextures:S-w},x);c.onLoadProgress();if(0===b&&0===w){for(var e=0;e<T.length;e++){var n=T[e],r=x.objects[n.targetName];r?n.object.target=r:(n.object.target=new THREE.Object3D,x.scene.add(n.object.target));n.object.target.userData.targetInverse=n.object}t(x)}}function l(e,t){t(e);if(void 0!==e.children)for(var n in e.children)l(e.children[n],t)}var c=this,h=THREE.Loader.prototype.extractUrlBase(n),p,d,v,m,g,y,b,w,E,S,x,T=[],N=e,C;for(C in this.geometryHandlers)e=this.geometryHandlers[C].loaderClass,this.geometryHandlers[C].loaderObject=new e;for(C in this.hierarchyHandlers)e=this.hierarchyHandlers[C].loaderClass,this.hierarchyHandlers[C].loaderObject=new e;w=b=0;x={scene:new THREE.Scene,geometries:{},face_materials:{},materials:{},textures:{},objects:{},cameras:{},lights:{},fogs:{},empties:{},groups:{}};if(N.transform&&(C=N.transform.position,e=N.transform.rotation,n=N.transform.scale,C&&x.scene.position.fromArray(C),e&&x.scene.rotation.fromArray(e),n&&x.scene.scale.fromArray(n),C||e||n))x.scene.updateMatrix(),x.scene.updateMatrixWorld();C=function(e){return function(){w-=e;f();c.onLoadComplete()}};for(var k in N.fogs)e=N.fogs[k],\"linear\"===e.type?m=new THREE.Fog(0,e.near,e.far):\"exp2\"===e.type&&(m=new THREE.FogExp2(0,e.density)),e=e.color,m.color.setRGB(e[0],e[1],e[2]),x.fogs[k]=m;for(var L in N.geometries)m=N.geometries[L],m.type in this.geometryHandlers&&(b+=1,c.onLoadStart());for(var A in N.objects)l(N.objects[A],function(e){e.type&&e.type in c.hierarchyHandlers&&(b+=1,c.onLoadStart())});E=b;for(L in N.geometries)if(m=N.geometries[L],\"cube\"===m.type)p=new THREE.CubeGeometry(m.width,m.height,m.depth,m.widthSegments,m.heightSegments,m.depthSegments),p.name=L,x.geometries[L]=p;else if(\"plane\"===m.type)p=new THREE.PlaneGeometry(m.width,m.height,m.widthSegments,m.heightSegments),p.name=L,x.geometries[L]=p;else if(\"sphere\"===m.type)p=new THREE.SphereGeometry(m.radius,m.widthSegments,m.heightSegments),p.name=L,x.geometries[L]=p;else if(\"cylinder\"===m.type)p=new THREE.CylinderGeometry(m.topRad,m.botRad,m.height,m.radSegs,m.heightSegs),p.name=L,x.geometries[L]=p;else if(\"torus\"===m.type)p=new THREE.TorusGeometry(m.radius,m.tube,m.segmentsR,m.segmentsT),p.name=L,x.geometries[L]=p;else if(\"icosahedron\"===m.type)p=new THREE.IcosahedronGeometry(m.radius,m.subdivisions),p.name=L,x.geometries[L]=p;else if(m.type in this.geometryHandlers){A={};for(g in m)\"type\"!==g&&\"url\"!==g&&(A[g]=m[g]);this.geometryHandlers[m.type].loaderObject.load(r(m.url,N.urlBaseType),o(L),A)}else\"embedded\"===m.type&&(A=N.embeds[m.id],A.metadata=N.metadata,A&&(A=this.geometryHandlers.ascii.loaderObject.parse(A,\"\"),a(L)(A.geometry,A.materials)));for(var O in N.textures)if(L=N.textures[O],L.url instanceof Array){w+=L.url.length;for(g=0;g<L.url.length;g++)c.onLoadStart()}else w+=1,c.onLoadStart();S=w;for(O in N.textures){L=N.textures[O];void 0!==L.mapping&&void 0!==THREE[L.mapping]&&(L.mapping=new THREE[L.mapping]);if(L.url instanceof Array){A=L.url.length;m=[];for(g=0;g<A;g++)m[g]=r(L.url[g],N.urlBaseType);g=(g=/\\.dds$/i.test(m[0]))?THREE.ImageUtils.loadCompressedTextureCube(m,L.mapping,C(A)):THREE.ImageUtils.loadTextureCube(m,L.mapping,C(A))}else g=/\\.dds$/i.test(L.url),A=r(L.url,N.urlBaseType),m=C(1),g=g?THREE.ImageUtils.loadCompressedTexture(A,L.mapping,m):THREE.ImageUtils.loadTexture(A,L.mapping,m),void 0!==THREE[L.minFilter]&&(g.minFilter=THREE[L.minFilter]),void 0!==THREE[L.magFilter]&&(g.magFilter=THREE[L.magFilter]),L.anisotropy&&(g.anisotropy=L.anisotropy),L.repeat&&(g.repeat.set(L.repeat[0],L.repeat[1]),1!==L.repeat[0]&&(g.wrapS=THREE.RepeatWrapping),1!==L.repeat[1]&&(g.wrapT=THREE.RepeatWrapping)),L.offset&&g.offset.set(L.offset[0],L.offset[1]),L.wrap&&(A={repeat:THREE.RepeatWrapping,mirror:THREE.MirroredRepeatWrapping},void 0!==A[L.wrap[0]]&&(g.wrapS=A[L.wrap[0]]),void 0!==A[L.wrap[1]]&&(g.wrapT=A[L.wrap[1]]));x.textures[O]=g}var M,_;for(M in N.materials){O=N.materials[M];for(_ in O.parameters)\"envMap\"===_||\"map\"===_||\"lightMap\"===_||\"bumpMap\"===_?O.parameters[_]=x.textures[O.parameters[_]]:\"shading\"===_?O.parameters[_]=\"flat\"===O.parameters[_]?THREE.FlatShading:THREE.SmoothShading:\"side\"===_?O.parameters[_]=\"double\"==O.parameters[_]?THREE.DoubleSide:\"back\"==O.parameters[_]?THREE.BackSide:THREE.FrontSide:\"blending\"===_?O.parameters[_]=O.parameters[_]in THREE?THREE[O.parameters[_]]:THREE.NormalBlending:\"combine\"===_?O.parameters[_]=O.parameters[_]in THREE?THREE[O.parameters[_]]:THREE.MultiplyOperation:\"vertexColors\"===_?\"face\"==O.parameters[_]?O.parameters[_]=THREE.FaceColors:O.parameters[_]&&(O.parameters[_]=THREE.VertexColors):\"wrapRGB\"===_&&(C=O.parameters[_],O.parameters[_]=new THREE.Vector3(C[0],C[1],C[2]));void 0!==O.parameters.opacity&&1>O.parameters.opacity&&(O.parameters.transparent=!0);O.parameters.normalMap?(C=THREE.ShaderLib.normalmap,L=THREE.UniformsUtils.clone(C.uniforms),g=O.parameters.color,A=O.parameters.specular,m=O.parameters.ambient,k=O.parameters.shininess,L.tNormal.value=x.textures[O.parameters.normalMap],O.parameters.normalScale&&L.uNormalScale.value.set(O.parameters.normalScale[0],O.parameters.normalScale[1]),O.parameters.map&&(L.tDiffuse.value=O.parameters.map,L.enableDiffuse.value=!0),O.parameters.envMap&&(L.tCube.value=O.parameters.envMap,L.enableReflection.value=!0,L.uReflectivity.value=O.parameters.reflectivity),O.parameters.lightMap&&(L.tAO.value=O.parameters.lightMap,L.enableAO.value=!0),O.parameters.specularMap&&(L.tSpecular.value=x.textures[O.parameters.specularMap],L.enableSpecular.value=!0),O.parameters.displacementMap&&(L.tDisplacement.value=x.textures[O.parameters.displacementMap],L.enableDisplacement.value=!0,L.uDisplacementBias.value=O.parameters.displacementBias,L.uDisplacementScale.value=O.parameters.displacementScale),L.uDiffuseColor.value.setHex(g),L.uSpecularColor.value.setHex(A),L.uAmbientColor.value.setHex(m),L.uShininess.value=k,O.parameters.opacity&&(L.uOpacity.value=O.parameters.opacity),d=new THREE.ShaderMaterial({fragmentShader:C.fragmentShader,vertexShader:C.vertexShader,uniforms:L,lights:!0,fog:!0})):d=new THREE[O.type](O.parameters);d.name=M;x.materials[M]=d}for(M in N.materials)if(O=N.materials[M],O.parameters.materials){_=[];for(g=0;g<O.parameters.materials.length;g++)_.push(x.materials[O.parameters.materials[g]]);x.materials[M].materials=_}i();x.cameras&&N.defaults.camera&&(x.currentCamera=x.cameras[N.defaults.camera]);x.fogs&&N.defaults.fog&&(x.scene.fog=x.fogs[N.defaults.fog]);c.callbackSync(x);f()}};THREE.TextureLoader=function(e){this.manager=void 0!==e?e:THREE.DefaultLoadingManager};THREE.TextureLoader.prototype={constructor:THREE.TextureLoader,load:function(e,t){var n=new THREE.ImageLoader(this.manager);n.setCrossOrigin(this.crossOrigin);n.load(e,function(e){e=new THREE.Texture(e);e.needsUpdate=!0;void 0!==t&&t(e)})},setCrossOrigin:function(e){this.crossOrigin=e}};THREE.Material=function(){this.id=THREE.MaterialIdCount++;this.uuid=THREE.Math.generateUUID();this.name=\"\";this.side=THREE.FrontSide;this.opacity=1;this.transparent=!1;this.blending=THREE.NormalBlending;this.blendSrc=THREE.SrcAlphaFactor;this.blendDst=THREE.OneMinusSrcAlphaFactor;this.blendEquation=THREE.AddEquation;this.depthWrite=this.depthTest=!0;this.polygonOffset=!1;this.overdraw=this.alphaTest=this.polygonOffsetUnits=this.polygonOffsetFactor=0;this.needsUpdate=this.visible=!0};THREE.Material.prototype={constructor:THREE.Material,setValues:function(e){if(void 0!==e)for(var t in e){var n=e[t];if(void 0===n)console.warn(\"THREE.Material: '\"+t+\"' parameter is undefined.\");else if(t in this){var r=this[t];r instanceof THREE.Color?r.set(n):r instanceof THREE.Vector3&&n instanceof THREE.Vector3?r.copy(n):this[t]=\"overdraw\"==t?Number(n):n}}},clone:function(e){void 0===e&&(e=new THREE.Material);e.name=this.name;e.side=this.side;e.opacity=this.opacity;e.transparent=this.transparent;e.blending=this.blending;e.blendSrc=this.blendSrc;e.blendDst=this.blendDst;e.blendEquation=this.blendEquation;e.depthTest=this.depthTest;e.depthWrite=this.depthWrite;e.polygonOffset=this.polygonOffset;e.polygonOffsetFactor=this.polygonOffsetFactor;e.polygonOffsetUnits=this.polygonOffsetUnits;e.alphaTest=this.alphaTest;e.overdraw=this.overdraw;e.visible=this.visible;return e},dispose:function(){this.dispatchEvent({type:\"dispose\"})}};THREE.EventDispatcher.prototype.apply(THREE.Material.prototype);THREE.MaterialIdCount=0;THREE.LineBasicMaterial=function(e){THREE.Material.call(this);this.color=new THREE.Color(16777215);this.linewidth=1;this.linejoin=this.linecap=\"round\";this.vertexColors=!1;this.fog=!0;this.setValues(e)};THREE.LineBasicMaterial.prototype=Object.create(THREE.Material.prototype);THREE.LineBasicMaterial.prototype.clone=function(){var e=new THREE.LineBasicMaterial;THREE.Material.prototype.clone.call(this,e);e.color.copy(this.color);e.linewidth=this.linewidth;e.linecap=this.linecap;e.linejoin=this.linejoin;e.vertexColors=this.vertexColors;e.fog=this.fog;return e};THREE.LineDashedMaterial=function(e){THREE.Material.call(this);this.color=new THREE.Color(16777215);this.scale=this.linewidth=1;this.dashSize=3;this.gapSize=1;this.vertexColors=!1;this.fog=!0;this.setValues(e)};THREE.LineDashedMaterial.prototype=Object.create(THREE.Material.prototype);THREE.LineDashedMaterial.prototype.clone=function(){var e=new THREE.LineDashedMaterial;THREE.Material.prototype.clone.call(this,e);e.color.copy(this.color);e.linewidth=this.linewidth;e.scale=this.scale;e.dashSize=this.dashSize;e.gapSize=this.gapSize;e.vertexColors=this.vertexColors;e.fog=this.fog;return e};THREE.MeshBasicMaterial=function(e){THREE.Material.call(this);this.color=new THREE.Color(16777215);this.envMap=this.specularMap=this.lightMap=this.map=null;this.combine=THREE.MultiplyOperation;this.reflectivity=1;this.refractionRatio=.98;this.fog=!0;this.shading=THREE.SmoothShading;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap=\"round\";this.vertexColors=THREE.NoColors;this.morphTargets=this.skinning=!1;this.setValues(e)};THREE.MeshBasicMaterial.prototype=Object.create(THREE.Material.prototype);THREE.MeshBasicMaterial.prototype.clone=function(){var e=new THREE.MeshBasicMaterial;THREE.Material.prototype.clone.call(this,e);e.color.copy(this.color);e.map=this.map;e.lightMap=this.lightMap;e.specularMap=this.specularMap;e.envMap=this.envMap;e.combine=this.combine;e.reflectivity=this.reflectivity;e.refractionRatio=this.refractionRatio;e.fog=this.fog;e.shading=this.shading;e.wireframe=this.wireframe;e.wireframeLinewidth=this.wireframeLinewidth;e.wireframeLinecap=this.wireframeLinecap;e.wireframeLinejoin=this.wireframeLinejoin;e.vertexColors=this.vertexColors;e.skinning=this.skinning;e.morphTargets=this.morphTargets;return e};THREE.MeshLambertMaterial=function(e){THREE.Material.call(this);this.color=new THREE.Color(16777215);this.ambient=new THREE.Color(16777215);this.emissive=new THREE.Color(0);this.wrapAround=!1;this.wrapRGB=new THREE.Vector3(1,1,1);this.envMap=this.specularMap=this.lightMap=this.map=null;this.combine=THREE.MultiplyOperation;this.reflectivity=1;this.refractionRatio=.98;this.fog=!0;this.shading=THREE.SmoothShading;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap=\"round\";this.vertexColors=THREE.NoColors;this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(e)};THREE.MeshLambertMaterial.prototype=Object.create(THREE.Material.prototype);THREE.MeshLambertMaterial.prototype.clone=function(){var e=new THREE.MeshLambertMaterial;THREE.Material.prototype.clone.call(this,e);e.color.copy(this.color);e.ambient.copy(this.ambient);e.emissive.copy(this.emissive);e.wrapAround=this.wrapAround;e.wrapRGB.copy(this.wrapRGB);e.map=this.map;e.lightMap=this.lightMap;e.specularMap=this.specularMap;e.envMap=this.envMap;e.combine=this.combine;e.reflectivity=this.reflectivity;e.refractionRatio=this.refractionRatio;e.fog=this.fog;e.shading=this.shading;e.wireframe=this.wireframe;e.wireframeLinewidth=this.wireframeLinewidth;e.wireframeLinecap=this.wireframeLinecap;e.wireframeLinejoin=this.wireframeLinejoin;e.vertexColors=this.vertexColors;e.skinning=this.skinning;e.morphTargets=this.morphTargets;e.morphNormals=this.morphNormals;return e};THREE.MeshPhongMaterial=function(e){THREE.Material.call(this);this.color=new THREE.Color(16777215);this.ambient=new THREE.Color(16777215);this.emissive=new THREE.Color(0);this.specular=new THREE.Color(1118481);this.shininess=30;this.metal=!1;this.perPixel=!0;this.wrapAround=!1;this.wrapRGB=new THREE.Vector3(1,1,1);this.bumpMap=this.lightMap=this.map=null;this.bumpScale=1;this.normalMap=null;this.normalScale=new THREE.Vector2(1,1);this.envMap=this.specularMap=null;this.combine=THREE.MultiplyOperation;this.reflectivity=1;this.refractionRatio=.98;this.fog=!0;this.shading=THREE.SmoothShading;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap=\"round\";this.vertexColors=THREE.NoColors;this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(e)};THREE.MeshPhongMaterial.prototype=Object.create(THREE.Material.prototype);THREE.MeshPhongMaterial.prototype.clone=function(){var e=new THREE.MeshPhongMaterial;THREE.Material.prototype.clone.call(this,e);e.color.copy(this.color);e.ambient.copy(this.ambient);e.emissive.copy(this.emissive);e.specular.copy(this.specular);e.shininess=this.shininess;e.metal=this.metal;e.perPixel=this.perPixel;e.wrapAround=this.wrapAround;e.wrapRGB.copy(this.wrapRGB);e.map=this.map;e.lightMap=this.lightMap;e.bumpMap=this.bumpMap;e.bumpScale=this.bumpScale;e.normalMap=this.normalMap;e.normalScale.copy(this.normalScale);e.specularMap=this.specularMap;e.envMap=this.envMap;e.combine=this.combine;e.reflectivity=this.reflectivity;e.refractionRatio=this.refractionRatio;e.fog=this.fog;e.shading=this.shading;e.wireframe=this.wireframe;e.wireframeLinewidth=this.wireframeLinewidth;e.wireframeLinecap=this.wireframeLinecap;e.wireframeLinejoin=this.wireframeLinejoin;e.vertexColors=this.vertexColors;e.skinning=this.skinning;e.morphTargets=this.morphTargets;e.morphNormals=this.morphNormals;return e};THREE.MeshDepthMaterial=function(e){THREE.Material.call(this);this.wireframe=!1;this.wireframeLinewidth=1;this.setValues(e)};THREE.MeshDepthMaterial.prototype=Object.create(THREE.Material.prototype);THREE.MeshDepthMaterial.prototype.clone=function(){var e=new THREE.MeshDepthMaterial;THREE.Material.prototype.clone.call(this,e);e.wireframe=this.wireframe;e.wireframeLinewidth=this.wireframeLinewidth;return e};THREE.MeshNormalMaterial=function(e){THREE.Material.call(this,e);this.shading=THREE.FlatShading;this.wireframe=!1;this.wireframeLinewidth=1;this.morphTargets=!1;this.setValues(e)};THREE.MeshNormalMaterial.prototype=Object.create(THREE.Material.prototype);THREE.MeshNormalMaterial.prototype.clone=function(){var e=new THREE.MeshNormalMaterial;THREE.Material.prototype.clone.call(this,e);e.shading=this.shading;e.wireframe=this.wireframe;e.wireframeLinewidth=this.wireframeLinewidth;return e};THREE.MeshFaceMaterial=function(e){this.materials=e instanceof Array?e:[]};THREE.MeshFaceMaterial.prototype.clone=function(){for(var e=new THREE.MeshFaceMaterial,t=0;t<this.materials.length;t++)e.materials.push(this.materials[t].clone());return e};THREE.ParticleSystemMaterial=function(e){THREE.Material.call(this);this.color=new THREE.Color(16777215);this.map=null;this.size=1;this.sizeAttenuation=!0;this.vertexColors=!1;this.fog=!0;this.setValues(e)};THREE.ParticleSystemMaterial.prototype=Object.create(THREE.Material.prototype);THREE.ParticleSystemMaterial.prototype.clone=function(){var e=new THREE.ParticleSystemMaterial;THREE.Material.prototype.clone.call(this,e);e.color.copy(this.color);e.map=this.map;e.size=this.size;e.sizeAttenuation=this.sizeAttenuation;e.vertexColors=this.vertexColors;e.fog=this.fog;return e};THREE.ParticleBasicMaterial=THREE.ParticleSystemMaterial;THREE.ShaderMaterial=function(e){THREE.Material.call(this);this.vertexShader=this.fragmentShader=\"void main() {}\";this.uniforms={};this.defines={};this.attributes=null;this.shading=THREE.SmoothShading;this.linewidth=1;this.wireframe=!1;this.wireframeLinewidth=1;this.lights=this.fog=!1;this.vertexColors=THREE.NoColors;this.morphNormals=this.morphTargets=this.skinning=!1;this.defaultAttributeValues={color:[1,1,1],uv:[0,0],uv2:[0,0]};this.index0AttributeName=\"position\";this.setValues(e)};THREE.ShaderMaterial.prototype=Object.create(THREE.Material.prototype);THREE.ShaderMaterial.prototype.clone=function(){var e=new THREE.ShaderMaterial;THREE.Material.prototype.clone.call(this,e);e.fragmentShader=this.fragmentShader;e.vertexShader=this.vertexShader;e.uniforms=THREE.UniformsUtils.clone(this.uniforms);e.attributes=this.attributes;e.defines=this.defines;e.shading=this.shading;e.wireframe=this.wireframe;e.wireframeLinewidth=this.wireframeLinewidth;e.fog=this.fog;e.lights=this.lights;e.vertexColors=this.vertexColors;e.skinning=this.skinning;e.morphTargets=this.morphTargets;e.morphNormals=this.morphNormals;return e};THREE.SpriteMaterial=function(e){THREE.Material.call(this);this.color=new THREE.Color(16777215);this.map=null;this.rotation=0;this.fog=!1;this.uvOffset=new THREE.Vector2(0,0);this.uvScale=new THREE.Vector2(1,1);this.setValues(e)};THREE.SpriteMaterial.prototype=Object.create(THREE.Material.prototype);THREE.SpriteMaterial.prototype.clone=function(){var e=new THREE.SpriteMaterial;THREE.Material.prototype.clone.call(this,e);e.color.copy(this.color);e.map=this.map;e.rotation=this.rotation;e.uvOffset.copy(this.uvOffset);e.uvScale.copy(this.uvScale);e.fog=this.fog;return e};THREE.SpriteCanvasMaterial=function(e){THREE.Material.call(this);this.color=new THREE.Color(16777215);this.program=function(){};this.setValues(e)};THREE.SpriteCanvasMaterial.prototype=Object.create(THREE.Material.prototype);THREE.SpriteCanvasMaterial.prototype.clone=function(){var e=new THREE.SpriteCanvasMaterial;THREE.Material.prototype.clone.call(this,e);e.color.copy(this.color);e.program=this.program;return e};THREE.ParticleCanvasMaterial=THREE.SpriteCanvasMaterial;THREE.Texture=function(e,t,n,r,i,s,o,u,a){this.id=THREE.TextureIdCount++;this.uuid=THREE.Math.generateUUID();this.name=\"\";this.image=e;this.mipmaps=[];this.mapping=void 0!==t?t:new THREE.UVMapping;this.wrapS=void 0!==n?n:THREE.ClampToEdgeWrapping;this.wrapT=void 0!==r?r:THREE.ClampToEdgeWrapping;this.magFilter=void 0!==i?i:THREE.LinearFilter;this.minFilter=void 0!==s?s:THREE.LinearMipMapLinearFilter;this.anisotropy=void 0!==a?a:1;this.format=void 0!==o?o:THREE.RGBAFormat;this.type=void 0!==u?u:THREE.UnsignedByteType;this.offset=new THREE.Vector2(0,0);this.repeat=new THREE.Vector2(1,1);this.generateMipmaps=!0;this.premultiplyAlpha=!1;this.flipY=!0;this.unpackAlignment=4;this.needsUpdate=!1;this.onUpdate=null};THREE.Texture.prototype={constructor:THREE.Texture,clone:function(e){void 0===e&&(e=new THREE.Texture);e.image=this.image;e.mipmaps=this.mipmaps.slice(0);e.mapping=this.mapping;e.wrapS=this.wrapS;e.wrapT=this.wrapT;e.magFilter=this.magFilter;e.minFilter=this.minFilter;e.anisotropy=this.anisotropy;e.format=this.format;e.type=this.type;e.offset.copy(this.offset);e.repeat.copy(this.repeat);e.generateMipmaps=this.generateMipmaps;e.premultiplyAlpha=this.premultiplyAlpha;e.flipY=this.flipY;e.unpackAlignment=this.unpackAlignment;return e},dispose:function(){this.dispatchEvent({type:\"dispose\"})}};THREE.EventDispatcher.prototype.apply(THREE.Texture.prototype);THREE.TextureIdCount=0;THREE.CompressedTexture=function(e,t,n,r,i,s,o,u,a,f,l){THREE.Texture.call(this,null,s,o,u,a,f,r,i,l);this.image={width:t,height:n};this.mipmaps=e;this.generateMipmaps=!1};THREE.CompressedTexture.prototype=Object.create(THREE.Texture.prototype);THREE.CompressedTexture.prototype.clone=function(){var e=new THREE.CompressedTexture;THREE.Texture.prototype.clone.call(this,e);return e};THREE.DataTexture=function(e,t,n,r,i,s,o,u,a,f,l){THREE.Texture.call(this,null,s,o,u,a,f,r,i,l);this.image={data:e,width:t,height:n}};THREE.DataTexture.prototype=Object.create(THREE.Texture.prototype);THREE.DataTexture.prototype.clone=function(){var e=new THREE.DataTexture;THREE.Texture.prototype.clone.call(this,e);return e};THREE.ParticleSystem=function(e,t){THREE.Object3D.call(this);this.geometry=void 0!==e?e:new THREE.Geometry;this.material=void 0!==t?t:new THREE.ParticleSystemMaterial({color:16777215*Math.random()});this.frustumCulled=this.sortParticles=!1};THREE.ParticleSystem.prototype=Object.create(THREE.Object3D.prototype);THREE.ParticleSystem.prototype.clone=function(e){void 0===e&&(e=new THREE.ParticleSystem(this.geometry,this.material));e.sortParticles=this.sortParticles;THREE.Object3D.prototype.clone.call(this,e);return e};THREE.Line=function(e,t,n){THREE.Object3D.call(this);this.geometry=void 0!==e?e:new THREE.Geometry;this.material=void 0!==t?t:new THREE.LineBasicMaterial({color:16777215*Math.random()});this.type=void 0!==n?n:THREE.LineStrip};THREE.LineStrip=0;THREE.LinePieces=1;THREE.Line.prototype=Object.create(THREE.Object3D.prototype);THREE.Line.prototype.clone=function(e){void 0===e&&(e=new THREE.Line(this.geometry,this.material,this.type));THREE.Object3D.prototype.clone.call(this,e);return e};THREE.Mesh=function(e,t){THREE.Object3D.call(this);this.geometry=void 0!==e?e:new THREE.Geometry;this.material=void 0!==t?t:new THREE.MeshBasicMaterial({color:16777215*Math.random()});this.updateMorphTargets()};THREE.Mesh.prototype=Object.create(THREE.Object3D.prototype);THREE.Mesh.prototype.updateMorphTargets=function(){if(0<this.geometry.morphTargets.length){this.morphTargetBase=-1;this.morphTargetForcedOrder=[];this.morphTargetInfluences=[];this.morphTargetDictionary={};for(var e=0,t=this.geometry.morphTargets.length;e<t;e++)this.morphTargetInfluences.push(0),this.morphTargetDictionary[this.geometry.morphTargets[e].name]=e}};THREE.Mesh.prototype.getMorphTargetIndexByName=function(e){if(void 0!==this.morphTargetDictionary[e])return this.morphTargetDictionary[e];console.log(\"THREE.Mesh.getMorphTargetIndexByName: morph target \"+e+\" does not exist. Returning 0.\");return 0};THREE.Mesh.prototype.clone=function(e){void 0===e&&(e=new THREE.Mesh(this.geometry,this.material));THREE.Object3D.prototype.clone.call(this,e);return e};THREE.Bone=function(e){THREE.Object3D.call(this);this.skin=e;this.skinMatrix=new THREE.Matrix4};THREE.Bone.prototype=Object.create(THREE.Object3D.prototype);THREE.Bone.prototype.update=function(e,t){this.matrixAutoUpdate&&(t|=this.updateMatrix());if(t||this.matrixWorldNeedsUpdate)e?this.skinMatrix.multiplyMatrices(e,this.matrix):this.skinMatrix.copy(this.matrix),this.matrixWorldNeedsUpdate=!1,t=!0;var n,r=this.children.length;for(n=0;n<r;n++)this.children[n].update(this.skinMatrix,t)};THREE.SkinnedMesh=function(e,t,n){THREE.Mesh.call(this,e,t);this.useVertexTexture=void 0!==n?n:!0;this.identityMatrix=new THREE.Matrix4;this.bones=[];this.boneMatrices=[];var r,i,s;if(this.geometry&&void 0!==this.geometry.bones){for(e=0;e<this.geometry.bones.length;e++)n=this.geometry.bones[e],r=n.pos,i=n.rotq,s=n.scl,t=this.addBone(),t.name=n.name,t.position.set(r[0],r[1],r[2]),t.quaternion.set(i[0],i[1],i[2],i[3]),void 0!==s?t.scale.set(s[0],s[1],s[2]):t.scale.set(1,1,1);for(e=0;e<this.bones.length;e++)n=this.geometry.bones[e],t=this.bones[e],-1===n.parent?this.add(t):this.bones[n.parent].add(t);e=this.bones.length;this.useVertexTexture?(this.boneTextureHeight=this.boneTextureWidth=e=256<e?64:64<e?32:16<e?16:8,this.boneMatrices=new Float32Array(4*this.boneTextureWidth*this.boneTextureHeight),this.boneTexture=new THREE.DataTexture(this.boneMatrices,this.boneTextureWidth,this.boneTextureHeight,THREE.RGBAFormat,THREE.FloatType),this.boneTexture.minFilter=THREE.NearestFilter,this.boneTexture.magFilter=THREE.NearestFilter,this.boneTexture.generateMipmaps=!1,this.boneTexture.flipY=!1):this.boneMatrices=new Float32Array(16*e);this.pose()}};THREE.SkinnedMesh.prototype=Object.create(THREE.Mesh.prototype);THREE.SkinnedMesh.prototype.addBone=function(e){void 0===e&&(e=new THREE.Bone(this));this.bones.push(e);return e};THREE.SkinnedMesh.prototype.updateMatrixWorld=function(){var e=new THREE.Matrix4;return function(t){this.matrixAutoUpdate&&this.updateMatrix();if(this.matrixWorldNeedsUpdate||t)this.parent?this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix):this.matrixWorld.copy(this.matrix),this.matrixWorldNeedsUpdate=!1;for(var t=0,n=this.children.length;t<n;t++){var r=this.children[t];r instanceof THREE.Bone?r.update(this.identityMatrix,!1):r.updateMatrixWorld(!0)}if(void 0==this.boneInverses){this.boneInverses=[];t=0;for(n=this.bones.length;t<n;t++)r=new THREE.Matrix4,r.getInverse(this.bones[t].skinMatrix),this.boneInverses.push(r)}t=0;for(n=this.bones.length;t<n;t++)e.multiplyMatrices(this.bones[t].skinMatrix,this.boneInverses[t]),e.flattenToArrayOffset(this.boneMatrices,16*t);this.useVertexTexture&&(this.boneTexture.needsUpdate=!0)}}();THREE.SkinnedMesh.prototype.pose=function(){this.updateMatrixWorld(!0);this.normalizeSkinWeights()};THREE.SkinnedMesh.prototype.normalizeSkinWeights=function(){if(this.geometry instanceof THREE.Geometry)for(var e=0;e<this.geometry.skinIndices.length;e++){var t=this.geometry.skinWeights[e],n=1/t.lengthManhattan();Infinity!==n?t.multiplyScalar(n):t.set(1)}};THREE.SkinnedMesh.prototype.clone=function(e){void 0===e&&(e=new THREE.SkinnedMesh(this.geometry,this.material,this.useVertexTexture));THREE.Mesh.prototype.clone.call(this,e);return e};THREE.MorphAnimMesh=function(e,t){THREE.Mesh.call(this,e,t);this.duration=1e3;this.mirroredLoop=!1;this.currentKeyframe=this.lastKeyframe=this.time=0;this.direction=1;this.directionBackwards=!1;this.setFrameRange(0,this.geometry.morphTargets.length-1)};THREE.MorphAnimMesh.prototype=Object.create(THREE.Mesh.prototype);THREE.MorphAnimMesh.prototype.setFrameRange=function(e,t){this.startKeyframe=e;this.endKeyframe=t;this.length=this.endKeyframe-this.startKeyframe+1};THREE.MorphAnimMesh.prototype.setDirectionForward=function(){this.direction=1;this.directionBackwards=!1};THREE.MorphAnimMesh.prototype.setDirectionBackward=function(){this.direction=-1;this.directionBackwards=!0};THREE.MorphAnimMesh.prototype.parseAnimations=function(){var e=this.geometry;e.animations||(e.animations={});for(var t,n=e.animations,r=/([a-z]+)(\\d+)/,i=0,s=e.morphTargets.length;i<s;i++){var o=e.morphTargets[i].name.match(r);if(o&&1<o.length){o=o[1];n[o]||(n[o]={start:Infinity,end:-Infinity});var u=n[o];i<u.start&&(u.start=i);i>u.end&&(u.end=i);t||(t=o)}}e.firstAnimation=t};THREE.MorphAnimMesh.prototype.setAnimationLabel=function(e,t,n){this.geometry.animations||(this.geometry.animations={});this.geometry.animations[e]={start:t,end:n}};THREE.MorphAnimMesh.prototype.playAnimation=function(e,t){var n=this.geometry.animations[e];n?(this.setFrameRange(n.start,n.end),this.duration=1e3*((n.end-n.start)/t),this.time=0):console.warn(\"animation[\"+e+\"] undefined\")};THREE.MorphAnimMesh.prototype.updateAnimation=function(e){var t=this.duration/this.length;this.time+=this.direction*e;if(this.mirroredLoop){if(this.time>this.duration||0>this.time)this.direction*=-1,this.time>this.duration&&(this.time=this.duration,this.directionBackwards=!0),0>this.time&&(this.time=0,this.directionBackwards=!1)}else this.time%=this.duration,0>this.time&&(this.time+=this.duration);e=this.startKeyframe+THREE.Math.clamp(Math.floor(this.time/t),0,this.length-1);e!==this.currentKeyframe&&(this.morphTargetInfluences[this.lastKeyframe]=0,this.morphTargetInfluences[this.currentKeyframe]=1,this.morphTargetInfluences[e]=0,this.lastKeyframe=this.currentKeyframe,this.currentKeyframe=e);t=this.time%t/t;this.directionBackwards&&(t=1-t);this.morphTargetInfluences[this.currentKeyframe]=t;this.morphTargetInfluences[this.lastKeyframe]=1-t};THREE.MorphAnimMesh.prototype.clone=function(e){void 0===e&&(e=new THREE.MorphAnimMesh(this.geometry,this.material));e.duration=this.duration;e.mirroredLoop=this.mirroredLoop;e.time=this.time;e.lastKeyframe=this.lastKeyframe;e.currentKeyframe=this.currentKeyframe;e.direction=this.direction;e.directionBackwards=this.directionBackwards;THREE.Mesh.prototype.clone.call(this,e);return e};THREE.LOD=function(){THREE.Object3D.call(this);this.objects=[]};THREE.LOD.prototype=Object.create(THREE.Object3D.prototype);THREE.LOD.prototype.addLevel=function(e,t){void 0===t&&(t=0);for(var t=Math.abs(t),n=0;n<this.objects.length&&!(t<this.objects[n].distance);n++);this.objects.splice(n,0,{distance:t,object:e});this.add(e)};THREE.LOD.prototype.getObjectForDistance=function(e){for(var t=1,n=this.objects.length;t<n&&!(e<this.objects[t].distance);t++);return this.objects[t-1].object};THREE.LOD.prototype.update=function(){var e=new THREE.Vector3,t=new THREE.Vector3;return function(n){if(1<this.objects.length){e.setFromMatrixPosition(n.matrixWorld);t.setFromMatrixPosition(this.matrixWorld);n=e.distanceTo(t);this.objects[0].object.visible=!0;for(var r=1,i=this.objects.length;r<i;r++)if(n>=this.objects[r].distance)this.objects[r-1].object.visible=!1,this.objects[r].object.visible=!0;else break;for(;r<i;r++)this.objects[r].object.visible=!1}}}();THREE.LOD.prototype.clone=function(){};THREE.Sprite=function(e){THREE.Object3D.call(this);this.material=void 0!==e?e:new THREE.SpriteMaterial};THREE.Sprite.prototype=Object.create(THREE.Object3D.prototype);THREE.Sprite.prototype.updateMatrix=function(){this.matrix.compose(this.position,this.quaternion,this.scale);this.matrixWorldNeedsUpdate=!0};THREE.Sprite.prototype.clone=function(e){void 0===e&&(e=new THREE.Sprite(this.material));THREE.Object3D.prototype.clone.call(this,e);return e};THREE.Particle=THREE.Sprite;THREE.Scene=function(){THREE.Object3D.call(this);this.overrideMaterial=this.fog=null;this.autoUpdate=!0;this.matrixAutoUpdate=!1;this.__lights=[];this.__objectsAdded=[];this.__objectsRemoved=[]};THREE.Scene.prototype=Object.create(THREE.Object3D.prototype);THREE.Scene.prototype.__addObject=function(e){if(e instanceof THREE.Light)-1===this.__lights.indexOf(e)&&this.__lights.push(e),e.target&&void 0===e.target.parent&&this.add(e.target);else if(!(e instanceof THREE.Camera||e instanceof THREE.Bone)){this.__objectsAdded.push(e);var t=this.__objectsRemoved.indexOf(e);-1!==t&&this.__objectsRemoved.splice(t,1)}for(t=0;t<e.children.length;t++)this.__addObject(e.children[t])};THREE.Scene.prototype.__removeObject=function(e){if(e instanceof THREE.Light){var t=this.__lights.indexOf(e);-1!==t&&this.__lights.splice(t,1);if(e.shadowCascadeArray)for(t=0;t<e.shadowCascadeArray.length;t++)this.__removeObject(e.shadowCascadeArray[t])}else e instanceof THREE.Camera||(this.__objectsRemoved.push(e),t=this.__objectsAdded.indexOf(e),-1!==t&&this.__objectsAdded.splice(t,1));for(t=0;t<e.children.length;t++)this.__removeObject(e.children[t])};THREE.Scene.prototype.clone=function(e){void 0===e&&(e=new THREE.Scene);THREE.Object3D.prototype.clone.call(this,e);null!==this.fog&&(e.fog=this.fog.clone());null!==this.overrideMaterial&&(e.overrideMaterial=this.overrideMaterial.clone());e.autoUpdate=this.autoUpdate;e.matrixAutoUpdate=this.matrixAutoUpdate;return e};THREE.Fog=function(e,t,n){this.name=\"\";this.color=new THREE.Color(e);this.near=void 0!==t?t:1;this.far=void 0!==n?n:1e3};THREE.Fog.prototype.clone=function(){return new THREE.Fog(this.color.getHex(),this.near,this.far)};THREE.FogExp2=function(e,t){this.name=\"\";this.color=new THREE.Color(e);this.density=void 0!==t?t:25e-5};THREE.FogExp2.prototype.clone=function(){return new THREE.FogExp2(this.color.getHex(),this.density)};THREE.CanvasRenderer=function(e){function t(e,t,n){for(var r=0,i=w.length;r<i;r++){var s=w[r];nt.copy(s.color);if(s instanceof THREE.DirectionalLight){var o=Et.setFromMatrixPosition(s.matrixWorld).normalize(),u=t.dot(o);0>=u||(u*=s.intensity,n.add(nt.multiplyScalar(u)))}else s instanceof THREE.PointLight&&(o=Et.setFromMatrixPosition(s.matrixWorld),u=t.dot(Et.subVectors(o,e).normalize()),0>=u||(u*=0==s.distance?1:1-Math.min(e.distanceTo(o)/s.distance,1),0!=u&&(u*=s.intensity,n.add(nt.multiplyScalar(u)))))}}function n(e,t,n,r){l(t);c(n);h(r);p(e.getStyle());k.stroke();gt.expandByScalar(2*t)}function r(e){d(e.getStyle());k.fill()}function i(e,t,n,i,s,o,u,a,f,l,c,h,p){if(!(p instanceof THREE.DataTexture||void 0===p.image||0===p.image.width)){if(!0===p.needsUpdate){var v=p.wrapS===THREE.RepeatWrapping,m=p.wrapT===THREE.RepeatWrapping;rt[p.id]=k.createPattern(p.image,!0===v&&!0===m?\"repeat\":!0===v&&!1===m?\"repeat-x\":!1===v&&!0===m?\"repeat-y\":\"no-repeat\");p.needsUpdate=!1}void 0===rt[p.id]?d(\"rgba(0,0,0,1)\"):d(rt[p.id]);var v=p.offset.x/p.repeat.x,m=p.offset.y/p.repeat.y,g=p.image.width*p.repeat.x,y=p.image.height*p.repeat.y,u=(u+v)*g,a=(1-a+m)*y,n=n-e,i=i-t,s=s-e,o=o-t,f=(f+v)*g-u,l=(1-l+m)*y-a,c=(c+v)*g-u,h=(1-h+m)*y-a,v=f*h-c*l;0===v?(void 0===it[p.id]&&(t=document.createElement(\"canvas\"),t.width=p.image.width,t.height=p.image.height,t=t.getContext(\"2d\"),t.drawImage(p.image,0,0),it[p.id]=t.getImageData(0,0,p.image.width,p.image.height).data),t=it[p.id],u=4*(Math.floor(u)+Math.floor(a)*p.image.width),K.setRGB(t[u]/255,t[u+1]/255,t[u+2]/255),r(K)):(v=1/v,p=(h*n-l*s)*v,l=(h*i-l*o)*v,n=(f*s-c*n)*v,i=(f*o-c*i)*v,e=e-p*u-n*a,u=t-l*u-i*a,k.save(),k.transform(p,l,n,i,e,u),k.fill(),k.restore())}}function s(e,t,n,r,i,s,o,u,a,f,l,c,h){var p,d;p=h.width-1;d=h.height-1;o*=p;u*=d;n-=e;r-=t;i-=e;s-=t;a=a*p-o;f=f*d-u;l=l*p-o;c=c*d-u;d=1/(a*c-l*f);p=(c*n-f*i)*d;f=(c*r-f*s)*d;n=(a*i-l*n)*d;r=(a*s-l*r)*d;e=e-p*o-n*u;t=t-f*o-r*u;k.save();k.transform(p,f,n,r,e,t);k.clip();k.drawImage(h,0,0);k.restore()}function o(e,t,n,r){Nt[0]=255*e.r|0;Nt[1]=255*e.g|0;Nt[2]=255*e.b|0;Nt[4]=255*t.r|0;Nt[5]=255*t.g|0;Nt[6]=255*t.b|0;Nt[8]=255*n.r|0;Nt[9]=255*n.g|0;Nt[10]=255*n.b|0;Nt[12]=255*r.r|0;Nt[13]=255*r.g|0;Nt[14]=255*r.b|0;xt.putImageData(Tt,0,0);kt.drawImage(St,0,0);return Ct}function u(e,t,n){var r=t.x-e.x,i=t.y-e.y,s=r*r+i*i;0!==s&&(n/=Math.sqrt(s),r*=n,i*=n,t.x+=r,t.y+=i,e.x-=r,e.y-=i)}function a(e){O!==e&&(O=k.globalAlpha=e)}function f(e){M!==e&&(e===THREE.NormalBlending?k.globalCompositeOperation=\"source-over\":e===THREE.AdditiveBlending?k.globalCompositeOperation=\"lighter\":e===THREE.SubtractiveBlending&&(k.globalCompositeOperation=\"darker\"),M=e)}function l(e){P!==e&&(P=k.lineWidth=e)}function c(e){H!==e&&(H=k.lineCap=e)}function h(e){B!==e&&(B=k.lineJoin=e)}function p(e){_!==e&&(_=k.strokeStyle=e)}function d(e){D!==e&&(D=k.fillStyle=e)}function v(e,t){if(j!==e||F!==t)k.setLineDash([e,t]),j=e,F=t}console.log(\"THREE.CanvasRenderer\",THREE.REVISION);var m=THREE.Math.smoothstep,e=e||{},g=this,y,b,w,E=new THREE.Projector,S=void 0!==e.canvas?e.canvas:document.createElement(\"canvas\"),x=S.width,T=S.height,N=Math.floor(x/2),C=Math.floor(T/2),k=S.getContext(\"2d\"),L=new THREE.Color(0),A=0,O=1,M=0,_=null,D=null,P=null,H=null,B=null,j=null,F=0,I,q,R,U;new THREE.RenderableVertex;new THREE.RenderableVertex;var z,W,X,V,$,J,K=new THREE.Color,Q=new THREE.Color,G=new THREE.Color,Y=new THREE.Color,Z=new THREE.Color,et=new THREE.Color,tt=new THREE.Color,nt=new THREE.Color,rt={},it={},st,ot,ut,at,ft,lt,ct,ht,pt,dt,vt=new THREE.Box2,mt=new THREE.Box2,gt=new THREE.Box2,yt=new THREE.Color,bt=new THREE.Color,wt=new THREE.Color,Et=new THREE.Vector3,St,xt,Tt,Nt,Ct,kt,Lt=16;St=document.createElement(\"canvas\");St.width=St.height=2;xt=St.getContext(\"2d\");xt.fillStyle=\"rgba(0,0,0,1)\";xt.fillRect(0,0,2,2);Tt=xt.getImageData(0,0,2,2);Nt=Tt.data;Ct=document.createElement(\"canvas\");Ct.width=Ct.height=Lt;kt=Ct.getContext(\"2d\");kt.translate(-Lt/2,-Lt/2);kt.scale(Lt,Lt);Lt--;void 0===k.setLineDash&&(k.setLineDash=void 0!==k.mozDash?function(e){k.mozDash=null!==e[0]?e:null}:function(){});this.domElement=S;this.devicePixelRatio=void 0!==e.devicePixelRatio?e.devicePixelRatio:void 0!==self.devicePixelRatio?self.devicePixelRatio:1;this.sortElements=this.sortObjects=this.autoClear=!0;this.info={render:{vertices:0,faces:0}};this.supportsVertexTextures=function(){};this.setFaceCulling=function(){};this.setSize=function(e,t,n){x=e*this.devicePixelRatio;T=t*this.devicePixelRatio;N=Math.floor(x/2);C=Math.floor(T/2);S.width=x;S.height=T;1!==this.devicePixelRatio&&!1!==n&&(S.style.width=e+\"px\",S.style.height=t+\"px\");vt.set(new THREE.Vector2(-N,-C),new THREE.Vector2(N,C));mt.set(new THREE.Vector2(-N,-C),new THREE.Vector2(N,C));O=1;M=0;B=H=P=D=_=null};this.setClearColor=function(e,t){L.set(e);A=void 0!==t?t:1;mt.set(new THREE.Vector2(-N,-C),new THREE.Vector2(N,C))};this.setClearColorHex=function(e,t){console.warn(\"DEPRECATED: .setClearColorHex() is being removed. Use .setClearColor() instead.\");this.setClearColor(e,t)};this.getMaxAnisotropy=function(){return 0};this.clear=function(){k.setTransform(1,0,0,-1,N,C);!1===mt.empty()&&(mt.intersect(vt),mt.expandByScalar(2),1>A&&k.clearRect(mt.min.x|0,mt.min.y|0,mt.max.x-mt.min.x|0,mt.max.y-mt.min.y|0),0<A&&(f(THREE.NormalBlending),a(1),d(\"rgba(\"+Math.floor(255*L.r)+\",\"+Math.floor(255*L.g)+\",\"+Math.floor(255*L.b)+\",\"+A+\")\"),k.fillRect(mt.min.x|0,mt.min.y|0,mt.max.x-mt.min.x|0,mt.max.y-mt.min.y|0)),mt.makeEmpty())};this.clearColor=function(){};this.clearDepth=function(){};this.clearStencil=function(){};this.render=function(e,S){if(!1===S instanceof THREE.Camera)console.error(\"THREE.CanvasRenderer.render: camera is not an instance of THREE.Camera.\");else{!0===this.autoClear&&this.clear();k.setTransform(1,0,0,-1,N,C);g.info.render.vertices=0;g.info.render.faces=0;y=E.projectScene(e,S,this.sortObjects,this.sortElements);b=y.elements;w=y.lights;I=S;yt.setRGB(0,0,0);bt.setRGB(0,0,0);wt.setRGB(0,0,0);for(var x=0,T=w.length;x<T;x++){var L=w[x],A=L.color;L instanceof THREE.AmbientLight?yt.add(A):L instanceof THREE.DirectionalLight?bt.add(A):L instanceof THREE.PointLight&&wt.add(A)}x=0;for(T=b.length;x<T;x++){var O=b[x],M=O.material;if(!(void 0===M||!1===M.visible)){gt.makeEmpty();if(O instanceof THREE.RenderableSprite){q=O;q.x*=N;q.y*=C;var L=q,A=O,_=M;a(_.opacity);f(_.blending);var O=A.scale.x*N,M=A.scale.y*C,D=.5*Math.sqrt(O*O+M*M);gt.min.set(L.x-D,L.y-D);gt.max.set(L.x+D,L.y+D);!1===vt.isIntersectionBox(gt)?gt.makeEmpty():_ instanceof THREE.SpriteMaterial||_ instanceof THREE.ParticleSystemMaterial?(null!==_.map?(A=_.map.image,k.save(),k.translate(L.x,L.y),k.rotate(_.rotation),k.scale(O,-M),k.drawImage(A,0,0,A.width,A.height,-.5,-.5,1,1)):(d(_.color.getStyle()),k.save(),k.translate(L.x,L.y),k.rotate(_.rotation),k.scale(O,-M),k.fillRect(-.5,-.5,1,1)),k.restore()):_ instanceof THREE.SpriteCanvasMaterial&&(p(_.color.getStyle()),d(_.color.getStyle()),k.save(),k.translate(L.x,L.y),k.rotate(-A.rotation),k.scale(O,M),_.program(k),k.restore())}else if(O instanceof THREE.RenderableLine){if(q=O.v1,R=O.v2,q.positionScreen.x*=N,q.positionScreen.y*=C,R.positionScreen.x*=N,R.positionScreen.y*=C,gt.setFromPoints([q.positionScreen,R.positionScreen]),!0===vt.isIntersectionBox(gt))if(L=q,A=R,_=O,O=M,a(O.opacity),f(O.blending),k.beginPath(),k.moveTo(L.positionScreen.x,L.positionScreen.y),k.lineTo(A.positionScreen.x,A.positionScreen.y),O instanceof THREE.LineBasicMaterial){l(O.linewidth);c(O.linecap);h(O.linejoin);if(O.vertexColors!==THREE.VertexColors)p(O.color.getStyle());else if(M=_.vertexColors[0].getStyle(),_=_.vertexColors[1].getStyle(),M===_)p(M);else{try{var P=k.createLinearGradient(L.positionScreen.x,L.positionScreen.y,A.positionScreen.x,A.positionScreen.y);P.addColorStop(0,M);P.addColorStop(1,_)}catch(H){P=M}p(P)}k.stroke();gt.expandByScalar(2*O.linewidth)}else O instanceof THREE.LineDashedMaterial&&(l(O.linewidth),c(O.linecap),h(O.linejoin),p(O.color.getStyle()),v(O.dashSize,O.gapSize),k.stroke(),gt.expandByScalar(2*O.linewidth),v(null,null))}else if(O instanceof THREE.RenderableFace3){q=O.v1;R=O.v2;U=O.v3;if(-1>q.positionScreen.z||1<q.positionScreen.z)continue;if(-1>R.positionScreen.z||1<R.positionScreen.z)continue;if(-1>U.positionScreen.z||1<U.positionScreen.z)continue;q.positionScreen.x*=N;q.positionScreen.y*=C;R.positionScreen.x*=N;R.positionScreen.y*=C;U.positionScreen.x*=N;U.positionScreen.y*=C;0<M.overdraw&&(u(q.positionScreen,R.positionScreen,M.overdraw),u(R.positionScreen,U.positionScreen,M.overdraw),u(U.positionScreen,q.positionScreen,M.overdraw));gt.setFromPoints([q.positionScreen,R.positionScreen,U.positionScreen]);if(!0===vt.isIntersectionBox(gt)){L=q;A=R;_=U;g.info.render.vertices+=3;g.info.render.faces++;a(M.opacity);f(M.blending);z=L.positionScreen.x;W=L.positionScreen.y;X=A.positionScreen.x;V=A.positionScreen.y;$=_.positionScreen.x;J=_.positionScreen.y;var D=z,B=W,j=X,F=V,nt=$,rt=J;k.beginPath();k.moveTo(D,B);k.lineTo(j,F);k.lineTo(nt,rt);k.closePath();(M instanceof THREE.MeshLambertMaterial||M instanceof THREE.MeshPhongMaterial)&&null===M.map?(et.copy(M.color),tt.copy(M.emissive),M.vertexColors===THREE.FaceColors&&et.multiply(O.color),!1===M.wireframe&&M.shading===THREE.SmoothShading&&3===O.vertexNormalsLength?(Q.copy(yt),G.copy(yt),Y.copy(yt),t(O.v1.positionWorld,O.vertexNormalsModel[0],Q),t(O.v2.positionWorld,O.vertexNormalsModel[1],G),t(O.v3.positionWorld,O.vertexNormalsModel[2],Y),Q.multiply(et).add(tt),G.multiply(et).add(tt),Y.multiply(et).add(tt),Z.addColors(G,Y).multiplyScalar(.5),ut=o(Q,G,Y,Z),s(z,W,X,V,$,J,0,0,1,0,0,1,ut)):(K.copy(yt),t(O.centroidModel,O.normalModel,K),K.multiply(et).add(tt),!0===M.wireframe?n(K,M.wireframeLinewidth,M.wireframeLinecap,M.wireframeLinejoin):r(K))):M instanceof THREE.MeshBasicMaterial||M instanceof THREE.MeshLambertMaterial||M instanceof THREE.MeshPhongMaterial?null!==M.map?M.map.mapping instanceof THREE.UVMapping&&(at=O.uvs[0],i(z,W,X,V,$,J,at[0].x,at[0].y,at[1].x,at[1].y,at[2].x,at[2].y,M.map)):null!==M.envMap?M.envMap.mapping instanceof THREE.SphericalReflectionMapping&&(Et.copy(O.vertexNormalsModelView[0]),ft=.5*Et.x+.5,lt=.5*Et.y+.5,Et.copy(O.vertexNormalsModelView[1]),ct=.5*Et.x+.5,ht=.5*Et.y+.5,Et.copy(O.vertexNormalsModelView[2]),pt=.5*Et.x+.5,dt=.5*Et.y+.5,i(z,W,X,V,$,J,ft,lt,ct,ht,pt,dt,M.envMap)):(K.copy(M.color),M.vertexColors===THREE.FaceColors&&K.multiply(O.color),!0===M.wireframe?n(K,M.wireframeLinewidth,M.wireframeLinecap,M.wireframeLinejoin):r(K)):M instanceof THREE.MeshDepthMaterial?(st=I.near,ot=I.far,Q.r=Q.g=Q.b=1-m(L.positionScreen.z*L.positionScreen.w,st,ot),G.r=G.g=G.b=1-m(A.positionScreen.z*A.positionScreen.w,st,ot),Y.r=Y.g=Y.b=1-m(_.positionScreen.z*_.positionScreen.w,st,ot),Z.addColors(G,Y).multiplyScalar(.5),ut=o(Q,G,Y,Z),s(z,W,X,V,$,J,0,0,1,0,0,1,ut)):M instanceof THREE.MeshNormalMaterial&&(L=void 0,M.shading===THREE.FlatShading?(L=O.normalModelView,K.setRGB(L.x,L.y,L.z).multiplyScalar(.5).addScalar(.5),!0===M.wireframe?n(K,M.wireframeLinewidth,M.wireframeLinecap,M.wireframeLinejoin):r(K)):M.shading===THREE.SmoothShading&&(L=O.vertexNormalsModelView[0],Q.setRGB(L.x,L.y,L.z).multiplyScalar(.5).addScalar(.5),L=O.vertexNormalsModelView[1],G.setRGB(L.x,L.y,L.z).multiplyScalar(.5).addScalar(.5),L=O.vertexNormalsModelView[2],Y.setRGB(L.x,L.y,L.z).multiplyScalar(.5).addScalar(.5),Z.addColors(G,Y).multiplyScalar(.5),ut=o(Q,G,Y,Z),s(z,W,X,V,$,J,0,0,1,0,0,1,ut)))}}mt.union(gt)}}k.setTransform(1,0,0,1,0,0)}}};THREE.ShaderChunk={fog_pars_fragment:\"#ifdef USE_FOG\\nuniform vec3 fogColor;\\n#ifdef FOG_EXP2\\nuniform float fogDensity;\\n#else\\nuniform float fogNear;\\nuniform float fogFar;\\n#endif\\n#endif\",fog_fragment:\"#ifdef USE_FOG\\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\\n#ifdef FOG_EXP2\\nconst float LOG2 = 1.442695;\\nfloat fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );\\nfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\\n#else\\nfloat fogFactor = smoothstep( fogNear, fogFar, depth );\\n#endif\\ngl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );\\n#endif\",envmap_pars_fragment:\"#ifdef USE_ENVMAP\\nuniform float reflectivity;\\nuniform samplerCube envMap;\\nuniform float flipEnvMap;\\nuniform int combine;\\n#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\\nuniform bool useRefract;\\nuniform float refractionRatio;\\n#else\\nvarying vec3 vReflect;\\n#endif\\n#endif\",envmap_fragment:\"#ifdef USE_ENVMAP\\nvec3 reflectVec;\\n#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\\nvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\\nif ( useRefract ) {\\nreflectVec = refract( cameraToVertex, normal, refractionRatio );\\n} else { \\nreflectVec = reflect( cameraToVertex, normal );\\n}\\n#else\\nreflectVec = vReflect;\\n#endif\\n#ifdef DOUBLE_SIDED\\nfloat flipNormal = ( -1.0 + 2.0 * float( gl_FrontFacing ) );\\nvec4 cubeColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\\n#else\\nvec4 cubeColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\\n#endif\\n#ifdef GAMMA_INPUT\\ncubeColor.xyz *= cubeColor.xyz;\\n#endif\\nif ( combine == 1 ) {\\ngl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, specularStrength * reflectivity );\\n} else if ( combine == 2 ) {\\ngl_FragColor.xyz += cubeColor.xyz * specularStrength * reflectivity;\\n} else {\\ngl_FragColor.xyz = mix( gl_FragColor.xyz, gl_FragColor.xyz * cubeColor.xyz, specularStrength * reflectivity );\\n}\\n#endif\",envmap_pars_vertex:\"#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP ) && ! defined( USE_NORMALMAP )\\nvarying vec3 vReflect;\\nuniform float refractionRatio;\\nuniform bool useRefract;\\n#endif\",worldpos_vertex:\"#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )\\n#ifdef USE_SKINNING\\nvec4 worldPosition = modelMatrix * skinned;\\n#endif\\n#if defined( USE_MORPHTARGETS ) && ! defined( USE_SKINNING )\\nvec4 worldPosition = modelMatrix * vec4( morphed, 1.0 );\\n#endif\\n#if ! defined( USE_MORPHTARGETS ) && ! defined( USE_SKINNING )\\nvec4 worldPosition = modelMatrix * vec4( position, 1.0 );\\n#endif\\n#endif\",envmap_vertex:\"#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP ) && ! defined( USE_NORMALMAP )\\nvec3 worldNormal = mat3( modelMatrix[ 0 ].xyz, modelMatrix[ 1 ].xyz, modelMatrix[ 2 ].xyz ) * objectNormal;\\nworldNormal = normalize( worldNormal );\\nvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\\nif ( useRefract ) {\\nvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\\n} else {\\nvReflect = reflect( cameraToVertex, worldNormal );\\n}\\n#endif\",map_particle_pars_fragment:\"#ifdef USE_MAP\\nuniform sampler2D map;\\n#endif\",map_particle_fragment:\"#ifdef USE_MAP\\ngl_FragColor = gl_FragColor * texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) );\\n#endif\",map_pars_vertex:\"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP )\\nvarying vec2 vUv;\\nuniform vec4 offsetRepeat;\\n#endif\",map_pars_fragment:\"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP )\\nvarying vec2 vUv;\\n#endif\\n#ifdef USE_MAP\\nuniform sampler2D map;\\n#endif\",map_vertex:\"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP )\\nvUv = uv * offsetRepeat.zw + offsetRepeat.xy;\\n#endif\",map_fragment:\"#ifdef USE_MAP\\nvec4 texelColor = texture2D( map, vUv );\\n#ifdef GAMMA_INPUT\\ntexelColor.xyz *= texelColor.xyz;\\n#endif\\ngl_FragColor = gl_FragColor * texelColor;\\n#endif\",lightmap_pars_fragment:\"#ifdef USE_LIGHTMAP\\nvarying vec2 vUv2;\\nuniform sampler2D lightMap;\\n#endif\",lightmap_pars_vertex:\"#ifdef USE_LIGHTMAP\\nvarying vec2 vUv2;\\n#endif\",lightmap_fragment:\"#ifdef USE_LIGHTMAP\\ngl_FragColor = gl_FragColor * texture2D( lightMap, vUv2 );\\n#endif\",lightmap_vertex:\"#ifdef USE_LIGHTMAP\\nvUv2 = uv2;\\n#endif\",bumpmap_pars_fragment:\"#ifdef USE_BUMPMAP\\nuniform sampler2D bumpMap;\\nuniform float bumpScale;\\nvec2 dHdxy_fwd() {\\nvec2 dSTdx = dFdx( vUv );\\nvec2 dSTdy = dFdy( vUv );\\nfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\\nfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\\nfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\\nreturn vec2( dBx, dBy );\\n}\\nvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\\nvec3 vSigmaX = dFdx( surf_pos );\\nvec3 vSigmaY = dFdy( surf_pos );\\nvec3 vN = surf_norm;\\nvec3 R1 = cross( vSigmaY, vN );\\nvec3 R2 = cross( vN, vSigmaX );\\nfloat fDet = dot( vSigmaX, R1 );\\nvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\\nreturn normalize( abs( fDet ) * surf_norm - vGrad );\\n}\\n#endif\",normalmap_pars_fragment:\"#ifdef USE_NORMALMAP\\nuniform sampler2D normalMap;\\nuniform vec2 normalScale;\\nvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\\nvec3 q0 = dFdx( eye_pos.xyz );\\nvec3 q1 = dFdy( eye_pos.xyz );\\nvec2 st0 = dFdx( vUv.st );\\nvec2 st1 = dFdy( vUv.st );\\nvec3 S = normalize( q0 * st1.t - q1 * st0.t );\\nvec3 T = normalize( -q0 * st1.s + q1 * st0.s );\\nvec3 N = normalize( surf_norm );\\nvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\\nmapN.xy = normalScale * mapN.xy;\\nmat3 tsn = mat3( S, T, N );\\nreturn normalize( tsn * mapN );\\n}\\n#endif\",specularmap_pars_fragment:\"#ifdef USE_SPECULARMAP\\nuniform sampler2D specularMap;\\n#endif\",specularmap_fragment:\"float specularStrength;\\n#ifdef USE_SPECULARMAP\\nvec4 texelSpecular = texture2D( specularMap, vUv );\\nspecularStrength = texelSpecular.r;\\n#else\\nspecularStrength = 1.0;\\n#endif\",lights_lambert_pars_vertex:\"uniform vec3 ambient;\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform vec3 ambientLightColor;\\n#if MAX_DIR_LIGHTS > 0\\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\\n#endif\\n#if MAX_HEMI_LIGHTS > 0\\nuniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];\\nuniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];\\nuniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nuniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\\nuniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\\n#endif\\n#ifdef WRAP_AROUND\\nuniform vec3 wrapRGB;\\n#endif\",lights_lambert_vertex:\"vLightFront = vec3( 0.0 );\\n#ifdef DOUBLE_SIDED\\nvLightBack = vec3( 0.0 );\\n#endif\\ntransformedNormal = normalize( transformedNormal );\\n#if MAX_DIR_LIGHTS > 0\\nfor( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\\nvec3 dirVector = normalize( lDirection.xyz );\\nfloat dotProduct = dot( transformedNormal, dirVector );\\nvec3 directionalLightWeighting = vec3( max( dotProduct, 0.0 ) );\\n#ifdef DOUBLE_SIDED\\nvec3 directionalLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\\n#ifdef WRAP_AROUND\\nvec3 directionalLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\\n#endif\\n#endif\\n#ifdef WRAP_AROUND\\nvec3 directionalLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\\ndirectionalLightWeighting = mix( directionalLightWeighting, directionalLightWeightingHalf, wrapRGB );\\n#ifdef DOUBLE_SIDED\\ndirectionalLightWeightingBack = mix( directionalLightWeightingBack, directionalLightWeightingHalfBack, wrapRGB );\\n#endif\\n#endif\\nvLightFront += directionalLightColor[ i ] * directionalLightWeighting;\\n#ifdef DOUBLE_SIDED\\nvLightBack += directionalLightColor[ i ] * directionalLightWeightingBack;\\n#endif\\n}\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nfor( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( pointLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\\nlVector = normalize( lVector );\\nfloat dotProduct = dot( transformedNormal, lVector );\\nvec3 pointLightWeighting = vec3( max( dotProduct, 0.0 ) );\\n#ifdef DOUBLE_SIDED\\nvec3 pointLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\\n#ifdef WRAP_AROUND\\nvec3 pointLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\\n#endif\\n#endif\\n#ifdef WRAP_AROUND\\nvec3 pointLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\\npointLightWeighting = mix( pointLightWeighting, pointLightWeightingHalf, wrapRGB );\\n#ifdef DOUBLE_SIDED\\npointLightWeightingBack = mix( pointLightWeightingBack, pointLightWeightingHalfBack, wrapRGB );\\n#endif\\n#endif\\nvLightFront += pointLightColor[ i ] * pointLightWeighting * lDistance;\\n#ifdef DOUBLE_SIDED\\nvLightBack += pointLightColor[ i ] * pointLightWeightingBack * lDistance;\\n#endif\\n}\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nfor( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\\nfloat spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - worldPosition.xyz ) );\\nif ( spotEffect > spotLightAngleCos[ i ] ) {\\nspotEffect = max( pow( spotEffect, spotLightExponent[ i ] ), 0.0 );\\nfloat lDistance = 1.0;\\nif ( spotLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\\nlVector = normalize( lVector );\\nfloat dotProduct = dot( transformedNormal, lVector );\\nvec3 spotLightWeighting = vec3( max( dotProduct, 0.0 ) );\\n#ifdef DOUBLE_SIDED\\nvec3 spotLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\\n#ifdef WRAP_AROUND\\nvec3 spotLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\\n#endif\\n#endif\\n#ifdef WRAP_AROUND\\nvec3 spotLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\\nspotLightWeighting = mix( spotLightWeighting, spotLightWeightingHalf, wrapRGB );\\n#ifdef DOUBLE_SIDED\\nspotLightWeightingBack = mix( spotLightWeightingBack, spotLightWeightingHalfBack, wrapRGB );\\n#endif\\n#endif\\nvLightFront += spotLightColor[ i ] * spotLightWeighting * lDistance * spotEffect;\\n#ifdef DOUBLE_SIDED\\nvLightBack += spotLightColor[ i ] * spotLightWeightingBack * lDistance * spotEffect;\\n#endif\\n}\\n}\\n#endif\\n#if MAX_HEMI_LIGHTS > 0\\nfor( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {\\nvec4 lDirection = viewMatrix * vec4( hemisphereLightDirection[ i ], 0.0 );\\nvec3 lVector = normalize( lDirection.xyz );\\nfloat dotProduct = dot( transformedNormal, lVector );\\nfloat hemiDiffuseWeight = 0.5 * dotProduct + 0.5;\\nfloat hemiDiffuseWeightBack = -0.5 * dotProduct + 0.5;\\nvLightFront += mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );\\n#ifdef DOUBLE_SIDED\\nvLightBack += mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeightBack );\\n#endif\\n}\\n#endif\\nvLightFront = vLightFront * diffuse + ambient * ambientLightColor + emissive;\\n#ifdef DOUBLE_SIDED\\nvLightBack = vLightBack * diffuse + ambient * ambientLightColor + emissive;\\n#endif\",lights_phong_pars_vertex:\"#ifndef PHONG_PER_PIXEL\\n#if MAX_POINT_LIGHTS > 0\\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\\nvarying vec4 vSpotLight[ MAX_SPOT_LIGHTS ];\\n#endif\\n#endif\\n#if MAX_SPOT_LIGHTS > 0 || defined( USE_BUMPMAP )\\nvarying vec3 vWorldPosition;\\n#endif\",lights_phong_vertex:\"#ifndef PHONG_PER_PIXEL\\n#if MAX_POINT_LIGHTS > 0\\nfor( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( pointLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\\nvPointLight[ i ] = vec4( lVector, lDistance );\\n}\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nfor( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( spotLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\\nvSpotLight[ i ] = vec4( lVector, lDistance );\\n}\\n#endif\\n#endif\\n#if MAX_SPOT_LIGHTS > 0 || defined( USE_BUMPMAP )\\nvWorldPosition = worldPosition.xyz;\\n#endif\",lights_phong_pars_fragment:\"uniform vec3 ambientLightColor;\\n#if MAX_DIR_LIGHTS > 0\\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\\n#endif\\n#if MAX_HEMI_LIGHTS > 0\\nuniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];\\nuniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];\\nuniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\\n#ifdef PHONG_PER_PIXEL\\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\\n#else\\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\\n#endif\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nuniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\\nuniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\\n#ifdef PHONG_PER_PIXEL\\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\\n#else\\nvarying vec4 vSpotLight[ MAX_SPOT_LIGHTS ];\\n#endif\\n#endif\\n#if MAX_SPOT_LIGHTS > 0 || defined( USE_BUMPMAP )\\nvarying vec3 vWorldPosition;\\n#endif\\n#ifdef WRAP_AROUND\\nuniform vec3 wrapRGB;\\n#endif\\nvarying vec3 vViewPosition;\\nvarying vec3 vNormal;\",lights_phong_fragment:\"vec3 normal = normalize( vNormal );\\nvec3 viewPosition = normalize( vViewPosition );\\n#ifdef DOUBLE_SIDED\\nnormal = normal * ( -1.0 + 2.0 * float( gl_FrontFacing ) );\\n#endif\\n#ifdef USE_NORMALMAP\\nnormal = perturbNormal2Arb( -vViewPosition, normal );\\n#elif defined( USE_BUMPMAP )\\nnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nvec3 pointDiffuse = vec3( 0.0 );\\nvec3 pointSpecular = vec3( 0.0 );\\nfor ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\\n#ifdef PHONG_PER_PIXEL\\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz + vViewPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( pointLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\\nlVector = normalize( lVector );\\n#else\\nvec3 lVector = normalize( vPointLight[ i ].xyz );\\nfloat lDistance = vPointLight[ i ].w;\\n#endif\\nfloat dotProduct = dot( normal, lVector );\\n#ifdef WRAP_AROUND\\nfloat pointDiffuseWeightFull = max( dotProduct, 0.0 );\\nfloat pointDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\\nvec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );\\n#else\\nfloat pointDiffuseWeight = max( dotProduct, 0.0 );\\n#endif\\npointDiffuse += diffuse * pointLightColor[ i ] * pointDiffuseWeight * lDistance;\\nvec3 pointHalfVector = normalize( lVector + viewPosition );\\nfloat pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );\\nfloat pointSpecularWeight = specularStrength * max( pow( pointDotNormalHalf, shininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, pointHalfVector ), 5.0 );\\npointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance * specularNormalization;\\n#else\\npointSpecular += specular * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance;\\n#endif\\n}\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nvec3 spotDiffuse = vec3( 0.0 );\\nvec3 spotSpecular = vec3( 0.0 );\\nfor ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\\n#ifdef PHONG_PER_PIXEL\\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\\nvec3 lVector = lPosition.xyz + vViewPosition.xyz;\\nfloat lDistance = 1.0;\\nif ( spotLightDistance[ i ] > 0.0 )\\nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\\nlVector = normalize( lVector );\\n#else\\nvec3 lVector = normalize( vSpotLight[ i ].xyz );\\nfloat lDistance = vSpotLight[ i ].w;\\n#endif\\nfloat spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - vWorldPosition ) );\\nif ( spotEffect > spotLightAngleCos[ i ] ) {\\nspotEffect = max( pow( spotEffect, spotLightExponent[ i ] ), 0.0 );\\nfloat dotProduct = dot( normal, lVector );\\n#ifdef WRAP_AROUND\\nfloat spotDiffuseWeightFull = max( dotProduct, 0.0 );\\nfloat spotDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\\nvec3 spotDiffuseWeight = mix( vec3 ( spotDiffuseWeightFull ), vec3( spotDiffuseWeightHalf ), wrapRGB );\\n#else\\nfloat spotDiffuseWeight = max( dotProduct, 0.0 );\\n#endif\\nspotDiffuse += diffuse * spotLightColor[ i ] * spotDiffuseWeight * lDistance * spotEffect;\\nvec3 spotHalfVector = normalize( lVector + viewPosition );\\nfloat spotDotNormalHalf = max( dot( normal, spotHalfVector ), 0.0 );\\nfloat spotSpecularWeight = specularStrength * max( pow( spotDotNormalHalf, shininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, spotHalfVector ), 5.0 );\\nspotSpecular += schlick * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * lDistance * specularNormalization * spotEffect;\\n#else\\nspotSpecular += specular * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * lDistance * spotEffect;\\n#endif\\n}\\n}\\n#endif\\n#if MAX_DIR_LIGHTS > 0\\nvec3 dirDiffuse = vec3( 0.0 );\\nvec3 dirSpecular = vec3( 0.0 );\\nfor( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\\nvec3 dirVector = normalize( lDirection.xyz );\\nfloat dotProduct = dot( normal, dirVector );\\n#ifdef WRAP_AROUND\\nfloat dirDiffuseWeightFull = max( dotProduct, 0.0 );\\nfloat dirDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\\nvec3 dirDiffuseWeight = mix( vec3( dirDiffuseWeightFull ), vec3( dirDiffuseWeightHalf ), wrapRGB );\\n#else\\nfloat dirDiffuseWeight = max( dotProduct, 0.0 );\\n#endif\\ndirDiffuse += diffuse * directionalLightColor[ i ] * dirDiffuseWeight;\\nvec3 dirHalfVector = normalize( dirVector + viewPosition );\\nfloat dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );\\nfloat dirSpecularWeight = specularStrength * max( pow( dirDotNormalHalf, shininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( dirVector, dirHalfVector ), 5.0 );\\ndirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;\\n#else\\ndirSpecular += specular * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight;\\n#endif\\n}\\n#endif\\n#if MAX_HEMI_LIGHTS > 0\\nvec3 hemiDiffuse = vec3( 0.0 );\\nvec3 hemiSpecular = vec3( 0.0 );\\nfor( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {\\nvec4 lDirection = viewMatrix * vec4( hemisphereLightDirection[ i ], 0.0 );\\nvec3 lVector = normalize( lDirection.xyz );\\nfloat dotProduct = dot( normal, lVector );\\nfloat hemiDiffuseWeight = 0.5 * dotProduct + 0.5;\\nvec3 hemiColor = mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );\\nhemiDiffuse += diffuse * hemiColor;\\nvec3 hemiHalfVectorSky = normalize( lVector + viewPosition );\\nfloat hemiDotNormalHalfSky = 0.5 * dot( normal, hemiHalfVectorSky ) + 0.5;\\nfloat hemiSpecularWeightSky = specularStrength * max( pow( hemiDotNormalHalfSky, shininess ), 0.0 );\\nvec3 lVectorGround = -lVector;\\nvec3 hemiHalfVectorGround = normalize( lVectorGround + viewPosition );\\nfloat hemiDotNormalHalfGround = 0.5 * dot( normal, hemiHalfVectorGround ) + 0.5;\\nfloat hemiSpecularWeightGround = specularStrength * max( pow( hemiDotNormalHalfGround, shininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat dotProductGround = dot( normal, lVectorGround );\\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\\nvec3 schlickSky = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, hemiHalfVectorSky ), 5.0 );\\nvec3 schlickGround = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVectorGround, hemiHalfVectorGround ), 5.0 );\\nhemiSpecular += hemiColor * specularNormalization * ( schlickSky * hemiSpecularWeightSky * max( dotProduct, 0.0 ) + schlickGround * hemiSpecularWeightGround * max( dotProductGround, 0.0 ) );\\n#else\\nhemiSpecular += specular * hemiColor * ( hemiSpecularWeightSky + hemiSpecularWeightGround ) * hemiDiffuseWeight;\\n#endif\\n}\\n#endif\\nvec3 totalDiffuse = vec3( 0.0 );\\nvec3 totalSpecular = vec3( 0.0 );\\n#if MAX_DIR_LIGHTS > 0\\ntotalDiffuse += dirDiffuse;\\ntotalSpecular += dirSpecular;\\n#endif\\n#if MAX_HEMI_LIGHTS > 0\\ntotalDiffuse += hemiDiffuse;\\ntotalSpecular += hemiSpecular;\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\ntotalDiffuse += pointDiffuse;\\ntotalSpecular += pointSpecular;\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\ntotalDiffuse += spotDiffuse;\\ntotalSpecular += spotSpecular;\\n#endif\\n#ifdef METAL\\ngl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient + totalSpecular );\\n#else\\ngl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient ) + totalSpecular;\\n#endif\",color_pars_fragment:\"#ifdef USE_COLOR\\nvarying vec3 vColor;\\n#endif\",color_fragment:\"#ifdef USE_COLOR\\ngl_FragColor = gl_FragColor * vec4( vColor, 1.0 );\\n#endif\",color_pars_vertex:\"#ifdef USE_COLOR\\nvarying vec3 vColor;\\n#endif\",color_vertex:\"#ifdef USE_COLOR\\n#ifdef GAMMA_INPUT\\nvColor = color * color;\\n#else\\nvColor = color;\\n#endif\\n#endif\",skinning_pars_vertex:\"#ifdef USE_SKINNING\\n#ifdef BONE_TEXTURE\\nuniform sampler2D boneTexture;\\nuniform int boneTextureWidth;\\nuniform int boneTextureHeight;\\nmat4 getBoneMatrix( const in float i ) {\\nfloat j = i * 4.0;\\nfloat x = mod( j, float( boneTextureWidth ) );\\nfloat y = floor( j / float( boneTextureWidth ) );\\nfloat dx = 1.0 / float( boneTextureWidth );\\nfloat dy = 1.0 / float( boneTextureHeight );\\ny = dy * ( y + 0.5 );\\nvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\\nvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\\nvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\\nvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\\nmat4 bone = mat4( v1, v2, v3, v4 );\\nreturn bone;\\n}\\n#else\\nuniform mat4 boneGlobalMatrices[ MAX_BONES ];\\nmat4 getBoneMatrix( const in float i ) {\\nmat4 bone = boneGlobalMatrices[ int(i) ];\\nreturn bone;\\n}\\n#endif\\n#endif\",skinbase_vertex:\"#ifdef USE_SKINNING\\nmat4 boneMatX = getBoneMatrix( skinIndex.x );\\nmat4 boneMatY = getBoneMatrix( skinIndex.y );\\n#endif\",skinning_vertex:\"#ifdef USE_SKINNING\\n#ifdef USE_MORPHTARGETS\\nvec4 skinVertex = vec4( morphed, 1.0 );\\n#else\\nvec4 skinVertex = vec4( position, 1.0 );\\n#endif\\nvec4 skinned = boneMatX * skinVertex * skinWeight.x;\\nskinned \t += boneMatY * skinVertex * skinWeight.y;\\n#endif\",morphtarget_pars_vertex:\"#ifdef USE_MORPHTARGETS\\n#ifndef USE_MORPHNORMALS\\nuniform float morphTargetInfluences[ 8 ];\\n#else\\nuniform float morphTargetInfluences[ 4 ];\\n#endif\\n#endif\",morphtarget_vertex:\"#ifdef USE_MORPHTARGETS\\nvec3 morphed = vec3( 0.0 );\\nmorphed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\\nmorphed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\\nmorphed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\\nmorphed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\\n#ifndef USE_MORPHNORMALS\\nmorphed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\\nmorphed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\\nmorphed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\\nmorphed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\\n#endif\\nmorphed += position;\\n#endif\",default_vertex:\"vec4 mvPosition;\\n#ifdef USE_SKINNING\\nmvPosition = modelViewMatrix * skinned;\\n#endif\\n#if !defined( USE_SKINNING ) && defined( USE_MORPHTARGETS )\\nmvPosition = modelViewMatrix * vec4( morphed, 1.0 );\\n#endif\\n#if !defined( USE_SKINNING ) && ! defined( USE_MORPHTARGETS )\\nmvPosition = modelViewMatrix * vec4( position, 1.0 );\\n#endif\\ngl_Position = projectionMatrix * mvPosition;\",morphnormal_vertex:\"#ifdef USE_MORPHNORMALS\\nvec3 morphedNormal = vec3( 0.0 );\\nmorphedNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\\nmorphedNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\\nmorphedNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\\nmorphedNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\\nmorphedNormal += normal;\\n#endif\",skinnormal_vertex:\"#ifdef USE_SKINNING\\nmat4 skinMatrix = skinWeight.x * boneMatX;\\nskinMatrix \t+= skinWeight.y * boneMatY;\\n#ifdef USE_MORPHNORMALS\\nvec4 skinnedNormal = skinMatrix * vec4( morphedNormal, 0.0 );\\n#else\\nvec4 skinnedNormal = skinMatrix * vec4( normal, 0.0 );\\n#endif\\n#endif\",defaultnormal_vertex:\"vec3 objectNormal;\\n#ifdef USE_SKINNING\\nobjectNormal = skinnedNormal.xyz;\\n#endif\\n#if !defined( USE_SKINNING ) && defined( USE_MORPHNORMALS )\\nobjectNormal = morphedNormal;\\n#endif\\n#if !defined( USE_SKINNING ) && ! defined( USE_MORPHNORMALS )\\nobjectNormal = normal;\\n#endif\\n#ifdef FLIP_SIDED\\nobjectNormal = -objectNormal;\\n#endif\\nvec3 transformedNormal = normalMatrix * objectNormal;\",shadowmap_pars_fragment:\"#ifdef USE_SHADOWMAP\\nuniform sampler2D shadowMap[ MAX_SHADOWS ];\\nuniform vec2 shadowMapSize[ MAX_SHADOWS ];\\nuniform float shadowDarkness[ MAX_SHADOWS ];\\nuniform float shadowBias[ MAX_SHADOWS ];\\nvarying vec4 vShadowCoord[ MAX_SHADOWS ];\\nfloat unpackDepth( const in vec4 rgba_depth ) {\\nconst vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\\nfloat depth = dot( rgba_depth, bit_shift );\\nreturn depth;\\n}\\n#endif\",shadowmap_fragment:\"#ifdef USE_SHADOWMAP\\n#ifdef SHADOWMAP_DEBUG\\nvec3 frustumColors[3];\\nfrustumColors[0] = vec3( 1.0, 0.5, 0.0 );\\nfrustumColors[1] = vec3( 0.0, 1.0, 0.8 );\\nfrustumColors[2] = vec3( 0.0, 0.5, 1.0 );\\n#endif\\n#ifdef SHADOWMAP_CASCADE\\nint inFrustumCount = 0;\\n#endif\\nfloat fDepth;\\nvec3 shadowColor = vec3( 1.0 );\\nfor( int i = 0; i < MAX_SHADOWS; i ++ ) {\\nvec3 shadowCoord = vShadowCoord[ i ].xyz / vShadowCoord[ i ].w;\\nbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\\nbool inFrustum = all( inFrustumVec );\\n#ifdef SHADOWMAP_CASCADE\\ninFrustumCount += int( inFrustum );\\nbvec3 frustumTestVec = bvec3( inFrustum, inFrustumCount == 1, shadowCoord.z <= 1.0 );\\n#else\\nbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\\n#endif\\nbool frustumTest = all( frustumTestVec );\\nif ( frustumTest ) {\\nshadowCoord.z += shadowBias[ i ];\\n#if defined( SHADOWMAP_TYPE_PCF )\\nfloat shadow = 0.0;\\nconst float shadowDelta = 1.0 / 9.0;\\nfloat xPixelOffset = 1.0 / shadowMapSize[ i ].x;\\nfloat yPixelOffset = 1.0 / shadowMapSize[ i ].y;\\nfloat dx0 = -1.25 * xPixelOffset;\\nfloat dy0 = -1.25 * yPixelOffset;\\nfloat dx1 = 1.25 * xPixelOffset;\\nfloat dy1 = 1.25 * yPixelOffset;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );\\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\\nshadowColor = shadowColor * vec3( ( 1.0 - shadowDarkness[ i ] * shadow ) );\\n#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\\nfloat shadow = 0.0;\\nfloat xPixelOffset = 1.0 / shadowMapSize[ i ].x;\\nfloat yPixelOffset = 1.0 / shadowMapSize[ i ].y;\\nfloat dx0 = -1.0 * xPixelOffset;\\nfloat dy0 = -1.0 * yPixelOffset;\\nfloat dx1 = 1.0 * xPixelOffset;\\nfloat dy1 = 1.0 * yPixelOffset;\\nmat3 shadowKernel;\\nmat3 depthKernel;\\ndepthKernel[0][0] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );\\ndepthKernel[0][1] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );\\ndepthKernel[0][2] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );\\ndepthKernel[1][0] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );\\ndepthKernel[1][1] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );\\ndepthKernel[1][2] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );\\ndepthKernel[2][0] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );\\ndepthKernel[2][1] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );\\ndepthKernel[2][2] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );\\nvec3 shadowZ = vec3( shadowCoord.z );\\nshadowKernel[0] = vec3(lessThan(depthKernel[0], shadowZ ));\\nshadowKernel[0] *= vec3(0.25);\\nshadowKernel[1] = vec3(lessThan(depthKernel[1], shadowZ ));\\nshadowKernel[1] *= vec3(0.25);\\nshadowKernel[2] = vec3(lessThan(depthKernel[2], shadowZ ));\\nshadowKernel[2] *= vec3(0.25);\\nvec2 fractionalCoord = 1.0 - fract( shadowCoord.xy * shadowMapSize[i].xy );\\nshadowKernel[0] = mix( shadowKernel[1], shadowKernel[0], fractionalCoord.x );\\nshadowKernel[1] = mix( shadowKernel[2], shadowKernel[1], fractionalCoord.x );\\nvec4 shadowValues;\\nshadowValues.x = mix( shadowKernel[0][1], shadowKernel[0][0], fractionalCoord.y );\\nshadowValues.y = mix( shadowKernel[0][2], shadowKernel[0][1], fractionalCoord.y );\\nshadowValues.z = mix( shadowKernel[1][1], shadowKernel[1][0], fractionalCoord.y );\\nshadowValues.w = mix( shadowKernel[1][2], shadowKernel[1][1], fractionalCoord.y );\\nshadow = dot( shadowValues, vec4( 1.0 ) );\\nshadowColor = shadowColor * vec3( ( 1.0 - shadowDarkness[ i ] * shadow ) );\\n#else\\nvec4 rgbaDepth = texture2D( shadowMap[ i ], shadowCoord.xy );\\nfloat fDepth = unpackDepth( rgbaDepth );\\nif ( fDepth < shadowCoord.z )\\nshadowColor = shadowColor * vec3( 1.0 - shadowDarkness[ i ] );\\n#endif\\n}\\n#ifdef SHADOWMAP_DEBUG\\n#ifdef SHADOWMAP_CASCADE\\nif ( inFrustum && inFrustumCount == 1 ) gl_FragColor.xyz *= frustumColors[ i ];\\n#else\\nif ( inFrustum ) gl_FragColor.xyz *= frustumColors[ i ];\\n#endif\\n#endif\\n}\\n#ifdef GAMMA_OUTPUT\\nshadowColor *= shadowColor;\\n#endif\\ngl_FragColor.xyz = gl_FragColor.xyz * shadowColor;\\n#endif\",shadowmap_pars_vertex:\"#ifdef USE_SHADOWMAP\\nvarying vec4 vShadowCoord[ MAX_SHADOWS ];\\nuniform mat4 shadowMatrix[ MAX_SHADOWS ];\\n#endif\",shadowmap_vertex:\"#ifdef USE_SHADOWMAP\\nfor( int i = 0; i < MAX_SHADOWS; i ++ ) {\\nvShadowCoord[ i ] = shadowMatrix[ i ] * worldPosition;\\n}\\n#endif\",alphatest_fragment:\"#ifdef ALPHATEST\\nif ( gl_FragColor.a < ALPHATEST ) discard;\\n#endif\",linear_to_gamma_fragment:\"#ifdef GAMMA_OUTPUT\\ngl_FragColor.xyz = sqrt( gl_FragColor.xyz );\\n#endif\"};THREE.UniformsUtils={merge:function(e){var t,n,r,i={};for(t=0;t<e.length;t++)for(n in r=this.clone(e[t]),r)i[n]=r[n];return i},clone:function(e){var t,n,r,i={};for(t in e)for(n in i[t]={},e[t])r=e[t][n],i[t][n]=r instanceof THREE.Color||r instanceof THREE.Vector2||r instanceof THREE.Vector3||r instanceof THREE.Vector4||r instanceof THREE.Matrix4||r instanceof THREE.Texture?r.clone():r instanceof Array?r.slice():r;return i}};THREE.UniformsLib={common:{diffuse:{type:\"c\",value:new THREE.Color(15658734)},opacity:{type:\"f\",value:1},map:{type:\"t\",value:null},offsetRepeat:{type:\"v4\",value:new THREE.Vector4(0,0,1,1)},lightMap:{type:\"t\",value:null},specularMap:{type:\"t\",value:null},envMap:{type:\"t\",value:null},flipEnvMap:{type:\"f\",value:-1},useRefract:{type:\"i\",value:0},reflectivity:{type:\"f\",value:1},refractionRatio:{type:\"f\",value:.98},combine:{type:\"i\",value:0},morphTargetInfluences:{type:\"f\",value:0}},bump:{bumpMap:{type:\"t\",value:null},bumpScale:{type:\"f\",value:1}},normalmap:{normalMap:{type:\"t\",value:null},normalScale:{type:\"v2\",value:new THREE.Vector2(1,1)}},fog:{fogDensity:{type:\"f\",value:25e-5},fogNear:{type:\"f\",value:1},fogFar:{type:\"f\",value:2e3},fogColor:{type:\"c\",value:new THREE.Color(16777215)}},lights:{ambientLightColor:{type:\"fv\",value:[]},directionalLightDirection:{type:\"fv\",value:[]},directionalLightColor:{type:\"fv\",value:[]},hemisphereLightDirection:{type:\"fv\",value:[]},hemisphereLightSkyColor:{type:\"fv\",value:[]},hemisphereLightGroundColor:{type:\"fv\",value:[]},pointLightColor:{type:\"fv\",value:[]},pointLightPosition:{type:\"fv\",value:[]},pointLightDistance:{type:\"fv1\",value:[]},spotLightColor:{type:\"fv\",value:[]},spotLightPosition:{type:\"fv\",value:[]},spotLightDirection:{type:\"fv\",value:[]},spotLightDistance:{type:\"fv1\",value:[]},spotLightAngleCos:{type:\"fv1\",value:[]},spotLightExponent:{type:\"fv1\",value:[]}},particle:{psColor:{type:\"c\",value:new THREE.Color(15658734)},opacity:{type:\"f\",value:1},size:{type:\"f\",value:1},scale:{type:\"f\",value:1},map:{type:\"t\",value:null},fogDensity:{type:\"f\",value:25e-5},fogNear:{type:\"f\",value:1},fogFar:{type:\"f\",value:2e3},fogColor:{type:\"c\",value:new THREE.Color(16777215)}},shadowmap:{shadowMap:{type:\"tv\",value:[]},shadowMapSize:{type:\"v2v\",value:[]},shadowBias:{type:\"fv1\",value:[]},shadowDarkness:{type:\"fv1\",value:[]},shadowMatrix:{type:\"m4v\",value:[]}}};THREE.ShaderLib={basic:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.common,THREE.UniformsLib.fog,THREE.UniformsLib.shadowmap]),vertexShader:[THREE.ShaderChunk.map_pars_vertex,THREE.ShaderChunk.lightmap_pars_vertex,THREE.ShaderChunk.envmap_pars_vertex,THREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\",THREE.ShaderChunk.map_vertex,THREE.ShaderChunk.lightmap_vertex,THREE.ShaderChunk.color_vertex,THREE.ShaderChunk.skinbase_vertex,\"#ifdef USE_ENVMAP\",THREE.ShaderChunk.morphnormal_vertex,THREE.ShaderChunk.skinnormal_vertex,THREE.ShaderChunk.defaultnormal_vertex,\"#endif\",THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.default_vertex,THREE.ShaderChunk.worldpos_vertex,THREE.ShaderChunk.envmap_vertex,THREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\"),fragmentShader:[\"uniform vec3 diffuse;\\nuniform float opacity;\",THREE.ShaderChunk.color_pars_fragment,THREE.ShaderChunk.map_pars_fragment,THREE.ShaderChunk.lightmap_pars_fragment,THREE.ShaderChunk.envmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,THREE.ShaderChunk.specularmap_pars_fragment,\"void main() {\\ngl_FragColor = vec4( diffuse, opacity );\",THREE.ShaderChunk.map_fragment,THREE.ShaderChunk.alphatest_fragment,THREE.ShaderChunk.specularmap_fragment,THREE.ShaderChunk.lightmap_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.envmap_fragment,THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\")},lambert:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.common,THREE.UniformsLib.fog,THREE.UniformsLib.lights,THREE.UniformsLib.shadowmap,{ambient:{type:\"c\",value:new THREE.Color(16777215)},emissive:{type:\"c\",value:new THREE.Color(0)},wrapRGB:{type:\"v3\",value:new THREE.Vector3(1,1,1)}}]),vertexShader:[\"#define LAMBERT\\nvarying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\nvarying vec3 vLightBack;\\n#endif\",THREE.ShaderChunk.map_pars_vertex,THREE.ShaderChunk.lightmap_pars_vertex,THREE.ShaderChunk.envmap_pars_vertex,THREE.ShaderChunk.lights_lambert_pars_vertex,THREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\",THREE.ShaderChunk.map_vertex,THREE.ShaderChunk.lightmap_vertex,THREE.ShaderChunk.color_vertex,THREE.ShaderChunk.morphnormal_vertex,THREE.ShaderChunk.skinbase_vertex,THREE.ShaderChunk.skinnormal_vertex,THREE.ShaderChunk.defaultnormal_vertex,THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.default_vertex,THREE.ShaderChunk.worldpos_vertex,THREE.ShaderChunk.envmap_vertex,THREE.ShaderChunk.lights_lambert_vertex,THREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\"),fragmentShader:[\"uniform float opacity;\\nvarying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\nvarying vec3 vLightBack;\\n#endif\",THREE.ShaderChunk.color_pars_fragment,THREE.ShaderChunk.map_pars_fragment,THREE.ShaderChunk.lightmap_pars_fragment,THREE.ShaderChunk.envmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,THREE.ShaderChunk.specularmap_pars_fragment,\"void main() {\\ngl_FragColor = vec4( vec3 ( 1.0 ), opacity );\",THREE.ShaderChunk.map_fragment,THREE.ShaderChunk.alphatest_fragment,THREE.ShaderChunk.specularmap_fragment,\"#ifdef DOUBLE_SIDED\\nif ( gl_FrontFacing )\\ngl_FragColor.xyz *= vLightFront;\\nelse\\ngl_FragColor.xyz *= vLightBack;\\n#else\\ngl_FragColor.xyz *= vLightFront;\\n#endif\",THREE.ShaderChunk.lightmap_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.envmap_fragment,THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\")},phong:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.common,THREE.UniformsLib.bump,THREE.UniformsLib.normalmap,THREE.UniformsLib.fog,THREE.UniformsLib.lights,THREE.UniformsLib.shadowmap,{ambient:{type:\"c\",value:new THREE.Color(16777215)},emissive:{type:\"c\",value:new THREE.Color(0)},specular:{type:\"c\",value:new THREE.Color(1118481)},shininess:{type:\"f\",value:30},wrapRGB:{type:\"v3\",value:new THREE.Vector3(1,1,1)}}]),vertexShader:[\"#define PHONG\\nvarying vec3 vViewPosition;\\nvarying vec3 vNormal;\",THREE.ShaderChunk.map_pars_vertex,THREE.ShaderChunk.lightmap_pars_vertex,THREE.ShaderChunk.envmap_pars_vertex,THREE.ShaderChunk.lights_phong_pars_vertex,THREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\",THREE.ShaderChunk.map_vertex,THREE.ShaderChunk.lightmap_vertex,THREE.ShaderChunk.color_vertex,THREE.ShaderChunk.morphnormal_vertex,THREE.ShaderChunk.skinbase_vertex,THREE.ShaderChunk.skinnormal_vertex,THREE.ShaderChunk.defaultnormal_vertex,\"vNormal = normalize( transformedNormal );\",THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.default_vertex,\"vViewPosition = -mvPosition.xyz;\",THREE.ShaderChunk.worldpos_vertex,THREE.ShaderChunk.envmap_vertex,THREE.ShaderChunk.lights_phong_vertex,THREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\"),fragmentShader:[\"uniform vec3 diffuse;\\nuniform float opacity;\\nuniform vec3 ambient;\\nuniform vec3 emissive;\\nuniform vec3 specular;\\nuniform float shininess;\",THREE.ShaderChunk.color_pars_fragment,THREE.ShaderChunk.map_pars_fragment,THREE.ShaderChunk.lightmap_pars_fragment,THREE.ShaderChunk.envmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.lights_phong_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,THREE.ShaderChunk.bumpmap_pars_fragment,THREE.ShaderChunk.normalmap_pars_fragment,THREE.ShaderChunk.specularmap_pars_fragment,\"void main() {\\ngl_FragColor = vec4( vec3 ( 1.0 ), opacity );\",THREE.ShaderChunk.map_fragment,THREE.ShaderChunk.alphatest_fragment,THREE.ShaderChunk.specularmap_fragment,THREE.ShaderChunk.lights_phong_fragment,THREE.ShaderChunk.lightmap_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.envmap_fragment,THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\")},particle_basic:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.particle,THREE.UniformsLib.shadowmap]),vertexShader:[\"uniform float size;\\nuniform float scale;\",THREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\",THREE.ShaderChunk.color_vertex,\"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\n#ifdef USE_SIZEATTENUATION\\ngl_PointSize = size * ( scale / length( mvPosition.xyz ) );\\n#else\\ngl_PointSize = size;\\n#endif\\ngl_Position = projectionMatrix * mvPosition;\",THREE.ShaderChunk.worldpos_vertex,THREE.ShaderChunk.shadowmap_vertex,\"}\"].join(\"\\n\"),fragmentShader:[\"uniform vec3 psColor;\\nuniform float opacity;\",THREE.ShaderChunk.color_pars_fragment,THREE.ShaderChunk.map_particle_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,\"void main() {\\ngl_FragColor = vec4( psColor, opacity );\",THREE.ShaderChunk.map_particle_fragment,THREE.ShaderChunk.alphatest_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\")},dashed:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.common,THREE.UniformsLib.fog,{scale:{type:\"f\",value:1},dashSize:{type:\"f\",value:1},totalSize:{type:\"f\",value:2}}]),vertexShader:[\"uniform float scale;\\nattribute float lineDistance;\\nvarying float vLineDistance;\",THREE.ShaderChunk.color_pars_vertex,\"void main() {\",THREE.ShaderChunk.color_vertex,\"vLineDistance = scale * lineDistance;\\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\ngl_Position = projectionMatrix * mvPosition;\\n}\"].join(\"\\n\"),fragmentShader:[\"uniform vec3 diffuse;\\nuniform float opacity;\\nuniform float dashSize;\\nuniform float totalSize;\\nvarying float vLineDistance;\",THREE.ShaderChunk.color_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,\"void main() {\\nif ( mod( vLineDistance, totalSize ) > dashSize ) {\\ndiscard;\\n}\\ngl_FragColor = vec4( diffuse, opacity );\",THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\")},depth:{uniforms:{mNear:{type:\"f\",value:1},mFar:{type:\"f\",value:2e3},opacity:{type:\"f\",value:1}},vertexShader:\"void main() {\\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}\",fragmentShader:\"uniform float mNear;\\nuniform float mFar;\\nuniform float opacity;\\nvoid main() {\\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\\nfloat color = 1.0 - smoothstep( mNear, mFar, depth );\\ngl_FragColor = vec4( vec3( color ), opacity );\\n}\"},normal:{uniforms:{opacity:{type:\"f\",value:1}},vertexShader:[\"varying vec3 vNormal;\",THREE.ShaderChunk.morphtarget_pars_vertex,\"void main() {\\nvNormal = normalize( normalMatrix * normal );\",THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.default_vertex,\"}\"].join(\"\\n\"),fragmentShader:\"uniform float opacity;\\nvarying vec3 vNormal;\\nvoid main() {\\ngl_FragColor = vec4( 0.5 * normalize( vNormal ) + 0.5, opacity );\\n}\"},normalmap:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.fog,THREE.UniformsLib.lights,THREE.UniformsLib.shadowmap,{enableAO:{type:\"i\",value:0},enableDiffuse:{type:\"i\",value:0},enableSpecular:{type:\"i\",value:0},enableReflection:{type:\"i\",value:0},enableDisplacement:{type:\"i\",value:0},tDisplacement:{type:\"t\",value:null},tDiffuse:{type:\"t\",value:null},tCube:{type:\"t\",value:null},tNormal:{type:\"t\",value:null},tSpecular:{type:\"t\",value:null},tAO:{type:\"t\",value:null},uNormalScale:{type:\"v2\",value:new THREE.Vector2(1,1)},uDisplacementBias:{type:\"f\",value:0},uDisplacementScale:{type:\"f\",value:1},uDiffuseColor:{type:\"c\",value:new THREE.Color(16777215)},uSpecularColor:{type:\"c\",value:new THREE.Color(1118481)},uAmbientColor:{type:\"c\",value:new THREE.Color(16777215)},uShininess:{type:\"f\",value:30},uOpacity:{type:\"f\",value:1},useRefract:{type:\"i\",value:0},uRefractionRatio:{type:\"f\",value:.98},uReflectivity:{type:\"f\",value:.5},uOffset:{type:\"v2\",value:new THREE.Vector2(0,0)},uRepeat:{type:\"v2\",value:new THREE.Vector2(1,1)},wrapRGB:{type:\"v3\",value:new THREE.Vector3(1,1,1)}}]),fragmentShader:[\"uniform vec3 uAmbientColor;\\nuniform vec3 uDiffuseColor;\\nuniform vec3 uSpecularColor;\\nuniform float uShininess;\\nuniform float uOpacity;\\nuniform bool enableDiffuse;\\nuniform bool enableSpecular;\\nuniform bool enableAO;\\nuniform bool enableReflection;\\nuniform sampler2D tDiffuse;\\nuniform sampler2D tNormal;\\nuniform sampler2D tSpecular;\\nuniform sampler2D tAO;\\nuniform samplerCube tCube;\\nuniform vec2 uNormalScale;\\nuniform bool useRefract;\\nuniform float uRefractionRatio;\\nuniform float uReflectivity;\\nvarying vec3 vTangent;\\nvarying vec3 vBinormal;\\nvarying vec3 vNormal;\\nvarying vec2 vUv;\\nuniform vec3 ambientLightColor;\\n#if MAX_DIR_LIGHTS > 0\\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\\n#endif\\n#if MAX_HEMI_LIGHTS > 0\\nuniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];\\nuniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];\\nuniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nuniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\\nuniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\\n#endif\\n#ifdef WRAP_AROUND\\nuniform vec3 wrapRGB;\\n#endif\\nvarying vec3 vWorldPosition;\\nvarying vec3 vViewPosition;\",THREE.ShaderChunk.shadowmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,\"void main() {\\ngl_FragColor = vec4( vec3( 1.0 ), uOpacity );\\nvec3 specularTex = vec3( 1.0 );\\nvec3 normalTex = texture2D( tNormal, vUv ).xyz * 2.0 - 1.0;\\nnormalTex.xy *= uNormalScale;\\nnormalTex = normalize( normalTex );\\nif( enableDiffuse ) {\\n#ifdef GAMMA_INPUT\\nvec4 texelColor = texture2D( tDiffuse, vUv );\\ntexelColor.xyz *= texelColor.xyz;\\ngl_FragColor = gl_FragColor * texelColor;\\n#else\\ngl_FragColor = gl_FragColor * texture2D( tDiffuse, vUv );\\n#endif\\n}\\nif( enableAO ) {\\n#ifdef GAMMA_INPUT\\nvec4 aoColor = texture2D( tAO, vUv );\\naoColor.xyz *= aoColor.xyz;\\ngl_FragColor.xyz = gl_FragColor.xyz * aoColor.xyz;\\n#else\\ngl_FragColor.xyz = gl_FragColor.xyz * texture2D( tAO, vUv ).xyz;\\n#endif\\n}\\nif( enableSpecular )\\nspecularTex = texture2D( tSpecular, vUv ).xyz;\\nmat3 tsb = mat3( normalize( vTangent ), normalize( vBinormal ), normalize( vNormal ) );\\nvec3 finalNormal = tsb * normalTex;\\n#ifdef FLIP_SIDED\\nfinalNormal = -finalNormal;\\n#endif\\nvec3 normal = normalize( finalNormal );\\nvec3 viewPosition = normalize( vViewPosition );\\n#if MAX_POINT_LIGHTS > 0\\nvec3 pointDiffuse = vec3( 0.0 );\\nvec3 pointSpecular = vec3( 0.0 );\\nfor ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\\nvec3 pointVector = lPosition.xyz + vViewPosition.xyz;\\nfloat pointDistance = 1.0;\\nif ( pointLightDistance[ i ] > 0.0 )\\npointDistance = 1.0 - min( ( length( pointVector ) / pointLightDistance[ i ] ), 1.0 );\\npointVector = normalize( pointVector );\\n#ifdef WRAP_AROUND\\nfloat pointDiffuseWeightFull = max( dot( normal, pointVector ), 0.0 );\\nfloat pointDiffuseWeightHalf = max( 0.5 * dot( normal, pointVector ) + 0.5, 0.0 );\\nvec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );\\n#else\\nfloat pointDiffuseWeight = max( dot( normal, pointVector ), 0.0 );\\n#endif\\npointDiffuse += pointDistance * pointLightColor[ i ] * uDiffuseColor * pointDiffuseWeight;\\nvec3 pointHalfVector = normalize( pointVector + viewPosition );\\nfloat pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );\\nfloat pointSpecularWeight = specularTex.r * max( pow( pointDotNormalHalf, uShininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( uShininess + 2.0001 ) / 8.0;\\nvec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( pointVector, pointHalfVector ), 5.0 );\\npointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * pointDistance * specularNormalization;\\n#else\\npointSpecular += pointDistance * pointLightColor[ i ] * uSpecularColor * pointSpecularWeight * pointDiffuseWeight;\\n#endif\\n}\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\nvec3 spotDiffuse = vec3( 0.0 );\\nvec3 spotSpecular = vec3( 0.0 );\\nfor ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\\nvec3 spotVector = lPosition.xyz + vViewPosition.xyz;\\nfloat spotDistance = 1.0;\\nif ( spotLightDistance[ i ] > 0.0 )\\nspotDistance = 1.0 - min( ( length( spotVector ) / spotLightDistance[ i ] ), 1.0 );\\nspotVector = normalize( spotVector );\\nfloat spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - vWorldPosition ) );\\nif ( spotEffect > spotLightAngleCos[ i ] ) {\\nspotEffect = max( pow( spotEffect, spotLightExponent[ i ] ), 0.0 );\\n#ifdef WRAP_AROUND\\nfloat spotDiffuseWeightFull = max( dot( normal, spotVector ), 0.0 );\\nfloat spotDiffuseWeightHalf = max( 0.5 * dot( normal, spotVector ) + 0.5, 0.0 );\\nvec3 spotDiffuseWeight = mix( vec3 ( spotDiffuseWeightFull ), vec3( spotDiffuseWeightHalf ), wrapRGB );\\n#else\\nfloat spotDiffuseWeight = max( dot( normal, spotVector ), 0.0 );\\n#endif\\nspotDiffuse += spotDistance * spotLightColor[ i ] * uDiffuseColor * spotDiffuseWeight * spotEffect;\\nvec3 spotHalfVector = normalize( spotVector + viewPosition );\\nfloat spotDotNormalHalf = max( dot( normal, spotHalfVector ), 0.0 );\\nfloat spotSpecularWeight = specularTex.r * max( pow( spotDotNormalHalf, uShininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( uShininess + 2.0001 ) / 8.0;\\nvec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( spotVector, spotHalfVector ), 5.0 );\\nspotSpecular += schlick * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * spotDistance * specularNormalization * spotEffect;\\n#else\\nspotSpecular += spotDistance * spotLightColor[ i ] * uSpecularColor * spotSpecularWeight * spotDiffuseWeight * spotEffect;\\n#endif\\n}\\n}\\n#endif\\n#if MAX_DIR_LIGHTS > 0\\nvec3 dirDiffuse = vec3( 0.0 );\\nvec3 dirSpecular = vec3( 0.0 );\\nfor( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {\\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\\nvec3 dirVector = normalize( lDirection.xyz );\\n#ifdef WRAP_AROUND\\nfloat directionalLightWeightingFull = max( dot( normal, dirVector ), 0.0 );\\nfloat directionalLightWeightingHalf = max( 0.5 * dot( normal, dirVector ) + 0.5, 0.0 );\\nvec3 dirDiffuseWeight = mix( vec3( directionalLightWeightingFull ), vec3( directionalLightWeightingHalf ), wrapRGB );\\n#else\\nfloat dirDiffuseWeight = max( dot( normal, dirVector ), 0.0 );\\n#endif\\ndirDiffuse += directionalLightColor[ i ] * uDiffuseColor * dirDiffuseWeight;\\nvec3 dirHalfVector = normalize( dirVector + viewPosition );\\nfloat dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );\\nfloat dirSpecularWeight = specularTex.r * max( pow( dirDotNormalHalf, uShininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat specularNormalization = ( uShininess + 2.0001 ) / 8.0;\\nvec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( dirVector, dirHalfVector ), 5.0 );\\ndirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;\\n#else\\ndirSpecular += directionalLightColor[ i ] * uSpecularColor * dirSpecularWeight * dirDiffuseWeight;\\n#endif\\n}\\n#endif\\n#if MAX_HEMI_LIGHTS > 0\\nvec3 hemiDiffuse = vec3( 0.0 );\\nvec3 hemiSpecular = vec3( 0.0 );\\nfor( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {\\nvec4 lDirection = viewMatrix * vec4( hemisphereLightDirection[ i ], 0.0 );\\nvec3 lVector = normalize( lDirection.xyz );\\nfloat dotProduct = dot( normal, lVector );\\nfloat hemiDiffuseWeight = 0.5 * dotProduct + 0.5;\\nvec3 hemiColor = mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );\\nhemiDiffuse += uDiffuseColor * hemiColor;\\nvec3 hemiHalfVectorSky = normalize( lVector + viewPosition );\\nfloat hemiDotNormalHalfSky = 0.5 * dot( normal, hemiHalfVectorSky ) + 0.5;\\nfloat hemiSpecularWeightSky = specularTex.r * max( pow( hemiDotNormalHalfSky, uShininess ), 0.0 );\\nvec3 lVectorGround = -lVector;\\nvec3 hemiHalfVectorGround = normalize( lVectorGround + viewPosition );\\nfloat hemiDotNormalHalfGround = 0.5 * dot( normal, hemiHalfVectorGround ) + 0.5;\\nfloat hemiSpecularWeightGround = specularTex.r * max( pow( hemiDotNormalHalfGround, uShininess ), 0.0 );\\n#ifdef PHYSICALLY_BASED_SHADING\\nfloat dotProductGround = dot( normal, lVectorGround );\\nfloat specularNormalization = ( uShininess + 2.0001 ) / 8.0;\\nvec3 schlickSky = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( lVector, hemiHalfVectorSky ), 5.0 );\\nvec3 schlickGround = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( lVectorGround, hemiHalfVectorGround ), 5.0 );\\nhemiSpecular += hemiColor * specularNormalization * ( schlickSky * hemiSpecularWeightSky * max( dotProduct, 0.0 ) + schlickGround * hemiSpecularWeightGround * max( dotProductGround, 0.0 ) );\\n#else\\nhemiSpecular += uSpecularColor * hemiColor * ( hemiSpecularWeightSky + hemiSpecularWeightGround ) * hemiDiffuseWeight;\\n#endif\\n}\\n#endif\\nvec3 totalDiffuse = vec3( 0.0 );\\nvec3 totalSpecular = vec3( 0.0 );\\n#if MAX_DIR_LIGHTS > 0\\ntotalDiffuse += dirDiffuse;\\ntotalSpecular += dirSpecular;\\n#endif\\n#if MAX_HEMI_LIGHTS > 0\\ntotalDiffuse += hemiDiffuse;\\ntotalSpecular += hemiSpecular;\\n#endif\\n#if MAX_POINT_LIGHTS > 0\\ntotalDiffuse += pointDiffuse;\\ntotalSpecular += pointSpecular;\\n#endif\\n#if MAX_SPOT_LIGHTS > 0\\ntotalDiffuse += spotDiffuse;\\ntotalSpecular += spotSpecular;\\n#endif\\n#ifdef METAL\\ngl_FragColor.xyz = gl_FragColor.xyz * ( totalDiffuse + ambientLightColor * uAmbientColor + totalSpecular );\\n#else\\ngl_FragColor.xyz = gl_FragColor.xyz * ( totalDiffuse + ambientLightColor * uAmbientColor ) + totalSpecular;\\n#endif\\nif ( enableReflection ) {\\nvec3 vReflect;\\nvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\\nif ( useRefract ) {\\nvReflect = refract( cameraToVertex, normal, uRefractionRatio );\\n} else {\\nvReflect = reflect( cameraToVertex, normal );\\n}\\nvec4 cubeColor = textureCube( tCube, vec3( -vReflect.x, vReflect.yz ) );\\n#ifdef GAMMA_INPUT\\ncubeColor.xyz *= cubeColor.xyz;\\n#endif\\ngl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, specularTex.r * uReflectivity );\\n}\",THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,\"}\"].join(\"\\n\"),vertexShader:[\"attribute vec4 tangent;\\nuniform vec2 uOffset;\\nuniform vec2 uRepeat;\\nuniform bool enableDisplacement;\\n#ifdef VERTEX_TEXTURES\\nuniform sampler2D tDisplacement;\\nuniform float uDisplacementScale;\\nuniform float uDisplacementBias;\\n#endif\\nvarying vec3 vTangent;\\nvarying vec3 vBinormal;\\nvarying vec3 vNormal;\\nvarying vec2 vUv;\\nvarying vec3 vWorldPosition;\\nvarying vec3 vViewPosition;\",THREE.ShaderChunk.skinning_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,\"void main() {\",THREE.ShaderChunk.skinbase_vertex,THREE.ShaderChunk.skinnormal_vertex,\"#ifdef USE_SKINNING\\nvNormal = normalize( normalMatrix * skinnedNormal.xyz );\\nvec4 skinnedTangent = skinMatrix * vec4( tangent.xyz, 0.0 );\\nvTangent = normalize( normalMatrix * skinnedTangent.xyz );\\n#else\\nvNormal = normalize( normalMatrix * normal );\\nvTangent = normalize( normalMatrix * tangent.xyz );\\n#endif\\nvBinormal = normalize( cross( vNormal, vTangent ) * tangent.w );\\nvUv = uv * uRepeat + uOffset;\\nvec3 displacedPosition;\\n#ifdef VERTEX_TEXTURES\\nif ( enableDisplacement ) {\\nvec3 dv = texture2D( tDisplacement, uv ).xyz;\\nfloat df = uDisplacementScale * dv.x + uDisplacementBias;\\ndisplacedPosition = position + normalize( normal ) * df;\\n} else {\\n#ifdef USE_SKINNING\\nvec4 skinVertex = vec4( position, 1.0 );\\nvec4 skinned = boneMatX * skinVertex * skinWeight.x;\\nskinned \t += boneMatY * skinVertex * skinWeight.y;\\ndisplacedPosition = skinned.xyz;\\n#else\\ndisplacedPosition = position;\\n#endif\\n}\\n#else\\n#ifdef USE_SKINNING\\nvec4 skinVertex = vec4( position, 1.0 );\\nvec4 skinned = boneMatX * skinVertex * skinWeight.x;\\nskinned \t += boneMatY * skinVertex * skinWeight.y;\\ndisplacedPosition = skinned.xyz;\\n#else\\ndisplacedPosition = position;\\n#endif\\n#endif\\nvec4 mvPosition = modelViewMatrix * vec4( displacedPosition, 1.0 );\\nvec4 worldPosition = modelMatrix * vec4( displacedPosition, 1.0 );\\ngl_Position = projectionMatrix * mvPosition;\\nvWorldPosition = worldPosition.xyz;\\nvViewPosition = -mvPosition.xyz;\\n#ifdef USE_SHADOWMAP\\nfor( int i = 0; i < MAX_SHADOWS; i ++ ) {\\nvShadowCoord[ i ] = shadowMatrix[ i ] * worldPosition;\\n}\\n#endif\\n}\"].join(\"\\n\")},cube:{uniforms:{tCube:{type:\"t\",value:null},tFlip:{type:\"f\",value:-1}},vertexShader:\"varying vec3 vWorldPosition;\\nvoid main() {\\nvec4 worldPosition = modelMatrix * vec4( position, 1.0 );\\nvWorldPosition = worldPosition.xyz;\\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}\",fragmentShader:\"uniform samplerCube tCube;\\nuniform float tFlip;\\nvarying vec3 vWorldPosition;\\nvoid main() {\\ngl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\\n}\"},depthRGBA:{uniforms:{},vertexShader:[THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,\"void main() {\",THREE.ShaderChunk.skinbase_vertex,THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.default_vertex,\"}\"].join(\"\\n\"),fragmentShader:\"vec4 pack_depth( const in float depth ) {\\nconst vec4 bit_shift = vec4( 256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0 );\\nconst vec4 bit_mask = vec4( 0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0 );\\nvec4 res = fract( depth * bit_shift );\\nres -= res.xxyz * bit_mask;\\nreturn res;\\n}\\nvoid main() {\\ngl_FragData[ 0 ] = pack_depth( gl_FragCoord.z );\\n}\"}};THREE.WebGLRenderer=function(e){function t(e,t){var n=e.vertices.length,r=t.material;if(r.attributes){void 0===e.__webglCustomAttributesList&&(e.__webglCustomAttributesList=[]);for(var i in r.attributes){var s=r.attributes[i];if(!s.__webglInitialized||s.createUniqueBuffers){s.__webglInitialized=!0;var o=1;\"v2\"===s.type?o=2:\"v3\"===s.type?o=3:\"v4\"===s.type?o=4:\"c\"===s.type&&(o=3);s.size=o;s.array=new Float32Array(n*o);s.buffer=xt.createBuffer();s.buffer.belongsToAttribute=i;s.needsUpdate=!0}e.__webglCustomAttributesList.push(s)}}}function n(e,t){var n=t.geometry,o=e.faces3,u=3*o.length,a=1*o.length,f=3*o.length,o=r(t,e),l=s(o),c=i(o),h=o.vertexColors?o.vertexColors:!1;e.__vertexArray=new Float32Array(3*u);c&&(e.__normalArray=new Float32Array(3*u));n.hasTangents&&(e.__tangentArray=new Float32Array(4*u));h&&(e.__colorArray=new Float32Array(3*u));l&&(0<n.faceVertexUvs.length&&(e.__uvArray=new Float32Array(2*u)),1<n.faceVertexUvs.length&&(e.__uv2Array=new Float32Array(2*u)));t.geometry.skinWeights.length&&t.geometry.skinIndices.length&&(e.__skinIndexArray=new Float32Array(4*u),e.__skinWeightArray=new Float32Array(4*u));e.__faceArray=new Uint16Array(3*a);e.__lineArray=new Uint16Array(2*f);if(e.numMorphTargets){e.__morphTargetsArrays=[];n=0;for(l=e.numMorphTargets;n<l;n++)e.__morphTargetsArrays.push(new Float32Array(3*u))}if(e.numMorphNormals){e.__morphNormalsArrays=[];n=0;for(l=e.numMorphNormals;n<l;n++)e.__morphNormalsArrays.push(new Float32Array(3*u))}e.__webglFaceCount=3*a;e.__webglLineCount=2*f;if(o.attributes){void 0===e.__webglCustomAttributesList&&(e.__webglCustomAttributesList=[]);for(var p in o.attributes){var a=o.attributes[p],f={},d;for(d in a)f[d]=a[d];if(!f.__webglInitialized||f.createUniqueBuffers)f.__webglInitialized=!0,n=1,\"v2\"===f.type?n=2:\"v3\"===f.type?n=3:\"v4\"===f.type?n=4:\"c\"===f.type&&(n=3),f.size=n,f.array=new Float32Array(u*n),f.buffer=xt.createBuffer(),f.buffer.belongsToAttribute=p,a.needsUpdate=!0,f.__original=a;e.__webglCustomAttributesList.push(f)}}e.__inittedArrays=!0}function r(e,t){return e.material instanceof THREE.MeshFaceMaterial?e.material.materials[t.materialIndex]:e.material}function i(e){return e instanceof THREE.MeshBasicMaterial&&!e.envMap||e instanceof THREE.MeshDepthMaterial?!1:e&&void 0!==e.shading&&e.shading===THREE.SmoothShading?THREE.SmoothShading:THREE.FlatShading}function s(e){return e.map||e.lightMap||e.bumpMap||e.normalMap||e.specularMap||e instanceof THREE.ShaderMaterial?!0:!1}function o(e){vt[e]||(xt.enableVertexAttribArray(e),vt[e]=!0)}function u(){for(var e in vt)vt[e]&&(xt.disableVertexAttribArray(e),vt[e]=!1)}function a(e,t){return e.z!==t.z?t.z-e.z:e.id-t.id}function f(e,t){return t[0]-e[0]}function l(e,t,n){if(e.length)for(var r=0,i=e.length;r<i;r++)J=W=null,V=$=Y=G=it=rt=Z=-1,Et=!0,e[r].render(t,n,pt,dt),J=W=null,V=$=Y=G=it=rt=Z=-1,Et=!0}function c(e,t,n,r,i,s,o,u){var a,f,l,c;t?(f=e.length-1,c=t=-1):(f=0,t=e.length,c=1);for(var h=f;h!==t;h+=c)if(a=e[h],a.render){f=a.object;l=a.buffer;if(u)a=u;else{a=a[n];if(!a)continue;o&&R.setBlending(a.blending,a.blendEquation,a.blendSrc,a.blendDst);R.setDepthTest(a.depthTest);R.setDepthWrite(a.depthWrite);N(a.polygonOffset,a.polygonOffsetFactor,a.polygonOffsetUnits)}R.setMaterialFaces(a);l instanceof THREE.BufferGeometry?R.renderBufferDirect(r,i,s,a,l,f):R.renderBuffer(r,i,s,a,l,f)}}function h(e,t,n,r,i,s,o){for(var u,a,f=0,l=e.length;f<l;f++)if(u=e[f],a=u.object,a.visible){if(o)u=o;else{u=u[t];if(!u)continue;s&&R.setBlending(u.blending,u.blendEquation,u.blendSrc,u.blendDst);R.setDepthTest(u.depthTest);R.setDepthWrite(u.depthWrite);N(u.polygonOffset,u.polygonOffsetFactor,u.polygonOffsetUnits)}R.renderImmediateObject(n,r,i,u,a)}}function p(e,r){var i,s,o,u;if(void 0===e.__webglInit&&(e.__webglInit=!0,e._modelViewMatrix=new THREE.Matrix4,e._normalMatrix=new THREE.Matrix3,void 0!==e.geometry&&void 0===e.geometry.__webglInit&&(e.geometry.__webglInit=!0,e.geometry.addEventListener(\"dispose\",Ut)),s=e.geometry,void 0!==s))if(s instanceof THREE.BufferGeometry){var a,f;for(a in s.attributes)f=\"index\"===a?xt.ELEMENT_ARRAY_BUFFER:xt.ARRAY_BUFFER,u=s.attributes[a],void 0===u.numItems&&(u.numItems=u.array.length),u.buffer=xt.createBuffer(),xt.bindBuffer(f,u.buffer),xt.bufferData(f,u.array,xt.STATIC_DRAW)}else if(e instanceof THREE.Mesh){o=e.material;if(void 0===s.geometryGroups){a=s;var l,c,h;f={};var p=a.morphTargets.length,v=a.morphNormals.length,m=o instanceof THREE.MeshFaceMaterial;a.geometryGroups={};o=0;for(l=a.faces.length;o<l;o++)c=a.faces[o],c=m?c.materialIndex:0,void 0===f[c]&&(f[c]={hash:c,counter:0}),h=f[c].hash+\"_\"+f[c].counter,void 0===a.geometryGroups[h]&&(a.geometryGroups[h]={faces3:[],materialIndex:c,vertices:0,numMorphTargets:p,numMorphNormals:v}),65535<a.geometryGroups[h].vertices+3&&(f[c].counter+=1,h=f[c].hash+\"_\"+f[c].counter,void 0===a.geometryGroups[h]&&(a.geometryGroups[h]={faces3:[],materialIndex:c,vertices:0,numMorphTargets:p,numMorphNormals:v})),a.geometryGroups[h].faces3.push(o),a.geometryGroups[h].vertices+=3;a.geometryGroupsList=[];for(u in a.geometryGroups)a.geometryGroups[u].id=K++,a.geometryGroupsList.push(a.geometryGroups[u])}for(i in s.geometryGroups)if(u=s.geometryGroups[i],!u.__webglVertexBuffer){a=u;a.__webglVertexBuffer=xt.createBuffer();a.__webglNormalBuffer=xt.createBuffer();a.__webglTangentBuffer=xt.createBuffer();a.__webglColorBuffer=xt.createBuffer();a.__webglUVBuffer=xt.createBuffer();a.__webglUV2Buffer=xt.createBuffer();a.__webglSkinIndicesBuffer=xt.createBuffer();a.__webglSkinWeightsBuffer=xt.createBuffer();a.__webglFaceBuffer=xt.createBuffer();a.__webglLineBuffer=xt.createBuffer();p=f=void 0;if(a.numMorphTargets){a.__webglMorphTargetsBuffers=[];f=0;for(p=a.numMorphTargets;f<p;f++)a.__webglMorphTargetsBuffers.push(xt.createBuffer())}if(a.numMorphNormals){a.__webglMorphNormalsBuffers=[];f=0;for(p=a.numMorphNormals;f<p;f++)a.__webglMorphNormalsBuffers.push(xt.createBuffer())}R.info.memory.geometries++;n(u,e);s.verticesNeedUpdate=!0;s.morphTargetsNeedUpdate=!0;s.elementsNeedUpdate=!0;s.uvsNeedUpdate=!0;s.normalsNeedUpdate=!0;s.tangentsNeedUpdate=!0;s.colorsNeedUpdate=!0}}else e instanceof THREE.Line?s.__webglVertexBuffer||(u=s,u.__webglVertexBuffer=xt.createBuffer(),u.__webglColorBuffer=xt.createBuffer(),u.__webglLineDistanceBuffer=xt.createBuffer(),R.info.memory.geometries++,u=s,a=u.vertices.length,u.__vertexArray=new Float32Array(3*a),u.__colorArray=new Float32Array(3*a),u.__lineDistanceArray=new Float32Array(1*a),u.__webglLineCount=a,t(u,e),s.verticesNeedUpdate=!0,s.colorsNeedUpdate=!0,s.lineDistancesNeedUpdate=!0):e instanceof THREE.ParticleSystem&&!s.__webglVertexBuffer&&(u=s,u.__webglVertexBuffer=xt.createBuffer(),u.__webglColorBuffer=xt.createBuffer(),R.info.memory.geometries++,u=s,a=u.vertices.length,u.__vertexArray=new Float32Array(3*a),u.__colorArray=new Float32Array(3*a),u.__sortArray=[],u.__webglParticleCount=a,t(u,e),s.verticesNeedUpdate=!0,s.colorsNeedUpdate=!0);if(void 0===e.__webglActive){if(e instanceof THREE.Mesh)if(s=e.geometry,s instanceof THREE.BufferGeometry)d(r.__webglObjects,s,e);else{if(s instanceof THREE.Geometry)for(i in s.geometryGroups)u=s.geometryGroups[i],d(r.__webglObjects,u,e)}else e instanceof THREE.Line||e instanceof THREE.ParticleSystem?(s=e.geometry,d(r.__webglObjects,s,e)):e instanceof THREE.ImmediateRenderObject||e.immediateRenderCallback?r.__webglObjectsImmediate.push({id:null,object:e,opaque:null,transparent:null,z:0}):e instanceof THREE.Sprite?r.__webglSprites.push(e):e instanceof THREE.LensFlare&&r.__webglFlares.push(e);e.__webglActive=!0}}function d(e,t,n){e.push({id:null,buffer:t,object:n,opaque:null,transparent:null,z:0})}function v(e){for(var t in e.attributes)if(e.attributes[t].needsUpdate)return!0;return!1}function m(e){for(var t in e.attributes)e.attributes[t].needsUpdate=!1}function g(e,t){e instanceof THREE.Mesh||e instanceof THREE.ParticleSystem||e instanceof THREE.Line?y(t.__webglObjects,e):e instanceof THREE.Sprite?b(t.__webglSprites,e):e instanceof THREE.LensFlare?b(t.__webglFlares,e):(e instanceof THREE.ImmediateRenderObject||e.immediateRenderCallback)&&y(t.__webglObjectsImmediate,e);delete e.__webglActive}function y(e,t){for(var n=e.length-1;0<=n;n--)e[n].object===t&&e.splice(n,1)}function b(e,t){for(var n=e.length-1;0<=n;n--)e[n]===t&&e.splice(n,1)}function w(e,t,n,r,i){Q=0;r.needsUpdate&&(r.program&&$t(r),R.initMaterial(r,t,n,i),r.needsUpdate=!1);r.morphTargets&&!i.__webglMorphTargetInfluences&&(i.__webglMorphTargetInfluences=new Float32Array(R.maxMorphTargets));var s=!1,o=r.program,u=o.uniforms,a=r.uniforms;o!==W&&(xt.useProgram(o),W=o,s=!0);r.id!==V&&(V=r.id,s=!0);if(s||e!==J)xt.uniformMatrix4fv(u.projectionMatrix,!1,e.projectionMatrix.elements),e!==J&&(J=e);if(r.skinning)if(Ht&&i.useVertexTexture){if(null!==u.boneTexture){var f=E();xt.uniform1i(u.boneTexture,f);R.setTexture(i.boneTexture,f)}null!==u.boneTextureWidth&&xt.uniform1i(u.boneTextureWidth,i.boneTextureWidth);null!==u.boneTextureHeight&&xt.uniform1i(u.boneTextureHeight,i.boneTextureHeight)}else null!==u.boneGlobalMatrices&&xt.uniformMatrix4fv(u.boneGlobalMatrices,!1,i.boneMatrices);if(s){n&&r.fog&&(a.fogColor.value=n.color,n instanceof THREE.Fog?(a.fogNear.value=n.near,a.fogFar.value=n.far):n instanceof THREE.FogExp2&&(a.fogDensity.value=n.density));if(r instanceof THREE.MeshPhongMaterial||r instanceof THREE.MeshLambertMaterial||r.lights){if(Et){for(var l,c=f=0,h=0,p,d,v,m=St,g=m.directional.colors,y=m.directional.positions,b=m.point.colors,w=m.point.positions,T=m.point.distances,N=m.spot.colors,C=m.spot.positions,k=m.spot.distances,A=m.spot.directions,O=m.spot.anglesCos,D=m.spot.exponents,P=m.hemi.skyColors,H=m.hemi.groundColors,B=m.hemi.positions,j=0,F=0,I=0,q=0,U=0,z=0,X=0,$=0,K=l=0,n=v=K=0,s=t.length;n<s;n++)l=t[n],l.onlyShadow||(p=l.color,d=l.intensity,v=l.distance,l instanceof THREE.AmbientLight?l.visible&&(R.gammaInput?(f+=p.r*p.r,c+=p.g*p.g,h+=p.b*p.b):(f+=p.r,c+=p.g,h+=p.b)):l instanceof THREE.DirectionalLight?(U+=1,l.visible&&(wt.setFromMatrixPosition(l.matrixWorld),bt.setFromMatrixPosition(l.target.matrixWorld),wt.sub(bt),wt.normalize(),0===wt.x&&0===wt.y&&0===wt.z||(l=3*j,y[l]=wt.x,y[l+1]=wt.y,y[l+2]=wt.z,R.gammaInput?S(g,l,p,d*d):x(g,l,p,d),j+=1))):l instanceof THREE.PointLight?(z+=1,l.visible&&(K=3*F,R.gammaInput?S(b,K,p,d*d):x(b,K,p,d),bt.setFromMatrixPosition(l.matrixWorld),w[K]=bt.x,w[K+1]=bt.y,w[K+2]=bt.z,T[F]=v,F+=1)):l instanceof THREE.SpotLight?(X+=1,l.visible&&(K=3*I,R.gammaInput?S(N,K,p,d*d):x(N,K,p,d),bt.setFromMatrixPosition(l.matrixWorld),C[K]=bt.x,C[K+1]=bt.y,C[K+2]=bt.z,k[I]=v,wt.copy(bt),bt.setFromMatrixPosition(l.target.matrixWorld),wt.sub(bt),wt.normalize(),A[K]=wt.x,A[K+1]=wt.y,A[K+2]=wt.z,O[I]=Math.cos(l.angle),D[I]=l.exponent,I+=1)):l instanceof THREE.HemisphereLight&&($+=1,l.visible&&(wt.setFromMatrixPosition(l.matrixWorld),wt.normalize(),0===wt.x&&0===wt.y&&0===wt.z||(v=3*q,B[v]=wt.x,B[v+1]=wt.y,B[v+2]=wt.z,p=l.color,l=l.groundColor,R.gammaInput?(d*=d,S(P,v,p,d),S(H,v,l,d)):(x(P,v,p,d),x(H,v,l,d)),q+=1))));n=3*j;for(s=Math.max(g.length,3*U);n<s;n++)g[n]=0;n=3*F;for(s=Math.max(b.length,3*z);n<s;n++)b[n]=0;n=3*I;for(s=Math.max(N.length,3*X);n<s;n++)N[n]=0;n=3*q;for(s=Math.max(P.length,3*$);n<s;n++)P[n]=0;n=3*q;for(s=Math.max(H.length,3*$);n<s;n++)H[n]=0;m.directional.length=j;m.point.length=F;m.spot.length=I;m.hemi.length=q;m.ambient[0]=f;m.ambient[1]=c;m.ambient[2]=h;Et=!1}n=St;a.ambientLightColor.value=n.ambient;a.directionalLightColor.value=n.directional.colors;a.directionalLightDirection.value=n.directional.positions;a.pointLightColor.value=n.point.colors;a.pointLightPosition.value=n.point.positions;a.pointLightDistance.value=n.point.distances;a.spotLightColor.value=n.spot.colors;a.spotLightPosition.value=n.spot.positions;a.spotLightDistance.value=n.spot.distances;a.spotLightDirection.value=n.spot.directions;a.spotLightAngleCos.value=n.spot.anglesCos;a.spotLightExponent.value=n.spot.exponents;a.hemisphereLightSkyColor.value=n.hemi.skyColors;a.hemisphereLightGroundColor.value=n.hemi.groundColors;a.hemisphereLightDirection.value=n.hemi.positions}if(r instanceof THREE.MeshBasicMaterial||r instanceof THREE.MeshLambertMaterial||r instanceof THREE.MeshPhongMaterial){a.opacity.value=r.opacity;R.gammaInput?a.diffuse.value.copyGammaToLinear(r.color):a.diffuse.value=r.color;a.map.value=r.map;a.lightMap.value=r.lightMap;a.specularMap.value=r.specularMap;r.bumpMap&&(a.bumpMap.value=r.bumpMap,a.bumpScale.value=r.bumpScale);r.normalMap&&(a.normalMap.value=r.normalMap,a.normalScale.value.copy(r.normalScale));var G;r.map?G=r.map:r.specularMap?G=r.specularMap:r.normalMap?G=r.normalMap:r.bumpMap&&(G=r.bumpMap);void 0!==G&&(n=G.offset,G=G.repeat,a.offsetRepeat.value.set(n.x,n.y,G.x,G.y));a.envMap.value=r.envMap;a.flipEnvMap.value=r.envMap instanceof THREE.WebGLRenderTargetCube?1:-1;a.reflectivity.value=r.reflectivity;a.refractionRatio.value=r.refractionRatio;a.combine.value=r.combine;a.useRefract.value=r.envMap&&r.envMap.mapping instanceof THREE.CubeRefractionMapping}r instanceof THREE.LineBasicMaterial?(a.diffuse.value=r.color,a.opacity.value=r.opacity):r instanceof THREE.LineDashedMaterial?(a.diffuse.value=r.color,a.opacity.value=r.opacity,a.dashSize.value=r.dashSize,a.totalSize.value=r.dashSize+r.gapSize,a.scale.value=r.scale):r instanceof THREE.ParticleSystemMaterial?(a.psColor.value=r.color,a.opacity.value=r.opacity,a.size.value=r.size,a.scale.value=_.height/2,a.map.value=r.map):r instanceof THREE.MeshPhongMaterial?(a.shininess.value=r.shininess,R.gammaInput?(a.ambient.value.copyGammaToLinear(r.ambient),a.emissive.value.copyGammaToLinear(r.emissive),a.specular.value.copyGammaToLinear(r.specular)):(a.ambient.value=r.ambient,a.emissive.value=r.emissive,a.specular.value=r.specular),r.wrapAround&&a.wrapRGB.value.copy(r.wrapRGB)):r instanceof THREE.MeshLambertMaterial?(R.gammaInput?(a.ambient.value.copyGammaToLinear(r.ambient),a.emissive.value.copyGammaToLinear(r.emissive)):(a.ambient.value=r.ambient,a.emissive.value=r.emissive),r.wrapAround&&a.wrapRGB.value.copy(r.wrapRGB)):r instanceof THREE.MeshDepthMaterial?(a.mNear.value=e.near,a.mFar.value=e.far,a.opacity.value=r.opacity):r instanceof THREE.MeshNormalMaterial&&(a.opacity.value=r.opacity);if(i.receiveShadow&&!r._shadowPass&&a.shadowMatrix){n=G=0;for(s=t.length;n<s;n++)if(f=t[n],f.castShadow&&(f instanceof THREE.SpotLight||f instanceof THREE.DirectionalLight&&!f.shadowCascade))a.shadowMap.value[G]=f.shadowMap,a.shadowMapSize.value[G]=f.shadowMapSize,a.shadowMatrix.value[G]=f.shadowMatrix,a.shadowDarkness.value[G]=f.shadowDarkness,a.shadowBias.value[G]=f.shadowBias,G++}t=r.uniformsList;a=0;for(G=t.length;a<G;a++)if(s=o.uniforms[t[a][1]])if(n=t[a][0],c=n.type,f=n.value,\"i\"===c)xt.uniform1i(s,f);else if(\"f\"===c)xt.uniform1f(s,f);else if(\"v2\"===c)xt.uniform2f(s,f.x,f.y);else if(\"v3\"===c)xt.uniform3f(s,f.x,f.y,f.z);else if(\"v4\"===c)xt.uniform4f(s,f.x,f.y,f.z,f.w);else if(\"c\"===c)xt.uniform3f(s,f.r,f.g,f.b);else if(\"iv1\"===c)xt.uniform1iv(s,f);else if(\"iv\"===c)xt.uniform3iv(s,f);else if(\"fv1\"===c)xt.uniform1fv(s,f);else if(\"fv\"===c)xt.uniform3fv(s,f);else if(\"v2v\"===c){void 0===n._array&&(n._array=new Float32Array(2*f.length));c=0;for(h=f.length;c<h;c++)m=2*c,n._array[m]=f[c].x,n._array[m+1]=f[c].y;xt.uniform2fv(s,n._array)}else if(\"v3v\"===c){void 0===n._array&&(n._array=new Float32Array(3*f.length));c=0;for(h=f.length;c<h;c++)m=3*c,n._array[m]=f[c].x,n._array[m+1]=f[c].y,n._array[m+2]=f[c].z;xt.uniform3fv(s,n._array)}else if(\"v4v\"===c){void 0===n._array&&(n._array=new Float32Array(4*f.length));c=0;for(h=f.length;c<h;c++)m=4*c,n._array[m]=f[c].x,n._array[m+1]=f[c].y,n._array[m+2]=f[c].z,n._array[m+3]=f[c].w;xt.uniform4fv(s,n._array)}else if(\"m4\"===c)void 0===n._array&&(n._array=new Float32Array(16)),f.flattenToArray(n._array),xt.uniformMatrix4fv(s,!1,n._array);else if(\"m4v\"===c){void 0===n._array&&(n._array=new Float32Array(16*f.length));c=0;for(h=f.length;c<h;c++)f[c].flattenToArrayOffset(n._array,16*c);xt.uniformMatrix4fv(s,!1,n._array)}else if(\"t\"===c){if(m=f,f=E(),xt.uniform1i(s,f),m)if(m.image instanceof Array&&6===m.image.length){if(n=m,s=f,6===n.image.length)if(n.needsUpdate){n.image.__webglTextureCube||(n.addEventListener(\"dispose\",zt),n.image.__webglTextureCube=xt.createTexture(),R.info.memory.textures++);xt.activeTexture(xt.TEXTURE0+s);xt.bindTexture(xt.TEXTURE_CUBE_MAP,n.image.__webglTextureCube);xt.pixelStorei(xt.UNPACK_FLIP_Y_WEBGL,n.flipY);s=n instanceof THREE.CompressedTexture;f=[];for(c=0;6>c;c++)R.autoScaleCubemaps&&!s?(h=f,m=c,g=n.image[c],b=_t,g.width<=b&&g.height<=b||(w=Math.max(g.width,g.height),y=Math.floor(g.width*b/w),b=Math.floor(g.height*b/w),w=document.createElement(\"canvas\"),w.width=y,w.height=b,w.getContext(\"2d\").drawImage(g,0,0,g.width,g.height,0,0,y,b),g=w),h[m]=g):f[c]=n.image[c];c=f[0];h=0===(c.width&c.width-1)&&0===(c.height&c.height-1);m=M(n.format);g=M(n.type);L(xt.TEXTURE_CUBE_MAP,n,h);for(c=0;6>c;c++)if(s){b=f[c].mipmaps;w=0;for(T=b.length;w<T;w++)y=b[w],n.format!==THREE.RGBAFormat?xt.compressedTexImage2D(xt.TEXTURE_CUBE_MAP_POSITIVE_X+c,w,m,y.width,y.height,0,y.data):xt.texImage2D(xt.TEXTURE_CUBE_MAP_POSITIVE_X+c,w,m,y.width,y.height,0,m,g,y.data)}else xt.texImage2D(xt.TEXTURE_CUBE_MAP_POSITIVE_X+c,0,m,m,g,f[c]);n.generateMipmaps&&h&&xt.generateMipmap(xt.TEXTURE_CUBE_MAP);n.needsUpdate=!1;if(n.onUpdate)n.onUpdate()}else xt.activeTexture(xt.TEXTURE0+s),xt.bindTexture(xt.TEXTURE_CUBE_MAP,n.image.__webglTextureCube)}else m instanceof THREE.WebGLRenderTargetCube?(n=m,xt.activeTexture(xt.TEXTURE0+f),xt.bindTexture(xt.TEXTURE_CUBE_MAP,n.__webglTexture)):R.setTexture(m,f)}else if(\"tv\"===c){void 0===n._array&&(n._array=[]);c=0;for(h=n.value.length;c<h;c++)n._array[c]=E();xt.uniform1iv(s,n._array);c=0;for(h=n.value.length;c<h;c++)m=n.value[c],f=n._array[c],m&&R.setTexture(m,f)}else console.warn(\"THREE.WebGLRenderer: Unknown uniform type: \"+c);if((r instanceof THREE.ShaderMaterial||r instanceof THREE.MeshPhongMaterial||r.envMap)&&null!==u.cameraPosition)bt.setFromMatrixPosition(e.matrixWorld),xt.uniform3f(u.cameraPosition,bt.x,bt.y,bt.z);(r instanceof THREE.MeshPhongMaterial||r instanceof THREE.MeshLambertMaterial||r instanceof THREE.ShaderMaterial||r.skinning)&&null!==u.viewMatrix&&xt.uniformMatrix4fv(u.viewMatrix,!1,e.matrixWorldInverse.elements)}xt.uniformMatrix4fv(u.modelViewMatrix,!1,i._modelViewMatrix.elements);u.normalMatrix&&xt.uniformMatrix3fv(u.normalMatrix,!1,i._normalMatrix.elements);null!==u.modelMatrix&&xt.uniformMatrix4fv(u.modelMatrix,!1,i.matrixWorld.elements);return o}function E(){var e=Q;e>=Ot&&console.warn(\"WebGLRenderer: trying to use \"+e+\" texture units while this GPU supports only \"+Ot);Q+=1;return e}function S(e,t,n,r){e[t]=n.r*n.r*r;e[t+1]=n.g*n.g*r;e[t+2]=n.b*n.b*r}function x(e,t,n,r){e[t]=n.r*r;e[t+1]=n.g*r;e[t+2]=n.b*r}function T(e){e!==at&&(xt.lineWidth(e),at=e)}function N(e,t,n){st!==e&&(e?xt.enable(xt.POLYGON_OFFSET_FILL):xt.disable(xt.POLYGON_OFFSET_FILL),st=e);if(e&&(ot!==t||ut!==n))xt.polygonOffset(t,n),ot=t,ut=n}function C(e){for(var e=e.split(\"\\n\"),t=0,n=e.length;t<n;t++)e[t]=t+1+\": \"+e[t];return e.join(\"\\n\")}function k(e,t){var n;\"fragment\"===e?n=xt.createShader(xt.FRAGMENT_SHADER):\"vertex\"===e&&(n=xt.createShader(xt.VERTEX_SHADER));xt.shaderSource(n,t);xt.compileShader(n);return!xt.getShaderParameter(n,xt.COMPILE_STATUS)?(console.error(xt.getShaderInfoLog(n)),console.error(C(t)),null):n}function L(e,t,n){n?(xt.texParameteri(e,xt.TEXTURE_WRAP_S,M(t.wrapS)),xt.texParameteri(e,xt.TEXTURE_WRAP_T,M(t.wrapT)),xt.texParameteri(e,xt.TEXTURE_MAG_FILTER,M(t.magFilter)),xt.texParameteri(e,xt.TEXTURE_MIN_FILTER,M(t.minFilter))):(xt.texParameteri(e,xt.TEXTURE_WRAP_S,xt.CLAMP_TO_EDGE),xt.texParameteri(e,xt.TEXTURE_WRAP_T,xt.CLAMP_TO_EDGE),xt.texParameteri(e,xt.TEXTURE_MAG_FILTER,O(t.magFilter)),xt.texParameteri(e,xt.TEXTURE_MIN_FILTER,O(t.minFilter)));if(Ct&&t.type!==THREE.FloatType&&(1<t.anisotropy||t.__oldAnisotropy))xt.texParameterf(e,Ct.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(t.anisotropy,Dt)),t.__oldAnisotropy=t.anisotropy}function A(e,t){xt.bindRenderbuffer(xt.RENDERBUFFER,e);t.depthBuffer&&!t.stencilBuffer?(xt.renderbufferStorage(xt.RENDERBUFFER,xt.DEPTH_COMPONENT16,t.width,t.height),xt.framebufferRenderbuffer(xt.FRAMEBUFFER,xt.DEPTH_ATTACHMENT,xt.RENDERBUFFER,e)):t.depthBuffer&&t.stencilBuffer?(xt.renderbufferStorage(xt.RENDERBUFFER,xt.DEPTH_STENCIL,t.width,t.height),xt.framebufferRenderbuffer(xt.FRAMEBUFFER,xt.DEPTH_STENCIL_ATTACHMENT,xt.RENDERBUFFER,e)):xt.renderbufferStorage(xt.RENDERBUFFER,xt.RGBA4,t.width,t.height)}function O(e){return e===THREE.NearestFilter||e===THREE.NearestMipMapNearestFilter||e===THREE.NearestMipMapLinearFilter?xt.NEAREST:xt.LINEAR}function M(e){if(e===THREE.RepeatWrapping)return xt.REPEAT;if(e===THREE.ClampToEdgeWrapping)return xt.CLAMP_TO_EDGE;if(e===THREE.MirroredRepeatWrapping)return xt.MIRRORED_REPEAT;if(e===THREE.NearestFilter)return xt.NEAREST;if(e===THREE.NearestMipMapNearestFilter)return xt.NEAREST_MIPMAP_NEAREST;if(e===THREE.NearestMipMapLinearFilter)return xt.NEAREST_MIPMAP_LINEAR;if(e===THREE.LinearFilter)return xt.LINEAR;if(e===THREE.LinearMipMapNearestFilter)return xt.LINEAR_MIPMAP_NEAREST;if(e===THREE.LinearMipMapLinearFilter)return xt.LINEAR_MIPMAP_LINEAR;if(e===THREE.UnsignedByteType)return xt.UNSIGNED_BYTE;if(e===THREE.UnsignedShort4444Type)return xt.UNSIGNED_SHORT_4_4_4_4;if(e===THREE.UnsignedShort5551Type)return xt.UNSIGNED_SHORT_5_5_5_1;if(e===THREE.UnsignedShort565Type)return xt.UNSIGNED_SHORT_5_6_5;if(e===THREE.ByteType)return xt.BYTE;if(e===THREE.ShortType)return xt.SHORT;if(e===THREE.UnsignedShortType)return xt.UNSIGNED_SHORT;if(e===THREE.IntType)return xt.INT;if(e===THREE.UnsignedIntType)return xt.UNSIGNED_INT;if(e===THREE.FloatType)return xt.FLOAT;if(e===THREE.AlphaFormat)return xt.ALPHA;if(e===THREE.RGBFormat)return xt.RGB;if(e===THREE.RGBAFormat)return xt.RGBA;if(e===THREE.LuminanceFormat)return xt.LUMINANCE;if(e===THREE.LuminanceAlphaFormat)return xt.LUMINANCE_ALPHA;if(e===THREE.AddEquation)return xt.FUNC_ADD;if(e===THREE.SubtractEquation)return xt.FUNC_SUBTRACT;if(e===THREE.ReverseSubtractEquation)return xt.FUNC_REVERSE_SUBTRACT;if(e===THREE.ZeroFactor)return xt.ZERO;if(e===THREE.OneFactor)return xt.ONE;if(e===THREE.SrcColorFactor)return xt.SRC_COLOR;if(e===THREE.OneMinusSrcColorFactor)return xt.ONE_MINUS_SRC_COLOR;if(e===THREE.SrcAlphaFactor)return xt.SRC_ALPHA;if(e===THREE.OneMinusSrcAlphaFactor)return xt.ONE_MINUS_SRC_ALPHA;if(e===THREE.DstAlphaFactor)return xt.DST_ALPHA;if(e===THREE.OneMinusDstAlphaFactor)return xt.ONE_MINUS_DST_ALPHA;if(e===THREE.DstColorFactor)return xt.DST_COLOR;if(e===THREE.OneMinusDstColorFactor)return xt.ONE_MINUS_DST_COLOR;if(e===THREE.SrcAlphaSaturateFactor)return xt.SRC_ALPHA_SATURATE;if(void 0!==kt){if(e===THREE.RGB_S3TC_DXT1_Format)return kt.COMPRESSED_RGB_S3TC_DXT1_EXT;if(e===THREE.RGBA_S3TC_DXT1_Format)return kt.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(e===THREE.RGBA_S3TC_DXT3_Format)return kt.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(e===THREE.RGBA_S3TC_DXT5_Format)return kt.COMPRESSED_RGBA_S3TC_DXT5_EXT}return 0}console.log(\"THREE.WebGLRenderer\",THREE.REVISION);var e=e||{},_=void 0!==e.canvas?e.canvas:document.createElement(\"canvas\"),D=void 0!==e.precision?e.precision:\"highp\",P=void 0!==e.alpha?e.alpha:!1,H=void 0!==e.premultipliedAlpha?e.premultipliedAlpha:!0,B=void 0!==e.antialias?e.antialias:!1,j=void 0!==e.stencil?e.stencil:!0,F=void 0!==e.preserveDrawingBuffer?e.preserveDrawingBuffer:!1,I=new THREE.Color(0),q=0;this.domElement=_;this.context=null;this.devicePixelRatio=void 0!==e.devicePixelRatio?e.devicePixelRatio:void 0!==self.devicePixelRatio?self.devicePixelRatio:1;this.autoUpdateObjects=this.sortObjects=this.autoClearStencil=this.autoClearDepth=this.autoClearColor=this.autoClear=!0;this.shadowMapEnabled=this.physicallyBasedShading=this.gammaOutput=this.gammaInput=!1;this.shadowMapAutoUpdate=!0;this.shadowMapType=THREE.PCFShadowMap;this.shadowMapCullFace=THREE.CullFaceFront;this.shadowMapCascade=this.shadowMapDebug=!1;this.maxMorphTargets=8;this.maxMorphNormals=4;this.autoScaleCubemaps=!0;this.renderPluginsPre=[];this.renderPluginsPost=[];this.info={memory:{programs:0,geometries:0,textures:0},render:{calls:0,vertices:0,faces:0,points:0}};var R=this,U=[],z=0,W=null,X=null,V=-1,$=null,J=null,K=0,Q=0,G=-1,Y=-1,Z=-1,et=-1,tt=-1,nt=-1,rt=-1,it=-1,st=null,ot=null,ut=null,at=null,ft=0,lt=0,ct=_.width,ht=_.height,pt=0,dt=0,vt={},mt=new THREE.Frustum,gt=new THREE.Matrix4,yt=new THREE.Matrix4,bt=new THREE.Vector3,wt=new THREE.Vector3,Et=!0,St={ambient:[0,0,0],directional:{length:0,colors:[],positions:[]},point:{length:0,colors:[],positions:[],distances:[]},spot:{length:0,colors:[],positions:[],distances:[],directions:[],anglesCos:[],exponents:[]},hemi:{length:0,skyColors:[],groundColors:[],positions:[]}},xt,Tt,Nt,Ct,kt;try{var Lt={alpha:P,premultipliedAlpha:H,antialias:B,stencil:j,preserveDrawingBuffer:F};xt=_.getContext(\"webgl\",Lt)||_.getContext(\"experimental-webgl\",Lt);if(null===xt)throw\"Error creating WebGL context.\"}catch(At){console.error(At)}Tt=xt.getExtension(\"OES_texture_float\");xt.getExtension(\"OES_texture_float_linear\");Nt=xt.getExtension(\"OES_standard_derivatives\");Ct=xt.getExtension(\"EXT_texture_filter_anisotropic\")||xt.getExtension(\"MOZ_EXT_texture_filter_anisotropic\")||xt.getExtension(\"WEBKIT_EXT_texture_filter_anisotropic\");kt=xt.getExtension(\"WEBGL_compressed_texture_s3tc\")||xt.getExtension(\"MOZ_WEBGL_compressed_texture_s3tc\")||xt.getExtension(\"WEBKIT_WEBGL_compressed_texture_s3tc\");Tt||console.log(\"THREE.WebGLRenderer: Float textures not supported.\");Nt||console.log(\"THREE.WebGLRenderer: Standard derivatives not supported.\");Ct||console.log(\"THREE.WebGLRenderer: Anisotropic texture filtering not supported.\");kt||console.log(\"THREE.WebGLRenderer: S3TC compressed textures not supported.\");void 0===xt.getShaderPrecisionFormat&&(xt.getShaderPrecisionFormat=function(){return{rangeMin:1,rangeMax:1,precision:1}});xt.clearColor(0,0,0,1);xt.clearDepth(1);xt.clearStencil(0);xt.enable(xt.DEPTH_TEST);xt.depthFunc(xt.LEQUAL);xt.frontFace(xt.CCW);xt.cullFace(xt.BACK);xt.enable(xt.CULL_FACE);xt.enable(xt.BLEND);xt.blendEquation(xt.FUNC_ADD);xt.blendFunc(xt.SRC_ALPHA,xt.ONE_MINUS_SRC_ALPHA);xt.viewport(ft,lt,ct,ht);xt.clearColor(I.r,I.g,I.b,q);this.context=xt;var Ot=xt.getParameter(xt.MAX_TEXTURE_IMAGE_UNITS),Mt=xt.getParameter(xt.MAX_VERTEX_TEXTURE_IMAGE_UNITS);xt.getParameter(xt.MAX_TEXTURE_SIZE);var _t=xt.getParameter(xt.MAX_CUBE_MAP_TEXTURE_SIZE),Dt=Ct?xt.getParameter(Ct.MAX_TEXTURE_MAX_ANISOTROPY_EXT):0,Pt=0<Mt,Ht=Pt&&Tt;kt&&xt.getParameter(xt.COMPRESSED_TEXTURE_FORMATS);var Bt=xt.getShaderPrecisionFormat(xt.VERTEX_SHADER,xt.HIGH_FLOAT),jt=xt.getShaderPrecisionFormat(xt.VERTEX_SHADER,xt.MEDIUM_FLOAT);xt.getShaderPrecisionFormat(xt.VERTEX_SHADER,xt.LOW_FLOAT);var Ft=xt.getShaderPrecisionFormat(xt.FRAGMENT_SHADER,xt.HIGH_FLOAT),It=xt.getShaderPrecisionFormat(xt.FRAGMENT_SHADER,xt.MEDIUM_FLOAT);xt.getShaderPrecisionFormat(xt.FRAGMENT_SHADER,xt.LOW_FLOAT);xt.getShaderPrecisionFormat(xt.VERTEX_SHADER,xt.HIGH_INT);xt.getShaderPrecisionFormat(xt.VERTEX_SHADER,xt.MEDIUM_INT);xt.getShaderPrecisionFormat(xt.VERTEX_SHADER,xt.LOW_INT);xt.getShaderPrecisionFormat(xt.FRAGMENT_SHADER,xt.HIGH_INT);xt.getShaderPrecisionFormat(xt.FRAGMENT_SHADER,xt.MEDIUM_INT);xt.getShaderPrecisionFormat(xt.FRAGMENT_SHADER,xt.LOW_INT);var qt=0<Bt.precision&&0<Ft.precision,Rt=0<jt.precision&&0<It.precision;\"highp\"===D&&!qt&&(Rt?(D=\"mediump\",console.warn(\"WebGLRenderer: highp not supported, using mediump\")):(D=\"lowp\",console.warn(\"WebGLRenderer: highp and mediump not supported, using lowp\")));\"mediump\"===D&&!Rt&&(D=\"lowp\",console.warn(\"WebGLRenderer: mediump not supported, using lowp\"));this.getContext=function(){return xt};this.supportsVertexTextures=function(){return Pt};this.supportsFloatTextures=function(){return Tt};this.supportsStandardDerivatives=function(){return Nt};this.supportsCompressedTextureS3TC=function(){return kt};this.getMaxAnisotropy=function(){return Dt};this.getPrecision=function(){return D};this.setSize=function(e,t,n){_.width=e*this.devicePixelRatio;_.height=t*this.devicePixelRatio;1!==this.devicePixelRatio&&!1!==n&&(_.style.width=e+\"px\",_.style.height=t+\"px\");this.setViewport(0,0,_.width,_.height)};this.setViewport=function(e,t,n,r){ft=void 0!==e?e:0;lt=void 0!==t?t:0;ct=void 0!==n?n:_.width;ht=void 0!==r?r:_.height;xt.viewport(ft,lt,ct,ht)};this.setScissor=function(e,t,n,r){xt.scissor(e,t,n,r)};this.enableScissorTest=function(e){e?xt.enable(xt.SCISSOR_TEST):xt.disable(xt.SCISSOR_TEST)};this.setClearColor=function(e,t){I.set(e);q=void 0!==t?t:1;xt.clearColor(I.r,I.g,I.b,q)};this.setClearColorHex=function(e,t){console.warn(\"DEPRECATED: .setClearColorHex() is being removed. Use .setClearColor() instead.\");this.setClearColor(e,t)};this.getClearColor=function(){return I};this.getClearAlpha=function(){return q};this.clear=function(e,t,n){var r=0;if(void 0===e||e)r|=xt.COLOR_BUFFER_BIT;if(void 0===t||t)r|=xt.DEPTH_BUFFER_BIT;if(void 0===n||n)r|=xt.STENCIL_BUFFER_BIT;xt.clear(r)};this.clearColor=function(){xt.clear(xt.COLOR_BUFFER_BIT)};this.clearDepth=function(){xt.clear(xt.DEPTH_BUFFER_BIT)};this.clearStencil=function(){xt.clear(xt.STENCIL_BUFFER_BIT)};this.clearTarget=function(e,t,n,r){this.setRenderTarget(e);this.clear(t,n,r)};this.addPostPlugin=function(e){e.init(this);this.renderPluginsPost.push(e)};this.addPrePlugin=function(e){e.init(this);this.renderPluginsPre.push(e)};this.updateShadowMap=function(e,t){W=null;V=$=it=rt=Z=-1;Et=!0;Y=G=-1;this.shadowMapPlugin.update(e,t)};var Ut=function(e){e=e.target;e.removeEventListener(\"dispose\",Ut);e.__webglInit=void 0;if(e instanceof THREE.BufferGeometry){var t=e.attributes,n;for(n in t)void 0!==t[n].buffer&&xt.deleteBuffer(t[n].buffer);R.info.memory.geometries--}else if(void 0!==e.geometryGroups)for(t in e.geometryGroups){n=e.geometryGroups[t];if(void 0!==n.numMorphTargets)for(var r=0,i=n.numMorphTargets;r<i;r++)xt.deleteBuffer(n.__webglMorphTargetsBuffers[r]);if(void 0!==n.numMorphNormals){r=0;for(i=n.numMorphNormals;r<i;r++)xt.deleteBuffer(n.__webglMorphNormalsBuffers[r])}Vt(n)}else Vt(e)},zt=function(e){e=e.target;e.removeEventListener(\"dispose\",zt);e.image&&e.image.__webglTextureCube?xt.deleteTexture(e.image.__webglTextureCube):e.__webglInit&&(e.__webglInit=!1,xt.deleteTexture(e.__webglTexture));R.info.memory.textures--},Wt=function(e){e=e.target;e.removeEventListener(\"dispose\",Wt);if(e&&e.__webglTexture)if(xt.deleteTexture(e.__webglTexture),e instanceof THREE.WebGLRenderTargetCube)for(var t=0;6>t;t++)xt.deleteFramebuffer(e.__webglFramebuffer[t]),xt.deleteRenderbuffer(e.__webglRenderbuffer[t]);else xt.deleteFramebuffer(e.__webglFramebuffer),xt.deleteRenderbuffer(e.__webglRenderbuffer);R.info.memory.textures--},Xt=function(e){e=e.target;e.removeEventListener(\"dispose\",Xt);$t(e)},Vt=function(e){void 0!==e.__webglVertexBuffer&&xt.deleteBuffer(e.__webglVertexBuffer);void 0!==e.__webglNormalBuffer&&xt.deleteBuffer(e.__webglNormalBuffer);void 0!==e.__webglTangentBuffer&&xt.deleteBuffer(e.__webglTangentBuffer);void 0!==e.__webglColorBuffer&&xt.deleteBuffer(e.__webglColorBuffer);void 0!==e.__webglUVBuffer&&xt.deleteBuffer(e.__webglUVBuffer);void 0!==e.__webglUV2Buffer&&xt.deleteBuffer(e.__webglUV2Buffer);void 0!==e.__webglSkinIndicesBuffer&&xt.deleteBuffer(e.__webglSkinIndicesBuffer);void 0!==e.__webglSkinWeightsBuffer&&xt.deleteBuffer(e.__webglSkinWeightsBuffer);void 0!==e.__webglFaceBuffer&&xt.deleteBuffer(e.__webglFaceBuffer);void 0!==e.__webglLineBuffer&&xt.deleteBuffer(e.__webglLineBuffer);void 0!==e.__webglLineDistanceBuffer&&xt.deleteBuffer(e.__webglLineDistanceBuffer);if(void 0!==e.__webglCustomAttributesList)for(var t in e.__webglCustomAttributesList)xt.deleteBuffer(e.__webglCustomAttributesList[t].buffer);R.info.memory.geometries--},$t=function(e){var t=e.program;if(void 0!==t){e.program=void 0;var n,r,i=!1,e=0;for(n=U.length;e<n;e++)if(r=U[e],r.program===t){r.usedTimes--;0===r.usedTimes&&(i=!0);break}if(!0===i){i=[];e=0;for(n=U.length;e<n;e++)r=U[e],r.program!==t&&i.push(r);U=i;xt.deleteProgram(t);R.info.memory.programs--}}};this.renderBufferImmediate=function(e,t,n){e.hasPositions&&!e.__webglVertexBuffer&&(e.__webglVertexBuffer=xt.createBuffer());e.hasNormals&&!e.__webglNormalBuffer&&(e.__webglNormalBuffer=xt.createBuffer());e.hasUvs&&!e.__webglUvBuffer&&(e.__webglUvBuffer=xt.createBuffer());e.hasColors&&!e.__webglColorBuffer&&(e.__webglColorBuffer=xt.createBuffer());e.hasPositions&&(xt.bindBuffer(xt.ARRAY_BUFFER,e.__webglVertexBuffer),xt.bufferData(xt.ARRAY_BUFFER,e.positionArray,xt.DYNAMIC_DRAW),xt.enableVertexAttribArray(t.attributes.position),xt.vertexAttribPointer(t.attributes.position,3,xt.FLOAT,!1,0,0));if(e.hasNormals){xt.bindBuffer(xt.ARRAY_BUFFER,e.__webglNormalBuffer);if(n.shading===THREE.FlatShading){var r,i,s,o,u,a,f,l,c,h,p,d=3*e.count;for(p=0;p<d;p+=9)h=e.normalArray,r=h[p],i=h[p+1],s=h[p+2],o=h[p+3],a=h[p+4],l=h[p+5],u=h[p+6],f=h[p+7],c=h[p+8],r=(r+o+u)/3,i=(i+a+f)/3,s=(s+l+c)/3,h[p]=r,h[p+1]=i,h[p+2]=s,h[p+3]=r,h[p+4]=i,h[p+5]=s,h[p+6]=r,h[p+7]=i,h[p+8]=s}xt.bufferData(xt.ARRAY_BUFFER,e.normalArray,xt.DYNAMIC_DRAW);xt.enableVertexAttribArray(t.attributes.normal);xt.vertexAttribPointer(t.attributes.normal,3,xt.FLOAT,!1,0,0)}e.hasUvs&&n.map&&(xt.bindBuffer(xt.ARRAY_BUFFER,e.__webglUvBuffer),xt.bufferData(xt.ARRAY_BUFFER,e.uvArray,xt.DYNAMIC_DRAW),xt.enableVertexAttribArray(t.attributes.uv),xt.vertexAttribPointer(t.attributes.uv,2,xt.FLOAT,!1,0,0));e.hasColors&&n.vertexColors!==THREE.NoColors&&(xt.bindBuffer(xt.ARRAY_BUFFER,e.__webglColorBuffer),xt.bufferData(xt.ARRAY_BUFFER,e.colorArray,xt.DYNAMIC_DRAW),xt.enableVertexAttribArray(t.attributes.color),xt.vertexAttribPointer(t.attributes.color,3,xt.FLOAT,!1,0,0));xt.drawArrays(xt.TRIANGLES,0,e.count);e.count=0};this.renderBufferDirect=function(e,t,n,r,i,s){if(!1!==r.visible){var a,f,l,c;a=w(e,t,n,r,s);t=a.attributes;e=i.attributes;n=!1;a=16777215*i.id+2*a.id+(r.wireframe?1:0);a!==$&&($=a,n=!0);n&&u();if(s instanceof THREE.Mesh)if(s=e.index){i=i.offsets;1<i.length&&(n=!0);for(var h=0,p=i.length;h<p;h++){var d=i[h].index;if(n){for(f in t)l=t[f],a=e[f],0<=l&&(a?(c=a.itemSize,xt.bindBuffer(xt.ARRAY_BUFFER,a.buffer),o(l),xt.vertexAttribPointer(l,c,xt.FLOAT,!1,0,4*d*c)):r.defaultAttributeValues&&(2===r.defaultAttributeValues[f].length?xt.vertexAttrib2fv(l,r.defaultAttributeValues[f]):3===r.defaultAttributeValues[f].length&&xt.vertexAttrib3fv(l,r.defaultAttributeValues[f])));xt.bindBuffer(xt.ELEMENT_ARRAY_BUFFER,s.buffer)}xt.drawElements(xt.TRIANGLES,i[h].count,xt.UNSIGNED_SHORT,2*i[h].start);R.info.render.calls++;R.info.render.vertices+=i[h].count;R.info.render.faces+=i[h].count/3}}else{if(n)for(f in t)\"index\"!==f&&(l=t[f],a=e[f],0<=l&&(a?(c=a.itemSize,xt.bindBuffer(xt.ARRAY_BUFFER,a.buffer),o(l),xt.vertexAttribPointer(l,c,xt.FLOAT,!1,0,0)):r.defaultAttributeValues&&r.defaultAttributeValues[f]&&(2===r.defaultAttributeValues[f].length?xt.vertexAttrib2fv(l,r.defaultAttributeValues[f]):3===r.defaultAttributeValues[f].length&&xt.vertexAttrib3fv(l,r.defaultAttributeValues[f]))));r=i.attributes.position;xt.drawArrays(xt.TRIANGLES,0,r.numItems/3);R.info.render.calls++;R.info.render.vertices+=r.numItems/3;R.info.render.faces+=r.numItems/3/3}else if(s instanceof THREE.ParticleSystem){if(n){for(f in t)l=t[f],a=e[f],0<=l&&(a?(c=a.itemSize,xt.bindBuffer(xt.ARRAY_BUFFER,a.buffer),o(l),xt.vertexAttribPointer(l,c,xt.FLOAT,!1,0,0)):r.defaultAttributeValues&&r.defaultAttributeValues[f]&&(2===r.defaultAttributeValues[f].length?xt.vertexAttrib2fv(l,r.defaultAttributeValues[f]):3===r.defaultAttributeValues[f].length&&xt.vertexAttrib3fv(l,r.defaultAttributeValues[f])));r=e.position;xt.drawArrays(xt.POINTS,0,r.numItems/3);R.info.render.calls++;R.info.render.points+=r.numItems/3}}else if(s instanceof THREE.Line&&n){for(f in t)l=t[f],a=e[f],0<=l&&(a?(c=a.itemSize,xt.bindBuffer(xt.ARRAY_BUFFER,a.buffer),o(l),xt.vertexAttribPointer(l,c,xt.FLOAT,!1,0,0)):r.defaultAttributeValues&&r.defaultAttributeValues[f]&&(2===r.defaultAttributeValues[f].length?xt.vertexAttrib2fv(l,r.defaultAttributeValues[f]):3===r.defaultAttributeValues[f].length&&xt.vertexAttrib3fv(l,r.defaultAttributeValues[f])));f=s.type===THREE.LineStrip?xt.LINE_STRIP:xt.LINES;T(r.linewidth);r=e.position;xt.drawArrays(f,0,r.numItems/3);R.info.render.calls++;R.info.render.points+=r.numItems}}};this.renderBuffer=function(e,t,n,r,i,s){if(!1!==r.visible){var a,l,n=w(e,t,n,r,s),e=n.attributes,t=!1,n=16777215*i.id+2*n.id+(r.wireframe?1:0);n!==$&&($=n,t=!0);t&&u();if(!r.morphTargets&&0<=e.position)t&&(xt.bindBuffer(xt.ARRAY_BUFFER,i.__webglVertexBuffer),o(e.position),xt.vertexAttribPointer(e.position,3,xt.FLOAT,!1,0,0));else if(s.morphTargetBase){n=r.program.attributes;-1!==s.morphTargetBase&&0<=n.position?(xt.bindBuffer(xt.ARRAY_BUFFER,i.__webglMorphTargetsBuffers[s.morphTargetBase]),o(n.position),xt.vertexAttribPointer(n.position,3,xt.FLOAT,!1,0,0)):0<=n.position&&(xt.bindBuffer(xt.ARRAY_BUFFER,i.__webglVertexBuffer),o(n.position),xt.vertexAttribPointer(n.position,3,xt.FLOAT,!1,0,0));if(s.morphTargetForcedOrder.length){var c=0;l=s.morphTargetForcedOrder;for(a=s.morphTargetInfluences;c<r.numSupportedMorphTargets&&c<l.length;)0<=n[\"morphTarget\"+c]&&(xt.bindBuffer(xt.ARRAY_BUFFER,i.__webglMorphTargetsBuffers[l[c]]),o(n[\"morphTarget\"+c]),xt.vertexAttribPointer(n[\"morphTarget\"+c],3,xt.FLOAT,!1,0,0)),0<=n[\"morphNormal\"+c]&&r.morphNormals&&(xt.bindBuffer(xt.ARRAY_BUFFER,i.__webglMorphNormalsBuffers[l[c]]),o(n[\"morphNormal\"+c]),xt.vertexAttribPointer(n[\"morphNormal\"+c],3,xt.FLOAT,!1,0,0)),s.__webglMorphTargetInfluences[c]=a[l[c]],c++}else{l=[];a=s.morphTargetInfluences;var h,p=a.length;for(h=0;h<p;h++)c=a[h],0<c&&l.push([c,h]);l.length>r.numSupportedMorphTargets?(l.sort(f),l.length=r.numSupportedMorphTargets):l.length>r.numSupportedMorphNormals?l.sort(f):0===l.length&&l.push([0,0]);for(c=0;c<r.numSupportedMorphTargets;)l[c]?(h=l[c][1],0<=n[\"morphTarget\"+c]&&(xt.bindBuffer(xt.ARRAY_BUFFER,i.__webglMorphTargetsBuffers[h]),o(n[\"morphTarget\"+c]),xt.vertexAttribPointer(n[\"morphTarget\"+c],3,xt.FLOAT,!1,0,0)),0<=n[\"morphNormal\"+c]&&r.morphNormals&&(xt.bindBuffer(xt.ARRAY_BUFFER,i.__webglMorphNormalsBuffers[h]),o(n[\"morphNormal\"+c]),xt.vertexAttribPointer(n[\"morphNormal\"+c],3,xt.FLOAT,!1,0,0)),s.__webglMorphTargetInfluences[c]=a[h]):s.__webglMorphTargetInfluences[c]=0,c++}null!==r.program.uniforms.morphTargetInfluences&&xt.uniform1fv(r.program.uniforms.morphTargetInfluences,s.__webglMorphTargetInfluences)}if(t){if(i.__webglCustomAttributesList){a=0;for(l=i.__webglCustomAttributesList.length;a<l;a++)n=i.__webglCustomAttributesList[a],0<=e[n.buffer.belongsToAttribute]&&(xt.bindBuffer(xt.ARRAY_BUFFER,n.buffer),o(e[n.buffer.belongsToAttribute]),xt.vertexAttribPointer(e[n.buffer.belongsToAttribute],n.size,xt.FLOAT,!1,0,0))}0<=e.color&&(0<s.geometry.colors.length||0<s.geometry.faces.length?(xt.bindBuffer(xt.ARRAY_BUFFER,i.__webglColorBuffer),o(e.color),xt.vertexAttribPointer(e.color,3,xt.FLOAT,!1,0,0)):r.defaultAttributeValues&&xt.vertexAttrib3fv(e.color,r.defaultAttributeValues.color));0<=e.normal&&(xt.bindBuffer(xt.ARRAY_BUFFER,i.__webglNormalBuffer),o(e.normal),xt.vertexAttribPointer(e.normal,3,xt.FLOAT,!1,0,0));0<=e.tangent&&(xt.bindBuffer(xt.ARRAY_BUFFER,i.__webglTangentBuffer),o(e.tangent),xt.vertexAttribPointer(e.tangent,4,xt.FLOAT,!1,0,0));0<=e.uv&&(s.geometry.faceVertexUvs[0]?(xt.bindBuffer(xt.ARRAY_BUFFER,i.__webglUVBuffer),o(e.uv),xt.vertexAttribPointer(e.uv,2,xt.FLOAT,!1,0,0)):r.defaultAttributeValues&&xt.vertexAttrib2fv(e.uv,r.defaultAttributeValues.uv));0<=e.uv2&&(s.geometry.faceVertexUvs[1]?(xt.bindBuffer(xt.ARRAY_BUFFER,i.__webglUV2Buffer),o(e.uv2),xt.vertexAttribPointer(e.uv2,2,xt.FLOAT,!1,0,0)):r.defaultAttributeValues&&xt.vertexAttrib2fv(e.uv2,r.defaultAttributeValues.uv2));r.skinning&&0<=e.skinIndex&&0<=e.skinWeight&&(xt.bindBuffer(xt.ARRAY_BUFFER,i.__webglSkinIndicesBuffer),o(e.skinIndex),xt.vertexAttribPointer(e.skinIndex,4,xt.FLOAT,!1,0,0),xt.bindBuffer(xt.ARRAY_BUFFER,i.__webglSkinWeightsBuffer),o(e.skinWeight),xt.vertexAttribPointer(e.skinWeight,4,xt.FLOAT,!1,0,0));0<=e.lineDistance&&(xt.bindBuffer(xt.ARRAY_BUFFER,i.__webglLineDistanceBuffer),o(e.lineDistance),xt.vertexAttribPointer(e.lineDistance,1,xt.FLOAT,!1,0,0))}s instanceof THREE.Mesh?(r.wireframe?(T(r.wireframeLinewidth),t&&xt.bindBuffer(xt.ELEMENT_ARRAY_BUFFER,i.__webglLineBuffer),xt.drawElements(xt.LINES,i.__webglLineCount,xt.UNSIGNED_SHORT,0)):(t&&xt.bindBuffer(xt.ELEMENT_ARRAY_BUFFER,i.__webglFaceBuffer),xt.drawElements(xt.TRIANGLES,i.__webglFaceCount,xt.UNSIGNED_SHORT,0)),R.info.render.calls++,R.info.render.vertices+=i.__webglFaceCount,R.info.render.faces+=i.__webglFaceCount/3):s instanceof THREE.Line?(s=s.type===THREE.LineStrip?xt.LINE_STRIP:xt.LINES,T(r.linewidth),xt.drawArrays(s,0,i.__webglLineCount),R.info.render.calls++):s instanceof THREE.ParticleSystem&&(xt.drawArrays(xt.POINTS,0,i.__webglParticleCount),R.info.render.calls++,R.info.render.points+=i.__webglParticleCount)}};this.render=function(e,t,n,r){if(!1===t instanceof THREE.Camera)console.error(\"THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.\");else{var i,s,o,u,f=e.__lights,p=e.fog;V=-1;Et=!0;!0===e.autoUpdate&&e.updateMatrixWorld();void 0===t.parent&&t.updateMatrixWorld();t.matrixWorldInverse.getInverse(t.matrixWorld);gt.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse);mt.setFromMatrix(gt);this.autoUpdateObjects&&this.initWebGLObjects(e);l(this.renderPluginsPre,e,t);R.info.render.calls=0;R.info.render.vertices=0;R.info.render.faces=0;R.info.render.points=0;this.setRenderTarget(n);(this.autoClear||r)&&this.clear(this.autoClearColor,this.autoClearDepth,this.autoClearStencil);u=e.__webglObjects;r=0;for(i=u.length;r<i;r++)if(s=u[r],o=s.object,s.id=r,s.render=!1,o.visible&&(!(o instanceof THREE.Mesh||o instanceof THREE.ParticleSystem)||!o.frustumCulled||mt.intersectsObject(o))){var d=o;d._modelViewMatrix.multiplyMatrices(t.matrixWorldInverse,d.matrixWorld);d._normalMatrix.getNormalMatrix(d._modelViewMatrix);var d=s,v=d.buffer,m=void 0,g=m=void 0,g=d.object.material;if(g instanceof THREE.MeshFaceMaterial)m=v.materialIndex,m=g.materials[m],m.transparent?(d.transparent=m,d.opaque=null):(d.opaque=m,d.transparent=null);else if(m=g)m.transparent?(d.transparent=m,d.opaque=null):(d.opaque=m,d.transparent=null);s.render=!0;!0===this.sortObjects&&(null!==o.renderDepth?s.z=o.renderDepth:(bt.setFromMatrixPosition(o.matrixWorld),bt.applyProjection(gt),s.z=bt.z))}this.sortObjects&&u.sort(a);u=e.__webglObjectsImmediate;r=0;for(i=u.length;r<i;r++)s=u[r],o=s.object,o.visible&&(o._modelViewMatrix.multiplyMatrices(t.matrixWorldInverse,o.matrixWorld),o._normalMatrix.getNormalMatrix(o._modelViewMatrix),o=s.object.material,o.transparent?(s.transparent=o,s.opaque=null):(s.opaque=o,s.transparent=null));e.overrideMaterial?(r=e.overrideMaterial,this.setBlending(r.blending,r.blendEquation,r.blendSrc,r.blendDst),this.setDepthTest(r.depthTest),this.setDepthWrite(r.depthWrite),N(r.polygonOffset,r.polygonOffsetFactor,r.polygonOffsetUnits),c(e.__webglObjects,!1,\"\",t,f,p,!0,r),h(e.__webglObjectsImmediate,\"\",t,f,p,!1,r)):(r=null,this.setBlending(THREE.NoBlending),c(e.__webglObjects,!0,\"opaque\",t,f,p,!1,r),h(e.__webglObjectsImmediate,\"opaque\",t,f,p,!1,r),c(e.__webglObjects,!1,\"transparent\",t,f,p,!0,r),h(e.__webglObjectsImmediate,\"transparent\",t,f,p,!0,r));l(this.renderPluginsPost,e,t);n&&n.generateMipmaps&&n.minFilter!==THREE.NearestFilter&&n.minFilter!==THREE.LinearFilter&&(n instanceof THREE.WebGLRenderTargetCube?(xt.bindTexture(xt.TEXTURE_CUBE_MAP,n.__webglTexture),xt.generateMipmap(xt.TEXTURE_CUBE_MAP),xt.bindTexture(xt.TEXTURE_CUBE_MAP,null)):(xt.bindTexture(xt.TEXTURE_2D,n.__webglTexture),xt.generateMipmap(xt.TEXTURE_2D),xt.bindTexture(xt.TEXTURE_2D,null)));this.setDepthTest(!0);this.setDepthWrite(!0)}};this.renderImmediateObject=function(e,t,n,r,i){var s=w(e,t,n,r,i);$=-1;R.setMaterialFaces(r);i.immediateRenderCallback?i.immediateRenderCallback(s,xt,mt):i.render(function(e){R.renderBufferImmediate(e,s,r)})};this.initWebGLObjects=function(e){e.__webglObjects||(e.__webglObjects=[],e.__webglObjectsImmediate=[],e.__webglSprites=[],e.__webglFlares=[]);for(;e.__objectsAdded.length;)p(e.__objectsAdded[0],e),e.__objectsAdded.splice(0,1);for(;e.__objectsRemoved.length;)g(e.__objectsRemoved[0],e),e.__objectsRemoved.splice(0,1);for(var t=0,o=e.__webglObjects.length;t<o;t++){var u=e.__webglObjects[t].object;void 0===u.__webglInit&&(void 0!==u.__webglActive&&g(u,e),p(u,e));var a=u,l=a.geometry,c=void 0,h=void 0,d=void 0;if(l instanceof THREE.BufferGeometry){var y=xt.DYNAMIC_DRAW,b=!l.dynamic,w=l.attributes,E=void 0,S=void 0;for(E in w)S=w[E],S.needsUpdate&&(\"index\"===E?(xt.bindBuffer(xt.ELEMENT_ARRAY_BUFFER,S.buffer),xt.bufferData(xt.ELEMENT_ARRAY_BUFFER,S.array,y)):(xt.bindBuffer(xt.ARRAY_BUFFER,S.buffer),xt.bufferData(xt.ARRAY_BUFFER,S.array,y)),S.needsUpdate=!1),b&&!S.dynamic&&(S.array=null)}else if(a instanceof THREE.Mesh){for(var x=0,T=l.geometryGroupsList.length;x<T;x++)if(c=l.geometryGroupsList[x],d=r(a,c),l.buffersNeedUpdate&&n(c,a),h=d.attributes&&v(d),l.verticesNeedUpdate||l.morphTargetsNeedUpdate||l.elementsNeedUpdate||l.uvsNeedUpdate||l.normalsNeedUpdate||l.colorsNeedUpdate||l.tangentsNeedUpdate||h){var N=c,C=a,k=xt.DYNAMIC_DRAW,L=!l.dynamic,A=d;if(N.__inittedArrays){var O=i(A),M=A.vertexColors?A.vertexColors:!1,_=s(A),D=O===THREE.SmoothShading,P=void 0,H=void 0,B=void 0,j=void 0,F=void 0,I=void 0,q=void 0,R=void 0,U=void 0,z=void 0,W=void 0,X=void 0,V=void 0,$=void 0,J=void 0,K=void 0,Q=void 0,G=void 0,Y=void 0,Z=void 0,et=void 0,tt=void 0,nt=void 0,rt=void 0,it=void 0,st=void 0,ot=void 0,ut=void 0,at=void 0,ft=void 0,lt=void 0,ct=void 0,ht=void 0,pt=void 0,dt=void 0,vt=void 0,mt=void 0,wt=void 0,Et=void 0,St=void 0,Tt=0,Nt=0,Ct=0,kt=0,Lt=0,At=0,Ot=0,Mt=0,_t=0,Dt=0,Pt=0,Ht=0,Bt=void 0,jt=N.__vertexArray,Ft=N.__uvArray,It=N.__uv2Array,qt=N.__normalArray,Rt=N.__tangentArray,Ut=N.__colorArray,zt=N.__skinIndexArray,Wt=N.__skinWeightArray,Xt=N.__morphTargetsArrays,Vt=N.__morphNormalsArrays,$t=N.__webglCustomAttributesList,Jt=void 0,Kt=N.__faceArray,Qt=N.__lineArray,Gt=C.geometry,Yt=Gt.elementsNeedUpdate,Zt=Gt.uvsNeedUpdate,en=Gt.normalsNeedUpdate,tn=Gt.tangentsNeedUpdate,nn=Gt.colorsNeedUpdate,rn=Gt.morphTargetsNeedUpdate,sn=Gt.vertices,on=N.faces3,un=Gt.faces,an=Gt.faceVertexUvs[0],fn=Gt.faceVertexUvs[1],ln=Gt.skinIndices,cn=Gt.skinWeights,hn=Gt.morphTargets,pn=Gt.morphNormals;if(Gt.verticesNeedUpdate){P=0;for(H=on.length;P<H;P++)j=un[on[P]],X=sn[j.a],V=sn[j.b],$=sn[j.c],jt[Nt]=X.x,jt[Nt+1]=X.y,jt[Nt+2]=X.z,jt[Nt+3]=V.x,jt[Nt+4]=V.y,jt[Nt+5]=V.z,jt[Nt+6]=$.x,jt[Nt+7]=$.y,jt[Nt+8]=$.z,Nt+=9;xt.bindBuffer(xt.ARRAY_BUFFER,N.__webglVertexBuffer);xt.bufferData(xt.ARRAY_BUFFER,jt,k)}if(rn){dt=0;for(vt=hn.length;dt<vt;dt++){P=Pt=0;for(H=on.length;P<H;P++)Et=on[P],j=un[Et],X=hn[dt].vertices[j.a],V=hn[dt].vertices[j.b],$=hn[dt].vertices[j.c],mt=Xt[dt],mt[Pt]=X.x,mt[Pt+1]=X.y,mt[Pt+2]=X.z,mt[Pt+3]=V.x,mt[Pt+4]=V.y,mt[Pt+5]=V.z,mt[Pt+6]=$.x,mt[Pt+7]=$.y,mt[Pt+8]=$.z,A.morphNormals&&(D?(St=pn[dt].vertexNormals[Et],G=St.a,Y=St.b,Z=St.c):Z=Y=G=pn[dt].faceNormals[Et],wt=Vt[dt],wt[Pt]=G.x,wt[Pt+1]=G.y,wt[Pt+2]=G.z,wt[Pt+3]=Y.x,wt[Pt+4]=Y.y,wt[Pt+5]=Y.z,wt[Pt+6]=Z.x,wt[Pt+7]=Z.y,wt[Pt+8]=Z.z),Pt+=9;xt.bindBuffer(xt.ARRAY_BUFFER,N.__webglMorphTargetsBuffers[dt]);xt.bufferData(xt.ARRAY_BUFFER,Xt[dt],k);A.morphNormals&&(xt.bindBuffer(xt.ARRAY_BUFFER,N.__webglMorphNormalsBuffers[dt]),xt.bufferData(xt.ARRAY_BUFFER,Vt[dt],k))}}if(cn.length){P=0;for(H=on.length;P<H;P++)j=un[on[P]],rt=cn[j.a],it=cn[j.b],st=cn[j.c],Wt[Dt]=rt.x,Wt[Dt+1]=rt.y,Wt[Dt+2]=rt.z,Wt[Dt+3]=rt.w,Wt[Dt+4]=it.x,Wt[Dt+5]=it.y,Wt[Dt+6]=it.z,Wt[Dt+7]=it.w,Wt[Dt+8]=st.x,Wt[Dt+9]=st.y,Wt[Dt+10]=st.z,Wt[Dt+11]=st.w,ot=ln[j.a],ut=ln[j.b],at=ln[j.c],zt[Dt]=ot.x,zt[Dt+1]=ot.y,zt[Dt+2]=ot.z,zt[Dt+3]=ot.w,zt[Dt+4]=ut.x,zt[Dt+5]=ut.y,zt[Dt+6]=ut.z,zt[Dt+7]=ut.w,zt[Dt+8]=at.x,zt[Dt+9]=at.y,zt[Dt+10]=at.z,zt[Dt+11]=at.w,Dt+=12;0<Dt&&(xt.bindBuffer(xt.ARRAY_BUFFER,N.__webglSkinIndicesBuffer),xt.bufferData(xt.ARRAY_BUFFER,zt,k),xt.bindBuffer(xt.ARRAY_BUFFER,N.__webglSkinWeightsBuffer),xt.bufferData(xt.ARRAY_BUFFER,Wt,k))}if(nn&&M){P=0;for(H=on.length;P<H;P++)j=un[on[P]],q=j.vertexColors,R=j.color,3===q.length&&M===THREE.VertexColors?(et=q[0],tt=q[1],nt=q[2]):nt=tt=et=R,Ut[_t]=et.r,Ut[_t+1]=et.g,Ut[_t+2]=et.b,Ut[_t+3]=tt.r,Ut[_t+4]=tt.g,Ut[_t+5]=tt.b,Ut[_t+6]=nt.r,Ut[_t+7]=nt.g,Ut[_t+8]=nt.b,_t+=9;0<_t&&(xt.bindBuffer(xt.ARRAY_BUFFER,N.__webglColorBuffer),xt.bufferData(xt.ARRAY_BUFFER,Ut,k))}if(tn&&Gt.hasTangents){P=0;for(H=on.length;P<H;P++)j=un[on[P]],U=j.vertexTangents,J=U[0],K=U[1],Q=U[2],Rt[Ot]=J.x,Rt[Ot+1]=J.y,Rt[Ot+2]=J.z,Rt[Ot+3]=J.w,Rt[Ot+4]=K.x,Rt[Ot+5]=K.y,Rt[Ot+6]=K.z,Rt[Ot+7]=K.w,Rt[Ot+8]=Q.x,Rt[Ot+9]=Q.y,Rt[Ot+10]=Q.z,Rt[Ot+11]=Q.w,Ot+=12;xt.bindBuffer(xt.ARRAY_BUFFER,N.__webglTangentBuffer);xt.bufferData(xt.ARRAY_BUFFER,Rt,k)}if(en&&O){P=0;for(H=on.length;P<H;P++)if(j=un[on[P]],F=j.vertexNormals,I=j.normal,3===F.length&&D)for(ft=0;3>ft;ft++)ct=F[ft],qt[At]=ct.x,qt[At+1]=ct.y,qt[At+2]=ct.z,At+=3;else for(ft=0;3>ft;ft++)qt[At]=I.x,qt[At+1]=I.y,qt[At+2]=I.z,At+=3;xt.bindBuffer(xt.ARRAY_BUFFER,N.__webglNormalBuffer);xt.bufferData(xt.ARRAY_BUFFER,qt,k)}if(Zt&&an&&_){P=0;for(H=on.length;P<H;P++)if(B=on[P],z=an[B],void 0!==z)for(ft=0;3>ft;ft++)ht=z[ft],Ft[Ct]=ht.x,Ft[Ct+1]=ht.y,Ct+=2;0<Ct&&(xt.bindBuffer(xt.ARRAY_BUFFER,N.__webglUVBuffer),xt.bufferData(xt.ARRAY_BUFFER,Ft,k))}if(Zt&&fn&&_){P=0;for(H=on.length;P<H;P++)if(B=on[P],W=fn[B],void 0!==W)for(ft=0;3>ft;ft++)pt=W[ft],It[kt]=pt.x,It[kt+1]=pt.y,kt+=2;0<kt&&(xt.bindBuffer(xt.ARRAY_BUFFER,N.__webglUV2Buffer),xt.bufferData(xt.ARRAY_BUFFER,It,k))}if(Yt){P=0;for(H=on.length;P<H;P++)Kt[Lt]=Tt,Kt[Lt+1]=Tt+1,Kt[Lt+2]=Tt+2,Lt+=3,Qt[Mt]=Tt,Qt[Mt+1]=Tt+1,Qt[Mt+2]=Tt,Qt[Mt+3]=Tt+2,Qt[Mt+4]=Tt+1,Qt[Mt+5]=Tt+2,Mt+=6,Tt+=3;xt.bindBuffer(xt.ELEMENT_ARRAY_BUFFER,N.__webglFaceBuffer);xt.bufferData(xt.ELEMENT_ARRAY_BUFFER,Kt,k);xt.bindBuffer(xt.ELEMENT_ARRAY_BUFFER,N.__webglLineBuffer);xt.bufferData(xt.ELEMENT_ARRAY_BUFFER,Qt,k)}if($t){ft=0;for(lt=$t.length;ft<lt;ft++)if(Jt=$t[ft],Jt.__original.needsUpdate){Ht=0;if(1===Jt.size)if(void 0===Jt.boundTo||\"vertices\"===Jt.boundTo){P=0;for(H=on.length;P<H;P++)j=un[on[P]],Jt.array[Ht]=Jt.value[j.a],Jt.array[Ht+1]=Jt.value[j.b],Jt.array[Ht+2]=Jt.value[j.c],Ht+=3}else{if(\"faces\"===Jt.boundTo){P=0;for(H=on.length;P<H;P++)Bt=Jt.value[on[P]],Jt.array[Ht]=Bt,Jt.array[Ht+1]=Bt,Jt.array[Ht+2]=Bt,Ht+=3}}else if(2===Jt.size)if(void 0===Jt.boundTo||\"vertices\"===Jt.boundTo){P=0;for(H=on.length;P<H;P++)j=un[on[P]],X=Jt.value[j.a],V=Jt.value[j.b],$=Jt.value[j.c],Jt.array[Ht]=X.x,Jt.array[Ht+1]=X.y,Jt.array[Ht+2]=V.x,Jt.array[Ht+3]=V.y,Jt.array[Ht+4]=$.x,Jt.array[Ht+5]=$.y,Ht+=6}else{if(\"faces\"===Jt.boundTo){P=0;for(H=on.length;P<H;P++)$=V=X=Bt=Jt.value[on[P]],Jt.array[Ht]=X.x,Jt.array[Ht+1]=X.y,Jt.array[Ht+2]=V.x,Jt.array[Ht+3]=V.y,Jt.array[Ht+4]=$.x,Jt.array[Ht+5]=$.y,Ht+=6}}else if(3===Jt.size){var dn;dn=\"c\"===Jt.type?[\"r\",\"g\",\"b\"]:[\"x\",\"y\",\"z\"];if(void 0===Jt.boundTo||\"vertices\"===Jt.boundTo){P=0;for(H=on.length;P<H;P++)j=un[on[P]],X=Jt.value[j.a],V=Jt.value[j.b],$=Jt.value[j.c],Jt.array[Ht]=X[dn[0]],Jt.array[Ht+1]=X[dn[1]],Jt.array[Ht+2]=X[dn[2]],Jt.array[Ht+3]=V[dn[0]],Jt.array[Ht+4]=V[dn[1]],Jt.array[Ht+5]=V[dn[2]],Jt.array[Ht+6]=$[dn[0]],Jt.array[Ht+7]=$[dn[1]],Jt.array[Ht+8]=$[dn[2]],Ht+=9}else if(\"faces\"===Jt.boundTo){P=0;for(H=on.length;P<H;P++)$=V=X=Bt=Jt.value[on[P]],Jt.array[Ht]=X[dn[0]],Jt.array[Ht+1]=X[dn[1]],Jt.array[Ht+2]=X[dn[2]],Jt.array[Ht+3]=V[dn[0]],Jt.array[Ht+4]=V[dn[1]],Jt.array[Ht+5]=V[dn[2]],Jt.array[Ht+6]=$[dn[0]],Jt.array[Ht+7]=$[dn[1]],Jt.array[Ht+8]=$[dn[2]],Ht+=9}else if(\"faceVertices\"===Jt.boundTo){P=0;for(H=on.length;P<H;P++)Bt=Jt.value[on[P]],X=Bt[0],V=Bt[1],$=Bt[2],Jt.array[Ht]=X[dn[0]],Jt.array[Ht+1]=X[dn[1]],Jt.array[Ht+2]=X[dn[2]],Jt.array[Ht+3]=V[dn[0]],Jt.array[Ht+4]=V[dn[1]],Jt.array[Ht+5]=V[dn[2]],Jt.array[Ht+6]=$[dn[0]],Jt.array[Ht+7]=$[dn[1]],Jt.array[Ht+8]=$[dn[2]],Ht+=9}}else if(4===Jt.size)if(void 0===Jt.boundTo||\"vertices\"===Jt.boundTo){P=0;for(H=on.length;P<H;P++)j=un[on[P]],X=Jt.value[j.a],V=Jt.value[j.b],$=Jt.value[j.c],Jt.array[Ht]=X.x,Jt.array[Ht+1]=X.y,Jt.array[Ht+2]=X.z,Jt.array[Ht+3]=X.w,Jt.array[Ht+4]=V.x,Jt.array[Ht+5]=V.y,Jt.array[Ht+6]=V.z,Jt.array[Ht+7]=V.w,Jt.array[Ht+8]=$.x,Jt.array[Ht+9]=$.y,Jt.array[Ht+10]=$.z,Jt.array[Ht+11]=$.w,Ht+=12}else if(\"faces\"===Jt.boundTo){P=0;for(H=on.length;P<H;P++)$=V=X=Bt=Jt.value[on[P]],Jt.array[Ht]=X.x,Jt.array[Ht+1]=X.y,Jt.array[Ht+2]=X.z,Jt.array[Ht+3]=X.w,Jt.array[Ht+4]=V.x,Jt.array[Ht+5]=V.y,Jt.array[Ht+6]=V.z,Jt.array[Ht+7]=V.w,Jt.array[Ht+8]=$.x,Jt.array[Ht+9]=$.y,Jt.array[Ht+10]=$.z,Jt.array[Ht+11]=$.w,Ht+=12}else if(\"faceVertices\"===Jt.boundTo){P=0;for(H=on.length;P<H;P++)Bt=Jt.value[on[P]],X=Bt[0],V=Bt[1],$=Bt[2],Jt.array[Ht]=X.x,Jt.array[Ht+1]=X.y,Jt.array[Ht+2]=X.z,Jt.array[Ht+3]=X.w,Jt.array[Ht+4]=V.x,Jt.array[Ht+5]=V.y,Jt.array[Ht+6]=V.z,Jt.array[Ht+7]=V.w,Jt.array[Ht+8]=$.x,Jt.array[Ht+9]=$.y,Jt.array[Ht+10]=$.z,Jt.array[Ht+11]=$.w,Ht+=12}xt.bindBuffer(xt.ARRAY_BUFFER,Jt.buffer);xt.bufferData(xt.ARRAY_BUFFER,Jt.array,k)}}L&&(delete N.__inittedArrays,delete N.__colorArray,delete N.__normalArray,delete N.__tangentArray,delete N.__uvArray,delete N.__uv2Array,delete N.__faceArray,delete N.__vertexArray,delete N.__lineArray,delete N.__skinIndexArray,delete N.__skinWeightArray)}}l.verticesNeedUpdate=!1;l.morphTargetsNeedUpdate=!1;l.elementsNeedUpdate=!1;l.uvsNeedUpdate=!1;l.normalsNeedUpdate=!1;l.colorsNeedUpdate=!1;l.tangentsNeedUpdate=!1;l.buffersNeedUpdate=!1;d.attributes&&m(d)}else if(a instanceof THREE.Line){d=r(a,l);h=d.attributes&&v(d);if(l.verticesNeedUpdate||l.colorsNeedUpdate||l.lineDistancesNeedUpdate||h){var vn=l,mn=xt.DYNAMIC_DRAW,gn=void 0,yn=void 0,bn=void 0,wn=void 0,En=void 0,Sn=void 0,xn=vn.vertices,Tn=vn.colors,Nn=vn.lineDistances,Cn=xn.length,kn=Tn.length,Ln=Nn.length,An=vn.__vertexArray,On=vn.__colorArray,Mn=vn.__lineDistanceArray,_n=vn.colorsNeedUpdate,Dn=vn.lineDistancesNeedUpdate,Pn=vn.__webglCustomAttributesList,Hn=void 0,Bn=void 0,jn=void 0,Fn=void 0,In=void 0,qn=void 0;if(vn.verticesNeedUpdate){for(gn=0;gn<Cn;gn++)wn=xn[gn],En=3*gn,An[En]=wn.x,An[En+1]=wn.y,An[En+2]=wn.z;xt.bindBuffer(xt.ARRAY_BUFFER,vn.__webglVertexBuffer);xt.bufferData(xt.ARRAY_BUFFER,An,mn)}if(_n){for(yn=0;yn<kn;yn++)Sn=Tn[yn],En=3*yn,On[En]=Sn.r,On[En+1]=Sn.g,On[En+2]=Sn.b;xt.bindBuffer(xt.ARRAY_BUFFER,vn.__webglColorBuffer);xt.bufferData(xt.ARRAY_BUFFER,On,mn)}if(Dn){for(bn=0;bn<Ln;bn++)Mn[bn]=Nn[bn];xt.bindBuffer(xt.ARRAY_BUFFER,vn.__webglLineDistanceBuffer);xt.bufferData(xt.ARRAY_BUFFER,Mn,mn)}if(Pn){Hn=0;for(Bn=Pn.length;Hn<Bn;Hn++)if(qn=Pn[Hn],qn.needsUpdate&&(void 0===qn.boundTo||\"vertices\"===qn.boundTo)){En=0;Fn=qn.value.length;if(1===qn.size)for(jn=0;jn<Fn;jn++)qn.array[jn]=qn.value[jn];else if(2===qn.size)for(jn=0;jn<Fn;jn++)In=qn.value[jn],qn.array[En]=In.x,qn.array[En+1]=In.y,En+=2;else if(3===qn.size)if(\"c\"===qn.type)for(jn=0;jn<Fn;jn++)In=qn.value[jn],qn.array[En]=In.r,qn.array[En+1]=In.g,qn.array[En+2]=In.b,En+=3;else for(jn=0;jn<Fn;jn++)In=qn.value[jn],qn.array[En]=In.x,qn.array[En+1]=In.y,qn.array[En+2]=In.z,En+=3;else if(4===qn.size)for(jn=0;jn<Fn;jn++)In=qn.value[jn],qn.array[En]=In.x,qn.array[En+1]=In.y,qn.array[En+2]=In.z,qn.array[En+3]=In.w,En+=4;xt.bindBuffer(xt.ARRAY_BUFFER,qn.buffer);xt.bufferData(xt.ARRAY_BUFFER,qn.array,mn)}}}l.verticesNeedUpdate=!1;l.colorsNeedUpdate=!1;l.lineDistancesNeedUpdate=!1;d.attributes&&m(d)}else if(a instanceof THREE.ParticleSystem){d=r(a,l);h=d.attributes&&v(d);if(l.verticesNeedUpdate||l.colorsNeedUpdate||a.sortParticles||h){var Rn=l,Un=xt.DYNAMIC_DRAW,zn=a,Wn=void 0,Xn=void 0,Vn=void 0,$n=void 0,Jn=void 0,Kn=void 0,Qn=Rn.vertices,Gn=Qn.length,Yn=Rn.colors,Zn=Yn.length,er=Rn.__vertexArray,tr=Rn.__colorArray,nr=Rn.__sortArray,rr=Rn.verticesNeedUpdate,ir=Rn.colorsNeedUpdate,sr=Rn.__webglCustomAttributesList,or=void 0,ur=void 0,ar=void 0,fr=void 0,lr=void 0,cr=void 0;if(zn.sortParticles){yt.copy(gt);yt.multiply(zn.matrixWorld);for(Wn=0;Wn<Gn;Wn++)Vn=Qn[Wn],bt.copy(Vn),bt.applyProjection(yt),nr[Wn]=[bt.z,Wn];nr.sort(f);for(Wn=0;Wn<Gn;Wn++)Vn=Qn[nr[Wn][1]],$n=3*Wn,er[$n]=Vn.x,er[$n+1]=Vn.y,er[$n+2]=Vn.z;for(Xn=0;Xn<Zn;Xn++)$n=3*Xn,Kn=Yn[nr[Xn][1]],tr[$n]=Kn.r,tr[$n+1]=Kn.g,tr[$n+2]=Kn.b;if(sr){or=0;for(ur=sr.length;or<ur;or++)if(cr=sr[or],void 0===cr.boundTo||\"vertices\"===cr.boundTo)if($n=0,fr=cr.value.length,1===cr.size)for(ar=0;ar<fr;ar++)Jn=nr[ar][1],cr.array[ar]=cr.value[Jn];else if(2===cr.size)for(ar=0;ar<fr;ar++)Jn=nr[ar][1],lr=cr.value[Jn],cr.array[$n]=lr.x,cr.array[$n+1]=lr.y,$n+=2;else if(3===cr.size)if(\"c\"===cr.type)for(ar=0;ar<fr;ar++)Jn=nr[ar][1],lr=cr.value[Jn],cr.array[$n]=lr.r,cr.array[$n+1]=lr.g,cr.array[$n+2]=lr.b,$n+=3;else for(ar=0;ar<fr;ar++)Jn=nr[ar][1],lr=cr.value[Jn],cr.array[$n]=lr.x,cr.array[$n+1]=lr.y,cr.array[$n+2]=lr.z,$n+=3;else if(4===cr.size)for(ar=0;ar<fr;ar++)Jn=nr[ar][1],lr=cr.value[Jn],cr.array[$n]=lr.x,cr.array[$n+1]=lr.y,cr.array[$n+2]=lr.z,cr.array[$n+3]=lr.w,$n+=4}}else{if(rr)for(Wn=0;Wn<Gn;Wn++)Vn=Qn[Wn],$n=3*Wn,er[$n]=Vn.x,er[$n+1]=Vn.y,er[$n+2]=Vn.z;if(ir)for(Xn=0;Xn<Zn;Xn++)Kn=Yn[Xn],$n=3*Xn,tr[$n]=Kn.r,tr[$n+1]=Kn.g,tr[$n+2]=Kn.b;if(sr){or=0;for(ur=sr.length;or<ur;or++)if(cr=sr[or],cr.needsUpdate&&(void 0===cr.boundTo||\"vertices\"===cr.boundTo))if(fr=cr.value.length,$n=0,1===cr.size)for(ar=0;ar<fr;ar++)cr.array[ar]=cr.value[ar];else if(2===cr.size)for(ar=0;ar<fr;ar++)lr=cr.value[ar],cr.array[$n]=lr.x,cr.array[$n+1]=lr.y,$n+=2;else if(3===cr.size)if(\"c\"===cr.type)for(ar=0;ar<fr;ar++)lr=cr.value[ar],cr.array[$n]=lr.r,cr.array[$n+1]=lr.g,cr.array[$n+2]=lr.b,$n+=3;else for(ar=0;ar<fr;ar++)lr=cr.value[ar],cr.array[$n]=lr.x,cr.array[$n+1]=lr.y,cr.array[$n+2]=lr.z,$n+=3;else if(4===cr.size)for(ar=0;ar<fr;ar++)lr=cr.value[ar],cr.array[$n]=lr.x,cr.array[$n+1]=lr.y,cr.array[$n+2]=lr.z,cr.array[$n+3]=lr.w,$n+=4}}if(rr||zn.sortParticles)xt.bindBuffer(xt.ARRAY_BUFFER,Rn.__webglVertexBuffer),xt.bufferData(xt.ARRAY_BUFFER,er,Un);if(ir||zn.sortParticles)xt.bindBuffer(xt.ARRAY_BUFFER,Rn.__webglColorBuffer),xt.bufferData(xt.ARRAY_BUFFER,tr,Un);if(sr){or=0;for(ur=sr.length;or<ur;or++)if(cr=sr[or],cr.needsUpdate||zn.sortParticles)xt.bindBuffer(xt.ARRAY_BUFFER,cr.buffer),xt.bufferData(xt.ARRAY_BUFFER,cr.array,Un)}}l.verticesNeedUpdate=!1;l.colorsNeedUpdate=!1;d.attributes&&m(d)}}};this.initMaterial=function(e,t,n,r){var i,s,o,u;e.addEventListener(\"dispose\",Xt);var a,f,l,c,h;e instanceof THREE.MeshDepthMaterial?h=\"depth\":e instanceof THREE.MeshNormalMaterial?h=\"normal\":e instanceof THREE.MeshBasicMaterial?h=\"basic\":e instanceof THREE.MeshLambertMaterial?h=\"lambert\":e instanceof THREE.MeshPhongMaterial?h=\"phong\":e instanceof THREE.LineBasicMaterial?h=\"basic\":e instanceof THREE.LineDashedMaterial?h=\"dashed\":e instanceof THREE.ParticleSystemMaterial&&(h=\"particle_basic\");if(h){var p=THREE.ShaderLib[h];e.uniforms=THREE.UniformsUtils.clone(p.uniforms);e.vertexShader=p.vertexShader;e.fragmentShader=p.fragmentShader}var d=i=0,v=0,m=p=0;for(s=t.length;m<s;m++)o=t[m],o.onlyShadow||(o instanceof THREE.DirectionalLight&&i++,o instanceof THREE.PointLight&&d++,o instanceof THREE.SpotLight&&v++,o instanceof THREE.HemisphereLight&&p++);s=d;o=v;u=p;v=p=0;for(d=t.length;v<d;v++)m=t[v],m.castShadow&&(m instanceof THREE.SpotLight&&p++,m instanceof THREE.DirectionalLight&&!m.shadowCascade&&p++);c=p;Ht&&r&&r.useVertexTexture?l=1024:(t=xt.getParameter(xt.MAX_VERTEX_UNIFORM_VECTORS),t=Math.floor((t-20)/4),void 0!==r&&r instanceof THREE.SkinnedMesh&&(t=Math.min(r.bones.length,t),t<r.bones.length&&console.warn(\"WebGLRenderer: too many bones - \"+r.bones.length+\", this GPU supports just \"+t+\" (try OpenGL instead of ANGLE)\")),l=t);e:{var v=e.fragmentShader,d=e.vertexShader,p=e.uniforms,t=e.attributes,m=e.defines,n={map:!!e.map,envMap:!!e.envMap,lightMap:!!e.lightMap,bumpMap:!!e.bumpMap,normalMap:!!e.normalMap,specularMap:!!e.specularMap,vertexColors:e.vertexColors,fog:n,useFog:e.fog,fogExp:n instanceof THREE.FogExp2,sizeAttenuation:e.sizeAttenuation,skinning:e.skinning,maxBones:l,useVertexTexture:Ht&&r&&r.useVertexTexture,morphTargets:e.morphTargets,morphNormals:e.morphNormals,maxMorphTargets:this.maxMorphTargets,maxMorphNormals:this.maxMorphNormals,maxDirLights:i,maxPointLights:s,maxSpotLights:o,maxHemiLights:u,maxShadows:c,shadowMapEnabled:this.shadowMapEnabled&&r.receiveShadow,shadowMapType:this.shadowMapType,shadowMapDebug:this.shadowMapDebug,shadowMapCascade:this.shadowMapCascade,alphaTest:e.alphaTest,metal:e.metal,perPixel:e.perPixel,wrapAround:e.wrapAround,doubleSided:e.side===THREE.DoubleSide,flipSided:e.side===THREE.BackSide},r=e.index0AttributeName,g,y,b;i=[];h?i.push(h):(i.push(v),i.push(d));for(y in m)i.push(y),i.push(m[y]);for(g in n)i.push(g),i.push(n[g]);h=i.join();g=0;for(y=U.length;g<y;g++)if(i=U[g],i.code===h){i.usedTimes++;f=i.program;break e}g=\"SHADOWMAP_TYPE_BASIC\";n.shadowMapType===THREE.PCFShadowMap?g=\"SHADOWMAP_TYPE_PCF\":n.shadowMapType===THREE.PCFSoftShadowMap&&(g=\"SHADOWMAP_TYPE_PCF_SOFT\");y=[];for(b in m)i=m[b],!1!==i&&(i=\"#define \"+b+\" \"+i,y.push(i));i=y.join(\"\\n\");b=xt.createProgram();y=[\"precision \"+D+\" float;\",\"precision \"+D+\" int;\",i,Pt?\"#define VERTEX_TEXTURES\":\"\",R.gammaInput?\"#define GAMMA_INPUT\":\"\",R.gammaOutput?\"#define GAMMA_OUTPUT\":\"\",R.physicallyBasedShading?\"#define PHYSICALLY_BASED_SHADING\":\"\",\"#define MAX_DIR_LIGHTS \"+n.maxDirLights,\"#define MAX_POINT_LIGHTS \"+n.maxPointLights,\"#define MAX_SPOT_LIGHTS \"+n.maxSpotLights,\"#define MAX_HEMI_LIGHTS \"+n.maxHemiLights,\"#define MAX_SHADOWS \"+n.maxShadows,\"#define MAX_BONES \"+n.maxBones,n.map?\"#define USE_MAP\":\"\",n.envMap?\"#define USE_ENVMAP\":\"\",n.lightMap?\"#define USE_LIGHTMAP\":\"\",n.bumpMap?\"#define USE_BUMPMAP\":\"\",n.normalMap?\"#define USE_NORMALMAP\":\"\",n.specularMap?\"#define USE_SPECULARMAP\":\"\",n.vertexColors?\"#define USE_COLOR\":\"\",n.skinning?\"#define USE_SKINNING\":\"\",n.useVertexTexture?\"#define BONE_TEXTURE\":\"\",n.morphTargets?\"#define USE_MORPHTARGETS\":\"\",n.morphNormals?\"#define USE_MORPHNORMALS\":\"\",n.perPixel?\"#define PHONG_PER_PIXEL\":\"\",n.wrapAround?\"#define WRAP_AROUND\":\"\",n.doubleSided?\"#define DOUBLE_SIDED\":\"\",n.flipSided?\"#define FLIP_SIDED\":\"\",n.shadowMapEnabled?\"#define USE_SHADOWMAP\":\"\",n.shadowMapEnabled?\"#define \"+g:\"\",n.shadowMapDebug?\"#define SHADOWMAP_DEBUG\":\"\",n.shadowMapCascade?\"#define SHADOWMAP_CASCADE\":\"\",n.sizeAttenuation?\"#define USE_SIZEATTENUATION\":\"\",\"uniform mat4 modelMatrix;\\nuniform mat4 modelViewMatrix;\\nuniform mat4 projectionMatrix;\\nuniform mat4 viewMatrix;\\nuniform mat3 normalMatrix;\\nuniform vec3 cameraPosition;\\nattribute vec3 position;\\nattribute vec3 normal;\\nattribute vec2 uv;\\nattribute vec2 uv2;\\n#ifdef USE_COLOR\\nattribute vec3 color;\\n#endif\\n#ifdef USE_MORPHTARGETS\\nattribute vec3 morphTarget0;\\nattribute vec3 morphTarget1;\\nattribute vec3 morphTarget2;\\nattribute vec3 morphTarget3;\\n#ifdef USE_MORPHNORMALS\\nattribute vec3 morphNormal0;\\nattribute vec3 morphNormal1;\\nattribute vec3 morphNormal2;\\nattribute vec3 morphNormal3;\\n#else\\nattribute vec3 morphTarget4;\\nattribute vec3 morphTarget5;\\nattribute vec3 morphTarget6;\\nattribute vec3 morphTarget7;\\n#endif\\n#endif\\n#ifdef USE_SKINNING\\nattribute vec4 skinIndex;\\nattribute vec4 skinWeight;\\n#endif\\n\"].join(\"\\n\");g=[\"precision \"+D+\" float;\",\"precision \"+D+\" int;\",n.bumpMap||n.normalMap?\"#extension GL_OES_standard_derivatives : enable\":\"\",i,\"#define MAX_DIR_LIGHTS \"+n.maxDirLights,\"#define MAX_POINT_LIGHTS \"+n.maxPointLights,\"#define MAX_SPOT_LIGHTS \"+n.maxSpotLights,\"#define MAX_HEMI_LIGHTS \"+n.maxHemiLights,\"#define MAX_SHADOWS \"+n.maxShadows,n.alphaTest?\"#define ALPHATEST \"+n.alphaTest:\"\",R.gammaInput?\"#define GAMMA_INPUT\":\"\",R.gammaOutput?\"#define GAMMA_OUTPUT\":\"\",R.physicallyBasedShading?\"#define PHYSICALLY_BASED_SHADING\":\"\",n.useFog&&n.fog?\"#define USE_FOG\":\"\",n.useFog&&n.fogExp?\"#define FOG_EXP2\":\"\",n.map?\"#define USE_MAP\":\"\",n.envMap?\"#define USE_ENVMAP\":\"\",n.lightMap?\"#define USE_LIGHTMAP\":\"\",n.bumpMap?\"#define USE_BUMPMAP\":\"\",n.normalMap?\"#define USE_NORMALMAP\":\"\",n.specularMap?\"#define USE_SPECULARMAP\":\"\",n.vertexColors?\"#define USE_COLOR\":\"\",n.metal?\"#define METAL\":\"\",n.perPixel?\"#define PHONG_PER_PIXEL\":\"\",n.wrapAround?\"#define WRAP_AROUND\":\"\",n.doubleSided?\"#define DOUBLE_SIDED\":\"\",n.flipSided?\"#define FLIP_SIDED\":\"\",n.shadowMapEnabled?\"#define USE_SHADOWMAP\":\"\",n.shadowMapEnabled?\"#define \"+g:\"\",n.shadowMapDebug?\"#define SHADOWMAP_DEBUG\":\"\",n.shadowMapCascade?\"#define SHADOWMAP_CASCADE\":\"\",\"uniform mat4 viewMatrix;\\nuniform vec3 cameraPosition;\\n\"].join(\"\\n\");y=k(\"vertex\",y+d);g=k(\"fragment\",g+v);xt.attachShader(b,y);xt.attachShader(b,g);r&&xt.bindAttribLocation(b,0,r);xt.linkProgram(b);xt.getProgramParameter(b,xt.LINK_STATUS)||(console.error(\"Could not initialise shader\\nVALIDATE_STATUS: \"+xt.getProgramParameter(b,xt.VALIDATE_STATUS)+\", gl error [\"+xt.getError()+\"]\"),console.error(\"Program Info Log: \"+xt.getProgramInfoLog(b)));xt.deleteShader(g);xt.deleteShader(y);b.uniforms={};b.attributes={};var w;g=\"viewMatrix modelViewMatrix projectionMatrix normalMatrix modelMatrix cameraPosition morphTargetInfluences\".split(\" \");n.useVertexTexture?(g.push(\"boneTexture\"),g.push(\"boneTextureWidth\"),g.push(\"boneTextureHeight\")):g.push(\"boneGlobalMatrices\");for(w in p)g.push(w);w=g;g=0;for(y=w.length;g<y;g++)p=w[g],b.uniforms[p]=xt.getUniformLocation(b,p);g=\"position normal uv uv2 tangent color skinIndex skinWeight lineDistance\".split(\" \");for(w=0;w<n.maxMorphTargets;w++)g.push(\"morphTarget\"+w);for(w=0;w<n.maxMorphNormals;w++)g.push(\"morphNormal\"+w);for(f in t)g.push(f);f=g;w=0;for(t=f.length;w<t;w++)g=f[w],b.attributes[g]=xt.getAttribLocation(b,g);b.id=z++;U.push({program:b,code:h,usedTimes:1});R.info.memory.programs=U.length;f=b}e.program=f;w=e.program.attributes;if(e.morphTargets){e.numSupportedMorphTargets=0;t=\"morphTarget\";for(f=0;f<this.maxMorphTargets;f++)b=t+f,0<=w[b]&&e.numSupportedMorphTargets++}if(e.morphNormals){e.numSupportedMorphNormals=0;t=\"morphNormal\";for(f=0;f<this.maxMorphNormals;f++)b=t+f,0<=w[b]&&e.numSupportedMorphNormals++}e.uniformsList=[];for(a in e.uniforms)e.uniformsList.push([e.uniforms[a],a])};this.setFaceCulling=function(e,t){e===THREE.CullFaceNone?xt.disable(xt.CULL_FACE):(t===THREE.FrontFaceDirectionCW?xt.frontFace(xt.CW):xt.frontFace(xt.CCW),e===THREE.CullFaceBack?xt.cullFace(xt.BACK):e===THREE.CullFaceFront?xt.cullFace(xt.FRONT):xt.cullFace(xt.FRONT_AND_BACK),xt.enable(xt.CULL_FACE))};this.setMaterialFaces=function(e){var t=e.side===THREE.DoubleSide,e=e.side===THREE.BackSide;G!==t&&(t?xt.disable(xt.CULL_FACE):xt.enable(xt.CULL_FACE),G=t);Y!==e&&(e?xt.frontFace(xt.CW):xt.frontFace(xt.CCW),Y=e)};this.setDepthTest=function(e){rt!==e&&(e?xt.enable(xt.DEPTH_TEST):xt.disable(xt.DEPTH_TEST),rt=e)};this.setDepthWrite=function(e){it!==e&&(xt.depthMask(e),it=e)};this.setBlending=function(e,t,n,r){e!==Z&&(e===THREE.NoBlending?xt.disable(xt.BLEND):e===THREE.AdditiveBlending?(xt.enable(xt.BLEND),xt.blendEquation(xt.FUNC_ADD),xt.blendFunc(xt.SRC_ALPHA,xt.ONE)):e===THREE.SubtractiveBlending?(xt.enable(xt.BLEND),xt.blendEquation(xt.FUNC_ADD),xt.blendFunc(xt.ZERO,xt.ONE_MINUS_SRC_COLOR)):e===THREE.MultiplyBlending?(xt.enable(xt.BLEND),xt.blendEquation(xt.FUNC_ADD),xt.blendFunc(xt.ZERO,xt.SRC_COLOR)):e===THREE.CustomBlending?xt.enable(xt.BLEND):(xt.enable(xt.BLEND),xt.blendEquationSeparate(xt.FUNC_ADD,xt.FUNC_ADD),xt.blendFuncSeparate(xt.SRC_ALPHA,xt.ONE_MINUS_SRC_ALPHA,xt.ONE,xt.ONE_MINUS_SRC_ALPHA)),Z=e);if(e===THREE.CustomBlending){if(t!==et&&(xt.blendEquation(M(t)),et=t),n!==tt||r!==nt)xt.blendFunc(M(n),M(r)),tt=n,nt=r}else nt=tt=et=null};this.setTexture=function(e,t){if(e.needsUpdate){e.__webglInit||(e.__webglInit=!0,e.addEventListener(\"dispose\",zt),e.__webglTexture=xt.createTexture(),R.info.memory.textures++);xt.activeTexture(xt.TEXTURE0+t);xt.bindTexture(xt.TEXTURE_2D,e.__webglTexture);xt.pixelStorei(xt.UNPACK_FLIP_Y_WEBGL,e.flipY);xt.pixelStorei(xt.UNPACK_PREMULTIPLY_ALPHA_WEBGL,e.premultiplyAlpha);xt.pixelStorei(xt.UNPACK_ALIGNMENT,e.unpackAlignment);var n=e.image,r=0===(n.width&n.width-1)&&0===(n.height&n.height-1),i=M(e.format),s=M(e.type);L(xt.TEXTURE_2D,e,r);var o=e.mipmaps;if(e instanceof THREE.DataTexture)if(0<o.length&&r){for(var u=0,a=o.length;u<a;u++)n=o[u],xt.texImage2D(xt.TEXTURE_2D,u,i,n.width,n.height,0,i,s,n.data);e.generateMipmaps=!1}else xt.texImage2D(xt.TEXTURE_2D,0,i,n.width,n.height,0,i,s,n.data);else if(e instanceof THREE.CompressedTexture){u=0;for(a=o.length;u<a;u++)n=o[u],e.format!==THREE.RGBAFormat?xt.compressedTexImage2D(xt.TEXTURE_2D,u,i,n.width,n.height,0,n.data):xt.texImage2D(xt.TEXTURE_2D,u,i,n.width,n.height,0,i,s,n.data)}else if(0<o.length&&r){u=0;for(a=o.length;u<a;u++)n=o[u],xt.texImage2D(xt.TEXTURE_2D,u,i,i,s,n);e.generateMipmaps=!1}else xt.texImage2D(xt.TEXTURE_2D,0,i,i,s,e.image);e.generateMipmaps&&r&&xt.generateMipmap(xt.TEXTURE_2D);e.needsUpdate=!1;if(e.onUpdate)e.onUpdate()}else xt.activeTexture(xt.TEXTURE0+t),xt.bindTexture(xt.TEXTURE_2D,e.__webglTexture)};this.setRenderTarget=function(e){var t=e instanceof THREE.WebGLRenderTargetCube;if(e&&!e.__webglFramebuffer){void 0===e.depthBuffer&&(e.depthBuffer=!0);void 0===e.stencilBuffer&&(e.stencilBuffer=!0);e.addEventListener(\"dispose\",Wt);e.__webglTexture=xt.createTexture();R.info.memory.textures++;var n=0===(e.width&e.width-1)&&0===(e.height&e.height-1),r=M(e.format),i=M(e.type);if(t){e.__webglFramebuffer=[];e.__webglRenderbuffer=[];xt.bindTexture(xt.TEXTURE_CUBE_MAP,e.__webglTexture);L(xt.TEXTURE_CUBE_MAP,e,n);for(var s=0;6>s;s++){e.__webglFramebuffer[s]=xt.createFramebuffer();e.__webglRenderbuffer[s]=xt.createRenderbuffer();xt.texImage2D(xt.TEXTURE_CUBE_MAP_POSITIVE_X+s,0,r,e.width,e.height,0,r,i,null);var o=e,u=xt.TEXTURE_CUBE_MAP_POSITIVE_X+s;xt.bindFramebuffer(xt.FRAMEBUFFER,e.__webglFramebuffer[s]);xt.framebufferTexture2D(xt.FRAMEBUFFER,xt.COLOR_ATTACHMENT0,u,o.__webglTexture,0);A(e.__webglRenderbuffer[s],e)}n&&xt.generateMipmap(xt.TEXTURE_CUBE_MAP)}else e.__webglFramebuffer=xt.createFramebuffer(),e.__webglRenderbuffer=e.shareDepthFrom?e.shareDepthFrom.__webglRenderbuffer:xt.createRenderbuffer(),xt.bindTexture(xt.TEXTURE_2D,e.__webglTexture),L(xt.TEXTURE_2D,e,n),xt.texImage2D(xt.TEXTURE_2D,0,r,e.width,e.height,0,r,i,null),r=xt.TEXTURE_2D,xt.bindFramebuffer(xt.FRAMEBUFFER,e.__webglFramebuffer),xt.framebufferTexture2D(xt.FRAMEBUFFER,xt.COLOR_ATTACHMENT0,r,e.__webglTexture,0),e.shareDepthFrom?e.depthBuffer&&!e.stencilBuffer?xt.framebufferRenderbuffer(xt.FRAMEBUFFER,xt.DEPTH_ATTACHMENT,xt.RENDERBUFFER,e.__webglRenderbuffer):e.depthBuffer&&e.stencilBuffer&&xt.framebufferRenderbuffer(xt.FRAMEBUFFER,xt.DEPTH_STENCIL_ATTACHMENT,xt.RENDERBUFFER,e.__webglRenderbuffer):A(e.__webglRenderbuffer,e),n&&xt.generateMipmap(xt.TEXTURE_2D);t?xt.bindTexture(xt.TEXTURE_CUBE_MAP,null):xt.bindTexture(xt.TEXTURE_2D,null);xt.bindRenderbuffer(xt.RENDERBUFFER,null);xt.bindFramebuffer(xt.FRAMEBUFFER,null)}e?(t=t?e.__webglFramebuffer[e.activeCubeFace]:e.__webglFramebuffer,n=e.width,e=e.height,i=r=0):(t=null,n=ct,e=ht,r=ft,i=lt);t!==X&&(xt.bindFramebuffer(xt.FRAMEBUFFER,t),xt.viewport(r,i,n,e),X=t);pt=n;dt=e};this.shadowMapPlugin=new THREE.ShadowMapPlugin;this.addPrePlugin(this.shadowMapPlugin);this.addPostPlugin(new THREE.SpritePlugin);this.addPostPlugin(new THREE.LensFlarePlugin)};THREE.WebGLRenderTarget=function(e,t,n){this.width=e;this.height=t;n=n||{};this.wrapS=void 0!==n.wrapS?n.wrapS:THREE.ClampToEdgeWrapping;this.wrapT=void 0!==n.wrapT?n.wrapT:THREE.ClampToEdgeWrapping;this.magFilter=void 0!==n.magFilter?n.magFilter:THREE.LinearFilter;this.minFilter=void 0!==n.minFilter?n.minFilter:THREE.LinearMipMapLinearFilter;this.anisotropy=void 0!==n.anisotropy?n.anisotropy:1;this.offset=new THREE.Vector2(0,0);this.repeat=new THREE.Vector2(1,1);this.format=void 0!==n.format?n.format:THREE.RGBAFormat;this.type=void 0!==n.type?n.type:THREE.UnsignedByteType;this.depthBuffer=void 0!==n.depthBuffer?n.depthBuffer:!0;this.stencilBuffer=void 0!==n.stencilBuffer?n.stencilBuffer:!0;this.generateMipmaps=!0;this.shareDepthFrom=null};THREE.WebGLRenderTarget.prototype={constructor:THREE.WebGLRenderTarget,clone:function(){var e=new THREE.WebGLRenderTarget(this.width,this.height);e.wrapS=this.wrapS;e.wrapT=this.wrapT;e.magFilter=this.magFilter;e.minFilter=this.minFilter;e.anisotropy=this.anisotropy;e.offset.copy(this.offset);e.repeat.copy(this.repeat);e.format=this.format;e.type=this.type;e.depthBuffer=this.depthBuffer;e.stencilBuffer=this.stencilBuffer;e.generateMipmaps=this.generateMipmaps;e.shareDepthFrom=this.shareDepthFrom;return e},dispose:function(){this.dispatchEvent({type:\"dispose\"})}};THREE.EventDispatcher.prototype.apply(THREE.WebGLRenderTarget.prototype);THREE.WebGLRenderTargetCube=function(e,t,n){THREE.WebGLRenderTarget.call(this,e,t,n);this.activeCubeFace=0};THREE.WebGLRenderTargetCube.prototype=Object.create(THREE.WebGLRenderTarget.prototype);THREE.RenderableVertex=function(){this.positionWorld=new THREE.Vector3;this.positionScreen=new THREE.Vector4;this.visible=!0};THREE.RenderableVertex.prototype.copy=function(e){this.positionWorld.copy(e.positionWorld);this.positionScreen.copy(e.positionScreen)};THREE.RenderableFace3=function(){this.id=0;this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.v3=new THREE.RenderableVertex;this.centroidModel=new THREE.Vector3;this.normalModel=new THREE.Vector3;this.normalModelView=new THREE.Vector3;this.vertexNormalsLength=0;this.vertexNormalsModel=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.vertexNormalsModelView=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.material=this.color=null;this.uvs=[[]];this.z=0};THREE.RenderableObject=function(){this.id=0;this.object=null;this.z=0};THREE.RenderableSprite=function(){this.id=0;this.object=null;this.rotation=this.z=this.y=this.x=0;this.scale=new THREE.Vector2;this.material=null};THREE.RenderableLine=function(){this.id=0;this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.vertexColors=[new THREE.Color,new THREE.Color];this.material=null;this.z=0};THREE.GeometryUtils={merge:function(e,t,n){var r,i,s=e.vertices.length,o=t instanceof THREE.Mesh?t.geometry:t,u=e.vertices,a=o.vertices,f=e.faces,l=o.faces,e=e.faceVertexUvs[0],o=o.faceVertexUvs[0];void 0===n&&(n=0);t instanceof THREE.Mesh&&(t.matrixAutoUpdate&&t.updateMatrix(),r=t.matrix,i=(new THREE.Matrix3).getNormalMatrix(r));for(var t=0,c=a.length;t<c;t++){var h=a[t].clone();r&&h.applyMatrix4(r);u.push(h)}t=0;for(c=l.length;t<c;t++){var h=l[t],p,d,v=h.vertexNormals,m=h.vertexColors;p=new THREE.Face3(h.a+s,h.b+s,h.c+s);p.normal.copy(h.normal);i&&p.normal.applyMatrix3(i).normalize();u=0;for(a=v.length;u<a;u++)d=v[u].clone(),i&&d.applyMatrix3(i).normalize(),p.vertexNormals.push(d);p.color.copy(h.color);u=0;for(a=m.length;u<a;u++)d=m[u],p.vertexColors.push(d.clone());p.materialIndex=h.materialIndex+n;p.centroid.copy(h.centroid);r&&p.centroid.applyMatrix4(r);f.push(p)}t=0;for(c=o.length;t<c;t++){n=o[t];r=[];u=0;for(a=n.length;u<a;u++)r.push(new THREE.Vector2(n[u].x,n[u].y));e.push(r)}},randomPointInTriangle:function(){var e=new THREE.Vector3;return function(t,n,r){var i=new THREE.Vector3,s=THREE.Math.random16(),o=THREE.Math.random16();1<s+o&&(s=1-s,o=1-o);var u=1-s-o;i.copy(t);i.multiplyScalar(s);e.copy(n);e.multiplyScalar(o);i.add(e);e.copy(r);e.multiplyScalar(u);i.add(e);return i}}(),randomPointInFace:function(e,t){return THREE.GeometryUtils.randomPointInTriangle(t.vertices[e.a],t.vertices[e.b],t.vertices[e.c])},randomPointsInGeometry:function(e,t){function n(e){function t(n,r){if(r<n)return n;var i=n+Math.floor((r-n)/2);return f[i]>e?t(n,i-1):f[i]<e?t(i+1,r):i}return t(0,f.length-1)}var r,i,s=e.faces,o=e.vertices,u=s.length,a=0,f=[],l,c,h;for(i=0;i<u;i++)r=s[i],l=o[r.a],c=o[r.b],h=o[r.c],r._area=THREE.GeometryUtils.triangleArea(l,c,h),a+=r._area,f[i]=a;r=[];for(i=0;i<t;i++)o=THREE.Math.random16()*a,o=n(o),r[i]=THREE.GeometryUtils.randomPointInFace(s[o],e,!0);return r},triangleArea:function(){var e=new THREE.Vector3,t=new THREE.Vector3;return function(n,r,i){e.subVectors(r,n);t.subVectors(i,n);e.cross(t);return.5*e.length()}}(),center:function(e){e.computeBoundingBox();var t=e.boundingBox,n=new THREE.Vector3;n.addVectors(t.min,t.max);n.multiplyScalar(-.5);e.applyMatrix((new THREE.Matrix4).makeTranslation(n.x,n.y,n.z));e.computeBoundingBox();return n},triangulateQuads:function(e){var t,n,r,i,s=[],o=[];t=0;for(n=e.faceVertexUvs.length;t<n;t++)o[t]=[];t=0;for(n=e.faces.length;t<n;t++){s.push(e.faces[t]);r=0;for(i=e.faceVertexUvs.length;r<i;r++)o[r].push(e.faceVertexUvs[r][t])}e.faces=s;e.faceVertexUvs=o;e.computeCentroids();e.computeFaceNormals();e.computeVertexNormals();e.hasTangents&&e.computeTangents()}};THREE.ImageUtils={crossOrigin:\"anonymous\",loadTexture:function(e,t,n){var r=new THREE.ImageLoader;r.crossOrigin=this.crossOrigin;var i=new THREE.Texture(void 0,t),t=r.load(e,function(){i.needsUpdate=!0;n&&n(i)});i.image=t;i.sourceFile=e;return i},loadCompressedTexture:function(e,t,n,r){var i=new THREE.CompressedTexture;i.mapping=t;var s=new XMLHttpRequest;s.onload=function(){var e=THREE.ImageUtils.parseDDS(s.response,!0);i.format=e.format;i.mipmaps=e.mipmaps;i.image.width=e.width;i.image.height=e.height;i.generateMipmaps=!1;i.needsUpdate=!0;n&&n(i)};s.onerror=r;s.open(\"GET\",e,!0);s.responseType=\"arraybuffer\";s.send(null);return i},loadTextureCube:function(e,t,n,r){var i=[];i.loadCount=0;var s=new THREE.Texture;s.image=i;void 0!==t&&(s.mapping=t);s.flipY=!1;for(var t=0,o=e.length;t<o;++t){var u=new Image;i[t]=u;u.onload=function(){i.loadCount+=1;6===i.loadCount&&(s.needsUpdate=!0,n&&n(s))};u.onerror=r;u.crossOrigin=this.crossOrigin;u.src=e[t]}return s},loadCompressedTextureCube:function(e,t,n,r){var i=[];i.loadCount=0;var s=new THREE.CompressedTexture;s.image=i;void 0!==t&&(s.mapping=t);s.flipY=!1;s.generateMipmaps=!1;t=function(e,t){return function(){var r=THREE.ImageUtils.parseDDS(e.response,!0);t.format=r.format;t.mipmaps=r.mipmaps;t.width=r.width;t.height=r.height;i.loadCount+=1;6===i.loadCount&&(s.format=r.format,s.needsUpdate=!0,n&&n(s))}};if(e instanceof Array)for(var o=0,u=e.length;o<u;++o){var a={};i[o]=a;var f=new XMLHttpRequest;f.onload=t(f,a);f.onerror=r;a=e[o];f.open(\"GET\",a,!0);f.responseType=\"arraybuffer\";f.send(null)}else f=new XMLHttpRequest,f.onload=function(){var e=THREE.ImageUtils.parseDDS(f.response,!0);if(e.isCubemap){for(var t=e.mipmaps.length/e.mipmapCount,r=0;r<t;r++){i[r]={mipmaps:[]};for(var o=0;o<e.mipmapCount;o++)i[r].mipmaps.push(e.mipmaps[r*e.mipmapCount+o]),i[r].format=e.format,i[r].width=e.width,i[r].height=e.height}s.format=e.format;s.needsUpdate=!0;n&&n(s)}},f.onerror=r,f.open(\"GET\",e,!0),f.responseType=\"arraybuffer\",f.send(null);return s},loadDDSTexture:function(e,t,n,r){var i=[];i.loadCount=0;var s=new THREE.CompressedTexture;s.image=i;void 0!==t&&(s.mapping=t);s.flipY=!1;s.generateMipmaps=!1;var o=new XMLHttpRequest;o.onload=function(){var e=THREE.ImageUtils.parseDDS(o.response,!0);if(e.isCubemap)for(var t=e.mipmaps.length/e.mipmapCount,r=0;r<t;r++){i[r]={mipmaps:[]};for(var u=0;u<e.mipmapCount;u++)i[r].mipmaps.push(e.mipmaps[r*e.mipmapCount+u]),i[r].format=e.format,i[r].width=e.width,i[r].height=e.height}else s.image.width=e.width,s.image.height=e.height,s.mipmaps=e.mipmaps;s.format=e.format;s.needsUpdate=!0;n&&n(s)};o.onerror=r;o.open(\"GET\",e,!0);o.responseType=\"arraybuffer\";o.send(null);return s},parseDDS:function(e,t){function n(e){return e.charCodeAt(0)+(e.charCodeAt(1)<<8)+(e.charCodeAt(2)<<16)+(e.charCodeAt(3)<<24)}var r={mipmaps:[],width:0,height:0,format:null,mipmapCount:1},i=n(\"DXT1\"),s=n(\"DXT3\"),o=n(\"DXT5\"),u=new Int32Array(e,0,31);if(542327876!==u[0])return console.error(\"ImageUtils.parseDDS(): Invalid magic number in DDS header\"),r;if(!u[20]&4)return console.error(\"ImageUtils.parseDDS(): Unsupported format, must contain a FourCC code\"),r;var a=u[21],f=!1;switch(a){case i:i=8;r.format=THREE.RGB_S3TC_DXT1_Format;break;case s:i=16;r.format=THREE.RGBA_S3TC_DXT3_Format;break;case o:i=16;r.format=THREE.RGBA_S3TC_DXT5_Format;break;default:if(32==u[22]&&u[23]&16711680&&u[24]&65280&&u[25]&255&&u[26]&4278190080)f=!0,i=64,r.format=THREE.RGBAFormat;else return console.error(\"ImageUtils.parseDDS(): Unsupported FourCC code: \",String.fromCharCode(a&255,a>>8&255,a>>16&255,a>>24&255)),r}r.mipmapCount=1;u[2]&131072&&!1!==t&&(r.mipmapCount=Math.max(1,u[7]));r.isCubemap=u[28]&512?!0:!1;r.width=u[4];r.height=u[3];for(var u=u[1]+4,s=r.width,o=r.height,a=r.isCubemap?6:1,l=0;l<a;l++){for(var c=0;c<r.mipmapCount;c++){if(f){var h;h=s;for(var p=o,d=4*h*p,v=new Uint8Array(e,u,d),d=new Uint8Array(d),m=0,g=0,y=0;y<p;y++)for(var b=0;b<h;b++){var w=v[g];g++;var E=v[g];g++;var S=v[g];g++;var x=v[g];g++;d[m]=S;m++;d[m]=E;m++;d[m]=w;m++;d[m]=x;m++}h=d;p=h.length}else p=Math.max(4,s)/4*Math.max(4,o)/4*i,h=new Uint8Array(e,u,p);r.mipmaps.push({data:h,width:s,height:o});u+=p;s=Math.max(.5*s,1);o=Math.max(.5*o,1)}s=r.width;o=r.height}return r},getNormalMap:function(e,t){var n=function(e){var t=Math.sqrt(e[0]*e[0]+e[1]*e[1]+e[2]*e[2]);return[e[0]/t,e[1]/t,e[2]/t]},t=t|1,r=e.width,i=e.height,s=document.createElement(\"canvas\");s.width=r;s.height=i;var o=s.getContext(\"2d\");o.drawImage(e,0,0);for(var u=o.getImageData(0,0,r,i).data,a=o.createImageData(r,i),f=a.data,l=0;l<r;l++)for(var c=0;c<i;c++){var h=0>c-1?0:c-1,p=c+1>i-1?i-1:c+1,d=0>l-1?0:l-1,v=l+1>r-1?r-1:l+1,m=[],g=[0,0,u[4*(c*r+l)]/255*t];m.push([-1,0,u[4*(c*r+d)]/255*t]);m.push([-1,-1,u[4*(h*r+d)]/255*t]);m.push([0,-1,u[4*(h*r+l)]/255*t]);m.push([1,-1,u[4*(h*r+v)]/255*t]);m.push([1,0,u[4*(c*r+v)]/255*t]);m.push([1,1,u[4*(p*r+v)]/255*t]);m.push([0,1,u[4*(p*r+l)]/255*t]);m.push([-1,1,u[4*(p*r+d)]/255*t]);h=[];d=m.length;for(p=0;p<d;p++){var v=m[p],y=m[(p+1)%d],v=[v[0]-g[0],v[1]-g[1],v[2]-g[2]],y=[y[0]-g[0],y[1]-g[1],y[2]-g[2]];h.push(n([v[1]*y[2]-v[2]*y[1],v[2]*y[0]-v[0]*y[2],v[0]*y[1]-v[1]*y[0]]))}m=[0,0,0];for(p=0;p<h.length;p++)m[0]+=h[p][0],m[1]+=h[p][1],m[2]+=h[p][2];m[0]/=h.length;m[1]/=h.length;m[2]/=h.length;g=4*(c*r+l);f[g]=255*((m[0]+1)/2)|0;f[g+1]=255*((m[1]+1)/2)|0;f[g+2]=255*m[2]|0;f[g+3]=255}o.putImageData(a,0,0);return s},generateDataTexture:function(e,t,n){for(var r=e*t,i=new Uint8Array(3*r),s=Math.floor(255*n.r),o=Math.floor(255*n.g),n=Math.floor(255*n.b),u=0;u<r;u++)i[3*u]=s,i[3*u+1]=o,i[3*u+2]=n;e=new THREE.DataTexture(i,e,t,THREE.RGBFormat);e.needsUpdate=!0;return e}};THREE.SceneUtils={createMultiMaterialObject:function(e,t){for(var n=new THREE.Object3D,r=0,i=t.length;r<i;r++)n.add(new THREE.Mesh(e,t[r]));return n},detach:function(e,t,n){e.applyMatrix(t.matrixWorld);t.remove(e);n.add(e)},attach:function(e,t,n){var r=new THREE.Matrix4;r.getInverse(n.matrixWorld);e.applyMatrix(r);t.remove(e);n.add(e)}};THREE.FontUtils={faces:{},face:\"helvetiker\",weight:\"normal\",style:\"normal\",size:150,divisions:10,getFace:function(){return this.faces[this.face][this.weight][this.style]},loadFace:function(e){var t=e.familyName.toLowerCase();this.faces[t]=this.faces[t]||{};this.faces[t][e.cssFontWeight]=this.faces[t][e.cssFontWeight]||{};this.faces[t][e.cssFontWeight][e.cssFontStyle]=e;return this.faces[t][e.cssFontWeight][e.cssFontStyle]=e},drawText:function(e){for(var t=this.getFace(),n=this.size/t.resolution,r=0,i=String(e).split(\"\"),s=i.length,o=[],e=0;e<s;e++){var u=new THREE.Path,u=this.extractGlyphPoints(i[e],t,n,r,u),r=r+u.offset;o.push(u.path)}return{paths:o,offset:r/2}},extractGlyphPoints:function(e,t,n,r,i){var s=[],o,u,a,f,l,c,h,p,d,v,m,g=t.glyphs[e]||t.glyphs[\"?\"];if(g){if(g.o){t=g._cachedOutline||(g._cachedOutline=g.o.split(\" \"));f=t.length;for(e=0;e<f;)switch(a=t[e++],a){case\"m\":a=t[e++]*n+r;l=t[e++]*n;i.moveTo(a,l);break;case\"l\":a=t[e++]*n+r;l=t[e++]*n;i.lineTo(a,l);break;case\"q\":a=t[e++]*n+r;l=t[e++]*n;p=t[e++]*n+r;d=t[e++]*n;i.quadraticCurveTo(p,d,a,l);if(o=s[s.length-1]){c=o.x;h=o.y;o=1;for(u=this.divisions;o<=u;o++){var y=o/u;THREE.Shape.Utils.b2(y,c,p,a);THREE.Shape.Utils.b2(y,h,d,l)}}break;case\"b\":if(a=t[e++]*n+r,l=t[e++]*n,p=t[e++]*n+r,d=t[e++]*-n,v=t[e++]*n+r,m=t[e++]*-n,i.bezierCurveTo(a,l,p,d,v,m),o=s[s.length-1]){c=o.x;h=o.y;o=1;for(u=this.divisions;o<=u;o++)y=o/u,THREE.Shape.Utils.b3(y,c,p,v,a),THREE.Shape.Utils.b3(y,h,d,m,l)}}}return{offset:g.ha*n,path:i}}}};THREE.FontUtils.generateShapes=function(e,t){var t=t||{},n=void 0!==t.curveSegments?t.curveSegments:4,r=void 0!==t.font?t.font:\"helvetiker\",i=void 0!==t.weight?t.weight:\"normal\",s=void 0!==t.style?t.style:\"normal\";THREE.FontUtils.size=void 0!==t.size?t.size:100;THREE.FontUtils.divisions=n;THREE.FontUtils.face=r;THREE.FontUtils.weight=i;THREE.FontUtils.style=s;n=THREE.FontUtils.drawText(e).paths;r=[];i=0;for(s=n.length;i<s;i++)Array.prototype.push.apply(r,n[i].toShapes());return r};(function(e){var t=function(e){for(var t=e.length,n=0,r=t-1,i=0;i<t;r=i++)n+=e[r].x*e[i].y-e[i].x*e[r].y;return.5*n};e.Triangulate=function(e,n){var r=e.length;if(3>r)return null;var i=[],s=[],o=[],u,a,f;if(0<t(e))for(a=0;a<r;a++)s[a]=a;else for(a=0;a<r;a++)s[a]=r-1-a;var l=2*r;for(a=r-1;2<r;){if(0>=l--){console.log(\"Warning, unable to triangulate polygon!\");break}u=a;r<=u&&(u=0);a=u+1;r<=a&&(a=0);f=a+1;r<=f&&(f=0);var c;e:{var h=c=void 0,p=void 0,d=void 0,v=void 0,m=void 0,g=void 0,y=void 0,w=void 0,h=e[s[u]].x,p=e[s[u]].y,d=e[s[a]].x,v=e[s[a]].y,m=e[s[f]].x,g=e[s[f]].y;if(1e-10>(d-h)*(g-p)-(v-p)*(m-h))c=!1;else{var E=void 0,S=void 0,x=void 0,T=void 0,N=void 0,C=void 0,k=void 0,L=void 0,A=void 0,O=void 0,A=L=k=w=y=void 0,E=m-d,S=g-v,x=h-m,T=p-g,N=d-h,C=v-p;for(c=0;c<r;c++)if(!(c===u||c===a||c===f))if(y=e[s[c]].x,w=e[s[c]].y,k=y-h,L=w-p,A=y-d,O=w-v,y-=m,w-=g,A=E*O-S*A,k=N*L-C*k,L=x*w-T*y,-1e-10<=A&&-1e-10<=L&&-1e-10<=k){c=!1;break e}c=!0}}if(c){i.push([e[s[u]],e[s[a]],e[s[f]]]);o.push([s[u],s[a],s[f]]);u=a;for(f=a+1;f<r;u++,f++)s[u]=s[f];r--;l=2*r}}return n?o:i};e.Triangulate.area=t;return e})(THREE.FontUtils);self._typeface_js={faces:THREE.FontUtils.faces,loadFace:THREE.FontUtils.loadFace};THREE.typeface_js=self._typeface_js;THREE.Curve=function(){};THREE.Curve.prototype.getPoint=function(){console.log(\"Warning, getPoint() not implemented!\");return null};THREE.Curve.prototype.getPointAt=function(e){e=this.getUtoTmapping(e);return this.getPoint(e)};THREE.Curve.prototype.getPoints=function(e){e||(e=5);var t,n=[];for(t=0;t<=e;t++)n.push(this.getPoint(t/e));return n};THREE.Curve.prototype.getSpacedPoints=function(e){e||(e=5);var t,n=[];for(t=0;t<=e;t++)n.push(this.getPointAt(t/e));return n};THREE.Curve.prototype.getLength=function(){var e=this.getLengths();return e[e.length-1]};THREE.Curve.prototype.getLengths=function(e){e||(e=this.__arcLengthDivisions?this.__arcLengthDivisions:200);if(this.cacheArcLengths&&this.cacheArcLengths.length==e+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;var t=[],n,r=this.getPoint(0),i,s=0;t.push(0);for(i=1;i<=e;i++)n=this.getPoint(i/e),s+=n.distanceTo(r),t.push(s),r=n;return this.cacheArcLengths=t};THREE.Curve.prototype.updateArcLengths=function(){this.needsUpdate=!0;this.getLengths()};THREE.Curve.prototype.getUtoTmapping=function(e,t){var n=this.getLengths(),r=0,i=n.length,s;s=t?t:e*n[i-1];for(var o=0,u=i-1,a;o<=u;)if(r=Math.floor(o+(u-o)/2),a=n[r]-s,0>a)o=r+1;else if(0<a)u=r-1;else{u=r;break}r=u;if(n[r]==s)return r/(i-1);o=n[r];return n=(r+(s-o)/(n[r+1]-o))/(i-1)};THREE.Curve.prototype.getTangent=function(e){var t=e-1e-4,e=e+1e-4;0>t&&(t=0);1<e&&(e=1);t=this.getPoint(t);return this.getPoint(e).clone().sub(t).normalize()};THREE.Curve.prototype.getTangentAt=function(e){e=this.getUtoTmapping(e);return this.getTangent(e)};THREE.Curve.Utils={tangentQuadraticBezier:function(e,t,n,r){return 2*(1-e)*(n-t)+2*e*(r-n)},tangentCubicBezier:function(e,t,n,r,i){return-3*t*(1-e)*(1-e)+3*n*(1-e)*(1-e)-6*e*n*(1-e)+6*e*r*(1-e)-3*e*e*r+3*e*e*i},tangentSpline:function(e){return 6*e*e-6*e+(3*e*e-4*e+1)+(-6*e*e+6*e)+(3*e*e-2*e)},interpolate:function(e,t,n,r,i){var e=.5*(n-e),r=.5*(r-t),s=i*i;return(2*t-2*n+e+r)*i*s+(-3*t+3*n-2*e-r)*s+e*i+t}};THREE.Curve.create=function(e,t){e.prototype=Object.create(THREE.Curve.prototype);e.prototype.getPoint=t;return e};THREE.CurvePath=function(){this.curves=[];this.bends=[];this.autoClose=!1};THREE.CurvePath.prototype=Object.create(THREE.Curve.prototype);THREE.CurvePath.prototype.add=function(e){this.curves.push(e)};THREE.CurvePath.prototype.checkConnection=function(){};THREE.CurvePath.prototype.closePath=function(){var e=this.curves[0].getPoint(0),t=this.curves[this.curves.length-1].getPoint(1);e.equals(t)||this.curves.push(new THREE.LineCurve(t,e))};THREE.CurvePath.prototype.getPoint=function(e){for(var t=e*this.getLength(),n=this.getCurveLengths(),e=0;e<n.length;){if(n[e]>=t)return t=n[e]-t,e=this.curves[e],t=1-t/e.getLength(),e.getPointAt(t);e++}return null};THREE.CurvePath.prototype.getLength=function(){var e=this.getCurveLengths();return e[e.length-1]};THREE.CurvePath.prototype.getCurveLengths=function(){if(this.cacheLengths&&this.cacheLengths.length==this.curves.length)return this.cacheLengths;var e=[],t=0,n,r=this.curves.length;for(n=0;n<r;n++)t+=this.curves[n].getLength(),e.push(t);return this.cacheLengths=e};THREE.CurvePath.prototype.getBoundingBox=function(){var e=this.getPoints(),t,n,r,i,s,o;t=n=Number.NEGATIVE_INFINITY;i=s=Number.POSITIVE_INFINITY;var u,a,f,l,c=e[0]instanceof THREE.Vector3;l=c?new THREE.Vector3:new THREE.Vector2;a=0;for(f=e.length;a<f;a++)u=e[a],u.x>t?t=u.x:u.x<i&&(i=u.x),u.y>n?n=u.y:u.y<s&&(s=u.y),c&&(u.z>r?r=u.z:u.z<o&&(o=u.z)),l.add(u);e={minX:i,minY:s,maxX:t,maxY:n,centroid:l.divideScalar(f)};c&&(e.maxZ=r,e.minZ=o);return e};THREE.CurvePath.prototype.createPointsGeometry=function(e){e=this.getPoints(e,!0);return this.createGeometry(e)};THREE.CurvePath.prototype.createSpacedPointsGeometry=function(e){e=this.getSpacedPoints(e,!0);return this.createGeometry(e)};THREE.CurvePath.prototype.createGeometry=function(e){for(var t=new THREE.Geometry,n=0;n<e.length;n++)t.vertices.push(new THREE.Vector3(e[n].x,e[n].y,e[n].z||0));return t};THREE.CurvePath.prototype.addWrapPath=function(e){this.bends.push(e)};THREE.CurvePath.prototype.getTransformedPoints=function(e,t){var n=this.getPoints(e),r,i;t||(t=this.bends);r=0;for(i=t.length;r<i;r++)n=this.getWrapPoints(n,t[r]);return n};THREE.CurvePath.prototype.getTransformedSpacedPoints=function(e,t){var n=this.getSpacedPoints(e),r,i;t||(t=this.bends);r=0;for(i=t.length;r<i;r++)n=this.getWrapPoints(n,t[r]);return n};THREE.CurvePath.prototype.getWrapPoints=function(e,t){var n=this.getBoundingBox(),r,i,s,o,u,a;r=0;for(i=e.length;r<i;r++)s=e[r],o=s.x,u=s.y,a=o/n.maxX,a=t.getUtoTmapping(a,o),o=t.getPoint(a),a=t.getTangent(a),a.set(-a.y,a.x).multiplyScalar(u),s.x=o.x+a.x,s.y=o.y+a.y;return e};THREE.Gyroscope=function(){THREE.Object3D.call(this)};THREE.Gyroscope.prototype=Object.create(THREE.Object3D.prototype);THREE.Gyroscope.prototype.updateMatrixWorld=function(e){this.matrixAutoUpdate&&this.updateMatrix();if(this.matrixWorldNeedsUpdate||e)this.parent?(this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix),this.matrixWorld.decompose(this.translationWorld,this.quaternionWorld,this.scaleWorld),this.matrix.decompose(this.translationObject,this.quaternionObject,this.scaleObject),this.matrixWorld.compose(this.translationWorld,this.quaternionObject,this.scaleWorld)):this.matrixWorld.copy(this.matrix),this.matrixWorldNeedsUpdate=!1,e=!0;for(var t=0,n=this.children.length;t<n;t++)this.children[t].updateMatrixWorld(e)};THREE.Gyroscope.prototype.translationWorld=new THREE.Vector3;THREE.Gyroscope.prototype.translationObject=new THREE.Vector3;THREE.Gyroscope.prototype.quaternionWorld=new THREE.Quaternion;THREE.Gyroscope.prototype.quaternionObject=new THREE.Quaternion;THREE.Gyroscope.prototype.scaleWorld=new THREE.Vector3;THREE.Gyroscope.prototype.scaleObject=new THREE.Vector3;THREE.Path=function(e){THREE.CurvePath.call(this);this.actions=[];e&&this.fromPoints(e)};THREE.Path.prototype=Object.create(THREE.CurvePath.prototype);THREE.PathActions={MOVE_TO:\"moveTo\",LINE_TO:\"lineTo\",QUADRATIC_CURVE_TO:\"quadraticCurveTo\",BEZIER_CURVE_TO:\"bezierCurveTo\",CSPLINE_THRU:\"splineThru\",ARC:\"arc\",ELLIPSE:\"ellipse\"};THREE.Path.prototype.fromPoints=function(e){this.moveTo(e[0].x,e[0].y);for(var t=1,n=e.length;t<n;t++)this.lineTo(e[t].x,e[t].y)};THREE.Path.prototype.moveTo=function(e,t){var n=Array.prototype.slice.call(arguments);this.actions.push({action:THREE.PathActions.MOVE_TO,args:n})};THREE.Path.prototype.lineTo=function(e,t){var n=Array.prototype.slice.call(arguments),r=this.actions[this.actions.length-1].args,r=new THREE.LineCurve(new THREE.Vector2(r[r.length-2],r[r.length-1]),new THREE.Vector2(e,t));this.curves.push(r);this.actions.push({action:THREE.PathActions.LINE_TO,args:n})};THREE.Path.prototype.quadraticCurveTo=function(e,t,n,r){var i=Array.prototype.slice.call(arguments),s=this.actions[this.actions.length-1].args,s=new THREE.QuadraticBezierCurve(new THREE.Vector2(s[s.length-2],s[s.length-1]),new THREE.Vector2(e,t),new THREE.Vector2(n,r));this.curves.push(s);this.actions.push({action:THREE.PathActions.QUADRATIC_CURVE_TO,args:i})};THREE.Path.prototype.bezierCurveTo=function(e,t,n,r,i,s){var o=Array.prototype.slice.call(arguments),u=this.actions[this.actions.length-1].args,u=new THREE.CubicBezierCurve(new THREE.Vector2(u[u.length-2],u[u.length-1]),new THREE.Vector2(e,t),new THREE.Vector2(n,r),new THREE.Vector2(i,s));this.curves.push(u);this.actions.push({action:THREE.PathActions.BEZIER_CURVE_TO,args:o})};THREE.Path.prototype.splineThru=function(e){var t=Array.prototype.slice.call(arguments),n=this.actions[this.actions.length-1].args,n=[new THREE.Vector2(n[n.length-2],n[n.length-1])];Array.prototype.push.apply(n,e);n=new THREE.SplineCurve(n);this.curves.push(n);this.actions.push({action:THREE.PathActions.CSPLINE_THRU,args:t})};THREE.Path.prototype.arc=function(e,t,n,r,i,s){var o=this.actions[this.actions.length-1].args;this.absarc(e+o[o.length-2],t+o[o.length-1],n,r,i,s)};THREE.Path.prototype.absarc=function(e,t,n,r,i,s){this.absellipse(e,t,n,n,r,i,s)};THREE.Path.prototype.ellipse=function(e,t,n,r,i,s,o){var u=this.actions[this.actions.length-1].args;this.absellipse(e+u[u.length-2],t+u[u.length-1],n,r,i,s,o)};THREE.Path.prototype.absellipse=function(e,t,n,r,i,s,o){var u=Array.prototype.slice.call(arguments),a=new THREE.EllipseCurve(e,t,n,r,i,s,o);this.curves.push(a);a=a.getPoint(1);u.push(a.x);u.push(a.y);this.actions.push({action:THREE.PathActions.ELLIPSE,args:u})};THREE.Path.prototype.getSpacedPoints=function(e){e||(e=40);for(var t=[],n=0;n<e;n++)t.push(this.getPoint(n/e));return t};THREE.Path.prototype.getPoints=function(e,t){if(this.useSpacedPoints)return console.log(\"tata\"),this.getSpacedPoints(e,t);var e=e||12,n=[],r,i,s,o,u,a,f,l,c,h,p,d,v;r=0;for(i=this.actions.length;r<i;r++)switch(s=this.actions[r],o=s.action,s=s.args,o){case THREE.PathActions.MOVE_TO:n.push(new THREE.Vector2(s[0],s[1]));break;case THREE.PathActions.LINE_TO:n.push(new THREE.Vector2(s[0],s[1]));break;case THREE.PathActions.QUADRATIC_CURVE_TO:u=s[2];a=s[3];c=s[0];h=s[1];0<n.length?(o=n[n.length-1],p=o.x,d=o.y):(o=this.actions[r-1].args,p=o[o.length-2],d=o[o.length-1]);for(s=1;s<=e;s++)v=s/e,o=THREE.Shape.Utils.b2(v,p,c,u),v=THREE.Shape.Utils.b2(v,d,h,a),n.push(new THREE.Vector2(o,v));break;case THREE.PathActions.BEZIER_CURVE_TO:u=s[4];a=s[5];c=s[0];h=s[1];f=s[2];l=s[3];0<n.length?(o=n[n.length-1],p=o.x,d=o.y):(o=this.actions[r-1].args,p=o[o.length-2],d=o[o.length-1]);for(s=1;s<=e;s++)v=s/e,o=THREE.Shape.Utils.b3(v,p,c,f,u),v=THREE.Shape.Utils.b3(v,d,h,l,a),n.push(new THREE.Vector2(o,v));break;case THREE.PathActions.CSPLINE_THRU:o=this.actions[r-1].args;v=[new THREE.Vector2(o[o.length-2],o[o.length-1])];o=e*s[0].length;v=v.concat(s[0]);v=new THREE.SplineCurve(v);for(s=1;s<=o;s++)n.push(v.getPointAt(s/o));break;case THREE.PathActions.ARC:u=s[0];a=s[1];h=s[2];f=s[3];o=s[4];c=!!s[5];p=o-f;d=2*e;for(s=1;s<=d;s++)v=s/d,c||(v=1-v),v=f+v*p,o=u+h*Math.cos(v),v=a+h*Math.sin(v),n.push(new THREE.Vector2(o,v));break;case THREE.PathActions.ELLIPSE:u=s[0];a=s[1];h=s[2];l=s[3];f=s[4];o=s[5];c=!!s[6];p=o-f;d=2*e;for(s=1;s<=d;s++)v=s/d,c||(v=1-v),v=f+v*p,o=u+h*Math.cos(v),v=a+l*Math.sin(v),n.push(new THREE.Vector2(o,v))}r=n[n.length-1];1e-10>Math.abs(r.x-n[0].x)&&1e-10>Math.abs(r.y-n[0].y)&&n.splice(n.length-1,1);t&&n.push(n[0]);return n};THREE.Path.prototype.toShapes=function(e){var t,n,r,i,s=[],o=new THREE.Path;t=0;for(n=this.actions.length;t<n;t++)r=this.actions[t],i=r.args,r=r.action,r==THREE.PathActions.MOVE_TO&&0!=o.actions.length&&(s.push(o),o=new THREE.Path),o[r].apply(o,i);0!=o.actions.length&&s.push(o);if(0==s.length)return[];var u;i=[];if(1==s.length)return r=s[0],u=new THREE.Shape,u.actions=r.actions,u.curves=r.curves,i.push(u),i;t=!THREE.Shape.Utils.isClockWise(s[0].getPoints());if(e?!t:t){u=new THREE.Shape;t=0;for(n=s.length;t<n;t++)r=s[t],o=THREE.Shape.Utils.isClockWise(r.getPoints()),(o=e?!o:o)?(u.actions=r.actions,u.curves=r.curves,i.push(u),u=new THREE.Shape):u.holes.push(r)}else{u=void 0;t=0;for(n=s.length;t<n;t++)r=s[t],o=THREE.Shape.Utils.isClockWise(r.getPoints()),(o=e?!o:o)?(u&&i.push(u),u=new THREE.Shape,u.actions=r.actions,u.curves=r.curves):u.holes.push(r);i.push(u)}return i};THREE.Shape=function(){THREE.Path.apply(this,arguments);this.holes=[]};THREE.Shape.prototype=Object.create(THREE.Path.prototype);THREE.Shape.prototype.extrude=function(e){return new THREE.ExtrudeGeometry(this,e)};THREE.Shape.prototype.makeGeometry=function(e){return new THREE.ShapeGeometry(this,e)};THREE.Shape.prototype.getPointsHoles=function(e){var t,n=this.holes.length,r=[];for(t=0;t<n;t++)r[t]=this.holes[t].getTransformedPoints(e,this.bends);return r};THREE.Shape.prototype.getSpacedPointsHoles=function(e){var t,n=this.holes.length,r=[];for(t=0;t<n;t++)r[t]=this.holes[t].getTransformedSpacedPoints(e,this.bends);return r};THREE.Shape.prototype.extractAllPoints=function(e){return{shape:this.getTransformedPoints(e),holes:this.getPointsHoles(e)}};THREE.Shape.prototype.extractPoints=function(e){return this.useSpacedPoints?this.extractAllSpacedPoints(e):this.extractAllPoints(e)};THREE.Shape.prototype.extractAllSpacedPoints=function(e){return{shape:this.getTransformedSpacedPoints(e),holes:this.getSpacedPointsHoles(e)}};THREE.Shape.Utils={removeHoles:function(e,t){var n=e.concat(),r=n.concat(),i,s,o,u,a,f,l,c,h,p,d=[];for(a=0;a<t.length;a++){f=t[a];Array.prototype.push.apply(r,f);s=Number.POSITIVE_INFINITY;for(i=0;i<f.length;i++){h=f[i];p=[];for(c=0;c<n.length;c++)l=n[c],l=h.distanceToSquared(l),p.push(l),l<s&&(s=l,o=i,u=c)}i=0<=u-1?u-1:n.length-1;s=0<=o-1?o-1:f.length-1;var v=[f[o],n[u],n[i]];c=THREE.FontUtils.Triangulate.area(v);var m=[f[o],f[s],n[u]];h=THREE.FontUtils.Triangulate.area(m);p=u;l=o;u+=1;o+=-1;0>u&&(u+=n.length);u%=n.length;0>o&&(o+=f.length);o%=f.length;i=0<=u-1?u-1:n.length-1;s=0<=o-1?o-1:f.length-1;v=[f[o],n[u],n[i]];v=THREE.FontUtils.Triangulate.area(v);m=[f[o],f[s],n[u]];m=THREE.FontUtils.Triangulate.area(m);c+h>v+m&&(u=p,o=l,0>u&&(u+=n.length),u%=n.length,0>o&&(o+=f.length),o%=f.length,i=0<=u-1?u-1:n.length-1,s=0<=o-1?o-1:f.length-1);c=n.slice(0,u);h=n.slice(u);p=f.slice(o);l=f.slice(0,o);s=[f[o],f[s],n[u]];d.push([f[o],n[u],n[i]]);d.push(s);n=c.concat(p).concat(l).concat(h)}return{shape:n,isolatedPts:d,allpoints:r}},triangulateShape:function(e,t){var n=THREE.Shape.Utils.removeHoles(e,t),r=n.allpoints,i=n.isolatedPts,n=THREE.FontUtils.Triangulate(n.shape,!1),s,o,u,a,f={};s=0;for(o=r.length;s<o;s++)a=r[s].x+\":\"+r[s].y,void 0!==f[a]&&console.log(\"Duplicate point\",a),f[a]=s;s=0;for(o=n.length;s<o;s++){u=n[s];for(r=0;3>r;r++)a=u[r].x+\":\"+u[r].y,a=f[a],void 0!==a&&(u[r]=a)}s=0;for(o=i.length;s<o;s++){u=i[s];for(r=0;3>r;r++)a=u[r].x+\":\"+u[r].y,a=f[a],void 0!==a&&(u[r]=a)}return n.concat(i)},isClockWise:function(e){return 0>THREE.FontUtils.Triangulate.area(e)},b2p0:function(e,t){var n=1-e;return n*n*t},b2p1:function(e,t){return 2*(1-e)*e*t},b2p2:function(e,t){return e*e*t},b2:function(e,t,n,r){return this.b2p0(e,t)+this.b2p1(e,n)+this.b2p2(e,r)},b3p0:function(e,t){var n=1-e;return n*n*n*t},b3p1:function(e,t){var n=1-e;return 3*n*n*e*t},b3p2:function(e,t){return 3*(1-e)*e*e*t},b3p3:function(e,t){return e*e*e*t},b3:function(e,t,n,r,i){return this.b3p0(e,t)+this.b3p1(e,n)+this.b3p2(e,r)+this.b3p3(e,i)}};THREE.LineCurve=function(e,t){this.v1=e;this.v2=t};THREE.LineCurve.prototype=Object.create(THREE.Curve.prototype);THREE.LineCurve.prototype.getPoint=function(e){var t=this.v2.clone().sub(this.v1);t.multiplyScalar(e).add(this.v1);return t};THREE.LineCurve.prototype.getPointAt=function(e){return this.getPoint(e)};THREE.LineCurve.prototype.getTangent=function(){return this.v2.clone().sub(this.v1).normalize()};THREE.QuadraticBezierCurve=function(e,t,n){this.v0=e;this.v1=t;this.v2=n};THREE.QuadraticBezierCurve.prototype=Object.create(THREE.Curve.prototype);THREE.QuadraticBezierCurve.prototype.getPoint=function(e){var t;t=THREE.Shape.Utils.b2(e,this.v0.x,this.v1.x,this.v2.x);e=THREE.Shape.Utils.b2(e,this.v0.y,this.v1.y,this.v2.y);return new THREE.Vector2(t,e)};THREE.QuadraticBezierCurve.prototype.getTangent=function(e){var t;t=THREE.Curve.Utils.tangentQuadraticBezier(e,this.v0.x,this.v1.x,this.v2.x);e=THREE.Curve.Utils.tangentQuadraticBezier(e,this.v0.y,this.v1.y,this.v2.y);t=new THREE.Vector2(t,e);t.normalize();return t};THREE.CubicBezierCurve=function(e,t,n,r){this.v0=e;this.v1=t;this.v2=n;this.v3=r};THREE.CubicBezierCurve.prototype=Object.create(THREE.Curve.prototype);THREE.CubicBezierCurve.prototype.getPoint=function(e){var t;t=THREE.Shape.Utils.b3(e,this.v0.x,this.v1.x,this.v2.x,this.v3.x);e=THREE.Shape.Utils.b3(e,this.v0.y,this.v1.y,this.v2.y,this.v3.y);return new THREE.Vector2(t,e)};THREE.CubicBezierCurve.prototype.getTangent=function(e){var t;t=THREE.Curve.Utils.tangentCubicBezier(e,this.v0.x,this.v1.x,this.v2.x,this.v3.x);e=THREE.Curve.Utils.tangentCubicBezier(e,this.v0.y,this.v1.y,this.v2.y,this.v3.y);t=new THREE.Vector2(t,e);t.normalize();return t};THREE.SplineCurve=function(e){this.points=void 0==e?[]:e};THREE.SplineCurve.prototype=Object.create(THREE.Curve.prototype);THREE.SplineCurve.prototype.getPoint=function(e){var t=new THREE.Vector2,n=[],r=this.points,i;i=(r.length-1)*e;e=Math.floor(i);i-=e;n[0]=0==e?e:e-1;n[1]=e;n[2]=e>r.length-2?r.length-1:e+1;n[3]=e>r.length-3?r.length-1:e+2;t.x=THREE.Curve.Utils.interpolate(r[n[0]].x,r[n[1]].x,r[n[2]].x,r[n[3]].x,i);t.y=THREE.Curve.Utils.interpolate(r[n[0]].y,r[n[1]].y,r[n[2]].y,r[n[3]].y,i);return t};THREE.EllipseCurve=function(e,t,n,r,i,s,o){this.aX=e;this.aY=t;this.xRadius=n;this.yRadius=r;this.aStartAngle=i;this.aEndAngle=s;this.aClockwise=o};THREE.EllipseCurve.prototype=Object.create(THREE.Curve.prototype);THREE.EllipseCurve.prototype.getPoint=function(e){var t;t=this.aEndAngle-this.aStartAngle;0>t&&(t+=2*Math.PI);t>2*Math.PI&&(t-=2*Math.PI);t=!0===this.aClockwise?this.aEndAngle+(1-e)*(2*Math.PI-t):this.aStartAngle+e*t;e=this.aX+this.xRadius*Math.cos(t);t=this.aY+this.yRadius*Math.sin(t);return new THREE.Vector2(e,t)};THREE.ArcCurve=function(e,t,n,r,i,s){THREE.EllipseCurve.call(this,e,t,n,n,r,i,s)};THREE.ArcCurve.prototype=Object.create(THREE.EllipseCurve.prototype);THREE.LineCurve3=THREE.Curve.create(function(e,t){this.v1=e;this.v2=t},function(e){var t=new THREE.Vector3;t.subVectors(this.v2,this.v1);t.multiplyScalar(e);t.add(this.v1);return t});THREE.QuadraticBezierCurve3=THREE.Curve.create(function(e,t,n){this.v0=e;this.v1=t;this.v2=n},function(e){var t,n;t=THREE.Shape.Utils.b2(e,this.v0.x,this.v1.x,this.v2.x);n=THREE.Shape.Utils.b2(e,this.v0.y,this.v1.y,this.v2.y);e=THREE.Shape.Utils.b2(e,this.v0.z,this.v1.z,this.v2.z);return new THREE.Vector3(t,n,e)});THREE.CubicBezierCurve3=THREE.Curve.create(function(e,t,n,r){this.v0=e;this.v1=t;this.v2=n;this.v3=r},function(e){var t,n;t=THREE.Shape.Utils.b3(e,this.v0.x,this.v1.x,this.v2.x,this.v3.x);n=THREE.Shape.Utils.b3(e,this.v0.y,this.v1.y,this.v2.y,this.v3.y);e=THREE.Shape.Utils.b3(e,this.v0.z,this.v1.z,this.v2.z,this.v3.z);return new THREE.Vector3(t,n,e)});THREE.SplineCurve3=THREE.Curve.create(function(e){this.points=void 0==e?[]:e},function(e){var t=new THREE.Vector3,n=[],r=this.points,i,e=(r.length-1)*e;i=Math.floor(e);e-=i;n[0]=0==i?i:i-1;n[1]=i;n[2]=i>r.length-2?r.length-1:i+1;n[3]=i>r.length-3?r.length-1:i+2;i=r[n[0]];var s=r[n[1]],o=r[n[2]],n=r[n[3]];t.x=THREE.Curve.Utils.interpolate(i.x,s.x,o.x,n.x,e);t.y=THREE.Curve.Utils.interpolate(i.y,s.y,o.y,n.y,e);t.z=THREE.Curve.Utils.interpolate(i.z,s.z,o.z,n.z,e);return t});THREE.ClosedSplineCurve3=THREE.Curve.create(function(e){this.points=void 0==e?[]:e},function(e){var t=new THREE.Vector3,n=[],r=this.points,i;i=(r.length-0)*e;e=Math.floor(i);i-=e;e+=0<e?0:(Math.floor(Math.abs(e)/r.length)+1)*r.length;n[0]=(e-1)%r.length;n[1]=e%r.length;n[2]=(e+1)%r.length;n[3]=(e+2)%r.length;t.x=THREE.Curve.Utils.interpolate(r[n[0]].x,r[n[1]].x,r[n[2]].x,r[n[3]].x,i);t.y=THREE.Curve.Utils.interpolate(r[n[0]].y,r[n[1]].y,r[n[2]].y,r[n[3]].y,i);t.z=THREE.Curve.Utils.interpolate(r[n[0]].z,r[n[1]].z,r[n[2]].z,r[n[3]].z,i);return t});THREE.AnimationHandler=function(){var e=[],t={},n={update:function(t){for(var n=0;n<e.length;n++)e[n].update(t)},addToUpdate:function(t){-1===e.indexOf(t)&&e.push(t)},removeFromUpdate:function(t){t=e.indexOf(t);-1!==t&&e.splice(t,1)},add:function(e){void 0!==t[e.name]&&console.log(\"THREE.AnimationHandler.add: Warning! \"+e.name+\" already exists in library. Overwriting.\");t[e.name]=e;if(!0!==e.initialized){for(var n=0;n<e.hierarchy.length;n++){for(var r=0;r<e.hierarchy[n].keys.length;r++)if(0>e.hierarchy[n].keys[r].time&&(e.hierarchy[n].keys[r].time=0),void 0!==e.hierarchy[n].keys[r].rot&&!(e.hierarchy[n].keys[r].rot instanceof THREE.Quaternion)){var i=e.hierarchy[n].keys[r].rot;e.hierarchy[n].keys[r].rot=new THREE.Quaternion(i[0],i[1],i[2],i[3])}if(e.hierarchy[n].keys.length&&void 0!==e.hierarchy[n].keys[0].morphTargets){i={};for(r=0;r<e.hierarchy[n].keys.length;r++)for(var s=0;s<e.hierarchy[n].keys[r].morphTargets.length;s++){var o=e.hierarchy[n].keys[r].morphTargets[s];i[o]=-1}e.hierarchy[n].usedMorphTargets=i;for(r=0;r<e.hierarchy[n].keys.length;r++){var u={};for(o in i){for(s=0;s<e.hierarchy[n].keys[r].morphTargets.length;s++)if(e.hierarchy[n].keys[r].morphTargets[s]===o){u[o]=e.hierarchy[n].keys[r].morphTargetsInfluences[s];break}s===e.hierarchy[n].keys[r].morphTargets.length&&(u[o]=0)}e.hierarchy[n].keys[r].morphTargetsInfluences=u}}for(r=1;r<e.hierarchy[n].keys.length;r++)e.hierarchy[n].keys[r].time===e.hierarchy[n].keys[r-1].time&&(e.hierarchy[n].keys.splice(r,1),r--);for(r=0;r<e.hierarchy[n].keys.length;r++)e.hierarchy[n].keys[r].index=r}r=parseInt(e.length*e.fps,10);e.JIT={};e.JIT.hierarchy=[];for(n=0;n<e.hierarchy.length;n++)e.JIT.hierarchy.push(Array(r));e.initialized=!0}},get:function(e){if(\"string\"===typeof e){if(t[e])return t[e];console.log(\"THREE.AnimationHandler.get: Couldn't find animation \"+e);return null}},parse:function(e){var t=[];if(e instanceof THREE.SkinnedMesh)for(var n=0;n<e.bones.length;n++)t.push(e.bones[n]);else r(e,t);return t}},r=function(e,t){t.push(e);for(var n=0;n<e.children.length;n++)r(e.children[n],t)};n.LINEAR=0;n.CATMULLROM=1;n.CATMULLROM_FORWARD=2;return n}();THREE.Animation=function(e,t,n){this.root=e;this.data=THREE.AnimationHandler.get(t);this.hierarchy=THREE.AnimationHandler.parse(e);this.currentTime=0;this.timeScale=1;this.isPlaying=!1;this.loop=this.isPaused=!0;this.interpolationType=void 0!==n?n:THREE.AnimationHandler.LINEAR;this.points=[];this.target=new THREE.Vector3};THREE.Animation.prototype.play=function(e,t){if(!1===this.isPlaying){this.isPlaying=!0;this.loop=void 0!==e?e:!0;this.currentTime=void 0!==t?t:0;var n,r=this.hierarchy.length,i;for(n=0;n<r;n++){i=this.hierarchy[n];i.matrixAutoUpdate=!0;void 0===i.animationCache&&(i.animationCache={},i.animationCache.prevKey={pos:0,rot:0,scl:0},i.animationCache.nextKey={pos:0,rot:0,scl:0},i.animationCache.originalMatrix=i instanceof THREE.Bone?i.skinMatrix:i.matrix);var s=i.animationCache.prevKey;i=i.animationCache.nextKey;s.pos=this.data.hierarchy[n].keys[0];s.rot=this.data.hierarchy[n].keys[0];s.scl=this.data.hierarchy[n].keys[0];i.pos=this.getNextKeyWith(\"pos\",n,1);i.rot=this.getNextKeyWith(\"rot\",n,1);i.scl=this.getNextKeyWith(\"scl\",n,1)}this.update(0)}this.isPaused=!1;THREE.AnimationHandler.addToUpdate(this)};THREE.Animation.prototype.pause=function(){!0===this.isPaused?THREE.AnimationHandler.addToUpdate(this):THREE.AnimationHandler.removeFromUpdate(this);this.isPaused=!this.isPaused};THREE.Animation.prototype.stop=function(){this.isPaused=this.isPlaying=!1;THREE.AnimationHandler.removeFromUpdate(this)};THREE.Animation.prototype.update=function(e){if(!1!==this.isPlaying){var t=[\"pos\",\"rot\",\"scl\"],n,r,i,s,o,u,a,f,l;for(l=this.currentTime+=e*this.timeScale;this.currentTime>this.data.length;)this.currentTime-=this.data.length;f=this.currentTime%=this.data.length;parseInt(Math.min(f*this.data.fps,this.data.length*this.data.fps),10);for(var c=0,h=this.hierarchy.length;c<h;c++){e=this.hierarchy[c];a=e.animationCache;for(var p=0;3>p;p++){n=t[p];o=a.prevKey[n];u=a.nextKey[n];if(u.time<=l){if(f<=l)if(this.loop){o=this.data.hierarchy[c].keys[0];for(u=this.getNextKeyWith(n,c,1);null!==u&&u.time<f&&u.index>o.index;)o=u,u=this.getNextKeyWith(n,c,u.index+1)}else{this.stop();return}else{do o=u,u=this.getNextKeyWith(n,c,u.index+1);while(null!==u&&u.time<f&&u.index>o.index)}a.prevKey[n]=o;a.nextKey[n]=u}e.matrixAutoUpdate=!0;e.matrixWorldNeedsUpdate=!0;r=(f-o.time)/(u.time-o.time);i=o[n];s=u[n];if(0>r||1<r)console.log(\"THREE.Animation.update: Warning! Scale out of bounds:\"+r+\" on bone \"+c),r=0>r?0:1;if(\"pos\"===n)if(n=e.position,this.interpolationType===THREE.AnimationHandler.LINEAR)n.x=i[0]+(s[0]-i[0])*r,n.y=i[1]+(s[1]-i[1])*r,n.z=i[2]+(s[2]-i[2])*r;else{if(this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD)this.points[0]=this.getPrevKeyWith(\"pos\",c,o.index-1).pos,this.points[1]=i,this.points[2]=s,this.points[3]=this.getNextKeyWith(\"pos\",c,u.index+1).pos,r=.33*r+.33,i=this.interpolateCatmullRom(this.points,r),n.x=i[0],n.y=i[1],n.z=i[2],this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD&&(r=this.interpolateCatmullRom(this.points,1.01*r),this.target.set(r[0],r[1],r[2]),this.target.sub(n),this.target.y=0,this.target.normalize(),r=Math.atan2(this.target.x,this.target.z),e.rotation.set(0,r,0))}else\"rot\"===n?THREE.Quaternion.slerp(i,s,e.quaternion,r):\"scl\"===n&&(n=e.scale,n.x=i[0]+(s[0]-i[0])*r,n.y=i[1]+(s[1]-i[1])*r,n.z=i[2]+(s[2]-i[2])*r)}}}};THREE.Animation.prototype.interpolateCatmullRom=function(e,t){var n=[],r=[],i,s,o,u,a,f;i=(e.length-1)*t;s=Math.floor(i);i-=s;n[0]=0===s?s:s-1;n[1]=s;n[2]=s>e.length-2?s:s+1;n[3]=s>e.length-3?s:s+2;s=e[n[0]];u=e[n[1]];a=e[n[2]];f=e[n[3]];n=i*i;o=i*n;r[0]=this.interpolate(s[0],u[0],a[0],f[0],i,n,o);r[1]=this.interpolate(s[1],u[1],a[1],f[1],i,n,o);r[2]=this.interpolate(s[2],u[2],a[2],f[2],i,n,o);return r};THREE.Animation.prototype.interpolate=function(e,t,n,r,i,s,o){e=.5*(n-e);r=.5*(r-t);return(2*(t-n)+e+r)*o+(-3*(t-n)-2*e-r)*s+e*i+t};THREE.Animation.prototype.getNextKeyWith=function(e,t,n){for(var r=this.data.hierarchy[t].keys,n=this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD?n<r.length-1?n:r.length-1:n%r.length;n<r.length;n++)if(void 0!==r[n][e])return r[n];return this.data.hierarchy[t].keys[0]};THREE.Animation.prototype.getPrevKeyWith=function(e,t,n){for(var r=this.data.hierarchy[t].keys,n=this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD?0<n?n:0:0<=n?n:n+r.length;0<=n;n--)if(void 0!==r[n][e])return r[n];return this.data.hierarchy[t].keys[r.length-1]};THREE.KeyFrameAnimation=function(e,t,n){this.root=e;this.data=THREE.AnimationHandler.get(t);this.hierarchy=THREE.AnimationHandler.parse(e);this.currentTime=0;this.timeScale=.001;this.isPlaying=!1;this.loop=this.isPaused=!0;this.JITCompile=void 0!==n?n:!0;e=0;for(t=this.hierarchy.length;e<t;e++){var n=this.data.hierarchy[e].sids,r=this.hierarchy[e];if(this.data.hierarchy[e].keys.length&&n){for(var i=0;i<n.length;i++){var s=n[i],o=this.getNextKeyWith(s,e,0);o&&o.apply(s)}r.matrixAutoUpdate=!1;this.data.hierarchy[e].node.updateMatrix();r.matrixWorldNeedsUpdate=!0}}};THREE.KeyFrameAnimation.prototype.play=function(e,t){if(!this.isPlaying){this.isPlaying=!0;this.loop=void 0!==e?e:!0;this.currentTime=void 0!==t?t:0;this.startTimeMs=t;this.startTime=1e7;this.endTime=-this.startTime;var n,r=this.hierarchy.length,i,s;for(n=0;n<r;n++)i=this.hierarchy[n],s=this.data.hierarchy[n],void 0===s.animationCache&&(s.animationCache={},s.animationCache.prevKey=null,s.animationCache.nextKey=null,s.animationCache.originalMatrix=i instanceof THREE.Bone?i.skinMatrix:i.matrix),i=this.data.hierarchy[n].keys,i.length&&(s.animationCache.prevKey=i[0],s.animationCache.nextKey=i[1],this.startTime=Math.min(i[0].time,this.startTime),this.endTime=Math.max(i[i.length-1].time,this.endTime));this.update(0)}this.isPaused=!1;THREE.AnimationHandler.addToUpdate(this)};THREE.KeyFrameAnimation.prototype.pause=function(){this.isPaused?THREE.AnimationHandler.addToUpdate(this):THREE.AnimationHandler.removeFromUpdate(this);this.isPaused=!this.isPaused};THREE.KeyFrameAnimation.prototype.stop=function(){this.isPaused=this.isPlaying=!1;THREE.AnimationHandler.removeFromUpdate(this);for(var e=0;e<this.data.hierarchy.length;e++){var t=this.hierarchy[e],n=this.data.hierarchy[e];if(void 0!==n.animationCache){var r=n.animationCache.originalMatrix;t instanceof THREE.Bone?(r.copy(t.skinMatrix),t.skinMatrix=r):(r.copy(t.matrix),t.matrix=r);delete n.animationCache}}};THREE.KeyFrameAnimation.prototype.update=function(e){if(this.isPlaying){var t,n,r,i,s=this.data.JIT.hierarchy,o,u,a;u=this.currentTime+=e*this.timeScale;o=this.currentTime%=this.data.length;o<this.startTimeMs&&(o=this.currentTime=this.startTimeMs+o);i=parseInt(Math.min(o*this.data.fps,this.data.length*this.data.fps),10);if((a=o<u)&&!this.loop){for(var e=0,f=this.hierarchy.length;e<f;e++){var l=this.data.hierarchy[e].keys,s=this.data.hierarchy[e].sids;r=l.length-1;i=this.hierarchy[e];if(l.length){for(l=0;l<s.length;l++)o=s[l],(u=this.getPrevKeyWith(o,e,r))&&u.apply(o);this.data.hierarchy[e].node.updateMatrix();i.matrixWorldNeedsUpdate=!0}}this.stop()}else if(!(o<this.startTime)){e=0;for(f=this.hierarchy.length;e<f;e++){r=this.hierarchy[e];t=this.data.hierarchy[e];var l=t.keys,c=t.animationCache;if(this.JITCompile&&void 0!==s[e][i])r instanceof THREE.Bone?(r.skinMatrix=s[e][i],r.matrixWorldNeedsUpdate=!1):(r.matrix=s[e][i],r.matrixWorldNeedsUpdate=!0);else if(l.length){this.JITCompile&&c&&(r instanceof THREE.Bone?r.skinMatrix=c.originalMatrix:r.matrix=c.originalMatrix);t=c.prevKey;n=c.nextKey;if(t&&n){if(n.time<=u){if(a&&this.loop){t=l[0];for(n=l[1];n.time<o;)t=n,n=l[t.index+1]}else if(!a)for(var h=l.length-1;n.time<o&&n.index!==h;)t=n,n=l[t.index+1];c.prevKey=t;c.nextKey=n}n.time>=o?t.interpolate(n,o):t.interpolate(n,n.time)}this.data.hierarchy[e].node.updateMatrix();r.matrixWorldNeedsUpdate=!0}}if(this.JITCompile&&void 0===s[0][i]){this.hierarchy[0].updateMatrixWorld(!0);for(e=0;e<this.hierarchy.length;e++)s[e][i]=this.hierarchy[e]instanceof THREE.Bone?this.hierarchy[e].skinMatrix.clone():this.hierarchy[e].matrix.clone()}}}};THREE.KeyFrameAnimation.prototype.getNextKeyWith=function(e,t,n){t=this.data.hierarchy[t].keys;for(n%=t.length;n<t.length;n++)if(t[n].hasTarget(e))return t[n];return t[0]};THREE.KeyFrameAnimation.prototype.getPrevKeyWith=function(e,t,n){t=this.data.hierarchy[t].keys;for(n=0<=n?n:n+t.length;0<=n;n--)if(t[n].hasTarget(e))return t[n];return t[t.length-1]};THREE.CubeCamera=function(e,t,n){THREE.Object3D.call(this);var r=new THREE.PerspectiveCamera(90,1,e,t);r.up.set(0,-1,0);r.lookAt(new THREE.Vector3(1,0,0));this.add(r);var i=new THREE.PerspectiveCamera(90,1,e,t);i.up.set(0,-1,0);i.lookAt(new THREE.Vector3(-1,0,0));this.add(i);var s=new THREE.PerspectiveCamera(90,1,e,t);s.up.set(0,0,1);s.lookAt(new THREE.Vector3(0,1,0));this.add(s);var o=new THREE.PerspectiveCamera(90,1,e,t);o.up.set(0,0,-1);o.lookAt(new THREE.Vector3(0,-1,0));this.add(o);var u=new THREE.PerspectiveCamera(90,1,e,t);u.up.set(0,-1,0);u.lookAt(new THREE.Vector3(0,0,1));this.add(u);var a=new THREE.PerspectiveCamera(90,1,e,t);a.up.set(0,-1,0);a.lookAt(new THREE.Vector3(0,0,-1));this.add(a);this.renderTarget=new THREE.WebGLRenderTargetCube(n,n,{format:THREE.RGBFormat,magFilter:THREE.LinearFilter,minFilter:THREE.LinearFilter});this.updateCubeMap=function(e,t){var n=this.renderTarget,l=n.generateMipmaps;n.generateMipmaps=!1;n.activeCubeFace=0;e.render(t,r,n);n.activeCubeFace=1;e.render(t,i,n);n.activeCubeFace=2;e.render(t,s,n);n.activeCubeFace=3;e.render(t,o,n);n.activeCubeFace=4;e.render(t,u,n);n.generateMipmaps=l;n.activeCubeFace=5;e.render(t,a,n)}};THREE.CubeCamera.prototype=Object.create(THREE.Object3D.prototype);THREE.CombinedCamera=function(e,t,n,r,i,s,o){THREE.Camera.call(this);this.fov=n;this.left=-e/2;this.right=e/2;this.top=t/2;this.bottom=-t/2;this.cameraO=new THREE.OrthographicCamera(e/-2,e/2,t/2,t/-2,s,o);this.cameraP=new THREE.PerspectiveCamera(n,e/t,r,i);this.zoom=1;this.toPerspective()};THREE.CombinedCamera.prototype=Object.create(THREE.Camera.prototype);THREE.CombinedCamera.prototype.toPerspective=function(){this.near=this.cameraP.near;this.far=this.cameraP.far;this.cameraP.fov=this.fov/this.zoom;this.cameraP.updateProjectionMatrix();this.projectionMatrix=this.cameraP.projectionMatrix;this.inPerspectiveMode=!0;this.inOrthographicMode=!1};THREE.CombinedCamera.prototype.toOrthographic=function(){var e=this.cameraP.aspect,t=(this.cameraP.near+this.cameraP.far)/2,t=Math.tan(this.fov/2)*t,e=2*t*e/2,t=t/this.zoom,e=e/this.zoom;this.cameraO.left=-e;this.cameraO.right=e;this.cameraO.top=t;this.cameraO.bottom=-t;this.cameraO.updateProjectionMatrix();this.near=this.cameraO.near;this.far=this.cameraO.far;this.projectionMatrix=this.cameraO.projectionMatrix;this.inPerspectiveMode=!1;this.inOrthographicMode=!0};THREE.CombinedCamera.prototype.setSize=function(e,t){this.cameraP.aspect=e/t;this.left=-e/2;this.right=e/2;this.top=t/2;this.bottom=-t/2};THREE.CombinedCamera.prototype.setFov=function(e){this.fov=e;this.inPerspectiveMode?this.toPerspective():this.toOrthographic()};THREE.CombinedCamera.prototype.updateProjectionMatrix=function(){this.inPerspectiveMode?this.toPerspective():(this.toPerspective(),this.toOrthographic())};THREE.CombinedCamera.prototype.setLens=function(e,t){void 0===t&&(t=24);var n=2*THREE.Math.radToDeg(Math.atan(t/(2*e)));this.setFov(n);return n};THREE.CombinedCamera.prototype.setZoom=function(e){this.zoom=e;this.inPerspectiveMode?this.toPerspective():this.toOrthographic()};THREE.CombinedCamera.prototype.toFrontView=function(){this.rotation.x=0;this.rotation.y=0;this.rotation.z=0;this.rotationAutoUpdate=!1};THREE.CombinedCamera.prototype.toBackView=function(){this.rotation.x=0;this.rotation.y=Math.PI;this.rotation.z=0;this.rotationAutoUpdate=!1};THREE.CombinedCamera.prototype.toLeftView=function(){this.rotation.x=0;this.rotation.y=-Math.PI/2;this.rotation.z=0;this.rotationAutoUpdate=!1};THREE.CombinedCamera.prototype.toRightView=function(){this.rotation.x=0;this.rotation.y=Math.PI/2;this.rotation.z=0;this.rotationAutoUpdate=!1};THREE.CombinedCamera.prototype.toTopView=function(){this.rotation.x=-Math.PI/2;this.rotation.y=0;this.rotation.z=0;this.rotationAutoUpdate=!1};THREE.CombinedCamera.prototype.toBottomView=function(){this.rotation.x=Math.PI/2;this.rotation.y=0;this.rotation.z=0;this.rotationAutoUpdate=!1};THREE.CircleGeometry=function(e,t,n,r){THREE.Geometry.call(this);this.radius=e=e||50;this.segments=t=void 0!==t?Math.max(3,t):8;this.thetaStart=n=void 0!==n?n:0;this.thetaLength=r=void 0!==r?r:2*Math.PI;var i,s=[];i=new THREE.Vector3;var o=new THREE.Vector2(.5,.5);this.vertices.push(i);s.push(o);for(i=0;i<=t;i++){var u=new THREE.Vector3,a=n+i/t*r;u.x=e*Math.cos(a);u.y=e*Math.sin(a);this.vertices.push(u);s.push(new THREE.Vector2((u.x/e+1)/2,(u.y/e+1)/2))}n=new THREE.Vector3(0,0,1);for(i=1;i<=t;i++)this.faces.push(new THREE.Face3(i,i+1,0,[n.clone(),n.clone(),n.clone()])),this.faceVertexUvs[0].push([s[i].clone(),s[i+1].clone(),o.clone()]);this.computeCentroids();this.computeFaceNormals();this.boundingSphere=new THREE.Sphere(new THREE.Vector3,e)};THREE.CircleGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.CubeGeometry=function(e,t,n,r,i,s){function o(e,t,n,r,i,s,o,a){var f,l=u.widthSegments,c=u.heightSegments,h=i/2,p=s/2,d=u.vertices.length;if(\"x\"===e&&\"y\"===t||\"y\"===e&&\"x\"===t)f=\"z\";else if(\"x\"===e&&\"z\"===t||\"z\"===e&&\"x\"===t)f=\"y\",c=u.depthSegments;else if(\"z\"===e&&\"y\"===t||\"y\"===e&&\"z\"===t)f=\"x\",l=u.depthSegments;var v=l+1,m=c+1,y=i/l,b=s/c,w=new THREE.Vector3;w[f]=0<o?1:-1;for(i=0;i<m;i++)for(s=0;s<v;s++){var E=new THREE.Vector3;E[e]=(s*y-h)*n;E[t]=(i*b-p)*r;E[f]=o;u.vertices.push(E)}for(i=0;i<c;i++)for(s=0;s<l;s++)p=s+v*i,e=s+v*(i+1),t=s+1+v*(i+1),n=s+1+v*i,r=new THREE.Vector2(s/l,1-i/c),o=new THREE.Vector2(s/l,1-(i+1)/c),f=new THREE.Vector2((s+1)/l,1-(i+1)/c),h=new THREE.Vector2((s+1)/l,1-i/c),p=new THREE.Face3(p+d,e+d,n+d),p.normal.copy(w),p.vertexNormals.push(w.clone(),w.clone(),w.clone()),p.materialIndex=a,u.faces.push(p),u.faceVertexUvs[0].push([r,o,h]),p=new THREE.Face3(e+d,t+d,n+d),p.normal.copy(w),p.vertexNormals.push(w.clone(),w.clone(),w.clone()),p.materialIndex=a,u.faces.push(p),u.faceVertexUvs[0].push([o.clone(),f,h.clone()])}THREE.Geometry.call(this);var u=this;this.width=e;this.height=t;this.depth=n;this.widthSegments=r||1;this.heightSegments=i||1;this.depthSegments=s||1;e=this.width/2;t=this.height/2;n=this.depth/2;o(\"z\",\"y\",-1,-1,this.depth,this.height,e,0);o(\"z\",\"y\",1,-1,this.depth,this.height,-e,1);o(\"x\",\"z\",1,1,this.width,this.depth,t,2);o(\"x\",\"z\",1,-1,this.width,this.depth,-t,3);o(\"x\",\"y\",1,-1,this.width,this.height,n,4);o(\"x\",\"y\",-1,-1,this.width,this.height,-n,5);this.computeCentroids();this.mergeVertices()};THREE.CubeGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.CylinderGeometry=function(e,t,n,r,i,s){THREE.Geometry.call(this);this.radiusTop=e=void 0!==e?e:20;this.radiusBottom=t=void 0!==t?t:20;this.height=n=void 0!==n?n:100;this.radialSegments=r=r||8;this.heightSegments=i=i||1;this.openEnded=s=void 0!==s?s:!1;var o=n/2,u,a,f=[],l=[];for(a=0;a<=i;a++){var c=[],h=[],p=a/i,d=p*(t-e)+e;for(u=0;u<=r;u++){var v=u/r,m=new THREE.Vector3;m.x=d*Math.sin(2*v*Math.PI);m.y=-p*n+o;m.z=d*Math.cos(2*v*Math.PI);this.vertices.push(m);c.push(this.vertices.length-1);h.push(new THREE.Vector2(v,1-p))}f.push(c);l.push(h)}n=(t-e)/n;for(u=0;u<r;u++){0!==e?(c=this.vertices[f[0][u]].clone(),h=this.vertices[f[0][u+1]].clone()):(c=this.vertices[f[1][u]].clone(),h=this.vertices[f[1][u+1]].clone());c.setY(Math.sqrt(c.x*c.x+c.z*c.z)*n).normalize();h.setY(Math.sqrt(h.x*h.x+h.z*h.z)*n).normalize();for(a=0;a<i;a++){var p=f[a][u],d=f[a+1][u],v=f[a+1][u+1],m=f[a][u+1],g=c.clone(),y=c.clone(),b=h.clone(),w=h.clone(),E=l[a][u].clone(),S=l[a+1][u].clone(),x=l[a+1][u+1].clone(),T=l[a][u+1].clone();this.faces.push(new THREE.Face3(p,d,m,[g,y,w]));this.faceVertexUvs[0].push([E,S,T]);this.faces.push(new THREE.Face3(d,v,m,[y.clone(),b,w.clone()]));this.faceVertexUvs[0].push([S.clone(),x,T.clone()])}}if(!1===s&&0<e){this.vertices.push(new THREE.Vector3(0,o,0));for(u=0;u<r;u++)p=f[0][u],d=f[0][u+1],v=this.vertices.length-1,g=new THREE.Vector3(0,1,0),y=new THREE.Vector3(0,1,0),b=new THREE.Vector3(0,1,0),E=l[0][u].clone(),S=l[0][u+1].clone(),x=new THREE.Vector2(S.x,0),this.faces.push(new THREE.Face3(p,d,v,[g,y,b])),this.faceVertexUvs[0].push([E,S,x])}if(!1===s&&0<t){this.vertices.push(new THREE.Vector3(0,-o,0));for(u=0;u<r;u++)p=f[a][u+1],d=f[a][u],v=this.vertices.length-1,g=new THREE.Vector3(0,-1,0),y=new THREE.Vector3(0,-1,0),b=new THREE.Vector3(0,-1,0),E=l[a][u+1].clone(),S=l[a][u].clone(),x=new THREE.Vector2(S.x,1),this.faces.push(new THREE.Face3(p,d,v,[g,y,b])),this.faceVertexUvs[0].push([E,S,x])}this.computeCentroids();this.computeFaceNormals()};THREE.CylinderGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.ExtrudeGeometry=function(e,t){\"undefined\"!==typeof e&&(THREE.Geometry.call(this),e=e instanceof Array?e:[e],this.shapebb=e[e.length-1].getBoundingBox(),this.addShapeList(e,t),this.computeCentroids(),this.computeFaceNormals())};THREE.ExtrudeGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.ExtrudeGeometry.prototype.addShapeList=function(e,t){for(var n=e.length,r=0;r<n;r++)this.addShape(e[r],t)};THREE.ExtrudeGeometry.prototype.addShape=function(e,t){function n(e,t,n){t||console.log(\"die\");return t.clone().multiplyScalar(n).add(e)}function r(e,t,n){var r=THREE.ExtrudeGeometry.__v1,i=THREE.ExtrudeGeometry.__v2,s=THREE.ExtrudeGeometry.__v3,o=THREE.ExtrudeGeometry.__v4,u=THREE.ExtrudeGeometry.__v5,a=THREE.ExtrudeGeometry.__v6;r.set(e.x-t.x,e.y-t.y);i.set(e.x-n.x,e.y-n.y);r=r.normalize();i=i.normalize();s.set(-r.y,r.x);o.set(i.y,-i.x);u.copy(e).add(s);a.copy(e).add(o);if(u.equals(a))return o.clone();u.copy(t).add(s);a.copy(n).add(o);s=r.dot(o);o=a.sub(u).dot(o);0===s&&(console.log(\"Either infinite or no solutions!\"),0===o?console.log(\"Its finite solutions.\"):console.log(\"Too bad, no solutions.\"));o/=s;return 0>o?(t=Math.atan2(t.y-e.y,t.x-e.x),e=Math.atan2(n.y-e.y,n.x-e.x),t>e&&(e+=2*Math.PI),n=(t+e)/2,e=-Math.cos(n),n=-Math.sin(n),new THREE.Vector2(e,n)):r.multiplyScalar(o).add(u).sub(e).clone()}function i(n,r){var i,s;for(F=n.length;0<=--F;){i=F;s=F-1;0>s&&(s=n.length-1);for(var o=0,u=p+2*l,o=0;o<u;o++){var a=H*o,f=H*(o+1),c=r+i+a,a=r+s+a,h=r+s+f,f=r+i+f,d=n,v=o,m=u,g=i,w=s,c=c+L,a=a+L,h=h+L,f=f+L;k.faces.push(new THREE.Face3(c,a,f,null,null,y));k.faces.push(new THREE.Face3(a,h,f,null,null,y));c=b.generateSideWallUV(k,e,d,t,c,a,h,f,v,m,g,w);k.faceVertexUvs[0].push([c[0],c[1],c[3]]);k.faceVertexUvs[0].push([c[1],c[2],c[3]])}}}function s(e,t,n){k.vertices.push(new THREE.Vector3(e,t,n))}function o(n,r,i,s){n+=L;r+=L;i+=L;k.faces.push(new THREE.Face3(n,r,i,null,null,g));n=s?b.generateBottomUV(k,e,t,n,r,i):b.generateTopUV(k,e,t,n,r,i);k.faceVertexUvs[0].push(n)}var u=void 0!==t.amount?t.amount:100,a=void 0!==t.bevelThickness?t.bevelThickness:6,f=void 0!==t.bevelSize?t.bevelSize:a-2,l=void 0!==t.bevelSegments?t.bevelSegments:3,c=void 0!==t.bevelEnabled?t.bevelEnabled:!0,h=void 0!==t.curveSegments?t.curveSegments:12,p=void 0!==t.steps?t.steps:1,d=t.extrudePath,v,m=!1,g=t.material,y=t.extrudeMaterial,b=void 0!==t.UVGenerator?t.UVGenerator:THREE.ExtrudeGeometry.WorldUVGenerator,w,E,S,x;d&&(v=d.getSpacedPoints(p),m=!0,c=!1,w=void 0!==t.frames?t.frames:new THREE.TubeGeometry.FrenetFrames(d,p,!1),E=new THREE.Vector3,S=new THREE.Vector3,x=new THREE.Vector3);c||(f=a=l=0);var T,N,C,k=this,L=this.vertices.length,h=e.extractPoints(h),A=h.shape,h=h.holes;if(d=!THREE.Shape.Utils.isClockWise(A)){A=A.reverse();N=0;for(C=h.length;N<C;N++)T=h[N],THREE.Shape.Utils.isClockWise(T)&&(h[N]=T.reverse());d=!1}var O=THREE.Shape.Utils.triangulateShape(A,h),d=A;N=0;for(C=h.length;N<C;N++)T=h[N],A=A.concat(T);var M,_,D,P,H=A.length,B=O.length,j=[],F=0,I=d.length;M=I-1;for(_=F+1;F<I;F++,M++,_++)M===I&&(M=0),_===I&&(_=0),j[F]=r(d[F],d[M],d[_]);var q=[],R,U=j.concat();N=0;for(C=h.length;N<C;N++){T=h[N];R=[];F=0;I=T.length;M=I-1;for(_=F+1;F<I;F++,M++,_++)M===I&&(M=0),_===I&&(_=0),R[F]=r(T[F],T[M],T[_]);q.push(R);U=U.concat(R)}for(M=0;M<l;M++){T=M/l;D=a*(1-T);_=f*Math.sin(T*Math.PI/2);F=0;for(I=d.length;F<I;F++)P=n(d[F],j[F],_),s(P.x,P.y,-D);N=0;for(C=h.length;N<C;N++){T=h[N];R=q[N];F=0;for(I=T.length;F<I;F++)P=n(T[F],R[F],_),s(P.x,P.y,-D)}}_=f;for(F=0;F<H;F++)P=c?n(A[F],U[F],_):A[F],m?(S.copy(w.normals[0]).multiplyScalar(P.x),E.copy(w.binormals[0]).multiplyScalar(P.y),x.copy(v[0]).add(S).add(E),s(x.x,x.y,x.z)):s(P.x,P.y,0);for(T=1;T<=p;T++)for(F=0;F<H;F++)P=c?n(A[F],U[F],_):A[F],m?(S.copy(w.normals[T]).multiplyScalar(P.x),E.copy(w.binormals[T]).multiplyScalar(P.y),x.copy(v[T]).add(S).add(E),s(x.x,x.y,x.z)):s(P.x,P.y,u/p*T);for(M=l-1;0<=M;M--){T=M/l;D=a*(1-T);_=f*Math.sin(T*Math.PI/2);F=0;for(I=d.length;F<I;F++)P=n(d[F],j[F],_),s(P.x,P.y,u+D);N=0;for(C=h.length;N<C;N++){T=h[N];R=q[N];F=0;for(I=T.length;F<I;F++)P=n(T[F],R[F],_),m?s(P.x,P.y+v[p-1].y,v[p-1].x+D):s(P.x,P.y,u+D)}}if(c){a=0*H;for(F=0;F<B;F++)u=O[F],o(u[2]+a,u[1]+a,u[0]+a,!0);a=H*(p+2*l);for(F=0;F<B;F++)u=O[F],o(u[0]+a,u[1]+a,u[2]+a,!1)}else{for(F=0;F<B;F++)u=O[F],o(u[2],u[1],u[0],!0);for(F=0;F<B;F++)u=O[F],o(u[0]+H*p,u[1]+H*p,u[2]+H*p,!1)}u=0;i(d,u);u+=d.length;N=0;for(C=h.length;N<C;N++)T=h[N],i(T,u),u+=T.length};THREE.ExtrudeGeometry.WorldUVGenerator={generateTopUV:function(e,t,n,r,i,s){t=e.vertices[i].x;i=e.vertices[i].y;n=e.vertices[s].x;s=e.vertices[s].y;return[new THREE.Vector2(e.vertices[r].x,e.vertices[r].y),new THREE.Vector2(t,i),new THREE.Vector2(n,s)]},generateBottomUV:function(e,t,n,r,i,s){return this.generateTopUV(e,t,n,r,i,s)},generateSideWallUV:function(e,t,n,r,i,s,o,u){var t=e.vertices[i].x,n=e.vertices[i].y,i=e.vertices[i].z,r=e.vertices[s].x,a=e.vertices[s].y,s=e.vertices[s].z,f=e.vertices[o].x,l=e.vertices[o].y,o=e.vertices[o].z,c=e.vertices[u].x,h=e.vertices[u].y,e=e.vertices[u].z;return.01>Math.abs(n-a)?[new THREE.Vector2(t,1-i),new THREE.Vector2(r,1-s),new THREE.Vector2(f,1-o),new THREE.Vector2(c,1-e)]:[new THREE.Vector2(n,1-i),new THREE.Vector2(a,1-s),new THREE.Vector2(l,1-o),new THREE.Vector2(h,1-e)]}};THREE.ExtrudeGeometry.__v1=new THREE.Vector2;THREE.ExtrudeGeometry.__v2=new THREE.Vector2;THREE.ExtrudeGeometry.__v3=new THREE.Vector2;THREE.ExtrudeGeometry.__v4=new THREE.Vector2;THREE.ExtrudeGeometry.__v5=new THREE.Vector2;THREE.ExtrudeGeometry.__v6=new THREE.Vector2;THREE.ShapeGeometry=function(e,t){THREE.Geometry.call(this);!1===e instanceof Array&&(e=[e]);this.shapebb=e[e.length-1].getBoundingBox();this.addShapeList(e,t);this.computeCentroids();this.computeFaceNormals()};THREE.ShapeGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.ShapeGeometry.prototype.addShapeList=function(e,t){for(var n=0,r=e.length;n<r;n++)this.addShape(e[n],t);return this};THREE.ShapeGeometry.prototype.addShape=function(e,t){void 0===t&&(t={});var n=t.material,r=void 0===t.UVGenerator?THREE.ExtrudeGeometry.WorldUVGenerator:t.UVGenerator,i,s,o,u=this.vertices.length;i=e.extractPoints(void 0!==t.curveSegments?t.curveSegments:12);var a=i.shape,f=i.holes;if(!THREE.Shape.Utils.isClockWise(a)){a=a.reverse();i=0;for(s=f.length;i<s;i++)o=f[i],THREE.Shape.Utils.isClockWise(o)&&(f[i]=o.reverse())}var l=THREE.Shape.Utils.triangulateShape(a,f);i=0;for(s=f.length;i<s;i++)o=f[i],a=a.concat(o);f=a.length;s=l.length;for(i=0;i<f;i++)o=a[i],this.vertices.push(new THREE.Vector3(o.x,o.y,0));for(i=0;i<s;i++)f=l[i],a=f[0]+u,o=f[1]+u,f=f[2]+u,this.faces.push(new THREE.Face3(a,o,f,null,null,n)),this.faceVertexUvs[0].push(r.generateBottomUV(this,e,t,a,o,f))};THREE.LatheGeometry=function(e,t,n,r){THREE.Geometry.call(this);for(var t=t||12,n=n||0,r=r||2*Math.PI,i=1/(e.length-1),s=1/t,o=0,u=t;o<=u;o++)for(var a=n+o*s*r,f=Math.cos(a),l=Math.sin(a),a=0,c=e.length;a<c;a++){var h=e[a],p=new THREE.Vector3;p.x=f*h.x-l*h.y;p.y=l*h.x+f*h.y;p.z=h.z;this.vertices.push(p)}n=e.length;o=0;for(u=t;o<u;o++){a=0;for(c=e.length-1;a<c;a++){var t=l=a+n*o,r=l+n,f=l+1+n,l=l+1,h=o*s,p=a*i,d=h+s,v=p+i;this.faces.push(new THREE.Face3(t,r,l));this.faceVertexUvs[0].push([new THREE.Vector2(h,p),new THREE.Vector2(d,p),new THREE.Vector2(h,v)]);this.faces.push(new THREE.Face3(r,f,l));this.faceVertexUvs[0].push([new THREE.Vector2(d,p),new THREE.Vector2(d,v),new THREE.Vector2(h,v)])}}this.mergeVertices();this.computeCentroids();this.computeFaceNormals();this.computeVertexNormals()};THREE.LatheGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.PlaneGeometry=function(e,t,n,r){THREE.Geometry.call(this);this.width=e;this.height=t;this.widthSegments=n||1;this.heightSegments=r||1;for(var i=e/2,s=t/2,n=this.widthSegments,r=this.heightSegments,o=n+1,u=r+1,a=this.width/n,f=this.height/r,l=new THREE.Vector3(0,0,1),e=0;e<u;e++)for(t=0;t<o;t++)this.vertices.push(new THREE.Vector3(t*a-i,-(e*f-s),0));for(e=0;e<r;e++)for(t=0;t<n;t++){var c=t+o*e,i=t+o*(e+1),s=t+1+o*(e+1),u=t+1+o*e,a=new THREE.Vector2(t/n,1-e/r),f=new THREE.Vector2(t/n,1-(e+1)/r),h=new THREE.Vector2((t+1)/n,1-(e+1)/r),p=new THREE.Vector2((t+1)/n,1-e/r),c=new THREE.Face3(c,i,u);c.normal.copy(l);c.vertexNormals.push(l.clone(),l.clone(),l.clone());this.faces.push(c);this.faceVertexUvs[0].push([a,f,p]);c=new THREE.Face3(i,s,u);c.normal.copy(l);c.vertexNormals.push(l.clone(),l.clone(),l.clone());this.faces.push(c);this.faceVertexUvs[0].push([f.clone(),h,p.clone()])}this.computeCentroids()};THREE.PlaneGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.RingGeometry=function(e,t,n,r,i,s){THREE.Geometry.call(this);for(var e=e||0,t=t||50,i=void 0!==i?i:0,s=void 0!==s?s:2*Math.PI,n=void 0!==n?Math.max(3,n):8,r=void 0!==r?Math.max(3,r):8,o,u=[],a=e,f=(t-e)/r,e=0;e<=r;e++){for(o=0;o<=n;o++){var l=new THREE.Vector3,c=i+o/n*s;l.x=a*Math.cos(c);l.y=a*Math.sin(c);this.vertices.push(l);u.push(new THREE.Vector2((l.x/t+1)/2,(l.y/t+1)/2))}a+=f}t=new THREE.Vector3(0,0,1);for(e=0;e<r;e++){i=e*n;for(o=0;o<=n;o++)c=o+i,s=c+e,f=c+n+e,l=c+n+1+e,this.faces.push(new THREE.Face3(s,f,l,[t.clone(),t.clone(),t.clone()])),this.faceVertexUvs[0].push([u[s].clone(),u[f].clone(),u[l].clone()]),s=c+e,f=c+n+1+e,l=c+1+e,this.faces.push(new THREE.Face3(s,f,l,[t.clone(),t.clone(),t.clone()])),this.faceVertexUvs[0].push([u[s].clone(),u[f].clone(),u[l].clone()])}this.computeCentroids();this.computeFaceNormals();this.boundingSphere=new THREE.Sphere(new THREE.Vector3,a)};THREE.RingGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.SphereGeometry=function(e,t,n,r,i,s,o){THREE.Geometry.call(this);this.radius=e=e||50;this.widthSegments=t=Math.max(3,Math.floor(t)||8);this.heightSegments=n=Math.max(2,Math.floor(n)||6);this.phiStart=r=void 0!==r?r:0;this.phiLength=i=void 0!==i?i:2*Math.PI;this.thetaStart=s=void 0!==s?s:0;this.thetaLength=o=void 0!==o?o:Math.PI;var u,a,f=[],l=[];for(a=0;a<=n;a++){var c=[],h=[];for(u=0;u<=t;u++){var p=u/t,d=a/n,v=new THREE.Vector3;v.x=-e*Math.cos(r+p*i)*Math.sin(s+d*o);v.y=e*Math.cos(s+d*o);v.z=e*Math.sin(r+p*i)*Math.sin(s+d*o);this.vertices.push(v);c.push(this.vertices.length-1);h.push(new THREE.Vector2(p,1-d))}f.push(c);l.push(h)}for(a=0;a<this.heightSegments;a++)for(u=0;u<this.widthSegments;u++){var t=f[a][u+1],n=f[a][u],r=f[a+1][u],i=f[a+1][u+1],s=this.vertices[t].clone().normalize(),o=this.vertices[n].clone().normalize(),c=this.vertices[r].clone().normalize(),h=this.vertices[i].clone().normalize(),p=l[a][u+1].clone(),d=l[a][u].clone(),v=l[a+1][u].clone(),m=l[a+1][u+1].clone();Math.abs(this.vertices[t].y)===this.radius?(p.x=(p.x+d.x)/2,this.faces.push(new THREE.Face3(t,r,i,[s,c,h])),this.faceVertexUvs[0].push([p,v,m])):Math.abs(this.vertices[r].y)===this.radius?(v.x=(v.x+m.x)/2,this.faces.push(new THREE.Face3(t,n,r,[s,o,c])),this.faceVertexUvs[0].push([p,d,v])):(this.faces.push(new THREE.Face3(t,n,i,[s,o,h])),this.faceVertexUvs[0].push([p,d,m]),this.faces.push(new THREE.Face3(n,r,i,[o.clone(),c,h.clone()])),this.faceVertexUvs[0].push([d.clone(),v,m.clone()]))}this.computeCentroids();this.computeFaceNormals();this.boundingSphere=new THREE.Sphere(new THREE.Vector3,e)};THREE.SphereGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.TextGeometry=function(e,t){var t=t||{},n=THREE.FontUtils.generateShapes(e,t);t.amount=void 0!==t.height?t.height:50;void 0===t.bevelThickness&&(t.bevelThickness=10);void 0===t.bevelSize&&(t.bevelSize=8);void 0===t.bevelEnabled&&(t.bevelEnabled=!1);THREE.ExtrudeGeometry.call(this,n,t)};THREE.TextGeometry.prototype=Object.create(THREE.ExtrudeGeometry.prototype);THREE.TorusGeometry=function(e,t,n,r,i){THREE.Geometry.call(this);this.radius=e||100;this.tube=t||40;this.radialSegments=n||8;this.tubularSegments=r||6;this.arc=i||2*Math.PI;i=new THREE.Vector3;e=[];t=[];for(n=0;n<=this.radialSegments;n++)for(r=0;r<=this.tubularSegments;r++){var s=r/this.tubularSegments*this.arc,o=2*n/this.radialSegments*Math.PI;i.x=this.radius*Math.cos(s);i.y=this.radius*Math.sin(s);var u=new THREE.Vector3;u.x=(this.radius+this.tube*Math.cos(o))*Math.cos(s);u.y=(this.radius+this.tube*Math.cos(o))*Math.sin(s);u.z=this.tube*Math.sin(o);this.vertices.push(u);e.push(new THREE.Vector2(r/this.tubularSegments,n/this.radialSegments));t.push(u.clone().sub(i).normalize())}for(n=1;n<=this.radialSegments;n++)for(r=1;r<=this.tubularSegments;r++){var i=(this.tubularSegments+1)*n+r-1,s=(this.tubularSegments+1)*(n-1)+r-1,o=(this.tubularSegments+1)*(n-1)+r,u=(this.tubularSegments+1)*n+r,a=new THREE.Face3(i,s,u,[t[i],t[s],t[u]]);a.normal.add(t[i]);a.normal.add(t[s]);a.normal.add(t[u]);a.normal.normalize();this.faces.push(a);this.faceVertexUvs[0].push([e[i].clone(),e[s].clone(),e[u].clone()]);a=new THREE.Face3(s,o,u,[t[s],t[o],t[u]]);a.normal.add(t[s]);a.normal.add(t[o]);a.normal.add(t[u]);a.normal.normalize();this.faces.push(a);this.faceVertexUvs[0].push([e[s].clone(),e[o].clone(),e[u].clone()])}this.computeCentroids()};THREE.TorusGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.TorusKnotGeometry=function(e,t,n,r,i,s,o){function u(e,t,n,r,i){var s=Math.cos(e),o=Math.sin(e),e=t/n*e,t=Math.cos(e),s=.5*r*(2+t)*s,o=.5*r*(2+t)*o,r=.5*i*r*Math.sin(e);return new THREE.Vector3(s,o,r)}THREE.Geometry.call(this);this.radius=e||100;this.tube=t||40;this.radialSegments=n||64;this.tubularSegments=r||8;this.p=i||2;this.q=s||3;this.heightScale=o||1;this.grid=Array(this.radialSegments);n=new THREE.Vector3;r=new THREE.Vector3;i=new THREE.Vector3;for(e=0;e<this.radialSegments;++e){this.grid[e]=Array(this.tubularSegments);t=2*(e/this.radialSegments)*this.p*Math.PI;s=u(t,this.q,this.p,this.radius,this.heightScale);t=u(t+.01,this.q,this.p,this.radius,this.heightScale);n.subVectors(t,s);r.addVectors(t,s);i.crossVectors(n,r);r.crossVectors(i,n);i.normalize();r.normalize();for(t=0;t<this.tubularSegments;++t){var a=2*(t/this.tubularSegments)*Math.PI,o=-this.tube*Math.cos(a),a=this.tube*Math.sin(a),f=new THREE.Vector3;f.x=s.x+o*r.x+a*i.x;f.y=s.y+o*r.y+a*i.y;f.z=s.z+o*r.z+a*i.z;this.grid[e][t]=this.vertices.push(f)-1}}for(e=0;e<this.radialSegments;++e)for(t=0;t<this.tubularSegments;++t){var i=(e+1)%this.radialSegments,s=(t+1)%this.tubularSegments,n=this.grid[e][t],r=this.grid[i][t],i=this.grid[i][s],s=this.grid[e][s],o=new THREE.Vector2(e/this.radialSegments,t/this.tubularSegments),a=new THREE.Vector2((e+1)/this.radialSegments,t/this.tubularSegments),f=new THREE.Vector2((e+1)/this.radialSegments,(t+1)/this.tubularSegments),l=new THREE.Vector2(e/this.radialSegments,(t+1)/this.tubularSegments);this.faces.push(new THREE.Face3(n,r,s));this.faceVertexUvs[0].push([o,a,l]);this.faces.push(new THREE.Face3(r,i,s));this.faceVertexUvs[0].push([a.clone(),f,l.clone()])}this.computeCentroids();this.computeFaceNormals();this.computeVertexNormals()};THREE.TorusKnotGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.TubeGeometry=function(e,t,n,r,i){THREE.Geometry.call(this);this.path=e;this.segments=t||64;this.radius=n||1;this.radialSegments=r||8;this.closed=i||!1;this.grid=[];var s,o,r=this.segments+1,u,a,f,i=new THREE.Vector3,l,c,t=new THREE.TubeGeometry.FrenetFrames(this.path,this.segments,this.closed);l=t.normals;c=t.binormals;this.tangents=t.tangents;this.normals=l;this.binormals=c;for(t=0;t<r;t++){this.grid[t]=[];n=t/(r-1);f=e.getPointAt(n);s=l[t];o=c[t];for(n=0;n<this.radialSegments;n++)u=2*(n/this.radialSegments)*Math.PI,a=-this.radius*Math.cos(u),u=this.radius*Math.sin(u),i.copy(f),i.x+=a*s.x+u*o.x,i.y+=a*s.y+u*o.y,i.z+=a*s.z+u*o.z,this.grid[t][n]=this.vertices.push(new THREE.Vector3(i.x,i.y,i.z))-1}for(t=0;t<this.segments;t++)for(n=0;n<this.radialSegments;n++)i=this.closed?(t+1)%this.segments:t+1,l=(n+1)%this.radialSegments,e=this.grid[t][n],r=this.grid[i][n],i=this.grid[i][l],l=this.grid[t][l],c=new THREE.Vector2(t/this.segments,n/this.radialSegments),s=new THREE.Vector2((t+1)/this.segments,n/this.radialSegments),o=new THREE.Vector2((t+1)/this.segments,(n+1)/this.radialSegments),a=new THREE.Vector2(t/this.segments,(n+1)/this.radialSegments),this.faces.push(new THREE.Face3(e,r,l)),this.faceVertexUvs[0].push([c,s,a]),this.faces.push(new THREE.Face3(r,i,l)),this.faceVertexUvs[0].push([s.clone(),o,a.clone()]);this.computeCentroids();this.computeFaceNormals();this.computeVertexNormals()};THREE.TubeGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.TubeGeometry.FrenetFrames=function(e,t,n){new THREE.Vector3;var r=new THREE.Vector3;new THREE.Vector3;var i=[],s=[],o=[],u=new THREE.Vector3,a=new THREE.Matrix4,t=t+1,f,l,c;this.tangents=i;this.normals=s;this.binormals=o;for(f=0;f<t;f++)l=f/(t-1),i[f]=e.getTangentAt(l),i[f].normalize();s[0]=new THREE.Vector3;o[0]=new THREE.Vector3;e=Number.MAX_VALUE;f=Math.abs(i[0].x);l=Math.abs(i[0].y);c=Math.abs(i[0].z);f<=e&&(e=f,r.set(1,0,0));l<=e&&(e=l,r.set(0,1,0));c<=e&&r.set(0,0,1);u.crossVectors(i[0],r).normalize();s[0].crossVectors(i[0],u);o[0].crossVectors(i[0],s[0]);for(f=1;f<t;f++)s[f]=s[f-1].clone(),o[f]=o[f-1].clone(),u.crossVectors(i[f-1],i[f]),1e-4<u.length()&&(u.normalize(),r=Math.acos(THREE.Math.clamp(i[f-1].dot(i[f]),-1,1)),s[f].applyMatrix4(a.makeRotationAxis(u,r))),o[f].crossVectors(i[f],s[f]);if(n){r=Math.acos(THREE.Math.clamp(s[0].dot(s[t-1]),-1,1));r/=t-1;0<i[0].dot(u.crossVectors(s[0],s[t-1]))&&(r=-r);for(f=1;f<t;f++)s[f].applyMatrix4(a.makeRotationAxis(i[f],r*f)),o[f].crossVectors(i[f],s[f])}};THREE.PolyhedronGeometry=function(e,t,n,r){function i(e){var t=e.normalize().clone();t.index=u.vertices.push(t)-1;var n=Math.atan2(e.z,-e.x)/2/Math.PI+.5,e=Math.atan2(-e.y,Math.sqrt(e.x*e.x+e.z*e.z))/Math.PI+.5;t.uv=new THREE.Vector2(n,1-e);return t}function s(e,t,n){var r=new THREE.Face3(e.index,t.index,n.index,[e.clone(),t.clone(),n.clone()]);r.centroid.add(e).add(t).add(n).divideScalar(3);u.faces.push(r);r=Math.atan2(r.centroid.z,-r.centroid.x);u.faceVertexUvs[0].push([o(e.uv,e,r),o(t.uv,t,r),o(n.uv,n,r)])}function o(e,t,n){0>n&&1===e.x&&(e=new THREE.Vector2(e.x-1,e.y));0===t.x&&0===t.z&&(e=new THREE.Vector2(n/2/Math.PI+.5,e.y));return e.clone()}THREE.Geometry.call(this);for(var n=n||1,r=r||0,u=this,a=0,f=e.length;a<f;a++)i(new THREE.Vector3(e[a][0],e[a][1],e[a][2]));for(var l=this.vertices,e=[],a=0,f=t.length;a<f;a++){var c=l[t[a][0]],h=l[t[a][1]],p=l[t[a][2]];e[a]=new THREE.Face3(c.index,h.index,p.index,[c.clone(),h.clone(),p.clone()])}a=0;for(f=e.length;a<f;a++){h=e[a];l=r;t=Math.pow(2,l);Math.pow(4,l);for(var l=i(u.vertices[h.a]),c=i(u.vertices[h.b]),d=i(u.vertices[h.c]),h=[],p=0;p<=t;p++){h[p]=[];for(var v=i(l.clone().lerp(d,p/t)),m=i(c.clone().lerp(d,p/t)),g=t-p,y=0;y<=g;y++)h[p][y]=0==y&&p==t?v:i(v.clone().lerp(m,y/g))}for(p=0;p<t;p++)for(y=0;y<2*(t-p)-1;y++)l=Math.floor(y/2),0==y%2?s(h[p][l+1],h[p+1][l],h[p][l]):s(h[p][l+1],h[p+1][l+1],h[p+1][l])}a=0;for(f=this.faceVertexUvs[0].length;a<f;a++)r=this.faceVertexUvs[0][a],e=r[0].x,t=r[1].x,l=r[2].x,c=Math.max(e,Math.max(t,l)),h=Math.min(e,Math.min(t,l)),.9<c&&.1>h&&(.2>e&&(r[0].x+=1),.2>t&&(r[1].x+=1),.2>l&&(r[2].x+=1));a=0;for(f=this.vertices.length;a<f;a++)this.vertices[a].multiplyScalar(n);this.mergeVertices();this.computeCentroids();this.computeFaceNormals();this.boundingSphere=new THREE.Sphere(new THREE.Vector3,n)};THREE.PolyhedronGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.IcosahedronGeometry=function(e,t){this.radius=e;this.detail=t;var n=(1+Math.sqrt(5))/2;THREE.PolyhedronGeometry.call(this,[[-1,n,0],[1,n,0],[-1,-n,0],[1,-n,0],[0,-1,n],[0,1,n],[0,-1,-n],[0,1,-n],[n,0,-1],[n,0,1],[-n,0,-1],[-n,0,1]],[[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]],e,t)};THREE.IcosahedronGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.OctahedronGeometry=function(e,t){THREE.PolyhedronGeometry.call(this,[[1,0,0],[-1,0,0],[0,1,0],[0,-1,0],[0,0,1],[0,0,-1]],[[0,2,4],[0,4,3],[0,3,5],[0,5,2],[1,2,5],[1,5,3],[1,3,4],[1,4,2]],e,t)};THREE.OctahedronGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.TetrahedronGeometry=function(e,t){THREE.PolyhedronGeometry.call(this,[[1,1,1],[-1,-1,1],[-1,1,-1],[1,-1,-1]],[[2,1,0],[0,3,2],[1,3,0],[2,3,1]],e,t)};THREE.TetrahedronGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.ParametricGeometry=function(e,t,n){THREE.Geometry.call(this);var r=this.vertices,i=this.faces,s=this.faceVertexUvs[0],o,u,a,f,l=t+1;for(o=0;o<=n;o++){f=o/n;for(u=0;u<=t;u++)a=u/t,a=e(a,f),r.push(a)}var c,h,p,d;for(o=0;o<n;o++)for(u=0;u<t;u++)e=o*l+u,r=o*l+u+1,f=(o+1)*l+u+1,a=(o+1)*l+u,c=new THREE.Vector2(u/t,o/n),h=new THREE.Vector2((u+1)/t,o/n),p=new THREE.Vector2((u+1)/t,(o+1)/n),d=new THREE.Vector2(u/t,(o+1)/n),i.push(new THREE.Face3(e,r,a)),s.push([c,h,d]),i.push(new THREE.Face3(r,f,a)),s.push([h.clone(),p,d.clone()]);this.computeCentroids();this.computeFaceNormals();this.computeVertexNormals()};THREE.ParametricGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.AxisHelper=function(e){var e=e||1,t=new THREE.Geometry;t.vertices.push(new THREE.Vector3,new THREE.Vector3(e,0,0),new THREE.Vector3,new THREE.Vector3(0,e,0),new THREE.Vector3,new THREE.Vector3(0,0,e));t.colors.push(new THREE.Color(16711680),new THREE.Color(16755200),new THREE.Color(65280),new THREE.Color(11206400),new THREE.Color(255),new THREE.Color(43775));e=new THREE.LineBasicMaterial({vertexColors:THREE.VertexColors});THREE.Line.call(this,t,e,THREE.LinePieces)};THREE.AxisHelper.prototype=Object.create(THREE.Line.prototype);THREE.ArrowHelper=function(e,t,n,r,i,s){THREE.Object3D.call(this);void 0===r&&(r=16776960);void 0===n&&(n=1);void 0===i&&(i=.2*n);void 0===s&&(s=.2*i);this.position=t;t=new THREE.Geometry;t.vertices.push(new THREE.Vector3(0,0,0));t.vertices.push(new THREE.Vector3(0,1,0));this.line=new THREE.Line(t,new THREE.LineBasicMaterial({color:r}));this.line.matrixAutoUpdate=!1;this.add(this.line);t=new THREE.CylinderGeometry(0,.5,1,5,1);t.applyMatrix((new THREE.Matrix4).makeTranslation(0,-.5,0));this.cone=new THREE.Mesh(t,new THREE.MeshBasicMaterial({color:r}));this.cone.matrixAutoUpdate=!1;this.add(this.cone);this.setDirection(e);this.setLength(n,i,s)};THREE.ArrowHelper.prototype=Object.create(THREE.Object3D.prototype);THREE.ArrowHelper.prototype.setDirection=function(){var e=new THREE.Vector3,t;return function(n){.99999<n.y?this.quaternion.set(0,0,0,1):-.99999>n.y?this.quaternion.set(1,0,0,0):(e.set(n.z,0,-n.x).normalize(),t=Math.acos(n.y),this.quaternion.setFromAxisAngle(e,t))}}();THREE.ArrowHelper.prototype.setLength=function(e,t,n){void 0===t&&(t=.2*e);void 0===n&&(n=.2*t);this.line.scale.set(1,e,1);this.line.updateMatrix();this.cone.scale.set(n,t,n);this.cone.position.y=e;this.cone.updateMatrix()};THREE.ArrowHelper.prototype.setColor=function(e){this.line.material.color.setHex(e);this.cone.material.color.setHex(e)};THREE.BoxHelper=function(e){var t=[new THREE.Vector3(1,1,1),new THREE.Vector3(-1,1,1),new THREE.Vector3(-1,-1,1),new THREE.Vector3(1,-1,1),new THREE.Vector3(1,1,-1),new THREE.Vector3(-1,1,-1),new THREE.Vector3(-1,-1,-1),new THREE.Vector3(1,-1,-1)];this.vertices=t;var n=new THREE.Geometry;n.vertices.push(t[0],t[1],t[1],t[2],t[2],t[3],t[3],t[0],t[4],t[5],t[5],t[6],t[6],t[7],t[7],t[4],t[0],t[4],t[1],t[5],t[2],t[6],t[3],t[7]);THREE.Line.call(this,n,new THREE.LineBasicMaterial({color:16776960}),THREE.LinePieces);void 0!==e&&this.update(e)};THREE.BoxHelper.prototype=Object.create(THREE.Line.prototype);THREE.BoxHelper.prototype.update=function(e){var t=e.geometry;null===t.boundingBox&&t.computeBoundingBox();var n=t.boundingBox.min,t=t.boundingBox.max,r=this.vertices;r[0].set(t.x,t.y,t.z);r[1].set(n.x,t.y,t.z);r[2].set(n.x,n.y,t.z);r[3].set(t.x,n.y,t.z);r[4].set(t.x,t.y,n.z);r[5].set(n.x,t.y,n.z);r[6].set(n.x,n.y,n.z);r[7].set(t.x,n.y,n.z);this.geometry.computeBoundingSphere();this.geometry.verticesNeedUpdate=!0;this.matrixAutoUpdate=!1;this.matrixWorld=e.matrixWorld};THREE.BoundingBoxHelper=function(e,t){var n=t||8947848;this.object=e;this.box=new THREE.Box3;THREE.Mesh.call(this,new THREE.CubeGeometry(1,1,1),new THREE.MeshBasicMaterial({color:n,wireframe:!0}))};THREE.BoundingBoxHelper.prototype=Object.create(THREE.Mesh.prototype);THREE.BoundingBoxHelper.prototype.update=function(){this.box.setFromObject(this.object);this.box.size(this.scale);this.box.center(this.position)};THREE.CameraHelper=function(e){function t(e,t,r){n(e,r);n(t,r)}function n(e,t){r.vertices.push(new THREE.Vector3);r.colors.push(new THREE.Color(t));void 0===s[e]&&(s[e]=[]);s[e].push(r.vertices.length-1)}var r=new THREE.Geometry,i=new THREE.LineBasicMaterial({color:16777215,vertexColors:THREE.FaceColors}),s={};t(\"n1\",\"n2\",16755200);t(\"n2\",\"n4\",16755200);t(\"n4\",\"n3\",16755200);t(\"n3\",\"n1\",16755200);t(\"f1\",\"f2\",16755200);t(\"f2\",\"f4\",16755200);t(\"f4\",\"f3\",16755200);t(\"f3\",\"f1\",16755200);t(\"n1\",\"f1\",16755200);t(\"n2\",\"f2\",16755200);t(\"n3\",\"f3\",16755200);t(\"n4\",\"f4\",16755200);t(\"p\",\"n1\",16711680);t(\"p\",\"n2\",16711680);t(\"p\",\"n3\",16711680);t(\"p\",\"n4\",16711680);t(\"u1\",\"u2\",43775);t(\"u2\",\"u3\",43775);t(\"u3\",\"u1\",43775);t(\"c\",\"t\",16777215);t(\"p\",\"c\",3355443);t(\"cn1\",\"cn2\",3355443);t(\"cn3\",\"cn4\",3355443);t(\"cf1\",\"cf2\",3355443);t(\"cf3\",\"cf4\",3355443);THREE.Line.call(this,r,i,THREE.LinePieces);this.camera=e;this.matrixWorld=e.matrixWorld;this.matrixAutoUpdate=!1;this.pointMap=s;this.update()};THREE.CameraHelper.prototype=Object.create(THREE.Line.prototype);THREE.CameraHelper.prototype.update=function(){var e=new THREE.Vector3,t=new THREE.Camera,n=new THREE.Projector;return function(){function r(r,s,o,u){e.set(s,o,u);n.unprojectVector(e,t);r=i.pointMap[r];if(void 0!==r){s=0;for(o=r.length;s<o;s++)i.geometry.vertices[r[s]].copy(e)}}var i=this;t.projectionMatrix.copy(this.camera.projectionMatrix);r(\"c\",0,0,-1);r(\"t\",0,0,1);r(\"n1\",-1,-1,-1);r(\"n2\",1,-1,-1);r(\"n3\",-1,1,-1);r(\"n4\",1,1,-1);r(\"f1\",-1,-1,1);r(\"f2\",1,-1,1);r(\"f3\",-1,1,1);r(\"f4\",1,1,1);r(\"u1\",.7,1.1,-1);r(\"u2\",-.7,1.1,-1);r(\"u3\",0,2,-1);r(\"cf1\",-1,0,1);r(\"cf2\",1,0,1);r(\"cf3\",0,-1,1);r(\"cf4\",0,1,1);r(\"cn1\",-1,0,-1);r(\"cn2\",1,0,-1);r(\"cn3\",0,-1,-1);r(\"cn4\",0,1,-1);this.geometry.verticesNeedUpdate=!0}}();THREE.DirectionalLightHelper=function(e,t){THREE.Object3D.call(this);this.light=e;this.light.updateMatrixWorld();this.matrixWorld=e.matrixWorld;this.matrixAutoUpdate=!1;var t=t||1,n=new THREE.PlaneGeometry(t,t),r=new THREE.MeshBasicMaterial({wireframe:!0,fog:!1});r.color.copy(this.light.color).multiplyScalar(this.light.intensity);this.lightPlane=new THREE.Mesh(n,r);this.add(this.lightPlane);n=new THREE.Geometry;n.vertices.push(new THREE.Vector3);n.vertices.push(new THREE.Vector3);r=new THREE.LineBasicMaterial({fog:!1});r.color.copy(this.light.color).multiplyScalar(this.light.intensity);this.targetLine=new THREE.Line(n,r);this.add(this.targetLine);this.update()};THREE.DirectionalLightHelper.prototype=Object.create(THREE.Object3D.prototype);THREE.DirectionalLightHelper.prototype.dispose=function(){this.lightPlane.geometry.dispose();this.lightPlane.material.dispose();this.targetLine.geometry.dispose();this.targetLine.material.dispose()};THREE.DirectionalLightHelper.prototype.update=function(){var e=new THREE.Vector3,t=new THREE.Vector3,n=new THREE.Vector3;return function(){e.setFromMatrixPosition(this.light.matrixWorld);t.setFromMatrixPosition(this.light.target.matrixWorld);n.subVectors(t,e);this.lightPlane.lookAt(n);this.lightPlane.material.color.copy(this.light.color).multiplyScalar(this.light.intensity);this.targetLine.geometry.vertices[1].copy(n);this.targetLine.geometry.verticesNeedUpdate=!0;this.targetLine.material.color.copy(this.lightPlane.material.color)}}();THREE.FaceNormalsHelper=function(e,t,n,r){this.object=e;this.size=t||1;for(var e=n||16776960,r=r||1,t=new THREE.Geometry,n=0,i=this.object.geometry.faces.length;n<i;n++)t.vertices.push(new THREE.Vector3),t.vertices.push(new THREE.Vector3);THREE.Line.call(this,t,new THREE.LineBasicMaterial({color:e,linewidth:r}),THREE.LinePieces);this.matrixAutoUpdate=!1;this.normalMatrix=new THREE.Matrix3;this.update()};THREE.FaceNormalsHelper.prototype=Object.create(THREE.Line.prototype);THREE.FaceNormalsHelper.prototype.update=function(){var e=new THREE.Vector3;return function(){this.object.updateMatrixWorld(!0);this.normalMatrix.getNormalMatrix(this.object.matrixWorld);for(var t=this.geometry.vertices,n=this.object.geometry.faces,r=this.object.matrixWorld,i=0,s=n.length;i<s;i++){var o=n[i];e.copy(o.normal).applyMatrix3(this.normalMatrix).normalize().multiplyScalar(this.size);var u=2*i;t[u].copy(o.centroid).applyMatrix4(r);t[u+1].addVectors(t[u],e)}this.geometry.verticesNeedUpdate=!0;return this}}();THREE.GridHelper=function(e,t){var n=new THREE.Geometry,r=new THREE.LineBasicMaterial({vertexColors:THREE.VertexColors});this.color1=new THREE.Color(4473924);this.color2=new THREE.Color(8947848);for(var i=-e;i<=e;i+=t){n.vertices.push(new THREE.Vector3(-e,0,i),new THREE.Vector3(e,0,i),new THREE.Vector3(i,0,-e),new THREE.Vector3(i,0,e));var s=0===i?this.color1:this.color2;n.colors.push(s,s,s,s)}THREE.Line.call(this,n,r,THREE.LinePieces)};THREE.GridHelper.prototype=Object.create(THREE.Line.prototype);THREE.GridHelper.prototype.setColors=function(e,t){this.color1.set(e);this.color2.set(t);this.geometry.colorsNeedUpdate=!0};THREE.HemisphereLightHelper=function(e,t){THREE.Object3D.call(this);this.light=e;this.light.updateMatrixWorld();this.matrixWorld=e.matrixWorld;this.matrixAutoUpdate=!1;this.colors=[new THREE.Color,new THREE.Color];var n=new THREE.SphereGeometry(t,4,2);n.applyMatrix((new THREE.Matrix4).makeRotationX(-Math.PI/2));for(var r=0;8>r;r++)n.faces[r].color=this.colors[4>r?0:1];r=new THREE.MeshBasicMaterial({vertexColors:THREE.FaceColors,wireframe:!0});this.lightSphere=new THREE.Mesh(n,r);this.add(this.lightSphere);this.update()};THREE.HemisphereLightHelper.prototype=Object.create(THREE.Object3D.prototype);THREE.HemisphereLightHelper.prototype.dispose=function(){this.lightSphere.geometry.dispose();this.lightSphere.material.dispose()};THREE.HemisphereLightHelper.prototype.update=function(){var e=new THREE.Vector3;return function(){this.colors[0].copy(this.light.color).multiplyScalar(this.light.intensity);this.colors[1].copy(this.light.groundColor).multiplyScalar(this.light.intensity);this.lightSphere.lookAt(e.setFromMatrixPosition(this.light.matrixWorld).negate());this.lightSphere.geometry.colorsNeedUpdate=!0}}();THREE.PointLightHelper=function(e,t){this.light=e;this.light.updateMatrixWorld();var n=new THREE.SphereGeometry(t,4,2),r=new THREE.MeshBasicMaterial({wireframe:!0,fog:!1});r.color.copy(this.light.color).multiplyScalar(this.light.intensity);THREE.Mesh.call(this,n,r);this.matrixWorld=this.light.matrixWorld;this.matrixAutoUpdate=!1};THREE.PointLightHelper.prototype=Object.create(THREE.Mesh.prototype);THREE.PointLightHelper.prototype.dispose=function(){this.geometry.dispose();this.material.dispose()};THREE.PointLightHelper.prototype.update=function(){this.material.color.copy(this.light.color).multiplyScalar(this.light.intensity)};THREE.SpotLightHelper=function(e){THREE.Object3D.call(this);this.light=e;this.light.updateMatrixWorld();this.matrixWorld=e.matrixWorld;this.matrixAutoUpdate=!1;e=new THREE.CylinderGeometry(0,1,1,8,1,!0);e.applyMatrix((new THREE.Matrix4).makeTranslation(0,-.5,0));e.applyMatrix((new THREE.Matrix4).makeRotationX(-Math.PI/2));var t=new THREE.MeshBasicMaterial({wireframe:!0,fog:!1});this.cone=new THREE.Mesh(e,t);this.add(this.cone);this.update()};THREE.SpotLightHelper.prototype=Object.create(THREE.Object3D.prototype);THREE.SpotLightHelper.prototype.dispose=function(){this.cone.geometry.dispose();this.cone.material.dispose()};THREE.SpotLightHelper.prototype.update=function(){var e=new THREE.Vector3,t=new THREE.Vector3;return function(){var n=this.light.distance?this.light.distance:1e4,r=n*Math.tan(this.light.angle);this.cone.scale.set(r,r,n);e.setFromMatrixPosition(this.light.matrixWorld);t.setFromMatrixPosition(this.light.target.matrixWorld);this.cone.lookAt(t.sub(e));this.cone.material.color.copy(this.light.color).multiplyScalar(this.light.intensity)}}();THREE.VertexNormalsHelper=function(e,t,n,r){this.object=e;this.size=t||1;for(var t=n||16711680,r=r||1,n=new THREE.Geometry,e=e.geometry.faces,i=0,s=e.length;i<s;i++)for(var o=0,u=e[i].vertexNormals.length;o<u;o++)n.vertices.push(new THREE.Vector3),n.vertices.push(new THREE.Vector3);THREE.Line.call(this,n,new THREE.LineBasicMaterial({color:t,linewidth:r}),THREE.LinePieces);this.matrixAutoUpdate=!1;this.normalMatrix=new THREE.Matrix3;this.update()};THREE.VertexNormalsHelper.prototype=Object.create(THREE.Line.prototype);THREE.VertexNormalsHelper.prototype.update=function(){var e=new THREE.Vector3;return function(){var t=[\"a\",\"b\",\"c\",\"d\"];this.object.updateMatrixWorld(!0);this.normalMatrix.getNormalMatrix(this.object.matrixWorld);for(var n=this.geometry.vertices,r=this.object.geometry.vertices,i=this.object.geometry.faces,s=this.object.matrixWorld,o=0,u=0,f=i.length;u<f;u++)for(var l=i[u],c=0,h=l.vertexNormals.length;c<h;c++){var p=l.vertexNormals[c];n[o].copy(r[l[t[c]]]).applyMatrix4(s);e.copy(p).applyMatrix3(this.normalMatrix).normalize().multiplyScalar(this.size);e.add(n[o]);o+=1;n[o].copy(e);o+=1}this.geometry.verticesNeedUpdate=!0;return this}}();THREE.VertexTangentsHelper=function(e,t,n,r){this.object=e;this.size=t||1;for(var t=n||255,r=r||1,n=new THREE.Geometry,e=e.geometry.faces,i=0,s=e.length;i<s;i++)for(var o=0,u=e[i].vertexTangents.length;o<u;o++)n.vertices.push(new THREE.Vector3),n.vertices.push(new THREE.Vector3);THREE.Line.call(this,n,new THREE.LineBasicMaterial({color:t,linewidth:r}),THREE.LinePieces);this.matrixAutoUpdate=!1;this.update()};THREE.VertexTangentsHelper.prototype=Object.create(THREE.Line.prototype);THREE.VertexTangentsHelper.prototype.update=function(){var e=new THREE.Vector3;return function(){var t=[\"a\",\"b\",\"c\",\"d\"];this.object.updateMatrixWorld(!0);for(var n=this.geometry.vertices,r=this.object.geometry.vertices,i=this.object.geometry.faces,s=this.object.matrixWorld,o=0,u=0,f=i.length;u<f;u++)for(var l=i[u],c=0,h=l.vertexTangents.length;c<h;c++){var p=l.vertexTangents[c];n[o].copy(r[l[t[c]]]).applyMatrix4(s);e.copy(p).transformDirection(s).multiplyScalar(this.size);e.add(n[o]);o+=1;n[o].copy(e);o+=1}this.geometry.verticesNeedUpdate=!0;return this}}();THREE.WireframeHelper=function(e){var t=[0,0],n={},r=function(e,t){return e-t},i=[\"a\",\"b\",\"c\",\"d\"],s=new THREE.BufferGeometry,o=0;if(e.geometry instanceof THREE.Geometry){for(var u=e.geometry.vertices,a=e.geometry.faces,f=new Uint32Array(6*a.length),l=0,c=a.length;l<c;l++)for(var h=a[l],p=0;3>p;p++){t[0]=h[i[p]];t[1]=h[i[(p+1)%3]];t.sort(r);var d=t.toString();void 0===n[d]&&(f[2*o]=t[0],f[2*o+1]=t[1],n[d]=!0,o++)}s.addAttribute(\"position\",Float32Array,2*o,3);t=s.attributes.position.array;l=0;for(c=o;l<c;l++)for(p=0;2>p;p++)o=u[f[2*l+p]],i=6*l+3*p,t[i+0]=o.x,t[i+1]=o.y,t[i+2]=o.z}else{u=e.geometry.attributes.position.array;a=e.geometry.attributes.index.array;f=new Uint32Array(2*a.length);l=0;for(c=a.length/3;l<c;l++)for(p=0;3>p;p++)i=3*l,t[0]=a[i+p],t[1]=a[i+(p+1)%3],t.sort(r),d=t.toString(),void 0===n[d]&&(f[2*o]=t[0],f[2*o+1]=t[1],n[d]=!0,o++);s.addAttribute(\"position\",Float32Array,2*o,3);t=s.attributes.position.array;l=0;for(c=o;l<c;l++)for(p=0;2>p;p++)i=6*l+3*p,o=3*f[2*l+p],t[i+0]=u[o],t[i+1]=u[o+1],t[i+2]=u[o+2]}THREE.Line.call(this,s,new THREE.LineBasicMaterial({color:16777215}),THREE.LinePieces);this.matrixAutoUpdate=!1;this.matrixWorld=e.matrixWorld};THREE.WireframeHelper.prototype=Object.create(THREE.Line.prototype);THREE.ImmediateRenderObject=function(){THREE.Object3D.call(this);this.render=function(){}};THREE.ImmediateRenderObject.prototype=Object.create(THREE.Object3D.prototype);THREE.LensFlare=function(e,t,n,r,i){THREE.Object3D.call(this);this.lensFlares=[];this.positionScreen=new THREE.Vector3;this.customUpdateCallback=void 0;void 0!==e&&this.add(e,t,n,r,i)};THREE.LensFlare.prototype=Object.create(THREE.Object3D.prototype);THREE.LensFlare.prototype.add=function(e,t,n,r,i,s){void 0===t&&(t=-1);void 0===n&&(n=0);void 0===s&&(s=1);void 0===i&&(i=new THREE.Color(16777215));void 0===r&&(r=THREE.NormalBlending);n=Math.min(n,Math.max(0,n));this.lensFlares.push({texture:e,size:t,distance:n,x:0,y:0,z:0,scale:1,rotation:1,opacity:s,color:i,blending:r})};THREE.LensFlare.prototype.updateLensFlares=function(){var e,t=this.lensFlares.length,n,r=2*-this.positionScreen.x,i=2*-this.positionScreen.y;for(e=0;e<t;e++)n=this.lensFlares[e],n.x=this.positionScreen.x+r*n.distance,n.y=this.positionScreen.y+i*n.distance,n.wantedRotation=.25*n.x*Math.PI,n.rotation+=.25*(n.wantedRotation-n.rotation)};THREE.MorphBlendMesh=function(e,t){THREE.Mesh.call(this,e,t);this.animationsMap={};this.animationsList=[];var n=this.geometry.morphTargets.length;this.createAnimation(\"__default\",0,n-1,n/1);this.setAnimationWeight(\"__default\",1)};THREE.MorphBlendMesh.prototype=Object.create(THREE.Mesh.prototype);THREE.MorphBlendMesh.prototype.createAnimation=function(e,t,n,r){t={startFrame:t,endFrame:n,length:n-t+1,fps:r,duration:(n-t)/r,lastFrame:0,currentFrame:0,active:!1,time:0,direction:1,weight:1,directionBackwards:!1,mirroredLoop:!1};this.animationsMap[e]=t;this.animationsList.push(t)};THREE.MorphBlendMesh.prototype.autoCreateAnimations=function(e){for(var t=/([a-z]+)(\\d+)/,n,r={},i=this.geometry,s=0,o=i.morphTargets.length;s<o;s++){var u=i.morphTargets[s].name.match(t);if(u&&1<u.length){var a=u[1];r[a]||(r[a]={start:Infinity,end:-Infinity});u=r[a];s<u.start&&(u.start=s);s>u.end&&(u.end=s);n||(n=a)}}for(a in r)u=r[a],this.createAnimation(a,u.start,u.end,e);this.firstAnimation=n};THREE.MorphBlendMesh.prototype.setAnimationDirectionForward=function(e){if(e=this.animationsMap[e])e.direction=1,e.directionBackwards=!1};THREE.MorphBlendMesh.prototype.setAnimationDirectionBackward=function(e){if(e=this.animationsMap[e])e.direction=-1,e.directionBackwards=!0};THREE.MorphBlendMesh.prototype.setAnimationFPS=function(e,t){var n=this.animationsMap[e];n&&(n.fps=t,n.duration=(n.end-n.start)/n.fps)};THREE.MorphBlendMesh.prototype.setAnimationDuration=function(e,t){var n=this.animationsMap[e];n&&(n.duration=t,n.fps=(n.end-n.start)/n.duration)};THREE.MorphBlendMesh.prototype.setAnimationWeight=function(e,t){var n=this.animationsMap[e];n&&(n.weight=t)};THREE.MorphBlendMesh.prototype.setAnimationTime=function(e,t){var n=this.animationsMap[e];n&&(n.time=t)};THREE.MorphBlendMesh.prototype.getAnimationTime=function(e){var t=0;if(e=this.animationsMap[e])t=e.time;return t};THREE.MorphBlendMesh.prototype.getAnimationDuration=function(e){var t=-1;if(e=this.animationsMap[e])t=e.duration;return t};THREE.MorphBlendMesh.prototype.playAnimation=function(e){var t=this.animationsMap[e];t?(t.time=0,t.active=!0):console.warn(\"animation[\"+e+\"] undefined\")};THREE.MorphBlendMesh.prototype.stopAnimation=function(e){if(e=this.animationsMap[e])e.active=!1};THREE.MorphBlendMesh.prototype.update=function(e){for(var t=0,n=this.animationsList.length;t<n;t++){var r=this.animationsList[t];if(r.active){var i=r.duration/r.length;r.time+=r.direction*e;if(r.mirroredLoop){if(r.time>r.duration||0>r.time)r.direction*=-1,r.time>r.duration&&(r.time=r.duration,r.directionBackwards=!0),0>r.time&&(r.time=0,r.directionBackwards=!1)}else r.time%=r.duration,0>r.time&&(r.time+=r.duration);var s=r.startFrame+THREE.Math.clamp(Math.floor(r.time/i),0,r.length-1),o=r.weight;s!==r.currentFrame&&(this.morphTargetInfluences[r.lastFrame]=0,this.morphTargetInfluences[r.currentFrame]=1*o,this.morphTargetInfluences[s]=0,r.lastFrame=r.currentFrame,r.currentFrame=s);i=r.time%i/i;r.directionBackwards&&(i=1-i);this.morphTargetInfluences[r.currentFrame]=i*o;this.morphTargetInfluences[r.lastFrame]=(1-i)*o}}};THREE.LensFlarePlugin=function(){function e(e,n){var r=t.createProgram(),i=t.createShader(t.FRAGMENT_SHADER),s=t.createShader(t.VERTEX_SHADER),o=\"precision \"+n+\" float;\\n\";t.shaderSource(i,o+e.fragmentShader);t.shaderSource(s,o+e.vertexShader);t.compileShader(i);t.compileShader(s);t.attachShader(r,i);t.attachShader(r,s);t.linkProgram(r);return r}var t,n,r,i,s,o,u,a,f,l,c,h,p;this.init=function(v){t=v.context;n=v;r=v.getPrecision();i=new Float32Array(16);s=new Uint16Array(6);v=0;i[v++]=-1;i[v++]=-1;i[v++]=0;i[v++]=0;i[v++]=1;i[v++]=-1;i[v++]=1;i[v++]=0;i[v++]=1;i[v++]=1;i[v++]=1;i[v++]=1;i[v++]=-1;i[v++]=1;i[v++]=0;i[v++]=1;v=0;s[v++]=0;s[v++]=1;s[v++]=2;s[v++]=0;s[v++]=2;s[v++]=3;o=t.createBuffer();u=t.createBuffer();t.bindBuffer(t.ARRAY_BUFFER,o);t.bufferData(t.ARRAY_BUFFER,i,t.STATIC_DRAW);t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,u);t.bufferData(t.ELEMENT_ARRAY_BUFFER,s,t.STATIC_DRAW);a=t.createTexture();f=t.createTexture();t.bindTexture(t.TEXTURE_2D,a);t.texImage2D(t.TEXTURE_2D,0,t.RGB,16,16,0,t.RGB,t.UNSIGNED_BYTE,null);t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE);t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE);t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.NEAREST);t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.NEAREST);t.bindTexture(t.TEXTURE_2D,f);t.texImage2D(t.TEXTURE_2D,0,t.RGBA,16,16,0,t.RGBA,t.UNSIGNED_BYTE,null);t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE);t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE);t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.NEAREST);t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.NEAREST);0>=t.getParameter(t.MAX_VERTEX_TEXTURE_IMAGE_UNITS)?(l=!1,c=e(THREE.ShaderFlares.lensFlare,r)):(l=!0,c=e(THREE.ShaderFlares.lensFlareVertexTexture,r));h={};p={};h.vertex=t.getAttribLocation(c,\"position\");h.uv=t.getAttribLocation(c,\"uv\");p.renderType=t.getUniformLocation(c,\"renderType\");p.map=t.getUniformLocation(c,\"map\");p.occlusionMap=t.getUniformLocation(c,\"occlusionMap\");p.opacity=t.getUniformLocation(c,\"opacity\");p.color=t.getUniformLocation(c,\"color\");p.scale=t.getUniformLocation(c,\"scale\");p.rotation=t.getUniformLocation(c,\"rotation\");p.screenPosition=t.getUniformLocation(c,\"screenPosition\")};this.render=function(e,r,i,s){var e=e.__webglFlares,d=e.length;if(d){var v=new THREE.Vector3,y=s/i,w=.5*i,E=.5*s,S=16/s,x=new THREE.Vector2(S*y,S),T=new THREE.Vector3(1,1,0),N=new THREE.Vector2(1,1),C=p,S=h;t.useProgram(c);t.enableVertexAttribArray(h.vertex);t.enableVertexAttribArray(h.uv);t.uniform1i(C.occlusionMap,0);t.uniform1i(C.map,1);t.bindBuffer(t.ARRAY_BUFFER,o);t.vertexAttribPointer(S.vertex,2,t.FLOAT,!1,16,0);t.vertexAttribPointer(S.uv,2,t.FLOAT,!1,16,8);t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,u);t.disable(t.CULL_FACE);t.depthMask(!1);var L,A,O,M,_;for(L=0;L<d;L++)if(S=16/s,x.set(S*y,S),M=e[L],v.set(M.matrixWorld.elements[12],M.matrixWorld.elements[13],M.matrixWorld.elements[14]),v.applyMatrix4(r.matrixWorldInverse),v.applyProjection(r.projectionMatrix),T.copy(v),N.x=T.x*w+w,N.y=T.y*E+E,l||0<N.x&&N.x<i&&0<N.y&&N.y<s){t.activeTexture(t.TEXTURE1);t.bindTexture(t.TEXTURE_2D,a);t.copyTexImage2D(t.TEXTURE_2D,0,t.RGB,N.x-8,N.y-8,16,16,0);t.uniform1i(C.renderType,0);t.uniform2f(C.scale,x.x,x.y);t.uniform3f(C.screenPosition,T.x,T.y,T.z);t.disable(t.BLEND);t.enable(t.DEPTH_TEST);t.drawElements(t.TRIANGLES,6,t.UNSIGNED_SHORT,0);t.activeTexture(t.TEXTURE0);t.bindTexture(t.TEXTURE_2D,f);t.copyTexImage2D(t.TEXTURE_2D,0,t.RGBA,N.x-8,N.y-8,16,16,0);t.uniform1i(C.renderType,1);t.disable(t.DEPTH_TEST);t.activeTexture(t.TEXTURE1);t.bindTexture(t.TEXTURE_2D,a);t.drawElements(t.TRIANGLES,6,t.UNSIGNED_SHORT,0);M.positionScreen.copy(T);M.customUpdateCallback?M.customUpdateCallback(M):M.updateLensFlares();t.uniform1i(C.renderType,2);t.enable(t.BLEND);A=0;for(O=M.lensFlares.length;A<O;A++)_=M.lensFlares[A],.001<_.opacity&&.001<_.scale&&(T.x=_.x,T.y=_.y,T.z=_.z,S=_.size*_.scale/s,x.x=S*y,x.y=S,t.uniform3f(C.screenPosition,T.x,T.y,T.z),t.uniform2f(C.scale,x.x,x.y),t.uniform1f(C.rotation,_.rotation),t.uniform1f(C.opacity,_.opacity),t.uniform3f(C.color,_.color.r,_.color.g,_.color.b),n.setBlending(_.blending,_.blendEquation,_.blendSrc,_.blendDst),n.setTexture(_.texture,1),t.drawElements(t.TRIANGLES,6,t.UNSIGNED_SHORT,0))}t.enable(t.CULL_FACE);t.enable(t.DEPTH_TEST);t.depthMask(!0)}}};THREE.ShadowMapPlugin=function(){var e,t,n,r,i,s,o=new THREE.Frustum,u=new THREE.Matrix4,a=new THREE.Vector3,f=new THREE.Vector3,l=new THREE.Vector3;this.init=function(o){e=o.context;t=o;var o=THREE.ShaderLib.depthRGBA,u=THREE.UniformsUtils.clone(o.uniforms);n=new THREE.ShaderMaterial({fragmentShader:o.fragmentShader,vertexShader:o.vertexShader,uniforms:u});r=new THREE.ShaderMaterial({fragmentShader:o.fragmentShader,vertexShader:o.vertexShader,uniforms:u,morphTargets:!0});i=new THREE.ShaderMaterial({fragmentShader:o.fragmentShader,vertexShader:o.vertexShader,uniforms:u,skinning:!0});s=new THREE.ShaderMaterial({fragmentShader:o.fragmentShader,vertexShader:o.vertexShader,uniforms:u,morphTargets:!0,skinning:!0});n._shadowPass=!0;r._shadowPass=!0;i._shadowPass=!0;s._shadowPass=!0};this.render=function(e,n){t.shadowMapEnabled&&t.shadowMapAutoUpdate&&this.update(e,n)};this.update=function(p,v){var y,w,E,S,x,T,N,C,L,A=[];S=0;e.clearColor(1,1,1,1);e.disable(e.BLEND);e.enable(e.CULL_FACE);e.frontFace(e.CCW);t.shadowMapCullFace===THREE.CullFaceFront?e.cullFace(e.FRONT):e.cullFace(e.BACK);t.setDepthTest(!0);y=0;for(w=p.__lights.length;y<w;y++)if(E=p.__lights[y],E.castShadow)if(E instanceof THREE.DirectionalLight&&E.shadowCascade)for(x=0;x<E.shadowCascadeCount;x++){var O;if(E.shadowCascadeArray[x])O=E.shadowCascadeArray[x];else{L=E;N=x;O=new THREE.DirectionalLight;O.isVirtual=!0;O.onlyShadow=!0;O.castShadow=!0;O.shadowCameraNear=L.shadowCameraNear;O.shadowCameraFar=L.shadowCameraFar;O.shadowCameraLeft=L.shadowCameraLeft;O.shadowCameraRight=L.shadowCameraRight;O.shadowCameraBottom=L.shadowCameraBottom;O.shadowCameraTop=L.shadowCameraTop;O.shadowCameraVisible=L.shadowCameraVisible;O.shadowDarkness=L.shadowDarkness;O.shadowBias=L.shadowCascadeBias[N];O.shadowMapWidth=L.shadowCascadeWidth[N];O.shadowMapHeight=L.shadowCascadeHeight[N];O.pointsWorld=[];O.pointsFrustum=[];C=O.pointsWorld;T=O.pointsFrustum;for(var M=0;8>M;M++)C[M]=new THREE.Vector3,T[M]=new THREE.Vector3;C=L.shadowCascadeNearZ[N];L=L.shadowCascadeFarZ[N];T[0].set(-1,-1,C);T[1].set(1,-1,C);T[2].set(-1,1,C);T[3].set(1,1,C);T[4].set(-1,-1,L);T[5].set(1,-1,L);T[6].set(-1,1,L);T[7].set(1,1,L);O.originalCamera=v;T=new THREE.Gyroscope;T.position=E.shadowCascadeOffset;T.add(O);T.add(O.target);v.add(T);E.shadowCascadeArray[x]=O;console.log(\"Created virtualLight\",O)}N=E;C=x;L=N.shadowCascadeArray[C];L.position.copy(N.position);L.target.position.copy(N.target.position);L.lookAt(L.target);L.shadowCameraVisible=N.shadowCameraVisible;L.shadowDarkness=N.shadowDarkness;L.shadowBias=N.shadowCascadeBias[C];T=N.shadowCascadeNearZ[C];N=N.shadowCascadeFarZ[C];L=L.pointsFrustum;L[0].z=T;L[1].z=T;L[2].z=T;L[3].z=T;L[4].z=N;L[5].z=N;L[6].z=N;L[7].z=N;A[S]=O;S++}else A[S]=E,S++;y=0;for(w=A.length;y<w;y++){E=A[y];E.shadowMap||(x=THREE.LinearFilter,t.shadowMapType===THREE.PCFSoftShadowMap&&(x=THREE.NearestFilter),E.shadowMap=new THREE.WebGLRenderTarget(E.shadowMapWidth,E.shadowMapHeight,{minFilter:x,magFilter:x,format:THREE.RGBAFormat}),E.shadowMapSize=new THREE.Vector2(E.shadowMapWidth,E.shadowMapHeight),E.shadowMatrix=new THREE.Matrix4);if(!E.shadowCamera){if(E instanceof THREE.SpotLight)E.shadowCamera=new THREE.PerspectiveCamera(E.shadowCameraFov,E.shadowMapWidth/E.shadowMapHeight,E.shadowCameraNear,E.shadowCameraFar);else if(E instanceof THREE.DirectionalLight)E.shadowCamera=new THREE.OrthographicCamera(E.shadowCameraLeft,E.shadowCameraRight,E.shadowCameraTop,E.shadowCameraBottom,E.shadowCameraNear,E.shadowCameraFar);else{console.error(\"Unsupported light type for shadow\");continue}p.add(E.shadowCamera);!0===p.autoUpdate&&p.updateMatrixWorld()}E.shadowCameraVisible&&!E.cameraHelper&&(E.cameraHelper=new THREE.CameraHelper(E.shadowCamera),E.shadowCamera.add(E.cameraHelper));if(E.isVirtual&&O.originalCamera==v){x=v;S=E.shadowCamera;T=E.pointsFrustum;L=E.pointsWorld;a.set(Infinity,Infinity,Infinity);f.set(-Infinity,-Infinity,-Infinity);for(N=0;8>N;N++)C=L[N],C.copy(T[N]),THREE.ShadowMapPlugin.__projector.unprojectVector(C,x),C.applyMatrix4(S.matrixWorldInverse),C.x<a.x&&(a.x=C.x),C.x>f.x&&(f.x=C.x),C.y<a.y&&(a.y=C.y),C.y>f.y&&(f.y=C.y),C.z<a.z&&(a.z=C.z),C.z>f.z&&(f.z=C.z);S.left=a.x;S.right=f.x;S.top=f.y;S.bottom=a.y;S.updateProjectionMatrix()}S=E.shadowMap;T=E.shadowMatrix;x=E.shadowCamera;x.position.setFromMatrixPosition(E.matrixWorld);l.setFromMatrixPosition(E.target.matrixWorld);x.lookAt(l);x.updateMatrixWorld();x.matrixWorldInverse.getInverse(x.matrixWorld);E.cameraHelper&&(E.cameraHelper.visible=E.shadowCameraVisible);E.shadowCameraVisible&&E.cameraHelper.update();T.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1);T.multiply(x.projectionMatrix);T.multiply(x.matrixWorldInverse);u.multiplyMatrices(x.projectionMatrix,x.matrixWorldInverse);o.setFromMatrix(u);t.setRenderTarget(S);t.clear();L=p.__webglObjects;E=0;for(S=L.length;E<S;E++)if(N=L[E],T=N.object,N.render=!1,T.visible&&T.castShadow&&(!(T instanceof THREE.Mesh||T instanceof THREE.ParticleSystem)||!T.frustumCulled||o.intersectsObject(T)))T._modelViewMatrix.multiplyMatrices(x.matrixWorldInverse,T.matrixWorld),N.render=!0;E=0;for(S=L.length;E<S;E++)N=L[E],N.render&&(T=N.object,N=N.buffer,M=T.material instanceof THREE.MeshFaceMaterial?T.material.materials[0]:T.material,C=0<T.geometry.morphTargets.length&&M.morphTargets,M=T instanceof THREE.SkinnedMesh&&M.skinning,C=T.customDepthMaterial?T.customDepthMaterial:M?C?s:i:C?r:n,N instanceof THREE.BufferGeometry?t.renderBufferDirect(x,p.__lights,null,C,N,T):t.renderBuffer(x,p.__lights,null,C,N,T));L=p.__webglObjectsImmediate;E=0;for(S=L.length;E<S;E++)N=L[E],T=N.object,T.visible&&T.castShadow&&(T._modelViewMatrix.multiplyMatrices(x.matrixWorldInverse,T.matrixWorld),t.renderImmediateObject(x,p.__lights,null,n,T))}y=t.getClearColor();w=t.getClearAlpha();e.clearColor(y.r,y.g,y.b,w);e.enable(e.BLEND);t.shadowMapCullFace===THREE.CullFaceFront&&e.cullFace(e.BACK)}};THREE.ShadowMapPlugin.__projector=new THREE.Projector;THREE.SpritePlugin=function(){function g(e,t){return e.z!==t.z?t.z-e.z:t.id-e.id}var e,t,n,r,i,s,o,u,a,f,l,c,h,p,d,v,m;var y,b,w,E,S,x,T,N;this.init=function(g){y=g.context;b=g;E=new Float32Array([-.5,-.5,0,0,.5,-.5,1,0,.5,.5,1,1,-.5,.5,0,1]);S=new Uint16Array([0,1,2,0,2,3]);x=y.createBuffer();T=y.createBuffer();y.bindBuffer(y.ARRAY_BUFFER,x);y.bufferData(y.ARRAY_BUFFER,E,y.STATIC_DRAW);y.bindBuffer(y.ELEMENT_ARRAY_BUFFER,T);y.bufferData(y.ELEMENT_ARRAY_BUFFER,S,y.STATIC_DRAW);var g=y.createProgram(),C=y.createShader(y.VERTEX_SHADER),L=y.createShader(y.FRAGMENT_SHADER);y.shaderSource(C,[\"precision \"+b.getPrecision()+\" float;\",\"uniform mat4 modelViewMatrix;\\nuniform mat4 projectionMatrix;\\nuniform float rotation;\\nuniform vec2 scale;\\nuniform vec2 uvOffset;\\nuniform vec2 uvScale;\\nattribute vec2 position;\\nattribute vec2 uv;\\nvarying vec2 vUV;\\nvoid main() {\\nvUV = uvOffset + uv * uvScale;\\nvec2 alignedPosition = position * scale;\\nvec2 rotatedPosition;\\nrotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\\nrotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\\nvec4 finalPosition;\\nfinalPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\\nfinalPosition.xy += rotatedPosition;\\nfinalPosition = projectionMatrix * finalPosition;\\ngl_Position = finalPosition;\\n}\"].join(\"\\n\"));y.shaderSource(L,[\"precision \"+b.getPrecision()+\" float;\",\"uniform vec3 color;\\nuniform sampler2D map;\\nuniform float opacity;\\nuniform int fogType;\\nuniform vec3 fogColor;\\nuniform float fogDensity;\\nuniform float fogNear;\\nuniform float fogFar;\\nuniform float alphaTest;\\nvarying vec2 vUV;\\nvoid main() {\\nvec4 texture = texture2D( map, vUV );\\nif ( texture.a < alphaTest ) discard;\\ngl_FragColor = vec4( color * texture.xyz, texture.a * opacity );\\nif ( fogType > 0 ) {\\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\\nfloat fogFactor = 0.0;\\nif ( fogType == 1 ) {\\nfogFactor = smoothstep( fogNear, fogFar, depth );\\n} else {\\nconst float LOG2 = 1.442695;\\nfloat fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );\\nfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\\n}\\ngl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );\\n}\\n}\"].join(\"\\n\"));y.compileShader(C);y.compileShader(L);y.attachShader(g,C);y.attachShader(g,L);y.linkProgram(g);N=g;v=y.getAttribLocation(N,\"position\");m=y.getAttribLocation(N,\"uv\");e=y.getUniformLocation(N,\"uvOffset\");t=y.getUniformLocation(N,\"uvScale\");n=y.getUniformLocation(N,\"rotation\");r=y.getUniformLocation(N,\"scale\");i=y.getUniformLocation(N,\"color\");s=y.getUniformLocation(N,\"map\");o=y.getUniformLocation(N,\"opacity\");u=y.getUniformLocation(N,\"modelViewMatrix\");a=y.getUniformLocation(N,\"projectionMatrix\");f=y.getUniformLocation(N,\"fogType\");l=y.getUniformLocation(N,\"fogDensity\");c=y.getUniformLocation(N,\"fogNear\");h=y.getUniformLocation(N,\"fogFar\");p=y.getUniformLocation(N,\"fogColor\");d=y.getUniformLocation(N,\"alphaTest\");g=document.createElement(\"canvas\");g.width=8;g.height=8;C=g.getContext(\"2d\");C.fillStyle=\"#ffffff\";C.fillRect(0,0,g.width,g.height);w=new THREE.Texture(g);w.needsUpdate=!0};this.render=function(E,S){var C=E.__webglSprites,L=C.length;if(L){y.useProgram(N);y.enableVertexAttribArray(v);y.enableVertexAttribArray(m);y.disable(y.CULL_FACE);y.enable(y.BLEND);y.bindBuffer(y.ARRAY_BUFFER,x);y.vertexAttribPointer(v,2,y.FLOAT,!1,16,0);y.vertexAttribPointer(m,2,y.FLOAT,!1,16,8);y.bindBuffer(y.ELEMENT_ARRAY_BUFFER,T);y.uniformMatrix4fv(a,!1,S.projectionMatrix.elements);y.activeTexture(y.TEXTURE0);y.uniform1i(s,0);var O=0,M=0,_=E.fog;_?(y.uniform3f(p,_.color.r,_.color.g,_.color.b),_ instanceof THREE.Fog?(y.uniform1f(c,_.near),y.uniform1f(h,_.far),y.uniform1i(f,1),M=O=1):_ instanceof THREE.FogExp2&&(y.uniform1f(l,_.density),y.uniform1i(f,2),M=O=2)):(y.uniform1i(f,0),M=O=0);for(var D,P,H=[],_=0;_<L;_++)D=C[_],!1!==D.visible&&(D._modelViewMatrix.multiplyMatrices(S.matrixWorldInverse,D.matrixWorld),D.z=-D._modelViewMatrix.elements[14]);C.sort(g);for(_=0;_<L;_++)D=C[_],!1!==D.visible&&(P=D.material,y.uniform1f(d,P.alphaTest),y.uniformMatrix4fv(u,!1,D._modelViewMatrix.elements),H[0]=D.scale.x,H[1]=D.scale.y,D=E.fog&&P.fog?M:0,O!==D&&(y.uniform1i(f,D),O=D),y.uniform2f(t,P.uvScale.x,P.uvScale.y),y.uniform2f(e,P.uvOffset.x,P.uvOffset.y),y.uniform1f(o,P.opacity),y.uniform3f(i,P.color.r,P.color.g,P.color.b),y.uniform1f(n,P.rotation),y.uniform2fv(r,H),b.setBlending(P.blending,P.blendEquation,P.blendSrc,P.blendDst),b.setDepthTest(P.depthTest),b.setDepthWrite(P.depthWrite),P.map&&P.map.image&&P.map.image.width?b.setTexture(P.map,0):b.setTexture(w,0),y.drawElements(y.TRIANGLES,6,y.UNSIGNED_SHORT,0));y.enable(y.CULL_FACE)}}};THREE.DepthPassPlugin=function(){this.enabled=!1;this.renderTarget=null;var e,t,n,r,i,s,o=new THREE.Frustum,u=new THREE.Matrix4;this.init=function(o){e=o.context;t=o;var o=THREE.ShaderLib.depthRGBA,u=THREE.UniformsUtils.clone(o.uniforms);n=new THREE.ShaderMaterial({fragmentShader:o.fragmentShader,vertexShader:o.vertexShader,uniforms:u});r=new THREE.ShaderMaterial({fragmentShader:o.fragmentShader,vertexShader:o.vertexShader,uniforms:u,morphTargets:!0});i=new THREE.ShaderMaterial({fragmentShader:o.fragmentShader,vertexShader:o.vertexShader,uniforms:u,skinning:!0});s=new THREE.ShaderMaterial({fragmentShader:o.fragmentShader,vertexShader:o.vertexShader,uniforms:u,morphTargets:!0,skinning:!0});n._shadowPass=!0;r._shadowPass=!0;i._shadowPass=!0;s._shadowPass=!0};this.render=function(e,t){this.enabled&&this.update(e,t)};this.update=function(l,p){var v,m,y,w,E,S;e.clearColor(1,1,1,1);e.disable(e.BLEND);t.setDepthTest(!0);!0===l.autoUpdate&&l.updateMatrixWorld();p.matrixWorldInverse.getInverse(p.matrixWorld);u.multiplyMatrices(p.projectionMatrix,p.matrixWorldInverse);o.setFromMatrix(u);t.setRenderTarget(this.renderTarget);t.clear();S=l.__webglObjects;v=0;for(m=S.length;v<m;v++)if(y=S[v],E=y.object,y.render=!1,E.visible&&(!(E instanceof THREE.Mesh||E instanceof THREE.ParticleSystem)||!E.frustumCulled||o.intersectsObject(E)))E._modelViewMatrix.multiplyMatrices(p.matrixWorldInverse,E.matrixWorld),y.render=!0;var x;v=0;for(m=S.length;v<m;v++)if(y=S[v],y.render&&(E=y.object,y=y.buffer,!(E instanceof THREE.ParticleSystem)||E.customDepthMaterial))(x=E.material instanceof THREE.MeshFaceMaterial?E.material.materials[0]:E.material)&&t.setMaterialFaces(E.material),w=0<E.geometry.morphTargets.length&&x.morphTargets,x=E instanceof THREE.SkinnedMesh&&x.skinning,w=E.customDepthMaterial?E.customDepthMaterial:x?w?s:i:w?r:n,y instanceof THREE.BufferGeometry?t.renderBufferDirect(p,l.__lights,null,w,y,E):t.renderBuffer(p,l.__lights,null,w,y,E);S=l.__webglObjectsImmediate;v=0;for(m=S.length;v<m;v++)y=S[v],E=y.object,E.visible&&(E._modelViewMatrix.multiplyMatrices(p.matrixWorldInverse,E.matrixWorld),t.renderImmediateObject(p,l.__lights,null,n,E));v=t.getClearColor();m=t.getClearAlpha();e.clearColor(v.r,v.g,v.b,m);e.enable(e.BLEND)}};THREE.ShaderFlares={lensFlareVertexTexture:{vertexShader:\"uniform lowp int renderType;\\nuniform vec3 screenPosition;\\nuniform vec2 scale;\\nuniform float rotation;\\nuniform sampler2D occlusionMap;\\nattribute vec2 position;\\nattribute vec2 uv;\\nvarying vec2 vUV;\\nvarying float vVisibility;\\nvoid main() {\\nvUV = uv;\\nvec2 pos = position;\\nif( renderType == 2 ) {\\nvec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );\\nvisibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );\\nvisibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );\\nvisibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );\\nvisibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );\\nvisibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );\\nvisibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );\\nvisibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );\\nvisibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );\\nvVisibility = visibility.r / 9.0;\\nvVisibility *= 1.0 - visibility.g / 9.0;\\nvVisibility *= visibility.b / 9.0;\\nvVisibility *= 1.0 - visibility.a / 9.0;\\npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\\npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\\n}\\ngl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\\n}\",fragmentShader:\"uniform lowp int renderType;\\nuniform sampler2D map;\\nuniform float opacity;\\nuniform vec3 color;\\nvarying vec2 vUV;\\nvarying float vVisibility;\\nvoid main() {\\nif( renderType == 0 ) {\\ngl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );\\n} else if( renderType == 1 ) {\\ngl_FragColor = texture2D( map, vUV );\\n} else {\\nvec4 texture = texture2D( map, vUV );\\ntexture.a *= opacity * vVisibility;\\ngl_FragColor = texture;\\ngl_FragColor.rgb *= color;\\n}\\n}\"},lensFlare:{vertexShader:\"uniform lowp int renderType;\\nuniform vec3 screenPosition;\\nuniform vec2 scale;\\nuniform float rotation;\\nattribute vec2 position;\\nattribute vec2 uv;\\nvarying vec2 vUV;\\nvoid main() {\\nvUV = uv;\\nvec2 pos = position;\\nif( renderType == 2 ) {\\npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\\npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\\n}\\ngl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\\n}\",fragmentShader:\"precision mediump float;\\nuniform lowp int renderType;\\nuniform sampler2D map;\\nuniform sampler2D occlusionMap;\\nuniform float opacity;\\nuniform vec3 color;\\nvarying vec2 vUV;\\nvoid main() {\\nif( renderType == 0 ) {\\ngl_FragColor = vec4( texture2D( map, vUV ).rgb, 0.0 );\\n} else if( renderType == 1 ) {\\ngl_FragColor = texture2D( map, vUV );\\n} else {\\nfloat visibility = texture2D( occlusionMap, vec2( 0.5, 0.1 ) ).a;\\nvisibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) ).a;\\nvisibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) ).a;\\nvisibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) ).a;\\nvisibility = ( 1.0 - visibility / 4.0 );\\nvec4 texture = texture2D( map, vUV );\\ntexture.a *= opacity * visibility;\\ngl_FragColor = texture;\\ngl_FragColor.rgb *= color;\\n}\\n}\"}};THREE.ShaderToon={toon1:{uniforms:{uDirLightPos:{type:\"v3\",value:new THREE.Vector3},uDirLightColor:{type:\"c\",value:new THREE.Color(15658734)},uAmbientLightColor:{type:\"c\",value:new THREE.Color(328965)},uBaseColor:{type:\"c\",value:new THREE.Color(16777215)}},vertexShader:[\"varying vec3 vNormal;\",\"varying vec3 vRefract;\",\"void main() {\",\"vec4 worldPosition = modelMatrix * vec4( position, 1.0 );\",\"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",\"vec3 worldNormal = normalize ( mat3( modelMatrix[0].xyz, modelMatrix[1].xyz, modelMatrix[2].xyz ) * normal );\",\"vNormal = normalize( normalMatrix * normal );\",\"vec3 I = worldPosition.xyz - cameraPosition;\",\"vRefract = refract( normalize( I ), worldNormal, 1.02 );\",\"gl_Position = projectionMatrix * mvPosition;\",\"}\"].join(\"\\n\"),fragmentShader:[\"uniform vec3 uBaseColor;\",\"uniform vec3 uDirLightPos;\",\"uniform vec3 uDirLightColor;\",\"uniform vec3 uAmbientLightColor;\",\"varying vec3 vNormal;\",\"varying vec3 vRefract;\",\"void main() {\",\"float directionalLightWeighting = max( dot( normalize( vNormal ), uDirLightPos ), 0.0);\",\"vec3 lightWeighting = uAmbientLightColor + uDirLightColor * directionalLightWeighting;\",\"float intensity = smoothstep( - 0.5, 1.0, pow( length(lightWeighting), 20.0 ) );\",\"intensity += length(lightWeighting) * 0.2;\",\"float cameraWeighting = dot( normalize( vNormal ), vRefract );\",\"intensity += pow( 1.0 - length( cameraWeighting ), 6.0 );\",\"intensity = intensity * 0.2 + 0.3;\",\"if ( intensity < 0.50 ) {\",\"gl_FragColor = vec4( 2.0 * intensity * uBaseColor, 1.0 );\",\"} else {\",\"gl_FragColor = vec4( 1.0 - 2.0 * ( 1.0 - intensity ) * ( 1.0 - uBaseColor ), 1.0 );\",\"}\",\"}\"].join(\"\\n\")},toon2:{uniforms:{uDirLightPos:{type:\"v3\",value:new THREE.Vector3},uDirLightColor:{type:\"c\",value:new THREE.Color(15658734)},uAmbientLightColor:{type:\"c\",value:new THREE.Color(328965)},uBaseColor:{type:\"c\",value:new THREE.Color(15658734)},uLineColor1:{type:\"c\",value:new THREE.Color(8421504)},uLineColor2:{type:\"c\",value:new THREE.Color(0)},uLineColor3:{type:\"c\",value:new THREE.Color(0)},uLineColor4:{type:\"c\",value:new THREE.Color(0)}},vertexShader:[\"varying vec3 vNormal;\",\"void main() {\",\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\"vNormal = normalize( normalMatrix * normal );\",\"}\"].join(\"\\n\"),fragmentShader:[\"uniform vec3 uBaseColor;\",\"uniform vec3 uLineColor1;\",\"uniform vec3 uLineColor2;\",\"uniform vec3 uLineColor3;\",\"uniform vec3 uLineColor4;\",\"uniform vec3 uDirLightPos;\",\"uniform vec3 uDirLightColor;\",\"uniform vec3 uAmbientLightColor;\",\"varying vec3 vNormal;\",\"void main() {\",\"float camera = max( dot( normalize( vNormal ), vec3( 0.0, 0.0, 1.0 ) ), 0.4);\",\"float light = max( dot( normalize( vNormal ), uDirLightPos ), 0.0);\",\"gl_FragColor = vec4( uBaseColor, 1.0 );\",\"if ( length(uAmbientLightColor + uDirLightColor * light) < 1.00 ) {\",\"gl_FragColor *= vec4( uLineColor1, 1.0 );\",\"}\",\"if ( length(uAmbientLightColor + uDirLightColor * camera) < 0.50 ) {\",\"gl_FragColor *= vec4( uLineColor2, 1.0 );\",\"}\",\"}\"].join(\"\\n\")},hatching:{uniforms:{uDirLightPos:{type:\"v3\",value:new THREE.Vector3},uDirLightColor:{type:\"c\",value:new THREE.Color(15658734)},uAmbientLightColor:{type:\"c\",value:new THREE.Color(328965)},uBaseColor:{type:\"c\",value:new THREE.Color(16777215)},uLineColor1:{type:\"c\",value:new THREE.Color(0)},uLineColor2:{type:\"c\",value:new THREE.Color(0)},uLineColor3:{type:\"c\",value:new THREE.Color(0)},uLineColor4:{type:\"c\",value:new THREE.Color(0)}},vertexShader:[\"varying vec3 vNormal;\",\"void main() {\",\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\"vNormal = normalize( normalMatrix * normal );\",\"}\"].join(\"\\n\"),fragmentShader:[\"uniform vec3 uBaseColor;\",\"uniform vec3 uLineColor1;\",\"uniform vec3 uLineColor2;\",\"uniform vec3 uLineColor3;\",\"uniform vec3 uLineColor4;\",\"uniform vec3 uDirLightPos;\",\"uniform vec3 uDirLightColor;\",\"uniform vec3 uAmbientLightColor;\",\"varying vec3 vNormal;\",\"void main() {\",\"float directionalLightWeighting = max( dot( normalize(vNormal), uDirLightPos ), 0.0);\",\"vec3 lightWeighting = uAmbientLightColor + uDirLightColor * directionalLightWeighting;\",\"gl_FragColor = vec4( uBaseColor, 1.0 );\",\"if ( length(lightWeighting) < 1.00 ) {\",\"if ( mod(gl_FragCoord.x + gl_FragCoord.y, 10.0) == 0.0) {\",\"gl_FragColor = vec4( uLineColor1, 1.0 );\",\"}\",\"}\",\"if ( length(lightWeighting) < 0.75 ) {\",\"if (mod(gl_FragCoord.x - gl_FragCoord.y, 10.0) == 0.0) {\",\"gl_FragColor = vec4( uLineColor2, 1.0 );\",\"}\",\"}\",\"if ( length(lightWeighting) < 0.50 ) {\",\"if (mod(gl_FragCoord.x + gl_FragCoord.y - 5.0, 10.0) == 0.0) {\",\"gl_FragColor = vec4( uLineColor3, 1.0 );\",\"}\",\"}\",\"if ( length(lightWeighting) < 0.3465 ) {\",\"if (mod(gl_FragCoord.x - gl_FragCoord.y - 5.0, 10.0) == 0.0) {\",\"gl_FragColor = vec4( uLineColor4, 1.0 );\",\"}\",\"}\",\"}\"].join(\"\\n\")},dotted:{uniforms:{uDirLightPos:{type:\"v3\",value:new THREE.Vector3},uDirLightColor:{type:\"c\",value:new THREE.Color(15658734)},uAmbientLightColor:{type:\"c\",value:new THREE.Color(328965)},uBaseColor:{type:\"c\",value:new THREE.Color(16777215)},uLineColor1:{type:\"c\",value:new THREE.Color(0)}},vertexShader:[\"varying vec3 vNormal;\",\"void main() {\",\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\"vNormal = normalize( normalMatrix * normal );\",\"}\"].join(\"\\n\"),fragmentShader:[\"uniform vec3 uBaseColor;\",\"uniform vec3 uLineColor1;\",\"uniform vec3 uLineColor2;\",\"uniform vec3 uLineColor3;\",\"uniform vec3 uLineColor4;\",\"uniform vec3 uDirLightPos;\",\"uniform vec3 uDirLightColor;\",\"uniform vec3 uAmbientLightColor;\",\"varying vec3 vNormal;\",\"void main() {\",\"float directionalLightWeighting = max( dot( normalize(vNormal), uDirLightPos ), 0.0);\",\"vec3 lightWeighting = uAmbientLightColor + uDirLightColor * directionalLightWeighting;\",\"gl_FragColor = vec4( uBaseColor, 1.0 );\",\"if ( length(lightWeighting) < 1.00 ) {\",\"if ( ( mod(gl_FragCoord.x, 4.001) + mod(gl_FragCoord.y, 4.0) ) > 6.00 ) {\",\"gl_FragColor = vec4( uLineColor1, 1.0 );\",\"}\",\"}\",\"if ( length(lightWeighting) < 0.50 ) {\",\"if ( ( mod(gl_FragCoord.x + 2.0, 4.001) + mod(gl_FragCoord.y + 2.0, 4.0) ) > 6.00 ) {\",\"gl_FragColor = vec4( uLineColor1, 1.0 );\",\"}\",\"}\",\"}\"].join(\"\\n\")}};THREE.TrackballControls=function(e,t){function g(e){if(n.enabled===false)return;window.removeEventListener(\"keydown\",g);o=s;if(s!==r.NONE){return}else if(e.keyCode===n.keys[r.ROTATE]&&!n.noRotate){s=r.ROTATE}else if(e.keyCode===n.keys[r.ZOOM]&&!n.noZoom){s=r.ZOOM}else if(e.keyCode===n.keys[r.PAN]&&!n.noPan){s=r.PAN}}function y(e){if(n.enabled===false)return;s=o;window.addEventListener(\"keydown\",g,false)}function b(e){if(n.enabled===false)return;e.preventDefault();e.stopPropagation();if(s===r.NONE){s=e.button}if(s===r.ROTATE&&!n.noRotate){a=f=n.getMouseProjectionOnBall(e.clientX,e.clientY)}else if(s===r.ZOOM&&!n.noZoom){l=c=n.getMouseOnScreen(e.clientX,e.clientY)}else if(s===r.PAN&&!n.noPan){d=v=n.getMouseOnScreen(e.clientX,e.clientY)}document.addEventListener(\"mousemove\",w,false);document.addEventListener(\"mouseup\",E,false)}function w(e){if(n.enabled===false)return;e.preventDefault();e.stopPropagation();if(s===r.ROTATE&&!n.noRotate){f=n.getMouseProjectionOnBall(e.clientX,e.clientY)}else if(s===r.ZOOM&&!n.noZoom){c=n.getMouseOnScreen(e.clientX,e.clientY)}else if(s===r.PAN&&!n.noPan){v=n.getMouseOnScreen(e.clientX,e.clientY)}}function E(e){if(n.enabled===false)return;e.preventDefault();e.stopPropagation();s=r.NONE;document.removeEventListener(\"mousemove\",w);document.removeEventListener(\"mouseup\",E)}function S(e){if(n.enabled===false)return;e.preventDefault();e.stopPropagation();var t=0;if(e.wheelDelta){t=e.wheelDelta/40}else if(e.detail){t=-e.detail/3}l.y+=t*.01}function x(e){if(n.enabled===false)return;switch(e.touches.length){case 1:s=r.TOUCH_ROTATE;a=f=n.getMouseProjectionOnBall(e.touches[0].pageX,e.touches[0].pageY);break;case 2:s=r.TOUCH_ZOOM;var t=e.touches[0].pageX-e.touches[1].pageX;var i=e.touches[0].pageY-e.touches[1].pageY;p=h=Math.sqrt(t*t+i*i);break;case 3:s=r.TOUCH_PAN;d=v=n.getMouseOnScreen(e.touches[0].pageX,e.touches[0].pageY);break;default:s=r.NONE}}function T(e){if(n.enabled===false)return;e.preventDefault();e.stopPropagation();switch(e.touches.length){case 1:f=n.getMouseProjectionOnBall(e.touches[0].pageX,e.touches[0].pageY);break;case 2:var t=e.touches[0].pageX-e.touches[1].pageX;var i=e.touches[0].pageY-e.touches[1].pageY;p=Math.sqrt(t*t+i*i);break;case 3:v=n.getMouseOnScreen(e.touches[0].pageX,e.touches[0].pageY);break;default:s=r.NONE}}function N(e){if(n.enabled===false)return;switch(e.touches.length){case 1:a=f=n.getMouseProjectionOnBall(e.touches[0].pageX,e.touches[0].pageY);break;case 2:h=p=0;break;case 3:d=v=n.getMouseOnScreen(e.touches[0].pageX,e.touches[0].pageY);break}s=r.NONE}var n=this;var r={NONE:-1,ROTATE:0,ZOOM:1,PAN:2,TOUCH_ROTATE:3,TOUCH_ZOOM:4,TOUCH_PAN:5};this.object=e;this.domElement=t!==undefined?t:document;this.enabled=true;this.screen={width:0,height:0,offsetLeft:0,offsetTop:0};this.radius=(this.screen.width+this.screen.height)/4;this.rotateSpeed=1;this.zoomSpeed=1.2;this.panSpeed=.3;this.noRotate=false;this.noZoom=false;this.noPan=false;this.staticMoving=false;this.dynamicDampingFactor=.2;this.minDistance=0;this.maxDistance=Infinity;this.keys=[65,83,68];this.target=new THREE.Vector3;var i=new THREE.Vector3;var s=r.NONE,o=r.NONE,u=new THREE.Vector3,a=new THREE.Vector3,f=new THREE.Vector3,l=new THREE.Vector2,c=new THREE.Vector2,h=0,p=0,d=new THREE.Vector2,v=new THREE.Vector2;this.target0=this.target.clone();this.position0=this.object.position.clone();this.up0=this.object.up.clone();var m={type:\"change\"};this.handleResize=function(){this.screen.width=window.innerWidth;this.screen.height=window.innerHeight;this.screen.offsetLeft=0;this.screen.offsetTop=0;this.radius=(this.screen.width+this.screen.height)/4};this.handleEvent=function(e){if(typeof this[e.type]==\"function\"){this[e.type](e)}};this.getMouseOnScreen=function(e,t){return new THREE.Vector2((e-n.screen.offsetLeft)/n.radius*.5,(t-n.screen.offsetTop)/n.radius*.5)};this.getMouseProjectionOnBall=function(e,t){var r=new THREE.Vector3((e-n.screen.width*.5-n.screen.offsetLeft)/n.radius,(n.screen.height*.5+n.screen.offsetTop-t)/n.radius,0);var i=r.length();if(i>1){r.normalize()}else{r.z=Math.sqrt(1-i*i)}u.copy(n.object.position).sub(n.target);var s=n.object.up.clone().setLength(r.y);s.add(n.object.up.clone().cross(u).setLength(r.x));s.add(u.setLength(r.z));return s};this.rotateCamera=function(){var e=Math.acos(a.dot(f)/a.length()/f.length());if(e){var t=(new THREE.Vector3).crossVectors(a,f).normalize(),r=new THREE.Quaternion;e*=n.rotateSpeed;r.setFromAxisAngle(t,-e);u.applyQuaternion(r);n.object.up.applyQuaternion(r);f.applyQuaternion(r);if(n.staticMoving){a.copy(f)}else{r.setFromAxisAngle(t,e*(n.dynamicDampingFactor-1));a.applyQuaternion(r)}}};this.zoomCamera=function(){if(s===r.TOUCH_ZOOM){var e=h/p;h=p;u.multiplyScalar(e)}else{var e=1+(c.y-l.y)*this.zoomSpeed;if(e!==1&&e>0){if(this.object instanceof THREE.PerspectiveCamera){u.multiplyScalar(e)}else{this.object.left*=e;this.object.right*=e;this.object.top*=e;this.object.bottom*=e;this.object.updateProjectionMatrix()}if(n.staticMoving){l.copy(c)}else{l.y+=(c.y-l.y)*this.dynamicDampingFactor}}}};this.panCamera=function(){var e=v.clone().sub(d);if(e.lengthSq()){e.multiplyScalar(u.length()*n.panSpeed);var t=u.clone().cross(n.object.up).setLength(e.x);t.add(n.object.up.clone().setLength(e.y));n.object.position.add(t);n.target.add(t);if(n.staticMoving){d=v}else{d.add(e.subVectors(v,d).multiplyScalar(n.dynamicDampingFactor))}}};this.checkDistances=function(){if(!n.noZoom||!n.noPan){if(n.object.position.lengthSq()>n.maxDistance*n.maxDistance){n.object.position.setLength(n.maxDistance)}if(u.lengthSq()<n.minDistance*n.minDistance){n.object.position.addVectors(n.target,u.setLength(n.minDistance))}}};this.update=function(){u.subVectors(n.object.position,n.target);if(!n.noRotate){n.rotateCamera()}if(!n.noZoom){n.zoomCamera()}if(!n.noPan){n.panCamera()}n.object.position.addVectors(n.target,u);n.checkDistances();n.object.lookAt(n.target);if(i.distanceToSquared(n.object.position)>0){n.dispatchEvent(m);i.copy(n.object.position)}};this.reset=function(){s=r.NONE;o=r.NONE;n.target.copy(n.target0);n.object.position.copy(n.position0);n.object.up.copy(n.up0);u.subVectors(n.object.position,n.target);n.object.lookAt(n.target);n.dispatchEvent(m);i.copy(n.object.position)};this.domElement.addEventListener(\"contextmenu\",function(e){e.preventDefault()},false);this.domElement.addEventListener(\"mousedown\",b,false);this.domElement.addEventListener(\"mousewheel\",S,false);this.domElement.addEventListener(\"DOMMouseScroll\",S,false);this.domElement.addEventListener(\"touchstart\",x,false);this.domElement.addEventListener(\"touchend\",N,false);this.domElement.addEventListener(\"touchmove\",T,false);window.addEventListener(\"keydown\",g,false);window.addEventListener(\"keyup\",y,false);this.handleResize()};THREE.TrackballControls.prototype=Object.create(THREE.EventDispatcher.prototype);\"use strict\";var imolecule={create:function(e,t){var n=$(e),r=this;t=t||{};this.shader=t.hasOwnProperty(\"shader\")?t.shader:THREE.ShaderToon.toon2;this.drawingType=t.hasOwnProperty(\"drawingType\")?t.drawingType:\"ball and stick\";this.boundaryType=t.hasOwnProperty(\"boundaryType\")?t.boundaryType:\"unit cell\";this.renderer=new THREE.WebGLRenderer({antialias:true,alpha:true});this.renderer.setSize(n.width(),n.height());n.append(this.renderer.domElement);this.perspective=new THREE.PerspectiveCamera(50,n.width()/n.height());this.orthographic=new THREE.OrthographicCamera(-n.width()/32,n.width()/32,n.height()/32,-n.height()/32,-100,1e3);this.perspective.position.z=t.hasOwnProperty(\"z\")?t.z:15;this.orthographic.position=this.perspective.position;this.orthographic.rotation=this.perspective.rotation;this.setCameraType(t.hasOwnProperty(\"cameraType\")?t.cameraType:\"perspective\");this.sphereGeometry=new THREE.SphereGeometry(1,16,12);this.cylinderGeometry=new THREE.CylinderGeometry(1,1,1,6,3,false);this.cylinderGeometry.applyMatrix((new THREE.Matrix4).makeRotationFromEuler(new THREE.Euler(Math.PI/2,Math.PI,0)));this.light=new THREE.HemisphereLight(16777215,1);this.light.position=this.camera.position;this.light.rotation=this.camera.rotation;this.atoms=[];this.bonds=[];$.each(this.data,function(e,t){var n=new THREE.ShaderMaterial({uniforms:THREE.UniformsUtils.clone(r.shader.uniforms),vertexShader:r.shader.vertexShader,fragmentShader:r.shader.fragmentShader});n.uniforms.uDirLightPos.value.set(1,1,1).multiplyScalar(r.camera.position.z);t.color=new THREE.Color(t.color);n.uniforms.uDirLightColor.value=t.color;n.uniforms.uBaseColor.value=t.color;t.material=n});this.scene=new THREE.Scene;this.scene.add(this.perspective);this.scene.add(this.orthographic);this.scene.add(this.light);$(window).resize(function(){r.renderer.setSize(n.width(),n.height());r.perspective.aspect=n.width()/n.height();r.perspective.updateProjectionMatrix();r.orthographic.left=-n.width()/32;r.orthographic.right=n.width()/32;r.orthographic.top=n.height()/32;r.orthographic.bottom=-n.height()/32;r.orthographic.updateProjectionMatrix()});this.animate()},draw:function(e){var t,n,r,i,s,o,u,a,f,l,c,h,p,d,v;n=this;a=new THREE.Vector3;this.current=e;i=this.drawingType===\"space filling\"?1:.3;if(!e.hasOwnProperty(\"bonds\")){e.bonds=[]}$.each(e.atoms,function(e,r){f=n.data[r.element]||n.data.unknown;t=new THREE.Mesh(n.sphereGeometry,f.material);t.position.fromArray(r.location);t.scale.set(1,1,1).multiplyScalar(i*f.radius*2);if(n.drawingType!==\"wireframe\"){n.scene.add(t)}t.element=r.element;n.atoms.push(t)});$.each(e.bonds,function(e,i){r=[n.atoms[i.atoms[0]],n.atoms[i.atoms[1]]];for(s=0;s<i.order;s+=1){if(i.order===2){u=.5*(s===1?1:-1)}else if(i.order===3&&s!==0){u=s===1?1:-1}else{u=0}for(o=0;o<2;o+=1){t=new THREE.Mesh(n.cylinderGeometry,n.data.bond.material);a.addVectors(r[0].position,r[1].position).divideScalar(2);t.atomMaterial=n.data[r[o].element].material;t.position.addVectors(a,r[o].position).divideScalar(2);t.lookAt(r[1].position);t.scale.x=t.scale.y=.3*n.data.bond.radius*2;t.scale.z=r[1].position.distanceTo(r[0].position)/2;t.translateY(.3*u);if(n.drawingType===\"wireframe\"){t.material=t.atomMaterial}if(n.drawingType!==\"space filling\"){n.scene.add(t)}n.bonds.push(t)}}});if(e.hasOwnProperty(\"periodic_connections\")){l=new THREE.Vector3(0,0,0);c=[l.clone().fromArray(e.periodic_connections[0]),l.clone().fromArray(e.periodic_connections[1]),l.clone().fromArray(e.periodic_connections[2])];h=[l.clone(),c[0],c[1],c[2],l.clone().add(c[0]).add(c[1]).add(c[2]),l.clone().add(c[1]).add(c[2]),l.clone().add(c[0]).add(c[2]),l.clone().add(c[0]).add(c[1])];p=h[4].clone().multiplyScalar(.5);for(s=0;s<h.length;s+=1){h[s].sub(p)}d=new THREE.Geometry;$.each([0,1,0,2,0,3,6,1,7,2,5,3,5,4,6,4,7],function(e,t){d.vertices.push(h[t])});v=new THREE.LineBasicMaterial({color:0,linewidth:3});this.corners=new THREE.Line(d,v);this.scene.add(this.corners)}},clear:function(){var e=this;$.each(this.atoms.concat(this.bonds),function(t,n){e.scene.remove(n)});this.atoms=[];this.bonds=[];this.scene.remove(this.corners)},setDrawingType:function(e){var t;if(this.drawingType===\"ball and stick\"){if(e===\"wireframe\"){for(t=0;t<this.atoms.length;t+=1){this.scene.remove(this.atoms[t])}for(t=0;t<this.bonds.length;t+=1){this.bonds[t].material=this.bonds[t].atomMaterial}}else if(e===\"space filling\"){for(t=0;t<this.atoms.length;t+=1){this.atoms[t].scale.divideScalar(.3)}for(t=0;t<this.bonds.length;t+=1){this.scene.remove(this.bonds[t])}}}else if(this.drawingType===\"wireframe\"){if(e===\"ball and stick\"){for(t=0;t<this.atoms.length;t+=1){this.scene.add(this.atoms[t])}for(t=0;t<this.bonds.length;t+=1){this.bonds[t].material=this.data.bond.material}}else if(e===\"space filling\"){for(t=0;t<this.atoms.length;t+=1){this.atoms[t].scale.divideScalar(.3);this.scene.add(this.atoms[t])}for(t=0;t<this.bonds.length;t+=1){this.scene.remove(this.bonds[t])}}}else if(this.drawingType===\"space filling\"){if(e===\"ball and stick\"){for(t=0;t<this.atoms.length;t+=1){this.atoms[t].scale.multiplyScalar(.3)}for(t=0;t<this.bonds.length;t+=1){this.bonds[t].material=this.data.bond.material;this.scene.add(this.bonds[t])}}else if(e===\"wireframe\"){for(t=0;t<this.atoms.length;t+=1){this.atoms[t].scale.multiplyScalar(.3);this.scene.remove(this.atoms[t])}for(t=0;t<this.bonds.length;t+=1){this.bonds[t].material=this.bonds[t].atomMaterial;this.scene.add(this.bonds[t])}}}this.drawingType=e},setCameraType:function(e){if(e===\"orthographic\"){this.camera=this.orthographic;this.camera.position.copy(this.perspective.position)}else if(e===\"perspective\"){this.camera=this.perspective;this.camera.position.copy(this.orthographic.position)}this.controls=new THREE.TrackballControls(this.camera,this.renderer.domElement)},animate:function(){var e=this;window.requestAnimationFrame(function(){return e.animate()});this.controls.update();this.renderer.render(this.scene,this.camera)},showUnitCell:function(e){this.scene[e?\"add\":\"remove\"](this.corners)},connect:function(e){this.socket=new io.Socket(window.location.hostname,{port:e,rememberTransport:false});this.socket.connect();this.queue={};this.socket.on(\"connect\",function(){console.log(\"Connected!\")});var t=this;this.socket.on(\"message\",function(e){var n,r;n=t.queue[e.id];delete t.queue[e.id];t.result=e.result;try{e.result=$.parseJSON(e.result)}catch(i){}if(e.error){alert(e.result);return}if(n===\"draw\"){t.clear();t.draw(e.result)}else if(n===\"save\"){r=e.result.hasOwnProperty(\"name\")&&e.result.name!==\"\"?e.result.name:t.filename;saveAs(new Blob([t.result],{type:\"text/plain\"}),r+\".\"+t.outFormat)}else{alert(\"Unsupported function: \"+n)}})},convertAndDraw:function(e,t){if(t===\"json\"){this.clear();this.draw($.parseJSON(e));return}var n=this.uuid();this.socket.send({method:\"convert\",id:n,params:{data:e,in_format:t,out_format:\"json\",pretty:false}});this.queue[n]=\"draw\"},convertAndSave:function(e,t){var n=this.uuid();this.socket.send({method:\"convert\",id:n,params:{data:e,in_format:\"json\",out_format:t,pretty:true}});this.outFormat=t;this.queue[n]=\"save\"},uuid:function(){return\"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g,function(e){var t=Math.random()*16|0,n=e==\"x\"?t:t&3|8;return n.toString(16)})},data:{Ac:{color:7383801,radius:1.95},Ag:{color:12566463,radius:1.6},Al:{color:12559781,radius:1.25},Am:{color:5528562,radius:1.75},Ar:{color:8442338,radius:.71},As:{color:12353762,radius:1.15},Au:{color:16765219,radius:1.35},B:{color:16758197,radius:.85},Ba:{color:51200,radius:2.15},Be:{color:12713728,radius:1.05},Bi:{color:10375093,radius:1.6},Br:{color:10823720,radius:1.15},C:{color:9474192,radius:.7},Ca:{color:4062976,radius:1.8},Cd:{color:16767118,radius:1.55},Ce:{color:16777158,radius:1.85},Cl:{color:2092831,radius:1},Co:{color:15700128,radius:1.35},Cr:{color:9017798,radius:1.4},Cs:{color:5642126,radius:2.6},Cu:{color:13140019,radius:1.35},Dy:{color:2097094,radius:1.75},Er:{color:58997,radius:1.75},Eu:{color:6356934,radius:1.85},F:{color:9494351,radius:.5},Fe:{color:14640691,radius:1.4},Ga:{color:12684942,radius:1.3},Gd:{color:4521926,radius:1.8},Ge:{color:6721166,radius:1.25},H:{color:16777215,radius:.25},Hf:{color:5095935,radius:1.55},Hg:{color:12105935,radius:1.5},Ho:{color:65436,radius:1.75},I:{color:9633939,radius:1.4},In:{color:10843506,radius:1.55},Ir:{color:1528967,radius:1.35},K:{color:9322452,radius:2.2},La:{color:7394559,radius:1.95},Li:{color:13402367,radius:1.45},Lu:{color:43555,radius:1.75},Mg:{color:9043712,radius:1.5},Mn:{color:10254790,radius:1.4},Mo:{color:5551541,radius:1.45},N:{color:3100663,radius:.65},Na:{color:11164658,radius:1.8},Nb:{color:7520712,radius:1.45},Nd:{color:13041606,radius:1.85},Ni:{color:5230415,radius:1.35},Np:{color:33023,radius:1.75},O:{color:16715021,radius:.6},Os:{color:2516629,radius:1.3},P:{color:16744448,radius:1},Pa:{color:41471,radius:1.8},Pb:{color:5658976,radius:1.8},Pd:{color:27013,radius:1.4},Pm:{color:10747846,radius:1.85},Po:{color:11164416,radius:1.9},Pr:{color:14221254,radius:1.85},Pt:{color:13619167,radius:1.35},Pu:{color:27647,radius:1.75},Ra:{color:31744,radius:2.15},Rb:{color:7351727,radius:2.35},Re:{color:2522282,radius:1.35},Rh:{color:687244,radius:1.35},Ru:{color:2330254,radius:1.3},S:{color:16777007,radius:1},Sb:{color:10379957,radius:1.45},Sc:{color:15132390,radius:1.6},Se:{color:16752896,radius:1.15},Si:{color:15714464,radius:1.1},Sm:{color:9371590,radius:1.85},Sn:{color:6717568,radius:1.45},Sr:{color:65280,radius:2},Ta:{color:5088767,radius:1.45},Tb:{color:3145670,radius:1.75},Tc:{color:3907230,radius:1.35},Te:{color:13924608,radius:1.4},Th:{color:47871,radius:1.8},Ti:{color:12566982,radius:1.4},Tl:{color:10835021,radius:1.9},Tm:{color:54354,radius:1.75},U:{color:36607,radius:1.75},V:{color:10855850,radius:1.35},W:{color:2200534,radius:1.35},Y:{color:9699327,radius:1.8},Yb:{color:48952,radius:1.75},Zn:{color:8159407,radius:1.35},Zr:{color:9691103,radius:1.55},bond:{color:789516,radius:.18},unknown:{color:0,radius:.8}}}\n",
"var $d = $('<div/>').attr('id', 'molecule_' + utils.uuid());$d.width(400); $d.height(300);imolecule.create($d, {drawingType: 'ball and stick', cameraType: 'perspective'});imolecule.draw({\"bonds\":[{\"order\":1,\"atoms\":[0,1]},{\"order\":1,\"atoms\":[0,2]},{\"order\":1,\"atoms\":[0,3]},{\"order\":1,\"atoms\":[0,4]},{\"order\":1,\"atoms\":[1,5]},{\"order\":1,\"atoms\":[1,6]},{\"order\":2,\"atoms\":[2,7]},{\"order\":1,\"atoms\":[2,8]},{\"order\":1,\"atoms\":[3,9]},{\"order\":2,\"atoms\":[3,10]},{\"order\":1,\"atoms\":[4,11]},{\"order\":1,\"atoms\":[5,12]},{\"order\":1,\"atoms\":[5,13]},{\"order\":1,\"atoms\":[6,14]},{\"order\":1,\"atoms\":[7,15]},{\"order\":2,\"atoms\":[8,16]},{\"order\":1,\"atoms\":[11,17]},{\"order\":1,\"atoms\":[12,18]},{\"order\":1,\"atoms\":[13,19]},{\"order\":1,\"atoms\":[13,20]},{\"order\":2,\"atoms\":[14,21]},{\"order\":2,\"atoms\":[15,22]},{\"order\":1,\"atoms\":[15,23]},{\"order\":1,\"atoms\":[17,24]},{\"order\":1,\"atoms\":[17,25]},{\"order\":1,\"atoms\":[18,26]},{\"order\":1,\"atoms\":[20,27]},{\"order\":1,\"atoms\":[6,7]},{\"order\":1,\"atoms\":[9,12]},{\"order\":1,\"atoms\":[14,19]},{\"order\":1,\"atoms\":[16,22]},{\"order\":1,\"atoms\":[18,24]},{\"order\":2,\"atoms\":[26,27]},{\"order\":1,\"atoms\":[1,28]},{\"order\":1,\"atoms\":[4,29]},{\"order\":1,\"atoms\":[4,30]},{\"order\":1,\"atoms\":[5,31]},{\"order\":1,\"atoms\":[8,32]},{\"order\":1,\"atoms\":[9,33]},{\"order\":1,\"atoms\":[9,34]},{\"order\":1,\"atoms\":[11,35]},{\"order\":1,\"atoms\":[11,36]},{\"order\":1,\"atoms\":[12,37]},{\"order\":1,\"atoms\":[13,38]},{\"order\":1,\"atoms\":[16,39]},{\"order\":1,\"atoms\":[18,40]},{\"order\":1,\"atoms\":[19,41]},{\"order\":1,\"atoms\":[19,42]},{\"order\":1,\"atoms\":[22,43]},{\"order\":1,\"atoms\":[23,44]},{\"order\":1,\"atoms\":[24,45]},{\"order\":1,\"atoms\":[24,46]},{\"order\":1,\"atoms\":[25,47]},{\"order\":1,\"atoms\":[25,48]},{\"order\":1,\"atoms\":[25,49]},{\"order\":1,\"atoms\":[26,50]},{\"order\":1,\"atoms\":[27,51]}],\"atoms\":[{\"location\":[-1.0055576923076925,-0.6022576923076927,-0.10503653846153847],\"element\":\"C\"},{\"location\":[-0.38095769230769244,0.7554423076923074,0.26256346153846155],\"element\":\"C\"},{\"location\":[-2.4866576923076926,-0.29825769230769267,0.05396346153846153],\"element\":\"C\"},{\"location\":[-0.6587576923076924,-0.9491576923076926,-1.5351365384615385],\"element\":\"C\"},{\"location\":[-0.7281576923076925,-1.8976576923076927,0.7487634615384615],\"element\":\"C\"},{\"location\":[0.7064423076923076,1.3178423076923071,-0.6519365384615384],\"element\":\"C\"},{\"location\":[-1.4826576923076924,1.7090423076923071,0.021763461538461523],\"element\":\"N\"},{\"location\":[-2.7252576923076925,0.9951423076923074,0.04376346153846154],\"element\":\"C\"},{\"location\":[-3.5669576923076924,-1.2765576923076927,0.13786346153846152],\"element\":\"C\"},{\"location\":[0.7255423076923075,-0.5084576923076927,-2.1748365384615385],\"element\":\"C\"},{\"location\":[-1.4720576923076925,-1.5823576923076925,-2.2138365384615386],\"element\":\"O\"},{\"location\":[0.6230423076923077,-2.6895576923076927,0.7136634615384615],\"element\":\"C\"},{\"location\":[1.6369423076923078,0.38944230769230725,-1.2272365384615385],\"element\":\"C\"},{\"location\":[1.2329423076923076,2.446242307692307,0.19016346153846153],\"element\":\"C\"},{\"location\":[-1.2498576923076925,3.1202423076923074,-0.023136538461538472],\"element\":\"C\"},{\"location\":[-4.107457692307692,1.5112423076923072,0.03436346153846152],\"element\":\"C\"},{\"location\":[-4.826757692307692,-0.8300576923076927,0.17786346153846155],\"element\":\"C\"},{\"location\":[1.8828423076923075,-2.102957692307693,1.2060634615384613],\"element\":\"N\"},{\"location\":[2.7265423076923074,-0.26395769230769267,-0.41173653846153846],\"element\":\"C\"},{\"location\":[0.18864230769230755,3.6236423076923074,0.02256346153846152],\"element\":\"C\"},{\"location\":[2.5635423076923076,2.9457423076923073,-0.05663653846153847],\"element\":\"O\"},{\"location\":[-2.1792576923076923,3.920342307692307,-0.16263653846153847],\"element\":\"O\"},{\"location\":[-5.110957692307692,0.6298423076923074,0.10436346153846153],\"element\":\"C\"},{\"location\":[-4.389257692307693,2.8633423076923075,-0.05033653846153847],\"element\":\"O\"},{\"location\":[2.7025423076923074,-1.7164576923076926,0.07826346153846152],\"element\":\"C\"},{\"location\":[2.6149423076923073,-3.290057692307693,1.6967634615384615],\"element\":\"C\"},{\"location\":[3.6729423076923076,0.6851423076923073,0.31406346153846154],\"element\":\"C\"},{\"location\":[3.6321423076923076,2.0348423076923075,0.31076346153846157],\"element\":\"C\"},{\"location\":[0.01894230769230759,0.6359423076923074,1.1712634615384614],\"element\":\"H\"},{\"location\":[-0.8612576923076924,-1.6286576923076925,1.7026634615384615],\"element\":\"H\"},{\"location\":[-1.4351576923076925,-2.5539576923076925,0.48526346153846156],\"element\":\"H\"},{\"location\":[0.3695423076923076,1.6280423076923072,-1.5409365384615386],\"element\":\"H\"},{\"location\":[-3.3696576923076926,-2.256557692307693,0.16476346153846155],\"element\":\"H\"},{\"location\":[1.2380423076923077,-1.3346576923076927,-2.4089365384615387],\"element\":\"H\"},{\"location\":[0.5330423076923076,0.011942307692307308,-3.0068365384615388],\"element\":\"H\"},{\"location\":[0.47404230769230754,-3.5219576923076925,1.2474634615384614],\"element\":\"H\"},{\"location\":[0.7816423076923076,-2.9308576923076926,-0.24373653846153848],\"element\":\"H\"},{\"location\":[2.3492423076923075,0.8884423076923074,-1.7208365384615385],\"element\":\"H\"},{\"location\":[1.3295423076923076,2.0721423076923076,1.1125634615384614],\"element\":\"H\"},{\"location\":[-5.582357692307692,-1.4802576923076927,0.25756346153846155],\"element\":\"H\"},{\"location\":[3.1135423076923074,-0.6229576923076927,-1.2610365384615385],\"element\":\"H\"},{\"location\":[0.2851423076923076,4.251142307692307,0.7951634615384615],\"element\":\"H\"},{\"location\":[0.38624230769230755,4.109642307692307,-0.8288365384615385],\"element\":\"H\"},{\"location\":[-6.057257692307692,0.9529423076923074,0.10736346153846153],\"element\":\"H\"},{\"location\":[-5.379957692307692,2.9990423076923074,-0.04153653846153847],\"element\":\"H\"},{\"location\":[3.644642307692308,-1.9530576923076928,0.31586346153846157],\"element\":\"H\"},{\"location\":[2.4035423076923075,-2.2739576923076927,-0.6962365384615384],\"element\":\"H\"},{\"location\":[3.5023423076923073,-3.0078576923076925,2.0611634615384613],\"element\":\"H\"},{\"location\":[2.7536423076923073,-3.9319576923076927,0.9425634615384616],\"element\":\"H\"},{\"location\":[2.0846423076923073,-3.734357692307693,2.418863461538461],\"element\":\"H\"},{\"location\":[4.403142307692308,0.26244230769230725,0.8508634615384616],\"element\":\"H\"},{\"location\":[4.476242307692308,2.4795423076923075,0.6104634615384615],\"element\":\"H\"}]});container.show();element.append($d);"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 27,
"text": [
"<pybel.Molecule at 0x10f697fd0>"
]
}
],
"prompt_number": 27
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Target prediction using RDKit and scikit-learn\n",
"---"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"Image(url='http://3.bp.blogspot.com/-4laOSUp4TzQ/Uj0t7ZZq6DI/AAAAAAAABFY/1GpO_uJoRWg/s1600/logo.lrg.png', )"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"html": [
"<img src=\"http://3.bp.blogspot.com/-4laOSUp4TzQ/Uj0t7ZZq6DI/AAAAAAAABFY/1GpO_uJoRWg/s1600/logo.lrg.png\"/>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 28,
"text": [
"<IPython.core.display.Image at 0x10f6cfe90>"
]
}
],
"prompt_number": 28
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"- RDKit is a newer cheminformatics library which is geared specifically towards cheminformatics. \n",
"- It supports a variety of fingerprints and descriptors, and provides python bindings.\n",
"- There is also a PostgreSQL plugin, that supports server-side similarity searches, fingerprint calculations etc. \n",
"\n",
"- Scikit learn is a machine learning library. It provides many different models, and works well with RDKit fingerprints."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from rdkit import Chem\n",
"from rdkit.Chem.Draw import IPythonConsole\n",
"from rdkit.Chem import PandasTools"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [],
"prompt_number": 29
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"We can execute SQL queries directly in the notebook. Load up sql tools, and connect to a postgresql database:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%load_ext sql\n",
"%sql postgresql://RichLewis@localhost/mix_model"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 30,
"text": [
"u'Connected: RichLewis@mix_model'"
]
}
],
"prompt_number": 30
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"This database was produced from ChEMBL, but stripped of any excess data and optimized to make it as fast as possible. It currently contains 3 tables from ChEMBL (compound, sar, target) and 2 from rdkit, along with cached morgan fingerprints. This is shown using a cell level (%%) sql magic function:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%sql \n",
"SELECT \n",
" table_schema,table_name\n",
"FROM \n",
" information_schema.tables \n",
"WHERE \n",
" table_schema IN ('public', 'rdk') \n",
"ORDER BY \n",
" table_schema,table_name"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"6 rows affected.\n"
]
},
{
"html": [
"<table>\n",
" <tr>\n",
" <th>table_schema</th>\n",
" <th>table_name</th>\n",
" </tr>\n",
" <tr>\n",
" <td>public</td>\n",
" <td>compound</td>\n",
" </tr>\n",
" <tr>\n",
" <td>public</td>\n",
" <td>morgan(2,2048)</td>\n",
" </tr>\n",
" <tr>\n",
" <td>public</td>\n",
" <td>sar</td>\n",
" </tr>\n",
" <tr>\n",
" <td>public</td>\n",
" <td>target</td>\n",
" </tr>\n",
" <tr>\n",
" <td>rdk</td>\n",
" <td>fps</td>\n",
" </tr>\n",
" <tr>\n",
" <td>rdk</td>\n",
" <td>mols</td>\n",
" </tr>\n",
"</table>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 31,
"text": [
"[(u'public', u'compound'),\n",
" (u'public', u'morgan(2,2048)'),\n",
" (u'public', u'sar'),\n",
" (u'public', u'target'),\n",
" (u'rdk', u'fps'),\n",
" (u'rdk', u'mols')]"
]
}
],
"prompt_number": 31
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"It is in as neutral a format as possible to allow for extra targets, compounds and SARs to be added."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"In this example, we select all molecules that we are confident bind to prothrombin (target_id 95), along with their binding affinity (pValue)"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"prothrombin_sar = %sql SELECT external_id, relation, activity_type, assay_type, \"pValue\", mols.m \\\n",
"FROM \\\n",
" sar NATURAL JOIN rdk.mols NATURAL JOIN compound \\\n",
"WHERE target_id = 95 \\\n",
" AND confidence_score = 9\n",
"prothrombin_sar[:10]"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"1524 rows affected.\n"
]
},
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 32,
"text": [
"[(u'CHEMBL101030', u'=', u'IC50', u'B', 7.14, 'O=C1O[C@H]2CCC[C@@H]2[C@@H]1Cc1ccccc1'),\n",
" (u'CHEMBL102081', u'=', u'IC50', u'B', 7.04, 'O=C1O[C@H]2CCC[C@@H]2[C@H]1Cc1ccccc1'),\n",
" (u'CHEMBL457155', u'=', u'IC50', u'B', 8.4, 'CC(C)=CC(=O)C[C@H]1C(=O)O[C@H]2C[C@]3(C)C4=CC[C@H]5[C@]6(C)C(=O)O[C@@H]6CC[C@]5(C)[C@H]4CC[C@@]3(C)[C@H]12'),\n",
" (u'CHEMBL323543', u'=', u'IC50', u'B', 6.89, 'N=C(N)CCCC[C@H]1C(=O)O[C@H]2CCC[C@H]12'),\n",
" (u'CHEMBL100989', u'=', u'IC50', u'B', 8.0, 'O=C1O[C@H]2CCC[C@@H]2[C@@H]1Sc1ccccc1'),\n",
" (u'CHEMBL323544', u'=', u'IC50', u'B', 4.77, 'N=C(N)c1ccc(C[C@H]2C(=O)O[C@H]3CCC[C@H]23)cc1'),\n",
" (u'CHEMBL318001', u'=', u'IC50', u'B', 7.72, 'CC(C)=CC(=O)C[C@@H]1C(=O)O[C@H]2CCCC12'),\n",
" (u'CHEMBL101041', u'=', u'IC50', u'B', 7.68, 'CC(C)=CC(=O)C[C@@H]1C(=O)O[C@H]2CCC[C@H]12'),\n",
" (u'CHEMBL99622', u'=', u'IC50', u'B', 8.22, 'O=C1O[C@H]2CCC[C@@H]2[C@H]1Sc1ccccc1'),\n",
" (u'CHEMBL102115', u'=', u'IC50', u'B', 7.01, 'C=CC[C@@H]1C(=O)O[C@H]2CCC[C@H]12')]"
]
}
],
"prompt_number": 32
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"This is not particularly helpful to visualize molecules, so we can use RDKit to draw the molecules into a table. To do this, we can use a pandas dataframe:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import pandas\n",
"from rdkit.Chem import PandasTools\n",
"\n",
"df = prothrombin_sar.DataFrame()\n",
"df = df.set_index('external_id')\n",
"PandasTools.AddMoleculeColumnToFrame(df, smilesCol='m', molCol='Molecules')\n",
"df = df.drop('m', 1)\n",
"df.head()"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"html": [
"<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>relation</th>\n",
" <th>activity_type</th>\n",
" <th>assay_type</th>\n",
" <th>pValue</th>\n",
" <th>Molecules</th>\n",
" </tr>\n",
" <tr>\n",
" <th>external_id</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>CHEMBL101030</th>\n",
" <td> =</td>\n",
" <td> IC50</td>\n",
" <td> B</td>\n",
" <td> 7.14</td>\n",
" <td> <img src=\"data:image/png;base64,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\" alt=\"Mol\"/></td>\n",
" </tr>\n",
" <tr>\n",
" <th>CHEMBL102081</th>\n",
" <td> =</td>\n",
" <td> IC50</td>\n",
" <td> B</td>\n",
" <td> 7.04</td>\n",
" <td> <img src=\"data:image/png;base64,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\" alt=\"Mol\"/></td>\n",
" </tr>\n",
" <tr>\n",
" <th>CHEMBL457155</th>\n",
" <td> =</td>\n",
" <td> IC50</td>\n",
" <td> B</td>\n",
" <td> 8.4</td>\n",
" <td> <img src=\"data:image/png;base64,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\" alt=\"Mol\"/></td>\n",
" </tr>\n",
" <tr>\n",
" <th>CHEMBL323543</th>\n",
" <td> =</td>\n",
" <td> IC50</td>\n",
" <td> B</td>\n",
" <td> 6.89</td>\n",
" <td> <img src=\"data:image/png;base64,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\" alt=\"Mol\"/></td>\n",
" </tr>\n",
" <tr>\n",
" <th>CHEMBL100989</th>\n",
" <td> =</td>\n",
" <td> IC50</td>\n",
" <td> B</td>\n",
" <td> 8.0</td>\n",
" <td> <img src=\"data:image/png;base64,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RkFBAbZt24aQkBC8//77OHLkCNzc3DBw4EA8++yzOHPmDAYOHIgvv/wS27dvh7Ozffzz1mg0vIrOz+zjb5QcwpkzZzB9+vSmK98EBwfjnXfeQUFBAXx8fDB06FA8/fTTKC4ubrqQrj1gYf0PC4tUIT8/H+PGjcPx48fx2GOP4emnn8aoUaPw3XffoWfPnli0aBGOHz+OXr164fbbb0d1dbXSkc2Gl/36H066k80zGAwYOnQo3N3d8corr2Dy5MkwGAxYtWoVFi1aBC8vL7zyyiu455574OTkBIPBABcXF6Vjm01FRQV8fX1x+PBhxMbGKh1HURxhkc1zcXHB/v37sWDBAixatAhRUVH45JNP8PDDD+Po0aNISUnBG2+8gaioKCxbtgz29n+wt7c3QkNDuVsIFhaphJOTEyZNmoRdu3bhrbfewtKlSxEYGIgPP/wQEyZMwK5du7B48WKsWLECZWVlSsc1u/j4eBYWuEtIKmUwGJCQkICtW7fC398fs2fPRmJiIrp27ap0NIt4+eWXcfToUfz73/9WOoqiOMIiVXJxccE333yDhx56CPX19VixYgViY2ORl5endDSL4JHCBiwsUi0XFxcsX74cDz74IM6dO4f58+cjMjJS6VgWodFocPLkSVRVVSkdRVEsLFI1JycnvPfee3jooYcwd+5cnDp1SulIFtG/f3+4uLggPz9f6SiKYmGR6jk5OeHdd99FYmIixo4diz179igdyezc3d3Rr18/hz9Fx1XpAETm8vrrr8PFxQV333031q9fj1GjRikdyaw4j8XCIjuzcOFCdO3aFePGjUNmZiZuv/12pSOZjUajwfbt25WOoSjuEpLdSU5OxsKFCzFp0iRkZWUpHcdsYmNjcfDgQaVjKIojLLJLL774Iry8vDB58mSsXr0akydPVjpShxmNRnz++eeYN28ebr31VogInJyclI6lCBYW2a2nnnoKLi4uePDBB/HZZ59hypQpSkdqFxHBv/71L8yfPx/l5eV49dVXMWPGDIctK4C7hGTnnnzySSxfvhwPP/wwVq5cqXQck61btw4jRozAk08+iZkzZ6KoqAiJiYlwd3dXOpqiOMIiu/fwww/DxcUF06dPh16vx4wZM5SO1KLs7GzMnTsXeXl5SEpKwvfff48ePXooHctmsLDIITz44INwcXHBI488gqqqKjzzzDNKR/qVgwcP4oUXXsDWrVvx+OOP44svvkCfPn2UjmVzWFjkMO6//3507doVU6dOhV6vx5/+9CelI+HkyZOYM2cO1qxZgylTpuDw4cOIiYlROpbN4hwWOZSJEydizZo1mDt3Lt555x3FcpSUlGDWrFlNlyHbt28fMjIyWFZt4AiLHM7vf/97rF+/HgkJCaisrERKSorVXru8vBxvvPEGli5diqFDh2Lz5s24+eabrfb6asfCIoc0ZswYrF+/HhMnTkR1dTW0Wq1FX6+mpgZLlizB4sWLERISgn//+9+48847Lfqa9oiFRQ7rlltuwaZNm3D33XfDYDBg8eLFZn8Ng8GA5cuX4y9/+Qvc3d3x0Ucf4b777rObS5BZGwuLHNqwYcOQlZWFu+++G5WVlVi6dKlZyqRx0WdKSgrKysqwcOFCzJw5E25ubmZI7bhYWOTwhg4dio0bN2LcuHEwGAz4+OOPO1Vamzdvxty5c3H8+HHMmTMHzz77LLp162bGxI6L41IiAIMGDcL27dvx7bffYtq0adDr9e1+jr1792LcuHFISEjA2LFjceLECSQnJ7OszIiFRfSz/v37Y8uWLcjOzsYjjzxi8oVLjx8/jgceeAC33HILbrzxRpw+fRparRb+/v4WTux4WFhEv9CvXz9kZ2cjNzcXU6ZMQW1tbYv3PXXqFB577DEMHDgQfn5+KCgogFarRc+ePa2Y2LGwsIh+o2/fvtiyZQsKCgrwhz/84brL3l+8eBGzZs1C//79UVNTg7179yItLQ1hYWEKJXYcLCyiZoSGhiI7OxvFxcUYP348KisrodPpMGfOHERGRuL48ePYunUrMjIyEBcXp3Rch8ELqRK14uzZs7jjjjvg6+uLkpISeHp64vXXX8d9993n0N9LpRQWFlEbzp8/jy+++AK+vr6YPn06XFxclI7ksFhYRKQanMMiItVgYRGRarCwiEg1WFhEpBosLCJSDRYWEakGC4uIVIOFRUSqwcIiItVgYRGRarCwiEg1WFhEpBosLCJSDRYWEakGC4uIVIOFRUSqwcIiItVgYRGRarCwiEg1WFhEpBosLCJSDRYWEakGC4uIVIOFRUSqwcIiItVgYRGRarCwiEg1WFhEpBosLCJSDRYWEakGC4uIVIOFRUSqwcIiItVgYRGRarCwiEg1WFhEpBosLCJSDRYWEakGC4uIVIOFRUSqwcIiItVgYRGRarCwiEg1WFhEpBosLCJSDRYWEakGC4uIVIOFRUSqwcIiItVgYRGRarCwiEg1WFhEpBosLCJSDRYWEakGC4uIVIOFRUSqwcIiItVgYRGRarCwiEg1WFhEpBosLCJSDRYWEakGC4uIVIOFRUSqwcIiItVgYRGRarCwiEg1WFhEpBosLCJSDRYWEakGC4uIVOP/A+ZmL6RdnEZwAAAAAElFTkSuQmCC\" alt=\"Mol\"/></td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 33,
"text": [
" relation activity_type assay_type pValue Molecules\n",
"external_id \n",
"CHEMBL101030 = IC50 B 7.14 <img src=\"data:image/png;base64,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\" alt=\"Mol\"/>\n",
"CHEMBL102081 = IC50 B 7.04 <img src=\"data:image/png;base64,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\" alt=\"Mol\"/>\n",
"CHEMBL457155 = IC50 B 8.4 <img src=\"data:image/png;base64,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\" alt=\"Mol\"/>\n",
"CHEMBL323543 = IC50 B 6.89 <img src=\"data:image/png;base64,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\" alt=\"Mol\"/>\n",
"CHEMBL100989 = IC50 B 8.0 <img src=\"data:image/png;base64,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RkFBAbZt24aQkBC8//77OHLkCNzc3DBw4EA8++yzOHPmDAYOHIgvv/wS27dvh7Ozffzz1mg0vIrOz+zjb5QcwpkzZzB9+vSmK98EBwfjnXfeQUFBAXx8fDB06FA8/fTTKC4ubrqQrj1gYf0PC4tUIT8/H+PGjcPx48fx2GOP4emnn8aoUaPw3XffoWfPnli0aBGOHz+OXr164fbbb0d1dbXSkc2Gl/36H066k80zGAwYOnQo3N3d8corr2Dy5MkwGAxYtWoVFi1aBC8vL7zyyiu455574OTkBIPBABcXF6Vjm01FRQV8fX1x+PBhxMbGKh1HURxhkc1zcXHB/v37sWDBAixatAhRUVH45JNP8PDDD+Po0aNISUnBG2+8gaioKCxbtgz29n+wt7c3QkNDuVsIFhaphJOTEyZNmoRdu3bhrbfewtKlSxEYGIgPP/wQEyZMwK5du7B48WKsWLECZWVlSsc1u/j4eBYWuEtIKmUwGJCQkICtW7fC398fs2fPRmJiIrp27ap0NIt4+eWXcfToUfz73/9WOoqiOMIiVXJxccE333yDhx56CPX19VixYgViY2ORl5endDSL4JHCBiwsUi0XFxcsX74cDz74IM6dO4f58+cjMjJS6VgWodFocPLkSVRVVSkdRVEsLFI1JycnvPfee3jooYcwd+5cnDp1SulIFtG/f3+4uLggPz9f6SiKYmGR6jk5OeHdd99FYmIixo4diz179igdyezc3d3Rr18/hz9Fx1XpAETm8vrrr8PFxQV333031q9fj1GjRikdyaw4j8XCIjuzcOFCdO3aFePGjUNmZiZuv/12pSOZjUajwfbt25WOoSjuEpLdSU5OxsKFCzFp0iRkZWUpHcdsYmNjcfDgQaVjKIojLLJLL774Iry8vDB58mSsXr0akydPVjpShxmNRnz++eeYN28ebr31VogInJyclI6lCBYW2a2nnnoKLi4uePDBB/HZZ59hypQpSkdqFxHBv/71L8yfPx/l5eV49dVXMWPGDIctK4C7hGTnnnzySSxfvhwPP/wwVq5cqXQck61btw4jRozAk08+iZkzZ6KoqAiJiYlwd3dXOpqiOMIiu/fwww/DxcUF06dPh16vx4wZM5SO1KLs7GzMnTsXeXl5SEpKwvfff48ePXooHctmsLDIITz44INwcXHBI488gqqqKjzzzDNKR/qVgwcP4oUXXsDWrVvx+OOP44svvkCfPn2UjmVzWFjkMO6//3507doVU6dOhV6vx5/+9CelI+HkyZOYM2cO1qxZgylTpuDw4cOIiYlROpbN4hwWOZSJEydizZo1mDt3Lt555x3FcpSUlGDWrFlNlyHbt28fMjIyWFZt4AiLHM7vf/97rF+/HgkJCaisrERKSorVXru8vBxvvPEGli5diqFDh2Lz5s24+eabrfb6asfCIoc0ZswYrF+/HhMnTkR1dTW0Wq1FX6+mpgZLlizB4sWLERISgn//+9+48847Lfqa9oiFRQ7rlltuwaZNm3D33XfDYDBg8eLFZn8Ng8GA5cuX4y9/+Qvc3d3x0Ucf4b777rObS5BZGwuLHNqwYcOQlZWFu+++G5WVlVi6dKlZyqRx0WdKSgrKysqwcOFCzJw5E25ubmZI7bhYWOTwhg4dio0bN2LcuHEwGAz4+OOPO1Vamzdvxty5c3H8+HHMmTMHzz77LLp162bGxI6L41IiAIMGDcL27dvx7bffYtq0adDr9e1+jr1792LcuHFISEjA2LFjceLECSQnJ7OszIiFRfSz/v37Y8uWLcjOzsYjjzxi8oVLjx8/jgceeAC33HILbrzxRpw+fRparRb+/v4WTux4WFhEv9CvXz9kZ2cjNzcXU6ZMQW1tbYv3PXXqFB577DEMHDgQfn5+KCgogFarRc+ePa2Y2LGwsIh+o2/fvtiyZQsKCgrwhz/84brL3l+8eBGzZs1C//79UVNTg7179yItLQ1hYWEKJXYcLCyiZoSGhiI7OxvFxcUYP348KisrodPpMGfOHERGRuL48ePYunUrMjIyEBcXp3Rch8ELqRK14uzZs7jjjjvg6+uLkpISeHp64vXXX8d9993n0N9LpRQWFlEbzp8/jy+++AK+vr6YPn06XFxclI7ksFhYRKQanMMiItVgYRGRarCwiEg1WFhEpBosLCJSDRYWEakGC4uIVIOFRUSqwcIiItVgYRGRarCwiEg1WFhEpBosLCJSDRYWEakGC4uIVIOFRUSqwcIiItVgYRGRarCwiEg1WFhEpBosLCJSDRYWEakGC4uIVIOFRUSqwcIiItVgYRGRarCwiEg1WFhEpBosLCJSDRYWEakGC4uIVIOFRUSqwcIiItVgYRGRarCwiEg1WFhEpBosLCJSDRYWEakGC4uIVIOFRUSqwcIiItVgYRGRarCwiEg1WFhEpBosLCJSDRYWEakGC4uIVIOFRUSqwcIiItVgYRGRarCwiEg1WFhEpBosLCJSDRYWEakGC4uIVIOFRUSqwcIiItVgYRGRarCwiEg1WFhEpBosLCJSDRYWEakGC4uIVIOFRUSqwcIiItVgYRGRarCwiEg1WFhEpBosLCJSDRYWEakGC4uIVOP/A+ZmL6RdnEZwAAAAAElFTkSuQmCC\" alt=\"Mol\"/>"
]
}
],
"prompt_number": 33
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"We can plot the pValue (the pKi, pIC50 etc. values combined) distribution in a histogram using matplotlib:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"array = numpy.array(df['pValue'], dtype=float)\n",
"num_bins = 15\n",
"\n",
"# the histogram of the data\n",
"n, bins, patches = plt.hist(array, num_bins, facecolor='green', alpha=0.5)\n",
"plt.xlabel('pValue')\n",
"plt.ylabel('Density')\n",
"plt.title(r'Plot of bioactivities for {target}'.format(target = 'Prothrombin'))\n",
"plt.show()"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0x11604afd0>"
]
}
],
"prompt_number": 34
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"Creating the target prediction model\n",
"-----\n",
"We now need to set up a feature vector and corresponding class labels. In this case the problem can be reduced to a two class (Binder or non-binder) problem. We shall use morgan fingerprints as features. These have been precalculated, so we start by retrieving them from database:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"result = %sql \\\n",
"SELECT \\\n",
"compound_id, \"pValue\", fingerprint \\\n",
"FROM sar NATURAL JOIN \"morgan(2,2048)\" \\\n",
"WHERE target_id = 95"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"4737 rows affected.\n"
]
}
],
"prompt_number": 35
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"Insert them into arrays:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import cPickle\n",
"X = np.zeros((len(result),2048),dtype=uint8)\n",
"y = np.zeros((len(result)),dtype=float)\n",
"for count, line in enumerate(result):\n",
" compound_id, pValue, pickle = line\n",
" fp = cPickle.loads(str(pickle))\n",
" X[:][count] = fp\n",
" y[count] = pValue\n",
"print 'Shape of X:', X.shape #dimensions\n",
"print 'Shape of y:', y.shape"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Shape of X: (4737, 2048)\n",
"Shape of y: (4737,)\n"
]
}
],
"prompt_number": 36
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"We binarize into two classes, by 6.5 to achieve approximately equal class sizes:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"y_binarized = y > 6.5 #binarize \n",
"y_binarized"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 37,
"text": [
"array([False, False, False, ..., True, True, True], dtype=bool)"
]
}
],
"prompt_number": 37
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"We can now use one of scikit-learn's classification algorithms in a 5 fold cross validation, plot a confusion matrix and summary of the model produced. "
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from sklearn.naive_bayes import BernoulliNB\n",
"from sklearn import cross_validation\n",
"from sklearn.metrics import classification_report\n",
"from sklearn.metrics import confusion_matrix\n",
"\n",
"classifier = BernoulliNB() \n",
"\n",
"cv = cross_validation.StratifiedKFold(y_binarized, n_folds = 5)\n",
"\n",
"pred = numpy.zeros(len(y_binarized),dtype=bool)\n",
"\n",
"for train, test in cv:\n",
" pred[test] = classifier.fit(X[train], y_binarized[train]).predict(X[test])\n",
"\n",
"cm = confusion_matrix(y_binarized, pred)\n",
"print 'Confusion matrix'\n",
"print cm\n",
"\n",
"pl.matshow(cm)\n",
"pl.title('Confusion matrix')\n",
"pl.colorbar()\n",
"pl.ylabel('True label')\n",
"pl.xlabel('Predicted label')\n",
"pl.show()\n",
"print classification_report(y_binarized, pred)"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Confusion matrix\n",
"[[1986 479]\n",
" [ 519 1753]]\n"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0x115001c10>"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
" precision recall f1-score support\n",
"\n",
" False 0.79 0.81 0.80 2465\n",
" True 0.79 0.77 0.78 2272\n",
"\n",
"avg / total 0.79 0.79 0.79 4737\n",
"\n"
]
}
],
"prompt_number": 38
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"We can also generate ROC curves:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from sklearn.metrics import roc_curve, auc\n",
"\n",
"pred_prob = numpy.zeros((len(y_binarized),2),dtype=float)\n",
"\n",
"for train, test in cv:\n",
" pred_prob[:][test] = classifier.fit(X[train], y_binarized[train]).predict_proba(X[test])\n",
"\n",
"fpr, tpr, thresholds = roc_curve(y_binarized, pred_prob[:, 1])\n",
"roc_auc = auc(fpr, tpr)\n",
"pl.plot(fpr, tpr, lw=1, label='ROC (area = %0.2f)' % (roc_auc))\n",
"pl.plot([0, 1], [0, 1], '--', color=(0.6, 0.6, 0.6), label='Luck')\n",
"pl.xlim([-0.05, 1.05])\n",
"pl.ylim([-0.05, 1.05])\n",
"pl.xlabel('False Positive Rate')\n",
"pl.ylabel('True Positive Rate')\n",
"pl.title('ROC Curve')\n",
"pl.legend(loc=\"lower right\")\n",
"pl.show()"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0x1152b3210>"
]
}
],
"prompt_number": 39
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"We can use different classifiers:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from sklearn.neighbors import KNeighborsClassifier\n",
"from sklearn.tree import DecisionTreeClassifier\n",
"from sklearn.ensemble import RandomForestClassifier\n",
"from sklearn.linear_model import LogisticRegression\n",
"\n",
"classifiers = {'lr':LogisticRegression(), \n",
" 'rf':RandomForestClassifier(), \n",
" 'dt':DecisionTreeClassifier(),\n",
" 'knn':KNeighborsClassifier(),\n",
" 'bnb':BernoulliNB()}\n",
"\n",
"for name, classifier in classifiers.iteritems():\n",
" \n",
" pred_prob = numpy.zeros((len(y_binarized),2),dtype=float)\n",
"\n",
" for train, test in cv:\n",
" pred_prob[:][test] = classifier.fit(X[train], y_binarized[train]).predict_proba(X[test])\n",
" \n",
" fpr, tpr, thresholds = roc_curve(y_binarized, pred_prob[:, 1])\n",
" roc_auc = auc(fpr, tpr)\n",
" pl.plot(fpr, tpr, lw=1, label='ROC %s (area = %0.2f)' % (name, roc_auc))\n",
" \n",
"pl.plot([0, 1], [0, 1], '--', color=(0.6, 0.6, 0.6), label='Luck',)\n",
"pl.xlim([-0.05, 1.05])\n",
"pl.ylim([-0.05, 1.05])\n",
"pl.xlabel('False Positive Rate')\n",
"pl.ylabel('True Positive Rate')\n",
"pl.title('ROC Curve')\n",
"pl.legend(loc=\"lower right\")\n",
"pl.show()\n",
" "
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAXwAAAEUCAYAAAAoQI39AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd4VMX6wPHvbrK76YUE0gs99CK9SZUiYOGKAhexo9i9\nlis28Oe1V1QUvLarKIKiSI1SgvQAIp1AAoEkhJRN2c0mW8/8/lhYCamQDvN5nn02Z8+cObMhvDs7\n5z0zKiGEQJIkSbriqRu6AZIkSVL9kAFfkiTpKiEDviRJ0lVCBnxJkqSrhAz4kiRJVwkZ8CVJkq4S\nMuBLTVJsbCxeXl74+voSGhrK9OnTMRgMpcps27aN4cOH4+fnR0BAABMnTuTIkSOlyhgMBh577DFi\nYmLw9fWlTZs2PP744+j1+nLPK4Rg3rx5dOnSBR8fH6Kiopg8eTIHDx6ss/cqSbVFBnypSVKpVKxc\nuRKj0ci+ffs4cOAAr7zyimv/9u3bGT16NDfddBOZmZmcPHmSbt26MXDgQE6ePAmA1WplxIgRHDly\nhPj4eIxGI9u3byc4OJjExMRyz/voo48yb948PvzwQ/Lz8zl27Bg33ngjq1atuuT3YLfbL+/NS9Ll\nEpLUBMXGxor169e7tp966ikxbtw41/agQYPEgw8+WOa4sWPHittvv10IIcRnn30mQkJChMlkqtY5\njx07Jtzc3MSuXbsqLHPttdeK//73v67tL7/8UgwaNMi1rVKpxMcffyzatm0rWrZsKR544AHx5JNP\nlqpj4sSJ4t133xVCCJGRkSFuvvlm0bx5c9GyZUsxb968arVVksoje/hSkyXO3SSenp7O2rVr6du3\nLwDFxcVs376dW265pcwxkydP5vfffwdg3bp1jB07Fi8vr2qdb/369URFRdGrV68Ky6hUKlQqVaX1\nLF++nMTERI4cOcKUKVP44YcfXPvy8/P5/fffmTJlCoqiMGHCBHr06MGZM2dYv34977//Pr/99lu1\n2itJF5MBX2qShBDceOON+Pn5ER0dTevWrXn++ecByMvLQ1EUwsLCyhwXGhpKbm4uAHq9vtwyFdHr\n9YSGhta47c8++ywBAQHodDoGDRqESqVi8+bNAPz4448MGDCA0NBQdu3aRW5uLs8//zzu7u60bNmS\ne+65h8WLF9e4DdLVSQZ8qUlSqVQsX74cg8FAQkICGzZsYPfu3QAEBgaiVqvJzMwsc1xmZibNmzcH\nIDg4mDNnzlT7nEFBQeXWeamioqJcP6tUKm677Ta+//57AL777jumTZsGwKlTpzhz5gyBgYGux2uv\nvUZ2dnaN2yBdnWTAl5q8IUOG8PDDD/PMM88A4O3tTf/+/VmyZEmZskuWLGHEiBEAjBw5kvj4eIqL\ni6t1nhEjRpCens6ePXsqLOPt7Y3JZHJtnz17tkyZi4d8pkyZwo8//sipU6dITExk0qRJAERHR9Oy\nZUvy8/NdD4PBwMqVK6vVXkm6mAz40hXhscceIzExkZ07dwLw+uuv8/XXX/Phhx9iNBrJz8/n+eef\nZ+fOnbz00ksATJ8+naioKCZNmkRSUhKKoqDX63n11VdZs2ZNmXO0bduWWbNmMWXKFDZt2oTVasVs\nNrN48WLeeOMNALp3786yZcsoKSkhOTmZzz//vMq2d+/eneDgYO655x7GjBmDn58fAH369MHX15c3\n33yTkpISHA4HBw8edH2TkaRLJQO+dEUIDg5mxowZrsA7cOBA4uPjWbZsGeHh4cTGxrJv3z62bNlC\n69atAdBqtaxbt464uDhGjRqFv78/ffv2JS8vj379+pV7nnnz5vHQQw/x4IMPEhgYSJs2bVi+fDkT\nJ04E4PHHH0er1RISEsKdd97JP//5z1I9+oou6E6dOpUNGzYwdepU12tqtZqVK1fy119/0apVK5o3\nb859991X5n4DSaoulRByPnxJkqSrgezhS5IkXSVkwJckSbpKyIAvSZJ0lXBv6AZUpKq7FSVJkqTy\nVXRptlH38IUQl/V46aWXLvvYpvqQ7/nqeMj3fHU8avKeK9OoA74kSZJUe2TAlyRJukpckQF/6NCh\nDd2Eeiff89VBvuerQ12950Z745VKpapyPEqSJEkqrbLYeUX28CVJkqSyaj3g33XXXYSEhNClS5cK\nyzzyyCO0bduWbt26sXfv3tpugiRJklSOWg/4d955J2vXrq1w/+rVq0lOTub48eMsXLiQBx54oLab\nIEmSJJWj1gP+4MGDCQwMrHD/r7/+yowZMwDo27cvBQUFZGVl1XYzJEmSpIvU+522GRkZpVb8iYyM\nJD09nZCQkDJl58yZ4/p56NChV+XVekmSKiaEwC4EZ61WrEIgAOXcszi3X7ng5/OvlypzwXaxw0Ge\n3Q6A3SGw2gQWsx2rxY7NbMNmsWOz2Mi0WnHY7Ch2B3abHYfdgcVagsVegsNuw2w3YrRnY1GKcBMq\nbO6eFHv5obVZARUqoUKlqPAu0hBYoCWgQEtAvpaAAg3N1Cp8UXHj1yMJDgmo8neQkJBAQkJCtX5f\nDTK1wsVXkCuaRuHCgC9JUuOjCEGe3U6Jw0G6xcLxkhIyrVYOmUzo1GpXMFUuerY7wKE4n+0OhXSL\nGZui4K4IFIdAEQoORaAoivM4IRCKQMH5swPBWV931IozlvgX29HZHKgU4XwIBZUQqBQFlSJQi3Ov\nKQpqRXFtq8X5befDpnHD3W4nJisLjWLHXThAEagUlfOTAQcgcKicdTcrLAC1GbXKgVYl0KBG4IYP\nCtEl/vgXheJT5I9XkQcexR40y3fDw+SBR5EHHiYtdq0Ds58Ns78NSzMr5n7FKK2tlJzV4u3tWa1/\ng4s7w3Pnzq2wbL0H/IiICNLS0lzb6enpRERE1HczJKlJE0JgEYICu50cqxW7ENgUgcUhKLYKjptK\nUDnUWO0Ci03BZrFjMduw2+xk2syY7XaS3CxkudkxqhU87SAQKML57Oz5XtAjVnHuFRDnYp9QqbBq\n3QAI1puwaN2ITdPTIreQ0JwCmqfn4K7Y0DhsuDtsaBQbGsWKVtjQCBtaxYpOWFErCnaVBq9iG54l\nNhTcUXBH4Iai0oDKHUWtQajdEWoNqN3BTYNGqAk0K7i5aRBaHWi1oNWh0mlR6bTg4fxZ7aFD7aFF\n7anDzVOL8HAjX60n3XEKm1bBrgWHVnDEdBizUHBowBKtYFY7OFh4HBsOkvOSEQi6hnRleMxwohxR\ntDa3xu2sG+qzalpaWiLOCCzpFixpFiwZFtx93dFF6dBF6tB1OPd8btsjygNthBY3T+fvLzc3l4SE\nBJr7hDB48GC8vb3r5O+m3gP+xIkT+eijj7jtttvYsWMHAQEB5Q7nSFJjoihgtZZ+WCxlX6vs9TyH\nDaPNgdmuUKQ4yFdbsTkEZkUhT2vGroBNUbAJQYnWRonOhk1jp6hZMWqLG4paQaWyYw20orip0Vrt\nWLXuBBQWEZqdj7vDgcZhx00oWLXuxJ0+jcZhQ6PYUSmgVgAFNEKNr9VOpzwj7U+dJajQjEZRIdQa\nhJvGGVTdNajctYhzz2g0qDQaVFotaq0WN60WlVaD2kOHp0bjDKYeWty8vHALCMAtvB1u/bW4e2lx\n99Kh9dHi7q1D461F4+MMxOjOBWn3yw9DZruZTGMmZ4xnKLQUYnVYMVlNHM87jiKK2J+1H62bFovD\nwr6z+zhjPIPNZAOgU/NOdGzeEV+dLxq1BkEzOgR1oIWlBbpsHdpsLaosFUGFQbhlueF21g1bhg1r\nhhU3H7dSAVwXpUPX5YLtSJ0rmFfl1KlTbNq0iX79+tG2bds6nTiy1m+8Or/eZ25uLiEhIcydOxeb\nzfkLnjlzJgAPPfQQa9euxdvbmy+//JKePXuWbZi88UpqAMXFcPQoHD789+PQITh50hmXtFrQaAVa\nHwV3bwWiilE1s+HuoaD2ULCEmzDGFoJaYA4wY/Gy4WZT49AoAPgW63ATalApaBUINanRKXbcFRuB\nFitBJWY8bGY8bWa0djNtc3LwNRmJPZtB0J8JqHz8sPQdTmCPAWjDQ3H3cgbR88HUzetcENVd8KzR\nQBOeffZk/km+2f8Nu8/sJtuUTW5xLin5KXi6e1JiL8FH60OQZxBBXkFE+UXhrnZ+gHRq0QkVKjoE\nd0DnrkMlVEQ6IoktjkWcFc6e+PkeeboFc5oZa4YVtbcajyiPsgH9/HOEDjev6gXz6rBardhstlrr\n1VcWO+WdttJVqagIjhwpHdgPH4aMbIXYnlYieliIaqXg08pCSQsTKl87xcLBCr0ek8OBAAJUKoqE\noLfDQaTVitZqJdpkIrawkI7Z2XgVFhKenY1vbi7a/Hzc8/NRGQxgMIDNBn5+zoe/f+nnil7r1Ana\ntGnoX12dsDqsbD61mf/t/x/6Yj2nC0+TZcqi2FZMkbWIzi06MyBqAKNbjybaP5ogzyBaeLfAw90D\nN7UbQghsubZSAbzMc7oFtbfaNaRSbkCPrN1g3hBkwJeuSDZFweBwYBMCm6JgdDjYbzLhEAKropBl\ns5FlspOSayWpqIRT7kbci9TYHQpCKLhrBGp3gcpNoFILhBqMGndUQhBVVEQbvR53q5XgggLanT5N\nbFoafvn59EtLo4Wi4HY+EF9K0D7/s6dnk+51V4cQglOFpygwF3Ai/wQGi4H9WftJN6RjtBpRhEKR\ntYi9mXspsZegVqmZ0G4C17e9ntiAWIK8ggjzCSPQIxC3QjfMaeaKA3qGBbWnutQYebk9c++GDeaK\noqBW1+0EBzLgS03OXqORTKuVk2YzDiEotNtZlZfHXqORAHd3LA4HhYozE6O53Y7GZqdEpcLXZKbL\n8Qzci824W8zo7BY6p58kwGygfVomoWYr7r7eeAR44+bjg5uPD+rzz35+aL298aoskHt7Qx3/h23M\nhBD8ceoPTDYTOaYccopzsDlspBamsufMHoqsRahVanKKc8gtzgWgW0g3FKHQKrAVAR4BdA/tToBH\nAGE+YejcdHgWeRJdHI0mW1Nxz9xTXeaiZ5meeQMH88o4HA727t3L2bNnGT9+fJ2eSwZ8qVFShMDk\ncJBQUMCGggKKHQ72FhVxxmwmw2ZjqN2OX0kJXkVFBOv1eBYUcNO69cQcOYLi5kORWwhZ1nCOmqJI\nt4XiFe5PQIw/zVv7ER7nT0wXP8La+6EO9AdfX3BrvAGhMRBCsC/LeWHTYreQWpBKkj6J1cdXk2HM\nwFvjjdFqRKPWMLLVSDRuGtzV7rQLaoeHmwe+Ol+GxAzBS+OF1k1LsGcw3sXepcbIywvoag91maGV\nUgE9QoebT9P9t8vNzWXTpk14e3vXaQbOeTLgS/VOCEFSSQl6m40SReH3vDyKHA6yzWZOFRWhslhI\nPDek4WOzMeLkSYbv24d3ZibdT56ktVDh8AjlrHsUJ+zRHDREk5jp/DmgUwRtO+vo2BHXIyrqih8h\nuWSpBalkGDJIM6RRZC3C5rBhU2zYFTt7z+7luP44VoeVvWf34q3xxmQzAc4eecvAlmjUGoK8goj1\nj+UfHf9BsFcwOncdOjcdAPY8e5mLnmV65jp1uWPlroAe2bSDeWXO9+oPHz5cLxk458mAL9UPRYHs\nbNafPMmzRUXs0mjok5+Pp8mEtriYvgcO0DI1FZ2PD63VavwDAohy8yddHc0xcxT78qLZnhHNrmP+\nOBzOa5QXBvWOHSE8XAb2C5ntZo7mHuXzvZ9TZC3iSM4RLA4LpwtPk1eSR8fmHWnu1RwvjRfR/tFo\n3DRo1BpUKhXtmrWje2h3/D38ifCNwFPjibva3Xn3ar693CyWUj1zbdme+cV55u6+jXbZ7DqXmprK\n0aNH66VXfyEZ8KXa43DAtm2QlQUJCWAwcNBs5rdmzVjXqhVbOnfG6OXF1KNH+fT4cXzDwxGRUeR4\nRXOkKJq/MkM4dNTNlRWjVjsD+8XBPSREBvbzHIqDDGMG+mI9y5OWY3FYKDQXsu7EOo7nHcfT3ZO4\n4Djuu+Y+PN09ad2sNb5aX2IDYvH38C9VlyuYlzO04gro6RbUmvJ75heOmV/Nwbw6zsev+ujVX0gG\nfOny2GzOpPS//oK9e+Gvv7Bt3866kSPZPnAgX3fuzGkfHwBaubkxNLAZQ9xDCUoNJOmQulS6o6fn\n38H8wuDevHkDv8dGwqE4OJh9kD8z/2TTqU0k5yWTbcrmeN5xV5nOLTpjsBi4Me5GWga0xNPdk4nt\nJxLmGwacC+YFZXvmFwd0lbuqytREdz8ZzJsqGfClqhUVwb59pYI7hw9DdDQ5/fpxrHdvfmnfnrfP\n3RU5xN+fMYFBdM0IZcdvGtb/ruLAAWciy8WBvUMHCApq4PfXCB3MPsiHiR9yquAU8SnxAHRs3pE+\nEX0YHjucmIAYWga0JNIvEsAZzKvIM0dN5amJMpjXOofD4brRtDGQAV8q7ezZv4P6+eeMDGeE7t4d\nevQgs1s33gsM5K1zU1dH6XRE6XT0cgukw64Y1serWb8eoqNh9Gi47jq45hoIqHpyv6tOVlEWhZZC\nsk3Z7EzfycbUjSTnJZOkT6J3eG/u6HYHo1uMpoWhBdYMa4UBHdW5YF5JQJfBvH6dz8Dx9/dnxIgR\n9T58Ux4Z8K9WigLJyX8H9fMB3maDHj2cj+7dnY/27TECj6ek8M3Zs1iFoLO3N5ObhdAtOYKEeDfi\n4yE7G0aN+jvIh4U19JtsXIQQ5BTn8NqW1ziae5QTeSfIOJNBL3rRrLAZba1tiSmOoa2lLX55fqjO\nqrCkXRDMK8k1d/eXwbyxaKgMnOqQAf9qYrfDqlXw/vvOi6otW7p67a7gHhnpuiIqhCDHZiM+L4/b\njx7FQ63mae/WuG9rztZVWrZtg27dnAF+9Gjo2VOms58nhMBeaCf5UDJrNq9h957d6HJ0NDc0J8wY\nRpwtDo9cD9So8YzyrDSgu/m5NZqAIVUuLy+PjRs31lte/aWSAf9KZ7HA+vXw00/w66/Ou0EffBAm\nT4aYmFJFT5vN/JafzxGTiU2FhSQVF1PscOCnaAlLCcb4ahvUipoxY5wBfvjwq3eYxl5YeszckGog\n9UgqxlNG1GfVeOR4oEJFtl82xcHFhLQJoW2ntgS2CsQzytMV0N38ZTC/khQUFJCdnd2oevUXkgH/\nSmQywdq1ziC/Zg107gyTJsFNN5UJ8ooQLM7O5qmUFM5YrXTw8qKNxQ9Lshdn1wZwIt6XQf1VriDf\nvv2VnxJpN5SfZ150qghzuhlbug2H3UFx82Ky/bJJ0aVw1u8sxkAj7bq0I7R1KDEdYhjUeRCBnoGo\nVVfvdAtS4yID/pWioABWroRly5w9+r594eab4cYbITTUVUwIwZtpaZwym9lSWMgBk/MOyh7FwYT9\n2oqdP3oRGuoM7mPGwODB4OHRUG+q9tkNVeSZp1kQDoEmUoMpyESGTwapHqnsZjc5fjm4R7iT6Z1J\ncFgwt3e7HbVKzTXh19AtpBs6d11Dvz1JqpQM+E1ZTg4sX+7syW/dCkOHOoP8xInQrFmpokIInjpx\ngnfOrSg2SURi3u9Dyk+BnD2kZdQIlWssPjKyAd5LLbAbq84zFzaBLqr0GHmOXw6rTavZxz5y/HMw\n6AwcyDlAlF8U3UO7M6HdBHqE9aBHaA/c1PIiheTMwElJSaFPnz6NcuimIjLgN0W//AIvvADHjsEN\nNziHa8aNc04CVo5/JSfzbno6AN1XdSBlYQs6dvh7mKZ37xotLFQv7MbK88zNaWZXMK80zzzQ3fUf\ntNhWzMubXuaNrW8Q5hPGy8NepkNwB7w0XgR7BRPlH9XA71pqbBpzBk51yIDf1MyfD7Nnw5Qp8Npr\n5V41dQhBcp6V53Zl8LMmDcVNEPRqNyZEBjB2jIqRI8t8AWhQjiJH5fOZp1tQrErlU+BGlQ7mlck0\nZjL5x8lsOb2FMJ8wXh3xKnd0v6Pu36jUpNX3zJZ1QQb8psJkguefh++/h02bnFdPL2BWFBZnZvPk\ngVPoPUoA8CjwYExhFC/1DKdbZ1WDXGx1FDkqnf7Wkm5BsSiu2/YrzDNvVr1gDs7hK5tiw2K3kG3K\nJqc4h0PZh7A6rHy972t2Zuwk3DeczXduplVgqzr+DUhXgvT0dDZs2NAke/UXkgG/Kfj9d5g5EwYM\ngPfeKzXJzAfp6azS6/k9Px9tkZa439vw4uggxlzrRl13QBwmR5XzmStmpdyhlQsD+qUE84vlFudy\nIv8Eu8/sZvPpzWw8uZEsk/MOYB+tDyariXZB7fDSeNErvBdaNy2vDH+FAI+rNJ9Uuix2ux2LxdIk\ne/UXkgG/McvLgyeegI0b4dNPYezYUrsXZWXxzyNHeDw4hpVv+jFYE8SCBbUzHu8wOaqcz1wpKdsz\nvziguwddfjCviNFiZNeZXczdNJc/Tv1BjH8MoT6h9ArvxYiWI+gd0ZsI34gm2wuTpLpSWexs5Jfx\nrmBCwNKl8NhjcMstcPBgmQuyC8+cYeaxY/TW+bPy5pbceiu8/HL1cuQdxY5K0xIt6RaU4rI9c59u\nPgSND3IF9LoI5uUxWAysTV7L7jO7+fnozyTnJdPcqzntg9uz7a5t9I/qX+dtkK4eDocDt6vwlnHZ\nw28I6ekwaxakpMB//wv9SwczRQjuO3aMzzMzud8jll9viWH2v1U8+GDpagyJBoqPFJcb1BVTxT3z\n88+aYE2D9ZCP6Y/xy9FfSDOk8XHixwgEEb4RDIkZQteQrtzc4WbaBbVrkLZJV67zGThpaWnceOON\nV+Q3RDmk01goCixc6Ey3fOgh+Pe/QVf6Rh6LovDCyZO8lZbG/aI1P90axccfO78EnFeSXELSzCSM\nu4wETwwuN6A3ZDCvyNmisyzav4g3tr5BTnEOEb4R3NH9Dny1vjzS9xE8NZ4N3UTpCnYlZOBUhxzS\naQy2bYMHHgAvL+ekZp06ldptURSeSE5m/pkzuKtUPFnYia/vbc4PP8CwYX+XM/5p5MD4A0Q9FUXX\nVV1RezTuW/oNFgOvbXmNT3d/SoG5gFCfUG7pdAv/Gf4feVFVqhdNPa++Nskefn0oLIRevZw3Tr37\nbpnpJp89cYLXT58G4JsOHSj4sQWvv6Zi1SrnTJXn5W/I5/Bth2m3oB3Nb2rcS0VlGDJ4b8d7vLP9\nHdQqNZM6TGLe2HmE+oRWfbAk1aKMjAwOHDhwRffqLySHdBqSzQYDBzrnvfnww1K7LIrCa6dPMzc1\nlbdat+bxiEheelHFkiUQH++c2fi8jI8zSJ2bSqelnQi4tvH1jB2Kgy2nt7AzYyef7P6E1IJUov2j\nmdZlGv837P/kdAVSgxJCXDW9ehnwG9Jbbzlz7OPjS6XX/Jqby+TDhwF4u3Vr7g+JYOZMOHDAOZ39\nhWu92gvsbGm2hWsSr8G3V/lTKzQUIQQ/HfmJ+1bcR745n+EthzOy5Uge7vswPlqfhm6eJF115Bh+\nQ0lNhTfegJ07XcFeEYIJBw6wOi+P99u04YHwcOxmNTffDFYrbNgAPhfFyTOfnSFkakijC/abT21m\nyk9TyDBmML3rdN4a9RYhPo1jXU/p6uNwOMjKyiI8PLyhm9JoyYBfV4Rwpl7+61/QurXr5VnHj7M6\nL4/T/foR5eGBXg8TJkCbNvD556DRlK7GkmkhY14GnX/pXM9voKzc4lxmr5/Nn5l/kmZII9uUzYR2\nE1h26zL6RPRp6OZJV7HzGTi+vr6EhYVdNcM3l0oG/LqyZAmkpcGTT7peyrFaWXDmDI9HRhLl4UFa\nmnMmy/Hj4fXXQX1Rwo0t30Zi20TCZobhe03D9e5/T/md93a8x5rkNTTzbMaLQ15kYPRA2jRrIzNt\npAYlM3AujRzDrwsFBdCxI/z4o3NuHJxLC8bs2EFLDw+O9+3L0cMqxo6Fxx93PsqTtSiLrEVZdF3d\ntR4b76QIhaTcJJ7f+DzLjiyjU/NOzL9+PoOjB8v/UFKjUFBQwPr166/4vPpLVVnsrJMk7rVr1xIX\nF0fbtm154403yuzPzc1lzJgxdO/enc6dO/PVV1/VRTMazr//7ZzD/lywTzsX7Ft7epLSty/bt6oY\nPtzZq68o2APoV+oJvim4nhr9t8SMRIZ8OYSO8zuy58weVk9dzcFZBxkSM0QGe6nRcHd3p0uXLowe\nPVoG+2qq9R6+w+Ggffv2rFu3joiICHr37s33339Phw4dXGXmzJmDxWLhtddeIzc3l/bt25OVlYX7\nBTOCNdke/tatzsXDDx2CgAAOmkx02bWLu0JD+ax9e1b8quLee2HRIhg1quJqFJvCtpBt9D7YG114\n3S2rpy/Wk5yXTHJeMr8e+5XfU34n35zP2DZjmdV7FuPbja+zc0uSVPvqNUsnMTGRNm3aEBsbC8Bt\nt93G8uXLSwX8sLAw9u/fD4DBYCAoKKhUsG+yrFbnFMfvvQcBARjsdrrs2sX1QUF8HhfHZ5/BSy85\n1xy/5prKqzJsNeDZyrNOgn2mMZMZv8xgy+ktlNhLCPUJJcQ7hPbB7fl43MeMazsOfw//Wj+vJEkN\nq9ajbEZGBlFRfy8bFxkZyc6dO0uVuffeexk+fDjh4eEYjUaWLFlSbl1z5sxx/Tx06FCGDh1a282t\nXW+/DTExrolvWu7YAcAvnTrz8svw9dfwxx/OjJyq5K7IJWh8UK02b2f6Tp7b8BzrT67HT+fHj5N/\nZFD0IPx0frV6HkmqTbm5uRw9epSBAwfKIcVyJCQkkJCQUK2ytR7wq/MP8uqrr9K9e3cSEhJISUlh\n1KhR7Nu3D9+Lpge+MOA3eikpzmkTdu8GlYothYXk2e3k9R/Eww+q2LnTOdoTWs2ZBfQr9XT8rmOt\nNM3msDFpySRWHFtB/8j+JN6TSK/wXvI/j9SoXZyBI5Xv4s7w3LlzKyxb6wE/IiKCtLQ013ZaWhqR\nkZGlymzbto3nnnsOgNatW9OyZUuSkpLo1atXbTen/ixa5OzZx8ay02Bg8N693BLUgnumulNY6Jwv\nza+aHeniY8U4ihz49Kz5napphWl0+LgDJpuJn2/9mRvjbqxxnZJU13Jzc0lISMDHx4dJkybJi7K1\npNazdHr16sXx48dJTU3FarXyww8/MHHixFJl4uLiWLduHQBZWVkkJSXRqlUTXndUUZwB/+ab+SU3\nl35//kmwJTSpAAAgAElEQVRvLz/OPtwBjcY5VUJ1gz2AfoWeoOuDatQDTzek0//z/kS/H02kXySp\nj6bKYC81CZmZmaxevZquXbvKDJxaVus9fHd3dz766CNGjx6Nw+Hg7rvvpkOHDixYsACAmTNnMnv2\nbO688066deuGoii8+eabNGvWrLabUn927ACVimMDBnDTrl3c6hfKwbvbMeBaFe++W/aGqqroV+qJ\nfCKy6oIXEUIQnxLPf//8Lz8d+QmA3/75GyNbjZTDN1KTERISwj/+8Q+8vLwauilXHHnjVW2YMQM6\ndCBo0CA8FDfc7unDg3e78fTT1VuO8EK2fBs7YnYw4OwA3LyqP8Pk+hPreWjNQxzNPcq0LtOY3Gky\n17e9Xs5SKUlXGTl5Wl3KzIRff2Xl3LnkpabS4uFe/Ge2G3fccXnV5cfnEzAkoNrBfm3yWh5b+xhJ\n+iRu7XQrG27fQJhv2OWdXJLqmd1uvzJSspuIxr1cUlMwfz777r+fCamp3J3ekYFtPS472MO5dMwJ\n1UvH3Ja2jbGLxtKmWRs2ztjI4n8slsFeahIcDge7d+/m559/bjrf5K8A8qO1JkpK6BcVxc527ejv\n58fW/7Tg008vvzphF+StzaP1G60rLacIhVmrZrFgzwL+1f9fvH3d25d/UkmqZxdm4IwbN05eX6pH\nMuDXwOqff2Znu3Yc79uXlD88eUYHQ4Zcfn2F2wrxiPFAF1nx3bXFtmIi340k35zPZxM+456e91z+\nCSWpHsmZLRueDPiXKcdi4W5vb6YpCm08PXnkA3j00Uu/SHsh/Qp9pXfX7s/az7Cvh2G2m9E/raeZ\nZxPObJKuOnq9Hr1eL/PqG5DM0rkMJoeDyD/+QGc0sm/0aApSdQwZAqdOgYfH5deb2CGRuP/F4de7\nbNL+muNrGPfdOPpF9mPznZtxV8vPakmSyqr36ZGvZFsKC/HZvJmWWVlk6vWE6HR8+CHcd1/Ngn1J\ncgn2Anu5C508Ef8E474bx1097mL73dtlsJck6bLIHv4luvHgQY7m53N48mTUJ09SYPagVSs4eBBq\nspRm+vvpmA6aaP/f9qVeT85Lpu2HbeV4vdRkOBwOMjIyiI6ObuimXJVkHn4tKXY4WJ6by+KtW1Hf\nfz94ePDFfBg7tmbBHpzpmJGPlL279uE1D+Pp7imDvdQknM/A8fX1JTIyEvWl3mYu1SkZ8C/BMydO\nAHDr229DUhIOB3z0ESxeXLN67YV2jIlGAkcGlnp948mNrE1ey9ujZNql1LjJDJymQQb8S/DV2bO8\ndfIk3HwztGjBil8gJAT69KlZvXnxefgP9sfN+++7aw9lH2L4/4ZzQ/sb+NeAf9Ww5ZJUdwoKCli3\nbp2c2bIJkAG/mv539ixFDgc3zJsH//sfAB+cS8WsqfLSMZ/6/Sn8dH78fOvPNT+BJNUhDw8PunXr\nRps2bWSvvpGr9gBbcXFxXbaj0RJC8G5aGjOOHqW3xULboCDo0oX9++H4cZg0qYb1OwR5a/JKBfxx\ni8axJnkN88fNl/+BpEbPw8NDDuE0EVUG/G3bttGxY0fat3dmj/z111/MmjWrzhvWWHyXnc2/UlKY\nHRHBtqefdnXpP/gAZs0CjaZm9Ru2G9BF6vCIduZ0zl4/mzXJa1g5ZSXTuk6rafMlSZJcqgz4jz32\nGGvXriU4OBiA7t27s2nTpjpvWGPxYUYGY/z9+U/v3rjHxcH48eTkwLJlztz7mtKv/Hs450DWAV7b\n8hovD32Z69tdX/PKJakW5ebmsnHjRhRFaeimSJepWkM6F+fTXk3TmeZYrcw+dcqZd/nDD6BSsXCh\ncyjn3GdgjZyfHXPjyY10/bQro1qN4rkhz9W8YkmqJedntly9ejURERFy6KYJqzJyR0dHs3XrVgCs\nVivz5s2jQ4cOdd6wxmBTQQEnzGZCNmxwjt8AVivMnw9r19a8/pITJdhybfj29mXlupX0DOvJb9N/\nq3nFklRL5NqyV5YqA/4nn3zCo48+SkZGBhEREVx33XV8/PHH9dG2BnfH0aNcFxBAu++/h927Afjx\nR2jfHrp0qXn9+pXn1q5Vq1h6aCkzus+oeaWSVEtycnJYs2aNzKu/glQZ8I8dO8Z3331X6rWtW7cy\ncODAOmtUYyCEINVs5hubDSIiICYGcF6snT27ds6hX6EnfFY4W05vIc2QxpP9n6ydiiWpFgQHB3PL\nLbfg6enZ0E2RakmVY/gPPfRQtV670qzQ6wHot3Il3HAD4FyrPCcHxo+vef12gx3DDgOGXgYGfzmY\na8Kuwd/Dv+YVS1ItUalUMthfYSrs4W/fvp1t27aRk5PDu+++65qMx2g0XhVX6Zfl5tLPzw/35cth\n0SLA2bt/+GFwq4V1wfN/y8d/oD9DfxwKwM57dta8Ukm6TFarFa1W29DNkOpYhT18q9WK0WjE4XBg\nNBopKiqiqKgIPz8/fvzxx/psY71LM5v5+uxZpgEYjdCzJxkZEB8Pd91VO+fQr9SzJnoN6YZ0tt61\nFTd1LXyKSNIlOp+Bs2zZsquiI3e1q3J65NTUVGJjY+upOX9rqOmRix0OvDdvJs7LiyObNsGJE/DJ\nJzz3HBgM8OGHNT+HYldY33w90++Yzvz75nNzh5trXqkkXaILM3AGDx4sM3CuEJXFzioDfnZ2Nm++\n+SaHDx+mpKTEVeGGDRtqv6UXNqyBAv6kgwdJKCggd+BAVEOGwOzZlAwdS0wMbNkC7dpdft1Gi5Hd\nZ3bz6cJPGf3FaFRrVdzZ487aa7wkVYOc2fLKVqMVr6ZNm0ZcXBwnTpxgzpw5xMbG0qtXr1pvZGMg\nhGBZbi4ftG2LKjcX9u+HYcP47jvo3btmwT4pNwm/1/0Y/r/hDE4eTJcpXWSwlxpEYWEheXl5TJo0\niXbt2slgfxWpsoffs2dP/vzzT7p27cr+/fsB6NWrF7vP5aXXWcMaoIdf4nDgtXkzJUOG4PHNN/Dr\nr4gff6JbN3j7bbjuusuvu+UHLSmyFpH1ZBZ7uu6h3cJ2+PeXWTmSJNWuGq14df7KfWhoKCtXriQ8\nPJz8/PzabWEj8W1WFgAeajX8+itMnEhCAtjtMGrU5debX5JPakEqv0//HespK9YsK359yi5ULkmS\nVJeqDPjPPfccBQUFvPPOOzz88MMYDAbee++9+mhbvcuwWvlnSAiYzbBuHSxYwAf3wCOPQE2+9T4e\n/zjBXsGMbDWSjI8yCBoXhMpNfo2W6pbD4eDUqVO0atWqoZsiNRJVBvwJEyYAEBAQQEJCAgCJiYl1\n2qiGIITg0zNnGBoQABs2QLdunDAEs2WLKw3/su3J3MMLQ14AnJOlhd9bwwVwJakKF2bgxMTE4FYb\nN49ITV6FAV9RFH7++WdSUlLo3Lkz48aNY/fu3cyePZvs7Gz++uuv+mxnnfvi7FmyrFaejY6GefNg\n4kQ++siZd1+TbDWH4uBg9kFGtByB3WjHsM1Ap6Wdaq/hknQBmYEjVabCgH/fffdx8uRJ+vTpwyuv\nvMLnn3/O0aNH+c9//sMN56YauJJ8kJ7OXaGhdPPyghUrKFq5ka9Hwp9/1qzeOZvmANCpRSdyluXg\n198Pd7+rZ3ppqf4YDAZ+++03ObOlVKEKI8+OHTvYv38/arUas9lMaGgoKSkpBAUFVXRIk3WgqIgD\nJhN7rrnGGeF9fflqazuGD3fNmXZZ7IqdV/54hSX/WAKUXuxEkmqbp6cn3bt3p3Xr1rJXL5Wrwjx8\njUaDWu3c7eHhQcuWLasd7NeuXUtcXBxt27bljTfeKLdMQkICPXr0oHPnzgwdOvTSW16LdhuNhGi1\naM5l54gJE5k3r+YLlD+02jnJ3C2dbkEoAv0qGfCluqPRaORC4lKlKuzhHz16lC4XTPqekpLi2lap\nVK6c/Is5HA4eeugh1q1bR0REBL1792bixImlFk0pKCjgwQcfJD4+nsjISHJzc2vr/VyWYkVxXqwF\n+PVXdkz7CF9fqMkM0DaHjQV7FvD6iNcBMO4yognW4NlKzj4oSVLDqDDgHzly5LIqTExMpE2bNq75\nd2677TaWL19eKuB/9913TJo0icjISADXerkN5WhxsfNGhaQkyMjg5d/78+ijNUvFvHO58y7aJ/o/\nATjnvg+e0LDvU7oy5ObmsnfvXoYPHy6zb6RLUmHAv9wJ0zIyMoiKinJtR0ZGsnNn6al/jx8/js1m\nY9iwYRiNRh599FGmT59epq45c+a4fh46dGidDf0kFBTwYkwMzJpFzi0P8NfPbvxya83q1LppeXrg\n02jcNIAzHbPdxzWYm0G66l2cgXN+yFW6uiUkJLhS5qtS6+ki1Rk/tNls/Pnnn6xfv57i4mL69+/v\nSiG70IUBvy4dNJkI12rhp5/48LbXmDkTdLqa1bk8aTkvXfsSAObTZqwZVvz6y7trpcsj15aVKnJx\nZ3ju3LkVlq31gB8REUFaWpprOy0tzTV0c15UVBTBwcF4enri6enJkCFD2LdvX5mAXx/2GI0A9EpP\nR2i1fLS2DYdr4UZiFSqGxAwBnNk5zcY1k3fXSpclPz+f1atXy7x6qcaq9Z2wuLiYpKSkalXYq1cv\njh8/TmpqKlarlR9++IGJEyeWKnPDDTewZcsWHA4HxcXF7Ny5k44dO15662vB3NRUOnl7o9u/n6S4\nGxg/QUVoaM3qXHZkGfoSPQEezgvBMh1TqomAgAAmT54sZ7aUaqzKgP/rr7/So0cPRo8eDcDevXvL\nBPALubu789FHHzF69Gg6duzIrbfeSocOHViwYAELFiwAIC4ujjFjxtC1a1f69u3Lvffe22ABf4Ve\nzzNRUSh/7WfFqa41TsW0K3ZuWXoLnZp3IsY/BofJQeHmQpqNblY7DZauOiqVCg8Pj4ZuhnQFqNb0\nyBs2bGDYsGHs3bsXgM6dO3Pw4MG6bVg9TI9ssNvx37KF7AEDcPS7kfdLZvL6kcu/i9jqsNJpfiey\nirLIejILT40nuctzSZ+XTvf13Wux5dKVymw2y+Au1UiNFkDRaDQEnM9RP3/QFZIdkG2zoQKaa7Wo\nDx1g8ENdL7uulLwUdK/oSM5LZuc9O/HUOPPtZTqmVB0Xri1rt9sbujnSFarKi7adOnVi0aJF2O12\njh8/zrx58xgwYEB9tK3OxefloVGp2J+QR0tbIaPvvbx5FIQQPL/xeQCsz1tdqZjn766Nfja61tos\nXXkuzMC54YYbcHeXcy1JdaPKrvqHH37IoUOH0Ol0TJkyBT8/P95///36aFud21dUxD9DQlj1+gEK\no7vgrr28by4L9yxk8cHFrJiywhXsAYx7jLgHuOPZWt5dK5V1vle/evVqunbtyujRo2W6pVSnqhzD\n//PPP+nZs2d9tcelPsbwe+/Zw/QWIaS2/plXpx3G48tPLrkOu2JH838a7u91P59cX/r4ky+eRDEr\ntH6zdW01WbqCGAwGEhMT6d+/vwz0Uq2p0Rj+E088QVxcHC+88EKdX6itT4V2O7uNRgKtHvRQ78ej\nd5eqD7pIVlEWIW+HAPDxuI/L7JfpmFJl/Pz8GDlypAz2Ur2pcrAwISGBzMxMlixZwsyZMzEYDEye\nPJkXXnihPtpXZ5JLStCqVHQxBqN2OwBdZ1zS8dmmbELfcSbsn37sNGpV6c9OS7oF8ykz/gPkQuWN\nRbNmza7Y9Zilq09gYCB5eXmXdEyVQzoXOnDgAG+88QY//PADNpvtkht4Kep6SOfTM2eYm5rKF/n9\nGHqDH576DPCvXnAWQhDzfgxphjRKnivBw71sGt2ZT89QsLmAjosa5v4Cqaz6GCaUpPpS0d9zjYZ0\nDh8+zJw5c+jcuTMPPfQQAwYMICMjo+atbWB/FBTQ3ccH4/4TmDyDqx3sAf46+xdphjT2ztxbbrAH\n53COTMeUJKkxqXJI56677uK2224jPj6eiIiI+mhTvThkMnFnWBiq/YnkhHWluqG52FZMz4U9aR3Y\nmu6h5d9M5Sh2UPBHAR2+7VDufkmSpIZQZcDfsWNHfbSj3h0rKaGbtzfFyfsxtareBVtFKFz3zXUE\neASQ/EhyheXy1+fje40v7gEyn1qSpMajwoh0yy23sHTp0lKrXp1X2YpXTYHBbsesKAz092d3xgGU\nIZOrddxnez5ja9pWvpj4RaXl9Cv0BE2Q2TmSJDUuFQb8Dz74AICVK1eWuQDQ1Gfsyz53wVmrVhOZ\nt5/83q9U67h/r/83t3W+jTt73FlhGSEE+pV6op6MqrCMJDUmarWa5ORkWrVqVefnevbZZwkNDeXR\nms5SeBX4xz/+wT333MOYMWNqrc4KL9qGh4cDMH/+fGJjY0s95s+fX2sNaAhHi4vp5esLRUU0t2YQ\n2Kfqefhnr59NgbmAfw/8d6Xliv4sws3XDa92XrXVXOkqERsbi5eXF76+voSGhjJ9+nQMBkOpMtu2\nbWP48OH4+fkREBDAxIkTyyxHajAYeOyxx4iJicHX15c2bdrw+OOPo9fr6/PtlJGTk8M333zD/fff\n36DtqKnvvvuOmJgYfHx8uOmmmypN9d22bRt9+vTBz8+Pbt26sXXrVte+VatWMWjQIAIDAwkLC+Pe\ne++lqKjItf+ZZ57h+eefr9W2V5ml89tvv5V5bfXq1bXaiPq222jEQ61GOXCIoyKO0MjKx9pPF57m\ntS2v8ebIN+kW2q3SsnKyNOlyqVQqVq5cidFoZN++fRw4cIBXXvn72+f27dsZPXo0N910E5mZmZw8\neZJu3boxcOBATp48CYDVamXEiBEcOXKE+Ph4jEYj27dvJzg4mMTExIZ6awB89dVXXH/99eguYzk5\nIUSjSKk9dOgQ999/P4sWLSIrKwsvLy9mzZpVbtm8vDwmTJjAM888Q2FhIU8//TQTJkygoKAAcH4w\nv/jii2RmZnLkyBEyMjJ46qmnXMf37t0bg8HAnj17au8NiArMnz9fdO7cWXh6eorOnTu7HjExMWLq\n1KkVHVZrKmlajU07fFjceeSIKHx7ofheN6PK8nM2zhFxH8VVq+7d1+wW+Rvza9hCqS7U5d9UbYiN\njRXr1693bT/11FNi3Lhxru1BgwaJBx98sMxxY8eOFbfffrsQQojPPvtMhISECJPJVO3zqlQqkZKS\nIoQQYvPmzSIqKkps2rTJte/TTz8Vbdu2FQEBAaXO/+WXX4qBAweKJ598UgQGBoqWLVuKNWvWVHie\n4cOHi0WLFrm28/PzxfXXXy+aN28uAgMDxfjx40V6erpr/7XXXiuee+45MWDAAOHp6SlSUlLEkSNH\nxMiRI0WzZs1E+/btxZIlS1zlV65cKbp37y78/PxEVFSUmDNnTrV/B9X17LPPimnTprm2U1JShFar\nFUVFRWXKrlixQnTs2LHUa+3atROff/55uXUvW7ZMdOnSpdRr9957r5g7d2655Sv6e67s77zCHv7U\nqVNZsWIFEydOZOXKlaxYsYIVK1awZ88eFi1aVHufOA1gY34+3Xx8sOw+QHqzyqdEPpxzmDmb5vDs\noGerrNdyxkLJiRL8Bsq1a6XLI871YtPT01m7di19+/YFnKvObd++nVtuuaXMMZMnT+b3338HYN26\ndYwdOxYvr0sfUly7di1Tp05l2bJlDBkyxPX6qlWr2L17N/v372fJkiXEx8e79iUmJhIXF4der+fp\np5/m7rvvrrD+AwcO0L59e9e2oijcfffdnD59mtOnT+Pp6clDDz1U6phvv/2W//73vxQVFREUFMSo\nUaP45z//SU5ODosXL2bWrFmuIS0fHx++/fZbCgsLWbVqFZ988gnLly8vty2nT58mMDCwwsfixYvL\nPe7w4cN06/b3t/xWrVqh0+k4duxYJb/ZvymKwqFDh8rdt2nTJjp37lzqtQ4dOrBv375q1V0tFX0S\nFBYWCiGEyM3NFXq9vsyjrlXStBrJsVoFGzeKM2azyO1yrfh3r98rLf/utnfF4C8GV6vujIUZ4tBt\nh2qjmVIdqM7fFNT8cbliYmKEj4+P8PX1FSqVStx4443C4XAIIYRIS0sTKpVKJCUllTluzZo1QqPR\nCCGEGDlypHj22Wcv6bwqlUq8+uqrIiYmRhw6dKjMvq1bt7q2J0+eLF5//XUhhLOH36ZNG9c+k8kk\nVCqVyMrKKvc8Go2m3Paft3fvXhEYGOjaHjp0qHjppZdc24sXLxaDB5f+v3jfffdV2AN+9NFHxeOP\nP17h+S7HiBEjxIIFC0q9FhER4fpGdKHc3FwRGBgoFi9eLKxWq/jqq6+EWq0W999/f5myv/32mwgM\nDBTHjx8v9frChQvF8OHDy21LRX/Plf2dV9jDnzJlCgDXXHNNuY+m6qzVSguNhjCtFu+U/ZS0rbyH\nf7LgJD3CelSrbpmO2fTVRsi/XCqViuXLl2MwGEhISGDDhg3s3r0bcM6bolaryczMLHNcZmYmzZs3\nByA4OJgzZ85c8rnnzZvHrbfeWu5So6EXLPLs5eWFyWSqcB9Q6sLjhQIDAzEaja7t4uJiZs6cSWxs\nLP7+/lx77bUUFhaWGquPivo72+3UqVPs3LmzVE/8u+++IysrC4CdO3cybNgwWrRoQUBAAAsWLKj1\nC9U+Pj4UFhaWeq2wsBBfX98yZYOCgvjll1945513CA0NJT4+npEjRxIZGVmq3I4dO5g2bRo//fQT\nbdq0KbXPaDSWWYCqJioM+KtWrQIgNTWVkydPlnk0VStycxEAGRnYVRp8WrWotPyezOpdMHGUOChI\nKKDZGLl2rVRzQ4YM4eGHH+aZZ54BwNvbm/79+7NkyZIyZZcsWcKIESMAGDlyJPHx8RQXF1/S+ZYu\nXcrPP//MvHnzat74CnTt2pWkpCTX9jvvvMOxY8dITEyksLCQTZs2lbk4e2EKeHR0NNdeey35+fmu\nh9Fo5OOPnTPVTp06lRtvvJH09HQKCgq4//77URSl3LacPn0aX1/fCh/ff/99ucd16tSp1BBLSkoK\nVquVdu3alVt+yJAhJCYmotfr+d///sfRo0fp06ePa//evXu54YYb+Oqrrxg2bFiZ448cOUL37rW3\nPGqVWTpbt251fWJ/8803PPHEE5w6darWGlDf9ptMTA8Jgf37SQvsyrns03Jlm7LZlraNKZ2nVFlv\nwYYCfHr4oGmmqbKsJFXHY489RmJiIjt37gTg9ddf5+uvv+bDDz/EaDSSn5/P888/z86dO3nppZcA\nmD59OlFRUUyaNImkpCQURUGv1/Pqq6+yZs2aCs8VHh7O+vXr+eCDD/j0008rLHdxQL4U48aNY9Om\nTa7toqIiPD098ff3Jy8vj7lz55Z7vvPGjx/PsWPH+Pbbb7HZbNhsNnbt2sXRo0dd9QUGBqLVaklM\nTOS7776r8J6h6OhojEZjhY/zIxwXmzZtGitWrGDLli2YTCZeeOEFJk2aVOEU13v37sVms2EwGHjy\nySeJjo5m1KhRABw8eJAxY8bw0UcfMW7cuHKP/+OPPxg7dmy5+y5HlQH//vvvx8vLi3379vHuu+/S\nqlUrbr/99lprQH07bDIRrtPBgQMk6SoP+At2L8BH60O/yH5V1ivTMaXaFhwczIwZM3jjjTcAGDhw\nIPHx8Sxbtozw8HBiY2PZt28fW7ZsoXVr5yI7Wq2WdevWERcXx6hRo/D396dv377k5eXRr1/5f8fn\ng2JUVBTr16/n9ddf54svvii178Ky51+78OeL6yrP7bffzurVqzGbzYDzA62kpITg4GAGDBjA2LFj\nK63Px8eH3377jcWLFxMREUFYWBjPPvssVqsVcN4z9OKLL+Ln58f//d//ceutt1by2708HTt25NNP\nP2XatGmEhIRQUlJS6r6kBx54gAceeMC1/dZbb9G8eXOio6PJysri559/du1799130ev13HXXXa5v\nFhfObLBr1y58fX3p1atX7b2BCkf3z+nevbsQQog5c+aIzz77TAghRI8ePao6rMaq0bTLErFtm1iX\nlyfE1KnipZZfiR07Ki474PMB4pVNr1RZp6IoYlvENmE6Uv1UOKn+1dXflFR9s2fPFu+//35DN6NJ\nmDRpUqVprhX9PVf2d17l7F6+vr68+uqrfPvtt2zevBmHw1Hnc+HXFYcQZFgshGu1sH8/24ue5O4K\nevg2h41tadt4cciLVdZb9FcRak81nu3l2rWSVJn//Oc/Dd2EJuPHH3+s9TqrHNL54Ycf0Ol0fPHF\nF4SGhpa5G6wpOXvuq18HjQaRnMy2/A5ckGRQyvcHnRdtRrcZXWW955cybOpzDEmSdGWrMuCHhYUx\nbdo0CgoKWLlyJR4eHk12DN/ocBCh08HRoziiW+IZ6IGmnGusJquJGb/MYHy78dWqV6ZjSpLUFFQZ\n8JcsWULfvn1ZunQpS5YsoU+fPixdurQ+2lYnfNzcYP9+jLEVX7Cdt9OZmrZs8rIq67NkWig5XoL/\nYLl2rSRJjVuVY/ivvPIKu3btokULZ756Tk4OI0aMKPcW78Yuy2qlwG6H/fvJCu1KuFvZMmeLzjJ7\nw2xeGPICGreqUyzzVucReF0gak2Vn52SJEkNqsooJYRw3cUHzrvHRCOYte5ylCgKEecu2Kb6dSUs\nrGyZpNwkfLQ+vDzs5WrVKdMxm4bc3NyGboIkNbgqe/hjxoxh9OjRTJ06FSEEP/zwQ63eCFDfmp8L\n+Ekdu5Q7pJNtyqZVYPUWglDMCvkb82n/efuqC0sNwuFwsHfvXg4fPtzQTZGkBldlwH/rrbdYtmwZ\nW7ZsAWDmzJncdNNNdd6wuqC32bBaLGAyccQUTbdy1j3ZdGoTOrfqzdedvzEfn64+aILk3bWNUXFx\nMWvWrMHb25tJkyYxY8aMhm6SJDWoCod0jh07xg033ECnTp1YunQpTzzxBO+++26TDfYAWwsLcSsq\ngq5dOZOpKndIJ8AjgIntJ1arvvPpmFLj5OHhwTXXXMPo0aMrvPVdci5xeOLEics6dujQoXz++efV\nLm+xWOjUqZNrwjOpYllZWXTs2NF1J3FtqDDg33XXXYwfP56ffvqJnj178sgjj9TaSRvKN1lZtNbr\noR0GjwgAACAASURBVGtXMjMpd0hn0YFFWB1V/4KFEDIds5FTq9XExsY2mfsjmuISh+VNr1CZhQsX\ncu211xISElLrbakvFouFu+66C39/f8LCwnjvvfcqLb9w4ULatGmDv78/vXv3LrXM4R133IFOp3NN\nreDn5+e6RhoSEsKwYcNYuHBhrbW9woBfVFTEvffeS1xcHE899dQlzZC5du1a4uLiaNu2rWsekPLs\n2rULd3d3li2rOv2xNjiE4Jk//nD28M+UDfhbT28ltSCVyZ0mV1mXab8JlUaFVwe5dq1UO670JQ4B\nFixYwPTp0y/rWLvdXsutuTxz5swhJSWF06dPs3HjRt58881Si8Jc6K+//uJf//oXS5cupbCwkLvv\nvpubbrrJFdRVKhXPPPOMa9I2g8FQ6gN02rRpLFiwoPYaX9GcC+3btxd79uwRe/bsEbt373Zt7969\nW+zZs6fCuRrsdrv4//bOPKyp4/v/77DvEEAUEEUFFWVXUVAUV3BXtC1+bCu1am1/Wm2rVau26lf9\nWrX9tra11U+1VqpdFHdRtCpo3aiAuIAKSgUUKoSwhC0kOb8/KLcEkhAxEAjzep48Dzd3Zu6Z5HIy\nd+bMeffo0YMyMzNJLBaTj48PpaamKiw3fPhwGj9+PB08ePC58kE0BYlMRibx8STw9yfJxctkYEAk\nFsuXWXx6MQXtClKrvb/W/0UP3n2gURsZTSM/P5+OHz9OFRUVKstp+p7SNNqUONy2bRt1796d7O3t\naenSpSSTyYiocRnDkJAQWrFiBQUEBJCVlRVNnjyZCgsLFV7n8ePHZGpqyom6EKmWJczMzCQej0e7\ndu2iLl260LBhw4iIaNeuXeTh4UF8Pp9CQ0Pp8ePHXJ13332XXFxcyMrKivr160eXLl1S+3NQFycn\nJzp79l/hpI8//pgiIiIUlt23bx8FBARwxyKRiHg8HuXl5RERUWRkJK1atUrptaqrq8nMzIyysrIa\nnFN2P6u6z5WO8Dt16oQPPvgAH3zwAZYsWcIdL1myBB988IHSH5CEhAS4ubnB1dUVhoaGiIiIUCgz\n9tVXX2H69OlyIZ/1WbNmDfeKi4tT/1dMARUyGSplMtgmJaHAyRu2tmiwy/b3R79jusd0tdpj4Zja\nRyqV4saNG4iJiUHPnj2bJI7d2iAtSRweOXIEiYmJSEpKwtGjR7lsmYBqGUMiwt69e/HDDz8gNzcX\nBgYGSqd/b9++je7du0NP71+3o44s4cWLF3Hv3j2cPn0aR48exf/+7//i8OHDKCgoQHBwsFwq44CA\nAKSkpEAoFOI///kPXnrpJaVz4Js2bVIqcWhrq1jXQigUIjc3V07m0NvbW6lsYXBwMDIzM5GQkACp\nVIrdu3fDz89Pbkpr+/btsLOzQ//+/RvMdhgYGMDNzQ03b95U2D4AxMXFyflKlSj9KWgiBw4coDlz\n5nDHUVFRtGDBArkyOTk5FBISQjKZjCIjIyk6OrpBO5o2LaG4mHDhAlFYGCUmEv2TBFQO4/8xpvOP\nzjfaVlVeFV2yvkTSKmmjZRnNQ35+Ph08eJBOnTqlUEBaEercU1iDF341FW1KHMbGxnLH27dvp5Ej\nRxJR4zKGtSP8WlJTU8nIyIh7QqjLTz/9RIMGDVJpS11ZwtoRfmZmJnc+LCxMTgRcKpUqHQETEfH5\nfLp165bKaz4PWVlZxOPxqKqqinvvzJkz5OrqqrTOjh07yMDAgAwMDKhDhw70559/cueSkpKosLCQ\npFIpxcTEkKWlpZykJBHR4MGDKSoqqkG7yu5nVfd5o2GZz4s6CziLFy/Gpk2bwOPxXkhQ4Xm4W16O\nrgIBMHCgwvn7v0V/o0pahV72jcfUC2IE4I/mQ8+I7a7VBrXhlgMHDoS7u7tGF2XpE+1tKqyVOBwx\nYgQuXryIiRMn4saNGwgICJCTOKyvrqQJicO6UoJdunSRa0OZjGHt7vv6daurq1FQUNDg6b2+xCFQ\nI0u4fPly3L17F2KxGFVVVXj5Zfk1tPoyh4sWLWowy/DkyRO4uLhg69at2L17N54+fQoej4eSkhKN\nbrqzsLAAULMwbm9f84SvTOIQAI4dO4bPPvsMaWlpcHNzQ2xsLCZMmIDk5GQ4OjrCz+9f+dSxY8di\n5syZOHToEIKCgrj3NSlzqHGP5ezsjOzsbO44Ozu7gYZjYmIiIiIi0K1bN0RHR+Odd97BsWPHNG2K\nHNUyGfo+egS8+y5yc9EgJHPFuRUAACdLFYoo/yA4waJztImZmRkiIiLQs2fPNhOB87y0tMRhVlaW\n3N/Ozs5NrmtoaMg5w7p4e3sjMzNTTnZQHVnC+jKHO3fulJM5LCsrw6BBg3Dp0iVs2bIFBw4cQFFR\nEYRCIaytrZUOKDdu3KhU4tDKykphHT6fD0dHR7kplpSUFHh6eiosHxsbi/Hjx3NataGhoXB0dMTV\nq1cVlq+PRCJBRkaG3BTSC6F07N9EqqurqXv37pSZmUlVVVVKF21raakpnSX379PMlSuJpFJas4Zo\n9Wr587w1PPr0j08bbUdaKaWLVhep6llVo2UZrYtmuN01Sv1F2/z8fDIzM6Nr/6j0/PHHH2Rubk7b\ntm2jkpISKiwspJUrVxKfz6eMjAwiIqqqqqIBAwZQWFgY3bt3j6RSKRUUFNCGDRsoJiZG4XV5PB6N\nGjWKhEIhZWVlUe/evTmxox9++IGGDBnSoPzDhw+JiGjYsGHUuXNnSk1NpbKyMpo+fTrNnDlTaR+9\nvb3pypUr3LGDgwP9+OOPRER0/fp1cnBwoNdee42I/p3SqbvIe/jwYfL09KS7d+8SEVFRURH99ttv\nRER08uRJcnJyory8PKqqqqK1a9eSvr6+3GeqCZYvX07Dhg0joVBIqamp1KlTJ7kpsbrs2LGDevbs\nSY8ePSKZTEZnzpwhMzMzbmruwIEDVFpaSlKplGJjY8nS0pLi4+O5+pcvX6Y+ffoobFvZ/azqPm90\nhC+TyRAVFYV162pyy2RlZakM7zIwMMDXX3+N0NBQ9OnTB6+88go8PDywY8cOzYYXPSdZIhE6lpcD\nenoNpnSKKotAICwauKjRdoriimDuaQ6jDkbNaC2jlrKyMm2boDVaSuIQACZPnox+/frBz88PEyZM\n4BZmG5Mx5PF4eP311xEZGQlHR0eIxWKVQuhvvfUWoqKiuOPGZAnrX3vKlClYtmwZIiIiYG1tDS8v\nLy4kMiwsDGFhYejZsydcXV1hamqKLl26KLWlqaxduxY9evRA165dMXz4cCxbtgxjxozhzltaWnKx\n9nPmzMHkyZMxdOhQWFtbY/Hixdi5cyc3Lbdt2zZ07twZfD4fy5Ytw/fff4+hQ4dybe3bt09OMvFF\n4f3zi6CU+fPnQ09PD+fPn8e9e/dQWFiIMWPG4MaNGxozQqFh/8zva4oZ169jyPff4//997+YNAl4\n801g8uSac+mCdAR8HwDhMmGj7aQvTIeRkxG6ruiqMdsYDanNgZOWlobp06fD1PTF1cQ0fU8xnh+x\nWAw/Pz+cP3++TW++agmePXuGkJAQ3Lx5E0ZGDQeYyu5nVfd5o4u2169fR3JyMre4YGtr2yYlDvOq\nqmD9TzhY/RH+jac30KdDn0bboH9213qd8Gq0LKPpFBQUID4+Hubm5ggPD9eIs2e0DoyMjJSGMDLk\ncXBw0HjSv0YdvpGREaRSKXecn58vF0fbVkiSSjH/H8dR3+E/K3sGFysXJTX/pfxuzUKYWV+2u7Y5\nqJvZctCgQRqPwGEw2juNeu6FCxdi6tSpePbsGT766CMMHjwYK1asaAnbNIZYJkMJj4cgkQhSKVBQ\nANR9mjxy/wgkssa3bRccL4DdRKZd21xIJBKIRCJMmzZNpyNwGAxt0egI/9VXX0W/fv1w7tw5AMDR\no0fh4eHR7IZpkviiIgCAi5ERcp8BtraAQZ2epwvSMSVoSqPtCE4I4PqJazNZyTA2NkZISIi2zWAw\ndJZGHX5WVhbMzc0xceJEADULAllZWc2y+t1c6PN4GF5UBNjaNpjOufPsDp6UPsH0PqpTKojzxSi/\nWw6bYZrZAMFgMBgtTaMOf9y4cdyjdWVlJTIzM9GrV682tfByqrAQz/T0AD6/waarcfvGoYNZBzhb\nqd5oUhhTCJuRNtAzbnvrF60NqVSKtLQ0eHh4QF9fgbAwg8FoFhp1+Hfu3JE7TkpKwjfffNNsBjUH\njyoq4JufD/D5ciP8nJIcZJdk4/Lsy6obABM70RR1I3Dc3NyYw2cwWpDnzqXj7++P69evN4ctzYaF\nvj5GpKcDgwbh6c1/Hf76i+uhz9NHkEuQyvoysQzCs0K4f6NAE5GhFiwCh8HQPo06/M8++4z7WyaT\nISkp6bnybLQGcv7Rsa0d4fv717wfnRaNdcPXNVq/+GIxzDzMYOTAdtc2hcrKSpw8eZLTlmVyg62f\ny5cvIzIyEnl5edi3bx8mTWoo+7lixQp06tQJixY1vkO9vTN9+nTMmTMHYWFhWrWj0QlpkUjEvcRi\nMSZMmKAwv31rpkwmg0lxMWBrKydtaG1sjXHu4xqtX3C8gE3nvADGxsYICAhg2rKN0JokDj/++GO8\n++67KC0tVejs8/PzERUVhfnz5zets62E/fv3o2vXrrCwsMDUqVMhFCrfbX/lyhUEBATAysoKPj4+\nclKFJ0+exJAhQ7jkanPnzoVIJOLOL1u2DKtWrWrWvqiFqiRBEomE3n//fVVFmo1GTFMbmUxGuHCB\n4oYPJ8rOJn9/oj//JIpOjSasAaUL0hutf7XbVSpNKdWIPQztoal7qrmomzwtLy+PfHx8aOnSpdz5\nK1eukIWFBW3bto1EIhEVFhbSqlWriM/n06NHj4ioJnla//79acyYMZSWlkZERM+ePaP169crTZ5W\nl+rqaiIicnNzo99//11puc2bN9O8efOa1E+ZTKYwX35Lc+fOHbK0tKRLly6RSCSi//znP0qVqwQC\nAdna2tLBgwdJJpPRTz/9RHw+n4RCIRER7d+/n2JjY6miooKEQiGNHTuW5s+fL9eGu7s73bhxQ2P2\nK7ufVd3nSs/UfvEDBw7UypejqX/O7MpKwoULVGlpSVRWRp06EeXk1AhdzIxWntWvFtFdEV1xudIq\nblDGi9GWHD5Ry0ocfvPNN+Tu7k7dunWjHj16kJ6eHpmampKlpSWJ62uBEtGIESNo37593LFQKKTx\n48dThw4diM/n04QJEygnJ4c7P2zYMFq5ciUFBQWRqakpPXz4kNLS0mjUqFFka2tLvXr14rJeEqmW\nPtQUK1askMvs+fDhQzIyMlIoqHP8+PEGWSt79uwpJ8ZSl0OHDpGXl5fce3PnzqW1a9dqwPIamuLw\nlU7pBAQEAAB8fX0xefJkREVFITo6GtHR0S0mOq4JpEToYmQE46oqSAxNIRAAJtbFAICvx33daH3B\ncQHbXasmBQUFOHr06HPnYmf8C2lJ4vDo0aNISEhAWloaMjIy0KVLF5w4cQIlJSUwrK8Fihq5wl69\n/hULkslkePPNN5GVlYWsrCyYmppiwYIFcnV++uknfP/99xCJRLCzs8Po0aPx6quvIj8/H7/88gve\neecdbnpKHenDWrKyspRKFfL5fPzyyy8K66Wmpsrlme/evTuMjY3x4MEDtT4zmUymNDw9Pj6+QY58\nDw8PpKSkqNV2c6F00bb2xqusrISdnR3Onz8vdz48PLx5LdMkMhlga4tn+TzY2QHXnv4BALAxaXwT\nleCEAF0+ajubzLRB/QicNp3sTBM/7E3MyElEmDJlCng8HkQiESZPnszN+xYWFkImk8GxvnIPahSp\nalWdBAIBBgwY8NzXXrFixXOpKhUVFcmpPNna2mLq1Knc8UcffYQRI0ZwxzweD5GRkdwu/dOnT6Nb\nt26YNWsWgJqBZXh4OA4cOICPP/4Yw4YN4+p6eXkhIiIC8fHxmFyb4rYOXbp0UTn3rgyRSARra2u5\n96ysrBqocgFAYGAgcnNz8euvvyI8PBz79+/Ho0ePFA5uzp49i7179zZII29hYYGif3b9awulDj8/\nPx+ff/45vLzadmZIAlAllXIROo6OwPpL6zHQeWCjdasF1RDdEoE/nN/8hrZR6sbV60QEjhbTJ7cW\niUN1qC9XWF5ejvfeew+xsbGc8xWJRCAi7um4vlTh9evXwef/+78lkUjw+uuvA1BP+vBFsbCwQHFx\nsdx7yuQK7ezscOTIESxZsgTvvPMOQkNDMWrUqAZqfteuXcPMmTMRHR3NqVzVokmpwqaidEpHKpWi\ntLRULkqn7qut8KiiAmVE3C5bc7ckXMu5hs2jNzdat/BUIfgj+NAzYbtrFVFVVYXY2Fh4eXmxCBwN\n09ISh887Zent7Y379+9zx5999hkePHiAhIQEFBcXIz4+voFedX2pwmHDhslJFZaWlnKbOtWRPqwl\nKytLqVShpaUlfv75Z4X1+vbtKzfF8vDhQ4jF4gY/qLUMHToUCQkJEAgE2Lt3L+7du8dNfQNAcnIy\nJk+ejD179mD48OEN6qelpcHX11dh2y2Gssl9X1/fF1lPeGFUmPZcxAmFNPTsWaIJE+ibb6sJa0Cf\nX/lcrbp3Xr5DT79/qhE7dJXaxf22gKbuqeZCmxKHtZKFymypz+effy4XpfPhhx/S2LFjqbKykgQC\nAU2ZMkVOnjAkJIS+//57rnxpaSl17dqVoqKiSCwWk1gspoSEBC6ySJX0oaa4e/cuWVlZcVE6M2bM\noBkzZigtn5SURGKxmIqLi2nRokVy0o+3b98mBwcHuYXn+vTs2ZP+/PNPjdmv7H5WdZ+3j6GrRALw\n+YjLrRFKfy/wvUaryMQyCM8IYTeexd+rwsDguTdrM9SkpSQOmxKQ8PrrryMmJgaVlZUAgMWLF6Oi\nogL29vYICgrC2LFjVUojWlhY4MyZM/jll1/g7OwMR0dHrFixAmKxGEDj0oeaoE+fPvjuu+8wc+ZM\ndOzYERUVFdi+fTt3/u2335aTF9yyZQs6dOiALl264O+//8bhw4e5c59//jkEAgFmz57NPVnUnQ7/\n888/YWlpif79+2u8H8+DUolDgUAAOzvtOTtNydH9mJeHz5OTkRIbiyG8Xsiy34mslcmN1hOeF+LR\n8kfol9DvhW3QBUpKSmBlZaVtM14IJnGoWVauXAkHBwe201YNmmOnrUYlDrXp7DUJD4BbaSnA5yPn\n7zvwslGdN6eW2nDM9k7dCJzw8HBYWFho2yRGK2HDhg3aNqHNcPDgQW2bAECN1Aq6gHlFBWBri0Je\nOnp26NFoefpHu9Z+on0LWNd6KSgowJEjR1BQUIBp06YxZ89gtHHaxwRsVRXA56PC4Al6OTae+K3i\nfgVkVTKY+7TPqBOW2ZLB0E103uHfKStDEY8HqbUtpOVW8HRpfBNVbe779urkiAgVFRW6EVfPYDA4\ndH5K50JREYakpyNfagXqfA0dLRufpmnv2TENDAwQHBzMnD2DoWPotMPPF4txo7QUkefOIbe6Zoeb\nu51qEZPqwmqIkkWwGcG0axkMhm6h0w4/u6oKhjweHLKykF6qXlcLTxfCJsQG+qa6L70nlUpx69Yt\nSCQSbZvCYDBaAJ12+OUyGXqamgJCIZJLhDCVdmq0TnsJxywoKMDhw4fx9OlT5vAZjHaCTjt8ALDh\n8QBTUxwr+hJBeotVlpVVy1AYW6jTu2ulUilu3LiBmJgYeHt7IzQ0FCYmJto2i6FF9PT08OjRo+eq\ns2PHDrz3XuM71hnAkiVL8N1332nbDAA67vC/e/oUf1VWQmpjjQw6g3Gd5qgsX3K5BKbdTWHsZNxC\nFrYsYrEYhw8f5uLqe/bs2W4jkVojrUniUBVisRgbNmzAhx9+qJH2tMW5c+fQu3dvmJubY8SIEcjK\nylJaNi0tDSNGjICNjQ3c3d1x5MgR7lxqair69+8PW1tb2NjYYPDgwfjjjz+480uWLMHGjRtRXV3d\nrP1RB512+CZ6epihr49ySxOYVPSAu7PqkXvB8QKdns4xMjJCUFAQy2zZSuHxeDhx4gRKS0uRkpKC\n27dvY/369dz5q1evIjQ0FFOnTkVubi4yMzPh4+ODwYMHIzMzE0CNMx45ciTS0tIQGxuL0tJSXL16\nFfb29g3ys6uDogyVR48ehYeHh8Lc/E1ts6WpHfRs2LABQqEQ/fv3V5qvRyKRYPLkyZg0aRKEQiF2\n7tyJV199Fenp6QAAZ2dnHDhwAAKBAEKhEBEREZg+fTpXv1OnTujduzeOHTvWIn1ThU47fCKCe2Ul\ncg0qQCIHTrxcGbXx97qMk5MTG9W3ATp27IgxY8bIKSp9+OGHmDVrFhYuXAhzc3Pw+Xz8z//8DwYN\nGoQ1a9YAAPbu3Yvs7GwcPnwYvXv3BgB06NABK1euxNixYxu9bmRkJN5++22MGzcOFhYWiIuLa1Dm\n1KlTcgIlAPDSSy/B0dERNjY2GDZsGFJTU1W2+fTpU0ybNg0ODg7o3r07vvrqK658QkICAgMDwefz\n4eTkhIULF2p8dHzo0CF4enpi2rRpMDIywpo1a5CSkqJQ7erevXvIzc3F4sWLwePxMHz4cAwePBhR\nUVEAAGtra3Tr1g08Hg9SqRR6enoNfgxDQkJw8uRJjfahKTSLwz99+jR69+4Nd3d3LtNfXfbt2wcf\nHx94e3tj8ODBuHXrVnOYgZsiEcTl5cjgCWH4x1qVDr/8QTmkIiks/HUjfQBLEtY2IS1JHNbl559/\nxurVqyESiTB48OAG5+/cuSMnbwgA48ePR0ZGBvLz8+Hv74+ZM2cqbTMwMBATJ06En58fnj59inPn\nzuGLL77AmTNnANTsA/nyyy8hEAhw9epVnDt3Ti6LZX1sbGyUyhtu3qxY9+Lu3bty8oZmZmZwc3PD\nnTt31PqMZDJZg7I2NjYwNTXF5s2bG+TO6d27t9blDYFm2GkrlUqxYMEC/P7773B2dsaAAQMwadIk\nTtoMqNGOvHjxIqytrXH69GnMmzcP165d07QpsDM0hHtREXIMKlF81wcODsrL6tLu2oKCAly6dAkj\nR45s8xkuWxqeghHt80IhIU2rp0WJw7pMmTIFgYGBAABj44brWfXlDYGaUXwtn3zyCb788kuUlpZy\n5eq2eevWLRQUFHB969atG+bMmYNffvkFY8aMgb+/P9dW165dMW/ePMTHxyvNytkU2cCysjJOJawW\nKysrheJOvXr1goODA7Zs2YLFixfjwoULuHjxopyEY60d5eXlWLt2LV566SUkJiZy/sTS0lLr8oZA\nMzj8hIQEuLm5wdXVFQAQERHBzfnVUvvFA8DAgQORk5OjaTM4hPmPIbayRAdbI+irCK0XHBeg8/ud\nlRdoA9TPgaNIqo2hmqY6a02gTYnDujbUl+2rD5/Pl1tMlslk+Oijj3Dw4EHk5+dDT69m4qCgoACW\nlpbg8Xhwdv43h9Xjx4/x9OlTOXlDqVSKoUOHAgAePHiA999/H4mJiSgvL4dEItF4HnkLC4sGC+LK\n5A0NDQ1x5MgRLFy4EJ9++ikGDBiAl19+WWF0m5mZGTZt2oRvvvkGt2/fhre3N4DWIW8INIPDf/Lk\niZx2ZefOnXH9+nWl5Xft2oVx48YpPFc7LwnUzIGFNOGfMf/vv2Bm0xXOTspH7pIiCUoTS8Ef2Xa1\nawsKChAXFwcLCwuWA0cHqCtxeOHCBTmJw/rz5/UlDletWoXy8vIXmtZRhbe3t9xc9759+3Ds2DGc\nO3cOXbt2RVFREWxtbVXKG3br1k3hfDlQIzzSr18//PrrrzA3N8cXX3yB6OhopfZYWFgofTJfuXIl\nli9f3uD9vn374scff+SOy8rK8PDhQ/Tt21dhO15eXnLrGUFBQXjjjTcUlpVKpZDJZHKff3PKG8bF\nxSlca1GIxvS2/uHgwYM0Z84c7jgqKooWLFigsOz58+fJw8ODCgsLG5zThGkjk5NoycxBdGb2Cpow\nQXm5v3/+m26Nv/XC19MWYrGY9u/fT/fv3yeZTKZtc1otzXC7a5TWIHE4a9YsWrVqlUo7Dx06RGPG\njOGOt2/fTr6+vlRSUkIikYjefvttlW1KpVLy9/enTz/9lMrLy0kikdDt27c5+b+AgABat24dyWQy\nSktLo549e8rJCWqC/Px8sra2pujoaKqoqKClS5dSYGCg0vK3bt2iiooKKisroy1btlD37t1JLBYT\nEdHZs2cpOTmZJBIJFRcX08KFCxtIxI4ePZoOHDig0T4ou59V3ecaX7R1dnZGdnY2d5ydna3wEfHW\nrVuYO3cujh07Jvdop0mKKotgJzUG8XxVLti29XBMQ0NDvPLKKyyuXsfQhsQhj8dr9B6aMGECF7kC\n1Mgddu3aFc7OzvD09ERgYKDKNvX09HDixAncvHkT3bt3R4cOHTBv3jxuimXr1q3Yv38/rKysMG/e\nPERERGj8vra3t0d0dDRWrlwJW1tb3LhxA7/88gt3fuPGjXIzD1FRUXByckLHjh1x4cIFnD17FoaG\nhgBq5u5nzJgBGxsb9OrVC/n5+XIhmLm5uUhLS8OUKVM02oemoFTisKlIJBL06tUL586dg5OTEwIC\nAvDzzz/LzeFnZWVhxIgR+Omnn1TehC9qmtcfp7Hwy89gbPwh/nIfjU8+aViGJITLHS9jQMoAGHfW\nzQ1XjBqYxKHm+O9//4vU1FT83//9n7ZNafUsWbIEbm5umD9/vkbb1ajEYVMxMDDA119/jdDQUEil\nUrz55pvw8PDAjh07AABvvfUW1q1bB6FQyAkEGxoaNmlTiDqYVErwuNoWyvaIFF8phklXkzbj7IuK\nimBtbc1G8gytMnfuXG2b0GbYunWrtk3g0PgIX1NoYjTmFncYn278EifFuxG+pDsmTGhY5uGHD6Fn\nqodua7u90LWam7oROJMnT4a1tbW2TWpzsBE+Q5doFSP81kRFdQVMKqqRXmyrdA5fcFyA3nt7t6xh\nzwmLwGEwGJpApx1+Mc8UetUSpOdZKZzSqciogKRIAst+rTNenWnLMhgMTaLTDl9CBrCtFkMgpaVw\nVAAAFTpJREFU1FO4y1ZwQgC78Xbg6bVOJ8rj8VBdXc1G9QwGQyPodPI0g+pyGOsbwMEBCnfZtvZw\nTD09PQQGBjJnz2AwNIJOO3zIZKg2UTydIymWoPTPUvBHtd3dtQwGg/E86LTDL7NwhMTQRuGCbWFs\nIayHWEPfXPvatVKpFDdv3kRVVZW2TWEwGDqMzjr8QrEYAGBTaqjQ4QtOtA7t2lpt2by8PEilUm2b\nw2AgJCQEu3bteq46TPJQfbQpeaizDr+ouhxmIgFKZA03XZGUUHhKu9q1irRlmyvZFaNt0FokDuum\nQtizZw+Cg4NVlm+Pkoc5OTmYOHEi7Ozs4OjoiIULFyocsK1btw56eno4f/489542JQ911uGXiMug\nBx7yJfwGI/ySayUwdjaGSRftiHdLJBIcOXKEacsy5GiNEofq0N4kDwHg3Xffhb29PXJzc3Hz5k3E\nx8c3EGl5+PAhDh48CKd6Dkibkoc66/ATS4pgXlWB3KqGm64Ex7UrZWhgYIDg4GCmLctQSktKHJ49\nexa9e/eGjY0NFi5cyO3SvHfvHubPn4+rV6/C0tIStra2Cuu3N8lDoEYx65VXXoGRkRE6duyIsLAw\nue8KABYsWIBPP/2US7JWF21JHuqswy+oKoeNqBQ5ZfwGUzqtIRzTwcGBjeoZDaAWljisHdlu3LgR\nAoEAPXr0wOXLlwHUyPLt2LEDgYGBKC0tRWFhocI22qPkYWhoKPbv34+Kigo8efIEp06dkvtBPXDg\nAExMTJT+yGpL8lBnN149rapEp6JC/FXcR26EX/GoAtUF1bAc0DK7a4mIOfY2RBwv7oXbCKGQJtUj\nLUgcxsTEwNPTE+Hh4QCAxYsX47PPPpOzqTHam+QhUCPONGrUKFhZWUEqlSIyMhKTJ08GUKNutXLl\nSvz+++9Kr6ctyUOddfgiiRgmYimyy/io+z225O7agoICxMfHY/jw4Uofhxmti6Y6a02gDYnDp0+f\nNtCrqKtYpw7tTfKQiBAaGoqXXnoJ169fR2lpKWbPno1ly5bh008/xZo1a/Daa6+hS5cucnXqoi3J\nQ52d0nkilsA17xn0bPlyu2xbIhyzbgSOl5dXswm8MHSXuhKHAOQkDutTX+IwNjYW5eXlal3HyclJ\nTrCIiOSO1Xk6VSV5WFxczC0oUyOSh0KhkHuVlJTgxIkTAGokD/v06YOMjAwUFxdjw4YNKhd6LSws\nYGlpqfC1adMmhXX69u0rN8WiSvKwoKAAiYmJWLBgAQwNDWFra4vIyEjExMQAAM6fP49t27bB0dER\njo6OyM7Oxssvv4wtW7ZwbTSn5KEqdNbhi6XVMKsUw9jx35G1pESCkmslsB3dfKPt2rh6FoHDeFEW\nL16MhIQEThN606ZN+PHHH/HVV1+htLQUQqEQq1atwvXr1/HJP+o+r732GlxcXDBt2jTcv38fMpkM\nAoEAGzduxKlTpxpcY/z48bh79y4OHz4MiUSCbdu2IS8vjzvfsWNH5OTkqFwkHTduHOLj47ljkUgE\nY2Nj2NraoqysDB999JFc+fqj3YCAAFhaWmLz5s2oqKiAVCrFnTt3cOPGDa49S0tLmJmZ4d69e/j2\n229Vfm4ikQilpaUKX4r0bQFg6tSpuHPnDg4dOoTKykqsXbsWvr6+DZ6mgJqnKEdHR3z77beQSqUo\nKirCjz/+yK0BnDt3Dnfv3kVKSgpu3rwJJycn7Ny5E++88w7XRnx8vNL5/eZEZx3+XxI9dCwsgXnn\nf0fXwjNCWAdZQ9+ieXbXSqVSXLhwgYurZxE4jBehJSQO7ezscODAASxfvhz29vbIyMjAkCFDuPMj\nR45E37590alTJzgoykCI9id5yOPxcOjQIRw/fhz29vZwd3eHsbExp/5la2sLBwcHODg4oGPHjtDX\n1wefz+f8gTYlD3VWAMXxQgx2rFyPU96X8e13NTfHvch7sBxgCef/59xI7aYjk8m4OUtG64IJoDQf\nTPJQfTQlecgEUOqQxzODnkQCR6caZ09SgiBGANe1rs16XebsGe0RJnmoPtqUPNRp7+Ty9BkXklmS\nUAKjTkYw6aqZ3bW1YXIMBoPRVtBJh18ikQAAKqVGnMPX1O7a2gicEydOaCWOlsFgMJqKTk7pVMpk\nsKgqQ6nMnNtlKzghQM8dDVfcnwemLctgMNoyOunwAQAkQ77UGl5OQOXjSojzxLAKsGpSUzKZDElJ\nSUxblsFgtGl00uGLiVBuZIZ8ac0u29ztAtiNswNPv2lOunbVm43qGQxGW0Yn5/CfVFXBpKoCFSZ2\n0NN78d21PB4PAwYMYM6ewWC0aXTS4esB6CjIg8zSHpJSCYqvFIM/mqU3YDAY7RuddPgAoCeTgcd3\ngPB3IawGWcHAqvHZK6lUiqSkJJSVlbWAhQxG86COShWjfaKzDl9fRjCy76h2OGZtDpxnz56xBVlG\ni+Pq6opz585p2wyGjqOTi7ZAjcO3cHSE4LgAXVd3VVpOKpUiOTmZReAwtEr9/DIMRnOgkyN8Kcmg\nLwPs9e1g1MEIpt1MFZaTyWQ4evQoy2zJaJVERkZi9erV3HFcXJxcrvrs7GyEh4fDwcEB9vb2WLhw\nocJ2li5diuDg4Ab53hntD50c4VdKKmAgA2z+1lc5naOnp4ehQ4fCzs6OOXpGq0PVqF8qlWLChAkY\nNWoU9u3bBz09PSQmJsqVISLMmzcPOTk5OHv2LExMNJNWhNF20UmHXyGugL4MMEytgN1S1eo99vb2\nLWQVoy2QmJjYwHECQL9+/dCvX79Gyysr11SUZT1MSEhAbm4utmzZwiXsCwoK4s5XV1cjIiICMpkM\nx48fh4GBTv6rM54TnbwLKkoFsCgyAgrFsBpUs7uWpS1mqMPzOmxNO3h1yc7ORteuXZXe0xkZGbh1\n6xauX7/OnD2Do1k84OnTp9G7d2+4u7tz4g31effdd+Hu7g4fHx8kJydr9PppfxfCNd0OdmNtwdPn\nyUXgMBhtBXNzczmpwrpKVC4uLsjKyoJUKlVY18PDA7t378bYsWPl5AcZ7RuNO3ypVIoFCxbg9OnT\nSE1Nxc8//4y0tDS5MjExMcjIyEB6ejp27tyJt99+W6M2VDwrwpA/pLCdyJfTlq2vSs9gtCbEYjEq\nKyu5l4+PD2JiYiAUCpGXl4cvvviCKxsQEABHR0csX74c5eXlqKysxJUrV+Tai4iIwMaNGzFq1Cg8\nevSopbvDaIVo3OEnJCTAzc0Nrq6uMDQ0REREBI4ePSpX5tixY5g1axYAYODAgSgqKsLff/+tMRvE\nOSXoKDHGJbrEInAYbYZx48bBzMyMez148AA+Pj5wdXVFWFiYnLSfvr4+jh8/joyMDHTp0gUuLi6c\nwHndxd7XX38dH3/8MUaMGIGsrCyt9Y3ROtD45N6TJ0/kQsc6d+7MiTCrKpOTk4OOHTvKlVuzZg33\nd0hICEJCQtSywfoGkDvrb4T4DWFx9Yw2QWZmplrlFi9ezP3t4uKCw4cPNygza9YsbkAFAHPmzMGc\nOXNe3EhGqyQuLg5xcXFqldW4w1fXudaPPlBUr67Dfx5eXRWGnJtPFCrOMxgMhi5RfzC8du1apWU1\n7vCdnZ2RnZ3NHWdnZ6Nz584qy+Tk5MDZWXPC4l17uaBrL9XhmAwGg9He0Pgcfv/+/ZGeno6//voL\nYrEYv/76KyZNmiRXZtKkSdi7dy8A4Nq1a7CxsWkwncNgMBgMzaLxEb6BgQG+/vprhIaGQiqV4s03\n34SHhwd27NgBAHjrrbcwbtw4xMTEwM3NDebm5vjhhx80bQaD0QA+n8/Wcxg6A5///CnfeaRsK5+W\nqVWZYjAYDIb6qPKdOrn1VN0Va12C9bl9wPrcPmiuPjOHryOwPrcPWJ/bB8zhMxgMBuOFYA6fwWAw\n2gmtetGWwWAwGM+PMrfeavOmttLfIQaDwWizsCkdBoPBaCcwh89gMBjtBObwGQwGo53Qph2+tpW1\ntEFjfd63bx98fHzg7e2NwYMH49atW1qwUrOo8z0DwJ9//gkDAwMcOnSoBa1rHtTpc1xcHPz8/ODp\n6al26vDWTGN9LigoQFhYGHx9feHp6Yk9e/a0vJEaZPbs2ejYsSO8vLyUltG4/6I2ikQioR49elBm\nZiaJxWLy8fGh1NRUuTInT56ksWPHEhHRtWvXaODAgdowVWOo0+crV65QUVERERGdOnWqXfS5ttzw\n4cNp/PjxdPDgQS1YqjnU6bNQKKQ+ffpQdnY2ERHl5+drw1SNoU6fP/nkE1q+fDkR1fTX1taWqqur\ntWGuRrh48SIlJSWRp6enwvPN4b/a7Ai/NShrtTTq9DkwMBDW1tYAavqck5OjDVM1hjp9BoCvvvoK\n06dP1wkZS3X6vH//fkybNo1LPW5vb68NUzWGOn12dHRESUkJAKCkpAR2dnZtWqA9ODhYZQK05vBf\nbdbhK1LNevLkSaNl2rIDVKfPddm1axfGjRvXEqY1G+p+z0ePHuW0kdv6Hg51+pyeno7CwkIMHz4c\n/fv3R1RUVEubqVHU6fPcuXNx9+5dODk5wcfHB19++WVLm9miNIf/arM/j5pU1morPI/tFy5cwO7d\nu3H58uVmtKj5UafPixcvxqZNm7gsgfW/87aGOn2urq5GUlISzp07h/LycgQGBmLQoEFwd3dvAQs1\njzp93rhxI3x9fREXF4eHDx9i9OjRSElJgaWlZQtYqB007b/arMNvDcpaLY06fQaAW7duYe7cuTh9\n+nSTcma3JtTpc2JiIiIiIgDULOydOnUKhoaGDYR32grq9NnFxQX29vYwNTWFqakphg4dipSUlDbr\n8NXp85UrV7By5UoAQI8ePdCtWzfcv38f/fv3b1FbW4pm8V8vvAqgJaqrq6l79+6UmZlJVVVVjS7a\nXr16tc0vYKrT58ePH1OPHj3o6tWrWrJSs6jT57pERkZSdHR0C1qoedTpc1paGo0cOZIkEgmVlZWR\np6cn3b17V0sWvzjq9Pm9996jNWvWEBFRXl4eOTs7k0Ag0Ia5GiMzM1OtRVtN+a82O8Jvj8pa6vR5\n3bp1EAqF3Hy2oaEhEhIStGn2C6FOn3UNdfrcu3dvhIWFwdvbG3p6epg7dy769OmjZcubjjp9/uij\nj/DGG2/Ax8cHMpkMmzdvhq2trZYtbzozZsxAfHw8CgoK4OLigrVr16K6uhpA8/mvVps8jcFgMBia\npc1G6TAYDAbj+WAOn8FgMNoJzOEzGAxGO4E5fAaDwWgnMIfP0Dr6+vrw8/PjXllZWUrLWlhYvPD1\nIiMj0b17d/j5+aFfv364du3ac7cxd+5c3Lt3D0DNhqC6DB48+IVtBP79XLy9vREeHg6RSKSyfEpK\nCk6dOqWRazN0Exalw9A6lpaWKC0t1XhZZbzxxhuYOHEiwsPDcfbsWSxZsgQpKSlNbk8TNjXWbmRk\nJLy8vPDBBx8oLb9nzx4kJibiq6++0rgtDN2AjfAZrY6ysjKMGjUK/fr1g7e3N44dO9agTG5uLoYO\nHQo/Pz94eXnhjz/+AACcOXMGQUFB6NevH15++WWUlZUpvEbtOCc4OBgZGRkAgM8//xxeXl7w8vLi\n8rSUlZVh/Pjx8PX1hZeXFw4cOAAACAkJQWJiIpYvX46Kigr4+fnhtddeA/DvU0hERARiYmK4a0ZG\nRuLQoUOQyWRYunQpAgIC4OPjg507dzb6mQQGBuLhw4cAahKNBQUFwd/fH4MHD8aDBw8gFovx8ccf\n49dff4Wfnx8OHDiAsrIyzJ49GwMHDoS/v7/Cz5HRznjhrVsMxguir69Pvr6+5OvrS+Hh4SSRSKik\npISIatLgurm5cWUtLCyIiGjr1q20YcMGIiKSSqVUWlpK+fn5NHToUCovLyciok2bNtG6desaXC8y\nMpJLofzbb7/RoEGDKDExkby8vKi8vJxEIhH17duXkpOT6eDBgzR37lyubnFxMRERhYSEUGJiopxN\n9W08fPgwzZo1i4iIqqqqyMXFhSorK2nHjh20fv16IiKqrKyk/v37U2ZmZgM7a9uRSCQUHh5O33zz\nDRERlZSUkEQiISKis2fP0rRp04iIaM+ePbRw4UKu/ooVK+inn34iopp0yj179qSysjKF3wGjfdBm\nd9oydAdTU1M5cYfq6mqsWLECly5dgp6eHp4+fYpnz57BwcGBKxMQEIDZs2ejuroaU6ZMgY+PD+Li\n4pCamoqgoCAAgFgs5v6uCxFh6dKlWL9+PRwcHLBr1y6cPXsW4eHhMDU1BQCEh4fj0qVLCAsLw5Il\nS7B8+XJMmDABQ4YMUbtfYWFhWLRoEcRiMU6dOoVhw4bB2NgYZ86cwe3bt3Hw4EEANal+MzIy4Orq\nKle/9snhyZMncHV1xfz58wEARUVFeP3115GRkQEejweJRML1i+rM0J45cwbHjx/H1q1bAQBVVVXI\nzs5Gr1691O4DQ7dgDp/R6ti3bx8KCgqQlJQEfX19dOvWDZWVlXJlgoODcenSJZw4cQKRkZF4//33\nwefzMXr0aOzfv19l+zweD1u3bkV4eDj33u+//y7nLIkIPB4P7u7uSE5OxsmTJ7Fq1SqMHDkSq1ev\nVqsfJiYmCAkJQWxsLH777TfMmDGDO/f1119j9OjRKuvX/hBWVFQgNDQUR48exdSpU7F69WqMHDkS\nhw8fxuPHj1WqXR06dKjNJlRjaB42h89odZSUlMDBwQH6+vq4cOECHj9+3KBMVlYWOnTogDlz5mDO\nnDlITk7GoEGDcPnyZW6uu6ysDOnp6QqvQfViFYKDg3HkyBFUVFSgrKwMR44cQXBwMHJzc2FiYoKZ\nM2diyZIlCmXmDA0NuVF2fV555RXs3r2be1oAgNDQUGzfvp2r8+DBA5SXlyv9PExNTbFt2zasXLkS\nRISSkhI4OTkBgFx+FSsrK7nF49DQUGzbto071gWJT8aLwRw+Q+vUz/E9c+ZM3LhxA97e3oiKioKH\nh0eDshcuXICvry/8/f3x22+/YdGiRbC3t8eePXswY8YM+Pj4ICgoCPfv31frmn5+foiMjERAQAAG\nDRqEuXPnwsfHB7dv38bAgQPh5+eHdevWYdWqVQ3amjdvHry9vblF27ptjxkzBhcvXsTo0aM5daY5\nc+agT58+8Pf3h5eXF95++22FPxh12/H19YWbmxt+++03fPjhh1ixYgX8/f0hlUq5csOHD0dqaiq3\naLt69WpUV1fD29sbnp6e+OSTT5R/CYx2AQvLZDAYjHYCG+EzGAxGO4E5fAaDwWgnMIfPYDAY7QTm\n8BkMBqOdwBw+g8FgtBOYw2cwGIx2wv8H4I9N3VWV3qsAAAAASUVORK5CYII=\n",
"text": [
"<matplotlib.figure.Figure at 0x115460750>"
]
}
],
"prompt_number": 40
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"For this target class at least, Naive Bayes doesn't appear to be a particularly good classifier. Perhaps logistic regression or Random Forests would be better."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Predicting binding orientation with Target Prediction\n",
"-----\n",
"One of the ligands, compound_id = 19143, is Benzothiophene Inhibitor 4. There are crystal structures of it cocrystallized with Thrombin. We can build a model specifically excluding it, and predict whether it binds:\n"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"result = %sql \\\n",
"SELECT \\\n",
"compound_id, \"pValue\", fingerprint \\\n",
"FROM sar NATURAL JOIN \"morgan(2,2048)\" \\\n",
"WHERE target_id = 95 \\\n",
"AND compound_id <> 19143"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"4736 rows affected.\n"
]
}
],
"prompt_number": 41
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"X = np.zeros((len(result),2048),dtype=uint8)\n",
"y = np.zeros((len(result)),dtype=float)\n",
"for count, line in enumerate(result):\n",
" compound_id, pValue, pickle = line\n",
" fp = cPickle.loads(str(pickle))\n",
" X[:][count] = fp\n",
" y[count] = pValue\n",
"\n",
"y_binarized = y > 6.5"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [],
"prompt_number": 42
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"We can calculate the fingerprints in python using the rdkit library:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"binder = Chem.MolFromSmiles('Oc1ccc2c(Cc3ccc(CN4CCCC4)c(Br)c3)c(sc2c1)-c1ccc(OCCN2CCCC2)cc1'); binder"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"png": "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\nAABJRU5ErkJggg==\n",
"prompt_number": 43,
"text": [
"<rdkit.Chem.rdchem.Mol at 0x11543c590>"
]
}
],
"prompt_number": 43
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"fp = Chem.AllChem.GetMorganFingerprintAsBitVect(binder,2,nBits=2048)\n",
"fp.ToBitString()"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 44,
"text": [
"'00000000000001000000000000000000000000000000000000000000000000000000000000000000100000000000000000000010000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000001000000000000000000000000000000000000000000000000000000000010000000000000000000000010000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000100000000000000000000001000000000100000000000000001000000000000000000000000000000000000001000000000000000000000010000000000000000000000000100000000000100000000000000000000000000000110000000010000000000100000000100000000000010000000100000000100000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000100000100000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000100000100000000000000000000000000000000000000000000000000000000000000100000000000010000000000000000000000100000001000000000000000000000010000000000000000000000000000000000000000010000000100000000000000000000010000000000000000000000000001010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000100000001000000001000100000000001000000000000000000000000011000000000000000000000000000000000000000100000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000010000000000000'"
]
}
],
"prompt_number": 44
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"Using a random forest classifier, our model can predict if it binds. Fortunately it is predicted active!"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"classifier = RandomForestClassifier(n_estimators=100, random_state=42)\n",
"classifier.fit(X,y_binarized)\n",
"print classifier.predict(fp)"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[ True]\n"
]
}
],
"prompt_number": 45
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"We can then use the rdkit library to visualise the contributions of the different fingerprints to its probability of binding."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from rdkit.Chem.Draw import SimilarityMaps\n",
"def getProba(fp, predictionFunction):\n",
" return predictionFunction(fp)[0][1]\n",
"fig, maxweight = SimilarityMaps.GetSimilarityMapForModel(binder, SimilarityMaps.GetMorganFingerprint, lambda x: getProba(x, classifier.predict_proba))"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment