{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Tutorial on hyperbolic surfaces\n",
    "\n",
    "A *hyperbolic surface with cusps* is a topological surface together with a hyperbolic structure of finite area. `polymake` can deal with hyperbolic surfaces in view of Penners coordinates of the decorated Teichmüller space (lambda lengths). These allow to pick a hyperbolic surface by choosing a triangulation of the surface along with one positive parameter for each edge.\n",
    "\n",
    "\n",
    "The [secondary fan](https://arxiv.org/abs/1708.08714v1) of a hyperbolic surface stratifies the space of weight vectors (horocyclic decorations) according to which Delaunay triangulations are induced by the Epstein-Penner convex hull construction.\n",
    "For each point on the surface, there is a [secondary polyhedron](https://arxiv.org/abs/1708.08714v1) whose normal fan is the secondary fan.\n",
    "\n",
    "\n",
    "This tutorial shows how to deal with secondary fans and secondary polyhedra of hyperbolic surfaces.\n",
    "\n",
    "\n",
    "### Construction of hyperbolic surfaces\n",
    "\n",
    "To define a hyperbolic surface we need to specify (a) a triangulation and (b) Penner coordinates. \n",
    "\n",
    "(a)\n",
    "The triangulation is obtained by specifying the `DCEL` as an `Matrix<Int>`. \n",
    "This constructs a doubly connected edge list as follows:\n",
    "Each row of the nput of `DCEL` reads { (*2i*).head , (*2i+1*).head , (*2i*).next , (*2i+1*).next }.\n",
    "In general, for each edge *i* of the triangulation there are two half edges *2i* and *2i+1*, one for each orientation.\n",
    "   \n",
    "(b)\n",
    "The `PENNER_COORDINATES` assign a positive rational number to each edge of the triangulation, ordered in the same sense as prescribed by the `DCEL`.\n",
    "\n",
    "\n",
    "\n",
    "### Example 1: hyperbolic sphere with three cusps"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "application 'fan';\n",
    "application 'topaz';"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "$S3 = new Matrix<Int>([[1,0,2,5],[2,1,4,1],[0,2,0,3]]);\n",
    "$s = new HyperbolicSurface(DCEL=>$S3,PENNER_COORDINATES=>[1,1,1]);"
   ]
  },
  {
   "attachments": {
    "paper_skizzen_2_281_29.png": {
     "image/png": "[encoded data, 31724 characters]"
    }
   },
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In this example the doubly connected edge list looks like this:\n",
    "<img src=\"attachment:paper_skizzen_2_281_29.png\" tooltip=\"paper_skizzen_2_281_29.png\" class=\"center-block\">\n",
    "\n",
    "\n",
    "### The secondary fan\n",
    "\n",
    "The secondary fan of the hyperbolic sphere from above can now be computed as follows."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "type: PolyhedralFan<Rational>\n",
       "\n",
       "MAXIMAL_CONES\n",
       "{0 1 2}\n",
       "{0 1 3}\n",
       "{1 2 4}\n",
       "{0 2 5}\n",
       "\n",
       "\n",
       "RAYS\n",
       "0 1 1\n",
       "1 0 1\n",
       "1 1 0\n",
       "0 0 1\n",
       "1 0 0\n",
       "0 1 0\n",
       "\n"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/html": [
       "<details><summary><pre style=\"display:inline\"><small>Click here for additional output</small></pre></summary>\n",
       "<pre>\n",
       "polymake: used package cdd\n",
       "  cddlib\n",
       "  Implementation of the double description method of Motzkin et al.\n",
       "  Copyright by Komei Fukuda.\n",
       "  http://www-oldurls.inf.ethz.ch/personal/fukudak/cdd_home/\n",
       "\n",
       "</pre>\n",
       "</details>\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "$f = $s->SECONDARY_FAN;\n",
    "$f->properties;"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<!--\n",
       "polymake for knusper\n",
       "Thu Aug 27 11:35:23 2020\n",
       "fan:\n",
       "-->\n",
       "\n",
       "\n",
       "<html>\n",
       "   <head>\n",
       "      <meta charset=utf-8>\n",
       "      <title>fan:</title>\n",
       "      <style>\n",
       "/*\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "*/\n",
       "         html {overflow: scroll;}\n",
       "         strong{font-size: 18px;}\n",
       "         canvas { z-index: 8; }\n",
       "         input[type='radio'] {margin-left:0;}\n",
       "         input[type='checkbox'] {margin-right:7px; margin-left: 0px; padding-left:0px;}\n",
       "         .group{padding-bottom: 15px;}\n",
       "         .settings * {z-index: 11; }\n",
       "         .settings{z-index: 10; font-family: Arial, Helvetica, sans-serif; margin-left: 30px; visibility: hidden; width: 14em; height: 96%; border: solid 1px silver; padding: 2px; overflow-y: scroll; box-sizing: border-box; background-color: white; position: absolute;}\n",
       "         .indented{margin-left: 20px; margin-top: 10px; padding-bottom: 0px;} \n",
       "         .shownObjectsList{overflow: auto; max-width: 150px; max-height: 150px;}\n",
       "         .showSettingsButton{visibility: visible; z-index: 12; position: absolute }\n",
       "         .hideSettingsButton{visibility: hidden; z-index: 12; position: absolute; opacity: 0.5}\n",
       "         button{margin-left: 0; margin-top: 10px}\n",
       "         img{cursor: pointer;}\n",
       "         .suboption{padding-top: 15px;}\n",
       "         #model56995559328 { width: 100%; height: 100%; }\n",
       "         .threejs_container { width: 100%; height: 75vh;}\n",
       "         .settings{max-height: 74vh} \n",
       "         input[type=range] {\n",
       "           -webkit-appearance: none;\n",
       "           padding:0; \n",
       "           width:90%; \n",
       "           margin-left: auto;\n",
       "           margin-right: auto;\n",
       "           margin-top: 15px;\n",
       "           margin-bottom: 15px;\n",
       "           display: block;\t\n",
       "         }\n",
       "         input[type=range]:focus {\n",
       "           outline: none;\n",
       "         }\n",
       "         input[type=range]::-webkit-slider-runnable-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "           background: #E3E3E3;\n",
       "           border-radius: 0px;\n",
       "           border: 0px solid #000000;\n",
       "         }\n",
       "         input[type=range]::-webkit-slider-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "           -webkit-appearance: none;\n",
       "           margin-top: -5px;\n",
       "         }\n",
       "         input[type=range]:focus::-webkit-slider-runnable-track {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "         input[type=range]::-moz-range-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "           background: #E3E3E3;\n",
       "           border-radius: 0px;\n",
       "           border: 0px solid #000000;\n",
       "         }\n",
       "         input[type=range]::-moz-range-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "         }\n",
       "         input[type=range]::-ms-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           background: transparent;\n",
       "           border-color: transparent;\n",
       "           color: transparent;\n",
       "         }\n",
       "         input[type=range]::-ms-fill-lower {\n",
       "           background: #E3E3E3;\n",
       "           border: 0px solid #000000;\n",
       "           border-radius: 0px;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "         }\n",
       "         input[type=range]::-ms-fill-upper {\n",
       "           background: #E3E3E3;\n",
       "           border: 0px solid #000000;\n",
       "           border-radius: 0px;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "         }\n",
       "         input[type=range]::-ms-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "         }\n",
       "         input[type=range]:focus::-ms-fill-lower {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "         input[type=range]:focus::-ms-fill-upper {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "/*\n",
       "// COMMON_CODE_BLOCK_END\n",
       "*/\n",
       "\t\t</style>\n",
       "   </head>\n",
       "<body>\n",
       "   <div class='threejs_container'>\n",
       "\t\t<div id='settings_0' class='settings'>\n",
       "\t\t\t<div class=group id='explode_0'>\n",
       "\t\t\t\t<strong>Explode</strong>\n",
       "\t\t\t\t<input id='explodeRange_0' type='range' min=0 max=6 step=0.01 value=0>\n",
       "\t\t\t\t<div class=indented><input id='explodeCheckbox_0' type='checkbox'>Automatic explosion</div>\n",
       "\t\t\t\t<div class=suboption>Exploding speed</div>\n",
       "\t\t\t\t<input id='explodingSpeedRange_0' type='range' min=0 max=0.5 step=0.001 value=0.05>\n",
       "\t\t\t</div>\n",
       "\t\n",
       "\t\t\t<div class=group id='transparency_0' class='transparency'>\n",
       "\t\t\t\t<strong>Transparency</strong>\n",
       "\t\t\t\t<input id='transparencyRange_0' type='range' min=0 max=1 step=0.01 value=0>\n",
       "\t\t\t</div>\n",
       "\t\t\t\n",
       "\t\t\t<div class=group id='rotation_0'>\n",
       "\t\t\t\t<strong>Rotation</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationX_0'> x-axis</div>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationY_0'> y-axis</div>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationZ_0'> z-axis</div>\n",
       "\t\t\t\t\t<button id='resetButton_0'>Reset</button>\n",
       "\t\t\t\t</div>\n",
       "\n",
       "\t\t\t\t<div class=suboption>Rotation speed</div>\n",
       "\t\t\t\t<input id='rotationSpeedRange_0' type='range' min=0 max=5 step=0.01 value=2>\n",
       "\t\t\t</div>\n",
       "\n",
       "\n",
       "\t\t\t<div class=group id='display_0'>\n",
       "\t\t\t\t<strong>Display</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<div id='shownObjectTypesList_0' class='shownObjectsList'></div>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t\t<div class=suboption>Objects</div>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t   <div id='shownObjectsList_0' class='shownObjectsList'></div>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t</div>\n",
       "         \n",
       "         <div class=group id='camera_0'>\n",
       "            <strong>Camera</strong>\n",
       "            <div class=indented>\n",
       "               <form>\n",
       "                  <select id=\"cameraType_0\">\n",
       "                     <option value='perspective' selected> Perspective<br></option>\n",
       "                     <option value='orthographic' > Orthographic<br></option>\n",
       "                  </select>\n",
       "               </form>\n",
       "            </div>\n",
       "         </div>\n",
       "\n",
       "\t\t\t<div class=group id='svg_0'>\n",
       "\t\t\t\t<strong>SVG</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<form>\n",
       "\t\t\t\t\t\t<input type=\"radio\" name='screenshotMode' value='download' id='download_0' checked> Download<br>\n",
       "\t\t\t\t\t\t<input type=\"radio\" name='screenshotMode' value='tab' id='tab_0' > New tab<br>\n",
       "\t\t\t\t\t</form>\n",
       "\t\t\t\t\t<button id='takeScreenshot_0'>Screenshot</button>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t</div>\n",
       "\n",
       "\t\t</div>\t<!-- end of settings -->\n",
       "\t\t<img id='hideSettingsButton_0' class='hideSettingsButton' src='/kernelspecs/polymake/close.svg' width=20px\">\n",
       "\t\t<img id='showSettingsButton_0' class='showSettingsButton' src='/kernelspecs/polymake/menu.svg' width=20px\">\n",
       "<div id=\"model56995559328\"></div>\n",
       "</div>\n",
       "   <script>\n",
       "    requirejs.config({\n",
       "      paths: {\n",
       "        three: '/kernelspecs/polymake/three',\n",
       "        TrackballControls: '/kernelspecs/polymake/TrackballControls',\n",
       "        OrbitControls: '/kernelspecs/polymake/OrbitControls',\n",
       "        Projector: '/kernelspecs/polymake/Projector',\n",
       "        SVGRenderer: '/kernelspecs/polymake/SVGRenderer',\n",
       "        WEBGL: '/kernelspecs/polymake/WebGL',\n",
       "      },\n",
       "      shim: {\n",
       "        'three': { exports: 'THREE'},\n",
       "        'SVGRenderer': { deps: [ 'three' ], exports: 'THREE.SVGRenderer' },\n",
       "        'WEBGL': { deps: [ 'three' ], exports: 'THREE.WEBGL' },\n",
       "        'Projector': { deps: [ 'three' ], exports: 'THREE.Projector' },\n",
       "        'TrackballControls': { deps: [ 'three' ], exports: 'THREE.TrackballControls' },\n",
       "        'OrbitControls': { deps: [ 'three' ], exports: 'THREE.OrbitControls' },\n",
       "      }\n",
       "    });\n",
       "    \n",
       "    require(['three'],function(THREE){\n",
       "        window.THREE = THREE;\n",
       "      require(['TrackballControls', 'OrbitControls', 'Projector', 'SVGRenderer', 'WEBGL'],\n",
       "               function(TrackballControls, OrbitControls, Projector, SVGRenderer, WEBGL) {\n",
       "    THREE.TrackballControls = TrackballControls;\n",
       "    THREE.OrbitControls = OrbitControls;\n",
       "    THREE.Projector = Projector;\n",
       "    THREE.SVGRenderer = SVGRenderer;\n",
       "    THREE.WEBGL = WEBGL;\n",
       "\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "\n",
       "const intervalLength = 25; // for automatic animations\n",
       "const explodableModel = true; \n",
       "const modelContains = { points: false, pointlabels: false, lines: false, edgelabels: false, faces: false, arrowheads: false };\n",
       "const foldables = [];\n",
       "\n",
       "var three = document.getElementById(\"model56995559328\");\n",
       "var scene = new THREE.Scene();\n",
       "var renderer = new THREE.WebGLRenderer( { antialias: true } );\n",
       "var svgRenderer = new THREE.SVGRenderer( { antialias: true } );\n",
       "renderer.setPixelRatio( window.devicePixelRatio );\n",
       "renderer.setClearColor(0xFFFFFF, 1);\n",
       "svgRenderer.setClearColor(0xFFFFFF, 1);\n",
       "three.appendChild(renderer.domElement);\n",
       "\n",
       "var frustumSize = 4;\n",
       "var cameras = [new THREE.PerspectiveCamera(75, 1, 0.1, 1000), new THREE.OrthographicCamera()];\n",
       "cameras.forEach(function(cam) {\n",
       "    cam.position.set(0, 0, 5);\n",
       "    cam.lookAt(0, 0, 0);  \n",
       "    cam.up.set(0, 1, 0);         \n",
       "});\n",
       "var controls = [new THREE.TrackballControls(cameras[0], three), new THREE.OrbitControls(cameras[1], three)];\n",
       "var camera, control;\n",
       "\n",
       "controls[0].zoomSpeed = 0.2;\n",
       "controls[0].rotateSpeed = 4;\n",
       "\n",
       "\n",
       "// class to allow move points together with labels and spheres\n",
       "var PMPoint = function (x,y,z) {\n",
       "   this.vector = new THREE.Vector3(x,y,z);\n",
       "   this.sprite = null;\n",
       "   this.sphere = null;\n",
       "}\n",
       "PMPoint.prototype.addLabel = function(labelsprite) {\n",
       "   this.sprite = labelsprite;\n",
       "   this.sprite.position.copy(this.vector);\n",
       "}\n",
       "PMPoint.prototype.addSphere = function(spheremesh) {\n",
       "   this.sphere = spheremesh;\n",
       "   this.sphere.position.copy(this.vector);\n",
       "}\n",
       "PMPoint.prototype.set = function(x,y,z) {\n",
       "   this.vector.set(x,y,z);\n",
       "   if (this.sprite) {\n",
       "      this.sprite.position.copy(this.vector);\n",
       "   }\n",
       "   if (this.sphere) {\n",
       "      this.sphere.position.copy(this.vector);\n",
       "   }\n",
       "}\n",
       "PMPoint.prototype.radius = function() {\n",
       "   if (this.sphere) {\n",
       "      return this.sphere.geometry.parameters.radius;\n",
       "   } else {\n",
       "      return 0;\n",
       "   }\n",
       "};\n",
       "// select the target node\n",
       "var target = document.querySelector('#model56995559328');\n",
       "\n",
       "// create an observer instance\n",
       "var observer = new MutationObserver(function(mutations) {\n",
       "   mutations.forEach(function(mutation) {\n",
       "      if (mutation.removedNodes && mutation.removedNodes.length > 0) {\n",
       "         cancelAnimationFrame(renderId);\n",
       "         observer.disconnect();\n",
       "         console.log(\"cancelled frame \"+renderId);\n",
       "      }\n",
       "   });\n",
       "});\n",
       "\n",
       "// configuration of the observer:\n",
       "var config = { childList: true, characterData: true }\n",
       "\n",
       "// pass in the target node, as well as the observer options\n",
       "while (target) {\n",
       "   if (target.className==\"output\") {\n",
       "      observer.observe(target, config);\n",
       "      break;\n",
       "   }\n",
       "   target = target.parentNode;\n",
       "}\n",
       "\n",
       "// COMMON_CODE_BLOCK_END\n",
       "\n",
       "var obj0 = new THREE.Object3D();\n",
       "obj0.name = \"Rays\";\n",
       "obj0.userData.explodable = 0;\n",
       "obj0.userData.points = [];\n",
       "obj0.userData.points.push(new PMPoint(0, 0, 0));\n",
       "obj0.userData.points.push(new PMPoint(0, 0.707107, 0.707107));\n",
       "obj0.userData.points.push(new PMPoint(0.707107, 0, 0.707107));\n",
       "obj0.userData.points.push(new PMPoint(0.707107, 0.707107, 0));\n",
       "obj0.userData.points.push(new PMPoint(0, 0, 1));\n",
       "obj0.userData.points.push(new PMPoint(1, 0, 0));\n",
       "obj0.userData.points.push(new PMPoint(0, 1, 0));\n",
       "\n",
       "obj0.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj0.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj0.userData.pointlabels = [\" \", \"0\", \"1\", \"2\", \"3\", \"4\", \"5\"];\n",
       "obj0.userData.edgeindices = [1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0];\n",
       "   <!-- Edge style -->\n",
       "obj0.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj0);\n",
       "scene.add(obj0);\n",
       "\n",
       "var obj1 = new THREE.Object3D();\n",
       "obj1.name = \"unnamed__1\";\n",
       "obj1.userData.explodable = 1;\n",
       "obj1.userData.points = [];\n",
       "obj1.userData.points.push(new PMPoint(0, 0.707107, 0.707107));\n",
       "obj1.userData.points.push(new PMPoint(0.707107, 0, 0.707107));\n",
       "obj1.userData.points.push(new PMPoint(0.707107, 0.707107, 0));\n",
       "obj1.userData.points.push(new PMPoint(0, 0, 0));\n",
       "\n",
       "obj1.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj1.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj1.userData.facets = [[2, 3, 0], [1, 3, 2], [0, 3, 1], [2, 0, 1]];\n",
       "   <!-- Facet style -->\n",
       "obj1.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj1);\n",
       "scene.add(obj1);\n",
       "\n",
       "var obj2 = new THREE.Object3D();\n",
       "obj2.name = \"unnamed__2\";\n",
       "obj2.userData.explodable = 1;\n",
       "obj2.userData.points = [];\n",
       "obj2.userData.points.push(new PMPoint(0, 0.707107, 0.707107));\n",
       "obj2.userData.points.push(new PMPoint(0.707107, 0, 0.707107));\n",
       "obj2.userData.points.push(new PMPoint(0, 0, 1));\n",
       "obj2.userData.points.push(new PMPoint(0, 0, 0));\n",
       "\n",
       "obj2.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj2.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj2.userData.facets = [[3, 0, 1], [2, 0, 3], [3, 1, 2], [1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj2.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj2);\n",
       "scene.add(obj2);\n",
       "\n",
       "var obj3 = new THREE.Object3D();\n",
       "obj3.name = \"unnamed__3\";\n",
       "obj3.userData.explodable = 1;\n",
       "obj3.userData.points = [];\n",
       "obj3.userData.points.push(new PMPoint(0.707107, 0, 0.707107));\n",
       "obj3.userData.points.push(new PMPoint(0.707107, 0.707107, 0));\n",
       "obj3.userData.points.push(new PMPoint(1, 0, 0));\n",
       "obj3.userData.points.push(new PMPoint(0, 0, 0));\n",
       "\n",
       "obj3.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj3.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj3.userData.facets = [[3, 0, 1], [2, 0, 3], [3, 1, 2], [1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj3.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj3);\n",
       "scene.add(obj3);\n",
       "\n",
       "var obj4 = new THREE.Object3D();\n",
       "obj4.name = \"unnamed__4\";\n",
       "obj4.userData.explodable = 1;\n",
       "obj4.userData.points = [];\n",
       "obj4.userData.points.push(new PMPoint(0, 0.707107, 0.707107));\n",
       "obj4.userData.points.push(new PMPoint(0.707107, 0.707107, 0));\n",
       "obj4.userData.points.push(new PMPoint(0, 1, 0));\n",
       "obj4.userData.points.push(new PMPoint(0, 0, 0));\n",
       "\n",
       "obj4.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj4.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj4.userData.facets = [[0, 3, 1], [2, 3, 0], [1, 3, 2], [0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj4.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj4);\n",
       "scene.add(obj4);\n",
       "\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "function textSpriteMaterial(message, parameters) {\n",
       "    if ( parameters === undefined ) parameters = {};\n",
       "    var fontface = \"Helvetica\";\n",
       "    var fontsize = parameters.hasOwnProperty(\"fontsize\") ? parameters[\"fontsize\"] : 15;\n",
       "    fontsize = fontsize*10;\n",
       "    var lines = message.split('\\\\n');\n",
       "    var size = 512;\n",
       "    for(var i = 0; i<lines.length; i++){\n",
       "        var tmp = lines[i].length;\n",
       "        while(tmp*fontsize > size){\n",
       "           fontsize--;\n",
       "        }\n",
       "    }\n",
       "    \n",
       "    var canvas = document.createElement('canvas');\n",
       "    canvas.width = size;\n",
       "    canvas.height = size;\n",
       "    var context = canvas.getContext('2d');\n",
       "    context.fillStyle = \"rgba(255, 255, 255, 0)\";\n",
       "    context.fill();\n",
       "    context.font = fontsize + \"px \" + fontface;\n",
       "    \n",
       "    // text color\n",
       "    context.fillStyle = \"rgba(0, 0, 0, 1.0)\";\n",
       "     for(var i = 0; i<lines.length; i++){\n",
       "        context.fillText(lines[i], size/2, size/2+i*fontsize);\n",
       "     }\n",
       "    \n",
       "    // canvas contents will be used for a texture\n",
       "    var texture = new THREE.Texture(canvas);\n",
       "    texture.needsUpdate = true;\n",
       "    \n",
       "    var spriteMaterial = new THREE.SpriteMaterial({map: texture, depthTest: true, depthWrite: false, polygonOffset: true, polygonOffsetFactor: -1, polygonOffsetUnits: 1 });\n",
       "    return spriteMaterial;\n",
       "}\n",
       "\n",
       "\n",
       "// ---------------------- INITIALIZING OBJECTS--------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "function init_object(obj) {\n",
       "    if (obj.userData.hasOwnProperty(\"pointmaterial\")) {\n",
       "        init_points(obj);\n",
       "        modelContains.points = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"pointlabels\")) {\n",
       "        init_pointlabels(obj);\n",
       "        modelContains.pointlabels = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"edgematerial\")) {\n",
       "        init_lines(obj);\n",
       "        modelContains.lines = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"edgelabels\")) {\n",
       "        init_edgelabels(obj);\n",
       "        modelContains.edgelabels = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"arrowstyle\")) {\n",
       "        init_arrowheads(obj);\n",
       "        modelContains.arrowheads = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"facetmaterial\")) {\n",
       "        init_faces(obj);\n",
       "        modelContains.faces = true;\n",
       "    }\n",
       "}\n",
       "\n",
       "function init_points(obj) {\n",
       "    var pointgroup = new THREE.Group();\n",
       "    pointgroup.name = \"points\";\n",
       "    var points = obj.userData.points;\n",
       "    var radii = obj.userData.pointradii;\n",
       "    var materials = obj.userData.pointmaterial;\n",
       "    var geometry,material;\n",
       "    if (!Array.isArray(radii)) {\n",
       "        geometry = new THREE.SphereBufferGeometry(radii);  \n",
       "    }\n",
       "    if (!Array.isArray(materials)) {\n",
       "        material = materials;\n",
       "    }\n",
       "    for (var i=0; i<points.length; i++) {\n",
       "        var point = points[i];\n",
       "        if (Array.isArray(radii)) {\n",
       "            if (radii[i] == 0) {\n",
       "                continue;\n",
       "            }\n",
       "            geometry = new THREE.SphereBufferGeometry(radii[i]);  \n",
       "        } \n",
       "        if (Array.isArray(materials)) {\n",
       "            material = materials[i];     \n",
       "        } \n",
       "        var sphere = new THREE.Mesh(geometry, material);\n",
       "        point.addSphere(sphere);\n",
       "        pointgroup.add(sphere);\n",
       "    }\n",
       "    obj.add(pointgroup);\n",
       "}\n",
       "\n",
       "function init_pointlabels(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var labels = obj.userData.pointlabels;\n",
       "    var pointlabels = new THREE.Group();\n",
       "    pointlabels.name = \"pointlabels\";\n",
       "    if (Array.isArray(labels)) {\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "            var spriteMaterial = textSpriteMaterial( labels[i] );\n",
       "\t        var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            point.addLabel(sprite);\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    } else {\n",
       "        var spriteMaterial = textSpriteMaterial( labels );\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "\t        var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            point.addLabel(sprite);\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    }\n",
       "    obj.add(pointlabels);\n",
       "}\n",
       "\n",
       "function init_lines(obj) {\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var points = obj.userData.points;\n",
       "    var materials = obj.userData.edgematerial;\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    var bufarr = new Float32Array( obj.userData.edgeindices.length * 3 );\n",
       "    var bufattr = new THREE.Float32BufferAttribute( bufarr, 3 );\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    geometry.setAttribute('position', bufattr);\n",
       "    if (Array.isArray(materials)) {     \n",
       "        for (var i=0; i<materials.length; i++) {\n",
       "            geometry.addGroup(2*i,2,i);\n",
       "        }\n",
       "    }\n",
       "    var lines = new THREE.LineSegments(geometry, materials);\n",
       "    lines.name = \"lines\";\n",
       "    obj.add(lines);\n",
       "    updateEdgesPosition(obj);\n",
       "}\n",
       "\n",
       "function init_edgelabels(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var labels = obj.userData.edgelabels;\n",
       "    var edgelabels = new THREE.Group();\n",
       "    edgelabels.name = \"edgelabels\";\n",
       "    if (Array.isArray(labels)) {\n",
       "        for (var i=0; i<edgeindices.length; i=i+2) {\n",
       "            var point = points[i];\n",
       "            var spriteMaterial = textSpriteMaterial( labels[i] );\n",
       "            var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[i]].vector,points[edgeindices[i+1]].vector).multiplyScalar(0.5));\n",
       "            edgelabels.add(sprite);\n",
       "        }\n",
       "    } else {\n",
       "        var spriteMaterial = textSpriteMaterial( labels );\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "            var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[i]].vector,points[edgeindices[i+1]].vector).multiplyScalar(0.5));\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    }\n",
       "    obj.add(edgelabels);\n",
       "}\n",
       "\n",
       "function init_arrowheads(obj) {\n",
       "    var arrowheads = new THREE.Group();\n",
       "    arrowheads.name = \"arrowheads\";\n",
       "    var arrowstyle = obj.userData.arrowstyle;\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var edgematerials = obj.userData.edgematerial;\n",
       "    var points = obj.userData.points;\n",
       "    var material;\n",
       "    if (!Array.isArray(edgematerials)) {\n",
       "        material = new THREE.MeshBasicMaterial( {color: edgematerials.color} );\n",
       "    }\n",
       "\n",
       "    for (var i=0; i<edgeindices.length; i=i+2) {\n",
       "        var start = points[edgeindices[i]];\n",
       "        var end = points[edgeindices[i+1]];\n",
       "        var dist = start.vector.distanceTo( end.vector ) - start.radius() - end.radius();\n",
       "        if (dist <= 0) {\n",
       "            continue;\n",
       "        }\n",
       "        var dir = new THREE.Vector3().subVectors(end.vector,start.vector);\n",
       "        dir.normalize();\n",
       "        var axis = new THREE.Vector3().set(dir.z,0,-dir.x);\n",
       "        axis.normalize();\n",
       "        var radians = Math.acos( dir.y );\n",
       "        var radius = dist/25;\n",
       "        var height = dist/5;\n",
       "        var geometry = new THREE.ConeBufferGeometry(radius,height);\n",
       "        var position = new THREE.Vector3().addVectors(start.vector,dir.clone().multiplyScalar(start.radius()+dist-height/2));\n",
       "        if (Array.isArray(edgematerials)) {\n",
       "            material = new THREE.MeshBasicMaterial( {color: edgematerials[i].color} );\n",
       "        }\n",
       "        var cone = new THREE.Mesh( geometry, material );\n",
       "        cone.quaternion.setFromAxisAngle(axis,radians);;\n",
       "        cone.position.copy(position);;\n",
       "        arrowheads.add(cone);\n",
       "    }\n",
       "    obj.add(arrowheads);\n",
       "}\n",
       "\n",
       "function init_faces(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var facets = obj.userData.facets;\n",
       "    obj.userData.triangleindices = [];\n",
       "    for (var i=0; i<facets.length; i++) {\n",
       "        facet = facets[i];\n",
       "        for (var t=0; t<facet.length-2; t++) {\n",
       "            obj.userData.triangleindices.push(facet[0],facet[t+1],facet[t+2]);  \n",
       "        }\n",
       "    }\n",
       "    var bufarr = new Float32Array( obj.userData.triangleindices.length * 3 );\n",
       "    var bufattr = new THREE.Float32BufferAttribute(bufarr,3);\n",
       "    \n",
       "    var materials = obj.userData.facetmaterial;\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    geometry.setAttribute('position',bufattr);\n",
       "    if (Array.isArray(materials)) {\n",
       "        var tricount = 0;\n",
       "        var facet;\n",
       "        for (var i=0; i<facets.length; i++) {\n",
       "            facet = facets[i];\n",
       "            geometry.addGroup(tricount,(facet.length-2)*3,i);\n",
       "            tricount += (facet.length-2)*3;\n",
       "        }\n",
       "    }\n",
       "    var mesh = new THREE.Mesh(geometry, materials);\n",
       "    mesh.name = \"faces\";\n",
       "    obj.add(mesh); \n",
       "    updateFacesPosition(obj);\n",
       "}\n",
       "// //INITIALIZING\n",
       "\n",
       "\n",
       "function updateFacesPosition(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var indices = obj.userData.triangleindices;\n",
       "    var faces = obj.getObjectByName(\"faces\");\n",
       "    var ba = faces.geometry.getAttribute(\"position\");\n",
       "    for (var i=0; i<indices.length; i++) {\n",
       "        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); \n",
       "    }\n",
       "    faces.geometry.attributes.position.needsUpdate = true;\n",
       "    \n",
       "}\n",
       "\n",
       "function updateEdgesPosition(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var indices = obj.userData.edgeindices;\n",
       "    var lines = obj.getObjectByName(\"lines\");\n",
       "    var ba = lines.geometry.getAttribute(\"position\"); \n",
       "    for (var i=0; i<indices.length; i++) {\n",
       "        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); \n",
       "    }\n",
       "    lines.geometry.attributes.position.needsUpdate = true;\n",
       "}\n",
       "\n",
       "function onWindowResize() {\n",
       "    renderer.setSize( three.clientWidth, three.clientHeight );\n",
       "    svgRenderer.setSize( three.clientWidth, three.clientHeight );\n",
       "    updateCamera();\n",
       "}\n",
       "\n",
       "function updateCamera() {\n",
       "    var width = three.clientWidth;\n",
       "    var height = three.clientHeight;\n",
       "    var aspect = width / height;\n",
       "    if (camera.type == \"OrthographicCamera\") {\n",
       "        camera.left = frustumSize * aspect / - 2;\n",
       "        camera.right = frustumSize * aspect / 2;\n",
       "        camera.top = frustumSize / 2;\n",
       "        camera.bottom = - frustumSize / 2;\n",
       "    } else if (camera.type == \"PerspectiveCamera\") {\n",
       "        camera.aspect = aspect;\n",
       "    }\n",
       "    camera.updateProjectionMatrix();\n",
       "}\n",
       "\n",
       "function changeCamera(event) {\n",
       "    var selindex = event.currentTarget.selectedIndex;\n",
       "    camera = cameras[selindex];\n",
       "    control = controls[selindex];\n",
       "    control.enabled = true; \n",
       "    for (var i=0; i<controls.length; i++) {\n",
       "        if (i!=selindex) {\n",
       "            controls[i].enabled = false;\n",
       "        }\n",
       "    }\n",
       "    updateCamera();\n",
       "}\n",
       "\n",
       "var camtypenode = document.getElementById('cameraType_0');\n",
       "camtypenode.onchange = changeCamera;\n",
       "camtypenode.dispatchEvent(new Event('change'));\n",
       "\n",
       "onWindowResize();\n",
       "window.addEventListener('resize', onWindowResize);\t\n",
       "\n",
       "\n",
       "var xRotationEnabled = false;\n",
       "var yRotationEnabled = false;\n",
       "var zRotationEnabled = false;\n",
       "var rotationSpeedFactor = 1;\n",
       "var settingsShown = false;\n",
       "var labelsShown = true;\n",
       "var intervals = [];\n",
       "var timeouts = [];\n",
       "var explodingSpeed = 0.05;\n",
       "var explodeScale = 0;\n",
       "var XMLS = new XMLSerializer();\n",
       "var svgElement;\n",
       "var renderId;\n",
       "\n",
       "var render = function () {\n",
       "\n",
       "\trenderId = requestAnimationFrame(render);\n",
       "\n",
       "//\tcomment in for automatic explosion\n",
       "//\texplode(updateFactor());\n",
       "\n",
       "    var phi = 0.02 * rotationSpeedFactor;\n",
       "\n",
       "    if (xRotationEnabled) {\n",
       "        scene.rotation.x += phi;\n",
       "    }\n",
       "    if (yRotationEnabled) {\n",
       "        scene.rotation.y += phi;\n",
       "    }\n",
       "    if (zRotationEnabled) {\n",
       "        scene.rotation.z += phi;\n",
       "    }\n",
       "\n",
       "    control.update();\n",
       "    renderer.render(scene, camera);\n",
       "};\n",
       "\n",
       "if ( THREE.WEBGL.isWebGLAvailable() ) {\n",
       "\trender();\n",
       "} else {\n",
       "\tvar warning = WEBGL.getWebGLErrorMessage();\n",
       "\tthree.appendChild( warning );\n",
       "}\n",
       "    \n",
       "function changeTransparency() {\n",
       "    var opacity = 1-Number(event.currentTarget.value);\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        child = scene.children[i];\n",
       "        if ( child.userData.hasOwnProperty(\"facetmaterial\") ) {\n",
       "            if (Array.isArray(child.userData.facetmaterial)) {\n",
       "                for (var j=0; j<child.userData.facetmaterial.length; j++) {\n",
       "                    child.userData.facetmaterial[j].opacity = opacity;\n",
       "                }\n",
       "            } else {\n",
       "                child.userData.facetmaterial.opacity = opacity;\n",
       "            }    \n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function changeRotationX(event){\n",
       "    xRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "function changeRotationY(event){\n",
       "    yRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "function changeRotationZ(event){\n",
       "    zRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "\n",
       "function changeRotationSpeedFactor(event){\n",
       "    rotationSpeedFactor = Number(event.currentTarget.value);\n",
       "}\n",
       "\n",
       "function resetScene(){\n",
       "    scene.rotation.set(0,0,0);\n",
       "    camera.position.set(0,0,5);\n",
       "    camera.up.set(0,1,0);\n",
       "}\n",
       "\n",
       "function showSettings(event){\n",
       "    document.getElementById('settings_0').style.visibility = 'visible';\n",
       "    document.getElementById('showSettingsButton_0').style.visibility = 'hidden';\n",
       "    document.getElementById('hideSettingsButton_0').style.visibility = 'visible';\n",
       "    settingsShown = true;\n",
       "}\n",
       "\n",
       "function hideSettings(event){\n",
       "    document.getElementById('settings_0').style.visibility = 'hidden';\n",
       "    document.getElementById('showSettingsButton_0').style.visibility = 'visible';\n",
       "    document.getElementById('hideSettingsButton_0').style.visibility = 'hidden';\n",
       "    settingsShown = false;\n",
       "}\n",
       "\n",
       "\n",
       "\n",
       "var pos = 150* Math.PI;\n",
       "\n",
       "function updateFactor() {\n",
       "    pos++;\n",
       "    return Math.sin(.01*pos)+1;\n",
       "}\n",
       "\n",
       "// ------------------------ FOLDING ------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "// rotate point p around axis defined by points p1 and p2 by given angle\n",
       "function rotate(p, p1, p2, angle ){   \n",
       "    angle = -angle;\n",
       "    var x = p.x, y = p.y, z = p.z, \n",
       "    a = p1.x, b = p1.y, c = p1.z, \n",
       "    u = p2.x-p1.x, v = p2.y-p1.y, w = p2.z-p1.z;\n",
       "    var result = [];\n",
       "    var L = u*u + v*v + w*w;\n",
       "    var sqrt = Math.sqrt;\n",
       "    var cos = Math.cos;\n",
       "    var sin = Math.sin;\n",
       "\n",
       "    result[0] = ((a*(v*v+w*w)-u*(b*v+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*x*cos(angle)+sqrt(L)*(-c*v+b*w-w*y+v*z)*sin(angle))/L;\n",
       "    result[1] = ((b*(u*u+w*w)-v*(a*u+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*y*cos(angle)+sqrt(L)*(c*u-a*w+w*x-u*z)*sin(angle))/L;\n",
       "    result[2] = ((c*(u*u+v*v)-w*(a*u+b*v-u*x-v*y-w*z))*(1-cos(angle))+L*z*cos(angle)+sqrt(L)*(-b*u+a*v-v*x+u*y)*sin(angle))/L;\n",
       "\n",
       "    return result;\n",
       "}\n",
       "\n",
       "var fold = function(event){\n",
       "    var obj = foldables[Number(event.currentTarget.name)];\n",
       "    var foldvalue = Number(event.currentTarget.value);\n",
       "    var scale = foldvalue - obj.userData.oldscale;\n",
       "\n",
       "    for (var j=0; j<obj.userData.axes.length; j++) {\n",
       "        rotateVertices(obj, j, scale);\n",
       "    }\n",
       "    update(obj);\n",
       "    obj.userData.oldscale += scale;\n",
       "    lookAtBarycenter(obj);\n",
       "}\n",
       "\n",
       "function lookAtBarycenter(obj){\n",
       "    control.target = barycenter(obj);\n",
       "}\n",
       "\n",
       "function barycenter(obj) {\n",
       "    var center = new THREE.Vector3(0,0,0);\n",
       "    var points = obj.userData.points;\n",
       "    for (var i=0; i<points.length; i++){\n",
       "        center.add(points[i].vector);\n",
       "    }\n",
       "    center.divideScalar(points.length);\n",
       "    return center;\n",
       "}\n",
       "\n",
       "function rotateVertices(obj, edge, scale) {\n",
       "    var axes = obj.userData.axes;\n",
       "    var subtrees = obj.userData.subtrees;\n",
       "    var points = obj.userData.points;\n",
       "    var angles = obj.userData.angles;\n",
       "    if (edge < axes.length){\n",
       "        for (var j=0; j<subtrees[edge].length; j++){\n",
       "            var rotP = rotate(points[subtrees[edge][j]].vector, points[axes[edge][0]].vector,points[axes[edge][1]].vector, scale * (Math.PI - angles[edge]));\n",
       "            points[subtrees[edge][j]].set(rotP[0],rotP[1],rotP[2]);\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function update(obj) {\n",
       "   updateFacesPosition(obj);\n",
       "   updateEdgesPosition(obj);\n",
       "}\n",
       "\n",
       "if (foldables.length) {\n",
       "    var settings = document.getElementById('settings_0');\n",
       "    var foldDiv = document.createElement('div');\n",
       "    foldDiv.id = 'fold_0';\n",
       "    var title = document.createElement('strong');\n",
       "    title.innerHTML = 'Fold';\n",
       "    foldDiv.appendChild(title);\n",
       "    foldDiv.className = 'group';\n",
       "    for (var i=0; i<foldables.length; i++) {\n",
       "        var range = document.createElement('input');\n",
       "        range.type = 'range';\n",
       "        range.min = 0;\n",
       "        range.max = 1;\n",
       "        range.value = 0;\n",
       "        range.step = 0.001;\n",
       "        range.name = String(i);\n",
       "        range.oninput = fold;\n",
       "        foldDiv.appendChild(range);\n",
       "    }\n",
       "    lookAtBarycenter(foldables[0]);\n",
       "    settings.insertBefore(foldDiv,settings.childNodes[0]);\n",
       "}\n",
       "\n",
       "    \n",
       "// ---------------------- EXPLOSION ------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "if (explodableModel) {\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        obj = scene.children[i];\n",
       "        if ( obj.userData.explodable ) {\n",
       "            computeCentroid(obj);\n",
       "        }\n",
       "    }\n",
       "    document.getElementById('explodeRange_0').oninput = triggerExplode;\n",
       "    document.getElementById('explodeCheckbox_0').onchange = triggerAutomaticExplode;\n",
       "    document.getElementById('explodingSpeedRange_0').oninput = setExplodingSpeed;\n",
       "}\n",
       "\n",
       "function computeCentroid(obj) {\n",
       "    centroid = new THREE.Vector3();\n",
       "    obj.userData.points.forEach(function(pmpoint) {\n",
       "        centroid.add(pmpoint.vector);\t\t\t\n",
       "    });\n",
       "    centroid.divideScalar(obj.userData.points.length);\n",
       "    obj.userData.centroid = centroid;\n",
       "}\n",
       "\n",
       "function explode(factor) {\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        var obj = scene.children[i];\n",
       "        if (obj.userData.hasOwnProperty(\"centroid\")) { \n",
       "            var c = obj.userData.centroid;\n",
       "            obj.position.set(c.x*factor, c.y*factor, c.z*factor);\n",
       "        }\n",
       "    }\t\n",
       "}\n",
       "\n",
       "function triggerExplode(event){\n",
       "    explodeScale = Number(event.currentTarget.value);\n",
       "    explode(explodeScale);\n",
       "}\n",
       "\n",
       "function setExplodingSpeed(event){\n",
       "    explodingSpeed = Number(event.currentTarget.value);\n",
       "}\n",
       "\n",
       "function triggerAutomaticExplode(event){\n",
       "    if (event.currentTarget.checked){\n",
       "        startExploding();\n",
       "    } else {\n",
       "        clearIntervals();\n",
       "    }\t\n",
       "}\n",
       "\n",
       "function startExploding(){\n",
       "    intervals.push(setInterval(explodingInterval, 25));\n",
       "}\n",
       "\n",
       "\n",
       "function explodingInterval(){\n",
       "    explodeScale += explodingSpeed;\n",
       "    if (explodeScale <= 6){ \n",
       "        explode(explodeScale);\n",
       "    }\n",
       "    else{\n",
       "        explode(6);\n",
       "        explodeScale = 6;\n",
       "        clearIntervals();\n",
       "        timeouts.push(setTimeout(startUnexploding, 3000));\n",
       "    }\n",
       "    document.getElementById('explodeRange_0').value = explodeScale;\n",
       "}\n",
       "\n",
       "\n",
       "function startUnexploding(){\n",
       "    intervals.push(setInterval(unexplodingInterval, 25));\n",
       "}\n",
       "\n",
       "function unexplodingInterval(){\n",
       "    explodeScale -= explodingSpeed;\n",
       "    if (explodeScale >= 0){\t\n",
       "        explode(explodeScale);\n",
       "    }\n",
       "    else {\n",
       "        explode(0);\n",
       "        explodeScale = 0;\n",
       "        clearIntervals();\n",
       "        timeouts.push(setTimeout(startExploding, 3000));\n",
       "    }\n",
       "    document.getElementById('explodeRange_0').value = explodeScale;\n",
       "}\n",
       "\n",
       "function clearIntervals(){\n",
       "    intervals.forEach(function(interval){\n",
       "        clearInterval(interval);\n",
       "    });\n",
       "    intervals = [];\n",
       "    timeouts.forEach(function(timeout){\n",
       "        clearTimeout(timeout);\n",
       "    });\n",
       "    timeouts = [];\n",
       "}\n",
       "\n",
       "// ---------------------- DISPLAY --------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "const objectTypeInnerHTMLs = { points: \"Points\", pointlabels: \"Point labels\", lines: \"Edges\", edgelabels: \"Edge labels\", faces: \"Faces\", arrowheads: \"Arrow heads\" };\n",
       "const objectTypeVisible = {};\n",
       "Object.assign(objectTypeVisible,modelContains);\n",
       "const sortedObjectTypeKeys = Object.keys(objectTypeInnerHTMLs).sort();\n",
       "const shownObjectTypesList = document.getElementById('shownObjectTypesList_0');\n",
       "\n",
       "function setVisibility(bool,objname) {\n",
       "    for (var i=0; i<scene.children.length; i++){\n",
       "        var obj = scene.children[i].getObjectByName(objname);\n",
       "        if (obj) {\n",
       "            obj.visible = bool;\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function toggleObjectTypeVisibility(event){\n",
       "    var name = event.currentTarget.name;\n",
       "    var checked = event.currentTarget.checked;\n",
       "    objectTypeVisible[name] = checked;\n",
       "    setVisibility(checked,name);\n",
       "}\n",
       "\n",
       "for (var i=0; i<sortedObjectTypeKeys.length; i++){\n",
       "    var key = sortedObjectTypeKeys[i];\n",
       "    if (modelContains[key]) {\n",
       "        var objTypeNode = document.createElement('span');\n",
       "        objTypeNode.innerHTML = objectTypeInnerHTMLs[key] + '<br>';\n",
       "        var checkbox = document.createElement('input');\n",
       "        checkbox.type = 'checkbox';\n",
       "        checkbox.checked = true;\n",
       "        checkbox.name = key;\n",
       "        checkbox.onchange = toggleObjectTypeVisibility;\n",
       "        shownObjectTypesList.appendChild(checkbox);\n",
       "        shownObjectTypesList.appendChild(objTypeNode);\n",
       "    }\n",
       "}\n",
       "\n",
       "// ------------------------------------------------------\n",
       "\n",
       "function toggleObjectVisibility(event){\n",
       "    var nr = Number(event.currentTarget.name);\n",
       "    scene.children[nr].visible = event.currentTarget.checked;\n",
       "}\n",
       "\n",
       "// append checkboxes for displaying or hiding objects\n",
       "var shownObjectsList = document.getElementById('shownObjectsList_0');\n",
       "for (var i=0; i<scene.children.length; i++){\n",
       "    obj = scene.children[i];\n",
       "    var objNode = document.createElement('span');\n",
       "    objNode.innerHTML = obj.name + '<br>';\n",
       "    var checkbox = document.createElement('input');\n",
       "    checkbox.type = 'checkbox';\n",
       "    checkbox.checked = true;\n",
       "    checkbox.name = String(i);\n",
       "    checkbox.onchange = toggleObjectVisibility;\n",
       "    shownObjectsList.appendChild(checkbox);\n",
       "    shownObjectsList.appendChild(objNode);\n",
       "}\n",
       "\n",
       "// ---------------------- SVG ------------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "function takeSvgScreenshot() {\n",
       "    if (objectTypeVisible[\"pointlabels\"]) {\n",
       "        setVisibility(false,\"pointlabels\");\n",
       "    }\n",
       "    if (objectTypeVisible[\"edgelabels\"]) {\n",
       "        setVisibility(false,\"edgelabels\");\n",
       "    }\n",
       "    svgRenderer.render(scene,camera);\n",
       "    svgElement = XMLS.serializeToString(svgRenderer.domElement);\n",
       "    \n",
       "    if (objectTypeVisible[\"pointlabels\"]) {\n",
       "        setVisibility(true,\"pointlabels\");\n",
       "    }\n",
       "    if (objectTypeVisible[\"edgelabels\"]) {\n",
       "        setVisibility(true,\"edgelabels\");\n",
       "    }\n",
       "\n",
       "    if (document.getElementById('tab_0').checked){\n",
       "        //show in new tab\n",
       "        var myWindow = window.open(\"\",\"\");\n",
       "        myWindow.document.body.innerHTML = svgElement;\n",
       "    } else{\n",
       "        // download svg file \n",
       "        download(\"screenshot.svg\", svgElement);\n",
       "    }\n",
       "}\n",
       "\n",
       "function download(filename, text) {\n",
       "    var element = document.createElement('a');\n",
       "    element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));\n",
       "    element.setAttribute('download', filename);\n",
       "\n",
       "    element.style.display = 'none';\n",
       "    document.body.appendChild(element);\n",
       "\n",
       "    element.click();\n",
       "\n",
       "    document.body.removeChild(element);\n",
       "}\n",
       "\n",
       "\n",
       "document.getElementById('transparencyRange_0').oninput = changeTransparency;\n",
       "document.getElementById('changeRotationX_0').onchange = changeRotationX;\n",
       "document.getElementById('changeRotationY_0').onchange = changeRotationY;\n",
       "document.getElementById('changeRotationZ_0').onchange = changeRotationZ;\n",
       "document.getElementById('resetButton_0').onclick = resetScene;\n",
       "document.getElementById('rotationSpeedRange_0').oninput = changeRotationSpeedFactor;\n",
       "document.getElementById('takeScreenshot_0').onclick = takeSvgScreenshot;\n",
       "document.getElementById('showSettingsButton_0').onclick = showSettings;\n",
       "document.getElementById('hideSettingsButton_0').onclick = hideSettings;\n",
       "\n",
       "\n",
       "// ------------------ SHORTCUTS --------------------------------------------\n",
       "// -------------------------------------------------------------------------\n",
       "\n",
       "/**\n",
       " * http://www.openjs.com/scripts/events/keyboard_shortcuts/\n",
       " * Version : 2.01.B\n",
       " * By Binny V A\n",
       " * License : BSD\n",
       " */\n",
       "shortcut = {\n",
       "\t'all_shortcuts':{},//All the shortcuts are stored in this array\n",
       "\t'add': function(shortcut_combination,callback,opt) {\n",
       "\t\t//Provide a set of default options\n",
       "\t\tvar default_options = {\n",
       "\t\t\t'type':'keydown',\n",
       "\t\t\t'propagate':false,\n",
       "\t\t\t'disable_in_input':false,\n",
       "\t\t\t'target':document,\n",
       "\t\t\t'keycode':false\n",
       "\t\t}\n",
       "\t\tif(!opt) opt = default_options;\n",
       "\t\telse {\n",
       "\t\t\tfor(var dfo in default_options) {\n",
       "\t\t\t\tif(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo];\n",
       "\t\t\t}\n",
       "\t\t}\n",
       "\n",
       "\t\tvar ele = opt.target;\n",
       "\t\tif(typeof opt.target == 'string') ele = document.getElementById(opt.target);\n",
       "\t\tvar ths = this;\n",
       "\t\tshortcut_combination = shortcut_combination.toLowerCase();\n",
       "\n",
       "\t\t//The function to be called at keypress\n",
       "\t\tvar func = function(e) {\n",
       "\t\t\te = e || window.event;\n",
       "\t\t\t\n",
       "\t\t\tif(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields\n",
       "\t\t\t\tvar element;\n",
       "\t\t\t\tif(e.target) element=e.target;\n",
       "\t\t\t\telse if(e.srcElement) element=e.srcElement;\n",
       "\t\t\t\tif(element.nodeType==3) element=element.parentNode;\n",
       "\n",
       "\t\t\t\tif(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return;\n",
       "\t\t\t}\n",
       "\t\n",
       "\t\t\t//Find Which key is pressed\n",
       "\t\t\tif (e.keyCode) code = e.keyCode;\n",
       "\t\t\telse if (e.which) code = e.which;\n",
       "\t\t\tvar character = String.fromCharCode(code).toLowerCase();\n",
       "\t\t\t\n",
       "\t\t\tif(code == 188) character=\",\"; //If the user presses , when the type is onkeydown\n",
       "\t\t\tif(code == 190) character=\".\"; //If the user presses , when the type is onkeydown\n",
       "\n",
       "\t\t\tvar keys = shortcut_combination.split(\"+\");\n",
       "\t\t\t//Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked\n",
       "\t\t\tvar kp = 0;\n",
       "\t\t\t\n",
       "\t\t\t//Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken\n",
       "\t\t\tvar shift_nums = {\n",
       "\t\t\t\t\"`\":\"~\",\n",
       "\t\t\t\t\"1\":\"!\",\n",
       "\t\t\t\t\"2\":\"@\",\n",
       "\t\t\t\t\"3\":\"#\",\n",
       "\t\t\t\t\"4\":\"$\",\n",
       "\t\t\t\t\"5\":\"%\",\n",
       "\t\t\t\t\"6\":\"^\",\n",
       "\t\t\t\t\"7\":\"&\",\n",
       "\t\t\t\t\"8\":\"*\",\n",
       "\t\t\t\t\"9\":\"(\",\n",
       "\t\t\t\t\"0\":\")\",\n",
       "\t\t\t\t\"-\":\"_\",\n",
       "\t\t\t\t\"=\":\"+\",\n",
       "\t\t\t\t\";\":\":\",\n",
       "\t\t\t\t\"'\":\"\\\"\",\n",
       "\t\t\t\t\",\":\"<\",\n",
       "\t\t\t\t\".\":\">\",\n",
       "\t\t\t\t\"/\":\"?\",\n",
       "\t\t\t\t\"\\\\\":\"|\"\n",
       "\t\t\t}\n",
       "\t\t\t//Special Keys - and their codes\n",
       "\t\t\tvar special_keys = {\n",
       "\t\t\t\t'esc':27,\n",
       "\t\t\t\t'escape':27,\n",
       "\t\t\t\t'tab':9,\n",
       "\t\t\t\t'space':32,\n",
       "\t\t\t\t'return':13,\n",
       "\t\t\t\t'enter':13,\n",
       "\t\t\t\t'backspace':8,\n",
       "\t\n",
       "\t\t\t\t'scrolllock':145,\n",
       "\t\t\t\t'scroll_lock':145,\n",
       "\t\t\t\t'scroll':145,\n",
       "\t\t\t\t'capslock':20,\n",
       "\t\t\t\t'caps_lock':20,\n",
       "\t\t\t\t'caps':20,\n",
       "\t\t\t\t'numlock':144,\n",
       "\t\t\t\t'num_lock':144,\n",
       "\t\t\t\t'num':144,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'pause':19,\n",
       "\t\t\t\t'break':19,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'insert':45,\n",
       "\t\t\t\t'home':36,\n",
       "\t\t\t\t'delete':46,\n",
       "\t\t\t\t'end':35,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'pageup':33,\n",
       "\t\t\t\t'page_up':33,\n",
       "\t\t\t\t'pu':33,\n",
       "\t\n",
       "\t\t\t\t'pagedown':34,\n",
       "\t\t\t\t'page_down':34,\n",
       "\t\t\t\t'pd':34,\n",
       "\t\n",
       "\t\t\t\t'left':37,\n",
       "\t\t\t\t'up':38,\n",
       "\t\t\t\t'right':39,\n",
       "\t\t\t\t'down':40,\n",
       "\t\n",
       "\t\t\t\t'f1':112,\n",
       "\t\t\t\t'f2':113,\n",
       "\t\t\t\t'f3':114,\n",
       "\t\t\t\t'f4':115,\n",
       "\t\t\t\t'f5':116,\n",
       "\t\t\t\t'f6':117,\n",
       "\t\t\t\t'f7':118,\n",
       "\t\t\t\t'f8':119,\n",
       "\t\t\t\t'f9':120,\n",
       "\t\t\t\t'f10':121,\n",
       "\t\t\t\t'f11':122,\n",
       "\t\t\t\t'f12':123\n",
       "\t\t\t}\n",
       "\t\n",
       "\t\t\tvar modifiers = { \n",
       "\t\t\t\tshift: { wanted:false, pressed:false},\n",
       "\t\t\t\tctrl : { wanted:false, pressed:false},\n",
       "\t\t\t\talt  : { wanted:false, pressed:false},\n",
       "\t\t\t\tmeta : { wanted:false, pressed:false}\t//Meta is Mac specific\n",
       "\t\t\t};\n",
       "                        \n",
       "\t\t\tif(e.ctrlKey)\tmodifiers.ctrl.pressed = true;\n",
       "\t\t\tif(e.shiftKey)\tmodifiers.shift.pressed = true;\n",
       "\t\t\tif(e.altKey)\tmodifiers.alt.pressed = true;\n",
       "\t\t\tif(e.metaKey)   modifiers.meta.pressed = true;\n",
       "                        \n",
       "\t\t\tfor(var i=0; k=keys[i],i<keys.length; i++) {\n",
       "\t\t\t\t//Modifiers\n",
       "\t\t\t\tif(k == 'ctrl' || k == 'control') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.ctrl.wanted = true;\n",
       "\n",
       "\t\t\t\t} else if(k == 'shift') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.shift.wanted = true;\n",
       "\n",
       "\t\t\t\t} else if(k == 'alt') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.alt.wanted = true;\n",
       "\t\t\t\t} else if(k == 'meta') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.meta.wanted = true;\n",
       "\t\t\t\t} else if(k.length > 1) { //If it is a special key\n",
       "\t\t\t\t\tif(special_keys[k] == code) kp++;\n",
       "\t\t\t\t\t\n",
       "\t\t\t\t} else if(opt['keycode']) {\n",
       "\t\t\t\t\tif(opt['keycode'] == code) kp++;\n",
       "\n",
       "\t\t\t\t} else { //The special keys did not match\n",
       "\t\t\t\t\tif(character == k) kp++;\n",
       "\t\t\t\t\telse {\n",
       "\t\t\t\t\t\tif(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase\n",
       "\t\t\t\t\t\t\tcharacter = shift_nums[character]; \n",
       "\t\t\t\t\t\t\tif(character == k) kp++;\n",
       "\t\t\t\t\t\t}\n",
       "\t\t\t\t\t}\n",
       "\t\t\t\t}\n",
       "\t\t\t}\n",
       "\t\t\t\n",
       "\t\t\tif(kp == keys.length && \n",
       "\t\t\t\t\t\tmodifiers.ctrl.pressed == modifiers.ctrl.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.shift.pressed == modifiers.shift.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.alt.pressed == modifiers.alt.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.meta.pressed == modifiers.meta.wanted) {\n",
       "\t\t\t\tcallback(e);\n",
       "\t\n",
       "\t\t\t\tif(!opt['propagate']) { //Stop the event\n",
       "\t\t\t\t\t//e.cancelBubble is supported by IE - this will kill the bubbling process.\n",
       "\t\t\t\t\te.cancelBubble = true;\n",
       "\t\t\t\t\te.returnValue = false;\n",
       "\t\n",
       "\t\t\t\t\t//e.stopPropagation works in Firefox.\n",
       "\t\t\t\t\tif (e.stopPropagation) {\n",
       "\t\t\t\t\t\te.stopPropagation();\n",
       "\t\t\t\t\t\te.preventDefault();\n",
       "\t\t\t\t\t}\n",
       "\t\t\t\t\treturn false;\n",
       "\t\t\t\t}\n",
       "\t\t\t}\n",
       "\t\t}\n",
       "\t\tthis.all_shortcuts[shortcut_combination] = {\n",
       "\t\t\t'callback':func, \n",
       "\t\t\t'target':ele, \n",
       "\t\t\t'event': opt['type']\n",
       "\t\t};\n",
       "\t\t//Attach the function with the event\n",
       "\t\tif(ele.addEventListener) ele.addEventListener(opt['type'], func, false);\n",
       "\t\telse if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func);\n",
       "\t\telse ele['on'+opt['type']] = func;\n",
       "\t},\n",
       "\n",
       "\t//Remove the shortcut - just specify the shortcut and I will remove the binding\n",
       "\t'remove':function(shortcut_combination) {\n",
       "\t\tshortcut_combination = shortcut_combination.toLowerCase();\n",
       "\t\tvar binding = this.all_shortcuts[shortcut_combination];\n",
       "\t\tdelete(this.all_shortcuts[shortcut_combination])\n",
       "\t\tif(!binding) return;\n",
       "\t\tvar type = binding['event'];\n",
       "\t\tvar ele = binding['target'];\n",
       "\t\tvar callback = binding['callback'];\n",
       "\n",
       "\t\tif(ele.detachEvent) ele.detachEvent('on'+type, callback);\n",
       "\t\telse if(ele.removeEventListener) ele.removeEventListener(type, callback, false);\n",
       "\t\telse ele['on'+type] = false;\n",
       "\t}\n",
       "}\n",
       "\n",
       "shortcut.add(\"Alt+Left\",function() {\n",
       "\tvar event = new Event('click');\n",
       "\tif (settingsShown){\n",
       "\t\tdocument.getElementById('hideSettingsButton_0').dispatchEvent(event);\n",
       "\t} else {\n",
       "\t\tdocument.getElementById('showSettingsButton_0').dispatchEvent(event);\n",
       "\t}\n",
       "});\n",
       "\n",
       "\n",
       "// COMMON_CODE_BLOCK_END\n",
       "\n",
       "});});\n",
       "      </script>\n",
       "   </body>\n",
       "</html>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<details><summary><pre style=\"display:inline\"><small>Click here for additional output</small></pre></summary>\n",
       "<pre>\n",
       "polymake: used package threejs\n",
       "   Three.js is a lightweight cross-browser JavaScript library/API used to create and display animated 3D computer graphics on a Web browser.\n",
       "   See http://github.com/mrdoob for the source code.\n",
       "\n",
       "</pre>\n",
       "</details>\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "$f->VISUAL;"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "name: s\n",
       "type: HyperbolicSurface\n",
       "\n",
       "DCEL\n",
       "N_edges: 3\n",
       "N_halfedges: 6\n",
       "N_vertices: 3\n",
       "Halfedges list: (edgeIndex: twinIndex, nextIndex, prevIndex, headIndex)\n",
       "0: 1, 2, 4, 1, (0 ---> 1) \n",
       "1: 0, 5, 3, 0, (1 ---> 0) \n",
       "2: 3, 4, 0, 2, (1 ---> 2) \n",
       "3: 2, 1, 5, 1, (2 ---> 1) \n",
       "4: 5, 0, 2, 0, (2 ---> 0) \n",
       "5: 4, 3, 1, 2, (0 ---> 2) \n",
       "\n",
       "\n",
       "FLIP_WORDS\n",
       "{}\n",
       "{0}\n",
       "{1}\n",
       "{2}\n",
       "\n",
       "\n",
       "PENNER_COORDINATES\n",
       "1 1 1\n",
       "\n",
       "SECONDARY_FAN\n",
       "type: PolyhedralFan<Rational>\n"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "$s->properties;"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The `FLIP_WORDS` indicate how  to obtain the Delaunay triangulations.\n",
    "The k-th flip word is a list of integers (the indices of the edges) that describe which edge flips produce the k-th Delaunay triangulation. Note that the k-th Delaunay triangulation also corresponds to the k-th maximal cone of the `SECONDARY_FAN`."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### GKZ vectors & secondary polyhedra\n",
    "\n",
    "In order to compute `GKZ_VECTORS` or a `secondary_polyhedron` of a hyperbolic surface one needs to additionally specify a `SPECIAL_POINT` on the surface. This is done by choosing two rational numbers.\n",
    "\n",
    "Continuing with the above example, lets look at the following."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "$s = new HyperbolicSurface(DCEL=>$S3,PENNER_COORDINATES=>[1,1,1],SPECIAL_POINT=>[1,0]);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we may compute an approximation of the `GKZ_VECTORS` of the surface. \n",
    "The approximation depends on a parameter *depth* that restricts the depth of the (covering) triangles that are summed over in the definition of the GKZ vectors."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1 33346854621/25672050625 33346854621/25672050625 19782163/27238250\n",
       "1 2361/3250 3955357/5447650 33346854621/25672050625\n",
       "1 10549213550005124385885122/6365327663846199230365625 11433978/13287625 30327974429709/105771923977850\n",
       "1 11433978/13287625 10549213550005124385885122/6365327663846199230365625 30327974429709/105771923977850\n"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print $s->GKZ_VECTORS(3);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The secondary polyhedron can be computed similarly using the function `secondary_polyhedron`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "name: p\n",
       "type: Polytope<Float>\n",
       "\n",
       "CONE_AMBIENT_DIM\n",
       "4\n",
       "\n",
       "VERTICES\n",
       "1 1.315301353 1.315301353 0.7316378744\n",
       "1 0.7316489581 0.7316267908 1.315301353\n",
       "1 1.752046187 0.8750928112 0.2910011302\n",
       "1 0.8750928112 1.752046187 0.2910011302\n",
       "0 -1 0 0\n",
       "0 0 -1 0\n",
       "0 0 0 -1\n",
       "\n",
       "\n",
       "VERTICES_IN_FACETS\n",
       "{0 1 3 4}\n",
       "{0 1 2 5}\n",
       "{0 2 3 6}\n",
       "{1 4 5}\n",
       "{2 5 6}\n",
       "{3 4 6}\n",
       "\n"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "$p = secondary_polyhedron($s,10);\n",
    "$p->properties;"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<!--\n",
       "polymake for knusper\n",
       "Thu Aug 27 11:35:24 2020\n",
       "p_bounded\n",
       "-->\n",
       "\n",
       "\n",
       "<html>\n",
       "   <head>\n",
       "      <meta charset=utf-8>\n",
       "      <title>p_bounded</title>\n",
       "      <style>\n",
       "/*\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "*/\n",
       "         html {overflow: scroll;}\n",
       "         strong{font-size: 18px;}\n",
       "         canvas { z-index: 8; }\n",
       "         input[type='radio'] {margin-left:0;}\n",
       "         input[type='checkbox'] {margin-right:7px; margin-left: 0px; padding-left:0px;}\n",
       "         .group{padding-bottom: 15px;}\n",
       "         .settings * {z-index: 11; }\n",
       "         .settings{z-index: 10; font-family: Arial, Helvetica, sans-serif; margin-left: 30px; visibility: hidden; width: 14em; height: 96%; border: solid 1px silver; padding: 2px; overflow-y: scroll; box-sizing: border-box; background-color: white; position: absolute;}\n",
       "         .indented{margin-left: 20px; margin-top: 10px; padding-bottom: 0px;} \n",
       "         .shownObjectsList{overflow: auto; max-width: 150px; max-height: 150px;}\n",
       "         .showSettingsButton{visibility: visible; z-index: 12; position: absolute }\n",
       "         .hideSettingsButton{visibility: hidden; z-index: 12; position: absolute; opacity: 0.5}\n",
       "         button{margin-left: 0; margin-top: 10px}\n",
       "         img{cursor: pointer;}\n",
       "         .suboption{padding-top: 15px;}\n",
       "         #model55035021770 { width: 100%; height: 100%; }\n",
       "         .threejs_container { width: 100%; height: 75vh;}\n",
       "         .settings{max-height: 74vh} \n",
       "         input[type=range] {\n",
       "           -webkit-appearance: none;\n",
       "           padding:0; \n",
       "           width:90%; \n",
       "           margin-left: auto;\n",
       "           margin-right: auto;\n",
       "           margin-top: 15px;\n",
       "           margin-bottom: 15px;\n",
       "           display: block;\t\n",
       "         }\n",
       "         input[type=range]:focus {\n",
       "           outline: none;\n",
       "         }\n",
       "         input[type=range]::-webkit-slider-runnable-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "           background: #E3E3E3;\n",
       "           border-radius: 0px;\n",
       "           border: 0px solid #000000;\n",
       "         }\n",
       "         input[type=range]::-webkit-slider-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "           -webkit-appearance: none;\n",
       "           margin-top: -5px;\n",
       "         }\n",
       "         input[type=range]:focus::-webkit-slider-runnable-track {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "         input[type=range]::-moz-range-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "           background: #E3E3E3;\n",
       "           border-radius: 0px;\n",
       "           border: 0px solid #000000;\n",
       "         }\n",
       "         input[type=range]::-moz-range-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "         }\n",
       "         input[type=range]::-ms-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           background: transparent;\n",
       "           border-color: transparent;\n",
       "           color: transparent;\n",
       "         }\n",
       "         input[type=range]::-ms-fill-lower {\n",
       "           background: #E3E3E3;\n",
       "           border: 0px solid #000000;\n",
       "           border-radius: 0px;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "         }\n",
       "         input[type=range]::-ms-fill-upper {\n",
       "           background: #E3E3E3;\n",
       "           border: 0px solid #000000;\n",
       "           border-radius: 0px;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "         }\n",
       "         input[type=range]::-ms-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "         }\n",
       "         input[type=range]:focus::-ms-fill-lower {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "         input[type=range]:focus::-ms-fill-upper {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "/*\n",
       "// COMMON_CODE_BLOCK_END\n",
       "*/\n",
       "\t\t</style>\n",
       "   </head>\n",
       "<body>\n",
       "   <div class='threejs_container'>\n",
       "\t\t<div id='settings_1' class='settings'>\n",
       "\t\t\t<div class=group id='transparency_1' class='transparency'>\n",
       "\t\t\t\t<strong>Transparency</strong>\n",
       "\t\t\t\t<input id='transparencyRange_1' type='range' min=0 max=1 step=0.01 value=0>\n",
       "\t\t\t</div>\n",
       "\t\t\t\n",
       "\t\t\t<div class=group id='rotation_1'>\n",
       "\t\t\t\t<strong>Rotation</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationX_1'> x-axis</div>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationY_1'> y-axis</div>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationZ_1'> z-axis</div>\n",
       "\t\t\t\t\t<button id='resetButton_1'>Reset</button>\n",
       "\t\t\t\t</div>\n",
       "\n",
       "\t\t\t\t<div class=suboption>Rotation speed</div>\n",
       "\t\t\t\t<input id='rotationSpeedRange_1' type='range' min=0 max=5 step=0.01 value=2>\n",
       "\t\t\t</div>\n",
       "\n",
       "\n",
       "\t\t\t<div class=group id='display_1'>\n",
       "\t\t\t\t<strong>Display</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<div id='shownObjectTypesList_1' class='shownObjectsList'></div>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t\t<div class=suboption>Objects</div>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t   <div id='shownObjectsList_1' class='shownObjectsList'></div>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t</div>\n",
       "         \n",
       "         <div class=group id='camera_1'>\n",
       "            <strong>Camera</strong>\n",
       "            <div class=indented>\n",
       "               <form>\n",
       "                  <select id=\"cameraType_1\">\n",
       "                     <option value='perspective' selected> Perspective<br></option>\n",
       "                     <option value='orthographic' > Orthographic<br></option>\n",
       "                  </select>\n",
       "               </form>\n",
       "            </div>\n",
       "         </div>\n",
       "\n",
       "\t\t\t<div class=group id='svg_1'>\n",
       "\t\t\t\t<strong>SVG</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<form>\n",
       "\t\t\t\t\t\t<input type=\"radio\" name='screenshotMode' value='download' id='download_1' checked> Download<br>\n",
       "\t\t\t\t\t\t<input type=\"radio\" name='screenshotMode' value='tab' id='tab_1' > New tab<br>\n",
       "\t\t\t\t\t</form>\n",
       "\t\t\t\t\t<button id='takeScreenshot_1'>Screenshot</button>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t</div>\n",
       "\n",
       "\t\t</div>\t<!-- end of settings -->\n",
       "\t\t<img id='hideSettingsButton_1' class='hideSettingsButton' src='/kernelspecs/polymake/close.svg' width=20px\">\n",
       "\t\t<img id='showSettingsButton_1' class='showSettingsButton' src='/kernelspecs/polymake/menu.svg' width=20px\">\n",
       "<div id=\"model55035021770\"></div>\n",
       "</div>\n",
       "   <script>\n",
       "    requirejs.config({\n",
       "      paths: {\n",
       "        three: '/kernelspecs/polymake/three',\n",
       "        TrackballControls: '/kernelspecs/polymake/TrackballControls',\n",
       "        OrbitControls: '/kernelspecs/polymake/OrbitControls',\n",
       "        Projector: '/kernelspecs/polymake/Projector',\n",
       "        SVGRenderer: '/kernelspecs/polymake/SVGRenderer',\n",
       "        WEBGL: '/kernelspecs/polymake/WebGL',\n",
       "      },\n",
       "      shim: {\n",
       "        'three': { exports: 'THREE'},\n",
       "        'SVGRenderer': { deps: [ 'three' ], exports: 'THREE.SVGRenderer' },\n",
       "        'WEBGL': { deps: [ 'three' ], exports: 'THREE.WEBGL' },\n",
       "        'Projector': { deps: [ 'three' ], exports: 'THREE.Projector' },\n",
       "        'TrackballControls': { deps: [ 'three' ], exports: 'THREE.TrackballControls' },\n",
       "        'OrbitControls': { deps: [ 'three' ], exports: 'THREE.OrbitControls' },\n",
       "      }\n",
       "    });\n",
       "    \n",
       "    require(['three'],function(THREE){\n",
       "        window.THREE = THREE;\n",
       "      require(['TrackballControls', 'OrbitControls', 'Projector', 'SVGRenderer', 'WEBGL'],\n",
       "               function(TrackballControls, OrbitControls, Projector, SVGRenderer, WEBGL) {\n",
       "    THREE.TrackballControls = TrackballControls;\n",
       "    THREE.OrbitControls = OrbitControls;\n",
       "    THREE.Projector = Projector;\n",
       "    THREE.SVGRenderer = SVGRenderer;\n",
       "    THREE.WEBGL = WEBGL;\n",
       "\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "\n",
       "const intervalLength = 25; // for automatic animations\n",
       "const explodableModel = false; \n",
       "const modelContains = { points: false, pointlabels: false, lines: false, edgelabels: false, faces: false, arrowheads: false };\n",
       "const foldables = [];\n",
       "\n",
       "var three = document.getElementById(\"model55035021770\");\n",
       "var scene = new THREE.Scene();\n",
       "var renderer = new THREE.WebGLRenderer( { antialias: true } );\n",
       "var svgRenderer = new THREE.SVGRenderer( { antialias: true } );\n",
       "renderer.setPixelRatio( window.devicePixelRatio );\n",
       "renderer.setClearColor(0xFFFFFF, 1);\n",
       "svgRenderer.setClearColor(0xFFFFFF, 1);\n",
       "three.appendChild(renderer.domElement);\n",
       "\n",
       "var frustumSize = 4;\n",
       "var cameras = [new THREE.PerspectiveCamera(75, 1, 0.1, 1000), new THREE.OrthographicCamera()];\n",
       "cameras.forEach(function(cam) {\n",
       "    cam.position.set(0, 0, 5);\n",
       "    cam.lookAt(0, 0, 0);  \n",
       "    cam.up.set(0, 1, 0);         \n",
       "});\n",
       "var controls = [new THREE.TrackballControls(cameras[0], three), new THREE.OrbitControls(cameras[1], three)];\n",
       "var camera, control;\n",
       "\n",
       "controls[0].zoomSpeed = 0.2;\n",
       "controls[0].rotateSpeed = 4;\n",
       "\n",
       "\n",
       "// class to allow move points together with labels and spheres\n",
       "var PMPoint = function (x,y,z) {\n",
       "   this.vector = new THREE.Vector3(x,y,z);\n",
       "   this.sprite = null;\n",
       "   this.sphere = null;\n",
       "}\n",
       "PMPoint.prototype.addLabel = function(labelsprite) {\n",
       "   this.sprite = labelsprite;\n",
       "   this.sprite.position.copy(this.vector);\n",
       "}\n",
       "PMPoint.prototype.addSphere = function(spheremesh) {\n",
       "   this.sphere = spheremesh;\n",
       "   this.sphere.position.copy(this.vector);\n",
       "}\n",
       "PMPoint.prototype.set = function(x,y,z) {\n",
       "   this.vector.set(x,y,z);\n",
       "   if (this.sprite) {\n",
       "      this.sprite.position.copy(this.vector);\n",
       "   }\n",
       "   if (this.sphere) {\n",
       "      this.sphere.position.copy(this.vector);\n",
       "   }\n",
       "}\n",
       "PMPoint.prototype.radius = function() {\n",
       "   if (this.sphere) {\n",
       "      return this.sphere.geometry.parameters.radius;\n",
       "   } else {\n",
       "      return 0;\n",
       "   }\n",
       "};\n",
       "// select the target node\n",
       "var target = document.querySelector('#model55035021770');\n",
       "\n",
       "// create an observer instance\n",
       "var observer = new MutationObserver(function(mutations) {\n",
       "   mutations.forEach(function(mutation) {\n",
       "      if (mutation.removedNodes && mutation.removedNodes.length > 0) {\n",
       "         cancelAnimationFrame(renderId);\n",
       "         observer.disconnect();\n",
       "         console.log(\"cancelled frame \"+renderId);\n",
       "      }\n",
       "   });\n",
       "});\n",
       "\n",
       "// configuration of the observer:\n",
       "var config = { childList: true, characterData: true }\n",
       "\n",
       "// pass in the target node, as well as the observer options\n",
       "while (target) {\n",
       "   if (target.className==\"output\") {\n",
       "      observer.observe(target, config);\n",
       "      break;\n",
       "   }\n",
       "   target = target.parentNode;\n",
       "}\n",
       "\n",
       "// COMMON_CODE_BLOCK_END\n",
       "\n",
       "var obj0 = new THREE.Object3D();\n",
       "obj0.name = \"p_bounded\";\n",
       "obj0.userData.explodable = 1;\n",
       "obj0.userData.points = [];\n",
       "obj0.userData.points.push(new PMPoint(1.75205, 0.876119, 0.291727));\n",
       "obj0.userData.points.push(new PMPoint(1.75205, -0.492876, 0.290856));\n",
       "obj0.userData.points.push(new PMPoint(0.731446, -0.492876, 1.3153));\n",
       "obj0.userData.points.push(new PMPoint(-0.492828, 1.75205, -0.938159));\n",
       "obj0.userData.points.push(new PMPoint(-0.492828, -0.492876, 1.3153));\n",
       "obj0.userData.points.push(new PMPoint(-0.492828, -0.492876, -0.938159));\n",
       "obj0.userData.points.push(new PMPoint(1.75205, -0.492876, -0.938159));\n",
       "obj0.userData.points.push(new PMPoint(1.75205, 0.875004, -0.938159));\n",
       "obj0.userData.points.push(new PMPoint(0.875004, 1.75205, -0.938159));\n",
       "obj0.userData.points.push(new PMPoint(-0.492828, 0.731423, 1.3153));\n",
       "obj0.userData.points.push(new PMPoint(-0.492828, 1.75205, 0.290856));\n",
       "obj0.userData.points.push(new PMPoint(0.876119, 1.75205, 0.291731));\n",
       "obj0.userData.points.push(new PMPoint(0.732223, 0.732203, 1.3153));\n",
       "obj0.userData.points.push(new PMPoint(1.31428, 1.31428, 0.731417));\n",
       "\n",
       "obj0.userData.pointradii = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.02];\n",
       "   <!-- Vertex style -->\n",
       "obj0.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj0.userData.pointlabels = [\" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \"];\n",
       "obj0.userData.edgeindices = [0, 1, 1, 2, 2, 4, 3, 5, 4, 5, 1, 6, 5, 6, 0, 7, 6, 7, 3, 8, 7, 8, 4, 9, 3, 10, 9, 10, 8, 11, 10, 11, 2, 12, 9, 12, 0, 13, 11, 13, 12, 13];\n",
       "   <!-- Edge style -->\n",
       "obj0.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj0.userData.facets = [[12, 13, 11, 10, 9], [0, 13, 12, 2, 1], [11, 13, 0, 7, 8], [12, 9, 4, 2], [7, 0, 1, 6], [10, 11, 8, 3], [9, 10, 3, 5, 4], [4, 5, 6, 1, 2], [8, 7, 6, 5, 3]];\n",
       "   <!-- Facet style -->\n",
       "obj0.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj0);\n",
       "scene.add(obj0);\n",
       "\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "function textSpriteMaterial(message, parameters) {\n",
       "    if ( parameters === undefined ) parameters = {};\n",
       "    var fontface = \"Helvetica\";\n",
       "    var fontsize = parameters.hasOwnProperty(\"fontsize\") ? parameters[\"fontsize\"] : 15;\n",
       "    fontsize = fontsize*10;\n",
       "    var lines = message.split('\\\\n');\n",
       "    var size = 512;\n",
       "    for(var i = 0; i<lines.length; i++){\n",
       "        var tmp = lines[i].length;\n",
       "        while(tmp*fontsize > size){\n",
       "           fontsize--;\n",
       "        }\n",
       "    }\n",
       "    \n",
       "    var canvas = document.createElement('canvas');\n",
       "    canvas.width = size;\n",
       "    canvas.height = size;\n",
       "    var context = canvas.getContext('2d');\n",
       "    context.fillStyle = \"rgba(255, 255, 255, 0)\";\n",
       "    context.fill();\n",
       "    context.font = fontsize + \"px \" + fontface;\n",
       "    \n",
       "    // text color\n",
       "    context.fillStyle = \"rgba(0, 0, 0, 1.0)\";\n",
       "     for(var i = 0; i<lines.length; i++){\n",
       "        context.fillText(lines[i], size/2, size/2+i*fontsize);\n",
       "     }\n",
       "    \n",
       "    // canvas contents will be used for a texture\n",
       "    var texture = new THREE.Texture(canvas);\n",
       "    texture.needsUpdate = true;\n",
       "    \n",
       "    var spriteMaterial = new THREE.SpriteMaterial({map: texture, depthTest: true, depthWrite: false, polygonOffset: true, polygonOffsetFactor: -1, polygonOffsetUnits: 1 });\n",
       "    return spriteMaterial;\n",
       "}\n",
       "\n",
       "\n",
       "// ---------------------- INITIALIZING OBJECTS--------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "function init_object(obj) {\n",
       "    if (obj.userData.hasOwnProperty(\"pointmaterial\")) {\n",
       "        init_points(obj);\n",
       "        modelContains.points = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"pointlabels\")) {\n",
       "        init_pointlabels(obj);\n",
       "        modelContains.pointlabels = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"edgematerial\")) {\n",
       "        init_lines(obj);\n",
       "        modelContains.lines = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"edgelabels\")) {\n",
       "        init_edgelabels(obj);\n",
       "        modelContains.edgelabels = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"arrowstyle\")) {\n",
       "        init_arrowheads(obj);\n",
       "        modelContains.arrowheads = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"facetmaterial\")) {\n",
       "        init_faces(obj);\n",
       "        modelContains.faces = true;\n",
       "    }\n",
       "}\n",
       "\n",
       "function init_points(obj) {\n",
       "    var pointgroup = new THREE.Group();\n",
       "    pointgroup.name = \"points\";\n",
       "    var points = obj.userData.points;\n",
       "    var radii = obj.userData.pointradii;\n",
       "    var materials = obj.userData.pointmaterial;\n",
       "    var geometry,material;\n",
       "    if (!Array.isArray(radii)) {\n",
       "        geometry = new THREE.SphereBufferGeometry(radii);  \n",
       "    }\n",
       "    if (!Array.isArray(materials)) {\n",
       "        material = materials;\n",
       "    }\n",
       "    for (var i=0; i<points.length; i++) {\n",
       "        var point = points[i];\n",
       "        if (Array.isArray(radii)) {\n",
       "            if (radii[i] == 0) {\n",
       "                continue;\n",
       "            }\n",
       "            geometry = new THREE.SphereBufferGeometry(radii[i]);  \n",
       "        } \n",
       "        if (Array.isArray(materials)) {\n",
       "            material = materials[i];     \n",
       "        } \n",
       "        var sphere = new THREE.Mesh(geometry, material);\n",
       "        point.addSphere(sphere);\n",
       "        pointgroup.add(sphere);\n",
       "    }\n",
       "    obj.add(pointgroup);\n",
       "}\n",
       "\n",
       "function init_pointlabels(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var labels = obj.userData.pointlabels;\n",
       "    var pointlabels = new THREE.Group();\n",
       "    pointlabels.name = \"pointlabels\";\n",
       "    if (Array.isArray(labels)) {\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "            var spriteMaterial = textSpriteMaterial( labels[i] );\n",
       "\t        var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            point.addLabel(sprite);\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    } else {\n",
       "        var spriteMaterial = textSpriteMaterial( labels );\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "\t        var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            point.addLabel(sprite);\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    }\n",
       "    obj.add(pointlabels);\n",
       "}\n",
       "\n",
       "function init_lines(obj) {\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var points = obj.userData.points;\n",
       "    var materials = obj.userData.edgematerial;\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    var bufarr = new Float32Array( obj.userData.edgeindices.length * 3 );\n",
       "    var bufattr = new THREE.Float32BufferAttribute( bufarr, 3 );\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    geometry.setAttribute('position', bufattr);\n",
       "    if (Array.isArray(materials)) {     \n",
       "        for (var i=0; i<materials.length; i++) {\n",
       "            geometry.addGroup(2*i,2,i);\n",
       "        }\n",
       "    }\n",
       "    var lines = new THREE.LineSegments(geometry, materials);\n",
       "    lines.name = \"lines\";\n",
       "    obj.add(lines);\n",
       "    updateEdgesPosition(obj);\n",
       "}\n",
       "\n",
       "function init_edgelabels(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var labels = obj.userData.edgelabels;\n",
       "    var edgelabels = new THREE.Group();\n",
       "    edgelabels.name = \"edgelabels\";\n",
       "    if (Array.isArray(labels)) {\n",
       "        for (var i=0; i<edgeindices.length; i=i+2) {\n",
       "            var point = points[i];\n",
       "            var spriteMaterial = textSpriteMaterial( labels[i] );\n",
       "            var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[i]].vector,points[edgeindices[i+1]].vector).multiplyScalar(0.5));\n",
       "            edgelabels.add(sprite);\n",
       "        }\n",
       "    } else {\n",
       "        var spriteMaterial = textSpriteMaterial( labels );\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "            var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[i]].vector,points[edgeindices[i+1]].vector).multiplyScalar(0.5));\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    }\n",
       "    obj.add(edgelabels);\n",
       "}\n",
       "\n",
       "function init_arrowheads(obj) {\n",
       "    var arrowheads = new THREE.Group();\n",
       "    arrowheads.name = \"arrowheads\";\n",
       "    var arrowstyle = obj.userData.arrowstyle;\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var edgematerials = obj.userData.edgematerial;\n",
       "    var points = obj.userData.points;\n",
       "    var material;\n",
       "    if (!Array.isArray(edgematerials)) {\n",
       "        material = new THREE.MeshBasicMaterial( {color: edgematerials.color} );\n",
       "    }\n",
       "\n",
       "    for (var i=0; i<edgeindices.length; i=i+2) {\n",
       "        var start = points[edgeindices[i]];\n",
       "        var end = points[edgeindices[i+1]];\n",
       "        var dist = start.vector.distanceTo( end.vector ) - start.radius() - end.radius();\n",
       "        if (dist <= 0) {\n",
       "            continue;\n",
       "        }\n",
       "        var dir = new THREE.Vector3().subVectors(end.vector,start.vector);\n",
       "        dir.normalize();\n",
       "        var axis = new THREE.Vector3().set(dir.z,0,-dir.x);\n",
       "        axis.normalize();\n",
       "        var radians = Math.acos( dir.y );\n",
       "        var radius = dist/25;\n",
       "        var height = dist/5;\n",
       "        var geometry = new THREE.ConeBufferGeometry(radius,height);\n",
       "        var position = new THREE.Vector3().addVectors(start.vector,dir.clone().multiplyScalar(start.radius()+dist-height/2));\n",
       "        if (Array.isArray(edgematerials)) {\n",
       "            material = new THREE.MeshBasicMaterial( {color: edgematerials[i].color} );\n",
       "        }\n",
       "        var cone = new THREE.Mesh( geometry, material );\n",
       "        cone.quaternion.setFromAxisAngle(axis,radians);;\n",
       "        cone.position.copy(position);;\n",
       "        arrowheads.add(cone);\n",
       "    }\n",
       "    obj.add(arrowheads);\n",
       "}\n",
       "\n",
       "function init_faces(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var facets = obj.userData.facets;\n",
       "    obj.userData.triangleindices = [];\n",
       "    for (var i=0; i<facets.length; i++) {\n",
       "        facet = facets[i];\n",
       "        for (var t=0; t<facet.length-2; t++) {\n",
       "            obj.userData.triangleindices.push(facet[0],facet[t+1],facet[t+2]);  \n",
       "        }\n",
       "    }\n",
       "    var bufarr = new Float32Array( obj.userData.triangleindices.length * 3 );\n",
       "    var bufattr = new THREE.Float32BufferAttribute(bufarr,3);\n",
       "    \n",
       "    var materials = obj.userData.facetmaterial;\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    geometry.setAttribute('position',bufattr);\n",
       "    if (Array.isArray(materials)) {\n",
       "        var tricount = 0;\n",
       "        var facet;\n",
       "        for (var i=0; i<facets.length; i++) {\n",
       "            facet = facets[i];\n",
       "            geometry.addGroup(tricount,(facet.length-2)*3,i);\n",
       "            tricount += (facet.length-2)*3;\n",
       "        }\n",
       "    }\n",
       "    var mesh = new THREE.Mesh(geometry, materials);\n",
       "    mesh.name = \"faces\";\n",
       "    obj.add(mesh); \n",
       "    updateFacesPosition(obj);\n",
       "}\n",
       "// //INITIALIZING\n",
       "\n",
       "\n",
       "function updateFacesPosition(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var indices = obj.userData.triangleindices;\n",
       "    var faces = obj.getObjectByName(\"faces\");\n",
       "    var ba = faces.geometry.getAttribute(\"position\");\n",
       "    for (var i=0; i<indices.length; i++) {\n",
       "        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); \n",
       "    }\n",
       "    faces.geometry.attributes.position.needsUpdate = true;\n",
       "    \n",
       "}\n",
       "\n",
       "function updateEdgesPosition(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var indices = obj.userData.edgeindices;\n",
       "    var lines = obj.getObjectByName(\"lines\");\n",
       "    var ba = lines.geometry.getAttribute(\"position\"); \n",
       "    for (var i=0; i<indices.length; i++) {\n",
       "        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); \n",
       "    }\n",
       "    lines.geometry.attributes.position.needsUpdate = true;\n",
       "}\n",
       "\n",
       "function onWindowResize() {\n",
       "    renderer.setSize( three.clientWidth, three.clientHeight );\n",
       "    svgRenderer.setSize( three.clientWidth, three.clientHeight );\n",
       "    updateCamera();\n",
       "}\n",
       "\n",
       "function updateCamera() {\n",
       "    var width = three.clientWidth;\n",
       "    var height = three.clientHeight;\n",
       "    var aspect = width / height;\n",
       "    if (camera.type == \"OrthographicCamera\") {\n",
       "        camera.left = frustumSize * aspect / - 2;\n",
       "        camera.right = frustumSize * aspect / 2;\n",
       "        camera.top = frustumSize / 2;\n",
       "        camera.bottom = - frustumSize / 2;\n",
       "    } else if (camera.type == \"PerspectiveCamera\") {\n",
       "        camera.aspect = aspect;\n",
       "    }\n",
       "    camera.updateProjectionMatrix();\n",
       "}\n",
       "\n",
       "function changeCamera(event) {\n",
       "    var selindex = event.currentTarget.selectedIndex;\n",
       "    camera = cameras[selindex];\n",
       "    control = controls[selindex];\n",
       "    control.enabled = true; \n",
       "    for (var i=0; i<controls.length; i++) {\n",
       "        if (i!=selindex) {\n",
       "            controls[i].enabled = false;\n",
       "        }\n",
       "    }\n",
       "    updateCamera();\n",
       "}\n",
       "\n",
       "var camtypenode = document.getElementById('cameraType_1');\n",
       "camtypenode.onchange = changeCamera;\n",
       "camtypenode.dispatchEvent(new Event('change'));\n",
       "\n",
       "onWindowResize();\n",
       "window.addEventListener('resize', onWindowResize);\t\n",
       "\n",
       "\n",
       "var xRotationEnabled = false;\n",
       "var yRotationEnabled = false;\n",
       "var zRotationEnabled = false;\n",
       "var rotationSpeedFactor = 1;\n",
       "var settingsShown = false;\n",
       "var labelsShown = true;\n",
       "var intervals = [];\n",
       "var timeouts = [];\n",
       "var explodingSpeed = 0.05;\n",
       "var explodeScale = 0;\n",
       "var XMLS = new XMLSerializer();\n",
       "var svgElement;\n",
       "var renderId;\n",
       "\n",
       "var render = function () {\n",
       "\n",
       "\trenderId = requestAnimationFrame(render);\n",
       "\n",
       "//\tcomment in for automatic explosion\n",
       "//\texplode(updateFactor());\n",
       "\n",
       "    var phi = 0.02 * rotationSpeedFactor;\n",
       "\n",
       "    if (xRotationEnabled) {\n",
       "        scene.rotation.x += phi;\n",
       "    }\n",
       "    if (yRotationEnabled) {\n",
       "        scene.rotation.y += phi;\n",
       "    }\n",
       "    if (zRotationEnabled) {\n",
       "        scene.rotation.z += phi;\n",
       "    }\n",
       "\n",
       "    control.update();\n",
       "    renderer.render(scene, camera);\n",
       "};\n",
       "\n",
       "if ( THREE.WEBGL.isWebGLAvailable() ) {\n",
       "\trender();\n",
       "} else {\n",
       "\tvar warning = WEBGL.getWebGLErrorMessage();\n",
       "\tthree.appendChild( warning );\n",
       "}\n",
       "    \n",
       "function changeTransparency() {\n",
       "    var opacity = 1-Number(event.currentTarget.value);\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        child = scene.children[i];\n",
       "        if ( child.userData.hasOwnProperty(\"facetmaterial\") ) {\n",
       "            if (Array.isArray(child.userData.facetmaterial)) {\n",
       "                for (var j=0; j<child.userData.facetmaterial.length; j++) {\n",
       "                    child.userData.facetmaterial[j].opacity = opacity;\n",
       "                }\n",
       "            } else {\n",
       "                child.userData.facetmaterial.opacity = opacity;\n",
       "            }    \n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function changeRotationX(event){\n",
       "    xRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "function changeRotationY(event){\n",
       "    yRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "function changeRotationZ(event){\n",
       "    zRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "\n",
       "function changeRotationSpeedFactor(event){\n",
       "    rotationSpeedFactor = Number(event.currentTarget.value);\n",
       "}\n",
       "\n",
       "function resetScene(){\n",
       "    scene.rotation.set(0,0,0);\n",
       "    camera.position.set(0,0,5);\n",
       "    camera.up.set(0,1,0);\n",
       "}\n",
       "\n",
       "function showSettings(event){\n",
       "    document.getElementById('settings_1').style.visibility = 'visible';\n",
       "    document.getElementById('showSettingsButton_1').style.visibility = 'hidden';\n",
       "    document.getElementById('hideSettingsButton_1').style.visibility = 'visible';\n",
       "    settingsShown = true;\n",
       "}\n",
       "\n",
       "function hideSettings(event){\n",
       "    document.getElementById('settings_1').style.visibility = 'hidden';\n",
       "    document.getElementById('showSettingsButton_1').style.visibility = 'visible';\n",
       "    document.getElementById('hideSettingsButton_1').style.visibility = 'hidden';\n",
       "    settingsShown = false;\n",
       "}\n",
       "\n",
       "\n",
       "\n",
       "var pos = 150* Math.PI;\n",
       "\n",
       "function updateFactor() {\n",
       "    pos++;\n",
       "    return Math.sin(.01*pos)+1;\n",
       "}\n",
       "\n",
       "// ------------------------ FOLDING ------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "// rotate point p around axis defined by points p1 and p2 by given angle\n",
       "function rotate(p, p1, p2, angle ){   \n",
       "    angle = -angle;\n",
       "    var x = p.x, y = p.y, z = p.z, \n",
       "    a = p1.x, b = p1.y, c = p1.z, \n",
       "    u = p2.x-p1.x, v = p2.y-p1.y, w = p2.z-p1.z;\n",
       "    var result = [];\n",
       "    var L = u*u + v*v + w*w;\n",
       "    var sqrt = Math.sqrt;\n",
       "    var cos = Math.cos;\n",
       "    var sin = Math.sin;\n",
       "\n",
       "    result[0] = ((a*(v*v+w*w)-u*(b*v+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*x*cos(angle)+sqrt(L)*(-c*v+b*w-w*y+v*z)*sin(angle))/L;\n",
       "    result[1] = ((b*(u*u+w*w)-v*(a*u+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*y*cos(angle)+sqrt(L)*(c*u-a*w+w*x-u*z)*sin(angle))/L;\n",
       "    result[2] = ((c*(u*u+v*v)-w*(a*u+b*v-u*x-v*y-w*z))*(1-cos(angle))+L*z*cos(angle)+sqrt(L)*(-b*u+a*v-v*x+u*y)*sin(angle))/L;\n",
       "\n",
       "    return result;\n",
       "}\n",
       "\n",
       "var fold = function(event){\n",
       "    var obj = foldables[Number(event.currentTarget.name)];\n",
       "    var foldvalue = Number(event.currentTarget.value);\n",
       "    var scale = foldvalue - obj.userData.oldscale;\n",
       "\n",
       "    for (var j=0; j<obj.userData.axes.length; j++) {\n",
       "        rotateVertices(obj, j, scale);\n",
       "    }\n",
       "    update(obj);\n",
       "    obj.userData.oldscale += scale;\n",
       "    lookAtBarycenter(obj);\n",
       "}\n",
       "\n",
       "function lookAtBarycenter(obj){\n",
       "    control.target = barycenter(obj);\n",
       "}\n",
       "\n",
       "function barycenter(obj) {\n",
       "    var center = new THREE.Vector3(0,0,0);\n",
       "    var points = obj.userData.points;\n",
       "    for (var i=0; i<points.length; i++){\n",
       "        center.add(points[i].vector);\n",
       "    }\n",
       "    center.divideScalar(points.length);\n",
       "    return center;\n",
       "}\n",
       "\n",
       "function rotateVertices(obj, edge, scale) {\n",
       "    var axes = obj.userData.axes;\n",
       "    var subtrees = obj.userData.subtrees;\n",
       "    var points = obj.userData.points;\n",
       "    var angles = obj.userData.angles;\n",
       "    if (edge < axes.length){\n",
       "        for (var j=0; j<subtrees[edge].length; j++){\n",
       "            var rotP = rotate(points[subtrees[edge][j]].vector, points[axes[edge][0]].vector,points[axes[edge][1]].vector, scale * (Math.PI - angles[edge]));\n",
       "            points[subtrees[edge][j]].set(rotP[0],rotP[1],rotP[2]);\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function update(obj) {\n",
       "   updateFacesPosition(obj);\n",
       "   updateEdgesPosition(obj);\n",
       "}\n",
       "\n",
       "if (foldables.length) {\n",
       "    var settings = document.getElementById('settings_1');\n",
       "    var foldDiv = document.createElement('div');\n",
       "    foldDiv.id = 'fold_1';\n",
       "    var title = document.createElement('strong');\n",
       "    title.innerHTML = 'Fold';\n",
       "    foldDiv.appendChild(title);\n",
       "    foldDiv.className = 'group';\n",
       "    for (var i=0; i<foldables.length; i++) {\n",
       "        var range = document.createElement('input');\n",
       "        range.type = 'range';\n",
       "        range.min = 0;\n",
       "        range.max = 1;\n",
       "        range.value = 0;\n",
       "        range.step = 0.001;\n",
       "        range.name = String(i);\n",
       "        range.oninput = fold;\n",
       "        foldDiv.appendChild(range);\n",
       "    }\n",
       "    lookAtBarycenter(foldables[0]);\n",
       "    settings.insertBefore(foldDiv,settings.childNodes[0]);\n",
       "}\n",
       "\n",
       "    \n",
       "// ---------------------- EXPLOSION ------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "if (explodableModel) {\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        obj = scene.children[i];\n",
       "        if ( obj.userData.explodable ) {\n",
       "            computeCentroid(obj);\n",
       "        }\n",
       "    }\n",
       "    document.getElementById('explodeRange_1').oninput = triggerExplode;\n",
       "    document.getElementById('explodeCheckbox_1').onchange = triggerAutomaticExplode;\n",
       "    document.getElementById('explodingSpeedRange_1').oninput = setExplodingSpeed;\n",
       "}\n",
       "\n",
       "function computeCentroid(obj) {\n",
       "    centroid = new THREE.Vector3();\n",
       "    obj.userData.points.forEach(function(pmpoint) {\n",
       "        centroid.add(pmpoint.vector);\t\t\t\n",
       "    });\n",
       "    centroid.divideScalar(obj.userData.points.length);\n",
       "    obj.userData.centroid = centroid;\n",
       "}\n",
       "\n",
       "function explode(factor) {\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        var obj = scene.children[i];\n",
       "        if (obj.userData.hasOwnProperty(\"centroid\")) { \n",
       "            var c = obj.userData.centroid;\n",
       "            obj.position.set(c.x*factor, c.y*factor, c.z*factor);\n",
       "        }\n",
       "    }\t\n",
       "}\n",
       "\n",
       "function triggerExplode(event){\n",
       "    explodeScale = Number(event.currentTarget.value);\n",
       "    explode(explodeScale);\n",
       "}\n",
       "\n",
       "function setExplodingSpeed(event){\n",
       "    explodingSpeed = Number(event.currentTarget.value);\n",
       "}\n",
       "\n",
       "function triggerAutomaticExplode(event){\n",
       "    if (event.currentTarget.checked){\n",
       "        startExploding();\n",
       "    } else {\n",
       "        clearIntervals();\n",
       "    }\t\n",
       "}\n",
       "\n",
       "function startExploding(){\n",
       "    intervals.push(setInterval(explodingInterval, 25));\n",
       "}\n",
       "\n",
       "\n",
       "function explodingInterval(){\n",
       "    explodeScale += explodingSpeed;\n",
       "    if (explodeScale <= 6){ \n",
       "        explode(explodeScale);\n",
       "    }\n",
       "    else{\n",
       "        explode(6);\n",
       "        explodeScale = 6;\n",
       "        clearIntervals();\n",
       "        timeouts.push(setTimeout(startUnexploding, 3000));\n",
       "    }\n",
       "    document.getElementById('explodeRange_1').value = explodeScale;\n",
       "}\n",
       "\n",
       "\n",
       "function startUnexploding(){\n",
       "    intervals.push(setInterval(unexplodingInterval, 25));\n",
       "}\n",
       "\n",
       "function unexplodingInterval(){\n",
       "    explodeScale -= explodingSpeed;\n",
       "    if (explodeScale >= 0){\t\n",
       "        explode(explodeScale);\n",
       "    }\n",
       "    else {\n",
       "        explode(0);\n",
       "        explodeScale = 0;\n",
       "        clearIntervals();\n",
       "        timeouts.push(setTimeout(startExploding, 3000));\n",
       "    }\n",
       "    document.getElementById('explodeRange_1').value = explodeScale;\n",
       "}\n",
       "\n",
       "function clearIntervals(){\n",
       "    intervals.forEach(function(interval){\n",
       "        clearInterval(interval);\n",
       "    });\n",
       "    intervals = [];\n",
       "    timeouts.forEach(function(timeout){\n",
       "        clearTimeout(timeout);\n",
       "    });\n",
       "    timeouts = [];\n",
       "}\n",
       "\n",
       "// ---------------------- DISPLAY --------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "const objectTypeInnerHTMLs = { points: \"Points\", pointlabels: \"Point labels\", lines: \"Edges\", edgelabels: \"Edge labels\", faces: \"Faces\", arrowheads: \"Arrow heads\" };\n",
       "const objectTypeVisible = {};\n",
       "Object.assign(objectTypeVisible,modelContains);\n",
       "const sortedObjectTypeKeys = Object.keys(objectTypeInnerHTMLs).sort();\n",
       "const shownObjectTypesList = document.getElementById('shownObjectTypesList_1');\n",
       "\n",
       "function setVisibility(bool,objname) {\n",
       "    for (var i=0; i<scene.children.length; i++){\n",
       "        var obj = scene.children[i].getObjectByName(objname);\n",
       "        if (obj) {\n",
       "            obj.visible = bool;\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function toggleObjectTypeVisibility(event){\n",
       "    var name = event.currentTarget.name;\n",
       "    var checked = event.currentTarget.checked;\n",
       "    objectTypeVisible[name] = checked;\n",
       "    setVisibility(checked,name);\n",
       "}\n",
       "\n",
       "for (var i=0; i<sortedObjectTypeKeys.length; i++){\n",
       "    var key = sortedObjectTypeKeys[i];\n",
       "    if (modelContains[key]) {\n",
       "        var objTypeNode = document.createElement('span');\n",
       "        objTypeNode.innerHTML = objectTypeInnerHTMLs[key] + '<br>';\n",
       "        var checkbox = document.createElement('input');\n",
       "        checkbox.type = 'checkbox';\n",
       "        checkbox.checked = true;\n",
       "        checkbox.name = key;\n",
       "        checkbox.onchange = toggleObjectTypeVisibility;\n",
       "        shownObjectTypesList.appendChild(checkbox);\n",
       "        shownObjectTypesList.appendChild(objTypeNode);\n",
       "    }\n",
       "}\n",
       "\n",
       "// ------------------------------------------------------\n",
       "\n",
       "function toggleObjectVisibility(event){\n",
       "    var nr = Number(event.currentTarget.name);\n",
       "    scene.children[nr].visible = event.currentTarget.checked;\n",
       "}\n",
       "\n",
       "// append checkboxes for displaying or hiding objects\n",
       "var shownObjectsList = document.getElementById('shownObjectsList_1');\n",
       "for (var i=0; i<scene.children.length; i++){\n",
       "    obj = scene.children[i];\n",
       "    var objNode = document.createElement('span');\n",
       "    objNode.innerHTML = obj.name + '<br>';\n",
       "    var checkbox = document.createElement('input');\n",
       "    checkbox.type = 'checkbox';\n",
       "    checkbox.checked = true;\n",
       "    checkbox.name = String(i);\n",
       "    checkbox.onchange = toggleObjectVisibility;\n",
       "    shownObjectsList.appendChild(checkbox);\n",
       "    shownObjectsList.appendChild(objNode);\n",
       "}\n",
       "\n",
       "// ---------------------- SVG ------------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "function takeSvgScreenshot() {\n",
       "    if (objectTypeVisible[\"pointlabels\"]) {\n",
       "        setVisibility(false,\"pointlabels\");\n",
       "    }\n",
       "    if (objectTypeVisible[\"edgelabels\"]) {\n",
       "        setVisibility(false,\"edgelabels\");\n",
       "    }\n",
       "    svgRenderer.render(scene,camera);\n",
       "    svgElement = XMLS.serializeToString(svgRenderer.domElement);\n",
       "    \n",
       "    if (objectTypeVisible[\"pointlabels\"]) {\n",
       "        setVisibility(true,\"pointlabels\");\n",
       "    }\n",
       "    if (objectTypeVisible[\"edgelabels\"]) {\n",
       "        setVisibility(true,\"edgelabels\");\n",
       "    }\n",
       "\n",
       "    if (document.getElementById('tab_1').checked){\n",
       "        //show in new tab\n",
       "        var myWindow = window.open(\"\",\"\");\n",
       "        myWindow.document.body.innerHTML = svgElement;\n",
       "    } else{\n",
       "        // download svg file \n",
       "        download(\"screenshot.svg\", svgElement);\n",
       "    }\n",
       "}\n",
       "\n",
       "function download(filename, text) {\n",
       "    var element = document.createElement('a');\n",
       "    element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));\n",
       "    element.setAttribute('download', filename);\n",
       "\n",
       "    element.style.display = 'none';\n",
       "    document.body.appendChild(element);\n",
       "\n",
       "    element.click();\n",
       "\n",
       "    document.body.removeChild(element);\n",
       "}\n",
       "\n",
       "\n",
       "document.getElementById('transparencyRange_1').oninput = changeTransparency;\n",
       "document.getElementById('changeRotationX_1').onchange = changeRotationX;\n",
       "document.getElementById('changeRotationY_1').onchange = changeRotationY;\n",
       "document.getElementById('changeRotationZ_1').onchange = changeRotationZ;\n",
       "document.getElementById('resetButton_1').onclick = resetScene;\n",
       "document.getElementById('rotationSpeedRange_1').oninput = changeRotationSpeedFactor;\n",
       "document.getElementById('takeScreenshot_1').onclick = takeSvgScreenshot;\n",
       "document.getElementById('showSettingsButton_1').onclick = showSettings;\n",
       "document.getElementById('hideSettingsButton_1').onclick = hideSettings;\n",
       "\n",
       "\n",
       "// ------------------ SHORTCUTS --------------------------------------------\n",
       "// -------------------------------------------------------------------------\n",
       "\n",
       "/**\n",
       " * http://www.openjs.com/scripts/events/keyboard_shortcuts/\n",
       " * Version : 2.01.B\n",
       " * By Binny V A\n",
       " * License : BSD\n",
       " */\n",
       "shortcut = {\n",
       "\t'all_shortcuts':{},//All the shortcuts are stored in this array\n",
       "\t'add': function(shortcut_combination,callback,opt) {\n",
       "\t\t//Provide a set of default options\n",
       "\t\tvar default_options = {\n",
       "\t\t\t'type':'keydown',\n",
       "\t\t\t'propagate':false,\n",
       "\t\t\t'disable_in_input':false,\n",
       "\t\t\t'target':document,\n",
       "\t\t\t'keycode':false\n",
       "\t\t}\n",
       "\t\tif(!opt) opt = default_options;\n",
       "\t\telse {\n",
       "\t\t\tfor(var dfo in default_options) {\n",
       "\t\t\t\tif(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo];\n",
       "\t\t\t}\n",
       "\t\t}\n",
       "\n",
       "\t\tvar ele = opt.target;\n",
       "\t\tif(typeof opt.target == 'string') ele = document.getElementById(opt.target);\n",
       "\t\tvar ths = this;\n",
       "\t\tshortcut_combination = shortcut_combination.toLowerCase();\n",
       "\n",
       "\t\t//The function to be called at keypress\n",
       "\t\tvar func = function(e) {\n",
       "\t\t\te = e || window.event;\n",
       "\t\t\t\n",
       "\t\t\tif(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields\n",
       "\t\t\t\tvar element;\n",
       "\t\t\t\tif(e.target) element=e.target;\n",
       "\t\t\t\telse if(e.srcElement) element=e.srcElement;\n",
       "\t\t\t\tif(element.nodeType==3) element=element.parentNode;\n",
       "\n",
       "\t\t\t\tif(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return;\n",
       "\t\t\t}\n",
       "\t\n",
       "\t\t\t//Find Which key is pressed\n",
       "\t\t\tif (e.keyCode) code = e.keyCode;\n",
       "\t\t\telse if (e.which) code = e.which;\n",
       "\t\t\tvar character = String.fromCharCode(code).toLowerCase();\n",
       "\t\t\t\n",
       "\t\t\tif(code == 188) character=\",\"; //If the user presses , when the type is onkeydown\n",
       "\t\t\tif(code == 190) character=\".\"; //If the user presses , when the type is onkeydown\n",
       "\n",
       "\t\t\tvar keys = shortcut_combination.split(\"+\");\n",
       "\t\t\t//Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked\n",
       "\t\t\tvar kp = 0;\n",
       "\t\t\t\n",
       "\t\t\t//Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken\n",
       "\t\t\tvar shift_nums = {\n",
       "\t\t\t\t\"`\":\"~\",\n",
       "\t\t\t\t\"1\":\"!\",\n",
       "\t\t\t\t\"2\":\"@\",\n",
       "\t\t\t\t\"3\":\"#\",\n",
       "\t\t\t\t\"4\":\"$\",\n",
       "\t\t\t\t\"5\":\"%\",\n",
       "\t\t\t\t\"6\":\"^\",\n",
       "\t\t\t\t\"7\":\"&\",\n",
       "\t\t\t\t\"8\":\"*\",\n",
       "\t\t\t\t\"9\":\"(\",\n",
       "\t\t\t\t\"0\":\")\",\n",
       "\t\t\t\t\"-\":\"_\",\n",
       "\t\t\t\t\"=\":\"+\",\n",
       "\t\t\t\t\";\":\":\",\n",
       "\t\t\t\t\"'\":\"\\\"\",\n",
       "\t\t\t\t\",\":\"<\",\n",
       "\t\t\t\t\".\":\">\",\n",
       "\t\t\t\t\"/\":\"?\",\n",
       "\t\t\t\t\"\\\\\":\"|\"\n",
       "\t\t\t}\n",
       "\t\t\t//Special Keys - and their codes\n",
       "\t\t\tvar special_keys = {\n",
       "\t\t\t\t'esc':27,\n",
       "\t\t\t\t'escape':27,\n",
       "\t\t\t\t'tab':9,\n",
       "\t\t\t\t'space':32,\n",
       "\t\t\t\t'return':13,\n",
       "\t\t\t\t'enter':13,\n",
       "\t\t\t\t'backspace':8,\n",
       "\t\n",
       "\t\t\t\t'scrolllock':145,\n",
       "\t\t\t\t'scroll_lock':145,\n",
       "\t\t\t\t'scroll':145,\n",
       "\t\t\t\t'capslock':20,\n",
       "\t\t\t\t'caps_lock':20,\n",
       "\t\t\t\t'caps':20,\n",
       "\t\t\t\t'numlock':144,\n",
       "\t\t\t\t'num_lock':144,\n",
       "\t\t\t\t'num':144,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'pause':19,\n",
       "\t\t\t\t'break':19,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'insert':45,\n",
       "\t\t\t\t'home':36,\n",
       "\t\t\t\t'delete':46,\n",
       "\t\t\t\t'end':35,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'pageup':33,\n",
       "\t\t\t\t'page_up':33,\n",
       "\t\t\t\t'pu':33,\n",
       "\t\n",
       "\t\t\t\t'pagedown':34,\n",
       "\t\t\t\t'page_down':34,\n",
       "\t\t\t\t'pd':34,\n",
       "\t\n",
       "\t\t\t\t'left':37,\n",
       "\t\t\t\t'up':38,\n",
       "\t\t\t\t'right':39,\n",
       "\t\t\t\t'down':40,\n",
       "\t\n",
       "\t\t\t\t'f1':112,\n",
       "\t\t\t\t'f2':113,\n",
       "\t\t\t\t'f3':114,\n",
       "\t\t\t\t'f4':115,\n",
       "\t\t\t\t'f5':116,\n",
       "\t\t\t\t'f6':117,\n",
       "\t\t\t\t'f7':118,\n",
       "\t\t\t\t'f8':119,\n",
       "\t\t\t\t'f9':120,\n",
       "\t\t\t\t'f10':121,\n",
       "\t\t\t\t'f11':122,\n",
       "\t\t\t\t'f12':123\n",
       "\t\t\t}\n",
       "\t\n",
       "\t\t\tvar modifiers = { \n",
       "\t\t\t\tshift: { wanted:false, pressed:false},\n",
       "\t\t\t\tctrl : { wanted:false, pressed:false},\n",
       "\t\t\t\talt  : { wanted:false, pressed:false},\n",
       "\t\t\t\tmeta : { wanted:false, pressed:false}\t//Meta is Mac specific\n",
       "\t\t\t};\n",
       "                        \n",
       "\t\t\tif(e.ctrlKey)\tmodifiers.ctrl.pressed = true;\n",
       "\t\t\tif(e.shiftKey)\tmodifiers.shift.pressed = true;\n",
       "\t\t\tif(e.altKey)\tmodifiers.alt.pressed = true;\n",
       "\t\t\tif(e.metaKey)   modifiers.meta.pressed = true;\n",
       "                        \n",
       "\t\t\tfor(var i=0; k=keys[i],i<keys.length; i++) {\n",
       "\t\t\t\t//Modifiers\n",
       "\t\t\t\tif(k == 'ctrl' || k == 'control') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.ctrl.wanted = true;\n",
       "\n",
       "\t\t\t\t} else if(k == 'shift') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.shift.wanted = true;\n",
       "\n",
       "\t\t\t\t} else if(k == 'alt') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.alt.wanted = true;\n",
       "\t\t\t\t} else if(k == 'meta') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.meta.wanted = true;\n",
       "\t\t\t\t} else if(k.length > 1) { //If it is a special key\n",
       "\t\t\t\t\tif(special_keys[k] == code) kp++;\n",
       "\t\t\t\t\t\n",
       "\t\t\t\t} else if(opt['keycode']) {\n",
       "\t\t\t\t\tif(opt['keycode'] == code) kp++;\n",
       "\n",
       "\t\t\t\t} else { //The special keys did not match\n",
       "\t\t\t\t\tif(character == k) kp++;\n",
       "\t\t\t\t\telse {\n",
       "\t\t\t\t\t\tif(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase\n",
       "\t\t\t\t\t\t\tcharacter = shift_nums[character]; \n",
       "\t\t\t\t\t\t\tif(character == k) kp++;\n",
       "\t\t\t\t\t\t}\n",
       "\t\t\t\t\t}\n",
       "\t\t\t\t}\n",
       "\t\t\t}\n",
       "\t\t\t\n",
       "\t\t\tif(kp == keys.length && \n",
       "\t\t\t\t\t\tmodifiers.ctrl.pressed == modifiers.ctrl.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.shift.pressed == modifiers.shift.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.alt.pressed == modifiers.alt.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.meta.pressed == modifiers.meta.wanted) {\n",
       "\t\t\t\tcallback(e);\n",
       "\t\n",
       "\t\t\t\tif(!opt['propagate']) { //Stop the event\n",
       "\t\t\t\t\t//e.cancelBubble is supported by IE - this will kill the bubbling process.\n",
       "\t\t\t\t\te.cancelBubble = true;\n",
       "\t\t\t\t\te.returnValue = false;\n",
       "\t\n",
       "\t\t\t\t\t//e.stopPropagation works in Firefox.\n",
       "\t\t\t\t\tif (e.stopPropagation) {\n",
       "\t\t\t\t\t\te.stopPropagation();\n",
       "\t\t\t\t\t\te.preventDefault();\n",
       "\t\t\t\t\t}\n",
       "\t\t\t\t\treturn false;\n",
       "\t\t\t\t}\n",
       "\t\t\t}\n",
       "\t\t}\n",
       "\t\tthis.all_shortcuts[shortcut_combination] = {\n",
       "\t\t\t'callback':func, \n",
       "\t\t\t'target':ele, \n",
       "\t\t\t'event': opt['type']\n",
       "\t\t};\n",
       "\t\t//Attach the function with the event\n",
       "\t\tif(ele.addEventListener) ele.addEventListener(opt['type'], func, false);\n",
       "\t\telse if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func);\n",
       "\t\telse ele['on'+opt['type']] = func;\n",
       "\t},\n",
       "\n",
       "\t//Remove the shortcut - just specify the shortcut and I will remove the binding\n",
       "\t'remove':function(shortcut_combination) {\n",
       "\t\tshortcut_combination = shortcut_combination.toLowerCase();\n",
       "\t\tvar binding = this.all_shortcuts[shortcut_combination];\n",
       "\t\tdelete(this.all_shortcuts[shortcut_combination])\n",
       "\t\tif(!binding) return;\n",
       "\t\tvar type = binding['event'];\n",
       "\t\tvar ele = binding['target'];\n",
       "\t\tvar callback = binding['callback'];\n",
       "\n",
       "\t\tif(ele.detachEvent) ele.detachEvent('on'+type, callback);\n",
       "\t\telse if(ele.removeEventListener) ele.removeEventListener(type, callback, false);\n",
       "\t\telse ele['on'+type] = false;\n",
       "\t}\n",
       "}\n",
       "\n",
       "shortcut.add(\"Alt+Left\",function() {\n",
       "\tvar event = new Event('click');\n",
       "\tif (settingsShown){\n",
       "\t\tdocument.getElementById('hideSettingsButton_1').dispatchEvent(event);\n",
       "\t} else {\n",
       "\t\tdocument.getElementById('showSettingsButton_1').dispatchEvent(event);\n",
       "\t}\n",
       "});\n",
       "\n",
       "\n",
       "// COMMON_CODE_BLOCK_END\n",
       "\n",
       "});});\n",
       "      </script>\n",
       "   </body>\n",
       "</html>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "$p->VISUAL(FacetColor=>'255 180 80');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We may look at the GKZ domes of the individual Delaunay triangulations."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<!--\n",
       "polymake for knusper\n",
       "Thu Aug 27 11:35:27 2020\n",
       "pcom:d0\n",
       "-->\n",
       "\n",
       "\n",
       "<html>\n",
       "   <head>\n",
       "      <meta charset=utf-8>\n",
       "      <title>pcom:d0</title>\n",
       "      <style>\n",
       "/*\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "*/\n",
       "         html {overflow: scroll;}\n",
       "         strong{font-size: 18px;}\n",
       "         canvas { z-index: 8; }\n",
       "         input[type='radio'] {margin-left:0;}\n",
       "         input[type='checkbox'] {margin-right:7px; margin-left: 0px; padding-left:0px;}\n",
       "         .group{padding-bottom: 15px;}\n",
       "         .settings * {z-index: 11; }\n",
       "         .settings{z-index: 10; font-family: Arial, Helvetica, sans-serif; margin-left: 30px; visibility: hidden; width: 14em; height: 96%; border: solid 1px silver; padding: 2px; overflow-y: scroll; box-sizing: border-box; background-color: white; position: absolute;}\n",
       "         .indented{margin-left: 20px; margin-top: 10px; padding-bottom: 0px;} \n",
       "         .shownObjectsList{overflow: auto; max-width: 150px; max-height: 150px;}\n",
       "         .showSettingsButton{visibility: visible; z-index: 12; position: absolute }\n",
       "         .hideSettingsButton{visibility: hidden; z-index: 12; position: absolute; opacity: 0.5}\n",
       "         button{margin-left: 0; margin-top: 10px}\n",
       "         img{cursor: pointer;}\n",
       "         .suboption{padding-top: 15px;}\n",
       "         #model12629199637 { width: 100%; height: 100%; }\n",
       "         .threejs_container { width: 100%; height: 75vh;}\n",
       "         .settings{max-height: 74vh} \n",
       "         input[type=range] {\n",
       "           -webkit-appearance: none;\n",
       "           padding:0; \n",
       "           width:90%; \n",
       "           margin-left: auto;\n",
       "           margin-right: auto;\n",
       "           margin-top: 15px;\n",
       "           margin-bottom: 15px;\n",
       "           display: block;\t\n",
       "         }\n",
       "         input[type=range]:focus {\n",
       "           outline: none;\n",
       "         }\n",
       "         input[type=range]::-webkit-slider-runnable-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "           background: #E3E3E3;\n",
       "           border-radius: 0px;\n",
       "           border: 0px solid #000000;\n",
       "         }\n",
       "         input[type=range]::-webkit-slider-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "           -webkit-appearance: none;\n",
       "           margin-top: -5px;\n",
       "         }\n",
       "         input[type=range]:focus::-webkit-slider-runnable-track {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "         input[type=range]::-moz-range-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "           background: #E3E3E3;\n",
       "           border-radius: 0px;\n",
       "           border: 0px solid #000000;\n",
       "         }\n",
       "         input[type=range]::-moz-range-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "         }\n",
       "         input[type=range]::-ms-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           background: transparent;\n",
       "           border-color: transparent;\n",
       "           color: transparent;\n",
       "         }\n",
       "         input[type=range]::-ms-fill-lower {\n",
       "           background: #E3E3E3;\n",
       "           border: 0px solid #000000;\n",
       "           border-radius: 0px;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "         }\n",
       "         input[type=range]::-ms-fill-upper {\n",
       "           background: #E3E3E3;\n",
       "           border: 0px solid #000000;\n",
       "           border-radius: 0px;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "         }\n",
       "         input[type=range]::-ms-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "         }\n",
       "         input[type=range]:focus::-ms-fill-lower {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "         input[type=range]:focus::-ms-fill-upper {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "/*\n",
       "// COMMON_CODE_BLOCK_END\n",
       "*/\n",
       "\t\t</style>\n",
       "   </head>\n",
       "<body>\n",
       "   <div class='threejs_container'>\n",
       "\t\t<div id='settings_2' class='settings'>\n",
       "\t\t\t<div class=group id='explode_2'>\n",
       "\t\t\t\t<strong>Explode</strong>\n",
       "\t\t\t\t<input id='explodeRange_2' type='range' min=0 max=6 step=0.01 value=0>\n",
       "\t\t\t\t<div class=indented><input id='explodeCheckbox_2' type='checkbox'>Automatic explosion</div>\n",
       "\t\t\t\t<div class=suboption>Exploding speed</div>\n",
       "\t\t\t\t<input id='explodingSpeedRange_2' type='range' min=0 max=0.5 step=0.001 value=0.05>\n",
       "\t\t\t</div>\n",
       "\t\n",
       "\t\t\t<div class=group id='transparency_2' class='transparency'>\n",
       "\t\t\t\t<strong>Transparency</strong>\n",
       "\t\t\t\t<input id='transparencyRange_2' type='range' min=0 max=1 step=0.01 value=0>\n",
       "\t\t\t</div>\n",
       "\t\t\t\n",
       "\t\t\t<div class=group id='rotation_2'>\n",
       "\t\t\t\t<strong>Rotation</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationX_2'> x-axis</div>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationY_2'> y-axis</div>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationZ_2'> z-axis</div>\n",
       "\t\t\t\t\t<button id='resetButton_2'>Reset</button>\n",
       "\t\t\t\t</div>\n",
       "\n",
       "\t\t\t\t<div class=suboption>Rotation speed</div>\n",
       "\t\t\t\t<input id='rotationSpeedRange_2' type='range' min=0 max=5 step=0.01 value=2>\n",
       "\t\t\t</div>\n",
       "\n",
       "\n",
       "\t\t\t<div class=group id='display_2'>\n",
       "\t\t\t\t<strong>Display</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<div id='shownObjectTypesList_2' class='shownObjectsList'></div>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t\t<div class=suboption>Objects</div>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t   <div id='shownObjectsList_2' class='shownObjectsList'></div>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t</div>\n",
       "         \n",
       "         <div class=group id='camera_2'>\n",
       "            <strong>Camera</strong>\n",
       "            <div class=indented>\n",
       "               <form>\n",
       "                  <select id=\"cameraType_2\">\n",
       "                     <option value='perspective' selected> Perspective<br></option>\n",
       "                     <option value='orthographic' > Orthographic<br></option>\n",
       "                  </select>\n",
       "               </form>\n",
       "            </div>\n",
       "         </div>\n",
       "\n",
       "\t\t\t<div class=group id='svg_2'>\n",
       "\t\t\t\t<strong>SVG</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<form>\n",
       "\t\t\t\t\t\t<input type=\"radio\" name='screenshotMode' value='download' id='download_2' checked> Download<br>\n",
       "\t\t\t\t\t\t<input type=\"radio\" name='screenshotMode' value='tab' id='tab_2' > New tab<br>\n",
       "\t\t\t\t\t</form>\n",
       "\t\t\t\t\t<button id='takeScreenshot_2'>Screenshot</button>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t</div>\n",
       "\n",
       "\t\t</div>\t<!-- end of settings -->\n",
       "\t\t<img id='hideSettingsButton_2' class='hideSettingsButton' src='/kernelspecs/polymake/close.svg' width=20px\">\n",
       "\t\t<img id='showSettingsButton_2' class='showSettingsButton' src='/kernelspecs/polymake/menu.svg' width=20px\">\n",
       "<div id=\"model12629199637\"></div>\n",
       "</div>\n",
       "   <script>\n",
       "    requirejs.config({\n",
       "      paths: {\n",
       "        three: '/kernelspecs/polymake/three',\n",
       "        TrackballControls: '/kernelspecs/polymake/TrackballControls',\n",
       "        OrbitControls: '/kernelspecs/polymake/OrbitControls',\n",
       "        Projector: '/kernelspecs/polymake/Projector',\n",
       "        SVGRenderer: '/kernelspecs/polymake/SVGRenderer',\n",
       "        WEBGL: '/kernelspecs/polymake/WebGL',\n",
       "      },\n",
       "      shim: {\n",
       "        'three': { exports: 'THREE'},\n",
       "        'SVGRenderer': { deps: [ 'three' ], exports: 'THREE.SVGRenderer' },\n",
       "        'WEBGL': { deps: [ 'three' ], exports: 'THREE.WEBGL' },\n",
       "        'Projector': { deps: [ 'three' ], exports: 'THREE.Projector' },\n",
       "        'TrackballControls': { deps: [ 'three' ], exports: 'THREE.TrackballControls' },\n",
       "        'OrbitControls': { deps: [ 'three' ], exports: 'THREE.OrbitControls' },\n",
       "      }\n",
       "    });\n",
       "    \n",
       "    require(['three'],function(THREE){\n",
       "        window.THREE = THREE;\n",
       "      require(['TrackballControls', 'OrbitControls', 'Projector', 'SVGRenderer', 'WEBGL'],\n",
       "               function(TrackballControls, OrbitControls, Projector, SVGRenderer, WEBGL) {\n",
       "    THREE.TrackballControls = TrackballControls;\n",
       "    THREE.OrbitControls = OrbitControls;\n",
       "    THREE.Projector = Projector;\n",
       "    THREE.SVGRenderer = SVGRenderer;\n",
       "    THREE.WEBGL = WEBGL;\n",
       "\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "\n",
       "const intervalLength = 25; // for automatic animations\n",
       "const explodableModel = true; \n",
       "const modelContains = { points: false, pointlabels: false, lines: false, edgelabels: false, faces: false, arrowheads: false };\n",
       "const foldables = [];\n",
       "\n",
       "var three = document.getElementById(\"model12629199637\");\n",
       "var scene = new THREE.Scene();\n",
       "var renderer = new THREE.WebGLRenderer( { antialias: true } );\n",
       "var svgRenderer = new THREE.SVGRenderer( { antialias: true } );\n",
       "renderer.setPixelRatio( window.devicePixelRatio );\n",
       "renderer.setClearColor(0xFFFFFF, 1);\n",
       "svgRenderer.setClearColor(0xFFFFFF, 1);\n",
       "three.appendChild(renderer.domElement);\n",
       "\n",
       "var frustumSize = 4;\n",
       "var cameras = [new THREE.PerspectiveCamera(75, 1, 0.1, 1000), new THREE.OrthographicCamera()];\n",
       "cameras.forEach(function(cam) {\n",
       "    cam.position.set(0, 0, 5);\n",
       "    cam.lookAt(0, 0, 0);  \n",
       "    cam.up.set(0, 1, 0);         \n",
       "});\n",
       "var controls = [new THREE.TrackballControls(cameras[0], three), new THREE.OrbitControls(cameras[1], three)];\n",
       "var camera, control;\n",
       "\n",
       "controls[0].zoomSpeed = 0.2;\n",
       "controls[0].rotateSpeed = 4;\n",
       "\n",
       "\n",
       "// class to allow move points together with labels and spheres\n",
       "var PMPoint = function (x,y,z) {\n",
       "   this.vector = new THREE.Vector3(x,y,z);\n",
       "   this.sprite = null;\n",
       "   this.sphere = null;\n",
       "}\n",
       "PMPoint.prototype.addLabel = function(labelsprite) {\n",
       "   this.sprite = labelsprite;\n",
       "   this.sprite.position.copy(this.vector);\n",
       "}\n",
       "PMPoint.prototype.addSphere = function(spheremesh) {\n",
       "   this.sphere = spheremesh;\n",
       "   this.sphere.position.copy(this.vector);\n",
       "}\n",
       "PMPoint.prototype.set = function(x,y,z) {\n",
       "   this.vector.set(x,y,z);\n",
       "   if (this.sprite) {\n",
       "      this.sprite.position.copy(this.vector);\n",
       "   }\n",
       "   if (this.sphere) {\n",
       "      this.sphere.position.copy(this.vector);\n",
       "   }\n",
       "}\n",
       "PMPoint.prototype.radius = function() {\n",
       "   if (this.sphere) {\n",
       "      return this.sphere.geometry.parameters.radius;\n",
       "   } else {\n",
       "      return 0;\n",
       "   }\n",
       "};\n",
       "// select the target node\n",
       "var target = document.querySelector('#model12629199637');\n",
       "\n",
       "// create an observer instance\n",
       "var observer = new MutationObserver(function(mutations) {\n",
       "   mutations.forEach(function(mutation) {\n",
       "      if (mutation.removedNodes && mutation.removedNodes.length > 0) {\n",
       "         cancelAnimationFrame(renderId);\n",
       "         observer.disconnect();\n",
       "         console.log(\"cancelled frame \"+renderId);\n",
       "      }\n",
       "   });\n",
       "});\n",
       "\n",
       "// configuration of the observer:\n",
       "var config = { childList: true, characterData: true }\n",
       "\n",
       "// pass in the target node, as well as the observer options\n",
       "while (target) {\n",
       "   if (target.className==\"output\") {\n",
       "      observer.observe(target, config);\n",
       "      break;\n",
       "   }\n",
       "   target = target.parentNode;\n",
       "}\n",
       "\n",
       "// COMMON_CODE_BLOCK_END\n",
       "\n",
       "var obj0 = new THREE.Object3D();\n",
       "obj0.name = \"unnamed__1\";\n",
       "obj0.userData.explodable = 1;\n",
       "obj0.userData.points = [];\n",
       "obj0.userData.points.push(new PMPoint(-1, 0, 0.5));\n",
       "obj0.userData.points.push(new PMPoint(1, 0, 0.5));\n",
       "obj0.userData.points.push(new PMPoint(0, 1, 0.125));\n",
       "\n",
       "obj0.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj0.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj0.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj0.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj0.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj0.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj0);\n",
       "scene.add(obj0);\n",
       "\n",
       "var obj1 = new THREE.Object3D();\n",
       "obj1.name = \"unnamed__2\";\n",
       "obj1.userData.explodable = 1;\n",
       "obj1.userData.points = [];\n",
       "obj1.userData.points.push(new PMPoint(-1, 0, 0.5));\n",
       "obj1.userData.points.push(new PMPoint(1, 0, 0.5));\n",
       "obj1.userData.points.push(new PMPoint(0, -1, 0.125));\n",
       "\n",
       "obj1.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj1.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj1.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj1.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj1.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj1.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj1);\n",
       "scene.add(obj1);\n",
       "\n",
       "var obj2 = new THREE.Object3D();\n",
       "obj2.name = \"unnamed__3\";\n",
       "obj2.userData.explodable = 1;\n",
       "obj2.userData.points = [];\n",
       "obj2.userData.points.push(new PMPoint(1, 0, 0.5));\n",
       "obj2.userData.points.push(new PMPoint(0, 1, 0.125));\n",
       "obj2.userData.points.push(new PMPoint(0.6, 0.8, 0.02));\n",
       "\n",
       "obj2.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj2.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj2.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj2.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj2.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj2.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj2);\n",
       "scene.add(obj2);\n",
       "\n",
       "var obj3 = new THREE.Object3D();\n",
       "obj3.name = \"unnamed__4\";\n",
       "obj3.userData.explodable = 1;\n",
       "obj3.userData.points = [];\n",
       "obj3.userData.points.push(new PMPoint(-1, 0, 0.5));\n",
       "obj3.userData.points.push(new PMPoint(0, 1, 0.125));\n",
       "obj3.userData.points.push(new PMPoint(-0.6, 0.8, 0.02));\n",
       "\n",
       "obj3.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj3.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj3.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj3.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj3.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj3.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj3);\n",
       "scene.add(obj3);\n",
       "\n",
       "var obj4 = new THREE.Object3D();\n",
       "obj4.name = \"unnamed__5\";\n",
       "obj4.userData.explodable = 1;\n",
       "obj4.userData.points = [];\n",
       "obj4.userData.points.push(new PMPoint(-1, 0, 0.5));\n",
       "obj4.userData.points.push(new PMPoint(0, -1, 0.125));\n",
       "obj4.userData.points.push(new PMPoint(-0.6, -0.8, 0.02));\n",
       "\n",
       "obj4.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj4.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj4.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj4.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj4.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj4.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj4);\n",
       "scene.add(obj4);\n",
       "\n",
       "var obj5 = new THREE.Object3D();\n",
       "obj5.name = \"unnamed__6\";\n",
       "obj5.userData.explodable = 1;\n",
       "obj5.userData.points = [];\n",
       "obj5.userData.points.push(new PMPoint(1, 0, 0.5));\n",
       "obj5.userData.points.push(new PMPoint(0, -1, 0.125));\n",
       "obj5.userData.points.push(new PMPoint(0.6, -0.8, 0.02));\n",
       "\n",
       "obj5.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj5.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj5.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj5.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj5.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj5.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj5);\n",
       "scene.add(obj5);\n",
       "\n",
       "var obj6 = new THREE.Object3D();\n",
       "obj6.name = \"unnamed__7\";\n",
       "obj6.userData.explodable = 1;\n",
       "obj6.userData.points = [];\n",
       "obj6.userData.points.push(new PMPoint(1, 0, 0.5));\n",
       "obj6.userData.points.push(new PMPoint(0.6, 0.8, 0.02));\n",
       "obj6.userData.points.push(new PMPoint(0.8, 0.6, 0.005));\n",
       "\n",
       "obj6.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj6.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj6.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj6.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj6.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj6.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj6);\n",
       "scene.add(obj6);\n",
       "\n",
       "var obj7 = new THREE.Object3D();\n",
       "obj7.name = \"unnamed__8\";\n",
       "obj7.userData.explodable = 1;\n",
       "obj7.userData.points = [];\n",
       "obj7.userData.points.push(new PMPoint(0, 1, 0.125));\n",
       "obj7.userData.points.push(new PMPoint(0.6, 0.8, 0.02));\n",
       "obj7.userData.points.push(new PMPoint(0.384615, 0.923077, 0.00295858));\n",
       "\n",
       "obj7.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj7.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj7.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj7.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj7.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj7.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj7);\n",
       "scene.add(obj7);\n",
       "\n",
       "var obj8 = new THREE.Object3D();\n",
       "obj8.name = \"unnamed__9\";\n",
       "obj8.userData.explodable = 1;\n",
       "obj8.userData.points = [];\n",
       "obj8.userData.points.push(new PMPoint(0, 1, 0.125));\n",
       "obj8.userData.points.push(new PMPoint(-0.6, 0.8, 0.02));\n",
       "obj8.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.00295858));\n",
       "\n",
       "obj8.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj8.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj8.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj8.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj8.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj8.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj8);\n",
       "scene.add(obj8);\n",
       "\n",
       "var obj9 = new THREE.Object3D();\n",
       "obj9.name = \"unnamed__10\";\n",
       "obj9.userData.explodable = 1;\n",
       "obj9.userData.points = [];\n",
       "obj9.userData.points.push(new PMPoint(-1, 0, 0.5));\n",
       "obj9.userData.points.push(new PMPoint(-0.6, 0.8, 0.02));\n",
       "obj9.userData.points.push(new PMPoint(-0.8, 0.6, 0.005));\n",
       "\n",
       "obj9.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj9.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj9.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj9.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj9.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj9.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj9);\n",
       "scene.add(obj9);\n",
       "\n",
       "var obj10 = new THREE.Object3D();\n",
       "obj10.name = \"unnamed__11\";\n",
       "obj10.userData.explodable = 1;\n",
       "obj10.userData.points = [];\n",
       "obj10.userData.points.push(new PMPoint(-1, 0, 0.5));\n",
       "obj10.userData.points.push(new PMPoint(-0.6, -0.8, 0.02));\n",
       "obj10.userData.points.push(new PMPoint(-0.8, -0.6, 0.005));\n",
       "\n",
       "obj10.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj10.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj10.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj10.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj10.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj10.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj10);\n",
       "scene.add(obj10);\n",
       "\n",
       "var obj11 = new THREE.Object3D();\n",
       "obj11.name = \"unnamed__12\";\n",
       "obj11.userData.explodable = 1;\n",
       "obj11.userData.points = [];\n",
       "obj11.userData.points.push(new PMPoint(0, -1, 0.125));\n",
       "obj11.userData.points.push(new PMPoint(-0.6, -0.8, 0.02));\n",
       "obj11.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.00295858));\n",
       "\n",
       "obj11.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj11.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj11.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj11.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj11.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj11.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj11);\n",
       "scene.add(obj11);\n",
       "\n",
       "var obj12 = new THREE.Object3D();\n",
       "obj12.name = \"unnamed__13\";\n",
       "obj12.userData.explodable = 1;\n",
       "obj12.userData.points = [];\n",
       "obj12.userData.points.push(new PMPoint(0, -1, 0.125));\n",
       "obj12.userData.points.push(new PMPoint(0.6, -0.8, 0.02));\n",
       "obj12.userData.points.push(new PMPoint(0.384615, -0.923077, 0.00295858));\n",
       "\n",
       "obj12.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj12.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj12.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj12.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj12.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj12.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj12);\n",
       "scene.add(obj12);\n",
       "\n",
       "var obj13 = new THREE.Object3D();\n",
       "obj13.name = \"unnamed__14\";\n",
       "obj13.userData.explodable = 1;\n",
       "obj13.userData.points = [];\n",
       "obj13.userData.points.push(new PMPoint(1, 0, 0.5));\n",
       "obj13.userData.points.push(new PMPoint(0.6, -0.8, 0.02));\n",
       "obj13.userData.points.push(new PMPoint(0.8, -0.6, 0.005));\n",
       "\n",
       "obj13.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj13.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj13.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj13.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj13.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj13.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj13);\n",
       "scene.add(obj13);\n",
       "\n",
       "var obj14 = new THREE.Object3D();\n",
       "obj14.name = \"unnamed__15\";\n",
       "obj14.userData.explodable = 1;\n",
       "obj14.userData.points = [];\n",
       "obj14.userData.points.push(new PMPoint(1, 0, 0.5));\n",
       "obj14.userData.points.push(new PMPoint(0.8, 0.6, 0.005));\n",
       "obj14.userData.points.push(new PMPoint(0.882353, 0.470588, 0.0017301));\n",
       "\n",
       "obj14.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj14.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj14.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj14.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj14.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj14.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj14);\n",
       "scene.add(obj14);\n",
       "\n",
       "var obj15 = new THREE.Object3D();\n",
       "obj15.name = \"unnamed__16\";\n",
       "obj15.userData.explodable = 1;\n",
       "obj15.userData.points = [];\n",
       "obj15.userData.points.push(new PMPoint(0.6, 0.8, 0.02));\n",
       "obj15.userData.points.push(new PMPoint(0.8, 0.6, 0.005));\n",
       "obj15.userData.points.push(new PMPoint(0.724138, 0.689655, 0.00059453));\n",
       "\n",
       "obj15.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj15.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj15.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj15.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj15.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj15.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj15);\n",
       "scene.add(obj15);\n",
       "\n",
       "var obj16 = new THREE.Object3D();\n",
       "obj16.name = \"unnamed__17\";\n",
       "obj16.userData.explodable = 1;\n",
       "obj16.userData.points = [];\n",
       "obj16.userData.points.push(new PMPoint(0.6, 0.8, 0.02));\n",
       "obj16.userData.points.push(new PMPoint(0.384615, 0.923077, 0.00295858));\n",
       "obj16.userData.points.push(new PMPoint(0.470588, 0.882353, 0.000432526));\n",
       "\n",
       "obj16.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj16.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj16.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj16.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj16.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj16.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj16);\n",
       "scene.add(obj16);\n",
       "\n",
       "var obj17 = new THREE.Object3D();\n",
       "obj17.name = \"unnamed__18\";\n",
       "obj17.userData.explodable = 1;\n",
       "obj17.userData.points = [];\n",
       "obj17.userData.points.push(new PMPoint(0, 1, 0.125));\n",
       "obj17.userData.points.push(new PMPoint(0.384615, 0.923077, 0.00295858));\n",
       "obj17.userData.points.push(new PMPoint(0.28, 0.96, 0.0008));\n",
       "\n",
       "obj17.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj17.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj17.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj17.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj17.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj17.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj17);\n",
       "scene.add(obj17);\n",
       "\n",
       "var obj18 = new THREE.Object3D();\n",
       "obj18.name = \"unnamed__19\";\n",
       "obj18.userData.explodable = 1;\n",
       "obj18.userData.points = [];\n",
       "obj18.userData.points.push(new PMPoint(0, 1, 0.125));\n",
       "obj18.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.00295858));\n",
       "obj18.userData.points.push(new PMPoint(-0.28, 0.96, 0.0008));\n",
       "\n",
       "obj18.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj18.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj18.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj18.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj18.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj18.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj18);\n",
       "scene.add(obj18);\n",
       "\n",
       "var obj19 = new THREE.Object3D();\n",
       "obj19.name = \"unnamed__20\";\n",
       "obj19.userData.explodable = 1;\n",
       "obj19.userData.points = [];\n",
       "obj19.userData.points.push(new PMPoint(-0.6, 0.8, 0.02));\n",
       "obj19.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.00295858));\n",
       "obj19.userData.points.push(new PMPoint(-0.470588, 0.882353, 0.000432526));\n",
       "\n",
       "obj19.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj19.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj19.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj19.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj19.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj19.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj19);\n",
       "scene.add(obj19);\n",
       "\n",
       "var obj20 = new THREE.Object3D();\n",
       "obj20.name = \"unnamed__21\";\n",
       "obj20.userData.explodable = 1;\n",
       "obj20.userData.points = [];\n",
       "obj20.userData.points.push(new PMPoint(-0.6, 0.8, 0.02));\n",
       "obj20.userData.points.push(new PMPoint(-0.8, 0.6, 0.005));\n",
       "obj20.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00059453));\n",
       "\n",
       "obj20.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj20.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj20.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj20.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj20.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj20.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj20);\n",
       "scene.add(obj20);\n",
       "\n",
       "var obj21 = new THREE.Object3D();\n",
       "obj21.name = \"unnamed__22\";\n",
       "obj21.userData.explodable = 1;\n",
       "obj21.userData.points = [];\n",
       "obj21.userData.points.push(new PMPoint(-1, 0, 0.5));\n",
       "obj21.userData.points.push(new PMPoint(-0.8, 0.6, 0.005));\n",
       "obj21.userData.points.push(new PMPoint(-0.882353, 0.470588, 0.0017301));\n",
       "\n",
       "obj21.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj21.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj21.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj21.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj21.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj21.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj21);\n",
       "scene.add(obj21);\n",
       "\n",
       "var obj22 = new THREE.Object3D();\n",
       "obj22.name = \"unnamed__23\";\n",
       "obj22.userData.explodable = 1;\n",
       "obj22.userData.points = [];\n",
       "obj22.userData.points.push(new PMPoint(-1, 0, 0.5));\n",
       "obj22.userData.points.push(new PMPoint(-0.8, -0.6, 0.005));\n",
       "obj22.userData.points.push(new PMPoint(-0.882353, -0.470588, 0.0017301));\n",
       "\n",
       "obj22.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj22.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj22.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj22.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj22.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj22.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj22);\n",
       "scene.add(obj22);\n",
       "\n",
       "var obj23 = new THREE.Object3D();\n",
       "obj23.name = \"unnamed__24\";\n",
       "obj23.userData.explodable = 1;\n",
       "obj23.userData.points = [];\n",
       "obj23.userData.points.push(new PMPoint(-0.6, -0.8, 0.02));\n",
       "obj23.userData.points.push(new PMPoint(-0.8, -0.6, 0.005));\n",
       "obj23.userData.points.push(new PMPoint(-0.724138, -0.689655, 0.00059453));\n",
       "\n",
       "obj23.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj23.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj23.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj23.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj23.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj23.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj23);\n",
       "scene.add(obj23);\n",
       "\n",
       "var obj24 = new THREE.Object3D();\n",
       "obj24.name = \"unnamed__25\";\n",
       "obj24.userData.explodable = 1;\n",
       "obj24.userData.points = [];\n",
       "obj24.userData.points.push(new PMPoint(-0.6, -0.8, 0.02));\n",
       "obj24.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.00295858));\n",
       "obj24.userData.points.push(new PMPoint(-0.470588, -0.882353, 0.000432526));\n",
       "\n",
       "obj24.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj24.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj24.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj24.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj24.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj24.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj24);\n",
       "scene.add(obj24);\n",
       "\n",
       "var obj25 = new THREE.Object3D();\n",
       "obj25.name = \"unnamed__26\";\n",
       "obj25.userData.explodable = 1;\n",
       "obj25.userData.points = [];\n",
       "obj25.userData.points.push(new PMPoint(0, -1, 0.125));\n",
       "obj25.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.00295858));\n",
       "obj25.userData.points.push(new PMPoint(-0.28, -0.96, 0.0008));\n",
       "\n",
       "obj25.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj25.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj25.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj25.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj25.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj25.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj25);\n",
       "scene.add(obj25);\n",
       "\n",
       "var obj26 = new THREE.Object3D();\n",
       "obj26.name = \"unnamed__27\";\n",
       "obj26.userData.explodable = 1;\n",
       "obj26.userData.points = [];\n",
       "obj26.userData.points.push(new PMPoint(0, -1, 0.125));\n",
       "obj26.userData.points.push(new PMPoint(0.384615, -0.923077, 0.00295858));\n",
       "obj26.userData.points.push(new PMPoint(0.28, -0.96, 0.0008));\n",
       "\n",
       "obj26.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj26.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj26.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj26.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj26.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj26.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj26);\n",
       "scene.add(obj26);\n",
       "\n",
       "var obj27 = new THREE.Object3D();\n",
       "obj27.name = \"unnamed__28\";\n",
       "obj27.userData.explodable = 1;\n",
       "obj27.userData.points = [];\n",
       "obj27.userData.points.push(new PMPoint(0.6, -0.8, 0.02));\n",
       "obj27.userData.points.push(new PMPoint(0.384615, -0.923077, 0.00295858));\n",
       "obj27.userData.points.push(new PMPoint(0.470588, -0.882353, 0.000432526));\n",
       "\n",
       "obj27.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj27.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj27.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj27.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj27.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj27.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj27);\n",
       "scene.add(obj27);\n",
       "\n",
       "var obj28 = new THREE.Object3D();\n",
       "obj28.name = \"unnamed__29\";\n",
       "obj28.userData.explodable = 1;\n",
       "obj28.userData.points = [];\n",
       "obj28.userData.points.push(new PMPoint(0.6, -0.8, 0.02));\n",
       "obj28.userData.points.push(new PMPoint(0.8, -0.6, 0.005));\n",
       "obj28.userData.points.push(new PMPoint(0.724138, -0.689655, 0.00059453));\n",
       "\n",
       "obj28.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj28.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj28.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj28.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj28.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj28.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj28);\n",
       "scene.add(obj28);\n",
       "\n",
       "var obj29 = new THREE.Object3D();\n",
       "obj29.name = \"unnamed__30\";\n",
       "obj29.userData.explodable = 1;\n",
       "obj29.userData.points = [];\n",
       "obj29.userData.points.push(new PMPoint(1, 0, 0.5));\n",
       "obj29.userData.points.push(new PMPoint(0.8, -0.6, 0.005));\n",
       "obj29.userData.points.push(new PMPoint(0.882353, -0.470588, 0.0017301));\n",
       "\n",
       "obj29.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj29.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj29.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj29.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj29.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj29.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj29);\n",
       "scene.add(obj29);\n",
       "\n",
       "var obj30 = new THREE.Object3D();\n",
       "obj30.name = \"unnamed__31\";\n",
       "obj30.userData.explodable = 1;\n",
       "obj30.userData.points = [];\n",
       "obj30.userData.points.push(new PMPoint(1, 0, 0.5));\n",
       "obj30.userData.points.push(new PMPoint(0.882353, 0.470588, 0.0017301));\n",
       "obj30.userData.points.push(new PMPoint(0.923077, 0.384615, 0.000739645));\n",
       "\n",
       "obj30.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj30.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj30.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj30.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj30.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj30.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj30);\n",
       "scene.add(obj30);\n",
       "\n",
       "var obj31 = new THREE.Object3D();\n",
       "obj31.name = \"unnamed__32\";\n",
       "obj31.userData.explodable = 1;\n",
       "obj31.userData.points = [];\n",
       "obj31.userData.points.push(new PMPoint(0.8, 0.6, 0.005));\n",
       "obj31.userData.points.push(new PMPoint(0.882353, 0.470588, 0.0017301));\n",
       "obj31.userData.points.push(new PMPoint(0.849057, 0.528302, 0.000177999));\n",
       "\n",
       "obj31.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj31.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj31.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj31.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj31.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj31.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj31);\n",
       "scene.add(obj31);\n",
       "\n",
       "var obj32 = new THREE.Object3D();\n",
       "obj32.name = \"unnamed__33\";\n",
       "obj32.userData.explodable = 1;\n",
       "obj32.userData.points = [];\n",
       "obj32.userData.points.push(new PMPoint(0.8, 0.6, 0.005));\n",
       "obj32.userData.points.push(new PMPoint(0.724138, 0.689655, 0.00059453));\n",
       "obj32.userData.points.push(new PMPoint(0.753425, 0.657534, 9.38262e-05));\n",
       "\n",
       "obj32.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj32.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj32.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj32.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj32.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj32.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj32);\n",
       "scene.add(obj32);\n",
       "\n",
       "var obj33 = new THREE.Object3D();\n",
       "obj33.name = \"unnamed__34\";\n",
       "obj33.userData.explodable = 1;\n",
       "obj33.userData.points = [];\n",
       "obj33.userData.points.push(new PMPoint(0.6, 0.8, 0.02));\n",
       "obj33.userData.points.push(new PMPoint(0.724138, 0.689655, 0.00059453));\n",
       "obj33.userData.points.push(new PMPoint(0.689655, 0.724138, 0.000148633));\n",
       "\n",
       "obj33.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj33.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj33.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj33.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj33.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj33.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj33);\n",
       "scene.add(obj33);\n",
       "\n",
       "var obj34 = new THREE.Object3D();\n",
       "obj34.name = \"unnamed__35\";\n",
       "obj34.userData.explodable = 1;\n",
       "obj34.userData.points = [];\n",
       "obj34.userData.points.push(new PMPoint(0.6, 0.8, 0.02));\n",
       "obj34.userData.points.push(new PMPoint(0.470588, 0.882353, 0.000432526));\n",
       "obj34.userData.points.push(new PMPoint(0.507692, 0.861538, 0.000118343));\n",
       "\n",
       "obj34.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj34.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj34.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj34.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj34.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj34.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj34);\n",
       "scene.add(obj34);\n",
       "\n",
       "var obj35 = new THREE.Object3D();\n",
       "obj35.name = \"unnamed__36\";\n",
       "obj35.userData.explodable = 1;\n",
       "obj35.userData.points = [];\n",
       "obj35.userData.points.push(new PMPoint(0.384615, 0.923077, 0.00295858));\n",
       "obj35.userData.points.push(new PMPoint(0.470588, 0.882353, 0.000432526));\n",
       "obj35.userData.points.push(new PMPoint(0.438202, 0.898876, 6.31233e-05));\n",
       "\n",
       "obj35.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj35.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj35.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj35.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj35.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj35.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj35);\n",
       "scene.add(obj35);\n",
       "\n",
       "var obj36 = new THREE.Object3D();\n",
       "obj36.name = \"unnamed__37\";\n",
       "obj36.userData.explodable = 1;\n",
       "obj36.userData.points = [];\n",
       "obj36.userData.points.push(new PMPoint(0.384615, 0.923077, 0.00295858));\n",
       "obj36.userData.points.push(new PMPoint(0.28, 0.96, 0.0008));\n",
       "obj36.userData.points.push(new PMPoint(0.324324, 0.945946, 9.13075e-05));\n",
       "\n",
       "obj36.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj36.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj36.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj36.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj36.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj36.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj36);\n",
       "scene.add(obj36);\n",
       "\n",
       "var obj37 = new THREE.Object3D();\n",
       "obj37.name = \"unnamed__38\";\n",
       "obj37.userData.explodable = 1;\n",
       "obj37.userData.points = [];\n",
       "obj37.userData.points.push(new PMPoint(0, 1, 0.125));\n",
       "obj37.userData.points.push(new PMPoint(0.28, 0.96, 0.0008));\n",
       "obj37.userData.points.push(new PMPoint(0.219512, 0.97561, 0.000297442));\n",
       "\n",
       "obj37.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj37.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj37.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj37.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj37.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj37.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj37);\n",
       "scene.add(obj37);\n",
       "\n",
       "var obj38 = new THREE.Object3D();\n",
       "obj38.name = \"unnamed__39\";\n",
       "obj38.userData.explodable = 1;\n",
       "obj38.userData.points = [];\n",
       "obj38.userData.points.push(new PMPoint(0, 1, 0.125));\n",
       "obj38.userData.points.push(new PMPoint(-0.28, 0.96, 0.0008));\n",
       "obj38.userData.points.push(new PMPoint(-0.219512, 0.97561, 0.000297442));\n",
       "\n",
       "obj38.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj38.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj38.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj38.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj38.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj38.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj38);\n",
       "scene.add(obj38);\n",
       "\n",
       "var obj39 = new THREE.Object3D();\n",
       "obj39.name = \"unnamed__40\";\n",
       "obj39.userData.explodable = 1;\n",
       "obj39.userData.points = [];\n",
       "obj39.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.00295858));\n",
       "obj39.userData.points.push(new PMPoint(-0.28, 0.96, 0.0008));\n",
       "obj39.userData.points.push(new PMPoint(-0.324324, 0.945946, 9.13075e-05));\n",
       "\n",
       "obj39.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj39.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj39.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj39.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj39.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj39.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj39);\n",
       "scene.add(obj39);\n",
       "\n",
       "var obj40 = new THREE.Object3D();\n",
       "obj40.name = \"unnamed__41\";\n",
       "obj40.userData.explodable = 1;\n",
       "obj40.userData.points = [];\n",
       "obj40.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.00295858));\n",
       "obj40.userData.points.push(new PMPoint(-0.470588, 0.882353, 0.000432526));\n",
       "obj40.userData.points.push(new PMPoint(-0.438202, 0.898876, 6.31233e-05));\n",
       "\n",
       "obj40.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj40.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj40.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj40.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj40.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj40.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj40);\n",
       "scene.add(obj40);\n",
       "\n",
       "var obj41 = new THREE.Object3D();\n",
       "obj41.name = \"unnamed__42\";\n",
       "obj41.userData.explodable = 1;\n",
       "obj41.userData.points = [];\n",
       "obj41.userData.points.push(new PMPoint(-0.6, 0.8, 0.02));\n",
       "obj41.userData.points.push(new PMPoint(-0.470588, 0.882353, 0.000432526));\n",
       "obj41.userData.points.push(new PMPoint(-0.507692, 0.861538, 0.000118343));\n",
       "\n",
       "obj41.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj41.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj41.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj41.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj41.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj41.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj41);\n",
       "scene.add(obj41);\n",
       "\n",
       "var obj42 = new THREE.Object3D();\n",
       "obj42.name = \"unnamed__43\";\n",
       "obj42.userData.explodable = 1;\n",
       "obj42.userData.points = [];\n",
       "obj42.userData.points.push(new PMPoint(-0.6, 0.8, 0.02));\n",
       "obj42.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00059453));\n",
       "obj42.userData.points.push(new PMPoint(-0.689655, 0.724138, 0.000148633));\n",
       "\n",
       "obj42.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj42.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj42.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj42.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj42.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj42.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj42);\n",
       "scene.add(obj42);\n",
       "\n",
       "var obj43 = new THREE.Object3D();\n",
       "obj43.name = \"unnamed__44\";\n",
       "obj43.userData.explodable = 1;\n",
       "obj43.userData.points = [];\n",
       "obj43.userData.points.push(new PMPoint(-0.8, 0.6, 0.005));\n",
       "obj43.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00059453));\n",
       "obj43.userData.points.push(new PMPoint(-0.753425, 0.657534, 9.38262e-05));\n",
       "\n",
       "obj43.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj43.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj43.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj43.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj43.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj43.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj43);\n",
       "scene.add(obj43);\n",
       "\n",
       "var obj44 = new THREE.Object3D();\n",
       "obj44.name = \"unnamed__45\";\n",
       "obj44.userData.explodable = 1;\n",
       "obj44.userData.points = [];\n",
       "obj44.userData.points.push(new PMPoint(-0.8, 0.6, 0.005));\n",
       "obj44.userData.points.push(new PMPoint(-0.882353, 0.470588, 0.0017301));\n",
       "obj44.userData.points.push(new PMPoint(-0.849057, 0.528302, 0.000177999));\n",
       "\n",
       "obj44.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj44.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj44.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj44.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj44.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj44.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj44);\n",
       "scene.add(obj44);\n",
       "\n",
       "var obj45 = new THREE.Object3D();\n",
       "obj45.name = \"unnamed__46\";\n",
       "obj45.userData.explodable = 1;\n",
       "obj45.userData.points = [];\n",
       "obj45.userData.points.push(new PMPoint(-1, 0, 0.5));\n",
       "obj45.userData.points.push(new PMPoint(-0.882353, 0.470588, 0.0017301));\n",
       "obj45.userData.points.push(new PMPoint(-0.923077, 0.384615, 0.000739645));\n",
       "\n",
       "obj45.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj45.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj45.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj45.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj45.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj45.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj45);\n",
       "scene.add(obj45);\n",
       "\n",
       "var obj46 = new THREE.Object3D();\n",
       "obj46.name = \"unnamed__47\";\n",
       "obj46.userData.explodable = 1;\n",
       "obj46.userData.points = [];\n",
       "obj46.userData.points.push(new PMPoint(-1, 0, 0.5));\n",
       "obj46.userData.points.push(new PMPoint(-0.882353, -0.470588, 0.0017301));\n",
       "obj46.userData.points.push(new PMPoint(-0.923077, -0.384615, 0.000739645));\n",
       "\n",
       "obj46.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj46.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj46.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj46.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj46.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj46.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj46);\n",
       "scene.add(obj46);\n",
       "\n",
       "var obj47 = new THREE.Object3D();\n",
       "obj47.name = \"unnamed__48\";\n",
       "obj47.userData.explodable = 1;\n",
       "obj47.userData.points = [];\n",
       "obj47.userData.points.push(new PMPoint(-0.8, -0.6, 0.005));\n",
       "obj47.userData.points.push(new PMPoint(-0.882353, -0.470588, 0.0017301));\n",
       "obj47.userData.points.push(new PMPoint(-0.849057, -0.528302, 0.000177999));\n",
       "\n",
       "obj47.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj47.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj47.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj47.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj47.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj47.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj47);\n",
       "scene.add(obj47);\n",
       "\n",
       "var obj48 = new THREE.Object3D();\n",
       "obj48.name = \"unnamed__49\";\n",
       "obj48.userData.explodable = 1;\n",
       "obj48.userData.points = [];\n",
       "obj48.userData.points.push(new PMPoint(-0.8, -0.6, 0.005));\n",
       "obj48.userData.points.push(new PMPoint(-0.724138, -0.689655, 0.00059453));\n",
       "obj48.userData.points.push(new PMPoint(-0.753425, -0.657534, 9.38262e-05));\n",
       "\n",
       "obj48.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj48.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj48.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj48.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj48.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj48.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj48);\n",
       "scene.add(obj48);\n",
       "\n",
       "var obj49 = new THREE.Object3D();\n",
       "obj49.name = \"unnamed__50\";\n",
       "obj49.userData.explodable = 1;\n",
       "obj49.userData.points = [];\n",
       "obj49.userData.points.push(new PMPoint(-0.6, -0.8, 0.02));\n",
       "obj49.userData.points.push(new PMPoint(-0.724138, -0.689655, 0.00059453));\n",
       "obj49.userData.points.push(new PMPoint(-0.689655, -0.724138, 0.000148633));\n",
       "\n",
       "obj49.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj49.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj49.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj49.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj49.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj49.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj49);\n",
       "scene.add(obj49);\n",
       "\n",
       "var obj50 = new THREE.Object3D();\n",
       "obj50.name = \"unnamed__51\";\n",
       "obj50.userData.explodable = 1;\n",
       "obj50.userData.points = [];\n",
       "obj50.userData.points.push(new PMPoint(-0.6, -0.8, 0.02));\n",
       "obj50.userData.points.push(new PMPoint(-0.470588, -0.882353, 0.000432526));\n",
       "obj50.userData.points.push(new PMPoint(-0.507692, -0.861538, 0.000118343));\n",
       "\n",
       "obj50.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj50.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj50.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj50.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj50.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj50.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj50);\n",
       "scene.add(obj50);\n",
       "\n",
       "var obj51 = new THREE.Object3D();\n",
       "obj51.name = \"unnamed__52\";\n",
       "obj51.userData.explodable = 1;\n",
       "obj51.userData.points = [];\n",
       "obj51.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.00295858));\n",
       "obj51.userData.points.push(new PMPoint(-0.470588, -0.882353, 0.000432526));\n",
       "obj51.userData.points.push(new PMPoint(-0.438202, -0.898876, 6.31233e-05));\n",
       "\n",
       "obj51.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj51.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj51.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj51.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj51.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj51.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj51);\n",
       "scene.add(obj51);\n",
       "\n",
       "var obj52 = new THREE.Object3D();\n",
       "obj52.name = \"unnamed__53\";\n",
       "obj52.userData.explodable = 1;\n",
       "obj52.userData.points = [];\n",
       "obj52.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.00295858));\n",
       "obj52.userData.points.push(new PMPoint(-0.28, -0.96, 0.0008));\n",
       "obj52.userData.points.push(new PMPoint(-0.324324, -0.945946, 9.13075e-05));\n",
       "\n",
       "obj52.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj52.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj52.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj52.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj52.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj52.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj52);\n",
       "scene.add(obj52);\n",
       "\n",
       "var obj53 = new THREE.Object3D();\n",
       "obj53.name = \"unnamed__54\";\n",
       "obj53.userData.explodable = 1;\n",
       "obj53.userData.points = [];\n",
       "obj53.userData.points.push(new PMPoint(0, -1, 0.125));\n",
       "obj53.userData.points.push(new PMPoint(-0.28, -0.96, 0.0008));\n",
       "obj53.userData.points.push(new PMPoint(-0.219512, -0.97561, 0.000297442));\n",
       "\n",
       "obj53.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj53.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj53.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj53.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj53.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj53.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj53);\n",
       "scene.add(obj53);\n",
       "\n",
       "var obj54 = new THREE.Object3D();\n",
       "obj54.name = \"unnamed__55\";\n",
       "obj54.userData.explodable = 1;\n",
       "obj54.userData.points = [];\n",
       "obj54.userData.points.push(new PMPoint(0, -1, 0.125));\n",
       "obj54.userData.points.push(new PMPoint(0.28, -0.96, 0.0008));\n",
       "obj54.userData.points.push(new PMPoint(0.219512, -0.97561, 0.000297442));\n",
       "\n",
       "obj54.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj54.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj54.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj54.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj54.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj54.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj54);\n",
       "scene.add(obj54);\n",
       "\n",
       "var obj55 = new THREE.Object3D();\n",
       "obj55.name = \"unnamed__56\";\n",
       "obj55.userData.explodable = 1;\n",
       "obj55.userData.points = [];\n",
       "obj55.userData.points.push(new PMPoint(0.384615, -0.923077, 0.00295858));\n",
       "obj55.userData.points.push(new PMPoint(0.28, -0.96, 0.0008));\n",
       "obj55.userData.points.push(new PMPoint(0.324324, -0.945946, 9.13075e-05));\n",
       "\n",
       "obj55.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj55.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj55.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj55.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj55.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj55.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj55);\n",
       "scene.add(obj55);\n",
       "\n",
       "var obj56 = new THREE.Object3D();\n",
       "obj56.name = \"unnamed__57\";\n",
       "obj56.userData.explodable = 1;\n",
       "obj56.userData.points = [];\n",
       "obj56.userData.points.push(new PMPoint(0.384615, -0.923077, 0.00295858));\n",
       "obj56.userData.points.push(new PMPoint(0.470588, -0.882353, 0.000432526));\n",
       "obj56.userData.points.push(new PMPoint(0.438202, -0.898876, 6.31233e-05));\n",
       "\n",
       "obj56.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj56.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj56.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj56.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj56.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj56.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj56);\n",
       "scene.add(obj56);\n",
       "\n",
       "var obj57 = new THREE.Object3D();\n",
       "obj57.name = \"unnamed__58\";\n",
       "obj57.userData.explodable = 1;\n",
       "obj57.userData.points = [];\n",
       "obj57.userData.points.push(new PMPoint(0.6, -0.8, 0.02));\n",
       "obj57.userData.points.push(new PMPoint(0.470588, -0.882353, 0.000432526));\n",
       "obj57.userData.points.push(new PMPoint(0.507692, -0.861538, 0.000118343));\n",
       "\n",
       "obj57.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj57.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj57.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj57.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj57.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj57.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj57);\n",
       "scene.add(obj57);\n",
       "\n",
       "var obj58 = new THREE.Object3D();\n",
       "obj58.name = \"unnamed__59\";\n",
       "obj58.userData.explodable = 1;\n",
       "obj58.userData.points = [];\n",
       "obj58.userData.points.push(new PMPoint(0.6, -0.8, 0.02));\n",
       "obj58.userData.points.push(new PMPoint(0.724138, -0.689655, 0.00059453));\n",
       "obj58.userData.points.push(new PMPoint(0.689655, -0.724138, 0.000148633));\n",
       "\n",
       "obj58.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj58.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj58.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj58.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj58.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj58.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj58);\n",
       "scene.add(obj58);\n",
       "\n",
       "var obj59 = new THREE.Object3D();\n",
       "obj59.name = \"unnamed__60\";\n",
       "obj59.userData.explodable = 1;\n",
       "obj59.userData.points = [];\n",
       "obj59.userData.points.push(new PMPoint(0.8, -0.6, 0.005));\n",
       "obj59.userData.points.push(new PMPoint(0.724138, -0.689655, 0.00059453));\n",
       "obj59.userData.points.push(new PMPoint(0.753425, -0.657534, 9.38262e-05));\n",
       "\n",
       "obj59.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj59.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj59.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj59.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj59.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj59.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj59);\n",
       "scene.add(obj59);\n",
       "\n",
       "var obj60 = new THREE.Object3D();\n",
       "obj60.name = \"unnamed__61\";\n",
       "obj60.userData.explodable = 1;\n",
       "obj60.userData.points = [];\n",
       "obj60.userData.points.push(new PMPoint(0.8, -0.6, 0.005));\n",
       "obj60.userData.points.push(new PMPoint(0.882353, -0.470588, 0.0017301));\n",
       "obj60.userData.points.push(new PMPoint(0.849057, -0.528302, 0.000177999));\n",
       "\n",
       "obj60.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj60.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj60.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj60.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj60.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj60.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj60);\n",
       "scene.add(obj60);\n",
       "\n",
       "var obj61 = new THREE.Object3D();\n",
       "obj61.name = \"unnamed__62\";\n",
       "obj61.userData.explodable = 1;\n",
       "obj61.userData.points = [];\n",
       "obj61.userData.points.push(new PMPoint(1, 0, 0.5));\n",
       "obj61.userData.points.push(new PMPoint(0.882353, -0.470588, 0.0017301));\n",
       "obj61.userData.points.push(new PMPoint(0.923077, -0.384615, 0.000739645));\n",
       "\n",
       "obj61.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj61.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj61.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj61.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj61.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj61.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj61);\n",
       "scene.add(obj61);\n",
       "\n",
       "var obj62 = new THREE.Object3D();\n",
       "obj62.name = \"unnamed__63\";\n",
       "obj62.userData.explodable = 1;\n",
       "obj62.userData.points = [];\n",
       "obj62.userData.points.push(new PMPoint(1, 0, 0.5));\n",
       "obj62.userData.points.push(new PMPoint(0.923077, 0.384615, 0.000739645));\n",
       "obj62.userData.points.push(new PMPoint(0.945946, 0.324324, 0.00036523));\n",
       "\n",
       "obj62.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj62.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj62.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj62.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj62.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj62.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj62);\n",
       "scene.add(obj62);\n",
       "\n",
       "var obj63 = new THREE.Object3D();\n",
       "obj63.name = \"unnamed__64\";\n",
       "obj63.userData.explodable = 1;\n",
       "obj63.userData.points = [];\n",
       "obj63.userData.points.push(new PMPoint(0.882353, 0.470588, 0.0017301));\n",
       "obj63.userData.points.push(new PMPoint(0.923077, 0.384615, 0.000739645));\n",
       "obj63.userData.points.push(new PMPoint(0.905882, 0.423529, 6.92042e-05));\n",
       "\n",
       "obj63.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj63.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj63.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj63.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj63.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj63.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj63);\n",
       "scene.add(obj63);\n",
       "\n",
       "var obj64 = new THREE.Object3D();\n",
       "obj64.name = \"unnamed__65\";\n",
       "obj64.userData.explodable = 1;\n",
       "obj64.userData.points = [];\n",
       "obj64.userData.points.push(new PMPoint(0.882353, 0.470588, 0.0017301));\n",
       "obj64.userData.points.push(new PMPoint(0.849057, 0.528302, 0.000177999));\n",
       "obj64.userData.points.push(new PMPoint(0.861538, 0.507692, 2.95858e-05));\n",
       "\n",
       "obj64.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj64.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj64.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj64.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj64.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj64.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj64);\n",
       "scene.add(obj64);\n",
       "\n",
       "var obj65 = new THREE.Object3D();\n",
       "obj65.name = \"unnamed__66\";\n",
       "obj65.userData.explodable = 1;\n",
       "obj65.userData.points = [];\n",
       "obj65.userData.points.push(new PMPoint(0.8, 0.6, 0.005));\n",
       "obj65.userData.points.push(new PMPoint(0.849057, 0.528302, 0.000177999));\n",
       "obj65.userData.points.push(new PMPoint(0.834862, 0.550459, 4.2084e-05));\n",
       "\n",
       "obj65.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj65.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj65.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj65.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj65.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj65.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj65);\n",
       "scene.add(obj65);\n",
       "\n",
       "var obj66 = new THREE.Object3D();\n",
       "obj66.name = \"unnamed__67\";\n",
       "obj66.userData.explodable = 1;\n",
       "obj66.userData.points = [];\n",
       "obj66.userData.points.push(new PMPoint(0.8, 0.6, 0.005));\n",
       "obj66.userData.points.push(new PMPoint(0.753425, 0.657534, 9.38262e-05));\n",
       "obj66.userData.points.push(new PMPoint(0.766423, 0.642336, 2.66397e-05));\n",
       "\n",
       "obj66.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj66.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj66.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj66.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj66.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj66.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj66);\n",
       "scene.add(obj66);\n",
       "\n",
       "var obj67 = new THREE.Object3D();\n",
       "obj67.name = \"unnamed__68\";\n",
       "obj67.userData.explodable = 1;\n",
       "obj67.userData.points = [];\n",
       "obj67.userData.points.push(new PMPoint(0.724138, 0.689655, 0.00059453));\n",
       "obj67.userData.points.push(new PMPoint(0.753425, 0.657534, 9.38262e-05));\n",
       "obj67.userData.points.push(new PMPoint(0.742268, 0.670103, 1.32852e-05));\n",
       "\n",
       "obj67.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj67.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj67.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj67.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj67.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj67.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj67);\n",
       "scene.add(obj67);\n",
       "\n",
       "var obj68 = new THREE.Object3D();\n",
       "obj68.name = \"unnamed__69\";\n",
       "obj68.userData.explodable = 1;\n",
       "obj68.userData.points = [];\n",
       "obj68.userData.points.push(new PMPoint(0.724138, 0.689655, 0.00059453));\n",
       "obj68.userData.points.push(new PMPoint(0.689655, 0.724138, 0.000148633));\n",
       "obj68.userData.points.push(new PMPoint(0.704142, 0.710059, 1.75064e-05));\n",
       "\n",
       "obj68.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj68.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj68.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj68.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj68.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj68.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj68);\n",
       "scene.add(obj68);\n",
       "\n",
       "var obj69 = new THREE.Object3D();\n",
       "obj69.name = \"unnamed__70\";\n",
       "obj69.userData.explodable = 1;\n",
       "obj69.userData.points = [];\n",
       "obj69.userData.points.push(new PMPoint(0.6, 0.8, 0.02));\n",
       "obj69.userData.points.push(new PMPoint(0.689655, 0.724138, 0.000148633));\n",
       "obj69.userData.points.push(new PMPoint(0.670103, 0.742268, 5.31406e-05));\n",
       "\n",
       "obj69.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj69.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj69.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj69.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj69.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj69.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj69);\n",
       "scene.add(obj69);\n",
       "\n",
       "var obj70 = new THREE.Object3D();\n",
       "obj70.name = \"unnamed__71\";\n",
       "obj70.userData.explodable = 1;\n",
       "obj70.userData.points = [];\n",
       "obj70.userData.points.push(new PMPoint(0.6, 0.8, 0.02));\n",
       "obj70.userData.points.push(new PMPoint(0.507692, 0.861538, 0.000118343));\n",
       "obj70.userData.points.push(new PMPoint(0.528302, 0.849057, 4.44998e-05));\n",
       "\n",
       "obj70.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj70.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj70.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj70.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj70.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj70.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj70);\n",
       "scene.add(obj70);\n",
       "\n",
       "var obj71 = new THREE.Object3D();\n",
       "obj71.name = \"unnamed__72\";\n",
       "obj71.userData.explodable = 1;\n",
       "obj71.userData.points = [];\n",
       "obj71.userData.points.push(new PMPoint(0.470588, 0.882353, 0.000432526));\n",
       "obj71.userData.points.push(new PMPoint(0.507692, 0.861538, 0.000118343));\n",
       "obj71.userData.points.push(new PMPoint(0.492228, 0.870466, 1.34232e-05));\n",
       "\n",
       "obj71.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj71.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj71.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj71.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj71.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj71.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj71);\n",
       "scene.add(obj71);\n",
       "\n",
       "var obj72 = new THREE.Object3D();\n",
       "obj72.name = \"unnamed__73\";\n",
       "obj72.userData.explodable = 1;\n",
       "obj72.userData.points = [];\n",
       "obj72.userData.points.push(new PMPoint(0.470588, 0.882353, 0.000432526));\n",
       "obj72.userData.points.push(new PMPoint(0.438202, 0.898876, 6.31233e-05));\n",
       "obj72.userData.points.push(new PMPoint(0.450644, 0.892704, 0));\n",
       "\n",
       "obj72.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj72.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj72.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj72.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj72.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj72.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj72);\n",
       "scene.add(obj72);\n",
       "\n",
       "var obj73 = new THREE.Object3D();\n",
       "obj73.name = \"unnamed__74\";\n",
       "obj73.userData.explodable = 1;\n",
       "obj73.userData.points = [];\n",
       "obj73.userData.points.push(new PMPoint(0.384615, 0.923077, 0.00295858));\n",
       "obj73.userData.points.push(new PMPoint(0.438202, 0.898876, 6.31233e-05));\n",
       "obj73.userData.points.push(new PMPoint(0.423529, 0.905882, 1.7301e-05));\n",
       "\n",
       "obj73.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj73.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj73.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj73.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj73.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj73.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj73);\n",
       "scene.add(obj73);\n",
       "\n",
       "var obj74 = new THREE.Object3D();\n",
       "obj74.name = \"unnamed__75\";\n",
       "obj74.userData.explodable = 1;\n",
       "obj74.userData.points = [];\n",
       "obj74.userData.points.push(new PMPoint(0.384615, 0.923077, 0.00295858));\n",
       "obj74.userData.points.push(new PMPoint(0.324324, 0.945946, 9.13075e-05));\n",
       "obj74.userData.points.push(new PMPoint(0.342282, 0.939597, 2.25215e-05));\n",
       "\n",
       "obj74.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj74.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj74.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj74.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj74.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj74.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj74);\n",
       "scene.add(obj74);\n",
       "\n",
       "var obj75 = new THREE.Object3D();\n",
       "obj75.name = \"unnamed__76\";\n",
       "obj75.userData.explodable = 1;\n",
       "obj75.userData.points = [];\n",
       "obj75.userData.points.push(new PMPoint(0.28, 0.96, 0.0008));\n",
       "obj75.userData.points.push(new PMPoint(0.324324, 0.945946, 9.13075e-05));\n",
       "obj75.userData.points.push(new PMPoint(0.308108, 0.951351, 1.46092e-05));\n",
       "\n",
       "obj75.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj75.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj75.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj75.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj75.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj75.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj75);\n",
       "scene.add(obj75);\n",
       "\n",
       "var obj76 = new THREE.Object3D();\n",
       "obj76.name = \"unnamed__77\";\n",
       "obj76.userData.explodable = 1;\n",
       "obj76.userData.points = [];\n",
       "obj76.userData.points.push(new PMPoint(0.28, 0.96, 0.0008));\n",
       "obj76.userData.points.push(new PMPoint(0.219512, 0.97561, 0.000297442));\n",
       "obj76.userData.points.push(new PMPoint(0.246154, 0.969231, 2.95858e-05));\n",
       "\n",
       "obj76.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj76.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj76.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj76.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj76.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj76.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj76);\n",
       "scene.add(obj76);\n",
       "\n",
       "var obj77 = new THREE.Object3D();\n",
       "obj77.name = \"unnamed__78\";\n",
       "obj77.userData.explodable = 1;\n",
       "obj77.userData.points = [];\n",
       "obj77.userData.points.push(new PMPoint(0, 1, 0.125));\n",
       "obj77.userData.points.push(new PMPoint(0.219512, 0.97561, 0.000297442));\n",
       "obj77.userData.points.push(new PMPoint(0.180328, 0.983607, 0.000134372));\n",
       "\n",
       "obj77.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj77.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj77.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj77.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj77.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj77.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj77);\n",
       "scene.add(obj77);\n",
       "\n",
       "var obj78 = new THREE.Object3D();\n",
       "obj78.name = \"unnamed__79\";\n",
       "obj78.userData.explodable = 1;\n",
       "obj78.userData.points = [];\n",
       "obj78.userData.points.push(new PMPoint(0, 1, 0.125));\n",
       "obj78.userData.points.push(new PMPoint(-0.219512, 0.97561, 0.000297442));\n",
       "obj78.userData.points.push(new PMPoint(-0.180328, 0.983607, 0.000134372));\n",
       "\n",
       "obj78.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj78.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj78.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj78.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj78.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj78.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj78);\n",
       "scene.add(obj78);\n",
       "\n",
       "var obj79 = new THREE.Object3D();\n",
       "obj79.name = \"unnamed__80\";\n",
       "obj79.userData.explodable = 1;\n",
       "obj79.userData.points = [];\n",
       "obj79.userData.points.push(new PMPoint(-0.28, 0.96, 0.0008));\n",
       "obj79.userData.points.push(new PMPoint(-0.219512, 0.97561, 0.000297442));\n",
       "obj79.userData.points.push(new PMPoint(-0.246154, 0.969231, 2.95858e-05));\n",
       "\n",
       "obj79.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj79.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj79.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj79.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj79.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj79.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj79);\n",
       "scene.add(obj79);\n",
       "\n",
       "var obj80 = new THREE.Object3D();\n",
       "obj80.name = \"unnamed__81\";\n",
       "obj80.userData.explodable = 1;\n",
       "obj80.userData.points = [];\n",
       "obj80.userData.points.push(new PMPoint(-0.28, 0.96, 0.0008));\n",
       "obj80.userData.points.push(new PMPoint(-0.324324, 0.945946, 9.13075e-05));\n",
       "obj80.userData.points.push(new PMPoint(-0.308108, 0.951351, 1.46092e-05));\n",
       "\n",
       "obj80.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj80.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj80.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj80.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj80.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj80.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj80);\n",
       "scene.add(obj80);\n",
       "\n",
       "var obj81 = new THREE.Object3D();\n",
       "obj81.name = \"unnamed__82\";\n",
       "obj81.userData.explodable = 1;\n",
       "obj81.userData.points = [];\n",
       "obj81.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.00295858));\n",
       "obj81.userData.points.push(new PMPoint(-0.324324, 0.945946, 9.13075e-05));\n",
       "obj81.userData.points.push(new PMPoint(-0.342282, 0.939597, 2.25215e-05));\n",
       "\n",
       "obj81.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj81.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj81.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj81.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj81.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj81.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj81);\n",
       "scene.add(obj81);\n",
       "\n",
       "var obj82 = new THREE.Object3D();\n",
       "obj82.name = \"unnamed__83\";\n",
       "obj82.userData.explodable = 1;\n",
       "obj82.userData.points = [];\n",
       "obj82.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.00295858));\n",
       "obj82.userData.points.push(new PMPoint(-0.438202, 0.898876, 6.31233e-05));\n",
       "obj82.userData.points.push(new PMPoint(-0.423529, 0.905882, 1.7301e-05));\n",
       "\n",
       "obj82.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj82.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj82.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj82.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj82.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj82.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj82);\n",
       "scene.add(obj82);\n",
       "\n",
       "var obj83 = new THREE.Object3D();\n",
       "obj83.name = \"unnamed__84\";\n",
       "obj83.userData.explodable = 1;\n",
       "obj83.userData.points = [];\n",
       "obj83.userData.points.push(new PMPoint(-0.470588, 0.882353, 0.000432526));\n",
       "obj83.userData.points.push(new PMPoint(-0.438202, 0.898876, 6.31233e-05));\n",
       "obj83.userData.points.push(new PMPoint(-0.450644, 0.892704, 0));\n",
       "\n",
       "obj83.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj83.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj83.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj83.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj83.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj83.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj83);\n",
       "scene.add(obj83);\n",
       "\n",
       "var obj84 = new THREE.Object3D();\n",
       "obj84.name = \"unnamed__85\";\n",
       "obj84.userData.explodable = 1;\n",
       "obj84.userData.points = [];\n",
       "obj84.userData.points.push(new PMPoint(-0.470588, 0.882353, 0.000432526));\n",
       "obj84.userData.points.push(new PMPoint(-0.507692, 0.861538, 0.000118343));\n",
       "obj84.userData.points.push(new PMPoint(-0.492228, 0.870466, 1.34232e-05));\n",
       "\n",
       "obj84.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj84.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj84.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj84.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj84.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj84.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj84);\n",
       "scene.add(obj84);\n",
       "\n",
       "var obj85 = new THREE.Object3D();\n",
       "obj85.name = \"unnamed__86\";\n",
       "obj85.userData.explodable = 1;\n",
       "obj85.userData.points = [];\n",
       "obj85.userData.points.push(new PMPoint(-0.6, 0.8, 0.02));\n",
       "obj85.userData.points.push(new PMPoint(-0.507692, 0.861538, 0.000118343));\n",
       "obj85.userData.points.push(new PMPoint(-0.528302, 0.849057, 4.44998e-05));\n",
       "\n",
       "obj85.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj85.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj85.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj85.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj85.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj85.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj85);\n",
       "scene.add(obj85);\n",
       "\n",
       "var obj86 = new THREE.Object3D();\n",
       "obj86.name = \"unnamed__87\";\n",
       "obj86.userData.explodable = 1;\n",
       "obj86.userData.points = [];\n",
       "obj86.userData.points.push(new PMPoint(-0.6, 0.8, 0.02));\n",
       "obj86.userData.points.push(new PMPoint(-0.689655, 0.724138, 0.000148633));\n",
       "obj86.userData.points.push(new PMPoint(-0.670103, 0.742268, 5.31406e-05));\n",
       "\n",
       "obj86.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj86.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj86.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj86.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj86.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj86.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj86);\n",
       "scene.add(obj86);\n",
       "\n",
       "var obj87 = new THREE.Object3D();\n",
       "obj87.name = \"unnamed__88\";\n",
       "obj87.userData.explodable = 1;\n",
       "obj87.userData.points = [];\n",
       "obj87.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00059453));\n",
       "obj87.userData.points.push(new PMPoint(-0.689655, 0.724138, 0.000148633));\n",
       "obj87.userData.points.push(new PMPoint(-0.704142, 0.710059, 1.75064e-05));\n",
       "\n",
       "obj87.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj87.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj87.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj87.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj87.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj87.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj87);\n",
       "scene.add(obj87);\n",
       "\n",
       "var obj88 = new THREE.Object3D();\n",
       "obj88.name = \"unnamed__89\";\n",
       "obj88.userData.explodable = 1;\n",
       "obj88.userData.points = [];\n",
       "obj88.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00059453));\n",
       "obj88.userData.points.push(new PMPoint(-0.753425, 0.657534, 9.38262e-05));\n",
       "obj88.userData.points.push(new PMPoint(-0.742268, 0.670103, 1.32852e-05));\n",
       "\n",
       "obj88.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj88.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj88.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj88.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj88.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj88.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj88);\n",
       "scene.add(obj88);\n",
       "\n",
       "var obj89 = new THREE.Object3D();\n",
       "obj89.name = \"unnamed__90\";\n",
       "obj89.userData.explodable = 1;\n",
       "obj89.userData.points = [];\n",
       "obj89.userData.points.push(new PMPoint(-0.8, 0.6, 0.005));\n",
       "obj89.userData.points.push(new PMPoint(-0.753425, 0.657534, 9.38262e-05));\n",
       "obj89.userData.points.push(new PMPoint(-0.766423, 0.642336, 2.66397e-05));\n",
       "\n",
       "obj89.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj89.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj89.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj89.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj89.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj89.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj89);\n",
       "scene.add(obj89);\n",
       "\n",
       "var obj90 = new THREE.Object3D();\n",
       "obj90.name = \"unnamed__91\";\n",
       "obj90.userData.explodable = 1;\n",
       "obj90.userData.points = [];\n",
       "obj90.userData.points.push(new PMPoint(-0.8, 0.6, 0.005));\n",
       "obj90.userData.points.push(new PMPoint(-0.849057, 0.528302, 0.000177999));\n",
       "obj90.userData.points.push(new PMPoint(-0.834862, 0.550459, 4.2084e-05));\n",
       "\n",
       "obj90.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj90.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj90.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj90.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj90.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj90.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj90);\n",
       "scene.add(obj90);\n",
       "\n",
       "var obj91 = new THREE.Object3D();\n",
       "obj91.name = \"unnamed__92\";\n",
       "obj91.userData.explodable = 1;\n",
       "obj91.userData.points = [];\n",
       "obj91.userData.points.push(new PMPoint(-0.882353, 0.470588, 0.0017301));\n",
       "obj91.userData.points.push(new PMPoint(-0.849057, 0.528302, 0.000177999));\n",
       "obj91.userData.points.push(new PMPoint(-0.861538, 0.507692, 2.95858e-05));\n",
       "\n",
       "obj91.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj91.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj91.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj91.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj91.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj91.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj91);\n",
       "scene.add(obj91);\n",
       "\n",
       "var obj92 = new THREE.Object3D();\n",
       "obj92.name = \"unnamed__93\";\n",
       "obj92.userData.explodable = 1;\n",
       "obj92.userData.points = [];\n",
       "obj92.userData.points.push(new PMPoint(-0.882353, 0.470588, 0.0017301));\n",
       "obj92.userData.points.push(new PMPoint(-0.923077, 0.384615, 0.000739645));\n",
       "obj92.userData.points.push(new PMPoint(-0.905882, 0.423529, 6.92042e-05));\n",
       "\n",
       "obj92.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj92.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj92.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj92.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj92.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj92.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj92);\n",
       "scene.add(obj92);\n",
       "\n",
       "var obj93 = new THREE.Object3D();\n",
       "obj93.name = \"unnamed__94\";\n",
       "obj93.userData.explodable = 1;\n",
       "obj93.userData.points = [];\n",
       "obj93.userData.points.push(new PMPoint(-1, 0, 0.5));\n",
       "obj93.userData.points.push(new PMPoint(-0.923077, 0.384615, 0.000739645));\n",
       "obj93.userData.points.push(new PMPoint(-0.945946, 0.324324, 0.00036523));\n",
       "\n",
       "obj93.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj93.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj93.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj93.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj93.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj93.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj93);\n",
       "scene.add(obj93);\n",
       "\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "function textSpriteMaterial(message, parameters) {\n",
       "    if ( parameters === undefined ) parameters = {};\n",
       "    var fontface = \"Helvetica\";\n",
       "    var fontsize = parameters.hasOwnProperty(\"fontsize\") ? parameters[\"fontsize\"] : 15;\n",
       "    fontsize = fontsize*10;\n",
       "    var lines = message.split('\\\\n');\n",
       "    var size = 512;\n",
       "    for(var i = 0; i<lines.length; i++){\n",
       "        var tmp = lines[i].length;\n",
       "        while(tmp*fontsize > size){\n",
       "           fontsize--;\n",
       "        }\n",
       "    }\n",
       "    \n",
       "    var canvas = document.createElement('canvas');\n",
       "    canvas.width = size;\n",
       "    canvas.height = size;\n",
       "    var context = canvas.getContext('2d');\n",
       "    context.fillStyle = \"rgba(255, 255, 255, 0)\";\n",
       "    context.fill();\n",
       "    context.font = fontsize + \"px \" + fontface;\n",
       "    \n",
       "    // text color\n",
       "    context.fillStyle = \"rgba(0, 0, 0, 1.0)\";\n",
       "     for(var i = 0; i<lines.length; i++){\n",
       "        context.fillText(lines[i], size/2, size/2+i*fontsize);\n",
       "     }\n",
       "    \n",
       "    // canvas contents will be used for a texture\n",
       "    var texture = new THREE.Texture(canvas);\n",
       "    texture.needsUpdate = true;\n",
       "    \n",
       "    var spriteMaterial = new THREE.SpriteMaterial({map: texture, depthTest: true, depthWrite: false, polygonOffset: true, polygonOffsetFactor: -1, polygonOffsetUnits: 1 });\n",
       "    return spriteMaterial;\n",
       "}\n",
       "\n",
       "\n",
       "// ---------------------- INITIALIZING OBJECTS--------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "function init_object(obj) {\n",
       "    if (obj.userData.hasOwnProperty(\"pointmaterial\")) {\n",
       "        init_points(obj);\n",
       "        modelContains.points = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"pointlabels\")) {\n",
       "        init_pointlabels(obj);\n",
       "        modelContains.pointlabels = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"edgematerial\")) {\n",
       "        init_lines(obj);\n",
       "        modelContains.lines = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"edgelabels\")) {\n",
       "        init_edgelabels(obj);\n",
       "        modelContains.edgelabels = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"arrowstyle\")) {\n",
       "        init_arrowheads(obj);\n",
       "        modelContains.arrowheads = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"facetmaterial\")) {\n",
       "        init_faces(obj);\n",
       "        modelContains.faces = true;\n",
       "    }\n",
       "}\n",
       "\n",
       "function init_points(obj) {\n",
       "    var pointgroup = new THREE.Group();\n",
       "    pointgroup.name = \"points\";\n",
       "    var points = obj.userData.points;\n",
       "    var radii = obj.userData.pointradii;\n",
       "    var materials = obj.userData.pointmaterial;\n",
       "    var geometry,material;\n",
       "    if (!Array.isArray(radii)) {\n",
       "        geometry = new THREE.SphereBufferGeometry(radii);  \n",
       "    }\n",
       "    if (!Array.isArray(materials)) {\n",
       "        material = materials;\n",
       "    }\n",
       "    for (var i=0; i<points.length; i++) {\n",
       "        var point = points[i];\n",
       "        if (Array.isArray(radii)) {\n",
       "            if (radii[i] == 0) {\n",
       "                continue;\n",
       "            }\n",
       "            geometry = new THREE.SphereBufferGeometry(radii[i]);  \n",
       "        } \n",
       "        if (Array.isArray(materials)) {\n",
       "            material = materials[i];     \n",
       "        } \n",
       "        var sphere = new THREE.Mesh(geometry, material);\n",
       "        point.addSphere(sphere);\n",
       "        pointgroup.add(sphere);\n",
       "    }\n",
       "    obj.add(pointgroup);\n",
       "}\n",
       "\n",
       "function init_pointlabels(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var labels = obj.userData.pointlabels;\n",
       "    var pointlabels = new THREE.Group();\n",
       "    pointlabels.name = \"pointlabels\";\n",
       "    if (Array.isArray(labels)) {\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "            var spriteMaterial = textSpriteMaterial( labels[i] );\n",
       "\t        var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            point.addLabel(sprite);\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    } else {\n",
       "        var spriteMaterial = textSpriteMaterial( labels );\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "\t        var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            point.addLabel(sprite);\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    }\n",
       "    obj.add(pointlabels);\n",
       "}\n",
       "\n",
       "function init_lines(obj) {\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var points = obj.userData.points;\n",
       "    var materials = obj.userData.edgematerial;\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    var bufarr = new Float32Array( obj.userData.edgeindices.length * 3 );\n",
       "    var bufattr = new THREE.Float32BufferAttribute( bufarr, 3 );\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    geometry.setAttribute('position', bufattr);\n",
       "    if (Array.isArray(materials)) {     \n",
       "        for (var i=0; i<materials.length; i++) {\n",
       "            geometry.addGroup(2*i,2,i);\n",
       "        }\n",
       "    }\n",
       "    var lines = new THREE.LineSegments(geometry, materials);\n",
       "    lines.name = \"lines\";\n",
       "    obj.add(lines);\n",
       "    updateEdgesPosition(obj);\n",
       "}\n",
       "\n",
       "function init_edgelabels(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var labels = obj.userData.edgelabels;\n",
       "    var edgelabels = new THREE.Group();\n",
       "    edgelabels.name = \"edgelabels\";\n",
       "    if (Array.isArray(labels)) {\n",
       "        for (var i=0; i<edgeindices.length; i=i+2) {\n",
       "            var point = points[i];\n",
       "            var spriteMaterial = textSpriteMaterial( labels[i] );\n",
       "            var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[i]].vector,points[edgeindices[i+1]].vector).multiplyScalar(0.5));\n",
       "            edgelabels.add(sprite);\n",
       "        }\n",
       "    } else {\n",
       "        var spriteMaterial = textSpriteMaterial( labels );\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "            var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[i]].vector,points[edgeindices[i+1]].vector).multiplyScalar(0.5));\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    }\n",
       "    obj.add(edgelabels);\n",
       "}\n",
       "\n",
       "function init_arrowheads(obj) {\n",
       "    var arrowheads = new THREE.Group();\n",
       "    arrowheads.name = \"arrowheads\";\n",
       "    var arrowstyle = obj.userData.arrowstyle;\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var edgematerials = obj.userData.edgematerial;\n",
       "    var points = obj.userData.points;\n",
       "    var material;\n",
       "    if (!Array.isArray(edgematerials)) {\n",
       "        material = new THREE.MeshBasicMaterial( {color: edgematerials.color} );\n",
       "    }\n",
       "\n",
       "    for (var i=0; i<edgeindices.length; i=i+2) {\n",
       "        var start = points[edgeindices[i]];\n",
       "        var end = points[edgeindices[i+1]];\n",
       "        var dist = start.vector.distanceTo( end.vector ) - start.radius() - end.radius();\n",
       "        if (dist <= 0) {\n",
       "            continue;\n",
       "        }\n",
       "        var dir = new THREE.Vector3().subVectors(end.vector,start.vector);\n",
       "        dir.normalize();\n",
       "        var axis = new THREE.Vector3().set(dir.z,0,-dir.x);\n",
       "        axis.normalize();\n",
       "        var radians = Math.acos( dir.y );\n",
       "        var radius = dist/25;\n",
       "        var height = dist/5;\n",
       "        var geometry = new THREE.ConeBufferGeometry(radius,height);\n",
       "        var position = new THREE.Vector3().addVectors(start.vector,dir.clone().multiplyScalar(start.radius()+dist-height/2));\n",
       "        if (Array.isArray(edgematerials)) {\n",
       "            material = new THREE.MeshBasicMaterial( {color: edgematerials[i].color} );\n",
       "        }\n",
       "        var cone = new THREE.Mesh( geometry, material );\n",
       "        cone.quaternion.setFromAxisAngle(axis,radians);;\n",
       "        cone.position.copy(position);;\n",
       "        arrowheads.add(cone);\n",
       "    }\n",
       "    obj.add(arrowheads);\n",
       "}\n",
       "\n",
       "function init_faces(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var facets = obj.userData.facets;\n",
       "    obj.userData.triangleindices = [];\n",
       "    for (var i=0; i<facets.length; i++) {\n",
       "        facet = facets[i];\n",
       "        for (var t=0; t<facet.length-2; t++) {\n",
       "            obj.userData.triangleindices.push(facet[0],facet[t+1],facet[t+2]);  \n",
       "        }\n",
       "    }\n",
       "    var bufarr = new Float32Array( obj.userData.triangleindices.length * 3 );\n",
       "    var bufattr = new THREE.Float32BufferAttribute(bufarr,3);\n",
       "    \n",
       "    var materials = obj.userData.facetmaterial;\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    geometry.setAttribute('position',bufattr);\n",
       "    if (Array.isArray(materials)) {\n",
       "        var tricount = 0;\n",
       "        var facet;\n",
       "        for (var i=0; i<facets.length; i++) {\n",
       "            facet = facets[i];\n",
       "            geometry.addGroup(tricount,(facet.length-2)*3,i);\n",
       "            tricount += (facet.length-2)*3;\n",
       "        }\n",
       "    }\n",
       "    var mesh = new THREE.Mesh(geometry, materials);\n",
       "    mesh.name = \"faces\";\n",
       "    obj.add(mesh); \n",
       "    updateFacesPosition(obj);\n",
       "}\n",
       "// //INITIALIZING\n",
       "\n",
       "\n",
       "function updateFacesPosition(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var indices = obj.userData.triangleindices;\n",
       "    var faces = obj.getObjectByName(\"faces\");\n",
       "    var ba = faces.geometry.getAttribute(\"position\");\n",
       "    for (var i=0; i<indices.length; i++) {\n",
       "        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); \n",
       "    }\n",
       "    faces.geometry.attributes.position.needsUpdate = true;\n",
       "    \n",
       "}\n",
       "\n",
       "function updateEdgesPosition(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var indices = obj.userData.edgeindices;\n",
       "    var lines = obj.getObjectByName(\"lines\");\n",
       "    var ba = lines.geometry.getAttribute(\"position\"); \n",
       "    for (var i=0; i<indices.length; i++) {\n",
       "        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); \n",
       "    }\n",
       "    lines.geometry.attributes.position.needsUpdate = true;\n",
       "}\n",
       "\n",
       "function onWindowResize() {\n",
       "    renderer.setSize( three.clientWidth, three.clientHeight );\n",
       "    svgRenderer.setSize( three.clientWidth, three.clientHeight );\n",
       "    updateCamera();\n",
       "}\n",
       "\n",
       "function updateCamera() {\n",
       "    var width = three.clientWidth;\n",
       "    var height = three.clientHeight;\n",
       "    var aspect = width / height;\n",
       "    if (camera.type == \"OrthographicCamera\") {\n",
       "        camera.left = frustumSize * aspect / - 2;\n",
       "        camera.right = frustumSize * aspect / 2;\n",
       "        camera.top = frustumSize / 2;\n",
       "        camera.bottom = - frustumSize / 2;\n",
       "    } else if (camera.type == \"PerspectiveCamera\") {\n",
       "        camera.aspect = aspect;\n",
       "    }\n",
       "    camera.updateProjectionMatrix();\n",
       "}\n",
       "\n",
       "function changeCamera(event) {\n",
       "    var selindex = event.currentTarget.selectedIndex;\n",
       "    camera = cameras[selindex];\n",
       "    control = controls[selindex];\n",
       "    control.enabled = true; \n",
       "    for (var i=0; i<controls.length; i++) {\n",
       "        if (i!=selindex) {\n",
       "            controls[i].enabled = false;\n",
       "        }\n",
       "    }\n",
       "    updateCamera();\n",
       "}\n",
       "\n",
       "var camtypenode = document.getElementById('cameraType_2');\n",
       "camtypenode.onchange = changeCamera;\n",
       "camtypenode.dispatchEvent(new Event('change'));\n",
       "\n",
       "onWindowResize();\n",
       "window.addEventListener('resize', onWindowResize);\t\n",
       "\n",
       "\n",
       "var xRotationEnabled = false;\n",
       "var yRotationEnabled = false;\n",
       "var zRotationEnabled = false;\n",
       "var rotationSpeedFactor = 1;\n",
       "var settingsShown = false;\n",
       "var labelsShown = true;\n",
       "var intervals = [];\n",
       "var timeouts = [];\n",
       "var explodingSpeed = 0.05;\n",
       "var explodeScale = 0;\n",
       "var XMLS = new XMLSerializer();\n",
       "var svgElement;\n",
       "var renderId;\n",
       "\n",
       "var render = function () {\n",
       "\n",
       "\trenderId = requestAnimationFrame(render);\n",
       "\n",
       "//\tcomment in for automatic explosion\n",
       "//\texplode(updateFactor());\n",
       "\n",
       "    var phi = 0.02 * rotationSpeedFactor;\n",
       "\n",
       "    if (xRotationEnabled) {\n",
       "        scene.rotation.x += phi;\n",
       "    }\n",
       "    if (yRotationEnabled) {\n",
       "        scene.rotation.y += phi;\n",
       "    }\n",
       "    if (zRotationEnabled) {\n",
       "        scene.rotation.z += phi;\n",
       "    }\n",
       "\n",
       "    control.update();\n",
       "    renderer.render(scene, camera);\n",
       "};\n",
       "\n",
       "if ( THREE.WEBGL.isWebGLAvailable() ) {\n",
       "\trender();\n",
       "} else {\n",
       "\tvar warning = WEBGL.getWebGLErrorMessage();\n",
       "\tthree.appendChild( warning );\n",
       "}\n",
       "    \n",
       "function changeTransparency() {\n",
       "    var opacity = 1-Number(event.currentTarget.value);\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        child = scene.children[i];\n",
       "        if ( child.userData.hasOwnProperty(\"facetmaterial\") ) {\n",
       "            if (Array.isArray(child.userData.facetmaterial)) {\n",
       "                for (var j=0; j<child.userData.facetmaterial.length; j++) {\n",
       "                    child.userData.facetmaterial[j].opacity = opacity;\n",
       "                }\n",
       "            } else {\n",
       "                child.userData.facetmaterial.opacity = opacity;\n",
       "            }    \n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function changeRotationX(event){\n",
       "    xRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "function changeRotationY(event){\n",
       "    yRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "function changeRotationZ(event){\n",
       "    zRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "\n",
       "function changeRotationSpeedFactor(event){\n",
       "    rotationSpeedFactor = Number(event.currentTarget.value);\n",
       "}\n",
       "\n",
       "function resetScene(){\n",
       "    scene.rotation.set(0,0,0);\n",
       "    camera.position.set(0,0,5);\n",
       "    camera.up.set(0,1,0);\n",
       "}\n",
       "\n",
       "function showSettings(event){\n",
       "    document.getElementById('settings_2').style.visibility = 'visible';\n",
       "    document.getElementById('showSettingsButton_2').style.visibility = 'hidden';\n",
       "    document.getElementById('hideSettingsButton_2').style.visibility = 'visible';\n",
       "    settingsShown = true;\n",
       "}\n",
       "\n",
       "function hideSettings(event){\n",
       "    document.getElementById('settings_2').style.visibility = 'hidden';\n",
       "    document.getElementById('showSettingsButton_2').style.visibility = 'visible';\n",
       "    document.getElementById('hideSettingsButton_2').style.visibility = 'hidden';\n",
       "    settingsShown = false;\n",
       "}\n",
       "\n",
       "\n",
       "\n",
       "var pos = 150* Math.PI;\n",
       "\n",
       "function updateFactor() {\n",
       "    pos++;\n",
       "    return Math.sin(.01*pos)+1;\n",
       "}\n",
       "\n",
       "// ------------------------ FOLDING ------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "// rotate point p around axis defined by points p1 and p2 by given angle\n",
       "function rotate(p, p1, p2, angle ){   \n",
       "    angle = -angle;\n",
       "    var x = p.x, y = p.y, z = p.z, \n",
       "    a = p1.x, b = p1.y, c = p1.z, \n",
       "    u = p2.x-p1.x, v = p2.y-p1.y, w = p2.z-p1.z;\n",
       "    var result = [];\n",
       "    var L = u*u + v*v + w*w;\n",
       "    var sqrt = Math.sqrt;\n",
       "    var cos = Math.cos;\n",
       "    var sin = Math.sin;\n",
       "\n",
       "    result[0] = ((a*(v*v+w*w)-u*(b*v+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*x*cos(angle)+sqrt(L)*(-c*v+b*w-w*y+v*z)*sin(angle))/L;\n",
       "    result[1] = ((b*(u*u+w*w)-v*(a*u+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*y*cos(angle)+sqrt(L)*(c*u-a*w+w*x-u*z)*sin(angle))/L;\n",
       "    result[2] = ((c*(u*u+v*v)-w*(a*u+b*v-u*x-v*y-w*z))*(1-cos(angle))+L*z*cos(angle)+sqrt(L)*(-b*u+a*v-v*x+u*y)*sin(angle))/L;\n",
       "\n",
       "    return result;\n",
       "}\n",
       "\n",
       "var fold = function(event){\n",
       "    var obj = foldables[Number(event.currentTarget.name)];\n",
       "    var foldvalue = Number(event.currentTarget.value);\n",
       "    var scale = foldvalue - obj.userData.oldscale;\n",
       "\n",
       "    for (var j=0; j<obj.userData.axes.length; j++) {\n",
       "        rotateVertices(obj, j, scale);\n",
       "    }\n",
       "    update(obj);\n",
       "    obj.userData.oldscale += scale;\n",
       "    lookAtBarycenter(obj);\n",
       "}\n",
       "\n",
       "function lookAtBarycenter(obj){\n",
       "    control.target = barycenter(obj);\n",
       "}\n",
       "\n",
       "function barycenter(obj) {\n",
       "    var center = new THREE.Vector3(0,0,0);\n",
       "    var points = obj.userData.points;\n",
       "    for (var i=0; i<points.length; i++){\n",
       "        center.add(points[i].vector);\n",
       "    }\n",
       "    center.divideScalar(points.length);\n",
       "    return center;\n",
       "}\n",
       "\n",
       "function rotateVertices(obj, edge, scale) {\n",
       "    var axes = obj.userData.axes;\n",
       "    var subtrees = obj.userData.subtrees;\n",
       "    var points = obj.userData.points;\n",
       "    var angles = obj.userData.angles;\n",
       "    if (edge < axes.length){\n",
       "        for (var j=0; j<subtrees[edge].length; j++){\n",
       "            var rotP = rotate(points[subtrees[edge][j]].vector, points[axes[edge][0]].vector,points[axes[edge][1]].vector, scale * (Math.PI - angles[edge]));\n",
       "            points[subtrees[edge][j]].set(rotP[0],rotP[1],rotP[2]);\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function update(obj) {\n",
       "   updateFacesPosition(obj);\n",
       "   updateEdgesPosition(obj);\n",
       "}\n",
       "\n",
       "if (foldables.length) {\n",
       "    var settings = document.getElementById('settings_2');\n",
       "    var foldDiv = document.createElement('div');\n",
       "    foldDiv.id = 'fold_2';\n",
       "    var title = document.createElement('strong');\n",
       "    title.innerHTML = 'Fold';\n",
       "    foldDiv.appendChild(title);\n",
       "    foldDiv.className = 'group';\n",
       "    for (var i=0; i<foldables.length; i++) {\n",
       "        var range = document.createElement('input');\n",
       "        range.type = 'range';\n",
       "        range.min = 0;\n",
       "        range.max = 1;\n",
       "        range.value = 0;\n",
       "        range.step = 0.001;\n",
       "        range.name = String(i);\n",
       "        range.oninput = fold;\n",
       "        foldDiv.appendChild(range);\n",
       "    }\n",
       "    lookAtBarycenter(foldables[0]);\n",
       "    settings.insertBefore(foldDiv,settings.childNodes[0]);\n",
       "}\n",
       "\n",
       "    \n",
       "// ---------------------- EXPLOSION ------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "if (explodableModel) {\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        obj = scene.children[i];\n",
       "        if ( obj.userData.explodable ) {\n",
       "            computeCentroid(obj);\n",
       "        }\n",
       "    }\n",
       "    document.getElementById('explodeRange_2').oninput = triggerExplode;\n",
       "    document.getElementById('explodeCheckbox_2').onchange = triggerAutomaticExplode;\n",
       "    document.getElementById('explodingSpeedRange_2').oninput = setExplodingSpeed;\n",
       "}\n",
       "\n",
       "function computeCentroid(obj) {\n",
       "    centroid = new THREE.Vector3();\n",
       "    obj.userData.points.forEach(function(pmpoint) {\n",
       "        centroid.add(pmpoint.vector);\t\t\t\n",
       "    });\n",
       "    centroid.divideScalar(obj.userData.points.length);\n",
       "    obj.userData.centroid = centroid;\n",
       "}\n",
       "\n",
       "function explode(factor) {\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        var obj = scene.children[i];\n",
       "        if (obj.userData.hasOwnProperty(\"centroid\")) { \n",
       "            var c = obj.userData.centroid;\n",
       "            obj.position.set(c.x*factor, c.y*factor, c.z*factor);\n",
       "        }\n",
       "    }\t\n",
       "}\n",
       "\n",
       "function triggerExplode(event){\n",
       "    explodeScale = Number(event.currentTarget.value);\n",
       "    explode(explodeScale);\n",
       "}\n",
       "\n",
       "function setExplodingSpeed(event){\n",
       "    explodingSpeed = Number(event.currentTarget.value);\n",
       "}\n",
       "\n",
       "function triggerAutomaticExplode(event){\n",
       "    if (event.currentTarget.checked){\n",
       "        startExploding();\n",
       "    } else {\n",
       "        clearIntervals();\n",
       "    }\t\n",
       "}\n",
       "\n",
       "function startExploding(){\n",
       "    intervals.push(setInterval(explodingInterval, 25));\n",
       "}\n",
       "\n",
       "\n",
       "function explodingInterval(){\n",
       "    explodeScale += explodingSpeed;\n",
       "    if (explodeScale <= 6){ \n",
       "        explode(explodeScale);\n",
       "    }\n",
       "    else{\n",
       "        explode(6);\n",
       "        explodeScale = 6;\n",
       "        clearIntervals();\n",
       "        timeouts.push(setTimeout(startUnexploding, 3000));\n",
       "    }\n",
       "    document.getElementById('explodeRange_2').value = explodeScale;\n",
       "}\n",
       "\n",
       "\n",
       "function startUnexploding(){\n",
       "    intervals.push(setInterval(unexplodingInterval, 25));\n",
       "}\n",
       "\n",
       "function unexplodingInterval(){\n",
       "    explodeScale -= explodingSpeed;\n",
       "    if (explodeScale >= 0){\t\n",
       "        explode(explodeScale);\n",
       "    }\n",
       "    else {\n",
       "        explode(0);\n",
       "        explodeScale = 0;\n",
       "        clearIntervals();\n",
       "        timeouts.push(setTimeout(startExploding, 3000));\n",
       "    }\n",
       "    document.getElementById('explodeRange_2').value = explodeScale;\n",
       "}\n",
       "\n",
       "function clearIntervals(){\n",
       "    intervals.forEach(function(interval){\n",
       "        clearInterval(interval);\n",
       "    });\n",
       "    intervals = [];\n",
       "    timeouts.forEach(function(timeout){\n",
       "        clearTimeout(timeout);\n",
       "    });\n",
       "    timeouts = [];\n",
       "}\n",
       "\n",
       "// ---------------------- DISPLAY --------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "const objectTypeInnerHTMLs = { points: \"Points\", pointlabels: \"Point labels\", lines: \"Edges\", edgelabels: \"Edge labels\", faces: \"Faces\", arrowheads: \"Arrow heads\" };\n",
       "const objectTypeVisible = {};\n",
       "Object.assign(objectTypeVisible,modelContains);\n",
       "const sortedObjectTypeKeys = Object.keys(objectTypeInnerHTMLs).sort();\n",
       "const shownObjectTypesList = document.getElementById('shownObjectTypesList_2');\n",
       "\n",
       "function setVisibility(bool,objname) {\n",
       "    for (var i=0; i<scene.children.length; i++){\n",
       "        var obj = scene.children[i].getObjectByName(objname);\n",
       "        if (obj) {\n",
       "            obj.visible = bool;\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function toggleObjectTypeVisibility(event){\n",
       "    var name = event.currentTarget.name;\n",
       "    var checked = event.currentTarget.checked;\n",
       "    objectTypeVisible[name] = checked;\n",
       "    setVisibility(checked,name);\n",
       "}\n",
       "\n",
       "for (var i=0; i<sortedObjectTypeKeys.length; i++){\n",
       "    var key = sortedObjectTypeKeys[i];\n",
       "    if (modelContains[key]) {\n",
       "        var objTypeNode = document.createElement('span');\n",
       "        objTypeNode.innerHTML = objectTypeInnerHTMLs[key] + '<br>';\n",
       "        var checkbox = document.createElement('input');\n",
       "        checkbox.type = 'checkbox';\n",
       "        checkbox.checked = true;\n",
       "        checkbox.name = key;\n",
       "        checkbox.onchange = toggleObjectTypeVisibility;\n",
       "        shownObjectTypesList.appendChild(checkbox);\n",
       "        shownObjectTypesList.appendChild(objTypeNode);\n",
       "    }\n",
       "}\n",
       "\n",
       "// ------------------------------------------------------\n",
       "\n",
       "function toggleObjectVisibility(event){\n",
       "    var nr = Number(event.currentTarget.name);\n",
       "    scene.children[nr].visible = event.currentTarget.checked;\n",
       "}\n",
       "\n",
       "// append checkboxes for displaying or hiding objects\n",
       "var shownObjectsList = document.getElementById('shownObjectsList_2');\n",
       "for (var i=0; i<scene.children.length; i++){\n",
       "    obj = scene.children[i];\n",
       "    var objNode = document.createElement('span');\n",
       "    objNode.innerHTML = obj.name + '<br>';\n",
       "    var checkbox = document.createElement('input');\n",
       "    checkbox.type = 'checkbox';\n",
       "    checkbox.checked = true;\n",
       "    checkbox.name = String(i);\n",
       "    checkbox.onchange = toggleObjectVisibility;\n",
       "    shownObjectsList.appendChild(checkbox);\n",
       "    shownObjectsList.appendChild(objNode);\n",
       "}\n",
       "\n",
       "// ---------------------- SVG ------------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "function takeSvgScreenshot() {\n",
       "    if (objectTypeVisible[\"pointlabels\"]) {\n",
       "        setVisibility(false,\"pointlabels\");\n",
       "    }\n",
       "    if (objectTypeVisible[\"edgelabels\"]) {\n",
       "        setVisibility(false,\"edgelabels\");\n",
       "    }\n",
       "    svgRenderer.render(scene,camera);\n",
       "    svgElement = XMLS.serializeToString(svgRenderer.domElement);\n",
       "    \n",
       "    if (objectTypeVisible[\"pointlabels\"]) {\n",
       "        setVisibility(true,\"pointlabels\");\n",
       "    }\n",
       "    if (objectTypeVisible[\"edgelabels\"]) {\n",
       "        setVisibility(true,\"edgelabels\");\n",
       "    }\n",
       "\n",
       "    if (document.getElementById('tab_2').checked){\n",
       "        //show in new tab\n",
       "        var myWindow = window.open(\"\",\"\");\n",
       "        myWindow.document.body.innerHTML = svgElement;\n",
       "    } else{\n",
       "        // download svg file \n",
       "        download(\"screenshot.svg\", svgElement);\n",
       "    }\n",
       "}\n",
       "\n",
       "function download(filename, text) {\n",
       "    var element = document.createElement('a');\n",
       "    element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));\n",
       "    element.setAttribute('download', filename);\n",
       "\n",
       "    element.style.display = 'none';\n",
       "    document.body.appendChild(element);\n",
       "\n",
       "    element.click();\n",
       "\n",
       "    document.body.removeChild(element);\n",
       "}\n",
       "\n",
       "\n",
       "document.getElementById('transparencyRange_2').oninput = changeTransparency;\n",
       "document.getElementById('changeRotationX_2').onchange = changeRotationX;\n",
       "document.getElementById('changeRotationY_2').onchange = changeRotationY;\n",
       "document.getElementById('changeRotationZ_2').onchange = changeRotationZ;\n",
       "document.getElementById('resetButton_2').onclick = resetScene;\n",
       "document.getElementById('rotationSpeedRange_2').oninput = changeRotationSpeedFactor;\n",
       "document.getElementById('takeScreenshot_2').onclick = takeSvgScreenshot;\n",
       "document.getElementById('showSettingsButton_2').onclick = showSettings;\n",
       "document.getElementById('hideSettingsButton_2').onclick = hideSettings;\n",
       "\n",
       "\n",
       "// ------------------ SHORTCUTS --------------------------------------------\n",
       "// -------------------------------------------------------------------------\n",
       "\n",
       "/**\n",
       " * http://www.openjs.com/scripts/events/keyboard_shortcuts/\n",
       " * Version : 2.01.B\n",
       " * By Binny V A\n",
       " * License : BSD\n",
       " */\n",
       "shortcut = {\n",
       "\t'all_shortcuts':{},//All the shortcuts are stored in this array\n",
       "\t'add': function(shortcut_combination,callback,opt) {\n",
       "\t\t//Provide a set of default options\n",
       "\t\tvar default_options = {\n",
       "\t\t\t'type':'keydown',\n",
       "\t\t\t'propagate':false,\n",
       "\t\t\t'disable_in_input':false,\n",
       "\t\t\t'target':document,\n",
       "\t\t\t'keycode':false\n",
       "\t\t}\n",
       "\t\tif(!opt) opt = default_options;\n",
       "\t\telse {\n",
       "\t\t\tfor(var dfo in default_options) {\n",
       "\t\t\t\tif(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo];\n",
       "\t\t\t}\n",
       "\t\t}\n",
       "\n",
       "\t\tvar ele = opt.target;\n",
       "\t\tif(typeof opt.target == 'string') ele = document.getElementById(opt.target);\n",
       "\t\tvar ths = this;\n",
       "\t\tshortcut_combination = shortcut_combination.toLowerCase();\n",
       "\n",
       "\t\t//The function to be called at keypress\n",
       "\t\tvar func = function(e) {\n",
       "\t\t\te = e || window.event;\n",
       "\t\t\t\n",
       "\t\t\tif(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields\n",
       "\t\t\t\tvar element;\n",
       "\t\t\t\tif(e.target) element=e.target;\n",
       "\t\t\t\telse if(e.srcElement) element=e.srcElement;\n",
       "\t\t\t\tif(element.nodeType==3) element=element.parentNode;\n",
       "\n",
       "\t\t\t\tif(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return;\n",
       "\t\t\t}\n",
       "\t\n",
       "\t\t\t//Find Which key is pressed\n",
       "\t\t\tif (e.keyCode) code = e.keyCode;\n",
       "\t\t\telse if (e.which) code = e.which;\n",
       "\t\t\tvar character = String.fromCharCode(code).toLowerCase();\n",
       "\t\t\t\n",
       "\t\t\tif(code == 188) character=\",\"; //If the user presses , when the type is onkeydown\n",
       "\t\t\tif(code == 190) character=\".\"; //If the user presses , when the type is onkeydown\n",
       "\n",
       "\t\t\tvar keys = shortcut_combination.split(\"+\");\n",
       "\t\t\t//Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked\n",
       "\t\t\tvar kp = 0;\n",
       "\t\t\t\n",
       "\t\t\t//Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken\n",
       "\t\t\tvar shift_nums = {\n",
       "\t\t\t\t\"`\":\"~\",\n",
       "\t\t\t\t\"1\":\"!\",\n",
       "\t\t\t\t\"2\":\"@\",\n",
       "\t\t\t\t\"3\":\"#\",\n",
       "\t\t\t\t\"4\":\"$\",\n",
       "\t\t\t\t\"5\":\"%\",\n",
       "\t\t\t\t\"6\":\"^\",\n",
       "\t\t\t\t\"7\":\"&\",\n",
       "\t\t\t\t\"8\":\"*\",\n",
       "\t\t\t\t\"9\":\"(\",\n",
       "\t\t\t\t\"0\":\")\",\n",
       "\t\t\t\t\"-\":\"_\",\n",
       "\t\t\t\t\"=\":\"+\",\n",
       "\t\t\t\t\";\":\":\",\n",
       "\t\t\t\t\"'\":\"\\\"\",\n",
       "\t\t\t\t\",\":\"<\",\n",
       "\t\t\t\t\".\":\">\",\n",
       "\t\t\t\t\"/\":\"?\",\n",
       "\t\t\t\t\"\\\\\":\"|\"\n",
       "\t\t\t}\n",
       "\t\t\t//Special Keys - and their codes\n",
       "\t\t\tvar special_keys = {\n",
       "\t\t\t\t'esc':27,\n",
       "\t\t\t\t'escape':27,\n",
       "\t\t\t\t'tab':9,\n",
       "\t\t\t\t'space':32,\n",
       "\t\t\t\t'return':13,\n",
       "\t\t\t\t'enter':13,\n",
       "\t\t\t\t'backspace':8,\n",
       "\t\n",
       "\t\t\t\t'scrolllock':145,\n",
       "\t\t\t\t'scroll_lock':145,\n",
       "\t\t\t\t'scroll':145,\n",
       "\t\t\t\t'capslock':20,\n",
       "\t\t\t\t'caps_lock':20,\n",
       "\t\t\t\t'caps':20,\n",
       "\t\t\t\t'numlock':144,\n",
       "\t\t\t\t'num_lock':144,\n",
       "\t\t\t\t'num':144,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'pause':19,\n",
       "\t\t\t\t'break':19,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'insert':45,\n",
       "\t\t\t\t'home':36,\n",
       "\t\t\t\t'delete':46,\n",
       "\t\t\t\t'end':35,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'pageup':33,\n",
       "\t\t\t\t'page_up':33,\n",
       "\t\t\t\t'pu':33,\n",
       "\t\n",
       "\t\t\t\t'pagedown':34,\n",
       "\t\t\t\t'page_down':34,\n",
       "\t\t\t\t'pd':34,\n",
       "\t\n",
       "\t\t\t\t'left':37,\n",
       "\t\t\t\t'up':38,\n",
       "\t\t\t\t'right':39,\n",
       "\t\t\t\t'down':40,\n",
       "\t\n",
       "\t\t\t\t'f1':112,\n",
       "\t\t\t\t'f2':113,\n",
       "\t\t\t\t'f3':114,\n",
       "\t\t\t\t'f4':115,\n",
       "\t\t\t\t'f5':116,\n",
       "\t\t\t\t'f6':117,\n",
       "\t\t\t\t'f7':118,\n",
       "\t\t\t\t'f8':119,\n",
       "\t\t\t\t'f9':120,\n",
       "\t\t\t\t'f10':121,\n",
       "\t\t\t\t'f11':122,\n",
       "\t\t\t\t'f12':123\n",
       "\t\t\t}\n",
       "\t\n",
       "\t\t\tvar modifiers = { \n",
       "\t\t\t\tshift: { wanted:false, pressed:false},\n",
       "\t\t\t\tctrl : { wanted:false, pressed:false},\n",
       "\t\t\t\talt  : { wanted:false, pressed:false},\n",
       "\t\t\t\tmeta : { wanted:false, pressed:false}\t//Meta is Mac specific\n",
       "\t\t\t};\n",
       "                        \n",
       "\t\t\tif(e.ctrlKey)\tmodifiers.ctrl.pressed = true;\n",
       "\t\t\tif(e.shiftKey)\tmodifiers.shift.pressed = true;\n",
       "\t\t\tif(e.altKey)\tmodifiers.alt.pressed = true;\n",
       "\t\t\tif(e.metaKey)   modifiers.meta.pressed = true;\n",
       "                        \n",
       "\t\t\tfor(var i=0; k=keys[i],i<keys.length; i++) {\n",
       "\t\t\t\t//Modifiers\n",
       "\t\t\t\tif(k == 'ctrl' || k == 'control') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.ctrl.wanted = true;\n",
       "\n",
       "\t\t\t\t} else if(k == 'shift') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.shift.wanted = true;\n",
       "\n",
       "\t\t\t\t} else if(k == 'alt') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.alt.wanted = true;\n",
       "\t\t\t\t} else if(k == 'meta') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.meta.wanted = true;\n",
       "\t\t\t\t} else if(k.length > 1) { //If it is a special key\n",
       "\t\t\t\t\tif(special_keys[k] == code) kp++;\n",
       "\t\t\t\t\t\n",
       "\t\t\t\t} else if(opt['keycode']) {\n",
       "\t\t\t\t\tif(opt['keycode'] == code) kp++;\n",
       "\n",
       "\t\t\t\t} else { //The special keys did not match\n",
       "\t\t\t\t\tif(character == k) kp++;\n",
       "\t\t\t\t\telse {\n",
       "\t\t\t\t\t\tif(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase\n",
       "\t\t\t\t\t\t\tcharacter = shift_nums[character]; \n",
       "\t\t\t\t\t\t\tif(character == k) kp++;\n",
       "\t\t\t\t\t\t}\n",
       "\t\t\t\t\t}\n",
       "\t\t\t\t}\n",
       "\t\t\t}\n",
       "\t\t\t\n",
       "\t\t\tif(kp == keys.length && \n",
       "\t\t\t\t\t\tmodifiers.ctrl.pressed == modifiers.ctrl.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.shift.pressed == modifiers.shift.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.alt.pressed == modifiers.alt.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.meta.pressed == modifiers.meta.wanted) {\n",
       "\t\t\t\tcallback(e);\n",
       "\t\n",
       "\t\t\t\tif(!opt['propagate']) { //Stop the event\n",
       "\t\t\t\t\t//e.cancelBubble is supported by IE - this will kill the bubbling process.\n",
       "\t\t\t\t\te.cancelBubble = true;\n",
       "\t\t\t\t\te.returnValue = false;\n",
       "\t\n",
       "\t\t\t\t\t//e.stopPropagation works in Firefox.\n",
       "\t\t\t\t\tif (e.stopPropagation) {\n",
       "\t\t\t\t\t\te.stopPropagation();\n",
       "\t\t\t\t\t\te.preventDefault();\n",
       "\t\t\t\t\t}\n",
       "\t\t\t\t\treturn false;\n",
       "\t\t\t\t}\n",
       "\t\t\t}\n",
       "\t\t}\n",
       "\t\tthis.all_shortcuts[shortcut_combination] = {\n",
       "\t\t\t'callback':func, \n",
       "\t\t\t'target':ele, \n",
       "\t\t\t'event': opt['type']\n",
       "\t\t};\n",
       "\t\t//Attach the function with the event\n",
       "\t\tif(ele.addEventListener) ele.addEventListener(opt['type'], func, false);\n",
       "\t\telse if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func);\n",
       "\t\telse ele['on'+opt['type']] = func;\n",
       "\t},\n",
       "\n",
       "\t//Remove the shortcut - just specify the shortcut and I will remove the binding\n",
       "\t'remove':function(shortcut_combination) {\n",
       "\t\tshortcut_combination = shortcut_combination.toLowerCase();\n",
       "\t\tvar binding = this.all_shortcuts[shortcut_combination];\n",
       "\t\tdelete(this.all_shortcuts[shortcut_combination])\n",
       "\t\tif(!binding) return;\n",
       "\t\tvar type = binding['event'];\n",
       "\t\tvar ele = binding['target'];\n",
       "\t\tvar callback = binding['callback'];\n",
       "\n",
       "\t\tif(ele.detachEvent) ele.detachEvent('on'+type, callback);\n",
       "\t\telse if(ele.removeEventListener) ele.removeEventListener(type, callback, false);\n",
       "\t\telse ele['on'+type] = false;\n",
       "\t}\n",
       "}\n",
       "\n",
       "shortcut.add(\"Alt+Left\",function() {\n",
       "\tvar event = new Event('click');\n",
       "\tif (settingsShown){\n",
       "\t\tdocument.getElementById('hideSettingsButton_2').dispatchEvent(event);\n",
       "\t} else {\n",
       "\t\tdocument.getElementById('showSettingsButton_2').dispatchEvent(event);\n",
       "\t}\n",
       "});\n",
       "\n",
       "\n",
       "// COMMON_CODE_BLOCK_END\n",
       "\n",
       "});});\n",
       "      </script>\n",
       "   </body>\n",
       "</html>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "$d0 = $s->gkz_dome(0,5);\n",
    "$d0->VISUAL(FacetColor=>'80 180 255');"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<!--\n",
       "polymake for knusper\n",
       "Thu Aug 27 11:35:31 2020\n",
       "pcom:d1\n",
       "-->\n",
       "\n",
       "\n",
       "<html>\n",
       "   <head>\n",
       "      <meta charset=utf-8>\n",
       "      <title>pcom:d1</title>\n",
       "      <style>\n",
       "/*\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "*/\n",
       "         html {overflow: scroll;}\n",
       "         strong{font-size: 18px;}\n",
       "         canvas { z-index: 8; }\n",
       "         input[type='radio'] {margin-left:0;}\n",
       "         input[type='checkbox'] {margin-right:7px; margin-left: 0px; padding-left:0px;}\n",
       "         .group{padding-bottom: 15px;}\n",
       "         .settings * {z-index: 11; }\n",
       "         .settings{z-index: 10; font-family: Arial, Helvetica, sans-serif; margin-left: 30px; visibility: hidden; width: 14em; height: 96%; border: solid 1px silver; padding: 2px; overflow-y: scroll; box-sizing: border-box; background-color: white; position: absolute;}\n",
       "         .indented{margin-left: 20px; margin-top: 10px; padding-bottom: 0px;} \n",
       "         .shownObjectsList{overflow: auto; max-width: 150px; max-height: 150px;}\n",
       "         .showSettingsButton{visibility: visible; z-index: 12; position: absolute }\n",
       "         .hideSettingsButton{visibility: hidden; z-index: 12; position: absolute; opacity: 0.5}\n",
       "         button{margin-left: 0; margin-top: 10px}\n",
       "         img{cursor: pointer;}\n",
       "         .suboption{padding-top: 15px;}\n",
       "         #model788851161 { width: 100%; height: 100%; }\n",
       "         .threejs_container { width: 100%; height: 75vh;}\n",
       "         .settings{max-height: 74vh} \n",
       "         input[type=range] {\n",
       "           -webkit-appearance: none;\n",
       "           padding:0; \n",
       "           width:90%; \n",
       "           margin-left: auto;\n",
       "           margin-right: auto;\n",
       "           margin-top: 15px;\n",
       "           margin-bottom: 15px;\n",
       "           display: block;\t\n",
       "         }\n",
       "         input[type=range]:focus {\n",
       "           outline: none;\n",
       "         }\n",
       "         input[type=range]::-webkit-slider-runnable-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "           background: #E3E3E3;\n",
       "           border-radius: 0px;\n",
       "           border: 0px solid #000000;\n",
       "         }\n",
       "         input[type=range]::-webkit-slider-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "           -webkit-appearance: none;\n",
       "           margin-top: -5px;\n",
       "         }\n",
       "         input[type=range]:focus::-webkit-slider-runnable-track {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "         input[type=range]::-moz-range-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "           background: #E3E3E3;\n",
       "           border-radius: 0px;\n",
       "           border: 0px solid #000000;\n",
       "         }\n",
       "         input[type=range]::-moz-range-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "         }\n",
       "         input[type=range]::-ms-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           background: transparent;\n",
       "           border-color: transparent;\n",
       "           color: transparent;\n",
       "         }\n",
       "         input[type=range]::-ms-fill-lower {\n",
       "           background: #E3E3E3;\n",
       "           border: 0px solid #000000;\n",
       "           border-radius: 0px;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "         }\n",
       "         input[type=range]::-ms-fill-upper {\n",
       "           background: #E3E3E3;\n",
       "           border: 0px solid #000000;\n",
       "           border-radius: 0px;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "         }\n",
       "         input[type=range]::-ms-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "         }\n",
       "         input[type=range]:focus::-ms-fill-lower {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "         input[type=range]:focus::-ms-fill-upper {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "/*\n",
       "// COMMON_CODE_BLOCK_END\n",
       "*/\n",
       "\t\t</style>\n",
       "   </head>\n",
       "<body>\n",
       "   <div class='threejs_container'>\n",
       "\t\t<div id='settings_3' class='settings'>\n",
       "\t\t\t<div class=group id='explode_3'>\n",
       "\t\t\t\t<strong>Explode</strong>\n",
       "\t\t\t\t<input id='explodeRange_3' type='range' min=0 max=6 step=0.01 value=0>\n",
       "\t\t\t\t<div class=indented><input id='explodeCheckbox_3' type='checkbox'>Automatic explosion</div>\n",
       "\t\t\t\t<div class=suboption>Exploding speed</div>\n",
       "\t\t\t\t<input id='explodingSpeedRange_3' type='range' min=0 max=0.5 step=0.001 value=0.05>\n",
       "\t\t\t</div>\n",
       "\t\n",
       "\t\t\t<div class=group id='transparency_3' class='transparency'>\n",
       "\t\t\t\t<strong>Transparency</strong>\n",
       "\t\t\t\t<input id='transparencyRange_3' type='range' min=0 max=1 step=0.01 value=0>\n",
       "\t\t\t</div>\n",
       "\t\t\t\n",
       "\t\t\t<div class=group id='rotation_3'>\n",
       "\t\t\t\t<strong>Rotation</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationX_3'> x-axis</div>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationY_3'> y-axis</div>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationZ_3'> z-axis</div>\n",
       "\t\t\t\t\t<button id='resetButton_3'>Reset</button>\n",
       "\t\t\t\t</div>\n",
       "\n",
       "\t\t\t\t<div class=suboption>Rotation speed</div>\n",
       "\t\t\t\t<input id='rotationSpeedRange_3' type='range' min=0 max=5 step=0.01 value=2>\n",
       "\t\t\t</div>\n",
       "\n",
       "\n",
       "\t\t\t<div class=group id='display_3'>\n",
       "\t\t\t\t<strong>Display</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<div id='shownObjectTypesList_3' class='shownObjectsList'></div>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t\t<div class=suboption>Objects</div>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t   <div id='shownObjectsList_3' class='shownObjectsList'></div>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t</div>\n",
       "         \n",
       "         <div class=group id='camera_3'>\n",
       "            <strong>Camera</strong>\n",
       "            <div class=indented>\n",
       "               <form>\n",
       "                  <select id=\"cameraType_3\">\n",
       "                     <option value='perspective' selected> Perspective<br></option>\n",
       "                     <option value='orthographic' > Orthographic<br></option>\n",
       "                  </select>\n",
       "               </form>\n",
       "            </div>\n",
       "         </div>\n",
       "\n",
       "\t\t\t<div class=group id='svg_3'>\n",
       "\t\t\t\t<strong>SVG</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<form>\n",
       "\t\t\t\t\t\t<input type=\"radio\" name='screenshotMode' value='download' id='download_3' checked> Download<br>\n",
       "\t\t\t\t\t\t<input type=\"radio\" name='screenshotMode' value='tab' id='tab_3' > New tab<br>\n",
       "\t\t\t\t\t</form>\n",
       "\t\t\t\t\t<button id='takeScreenshot_3'>Screenshot</button>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t</div>\n",
       "\n",
       "\t\t</div>\t<!-- end of settings -->\n",
       "\t\t<img id='hideSettingsButton_3' class='hideSettingsButton' src='/kernelspecs/polymake/close.svg' width=20px\">\n",
       "\t\t<img id='showSettingsButton_3' class='showSettingsButton' src='/kernelspecs/polymake/menu.svg' width=20px\">\n",
       "<div id=\"model788851161\"></div>\n",
       "</div>\n",
       "   <script>\n",
       "    requirejs.config({\n",
       "      paths: {\n",
       "        three: '/kernelspecs/polymake/three',\n",
       "        TrackballControls: '/kernelspecs/polymake/TrackballControls',\n",
       "        OrbitControls: '/kernelspecs/polymake/OrbitControls',\n",
       "        Projector: '/kernelspecs/polymake/Projector',\n",
       "        SVGRenderer: '/kernelspecs/polymake/SVGRenderer',\n",
       "        WEBGL: '/kernelspecs/polymake/WebGL',\n",
       "      },\n",
       "      shim: {\n",
       "        'three': { exports: 'THREE'},\n",
       "        'SVGRenderer': { deps: [ 'three' ], exports: 'THREE.SVGRenderer' },\n",
       "        'WEBGL': { deps: [ 'three' ], exports: 'THREE.WEBGL' },\n",
       "        'Projector': { deps: [ 'three' ], exports: 'THREE.Projector' },\n",
       "        'TrackballControls': { deps: [ 'three' ], exports: 'THREE.TrackballControls' },\n",
       "        'OrbitControls': { deps: [ 'three' ], exports: 'THREE.OrbitControls' },\n",
       "      }\n",
       "    });\n",
       "    \n",
       "    require(['three'],function(THREE){\n",
       "        window.THREE = THREE;\n",
       "      require(['TrackballControls', 'OrbitControls', 'Projector', 'SVGRenderer', 'WEBGL'],\n",
       "               function(TrackballControls, OrbitControls, Projector, SVGRenderer, WEBGL) {\n",
       "    THREE.TrackballControls = TrackballControls;\n",
       "    THREE.OrbitControls = OrbitControls;\n",
       "    THREE.Projector = Projector;\n",
       "    THREE.SVGRenderer = SVGRenderer;\n",
       "    THREE.WEBGL = WEBGL;\n",
       "\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "\n",
       "const intervalLength = 25; // for automatic animations\n",
       "const explodableModel = true; \n",
       "const modelContains = { points: false, pointlabels: false, lines: false, edgelabels: false, faces: false, arrowheads: false };\n",
       "const foldables = [];\n",
       "\n",
       "var three = document.getElementById(\"model788851161\");\n",
       "var scene = new THREE.Scene();\n",
       "var renderer = new THREE.WebGLRenderer( { antialias: true } );\n",
       "var svgRenderer = new THREE.SVGRenderer( { antialias: true } );\n",
       "renderer.setPixelRatio( window.devicePixelRatio );\n",
       "renderer.setClearColor(0xFFFFFF, 1);\n",
       "svgRenderer.setClearColor(0xFFFFFF, 1);\n",
       "three.appendChild(renderer.domElement);\n",
       "\n",
       "var frustumSize = 4;\n",
       "var cameras = [new THREE.PerspectiveCamera(75, 1, 0.1, 1000), new THREE.OrthographicCamera()];\n",
       "cameras.forEach(function(cam) {\n",
       "    cam.position.set(0, 0, 5);\n",
       "    cam.lookAt(0, 0, 0);  \n",
       "    cam.up.set(0, 1, 0);         \n",
       "});\n",
       "var controls = [new THREE.TrackballControls(cameras[0], three), new THREE.OrbitControls(cameras[1], three)];\n",
       "var camera, control;\n",
       "\n",
       "controls[0].zoomSpeed = 0.2;\n",
       "controls[0].rotateSpeed = 4;\n",
       "\n",
       "\n",
       "// class to allow move points together with labels and spheres\n",
       "var PMPoint = function (x,y,z) {\n",
       "   this.vector = new THREE.Vector3(x,y,z);\n",
       "   this.sprite = null;\n",
       "   this.sphere = null;\n",
       "}\n",
       "PMPoint.prototype.addLabel = function(labelsprite) {\n",
       "   this.sprite = labelsprite;\n",
       "   this.sprite.position.copy(this.vector);\n",
       "}\n",
       "PMPoint.prototype.addSphere = function(spheremesh) {\n",
       "   this.sphere = spheremesh;\n",
       "   this.sphere.position.copy(this.vector);\n",
       "}\n",
       "PMPoint.prototype.set = function(x,y,z) {\n",
       "   this.vector.set(x,y,z);\n",
       "   if (this.sprite) {\n",
       "      this.sprite.position.copy(this.vector);\n",
       "   }\n",
       "   if (this.sphere) {\n",
       "      this.sphere.position.copy(this.vector);\n",
       "   }\n",
       "}\n",
       "PMPoint.prototype.radius = function() {\n",
       "   if (this.sphere) {\n",
       "      return this.sphere.geometry.parameters.radius;\n",
       "   } else {\n",
       "      return 0;\n",
       "   }\n",
       "};\n",
       "// select the target node\n",
       "var target = document.querySelector('#model788851161');\n",
       "\n",
       "// create an observer instance\n",
       "var observer = new MutationObserver(function(mutations) {\n",
       "   mutations.forEach(function(mutation) {\n",
       "      if (mutation.removedNodes && mutation.removedNodes.length > 0) {\n",
       "         cancelAnimationFrame(renderId);\n",
       "         observer.disconnect();\n",
       "         console.log(\"cancelled frame \"+renderId);\n",
       "      }\n",
       "   });\n",
       "});\n",
       "\n",
       "// configuration of the observer:\n",
       "var config = { childList: true, characterData: true }\n",
       "\n",
       "// pass in the target node, as well as the observer options\n",
       "while (target) {\n",
       "   if (target.className==\"output\") {\n",
       "      observer.observe(target, config);\n",
       "      break;\n",
       "   }\n",
       "   target = target.parentNode;\n",
       "}\n",
       "\n",
       "// COMMON_CODE_BLOCK_END\n",
       "\n",
       "var obj0 = new THREE.Object3D();\n",
       "obj0.name = \"unnamed__1\";\n",
       "obj0.userData.explodable = 1;\n",
       "obj0.userData.points = [];\n",
       "obj0.userData.points.push(new PMPoint(0, -1, 0.125));\n",
       "obj0.userData.points.push(new PMPoint(0, 1, 0.125));\n",
       "obj0.userData.points.push(new PMPoint(-1, 0, 0.5));\n",
       "\n",
       "obj0.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj0.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj0.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj0.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj0.userData.facets = [[0, 2, 1]];\n",
       "   <!-- Facet style -->\n",
       "obj0.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj0);\n",
       "scene.add(obj0);\n",
       "\n",
       "var obj1 = new THREE.Object3D();\n",
       "obj1.name = \"unnamed__2\";\n",
       "obj1.userData.explodable = 1;\n",
       "obj1.userData.points = [];\n",
       "obj1.userData.points.push(new PMPoint(0, -1, 0.125));\n",
       "obj1.userData.points.push(new PMPoint(0, 1, 0.125));\n",
       "obj1.userData.points.push(new PMPoint(1, 0, 0.5));\n",
       "\n",
       "obj1.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj1.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj1.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj1.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj1.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj1.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj1);\n",
       "scene.add(obj1);\n",
       "\n",
       "var obj2 = new THREE.Object3D();\n",
       "obj2.name = \"unnamed__3\";\n",
       "obj2.userData.explodable = 1;\n",
       "obj2.userData.points = [];\n",
       "obj2.userData.points.push(new PMPoint(0, 1, 0.125));\n",
       "obj2.userData.points.push(new PMPoint(-1, 0, 0.5));\n",
       "obj2.userData.points.push(new PMPoint(-0.8, 0.6, 0.005));\n",
       "\n",
       "obj2.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj2.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj2.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj2.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj2.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj2.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj2);\n",
       "scene.add(obj2);\n",
       "\n",
       "var obj3 = new THREE.Object3D();\n",
       "obj3.name = \"unnamed__4\";\n",
       "obj3.userData.explodable = 1;\n",
       "obj3.userData.points = [];\n",
       "obj3.userData.points.push(new PMPoint(0, -1, 0.125));\n",
       "obj3.userData.points.push(new PMPoint(-1, 0, 0.5));\n",
       "obj3.userData.points.push(new PMPoint(-0.8, -0.6, 0.005));\n",
       "\n",
       "obj3.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj3.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj3.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj3.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj3.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj3.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj3);\n",
       "scene.add(obj3);\n",
       "\n",
       "var obj4 = new THREE.Object3D();\n",
       "obj4.name = \"unnamed__5\";\n",
       "obj4.userData.explodable = 1;\n",
       "obj4.userData.points = [];\n",
       "obj4.userData.points.push(new PMPoint(0, -1, 0.125));\n",
       "obj4.userData.points.push(new PMPoint(1, 0, 0.5));\n",
       "obj4.userData.points.push(new PMPoint(0.8, -0.6, 0.005));\n",
       "\n",
       "obj4.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj4.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj4.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj4.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj4.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj4.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj4);\n",
       "scene.add(obj4);\n",
       "\n",
       "var obj5 = new THREE.Object3D();\n",
       "obj5.name = \"unnamed__6\";\n",
       "obj5.userData.explodable = 1;\n",
       "obj5.userData.points = [];\n",
       "obj5.userData.points.push(new PMPoint(0, 1, 0.125));\n",
       "obj5.userData.points.push(new PMPoint(1, 0, 0.5));\n",
       "obj5.userData.points.push(new PMPoint(0.8, 0.6, 0.005));\n",
       "\n",
       "obj5.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj5.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj5.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj5.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj5.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj5.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj5);\n",
       "scene.add(obj5);\n",
       "\n",
       "var obj6 = new THREE.Object3D();\n",
       "obj6.name = \"unnamed__7\";\n",
       "obj6.userData.explodable = 1;\n",
       "obj6.userData.points = [];\n",
       "obj6.userData.points.push(new PMPoint(0, 1, 0.125));\n",
       "obj6.userData.points.push(new PMPoint(-0.8, 0.6, 0.005));\n",
       "obj6.userData.points.push(new PMPoint(-0.6, 0.8, 0.02));\n",
       "\n",
       "obj6.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj6.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj6.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj6.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj6.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj6.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj6);\n",
       "scene.add(obj6);\n",
       "\n",
       "var obj7 = new THREE.Object3D();\n",
       "obj7.name = \"unnamed__8\";\n",
       "obj7.userData.explodable = 1;\n",
       "obj7.userData.points = [];\n",
       "obj7.userData.points.push(new PMPoint(-1, 0, 0.5));\n",
       "obj7.userData.points.push(new PMPoint(-0.8, 0.6, 0.005));\n",
       "obj7.userData.points.push(new PMPoint(-0.923077, 0.384615, 0.000739645));\n",
       "\n",
       "obj7.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj7.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj7.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj7.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj7.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj7.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj7);\n",
       "scene.add(obj7);\n",
       "\n",
       "var obj8 = new THREE.Object3D();\n",
       "obj8.name = \"unnamed__9\";\n",
       "obj8.userData.explodable = 1;\n",
       "obj8.userData.points = [];\n",
       "obj8.userData.points.push(new PMPoint(-1, 0, 0.5));\n",
       "obj8.userData.points.push(new PMPoint(-0.8, -0.6, 0.005));\n",
       "obj8.userData.points.push(new PMPoint(-0.923077, -0.384615, 0.000739645));\n",
       "\n",
       "obj8.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj8.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj8.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj8.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj8.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj8.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj8);\n",
       "scene.add(obj8);\n",
       "\n",
       "var obj9 = new THREE.Object3D();\n",
       "obj9.name = \"unnamed__10\";\n",
       "obj9.userData.explodable = 1;\n",
       "obj9.userData.points = [];\n",
       "obj9.userData.points.push(new PMPoint(0, -1, 0.125));\n",
       "obj9.userData.points.push(new PMPoint(-0.8, -0.6, 0.005));\n",
       "obj9.userData.points.push(new PMPoint(-0.6, -0.8, 0.02));\n",
       "\n",
       "obj9.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj9.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj9.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj9.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj9.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj9.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj9);\n",
       "scene.add(obj9);\n",
       "\n",
       "var obj10 = new THREE.Object3D();\n",
       "obj10.name = \"unnamed__11\";\n",
       "obj10.userData.explodable = 1;\n",
       "obj10.userData.points = [];\n",
       "obj10.userData.points.push(new PMPoint(0, -1, 0.125));\n",
       "obj10.userData.points.push(new PMPoint(0.8, -0.6, 0.005));\n",
       "obj10.userData.points.push(new PMPoint(0.6, -0.8, 0.02));\n",
       "\n",
       "obj10.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj10.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj10.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj10.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj10.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj10.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj10);\n",
       "scene.add(obj10);\n",
       "\n",
       "var obj11 = new THREE.Object3D();\n",
       "obj11.name = \"unnamed__12\";\n",
       "obj11.userData.explodable = 1;\n",
       "obj11.userData.points = [];\n",
       "obj11.userData.points.push(new PMPoint(1, 0, 0.5));\n",
       "obj11.userData.points.push(new PMPoint(0.8, -0.6, 0.005));\n",
       "obj11.userData.points.push(new PMPoint(0.923077, -0.384615, 0.000739645));\n",
       "\n",
       "obj11.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj11.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj11.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj11.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj11.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj11.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj11);\n",
       "scene.add(obj11);\n",
       "\n",
       "var obj12 = new THREE.Object3D();\n",
       "obj12.name = \"unnamed__13\";\n",
       "obj12.userData.explodable = 1;\n",
       "obj12.userData.points = [];\n",
       "obj12.userData.points.push(new PMPoint(1, 0, 0.5));\n",
       "obj12.userData.points.push(new PMPoint(0.8, 0.6, 0.005));\n",
       "obj12.userData.points.push(new PMPoint(0.923077, 0.384615, 0.000739645));\n",
       "\n",
       "obj12.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj12.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj12.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj12.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj12.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj12.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj12);\n",
       "scene.add(obj12);\n",
       "\n",
       "var obj13 = new THREE.Object3D();\n",
       "obj13.name = \"unnamed__14\";\n",
       "obj13.userData.explodable = 1;\n",
       "obj13.userData.points = [];\n",
       "obj13.userData.points.push(new PMPoint(0, 1, 0.125));\n",
       "obj13.userData.points.push(new PMPoint(0.8, 0.6, 0.005));\n",
       "obj13.userData.points.push(new PMPoint(0.6, 0.8, 0.02));\n",
       "\n",
       "obj13.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj13.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj13.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj13.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj13.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj13.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj13);\n",
       "scene.add(obj13);\n",
       "\n",
       "var obj14 = new THREE.Object3D();\n",
       "obj14.name = \"unnamed__15\";\n",
       "obj14.userData.explodable = 1;\n",
       "obj14.userData.points = [];\n",
       "obj14.userData.points.push(new PMPoint(0, 1, 0.125));\n",
       "obj14.userData.points.push(new PMPoint(-0.6, 0.8, 0.02));\n",
       "obj14.userData.points.push(new PMPoint(-0.470588, 0.882353, 0.000432526));\n",
       "\n",
       "obj14.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj14.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj14.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj14.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj14.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj14.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj14);\n",
       "scene.add(obj14);\n",
       "\n",
       "var obj15 = new THREE.Object3D();\n",
       "obj15.name = \"unnamed__16\";\n",
       "obj15.userData.explodable = 1;\n",
       "obj15.userData.points = [];\n",
       "obj15.userData.points.push(new PMPoint(-0.8, 0.6, 0.005));\n",
       "obj15.userData.points.push(new PMPoint(-0.6, 0.8, 0.02));\n",
       "obj15.userData.points.push(new PMPoint(-0.689655, 0.724138, 0.000148633));\n",
       "\n",
       "obj15.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj15.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj15.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj15.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj15.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj15.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj15);\n",
       "scene.add(obj15);\n",
       "\n",
       "var obj16 = new THREE.Object3D();\n",
       "obj16.name = \"unnamed__17\";\n",
       "obj16.userData.explodable = 1;\n",
       "obj16.userData.points = [];\n",
       "obj16.userData.points.push(new PMPoint(-0.8, 0.6, 0.005));\n",
       "obj16.userData.points.push(new PMPoint(-0.923077, 0.384615, 0.000739645));\n",
       "obj16.userData.points.push(new PMPoint(-0.882353, 0.470588, 0.0017301));\n",
       "\n",
       "obj16.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj16.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj16.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj16.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj16.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj16.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj16);\n",
       "scene.add(obj16);\n",
       "\n",
       "var obj17 = new THREE.Object3D();\n",
       "obj17.name = \"unnamed__18\";\n",
       "obj17.userData.explodable = 1;\n",
       "obj17.userData.points = [];\n",
       "obj17.userData.points.push(new PMPoint(-1, 0, 0.5));\n",
       "obj17.userData.points.push(new PMPoint(-0.923077, 0.384615, 0.000739645));\n",
       "obj17.userData.points.push(new PMPoint(-0.96, 0.28, 0.0002));\n",
       "\n",
       "obj17.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj17.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj17.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj17.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj17.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj17.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj17);\n",
       "scene.add(obj17);\n",
       "\n",
       "var obj18 = new THREE.Object3D();\n",
       "obj18.name = \"unnamed__19\";\n",
       "obj18.userData.explodable = 1;\n",
       "obj18.userData.points = [];\n",
       "obj18.userData.points.push(new PMPoint(-1, 0, 0.5));\n",
       "obj18.userData.points.push(new PMPoint(-0.923077, -0.384615, 0.000739645));\n",
       "obj18.userData.points.push(new PMPoint(-0.96, -0.28, 0.0002));\n",
       "\n",
       "obj18.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj18.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj18.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj18.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj18.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj18.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj18);\n",
       "scene.add(obj18);\n",
       "\n",
       "var obj19 = new THREE.Object3D();\n",
       "obj19.name = \"unnamed__20\";\n",
       "obj19.userData.explodable = 1;\n",
       "obj19.userData.points = [];\n",
       "obj19.userData.points.push(new PMPoint(-0.8, -0.6, 0.005));\n",
       "obj19.userData.points.push(new PMPoint(-0.923077, -0.384615, 0.000739645));\n",
       "obj19.userData.points.push(new PMPoint(-0.882353, -0.470588, 0.0017301));\n",
       "\n",
       "obj19.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj19.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj19.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj19.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj19.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj19.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj19);\n",
       "scene.add(obj19);\n",
       "\n",
       "var obj20 = new THREE.Object3D();\n",
       "obj20.name = \"unnamed__21\";\n",
       "obj20.userData.explodable = 1;\n",
       "obj20.userData.points = [];\n",
       "obj20.userData.points.push(new PMPoint(-0.8, -0.6, 0.005));\n",
       "obj20.userData.points.push(new PMPoint(-0.6, -0.8, 0.02));\n",
       "obj20.userData.points.push(new PMPoint(-0.689655, -0.724138, 0.000148633));\n",
       "\n",
       "obj20.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj20.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj20.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj20.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj20.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj20.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj20);\n",
       "scene.add(obj20);\n",
       "\n",
       "var obj21 = new THREE.Object3D();\n",
       "obj21.name = \"unnamed__22\";\n",
       "obj21.userData.explodable = 1;\n",
       "obj21.userData.points = [];\n",
       "obj21.userData.points.push(new PMPoint(0, -1, 0.125));\n",
       "obj21.userData.points.push(new PMPoint(-0.6, -0.8, 0.02));\n",
       "obj21.userData.points.push(new PMPoint(-0.470588, -0.882353, 0.000432526));\n",
       "\n",
       "obj21.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj21.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj21.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj21.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj21.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj21.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj21);\n",
       "scene.add(obj21);\n",
       "\n",
       "var obj22 = new THREE.Object3D();\n",
       "obj22.name = \"unnamed__23\";\n",
       "obj22.userData.explodable = 1;\n",
       "obj22.userData.points = [];\n",
       "obj22.userData.points.push(new PMPoint(0, -1, 0.125));\n",
       "obj22.userData.points.push(new PMPoint(0.6, -0.8, 0.02));\n",
       "obj22.userData.points.push(new PMPoint(0.470588, -0.882353, 0.000432526));\n",
       "\n",
       "obj22.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj22.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj22.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj22.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj22.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj22.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj22);\n",
       "scene.add(obj22);\n",
       "\n",
       "var obj23 = new THREE.Object3D();\n",
       "obj23.name = \"unnamed__24\";\n",
       "obj23.userData.explodable = 1;\n",
       "obj23.userData.points = [];\n",
       "obj23.userData.points.push(new PMPoint(0.8, -0.6, 0.005));\n",
       "obj23.userData.points.push(new PMPoint(0.6, -0.8, 0.02));\n",
       "obj23.userData.points.push(new PMPoint(0.689655, -0.724138, 0.000148633));\n",
       "\n",
       "obj23.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj23.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj23.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj23.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj23.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj23.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj23);\n",
       "scene.add(obj23);\n",
       "\n",
       "var obj24 = new THREE.Object3D();\n",
       "obj24.name = \"unnamed__25\";\n",
       "obj24.userData.explodable = 1;\n",
       "obj24.userData.points = [];\n",
       "obj24.userData.points.push(new PMPoint(0.8, -0.6, 0.005));\n",
       "obj24.userData.points.push(new PMPoint(0.923077, -0.384615, 0.000739645));\n",
       "obj24.userData.points.push(new PMPoint(0.882353, -0.470588, 0.0017301));\n",
       "\n",
       "obj24.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj24.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj24.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj24.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj24.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj24.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj24);\n",
       "scene.add(obj24);\n",
       "\n",
       "var obj25 = new THREE.Object3D();\n",
       "obj25.name = \"unnamed__26\";\n",
       "obj25.userData.explodable = 1;\n",
       "obj25.userData.points = [];\n",
       "obj25.userData.points.push(new PMPoint(1, 0, 0.5));\n",
       "obj25.userData.points.push(new PMPoint(0.923077, -0.384615, 0.000739645));\n",
       "obj25.userData.points.push(new PMPoint(0.96, -0.28, 0.0002));\n",
       "\n",
       "obj25.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj25.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj25.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj25.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj25.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj25.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj25);\n",
       "scene.add(obj25);\n",
       "\n",
       "var obj26 = new THREE.Object3D();\n",
       "obj26.name = \"unnamed__27\";\n",
       "obj26.userData.explodable = 1;\n",
       "obj26.userData.points = [];\n",
       "obj26.userData.points.push(new PMPoint(1, 0, 0.5));\n",
       "obj26.userData.points.push(new PMPoint(0.923077, 0.384615, 0.000739645));\n",
       "obj26.userData.points.push(new PMPoint(0.96, 0.28, 0.0002));\n",
       "\n",
       "obj26.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj26.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj26.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj26.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj26.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj26.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj26);\n",
       "scene.add(obj26);\n",
       "\n",
       "var obj27 = new THREE.Object3D();\n",
       "obj27.name = \"unnamed__28\";\n",
       "obj27.userData.explodable = 1;\n",
       "obj27.userData.points = [];\n",
       "obj27.userData.points.push(new PMPoint(0.8, 0.6, 0.005));\n",
       "obj27.userData.points.push(new PMPoint(0.923077, 0.384615, 0.000739645));\n",
       "obj27.userData.points.push(new PMPoint(0.882353, 0.470588, 0.0017301));\n",
       "\n",
       "obj27.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj27.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj27.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj27.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj27.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj27.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj27);\n",
       "scene.add(obj27);\n",
       "\n",
       "var obj28 = new THREE.Object3D();\n",
       "obj28.name = \"unnamed__29\";\n",
       "obj28.userData.explodable = 1;\n",
       "obj28.userData.points = [];\n",
       "obj28.userData.points.push(new PMPoint(0.8, 0.6, 0.005));\n",
       "obj28.userData.points.push(new PMPoint(0.6, 0.8, 0.02));\n",
       "obj28.userData.points.push(new PMPoint(0.689655, 0.724138, 0.000148633));\n",
       "\n",
       "obj28.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj28.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj28.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj28.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj28.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj28.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj28);\n",
       "scene.add(obj28);\n",
       "\n",
       "var obj29 = new THREE.Object3D();\n",
       "obj29.name = \"unnamed__30\";\n",
       "obj29.userData.explodable = 1;\n",
       "obj29.userData.points = [];\n",
       "obj29.userData.points.push(new PMPoint(0, 1, 0.125));\n",
       "obj29.userData.points.push(new PMPoint(0.6, 0.8, 0.02));\n",
       "obj29.userData.points.push(new PMPoint(0.470588, 0.882353, 0.000432526));\n",
       "\n",
       "obj29.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj29.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj29.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj29.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj29.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj29.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj29);\n",
       "scene.add(obj29);\n",
       "\n",
       "var obj30 = new THREE.Object3D();\n",
       "obj30.name = \"unnamed__31\";\n",
       "obj30.userData.explodable = 1;\n",
       "obj30.userData.points = [];\n",
       "obj30.userData.points.push(new PMPoint(0, 1, 0.125));\n",
       "obj30.userData.points.push(new PMPoint(-0.470588, 0.882353, 0.000432526));\n",
       "obj30.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.00295858));\n",
       "\n",
       "obj30.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj30.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj30.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj30.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj30.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj30.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj30);\n",
       "scene.add(obj30);\n",
       "\n",
       "var obj31 = new THREE.Object3D();\n",
       "obj31.name = \"unnamed__32\";\n",
       "obj31.userData.explodable = 1;\n",
       "obj31.userData.points = [];\n",
       "obj31.userData.points.push(new PMPoint(-0.6, 0.8, 0.02));\n",
       "obj31.userData.points.push(new PMPoint(-0.470588, 0.882353, 0.000432526));\n",
       "obj31.userData.points.push(new PMPoint(-0.528302, 0.849057, 4.44998e-05));\n",
       "\n",
       "obj31.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj31.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj31.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj31.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj31.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj31.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj31);\n",
       "scene.add(obj31);\n",
       "\n",
       "var obj32 = new THREE.Object3D();\n",
       "obj32.name = \"unnamed__33\";\n",
       "obj32.userData.explodable = 1;\n",
       "obj32.userData.points = [];\n",
       "obj32.userData.points.push(new PMPoint(-0.6, 0.8, 0.02));\n",
       "obj32.userData.points.push(new PMPoint(-0.689655, 0.724138, 0.000148633));\n",
       "obj32.userData.points.push(new PMPoint(-0.657534, 0.753425, 2.34566e-05));\n",
       "\n",
       "obj32.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj32.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj32.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj32.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj32.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj32.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj32);\n",
       "scene.add(obj32);\n",
       "\n",
       "var obj33 = new THREE.Object3D();\n",
       "obj33.name = \"unnamed__34\";\n",
       "obj33.userData.explodable = 1;\n",
       "obj33.userData.points = [];\n",
       "obj33.userData.points.push(new PMPoint(-0.8, 0.6, 0.005));\n",
       "obj33.userData.points.push(new PMPoint(-0.689655, 0.724138, 0.000148633));\n",
       "obj33.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00059453));\n",
       "\n",
       "obj33.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj33.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj33.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj33.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj33.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj33.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj33);\n",
       "scene.add(obj33);\n",
       "\n",
       "var obj34 = new THREE.Object3D();\n",
       "obj34.name = \"unnamed__35\";\n",
       "obj34.userData.explodable = 1;\n",
       "obj34.userData.points = [];\n",
       "obj34.userData.points.push(new PMPoint(-0.8, 0.6, 0.005));\n",
       "obj34.userData.points.push(new PMPoint(-0.882353, 0.470588, 0.0017301));\n",
       "obj34.userData.points.push(new PMPoint(-0.861538, 0.507692, 2.95858e-05));\n",
       "\n",
       "obj34.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj34.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj34.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj34.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj34.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj34.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj34);\n",
       "scene.add(obj34);\n",
       "\n",
       "var obj35 = new THREE.Object3D();\n",
       "obj35.name = \"unnamed__36\";\n",
       "obj35.userData.explodable = 1;\n",
       "obj35.userData.points = [];\n",
       "obj35.userData.points.push(new PMPoint(-0.923077, 0.384615, 0.000739645));\n",
       "obj35.userData.points.push(new PMPoint(-0.882353, 0.470588, 0.0017301));\n",
       "obj35.userData.points.push(new PMPoint(-0.898876, 0.438202, 1.57808e-05));\n",
       "\n",
       "obj35.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj35.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj35.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj35.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj35.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj35.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj35);\n",
       "scene.add(obj35);\n",
       "\n",
       "var obj36 = new THREE.Object3D();\n",
       "obj36.name = \"unnamed__37\";\n",
       "obj36.userData.explodable = 1;\n",
       "obj36.userData.points = [];\n",
       "obj36.userData.points.push(new PMPoint(-0.923077, 0.384615, 0.000739645));\n",
       "obj36.userData.points.push(new PMPoint(-0.96, 0.28, 0.0002));\n",
       "obj36.userData.points.push(new PMPoint(-0.945946, 0.324324, 0.00036523));\n",
       "\n",
       "obj36.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj36.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj36.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj36.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj36.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj36.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj36);\n",
       "scene.add(obj36);\n",
       "\n",
       "var obj37 = new THREE.Object3D();\n",
       "obj37.name = \"unnamed__38\";\n",
       "obj37.userData.explodable = 1;\n",
       "obj37.userData.points = [];\n",
       "obj37.userData.points.push(new PMPoint(-1, 0, 0.5));\n",
       "obj37.userData.points.push(new PMPoint(-0.96, 0.28, 0.0002));\n",
       "obj37.userData.points.push(new PMPoint(-0.97561, 0.219512, 7.43605e-05));\n",
       "\n",
       "obj37.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj37.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj37.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj37.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj37.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj37.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj37);\n",
       "scene.add(obj37);\n",
       "\n",
       "var obj38 = new THREE.Object3D();\n",
       "obj38.name = \"unnamed__39\";\n",
       "obj38.userData.explodable = 1;\n",
       "obj38.userData.points = [];\n",
       "obj38.userData.points.push(new PMPoint(-1, 0, 0.5));\n",
       "obj38.userData.points.push(new PMPoint(-0.96, -0.28, 0.0002));\n",
       "obj38.userData.points.push(new PMPoint(-0.97561, -0.219512, 7.43605e-05));\n",
       "\n",
       "obj38.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj38.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj38.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj38.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj38.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj38.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj38);\n",
       "scene.add(obj38);\n",
       "\n",
       "var obj39 = new THREE.Object3D();\n",
       "obj39.name = \"unnamed__40\";\n",
       "obj39.userData.explodable = 1;\n",
       "obj39.userData.points = [];\n",
       "obj39.userData.points.push(new PMPoint(-0.923077, -0.384615, 0.000739645));\n",
       "obj39.userData.points.push(new PMPoint(-0.96, -0.28, 0.0002));\n",
       "obj39.userData.points.push(new PMPoint(-0.945946, -0.324324, 0.00036523));\n",
       "\n",
       "obj39.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj39.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj39.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj39.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj39.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj39.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj39);\n",
       "scene.add(obj39);\n",
       "\n",
       "var obj40 = new THREE.Object3D();\n",
       "obj40.name = \"unnamed__41\";\n",
       "obj40.userData.explodable = 1;\n",
       "obj40.userData.points = [];\n",
       "obj40.userData.points.push(new PMPoint(-0.923077, -0.384615, 0.000739645));\n",
       "obj40.userData.points.push(new PMPoint(-0.882353, -0.470588, 0.0017301));\n",
       "obj40.userData.points.push(new PMPoint(-0.898876, -0.438202, 1.57808e-05));\n",
       "\n",
       "obj40.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj40.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj40.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj40.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj40.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj40.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj40);\n",
       "scene.add(obj40);\n",
       "\n",
       "var obj41 = new THREE.Object3D();\n",
       "obj41.name = \"unnamed__42\";\n",
       "obj41.userData.explodable = 1;\n",
       "obj41.userData.points = [];\n",
       "obj41.userData.points.push(new PMPoint(-0.8, -0.6, 0.005));\n",
       "obj41.userData.points.push(new PMPoint(-0.882353, -0.470588, 0.0017301));\n",
       "obj41.userData.points.push(new PMPoint(-0.861538, -0.507692, 2.95858e-05));\n",
       "\n",
       "obj41.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj41.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj41.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj41.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj41.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj41.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj41);\n",
       "scene.add(obj41);\n",
       "\n",
       "var obj42 = new THREE.Object3D();\n",
       "obj42.name = \"unnamed__43\";\n",
       "obj42.userData.explodable = 1;\n",
       "obj42.userData.points = [];\n",
       "obj42.userData.points.push(new PMPoint(-0.8, -0.6, 0.005));\n",
       "obj42.userData.points.push(new PMPoint(-0.689655, -0.724138, 0.000148633));\n",
       "obj42.userData.points.push(new PMPoint(-0.724138, -0.689655, 0.00059453));\n",
       "\n",
       "obj42.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj42.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj42.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj42.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj42.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj42.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj42);\n",
       "scene.add(obj42);\n",
       "\n",
       "var obj43 = new THREE.Object3D();\n",
       "obj43.name = \"unnamed__44\";\n",
       "obj43.userData.explodable = 1;\n",
       "obj43.userData.points = [];\n",
       "obj43.userData.points.push(new PMPoint(-0.6, -0.8, 0.02));\n",
       "obj43.userData.points.push(new PMPoint(-0.689655, -0.724138, 0.000148633));\n",
       "obj43.userData.points.push(new PMPoint(-0.657534, -0.753425, 2.34566e-05));\n",
       "\n",
       "obj43.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj43.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj43.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj43.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj43.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj43.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj43);\n",
       "scene.add(obj43);\n",
       "\n",
       "var obj44 = new THREE.Object3D();\n",
       "obj44.name = \"unnamed__45\";\n",
       "obj44.userData.explodable = 1;\n",
       "obj44.userData.points = [];\n",
       "obj44.userData.points.push(new PMPoint(-0.6, -0.8, 0.02));\n",
       "obj44.userData.points.push(new PMPoint(-0.470588, -0.882353, 0.000432526));\n",
       "obj44.userData.points.push(new PMPoint(-0.528302, -0.849057, 4.44998e-05));\n",
       "\n",
       "obj44.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj44.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj44.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj44.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj44.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj44.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj44);\n",
       "scene.add(obj44);\n",
       "\n",
       "var obj45 = new THREE.Object3D();\n",
       "obj45.name = \"unnamed__46\";\n",
       "obj45.userData.explodable = 1;\n",
       "obj45.userData.points = [];\n",
       "obj45.userData.points.push(new PMPoint(0, -1, 0.125));\n",
       "obj45.userData.points.push(new PMPoint(-0.470588, -0.882353, 0.000432526));\n",
       "obj45.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.00295858));\n",
       "\n",
       "obj45.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj45.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj45.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj45.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj45.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj45.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj45);\n",
       "scene.add(obj45);\n",
       "\n",
       "var obj46 = new THREE.Object3D();\n",
       "obj46.name = \"unnamed__47\";\n",
       "obj46.userData.explodable = 1;\n",
       "obj46.userData.points = [];\n",
       "obj46.userData.points.push(new PMPoint(0, -1, 0.125));\n",
       "obj46.userData.points.push(new PMPoint(0.470588, -0.882353, 0.000432526));\n",
       "obj46.userData.points.push(new PMPoint(0.384615, -0.923077, 0.00295858));\n",
       "\n",
       "obj46.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj46.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj46.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj46.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj46.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj46.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj46);\n",
       "scene.add(obj46);\n",
       "\n",
       "var obj47 = new THREE.Object3D();\n",
       "obj47.name = \"unnamed__48\";\n",
       "obj47.userData.explodable = 1;\n",
       "obj47.userData.points = [];\n",
       "obj47.userData.points.push(new PMPoint(0.6, -0.8, 0.02));\n",
       "obj47.userData.points.push(new PMPoint(0.470588, -0.882353, 0.000432526));\n",
       "obj47.userData.points.push(new PMPoint(0.528302, -0.849057, 4.44998e-05));\n",
       "\n",
       "obj47.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj47.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj47.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj47.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj47.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj47.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj47);\n",
       "scene.add(obj47);\n",
       "\n",
       "var obj48 = new THREE.Object3D();\n",
       "obj48.name = \"unnamed__49\";\n",
       "obj48.userData.explodable = 1;\n",
       "obj48.userData.points = [];\n",
       "obj48.userData.points.push(new PMPoint(0.6, -0.8, 0.02));\n",
       "obj48.userData.points.push(new PMPoint(0.689655, -0.724138, 0.000148633));\n",
       "obj48.userData.points.push(new PMPoint(0.657534, -0.753425, 2.34566e-05));\n",
       "\n",
       "obj48.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj48.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj48.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj48.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj48.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj48.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj48);\n",
       "scene.add(obj48);\n",
       "\n",
       "var obj49 = new THREE.Object3D();\n",
       "obj49.name = \"unnamed__50\";\n",
       "obj49.userData.explodable = 1;\n",
       "obj49.userData.points = [];\n",
       "obj49.userData.points.push(new PMPoint(0.8, -0.6, 0.005));\n",
       "obj49.userData.points.push(new PMPoint(0.689655, -0.724138, 0.000148633));\n",
       "obj49.userData.points.push(new PMPoint(0.724138, -0.689655, 0.00059453));\n",
       "\n",
       "obj49.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj49.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj49.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj49.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj49.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj49.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj49);\n",
       "scene.add(obj49);\n",
       "\n",
       "var obj50 = new THREE.Object3D();\n",
       "obj50.name = \"unnamed__51\";\n",
       "obj50.userData.explodable = 1;\n",
       "obj50.userData.points = [];\n",
       "obj50.userData.points.push(new PMPoint(0.8, -0.6, 0.005));\n",
       "obj50.userData.points.push(new PMPoint(0.882353, -0.470588, 0.0017301));\n",
       "obj50.userData.points.push(new PMPoint(0.861538, -0.507692, 2.95858e-05));\n",
       "\n",
       "obj50.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj50.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj50.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj50.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj50.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj50.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj50);\n",
       "scene.add(obj50);\n",
       "\n",
       "var obj51 = new THREE.Object3D();\n",
       "obj51.name = \"unnamed__52\";\n",
       "obj51.userData.explodable = 1;\n",
       "obj51.userData.points = [];\n",
       "obj51.userData.points.push(new PMPoint(0.923077, -0.384615, 0.000739645));\n",
       "obj51.userData.points.push(new PMPoint(0.882353, -0.470588, 0.0017301));\n",
       "obj51.userData.points.push(new PMPoint(0.898876, -0.438202, 1.57808e-05));\n",
       "\n",
       "obj51.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj51.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj51.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj51.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj51.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj51.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj51);\n",
       "scene.add(obj51);\n",
       "\n",
       "var obj52 = new THREE.Object3D();\n",
       "obj52.name = \"unnamed__53\";\n",
       "obj52.userData.explodable = 1;\n",
       "obj52.userData.points = [];\n",
       "obj52.userData.points.push(new PMPoint(0.923077, -0.384615, 0.000739645));\n",
       "obj52.userData.points.push(new PMPoint(0.96, -0.28, 0.0002));\n",
       "obj52.userData.points.push(new PMPoint(0.945946, -0.324324, 0.00036523));\n",
       "\n",
       "obj52.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj52.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj52.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj52.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj52.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj52.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj52);\n",
       "scene.add(obj52);\n",
       "\n",
       "var obj53 = new THREE.Object3D();\n",
       "obj53.name = \"unnamed__54\";\n",
       "obj53.userData.explodable = 1;\n",
       "obj53.userData.points = [];\n",
       "obj53.userData.points.push(new PMPoint(1, 0, 0.5));\n",
       "obj53.userData.points.push(new PMPoint(0.96, -0.28, 0.0002));\n",
       "obj53.userData.points.push(new PMPoint(0.97561, -0.219512, 7.43605e-05));\n",
       "\n",
       "obj53.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj53.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj53.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj53.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj53.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj53.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj53);\n",
       "scene.add(obj53);\n",
       "\n",
       "var obj54 = new THREE.Object3D();\n",
       "obj54.name = \"unnamed__55\";\n",
       "obj54.userData.explodable = 1;\n",
       "obj54.userData.points = [];\n",
       "obj54.userData.points.push(new PMPoint(1, 0, 0.5));\n",
       "obj54.userData.points.push(new PMPoint(0.96, 0.28, 0.0002));\n",
       "obj54.userData.points.push(new PMPoint(0.97561, 0.219512, 7.43605e-05));\n",
       "\n",
       "obj54.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj54.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj54.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj54.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj54.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj54.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj54);\n",
       "scene.add(obj54);\n",
       "\n",
       "var obj55 = new THREE.Object3D();\n",
       "obj55.name = \"unnamed__56\";\n",
       "obj55.userData.explodable = 1;\n",
       "obj55.userData.points = [];\n",
       "obj55.userData.points.push(new PMPoint(0.923077, 0.384615, 0.000739645));\n",
       "obj55.userData.points.push(new PMPoint(0.96, 0.28, 0.0002));\n",
       "obj55.userData.points.push(new PMPoint(0.945946, 0.324324, 0.00036523));\n",
       "\n",
       "obj55.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj55.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj55.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj55.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj55.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj55.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj55);\n",
       "scene.add(obj55);\n",
       "\n",
       "var obj56 = new THREE.Object3D();\n",
       "obj56.name = \"unnamed__57\";\n",
       "obj56.userData.explodable = 1;\n",
       "obj56.userData.points = [];\n",
       "obj56.userData.points.push(new PMPoint(0.923077, 0.384615, 0.000739645));\n",
       "obj56.userData.points.push(new PMPoint(0.882353, 0.470588, 0.0017301));\n",
       "obj56.userData.points.push(new PMPoint(0.898876, 0.438202, 1.57808e-05));\n",
       "\n",
       "obj56.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj56.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj56.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj56.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj56.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj56.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj56);\n",
       "scene.add(obj56);\n",
       "\n",
       "var obj57 = new THREE.Object3D();\n",
       "obj57.name = \"unnamed__58\";\n",
       "obj57.userData.explodable = 1;\n",
       "obj57.userData.points = [];\n",
       "obj57.userData.points.push(new PMPoint(0.8, 0.6, 0.005));\n",
       "obj57.userData.points.push(new PMPoint(0.882353, 0.470588, 0.0017301));\n",
       "obj57.userData.points.push(new PMPoint(0.861538, 0.507692, 2.95858e-05));\n",
       "\n",
       "obj57.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj57.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj57.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj57.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj57.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj57.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj57);\n",
       "scene.add(obj57);\n",
       "\n",
       "var obj58 = new THREE.Object3D();\n",
       "obj58.name = \"unnamed__59\";\n",
       "obj58.userData.explodable = 1;\n",
       "obj58.userData.points = [];\n",
       "obj58.userData.points.push(new PMPoint(0.8, 0.6, 0.005));\n",
       "obj58.userData.points.push(new PMPoint(0.689655, 0.724138, 0.000148633));\n",
       "obj58.userData.points.push(new PMPoint(0.724138, 0.689655, 0.00059453));\n",
       "\n",
       "obj58.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj58.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj58.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj58.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj58.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj58.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj58);\n",
       "scene.add(obj58);\n",
       "\n",
       "var obj59 = new THREE.Object3D();\n",
       "obj59.name = \"unnamed__60\";\n",
       "obj59.userData.explodable = 1;\n",
       "obj59.userData.points = [];\n",
       "obj59.userData.points.push(new PMPoint(0.6, 0.8, 0.02));\n",
       "obj59.userData.points.push(new PMPoint(0.689655, 0.724138, 0.000148633));\n",
       "obj59.userData.points.push(new PMPoint(0.657534, 0.753425, 2.34566e-05));\n",
       "\n",
       "obj59.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj59.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj59.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj59.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj59.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj59.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj59);\n",
       "scene.add(obj59);\n",
       "\n",
       "var obj60 = new THREE.Object3D();\n",
       "obj60.name = \"unnamed__61\";\n",
       "obj60.userData.explodable = 1;\n",
       "obj60.userData.points = [];\n",
       "obj60.userData.points.push(new PMPoint(0.6, 0.8, 0.02));\n",
       "obj60.userData.points.push(new PMPoint(0.470588, 0.882353, 0.000432526));\n",
       "obj60.userData.points.push(new PMPoint(0.528302, 0.849057, 4.44998e-05));\n",
       "\n",
       "obj60.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj60.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj60.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj60.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj60.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj60.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj60);\n",
       "scene.add(obj60);\n",
       "\n",
       "var obj61 = new THREE.Object3D();\n",
       "obj61.name = \"unnamed__62\";\n",
       "obj61.userData.explodable = 1;\n",
       "obj61.userData.points = [];\n",
       "obj61.userData.points.push(new PMPoint(0, 1, 0.125));\n",
       "obj61.userData.points.push(new PMPoint(0.470588, 0.882353, 0.000432526));\n",
       "obj61.userData.points.push(new PMPoint(0.384615, 0.923077, 0.00295858));\n",
       "\n",
       "obj61.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj61.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj61.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj61.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj61.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj61.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj61);\n",
       "scene.add(obj61);\n",
       "\n",
       "var obj62 = new THREE.Object3D();\n",
       "obj62.name = \"unnamed__63\";\n",
       "obj62.userData.explodable = 1;\n",
       "obj62.userData.points = [];\n",
       "obj62.userData.points.push(new PMPoint(0, 1, 0.125));\n",
       "obj62.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.00295858));\n",
       "obj62.userData.points.push(new PMPoint(-0.324324, 0.945946, 9.13075e-05));\n",
       "\n",
       "obj62.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj62.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj62.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj62.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj62.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj62.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj62);\n",
       "scene.add(obj62);\n",
       "\n",
       "var obj63 = new THREE.Object3D();\n",
       "obj63.name = \"unnamed__64\";\n",
       "obj63.userData.explodable = 1;\n",
       "obj63.userData.points = [];\n",
       "obj63.userData.points.push(new PMPoint(-0.470588, 0.882353, 0.000432526));\n",
       "obj63.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.00295858));\n",
       "obj63.userData.points.push(new PMPoint(-0.423529, 0.905882, 1.7301e-05));\n",
       "\n",
       "obj63.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj63.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj63.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj63.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj63.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj63.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj63);\n",
       "scene.add(obj63);\n",
       "\n",
       "var obj64 = new THREE.Object3D();\n",
       "obj64.name = \"unnamed__65\";\n",
       "obj64.userData.explodable = 1;\n",
       "obj64.userData.points = [];\n",
       "obj64.userData.points.push(new PMPoint(-0.470588, 0.882353, 0.000432526));\n",
       "obj64.userData.points.push(new PMPoint(-0.528302, 0.849057, 4.44998e-05));\n",
       "obj64.userData.points.push(new PMPoint(-0.507692, 0.861538, 0.000118343));\n",
       "\n",
       "obj64.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj64.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj64.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj64.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj64.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj64.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj64);\n",
       "scene.add(obj64);\n",
       "\n",
       "var obj65 = new THREE.Object3D();\n",
       "obj65.name = \"unnamed__66\";\n",
       "obj65.userData.explodable = 1;\n",
       "obj65.userData.points = [];\n",
       "obj65.userData.points.push(new PMPoint(-0.6, 0.8, 0.02));\n",
       "obj65.userData.points.push(new PMPoint(-0.528302, 0.849057, 4.44998e-05));\n",
       "obj65.userData.points.push(new PMPoint(-0.550459, 0.834862, 1.0521e-05));\n",
       "\n",
       "obj65.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj65.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj65.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj65.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj65.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj65.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj65);\n",
       "scene.add(obj65);\n",
       "\n",
       "var obj66 = new THREE.Object3D();\n",
       "obj66.name = \"unnamed__67\";\n",
       "obj66.userData.explodable = 1;\n",
       "obj66.userData.points = [];\n",
       "obj66.userData.points.push(new PMPoint(-0.6, 0.8, 0.02));\n",
       "obj66.userData.points.push(new PMPoint(-0.657534, 0.753425, 2.34566e-05));\n",
       "obj66.userData.points.push(new PMPoint(-0.642336, 0.766423, 0));\n",
       "\n",
       "obj66.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj66.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj66.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj66.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj66.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj66.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj66);\n",
       "scene.add(obj66);\n",
       "\n",
       "var obj67 = new THREE.Object3D();\n",
       "obj67.name = \"unnamed__68\";\n",
       "obj67.userData.explodable = 1;\n",
       "obj67.userData.points = [];\n",
       "obj67.userData.points.push(new PMPoint(-0.689655, 0.724138, 0.000148633));\n",
       "obj67.userData.points.push(new PMPoint(-0.657534, 0.753425, 2.34566e-05));\n",
       "obj67.userData.points.push(new PMPoint(-0.670103, 0.742268, 5.31406e-05));\n",
       "\n",
       "obj67.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj67.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj67.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj67.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj67.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj67.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj67);\n",
       "scene.add(obj67);\n",
       "\n",
       "var obj68 = new THREE.Object3D();\n",
       "obj68.name = \"unnamed__69\";\n",
       "obj68.userData.explodable = 1;\n",
       "obj68.userData.points = [];\n",
       "obj68.userData.points.push(new PMPoint(-0.689655, 0.724138, 0.000148633));\n",
       "obj68.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00059453));\n",
       "obj68.userData.points.push(new PMPoint(-0.710059, 0.704142, 0));\n",
       "\n",
       "obj68.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj68.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj68.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj68.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj68.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj68.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj68);\n",
       "scene.add(obj68);\n",
       "\n",
       "var obj69 = new THREE.Object3D();\n",
       "obj69.name = \"unnamed__70\";\n",
       "obj69.userData.explodable = 1;\n",
       "obj69.userData.points = [];\n",
       "obj69.userData.points.push(new PMPoint(-0.8, 0.6, 0.005));\n",
       "obj69.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00059453));\n",
       "obj69.userData.points.push(new PMPoint(-0.742268, 0.670103, 1.32852e-05));\n",
       "\n",
       "obj69.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj69.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj69.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj69.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj69.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj69.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj69);\n",
       "scene.add(obj69);\n",
       "\n",
       "var obj70 = new THREE.Object3D();\n",
       "obj70.name = \"unnamed__71\";\n",
       "obj70.userData.explodable = 1;\n",
       "obj70.userData.points = [];\n",
       "obj70.userData.points.push(new PMPoint(-0.8, 0.6, 0.005));\n",
       "obj70.userData.points.push(new PMPoint(-0.861538, 0.507692, 2.95858e-05));\n",
       "obj70.userData.points.push(new PMPoint(-0.849057, 0.528302, 0.000177999));\n",
       "\n",
       "obj70.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj70.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj70.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj70.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj70.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj70.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj70);\n",
       "scene.add(obj70);\n",
       "\n",
       "var obj71 = new THREE.Object3D();\n",
       "obj71.name = \"unnamed__72\";\n",
       "obj71.userData.explodable = 1;\n",
       "obj71.userData.points = [];\n",
       "obj71.userData.points.push(new PMPoint(-0.882353, 0.470588, 0.0017301));\n",
       "obj71.userData.points.push(new PMPoint(-0.861538, 0.507692, 2.95858e-05));\n",
       "obj71.userData.points.push(new PMPoint(-0.870466, 0.492228, 0));\n",
       "\n",
       "obj71.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj71.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj71.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj71.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj71.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj71.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj71);\n",
       "scene.add(obj71);\n",
       "\n",
       "var obj72 = new THREE.Object3D();\n",
       "obj72.name = \"unnamed__73\";\n",
       "obj72.userData.explodable = 1;\n",
       "obj72.userData.points = [];\n",
       "obj72.userData.points.push(new PMPoint(-0.882353, 0.470588, 0.0017301));\n",
       "obj72.userData.points.push(new PMPoint(-0.898876, 0.438202, 1.57808e-05));\n",
       "obj72.userData.points.push(new PMPoint(-0.892704, 0.450644, 0));\n",
       "\n",
       "obj72.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj72.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj72.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj72.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj72.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj72.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj72);\n",
       "scene.add(obj72);\n",
       "\n",
       "var obj73 = new THREE.Object3D();\n",
       "obj73.name = \"unnamed__74\";\n",
       "obj73.userData.explodable = 1;\n",
       "obj73.userData.points = [];\n",
       "obj73.userData.points.push(new PMPoint(-0.923077, 0.384615, 0.000739645));\n",
       "obj73.userData.points.push(new PMPoint(-0.898876, 0.438202, 1.57808e-05));\n",
       "obj73.userData.points.push(new PMPoint(-0.905882, 0.423529, 6.92042e-05));\n",
       "\n",
       "obj73.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj73.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj73.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj73.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj73.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj73.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj73);\n",
       "scene.add(obj73);\n",
       "\n",
       "var obj74 = new THREE.Object3D();\n",
       "obj74.name = \"unnamed__75\";\n",
       "obj74.userData.explodable = 1;\n",
       "obj74.userData.points = [];\n",
       "obj74.userData.points.push(new PMPoint(-0.923077, 0.384615, 0.000739645));\n",
       "obj74.userData.points.push(new PMPoint(-0.945946, 0.324324, 0.00036523));\n",
       "obj74.userData.points.push(new PMPoint(-0.939597, 0.342282, 0));\n",
       "\n",
       "obj74.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj74.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj74.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj74.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj74.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj74.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj74);\n",
       "scene.add(obj74);\n",
       "\n",
       "var obj75 = new THREE.Object3D();\n",
       "obj75.name = \"unnamed__76\";\n",
       "obj75.userData.explodable = 1;\n",
       "obj75.userData.points = [];\n",
       "obj75.userData.points.push(new PMPoint(-0.96, 0.28, 0.0002));\n",
       "obj75.userData.points.push(new PMPoint(-0.945946, 0.324324, 0.00036523));\n",
       "obj75.userData.points.push(new PMPoint(-0.951351, 0.308108, 0));\n",
       "\n",
       "obj75.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj75.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj75.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj75.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj75.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj75.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj75);\n",
       "scene.add(obj75);\n",
       "\n",
       "var obj76 = new THREE.Object3D();\n",
       "obj76.name = \"unnamed__77\";\n",
       "obj76.userData.explodable = 1;\n",
       "obj76.userData.points = [];\n",
       "obj76.userData.points.push(new PMPoint(-0.96, 0.28, 0.0002));\n",
       "obj76.userData.points.push(new PMPoint(-0.97561, 0.219512, 7.43605e-05));\n",
       "obj76.userData.points.push(new PMPoint(-0.969231, 0.246154, 0.000118343));\n",
       "\n",
       "obj76.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj76.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj76.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj76.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj76.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj76.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj76);\n",
       "scene.add(obj76);\n",
       "\n",
       "var obj77 = new THREE.Object3D();\n",
       "obj77.name = \"unnamed__78\";\n",
       "obj77.userData.explodable = 1;\n",
       "obj77.userData.points = [];\n",
       "obj77.userData.points.push(new PMPoint(-1, 0, 0.5));\n",
       "obj77.userData.points.push(new PMPoint(-0.97561, 0.219512, 7.43605e-05));\n",
       "obj77.userData.points.push(new PMPoint(-0.983607, 0.180328, 3.35931e-05));\n",
       "\n",
       "obj77.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj77.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj77.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj77.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj77.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj77.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj77);\n",
       "scene.add(obj77);\n",
       "\n",
       "var obj78 = new THREE.Object3D();\n",
       "obj78.name = \"unnamed__79\";\n",
       "obj78.userData.explodable = 1;\n",
       "obj78.userData.points = [];\n",
       "obj78.userData.points.push(new PMPoint(-1, 0, 0.5));\n",
       "obj78.userData.points.push(new PMPoint(-0.97561, -0.219512, 7.43605e-05));\n",
       "obj78.userData.points.push(new PMPoint(-0.983607, -0.180328, 3.35931e-05));\n",
       "\n",
       "obj78.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj78.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj78.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj78.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj78.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj78.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj78);\n",
       "scene.add(obj78);\n",
       "\n",
       "var obj79 = new THREE.Object3D();\n",
       "obj79.name = \"unnamed__80\";\n",
       "obj79.userData.explodable = 1;\n",
       "obj79.userData.points = [];\n",
       "obj79.userData.points.push(new PMPoint(-0.96, -0.28, 0.0002));\n",
       "obj79.userData.points.push(new PMPoint(-0.97561, -0.219512, 7.43605e-05));\n",
       "obj79.userData.points.push(new PMPoint(-0.969231, -0.246154, 0.000118343));\n",
       "\n",
       "obj79.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj79.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj79.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj79.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj79.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj79.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj79);\n",
       "scene.add(obj79);\n",
       "\n",
       "var obj80 = new THREE.Object3D();\n",
       "obj80.name = \"unnamed__81\";\n",
       "obj80.userData.explodable = 1;\n",
       "obj80.userData.points = [];\n",
       "obj80.userData.points.push(new PMPoint(-0.96, -0.28, 0.0002));\n",
       "obj80.userData.points.push(new PMPoint(-0.945946, -0.324324, 0.00036523));\n",
       "obj80.userData.points.push(new PMPoint(-0.951351, -0.308108, 0));\n",
       "\n",
       "obj80.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj80.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj80.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj80.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj80.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj80.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj80);\n",
       "scene.add(obj80);\n",
       "\n",
       "var obj81 = new THREE.Object3D();\n",
       "obj81.name = \"unnamed__82\";\n",
       "obj81.userData.explodable = 1;\n",
       "obj81.userData.points = [];\n",
       "obj81.userData.points.push(new PMPoint(-0.923077, -0.384615, 0.000739645));\n",
       "obj81.userData.points.push(new PMPoint(-0.945946, -0.324324, 0.00036523));\n",
       "obj81.userData.points.push(new PMPoint(-0.939597, -0.342282, 0));\n",
       "\n",
       "obj81.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj81.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj81.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj81.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj81.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj81.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj81);\n",
       "scene.add(obj81);\n",
       "\n",
       "var obj82 = new THREE.Object3D();\n",
       "obj82.name = \"unnamed__83\";\n",
       "obj82.userData.explodable = 1;\n",
       "obj82.userData.points = [];\n",
       "obj82.userData.points.push(new PMPoint(-0.923077, -0.384615, 0.000739645));\n",
       "obj82.userData.points.push(new PMPoint(-0.898876, -0.438202, 1.57808e-05));\n",
       "obj82.userData.points.push(new PMPoint(-0.905882, -0.423529, 6.92042e-05));\n",
       "\n",
       "obj82.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj82.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj82.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj82.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj82.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj82.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj82);\n",
       "scene.add(obj82);\n",
       "\n",
       "var obj83 = new THREE.Object3D();\n",
       "obj83.name = \"unnamed__84\";\n",
       "obj83.userData.explodable = 1;\n",
       "obj83.userData.points = [];\n",
       "obj83.userData.points.push(new PMPoint(-0.882353, -0.470588, 0.0017301));\n",
       "obj83.userData.points.push(new PMPoint(-0.898876, -0.438202, 1.57808e-05));\n",
       "obj83.userData.points.push(new PMPoint(-0.892704, -0.450644, 0));\n",
       "\n",
       "obj83.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj83.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj83.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj83.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj83.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj83.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj83);\n",
       "scene.add(obj83);\n",
       "\n",
       "var obj84 = new THREE.Object3D();\n",
       "obj84.name = \"unnamed__85\";\n",
       "obj84.userData.explodable = 1;\n",
       "obj84.userData.points = [];\n",
       "obj84.userData.points.push(new PMPoint(-0.882353, -0.470588, 0.0017301));\n",
       "obj84.userData.points.push(new PMPoint(-0.861538, -0.507692, 2.95858e-05));\n",
       "obj84.userData.points.push(new PMPoint(-0.870466, -0.492228, 0));\n",
       "\n",
       "obj84.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj84.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj84.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj84.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj84.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj84.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj84);\n",
       "scene.add(obj84);\n",
       "\n",
       "var obj85 = new THREE.Object3D();\n",
       "obj85.name = \"unnamed__86\";\n",
       "obj85.userData.explodable = 1;\n",
       "obj85.userData.points = [];\n",
       "obj85.userData.points.push(new PMPoint(-0.8, -0.6, 0.005));\n",
       "obj85.userData.points.push(new PMPoint(-0.861538, -0.507692, 2.95858e-05));\n",
       "obj85.userData.points.push(new PMPoint(-0.849057, -0.528302, 0.000177999));\n",
       "\n",
       "obj85.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj85.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj85.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj85.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj85.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj85.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj85);\n",
       "scene.add(obj85);\n",
       "\n",
       "var obj86 = new THREE.Object3D();\n",
       "obj86.name = \"unnamed__87\";\n",
       "obj86.userData.explodable = 1;\n",
       "obj86.userData.points = [];\n",
       "obj86.userData.points.push(new PMPoint(-0.8, -0.6, 0.005));\n",
       "obj86.userData.points.push(new PMPoint(-0.724138, -0.689655, 0.00059453));\n",
       "obj86.userData.points.push(new PMPoint(-0.742268, -0.670103, 1.32852e-05));\n",
       "\n",
       "obj86.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj86.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj86.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj86.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj86.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj86.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj86);\n",
       "scene.add(obj86);\n",
       "\n",
       "var obj87 = new THREE.Object3D();\n",
       "obj87.name = \"unnamed__88\";\n",
       "obj87.userData.explodable = 1;\n",
       "obj87.userData.points = [];\n",
       "obj87.userData.points.push(new PMPoint(-0.689655, -0.724138, 0.000148633));\n",
       "obj87.userData.points.push(new PMPoint(-0.724138, -0.689655, 0.00059453));\n",
       "obj87.userData.points.push(new PMPoint(-0.710059, -0.704142, 0));\n",
       "\n",
       "obj87.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj87.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj87.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj87.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj87.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj87.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj87);\n",
       "scene.add(obj87);\n",
       "\n",
       "var obj88 = new THREE.Object3D();\n",
       "obj88.name = \"unnamed__89\";\n",
       "obj88.userData.explodable = 1;\n",
       "obj88.userData.points = [];\n",
       "obj88.userData.points.push(new PMPoint(-0.689655, -0.724138, 0.000148633));\n",
       "obj88.userData.points.push(new PMPoint(-0.657534, -0.753425, 2.34566e-05));\n",
       "obj88.userData.points.push(new PMPoint(-0.670103, -0.742268, 5.31406e-05));\n",
       "\n",
       "obj88.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj88.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj88.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj88.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj88.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj88.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj88);\n",
       "scene.add(obj88);\n",
       "\n",
       "var obj89 = new THREE.Object3D();\n",
       "obj89.name = \"unnamed__90\";\n",
       "obj89.userData.explodable = 1;\n",
       "obj89.userData.points = [];\n",
       "obj89.userData.points.push(new PMPoint(-0.6, -0.8, 0.02));\n",
       "obj89.userData.points.push(new PMPoint(-0.657534, -0.753425, 2.34566e-05));\n",
       "obj89.userData.points.push(new PMPoint(-0.642336, -0.766423, 0));\n",
       "\n",
       "obj89.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj89.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj89.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj89.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj89.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj89.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj89);\n",
       "scene.add(obj89);\n",
       "\n",
       "var obj90 = new THREE.Object3D();\n",
       "obj90.name = \"unnamed__91\";\n",
       "obj90.userData.explodable = 1;\n",
       "obj90.userData.points = [];\n",
       "obj90.userData.points.push(new PMPoint(-0.6, -0.8, 0.02));\n",
       "obj90.userData.points.push(new PMPoint(-0.528302, -0.849057, 4.44998e-05));\n",
       "obj90.userData.points.push(new PMPoint(-0.550459, -0.834862, 1.0521e-05));\n",
       "\n",
       "obj90.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj90.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj90.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj90.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj90.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj90.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj90);\n",
       "scene.add(obj90);\n",
       "\n",
       "var obj91 = new THREE.Object3D();\n",
       "obj91.name = \"unnamed__92\";\n",
       "obj91.userData.explodable = 1;\n",
       "obj91.userData.points = [];\n",
       "obj91.userData.points.push(new PMPoint(-0.470588, -0.882353, 0.000432526));\n",
       "obj91.userData.points.push(new PMPoint(-0.528302, -0.849057, 4.44998e-05));\n",
       "obj91.userData.points.push(new PMPoint(-0.507692, -0.861538, 0.000118343));\n",
       "\n",
       "obj91.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj91.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj91.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj91.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj91.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj91.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj91);\n",
       "scene.add(obj91);\n",
       "\n",
       "var obj92 = new THREE.Object3D();\n",
       "obj92.name = \"unnamed__93\";\n",
       "obj92.userData.explodable = 1;\n",
       "obj92.userData.points = [];\n",
       "obj92.userData.points.push(new PMPoint(-0.470588, -0.882353, 0.000432526));\n",
       "obj92.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.00295858));\n",
       "obj92.userData.points.push(new PMPoint(-0.423529, -0.905882, 1.7301e-05));\n",
       "\n",
       "obj92.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj92.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj92.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj92.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj92.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj92.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj92);\n",
       "scene.add(obj92);\n",
       "\n",
       "var obj93 = new THREE.Object3D();\n",
       "obj93.name = \"unnamed__94\";\n",
       "obj93.userData.explodable = 1;\n",
       "obj93.userData.points = [];\n",
       "obj93.userData.points.push(new PMPoint(0, -1, 0.125));\n",
       "obj93.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.00295858));\n",
       "obj93.userData.points.push(new PMPoint(-0.324324, -0.945946, 9.13075e-05));\n",
       "\n",
       "obj93.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj93.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj93.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj93.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj93.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj93.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj93);\n",
       "scene.add(obj93);\n",
       "\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "function textSpriteMaterial(message, parameters) {\n",
       "    if ( parameters === undefined ) parameters = {};\n",
       "    var fontface = \"Helvetica\";\n",
       "    var fontsize = parameters.hasOwnProperty(\"fontsize\") ? parameters[\"fontsize\"] : 15;\n",
       "    fontsize = fontsize*10;\n",
       "    var lines = message.split('\\\\n');\n",
       "    var size = 512;\n",
       "    for(var i = 0; i<lines.length; i++){\n",
       "        var tmp = lines[i].length;\n",
       "        while(tmp*fontsize > size){\n",
       "           fontsize--;\n",
       "        }\n",
       "    }\n",
       "    \n",
       "    var canvas = document.createElement('canvas');\n",
       "    canvas.width = size;\n",
       "    canvas.height = size;\n",
       "    var context = canvas.getContext('2d');\n",
       "    context.fillStyle = \"rgba(255, 255, 255, 0)\";\n",
       "    context.fill();\n",
       "    context.font = fontsize + \"px \" + fontface;\n",
       "    \n",
       "    // text color\n",
       "    context.fillStyle = \"rgba(0, 0, 0, 1.0)\";\n",
       "     for(var i = 0; i<lines.length; i++){\n",
       "        context.fillText(lines[i], size/2, size/2+i*fontsize);\n",
       "     }\n",
       "    \n",
       "    // canvas contents will be used for a texture\n",
       "    var texture = new THREE.Texture(canvas);\n",
       "    texture.needsUpdate = true;\n",
       "    \n",
       "    var spriteMaterial = new THREE.SpriteMaterial({map: texture, depthTest: true, depthWrite: false, polygonOffset: true, polygonOffsetFactor: -1, polygonOffsetUnits: 1 });\n",
       "    return spriteMaterial;\n",
       "}\n",
       "\n",
       "\n",
       "// ---------------------- INITIALIZING OBJECTS--------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "function init_object(obj) {\n",
       "    if (obj.userData.hasOwnProperty(\"pointmaterial\")) {\n",
       "        init_points(obj);\n",
       "        modelContains.points = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"pointlabels\")) {\n",
       "        init_pointlabels(obj);\n",
       "        modelContains.pointlabels = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"edgematerial\")) {\n",
       "        init_lines(obj);\n",
       "        modelContains.lines = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"edgelabels\")) {\n",
       "        init_edgelabels(obj);\n",
       "        modelContains.edgelabels = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"arrowstyle\")) {\n",
       "        init_arrowheads(obj);\n",
       "        modelContains.arrowheads = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"facetmaterial\")) {\n",
       "        init_faces(obj);\n",
       "        modelContains.faces = true;\n",
       "    }\n",
       "}\n",
       "\n",
       "function init_points(obj) {\n",
       "    var pointgroup = new THREE.Group();\n",
       "    pointgroup.name = \"points\";\n",
       "    var points = obj.userData.points;\n",
       "    var radii = obj.userData.pointradii;\n",
       "    var materials = obj.userData.pointmaterial;\n",
       "    var geometry,material;\n",
       "    if (!Array.isArray(radii)) {\n",
       "        geometry = new THREE.SphereBufferGeometry(radii);  \n",
       "    }\n",
       "    if (!Array.isArray(materials)) {\n",
       "        material = materials;\n",
       "    }\n",
       "    for (var i=0; i<points.length; i++) {\n",
       "        var point = points[i];\n",
       "        if (Array.isArray(radii)) {\n",
       "            if (radii[i] == 0) {\n",
       "                continue;\n",
       "            }\n",
       "            geometry = new THREE.SphereBufferGeometry(radii[i]);  \n",
       "        } \n",
       "        if (Array.isArray(materials)) {\n",
       "            material = materials[i];     \n",
       "        } \n",
       "        var sphere = new THREE.Mesh(geometry, material);\n",
       "        point.addSphere(sphere);\n",
       "        pointgroup.add(sphere);\n",
       "    }\n",
       "    obj.add(pointgroup);\n",
       "}\n",
       "\n",
       "function init_pointlabels(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var labels = obj.userData.pointlabels;\n",
       "    var pointlabels = new THREE.Group();\n",
       "    pointlabels.name = \"pointlabels\";\n",
       "    if (Array.isArray(labels)) {\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "            var spriteMaterial = textSpriteMaterial( labels[i] );\n",
       "\t        var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            point.addLabel(sprite);\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    } else {\n",
       "        var spriteMaterial = textSpriteMaterial( labels );\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "\t        var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            point.addLabel(sprite);\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    }\n",
       "    obj.add(pointlabels);\n",
       "}\n",
       "\n",
       "function init_lines(obj) {\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var points = obj.userData.points;\n",
       "    var materials = obj.userData.edgematerial;\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    var bufarr = new Float32Array( obj.userData.edgeindices.length * 3 );\n",
       "    var bufattr = new THREE.Float32BufferAttribute( bufarr, 3 );\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    geometry.setAttribute('position', bufattr);\n",
       "    if (Array.isArray(materials)) {     \n",
       "        for (var i=0; i<materials.length; i++) {\n",
       "            geometry.addGroup(2*i,2,i);\n",
       "        }\n",
       "    }\n",
       "    var lines = new THREE.LineSegments(geometry, materials);\n",
       "    lines.name = \"lines\";\n",
       "    obj.add(lines);\n",
       "    updateEdgesPosition(obj);\n",
       "}\n",
       "\n",
       "function init_edgelabels(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var labels = obj.userData.edgelabels;\n",
       "    var edgelabels = new THREE.Group();\n",
       "    edgelabels.name = \"edgelabels\";\n",
       "    if (Array.isArray(labels)) {\n",
       "        for (var i=0; i<edgeindices.length; i=i+2) {\n",
       "            var point = points[i];\n",
       "            var spriteMaterial = textSpriteMaterial( labels[i] );\n",
       "            var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[i]].vector,points[edgeindices[i+1]].vector).multiplyScalar(0.5));\n",
       "            edgelabels.add(sprite);\n",
       "        }\n",
       "    } else {\n",
       "        var spriteMaterial = textSpriteMaterial( labels );\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "            var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[i]].vector,points[edgeindices[i+1]].vector).multiplyScalar(0.5));\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    }\n",
       "    obj.add(edgelabels);\n",
       "}\n",
       "\n",
       "function init_arrowheads(obj) {\n",
       "    var arrowheads = new THREE.Group();\n",
       "    arrowheads.name = \"arrowheads\";\n",
       "    var arrowstyle = obj.userData.arrowstyle;\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var edgematerials = obj.userData.edgematerial;\n",
       "    var points = obj.userData.points;\n",
       "    var material;\n",
       "    if (!Array.isArray(edgematerials)) {\n",
       "        material = new THREE.MeshBasicMaterial( {color: edgematerials.color} );\n",
       "    }\n",
       "\n",
       "    for (var i=0; i<edgeindices.length; i=i+2) {\n",
       "        var start = points[edgeindices[i]];\n",
       "        var end = points[edgeindices[i+1]];\n",
       "        var dist = start.vector.distanceTo( end.vector ) - start.radius() - end.radius();\n",
       "        if (dist <= 0) {\n",
       "            continue;\n",
       "        }\n",
       "        var dir = new THREE.Vector3().subVectors(end.vector,start.vector);\n",
       "        dir.normalize();\n",
       "        var axis = new THREE.Vector3().set(dir.z,0,-dir.x);\n",
       "        axis.normalize();\n",
       "        var radians = Math.acos( dir.y );\n",
       "        var radius = dist/25;\n",
       "        var height = dist/5;\n",
       "        var geometry = new THREE.ConeBufferGeometry(radius,height);\n",
       "        var position = new THREE.Vector3().addVectors(start.vector,dir.clone().multiplyScalar(start.radius()+dist-height/2));\n",
       "        if (Array.isArray(edgematerials)) {\n",
       "            material = new THREE.MeshBasicMaterial( {color: edgematerials[i].color} );\n",
       "        }\n",
       "        var cone = new THREE.Mesh( geometry, material );\n",
       "        cone.quaternion.setFromAxisAngle(axis,radians);;\n",
       "        cone.position.copy(position);;\n",
       "        arrowheads.add(cone);\n",
       "    }\n",
       "    obj.add(arrowheads);\n",
       "}\n",
       "\n",
       "function init_faces(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var facets = obj.userData.facets;\n",
       "    obj.userData.triangleindices = [];\n",
       "    for (var i=0; i<facets.length; i++) {\n",
       "        facet = facets[i];\n",
       "        for (var t=0; t<facet.length-2; t++) {\n",
       "            obj.userData.triangleindices.push(facet[0],facet[t+1],facet[t+2]);  \n",
       "        }\n",
       "    }\n",
       "    var bufarr = new Float32Array( obj.userData.triangleindices.length * 3 );\n",
       "    var bufattr = new THREE.Float32BufferAttribute(bufarr,3);\n",
       "    \n",
       "    var materials = obj.userData.facetmaterial;\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    geometry.setAttribute('position',bufattr);\n",
       "    if (Array.isArray(materials)) {\n",
       "        var tricount = 0;\n",
       "        var facet;\n",
       "        for (var i=0; i<facets.length; i++) {\n",
       "            facet = facets[i];\n",
       "            geometry.addGroup(tricount,(facet.length-2)*3,i);\n",
       "            tricount += (facet.length-2)*3;\n",
       "        }\n",
       "    }\n",
       "    var mesh = new THREE.Mesh(geometry, materials);\n",
       "    mesh.name = \"faces\";\n",
       "    obj.add(mesh); \n",
       "    updateFacesPosition(obj);\n",
       "}\n",
       "// //INITIALIZING\n",
       "\n",
       "\n",
       "function updateFacesPosition(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var indices = obj.userData.triangleindices;\n",
       "    var faces = obj.getObjectByName(\"faces\");\n",
       "    var ba = faces.geometry.getAttribute(\"position\");\n",
       "    for (var i=0; i<indices.length; i++) {\n",
       "        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); \n",
       "    }\n",
       "    faces.geometry.attributes.position.needsUpdate = true;\n",
       "    \n",
       "}\n",
       "\n",
       "function updateEdgesPosition(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var indices = obj.userData.edgeindices;\n",
       "    var lines = obj.getObjectByName(\"lines\");\n",
       "    var ba = lines.geometry.getAttribute(\"position\"); \n",
       "    for (var i=0; i<indices.length; i++) {\n",
       "        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); \n",
       "    }\n",
       "    lines.geometry.attributes.position.needsUpdate = true;\n",
       "}\n",
       "\n",
       "function onWindowResize() {\n",
       "    renderer.setSize( three.clientWidth, three.clientHeight );\n",
       "    svgRenderer.setSize( three.clientWidth, three.clientHeight );\n",
       "    updateCamera();\n",
       "}\n",
       "\n",
       "function updateCamera() {\n",
       "    var width = three.clientWidth;\n",
       "    var height = three.clientHeight;\n",
       "    var aspect = width / height;\n",
       "    if (camera.type == \"OrthographicCamera\") {\n",
       "        camera.left = frustumSize * aspect / - 2;\n",
       "        camera.right = frustumSize * aspect / 2;\n",
       "        camera.top = frustumSize / 2;\n",
       "        camera.bottom = - frustumSize / 2;\n",
       "    } else if (camera.type == \"PerspectiveCamera\") {\n",
       "        camera.aspect = aspect;\n",
       "    }\n",
       "    camera.updateProjectionMatrix();\n",
       "}\n",
       "\n",
       "function changeCamera(event) {\n",
       "    var selindex = event.currentTarget.selectedIndex;\n",
       "    camera = cameras[selindex];\n",
       "    control = controls[selindex];\n",
       "    control.enabled = true; \n",
       "    for (var i=0; i<controls.length; i++) {\n",
       "        if (i!=selindex) {\n",
       "            controls[i].enabled = false;\n",
       "        }\n",
       "    }\n",
       "    updateCamera();\n",
       "}\n",
       "\n",
       "var camtypenode = document.getElementById('cameraType_3');\n",
       "camtypenode.onchange = changeCamera;\n",
       "camtypenode.dispatchEvent(new Event('change'));\n",
       "\n",
       "onWindowResize();\n",
       "window.addEventListener('resize', onWindowResize);\t\n",
       "\n",
       "\n",
       "var xRotationEnabled = false;\n",
       "var yRotationEnabled = false;\n",
       "var zRotationEnabled = false;\n",
       "var rotationSpeedFactor = 1;\n",
       "var settingsShown = false;\n",
       "var labelsShown = true;\n",
       "var intervals = [];\n",
       "var timeouts = [];\n",
       "var explodingSpeed = 0.05;\n",
       "var explodeScale = 0;\n",
       "var XMLS = new XMLSerializer();\n",
       "var svgElement;\n",
       "var renderId;\n",
       "\n",
       "var render = function () {\n",
       "\n",
       "\trenderId = requestAnimationFrame(render);\n",
       "\n",
       "//\tcomment in for automatic explosion\n",
       "//\texplode(updateFactor());\n",
       "\n",
       "    var phi = 0.02 * rotationSpeedFactor;\n",
       "\n",
       "    if (xRotationEnabled) {\n",
       "        scene.rotation.x += phi;\n",
       "    }\n",
       "    if (yRotationEnabled) {\n",
       "        scene.rotation.y += phi;\n",
       "    }\n",
       "    if (zRotationEnabled) {\n",
       "        scene.rotation.z += phi;\n",
       "    }\n",
       "\n",
       "    control.update();\n",
       "    renderer.render(scene, camera);\n",
       "};\n",
       "\n",
       "if ( THREE.WEBGL.isWebGLAvailable() ) {\n",
       "\trender();\n",
       "} else {\n",
       "\tvar warning = WEBGL.getWebGLErrorMessage();\n",
       "\tthree.appendChild( warning );\n",
       "}\n",
       "    \n",
       "function changeTransparency() {\n",
       "    var opacity = 1-Number(event.currentTarget.value);\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        child = scene.children[i];\n",
       "        if ( child.userData.hasOwnProperty(\"facetmaterial\") ) {\n",
       "            if (Array.isArray(child.userData.facetmaterial)) {\n",
       "                for (var j=0; j<child.userData.facetmaterial.length; j++) {\n",
       "                    child.userData.facetmaterial[j].opacity = opacity;\n",
       "                }\n",
       "            } else {\n",
       "                child.userData.facetmaterial.opacity = opacity;\n",
       "            }    \n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function changeRotationX(event){\n",
       "    xRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "function changeRotationY(event){\n",
       "    yRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "function changeRotationZ(event){\n",
       "    zRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "\n",
       "function changeRotationSpeedFactor(event){\n",
       "    rotationSpeedFactor = Number(event.currentTarget.value);\n",
       "}\n",
       "\n",
       "function resetScene(){\n",
       "    scene.rotation.set(0,0,0);\n",
       "    camera.position.set(0,0,5);\n",
       "    camera.up.set(0,1,0);\n",
       "}\n",
       "\n",
       "function showSettings(event){\n",
       "    document.getElementById('settings_3').style.visibility = 'visible';\n",
       "    document.getElementById('showSettingsButton_3').style.visibility = 'hidden';\n",
       "    document.getElementById('hideSettingsButton_3').style.visibility = 'visible';\n",
       "    settingsShown = true;\n",
       "}\n",
       "\n",
       "function hideSettings(event){\n",
       "    document.getElementById('settings_3').style.visibility = 'hidden';\n",
       "    document.getElementById('showSettingsButton_3').style.visibility = 'visible';\n",
       "    document.getElementById('hideSettingsButton_3').style.visibility = 'hidden';\n",
       "    settingsShown = false;\n",
       "}\n",
       "\n",
       "\n",
       "\n",
       "var pos = 150* Math.PI;\n",
       "\n",
       "function updateFactor() {\n",
       "    pos++;\n",
       "    return Math.sin(.01*pos)+1;\n",
       "}\n",
       "\n",
       "// ------------------------ FOLDING ------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "// rotate point p around axis defined by points p1 and p2 by given angle\n",
       "function rotate(p, p1, p2, angle ){   \n",
       "    angle = -angle;\n",
       "    var x = p.x, y = p.y, z = p.z, \n",
       "    a = p1.x, b = p1.y, c = p1.z, \n",
       "    u = p2.x-p1.x, v = p2.y-p1.y, w = p2.z-p1.z;\n",
       "    var result = [];\n",
       "    var L = u*u + v*v + w*w;\n",
       "    var sqrt = Math.sqrt;\n",
       "    var cos = Math.cos;\n",
       "    var sin = Math.sin;\n",
       "\n",
       "    result[0] = ((a*(v*v+w*w)-u*(b*v+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*x*cos(angle)+sqrt(L)*(-c*v+b*w-w*y+v*z)*sin(angle))/L;\n",
       "    result[1] = ((b*(u*u+w*w)-v*(a*u+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*y*cos(angle)+sqrt(L)*(c*u-a*w+w*x-u*z)*sin(angle))/L;\n",
       "    result[2] = ((c*(u*u+v*v)-w*(a*u+b*v-u*x-v*y-w*z))*(1-cos(angle))+L*z*cos(angle)+sqrt(L)*(-b*u+a*v-v*x+u*y)*sin(angle))/L;\n",
       "\n",
       "    return result;\n",
       "}\n",
       "\n",
       "var fold = function(event){\n",
       "    var obj = foldables[Number(event.currentTarget.name)];\n",
       "    var foldvalue = Number(event.currentTarget.value);\n",
       "    var scale = foldvalue - obj.userData.oldscale;\n",
       "\n",
       "    for (var j=0; j<obj.userData.axes.length; j++) {\n",
       "        rotateVertices(obj, j, scale);\n",
       "    }\n",
       "    update(obj);\n",
       "    obj.userData.oldscale += scale;\n",
       "    lookAtBarycenter(obj);\n",
       "}\n",
       "\n",
       "function lookAtBarycenter(obj){\n",
       "    control.target = barycenter(obj);\n",
       "}\n",
       "\n",
       "function barycenter(obj) {\n",
       "    var center = new THREE.Vector3(0,0,0);\n",
       "    var points = obj.userData.points;\n",
       "    for (var i=0; i<points.length; i++){\n",
       "        center.add(points[i].vector);\n",
       "    }\n",
       "    center.divideScalar(points.length);\n",
       "    return center;\n",
       "}\n",
       "\n",
       "function rotateVertices(obj, edge, scale) {\n",
       "    var axes = obj.userData.axes;\n",
       "    var subtrees = obj.userData.subtrees;\n",
       "    var points = obj.userData.points;\n",
       "    var angles = obj.userData.angles;\n",
       "    if (edge < axes.length){\n",
       "        for (var j=0; j<subtrees[edge].length; j++){\n",
       "            var rotP = rotate(points[subtrees[edge][j]].vector, points[axes[edge][0]].vector,points[axes[edge][1]].vector, scale * (Math.PI - angles[edge]));\n",
       "            points[subtrees[edge][j]].set(rotP[0],rotP[1],rotP[2]);\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function update(obj) {\n",
       "   updateFacesPosition(obj);\n",
       "   updateEdgesPosition(obj);\n",
       "}\n",
       "\n",
       "if (foldables.length) {\n",
       "    var settings = document.getElementById('settings_3');\n",
       "    var foldDiv = document.createElement('div');\n",
       "    foldDiv.id = 'fold_3';\n",
       "    var title = document.createElement('strong');\n",
       "    title.innerHTML = 'Fold';\n",
       "    foldDiv.appendChild(title);\n",
       "    foldDiv.className = 'group';\n",
       "    for (var i=0; i<foldables.length; i++) {\n",
       "        var range = document.createElement('input');\n",
       "        range.type = 'range';\n",
       "        range.min = 0;\n",
       "        range.max = 1;\n",
       "        range.value = 0;\n",
       "        range.step = 0.001;\n",
       "        range.name = String(i);\n",
       "        range.oninput = fold;\n",
       "        foldDiv.appendChild(range);\n",
       "    }\n",
       "    lookAtBarycenter(foldables[0]);\n",
       "    settings.insertBefore(foldDiv,settings.childNodes[0]);\n",
       "}\n",
       "\n",
       "    \n",
       "// ---------------------- EXPLOSION ------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "if (explodableModel) {\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        obj = scene.children[i];\n",
       "        if ( obj.userData.explodable ) {\n",
       "            computeCentroid(obj);\n",
       "        }\n",
       "    }\n",
       "    document.getElementById('explodeRange_3').oninput = triggerExplode;\n",
       "    document.getElementById('explodeCheckbox_3').onchange = triggerAutomaticExplode;\n",
       "    document.getElementById('explodingSpeedRange_3').oninput = setExplodingSpeed;\n",
       "}\n",
       "\n",
       "function computeCentroid(obj) {\n",
       "    centroid = new THREE.Vector3();\n",
       "    obj.userData.points.forEach(function(pmpoint) {\n",
       "        centroid.add(pmpoint.vector);\t\t\t\n",
       "    });\n",
       "    centroid.divideScalar(obj.userData.points.length);\n",
       "    obj.userData.centroid = centroid;\n",
       "}\n",
       "\n",
       "function explode(factor) {\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        var obj = scene.children[i];\n",
       "        if (obj.userData.hasOwnProperty(\"centroid\")) { \n",
       "            var c = obj.userData.centroid;\n",
       "            obj.position.set(c.x*factor, c.y*factor, c.z*factor);\n",
       "        }\n",
       "    }\t\n",
       "}\n",
       "\n",
       "function triggerExplode(event){\n",
       "    explodeScale = Number(event.currentTarget.value);\n",
       "    explode(explodeScale);\n",
       "}\n",
       "\n",
       "function setExplodingSpeed(event){\n",
       "    explodingSpeed = Number(event.currentTarget.value);\n",
       "}\n",
       "\n",
       "function triggerAutomaticExplode(event){\n",
       "    if (event.currentTarget.checked){\n",
       "        startExploding();\n",
       "    } else {\n",
       "        clearIntervals();\n",
       "    }\t\n",
       "}\n",
       "\n",
       "function startExploding(){\n",
       "    intervals.push(setInterval(explodingInterval, 25));\n",
       "}\n",
       "\n",
       "\n",
       "function explodingInterval(){\n",
       "    explodeScale += explodingSpeed;\n",
       "    if (explodeScale <= 6){ \n",
       "        explode(explodeScale);\n",
       "    }\n",
       "    else{\n",
       "        explode(6);\n",
       "        explodeScale = 6;\n",
       "        clearIntervals();\n",
       "        timeouts.push(setTimeout(startUnexploding, 3000));\n",
       "    }\n",
       "    document.getElementById('explodeRange_3').value = explodeScale;\n",
       "}\n",
       "\n",
       "\n",
       "function startUnexploding(){\n",
       "    intervals.push(setInterval(unexplodingInterval, 25));\n",
       "}\n",
       "\n",
       "function unexplodingInterval(){\n",
       "    explodeScale -= explodingSpeed;\n",
       "    if (explodeScale >= 0){\t\n",
       "        explode(explodeScale);\n",
       "    }\n",
       "    else {\n",
       "        explode(0);\n",
       "        explodeScale = 0;\n",
       "        clearIntervals();\n",
       "        timeouts.push(setTimeout(startExploding, 3000));\n",
       "    }\n",
       "    document.getElementById('explodeRange_3').value = explodeScale;\n",
       "}\n",
       "\n",
       "function clearIntervals(){\n",
       "    intervals.forEach(function(interval){\n",
       "        clearInterval(interval);\n",
       "    });\n",
       "    intervals = [];\n",
       "    timeouts.forEach(function(timeout){\n",
       "        clearTimeout(timeout);\n",
       "    });\n",
       "    timeouts = [];\n",
       "}\n",
       "\n",
       "// ---------------------- DISPLAY --------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "const objectTypeInnerHTMLs = { points: \"Points\", pointlabels: \"Point labels\", lines: \"Edges\", edgelabels: \"Edge labels\", faces: \"Faces\", arrowheads: \"Arrow heads\" };\n",
       "const objectTypeVisible = {};\n",
       "Object.assign(objectTypeVisible,modelContains);\n",
       "const sortedObjectTypeKeys = Object.keys(objectTypeInnerHTMLs).sort();\n",
       "const shownObjectTypesList = document.getElementById('shownObjectTypesList_3');\n",
       "\n",
       "function setVisibility(bool,objname) {\n",
       "    for (var i=0; i<scene.children.length; i++){\n",
       "        var obj = scene.children[i].getObjectByName(objname);\n",
       "        if (obj) {\n",
       "            obj.visible = bool;\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function toggleObjectTypeVisibility(event){\n",
       "    var name = event.currentTarget.name;\n",
       "    var checked = event.currentTarget.checked;\n",
       "    objectTypeVisible[name] = checked;\n",
       "    setVisibility(checked,name);\n",
       "}\n",
       "\n",
       "for (var i=0; i<sortedObjectTypeKeys.length; i++){\n",
       "    var key = sortedObjectTypeKeys[i];\n",
       "    if (modelContains[key]) {\n",
       "        var objTypeNode = document.createElement('span');\n",
       "        objTypeNode.innerHTML = objectTypeInnerHTMLs[key] + '<br>';\n",
       "        var checkbox = document.createElement('input');\n",
       "        checkbox.type = 'checkbox';\n",
       "        checkbox.checked = true;\n",
       "        checkbox.name = key;\n",
       "        checkbox.onchange = toggleObjectTypeVisibility;\n",
       "        shownObjectTypesList.appendChild(checkbox);\n",
       "        shownObjectTypesList.appendChild(objTypeNode);\n",
       "    }\n",
       "}\n",
       "\n",
       "// ------------------------------------------------------\n",
       "\n",
       "function toggleObjectVisibility(event){\n",
       "    var nr = Number(event.currentTarget.name);\n",
       "    scene.children[nr].visible = event.currentTarget.checked;\n",
       "}\n",
       "\n",
       "// append checkboxes for displaying or hiding objects\n",
       "var shownObjectsList = document.getElementById('shownObjectsList_3');\n",
       "for (var i=0; i<scene.children.length; i++){\n",
       "    obj = scene.children[i];\n",
       "    var objNode = document.createElement('span');\n",
       "    objNode.innerHTML = obj.name + '<br>';\n",
       "    var checkbox = document.createElement('input');\n",
       "    checkbox.type = 'checkbox';\n",
       "    checkbox.checked = true;\n",
       "    checkbox.name = String(i);\n",
       "    checkbox.onchange = toggleObjectVisibility;\n",
       "    shownObjectsList.appendChild(checkbox);\n",
       "    shownObjectsList.appendChild(objNode);\n",
       "}\n",
       "\n",
       "// ---------------------- SVG ------------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "function takeSvgScreenshot() {\n",
       "    if (objectTypeVisible[\"pointlabels\"]) {\n",
       "        setVisibility(false,\"pointlabels\");\n",
       "    }\n",
       "    if (objectTypeVisible[\"edgelabels\"]) {\n",
       "        setVisibility(false,\"edgelabels\");\n",
       "    }\n",
       "    svgRenderer.render(scene,camera);\n",
       "    svgElement = XMLS.serializeToString(svgRenderer.domElement);\n",
       "    \n",
       "    if (objectTypeVisible[\"pointlabels\"]) {\n",
       "        setVisibility(true,\"pointlabels\");\n",
       "    }\n",
       "    if (objectTypeVisible[\"edgelabels\"]) {\n",
       "        setVisibility(true,\"edgelabels\");\n",
       "    }\n",
       "\n",
       "    if (document.getElementById('tab_3').checked){\n",
       "        //show in new tab\n",
       "        var myWindow = window.open(\"\",\"\");\n",
       "        myWindow.document.body.innerHTML = svgElement;\n",
       "    } else{\n",
       "        // download svg file \n",
       "        download(\"screenshot.svg\", svgElement);\n",
       "    }\n",
       "}\n",
       "\n",
       "function download(filename, text) {\n",
       "    var element = document.createElement('a');\n",
       "    element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));\n",
       "    element.setAttribute('download', filename);\n",
       "\n",
       "    element.style.display = 'none';\n",
       "    document.body.appendChild(element);\n",
       "\n",
       "    element.click();\n",
       "\n",
       "    document.body.removeChild(element);\n",
       "}\n",
       "\n",
       "\n",
       "document.getElementById('transparencyRange_3').oninput = changeTransparency;\n",
       "document.getElementById('changeRotationX_3').onchange = changeRotationX;\n",
       "document.getElementById('changeRotationY_3').onchange = changeRotationY;\n",
       "document.getElementById('changeRotationZ_3').onchange = changeRotationZ;\n",
       "document.getElementById('resetButton_3').onclick = resetScene;\n",
       "document.getElementById('rotationSpeedRange_3').oninput = changeRotationSpeedFactor;\n",
       "document.getElementById('takeScreenshot_3').onclick = takeSvgScreenshot;\n",
       "document.getElementById('showSettingsButton_3').onclick = showSettings;\n",
       "document.getElementById('hideSettingsButton_3').onclick = hideSettings;\n",
       "\n",
       "\n",
       "// ------------------ SHORTCUTS --------------------------------------------\n",
       "// -------------------------------------------------------------------------\n",
       "\n",
       "/**\n",
       " * http://www.openjs.com/scripts/events/keyboard_shortcuts/\n",
       " * Version : 2.01.B\n",
       " * By Binny V A\n",
       " * License : BSD\n",
       " */\n",
       "shortcut = {\n",
       "\t'all_shortcuts':{},//All the shortcuts are stored in this array\n",
       "\t'add': function(shortcut_combination,callback,opt) {\n",
       "\t\t//Provide a set of default options\n",
       "\t\tvar default_options = {\n",
       "\t\t\t'type':'keydown',\n",
       "\t\t\t'propagate':false,\n",
       "\t\t\t'disable_in_input':false,\n",
       "\t\t\t'target':document,\n",
       "\t\t\t'keycode':false\n",
       "\t\t}\n",
       "\t\tif(!opt) opt = default_options;\n",
       "\t\telse {\n",
       "\t\t\tfor(var dfo in default_options) {\n",
       "\t\t\t\tif(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo];\n",
       "\t\t\t}\n",
       "\t\t}\n",
       "\n",
       "\t\tvar ele = opt.target;\n",
       "\t\tif(typeof opt.target == 'string') ele = document.getElementById(opt.target);\n",
       "\t\tvar ths = this;\n",
       "\t\tshortcut_combination = shortcut_combination.toLowerCase();\n",
       "\n",
       "\t\t//The function to be called at keypress\n",
       "\t\tvar func = function(e) {\n",
       "\t\t\te = e || window.event;\n",
       "\t\t\t\n",
       "\t\t\tif(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields\n",
       "\t\t\t\tvar element;\n",
       "\t\t\t\tif(e.target) element=e.target;\n",
       "\t\t\t\telse if(e.srcElement) element=e.srcElement;\n",
       "\t\t\t\tif(element.nodeType==3) element=element.parentNode;\n",
       "\n",
       "\t\t\t\tif(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return;\n",
       "\t\t\t}\n",
       "\t\n",
       "\t\t\t//Find Which key is pressed\n",
       "\t\t\tif (e.keyCode) code = e.keyCode;\n",
       "\t\t\telse if (e.which) code = e.which;\n",
       "\t\t\tvar character = String.fromCharCode(code).toLowerCase();\n",
       "\t\t\t\n",
       "\t\t\tif(code == 188) character=\",\"; //If the user presses , when the type is onkeydown\n",
       "\t\t\tif(code == 190) character=\".\"; //If the user presses , when the type is onkeydown\n",
       "\n",
       "\t\t\tvar keys = shortcut_combination.split(\"+\");\n",
       "\t\t\t//Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked\n",
       "\t\t\tvar kp = 0;\n",
       "\t\t\t\n",
       "\t\t\t//Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken\n",
       "\t\t\tvar shift_nums = {\n",
       "\t\t\t\t\"`\":\"~\",\n",
       "\t\t\t\t\"1\":\"!\",\n",
       "\t\t\t\t\"2\":\"@\",\n",
       "\t\t\t\t\"3\":\"#\",\n",
       "\t\t\t\t\"4\":\"$\",\n",
       "\t\t\t\t\"5\":\"%\",\n",
       "\t\t\t\t\"6\":\"^\",\n",
       "\t\t\t\t\"7\":\"&\",\n",
       "\t\t\t\t\"8\":\"*\",\n",
       "\t\t\t\t\"9\":\"(\",\n",
       "\t\t\t\t\"0\":\")\",\n",
       "\t\t\t\t\"-\":\"_\",\n",
       "\t\t\t\t\"=\":\"+\",\n",
       "\t\t\t\t\";\":\":\",\n",
       "\t\t\t\t\"'\":\"\\\"\",\n",
       "\t\t\t\t\",\":\"<\",\n",
       "\t\t\t\t\".\":\">\",\n",
       "\t\t\t\t\"/\":\"?\",\n",
       "\t\t\t\t\"\\\\\":\"|\"\n",
       "\t\t\t}\n",
       "\t\t\t//Special Keys - and their codes\n",
       "\t\t\tvar special_keys = {\n",
       "\t\t\t\t'esc':27,\n",
       "\t\t\t\t'escape':27,\n",
       "\t\t\t\t'tab':9,\n",
       "\t\t\t\t'space':32,\n",
       "\t\t\t\t'return':13,\n",
       "\t\t\t\t'enter':13,\n",
       "\t\t\t\t'backspace':8,\n",
       "\t\n",
       "\t\t\t\t'scrolllock':145,\n",
       "\t\t\t\t'scroll_lock':145,\n",
       "\t\t\t\t'scroll':145,\n",
       "\t\t\t\t'capslock':20,\n",
       "\t\t\t\t'caps_lock':20,\n",
       "\t\t\t\t'caps':20,\n",
       "\t\t\t\t'numlock':144,\n",
       "\t\t\t\t'num_lock':144,\n",
       "\t\t\t\t'num':144,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'pause':19,\n",
       "\t\t\t\t'break':19,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'insert':45,\n",
       "\t\t\t\t'home':36,\n",
       "\t\t\t\t'delete':46,\n",
       "\t\t\t\t'end':35,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'pageup':33,\n",
       "\t\t\t\t'page_up':33,\n",
       "\t\t\t\t'pu':33,\n",
       "\t\n",
       "\t\t\t\t'pagedown':34,\n",
       "\t\t\t\t'page_down':34,\n",
       "\t\t\t\t'pd':34,\n",
       "\t\n",
       "\t\t\t\t'left':37,\n",
       "\t\t\t\t'up':38,\n",
       "\t\t\t\t'right':39,\n",
       "\t\t\t\t'down':40,\n",
       "\t\n",
       "\t\t\t\t'f1':112,\n",
       "\t\t\t\t'f2':113,\n",
       "\t\t\t\t'f3':114,\n",
       "\t\t\t\t'f4':115,\n",
       "\t\t\t\t'f5':116,\n",
       "\t\t\t\t'f6':117,\n",
       "\t\t\t\t'f7':118,\n",
       "\t\t\t\t'f8':119,\n",
       "\t\t\t\t'f9':120,\n",
       "\t\t\t\t'f10':121,\n",
       "\t\t\t\t'f11':122,\n",
       "\t\t\t\t'f12':123\n",
       "\t\t\t}\n",
       "\t\n",
       "\t\t\tvar modifiers = { \n",
       "\t\t\t\tshift: { wanted:false, pressed:false},\n",
       "\t\t\t\tctrl : { wanted:false, pressed:false},\n",
       "\t\t\t\talt  : { wanted:false, pressed:false},\n",
       "\t\t\t\tmeta : { wanted:false, pressed:false}\t//Meta is Mac specific\n",
       "\t\t\t};\n",
       "                        \n",
       "\t\t\tif(e.ctrlKey)\tmodifiers.ctrl.pressed = true;\n",
       "\t\t\tif(e.shiftKey)\tmodifiers.shift.pressed = true;\n",
       "\t\t\tif(e.altKey)\tmodifiers.alt.pressed = true;\n",
       "\t\t\tif(e.metaKey)   modifiers.meta.pressed = true;\n",
       "                        \n",
       "\t\t\tfor(var i=0; k=keys[i],i<keys.length; i++) {\n",
       "\t\t\t\t//Modifiers\n",
       "\t\t\t\tif(k == 'ctrl' || k == 'control') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.ctrl.wanted = true;\n",
       "\n",
       "\t\t\t\t} else if(k == 'shift') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.shift.wanted = true;\n",
       "\n",
       "\t\t\t\t} else if(k == 'alt') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.alt.wanted = true;\n",
       "\t\t\t\t} else if(k == 'meta') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.meta.wanted = true;\n",
       "\t\t\t\t} else if(k.length > 1) { //If it is a special key\n",
       "\t\t\t\t\tif(special_keys[k] == code) kp++;\n",
       "\t\t\t\t\t\n",
       "\t\t\t\t} else if(opt['keycode']) {\n",
       "\t\t\t\t\tif(opt['keycode'] == code) kp++;\n",
       "\n",
       "\t\t\t\t} else { //The special keys did not match\n",
       "\t\t\t\t\tif(character == k) kp++;\n",
       "\t\t\t\t\telse {\n",
       "\t\t\t\t\t\tif(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase\n",
       "\t\t\t\t\t\t\tcharacter = shift_nums[character]; \n",
       "\t\t\t\t\t\t\tif(character == k) kp++;\n",
       "\t\t\t\t\t\t}\n",
       "\t\t\t\t\t}\n",
       "\t\t\t\t}\n",
       "\t\t\t}\n",
       "\t\t\t\n",
       "\t\t\tif(kp == keys.length && \n",
       "\t\t\t\t\t\tmodifiers.ctrl.pressed == modifiers.ctrl.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.shift.pressed == modifiers.shift.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.alt.pressed == modifiers.alt.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.meta.pressed == modifiers.meta.wanted) {\n",
       "\t\t\t\tcallback(e);\n",
       "\t\n",
       "\t\t\t\tif(!opt['propagate']) { //Stop the event\n",
       "\t\t\t\t\t//e.cancelBubble is supported by IE - this will kill the bubbling process.\n",
       "\t\t\t\t\te.cancelBubble = true;\n",
       "\t\t\t\t\te.returnValue = false;\n",
       "\t\n",
       "\t\t\t\t\t//e.stopPropagation works in Firefox.\n",
       "\t\t\t\t\tif (e.stopPropagation) {\n",
       "\t\t\t\t\t\te.stopPropagation();\n",
       "\t\t\t\t\t\te.preventDefault();\n",
       "\t\t\t\t\t}\n",
       "\t\t\t\t\treturn false;\n",
       "\t\t\t\t}\n",
       "\t\t\t}\n",
       "\t\t}\n",
       "\t\tthis.all_shortcuts[shortcut_combination] = {\n",
       "\t\t\t'callback':func, \n",
       "\t\t\t'target':ele, \n",
       "\t\t\t'event': opt['type']\n",
       "\t\t};\n",
       "\t\t//Attach the function with the event\n",
       "\t\tif(ele.addEventListener) ele.addEventListener(opt['type'], func, false);\n",
       "\t\telse if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func);\n",
       "\t\telse ele['on'+opt['type']] = func;\n",
       "\t},\n",
       "\n",
       "\t//Remove the shortcut - just specify the shortcut and I will remove the binding\n",
       "\t'remove':function(shortcut_combination) {\n",
       "\t\tshortcut_combination = shortcut_combination.toLowerCase();\n",
       "\t\tvar binding = this.all_shortcuts[shortcut_combination];\n",
       "\t\tdelete(this.all_shortcuts[shortcut_combination])\n",
       "\t\tif(!binding) return;\n",
       "\t\tvar type = binding['event'];\n",
       "\t\tvar ele = binding['target'];\n",
       "\t\tvar callback = binding['callback'];\n",
       "\n",
       "\t\tif(ele.detachEvent) ele.detachEvent('on'+type, callback);\n",
       "\t\telse if(ele.removeEventListener) ele.removeEventListener(type, callback, false);\n",
       "\t\telse ele['on'+type] = false;\n",
       "\t}\n",
       "}\n",
       "\n",
       "shortcut.add(\"Alt+Left\",function() {\n",
       "\tvar event = new Event('click');\n",
       "\tif (settingsShown){\n",
       "\t\tdocument.getElementById('hideSettingsButton_3').dispatchEvent(event);\n",
       "\t} else {\n",
       "\t\tdocument.getElementById('showSettingsButton_3').dispatchEvent(event);\n",
       "\t}\n",
       "});\n",
       "\n",
       "\n",
       "// COMMON_CODE_BLOCK_END\n",
       "\n",
       "});});\n",
       "      </script>\n",
       "   </body>\n",
       "</html>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "$d1 = $s->gkz_dome(1,5);\n",
    "$d1->VISUAL(FacetColor=>'80 180 255');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "\n",
    "### Example 2: a hyperbolic torus with three cusps"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "$T3 = new Matrix<Int>([[1,0,2,17],[2,1,4,14],[0,2,0,6],[1,2,8,16],[0,1,5,10],[2,1,12,1],[0,2,9,3],[0,1,13,7],[0,2,15,11]]);\n",
    "$s = new HyperbolicSurface(DCEL=>$T3, PENNER_COORDINATES=>[2,1,1,1,1,1,1,1,1], SPECIAL_POINT=>[1,0]);"
   ]
  },
  {
   "attachments": {
    "paper_skizzen_3_281_29.png": {
     "image/png": "[encoded data, 84692 characters]"
    }
   },
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img src=\"attachment:paper_skizzen_3_281_29.png\" tooltip=\"paper_skizzen_3_281_29.png\" class=\"center-block\">"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<!--\n",
       "polymake for knusper\n",
       "Thu Aug 27 11:35:32 2020\n",
       "fan:\n",
       "-->\n",
       "\n",
       "\n",
       "<html>\n",
       "   <head>\n",
       "      <meta charset=utf-8>\n",
       "      <title>fan:</title>\n",
       "      <style>\n",
       "/*\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "*/\n",
       "         html {overflow: scroll;}\n",
       "         strong{font-size: 18px;}\n",
       "         canvas { z-index: 8; }\n",
       "         input[type='radio'] {margin-left:0;}\n",
       "         input[type='checkbox'] {margin-right:7px; margin-left: 0px; padding-left:0px;}\n",
       "         .group{padding-bottom: 15px;}\n",
       "         .settings * {z-index: 11; }\n",
       "         .settings{z-index: 10; font-family: Arial, Helvetica, sans-serif; margin-left: 30px; visibility: hidden; width: 14em; height: 96%; border: solid 1px silver; padding: 2px; overflow-y: scroll; box-sizing: border-box; background-color: white; position: absolute;}\n",
       "         .indented{margin-left: 20px; margin-top: 10px; padding-bottom: 0px;} \n",
       "         .shownObjectsList{overflow: auto; max-width: 150px; max-height: 150px;}\n",
       "         .showSettingsButton{visibility: visible; z-index: 12; position: absolute }\n",
       "         .hideSettingsButton{visibility: hidden; z-index: 12; position: absolute; opacity: 0.5}\n",
       "         button{margin-left: 0; margin-top: 10px}\n",
       "         img{cursor: pointer;}\n",
       "         .suboption{padding-top: 15px;}\n",
       "         #model33796082030 { width: 100%; height: 100%; }\n",
       "         .threejs_container { width: 100%; height: 75vh;}\n",
       "         .settings{max-height: 74vh} \n",
       "         input[type=range] {\n",
       "           -webkit-appearance: none;\n",
       "           padding:0; \n",
       "           width:90%; \n",
       "           margin-left: auto;\n",
       "           margin-right: auto;\n",
       "           margin-top: 15px;\n",
       "           margin-bottom: 15px;\n",
       "           display: block;\t\n",
       "         }\n",
       "         input[type=range]:focus {\n",
       "           outline: none;\n",
       "         }\n",
       "         input[type=range]::-webkit-slider-runnable-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "           background: #E3E3E3;\n",
       "           border-radius: 0px;\n",
       "           border: 0px solid #000000;\n",
       "         }\n",
       "         input[type=range]::-webkit-slider-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "           -webkit-appearance: none;\n",
       "           margin-top: -5px;\n",
       "         }\n",
       "         input[type=range]:focus::-webkit-slider-runnable-track {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "         input[type=range]::-moz-range-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "           background: #E3E3E3;\n",
       "           border-radius: 0px;\n",
       "           border: 0px solid #000000;\n",
       "         }\n",
       "         input[type=range]::-moz-range-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "         }\n",
       "         input[type=range]::-ms-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           background: transparent;\n",
       "           border-color: transparent;\n",
       "           color: transparent;\n",
       "         }\n",
       "         input[type=range]::-ms-fill-lower {\n",
       "           background: #E3E3E3;\n",
       "           border: 0px solid #000000;\n",
       "           border-radius: 0px;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "         }\n",
       "         input[type=range]::-ms-fill-upper {\n",
       "           background: #E3E3E3;\n",
       "           border: 0px solid #000000;\n",
       "           border-radius: 0px;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "         }\n",
       "         input[type=range]::-ms-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "         }\n",
       "         input[type=range]:focus::-ms-fill-lower {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "         input[type=range]:focus::-ms-fill-upper {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "/*\n",
       "// COMMON_CODE_BLOCK_END\n",
       "*/\n",
       "\t\t</style>\n",
       "   </head>\n",
       "<body>\n",
       "   <div class='threejs_container'>\n",
       "\t\t<div id='settings_4' class='settings'>\n",
       "\t\t\t<div class=group id='explode_4'>\n",
       "\t\t\t\t<strong>Explode</strong>\n",
       "\t\t\t\t<input id='explodeRange_4' type='range' min=0 max=6 step=0.01 value=0>\n",
       "\t\t\t\t<div class=indented><input id='explodeCheckbox_4' type='checkbox'>Automatic explosion</div>\n",
       "\t\t\t\t<div class=suboption>Exploding speed</div>\n",
       "\t\t\t\t<input id='explodingSpeedRange_4' type='range' min=0 max=0.5 step=0.001 value=0.05>\n",
       "\t\t\t</div>\n",
       "\t\n",
       "\t\t\t<div class=group id='transparency_4' class='transparency'>\n",
       "\t\t\t\t<strong>Transparency</strong>\n",
       "\t\t\t\t<input id='transparencyRange_4' type='range' min=0 max=1 step=0.01 value=0>\n",
       "\t\t\t</div>\n",
       "\t\t\t\n",
       "\t\t\t<div class=group id='rotation_4'>\n",
       "\t\t\t\t<strong>Rotation</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationX_4'> x-axis</div>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationY_4'> y-axis</div>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationZ_4'> z-axis</div>\n",
       "\t\t\t\t\t<button id='resetButton_4'>Reset</button>\n",
       "\t\t\t\t</div>\n",
       "\n",
       "\t\t\t\t<div class=suboption>Rotation speed</div>\n",
       "\t\t\t\t<input id='rotationSpeedRange_4' type='range' min=0 max=5 step=0.01 value=2>\n",
       "\t\t\t</div>\n",
       "\n",
       "\n",
       "\t\t\t<div class=group id='display_4'>\n",
       "\t\t\t\t<strong>Display</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<div id='shownObjectTypesList_4' class='shownObjectsList'></div>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t\t<div class=suboption>Objects</div>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t   <div id='shownObjectsList_4' class='shownObjectsList'></div>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t</div>\n",
       "         \n",
       "         <div class=group id='camera_4'>\n",
       "            <strong>Camera</strong>\n",
       "            <div class=indented>\n",
       "               <form>\n",
       "                  <select id=\"cameraType_4\">\n",
       "                     <option value='perspective' selected> Perspective<br></option>\n",
       "                     <option value='orthographic' > Orthographic<br></option>\n",
       "                  </select>\n",
       "               </form>\n",
       "            </div>\n",
       "         </div>\n",
       "\n",
       "\t\t\t<div class=group id='svg_4'>\n",
       "\t\t\t\t<strong>SVG</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<form>\n",
       "\t\t\t\t\t\t<input type=\"radio\" name='screenshotMode' value='download' id='download_4' checked> Download<br>\n",
       "\t\t\t\t\t\t<input type=\"radio\" name='screenshotMode' value='tab' id='tab_4' > New tab<br>\n",
       "\t\t\t\t\t</form>\n",
       "\t\t\t\t\t<button id='takeScreenshot_4'>Screenshot</button>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t</div>\n",
       "\n",
       "\t\t</div>\t<!-- end of settings -->\n",
       "\t\t<img id='hideSettingsButton_4' class='hideSettingsButton' src='/kernelspecs/polymake/close.svg' width=20px\">\n",
       "\t\t<img id='showSettingsButton_4' class='showSettingsButton' src='/kernelspecs/polymake/menu.svg' width=20px\">\n",
       "<div id=\"model33796082030\"></div>\n",
       "</div>\n",
       "   <script>\n",
       "    requirejs.config({\n",
       "      paths: {\n",
       "        three: '/kernelspecs/polymake/three',\n",
       "        TrackballControls: '/kernelspecs/polymake/TrackballControls',\n",
       "        OrbitControls: '/kernelspecs/polymake/OrbitControls',\n",
       "        Projector: '/kernelspecs/polymake/Projector',\n",
       "        SVGRenderer: '/kernelspecs/polymake/SVGRenderer',\n",
       "        WEBGL: '/kernelspecs/polymake/WebGL',\n",
       "      },\n",
       "      shim: {\n",
       "        'three': { exports: 'THREE'},\n",
       "        'SVGRenderer': { deps: [ 'three' ], exports: 'THREE.SVGRenderer' },\n",
       "        'WEBGL': { deps: [ 'three' ], exports: 'THREE.WEBGL' },\n",
       "        'Projector': { deps: [ 'three' ], exports: 'THREE.Projector' },\n",
       "        'TrackballControls': { deps: [ 'three' ], exports: 'THREE.TrackballControls' },\n",
       "        'OrbitControls': { deps: [ 'three' ], exports: 'THREE.OrbitControls' },\n",
       "      }\n",
       "    });\n",
       "    \n",
       "    require(['three'],function(THREE){\n",
       "        window.THREE = THREE;\n",
       "      require(['TrackballControls', 'OrbitControls', 'Projector', 'SVGRenderer', 'WEBGL'],\n",
       "               function(TrackballControls, OrbitControls, Projector, SVGRenderer, WEBGL) {\n",
       "    THREE.TrackballControls = TrackballControls;\n",
       "    THREE.OrbitControls = OrbitControls;\n",
       "    THREE.Projector = Projector;\n",
       "    THREE.SVGRenderer = SVGRenderer;\n",
       "    THREE.WEBGL = WEBGL;\n",
       "\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "\n",
       "const intervalLength = 25; // for automatic animations\n",
       "const explodableModel = true; \n",
       "const modelContains = { points: false, pointlabels: false, lines: false, edgelabels: false, faces: false, arrowheads: false };\n",
       "const foldables = [];\n",
       "\n",
       "var three = document.getElementById(\"model33796082030\");\n",
       "var scene = new THREE.Scene();\n",
       "var renderer = new THREE.WebGLRenderer( { antialias: true } );\n",
       "var svgRenderer = new THREE.SVGRenderer( { antialias: true } );\n",
       "renderer.setPixelRatio( window.devicePixelRatio );\n",
       "renderer.setClearColor(0xFFFFFF, 1);\n",
       "svgRenderer.setClearColor(0xFFFFFF, 1);\n",
       "three.appendChild(renderer.domElement);\n",
       "\n",
       "var frustumSize = 4;\n",
       "var cameras = [new THREE.PerspectiveCamera(75, 1, 0.1, 1000), new THREE.OrthographicCamera()];\n",
       "cameras.forEach(function(cam) {\n",
       "    cam.position.set(0, 0, 5);\n",
       "    cam.lookAt(0, 0, 0);  \n",
       "    cam.up.set(0, 1, 0);         \n",
       "});\n",
       "var controls = [new THREE.TrackballControls(cameras[0], three), new THREE.OrbitControls(cameras[1], three)];\n",
       "var camera, control;\n",
       "\n",
       "controls[0].zoomSpeed = 0.2;\n",
       "controls[0].rotateSpeed = 4;\n",
       "\n",
       "\n",
       "// class to allow move points together with labels and spheres\n",
       "var PMPoint = function (x,y,z) {\n",
       "   this.vector = new THREE.Vector3(x,y,z);\n",
       "   this.sprite = null;\n",
       "   this.sphere = null;\n",
       "}\n",
       "PMPoint.prototype.addLabel = function(labelsprite) {\n",
       "   this.sprite = labelsprite;\n",
       "   this.sprite.position.copy(this.vector);\n",
       "}\n",
       "PMPoint.prototype.addSphere = function(spheremesh) {\n",
       "   this.sphere = spheremesh;\n",
       "   this.sphere.position.copy(this.vector);\n",
       "}\n",
       "PMPoint.prototype.set = function(x,y,z) {\n",
       "   this.vector.set(x,y,z);\n",
       "   if (this.sprite) {\n",
       "      this.sprite.position.copy(this.vector);\n",
       "   }\n",
       "   if (this.sphere) {\n",
       "      this.sphere.position.copy(this.vector);\n",
       "   }\n",
       "}\n",
       "PMPoint.prototype.radius = function() {\n",
       "   if (this.sphere) {\n",
       "      return this.sphere.geometry.parameters.radius;\n",
       "   } else {\n",
       "      return 0;\n",
       "   }\n",
       "};\n",
       "// select the target node\n",
       "var target = document.querySelector('#model33796082030');\n",
       "\n",
       "// create an observer instance\n",
       "var observer = new MutationObserver(function(mutations) {\n",
       "   mutations.forEach(function(mutation) {\n",
       "      if (mutation.removedNodes && mutation.removedNodes.length > 0) {\n",
       "         cancelAnimationFrame(renderId);\n",
       "         observer.disconnect();\n",
       "         console.log(\"cancelled frame \"+renderId);\n",
       "      }\n",
       "   });\n",
       "});\n",
       "\n",
       "// configuration of the observer:\n",
       "var config = { childList: true, characterData: true }\n",
       "\n",
       "// pass in the target node, as well as the observer options\n",
       "while (target) {\n",
       "   if (target.className==\"output\") {\n",
       "      observer.observe(target, config);\n",
       "      break;\n",
       "   }\n",
       "   target = target.parentNode;\n",
       "}\n",
       "\n",
       "// COMMON_CODE_BLOCK_END\n",
       "\n",
       "var obj0 = new THREE.Object3D();\n",
       "obj0.name = \"Rays\";\n",
       "obj0.userData.explodable = 0;\n",
       "obj0.userData.points = [];\n",
       "obj0.userData.points.push(new PMPoint(0, 0, 0));\n",
       "obj0.userData.points.push(new PMPoint(0, 0.529999, 0.847998));\n",
       "obj0.userData.points.push(new PMPoint(0.451039, 0.751731, 0.481108));\n",
       "obj0.userData.points.push(new PMPoint(0.529999, 0, 0.847998));\n",
       "obj0.userData.points.push(new PMPoint(0.751731, 0.451039, 0.481108));\n",
       "obj0.userData.points.push(new PMPoint(0.707107, 0.707107, 0));\n",
       "obj0.userData.points.push(new PMPoint(0.846499, 0.282166, 0.451466));\n",
       "obj0.userData.points.push(new PMPoint(0, 0, 1));\n",
       "obj0.userData.points.push(new PMPoint(0.282166, 0.846499, 0.451466));\n",
       "obj0.userData.points.push(new PMPoint(0.882353, 0, 0.470588));\n",
       "obj0.userData.points.push(new PMPoint(0, 0.882353, 0.470588));\n",
       "obj0.userData.points.push(new PMPoint(0.948683, 0.316228, 0));\n",
       "obj0.userData.points.push(new PMPoint(0.316228, 0.948683, 0));\n",
       "obj0.userData.points.push(new PMPoint(1, 0, 0));\n",
       "obj0.userData.points.push(new PMPoint(0, 1, 0));\n",
       "\n",
       "obj0.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj0.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj0.userData.pointlabels = [\" \", \"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"10\", \"11\", \"12\", \"13\"];\n",
       "obj0.userData.edgeindices = [1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0, 9, 0, 10, 0, 11, 0, 12, 0, 13, 0, 14, 0];\n",
       "   <!-- Edge style -->\n",
       "obj0.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj0);\n",
       "scene.add(obj0);\n",
       "\n",
       "var obj1 = new THREE.Object3D();\n",
       "obj1.name = \"unnamed__1\";\n",
       "obj1.userData.explodable = 1;\n",
       "obj1.userData.points = [];\n",
       "obj1.userData.points.push(new PMPoint(0, 0.529999, 0.847998));\n",
       "obj1.userData.points.push(new PMPoint(0.451039, 0.751731, 0.481108));\n",
       "obj1.userData.points.push(new PMPoint(0.529999, 0, 0.847998));\n",
       "obj1.userData.points.push(new PMPoint(0.751731, 0.451039, 0.481108));\n",
       "obj1.userData.points.push(new PMPoint(0, 0, 0));\n",
       "\n",
       "obj1.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 0, 4, 1, 4, 2, 4, 3, 4];\n",
       "   <!-- Edge style -->\n",
       "obj1.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj1.userData.facets = [[4, 2, 0], [3, 2, 4], [1, 3, 4], [4, 0, 1], [0, 2, 3, 1]];\n",
       "   <!-- Facet style -->\n",
       "obj1.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj1);\n",
       "scene.add(obj1);\n",
       "\n",
       "var obj2 = new THREE.Object3D();\n",
       "obj2.name = \"unnamed__2\";\n",
       "obj2.userData.explodable = 1;\n",
       "obj2.userData.points = [];\n",
       "obj2.userData.points.push(new PMPoint(0.451039, 0.751731, 0.481108));\n",
       "obj2.userData.points.push(new PMPoint(0.751731, 0.451039, 0.481108));\n",
       "obj2.userData.points.push(new PMPoint(0.707107, 0.707107, 0));\n",
       "obj2.userData.points.push(new PMPoint(0, 0, 0));\n",
       "\n",
       "obj2.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj2.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj2.userData.facets = [[1, 3, 2], [0, 3, 1], [2, 3, 0], [1, 2, 0]];\n",
       "   <!-- Facet style -->\n",
       "obj2.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj2);\n",
       "scene.add(obj2);\n",
       "\n",
       "var obj3 = new THREE.Object3D();\n",
       "obj3.name = \"unnamed__3\";\n",
       "obj3.userData.explodable = 1;\n",
       "obj3.userData.points = [];\n",
       "obj3.userData.points.push(new PMPoint(0.529999, 0, 0.847998));\n",
       "obj3.userData.points.push(new PMPoint(0.751731, 0.451039, 0.481108));\n",
       "obj3.userData.points.push(new PMPoint(0.846499, 0.282166, 0.451466));\n",
       "obj3.userData.points.push(new PMPoint(0, 0, 0));\n",
       "\n",
       "obj3.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj3.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj3.userData.facets = [[1, 3, 0], [2, 3, 1], [0, 3, 2], [1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj3.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj3);\n",
       "scene.add(obj3);\n",
       "\n",
       "var obj4 = new THREE.Object3D();\n",
       "obj4.name = \"unnamed__4\";\n",
       "obj4.userData.explodable = 1;\n",
       "obj4.userData.points = [];\n",
       "obj4.userData.points.push(new PMPoint(0, 0.529999, 0.847998));\n",
       "obj4.userData.points.push(new PMPoint(0.529999, 0, 0.847998));\n",
       "obj4.userData.points.push(new PMPoint(0, 0, 1));\n",
       "obj4.userData.points.push(new PMPoint(0, 0, 0));\n",
       "\n",
       "obj4.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj4.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj4.userData.facets = [[3, 0, 1], [2, 0, 3], [3, 1, 2], [1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj4.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj4);\n",
       "scene.add(obj4);\n",
       "\n",
       "var obj5 = new THREE.Object3D();\n",
       "obj5.name = \"unnamed__5\";\n",
       "obj5.userData.explodable = 1;\n",
       "obj5.userData.points = [];\n",
       "obj5.userData.points.push(new PMPoint(0, 0.529999, 0.847998));\n",
       "obj5.userData.points.push(new PMPoint(0.451039, 0.751731, 0.481108));\n",
       "obj5.userData.points.push(new PMPoint(0.282166, 0.846499, 0.451466));\n",
       "obj5.userData.points.push(new PMPoint(0, 0, 0));\n",
       "\n",
       "obj5.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj5.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj5.userData.facets = [[1, 3, 2], [0, 3, 1], [2, 3, 0], [1, 2, 0]];\n",
       "   <!-- Facet style -->\n",
       "obj5.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj5);\n",
       "scene.add(obj5);\n",
       "\n",
       "var obj6 = new THREE.Object3D();\n",
       "obj6.name = \"unnamed__6\";\n",
       "obj6.userData.explodable = 1;\n",
       "obj6.userData.points = [];\n",
       "obj6.userData.points.push(new PMPoint(0.751731, 0.451039, 0.481108));\n",
       "obj6.userData.points.push(new PMPoint(0.707107, 0.707107, 0));\n",
       "obj6.userData.points.push(new PMPoint(0.846499, 0.282166, 0.451466));\n",
       "obj6.userData.points.push(new PMPoint(0, 0, 0));\n",
       "\n",
       "obj6.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj6.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj6.userData.facets = [[3, 0, 1], [2, 0, 3], [3, 1, 2], [1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj6.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj6);\n",
       "scene.add(obj6);\n",
       "\n",
       "var obj7 = new THREE.Object3D();\n",
       "obj7.name = \"unnamed__7\";\n",
       "obj7.userData.explodable = 1;\n",
       "obj7.userData.points = [];\n",
       "obj7.userData.points.push(new PMPoint(0.451039, 0.751731, 0.481108));\n",
       "obj7.userData.points.push(new PMPoint(0.707107, 0.707107, 0));\n",
       "obj7.userData.points.push(new PMPoint(0.282166, 0.846499, 0.451466));\n",
       "obj7.userData.points.push(new PMPoint(0, 0, 0));\n",
       "\n",
       "obj7.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj7.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj7.userData.facets = [[3, 0, 2], [1, 0, 3], [3, 2, 1], [2, 0, 1]];\n",
       "   <!-- Facet style -->\n",
       "obj7.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj7);\n",
       "scene.add(obj7);\n",
       "\n",
       "var obj8 = new THREE.Object3D();\n",
       "obj8.name = \"unnamed__8\";\n",
       "obj8.userData.explodable = 1;\n",
       "obj8.userData.points = [];\n",
       "obj8.userData.points.push(new PMPoint(0.529999, 0, 0.847998));\n",
       "obj8.userData.points.push(new PMPoint(0.846499, 0.282166, 0.451466));\n",
       "obj8.userData.points.push(new PMPoint(0.882353, 0, 0.470588));\n",
       "obj8.userData.points.push(new PMPoint(0, 0, 0));\n",
       "\n",
       "obj8.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj8.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj8.userData.facets = [[3, 0, 1], [2, 0, 3], [3, 1, 2], [1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj8.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj8);\n",
       "scene.add(obj8);\n",
       "\n",
       "var obj9 = new THREE.Object3D();\n",
       "obj9.name = \"unnamed__9\";\n",
       "obj9.userData.explodable = 1;\n",
       "obj9.userData.points = [];\n",
       "obj9.userData.points.push(new PMPoint(0, 0.529999, 0.847998));\n",
       "obj9.userData.points.push(new PMPoint(0.282166, 0.846499, 0.451466));\n",
       "obj9.userData.points.push(new PMPoint(0, 0.882353, 0.470588));\n",
       "obj9.userData.points.push(new PMPoint(0, 0, 0));\n",
       "\n",
       "obj9.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj9.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj9.userData.facets = [[3, 0, 2], [1, 0, 3], [3, 2, 1], [2, 0, 1]];\n",
       "   <!-- Facet style -->\n",
       "obj9.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj9);\n",
       "scene.add(obj9);\n",
       "\n",
       "var obj10 = new THREE.Object3D();\n",
       "obj10.name = \"unnamed__10\";\n",
       "obj10.userData.explodable = 1;\n",
       "obj10.userData.points = [];\n",
       "obj10.userData.points.push(new PMPoint(0.707107, 0.707107, 0));\n",
       "obj10.userData.points.push(new PMPoint(0.846499, 0.282166, 0.451466));\n",
       "obj10.userData.points.push(new PMPoint(0.948683, 0.316228, 0));\n",
       "obj10.userData.points.push(new PMPoint(0, 0, 0));\n",
       "\n",
       "obj10.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj10.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj10.userData.facets = [[3, 1, 0], [2, 1, 3], [3, 0, 2], [0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj10.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj10);\n",
       "scene.add(obj10);\n",
       "\n",
       "var obj11 = new THREE.Object3D();\n",
       "obj11.name = \"unnamed__11\";\n",
       "obj11.userData.explodable = 1;\n",
       "obj11.userData.points = [];\n",
       "obj11.userData.points.push(new PMPoint(0.707107, 0.707107, 0));\n",
       "obj11.userData.points.push(new PMPoint(0.282166, 0.846499, 0.451466));\n",
       "obj11.userData.points.push(new PMPoint(0.316228, 0.948683, 0));\n",
       "obj11.userData.points.push(new PMPoint(0, 0, 0));\n",
       "\n",
       "obj11.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj11.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj11.userData.facets = [[3, 0, 1], [2, 0, 3], [3, 1, 2], [1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj11.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj11);\n",
       "scene.add(obj11);\n",
       "\n",
       "var obj12 = new THREE.Object3D();\n",
       "obj12.name = \"unnamed__12\";\n",
       "obj12.userData.explodable = 1;\n",
       "obj12.userData.points = [];\n",
       "obj12.userData.points.push(new PMPoint(0.846499, 0.282166, 0.451466));\n",
       "obj12.userData.points.push(new PMPoint(0.882353, 0, 0.470588));\n",
       "obj12.userData.points.push(new PMPoint(0.948683, 0.316228, 0));\n",
       "obj12.userData.points.push(new PMPoint(1, 0, 0));\n",
       "obj12.userData.points.push(new PMPoint(0, 0, 0));\n",
       "\n",
       "obj12.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 0, 4, 1, 4, 2, 4, 3, 4];\n",
       "   <!-- Edge style -->\n",
       "obj12.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj12.userData.facets = [[1, 4, 3], [1, 0, 4], [2, 4, 0], [3, 4, 2], [1, 3, 2, 0]];\n",
       "   <!-- Facet style -->\n",
       "obj12.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj12);\n",
       "scene.add(obj12);\n",
       "\n",
       "var obj13 = new THREE.Object3D();\n",
       "obj13.name = \"unnamed__13\";\n",
       "obj13.userData.explodable = 1;\n",
       "obj13.userData.points = [];\n",
       "obj13.userData.points.push(new PMPoint(0.282166, 0.846499, 0.451466));\n",
       "obj13.userData.points.push(new PMPoint(0, 0.882353, 0.470588));\n",
       "obj13.userData.points.push(new PMPoint(0.316228, 0.948683, 0));\n",
       "obj13.userData.points.push(new PMPoint(0, 1, 0));\n",
       "obj13.userData.points.push(new PMPoint(0, 0, 0));\n",
       "\n",
       "obj13.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 0, 4, 1, 4, 2, 4, 3, 4];\n",
       "   <!-- Edge style -->\n",
       "obj13.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj13.userData.facets = [[4, 1, 3], [0, 1, 4], [4, 3, 2], [2, 0, 4], [3, 1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj13.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj13);\n",
       "scene.add(obj13);\n",
       "\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "function textSpriteMaterial(message, parameters) {\n",
       "    if ( parameters === undefined ) parameters = {};\n",
       "    var fontface = \"Helvetica\";\n",
       "    var fontsize = parameters.hasOwnProperty(\"fontsize\") ? parameters[\"fontsize\"] : 15;\n",
       "    fontsize = fontsize*10;\n",
       "    var lines = message.split('\\\\n');\n",
       "    var size = 512;\n",
       "    for(var i = 0; i<lines.length; i++){\n",
       "        var tmp = lines[i].length;\n",
       "        while(tmp*fontsize > size){\n",
       "           fontsize--;\n",
       "        }\n",
       "    }\n",
       "    \n",
       "    var canvas = document.createElement('canvas');\n",
       "    canvas.width = size;\n",
       "    canvas.height = size;\n",
       "    var context = canvas.getContext('2d');\n",
       "    context.fillStyle = \"rgba(255, 255, 255, 0)\";\n",
       "    context.fill();\n",
       "    context.font = fontsize + \"px \" + fontface;\n",
       "    \n",
       "    // text color\n",
       "    context.fillStyle = \"rgba(0, 0, 0, 1.0)\";\n",
       "     for(var i = 0; i<lines.length; i++){\n",
       "        context.fillText(lines[i], size/2, size/2+i*fontsize);\n",
       "     }\n",
       "    \n",
       "    // canvas contents will be used for a texture\n",
       "    var texture = new THREE.Texture(canvas);\n",
       "    texture.needsUpdate = true;\n",
       "    \n",
       "    var spriteMaterial = new THREE.SpriteMaterial({map: texture, depthTest: true, depthWrite: false, polygonOffset: true, polygonOffsetFactor: -1, polygonOffsetUnits: 1 });\n",
       "    return spriteMaterial;\n",
       "}\n",
       "\n",
       "\n",
       "// ---------------------- INITIALIZING OBJECTS--------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "function init_object(obj) {\n",
       "    if (obj.userData.hasOwnProperty(\"pointmaterial\")) {\n",
       "        init_points(obj);\n",
       "        modelContains.points = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"pointlabels\")) {\n",
       "        init_pointlabels(obj);\n",
       "        modelContains.pointlabels = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"edgematerial\")) {\n",
       "        init_lines(obj);\n",
       "        modelContains.lines = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"edgelabels\")) {\n",
       "        init_edgelabels(obj);\n",
       "        modelContains.edgelabels = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"arrowstyle\")) {\n",
       "        init_arrowheads(obj);\n",
       "        modelContains.arrowheads = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"facetmaterial\")) {\n",
       "        init_faces(obj);\n",
       "        modelContains.faces = true;\n",
       "    }\n",
       "}\n",
       "\n",
       "function init_points(obj) {\n",
       "    var pointgroup = new THREE.Group();\n",
       "    pointgroup.name = \"points\";\n",
       "    var points = obj.userData.points;\n",
       "    var radii = obj.userData.pointradii;\n",
       "    var materials = obj.userData.pointmaterial;\n",
       "    var geometry,material;\n",
       "    if (!Array.isArray(radii)) {\n",
       "        geometry = new THREE.SphereBufferGeometry(radii);  \n",
       "    }\n",
       "    if (!Array.isArray(materials)) {\n",
       "        material = materials;\n",
       "    }\n",
       "    for (var i=0; i<points.length; i++) {\n",
       "        var point = points[i];\n",
       "        if (Array.isArray(radii)) {\n",
       "            if (radii[i] == 0) {\n",
       "                continue;\n",
       "            }\n",
       "            geometry = new THREE.SphereBufferGeometry(radii[i]);  \n",
       "        } \n",
       "        if (Array.isArray(materials)) {\n",
       "            material = materials[i];     \n",
       "        } \n",
       "        var sphere = new THREE.Mesh(geometry, material);\n",
       "        point.addSphere(sphere);\n",
       "        pointgroup.add(sphere);\n",
       "    }\n",
       "    obj.add(pointgroup);\n",
       "}\n",
       "\n",
       "function init_pointlabels(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var labels = obj.userData.pointlabels;\n",
       "    var pointlabels = new THREE.Group();\n",
       "    pointlabels.name = \"pointlabels\";\n",
       "    if (Array.isArray(labels)) {\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "            var spriteMaterial = textSpriteMaterial( labels[i] );\n",
       "\t        var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            point.addLabel(sprite);\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    } else {\n",
       "        var spriteMaterial = textSpriteMaterial( labels );\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "\t        var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            point.addLabel(sprite);\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    }\n",
       "    obj.add(pointlabels);\n",
       "}\n",
       "\n",
       "function init_lines(obj) {\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var points = obj.userData.points;\n",
       "    var materials = obj.userData.edgematerial;\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    var bufarr = new Float32Array( obj.userData.edgeindices.length * 3 );\n",
       "    var bufattr = new THREE.Float32BufferAttribute( bufarr, 3 );\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    geometry.setAttribute('position', bufattr);\n",
       "    if (Array.isArray(materials)) {     \n",
       "        for (var i=0; i<materials.length; i++) {\n",
       "            geometry.addGroup(2*i,2,i);\n",
       "        }\n",
       "    }\n",
       "    var lines = new THREE.LineSegments(geometry, materials);\n",
       "    lines.name = \"lines\";\n",
       "    obj.add(lines);\n",
       "    updateEdgesPosition(obj);\n",
       "}\n",
       "\n",
       "function init_edgelabels(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var labels = obj.userData.edgelabels;\n",
       "    var edgelabels = new THREE.Group();\n",
       "    edgelabels.name = \"edgelabels\";\n",
       "    if (Array.isArray(labels)) {\n",
       "        for (var i=0; i<edgeindices.length; i=i+2) {\n",
       "            var point = points[i];\n",
       "            var spriteMaterial = textSpriteMaterial( labels[i] );\n",
       "            var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[i]].vector,points[edgeindices[i+1]].vector).multiplyScalar(0.5));\n",
       "            edgelabels.add(sprite);\n",
       "        }\n",
       "    } else {\n",
       "        var spriteMaterial = textSpriteMaterial( labels );\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "            var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[i]].vector,points[edgeindices[i+1]].vector).multiplyScalar(0.5));\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    }\n",
       "    obj.add(edgelabels);\n",
       "}\n",
       "\n",
       "function init_arrowheads(obj) {\n",
       "    var arrowheads = new THREE.Group();\n",
       "    arrowheads.name = \"arrowheads\";\n",
       "    var arrowstyle = obj.userData.arrowstyle;\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var edgematerials = obj.userData.edgematerial;\n",
       "    var points = obj.userData.points;\n",
       "    var material;\n",
       "    if (!Array.isArray(edgematerials)) {\n",
       "        material = new THREE.MeshBasicMaterial( {color: edgematerials.color} );\n",
       "    }\n",
       "\n",
       "    for (var i=0; i<edgeindices.length; i=i+2) {\n",
       "        var start = points[edgeindices[i]];\n",
       "        var end = points[edgeindices[i+1]];\n",
       "        var dist = start.vector.distanceTo( end.vector ) - start.radius() - end.radius();\n",
       "        if (dist <= 0) {\n",
       "            continue;\n",
       "        }\n",
       "        var dir = new THREE.Vector3().subVectors(end.vector,start.vector);\n",
       "        dir.normalize();\n",
       "        var axis = new THREE.Vector3().set(dir.z,0,-dir.x);\n",
       "        axis.normalize();\n",
       "        var radians = Math.acos( dir.y );\n",
       "        var radius = dist/25;\n",
       "        var height = dist/5;\n",
       "        var geometry = new THREE.ConeBufferGeometry(radius,height);\n",
       "        var position = new THREE.Vector3().addVectors(start.vector,dir.clone().multiplyScalar(start.radius()+dist-height/2));\n",
       "        if (Array.isArray(edgematerials)) {\n",
       "            material = new THREE.MeshBasicMaterial( {color: edgematerials[i].color} );\n",
       "        }\n",
       "        var cone = new THREE.Mesh( geometry, material );\n",
       "        cone.quaternion.setFromAxisAngle(axis,radians);;\n",
       "        cone.position.copy(position);;\n",
       "        arrowheads.add(cone);\n",
       "    }\n",
       "    obj.add(arrowheads);\n",
       "}\n",
       "\n",
       "function init_faces(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var facets = obj.userData.facets;\n",
       "    obj.userData.triangleindices = [];\n",
       "    for (var i=0; i<facets.length; i++) {\n",
       "        facet = facets[i];\n",
       "        for (var t=0; t<facet.length-2; t++) {\n",
       "            obj.userData.triangleindices.push(facet[0],facet[t+1],facet[t+2]);  \n",
       "        }\n",
       "    }\n",
       "    var bufarr = new Float32Array( obj.userData.triangleindices.length * 3 );\n",
       "    var bufattr = new THREE.Float32BufferAttribute(bufarr,3);\n",
       "    \n",
       "    var materials = obj.userData.facetmaterial;\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    geometry.setAttribute('position',bufattr);\n",
       "    if (Array.isArray(materials)) {\n",
       "        var tricount = 0;\n",
       "        var facet;\n",
       "        for (var i=0; i<facets.length; i++) {\n",
       "            facet = facets[i];\n",
       "            geometry.addGroup(tricount,(facet.length-2)*3,i);\n",
       "            tricount += (facet.length-2)*3;\n",
       "        }\n",
       "    }\n",
       "    var mesh = new THREE.Mesh(geometry, materials);\n",
       "    mesh.name = \"faces\";\n",
       "    obj.add(mesh); \n",
       "    updateFacesPosition(obj);\n",
       "}\n",
       "// //INITIALIZING\n",
       "\n",
       "\n",
       "function updateFacesPosition(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var indices = obj.userData.triangleindices;\n",
       "    var faces = obj.getObjectByName(\"faces\");\n",
       "    var ba = faces.geometry.getAttribute(\"position\");\n",
       "    for (var i=0; i<indices.length; i++) {\n",
       "        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); \n",
       "    }\n",
       "    faces.geometry.attributes.position.needsUpdate = true;\n",
       "    \n",
       "}\n",
       "\n",
       "function updateEdgesPosition(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var indices = obj.userData.edgeindices;\n",
       "    var lines = obj.getObjectByName(\"lines\");\n",
       "    var ba = lines.geometry.getAttribute(\"position\"); \n",
       "    for (var i=0; i<indices.length; i++) {\n",
       "        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); \n",
       "    }\n",
       "    lines.geometry.attributes.position.needsUpdate = true;\n",
       "}\n",
       "\n",
       "function onWindowResize() {\n",
       "    renderer.setSize( three.clientWidth, three.clientHeight );\n",
       "    svgRenderer.setSize( three.clientWidth, three.clientHeight );\n",
       "    updateCamera();\n",
       "}\n",
       "\n",
       "function updateCamera() {\n",
       "    var width = three.clientWidth;\n",
       "    var height = three.clientHeight;\n",
       "    var aspect = width / height;\n",
       "    if (camera.type == \"OrthographicCamera\") {\n",
       "        camera.left = frustumSize * aspect / - 2;\n",
       "        camera.right = frustumSize * aspect / 2;\n",
       "        camera.top = frustumSize / 2;\n",
       "        camera.bottom = - frustumSize / 2;\n",
       "    } else if (camera.type == \"PerspectiveCamera\") {\n",
       "        camera.aspect = aspect;\n",
       "    }\n",
       "    camera.updateProjectionMatrix();\n",
       "}\n",
       "\n",
       "function changeCamera(event) {\n",
       "    var selindex = event.currentTarget.selectedIndex;\n",
       "    camera = cameras[selindex];\n",
       "    control = controls[selindex];\n",
       "    control.enabled = true; \n",
       "    for (var i=0; i<controls.length; i++) {\n",
       "        if (i!=selindex) {\n",
       "            controls[i].enabled = false;\n",
       "        }\n",
       "    }\n",
       "    updateCamera();\n",
       "}\n",
       "\n",
       "var camtypenode = document.getElementById('cameraType_4');\n",
       "camtypenode.onchange = changeCamera;\n",
       "camtypenode.dispatchEvent(new Event('change'));\n",
       "\n",
       "onWindowResize();\n",
       "window.addEventListener('resize', onWindowResize);\t\n",
       "\n",
       "\n",
       "var xRotationEnabled = false;\n",
       "var yRotationEnabled = false;\n",
       "var zRotationEnabled = false;\n",
       "var rotationSpeedFactor = 1;\n",
       "var settingsShown = false;\n",
       "var labelsShown = true;\n",
       "var intervals = [];\n",
       "var timeouts = [];\n",
       "var explodingSpeed = 0.05;\n",
       "var explodeScale = 0;\n",
       "var XMLS = new XMLSerializer();\n",
       "var svgElement;\n",
       "var renderId;\n",
       "\n",
       "var render = function () {\n",
       "\n",
       "\trenderId = requestAnimationFrame(render);\n",
       "\n",
       "//\tcomment in for automatic explosion\n",
       "//\texplode(updateFactor());\n",
       "\n",
       "    var phi = 0.02 * rotationSpeedFactor;\n",
       "\n",
       "    if (xRotationEnabled) {\n",
       "        scene.rotation.x += phi;\n",
       "    }\n",
       "    if (yRotationEnabled) {\n",
       "        scene.rotation.y += phi;\n",
       "    }\n",
       "    if (zRotationEnabled) {\n",
       "        scene.rotation.z += phi;\n",
       "    }\n",
       "\n",
       "    control.update();\n",
       "    renderer.render(scene, camera);\n",
       "};\n",
       "\n",
       "if ( THREE.WEBGL.isWebGLAvailable() ) {\n",
       "\trender();\n",
       "} else {\n",
       "\tvar warning = WEBGL.getWebGLErrorMessage();\n",
       "\tthree.appendChild( warning );\n",
       "}\n",
       "    \n",
       "function changeTransparency() {\n",
       "    var opacity = 1-Number(event.currentTarget.value);\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        child = scene.children[i];\n",
       "        if ( child.userData.hasOwnProperty(\"facetmaterial\") ) {\n",
       "            if (Array.isArray(child.userData.facetmaterial)) {\n",
       "                for (var j=0; j<child.userData.facetmaterial.length; j++) {\n",
       "                    child.userData.facetmaterial[j].opacity = opacity;\n",
       "                }\n",
       "            } else {\n",
       "                child.userData.facetmaterial.opacity = opacity;\n",
       "            }    \n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function changeRotationX(event){\n",
       "    xRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "function changeRotationY(event){\n",
       "    yRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "function changeRotationZ(event){\n",
       "    zRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "\n",
       "function changeRotationSpeedFactor(event){\n",
       "    rotationSpeedFactor = Number(event.currentTarget.value);\n",
       "}\n",
       "\n",
       "function resetScene(){\n",
       "    scene.rotation.set(0,0,0);\n",
       "    camera.position.set(0,0,5);\n",
       "    camera.up.set(0,1,0);\n",
       "}\n",
       "\n",
       "function showSettings(event){\n",
       "    document.getElementById('settings_4').style.visibility = 'visible';\n",
       "    document.getElementById('showSettingsButton_4').style.visibility = 'hidden';\n",
       "    document.getElementById('hideSettingsButton_4').style.visibility = 'visible';\n",
       "    settingsShown = true;\n",
       "}\n",
       "\n",
       "function hideSettings(event){\n",
       "    document.getElementById('settings_4').style.visibility = 'hidden';\n",
       "    document.getElementById('showSettingsButton_4').style.visibility = 'visible';\n",
       "    document.getElementById('hideSettingsButton_4').style.visibility = 'hidden';\n",
       "    settingsShown = false;\n",
       "}\n",
       "\n",
       "\n",
       "\n",
       "var pos = 150* Math.PI;\n",
       "\n",
       "function updateFactor() {\n",
       "    pos++;\n",
       "    return Math.sin(.01*pos)+1;\n",
       "}\n",
       "\n",
       "// ------------------------ FOLDING ------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "// rotate point p around axis defined by points p1 and p2 by given angle\n",
       "function rotate(p, p1, p2, angle ){   \n",
       "    angle = -angle;\n",
       "    var x = p.x, y = p.y, z = p.z, \n",
       "    a = p1.x, b = p1.y, c = p1.z, \n",
       "    u = p2.x-p1.x, v = p2.y-p1.y, w = p2.z-p1.z;\n",
       "    var result = [];\n",
       "    var L = u*u + v*v + w*w;\n",
       "    var sqrt = Math.sqrt;\n",
       "    var cos = Math.cos;\n",
       "    var sin = Math.sin;\n",
       "\n",
       "    result[0] = ((a*(v*v+w*w)-u*(b*v+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*x*cos(angle)+sqrt(L)*(-c*v+b*w-w*y+v*z)*sin(angle))/L;\n",
       "    result[1] = ((b*(u*u+w*w)-v*(a*u+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*y*cos(angle)+sqrt(L)*(c*u-a*w+w*x-u*z)*sin(angle))/L;\n",
       "    result[2] = ((c*(u*u+v*v)-w*(a*u+b*v-u*x-v*y-w*z))*(1-cos(angle))+L*z*cos(angle)+sqrt(L)*(-b*u+a*v-v*x+u*y)*sin(angle))/L;\n",
       "\n",
       "    return result;\n",
       "}\n",
       "\n",
       "var fold = function(event){\n",
       "    var obj = foldables[Number(event.currentTarget.name)];\n",
       "    var foldvalue = Number(event.currentTarget.value);\n",
       "    var scale = foldvalue - obj.userData.oldscale;\n",
       "\n",
       "    for (var j=0; j<obj.userData.axes.length; j++) {\n",
       "        rotateVertices(obj, j, scale);\n",
       "    }\n",
       "    update(obj);\n",
       "    obj.userData.oldscale += scale;\n",
       "    lookAtBarycenter(obj);\n",
       "}\n",
       "\n",
       "function lookAtBarycenter(obj){\n",
       "    control.target = barycenter(obj);\n",
       "}\n",
       "\n",
       "function barycenter(obj) {\n",
       "    var center = new THREE.Vector3(0,0,0);\n",
       "    var points = obj.userData.points;\n",
       "    for (var i=0; i<points.length; i++){\n",
       "        center.add(points[i].vector);\n",
       "    }\n",
       "    center.divideScalar(points.length);\n",
       "    return center;\n",
       "}\n",
       "\n",
       "function rotateVertices(obj, edge, scale) {\n",
       "    var axes = obj.userData.axes;\n",
       "    var subtrees = obj.userData.subtrees;\n",
       "    var points = obj.userData.points;\n",
       "    var angles = obj.userData.angles;\n",
       "    if (edge < axes.length){\n",
       "        for (var j=0; j<subtrees[edge].length; j++){\n",
       "            var rotP = rotate(points[subtrees[edge][j]].vector, points[axes[edge][0]].vector,points[axes[edge][1]].vector, scale * (Math.PI - angles[edge]));\n",
       "            points[subtrees[edge][j]].set(rotP[0],rotP[1],rotP[2]);\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function update(obj) {\n",
       "   updateFacesPosition(obj);\n",
       "   updateEdgesPosition(obj);\n",
       "}\n",
       "\n",
       "if (foldables.length) {\n",
       "    var settings = document.getElementById('settings_4');\n",
       "    var foldDiv = document.createElement('div');\n",
       "    foldDiv.id = 'fold_4';\n",
       "    var title = document.createElement('strong');\n",
       "    title.innerHTML = 'Fold';\n",
       "    foldDiv.appendChild(title);\n",
       "    foldDiv.className = 'group';\n",
       "    for (var i=0; i<foldables.length; i++) {\n",
       "        var range = document.createElement('input');\n",
       "        range.type = 'range';\n",
       "        range.min = 0;\n",
       "        range.max = 1;\n",
       "        range.value = 0;\n",
       "        range.step = 0.001;\n",
       "        range.name = String(i);\n",
       "        range.oninput = fold;\n",
       "        foldDiv.appendChild(range);\n",
       "    }\n",
       "    lookAtBarycenter(foldables[0]);\n",
       "    settings.insertBefore(foldDiv,settings.childNodes[0]);\n",
       "}\n",
       "\n",
       "    \n",
       "// ---------------------- EXPLOSION ------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "if (explodableModel) {\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        obj = scene.children[i];\n",
       "        if ( obj.userData.explodable ) {\n",
       "            computeCentroid(obj);\n",
       "        }\n",
       "    }\n",
       "    document.getElementById('explodeRange_4').oninput = triggerExplode;\n",
       "    document.getElementById('explodeCheckbox_4').onchange = triggerAutomaticExplode;\n",
       "    document.getElementById('explodingSpeedRange_4').oninput = setExplodingSpeed;\n",
       "}\n",
       "\n",
       "function computeCentroid(obj) {\n",
       "    centroid = new THREE.Vector3();\n",
       "    obj.userData.points.forEach(function(pmpoint) {\n",
       "        centroid.add(pmpoint.vector);\t\t\t\n",
       "    });\n",
       "    centroid.divideScalar(obj.userData.points.length);\n",
       "    obj.userData.centroid = centroid;\n",
       "}\n",
       "\n",
       "function explode(factor) {\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        var obj = scene.children[i];\n",
       "        if (obj.userData.hasOwnProperty(\"centroid\")) { \n",
       "            var c = obj.userData.centroid;\n",
       "            obj.position.set(c.x*factor, c.y*factor, c.z*factor);\n",
       "        }\n",
       "    }\t\n",
       "}\n",
       "\n",
       "function triggerExplode(event){\n",
       "    explodeScale = Number(event.currentTarget.value);\n",
       "    explode(explodeScale);\n",
       "}\n",
       "\n",
       "function setExplodingSpeed(event){\n",
       "    explodingSpeed = Number(event.currentTarget.value);\n",
       "}\n",
       "\n",
       "function triggerAutomaticExplode(event){\n",
       "    if (event.currentTarget.checked){\n",
       "        startExploding();\n",
       "    } else {\n",
       "        clearIntervals();\n",
       "    }\t\n",
       "}\n",
       "\n",
       "function startExploding(){\n",
       "    intervals.push(setInterval(explodingInterval, 25));\n",
       "}\n",
       "\n",
       "\n",
       "function explodingInterval(){\n",
       "    explodeScale += explodingSpeed;\n",
       "    if (explodeScale <= 6){ \n",
       "        explode(explodeScale);\n",
       "    }\n",
       "    else{\n",
       "        explode(6);\n",
       "        explodeScale = 6;\n",
       "        clearIntervals();\n",
       "        timeouts.push(setTimeout(startUnexploding, 3000));\n",
       "    }\n",
       "    document.getElementById('explodeRange_4').value = explodeScale;\n",
       "}\n",
       "\n",
       "\n",
       "function startUnexploding(){\n",
       "    intervals.push(setInterval(unexplodingInterval, 25));\n",
       "}\n",
       "\n",
       "function unexplodingInterval(){\n",
       "    explodeScale -= explodingSpeed;\n",
       "    if (explodeScale >= 0){\t\n",
       "        explode(explodeScale);\n",
       "    }\n",
       "    else {\n",
       "        explode(0);\n",
       "        explodeScale = 0;\n",
       "        clearIntervals();\n",
       "        timeouts.push(setTimeout(startExploding, 3000));\n",
       "    }\n",
       "    document.getElementById('explodeRange_4').value = explodeScale;\n",
       "}\n",
       "\n",
       "function clearIntervals(){\n",
       "    intervals.forEach(function(interval){\n",
       "        clearInterval(interval);\n",
       "    });\n",
       "    intervals = [];\n",
       "    timeouts.forEach(function(timeout){\n",
       "        clearTimeout(timeout);\n",
       "    });\n",
       "    timeouts = [];\n",
       "}\n",
       "\n",
       "// ---------------------- DISPLAY --------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "const objectTypeInnerHTMLs = { points: \"Points\", pointlabels: \"Point labels\", lines: \"Edges\", edgelabels: \"Edge labels\", faces: \"Faces\", arrowheads: \"Arrow heads\" };\n",
       "const objectTypeVisible = {};\n",
       "Object.assign(objectTypeVisible,modelContains);\n",
       "const sortedObjectTypeKeys = Object.keys(objectTypeInnerHTMLs).sort();\n",
       "const shownObjectTypesList = document.getElementById('shownObjectTypesList_4');\n",
       "\n",
       "function setVisibility(bool,objname) {\n",
       "    for (var i=0; i<scene.children.length; i++){\n",
       "        var obj = scene.children[i].getObjectByName(objname);\n",
       "        if (obj) {\n",
       "            obj.visible = bool;\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function toggleObjectTypeVisibility(event){\n",
       "    var name = event.currentTarget.name;\n",
       "    var checked = event.currentTarget.checked;\n",
       "    objectTypeVisible[name] = checked;\n",
       "    setVisibility(checked,name);\n",
       "}\n",
       "\n",
       "for (var i=0; i<sortedObjectTypeKeys.length; i++){\n",
       "    var key = sortedObjectTypeKeys[i];\n",
       "    if (modelContains[key]) {\n",
       "        var objTypeNode = document.createElement('span');\n",
       "        objTypeNode.innerHTML = objectTypeInnerHTMLs[key] + '<br>';\n",
       "        var checkbox = document.createElement('input');\n",
       "        checkbox.type = 'checkbox';\n",
       "        checkbox.checked = true;\n",
       "        checkbox.name = key;\n",
       "        checkbox.onchange = toggleObjectTypeVisibility;\n",
       "        shownObjectTypesList.appendChild(checkbox);\n",
       "        shownObjectTypesList.appendChild(objTypeNode);\n",
       "    }\n",
       "}\n",
       "\n",
       "// ------------------------------------------------------\n",
       "\n",
       "function toggleObjectVisibility(event){\n",
       "    var nr = Number(event.currentTarget.name);\n",
       "    scene.children[nr].visible = event.currentTarget.checked;\n",
       "}\n",
       "\n",
       "// append checkboxes for displaying or hiding objects\n",
       "var shownObjectsList = document.getElementById('shownObjectsList_4');\n",
       "for (var i=0; i<scene.children.length; i++){\n",
       "    obj = scene.children[i];\n",
       "    var objNode = document.createElement('span');\n",
       "    objNode.innerHTML = obj.name + '<br>';\n",
       "    var checkbox = document.createElement('input');\n",
       "    checkbox.type = 'checkbox';\n",
       "    checkbox.checked = true;\n",
       "    checkbox.name = String(i);\n",
       "    checkbox.onchange = toggleObjectVisibility;\n",
       "    shownObjectsList.appendChild(checkbox);\n",
       "    shownObjectsList.appendChild(objNode);\n",
       "}\n",
       "\n",
       "// ---------------------- SVG ------------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "function takeSvgScreenshot() {\n",
       "    if (objectTypeVisible[\"pointlabels\"]) {\n",
       "        setVisibility(false,\"pointlabels\");\n",
       "    }\n",
       "    if (objectTypeVisible[\"edgelabels\"]) {\n",
       "        setVisibility(false,\"edgelabels\");\n",
       "    }\n",
       "    svgRenderer.render(scene,camera);\n",
       "    svgElement = XMLS.serializeToString(svgRenderer.domElement);\n",
       "    \n",
       "    if (objectTypeVisible[\"pointlabels\"]) {\n",
       "        setVisibility(true,\"pointlabels\");\n",
       "    }\n",
       "    if (objectTypeVisible[\"edgelabels\"]) {\n",
       "        setVisibility(true,\"edgelabels\");\n",
       "    }\n",
       "\n",
       "    if (document.getElementById('tab_4').checked){\n",
       "        //show in new tab\n",
       "        var myWindow = window.open(\"\",\"\");\n",
       "        myWindow.document.body.innerHTML = svgElement;\n",
       "    } else{\n",
       "        // download svg file \n",
       "        download(\"screenshot.svg\", svgElement);\n",
       "    }\n",
       "}\n",
       "\n",
       "function download(filename, text) {\n",
       "    var element = document.createElement('a');\n",
       "    element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));\n",
       "    element.setAttribute('download', filename);\n",
       "\n",
       "    element.style.display = 'none';\n",
       "    document.body.appendChild(element);\n",
       "\n",
       "    element.click();\n",
       "\n",
       "    document.body.removeChild(element);\n",
       "}\n",
       "\n",
       "\n",
       "document.getElementById('transparencyRange_4').oninput = changeTransparency;\n",
       "document.getElementById('changeRotationX_4').onchange = changeRotationX;\n",
       "document.getElementById('changeRotationY_4').onchange = changeRotationY;\n",
       "document.getElementById('changeRotationZ_4').onchange = changeRotationZ;\n",
       "document.getElementById('resetButton_4').onclick = resetScene;\n",
       "document.getElementById('rotationSpeedRange_4').oninput = changeRotationSpeedFactor;\n",
       "document.getElementById('takeScreenshot_4').onclick = takeSvgScreenshot;\n",
       "document.getElementById('showSettingsButton_4').onclick = showSettings;\n",
       "document.getElementById('hideSettingsButton_4').onclick = hideSettings;\n",
       "\n",
       "\n",
       "// ------------------ SHORTCUTS --------------------------------------------\n",
       "// -------------------------------------------------------------------------\n",
       "\n",
       "/**\n",
       " * http://www.openjs.com/scripts/events/keyboard_shortcuts/\n",
       " * Version : 2.01.B\n",
       " * By Binny V A\n",
       " * License : BSD\n",
       " */\n",
       "shortcut = {\n",
       "\t'all_shortcuts':{},//All the shortcuts are stored in this array\n",
       "\t'add': function(shortcut_combination,callback,opt) {\n",
       "\t\t//Provide a set of default options\n",
       "\t\tvar default_options = {\n",
       "\t\t\t'type':'keydown',\n",
       "\t\t\t'propagate':false,\n",
       "\t\t\t'disable_in_input':false,\n",
       "\t\t\t'target':document,\n",
       "\t\t\t'keycode':false\n",
       "\t\t}\n",
       "\t\tif(!opt) opt = default_options;\n",
       "\t\telse {\n",
       "\t\t\tfor(var dfo in default_options) {\n",
       "\t\t\t\tif(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo];\n",
       "\t\t\t}\n",
       "\t\t}\n",
       "\n",
       "\t\tvar ele = opt.target;\n",
       "\t\tif(typeof opt.target == 'string') ele = document.getElementById(opt.target);\n",
       "\t\tvar ths = this;\n",
       "\t\tshortcut_combination = shortcut_combination.toLowerCase();\n",
       "\n",
       "\t\t//The function to be called at keypress\n",
       "\t\tvar func = function(e) {\n",
       "\t\t\te = e || window.event;\n",
       "\t\t\t\n",
       "\t\t\tif(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields\n",
       "\t\t\t\tvar element;\n",
       "\t\t\t\tif(e.target) element=e.target;\n",
       "\t\t\t\telse if(e.srcElement) element=e.srcElement;\n",
       "\t\t\t\tif(element.nodeType==3) element=element.parentNode;\n",
       "\n",
       "\t\t\t\tif(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return;\n",
       "\t\t\t}\n",
       "\t\n",
       "\t\t\t//Find Which key is pressed\n",
       "\t\t\tif (e.keyCode) code = e.keyCode;\n",
       "\t\t\telse if (e.which) code = e.which;\n",
       "\t\t\tvar character = String.fromCharCode(code).toLowerCase();\n",
       "\t\t\t\n",
       "\t\t\tif(code == 188) character=\",\"; //If the user presses , when the type is onkeydown\n",
       "\t\t\tif(code == 190) character=\".\"; //If the user presses , when the type is onkeydown\n",
       "\n",
       "\t\t\tvar keys = shortcut_combination.split(\"+\");\n",
       "\t\t\t//Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked\n",
       "\t\t\tvar kp = 0;\n",
       "\t\t\t\n",
       "\t\t\t//Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken\n",
       "\t\t\tvar shift_nums = {\n",
       "\t\t\t\t\"`\":\"~\",\n",
       "\t\t\t\t\"1\":\"!\",\n",
       "\t\t\t\t\"2\":\"@\",\n",
       "\t\t\t\t\"3\":\"#\",\n",
       "\t\t\t\t\"4\":\"$\",\n",
       "\t\t\t\t\"5\":\"%\",\n",
       "\t\t\t\t\"6\":\"^\",\n",
       "\t\t\t\t\"7\":\"&\",\n",
       "\t\t\t\t\"8\":\"*\",\n",
       "\t\t\t\t\"9\":\"(\",\n",
       "\t\t\t\t\"0\":\")\",\n",
       "\t\t\t\t\"-\":\"_\",\n",
       "\t\t\t\t\"=\":\"+\",\n",
       "\t\t\t\t\";\":\":\",\n",
       "\t\t\t\t\"'\":\"\\\"\",\n",
       "\t\t\t\t\",\":\"<\",\n",
       "\t\t\t\t\".\":\">\",\n",
       "\t\t\t\t\"/\":\"?\",\n",
       "\t\t\t\t\"\\\\\":\"|\"\n",
       "\t\t\t}\n",
       "\t\t\t//Special Keys - and their codes\n",
       "\t\t\tvar special_keys = {\n",
       "\t\t\t\t'esc':27,\n",
       "\t\t\t\t'escape':27,\n",
       "\t\t\t\t'tab':9,\n",
       "\t\t\t\t'space':32,\n",
       "\t\t\t\t'return':13,\n",
       "\t\t\t\t'enter':13,\n",
       "\t\t\t\t'backspace':8,\n",
       "\t\n",
       "\t\t\t\t'scrolllock':145,\n",
       "\t\t\t\t'scroll_lock':145,\n",
       "\t\t\t\t'scroll':145,\n",
       "\t\t\t\t'capslock':20,\n",
       "\t\t\t\t'caps_lock':20,\n",
       "\t\t\t\t'caps':20,\n",
       "\t\t\t\t'numlock':144,\n",
       "\t\t\t\t'num_lock':144,\n",
       "\t\t\t\t'num':144,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'pause':19,\n",
       "\t\t\t\t'break':19,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'insert':45,\n",
       "\t\t\t\t'home':36,\n",
       "\t\t\t\t'delete':46,\n",
       "\t\t\t\t'end':35,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'pageup':33,\n",
       "\t\t\t\t'page_up':33,\n",
       "\t\t\t\t'pu':33,\n",
       "\t\n",
       "\t\t\t\t'pagedown':34,\n",
       "\t\t\t\t'page_down':34,\n",
       "\t\t\t\t'pd':34,\n",
       "\t\n",
       "\t\t\t\t'left':37,\n",
       "\t\t\t\t'up':38,\n",
       "\t\t\t\t'right':39,\n",
       "\t\t\t\t'down':40,\n",
       "\t\n",
       "\t\t\t\t'f1':112,\n",
       "\t\t\t\t'f2':113,\n",
       "\t\t\t\t'f3':114,\n",
       "\t\t\t\t'f4':115,\n",
       "\t\t\t\t'f5':116,\n",
       "\t\t\t\t'f6':117,\n",
       "\t\t\t\t'f7':118,\n",
       "\t\t\t\t'f8':119,\n",
       "\t\t\t\t'f9':120,\n",
       "\t\t\t\t'f10':121,\n",
       "\t\t\t\t'f11':122,\n",
       "\t\t\t\t'f12':123\n",
       "\t\t\t}\n",
       "\t\n",
       "\t\t\tvar modifiers = { \n",
       "\t\t\t\tshift: { wanted:false, pressed:false},\n",
       "\t\t\t\tctrl : { wanted:false, pressed:false},\n",
       "\t\t\t\talt  : { wanted:false, pressed:false},\n",
       "\t\t\t\tmeta : { wanted:false, pressed:false}\t//Meta is Mac specific\n",
       "\t\t\t};\n",
       "                        \n",
       "\t\t\tif(e.ctrlKey)\tmodifiers.ctrl.pressed = true;\n",
       "\t\t\tif(e.shiftKey)\tmodifiers.shift.pressed = true;\n",
       "\t\t\tif(e.altKey)\tmodifiers.alt.pressed = true;\n",
       "\t\t\tif(e.metaKey)   modifiers.meta.pressed = true;\n",
       "                        \n",
       "\t\t\tfor(var i=0; k=keys[i],i<keys.length; i++) {\n",
       "\t\t\t\t//Modifiers\n",
       "\t\t\t\tif(k == 'ctrl' || k == 'control') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.ctrl.wanted = true;\n",
       "\n",
       "\t\t\t\t} else if(k == 'shift') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.shift.wanted = true;\n",
       "\n",
       "\t\t\t\t} else if(k == 'alt') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.alt.wanted = true;\n",
       "\t\t\t\t} else if(k == 'meta') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.meta.wanted = true;\n",
       "\t\t\t\t} else if(k.length > 1) { //If it is a special key\n",
       "\t\t\t\t\tif(special_keys[k] == code) kp++;\n",
       "\t\t\t\t\t\n",
       "\t\t\t\t} else if(opt['keycode']) {\n",
       "\t\t\t\t\tif(opt['keycode'] == code) kp++;\n",
       "\n",
       "\t\t\t\t} else { //The special keys did not match\n",
       "\t\t\t\t\tif(character == k) kp++;\n",
       "\t\t\t\t\telse {\n",
       "\t\t\t\t\t\tif(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase\n",
       "\t\t\t\t\t\t\tcharacter = shift_nums[character]; \n",
       "\t\t\t\t\t\t\tif(character == k) kp++;\n",
       "\t\t\t\t\t\t}\n",
       "\t\t\t\t\t}\n",
       "\t\t\t\t}\n",
       "\t\t\t}\n",
       "\t\t\t\n",
       "\t\t\tif(kp == keys.length && \n",
       "\t\t\t\t\t\tmodifiers.ctrl.pressed == modifiers.ctrl.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.shift.pressed == modifiers.shift.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.alt.pressed == modifiers.alt.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.meta.pressed == modifiers.meta.wanted) {\n",
       "\t\t\t\tcallback(e);\n",
       "\t\n",
       "\t\t\t\tif(!opt['propagate']) { //Stop the event\n",
       "\t\t\t\t\t//e.cancelBubble is supported by IE - this will kill the bubbling process.\n",
       "\t\t\t\t\te.cancelBubble = true;\n",
       "\t\t\t\t\te.returnValue = false;\n",
       "\t\n",
       "\t\t\t\t\t//e.stopPropagation works in Firefox.\n",
       "\t\t\t\t\tif (e.stopPropagation) {\n",
       "\t\t\t\t\t\te.stopPropagation();\n",
       "\t\t\t\t\t\te.preventDefault();\n",
       "\t\t\t\t\t}\n",
       "\t\t\t\t\treturn false;\n",
       "\t\t\t\t}\n",
       "\t\t\t}\n",
       "\t\t}\n",
       "\t\tthis.all_shortcuts[shortcut_combination] = {\n",
       "\t\t\t'callback':func, \n",
       "\t\t\t'target':ele, \n",
       "\t\t\t'event': opt['type']\n",
       "\t\t};\n",
       "\t\t//Attach the function with the event\n",
       "\t\tif(ele.addEventListener) ele.addEventListener(opt['type'], func, false);\n",
       "\t\telse if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func);\n",
       "\t\telse ele['on'+opt['type']] = func;\n",
       "\t},\n",
       "\n",
       "\t//Remove the shortcut - just specify the shortcut and I will remove the binding\n",
       "\t'remove':function(shortcut_combination) {\n",
       "\t\tshortcut_combination = shortcut_combination.toLowerCase();\n",
       "\t\tvar binding = this.all_shortcuts[shortcut_combination];\n",
       "\t\tdelete(this.all_shortcuts[shortcut_combination])\n",
       "\t\tif(!binding) return;\n",
       "\t\tvar type = binding['event'];\n",
       "\t\tvar ele = binding['target'];\n",
       "\t\tvar callback = binding['callback'];\n",
       "\n",
       "\t\tif(ele.detachEvent) ele.detachEvent('on'+type, callback);\n",
       "\t\telse if(ele.removeEventListener) ele.removeEventListener(type, callback, false);\n",
       "\t\telse ele['on'+type] = false;\n",
       "\t}\n",
       "}\n",
       "\n",
       "shortcut.add(\"Alt+Left\",function() {\n",
       "\tvar event = new Event('click');\n",
       "\tif (settingsShown){\n",
       "\t\tdocument.getElementById('hideSettingsButton_4').dispatchEvent(event);\n",
       "\t} else {\n",
       "\t\tdocument.getElementById('showSettingsButton_4').dispatchEvent(event);\n",
       "\t}\n",
       "});\n",
       "\n",
       "\n",
       "// COMMON_CODE_BLOCK_END\n",
       "\n",
       "});});\n",
       "      </script>\n",
       "   </body>\n",
       "</html>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "$f = $s->SECONDARY_FAN;\n",
    "$f->VISUAL;"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "name: s\n",
       "type: HyperbolicSurface\n",
       "\n",
       "DCEL_DATA\n",
       "1 0 2 17\n",
       "2 1 4 14\n",
       "0 2 0 6\n",
       "1 2 8 16\n",
       "0 1 5 10\n",
       "2 1 12 1\n",
       "0 2 9 3\n",
       "0 1 13 7\n",
       "0 2 15 11\n",
       "\n",
       "\n",
       "FLIP_WORDS\n",
       "{0}\n",
       "{}\n",
       "{0 3}\n",
       "{0 4 7}\n",
       "{0 6}\n",
       "{3}\n",
       "{6}\n",
       "{0 3 1 5}\n",
       "{0 6 2 8}\n",
       "{3 1 5}\n",
       "{6 2 8}\n",
       "{0 3 1 5 0 1}\n",
       "{0 6 2 8 0 2}\n",
       "\n",
       "\n",
       "PENNER_COORDINATES\n",
       "2 1 1 1 1 1 1 1 1\n",
       "\n",
       "SECONDARY_FAN\n",
       "type: PolyhedralFan<Rational>\n",
       "\n",
       "SPECIAL_POINT\n",
       "1 0\n"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "$s->properties;"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<!--\n",
       "polymake for knusper\n",
       "Thu Aug 27 11:35:33 2020\n",
       "p_bounded\n",
       "-->\n",
       "\n",
       "\n",
       "<html>\n",
       "   <head>\n",
       "      <meta charset=utf-8>\n",
       "      <title>p_bounded</title>\n",
       "      <style>\n",
       "/*\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "*/\n",
       "         html {overflow: scroll;}\n",
       "         strong{font-size: 18px;}\n",
       "         canvas { z-index: 8; }\n",
       "         input[type='radio'] {margin-left:0;}\n",
       "         input[type='checkbox'] {margin-right:7px; margin-left: 0px; padding-left:0px;}\n",
       "         .group{padding-bottom: 15px;}\n",
       "         .settings * {z-index: 11; }\n",
       "         .settings{z-index: 10; font-family: Arial, Helvetica, sans-serif; margin-left: 30px; visibility: hidden; width: 14em; height: 96%; border: solid 1px silver; padding: 2px; overflow-y: scroll; box-sizing: border-box; background-color: white; position: absolute;}\n",
       "         .indented{margin-left: 20px; margin-top: 10px; padding-bottom: 0px;} \n",
       "         .shownObjectsList{overflow: auto; max-width: 150px; max-height: 150px;}\n",
       "         .showSettingsButton{visibility: visible; z-index: 12; position: absolute }\n",
       "         .hideSettingsButton{visibility: hidden; z-index: 12; position: absolute; opacity: 0.5}\n",
       "         button{margin-left: 0; margin-top: 10px}\n",
       "         img{cursor: pointer;}\n",
       "         .suboption{padding-top: 15px;}\n",
       "         #model77031752069 { width: 100%; height: 100%; }\n",
       "         .threejs_container { width: 100%; height: 75vh;}\n",
       "         .settings{max-height: 74vh} \n",
       "         input[type=range] {\n",
       "           -webkit-appearance: none;\n",
       "           padding:0; \n",
       "           width:90%; \n",
       "           margin-left: auto;\n",
       "           margin-right: auto;\n",
       "           margin-top: 15px;\n",
       "           margin-bottom: 15px;\n",
       "           display: block;\t\n",
       "         }\n",
       "         input[type=range]:focus {\n",
       "           outline: none;\n",
       "         }\n",
       "         input[type=range]::-webkit-slider-runnable-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "           background: #E3E3E3;\n",
       "           border-radius: 0px;\n",
       "           border: 0px solid #000000;\n",
       "         }\n",
       "         input[type=range]::-webkit-slider-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "           -webkit-appearance: none;\n",
       "           margin-top: -5px;\n",
       "         }\n",
       "         input[type=range]:focus::-webkit-slider-runnable-track {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "         input[type=range]::-moz-range-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "           background: #E3E3E3;\n",
       "           border-radius: 0px;\n",
       "           border: 0px solid #000000;\n",
       "         }\n",
       "         input[type=range]::-moz-range-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "         }\n",
       "         input[type=range]::-ms-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           background: transparent;\n",
       "           border-color: transparent;\n",
       "           color: transparent;\n",
       "         }\n",
       "         input[type=range]::-ms-fill-lower {\n",
       "           background: #E3E3E3;\n",
       "           border: 0px solid #000000;\n",
       "           border-radius: 0px;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "         }\n",
       "         input[type=range]::-ms-fill-upper {\n",
       "           background: #E3E3E3;\n",
       "           border: 0px solid #000000;\n",
       "           border-radius: 0px;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "         }\n",
       "         input[type=range]::-ms-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "         }\n",
       "         input[type=range]:focus::-ms-fill-lower {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "         input[type=range]:focus::-ms-fill-upper {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "/*\n",
       "// COMMON_CODE_BLOCK_END\n",
       "*/\n",
       "\t\t</style>\n",
       "   </head>\n",
       "<body>\n",
       "   <div class='threejs_container'>\n",
       "\t\t<div id='settings_5' class='settings'>\n",
       "\t\t\t<div class=group id='transparency_5' class='transparency'>\n",
       "\t\t\t\t<strong>Transparency</strong>\n",
       "\t\t\t\t<input id='transparencyRange_5' type='range' min=0 max=1 step=0.01 value=0>\n",
       "\t\t\t</div>\n",
       "\t\t\t\n",
       "\t\t\t<div class=group id='rotation_5'>\n",
       "\t\t\t\t<strong>Rotation</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationX_5'> x-axis</div>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationY_5'> y-axis</div>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationZ_5'> z-axis</div>\n",
       "\t\t\t\t\t<button id='resetButton_5'>Reset</button>\n",
       "\t\t\t\t</div>\n",
       "\n",
       "\t\t\t\t<div class=suboption>Rotation speed</div>\n",
       "\t\t\t\t<input id='rotationSpeedRange_5' type='range' min=0 max=5 step=0.01 value=2>\n",
       "\t\t\t</div>\n",
       "\n",
       "\n",
       "\t\t\t<div class=group id='display_5'>\n",
       "\t\t\t\t<strong>Display</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<div id='shownObjectTypesList_5' class='shownObjectsList'></div>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t\t<div class=suboption>Objects</div>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t   <div id='shownObjectsList_5' class='shownObjectsList'></div>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t</div>\n",
       "         \n",
       "         <div class=group id='camera_5'>\n",
       "            <strong>Camera</strong>\n",
       "            <div class=indented>\n",
       "               <form>\n",
       "                  <select id=\"cameraType_5\">\n",
       "                     <option value='perspective' selected> Perspective<br></option>\n",
       "                     <option value='orthographic' > Orthographic<br></option>\n",
       "                  </select>\n",
       "               </form>\n",
       "            </div>\n",
       "         </div>\n",
       "\n",
       "\t\t\t<div class=group id='svg_5'>\n",
       "\t\t\t\t<strong>SVG</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<form>\n",
       "\t\t\t\t\t\t<input type=\"radio\" name='screenshotMode' value='download' id='download_5' checked> Download<br>\n",
       "\t\t\t\t\t\t<input type=\"radio\" name='screenshotMode' value='tab' id='tab_5' > New tab<br>\n",
       "\t\t\t\t\t</form>\n",
       "\t\t\t\t\t<button id='takeScreenshot_5'>Screenshot</button>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t</div>\n",
       "\n",
       "\t\t</div>\t<!-- end of settings -->\n",
       "\t\t<img id='hideSettingsButton_5' class='hideSettingsButton' src='/kernelspecs/polymake/close.svg' width=20px\">\n",
       "\t\t<img id='showSettingsButton_5' class='showSettingsButton' src='/kernelspecs/polymake/menu.svg' width=20px\">\n",
       "<div id=\"model77031752069\"></div>\n",
       "</div>\n",
       "   <script>\n",
       "    requirejs.config({\n",
       "      paths: {\n",
       "        three: '/kernelspecs/polymake/three',\n",
       "        TrackballControls: '/kernelspecs/polymake/TrackballControls',\n",
       "        OrbitControls: '/kernelspecs/polymake/OrbitControls',\n",
       "        Projector: '/kernelspecs/polymake/Projector',\n",
       "        SVGRenderer: '/kernelspecs/polymake/SVGRenderer',\n",
       "        WEBGL: '/kernelspecs/polymake/WebGL',\n",
       "      },\n",
       "      shim: {\n",
       "        'three': { exports: 'THREE'},\n",
       "        'SVGRenderer': { deps: [ 'three' ], exports: 'THREE.SVGRenderer' },\n",
       "        'WEBGL': { deps: [ 'three' ], exports: 'THREE.WEBGL' },\n",
       "        'Projector': { deps: [ 'three' ], exports: 'THREE.Projector' },\n",
       "        'TrackballControls': { deps: [ 'three' ], exports: 'THREE.TrackballControls' },\n",
       "        'OrbitControls': { deps: [ 'three' ], exports: 'THREE.OrbitControls' },\n",
       "      }\n",
       "    });\n",
       "    \n",
       "    require(['three'],function(THREE){\n",
       "        window.THREE = THREE;\n",
       "      require(['TrackballControls', 'OrbitControls', 'Projector', 'SVGRenderer', 'WEBGL'],\n",
       "               function(TrackballControls, OrbitControls, Projector, SVGRenderer, WEBGL) {\n",
       "    THREE.TrackballControls = TrackballControls;\n",
       "    THREE.OrbitControls = OrbitControls;\n",
       "    THREE.Projector = Projector;\n",
       "    THREE.SVGRenderer = SVGRenderer;\n",
       "    THREE.WEBGL = WEBGL;\n",
       "\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "\n",
       "const intervalLength = 25; // for automatic animations\n",
       "const explodableModel = false; \n",
       "const modelContains = { points: false, pointlabels: false, lines: false, edgelabels: false, faces: false, arrowheads: false };\n",
       "const foldables = [];\n",
       "\n",
       "var three = document.getElementById(\"model77031752069\");\n",
       "var scene = new THREE.Scene();\n",
       "var renderer = new THREE.WebGLRenderer( { antialias: true } );\n",
       "var svgRenderer = new THREE.SVGRenderer( { antialias: true } );\n",
       "renderer.setPixelRatio( window.devicePixelRatio );\n",
       "renderer.setClearColor(0xFFFFFF, 1);\n",
       "svgRenderer.setClearColor(0xFFFFFF, 1);\n",
       "three.appendChild(renderer.domElement);\n",
       "\n",
       "var frustumSize = 4;\n",
       "var cameras = [new THREE.PerspectiveCamera(75, 1, 0.1, 1000), new THREE.OrthographicCamera()];\n",
       "cameras.forEach(function(cam) {\n",
       "    cam.position.set(0, 0, 5);\n",
       "    cam.lookAt(0, 0, 0);  \n",
       "    cam.up.set(0, 1, 0);         \n",
       "});\n",
       "var controls = [new THREE.TrackballControls(cameras[0], three), new THREE.OrbitControls(cameras[1], three)];\n",
       "var camera, control;\n",
       "\n",
       "controls[0].zoomSpeed = 0.2;\n",
       "controls[0].rotateSpeed = 4;\n",
       "\n",
       "\n",
       "// class to allow move points together with labels and spheres\n",
       "var PMPoint = function (x,y,z) {\n",
       "   this.vector = new THREE.Vector3(x,y,z);\n",
       "   this.sprite = null;\n",
       "   this.sphere = null;\n",
       "}\n",
       "PMPoint.prototype.addLabel = function(labelsprite) {\n",
       "   this.sprite = labelsprite;\n",
       "   this.sprite.position.copy(this.vector);\n",
       "}\n",
       "PMPoint.prototype.addSphere = function(spheremesh) {\n",
       "   this.sphere = spheremesh;\n",
       "   this.sphere.position.copy(this.vector);\n",
       "}\n",
       "PMPoint.prototype.set = function(x,y,z) {\n",
       "   this.vector.set(x,y,z);\n",
       "   if (this.sprite) {\n",
       "      this.sprite.position.copy(this.vector);\n",
       "   }\n",
       "   if (this.sphere) {\n",
       "      this.sphere.position.copy(this.vector);\n",
       "   }\n",
       "}\n",
       "PMPoint.prototype.radius = function() {\n",
       "   if (this.sphere) {\n",
       "      return this.sphere.geometry.parameters.radius;\n",
       "   } else {\n",
       "      return 0;\n",
       "   }\n",
       "};\n",
       "// select the target node\n",
       "var target = document.querySelector('#model77031752069');\n",
       "\n",
       "// create an observer instance\n",
       "var observer = new MutationObserver(function(mutations) {\n",
       "   mutations.forEach(function(mutation) {\n",
       "      if (mutation.removedNodes && mutation.removedNodes.length > 0) {\n",
       "         cancelAnimationFrame(renderId);\n",
       "         observer.disconnect();\n",
       "         console.log(\"cancelled frame \"+renderId);\n",
       "      }\n",
       "   });\n",
       "});\n",
       "\n",
       "// configuration of the observer:\n",
       "var config = { childList: true, characterData: true }\n",
       "\n",
       "// pass in the target node, as well as the observer options\n",
       "while (target) {\n",
       "   if (target.className==\"output\") {\n",
       "      observer.observe(target, config);\n",
       "      break;\n",
       "   }\n",
       "   target = target.parentNode;\n",
       "}\n",
       "\n",
       "// COMMON_CODE_BLOCK_END\n",
       "\n",
       "var obj0 = new THREE.Object3D();\n",
       "obj0.name = \"p_bounded\";\n",
       "obj0.userData.explodable = 1;\n",
       "obj0.userData.points = [];\n",
       "obj0.userData.points.push(new PMPoint(0.562776, 0.0304074, 0.414416));\n",
       "obj0.userData.points.push(new PMPoint(0.562802, -0.433532, 0.414364));\n",
       "obj0.userData.points.push(new PMPoint(0.677206, -0.433532, 0.191283));\n",
       "obj0.userData.points.push(new PMPoint(0.677206, 0.0253675, 0.191283));\n",
       "obj0.userData.points.push(new PMPoint(0.553167, 0.055381, 0.420578));\n",
       "obj0.userData.points.push(new PMPoint(0.448757, -0.433532, 0.487473));\n",
       "obj0.userData.points.push(new PMPoint(0.507199, 0.10215, 0.450049));\n",
       "obj0.userData.points.push(new PMPoint(0.506217, 0.10236, 0.450678));\n",
       "obj0.userData.points.push(new PMPoint(0.448813, 0.0432627, 0.487473));\n",
       "obj0.userData.points.push(new PMPoint(0.61824, 0.115444, 0.261454));\n",
       "obj0.userData.points.push(new PMPoint(0.569479, 0.16546, 0.292339));\n",
       "obj0.userData.points.push(new PMPoint(-0.468309, -0.433532, 0.487473));\n",
       "obj0.userData.points.push(new PMPoint(-0.468309, 0.0431831, 0.487473));\n",
       "obj0.userData.points.push(new PMPoint(0.499967, 0.108988, 0.446551));\n",
       "obj0.userData.points.push(new PMPoint(0.156563, 0.409597, -0.370202));\n",
       "obj0.userData.points.push(new PMPoint(-0.468309, 0.409597, -0.370202));\n",
       "obj0.userData.points.push(new PMPoint(-0.468309, -0.433532, -0.370202));\n",
       "obj0.userData.points.push(new PMPoint(0.415509, 0.323237, 0.0975608));\n",
       "obj0.userData.points.push(new PMPoint(0.415143, 0.323359, -0.370202));\n",
       "obj0.userData.points.push(new PMPoint(0.562545, 0.172568, 0.288137));\n",
       "obj0.userData.points.push(new PMPoint(0.677206, -0.433532, -0.370202));\n",
       "obj0.userData.points.push(new PMPoint(0.156563, 0.409597, 0.0976341));\n",
       "obj0.userData.points.push(new PMPoint(0.156563, 0.280528, 0.339719));\n",
       "obj0.userData.points.push(new PMPoint(-0.468309, 0.409597, 0.0976341));\n",
       "obj0.userData.points.push(new PMPoint(-0.468309, 0.280555, 0.339668));\n",
       "obj0.userData.points.push(new PMPoint(0.15657, 0.409594, 0.0976391));\n",
       "obj0.userData.points.push(new PMPoint(0.666751, 0.0653579, -0.370202));\n",
       "obj0.userData.points.push(new PMPoint(0.677206, 0.0263565, -0.370202));\n",
       "obj0.userData.points.push(new PMPoint(0.666638, 0.0657773, 0.191429));\n",
       "obj0.userData.points.push(new PMPoint(0.677206, 0.0263565, 0.190776));\n",
       "\n",
       "obj0.userData.pointradii = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.02];\n",
       "   <!-- Vertex style -->\n",
       "obj0.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj0.userData.pointlabels = [\" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \"];\n",
       "obj0.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 0, 4, 1, 5, 4, 6, 6, 7, 5, 8, 7, 8, 4, 9, 6, 10, 9, 10, 5, 11, 8, 12, 11, 12, 7, 13, 14, 15, 11, 16, 15, 16, 14, 18, 17, 18, 10, 19, 13, 19, 17, 19, 2, 20, 16, 20, 14, 21, 13, 22, 15, 23, 21, 23, 12, 24, 22, 24, 23, 24, 17, 25, 21, 25, 22, 25, 18, 26, 20, 27, 26, 27, 9, 28, 26, 28, 3, 29, 27, 29, 28, 29];\n",
       "   <!-- Edge style -->\n",
       "obj0.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj0.userData.facets = [[7, 13, 22, 24, 12, 8], [19, 13, 7, 6, 10], [7, 8, 5, 1, 0, 4, 6], [6, 4, 9, 10], [17, 19, 10, 9, 28, 26, 18], [4, 0, 3, 29, 28, 9], [8, 12, 11, 5], [22, 13, 19, 17, 25], [0, 1, 2, 3], [24, 22, 25, 21, 23], [26, 28, 29, 27], [25, 17, 18, 14, 21], [20, 27, 29, 3, 2], [23, 21, 14, 15], [12, 24, 23, 15, 16, 11], [11, 16, 20, 2, 1, 5], [16, 15, 14, 18, 26, 27, 20]];\n",
       "   <!-- Facet style -->\n",
       "obj0.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj0);\n",
       "scene.add(obj0);\n",
       "\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "function textSpriteMaterial(message, parameters) {\n",
       "    if ( parameters === undefined ) parameters = {};\n",
       "    var fontface = \"Helvetica\";\n",
       "    var fontsize = parameters.hasOwnProperty(\"fontsize\") ? parameters[\"fontsize\"] : 15;\n",
       "    fontsize = fontsize*10;\n",
       "    var lines = message.split('\\\\n');\n",
       "    var size = 512;\n",
       "    for(var i = 0; i<lines.length; i++){\n",
       "        var tmp = lines[i].length;\n",
       "        while(tmp*fontsize > size){\n",
       "           fontsize--;\n",
       "        }\n",
       "    }\n",
       "    \n",
       "    var canvas = document.createElement('canvas');\n",
       "    canvas.width = size;\n",
       "    canvas.height = size;\n",
       "    var context = canvas.getContext('2d');\n",
       "    context.fillStyle = \"rgba(255, 255, 255, 0)\";\n",
       "    context.fill();\n",
       "    context.font = fontsize + \"px \" + fontface;\n",
       "    \n",
       "    // text color\n",
       "    context.fillStyle = \"rgba(0, 0, 0, 1.0)\";\n",
       "     for(var i = 0; i<lines.length; i++){\n",
       "        context.fillText(lines[i], size/2, size/2+i*fontsize);\n",
       "     }\n",
       "    \n",
       "    // canvas contents will be used for a texture\n",
       "    var texture = new THREE.Texture(canvas);\n",
       "    texture.needsUpdate = true;\n",
       "    \n",
       "    var spriteMaterial = new THREE.SpriteMaterial({map: texture, depthTest: true, depthWrite: false, polygonOffset: true, polygonOffsetFactor: -1, polygonOffsetUnits: 1 });\n",
       "    return spriteMaterial;\n",
       "}\n",
       "\n",
       "\n",
       "// ---------------------- INITIALIZING OBJECTS--------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "function init_object(obj) {\n",
       "    if (obj.userData.hasOwnProperty(\"pointmaterial\")) {\n",
       "        init_points(obj);\n",
       "        modelContains.points = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"pointlabels\")) {\n",
       "        init_pointlabels(obj);\n",
       "        modelContains.pointlabels = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"edgematerial\")) {\n",
       "        init_lines(obj);\n",
       "        modelContains.lines = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"edgelabels\")) {\n",
       "        init_edgelabels(obj);\n",
       "        modelContains.edgelabels = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"arrowstyle\")) {\n",
       "        init_arrowheads(obj);\n",
       "        modelContains.arrowheads = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"facetmaterial\")) {\n",
       "        init_faces(obj);\n",
       "        modelContains.faces = true;\n",
       "    }\n",
       "}\n",
       "\n",
       "function init_points(obj) {\n",
       "    var pointgroup = new THREE.Group();\n",
       "    pointgroup.name = \"points\";\n",
       "    var points = obj.userData.points;\n",
       "    var radii = obj.userData.pointradii;\n",
       "    var materials = obj.userData.pointmaterial;\n",
       "    var geometry,material;\n",
       "    if (!Array.isArray(radii)) {\n",
       "        geometry = new THREE.SphereBufferGeometry(radii);  \n",
       "    }\n",
       "    if (!Array.isArray(materials)) {\n",
       "        material = materials;\n",
       "    }\n",
       "    for (var i=0; i<points.length; i++) {\n",
       "        var point = points[i];\n",
       "        if (Array.isArray(radii)) {\n",
       "            if (radii[i] == 0) {\n",
       "                continue;\n",
       "            }\n",
       "            geometry = new THREE.SphereBufferGeometry(radii[i]);  \n",
       "        } \n",
       "        if (Array.isArray(materials)) {\n",
       "            material = materials[i];     \n",
       "        } \n",
       "        var sphere = new THREE.Mesh(geometry, material);\n",
       "        point.addSphere(sphere);\n",
       "        pointgroup.add(sphere);\n",
       "    }\n",
       "    obj.add(pointgroup);\n",
       "}\n",
       "\n",
       "function init_pointlabels(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var labels = obj.userData.pointlabels;\n",
       "    var pointlabels = new THREE.Group();\n",
       "    pointlabels.name = \"pointlabels\";\n",
       "    if (Array.isArray(labels)) {\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "            var spriteMaterial = textSpriteMaterial( labels[i] );\n",
       "\t        var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            point.addLabel(sprite);\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    } else {\n",
       "        var spriteMaterial = textSpriteMaterial( labels );\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "\t        var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            point.addLabel(sprite);\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    }\n",
       "    obj.add(pointlabels);\n",
       "}\n",
       "\n",
       "function init_lines(obj) {\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var points = obj.userData.points;\n",
       "    var materials = obj.userData.edgematerial;\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    var bufarr = new Float32Array( obj.userData.edgeindices.length * 3 );\n",
       "    var bufattr = new THREE.Float32BufferAttribute( bufarr, 3 );\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    geometry.setAttribute('position', bufattr);\n",
       "    if (Array.isArray(materials)) {     \n",
       "        for (var i=0; i<materials.length; i++) {\n",
       "            geometry.addGroup(2*i,2,i);\n",
       "        }\n",
       "    }\n",
       "    var lines = new THREE.LineSegments(geometry, materials);\n",
       "    lines.name = \"lines\";\n",
       "    obj.add(lines);\n",
       "    updateEdgesPosition(obj);\n",
       "}\n",
       "\n",
       "function init_edgelabels(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var labels = obj.userData.edgelabels;\n",
       "    var edgelabels = new THREE.Group();\n",
       "    edgelabels.name = \"edgelabels\";\n",
       "    if (Array.isArray(labels)) {\n",
       "        for (var i=0; i<edgeindices.length; i=i+2) {\n",
       "            var point = points[i];\n",
       "            var spriteMaterial = textSpriteMaterial( labels[i] );\n",
       "            var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[i]].vector,points[edgeindices[i+1]].vector).multiplyScalar(0.5));\n",
       "            edgelabels.add(sprite);\n",
       "        }\n",
       "    } else {\n",
       "        var spriteMaterial = textSpriteMaterial( labels );\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "            var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[i]].vector,points[edgeindices[i+1]].vector).multiplyScalar(0.5));\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    }\n",
       "    obj.add(edgelabels);\n",
       "}\n",
       "\n",
       "function init_arrowheads(obj) {\n",
       "    var arrowheads = new THREE.Group();\n",
       "    arrowheads.name = \"arrowheads\";\n",
       "    var arrowstyle = obj.userData.arrowstyle;\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var edgematerials = obj.userData.edgematerial;\n",
       "    var points = obj.userData.points;\n",
       "    var material;\n",
       "    if (!Array.isArray(edgematerials)) {\n",
       "        material = new THREE.MeshBasicMaterial( {color: edgematerials.color} );\n",
       "    }\n",
       "\n",
       "    for (var i=0; i<edgeindices.length; i=i+2) {\n",
       "        var start = points[edgeindices[i]];\n",
       "        var end = points[edgeindices[i+1]];\n",
       "        var dist = start.vector.distanceTo( end.vector ) - start.radius() - end.radius();\n",
       "        if (dist <= 0) {\n",
       "            continue;\n",
       "        }\n",
       "        var dir = new THREE.Vector3().subVectors(end.vector,start.vector);\n",
       "        dir.normalize();\n",
       "        var axis = new THREE.Vector3().set(dir.z,0,-dir.x);\n",
       "        axis.normalize();\n",
       "        var radians = Math.acos( dir.y );\n",
       "        var radius = dist/25;\n",
       "        var height = dist/5;\n",
       "        var geometry = new THREE.ConeBufferGeometry(radius,height);\n",
       "        var position = new THREE.Vector3().addVectors(start.vector,dir.clone().multiplyScalar(start.radius()+dist-height/2));\n",
       "        if (Array.isArray(edgematerials)) {\n",
       "            material = new THREE.MeshBasicMaterial( {color: edgematerials[i].color} );\n",
       "        }\n",
       "        var cone = new THREE.Mesh( geometry, material );\n",
       "        cone.quaternion.setFromAxisAngle(axis,radians);;\n",
       "        cone.position.copy(position);;\n",
       "        arrowheads.add(cone);\n",
       "    }\n",
       "    obj.add(arrowheads);\n",
       "}\n",
       "\n",
       "function init_faces(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var facets = obj.userData.facets;\n",
       "    obj.userData.triangleindices = [];\n",
       "    for (var i=0; i<facets.length; i++) {\n",
       "        facet = facets[i];\n",
       "        for (var t=0; t<facet.length-2; t++) {\n",
       "            obj.userData.triangleindices.push(facet[0],facet[t+1],facet[t+2]);  \n",
       "        }\n",
       "    }\n",
       "    var bufarr = new Float32Array( obj.userData.triangleindices.length * 3 );\n",
       "    var bufattr = new THREE.Float32BufferAttribute(bufarr,3);\n",
       "    \n",
       "    var materials = obj.userData.facetmaterial;\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    geometry.setAttribute('position',bufattr);\n",
       "    if (Array.isArray(materials)) {\n",
       "        var tricount = 0;\n",
       "        var facet;\n",
       "        for (var i=0; i<facets.length; i++) {\n",
       "            facet = facets[i];\n",
       "            geometry.addGroup(tricount,(facet.length-2)*3,i);\n",
       "            tricount += (facet.length-2)*3;\n",
       "        }\n",
       "    }\n",
       "    var mesh = new THREE.Mesh(geometry, materials);\n",
       "    mesh.name = \"faces\";\n",
       "    obj.add(mesh); \n",
       "    updateFacesPosition(obj);\n",
       "}\n",
       "// //INITIALIZING\n",
       "\n",
       "\n",
       "function updateFacesPosition(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var indices = obj.userData.triangleindices;\n",
       "    var faces = obj.getObjectByName(\"faces\");\n",
       "    var ba = faces.geometry.getAttribute(\"position\");\n",
       "    for (var i=0; i<indices.length; i++) {\n",
       "        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); \n",
       "    }\n",
       "    faces.geometry.attributes.position.needsUpdate = true;\n",
       "    \n",
       "}\n",
       "\n",
       "function updateEdgesPosition(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var indices = obj.userData.edgeindices;\n",
       "    var lines = obj.getObjectByName(\"lines\");\n",
       "    var ba = lines.geometry.getAttribute(\"position\"); \n",
       "    for (var i=0; i<indices.length; i++) {\n",
       "        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); \n",
       "    }\n",
       "    lines.geometry.attributes.position.needsUpdate = true;\n",
       "}\n",
       "\n",
       "function onWindowResize() {\n",
       "    renderer.setSize( three.clientWidth, three.clientHeight );\n",
       "    svgRenderer.setSize( three.clientWidth, three.clientHeight );\n",
       "    updateCamera();\n",
       "}\n",
       "\n",
       "function updateCamera() {\n",
       "    var width = three.clientWidth;\n",
       "    var height = three.clientHeight;\n",
       "    var aspect = width / height;\n",
       "    if (camera.type == \"OrthographicCamera\") {\n",
       "        camera.left = frustumSize * aspect / - 2;\n",
       "        camera.right = frustumSize * aspect / 2;\n",
       "        camera.top = frustumSize / 2;\n",
       "        camera.bottom = - frustumSize / 2;\n",
       "    } else if (camera.type == \"PerspectiveCamera\") {\n",
       "        camera.aspect = aspect;\n",
       "    }\n",
       "    camera.updateProjectionMatrix();\n",
       "}\n",
       "\n",
       "function changeCamera(event) {\n",
       "    var selindex = event.currentTarget.selectedIndex;\n",
       "    camera = cameras[selindex];\n",
       "    control = controls[selindex];\n",
       "    control.enabled = true; \n",
       "    for (var i=0; i<controls.length; i++) {\n",
       "        if (i!=selindex) {\n",
       "            controls[i].enabled = false;\n",
       "        }\n",
       "    }\n",
       "    updateCamera();\n",
       "}\n",
       "\n",
       "var camtypenode = document.getElementById('cameraType_5');\n",
       "camtypenode.onchange = changeCamera;\n",
       "camtypenode.dispatchEvent(new Event('change'));\n",
       "\n",
       "onWindowResize();\n",
       "window.addEventListener('resize', onWindowResize);\t\n",
       "\n",
       "\n",
       "var xRotationEnabled = false;\n",
       "var yRotationEnabled = false;\n",
       "var zRotationEnabled = false;\n",
       "var rotationSpeedFactor = 1;\n",
       "var settingsShown = false;\n",
       "var labelsShown = true;\n",
       "var intervals = [];\n",
       "var timeouts = [];\n",
       "var explodingSpeed = 0.05;\n",
       "var explodeScale = 0;\n",
       "var XMLS = new XMLSerializer();\n",
       "var svgElement;\n",
       "var renderId;\n",
       "\n",
       "var render = function () {\n",
       "\n",
       "\trenderId = requestAnimationFrame(render);\n",
       "\n",
       "//\tcomment in for automatic explosion\n",
       "//\texplode(updateFactor());\n",
       "\n",
       "    var phi = 0.02 * rotationSpeedFactor;\n",
       "\n",
       "    if (xRotationEnabled) {\n",
       "        scene.rotation.x += phi;\n",
       "    }\n",
       "    if (yRotationEnabled) {\n",
       "        scene.rotation.y += phi;\n",
       "    }\n",
       "    if (zRotationEnabled) {\n",
       "        scene.rotation.z += phi;\n",
       "    }\n",
       "\n",
       "    control.update();\n",
       "    renderer.render(scene, camera);\n",
       "};\n",
       "\n",
       "if ( THREE.WEBGL.isWebGLAvailable() ) {\n",
       "\trender();\n",
       "} else {\n",
       "\tvar warning = WEBGL.getWebGLErrorMessage();\n",
       "\tthree.appendChild( warning );\n",
       "}\n",
       "    \n",
       "function changeTransparency() {\n",
       "    var opacity = 1-Number(event.currentTarget.value);\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        child = scene.children[i];\n",
       "        if ( child.userData.hasOwnProperty(\"facetmaterial\") ) {\n",
       "            if (Array.isArray(child.userData.facetmaterial)) {\n",
       "                for (var j=0; j<child.userData.facetmaterial.length; j++) {\n",
       "                    child.userData.facetmaterial[j].opacity = opacity;\n",
       "                }\n",
       "            } else {\n",
       "                child.userData.facetmaterial.opacity = opacity;\n",
       "            }    \n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function changeRotationX(event){\n",
       "    xRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "function changeRotationY(event){\n",
       "    yRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "function changeRotationZ(event){\n",
       "    zRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "\n",
       "function changeRotationSpeedFactor(event){\n",
       "    rotationSpeedFactor = Number(event.currentTarget.value);\n",
       "}\n",
       "\n",
       "function resetScene(){\n",
       "    scene.rotation.set(0,0,0);\n",
       "    camera.position.set(0,0,5);\n",
       "    camera.up.set(0,1,0);\n",
       "}\n",
       "\n",
       "function showSettings(event){\n",
       "    document.getElementById('settings_5').style.visibility = 'visible';\n",
       "    document.getElementById('showSettingsButton_5').style.visibility = 'hidden';\n",
       "    document.getElementById('hideSettingsButton_5').style.visibility = 'visible';\n",
       "    settingsShown = true;\n",
       "}\n",
       "\n",
       "function hideSettings(event){\n",
       "    document.getElementById('settings_5').style.visibility = 'hidden';\n",
       "    document.getElementById('showSettingsButton_5').style.visibility = 'visible';\n",
       "    document.getElementById('hideSettingsButton_5').style.visibility = 'hidden';\n",
       "    settingsShown = false;\n",
       "}\n",
       "\n",
       "\n",
       "\n",
       "var pos = 150* Math.PI;\n",
       "\n",
       "function updateFactor() {\n",
       "    pos++;\n",
       "    return Math.sin(.01*pos)+1;\n",
       "}\n",
       "\n",
       "// ------------------------ FOLDING ------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "// rotate point p around axis defined by points p1 and p2 by given angle\n",
       "function rotate(p, p1, p2, angle ){   \n",
       "    angle = -angle;\n",
       "    var x = p.x, y = p.y, z = p.z, \n",
       "    a = p1.x, b = p1.y, c = p1.z, \n",
       "    u = p2.x-p1.x, v = p2.y-p1.y, w = p2.z-p1.z;\n",
       "    var result = [];\n",
       "    var L = u*u + v*v + w*w;\n",
       "    var sqrt = Math.sqrt;\n",
       "    var cos = Math.cos;\n",
       "    var sin = Math.sin;\n",
       "\n",
       "    result[0] = ((a*(v*v+w*w)-u*(b*v+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*x*cos(angle)+sqrt(L)*(-c*v+b*w-w*y+v*z)*sin(angle))/L;\n",
       "    result[1] = ((b*(u*u+w*w)-v*(a*u+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*y*cos(angle)+sqrt(L)*(c*u-a*w+w*x-u*z)*sin(angle))/L;\n",
       "    result[2] = ((c*(u*u+v*v)-w*(a*u+b*v-u*x-v*y-w*z))*(1-cos(angle))+L*z*cos(angle)+sqrt(L)*(-b*u+a*v-v*x+u*y)*sin(angle))/L;\n",
       "\n",
       "    return result;\n",
       "}\n",
       "\n",
       "var fold = function(event){\n",
       "    var obj = foldables[Number(event.currentTarget.name)];\n",
       "    var foldvalue = Number(event.currentTarget.value);\n",
       "    var scale = foldvalue - obj.userData.oldscale;\n",
       "\n",
       "    for (var j=0; j<obj.userData.axes.length; j++) {\n",
       "        rotateVertices(obj, j, scale);\n",
       "    }\n",
       "    update(obj);\n",
       "    obj.userData.oldscale += scale;\n",
       "    lookAtBarycenter(obj);\n",
       "}\n",
       "\n",
       "function lookAtBarycenter(obj){\n",
       "    control.target = barycenter(obj);\n",
       "}\n",
       "\n",
       "function barycenter(obj) {\n",
       "    var center = new THREE.Vector3(0,0,0);\n",
       "    var points = obj.userData.points;\n",
       "    for (var i=0; i<points.length; i++){\n",
       "        center.add(points[i].vector);\n",
       "    }\n",
       "    center.divideScalar(points.length);\n",
       "    return center;\n",
       "}\n",
       "\n",
       "function rotateVertices(obj, edge, scale) {\n",
       "    var axes = obj.userData.axes;\n",
       "    var subtrees = obj.userData.subtrees;\n",
       "    var points = obj.userData.points;\n",
       "    var angles = obj.userData.angles;\n",
       "    if (edge < axes.length){\n",
       "        for (var j=0; j<subtrees[edge].length; j++){\n",
       "            var rotP = rotate(points[subtrees[edge][j]].vector, points[axes[edge][0]].vector,points[axes[edge][1]].vector, scale * (Math.PI - angles[edge]));\n",
       "            points[subtrees[edge][j]].set(rotP[0],rotP[1],rotP[2]);\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function update(obj) {\n",
       "   updateFacesPosition(obj);\n",
       "   updateEdgesPosition(obj);\n",
       "}\n",
       "\n",
       "if (foldables.length) {\n",
       "    var settings = document.getElementById('settings_5');\n",
       "    var foldDiv = document.createElement('div');\n",
       "    foldDiv.id = 'fold_5';\n",
       "    var title = document.createElement('strong');\n",
       "    title.innerHTML = 'Fold';\n",
       "    foldDiv.appendChild(title);\n",
       "    foldDiv.className = 'group';\n",
       "    for (var i=0; i<foldables.length; i++) {\n",
       "        var range = document.createElement('input');\n",
       "        range.type = 'range';\n",
       "        range.min = 0;\n",
       "        range.max = 1;\n",
       "        range.value = 0;\n",
       "        range.step = 0.001;\n",
       "        range.name = String(i);\n",
       "        range.oninput = fold;\n",
       "        foldDiv.appendChild(range);\n",
       "    }\n",
       "    lookAtBarycenter(foldables[0]);\n",
       "    settings.insertBefore(foldDiv,settings.childNodes[0]);\n",
       "}\n",
       "\n",
       "    \n",
       "// ---------------------- EXPLOSION ------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "if (explodableModel) {\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        obj = scene.children[i];\n",
       "        if ( obj.userData.explodable ) {\n",
       "            computeCentroid(obj);\n",
       "        }\n",
       "    }\n",
       "    document.getElementById('explodeRange_5').oninput = triggerExplode;\n",
       "    document.getElementById('explodeCheckbox_5').onchange = triggerAutomaticExplode;\n",
       "    document.getElementById('explodingSpeedRange_5').oninput = setExplodingSpeed;\n",
       "}\n",
       "\n",
       "function computeCentroid(obj) {\n",
       "    centroid = new THREE.Vector3();\n",
       "    obj.userData.points.forEach(function(pmpoint) {\n",
       "        centroid.add(pmpoint.vector);\t\t\t\n",
       "    });\n",
       "    centroid.divideScalar(obj.userData.points.length);\n",
       "    obj.userData.centroid = centroid;\n",
       "}\n",
       "\n",
       "function explode(factor) {\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        var obj = scene.children[i];\n",
       "        if (obj.userData.hasOwnProperty(\"centroid\")) { \n",
       "            var c = obj.userData.centroid;\n",
       "            obj.position.set(c.x*factor, c.y*factor, c.z*factor);\n",
       "        }\n",
       "    }\t\n",
       "}\n",
       "\n",
       "function triggerExplode(event){\n",
       "    explodeScale = Number(event.currentTarget.value);\n",
       "    explode(explodeScale);\n",
       "}\n",
       "\n",
       "function setExplodingSpeed(event){\n",
       "    explodingSpeed = Number(event.currentTarget.value);\n",
       "}\n",
       "\n",
       "function triggerAutomaticExplode(event){\n",
       "    if (event.currentTarget.checked){\n",
       "        startExploding();\n",
       "    } else {\n",
       "        clearIntervals();\n",
       "    }\t\n",
       "}\n",
       "\n",
       "function startExploding(){\n",
       "    intervals.push(setInterval(explodingInterval, 25));\n",
       "}\n",
       "\n",
       "\n",
       "function explodingInterval(){\n",
       "    explodeScale += explodingSpeed;\n",
       "    if (explodeScale <= 6){ \n",
       "        explode(explodeScale);\n",
       "    }\n",
       "    else{\n",
       "        explode(6);\n",
       "        explodeScale = 6;\n",
       "        clearIntervals();\n",
       "        timeouts.push(setTimeout(startUnexploding, 3000));\n",
       "    }\n",
       "    document.getElementById('explodeRange_5').value = explodeScale;\n",
       "}\n",
       "\n",
       "\n",
       "function startUnexploding(){\n",
       "    intervals.push(setInterval(unexplodingInterval, 25));\n",
       "}\n",
       "\n",
       "function unexplodingInterval(){\n",
       "    explodeScale -= explodingSpeed;\n",
       "    if (explodeScale >= 0){\t\n",
       "        explode(explodeScale);\n",
       "    }\n",
       "    else {\n",
       "        explode(0);\n",
       "        explodeScale = 0;\n",
       "        clearIntervals();\n",
       "        timeouts.push(setTimeout(startExploding, 3000));\n",
       "    }\n",
       "    document.getElementById('explodeRange_5').value = explodeScale;\n",
       "}\n",
       "\n",
       "function clearIntervals(){\n",
       "    intervals.forEach(function(interval){\n",
       "        clearInterval(interval);\n",
       "    });\n",
       "    intervals = [];\n",
       "    timeouts.forEach(function(timeout){\n",
       "        clearTimeout(timeout);\n",
       "    });\n",
       "    timeouts = [];\n",
       "}\n",
       "\n",
       "// ---------------------- DISPLAY --------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "const objectTypeInnerHTMLs = { points: \"Points\", pointlabels: \"Point labels\", lines: \"Edges\", edgelabels: \"Edge labels\", faces: \"Faces\", arrowheads: \"Arrow heads\" };\n",
       "const objectTypeVisible = {};\n",
       "Object.assign(objectTypeVisible,modelContains);\n",
       "const sortedObjectTypeKeys = Object.keys(objectTypeInnerHTMLs).sort();\n",
       "const shownObjectTypesList = document.getElementById('shownObjectTypesList_5');\n",
       "\n",
       "function setVisibility(bool,objname) {\n",
       "    for (var i=0; i<scene.children.length; i++){\n",
       "        var obj = scene.children[i].getObjectByName(objname);\n",
       "        if (obj) {\n",
       "            obj.visible = bool;\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function toggleObjectTypeVisibility(event){\n",
       "    var name = event.currentTarget.name;\n",
       "    var checked = event.currentTarget.checked;\n",
       "    objectTypeVisible[name] = checked;\n",
       "    setVisibility(checked,name);\n",
       "}\n",
       "\n",
       "for (var i=0; i<sortedObjectTypeKeys.length; i++){\n",
       "    var key = sortedObjectTypeKeys[i];\n",
       "    if (modelContains[key]) {\n",
       "        var objTypeNode = document.createElement('span');\n",
       "        objTypeNode.innerHTML = objectTypeInnerHTMLs[key] + '<br>';\n",
       "        var checkbox = document.createElement('input');\n",
       "        checkbox.type = 'checkbox';\n",
       "        checkbox.checked = true;\n",
       "        checkbox.name = key;\n",
       "        checkbox.onchange = toggleObjectTypeVisibility;\n",
       "        shownObjectTypesList.appendChild(checkbox);\n",
       "        shownObjectTypesList.appendChild(objTypeNode);\n",
       "    }\n",
       "}\n",
       "\n",
       "// ------------------------------------------------------\n",
       "\n",
       "function toggleObjectVisibility(event){\n",
       "    var nr = Number(event.currentTarget.name);\n",
       "    scene.children[nr].visible = event.currentTarget.checked;\n",
       "}\n",
       "\n",
       "// append checkboxes for displaying or hiding objects\n",
       "var shownObjectsList = document.getElementById('shownObjectsList_5');\n",
       "for (var i=0; i<scene.children.length; i++){\n",
       "    obj = scene.children[i];\n",
       "    var objNode = document.createElement('span');\n",
       "    objNode.innerHTML = obj.name + '<br>';\n",
       "    var checkbox = document.createElement('input');\n",
       "    checkbox.type = 'checkbox';\n",
       "    checkbox.checked = true;\n",
       "    checkbox.name = String(i);\n",
       "    checkbox.onchange = toggleObjectVisibility;\n",
       "    shownObjectsList.appendChild(checkbox);\n",
       "    shownObjectsList.appendChild(objNode);\n",
       "}\n",
       "\n",
       "// ---------------------- SVG ------------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "function takeSvgScreenshot() {\n",
       "    if (objectTypeVisible[\"pointlabels\"]) {\n",
       "        setVisibility(false,\"pointlabels\");\n",
       "    }\n",
       "    if (objectTypeVisible[\"edgelabels\"]) {\n",
       "        setVisibility(false,\"edgelabels\");\n",
       "    }\n",
       "    svgRenderer.render(scene,camera);\n",
       "    svgElement = XMLS.serializeToString(svgRenderer.domElement);\n",
       "    \n",
       "    if (objectTypeVisible[\"pointlabels\"]) {\n",
       "        setVisibility(true,\"pointlabels\");\n",
       "    }\n",
       "    if (objectTypeVisible[\"edgelabels\"]) {\n",
       "        setVisibility(true,\"edgelabels\");\n",
       "    }\n",
       "\n",
       "    if (document.getElementById('tab_5').checked){\n",
       "        //show in new tab\n",
       "        var myWindow = window.open(\"\",\"\");\n",
       "        myWindow.document.body.innerHTML = svgElement;\n",
       "    } else{\n",
       "        // download svg file \n",
       "        download(\"screenshot.svg\", svgElement);\n",
       "    }\n",
       "}\n",
       "\n",
       "function download(filename, text) {\n",
       "    var element = document.createElement('a');\n",
       "    element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));\n",
       "    element.setAttribute('download', filename);\n",
       "\n",
       "    element.style.display = 'none';\n",
       "    document.body.appendChild(element);\n",
       "\n",
       "    element.click();\n",
       "\n",
       "    document.body.removeChild(element);\n",
       "}\n",
       "\n",
       "\n",
       "document.getElementById('transparencyRange_5').oninput = changeTransparency;\n",
       "document.getElementById('changeRotationX_5').onchange = changeRotationX;\n",
       "document.getElementById('changeRotationY_5').onchange = changeRotationY;\n",
       "document.getElementById('changeRotationZ_5').onchange = changeRotationZ;\n",
       "document.getElementById('resetButton_5').onclick = resetScene;\n",
       "document.getElementById('rotationSpeedRange_5').oninput = changeRotationSpeedFactor;\n",
       "document.getElementById('takeScreenshot_5').onclick = takeSvgScreenshot;\n",
       "document.getElementById('showSettingsButton_5').onclick = showSettings;\n",
       "document.getElementById('hideSettingsButton_5').onclick = hideSettings;\n",
       "\n",
       "\n",
       "// ------------------ SHORTCUTS --------------------------------------------\n",
       "// -------------------------------------------------------------------------\n",
       "\n",
       "/**\n",
       " * http://www.openjs.com/scripts/events/keyboard_shortcuts/\n",
       " * Version : 2.01.B\n",
       " * By Binny V A\n",
       " * License : BSD\n",
       " */\n",
       "shortcut = {\n",
       "\t'all_shortcuts':{},//All the shortcuts are stored in this array\n",
       "\t'add': function(shortcut_combination,callback,opt) {\n",
       "\t\t//Provide a set of default options\n",
       "\t\tvar default_options = {\n",
       "\t\t\t'type':'keydown',\n",
       "\t\t\t'propagate':false,\n",
       "\t\t\t'disable_in_input':false,\n",
       "\t\t\t'target':document,\n",
       "\t\t\t'keycode':false\n",
       "\t\t}\n",
       "\t\tif(!opt) opt = default_options;\n",
       "\t\telse {\n",
       "\t\t\tfor(var dfo in default_options) {\n",
       "\t\t\t\tif(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo];\n",
       "\t\t\t}\n",
       "\t\t}\n",
       "\n",
       "\t\tvar ele = opt.target;\n",
       "\t\tif(typeof opt.target == 'string') ele = document.getElementById(opt.target);\n",
       "\t\tvar ths = this;\n",
       "\t\tshortcut_combination = shortcut_combination.toLowerCase();\n",
       "\n",
       "\t\t//The function to be called at keypress\n",
       "\t\tvar func = function(e) {\n",
       "\t\t\te = e || window.event;\n",
       "\t\t\t\n",
       "\t\t\tif(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields\n",
       "\t\t\t\tvar element;\n",
       "\t\t\t\tif(e.target) element=e.target;\n",
       "\t\t\t\telse if(e.srcElement) element=e.srcElement;\n",
       "\t\t\t\tif(element.nodeType==3) element=element.parentNode;\n",
       "\n",
       "\t\t\t\tif(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return;\n",
       "\t\t\t}\n",
       "\t\n",
       "\t\t\t//Find Which key is pressed\n",
       "\t\t\tif (e.keyCode) code = e.keyCode;\n",
       "\t\t\telse if (e.which) code = e.which;\n",
       "\t\t\tvar character = String.fromCharCode(code).toLowerCase();\n",
       "\t\t\t\n",
       "\t\t\tif(code == 188) character=\",\"; //If the user presses , when the type is onkeydown\n",
       "\t\t\tif(code == 190) character=\".\"; //If the user presses , when the type is onkeydown\n",
       "\n",
       "\t\t\tvar keys = shortcut_combination.split(\"+\");\n",
       "\t\t\t//Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked\n",
       "\t\t\tvar kp = 0;\n",
       "\t\t\t\n",
       "\t\t\t//Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken\n",
       "\t\t\tvar shift_nums = {\n",
       "\t\t\t\t\"`\":\"~\",\n",
       "\t\t\t\t\"1\":\"!\",\n",
       "\t\t\t\t\"2\":\"@\",\n",
       "\t\t\t\t\"3\":\"#\",\n",
       "\t\t\t\t\"4\":\"$\",\n",
       "\t\t\t\t\"5\":\"%\",\n",
       "\t\t\t\t\"6\":\"^\",\n",
       "\t\t\t\t\"7\":\"&\",\n",
       "\t\t\t\t\"8\":\"*\",\n",
       "\t\t\t\t\"9\":\"(\",\n",
       "\t\t\t\t\"0\":\")\",\n",
       "\t\t\t\t\"-\":\"_\",\n",
       "\t\t\t\t\"=\":\"+\",\n",
       "\t\t\t\t\";\":\":\",\n",
       "\t\t\t\t\"'\":\"\\\"\",\n",
       "\t\t\t\t\",\":\"<\",\n",
       "\t\t\t\t\".\":\">\",\n",
       "\t\t\t\t\"/\":\"?\",\n",
       "\t\t\t\t\"\\\\\":\"|\"\n",
       "\t\t\t}\n",
       "\t\t\t//Special Keys - and their codes\n",
       "\t\t\tvar special_keys = {\n",
       "\t\t\t\t'esc':27,\n",
       "\t\t\t\t'escape':27,\n",
       "\t\t\t\t'tab':9,\n",
       "\t\t\t\t'space':32,\n",
       "\t\t\t\t'return':13,\n",
       "\t\t\t\t'enter':13,\n",
       "\t\t\t\t'backspace':8,\n",
       "\t\n",
       "\t\t\t\t'scrolllock':145,\n",
       "\t\t\t\t'scroll_lock':145,\n",
       "\t\t\t\t'scroll':145,\n",
       "\t\t\t\t'capslock':20,\n",
       "\t\t\t\t'caps_lock':20,\n",
       "\t\t\t\t'caps':20,\n",
       "\t\t\t\t'numlock':144,\n",
       "\t\t\t\t'num_lock':144,\n",
       "\t\t\t\t'num':144,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'pause':19,\n",
       "\t\t\t\t'break':19,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'insert':45,\n",
       "\t\t\t\t'home':36,\n",
       "\t\t\t\t'delete':46,\n",
       "\t\t\t\t'end':35,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'pageup':33,\n",
       "\t\t\t\t'page_up':33,\n",
       "\t\t\t\t'pu':33,\n",
       "\t\n",
       "\t\t\t\t'pagedown':34,\n",
       "\t\t\t\t'page_down':34,\n",
       "\t\t\t\t'pd':34,\n",
       "\t\n",
       "\t\t\t\t'left':37,\n",
       "\t\t\t\t'up':38,\n",
       "\t\t\t\t'right':39,\n",
       "\t\t\t\t'down':40,\n",
       "\t\n",
       "\t\t\t\t'f1':112,\n",
       "\t\t\t\t'f2':113,\n",
       "\t\t\t\t'f3':114,\n",
       "\t\t\t\t'f4':115,\n",
       "\t\t\t\t'f5':116,\n",
       "\t\t\t\t'f6':117,\n",
       "\t\t\t\t'f7':118,\n",
       "\t\t\t\t'f8':119,\n",
       "\t\t\t\t'f9':120,\n",
       "\t\t\t\t'f10':121,\n",
       "\t\t\t\t'f11':122,\n",
       "\t\t\t\t'f12':123\n",
       "\t\t\t}\n",
       "\t\n",
       "\t\t\tvar modifiers = { \n",
       "\t\t\t\tshift: { wanted:false, pressed:false},\n",
       "\t\t\t\tctrl : { wanted:false, pressed:false},\n",
       "\t\t\t\talt  : { wanted:false, pressed:false},\n",
       "\t\t\t\tmeta : { wanted:false, pressed:false}\t//Meta is Mac specific\n",
       "\t\t\t};\n",
       "                        \n",
       "\t\t\tif(e.ctrlKey)\tmodifiers.ctrl.pressed = true;\n",
       "\t\t\tif(e.shiftKey)\tmodifiers.shift.pressed = true;\n",
       "\t\t\tif(e.altKey)\tmodifiers.alt.pressed = true;\n",
       "\t\t\tif(e.metaKey)   modifiers.meta.pressed = true;\n",
       "                        \n",
       "\t\t\tfor(var i=0; k=keys[i],i<keys.length; i++) {\n",
       "\t\t\t\t//Modifiers\n",
       "\t\t\t\tif(k == 'ctrl' || k == 'control') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.ctrl.wanted = true;\n",
       "\n",
       "\t\t\t\t} else if(k == 'shift') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.shift.wanted = true;\n",
       "\n",
       "\t\t\t\t} else if(k == 'alt') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.alt.wanted = true;\n",
       "\t\t\t\t} else if(k == 'meta') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.meta.wanted = true;\n",
       "\t\t\t\t} else if(k.length > 1) { //If it is a special key\n",
       "\t\t\t\t\tif(special_keys[k] == code) kp++;\n",
       "\t\t\t\t\t\n",
       "\t\t\t\t} else if(opt['keycode']) {\n",
       "\t\t\t\t\tif(opt['keycode'] == code) kp++;\n",
       "\n",
       "\t\t\t\t} else { //The special keys did not match\n",
       "\t\t\t\t\tif(character == k) kp++;\n",
       "\t\t\t\t\telse {\n",
       "\t\t\t\t\t\tif(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase\n",
       "\t\t\t\t\t\t\tcharacter = shift_nums[character]; \n",
       "\t\t\t\t\t\t\tif(character == k) kp++;\n",
       "\t\t\t\t\t\t}\n",
       "\t\t\t\t\t}\n",
       "\t\t\t\t}\n",
       "\t\t\t}\n",
       "\t\t\t\n",
       "\t\t\tif(kp == keys.length && \n",
       "\t\t\t\t\t\tmodifiers.ctrl.pressed == modifiers.ctrl.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.shift.pressed == modifiers.shift.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.alt.pressed == modifiers.alt.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.meta.pressed == modifiers.meta.wanted) {\n",
       "\t\t\t\tcallback(e);\n",
       "\t\n",
       "\t\t\t\tif(!opt['propagate']) { //Stop the event\n",
       "\t\t\t\t\t//e.cancelBubble is supported by IE - this will kill the bubbling process.\n",
       "\t\t\t\t\te.cancelBubble = true;\n",
       "\t\t\t\t\te.returnValue = false;\n",
       "\t\n",
       "\t\t\t\t\t//e.stopPropagation works in Firefox.\n",
       "\t\t\t\t\tif (e.stopPropagation) {\n",
       "\t\t\t\t\t\te.stopPropagation();\n",
       "\t\t\t\t\t\te.preventDefault();\n",
       "\t\t\t\t\t}\n",
       "\t\t\t\t\treturn false;\n",
       "\t\t\t\t}\n",
       "\t\t\t}\n",
       "\t\t}\n",
       "\t\tthis.all_shortcuts[shortcut_combination] = {\n",
       "\t\t\t'callback':func, \n",
       "\t\t\t'target':ele, \n",
       "\t\t\t'event': opt['type']\n",
       "\t\t};\n",
       "\t\t//Attach the function with the event\n",
       "\t\tif(ele.addEventListener) ele.addEventListener(opt['type'], func, false);\n",
       "\t\telse if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func);\n",
       "\t\telse ele['on'+opt['type']] = func;\n",
       "\t},\n",
       "\n",
       "\t//Remove the shortcut - just specify the shortcut and I will remove the binding\n",
       "\t'remove':function(shortcut_combination) {\n",
       "\t\tshortcut_combination = shortcut_combination.toLowerCase();\n",
       "\t\tvar binding = this.all_shortcuts[shortcut_combination];\n",
       "\t\tdelete(this.all_shortcuts[shortcut_combination])\n",
       "\t\tif(!binding) return;\n",
       "\t\tvar type = binding['event'];\n",
       "\t\tvar ele = binding['target'];\n",
       "\t\tvar callback = binding['callback'];\n",
       "\n",
       "\t\tif(ele.detachEvent) ele.detachEvent('on'+type, callback);\n",
       "\t\telse if(ele.removeEventListener) ele.removeEventListener(type, callback, false);\n",
       "\t\telse ele['on'+type] = false;\n",
       "\t}\n",
       "}\n",
       "\n",
       "shortcut.add(\"Alt+Left\",function() {\n",
       "\tvar event = new Event('click');\n",
       "\tif (settingsShown){\n",
       "\t\tdocument.getElementById('hideSettingsButton_5').dispatchEvent(event);\n",
       "\t} else {\n",
       "\t\tdocument.getElementById('showSettingsButton_5').dispatchEvent(event);\n",
       "\t}\n",
       "});\n",
       "\n",
       "\n",
       "// COMMON_CODE_BLOCK_END\n",
       "\n",
       "});});\n",
       "      </script>\n",
       "   </body>\n",
       "</html>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "$p = secondary_polyhedron($s,7);\n",
    "$p->VISUAL(FacetColor=>'255 180 80');"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<!--\n",
       "polymake for knusper\n",
       "Thu Aug 27 11:35:37 2020\n",
       "pcom:d0\n",
       "-->\n",
       "\n",
       "\n",
       "<html>\n",
       "   <head>\n",
       "      <meta charset=utf-8>\n",
       "      <title>pcom:d0</title>\n",
       "      <style>\n",
       "/*\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "*/\n",
       "         html {overflow: scroll;}\n",
       "         strong{font-size: 18px;}\n",
       "         canvas { z-index: 8; }\n",
       "         input[type='radio'] {margin-left:0;}\n",
       "         input[type='checkbox'] {margin-right:7px; margin-left: 0px; padding-left:0px;}\n",
       "         .group{padding-bottom: 15px;}\n",
       "         .settings * {z-index: 11; }\n",
       "         .settings{z-index: 10; font-family: Arial, Helvetica, sans-serif; margin-left: 30px; visibility: hidden; width: 14em; height: 96%; border: solid 1px silver; padding: 2px; overflow-y: scroll; box-sizing: border-box; background-color: white; position: absolute;}\n",
       "         .indented{margin-left: 20px; margin-top: 10px; padding-bottom: 0px;} \n",
       "         .shownObjectsList{overflow: auto; max-width: 150px; max-height: 150px;}\n",
       "         .showSettingsButton{visibility: visible; z-index: 12; position: absolute }\n",
       "         .hideSettingsButton{visibility: hidden; z-index: 12; position: absolute; opacity: 0.5}\n",
       "         button{margin-left: 0; margin-top: 10px}\n",
       "         img{cursor: pointer;}\n",
       "         .suboption{padding-top: 15px;}\n",
       "         #model360263338 { width: 100%; height: 100%; }\n",
       "         .threejs_container { width: 100%; height: 75vh;}\n",
       "         .settings{max-height: 74vh} \n",
       "         input[type=range] {\n",
       "           -webkit-appearance: none;\n",
       "           padding:0; \n",
       "           width:90%; \n",
       "           margin-left: auto;\n",
       "           margin-right: auto;\n",
       "           margin-top: 15px;\n",
       "           margin-bottom: 15px;\n",
       "           display: block;\t\n",
       "         }\n",
       "         input[type=range]:focus {\n",
       "           outline: none;\n",
       "         }\n",
       "         input[type=range]::-webkit-slider-runnable-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "           background: #E3E3E3;\n",
       "           border-radius: 0px;\n",
       "           border: 0px solid #000000;\n",
       "         }\n",
       "         input[type=range]::-webkit-slider-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "           -webkit-appearance: none;\n",
       "           margin-top: -5px;\n",
       "         }\n",
       "         input[type=range]:focus::-webkit-slider-runnable-track {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "         input[type=range]::-moz-range-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "           background: #E3E3E3;\n",
       "           border-radius: 0px;\n",
       "           border: 0px solid #000000;\n",
       "         }\n",
       "         input[type=range]::-moz-range-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "         }\n",
       "         input[type=range]::-ms-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           background: transparent;\n",
       "           border-color: transparent;\n",
       "           color: transparent;\n",
       "         }\n",
       "         input[type=range]::-ms-fill-lower {\n",
       "           background: #E3E3E3;\n",
       "           border: 0px solid #000000;\n",
       "           border-radius: 0px;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "         }\n",
       "         input[type=range]::-ms-fill-upper {\n",
       "           background: #E3E3E3;\n",
       "           border: 0px solid #000000;\n",
       "           border-radius: 0px;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "         }\n",
       "         input[type=range]::-ms-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "         }\n",
       "         input[type=range]:focus::-ms-fill-lower {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "         input[type=range]:focus::-ms-fill-upper {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "/*\n",
       "// COMMON_CODE_BLOCK_END\n",
       "*/\n",
       "\t\t</style>\n",
       "   </head>\n",
       "<body>\n",
       "   <div class='threejs_container'>\n",
       "\t\t<div id='settings_6' class='settings'>\n",
       "\t\t\t<div class=group id='explode_6'>\n",
       "\t\t\t\t<strong>Explode</strong>\n",
       "\t\t\t\t<input id='explodeRange_6' type='range' min=0 max=6 step=0.01 value=0>\n",
       "\t\t\t\t<div class=indented><input id='explodeCheckbox_6' type='checkbox'>Automatic explosion</div>\n",
       "\t\t\t\t<div class=suboption>Exploding speed</div>\n",
       "\t\t\t\t<input id='explodingSpeedRange_6' type='range' min=0 max=0.5 step=0.001 value=0.05>\n",
       "\t\t\t</div>\n",
       "\t\n",
       "\t\t\t<div class=group id='transparency_6' class='transparency'>\n",
       "\t\t\t\t<strong>Transparency</strong>\n",
       "\t\t\t\t<input id='transparencyRange_6' type='range' min=0 max=1 step=0.01 value=0>\n",
       "\t\t\t</div>\n",
       "\t\t\t\n",
       "\t\t\t<div class=group id='rotation_6'>\n",
       "\t\t\t\t<strong>Rotation</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationX_6'> x-axis</div>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationY_6'> y-axis</div>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationZ_6'> z-axis</div>\n",
       "\t\t\t\t\t<button id='resetButton_6'>Reset</button>\n",
       "\t\t\t\t</div>\n",
       "\n",
       "\t\t\t\t<div class=suboption>Rotation speed</div>\n",
       "\t\t\t\t<input id='rotationSpeedRange_6' type='range' min=0 max=5 step=0.01 value=2>\n",
       "\t\t\t</div>\n",
       "\n",
       "\n",
       "\t\t\t<div class=group id='display_6'>\n",
       "\t\t\t\t<strong>Display</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<div id='shownObjectTypesList_6' class='shownObjectsList'></div>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t\t<div class=suboption>Objects</div>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t   <div id='shownObjectsList_6' class='shownObjectsList'></div>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t</div>\n",
       "         \n",
       "         <div class=group id='camera_6'>\n",
       "            <strong>Camera</strong>\n",
       "            <div class=indented>\n",
       "               <form>\n",
       "                  <select id=\"cameraType_6\">\n",
       "                     <option value='perspective' selected> Perspective<br></option>\n",
       "                     <option value='orthographic' > Orthographic<br></option>\n",
       "                  </select>\n",
       "               </form>\n",
       "            </div>\n",
       "         </div>\n",
       "\n",
       "\t\t\t<div class=group id='svg_6'>\n",
       "\t\t\t\t<strong>SVG</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<form>\n",
       "\t\t\t\t\t\t<input type=\"radio\" name='screenshotMode' value='download' id='download_6' checked> Download<br>\n",
       "\t\t\t\t\t\t<input type=\"radio\" name='screenshotMode' value='tab' id='tab_6' > New tab<br>\n",
       "\t\t\t\t\t</form>\n",
       "\t\t\t\t\t<button id='takeScreenshot_6'>Screenshot</button>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t</div>\n",
       "\n",
       "\t\t</div>\t<!-- end of settings -->\n",
       "\t\t<img id='hideSettingsButton_6' class='hideSettingsButton' src='/kernelspecs/polymake/close.svg' width=20px\">\n",
       "\t\t<img id='showSettingsButton_6' class='showSettingsButton' src='/kernelspecs/polymake/menu.svg' width=20px\">\n",
       "<div id=\"model360263338\"></div>\n",
       "</div>\n",
       "   <script>\n",
       "    requirejs.config({\n",
       "      paths: {\n",
       "        three: '/kernelspecs/polymake/three',\n",
       "        TrackballControls: '/kernelspecs/polymake/TrackballControls',\n",
       "        OrbitControls: '/kernelspecs/polymake/OrbitControls',\n",
       "        Projector: '/kernelspecs/polymake/Projector',\n",
       "        SVGRenderer: '/kernelspecs/polymake/SVGRenderer',\n",
       "        WEBGL: '/kernelspecs/polymake/WebGL',\n",
       "      },\n",
       "      shim: {\n",
       "        'three': { exports: 'THREE'},\n",
       "        'SVGRenderer': { deps: [ 'three' ], exports: 'THREE.SVGRenderer' },\n",
       "        'WEBGL': { deps: [ 'three' ], exports: 'THREE.WEBGL' },\n",
       "        'Projector': { deps: [ 'three' ], exports: 'THREE.Projector' },\n",
       "        'TrackballControls': { deps: [ 'three' ], exports: 'THREE.TrackballControls' },\n",
       "        'OrbitControls': { deps: [ 'three' ], exports: 'THREE.OrbitControls' },\n",
       "      }\n",
       "    });\n",
       "    \n",
       "    require(['three'],function(THREE){\n",
       "        window.THREE = THREE;\n",
       "      require(['TrackballControls', 'OrbitControls', 'Projector', 'SVGRenderer', 'WEBGL'],\n",
       "               function(TrackballControls, OrbitControls, Projector, SVGRenderer, WEBGL) {\n",
       "    THREE.TrackballControls = TrackballControls;\n",
       "    THREE.OrbitControls = OrbitControls;\n",
       "    THREE.Projector = Projector;\n",
       "    THREE.SVGRenderer = SVGRenderer;\n",
       "    THREE.WEBGL = WEBGL;\n",
       "\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "\n",
       "const intervalLength = 25; // for automatic animations\n",
       "const explodableModel = true; \n",
       "const modelContains = { points: false, pointlabels: false, lines: false, edgelabels: false, faces: false, arrowheads: false };\n",
       "const foldables = [];\n",
       "\n",
       "var three = document.getElementById(\"model360263338\");\n",
       "var scene = new THREE.Scene();\n",
       "var renderer = new THREE.WebGLRenderer( { antialias: true } );\n",
       "var svgRenderer = new THREE.SVGRenderer( { antialias: true } );\n",
       "renderer.setPixelRatio( window.devicePixelRatio );\n",
       "renderer.setClearColor(0xFFFFFF, 1);\n",
       "svgRenderer.setClearColor(0xFFFFFF, 1);\n",
       "three.appendChild(renderer.domElement);\n",
       "\n",
       "var frustumSize = 4;\n",
       "var cameras = [new THREE.PerspectiveCamera(75, 1, 0.1, 1000), new THREE.OrthographicCamera()];\n",
       "cameras.forEach(function(cam) {\n",
       "    cam.position.set(0, 0, 5);\n",
       "    cam.lookAt(0, 0, 0);  \n",
       "    cam.up.set(0, 1, 0);         \n",
       "});\n",
       "var controls = [new THREE.TrackballControls(cameras[0], three), new THREE.OrbitControls(cameras[1], three)];\n",
       "var camera, control;\n",
       "\n",
       "controls[0].zoomSpeed = 0.2;\n",
       "controls[0].rotateSpeed = 4;\n",
       "\n",
       "\n",
       "// class to allow move points together with labels and spheres\n",
       "var PMPoint = function (x,y,z) {\n",
       "   this.vector = new THREE.Vector3(x,y,z);\n",
       "   this.sprite = null;\n",
       "   this.sphere = null;\n",
       "}\n",
       "PMPoint.prototype.addLabel = function(labelsprite) {\n",
       "   this.sprite = labelsprite;\n",
       "   this.sprite.position.copy(this.vector);\n",
       "}\n",
       "PMPoint.prototype.addSphere = function(spheremesh) {\n",
       "   this.sphere = spheremesh;\n",
       "   this.sphere.position.copy(this.vector);\n",
       "}\n",
       "PMPoint.prototype.set = function(x,y,z) {\n",
       "   this.vector.set(x,y,z);\n",
       "   if (this.sprite) {\n",
       "      this.sprite.position.copy(this.vector);\n",
       "   }\n",
       "   if (this.sphere) {\n",
       "      this.sphere.position.copy(this.vector);\n",
       "   }\n",
       "}\n",
       "PMPoint.prototype.radius = function() {\n",
       "   if (this.sphere) {\n",
       "      return this.sphere.geometry.parameters.radius;\n",
       "   } else {\n",
       "      return 0;\n",
       "   }\n",
       "};\n",
       "// select the target node\n",
       "var target = document.querySelector('#model360263338');\n",
       "\n",
       "// create an observer instance\n",
       "var observer = new MutationObserver(function(mutations) {\n",
       "   mutations.forEach(function(mutation) {\n",
       "      if (mutation.removedNodes && mutation.removedNodes.length > 0) {\n",
       "         cancelAnimationFrame(renderId);\n",
       "         observer.disconnect();\n",
       "         console.log(\"cancelled frame \"+renderId);\n",
       "      }\n",
       "   });\n",
       "});\n",
       "\n",
       "// configuration of the observer:\n",
       "var config = { childList: true, characterData: true }\n",
       "\n",
       "// pass in the target node, as well as the observer options\n",
       "while (target) {\n",
       "   if (target.className==\"output\") {\n",
       "      observer.observe(target, config);\n",
       "      break;\n",
       "   }\n",
       "   target = target.parentNode;\n",
       "}\n",
       "\n",
       "// COMMON_CODE_BLOCK_END\n",
       "\n",
       "var obj0 = new THREE.Object3D();\n",
       "obj0.name = \"unnamed__1\";\n",
       "obj0.userData.explodable = 1;\n",
       "obj0.userData.points = [];\n",
       "obj0.userData.points.push(new PMPoint(0.6, -0.8, 0.128));\n",
       "obj0.userData.points.push(new PMPoint(0.6, 0.8, 0.128));\n",
       "obj0.userData.points.push(new PMPoint(-1, 0, 0.2));\n",
       "\n",
       "obj0.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj0.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj0.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj0.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj0.userData.facets = [[0, 2, 1]];\n",
       "   <!-- Facet style -->\n",
       "obj0.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj0);\n",
       "scene.add(obj0);\n",
       "\n",
       "var obj1 = new THREE.Object3D();\n",
       "obj1.name = \"unnamed__2\";\n",
       "obj1.userData.explodable = 1;\n",
       "obj1.userData.points = [];\n",
       "obj1.userData.points.push(new PMPoint(0.6, -0.8, 0.128));\n",
       "obj1.userData.points.push(new PMPoint(0.6, 0.8, 0.128));\n",
       "obj1.userData.points.push(new PMPoint(1, 0, 0.0125));\n",
       "\n",
       "obj1.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj1.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj1.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj1.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj1.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj1.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj1);\n",
       "scene.add(obj1);\n",
       "\n",
       "var obj2 = new THREE.Object3D();\n",
       "obj2.name = \"unnamed__3\";\n",
       "obj2.userData.explodable = 1;\n",
       "obj2.userData.points = [];\n",
       "obj2.userData.points.push(new PMPoint(0.6, 0.8, 0.128));\n",
       "obj2.userData.points.push(new PMPoint(-1, 0, 0.2));\n",
       "obj2.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.0189349));\n",
       "\n",
       "obj2.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj2.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj2.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj2.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj2.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj2.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj2);\n",
       "scene.add(obj2);\n",
       "\n",
       "var obj3 = new THREE.Object3D();\n",
       "obj3.name = \"unnamed__4\";\n",
       "obj3.userData.explodable = 1;\n",
       "obj3.userData.points = [];\n",
       "obj3.userData.points.push(new PMPoint(0.6, -0.8, 0.128));\n",
       "obj3.userData.points.push(new PMPoint(-1, 0, 0.2));\n",
       "obj3.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.0189349));\n",
       "\n",
       "obj3.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj3.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj3.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj3.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj3.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj3.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj3);\n",
       "scene.add(obj3);\n",
       "\n",
       "var obj4 = new THREE.Object3D();\n",
       "obj4.name = \"unnamed__5\";\n",
       "obj4.userData.explodable = 1;\n",
       "obj4.userData.points = [];\n",
       "obj4.userData.points.push(new PMPoint(0.6, -0.8, 0.128));\n",
       "obj4.userData.points.push(new PMPoint(1, 0, 0.0125));\n",
       "obj4.userData.points.push(new PMPoint(0.945946, -0.324324, 0.00233747));\n",
       "\n",
       "obj4.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj4.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj4.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj4.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj4.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj4.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj4);\n",
       "scene.add(obj4);\n",
       "\n",
       "var obj5 = new THREE.Object3D();\n",
       "obj5.name = \"unnamed__6\";\n",
       "obj5.userData.explodable = 1;\n",
       "obj5.userData.points = [];\n",
       "obj5.userData.points.push(new PMPoint(0.6, 0.8, 0.128));\n",
       "obj5.userData.points.push(new PMPoint(1, 0, 0.0125));\n",
       "obj5.userData.points.push(new PMPoint(0.945946, 0.324324, 0.00233747));\n",
       "\n",
       "obj5.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj5.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj5.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj5.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj5.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj5.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj5);\n",
       "scene.add(obj5);\n",
       "\n",
       "var obj6 = new THREE.Object3D();\n",
       "obj6.name = \"unnamed__7\";\n",
       "obj6.userData.explodable = 1;\n",
       "obj6.userData.points = [];\n",
       "obj6.userData.points.push(new PMPoint(0.6, 0.8, 0.128));\n",
       "obj6.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.0189349));\n",
       "obj6.userData.points.push(new PMPoint(0, 1, 0.003125));\n",
       "\n",
       "obj6.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj6.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj6.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj6.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj6.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj6.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj6);\n",
       "scene.add(obj6);\n",
       "\n",
       "var obj7 = new THREE.Object3D();\n",
       "obj7.name = \"unnamed__8\";\n",
       "obj7.userData.explodable = 1;\n",
       "obj7.userData.points = [];\n",
       "obj7.userData.points.push(new PMPoint(-1, 0, 0.2));\n",
       "obj7.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.0189349));\n",
       "obj7.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00237812));\n",
       "\n",
       "obj7.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj7.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj7.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj7.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj7.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj7.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj7);\n",
       "scene.add(obj7);\n",
       "\n",
       "var obj8 = new THREE.Object3D();\n",
       "obj8.name = \"unnamed__9\";\n",
       "obj8.userData.explodable = 1;\n",
       "obj8.userData.points = [];\n",
       "obj8.userData.points.push(new PMPoint(-1, 0, 0.2));\n",
       "obj8.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.0189349));\n",
       "obj8.userData.points.push(new PMPoint(-0.724138, -0.689655, 0.00237812));\n",
       "\n",
       "obj8.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj8.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj8.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj8.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj8.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj8.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj8);\n",
       "scene.add(obj8);\n",
       "\n",
       "var obj9 = new THREE.Object3D();\n",
       "obj9.name = \"unnamed__10\";\n",
       "obj9.userData.explodable = 1;\n",
       "obj9.userData.points = [];\n",
       "obj9.userData.points.push(new PMPoint(0.6, -0.8, 0.128));\n",
       "obj9.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.0189349));\n",
       "obj9.userData.points.push(new PMPoint(0, -1, 0.003125));\n",
       "\n",
       "obj9.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj9.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj9.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj9.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj9.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj9.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj9);\n",
       "scene.add(obj9);\n",
       "\n",
       "var obj10 = new THREE.Object3D();\n",
       "obj10.name = \"unnamed__11\";\n",
       "obj10.userData.explodable = 1;\n",
       "obj10.userData.points = [];\n",
       "obj10.userData.points.push(new PMPoint(0.6, -0.8, 0.128));\n",
       "obj10.userData.points.push(new PMPoint(0.945946, -0.324324, 0.00233747));\n",
       "obj10.userData.points.push(new PMPoint(0.882353, -0.470588, 0.000692042));\n",
       "\n",
       "obj10.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj10.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj10.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj10.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj10.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj10.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj10);\n",
       "scene.add(obj10);\n",
       "\n",
       "var obj11 = new THREE.Object3D();\n",
       "obj11.name = \"unnamed__12\";\n",
       "obj11.userData.explodable = 1;\n",
       "obj11.userData.points = [];\n",
       "obj11.userData.points.push(new PMPoint(1, 0, 0.0125));\n",
       "obj11.userData.points.push(new PMPoint(0.945946, -0.324324, 0.00233747));\n",
       "obj11.userData.points.push(new PMPoint(0.980198, -0.19802, 0.000196059));\n",
       "\n",
       "obj11.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj11.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj11.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj11.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj11.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj11.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj11);\n",
       "scene.add(obj11);\n",
       "\n",
       "var obj12 = new THREE.Object3D();\n",
       "obj12.name = \"unnamed__13\";\n",
       "obj12.userData.explodable = 1;\n",
       "obj12.userData.points = [];\n",
       "obj12.userData.points.push(new PMPoint(1, 0, 0.0125));\n",
       "obj12.userData.points.push(new PMPoint(0.945946, 0.324324, 0.00233747));\n",
       "obj12.userData.points.push(new PMPoint(0.980198, 0.19802, 0.000196059));\n",
       "\n",
       "obj12.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj12.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj12.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj12.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj12.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj12.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj12);\n",
       "scene.add(obj12);\n",
       "\n",
       "var obj13 = new THREE.Object3D();\n",
       "obj13.name = \"unnamed__14\";\n",
       "obj13.userData.explodable = 1;\n",
       "obj13.userData.points = [];\n",
       "obj13.userData.points.push(new PMPoint(0.6, 0.8, 0.128));\n",
       "obj13.userData.points.push(new PMPoint(0.945946, 0.324324, 0.00233747));\n",
       "obj13.userData.points.push(new PMPoint(0.882353, 0.470588, 0.000692042));\n",
       "\n",
       "obj13.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj13.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj13.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj13.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj13.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj13.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj13);\n",
       "scene.add(obj13);\n",
       "\n",
       "var obj14 = new THREE.Object3D();\n",
       "obj14.name = \"unnamed__15\";\n",
       "obj14.userData.explodable = 1;\n",
       "obj14.userData.points = [];\n",
       "obj14.userData.points.push(new PMPoint(0.6, 0.8, 0.128));\n",
       "obj14.userData.points.push(new PMPoint(0, 1, 0.003125));\n",
       "obj14.userData.points.push(new PMPoint(0.180328, 0.983607, 0.00053749));\n",
       "\n",
       "obj14.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj14.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj14.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj14.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj14.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj14.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj14);\n",
       "scene.add(obj14);\n",
       "\n",
       "var obj15 = new THREE.Object3D();\n",
       "obj15.name = \"unnamed__16\";\n",
       "obj15.userData.explodable = 1;\n",
       "obj15.userData.points = [];\n",
       "obj15.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.0189349));\n",
       "obj15.userData.points.push(new PMPoint(0, 1, 0.003125));\n",
       "obj15.userData.points.push(new PMPoint(-0.152941, 0.988235, 0.000276817));\n",
       "\n",
       "obj15.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj15.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj15.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj15.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj15.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj15.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj15);\n",
       "scene.add(obj15);\n",
       "\n",
       "var obj16 = new THREE.Object3D();\n",
       "obj16.name = \"unnamed__17\";\n",
       "obj16.userData.explodable = 1;\n",
       "obj16.userData.points = [];\n",
       "obj16.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.0189349));\n",
       "obj16.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00237812));\n",
       "obj16.userData.points.push(new PMPoint(-0.6, 0.8, 0.0003125));\n",
       "\n",
       "obj16.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj16.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj16.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj16.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj16.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj16.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj16);\n",
       "scene.add(obj16);\n",
       "\n",
       "var obj17 = new THREE.Object3D();\n",
       "obj17.name = \"unnamed__18\";\n",
       "obj17.userData.explodable = 1;\n",
       "obj17.userData.points = [];\n",
       "obj17.userData.points.push(new PMPoint(-1, 0, 0.2));\n",
       "obj17.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00237812));\n",
       "obj17.userData.points.push(new PMPoint(-0.849057, 0.528302, 0.0011392));\n",
       "\n",
       "obj17.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj17.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj17.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj17.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj17.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj17.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj17);\n",
       "scene.add(obj17);\n",
       "\n",
       "var obj18 = new THREE.Object3D();\n",
       "obj18.name = \"unnamed__19\";\n",
       "obj18.userData.explodable = 1;\n",
       "obj18.userData.points = [];\n",
       "obj18.userData.points.push(new PMPoint(-1, 0, 0.2));\n",
       "obj18.userData.points.push(new PMPoint(-0.724138, -0.689655, 0.00237812));\n",
       "obj18.userData.points.push(new PMPoint(-0.849057, -0.528302, 0.0011392));\n",
       "\n",
       "obj18.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj18.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj18.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj18.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj18.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj18.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj18);\n",
       "scene.add(obj18);\n",
       "\n",
       "var obj19 = new THREE.Object3D();\n",
       "obj19.name = \"unnamed__20\";\n",
       "obj19.userData.explodable = 1;\n",
       "obj19.userData.points = [];\n",
       "obj19.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.0189349));\n",
       "obj19.userData.points.push(new PMPoint(-0.724138, -0.689655, 0.00237812));\n",
       "obj19.userData.points.push(new PMPoint(-0.6, -0.8, 0.0003125));\n",
       "\n",
       "obj19.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj19.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj19.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj19.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj19.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj19.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj19);\n",
       "scene.add(obj19);\n",
       "\n",
       "var obj20 = new THREE.Object3D();\n",
       "obj20.name = \"unnamed__21\";\n",
       "obj20.userData.explodable = 1;\n",
       "obj20.userData.points = [];\n",
       "obj20.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.0189349));\n",
       "obj20.userData.points.push(new PMPoint(0, -1, 0.003125));\n",
       "obj20.userData.points.push(new PMPoint(-0.152941, -0.988235, 0.000276817));\n",
       "\n",
       "obj20.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj20.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj20.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj20.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj20.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj20.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj20);\n",
       "scene.add(obj20);\n",
       "\n",
       "var obj21 = new THREE.Object3D();\n",
       "obj21.name = \"unnamed__22\";\n",
       "obj21.userData.explodable = 1;\n",
       "obj21.userData.points = [];\n",
       "obj21.userData.points.push(new PMPoint(0.6, -0.8, 0.128));\n",
       "obj21.userData.points.push(new PMPoint(0, -1, 0.003125));\n",
       "obj21.userData.points.push(new PMPoint(0.180328, -0.983607, 0.00053749));\n",
       "\n",
       "obj21.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj21.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj21.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj21.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj21.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj21.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj21);\n",
       "scene.add(obj21);\n",
       "\n",
       "var obj22 = new THREE.Object3D();\n",
       "obj22.name = \"unnamed__23\";\n",
       "obj22.userData.explodable = 1;\n",
       "obj22.userData.points = [];\n",
       "obj22.userData.points.push(new PMPoint(0.6, -0.8, 0.128));\n",
       "obj22.userData.points.push(new PMPoint(0.882353, -0.470588, 0.000692042));\n",
       "obj22.userData.points.push(new PMPoint(0.834862, -0.550459, 0.000168336));\n",
       "\n",
       "obj22.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj22.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj22.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj22.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj22.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj22.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj22);\n",
       "scene.add(obj22);\n",
       "\n",
       "var obj23 = new THREE.Object3D();\n",
       "obj23.name = \"unnamed__24\";\n",
       "obj23.userData.explodable = 1;\n",
       "obj23.userData.points = [];\n",
       "obj23.userData.points.push(new PMPoint(0.945946, -0.324324, 0.00233747));\n",
       "obj23.userData.points.push(new PMPoint(0.882353, -0.470588, 0.000692042));\n",
       "obj23.userData.points.push(new PMPoint(0.912195, -0.409756, 4.75907e-05));\n",
       "\n",
       "obj23.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj23.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj23.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj23.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj23.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj23.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj23);\n",
       "scene.add(obj23);\n",
       "\n",
       "var obj24 = new THREE.Object3D();\n",
       "obj24.name = \"unnamed__25\";\n",
       "obj24.userData.explodable = 1;\n",
       "obj24.userData.points = [];\n",
       "obj24.userData.points.push(new PMPoint(0.945946, -0.324324, 0.00233747));\n",
       "obj24.userData.points.push(new PMPoint(0.980198, -0.19802, 0.000196059));\n",
       "obj24.userData.points.push(new PMPoint(0.969231, -0.246154, 2.95858e-05));\n",
       "\n",
       "obj24.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj24.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj24.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj24.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj24.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj24.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj24);\n",
       "scene.add(obj24);\n",
       "\n",
       "var obj25 = new THREE.Object3D();\n",
       "obj25.name = \"unnamed__26\";\n",
       "obj25.userData.explodable = 1;\n",
       "obj25.userData.points = [];\n",
       "obj25.userData.points.push(new PMPoint(1, 0, 0.0125));\n",
       "obj25.userData.points.push(new PMPoint(0.980198, -0.19802, 0.000196059));\n",
       "obj25.userData.points.push(new PMPoint(0.989848, -0.142132, 8.24551e-05));\n",
       "\n",
       "obj25.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj25.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj25.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj25.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj25.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj25.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj25);\n",
       "scene.add(obj25);\n",
       "\n",
       "var obj26 = new THREE.Object3D();\n",
       "obj26.name = \"unnamed__27\";\n",
       "obj26.userData.explodable = 1;\n",
       "obj26.userData.points = [];\n",
       "obj26.userData.points.push(new PMPoint(1, 0, 0.0125));\n",
       "obj26.userData.points.push(new PMPoint(0.980198, 0.19802, 0.000196059));\n",
       "obj26.userData.points.push(new PMPoint(0.989848, 0.142132, 8.24551e-05));\n",
       "\n",
       "obj26.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj26.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj26.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj26.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj26.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj26.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj26);\n",
       "scene.add(obj26);\n",
       "\n",
       "var obj27 = new THREE.Object3D();\n",
       "obj27.name = \"unnamed__28\";\n",
       "obj27.userData.explodable = 1;\n",
       "obj27.userData.points = [];\n",
       "obj27.userData.points.push(new PMPoint(0.945946, 0.324324, 0.00233747));\n",
       "obj27.userData.points.push(new PMPoint(0.980198, 0.19802, 0.000196059));\n",
       "obj27.userData.points.push(new PMPoint(0.969231, 0.246154, 2.95858e-05));\n",
       "\n",
       "obj27.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj27.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj27.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj27.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj27.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj27.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj27);\n",
       "scene.add(obj27);\n",
       "\n",
       "var obj28 = new THREE.Object3D();\n",
       "obj28.name = \"unnamed__29\";\n",
       "obj28.userData.explodable = 1;\n",
       "obj28.userData.points = [];\n",
       "obj28.userData.points.push(new PMPoint(0.945946, 0.324324, 0.00233747));\n",
       "obj28.userData.points.push(new PMPoint(0.882353, 0.470588, 0.000692042));\n",
       "obj28.userData.points.push(new PMPoint(0.912195, 0.409756, 4.75907e-05));\n",
       "\n",
       "obj28.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj28.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj28.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj28.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj28.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj28.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj28);\n",
       "scene.add(obj28);\n",
       "\n",
       "var obj29 = new THREE.Object3D();\n",
       "obj29.name = \"unnamed__30\";\n",
       "obj29.userData.explodable = 1;\n",
       "obj29.userData.points = [];\n",
       "obj29.userData.points.push(new PMPoint(0.6, 0.8, 0.128));\n",
       "obj29.userData.points.push(new PMPoint(0.882353, 0.470588, 0.000692042));\n",
       "obj29.userData.points.push(new PMPoint(0.834862, 0.550459, 0.000168336));\n",
       "\n",
       "obj29.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj29.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj29.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj29.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj29.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj29.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj29);\n",
       "scene.add(obj29);\n",
       "\n",
       "var obj30 = new THREE.Object3D();\n",
       "obj30.name = \"unnamed__31\";\n",
       "obj30.userData.explodable = 1;\n",
       "obj30.userData.points = [];\n",
       "obj30.userData.points.push(new PMPoint(0.6, 0.8, 0.128));\n",
       "obj30.userData.points.push(new PMPoint(0.180328, 0.983607, 0.00053749));\n",
       "obj30.userData.points.push(new PMPoint(0.28, 0.96, 0.00032));\n",
       "\n",
       "obj30.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj30.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj30.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj30.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj30.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj30.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj30);\n",
       "scene.add(obj30);\n",
       "\n",
       "var obj31 = new THREE.Object3D();\n",
       "obj31.name = \"unnamed__32\";\n",
       "obj31.userData.explodable = 1;\n",
       "obj31.userData.points = [];\n",
       "obj31.userData.points.push(new PMPoint(0, 1, 0.003125));\n",
       "obj31.userData.points.push(new PMPoint(0.180328, 0.983607, 0.00053749));\n",
       "obj31.userData.points.push(new PMPoint(0.104972, 0.994475, 9.76771e-05));\n",
       "\n",
       "obj31.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj31.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj31.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj31.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj31.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj31.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj31);\n",
       "scene.add(obj31);\n",
       "\n",
       "var obj32 = new THREE.Object3D();\n",
       "obj32.name = \"unnamed__33\";\n",
       "obj32.userData.explodable = 1;\n",
       "obj32.userData.points = [];\n",
       "obj32.userData.points.push(new PMPoint(0, 1, 0.003125));\n",
       "obj32.userData.points.push(new PMPoint(-0.152941, 0.988235, 0.000276817));\n",
       "obj32.userData.points.push(new PMPoint(-0.0950226, 0.995475, 6.55187e-05));\n",
       "\n",
       "obj32.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj32.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj32.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj32.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj32.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj32.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj32);\n",
       "scene.add(obj32);\n",
       "\n",
       "var obj33 = new THREE.Object3D();\n",
       "obj33.name = \"unnamed__34\";\n",
       "obj33.userData.explodable = 1;\n",
       "obj33.userData.points = [];\n",
       "obj33.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.0189349));\n",
       "obj33.userData.points.push(new PMPoint(-0.152941, 0.988235, 0.000276817));\n",
       "obj33.userData.points.push(new PMPoint(-0.219512, 0.97561, 7.43605e-05));\n",
       "\n",
       "obj33.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj33.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj33.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj33.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj33.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj33.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj33);\n",
       "scene.add(obj33);\n",
       "\n",
       "var obj34 = new THREE.Object3D();\n",
       "obj34.name = \"unnamed__35\";\n",
       "obj34.userData.explodable = 1;\n",
       "obj34.userData.points = [];\n",
       "obj34.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.0189349));\n",
       "obj34.userData.points.push(new PMPoint(-0.6, 0.8, 0.0003125));\n",
       "obj34.userData.points.push(new PMPoint(-0.541401, 0.840764, 0.000129823));\n",
       "\n",
       "obj34.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj34.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj34.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj34.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj34.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj34.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj34);\n",
       "scene.add(obj34);\n",
       "\n",
       "var obj35 = new THREE.Object3D();\n",
       "obj35.name = \"unnamed__36\";\n",
       "obj35.userData.explodable = 1;\n",
       "obj35.userData.points = [];\n",
       "obj35.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00237812));\n",
       "obj35.userData.points.push(new PMPoint(-0.6, 0.8, 0.0003125));\n",
       "obj35.userData.points.push(new PMPoint(-0.64878, 0.760976, 7.61452e-05));\n",
       "\n",
       "obj35.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj35.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj35.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj35.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj35.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj35.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj35);\n",
       "scene.add(obj35);\n",
       "\n",
       "var obj36 = new THREE.Object3D();\n",
       "obj36.name = \"unnamed__37\";\n",
       "obj36.userData.explodable = 1;\n",
       "obj36.userData.points = [];\n",
       "obj36.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00237812));\n",
       "obj36.userData.points.push(new PMPoint(-0.849057, 0.528302, 0.0011392));\n",
       "obj36.userData.points.push(new PMPoint(-0.8, 0.6, 7.8125e-05));\n",
       "\n",
       "obj36.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj36.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj36.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj36.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj36.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj36.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj36);\n",
       "scene.add(obj36);\n",
       "\n",
       "var obj37 = new THREE.Object3D();\n",
       "obj37.name = \"unnamed__38\";\n",
       "obj37.userData.explodable = 1;\n",
       "obj37.userData.points = [];\n",
       "obj37.userData.points.push(new PMPoint(-1, 0, 0.2));\n",
       "obj37.userData.points.push(new PMPoint(-0.849057, 0.528302, 0.0011392));\n",
       "obj37.userData.points.push(new PMPoint(-0.905882, 0.423529, 0.000276817));\n",
       "\n",
       "obj37.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj37.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj37.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj37.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj37.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj37.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj37);\n",
       "scene.add(obj37);\n",
       "\n",
       "var obj38 = new THREE.Object3D();\n",
       "obj38.name = \"unnamed__39\";\n",
       "obj38.userData.explodable = 1;\n",
       "obj38.userData.points = [];\n",
       "obj38.userData.points.push(new PMPoint(-1, 0, 0.2));\n",
       "obj38.userData.points.push(new PMPoint(-0.849057, -0.528302, 0.0011392));\n",
       "obj38.userData.points.push(new PMPoint(-0.905882, -0.423529, 0.000276817));\n",
       "\n",
       "obj38.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj38.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj38.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj38.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj38.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj38.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj38);\n",
       "scene.add(obj38);\n",
       "\n",
       "var obj39 = new THREE.Object3D();\n",
       "obj39.name = \"unnamed__40\";\n",
       "obj39.userData.explodable = 1;\n",
       "obj39.userData.points = [];\n",
       "obj39.userData.points.push(new PMPoint(-0.724138, -0.689655, 0.00237812));\n",
       "obj39.userData.points.push(new PMPoint(-0.849057, -0.528302, 0.0011392));\n",
       "obj39.userData.points.push(new PMPoint(-0.8, -0.6, 7.8125e-05));\n",
       "\n",
       "obj39.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj39.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj39.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj39.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj39.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj39.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj39);\n",
       "scene.add(obj39);\n",
       "\n",
       "var obj40 = new THREE.Object3D();\n",
       "obj40.name = \"unnamed__41\";\n",
       "obj40.userData.explodable = 1;\n",
       "obj40.userData.points = [];\n",
       "obj40.userData.points.push(new PMPoint(-0.724138, -0.689655, 0.00237812));\n",
       "obj40.userData.points.push(new PMPoint(-0.6, -0.8, 0.0003125));\n",
       "obj40.userData.points.push(new PMPoint(-0.64878, -0.760976, 7.61452e-05));\n",
       "\n",
       "obj40.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj40.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj40.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj40.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj40.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj40.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj40);\n",
       "scene.add(obj40);\n",
       "\n",
       "var obj41 = new THREE.Object3D();\n",
       "obj41.name = \"unnamed__42\";\n",
       "obj41.userData.explodable = 1;\n",
       "obj41.userData.points = [];\n",
       "obj41.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.0189349));\n",
       "obj41.userData.points.push(new PMPoint(-0.6, -0.8, 0.0003125));\n",
       "obj41.userData.points.push(new PMPoint(-0.541401, -0.840764, 0.000129823));\n",
       "\n",
       "obj41.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj41.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj41.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj41.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj41.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj41.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj41);\n",
       "scene.add(obj41);\n",
       "\n",
       "var obj42 = new THREE.Object3D();\n",
       "obj42.name = \"unnamed__43\";\n",
       "obj42.userData.explodable = 1;\n",
       "obj42.userData.points = [];\n",
       "obj42.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.0189349));\n",
       "obj42.userData.points.push(new PMPoint(-0.152941, -0.988235, 0.000276817));\n",
       "obj42.userData.points.push(new PMPoint(-0.219512, -0.97561, 7.43605e-05));\n",
       "\n",
       "obj42.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj42.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj42.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj42.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj42.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj42.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj42);\n",
       "scene.add(obj42);\n",
       "\n",
       "var obj43 = new THREE.Object3D();\n",
       "obj43.name = \"unnamed__44\";\n",
       "obj43.userData.explodable = 1;\n",
       "obj43.userData.points = [];\n",
       "obj43.userData.points.push(new PMPoint(0, -1, 0.003125));\n",
       "obj43.userData.points.push(new PMPoint(-0.152941, -0.988235, 0.000276817));\n",
       "obj43.userData.points.push(new PMPoint(-0.0950226, -0.995475, 6.55187e-05));\n",
       "\n",
       "obj43.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj43.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj43.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj43.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj43.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj43.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj43);\n",
       "scene.add(obj43);\n",
       "\n",
       "var obj44 = new THREE.Object3D();\n",
       "obj44.name = \"unnamed__45\";\n",
       "obj44.userData.explodable = 1;\n",
       "obj44.userData.points = [];\n",
       "obj44.userData.points.push(new PMPoint(0, -1, 0.003125));\n",
       "obj44.userData.points.push(new PMPoint(0.180328, -0.983607, 0.00053749));\n",
       "obj44.userData.points.push(new PMPoint(0.104972, -0.994475, 9.76771e-05));\n",
       "\n",
       "obj44.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj44.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj44.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj44.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj44.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj44.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj44);\n",
       "scene.add(obj44);\n",
       "\n",
       "var obj45 = new THREE.Object3D();\n",
       "obj45.name = \"unnamed__46\";\n",
       "obj45.userData.explodable = 1;\n",
       "obj45.userData.points = [];\n",
       "obj45.userData.points.push(new PMPoint(0.6, -0.8, 0.128));\n",
       "obj45.userData.points.push(new PMPoint(0.180328, -0.983607, 0.00053749));\n",
       "obj45.userData.points.push(new PMPoint(0.28, -0.96, 0.00032));\n",
       "\n",
       "obj45.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj45.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj45.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj45.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj45.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj45.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj45);\n",
       "scene.add(obj45);\n",
       "\n",
       "var obj46 = new THREE.Object3D();\n",
       "obj46.name = \"unnamed__47\";\n",
       "obj46.userData.explodable = 1;\n",
       "obj46.userData.points = [];\n",
       "obj46.userData.points.push(new PMPoint(0.6, -0.8, 0.128));\n",
       "obj46.userData.points.push(new PMPoint(0.834862, -0.550459, 0.000168336));\n",
       "obj46.userData.points.push(new PMPoint(0.8, -0.6, 0.000125));\n",
       "\n",
       "obj46.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj46.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj46.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj46.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj46.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj46.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj46);\n",
       "scene.add(obj46);\n",
       "\n",
       "var obj47 = new THREE.Object3D();\n",
       "obj47.name = \"unnamed__48\";\n",
       "obj47.userData.explodable = 1;\n",
       "obj47.userData.points = [];\n",
       "obj47.userData.points.push(new PMPoint(0.882353, -0.470588, 0.000692042));\n",
       "obj47.userData.points.push(new PMPoint(0.834862, -0.550459, 0.000168336));\n",
       "obj47.userData.points.push(new PMPoint(0.856734, -0.515759, 2.62724e-05));\n",
       "\n",
       "obj47.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj47.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj47.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj47.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj47.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj47.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj47);\n",
       "scene.add(obj47);\n",
       "\n",
       "var obj48 = new THREE.Object3D();\n",
       "obj48.name = \"unnamed__49\";\n",
       "obj48.userData.explodable = 1;\n",
       "obj48.userData.points = [];\n",
       "obj48.userData.points.push(new PMPoint(0.882353, -0.470588, 0.000692042));\n",
       "obj48.userData.points.push(new PMPoint(0.912195, -0.409756, 4.75907e-05));\n",
       "obj48.userData.points.push(new PMPoint(0.901768, -0.43222, 1.23513e-05));\n",
       "\n",
       "obj48.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj48.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj48.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj48.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj48.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj48.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj48);\n",
       "scene.add(obj48);\n",
       "\n",
       "var obj49 = new THREE.Object3D();\n",
       "obj49.name = \"unnamed__50\";\n",
       "obj49.userData.explodable = 1;\n",
       "obj49.userData.points = [];\n",
       "obj49.userData.points.push(new PMPoint(0.945946, -0.324324, 0.00233747));\n",
       "obj49.userData.points.push(new PMPoint(0.912195, -0.409756, 4.75907e-05));\n",
       "obj49.userData.points.push(new PMPoint(0.923077, -0.384615, 1.1557e-05));\n",
       "\n",
       "obj49.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj49.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj49.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj49.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj49.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj49.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj49);\n",
       "scene.add(obj49);\n",
       "\n",
       "var obj50 = new THREE.Object3D();\n",
       "obj50.name = \"unnamed__51\";\n",
       "obj50.userData.explodable = 1;\n",
       "obj50.userData.points = [];\n",
       "obj50.userData.points.push(new PMPoint(0.945946, -0.324324, 0.00233747));\n",
       "obj50.userData.points.push(new PMPoint(0.969231, -0.246154, 2.95858e-05));\n",
       "obj50.userData.points.push(new PMPoint(0.963489, -0.267748, 1.31661e-05));\n",
       "\n",
       "obj50.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj50.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj50.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj50.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj50.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj50.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj50);\n",
       "scene.add(obj50);\n",
       "\n",
       "var obj51 = new THREE.Object3D();\n",
       "obj51.name = \"unnamed__52\";\n",
       "obj51.userData.explodable = 1;\n",
       "obj51.userData.points = [];\n",
       "obj51.userData.points.push(new PMPoint(0.980198, -0.19802, 0.000196059));\n",
       "obj51.userData.points.push(new PMPoint(0.969231, -0.246154, 2.95858e-05));\n",
       "obj51.userData.points.push(new PMPoint(0.973723, -0.227737, 0));\n",
       "\n",
       "obj51.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj51.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj51.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj51.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj51.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj51.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj51);\n",
       "scene.add(obj51);\n",
       "\n",
       "var obj52 = new THREE.Object3D();\n",
       "obj52.name = \"unnamed__53\";\n",
       "obj52.userData.explodable = 1;\n",
       "obj52.userData.points = [];\n",
       "obj52.userData.points.push(new PMPoint(0.980198, -0.19802, 0.000196059));\n",
       "obj52.userData.points.push(new PMPoint(0.989848, -0.142132, 8.24551e-05));\n",
       "obj52.userData.points.push(new PMPoint(0.986207, -0.165517, 0));\n",
       "\n",
       "obj52.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj52.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj52.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj52.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj52.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj52.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj52);\n",
       "scene.add(obj52);\n",
       "\n",
       "var obj53 = new THREE.Object3D();\n",
       "obj53.name = \"unnamed__54\";\n",
       "obj53.userData.explodable = 1;\n",
       "obj53.userData.points = [];\n",
       "obj53.userData.points.push(new PMPoint(1, 0, 0.0125));\n",
       "obj53.userData.points.push(new PMPoint(0.989848, -0.142132, 8.24551e-05));\n",
       "obj53.userData.points.push(new PMPoint(0.993846, -0.110769, 1.89349e-05));\n",
       "\n",
       "obj53.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj53.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj53.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj53.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj53.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj53.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj53);\n",
       "scene.add(obj53);\n",
       "\n",
       "var obj54 = new THREE.Object3D();\n",
       "obj54.name = \"unnamed__55\";\n",
       "obj54.userData.explodable = 1;\n",
       "obj54.userData.points = [];\n",
       "obj54.userData.points.push(new PMPoint(1, 0, 0.0125));\n",
       "obj54.userData.points.push(new PMPoint(0.989848, 0.142132, 8.24551e-05));\n",
       "obj54.userData.points.push(new PMPoint(0.993846, 0.110769, 1.89349e-05));\n",
       "\n",
       "obj54.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj54.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj54.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj54.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj54.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj54.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj54);\n",
       "scene.add(obj54);\n",
       "\n",
       "var obj55 = new THREE.Object3D();\n",
       "obj55.name = \"unnamed__56\";\n",
       "obj55.userData.explodable = 1;\n",
       "obj55.userData.points = [];\n",
       "obj55.userData.points.push(new PMPoint(0.980198, 0.19802, 0.000196059));\n",
       "obj55.userData.points.push(new PMPoint(0.989848, 0.142132, 8.24551e-05));\n",
       "obj55.userData.points.push(new PMPoint(0.986207, 0.165517, 0));\n",
       "\n",
       "obj55.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj55.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj55.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj55.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj55.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj55.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj55);\n",
       "scene.add(obj55);\n",
       "\n",
       "var obj56 = new THREE.Object3D();\n",
       "obj56.name = \"unnamed__57\";\n",
       "obj56.userData.explodable = 1;\n",
       "obj56.userData.points = [];\n",
       "obj56.userData.points.push(new PMPoint(0.980198, 0.19802, 0.000196059));\n",
       "obj56.userData.points.push(new PMPoint(0.969231, 0.246154, 2.95858e-05));\n",
       "obj56.userData.points.push(new PMPoint(0.973723, 0.227737, 0));\n",
       "\n",
       "obj56.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj56.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj56.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj56.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj56.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj56.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj56);\n",
       "scene.add(obj56);\n",
       "\n",
       "var obj57 = new THREE.Object3D();\n",
       "obj57.name = \"unnamed__58\";\n",
       "obj57.userData.explodable = 1;\n",
       "obj57.userData.points = [];\n",
       "obj57.userData.points.push(new PMPoint(0.945946, 0.324324, 0.00233747));\n",
       "obj57.userData.points.push(new PMPoint(0.969231, 0.246154, 2.95858e-05));\n",
       "obj57.userData.points.push(new PMPoint(0.963489, 0.267748, 1.31661e-05));\n",
       "\n",
       "obj57.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj57.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj57.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj57.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj57.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj57.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj57);\n",
       "scene.add(obj57);\n",
       "\n",
       "var obj58 = new THREE.Object3D();\n",
       "obj58.name = \"unnamed__59\";\n",
       "obj58.userData.explodable = 1;\n",
       "obj58.userData.points = [];\n",
       "obj58.userData.points.push(new PMPoint(0.945946, 0.324324, 0.00233747));\n",
       "obj58.userData.points.push(new PMPoint(0.912195, 0.409756, 4.75907e-05));\n",
       "obj58.userData.points.push(new PMPoint(0.923077, 0.384615, 1.1557e-05));\n",
       "\n",
       "obj58.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj58.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj58.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj58.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj58.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj58.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj58);\n",
       "scene.add(obj58);\n",
       "\n",
       "var obj59 = new THREE.Object3D();\n",
       "obj59.name = \"unnamed__60\";\n",
       "obj59.userData.explodable = 1;\n",
       "obj59.userData.points = [];\n",
       "obj59.userData.points.push(new PMPoint(0.882353, 0.470588, 0.000692042));\n",
       "obj59.userData.points.push(new PMPoint(0.912195, 0.409756, 4.75907e-05));\n",
       "obj59.userData.points.push(new PMPoint(0.901768, 0.43222, 1.23513e-05));\n",
       "\n",
       "obj59.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj59.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj59.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj59.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj59.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj59.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj59);\n",
       "scene.add(obj59);\n",
       "\n",
       "var obj60 = new THREE.Object3D();\n",
       "obj60.name = \"unnamed__61\";\n",
       "obj60.userData.explodable = 1;\n",
       "obj60.userData.points = [];\n",
       "obj60.userData.points.push(new PMPoint(0.882353, 0.470588, 0.000692042));\n",
       "obj60.userData.points.push(new PMPoint(0.834862, 0.550459, 0.000168336));\n",
       "obj60.userData.points.push(new PMPoint(0.856734, 0.515759, 2.62724e-05));\n",
       "\n",
       "obj60.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj60.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj60.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj60.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj60.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj60.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj60);\n",
       "scene.add(obj60);\n",
       "\n",
       "var obj61 = new THREE.Object3D();\n",
       "obj61.name = \"unnamed__62\";\n",
       "obj61.userData.explodable = 1;\n",
       "obj61.userData.points = [];\n",
       "obj61.userData.points.push(new PMPoint(0.6, 0.8, 0.128));\n",
       "obj61.userData.points.push(new PMPoint(0.834862, 0.550459, 0.000168336));\n",
       "obj61.userData.points.push(new PMPoint(0.8, 0.6, 0.000125));\n",
       "\n",
       "obj61.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj61.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj61.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj61.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj61.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj61.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj61);\n",
       "scene.add(obj61);\n",
       "\n",
       "var obj62 = new THREE.Object3D();\n",
       "obj62.name = \"unnamed__63\";\n",
       "obj62.userData.explodable = 1;\n",
       "obj62.userData.points = [];\n",
       "obj62.userData.points.push(new PMPoint(0.6, 0.8, 0.128));\n",
       "obj62.userData.points.push(new PMPoint(0.28, 0.96, 0.00032));\n",
       "obj62.userData.points.push(new PMPoint(0.342282, 0.939597, 0.000144138));\n",
       "\n",
       "obj62.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj62.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj62.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj62.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj62.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj62.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj62);\n",
       "scene.add(obj62);\n",
       "\n",
       "var obj63 = new THREE.Object3D();\n",
       "obj63.name = \"unnamed__64\";\n",
       "obj63.userData.explodable = 1;\n",
       "obj63.userData.points = [];\n",
       "obj63.userData.points.push(new PMPoint(0.180328, 0.983607, 0.00053749));\n",
       "obj63.userData.points.push(new PMPoint(0.28, 0.96, 0.00032));\n",
       "obj63.userData.points.push(new PMPoint(0.236593, 0.971609, 3.18443e-05));\n",
       "\n",
       "obj63.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj63.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj63.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj63.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj63.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj63.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj63);\n",
       "scene.add(obj63);\n",
       "\n",
       "var obj64 = new THREE.Object3D();\n",
       "obj64.name = \"unnamed__65\";\n",
       "obj64.userData.explodable = 1;\n",
       "obj64.userData.points = [];\n",
       "obj64.userData.points.push(new PMPoint(0.180328, 0.983607, 0.00053749));\n",
       "obj64.userData.points.push(new PMPoint(0.104972, 0.994475, 9.76771e-05));\n",
       "obj64.userData.points.push(new PMPoint(0.132743, 0.99115, 1.56629e-05));\n",
       "\n",
       "obj64.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj64.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj64.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj64.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj64.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj64.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj64);\n",
       "scene.add(obj64);\n",
       "\n",
       "var obj65 = new THREE.Object3D();\n",
       "obj65.name = \"unnamed__66\";\n",
       "obj65.userData.explodable = 1;\n",
       "obj65.userData.points = [];\n",
       "obj65.userData.points.push(new PMPoint(0, 1, 0.003125));\n",
       "obj65.userData.points.push(new PMPoint(0.104972, 0.994475, 9.76771e-05));\n",
       "obj65.userData.points.push(new PMPoint(0.0739726, 0.99726, 1.50122e-05));\n",
       "\n",
       "obj65.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj65.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj65.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj65.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj65.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj65.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj65);\n",
       "scene.add(obj65);\n",
       "\n",
       "var obj66 = new THREE.Object3D();\n",
       "obj66.name = \"unnamed__67\";\n",
       "obj66.userData.explodable = 1;\n",
       "obj66.userData.points = [];\n",
       "obj66.userData.points.push(new PMPoint(0, 1, 0.003125));\n",
       "obj66.userData.points.push(new PMPoint(-0.0950226, 0.995475, 6.55187e-05));\n",
       "obj66.userData.points.push(new PMPoint(-0.0688836, 0.997625, 1.12841e-05));\n",
       "\n",
       "obj66.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj66.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj66.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj66.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj66.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj66.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj66);\n",
       "scene.add(obj66);\n",
       "\n",
       "var obj67 = new THREE.Object3D();\n",
       "obj67.name = \"unnamed__68\";\n",
       "obj67.userData.explodable = 1;\n",
       "obj67.userData.points = [];\n",
       "obj67.userData.points.push(new PMPoint(-0.152941, 0.988235, 0.000276817));\n",
       "obj67.userData.points.push(new PMPoint(-0.0950226, 0.995475, 6.55187e-05));\n",
       "obj67.userData.points.push(new PMPoint(-0.117241, 0.993103, 0));\n",
       "\n",
       "obj67.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj67.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj67.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj67.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj67.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj67.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj67);\n",
       "scene.add(obj67);\n",
       "\n",
       "var obj68 = new THREE.Object3D();\n",
       "obj68.name = \"unnamed__69\";\n",
       "obj68.userData.explodable = 1;\n",
       "obj68.userData.points = [];\n",
       "obj68.userData.points.push(new PMPoint(-0.152941, 0.988235, 0.000276817));\n",
       "obj68.userData.points.push(new PMPoint(-0.219512, 0.97561, 7.43605e-05));\n",
       "obj68.userData.points.push(new PMPoint(-0.191753, 0.981443, 1.3604e-05));\n",
       "\n",
       "obj68.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj68.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj68.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj68.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj68.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj68.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj68);\n",
       "scene.add(obj68);\n",
       "\n",
       "var obj69 = new THREE.Object3D();\n",
       "obj69.name = \"unnamed__70\";\n",
       "obj69.userData.explodable = 1;\n",
       "obj69.userData.points = [];\n",
       "obj69.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.0189349));\n",
       "obj69.userData.points.push(new PMPoint(-0.219512, 0.97561, 7.43605e-05));\n",
       "obj69.userData.points.push(new PMPoint(-0.256506, 0.966543, 4.42227e-05));\n",
       "\n",
       "obj69.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj69.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj69.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj69.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj69.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj69.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj69);\n",
       "scene.add(obj69);\n",
       "\n",
       "var obj70 = new THREE.Object3D();\n",
       "obj70.name = \"unnamed__71\";\n",
       "obj70.userData.explodable = 1;\n",
       "obj70.userData.points = [];\n",
       "obj70.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.0189349));\n",
       "obj70.userData.points.push(new PMPoint(-0.541401, 0.840764, 0.000129823));\n",
       "obj70.userData.points.push(new PMPoint(-0.507692, 0.861538, 2.95858e-05));\n",
       "\n",
       "obj70.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj70.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj70.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj70.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj70.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj70.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj70);\n",
       "scene.add(obj70);\n",
       "\n",
       "var obj71 = new THREE.Object3D();\n",
       "obj71.name = \"unnamed__72\";\n",
       "obj71.userData.explodable = 1;\n",
       "obj71.userData.points = [];\n",
       "obj71.userData.points.push(new PMPoint(-0.6, 0.8, 0.0003125));\n",
       "obj71.userData.points.push(new PMPoint(-0.541401, 0.840764, 0.000129823));\n",
       "obj71.userData.points.push(new PMPoint(-0.566161, 0.824295, 1.50573e-05));\n",
       "\n",
       "obj71.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj71.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj71.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj71.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj71.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj71.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj71);\n",
       "scene.add(obj71);\n",
       "\n",
       "var obj72 = new THREE.Object3D();\n",
       "obj72.name = \"unnamed__73\";\n",
       "obj72.userData.explodable = 1;\n",
       "obj72.userData.points = [];\n",
       "obj72.userData.points.push(new PMPoint(-0.6, 0.8, 0.0003125));\n",
       "obj72.userData.points.push(new PMPoint(-0.64878, 0.760976, 7.61452e-05));\n",
       "obj72.userData.points.push(new PMPoint(-0.630314, 0.77634, 1.09334e-05));\n",
       "\n",
       "obj72.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj72.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj72.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj72.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj72.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj72.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj72);\n",
       "scene.add(obj72);\n",
       "\n",
       "var obj73 = new THREE.Object3D();\n",
       "obj73.name = \"unnamed__74\";\n",
       "obj73.userData.explodable = 1;\n",
       "obj73.userData.points = [];\n",
       "obj73.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00237812));\n",
       "obj73.userData.points.push(new PMPoint(-0.64878, 0.760976, 7.61452e-05));\n",
       "obj73.userData.points.push(new PMPoint(-0.670103, 0.742268, 2.12562e-05));\n",
       "\n",
       "obj73.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj73.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj73.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj73.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj73.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj73.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj73);\n",
       "scene.add(obj73);\n",
       "\n",
       "var obj74 = new THREE.Object3D();\n",
       "obj74.name = \"unnamed__75\";\n",
       "obj74.userData.explodable = 1;\n",
       "obj74.userData.points = [];\n",
       "obj74.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00237812));\n",
       "obj74.userData.points.push(new PMPoint(-0.8, 0.6, 7.8125e-05));\n",
       "obj74.userData.points.push(new PMPoint(-0.778462, 0.627692, 3.02959e-05));\n",
       "\n",
       "obj74.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj74.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj74.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj74.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj74.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj74.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj74);\n",
       "scene.add(obj74);\n",
       "\n",
       "var obj75 = new THREE.Object3D();\n",
       "obj75.name = \"unnamed__76\";\n",
       "obj75.userData.explodable = 1;\n",
       "obj75.userData.points = [];\n",
       "obj75.userData.points.push(new PMPoint(-0.849057, 0.528302, 0.0011392));\n",
       "obj75.userData.points.push(new PMPoint(-0.8, 0.6, 7.8125e-05));\n",
       "obj75.userData.points.push(new PMPoint(-0.81864, 0.574307, 2.03034e-05));\n",
       "\n",
       "obj75.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj75.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj75.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj75.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj75.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj75.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj75);\n",
       "scene.add(obj75);\n",
       "\n",
       "var obj76 = new THREE.Object3D();\n",
       "obj76.name = \"unnamed__77\";\n",
       "obj76.userData.explodable = 1;\n",
       "obj76.userData.points = [];\n",
       "obj76.userData.points.push(new PMPoint(-0.849057, 0.528302, 0.0011392));\n",
       "obj76.userData.points.push(new PMPoint(-0.905882, 0.423529, 0.000276817));\n",
       "obj76.userData.points.push(new PMPoint(-0.882353, 0.470588, 4.32526e-05));\n",
       "\n",
       "obj76.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj76.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj76.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj76.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj76.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj76.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj76);\n",
       "scene.add(obj76);\n",
       "\n",
       "var obj77 = new THREE.Object3D();\n",
       "obj77.name = \"unnamed__78\";\n",
       "obj77.userData.explodable = 1;\n",
       "obj77.userData.points = [];\n",
       "obj77.userData.points.push(new PMPoint(-1, 0, 0.2));\n",
       "obj77.userData.points.push(new PMPoint(-0.905882, 0.423529, 0.000276817));\n",
       "obj77.userData.points.push(new PMPoint(-0.936, 0.352, 0.000128));\n",
       "\n",
       "obj77.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj77.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj77.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj77.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj77.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj77.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj77);\n",
       "scene.add(obj77);\n",
       "\n",
       "var obj78 = new THREE.Object3D();\n",
       "obj78.name = \"unnamed__79\";\n",
       "obj78.userData.explodable = 1;\n",
       "obj78.userData.points = [];\n",
       "obj78.userData.points.push(new PMPoint(-1, 0, 0.2));\n",
       "obj78.userData.points.push(new PMPoint(-0.905882, -0.423529, 0.000276817));\n",
       "obj78.userData.points.push(new PMPoint(-0.936, -0.352, 0.000128));\n",
       "\n",
       "obj78.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj78.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj78.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj78.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj78.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj78.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj78);\n",
       "scene.add(obj78);\n",
       "\n",
       "var obj79 = new THREE.Object3D();\n",
       "obj79.name = \"unnamed__80\";\n",
       "obj79.userData.explodable = 1;\n",
       "obj79.userData.points = [];\n",
       "obj79.userData.points.push(new PMPoint(-0.849057, -0.528302, 0.0011392));\n",
       "obj79.userData.points.push(new PMPoint(-0.905882, -0.423529, 0.000276817));\n",
       "obj79.userData.points.push(new PMPoint(-0.882353, -0.470588, 4.32526e-05));\n",
       "\n",
       "obj79.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj79.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj79.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj79.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj79.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj79.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj79);\n",
       "scene.add(obj79);\n",
       "\n",
       "var obj80 = new THREE.Object3D();\n",
       "obj80.name = \"unnamed__81\";\n",
       "obj80.userData.explodable = 1;\n",
       "obj80.userData.points = [];\n",
       "obj80.userData.points.push(new PMPoint(-0.849057, -0.528302, 0.0011392));\n",
       "obj80.userData.points.push(new PMPoint(-0.8, -0.6, 7.8125e-05));\n",
       "obj80.userData.points.push(new PMPoint(-0.81864, -0.574307, 2.03034e-05));\n",
       "\n",
       "obj80.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj80.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj80.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj80.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj80.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj80.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj80);\n",
       "scene.add(obj80);\n",
       "\n",
       "var obj81 = new THREE.Object3D();\n",
       "obj81.name = \"unnamed__82\";\n",
       "obj81.userData.explodable = 1;\n",
       "obj81.userData.points = [];\n",
       "obj81.userData.points.push(new PMPoint(-0.724138, -0.689655, 0.00237812));\n",
       "obj81.userData.points.push(new PMPoint(-0.8, -0.6, 7.8125e-05));\n",
       "obj81.userData.points.push(new PMPoint(-0.778462, -0.627692, 3.02959e-05));\n",
       "\n",
       "obj81.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj81.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj81.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj81.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj81.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj81.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj81);\n",
       "scene.add(obj81);\n",
       "\n",
       "var obj82 = new THREE.Object3D();\n",
       "obj82.name = \"unnamed__83\";\n",
       "obj82.userData.explodable = 1;\n",
       "obj82.userData.points = [];\n",
       "obj82.userData.points.push(new PMPoint(-0.724138, -0.689655, 0.00237812));\n",
       "obj82.userData.points.push(new PMPoint(-0.64878, -0.760976, 7.61452e-05));\n",
       "obj82.userData.points.push(new PMPoint(-0.670103, -0.742268, 2.12562e-05));\n",
       "\n",
       "obj82.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj82.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj82.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj82.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj82.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj82.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj82);\n",
       "scene.add(obj82);\n",
       "\n",
       "var obj83 = new THREE.Object3D();\n",
       "obj83.name = \"unnamed__84\";\n",
       "obj83.userData.explodable = 1;\n",
       "obj83.userData.points = [];\n",
       "obj83.userData.points.push(new PMPoint(-0.6, -0.8, 0.0003125));\n",
       "obj83.userData.points.push(new PMPoint(-0.64878, -0.760976, 7.61452e-05));\n",
       "obj83.userData.points.push(new PMPoint(-0.630314, -0.77634, 1.09334e-05));\n",
       "\n",
       "obj83.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj83.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj83.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj83.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj83.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj83.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj83);\n",
       "scene.add(obj83);\n",
       "\n",
       "var obj84 = new THREE.Object3D();\n",
       "obj84.name = \"unnamed__85\";\n",
       "obj84.userData.explodable = 1;\n",
       "obj84.userData.points = [];\n",
       "obj84.userData.points.push(new PMPoint(-0.6, -0.8, 0.0003125));\n",
       "obj84.userData.points.push(new PMPoint(-0.541401, -0.840764, 0.000129823));\n",
       "obj84.userData.points.push(new PMPoint(-0.566161, -0.824295, 1.50573e-05));\n",
       "\n",
       "obj84.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj84.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj84.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj84.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj84.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj84.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj84);\n",
       "scene.add(obj84);\n",
       "\n",
       "var obj85 = new THREE.Object3D();\n",
       "obj85.name = \"unnamed__86\";\n",
       "obj85.userData.explodable = 1;\n",
       "obj85.userData.points = [];\n",
       "obj85.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.0189349));\n",
       "obj85.userData.points.push(new PMPoint(-0.541401, -0.840764, 0.000129823));\n",
       "obj85.userData.points.push(new PMPoint(-0.507692, -0.861538, 2.95858e-05));\n",
       "\n",
       "obj85.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj85.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj85.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj85.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj85.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj85.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj85);\n",
       "scene.add(obj85);\n",
       "\n",
       "var obj86 = new THREE.Object3D();\n",
       "obj86.name = \"unnamed__87\";\n",
       "obj86.userData.explodable = 1;\n",
       "obj86.userData.points = [];\n",
       "obj86.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.0189349));\n",
       "obj86.userData.points.push(new PMPoint(-0.219512, -0.97561, 7.43605e-05));\n",
       "obj86.userData.points.push(new PMPoint(-0.256506, -0.966543, 4.42227e-05));\n",
       "\n",
       "obj86.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj86.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj86.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj86.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj86.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj86.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj86);\n",
       "scene.add(obj86);\n",
       "\n",
       "var obj87 = new THREE.Object3D();\n",
       "obj87.name = \"unnamed__88\";\n",
       "obj87.userData.explodable = 1;\n",
       "obj87.userData.points = [];\n",
       "obj87.userData.points.push(new PMPoint(-0.152941, -0.988235, 0.000276817));\n",
       "obj87.userData.points.push(new PMPoint(-0.219512, -0.97561, 7.43605e-05));\n",
       "obj87.userData.points.push(new PMPoint(-0.191753, -0.981443, 1.3604e-05));\n",
       "\n",
       "obj87.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj87.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj87.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj87.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj87.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj87.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj87);\n",
       "scene.add(obj87);\n",
       "\n",
       "var obj88 = new THREE.Object3D();\n",
       "obj88.name = \"unnamed__89\";\n",
       "obj88.userData.explodable = 1;\n",
       "obj88.userData.points = [];\n",
       "obj88.userData.points.push(new PMPoint(-0.152941, -0.988235, 0.000276817));\n",
       "obj88.userData.points.push(new PMPoint(-0.0950226, -0.995475, 6.55187e-05));\n",
       "obj88.userData.points.push(new PMPoint(-0.117241, -0.993103, 0));\n",
       "\n",
       "obj88.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj88.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj88.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj88.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj88.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj88.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj88);\n",
       "scene.add(obj88);\n",
       "\n",
       "var obj89 = new THREE.Object3D();\n",
       "obj89.name = \"unnamed__90\";\n",
       "obj89.userData.explodable = 1;\n",
       "obj89.userData.points = [];\n",
       "obj89.userData.points.push(new PMPoint(0, -1, 0.003125));\n",
       "obj89.userData.points.push(new PMPoint(-0.0950226, -0.995475, 6.55187e-05));\n",
       "obj89.userData.points.push(new PMPoint(-0.0688836, -0.997625, 1.12841e-05));\n",
       "\n",
       "obj89.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj89.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj89.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj89.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj89.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj89.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj89);\n",
       "scene.add(obj89);\n",
       "\n",
       "var obj90 = new THREE.Object3D();\n",
       "obj90.name = \"unnamed__91\";\n",
       "obj90.userData.explodable = 1;\n",
       "obj90.userData.points = [];\n",
       "obj90.userData.points.push(new PMPoint(0, -1, 0.003125));\n",
       "obj90.userData.points.push(new PMPoint(0.104972, -0.994475, 9.76771e-05));\n",
       "obj90.userData.points.push(new PMPoint(0.0739726, -0.99726, 1.50122e-05));\n",
       "\n",
       "obj90.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj90.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj90.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj90.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj90.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj90.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj90);\n",
       "scene.add(obj90);\n",
       "\n",
       "var obj91 = new THREE.Object3D();\n",
       "obj91.name = \"unnamed__92\";\n",
       "obj91.userData.explodable = 1;\n",
       "obj91.userData.points = [];\n",
       "obj91.userData.points.push(new PMPoint(0.180328, -0.983607, 0.00053749));\n",
       "obj91.userData.points.push(new PMPoint(0.104972, -0.994475, 9.76771e-05));\n",
       "obj91.userData.points.push(new PMPoint(0.132743, -0.99115, 1.56629e-05));\n",
       "\n",
       "obj91.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj91.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj91.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj91.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj91.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj91.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj91);\n",
       "scene.add(obj91);\n",
       "\n",
       "var obj92 = new THREE.Object3D();\n",
       "obj92.name = \"unnamed__93\";\n",
       "obj92.userData.explodable = 1;\n",
       "obj92.userData.points = [];\n",
       "obj92.userData.points.push(new PMPoint(0.180328, -0.983607, 0.00053749));\n",
       "obj92.userData.points.push(new PMPoint(0.28, -0.96, 0.00032));\n",
       "obj92.userData.points.push(new PMPoint(0.236593, -0.971609, 3.18443e-05));\n",
       "\n",
       "obj92.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj92.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj92.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj92.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj92.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj92.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj92);\n",
       "scene.add(obj92);\n",
       "\n",
       "var obj93 = new THREE.Object3D();\n",
       "obj93.name = \"unnamed__94\";\n",
       "obj93.userData.explodable = 1;\n",
       "obj93.userData.points = [];\n",
       "obj93.userData.points.push(new PMPoint(0.6, -0.8, 0.128));\n",
       "obj93.userData.points.push(new PMPoint(0.28, -0.96, 0.00032));\n",
       "obj93.userData.points.push(new PMPoint(0.342282, -0.939597, 0.000144138));\n",
       "\n",
       "obj93.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj93.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj93.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj93.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj93.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj93.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj93);\n",
       "scene.add(obj93);\n",
       "\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "function textSpriteMaterial(message, parameters) {\n",
       "    if ( parameters === undefined ) parameters = {};\n",
       "    var fontface = \"Helvetica\";\n",
       "    var fontsize = parameters.hasOwnProperty(\"fontsize\") ? parameters[\"fontsize\"] : 15;\n",
       "    fontsize = fontsize*10;\n",
       "    var lines = message.split('\\\\n');\n",
       "    var size = 512;\n",
       "    for(var i = 0; i<lines.length; i++){\n",
       "        var tmp = lines[i].length;\n",
       "        while(tmp*fontsize > size){\n",
       "           fontsize--;\n",
       "        }\n",
       "    }\n",
       "    \n",
       "    var canvas = document.createElement('canvas');\n",
       "    canvas.width = size;\n",
       "    canvas.height = size;\n",
       "    var context = canvas.getContext('2d');\n",
       "    context.fillStyle = \"rgba(255, 255, 255, 0)\";\n",
       "    context.fill();\n",
       "    context.font = fontsize + \"px \" + fontface;\n",
       "    \n",
       "    // text color\n",
       "    context.fillStyle = \"rgba(0, 0, 0, 1.0)\";\n",
       "     for(var i = 0; i<lines.length; i++){\n",
       "        context.fillText(lines[i], size/2, size/2+i*fontsize);\n",
       "     }\n",
       "    \n",
       "    // canvas contents will be used for a texture\n",
       "    var texture = new THREE.Texture(canvas);\n",
       "    texture.needsUpdate = true;\n",
       "    \n",
       "    var spriteMaterial = new THREE.SpriteMaterial({map: texture, depthTest: true, depthWrite: false, polygonOffset: true, polygonOffsetFactor: -1, polygonOffsetUnits: 1 });\n",
       "    return spriteMaterial;\n",
       "}\n",
       "\n",
       "\n",
       "// ---------------------- INITIALIZING OBJECTS--------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "function init_object(obj) {\n",
       "    if (obj.userData.hasOwnProperty(\"pointmaterial\")) {\n",
       "        init_points(obj);\n",
       "        modelContains.points = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"pointlabels\")) {\n",
       "        init_pointlabels(obj);\n",
       "        modelContains.pointlabels = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"edgematerial\")) {\n",
       "        init_lines(obj);\n",
       "        modelContains.lines = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"edgelabels\")) {\n",
       "        init_edgelabels(obj);\n",
       "        modelContains.edgelabels = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"arrowstyle\")) {\n",
       "        init_arrowheads(obj);\n",
       "        modelContains.arrowheads = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"facetmaterial\")) {\n",
       "        init_faces(obj);\n",
       "        modelContains.faces = true;\n",
       "    }\n",
       "}\n",
       "\n",
       "function init_points(obj) {\n",
       "    var pointgroup = new THREE.Group();\n",
       "    pointgroup.name = \"points\";\n",
       "    var points = obj.userData.points;\n",
       "    var radii = obj.userData.pointradii;\n",
       "    var materials = obj.userData.pointmaterial;\n",
       "    var geometry,material;\n",
       "    if (!Array.isArray(radii)) {\n",
       "        geometry = new THREE.SphereBufferGeometry(radii);  \n",
       "    }\n",
       "    if (!Array.isArray(materials)) {\n",
       "        material = materials;\n",
       "    }\n",
       "    for (var i=0; i<points.length; i++) {\n",
       "        var point = points[i];\n",
       "        if (Array.isArray(radii)) {\n",
       "            if (radii[i] == 0) {\n",
       "                continue;\n",
       "            }\n",
       "            geometry = new THREE.SphereBufferGeometry(radii[i]);  \n",
       "        } \n",
       "        if (Array.isArray(materials)) {\n",
       "            material = materials[i];     \n",
       "        } \n",
       "        var sphere = new THREE.Mesh(geometry, material);\n",
       "        point.addSphere(sphere);\n",
       "        pointgroup.add(sphere);\n",
       "    }\n",
       "    obj.add(pointgroup);\n",
       "}\n",
       "\n",
       "function init_pointlabels(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var labels = obj.userData.pointlabels;\n",
       "    var pointlabels = new THREE.Group();\n",
       "    pointlabels.name = \"pointlabels\";\n",
       "    if (Array.isArray(labels)) {\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "            var spriteMaterial = textSpriteMaterial( labels[i] );\n",
       "\t        var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            point.addLabel(sprite);\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    } else {\n",
       "        var spriteMaterial = textSpriteMaterial( labels );\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "\t        var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            point.addLabel(sprite);\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    }\n",
       "    obj.add(pointlabels);\n",
       "}\n",
       "\n",
       "function init_lines(obj) {\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var points = obj.userData.points;\n",
       "    var materials = obj.userData.edgematerial;\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    var bufarr = new Float32Array( obj.userData.edgeindices.length * 3 );\n",
       "    var bufattr = new THREE.Float32BufferAttribute( bufarr, 3 );\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    geometry.setAttribute('position', bufattr);\n",
       "    if (Array.isArray(materials)) {     \n",
       "        for (var i=0; i<materials.length; i++) {\n",
       "            geometry.addGroup(2*i,2,i);\n",
       "        }\n",
       "    }\n",
       "    var lines = new THREE.LineSegments(geometry, materials);\n",
       "    lines.name = \"lines\";\n",
       "    obj.add(lines);\n",
       "    updateEdgesPosition(obj);\n",
       "}\n",
       "\n",
       "function init_edgelabels(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var labels = obj.userData.edgelabels;\n",
       "    var edgelabels = new THREE.Group();\n",
       "    edgelabels.name = \"edgelabels\";\n",
       "    if (Array.isArray(labels)) {\n",
       "        for (var i=0; i<edgeindices.length; i=i+2) {\n",
       "            var point = points[i];\n",
       "            var spriteMaterial = textSpriteMaterial( labels[i] );\n",
       "            var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[i]].vector,points[edgeindices[i+1]].vector).multiplyScalar(0.5));\n",
       "            edgelabels.add(sprite);\n",
       "        }\n",
       "    } else {\n",
       "        var spriteMaterial = textSpriteMaterial( labels );\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "            var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[i]].vector,points[edgeindices[i+1]].vector).multiplyScalar(0.5));\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    }\n",
       "    obj.add(edgelabels);\n",
       "}\n",
       "\n",
       "function init_arrowheads(obj) {\n",
       "    var arrowheads = new THREE.Group();\n",
       "    arrowheads.name = \"arrowheads\";\n",
       "    var arrowstyle = obj.userData.arrowstyle;\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var edgematerials = obj.userData.edgematerial;\n",
       "    var points = obj.userData.points;\n",
       "    var material;\n",
       "    if (!Array.isArray(edgematerials)) {\n",
       "        material = new THREE.MeshBasicMaterial( {color: edgematerials.color} );\n",
       "    }\n",
       "\n",
       "    for (var i=0; i<edgeindices.length; i=i+2) {\n",
       "        var start = points[edgeindices[i]];\n",
       "        var end = points[edgeindices[i+1]];\n",
       "        var dist = start.vector.distanceTo( end.vector ) - start.radius() - end.radius();\n",
       "        if (dist <= 0) {\n",
       "            continue;\n",
       "        }\n",
       "        var dir = new THREE.Vector3().subVectors(end.vector,start.vector);\n",
       "        dir.normalize();\n",
       "        var axis = new THREE.Vector3().set(dir.z,0,-dir.x);\n",
       "        axis.normalize();\n",
       "        var radians = Math.acos( dir.y );\n",
       "        var radius = dist/25;\n",
       "        var height = dist/5;\n",
       "        var geometry = new THREE.ConeBufferGeometry(radius,height);\n",
       "        var position = new THREE.Vector3().addVectors(start.vector,dir.clone().multiplyScalar(start.radius()+dist-height/2));\n",
       "        if (Array.isArray(edgematerials)) {\n",
       "            material = new THREE.MeshBasicMaterial( {color: edgematerials[i].color} );\n",
       "        }\n",
       "        var cone = new THREE.Mesh( geometry, material );\n",
       "        cone.quaternion.setFromAxisAngle(axis,radians);;\n",
       "        cone.position.copy(position);;\n",
       "        arrowheads.add(cone);\n",
       "    }\n",
       "    obj.add(arrowheads);\n",
       "}\n",
       "\n",
       "function init_faces(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var facets = obj.userData.facets;\n",
       "    obj.userData.triangleindices = [];\n",
       "    for (var i=0; i<facets.length; i++) {\n",
       "        facet = facets[i];\n",
       "        for (var t=0; t<facet.length-2; t++) {\n",
       "            obj.userData.triangleindices.push(facet[0],facet[t+1],facet[t+2]);  \n",
       "        }\n",
       "    }\n",
       "    var bufarr = new Float32Array( obj.userData.triangleindices.length * 3 );\n",
       "    var bufattr = new THREE.Float32BufferAttribute(bufarr,3);\n",
       "    \n",
       "    var materials = obj.userData.facetmaterial;\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    geometry.setAttribute('position',bufattr);\n",
       "    if (Array.isArray(materials)) {\n",
       "        var tricount = 0;\n",
       "        var facet;\n",
       "        for (var i=0; i<facets.length; i++) {\n",
       "            facet = facets[i];\n",
       "            geometry.addGroup(tricount,(facet.length-2)*3,i);\n",
       "            tricount += (facet.length-2)*3;\n",
       "        }\n",
       "    }\n",
       "    var mesh = new THREE.Mesh(geometry, materials);\n",
       "    mesh.name = \"faces\";\n",
       "    obj.add(mesh); \n",
       "    updateFacesPosition(obj);\n",
       "}\n",
       "// //INITIALIZING\n",
       "\n",
       "\n",
       "function updateFacesPosition(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var indices = obj.userData.triangleindices;\n",
       "    var faces = obj.getObjectByName(\"faces\");\n",
       "    var ba = faces.geometry.getAttribute(\"position\");\n",
       "    for (var i=0; i<indices.length; i++) {\n",
       "        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); \n",
       "    }\n",
       "    faces.geometry.attributes.position.needsUpdate = true;\n",
       "    \n",
       "}\n",
       "\n",
       "function updateEdgesPosition(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var indices = obj.userData.edgeindices;\n",
       "    var lines = obj.getObjectByName(\"lines\");\n",
       "    var ba = lines.geometry.getAttribute(\"position\"); \n",
       "    for (var i=0; i<indices.length; i++) {\n",
       "        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); \n",
       "    }\n",
       "    lines.geometry.attributes.position.needsUpdate = true;\n",
       "}\n",
       "\n",
       "function onWindowResize() {\n",
       "    renderer.setSize( three.clientWidth, three.clientHeight );\n",
       "    svgRenderer.setSize( three.clientWidth, three.clientHeight );\n",
       "    updateCamera();\n",
       "}\n",
       "\n",
       "function updateCamera() {\n",
       "    var width = three.clientWidth;\n",
       "    var height = three.clientHeight;\n",
       "    var aspect = width / height;\n",
       "    if (camera.type == \"OrthographicCamera\") {\n",
       "        camera.left = frustumSize * aspect / - 2;\n",
       "        camera.right = frustumSize * aspect / 2;\n",
       "        camera.top = frustumSize / 2;\n",
       "        camera.bottom = - frustumSize / 2;\n",
       "    } else if (camera.type == \"PerspectiveCamera\") {\n",
       "        camera.aspect = aspect;\n",
       "    }\n",
       "    camera.updateProjectionMatrix();\n",
       "}\n",
       "\n",
       "function changeCamera(event) {\n",
       "    var selindex = event.currentTarget.selectedIndex;\n",
       "    camera = cameras[selindex];\n",
       "    control = controls[selindex];\n",
       "    control.enabled = true; \n",
       "    for (var i=0; i<controls.length; i++) {\n",
       "        if (i!=selindex) {\n",
       "            controls[i].enabled = false;\n",
       "        }\n",
       "    }\n",
       "    updateCamera();\n",
       "}\n",
       "\n",
       "var camtypenode = document.getElementById('cameraType_6');\n",
       "camtypenode.onchange = changeCamera;\n",
       "camtypenode.dispatchEvent(new Event('change'));\n",
       "\n",
       "onWindowResize();\n",
       "window.addEventListener('resize', onWindowResize);\t\n",
       "\n",
       "\n",
       "var xRotationEnabled = false;\n",
       "var yRotationEnabled = false;\n",
       "var zRotationEnabled = false;\n",
       "var rotationSpeedFactor = 1;\n",
       "var settingsShown = false;\n",
       "var labelsShown = true;\n",
       "var intervals = [];\n",
       "var timeouts = [];\n",
       "var explodingSpeed = 0.05;\n",
       "var explodeScale = 0;\n",
       "var XMLS = new XMLSerializer();\n",
       "var svgElement;\n",
       "var renderId;\n",
       "\n",
       "var render = function () {\n",
       "\n",
       "\trenderId = requestAnimationFrame(render);\n",
       "\n",
       "//\tcomment in for automatic explosion\n",
       "//\texplode(updateFactor());\n",
       "\n",
       "    var phi = 0.02 * rotationSpeedFactor;\n",
       "\n",
       "    if (xRotationEnabled) {\n",
       "        scene.rotation.x += phi;\n",
       "    }\n",
       "    if (yRotationEnabled) {\n",
       "        scene.rotation.y += phi;\n",
       "    }\n",
       "    if (zRotationEnabled) {\n",
       "        scene.rotation.z += phi;\n",
       "    }\n",
       "\n",
       "    control.update();\n",
       "    renderer.render(scene, camera);\n",
       "};\n",
       "\n",
       "if ( THREE.WEBGL.isWebGLAvailable() ) {\n",
       "\trender();\n",
       "} else {\n",
       "\tvar warning = WEBGL.getWebGLErrorMessage();\n",
       "\tthree.appendChild( warning );\n",
       "}\n",
       "    \n",
       "function changeTransparency() {\n",
       "    var opacity = 1-Number(event.currentTarget.value);\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        child = scene.children[i];\n",
       "        if ( child.userData.hasOwnProperty(\"facetmaterial\") ) {\n",
       "            if (Array.isArray(child.userData.facetmaterial)) {\n",
       "                for (var j=0; j<child.userData.facetmaterial.length; j++) {\n",
       "                    child.userData.facetmaterial[j].opacity = opacity;\n",
       "                }\n",
       "            } else {\n",
       "                child.userData.facetmaterial.opacity = opacity;\n",
       "            }    \n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function changeRotationX(event){\n",
       "    xRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "function changeRotationY(event){\n",
       "    yRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "function changeRotationZ(event){\n",
       "    zRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "\n",
       "function changeRotationSpeedFactor(event){\n",
       "    rotationSpeedFactor = Number(event.currentTarget.value);\n",
       "}\n",
       "\n",
       "function resetScene(){\n",
       "    scene.rotation.set(0,0,0);\n",
       "    camera.position.set(0,0,5);\n",
       "    camera.up.set(0,1,0);\n",
       "}\n",
       "\n",
       "function showSettings(event){\n",
       "    document.getElementById('settings_6').style.visibility = 'visible';\n",
       "    document.getElementById('showSettingsButton_6').style.visibility = 'hidden';\n",
       "    document.getElementById('hideSettingsButton_6').style.visibility = 'visible';\n",
       "    settingsShown = true;\n",
       "}\n",
       "\n",
       "function hideSettings(event){\n",
       "    document.getElementById('settings_6').style.visibility = 'hidden';\n",
       "    document.getElementById('showSettingsButton_6').style.visibility = 'visible';\n",
       "    document.getElementById('hideSettingsButton_6').style.visibility = 'hidden';\n",
       "    settingsShown = false;\n",
       "}\n",
       "\n",
       "\n",
       "\n",
       "var pos = 150* Math.PI;\n",
       "\n",
       "function updateFactor() {\n",
       "    pos++;\n",
       "    return Math.sin(.01*pos)+1;\n",
       "}\n",
       "\n",
       "// ------------------------ FOLDING ------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "// rotate point p around axis defined by points p1 and p2 by given angle\n",
       "function rotate(p, p1, p2, angle ){   \n",
       "    angle = -angle;\n",
       "    var x = p.x, y = p.y, z = p.z, \n",
       "    a = p1.x, b = p1.y, c = p1.z, \n",
       "    u = p2.x-p1.x, v = p2.y-p1.y, w = p2.z-p1.z;\n",
       "    var result = [];\n",
       "    var L = u*u + v*v + w*w;\n",
       "    var sqrt = Math.sqrt;\n",
       "    var cos = Math.cos;\n",
       "    var sin = Math.sin;\n",
       "\n",
       "    result[0] = ((a*(v*v+w*w)-u*(b*v+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*x*cos(angle)+sqrt(L)*(-c*v+b*w-w*y+v*z)*sin(angle))/L;\n",
       "    result[1] = ((b*(u*u+w*w)-v*(a*u+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*y*cos(angle)+sqrt(L)*(c*u-a*w+w*x-u*z)*sin(angle))/L;\n",
       "    result[2] = ((c*(u*u+v*v)-w*(a*u+b*v-u*x-v*y-w*z))*(1-cos(angle))+L*z*cos(angle)+sqrt(L)*(-b*u+a*v-v*x+u*y)*sin(angle))/L;\n",
       "\n",
       "    return result;\n",
       "}\n",
       "\n",
       "var fold = function(event){\n",
       "    var obj = foldables[Number(event.currentTarget.name)];\n",
       "    var foldvalue = Number(event.currentTarget.value);\n",
       "    var scale = foldvalue - obj.userData.oldscale;\n",
       "\n",
       "    for (var j=0; j<obj.userData.axes.length; j++) {\n",
       "        rotateVertices(obj, j, scale);\n",
       "    }\n",
       "    update(obj);\n",
       "    obj.userData.oldscale += scale;\n",
       "    lookAtBarycenter(obj);\n",
       "}\n",
       "\n",
       "function lookAtBarycenter(obj){\n",
       "    control.target = barycenter(obj);\n",
       "}\n",
       "\n",
       "function barycenter(obj) {\n",
       "    var center = new THREE.Vector3(0,0,0);\n",
       "    var points = obj.userData.points;\n",
       "    for (var i=0; i<points.length; i++){\n",
       "        center.add(points[i].vector);\n",
       "    }\n",
       "    center.divideScalar(points.length);\n",
       "    return center;\n",
       "}\n",
       "\n",
       "function rotateVertices(obj, edge, scale) {\n",
       "    var axes = obj.userData.axes;\n",
       "    var subtrees = obj.userData.subtrees;\n",
       "    var points = obj.userData.points;\n",
       "    var angles = obj.userData.angles;\n",
       "    if (edge < axes.length){\n",
       "        for (var j=0; j<subtrees[edge].length; j++){\n",
       "            var rotP = rotate(points[subtrees[edge][j]].vector, points[axes[edge][0]].vector,points[axes[edge][1]].vector, scale * (Math.PI - angles[edge]));\n",
       "            points[subtrees[edge][j]].set(rotP[0],rotP[1],rotP[2]);\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function update(obj) {\n",
       "   updateFacesPosition(obj);\n",
       "   updateEdgesPosition(obj);\n",
       "}\n",
       "\n",
       "if (foldables.length) {\n",
       "    var settings = document.getElementById('settings_6');\n",
       "    var foldDiv = document.createElement('div');\n",
       "    foldDiv.id = 'fold_6';\n",
       "    var title = document.createElement('strong');\n",
       "    title.innerHTML = 'Fold';\n",
       "    foldDiv.appendChild(title);\n",
       "    foldDiv.className = 'group';\n",
       "    for (var i=0; i<foldables.length; i++) {\n",
       "        var range = document.createElement('input');\n",
       "        range.type = 'range';\n",
       "        range.min = 0;\n",
       "        range.max = 1;\n",
       "        range.value = 0;\n",
       "        range.step = 0.001;\n",
       "        range.name = String(i);\n",
       "        range.oninput = fold;\n",
       "        foldDiv.appendChild(range);\n",
       "    }\n",
       "    lookAtBarycenter(foldables[0]);\n",
       "    settings.insertBefore(foldDiv,settings.childNodes[0]);\n",
       "}\n",
       "\n",
       "    \n",
       "// ---------------------- EXPLOSION ------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "if (explodableModel) {\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        obj = scene.children[i];\n",
       "        if ( obj.userData.explodable ) {\n",
       "            computeCentroid(obj);\n",
       "        }\n",
       "    }\n",
       "    document.getElementById('explodeRange_6').oninput = triggerExplode;\n",
       "    document.getElementById('explodeCheckbox_6').onchange = triggerAutomaticExplode;\n",
       "    document.getElementById('explodingSpeedRange_6').oninput = setExplodingSpeed;\n",
       "}\n",
       "\n",
       "function computeCentroid(obj) {\n",
       "    centroid = new THREE.Vector3();\n",
       "    obj.userData.points.forEach(function(pmpoint) {\n",
       "        centroid.add(pmpoint.vector);\t\t\t\n",
       "    });\n",
       "    centroid.divideScalar(obj.userData.points.length);\n",
       "    obj.userData.centroid = centroid;\n",
       "}\n",
       "\n",
       "function explode(factor) {\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        var obj = scene.children[i];\n",
       "        if (obj.userData.hasOwnProperty(\"centroid\")) { \n",
       "            var c = obj.userData.centroid;\n",
       "            obj.position.set(c.x*factor, c.y*factor, c.z*factor);\n",
       "        }\n",
       "    }\t\n",
       "}\n",
       "\n",
       "function triggerExplode(event){\n",
       "    explodeScale = Number(event.currentTarget.value);\n",
       "    explode(explodeScale);\n",
       "}\n",
       "\n",
       "function setExplodingSpeed(event){\n",
       "    explodingSpeed = Number(event.currentTarget.value);\n",
       "}\n",
       "\n",
       "function triggerAutomaticExplode(event){\n",
       "    if (event.currentTarget.checked){\n",
       "        startExploding();\n",
       "    } else {\n",
       "        clearIntervals();\n",
       "    }\t\n",
       "}\n",
       "\n",
       "function startExploding(){\n",
       "    intervals.push(setInterval(explodingInterval, 25));\n",
       "}\n",
       "\n",
       "\n",
       "function explodingInterval(){\n",
       "    explodeScale += explodingSpeed;\n",
       "    if (explodeScale <= 6){ \n",
       "        explode(explodeScale);\n",
       "    }\n",
       "    else{\n",
       "        explode(6);\n",
       "        explodeScale = 6;\n",
       "        clearIntervals();\n",
       "        timeouts.push(setTimeout(startUnexploding, 3000));\n",
       "    }\n",
       "    document.getElementById('explodeRange_6').value = explodeScale;\n",
       "}\n",
       "\n",
       "\n",
       "function startUnexploding(){\n",
       "    intervals.push(setInterval(unexplodingInterval, 25));\n",
       "}\n",
       "\n",
       "function unexplodingInterval(){\n",
       "    explodeScale -= explodingSpeed;\n",
       "    if (explodeScale >= 0){\t\n",
       "        explode(explodeScale);\n",
       "    }\n",
       "    else {\n",
       "        explode(0);\n",
       "        explodeScale = 0;\n",
       "        clearIntervals();\n",
       "        timeouts.push(setTimeout(startExploding, 3000));\n",
       "    }\n",
       "    document.getElementById('explodeRange_6').value = explodeScale;\n",
       "}\n",
       "\n",
       "function clearIntervals(){\n",
       "    intervals.forEach(function(interval){\n",
       "        clearInterval(interval);\n",
       "    });\n",
       "    intervals = [];\n",
       "    timeouts.forEach(function(timeout){\n",
       "        clearTimeout(timeout);\n",
       "    });\n",
       "    timeouts = [];\n",
       "}\n",
       "\n",
       "// ---------------------- DISPLAY --------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "const objectTypeInnerHTMLs = { points: \"Points\", pointlabels: \"Point labels\", lines: \"Edges\", edgelabels: \"Edge labels\", faces: \"Faces\", arrowheads: \"Arrow heads\" };\n",
       "const objectTypeVisible = {};\n",
       "Object.assign(objectTypeVisible,modelContains);\n",
       "const sortedObjectTypeKeys = Object.keys(objectTypeInnerHTMLs).sort();\n",
       "const shownObjectTypesList = document.getElementById('shownObjectTypesList_6');\n",
       "\n",
       "function setVisibility(bool,objname) {\n",
       "    for (var i=0; i<scene.children.length; i++){\n",
       "        var obj = scene.children[i].getObjectByName(objname);\n",
       "        if (obj) {\n",
       "            obj.visible = bool;\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function toggleObjectTypeVisibility(event){\n",
       "    var name = event.currentTarget.name;\n",
       "    var checked = event.currentTarget.checked;\n",
       "    objectTypeVisible[name] = checked;\n",
       "    setVisibility(checked,name);\n",
       "}\n",
       "\n",
       "for (var i=0; i<sortedObjectTypeKeys.length; i++){\n",
       "    var key = sortedObjectTypeKeys[i];\n",
       "    if (modelContains[key]) {\n",
       "        var objTypeNode = document.createElement('span');\n",
       "        objTypeNode.innerHTML = objectTypeInnerHTMLs[key] + '<br>';\n",
       "        var checkbox = document.createElement('input');\n",
       "        checkbox.type = 'checkbox';\n",
       "        checkbox.checked = true;\n",
       "        checkbox.name = key;\n",
       "        checkbox.onchange = toggleObjectTypeVisibility;\n",
       "        shownObjectTypesList.appendChild(checkbox);\n",
       "        shownObjectTypesList.appendChild(objTypeNode);\n",
       "    }\n",
       "}\n",
       "\n",
       "// ------------------------------------------------------\n",
       "\n",
       "function toggleObjectVisibility(event){\n",
       "    var nr = Number(event.currentTarget.name);\n",
       "    scene.children[nr].visible = event.currentTarget.checked;\n",
       "}\n",
       "\n",
       "// append checkboxes for displaying or hiding objects\n",
       "var shownObjectsList = document.getElementById('shownObjectsList_6');\n",
       "for (var i=0; i<scene.children.length; i++){\n",
       "    obj = scene.children[i];\n",
       "    var objNode = document.createElement('span');\n",
       "    objNode.innerHTML = obj.name + '<br>';\n",
       "    var checkbox = document.createElement('input');\n",
       "    checkbox.type = 'checkbox';\n",
       "    checkbox.checked = true;\n",
       "    checkbox.name = String(i);\n",
       "    checkbox.onchange = toggleObjectVisibility;\n",
       "    shownObjectsList.appendChild(checkbox);\n",
       "    shownObjectsList.appendChild(objNode);\n",
       "}\n",
       "\n",
       "// ---------------------- SVG ------------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "function takeSvgScreenshot() {\n",
       "    if (objectTypeVisible[\"pointlabels\"]) {\n",
       "        setVisibility(false,\"pointlabels\");\n",
       "    }\n",
       "    if (objectTypeVisible[\"edgelabels\"]) {\n",
       "        setVisibility(false,\"edgelabels\");\n",
       "    }\n",
       "    svgRenderer.render(scene,camera);\n",
       "    svgElement = XMLS.serializeToString(svgRenderer.domElement);\n",
       "    \n",
       "    if (objectTypeVisible[\"pointlabels\"]) {\n",
       "        setVisibility(true,\"pointlabels\");\n",
       "    }\n",
       "    if (objectTypeVisible[\"edgelabels\"]) {\n",
       "        setVisibility(true,\"edgelabels\");\n",
       "    }\n",
       "\n",
       "    if (document.getElementById('tab_6').checked){\n",
       "        //show in new tab\n",
       "        var myWindow = window.open(\"\",\"\");\n",
       "        myWindow.document.body.innerHTML = svgElement;\n",
       "    } else{\n",
       "        // download svg file \n",
       "        download(\"screenshot.svg\", svgElement);\n",
       "    }\n",
       "}\n",
       "\n",
       "function download(filename, text) {\n",
       "    var element = document.createElement('a');\n",
       "    element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));\n",
       "    element.setAttribute('download', filename);\n",
       "\n",
       "    element.style.display = 'none';\n",
       "    document.body.appendChild(element);\n",
       "\n",
       "    element.click();\n",
       "\n",
       "    document.body.removeChild(element);\n",
       "}\n",
       "\n",
       "\n",
       "document.getElementById('transparencyRange_6').oninput = changeTransparency;\n",
       "document.getElementById('changeRotationX_6').onchange = changeRotationX;\n",
       "document.getElementById('changeRotationY_6').onchange = changeRotationY;\n",
       "document.getElementById('changeRotationZ_6').onchange = changeRotationZ;\n",
       "document.getElementById('resetButton_6').onclick = resetScene;\n",
       "document.getElementById('rotationSpeedRange_6').oninput = changeRotationSpeedFactor;\n",
       "document.getElementById('takeScreenshot_6').onclick = takeSvgScreenshot;\n",
       "document.getElementById('showSettingsButton_6').onclick = showSettings;\n",
       "document.getElementById('hideSettingsButton_6').onclick = hideSettings;\n",
       "\n",
       "\n",
       "// ------------------ SHORTCUTS --------------------------------------------\n",
       "// -------------------------------------------------------------------------\n",
       "\n",
       "/**\n",
       " * http://www.openjs.com/scripts/events/keyboard_shortcuts/\n",
       " * Version : 2.01.B\n",
       " * By Binny V A\n",
       " * License : BSD\n",
       " */\n",
       "shortcut = {\n",
       "\t'all_shortcuts':{},//All the shortcuts are stored in this array\n",
       "\t'add': function(shortcut_combination,callback,opt) {\n",
       "\t\t//Provide a set of default options\n",
       "\t\tvar default_options = {\n",
       "\t\t\t'type':'keydown',\n",
       "\t\t\t'propagate':false,\n",
       "\t\t\t'disable_in_input':false,\n",
       "\t\t\t'target':document,\n",
       "\t\t\t'keycode':false\n",
       "\t\t}\n",
       "\t\tif(!opt) opt = default_options;\n",
       "\t\telse {\n",
       "\t\t\tfor(var dfo in default_options) {\n",
       "\t\t\t\tif(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo];\n",
       "\t\t\t}\n",
       "\t\t}\n",
       "\n",
       "\t\tvar ele = opt.target;\n",
       "\t\tif(typeof opt.target == 'string') ele = document.getElementById(opt.target);\n",
       "\t\tvar ths = this;\n",
       "\t\tshortcut_combination = shortcut_combination.toLowerCase();\n",
       "\n",
       "\t\t//The function to be called at keypress\n",
       "\t\tvar func = function(e) {\n",
       "\t\t\te = e || window.event;\n",
       "\t\t\t\n",
       "\t\t\tif(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields\n",
       "\t\t\t\tvar element;\n",
       "\t\t\t\tif(e.target) element=e.target;\n",
       "\t\t\t\telse if(e.srcElement) element=e.srcElement;\n",
       "\t\t\t\tif(element.nodeType==3) element=element.parentNode;\n",
       "\n",
       "\t\t\t\tif(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return;\n",
       "\t\t\t}\n",
       "\t\n",
       "\t\t\t//Find Which key is pressed\n",
       "\t\t\tif (e.keyCode) code = e.keyCode;\n",
       "\t\t\telse if (e.which) code = e.which;\n",
       "\t\t\tvar character = String.fromCharCode(code).toLowerCase();\n",
       "\t\t\t\n",
       "\t\t\tif(code == 188) character=\",\"; //If the user presses , when the type is onkeydown\n",
       "\t\t\tif(code == 190) character=\".\"; //If the user presses , when the type is onkeydown\n",
       "\n",
       "\t\t\tvar keys = shortcut_combination.split(\"+\");\n",
       "\t\t\t//Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked\n",
       "\t\t\tvar kp = 0;\n",
       "\t\t\t\n",
       "\t\t\t//Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken\n",
       "\t\t\tvar shift_nums = {\n",
       "\t\t\t\t\"`\":\"~\",\n",
       "\t\t\t\t\"1\":\"!\",\n",
       "\t\t\t\t\"2\":\"@\",\n",
       "\t\t\t\t\"3\":\"#\",\n",
       "\t\t\t\t\"4\":\"$\",\n",
       "\t\t\t\t\"5\":\"%\",\n",
       "\t\t\t\t\"6\":\"^\",\n",
       "\t\t\t\t\"7\":\"&\",\n",
       "\t\t\t\t\"8\":\"*\",\n",
       "\t\t\t\t\"9\":\"(\",\n",
       "\t\t\t\t\"0\":\")\",\n",
       "\t\t\t\t\"-\":\"_\",\n",
       "\t\t\t\t\"=\":\"+\",\n",
       "\t\t\t\t\";\":\":\",\n",
       "\t\t\t\t\"'\":\"\\\"\",\n",
       "\t\t\t\t\",\":\"<\",\n",
       "\t\t\t\t\".\":\">\",\n",
       "\t\t\t\t\"/\":\"?\",\n",
       "\t\t\t\t\"\\\\\":\"|\"\n",
       "\t\t\t}\n",
       "\t\t\t//Special Keys - and their codes\n",
       "\t\t\tvar special_keys = {\n",
       "\t\t\t\t'esc':27,\n",
       "\t\t\t\t'escape':27,\n",
       "\t\t\t\t'tab':9,\n",
       "\t\t\t\t'space':32,\n",
       "\t\t\t\t'return':13,\n",
       "\t\t\t\t'enter':13,\n",
       "\t\t\t\t'backspace':8,\n",
       "\t\n",
       "\t\t\t\t'scrolllock':145,\n",
       "\t\t\t\t'scroll_lock':145,\n",
       "\t\t\t\t'scroll':145,\n",
       "\t\t\t\t'capslock':20,\n",
       "\t\t\t\t'caps_lock':20,\n",
       "\t\t\t\t'caps':20,\n",
       "\t\t\t\t'numlock':144,\n",
       "\t\t\t\t'num_lock':144,\n",
       "\t\t\t\t'num':144,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'pause':19,\n",
       "\t\t\t\t'break':19,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'insert':45,\n",
       "\t\t\t\t'home':36,\n",
       "\t\t\t\t'delete':46,\n",
       "\t\t\t\t'end':35,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'pageup':33,\n",
       "\t\t\t\t'page_up':33,\n",
       "\t\t\t\t'pu':33,\n",
       "\t\n",
       "\t\t\t\t'pagedown':34,\n",
       "\t\t\t\t'page_down':34,\n",
       "\t\t\t\t'pd':34,\n",
       "\t\n",
       "\t\t\t\t'left':37,\n",
       "\t\t\t\t'up':38,\n",
       "\t\t\t\t'right':39,\n",
       "\t\t\t\t'down':40,\n",
       "\t\n",
       "\t\t\t\t'f1':112,\n",
       "\t\t\t\t'f2':113,\n",
       "\t\t\t\t'f3':114,\n",
       "\t\t\t\t'f4':115,\n",
       "\t\t\t\t'f5':116,\n",
       "\t\t\t\t'f6':117,\n",
       "\t\t\t\t'f7':118,\n",
       "\t\t\t\t'f8':119,\n",
       "\t\t\t\t'f9':120,\n",
       "\t\t\t\t'f10':121,\n",
       "\t\t\t\t'f11':122,\n",
       "\t\t\t\t'f12':123\n",
       "\t\t\t}\n",
       "\t\n",
       "\t\t\tvar modifiers = { \n",
       "\t\t\t\tshift: { wanted:false, pressed:false},\n",
       "\t\t\t\tctrl : { wanted:false, pressed:false},\n",
       "\t\t\t\talt  : { wanted:false, pressed:false},\n",
       "\t\t\t\tmeta : { wanted:false, pressed:false}\t//Meta is Mac specific\n",
       "\t\t\t};\n",
       "                        \n",
       "\t\t\tif(e.ctrlKey)\tmodifiers.ctrl.pressed = true;\n",
       "\t\t\tif(e.shiftKey)\tmodifiers.shift.pressed = true;\n",
       "\t\t\tif(e.altKey)\tmodifiers.alt.pressed = true;\n",
       "\t\t\tif(e.metaKey)   modifiers.meta.pressed = true;\n",
       "                        \n",
       "\t\t\tfor(var i=0; k=keys[i],i<keys.length; i++) {\n",
       "\t\t\t\t//Modifiers\n",
       "\t\t\t\tif(k == 'ctrl' || k == 'control') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.ctrl.wanted = true;\n",
       "\n",
       "\t\t\t\t} else if(k == 'shift') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.shift.wanted = true;\n",
       "\n",
       "\t\t\t\t} else if(k == 'alt') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.alt.wanted = true;\n",
       "\t\t\t\t} else if(k == 'meta') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.meta.wanted = true;\n",
       "\t\t\t\t} else if(k.length > 1) { //If it is a special key\n",
       "\t\t\t\t\tif(special_keys[k] == code) kp++;\n",
       "\t\t\t\t\t\n",
       "\t\t\t\t} else if(opt['keycode']) {\n",
       "\t\t\t\t\tif(opt['keycode'] == code) kp++;\n",
       "\n",
       "\t\t\t\t} else { //The special keys did not match\n",
       "\t\t\t\t\tif(character == k) kp++;\n",
       "\t\t\t\t\telse {\n",
       "\t\t\t\t\t\tif(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase\n",
       "\t\t\t\t\t\t\tcharacter = shift_nums[character]; \n",
       "\t\t\t\t\t\t\tif(character == k) kp++;\n",
       "\t\t\t\t\t\t}\n",
       "\t\t\t\t\t}\n",
       "\t\t\t\t}\n",
       "\t\t\t}\n",
       "\t\t\t\n",
       "\t\t\tif(kp == keys.length && \n",
       "\t\t\t\t\t\tmodifiers.ctrl.pressed == modifiers.ctrl.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.shift.pressed == modifiers.shift.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.alt.pressed == modifiers.alt.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.meta.pressed == modifiers.meta.wanted) {\n",
       "\t\t\t\tcallback(e);\n",
       "\t\n",
       "\t\t\t\tif(!opt['propagate']) { //Stop the event\n",
       "\t\t\t\t\t//e.cancelBubble is supported by IE - this will kill the bubbling process.\n",
       "\t\t\t\t\te.cancelBubble = true;\n",
       "\t\t\t\t\te.returnValue = false;\n",
       "\t\n",
       "\t\t\t\t\t//e.stopPropagation works in Firefox.\n",
       "\t\t\t\t\tif (e.stopPropagation) {\n",
       "\t\t\t\t\t\te.stopPropagation();\n",
       "\t\t\t\t\t\te.preventDefault();\n",
       "\t\t\t\t\t}\n",
       "\t\t\t\t\treturn false;\n",
       "\t\t\t\t}\n",
       "\t\t\t}\n",
       "\t\t}\n",
       "\t\tthis.all_shortcuts[shortcut_combination] = {\n",
       "\t\t\t'callback':func, \n",
       "\t\t\t'target':ele, \n",
       "\t\t\t'event': opt['type']\n",
       "\t\t};\n",
       "\t\t//Attach the function with the event\n",
       "\t\tif(ele.addEventListener) ele.addEventListener(opt['type'], func, false);\n",
       "\t\telse if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func);\n",
       "\t\telse ele['on'+opt['type']] = func;\n",
       "\t},\n",
       "\n",
       "\t//Remove the shortcut - just specify the shortcut and I will remove the binding\n",
       "\t'remove':function(shortcut_combination) {\n",
       "\t\tshortcut_combination = shortcut_combination.toLowerCase();\n",
       "\t\tvar binding = this.all_shortcuts[shortcut_combination];\n",
       "\t\tdelete(this.all_shortcuts[shortcut_combination])\n",
       "\t\tif(!binding) return;\n",
       "\t\tvar type = binding['event'];\n",
       "\t\tvar ele = binding['target'];\n",
       "\t\tvar callback = binding['callback'];\n",
       "\n",
       "\t\tif(ele.detachEvent) ele.detachEvent('on'+type, callback);\n",
       "\t\telse if(ele.removeEventListener) ele.removeEventListener(type, callback, false);\n",
       "\t\telse ele['on'+type] = false;\n",
       "\t}\n",
       "}\n",
       "\n",
       "shortcut.add(\"Alt+Left\",function() {\n",
       "\tvar event = new Event('click');\n",
       "\tif (settingsShown){\n",
       "\t\tdocument.getElementById('hideSettingsButton_6').dispatchEvent(event);\n",
       "\t} else {\n",
       "\t\tdocument.getElementById('showSettingsButton_6').dispatchEvent(event);\n",
       "\t}\n",
       "});\n",
       "\n",
       "\n",
       "// COMMON_CODE_BLOCK_END\n",
       "\n",
       "});});\n",
       "      </script>\n",
       "   </body>\n",
       "</html>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "$d0 = $s->gkz_dome(0,5);\n",
    "$d0->VISUAL(FacetColor=>'80 180 255');"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<!--\n",
       "polymake for knusper\n",
       "Thu Aug 27 11:35:38 2020\n",
       "p_bounded\n",
       "-->\n",
       "\n",
       "\n",
       "<html>\n",
       "   <head>\n",
       "      <meta charset=utf-8>\n",
       "      <title>p_bounded</title>\n",
       "      <style>\n",
       "/*\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "*/\n",
       "         html {overflow: scroll;}\n",
       "         strong{font-size: 18px;}\n",
       "         canvas { z-index: 8; }\n",
       "         input[type='radio'] {margin-left:0;}\n",
       "         input[type='checkbox'] {margin-right:7px; margin-left: 0px; padding-left:0px;}\n",
       "         .group{padding-bottom: 15px;}\n",
       "         .settings * {z-index: 11; }\n",
       "         .settings{z-index: 10; font-family: Arial, Helvetica, sans-serif; margin-left: 30px; visibility: hidden; width: 14em; height: 96%; border: solid 1px silver; padding: 2px; overflow-y: scroll; box-sizing: border-box; background-color: white; position: absolute;}\n",
       "         .indented{margin-left: 20px; margin-top: 10px; padding-bottom: 0px;} \n",
       "         .shownObjectsList{overflow: auto; max-width: 150px; max-height: 150px;}\n",
       "         .showSettingsButton{visibility: visible; z-index: 12; position: absolute }\n",
       "         .hideSettingsButton{visibility: hidden; z-index: 12; position: absolute; opacity: 0.5}\n",
       "         button{margin-left: 0; margin-top: 10px}\n",
       "         img{cursor: pointer;}\n",
       "         .suboption{padding-top: 15px;}\n",
       "         #model76374271842 { width: 100%; height: 100%; }\n",
       "         .threejs_container { width: 100%; height: 75vh;}\n",
       "         .settings{max-height: 74vh} \n",
       "         input[type=range] {\n",
       "           -webkit-appearance: none;\n",
       "           padding:0; \n",
       "           width:90%; \n",
       "           margin-left: auto;\n",
       "           margin-right: auto;\n",
       "           margin-top: 15px;\n",
       "           margin-bottom: 15px;\n",
       "           display: block;\t\n",
       "         }\n",
       "         input[type=range]:focus {\n",
       "           outline: none;\n",
       "         }\n",
       "         input[type=range]::-webkit-slider-runnable-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "           background: #E3E3E3;\n",
       "           border-radius: 0px;\n",
       "           border: 0px solid #000000;\n",
       "         }\n",
       "         input[type=range]::-webkit-slider-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "           -webkit-appearance: none;\n",
       "           margin-top: -5px;\n",
       "         }\n",
       "         input[type=range]:focus::-webkit-slider-runnable-track {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "         input[type=range]::-moz-range-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "           background: #E3E3E3;\n",
       "           border-radius: 0px;\n",
       "           border: 0px solid #000000;\n",
       "         }\n",
       "         input[type=range]::-moz-range-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "         }\n",
       "         input[type=range]::-ms-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           background: transparent;\n",
       "           border-color: transparent;\n",
       "           color: transparent;\n",
       "         }\n",
       "         input[type=range]::-ms-fill-lower {\n",
       "           background: #E3E3E3;\n",
       "           border: 0px solid #000000;\n",
       "           border-radius: 0px;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "         }\n",
       "         input[type=range]::-ms-fill-upper {\n",
       "           background: #E3E3E3;\n",
       "           border: 0px solid #000000;\n",
       "           border-radius: 0px;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "         }\n",
       "         input[type=range]::-ms-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "         }\n",
       "         input[type=range]:focus::-ms-fill-lower {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "         input[type=range]:focus::-ms-fill-upper {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "/*\n",
       "// COMMON_CODE_BLOCK_END\n",
       "*/\n",
       "\t\t</style>\n",
       "   </head>\n",
       "<body>\n",
       "   <div class='threejs_container'>\n",
       "\t\t<div id='settings_7' class='settings'>\n",
       "\t\t\t<div class=group id='transparency_7' class='transparency'>\n",
       "\t\t\t\t<strong>Transparency</strong>\n",
       "\t\t\t\t<input id='transparencyRange_7' type='range' min=0 max=1 step=0.01 value=0>\n",
       "\t\t\t</div>\n",
       "\t\t\t\n",
       "\t\t\t<div class=group id='rotation_7'>\n",
       "\t\t\t\t<strong>Rotation</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationX_7'> x-axis</div>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationY_7'> y-axis</div>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationZ_7'> z-axis</div>\n",
       "\t\t\t\t\t<button id='resetButton_7'>Reset</button>\n",
       "\t\t\t\t</div>\n",
       "\n",
       "\t\t\t\t<div class=suboption>Rotation speed</div>\n",
       "\t\t\t\t<input id='rotationSpeedRange_7' type='range' min=0 max=5 step=0.01 value=2>\n",
       "\t\t\t</div>\n",
       "\n",
       "\n",
       "\t\t\t<div class=group id='display_7'>\n",
       "\t\t\t\t<strong>Display</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<div id='shownObjectTypesList_7' class='shownObjectsList'></div>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t\t<div class=suboption>Objects</div>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t   <div id='shownObjectsList_7' class='shownObjectsList'></div>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t</div>\n",
       "         \n",
       "         <div class=group id='camera_7'>\n",
       "            <strong>Camera</strong>\n",
       "            <div class=indented>\n",
       "               <form>\n",
       "                  <select id=\"cameraType_7\">\n",
       "                     <option value='perspective' selected> Perspective<br></option>\n",
       "                     <option value='orthographic' > Orthographic<br></option>\n",
       "                  </select>\n",
       "               </form>\n",
       "            </div>\n",
       "         </div>\n",
       "\n",
       "\t\t\t<div class=group id='svg_7'>\n",
       "\t\t\t\t<strong>SVG</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<form>\n",
       "\t\t\t\t\t\t<input type=\"radio\" name='screenshotMode' value='download' id='download_7' checked> Download<br>\n",
       "\t\t\t\t\t\t<input type=\"radio\" name='screenshotMode' value='tab' id='tab_7' > New tab<br>\n",
       "\t\t\t\t\t</form>\n",
       "\t\t\t\t\t<button id='takeScreenshot_7'>Screenshot</button>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t</div>\n",
       "\n",
       "\t\t</div>\t<!-- end of settings -->\n",
       "\t\t<img id='hideSettingsButton_7' class='hideSettingsButton' src='/kernelspecs/polymake/close.svg' width=20px\">\n",
       "\t\t<img id='showSettingsButton_7' class='showSettingsButton' src='/kernelspecs/polymake/menu.svg' width=20px\">\n",
       "<div id=\"model76374271842\"></div>\n",
       "</div>\n",
       "   <script>\n",
       "    requirejs.config({\n",
       "      paths: {\n",
       "        three: '/kernelspecs/polymake/three',\n",
       "        TrackballControls: '/kernelspecs/polymake/TrackballControls',\n",
       "        OrbitControls: '/kernelspecs/polymake/OrbitControls',\n",
       "        Projector: '/kernelspecs/polymake/Projector',\n",
       "        SVGRenderer: '/kernelspecs/polymake/SVGRenderer',\n",
       "        WEBGL: '/kernelspecs/polymake/WebGL',\n",
       "      },\n",
       "      shim: {\n",
       "        'three': { exports: 'THREE'},\n",
       "        'SVGRenderer': { deps: [ 'three' ], exports: 'THREE.SVGRenderer' },\n",
       "        'WEBGL': { deps: [ 'three' ], exports: 'THREE.WEBGL' },\n",
       "        'Projector': { deps: [ 'three' ], exports: 'THREE.Projector' },\n",
       "        'TrackballControls': { deps: [ 'three' ], exports: 'THREE.TrackballControls' },\n",
       "        'OrbitControls': { deps: [ 'three' ], exports: 'THREE.OrbitControls' },\n",
       "      }\n",
       "    });\n",
       "    \n",
       "    require(['three'],function(THREE){\n",
       "        window.THREE = THREE;\n",
       "      require(['TrackballControls', 'OrbitControls', 'Projector', 'SVGRenderer', 'WEBGL'],\n",
       "               function(TrackballControls, OrbitControls, Projector, SVGRenderer, WEBGL) {\n",
       "    THREE.TrackballControls = TrackballControls;\n",
       "    THREE.OrbitControls = OrbitControls;\n",
       "    THREE.Projector = Projector;\n",
       "    THREE.SVGRenderer = SVGRenderer;\n",
       "    THREE.WEBGL = WEBGL;\n",
       "\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "\n",
       "const intervalLength = 25; // for automatic animations\n",
       "const explodableModel = false; \n",
       "const modelContains = { points: false, pointlabels: false, lines: false, edgelabels: false, faces: false, arrowheads: false };\n",
       "const foldables = [];\n",
       "\n",
       "var three = document.getElementById(\"model76374271842\");\n",
       "var scene = new THREE.Scene();\n",
       "var renderer = new THREE.WebGLRenderer( { antialias: true } );\n",
       "var svgRenderer = new THREE.SVGRenderer( { antialias: true } );\n",
       "renderer.setPixelRatio( window.devicePixelRatio );\n",
       "renderer.setClearColor(0xFFFFFF, 1);\n",
       "svgRenderer.setClearColor(0xFFFFFF, 1);\n",
       "three.appendChild(renderer.domElement);\n",
       "\n",
       "var frustumSize = 4;\n",
       "var cameras = [new THREE.PerspectiveCamera(75, 1, 0.1, 1000), new THREE.OrthographicCamera()];\n",
       "cameras.forEach(function(cam) {\n",
       "    cam.position.set(0, 0, 5);\n",
       "    cam.lookAt(0, 0, 0);  \n",
       "    cam.up.set(0, 1, 0);         \n",
       "});\n",
       "var controls = [new THREE.TrackballControls(cameras[0], three), new THREE.OrbitControls(cameras[1], three)];\n",
       "var camera, control;\n",
       "\n",
       "controls[0].zoomSpeed = 0.2;\n",
       "controls[0].rotateSpeed = 4;\n",
       "\n",
       "\n",
       "// class to allow move points together with labels and spheres\n",
       "var PMPoint = function (x,y,z) {\n",
       "   this.vector = new THREE.Vector3(x,y,z);\n",
       "   this.sprite = null;\n",
       "   this.sphere = null;\n",
       "}\n",
       "PMPoint.prototype.addLabel = function(labelsprite) {\n",
       "   this.sprite = labelsprite;\n",
       "   this.sprite.position.copy(this.vector);\n",
       "}\n",
       "PMPoint.prototype.addSphere = function(spheremesh) {\n",
       "   this.sphere = spheremesh;\n",
       "   this.sphere.position.copy(this.vector);\n",
       "}\n",
       "PMPoint.prototype.set = function(x,y,z) {\n",
       "   this.vector.set(x,y,z);\n",
       "   if (this.sprite) {\n",
       "      this.sprite.position.copy(this.vector);\n",
       "   }\n",
       "   if (this.sphere) {\n",
       "      this.sphere.position.copy(this.vector);\n",
       "   }\n",
       "}\n",
       "PMPoint.prototype.radius = function() {\n",
       "   if (this.sphere) {\n",
       "      return this.sphere.geometry.parameters.radius;\n",
       "   } else {\n",
       "      return 0;\n",
       "   }\n",
       "};\n",
       "// select the target node\n",
       "var target = document.querySelector('#model76374271842');\n",
       "\n",
       "// create an observer instance\n",
       "var observer = new MutationObserver(function(mutations) {\n",
       "   mutations.forEach(function(mutation) {\n",
       "      if (mutation.removedNodes && mutation.removedNodes.length > 0) {\n",
       "         cancelAnimationFrame(renderId);\n",
       "         observer.disconnect();\n",
       "         console.log(\"cancelled frame \"+renderId);\n",
       "      }\n",
       "   });\n",
       "});\n",
       "\n",
       "// configuration of the observer:\n",
       "var config = { childList: true, characterData: true }\n",
       "\n",
       "// pass in the target node, as well as the observer options\n",
       "while (target) {\n",
       "   if (target.className==\"output\") {\n",
       "      observer.observe(target, config);\n",
       "      break;\n",
       "   }\n",
       "   target = target.parentNode;\n",
       "}\n",
       "\n",
       "// COMMON_CODE_BLOCK_END\n",
       "\n",
       "var obj0 = new THREE.Object3D();\n",
       "obj0.name = \"p_bounded\";\n",
       "obj0.userData.explodable = 1;\n",
       "obj0.userData.points = [];\n",
       "obj0.userData.points.push(new PMPoint(0.120339, 0.120455, 0.777622));\n",
       "obj0.userData.points.push(new PMPoint(0.150264, 0.150243, 0.760835));\n",
       "obj0.userData.points.push(new PMPoint(0.22754, -0.43769, 0.717368));\n",
       "obj0.userData.points.push(new PMPoint(0.22748, 0.0136946, 0.71748));\n",
       "obj0.userData.points.push(new PMPoint(0.120167, -0.43769, 0.777622));\n",
       "obj0.userData.points.push(new PMPoint(0.174312, 0.125425, 0.747335));\n",
       "obj0.userData.points.push(new PMPoint(0.390909, -0.43769, 0.411662));\n",
       "obj0.userData.points.push(new PMPoint(0.202302, 0.248431, 0.561138));\n",
       "obj0.userData.points.push(new PMPoint(0.0823926, 0.368335, 0.411682));\n",
       "obj0.userData.points.push(new PMPoint(0.225353, 0.225381, 0.574804));\n",
       "obj0.userData.points.push(new PMPoint(-0.437693, -0.43769, -0.0274964));\n",
       "obj0.userData.points.push(new PMPoint(-0.437693, 0.390909, -0.0274964));\n",
       "obj0.userData.points.push(new PMPoint(0.0823657, 0.368344, -0.0274964));\n",
       "obj0.userData.points.push(new PMPoint(0.0142733, 0.390909, -0.0274964));\n",
       "obj0.userData.points.push(new PMPoint(0.390909, -0.43769, -0.0274964));\n",
       "obj0.userData.points.push(new PMPoint(0.248336, 0.202397, 0.56121));\n",
       "obj0.userData.points.push(new PMPoint(-0.437693, -0.43769, 0.777622));\n",
       "obj0.userData.points.push(new PMPoint(-0.437693, 0.390909, 0.411662));\n",
       "obj0.userData.points.push(new PMPoint(0.0142733, 0.390909, 0.411662));\n",
       "obj0.userData.points.push(new PMPoint(0.0144763, 0.390842, 0.411788));\n",
       "obj0.userData.points.push(new PMPoint(0.12563, 0.174143, 0.747357));\n",
       "obj0.userData.points.push(new PMPoint(0.150263, 0.150246, 0.760833));\n",
       "obj0.userData.points.push(new PMPoint(-0.437693, 0.120281, 0.777622));\n",
       "obj0.userData.points.push(new PMPoint(0.013813, 0.227381, 0.717324));\n",
       "obj0.userData.points.push(new PMPoint(-0.437693, 0.227442, 0.71721));\n",
       "obj0.userData.points.push(new PMPoint(0.368344, 0.0823657, -0.0274964));\n",
       "obj0.userData.points.push(new PMPoint(0.390909, 0.0142733, -0.0274964));\n",
       "obj0.userData.points.push(new PMPoint(0.368335, 0.0823926, 0.411662));\n",
       "obj0.userData.points.push(new PMPoint(0.390909, 0.0142733, 0.411662));\n",
       "obj0.userData.points.push(new PMPoint(0.390814, 0.0145615, 0.411841));\n",
       "\n",
       "obj0.userData.pointradii = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.02];\n",
       "   <!-- Vertex style -->\n",
       "obj0.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj0.userData.pointlabels = [\" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \", \" \"];\n",
       "obj0.userData.edgeindices = [0, 1, 2, 3, 0, 4, 2, 4, 1, 5, 3, 5, 2, 6, 7, 8, 7, 9, 10, 11, 8, 12, 11, 13, 12, 13, 6, 14, 10, 14, 5, 15, 9, 15, 4, 16, 10, 16, 11, 17, 13, 18, 17, 18, 8, 19, 18, 19, 7, 20, 1, 21, 9, 21, 20, 21, 0, 22, 16, 22, 19, 23, 20, 23, 17, 24, 22, 24, 23, 24, 12, 25, 14, 26, 25, 26, 15, 27, 25, 27, 6, 28, 26, 28, 3, 29, 27, 29, 28, 29];\n",
       "   <!-- Edge style -->\n",
       "obj0.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj0.userData.facets = [[21, 20, 23, 24, 22, 0, 1], [7, 20, 21, 9], [1, 0, 4, 2, 3, 5], [21, 1, 5, 15, 9], [8, 7, 9, 15, 27, 25, 12], [5, 3, 29, 27, 15], [0, 22, 16, 4], [23, 20, 7, 8, 19], [3, 2, 6, 28, 29], [24, 23, 19, 18, 17], [25, 27, 29, 28, 26], [19, 8, 12, 13, 18], [14, 26, 28, 6], [17, 18, 13, 11], [22, 24, 17, 11, 10, 16], [16, 10, 14, 6, 2, 4], [10, 11, 13, 12, 25, 26, 14]];\n",
       "   <!-- Facet style -->\n",
       "obj0.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj0);\n",
       "scene.add(obj0);\n",
       "\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "function textSpriteMaterial(message, parameters) {\n",
       "    if ( parameters === undefined ) parameters = {};\n",
       "    var fontface = \"Helvetica\";\n",
       "    var fontsize = parameters.hasOwnProperty(\"fontsize\") ? parameters[\"fontsize\"] : 15;\n",
       "    fontsize = fontsize*10;\n",
       "    var lines = message.split('\\\\n');\n",
       "    var size = 512;\n",
       "    for(var i = 0; i<lines.length; i++){\n",
       "        var tmp = lines[i].length;\n",
       "        while(tmp*fontsize > size){\n",
       "           fontsize--;\n",
       "        }\n",
       "    }\n",
       "    \n",
       "    var canvas = document.createElement('canvas');\n",
       "    canvas.width = size;\n",
       "    canvas.height = size;\n",
       "    var context = canvas.getContext('2d');\n",
       "    context.fillStyle = \"rgba(255, 255, 255, 0)\";\n",
       "    context.fill();\n",
       "    context.font = fontsize + \"px \" + fontface;\n",
       "    \n",
       "    // text color\n",
       "    context.fillStyle = \"rgba(0, 0, 0, 1.0)\";\n",
       "     for(var i = 0; i<lines.length; i++){\n",
       "        context.fillText(lines[i], size/2, size/2+i*fontsize);\n",
       "     }\n",
       "    \n",
       "    // canvas contents will be used for a texture\n",
       "    var texture = new THREE.Texture(canvas);\n",
       "    texture.needsUpdate = true;\n",
       "    \n",
       "    var spriteMaterial = new THREE.SpriteMaterial({map: texture, depthTest: true, depthWrite: false, polygonOffset: true, polygonOffsetFactor: -1, polygonOffsetUnits: 1 });\n",
       "    return spriteMaterial;\n",
       "}\n",
       "\n",
       "\n",
       "// ---------------------- INITIALIZING OBJECTS--------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "function init_object(obj) {\n",
       "    if (obj.userData.hasOwnProperty(\"pointmaterial\")) {\n",
       "        init_points(obj);\n",
       "        modelContains.points = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"pointlabels\")) {\n",
       "        init_pointlabels(obj);\n",
       "        modelContains.pointlabels = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"edgematerial\")) {\n",
       "        init_lines(obj);\n",
       "        modelContains.lines = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"edgelabels\")) {\n",
       "        init_edgelabels(obj);\n",
       "        modelContains.edgelabels = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"arrowstyle\")) {\n",
       "        init_arrowheads(obj);\n",
       "        modelContains.arrowheads = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"facetmaterial\")) {\n",
       "        init_faces(obj);\n",
       "        modelContains.faces = true;\n",
       "    }\n",
       "}\n",
       "\n",
       "function init_points(obj) {\n",
       "    var pointgroup = new THREE.Group();\n",
       "    pointgroup.name = \"points\";\n",
       "    var points = obj.userData.points;\n",
       "    var radii = obj.userData.pointradii;\n",
       "    var materials = obj.userData.pointmaterial;\n",
       "    var geometry,material;\n",
       "    if (!Array.isArray(radii)) {\n",
       "        geometry = new THREE.SphereBufferGeometry(radii);  \n",
       "    }\n",
       "    if (!Array.isArray(materials)) {\n",
       "        material = materials;\n",
       "    }\n",
       "    for (var i=0; i<points.length; i++) {\n",
       "        var point = points[i];\n",
       "        if (Array.isArray(radii)) {\n",
       "            if (radii[i] == 0) {\n",
       "                continue;\n",
       "            }\n",
       "            geometry = new THREE.SphereBufferGeometry(radii[i]);  \n",
       "        } \n",
       "        if (Array.isArray(materials)) {\n",
       "            material = materials[i];     \n",
       "        } \n",
       "        var sphere = new THREE.Mesh(geometry, material);\n",
       "        point.addSphere(sphere);\n",
       "        pointgroup.add(sphere);\n",
       "    }\n",
       "    obj.add(pointgroup);\n",
       "}\n",
       "\n",
       "function init_pointlabels(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var labels = obj.userData.pointlabels;\n",
       "    var pointlabels = new THREE.Group();\n",
       "    pointlabels.name = \"pointlabels\";\n",
       "    if (Array.isArray(labels)) {\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "            var spriteMaterial = textSpriteMaterial( labels[i] );\n",
       "\t        var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            point.addLabel(sprite);\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    } else {\n",
       "        var spriteMaterial = textSpriteMaterial( labels );\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "\t        var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            point.addLabel(sprite);\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    }\n",
       "    obj.add(pointlabels);\n",
       "}\n",
       "\n",
       "function init_lines(obj) {\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var points = obj.userData.points;\n",
       "    var materials = obj.userData.edgematerial;\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    var bufarr = new Float32Array( obj.userData.edgeindices.length * 3 );\n",
       "    var bufattr = new THREE.Float32BufferAttribute( bufarr, 3 );\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    geometry.setAttribute('position', bufattr);\n",
       "    if (Array.isArray(materials)) {     \n",
       "        for (var i=0; i<materials.length; i++) {\n",
       "            geometry.addGroup(2*i,2,i);\n",
       "        }\n",
       "    }\n",
       "    var lines = new THREE.LineSegments(geometry, materials);\n",
       "    lines.name = \"lines\";\n",
       "    obj.add(lines);\n",
       "    updateEdgesPosition(obj);\n",
       "}\n",
       "\n",
       "function init_edgelabels(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var labels = obj.userData.edgelabels;\n",
       "    var edgelabels = new THREE.Group();\n",
       "    edgelabels.name = \"edgelabels\";\n",
       "    if (Array.isArray(labels)) {\n",
       "        for (var i=0; i<edgeindices.length; i=i+2) {\n",
       "            var point = points[i];\n",
       "            var spriteMaterial = textSpriteMaterial( labels[i] );\n",
       "            var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[i]].vector,points[edgeindices[i+1]].vector).multiplyScalar(0.5));\n",
       "            edgelabels.add(sprite);\n",
       "        }\n",
       "    } else {\n",
       "        var spriteMaterial = textSpriteMaterial( labels );\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "            var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[i]].vector,points[edgeindices[i+1]].vector).multiplyScalar(0.5));\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    }\n",
       "    obj.add(edgelabels);\n",
       "}\n",
       "\n",
       "function init_arrowheads(obj) {\n",
       "    var arrowheads = new THREE.Group();\n",
       "    arrowheads.name = \"arrowheads\";\n",
       "    var arrowstyle = obj.userData.arrowstyle;\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var edgematerials = obj.userData.edgematerial;\n",
       "    var points = obj.userData.points;\n",
       "    var material;\n",
       "    if (!Array.isArray(edgematerials)) {\n",
       "        material = new THREE.MeshBasicMaterial( {color: edgematerials.color} );\n",
       "    }\n",
       "\n",
       "    for (var i=0; i<edgeindices.length; i=i+2) {\n",
       "        var start = points[edgeindices[i]];\n",
       "        var end = points[edgeindices[i+1]];\n",
       "        var dist = start.vector.distanceTo( end.vector ) - start.radius() - end.radius();\n",
       "        if (dist <= 0) {\n",
       "            continue;\n",
       "        }\n",
       "        var dir = new THREE.Vector3().subVectors(end.vector,start.vector);\n",
       "        dir.normalize();\n",
       "        var axis = new THREE.Vector3().set(dir.z,0,-dir.x);\n",
       "        axis.normalize();\n",
       "        var radians = Math.acos( dir.y );\n",
       "        var radius = dist/25;\n",
       "        var height = dist/5;\n",
       "        var geometry = new THREE.ConeBufferGeometry(radius,height);\n",
       "        var position = new THREE.Vector3().addVectors(start.vector,dir.clone().multiplyScalar(start.radius()+dist-height/2));\n",
       "        if (Array.isArray(edgematerials)) {\n",
       "            material = new THREE.MeshBasicMaterial( {color: edgematerials[i].color} );\n",
       "        }\n",
       "        var cone = new THREE.Mesh( geometry, material );\n",
       "        cone.quaternion.setFromAxisAngle(axis,radians);;\n",
       "        cone.position.copy(position);;\n",
       "        arrowheads.add(cone);\n",
       "    }\n",
       "    obj.add(arrowheads);\n",
       "}\n",
       "\n",
       "function init_faces(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var facets = obj.userData.facets;\n",
       "    obj.userData.triangleindices = [];\n",
       "    for (var i=0; i<facets.length; i++) {\n",
       "        facet = facets[i];\n",
       "        for (var t=0; t<facet.length-2; t++) {\n",
       "            obj.userData.triangleindices.push(facet[0],facet[t+1],facet[t+2]);  \n",
       "        }\n",
       "    }\n",
       "    var bufarr = new Float32Array( obj.userData.triangleindices.length * 3 );\n",
       "    var bufattr = new THREE.Float32BufferAttribute(bufarr,3);\n",
       "    \n",
       "    var materials = obj.userData.facetmaterial;\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    geometry.setAttribute('position',bufattr);\n",
       "    if (Array.isArray(materials)) {\n",
       "        var tricount = 0;\n",
       "        var facet;\n",
       "        for (var i=0; i<facets.length; i++) {\n",
       "            facet = facets[i];\n",
       "            geometry.addGroup(tricount,(facet.length-2)*3,i);\n",
       "            tricount += (facet.length-2)*3;\n",
       "        }\n",
       "    }\n",
       "    var mesh = new THREE.Mesh(geometry, materials);\n",
       "    mesh.name = \"faces\";\n",
       "    obj.add(mesh); \n",
       "    updateFacesPosition(obj);\n",
       "}\n",
       "// //INITIALIZING\n",
       "\n",
       "\n",
       "function updateFacesPosition(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var indices = obj.userData.triangleindices;\n",
       "    var faces = obj.getObjectByName(\"faces\");\n",
       "    var ba = faces.geometry.getAttribute(\"position\");\n",
       "    for (var i=0; i<indices.length; i++) {\n",
       "        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); \n",
       "    }\n",
       "    faces.geometry.attributes.position.needsUpdate = true;\n",
       "    \n",
       "}\n",
       "\n",
       "function updateEdgesPosition(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var indices = obj.userData.edgeindices;\n",
       "    var lines = obj.getObjectByName(\"lines\");\n",
       "    var ba = lines.geometry.getAttribute(\"position\"); \n",
       "    for (var i=0; i<indices.length; i++) {\n",
       "        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); \n",
       "    }\n",
       "    lines.geometry.attributes.position.needsUpdate = true;\n",
       "}\n",
       "\n",
       "function onWindowResize() {\n",
       "    renderer.setSize( three.clientWidth, three.clientHeight );\n",
       "    svgRenderer.setSize( three.clientWidth, three.clientHeight );\n",
       "    updateCamera();\n",
       "}\n",
       "\n",
       "function updateCamera() {\n",
       "    var width = three.clientWidth;\n",
       "    var height = three.clientHeight;\n",
       "    var aspect = width / height;\n",
       "    if (camera.type == \"OrthographicCamera\") {\n",
       "        camera.left = frustumSize * aspect / - 2;\n",
       "        camera.right = frustumSize * aspect / 2;\n",
       "        camera.top = frustumSize / 2;\n",
       "        camera.bottom = - frustumSize / 2;\n",
       "    } else if (camera.type == \"PerspectiveCamera\") {\n",
       "        camera.aspect = aspect;\n",
       "    }\n",
       "    camera.updateProjectionMatrix();\n",
       "}\n",
       "\n",
       "function changeCamera(event) {\n",
       "    var selindex = event.currentTarget.selectedIndex;\n",
       "    camera = cameras[selindex];\n",
       "    control = controls[selindex];\n",
       "    control.enabled = true; \n",
       "    for (var i=0; i<controls.length; i++) {\n",
       "        if (i!=selindex) {\n",
       "            controls[i].enabled = false;\n",
       "        }\n",
       "    }\n",
       "    updateCamera();\n",
       "}\n",
       "\n",
       "var camtypenode = document.getElementById('cameraType_7');\n",
       "camtypenode.onchange = changeCamera;\n",
       "camtypenode.dispatchEvent(new Event('change'));\n",
       "\n",
       "onWindowResize();\n",
       "window.addEventListener('resize', onWindowResize);\t\n",
       "\n",
       "\n",
       "var xRotationEnabled = false;\n",
       "var yRotationEnabled = false;\n",
       "var zRotationEnabled = false;\n",
       "var rotationSpeedFactor = 1;\n",
       "var settingsShown = false;\n",
       "var labelsShown = true;\n",
       "var intervals = [];\n",
       "var timeouts = [];\n",
       "var explodingSpeed = 0.05;\n",
       "var explodeScale = 0;\n",
       "var XMLS = new XMLSerializer();\n",
       "var svgElement;\n",
       "var renderId;\n",
       "\n",
       "var render = function () {\n",
       "\n",
       "\trenderId = requestAnimationFrame(render);\n",
       "\n",
       "//\tcomment in for automatic explosion\n",
       "//\texplode(updateFactor());\n",
       "\n",
       "    var phi = 0.02 * rotationSpeedFactor;\n",
       "\n",
       "    if (xRotationEnabled) {\n",
       "        scene.rotation.x += phi;\n",
       "    }\n",
       "    if (yRotationEnabled) {\n",
       "        scene.rotation.y += phi;\n",
       "    }\n",
       "    if (zRotationEnabled) {\n",
       "        scene.rotation.z += phi;\n",
       "    }\n",
       "\n",
       "    control.update();\n",
       "    renderer.render(scene, camera);\n",
       "};\n",
       "\n",
       "if ( THREE.WEBGL.isWebGLAvailable() ) {\n",
       "\trender();\n",
       "} else {\n",
       "\tvar warning = WEBGL.getWebGLErrorMessage();\n",
       "\tthree.appendChild( warning );\n",
       "}\n",
       "    \n",
       "function changeTransparency() {\n",
       "    var opacity = 1-Number(event.currentTarget.value);\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        child = scene.children[i];\n",
       "        if ( child.userData.hasOwnProperty(\"facetmaterial\") ) {\n",
       "            if (Array.isArray(child.userData.facetmaterial)) {\n",
       "                for (var j=0; j<child.userData.facetmaterial.length; j++) {\n",
       "                    child.userData.facetmaterial[j].opacity = opacity;\n",
       "                }\n",
       "            } else {\n",
       "                child.userData.facetmaterial.opacity = opacity;\n",
       "            }    \n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function changeRotationX(event){\n",
       "    xRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "function changeRotationY(event){\n",
       "    yRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "function changeRotationZ(event){\n",
       "    zRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "\n",
       "function changeRotationSpeedFactor(event){\n",
       "    rotationSpeedFactor = Number(event.currentTarget.value);\n",
       "}\n",
       "\n",
       "function resetScene(){\n",
       "    scene.rotation.set(0,0,0);\n",
       "    camera.position.set(0,0,5);\n",
       "    camera.up.set(0,1,0);\n",
       "}\n",
       "\n",
       "function showSettings(event){\n",
       "    document.getElementById('settings_7').style.visibility = 'visible';\n",
       "    document.getElementById('showSettingsButton_7').style.visibility = 'hidden';\n",
       "    document.getElementById('hideSettingsButton_7').style.visibility = 'visible';\n",
       "    settingsShown = true;\n",
       "}\n",
       "\n",
       "function hideSettings(event){\n",
       "    document.getElementById('settings_7').style.visibility = 'hidden';\n",
       "    document.getElementById('showSettingsButton_7').style.visibility = 'visible';\n",
       "    document.getElementById('hideSettingsButton_7').style.visibility = 'hidden';\n",
       "    settingsShown = false;\n",
       "}\n",
       "\n",
       "\n",
       "\n",
       "var pos = 150* Math.PI;\n",
       "\n",
       "function updateFactor() {\n",
       "    pos++;\n",
       "    return Math.sin(.01*pos)+1;\n",
       "}\n",
       "\n",
       "// ------------------------ FOLDING ------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "// rotate point p around axis defined by points p1 and p2 by given angle\n",
       "function rotate(p, p1, p2, angle ){   \n",
       "    angle = -angle;\n",
       "    var x = p.x, y = p.y, z = p.z, \n",
       "    a = p1.x, b = p1.y, c = p1.z, \n",
       "    u = p2.x-p1.x, v = p2.y-p1.y, w = p2.z-p1.z;\n",
       "    var result = [];\n",
       "    var L = u*u + v*v + w*w;\n",
       "    var sqrt = Math.sqrt;\n",
       "    var cos = Math.cos;\n",
       "    var sin = Math.sin;\n",
       "\n",
       "    result[0] = ((a*(v*v+w*w)-u*(b*v+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*x*cos(angle)+sqrt(L)*(-c*v+b*w-w*y+v*z)*sin(angle))/L;\n",
       "    result[1] = ((b*(u*u+w*w)-v*(a*u+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*y*cos(angle)+sqrt(L)*(c*u-a*w+w*x-u*z)*sin(angle))/L;\n",
       "    result[2] = ((c*(u*u+v*v)-w*(a*u+b*v-u*x-v*y-w*z))*(1-cos(angle))+L*z*cos(angle)+sqrt(L)*(-b*u+a*v-v*x+u*y)*sin(angle))/L;\n",
       "\n",
       "    return result;\n",
       "}\n",
       "\n",
       "var fold = function(event){\n",
       "    var obj = foldables[Number(event.currentTarget.name)];\n",
       "    var foldvalue = Number(event.currentTarget.value);\n",
       "    var scale = foldvalue - obj.userData.oldscale;\n",
       "\n",
       "    for (var j=0; j<obj.userData.axes.length; j++) {\n",
       "        rotateVertices(obj, j, scale);\n",
       "    }\n",
       "    update(obj);\n",
       "    obj.userData.oldscale += scale;\n",
       "    lookAtBarycenter(obj);\n",
       "}\n",
       "\n",
       "function lookAtBarycenter(obj){\n",
       "    control.target = barycenter(obj);\n",
       "}\n",
       "\n",
       "function barycenter(obj) {\n",
       "    var center = new THREE.Vector3(0,0,0);\n",
       "    var points = obj.userData.points;\n",
       "    for (var i=0; i<points.length; i++){\n",
       "        center.add(points[i].vector);\n",
       "    }\n",
       "    center.divideScalar(points.length);\n",
       "    return center;\n",
       "}\n",
       "\n",
       "function rotateVertices(obj, edge, scale) {\n",
       "    var axes = obj.userData.axes;\n",
       "    var subtrees = obj.userData.subtrees;\n",
       "    var points = obj.userData.points;\n",
       "    var angles = obj.userData.angles;\n",
       "    if (edge < axes.length){\n",
       "        for (var j=0; j<subtrees[edge].length; j++){\n",
       "            var rotP = rotate(points[subtrees[edge][j]].vector, points[axes[edge][0]].vector,points[axes[edge][1]].vector, scale * (Math.PI - angles[edge]));\n",
       "            points[subtrees[edge][j]].set(rotP[0],rotP[1],rotP[2]);\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function update(obj) {\n",
       "   updateFacesPosition(obj);\n",
       "   updateEdgesPosition(obj);\n",
       "}\n",
       "\n",
       "if (foldables.length) {\n",
       "    var settings = document.getElementById('settings_7');\n",
       "    var foldDiv = document.createElement('div');\n",
       "    foldDiv.id = 'fold_7';\n",
       "    var title = document.createElement('strong');\n",
       "    title.innerHTML = 'Fold';\n",
       "    foldDiv.appendChild(title);\n",
       "    foldDiv.className = 'group';\n",
       "    for (var i=0; i<foldables.length; i++) {\n",
       "        var range = document.createElement('input');\n",
       "        range.type = 'range';\n",
       "        range.min = 0;\n",
       "        range.max = 1;\n",
       "        range.value = 0;\n",
       "        range.step = 0.001;\n",
       "        range.name = String(i);\n",
       "        range.oninput = fold;\n",
       "        foldDiv.appendChild(range);\n",
       "    }\n",
       "    lookAtBarycenter(foldables[0]);\n",
       "    settings.insertBefore(foldDiv,settings.childNodes[0]);\n",
       "}\n",
       "\n",
       "    \n",
       "// ---------------------- EXPLOSION ------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "if (explodableModel) {\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        obj = scene.children[i];\n",
       "        if ( obj.userData.explodable ) {\n",
       "            computeCentroid(obj);\n",
       "        }\n",
       "    }\n",
       "    document.getElementById('explodeRange_7').oninput = triggerExplode;\n",
       "    document.getElementById('explodeCheckbox_7').onchange = triggerAutomaticExplode;\n",
       "    document.getElementById('explodingSpeedRange_7').oninput = setExplodingSpeed;\n",
       "}\n",
       "\n",
       "function computeCentroid(obj) {\n",
       "    centroid = new THREE.Vector3();\n",
       "    obj.userData.points.forEach(function(pmpoint) {\n",
       "        centroid.add(pmpoint.vector);\t\t\t\n",
       "    });\n",
       "    centroid.divideScalar(obj.userData.points.length);\n",
       "    obj.userData.centroid = centroid;\n",
       "}\n",
       "\n",
       "function explode(factor) {\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        var obj = scene.children[i];\n",
       "        if (obj.userData.hasOwnProperty(\"centroid\")) { \n",
       "            var c = obj.userData.centroid;\n",
       "            obj.position.set(c.x*factor, c.y*factor, c.z*factor);\n",
       "        }\n",
       "    }\t\n",
       "}\n",
       "\n",
       "function triggerExplode(event){\n",
       "    explodeScale = Number(event.currentTarget.value);\n",
       "    explode(explodeScale);\n",
       "}\n",
       "\n",
       "function setExplodingSpeed(event){\n",
       "    explodingSpeed = Number(event.currentTarget.value);\n",
       "}\n",
       "\n",
       "function triggerAutomaticExplode(event){\n",
       "    if (event.currentTarget.checked){\n",
       "        startExploding();\n",
       "    } else {\n",
       "        clearIntervals();\n",
       "    }\t\n",
       "}\n",
       "\n",
       "function startExploding(){\n",
       "    intervals.push(setInterval(explodingInterval, 25));\n",
       "}\n",
       "\n",
       "\n",
       "function explodingInterval(){\n",
       "    explodeScale += explodingSpeed;\n",
       "    if (explodeScale <= 6){ \n",
       "        explode(explodeScale);\n",
       "    }\n",
       "    else{\n",
       "        explode(6);\n",
       "        explodeScale = 6;\n",
       "        clearIntervals();\n",
       "        timeouts.push(setTimeout(startUnexploding, 3000));\n",
       "    }\n",
       "    document.getElementById('explodeRange_7').value = explodeScale;\n",
       "}\n",
       "\n",
       "\n",
       "function startUnexploding(){\n",
       "    intervals.push(setInterval(unexplodingInterval, 25));\n",
       "}\n",
       "\n",
       "function unexplodingInterval(){\n",
       "    explodeScale -= explodingSpeed;\n",
       "    if (explodeScale >= 0){\t\n",
       "        explode(explodeScale);\n",
       "    }\n",
       "    else {\n",
       "        explode(0);\n",
       "        explodeScale = 0;\n",
       "        clearIntervals();\n",
       "        timeouts.push(setTimeout(startExploding, 3000));\n",
       "    }\n",
       "    document.getElementById('explodeRange_7').value = explodeScale;\n",
       "}\n",
       "\n",
       "function clearIntervals(){\n",
       "    intervals.forEach(function(interval){\n",
       "        clearInterval(interval);\n",
       "    });\n",
       "    intervals = [];\n",
       "    timeouts.forEach(function(timeout){\n",
       "        clearTimeout(timeout);\n",
       "    });\n",
       "    timeouts = [];\n",
       "}\n",
       "\n",
       "// ---------------------- DISPLAY --------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "const objectTypeInnerHTMLs = { points: \"Points\", pointlabels: \"Point labels\", lines: \"Edges\", edgelabels: \"Edge labels\", faces: \"Faces\", arrowheads: \"Arrow heads\" };\n",
       "const objectTypeVisible = {};\n",
       "Object.assign(objectTypeVisible,modelContains);\n",
       "const sortedObjectTypeKeys = Object.keys(objectTypeInnerHTMLs).sort();\n",
       "const shownObjectTypesList = document.getElementById('shownObjectTypesList_7');\n",
       "\n",
       "function setVisibility(bool,objname) {\n",
       "    for (var i=0; i<scene.children.length; i++){\n",
       "        var obj = scene.children[i].getObjectByName(objname);\n",
       "        if (obj) {\n",
       "            obj.visible = bool;\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function toggleObjectTypeVisibility(event){\n",
       "    var name = event.currentTarget.name;\n",
       "    var checked = event.currentTarget.checked;\n",
       "    objectTypeVisible[name] = checked;\n",
       "    setVisibility(checked,name);\n",
       "}\n",
       "\n",
       "for (var i=0; i<sortedObjectTypeKeys.length; i++){\n",
       "    var key = sortedObjectTypeKeys[i];\n",
       "    if (modelContains[key]) {\n",
       "        var objTypeNode = document.createElement('span');\n",
       "        objTypeNode.innerHTML = objectTypeInnerHTMLs[key] + '<br>';\n",
       "        var checkbox = document.createElement('input');\n",
       "        checkbox.type = 'checkbox';\n",
       "        checkbox.checked = true;\n",
       "        checkbox.name = key;\n",
       "        checkbox.onchange = toggleObjectTypeVisibility;\n",
       "        shownObjectTypesList.appendChild(checkbox);\n",
       "        shownObjectTypesList.appendChild(objTypeNode);\n",
       "    }\n",
       "}\n",
       "\n",
       "// ------------------------------------------------------\n",
       "\n",
       "function toggleObjectVisibility(event){\n",
       "    var nr = Number(event.currentTarget.name);\n",
       "    scene.children[nr].visible = event.currentTarget.checked;\n",
       "}\n",
       "\n",
       "// append checkboxes for displaying or hiding objects\n",
       "var shownObjectsList = document.getElementById('shownObjectsList_7');\n",
       "for (var i=0; i<scene.children.length; i++){\n",
       "    obj = scene.children[i];\n",
       "    var objNode = document.createElement('span');\n",
       "    objNode.innerHTML = obj.name + '<br>';\n",
       "    var checkbox = document.createElement('input');\n",
       "    checkbox.type = 'checkbox';\n",
       "    checkbox.checked = true;\n",
       "    checkbox.name = String(i);\n",
       "    checkbox.onchange = toggleObjectVisibility;\n",
       "    shownObjectsList.appendChild(checkbox);\n",
       "    shownObjectsList.appendChild(objNode);\n",
       "}\n",
       "\n",
       "// ---------------------- SVG ------------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "function takeSvgScreenshot() {\n",
       "    if (objectTypeVisible[\"pointlabels\"]) {\n",
       "        setVisibility(false,\"pointlabels\");\n",
       "    }\n",
       "    if (objectTypeVisible[\"edgelabels\"]) {\n",
       "        setVisibility(false,\"edgelabels\");\n",
       "    }\n",
       "    svgRenderer.render(scene,camera);\n",
       "    svgElement = XMLS.serializeToString(svgRenderer.domElement);\n",
       "    \n",
       "    if (objectTypeVisible[\"pointlabels\"]) {\n",
       "        setVisibility(true,\"pointlabels\");\n",
       "    }\n",
       "    if (objectTypeVisible[\"edgelabels\"]) {\n",
       "        setVisibility(true,\"edgelabels\");\n",
       "    }\n",
       "\n",
       "    if (document.getElementById('tab_7').checked){\n",
       "        //show in new tab\n",
       "        var myWindow = window.open(\"\",\"\");\n",
       "        myWindow.document.body.innerHTML = svgElement;\n",
       "    } else{\n",
       "        // download svg file \n",
       "        download(\"screenshot.svg\", svgElement);\n",
       "    }\n",
       "}\n",
       "\n",
       "function download(filename, text) {\n",
       "    var element = document.createElement('a');\n",
       "    element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));\n",
       "    element.setAttribute('download', filename);\n",
       "\n",
       "    element.style.display = 'none';\n",
       "    document.body.appendChild(element);\n",
       "\n",
       "    element.click();\n",
       "\n",
       "    document.body.removeChild(element);\n",
       "}\n",
       "\n",
       "\n",
       "document.getElementById('transparencyRange_7').oninput = changeTransparency;\n",
       "document.getElementById('changeRotationX_7').onchange = changeRotationX;\n",
       "document.getElementById('changeRotationY_7').onchange = changeRotationY;\n",
       "document.getElementById('changeRotationZ_7').onchange = changeRotationZ;\n",
       "document.getElementById('resetButton_7').onclick = resetScene;\n",
       "document.getElementById('rotationSpeedRange_7').oninput = changeRotationSpeedFactor;\n",
       "document.getElementById('takeScreenshot_7').onclick = takeSvgScreenshot;\n",
       "document.getElementById('showSettingsButton_7').onclick = showSettings;\n",
       "document.getElementById('hideSettingsButton_7').onclick = hideSettings;\n",
       "\n",
       "\n",
       "// ------------------ SHORTCUTS --------------------------------------------\n",
       "// -------------------------------------------------------------------------\n",
       "\n",
       "/**\n",
       " * http://www.openjs.com/scripts/events/keyboard_shortcuts/\n",
       " * Version : 2.01.B\n",
       " * By Binny V A\n",
       " * License : BSD\n",
       " */\n",
       "shortcut = {\n",
       "\t'all_shortcuts':{},//All the shortcuts are stored in this array\n",
       "\t'add': function(shortcut_combination,callback,opt) {\n",
       "\t\t//Provide a set of default options\n",
       "\t\tvar default_options = {\n",
       "\t\t\t'type':'keydown',\n",
       "\t\t\t'propagate':false,\n",
       "\t\t\t'disable_in_input':false,\n",
       "\t\t\t'target':document,\n",
       "\t\t\t'keycode':false\n",
       "\t\t}\n",
       "\t\tif(!opt) opt = default_options;\n",
       "\t\telse {\n",
       "\t\t\tfor(var dfo in default_options) {\n",
       "\t\t\t\tif(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo];\n",
       "\t\t\t}\n",
       "\t\t}\n",
       "\n",
       "\t\tvar ele = opt.target;\n",
       "\t\tif(typeof opt.target == 'string') ele = document.getElementById(opt.target);\n",
       "\t\tvar ths = this;\n",
       "\t\tshortcut_combination = shortcut_combination.toLowerCase();\n",
       "\n",
       "\t\t//The function to be called at keypress\n",
       "\t\tvar func = function(e) {\n",
       "\t\t\te = e || window.event;\n",
       "\t\t\t\n",
       "\t\t\tif(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields\n",
       "\t\t\t\tvar element;\n",
       "\t\t\t\tif(e.target) element=e.target;\n",
       "\t\t\t\telse if(e.srcElement) element=e.srcElement;\n",
       "\t\t\t\tif(element.nodeType==3) element=element.parentNode;\n",
       "\n",
       "\t\t\t\tif(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return;\n",
       "\t\t\t}\n",
       "\t\n",
       "\t\t\t//Find Which key is pressed\n",
       "\t\t\tif (e.keyCode) code = e.keyCode;\n",
       "\t\t\telse if (e.which) code = e.which;\n",
       "\t\t\tvar character = String.fromCharCode(code).toLowerCase();\n",
       "\t\t\t\n",
       "\t\t\tif(code == 188) character=\",\"; //If the user presses , when the type is onkeydown\n",
       "\t\t\tif(code == 190) character=\".\"; //If the user presses , when the type is onkeydown\n",
       "\n",
       "\t\t\tvar keys = shortcut_combination.split(\"+\");\n",
       "\t\t\t//Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked\n",
       "\t\t\tvar kp = 0;\n",
       "\t\t\t\n",
       "\t\t\t//Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken\n",
       "\t\t\tvar shift_nums = {\n",
       "\t\t\t\t\"`\":\"~\",\n",
       "\t\t\t\t\"1\":\"!\",\n",
       "\t\t\t\t\"2\":\"@\",\n",
       "\t\t\t\t\"3\":\"#\",\n",
       "\t\t\t\t\"4\":\"$\",\n",
       "\t\t\t\t\"5\":\"%\",\n",
       "\t\t\t\t\"6\":\"^\",\n",
       "\t\t\t\t\"7\":\"&\",\n",
       "\t\t\t\t\"8\":\"*\",\n",
       "\t\t\t\t\"9\":\"(\",\n",
       "\t\t\t\t\"0\":\")\",\n",
       "\t\t\t\t\"-\":\"_\",\n",
       "\t\t\t\t\"=\":\"+\",\n",
       "\t\t\t\t\";\":\":\",\n",
       "\t\t\t\t\"'\":\"\\\"\",\n",
       "\t\t\t\t\",\":\"<\",\n",
       "\t\t\t\t\".\":\">\",\n",
       "\t\t\t\t\"/\":\"?\",\n",
       "\t\t\t\t\"\\\\\":\"|\"\n",
       "\t\t\t}\n",
       "\t\t\t//Special Keys - and their codes\n",
       "\t\t\tvar special_keys = {\n",
       "\t\t\t\t'esc':27,\n",
       "\t\t\t\t'escape':27,\n",
       "\t\t\t\t'tab':9,\n",
       "\t\t\t\t'space':32,\n",
       "\t\t\t\t'return':13,\n",
       "\t\t\t\t'enter':13,\n",
       "\t\t\t\t'backspace':8,\n",
       "\t\n",
       "\t\t\t\t'scrolllock':145,\n",
       "\t\t\t\t'scroll_lock':145,\n",
       "\t\t\t\t'scroll':145,\n",
       "\t\t\t\t'capslock':20,\n",
       "\t\t\t\t'caps_lock':20,\n",
       "\t\t\t\t'caps':20,\n",
       "\t\t\t\t'numlock':144,\n",
       "\t\t\t\t'num_lock':144,\n",
       "\t\t\t\t'num':144,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'pause':19,\n",
       "\t\t\t\t'break':19,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'insert':45,\n",
       "\t\t\t\t'home':36,\n",
       "\t\t\t\t'delete':46,\n",
       "\t\t\t\t'end':35,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'pageup':33,\n",
       "\t\t\t\t'page_up':33,\n",
       "\t\t\t\t'pu':33,\n",
       "\t\n",
       "\t\t\t\t'pagedown':34,\n",
       "\t\t\t\t'page_down':34,\n",
       "\t\t\t\t'pd':34,\n",
       "\t\n",
       "\t\t\t\t'left':37,\n",
       "\t\t\t\t'up':38,\n",
       "\t\t\t\t'right':39,\n",
       "\t\t\t\t'down':40,\n",
       "\t\n",
       "\t\t\t\t'f1':112,\n",
       "\t\t\t\t'f2':113,\n",
       "\t\t\t\t'f3':114,\n",
       "\t\t\t\t'f4':115,\n",
       "\t\t\t\t'f5':116,\n",
       "\t\t\t\t'f6':117,\n",
       "\t\t\t\t'f7':118,\n",
       "\t\t\t\t'f8':119,\n",
       "\t\t\t\t'f9':120,\n",
       "\t\t\t\t'f10':121,\n",
       "\t\t\t\t'f11':122,\n",
       "\t\t\t\t'f12':123\n",
       "\t\t\t}\n",
       "\t\n",
       "\t\t\tvar modifiers = { \n",
       "\t\t\t\tshift: { wanted:false, pressed:false},\n",
       "\t\t\t\tctrl : { wanted:false, pressed:false},\n",
       "\t\t\t\talt  : { wanted:false, pressed:false},\n",
       "\t\t\t\tmeta : { wanted:false, pressed:false}\t//Meta is Mac specific\n",
       "\t\t\t};\n",
       "                        \n",
       "\t\t\tif(e.ctrlKey)\tmodifiers.ctrl.pressed = true;\n",
       "\t\t\tif(e.shiftKey)\tmodifiers.shift.pressed = true;\n",
       "\t\t\tif(e.altKey)\tmodifiers.alt.pressed = true;\n",
       "\t\t\tif(e.metaKey)   modifiers.meta.pressed = true;\n",
       "                        \n",
       "\t\t\tfor(var i=0; k=keys[i],i<keys.length; i++) {\n",
       "\t\t\t\t//Modifiers\n",
       "\t\t\t\tif(k == 'ctrl' || k == 'control') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.ctrl.wanted = true;\n",
       "\n",
       "\t\t\t\t} else if(k == 'shift') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.shift.wanted = true;\n",
       "\n",
       "\t\t\t\t} else if(k == 'alt') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.alt.wanted = true;\n",
       "\t\t\t\t} else if(k == 'meta') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.meta.wanted = true;\n",
       "\t\t\t\t} else if(k.length > 1) { //If it is a special key\n",
       "\t\t\t\t\tif(special_keys[k] == code) kp++;\n",
       "\t\t\t\t\t\n",
       "\t\t\t\t} else if(opt['keycode']) {\n",
       "\t\t\t\t\tif(opt['keycode'] == code) kp++;\n",
       "\n",
       "\t\t\t\t} else { //The special keys did not match\n",
       "\t\t\t\t\tif(character == k) kp++;\n",
       "\t\t\t\t\telse {\n",
       "\t\t\t\t\t\tif(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase\n",
       "\t\t\t\t\t\t\tcharacter = shift_nums[character]; \n",
       "\t\t\t\t\t\t\tif(character == k) kp++;\n",
       "\t\t\t\t\t\t}\n",
       "\t\t\t\t\t}\n",
       "\t\t\t\t}\n",
       "\t\t\t}\n",
       "\t\t\t\n",
       "\t\t\tif(kp == keys.length && \n",
       "\t\t\t\t\t\tmodifiers.ctrl.pressed == modifiers.ctrl.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.shift.pressed == modifiers.shift.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.alt.pressed == modifiers.alt.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.meta.pressed == modifiers.meta.wanted) {\n",
       "\t\t\t\tcallback(e);\n",
       "\t\n",
       "\t\t\t\tif(!opt['propagate']) { //Stop the event\n",
       "\t\t\t\t\t//e.cancelBubble is supported by IE - this will kill the bubbling process.\n",
       "\t\t\t\t\te.cancelBubble = true;\n",
       "\t\t\t\t\te.returnValue = false;\n",
       "\t\n",
       "\t\t\t\t\t//e.stopPropagation works in Firefox.\n",
       "\t\t\t\t\tif (e.stopPropagation) {\n",
       "\t\t\t\t\t\te.stopPropagation();\n",
       "\t\t\t\t\t\te.preventDefault();\n",
       "\t\t\t\t\t}\n",
       "\t\t\t\t\treturn false;\n",
       "\t\t\t\t}\n",
       "\t\t\t}\n",
       "\t\t}\n",
       "\t\tthis.all_shortcuts[shortcut_combination] = {\n",
       "\t\t\t'callback':func, \n",
       "\t\t\t'target':ele, \n",
       "\t\t\t'event': opt['type']\n",
       "\t\t};\n",
       "\t\t//Attach the function with the event\n",
       "\t\tif(ele.addEventListener) ele.addEventListener(opt['type'], func, false);\n",
       "\t\telse if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func);\n",
       "\t\telse ele['on'+opt['type']] = func;\n",
       "\t},\n",
       "\n",
       "\t//Remove the shortcut - just specify the shortcut and I will remove the binding\n",
       "\t'remove':function(shortcut_combination) {\n",
       "\t\tshortcut_combination = shortcut_combination.toLowerCase();\n",
       "\t\tvar binding = this.all_shortcuts[shortcut_combination];\n",
       "\t\tdelete(this.all_shortcuts[shortcut_combination])\n",
       "\t\tif(!binding) return;\n",
       "\t\tvar type = binding['event'];\n",
       "\t\tvar ele = binding['target'];\n",
       "\t\tvar callback = binding['callback'];\n",
       "\n",
       "\t\tif(ele.detachEvent) ele.detachEvent('on'+type, callback);\n",
       "\t\telse if(ele.removeEventListener) ele.removeEventListener(type, callback, false);\n",
       "\t\telse ele['on'+type] = false;\n",
       "\t}\n",
       "}\n",
       "\n",
       "shortcut.add(\"Alt+Left\",function() {\n",
       "\tvar event = new Event('click');\n",
       "\tif (settingsShown){\n",
       "\t\tdocument.getElementById('hideSettingsButton_7').dispatchEvent(event);\n",
       "\t} else {\n",
       "\t\tdocument.getElementById('showSettingsButton_7').dispatchEvent(event);\n",
       "\t}\n",
       "});\n",
       "\n",
       "\n",
       "// COMMON_CODE_BLOCK_END\n",
       "\n",
       "});});\n",
       "      </script>\n",
       "   </body>\n",
       "</html>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "$s = new HyperbolicSurface(DCEL=>$T3, PENNER_COORDINATES=>[2,1,1,1,1,1,1,1,1], SPECIAL_POINT=>[new Rational(1.5196714),new Rational(-0.5773503)]);\n",
    "$p = secondary_polyhedron($s,7);\n",
    "$p->VISUAL(FacetColor=>'255 180 80');"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<!--\n",
       "polymake for knusper\n",
       "Thu Aug 27 11:35:43 2020\n",
       "pcom:d0\n",
       "-->\n",
       "\n",
       "\n",
       "<html>\n",
       "   <head>\n",
       "      <meta charset=utf-8>\n",
       "      <title>pcom:d0</title>\n",
       "      <style>\n",
       "/*\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "*/\n",
       "         html {overflow: scroll;}\n",
       "         strong{font-size: 18px;}\n",
       "         canvas { z-index: 8; }\n",
       "         input[type='radio'] {margin-left:0;}\n",
       "         input[type='checkbox'] {margin-right:7px; margin-left: 0px; padding-left:0px;}\n",
       "         .group{padding-bottom: 15px;}\n",
       "         .settings * {z-index: 11; }\n",
       "         .settings{z-index: 10; font-family: Arial, Helvetica, sans-serif; margin-left: 30px; visibility: hidden; width: 14em; height: 96%; border: solid 1px silver; padding: 2px; overflow-y: scroll; box-sizing: border-box; background-color: white; position: absolute;}\n",
       "         .indented{margin-left: 20px; margin-top: 10px; padding-bottom: 0px;} \n",
       "         .shownObjectsList{overflow: auto; max-width: 150px; max-height: 150px;}\n",
       "         .showSettingsButton{visibility: visible; z-index: 12; position: absolute }\n",
       "         .hideSettingsButton{visibility: hidden; z-index: 12; position: absolute; opacity: 0.5}\n",
       "         button{margin-left: 0; margin-top: 10px}\n",
       "         img{cursor: pointer;}\n",
       "         .suboption{padding-top: 15px;}\n",
       "         #model29263981128 { width: 100%; height: 100%; }\n",
       "         .threejs_container { width: 100%; height: 75vh;}\n",
       "         .settings{max-height: 74vh} \n",
       "         input[type=range] {\n",
       "           -webkit-appearance: none;\n",
       "           padding:0; \n",
       "           width:90%; \n",
       "           margin-left: auto;\n",
       "           margin-right: auto;\n",
       "           margin-top: 15px;\n",
       "           margin-bottom: 15px;\n",
       "           display: block;\t\n",
       "         }\n",
       "         input[type=range]:focus {\n",
       "           outline: none;\n",
       "         }\n",
       "         input[type=range]::-webkit-slider-runnable-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "           background: #E3E3E3;\n",
       "           border-radius: 0px;\n",
       "           border: 0px solid #000000;\n",
       "         }\n",
       "         input[type=range]::-webkit-slider-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "           -webkit-appearance: none;\n",
       "           margin-top: -5px;\n",
       "         }\n",
       "         input[type=range]:focus::-webkit-slider-runnable-track {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "         input[type=range]::-moz-range-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "           background: #E3E3E3;\n",
       "           border-radius: 0px;\n",
       "           border: 0px solid #000000;\n",
       "         }\n",
       "         input[type=range]::-moz-range-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "         }\n",
       "         input[type=range]::-ms-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           background: transparent;\n",
       "           border-color: transparent;\n",
       "           color: transparent;\n",
       "         }\n",
       "         input[type=range]::-ms-fill-lower {\n",
       "           background: #E3E3E3;\n",
       "           border: 0px solid #000000;\n",
       "           border-radius: 0px;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "         }\n",
       "         input[type=range]::-ms-fill-upper {\n",
       "           background: #E3E3E3;\n",
       "           border: 0px solid #000000;\n",
       "           border-radius: 0px;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "         }\n",
       "         input[type=range]::-ms-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "         }\n",
       "         input[type=range]:focus::-ms-fill-lower {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "         input[type=range]:focus::-ms-fill-upper {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "/*\n",
       "// COMMON_CODE_BLOCK_END\n",
       "*/\n",
       "\t\t</style>\n",
       "   </head>\n",
       "<body>\n",
       "   <div class='threejs_container'>\n",
       "\t\t<div id='settings_8' class='settings'>\n",
       "\t\t\t<div class=group id='explode_8'>\n",
       "\t\t\t\t<strong>Explode</strong>\n",
       "\t\t\t\t<input id='explodeRange_8' type='range' min=0 max=6 step=0.01 value=0>\n",
       "\t\t\t\t<div class=indented><input id='explodeCheckbox_8' type='checkbox'>Automatic explosion</div>\n",
       "\t\t\t\t<div class=suboption>Exploding speed</div>\n",
       "\t\t\t\t<input id='explodingSpeedRange_8' type='range' min=0 max=0.5 step=0.001 value=0.05>\n",
       "\t\t\t</div>\n",
       "\t\n",
       "\t\t\t<div class=group id='transparency_8' class='transparency'>\n",
       "\t\t\t\t<strong>Transparency</strong>\n",
       "\t\t\t\t<input id='transparencyRange_8' type='range' min=0 max=1 step=0.01 value=0>\n",
       "\t\t\t</div>\n",
       "\t\t\t\n",
       "\t\t\t<div class=group id='rotation_8'>\n",
       "\t\t\t\t<strong>Rotation</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationX_8'> x-axis</div>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationY_8'> y-axis</div>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationZ_8'> z-axis</div>\n",
       "\t\t\t\t\t<button id='resetButton_8'>Reset</button>\n",
       "\t\t\t\t</div>\n",
       "\n",
       "\t\t\t\t<div class=suboption>Rotation speed</div>\n",
       "\t\t\t\t<input id='rotationSpeedRange_8' type='range' min=0 max=5 step=0.01 value=2>\n",
       "\t\t\t</div>\n",
       "\n",
       "\n",
       "\t\t\t<div class=group id='display_8'>\n",
       "\t\t\t\t<strong>Display</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<div id='shownObjectTypesList_8' class='shownObjectsList'></div>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t\t<div class=suboption>Objects</div>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t   <div id='shownObjectsList_8' class='shownObjectsList'></div>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t</div>\n",
       "         \n",
       "         <div class=group id='camera_8'>\n",
       "            <strong>Camera</strong>\n",
       "            <div class=indented>\n",
       "               <form>\n",
       "                  <select id=\"cameraType_8\">\n",
       "                     <option value='perspective' selected> Perspective<br></option>\n",
       "                     <option value='orthographic' > Orthographic<br></option>\n",
       "                  </select>\n",
       "               </form>\n",
       "            </div>\n",
       "         </div>\n",
       "\n",
       "\t\t\t<div class=group id='svg_8'>\n",
       "\t\t\t\t<strong>SVG</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<form>\n",
       "\t\t\t\t\t\t<input type=\"radio\" name='screenshotMode' value='download' id='download_8' checked> Download<br>\n",
       "\t\t\t\t\t\t<input type=\"radio\" name='screenshotMode' value='tab' id='tab_8' > New tab<br>\n",
       "\t\t\t\t\t</form>\n",
       "\t\t\t\t\t<button id='takeScreenshot_8'>Screenshot</button>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t</div>\n",
       "\n",
       "\t\t</div>\t<!-- end of settings -->\n",
       "\t\t<img id='hideSettingsButton_8' class='hideSettingsButton' src='/kernelspecs/polymake/close.svg' width=20px\">\n",
       "\t\t<img id='showSettingsButton_8' class='showSettingsButton' src='/kernelspecs/polymake/menu.svg' width=20px\">\n",
       "<div id=\"model29263981128\"></div>\n",
       "</div>\n",
       "   <script>\n",
       "    requirejs.config({\n",
       "      paths: {\n",
       "        three: '/kernelspecs/polymake/three',\n",
       "        TrackballControls: '/kernelspecs/polymake/TrackballControls',\n",
       "        OrbitControls: '/kernelspecs/polymake/OrbitControls',\n",
       "        Projector: '/kernelspecs/polymake/Projector',\n",
       "        SVGRenderer: '/kernelspecs/polymake/SVGRenderer',\n",
       "        WEBGL: '/kernelspecs/polymake/WebGL',\n",
       "      },\n",
       "      shim: {\n",
       "        'three': { exports: 'THREE'},\n",
       "        'SVGRenderer': { deps: [ 'three' ], exports: 'THREE.SVGRenderer' },\n",
       "        'WEBGL': { deps: [ 'three' ], exports: 'THREE.WEBGL' },\n",
       "        'Projector': { deps: [ 'three' ], exports: 'THREE.Projector' },\n",
       "        'TrackballControls': { deps: [ 'three' ], exports: 'THREE.TrackballControls' },\n",
       "        'OrbitControls': { deps: [ 'three' ], exports: 'THREE.OrbitControls' },\n",
       "      }\n",
       "    });\n",
       "    \n",
       "    require(['three'],function(THREE){\n",
       "        window.THREE = THREE;\n",
       "      require(['TrackballControls', 'OrbitControls', 'Projector', 'SVGRenderer', 'WEBGL'],\n",
       "               function(TrackballControls, OrbitControls, Projector, SVGRenderer, WEBGL) {\n",
       "    THREE.TrackballControls = TrackballControls;\n",
       "    THREE.OrbitControls = OrbitControls;\n",
       "    THREE.Projector = Projector;\n",
       "    THREE.SVGRenderer = SVGRenderer;\n",
       "    THREE.WEBGL = WEBGL;\n",
       "\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "\n",
       "const intervalLength = 25; // for automatic animations\n",
       "const explodableModel = true; \n",
       "const modelContains = { points: false, pointlabels: false, lines: false, edgelabels: false, faces: false, arrowheads: false };\n",
       "const foldables = [];\n",
       "\n",
       "var three = document.getElementById(\"model29263981128\");\n",
       "var scene = new THREE.Scene();\n",
       "var renderer = new THREE.WebGLRenderer( { antialias: true } );\n",
       "var svgRenderer = new THREE.SVGRenderer( { antialias: true } );\n",
       "renderer.setPixelRatio( window.devicePixelRatio );\n",
       "renderer.setClearColor(0xFFFFFF, 1);\n",
       "svgRenderer.setClearColor(0xFFFFFF, 1);\n",
       "three.appendChild(renderer.domElement);\n",
       "\n",
       "var frustumSize = 4;\n",
       "var cameras = [new THREE.PerspectiveCamera(75, 1, 0.1, 1000), new THREE.OrthographicCamera()];\n",
       "cameras.forEach(function(cam) {\n",
       "    cam.position.set(0, 0, 5);\n",
       "    cam.lookAt(0, 0, 0);  \n",
       "    cam.up.set(0, 1, 0);         \n",
       "});\n",
       "var controls = [new THREE.TrackballControls(cameras[0], three), new THREE.OrbitControls(cameras[1], three)];\n",
       "var camera, control;\n",
       "\n",
       "controls[0].zoomSpeed = 0.2;\n",
       "controls[0].rotateSpeed = 4;\n",
       "\n",
       "\n",
       "// class to allow move points together with labels and spheres\n",
       "var PMPoint = function (x,y,z) {\n",
       "   this.vector = new THREE.Vector3(x,y,z);\n",
       "   this.sprite = null;\n",
       "   this.sphere = null;\n",
       "}\n",
       "PMPoint.prototype.addLabel = function(labelsprite) {\n",
       "   this.sprite = labelsprite;\n",
       "   this.sprite.position.copy(this.vector);\n",
       "}\n",
       "PMPoint.prototype.addSphere = function(spheremesh) {\n",
       "   this.sphere = spheremesh;\n",
       "   this.sphere.position.copy(this.vector);\n",
       "}\n",
       "PMPoint.prototype.set = function(x,y,z) {\n",
       "   this.vector.set(x,y,z);\n",
       "   if (this.sprite) {\n",
       "      this.sprite.position.copy(this.vector);\n",
       "   }\n",
       "   if (this.sphere) {\n",
       "      this.sphere.position.copy(this.vector);\n",
       "   }\n",
       "}\n",
       "PMPoint.prototype.radius = function() {\n",
       "   if (this.sphere) {\n",
       "      return this.sphere.geometry.parameters.radius;\n",
       "   } else {\n",
       "      return 0;\n",
       "   }\n",
       "};\n",
       "// select the target node\n",
       "var target = document.querySelector('#model29263981128');\n",
       "\n",
       "// create an observer instance\n",
       "var observer = new MutationObserver(function(mutations) {\n",
       "   mutations.forEach(function(mutation) {\n",
       "      if (mutation.removedNodes && mutation.removedNodes.length > 0) {\n",
       "         cancelAnimationFrame(renderId);\n",
       "         observer.disconnect();\n",
       "         console.log(\"cancelled frame \"+renderId);\n",
       "      }\n",
       "   });\n",
       "});\n",
       "\n",
       "// configuration of the observer:\n",
       "var config = { childList: true, characterData: true }\n",
       "\n",
       "// pass in the target node, as well as the observer options\n",
       "while (target) {\n",
       "   if (target.className==\"output\") {\n",
       "      observer.observe(target, config);\n",
       "      break;\n",
       "   }\n",
       "   target = target.parentNode;\n",
       "}\n",
       "\n",
       "// COMMON_CODE_BLOCK_END\n",
       "\n",
       "var obj0 = new THREE.Object3D();\n",
       "obj0.name = \"unnamed__1\";\n",
       "obj0.userData.explodable = 1;\n",
       "obj0.userData.points = [];\n",
       "obj0.userData.points.push(new PMPoint(-0.5, -0.866025, 0.0666667));\n",
       "obj0.userData.points.push(new PMPoint(0.5, 0.866025, 0.6));\n",
       "obj0.userData.points.push(new PMPoint(-1, 0, 0.0375));\n",
       "\n",
       "obj0.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj0.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj0.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj0.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj0.userData.facets = [[0, 2, 1]];\n",
       "   <!-- Facet style -->\n",
       "obj0.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj0);\n",
       "scene.add(obj0);\n",
       "\n",
       "var obj1 = new THREE.Object3D();\n",
       "obj1.name = \"unnamed__2\";\n",
       "obj1.userData.explodable = 1;\n",
       "obj1.userData.points = [];\n",
       "obj1.userData.points.push(new PMPoint(-0.5, -0.866025, 0.0666667));\n",
       "obj1.userData.points.push(new PMPoint(0.5, 0.866025, 0.6));\n",
       "obj1.userData.points.push(new PMPoint(0.5, -0.866025, 0.0375));\n",
       "\n",
       "obj1.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj1.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj1.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj1.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj1.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj1.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj1);\n",
       "scene.add(obj1);\n",
       "\n",
       "var obj2 = new THREE.Object3D();\n",
       "obj2.name = \"unnamed__3\";\n",
       "obj2.userData.explodable = 1;\n",
       "obj2.userData.points = [];\n",
       "obj2.userData.points.push(new PMPoint(0.5, 0.866025, 0.6));\n",
       "obj2.userData.points.push(new PMPoint(-1, 0, 0.0375));\n",
       "obj2.userData.points.push(new PMPoint(-0.785714, 0.61859, 0.0122449));\n",
       "\n",
       "obj2.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj2.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj2.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj2.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj2.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj2.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj2);\n",
       "scene.add(obj2);\n",
       "\n",
       "var obj3 = new THREE.Object3D();\n",
       "obj3.name = \"unnamed__4\";\n",
       "obj3.userData.explodable = 1;\n",
       "obj3.userData.points = [];\n",
       "obj3.userData.points.push(new PMPoint(-0.5, -0.866025, 0.0666667));\n",
       "obj3.userData.points.push(new PMPoint(-1, 0, 0.0375));\n",
       "obj3.userData.points.push(new PMPoint(-0.884615, -0.466321, 0.0035503));\n",
       "\n",
       "obj3.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj3.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj3.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj3.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj3.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj3.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj3);\n",
       "scene.add(obj3);\n",
       "\n",
       "var obj4 = new THREE.Object3D();\n",
       "obj4.name = \"unnamed__5\";\n",
       "obj4.userData.explodable = 1;\n",
       "obj4.userData.points = [];\n",
       "obj4.userData.points.push(new PMPoint(-0.5, -0.866025, 0.0666667));\n",
       "obj4.userData.points.push(new PMPoint(0.5, -0.866025, 0.0375));\n",
       "obj4.userData.points.push(new PMPoint(0.0384615, -0.99926, 0.0035503));\n",
       "\n",
       "obj4.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj4.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj4.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj4.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj4.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj4.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj4);\n",
       "scene.add(obj4);\n",
       "\n",
       "var obj5 = new THREE.Object3D();\n",
       "obj5.name = \"unnamed__6\";\n",
       "obj5.userData.explodable = 1;\n",
       "obj5.userData.points = [];\n",
       "obj5.userData.points.push(new PMPoint(0.5, 0.866025, 0.6));\n",
       "obj5.userData.points.push(new PMPoint(0.5, -0.866025, 0.0375));\n",
       "obj5.userData.points.push(new PMPoint(0.928571, -0.371154, 0.0122449));\n",
       "\n",
       "obj5.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj5.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj5.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj5.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj5.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj5.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj5);\n",
       "scene.add(obj5);\n",
       "\n",
       "var obj6 = new THREE.Object3D();\n",
       "obj6.name = \"unnamed__7\";\n",
       "obj6.userData.explodable = 1;\n",
       "obj6.userData.points = [];\n",
       "obj6.userData.points.push(new PMPoint(0.5, 0.866025, 0.6));\n",
       "obj6.userData.points.push(new PMPoint(-0.785714, 0.61859, 0.0122449));\n",
       "obj6.userData.points.push(new PMPoint(-0.5, 0.866025, 0.00416667));\n",
       "\n",
       "obj6.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj6.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj6.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj6.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj6.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj6.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj6);\n",
       "scene.add(obj6);\n",
       "\n",
       "var obj7 = new THREE.Object3D();\n",
       "obj7.name = \"unnamed__8\";\n",
       "obj7.userData.explodable = 1;\n",
       "obj7.userData.points = [];\n",
       "obj7.userData.points.push(new PMPoint(-1, 0, 0.0375));\n",
       "obj7.userData.points.push(new PMPoint(-0.785714, 0.61859, 0.0122449));\n",
       "obj7.userData.points.push(new PMPoint(-0.928571, 0.371154, 0.00085034));\n",
       "\n",
       "obj7.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj7.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj7.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj7.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj7.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj7.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj7);\n",
       "scene.add(obj7);\n",
       "\n",
       "var obj8 = new THREE.Object3D();\n",
       "obj8.name = \"unnamed__9\";\n",
       "obj8.userData.explodable = 1;\n",
       "obj8.userData.points = [];\n",
       "obj8.userData.points.push(new PMPoint(-1, 0, 0.0375));\n",
       "obj8.userData.points.push(new PMPoint(-0.884615, -0.466321, 0.0035503));\n",
       "obj8.userData.points.push(new PMPoint(-0.951613, -0.307299, 0.000390218));\n",
       "\n",
       "obj8.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj8.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj8.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj8.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj8.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj8.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj8);\n",
       "scene.add(obj8);\n",
       "\n",
       "var obj9 = new THREE.Object3D();\n",
       "obj9.name = \"unnamed__10\";\n",
       "obj9.userData.explodable = 1;\n",
       "obj9.userData.points = [];\n",
       "obj9.userData.points.push(new PMPoint(-0.5, -0.866025, 0.0666667));\n",
       "obj9.userData.points.push(new PMPoint(-0.884615, -0.466321, 0.0035503));\n",
       "obj9.userData.points.push(new PMPoint(-0.785714, -0.61859, 0.000765306));\n",
       "\n",
       "obj9.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj9.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj9.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj9.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj9.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj9.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj9);\n",
       "scene.add(obj9);\n",
       "\n",
       "var obj10 = new THREE.Object3D();\n",
       "obj10.name = \"unnamed__11\";\n",
       "obj10.userData.explodable = 1;\n",
       "obj10.userData.points = [];\n",
       "obj10.userData.points.push(new PMPoint(-0.5, -0.866025, 0.0666667));\n",
       "obj10.userData.points.push(new PMPoint(0.0384615, -0.99926, 0.0035503));\n",
       "obj10.userData.points.push(new PMPoint(-0.142857, -0.989743, 0.000765306));\n",
       "\n",
       "obj10.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj10.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj10.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj10.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj10.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj10.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj10);\n",
       "scene.add(obj10);\n",
       "\n",
       "var obj11 = new THREE.Object3D();\n",
       "obj11.name = \"unnamed__12\";\n",
       "obj11.userData.explodable = 1;\n",
       "obj11.userData.points = [];\n",
       "obj11.userData.points.push(new PMPoint(0.5, -0.866025, 0.0375));\n",
       "obj11.userData.points.push(new PMPoint(0.0384615, -0.99926, 0.0035503));\n",
       "obj11.userData.points.push(new PMPoint(0.209677, -0.977771, 0.000390219));\n",
       "\n",
       "obj11.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj11.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj11.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj11.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj11.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj11.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj11);\n",
       "scene.add(obj11);\n",
       "\n",
       "var obj12 = new THREE.Object3D();\n",
       "obj12.name = \"unnamed__13\";\n",
       "obj12.userData.explodable = 1;\n",
       "obj12.userData.points = [];\n",
       "obj12.userData.points.push(new PMPoint(0.5, -0.866025, 0.0375));\n",
       "obj12.userData.points.push(new PMPoint(0.928571, -0.371154, 0.0122449));\n",
       "obj12.userData.points.push(new PMPoint(0.785714, -0.61859, 0.00085034));\n",
       "\n",
       "obj12.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj12.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj12.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj12.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj12.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj12.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj12);\n",
       "scene.add(obj12);\n",
       "\n",
       "var obj13 = new THREE.Object3D();\n",
       "obj13.name = \"unnamed__14\";\n",
       "obj13.userData.explodable = 1;\n",
       "obj13.userData.points = [];\n",
       "obj13.userData.points.push(new PMPoint(0.5, 0.866025, 0.6));\n",
       "obj13.userData.points.push(new PMPoint(0.928571, -0.371154, 0.0122449));\n",
       "obj13.userData.points.push(new PMPoint(1, 0, 0.00416667));\n",
       "\n",
       "obj13.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj13.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj13.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj13.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj13.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj13.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj13);\n",
       "scene.add(obj13);\n",
       "\n",
       "var obj14 = new THREE.Object3D();\n",
       "obj14.name = \"unnamed__15\";\n",
       "obj14.userData.explodable = 1;\n",
       "obj14.userData.points = [];\n",
       "obj14.userData.points.push(new PMPoint(0.5, 0.866025, 0.6));\n",
       "obj14.userData.points.push(new PMPoint(-0.5, 0.866025, 0.00416667));\n",
       "obj14.userData.points.push(new PMPoint(-0.289474, 0.957186, 0.00103878));\n",
       "\n",
       "obj14.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj14.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj14.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj14.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj14.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj14.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj14);\n",
       "scene.add(obj14);\n",
       "\n",
       "var obj15 = new THREE.Object3D();\n",
       "obj15.name = \"unnamed__16\";\n",
       "obj15.userData.explodable = 1;\n",
       "obj15.userData.points = [];\n",
       "obj15.userData.points.push(new PMPoint(-0.785714, 0.61859, 0.0122449));\n",
       "obj15.userData.points.push(new PMPoint(-0.5, 0.866025, 0.00416667));\n",
       "obj15.userData.points.push(new PMPoint(-0.635135, 0.772401, 0.000273923));\n",
       "\n",
       "obj15.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj15.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj15.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj15.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj15.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj15.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj15);\n",
       "scene.add(obj15);\n",
       "\n",
       "var obj16 = new THREE.Object3D();\n",
       "obj16.name = \"unnamed__17\";\n",
       "obj16.userData.explodable = 1;\n",
       "obj16.userData.points = [];\n",
       "obj16.userData.points.push(new PMPoint(-0.785714, 0.61859, 0.0122449));\n",
       "obj16.userData.points.push(new PMPoint(-0.928571, 0.371154, 0.00085034));\n",
       "obj16.userData.points.push(new PMPoint(-0.884615, 0.466321, 0.000138683));\n",
       "\n",
       "obj16.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj16.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj16.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj16.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj16.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj16.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj16);\n",
       "scene.add(obj16);\n",
       "\n",
       "var obj17 = new THREE.Object3D();\n",
       "obj17.name = \"unnamed__18\";\n",
       "obj17.userData.explodable = 1;\n",
       "obj17.userData.points = [];\n",
       "obj17.userData.points.push(new PMPoint(-1, 0, 0.0375));\n",
       "obj17.userData.points.push(new PMPoint(-0.928571, 0.371154, 0.00085034));\n",
       "obj17.userData.points.push(new PMPoint(-0.965116, 0.261822, 0.0003245));\n",
       "\n",
       "obj17.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj17.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj17.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj17.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj17.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj17.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj17);\n",
       "scene.add(obj17);\n",
       "\n",
       "var obj18 = new THREE.Object3D();\n",
       "obj18.name = \"unnamed__19\";\n",
       "obj18.userData.explodable = 1;\n",
       "obj18.userData.points = [];\n",
       "obj18.userData.points.push(new PMPoint(-1, 0, 0.0375));\n",
       "obj18.userData.points.push(new PMPoint(-0.951613, -0.307299, 0.000390218));\n",
       "obj18.userData.points.push(new PMPoint(-0.973684, -0.227901, 0.000184672));\n",
       "\n",
       "obj18.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj18.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj18.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj18.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj18.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj18.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj18);\n",
       "scene.add(obj18);\n",
       "\n",
       "var obj19 = new THREE.Object3D();\n",
       "obj19.name = \"unnamed__20\";\n",
       "obj19.userData.explodable = 1;\n",
       "obj19.userData.points = [];\n",
       "obj19.userData.points.push(new PMPoint(-0.884615, -0.466321, 0.0035503));\n",
       "obj19.userData.points.push(new PMPoint(-0.951613, -0.307299, 0.000390218));\n",
       "obj19.userData.points.push(new PMPoint(-0.928571, -0.371154, 5.31463e-05));\n",
       "\n",
       "obj19.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj19.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj19.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj19.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj19.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj19.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj19);\n",
       "scene.add(obj19);\n",
       "\n",
       "var obj20 = new THREE.Object3D();\n",
       "obj20.name = \"unnamed__21\";\n",
       "obj20.userData.explodable = 1;\n",
       "obj20.userData.points = [];\n",
       "obj20.userData.points.push(new PMPoint(-0.884615, -0.466321, 0.0035503));\n",
       "obj20.userData.points.push(new PMPoint(-0.785714, -0.61859, 0.000765306));\n",
       "obj20.userData.points.push(new PMPoint(-0.829114, -0.55908, 6.00865e-05));\n",
       "\n",
       "obj20.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj20.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj20.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj20.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj20.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj20.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj20);\n",
       "scene.add(obj20);\n",
       "\n",
       "var obj21 = new THREE.Object3D();\n",
       "obj21.name = \"unnamed__22\";\n",
       "obj21.userData.explodable = 1;\n",
       "obj21.userData.points = [];\n",
       "obj21.userData.points.push(new PMPoint(-0.5, -0.866025, 0.0666667));\n",
       "obj21.userData.points.push(new PMPoint(-0.785714, -0.61859, 0.000765306));\n",
       "obj21.userData.points.push(new PMPoint(-0.72449, -0.689286, 0.000156185));\n",
       "\n",
       "obj21.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj21.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj21.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj21.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj21.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj21.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj21);\n",
       "scene.add(obj21);\n",
       "\n",
       "var obj22 = new THREE.Object3D();\n",
       "obj22.name = \"unnamed__23\";\n",
       "obj22.userData.explodable = 1;\n",
       "obj22.userData.points = [];\n",
       "obj22.userData.points.push(new PMPoint(-0.5, -0.866025, 0.0666667));\n",
       "obj22.userData.points.push(new PMPoint(-0.142857, -0.989743, 0.000765306));\n",
       "obj22.userData.points.push(new PMPoint(-0.234694, -0.972069, 0.000156185));\n",
       "\n",
       "obj22.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj22.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj22.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj22.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj22.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj22.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj22);\n",
       "scene.add(obj22);\n",
       "\n",
       "var obj23 = new THREE.Object3D();\n",
       "obj23.name = \"unnamed__24\";\n",
       "obj23.userData.explodable = 1;\n",
       "obj23.userData.points = [];\n",
       "obj23.userData.points.push(new PMPoint(0.0384615, -0.99926, 0.0035503));\n",
       "obj23.userData.points.push(new PMPoint(-0.142857, -0.989743, 0.000765306));\n",
       "obj23.userData.points.push(new PMPoint(-0.0696203, -0.997574, 6.00865e-05));\n",
       "\n",
       "obj23.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj23.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj23.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj23.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj23.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj23.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj23);\n",
       "scene.add(obj23);\n",
       "\n",
       "var obj24 = new THREE.Object3D();\n",
       "obj24.name = \"unnamed__25\";\n",
       "obj24.userData.explodable = 1;\n",
       "obj24.userData.points = [];\n",
       "obj24.userData.points.push(new PMPoint(0.0384615, -0.99926, 0.0035503));\n",
       "obj24.userData.points.push(new PMPoint(0.209677, -0.977771, 0.000390219));\n",
       "obj24.userData.points.push(new PMPoint(0.142857, -0.989743, 5.31463e-05));\n",
       "\n",
       "obj24.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj24.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj24.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj24.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj24.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj24.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj24);\n",
       "scene.add(obj24);\n",
       "\n",
       "var obj25 = new THREE.Object3D();\n",
       "obj25.name = \"unnamed__26\";\n",
       "obj25.userData.explodable = 1;\n",
       "obj25.userData.points = [];\n",
       "obj25.userData.points.push(new PMPoint(0.5, -0.866025, 0.0375));\n",
       "obj25.userData.points.push(new PMPoint(0.209677, -0.977771, 0.000390219));\n",
       "obj25.userData.points.push(new PMPoint(0.289474, -0.957186, 0.000184672));\n",
       "\n",
       "obj25.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj25.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj25.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj25.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj25.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj25.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj25);\n",
       "scene.add(obj25);\n",
       "\n",
       "var obj26 = new THREE.Object3D();\n",
       "obj26.name = \"unnamed__27\";\n",
       "obj26.userData.explodable = 1;\n",
       "obj26.userData.points = [];\n",
       "obj26.userData.points.push(new PMPoint(0.5, -0.866025, 0.0375));\n",
       "obj26.userData.points.push(new PMPoint(0.785714, -0.61859, 0.00085034));\n",
       "obj26.userData.points.push(new PMPoint(0.709302, -0.704904, 0.0003245));\n",
       "\n",
       "obj26.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj26.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj26.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj26.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj26.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj26.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj26);\n",
       "scene.add(obj26);\n",
       "\n",
       "var obj27 = new THREE.Object3D();\n",
       "obj27.name = \"unnamed__28\";\n",
       "obj27.userData.explodable = 1;\n",
       "obj27.userData.points = [];\n",
       "obj27.userData.points.push(new PMPoint(0.928571, -0.371154, 0.0122449));\n",
       "obj27.userData.points.push(new PMPoint(0.785714, -0.61859, 0.00085034));\n",
       "obj27.userData.points.push(new PMPoint(0.846154, -0.532939, 0.000138683));\n",
       "\n",
       "obj27.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj27.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj27.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj27.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj27.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj27.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj27);\n",
       "scene.add(obj27);\n",
       "\n",
       "var obj28 = new THREE.Object3D();\n",
       "obj28.name = \"unnamed__29\";\n",
       "obj28.userData.explodable = 1;\n",
       "obj28.userData.points = [];\n",
       "obj28.userData.points.push(new PMPoint(0.928571, -0.371154, 0.0122449));\n",
       "obj28.userData.points.push(new PMPoint(1, 0, 0.00416667));\n",
       "obj28.userData.points.push(new PMPoint(0.986486, -0.163843, 0.000273923));\n",
       "\n",
       "obj28.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj28.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj28.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj28.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj28.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj28.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj28);\n",
       "scene.add(obj28);\n",
       "\n",
       "var obj29 = new THREE.Object3D();\n",
       "obj29.name = \"unnamed__30\";\n",
       "obj29.userData.explodable = 1;\n",
       "obj29.userData.points = [];\n",
       "obj29.userData.points.push(new PMPoint(0.5, 0.866025, 0.6));\n",
       "obj29.userData.points.push(new PMPoint(1, 0, 0.00416667));\n",
       "obj29.userData.points.push(new PMPoint(0.973684, 0.227901, 0.00103878));\n",
       "\n",
       "obj29.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj29.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj29.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj29.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj29.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj29.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj29);\n",
       "scene.add(obj29);\n",
       "\n",
       "var obj30 = new THREE.Object3D();\n",
       "obj30.name = \"unnamed__31\";\n",
       "obj30.userData.explodable = 1;\n",
       "obj30.userData.points = [];\n",
       "obj30.userData.points.push(new PMPoint(0.5, 0.866025, 0.6));\n",
       "obj30.userData.points.push(new PMPoint(-0.289474, 0.957186, 0.00103878));\n",
       "obj30.userData.points.push(new PMPoint(-0.142857, 0.989743, 0.000765306));\n",
       "\n",
       "obj30.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj30.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj30.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj30.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj30.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj30.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj30);\n",
       "scene.add(obj30);\n",
       "\n",
       "var obj31 = new THREE.Object3D();\n",
       "obj31.name = \"unnamed__32\";\n",
       "obj31.userData.explodable = 1;\n",
       "obj31.userData.points = [];\n",
       "obj31.userData.points.push(new PMPoint(-0.5, 0.866025, 0.00416667));\n",
       "obj31.userData.points.push(new PMPoint(-0.289474, 0.957186, 0.00103878));\n",
       "obj31.userData.points.push(new PMPoint(-0.385246, 0.922814, 0.000161247));\n",
       "\n",
       "obj31.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj31.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj31.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj31.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj31.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj31.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj31);\n",
       "scene.add(obj31);\n",
       "\n",
       "var obj32 = new THREE.Object3D();\n",
       "obj32.name = \"unnamed__33\";\n",
       "obj32.userData.explodable = 1;\n",
       "obj32.userData.points = [];\n",
       "obj32.userData.points.push(new PMPoint(-0.5, 0.866025, 0.00416667));\n",
       "obj32.userData.points.push(new PMPoint(-0.635135, 0.772401, 0.000273923));\n",
       "obj32.userData.points.push(new PMPoint(-0.587912, 0.808925, 7.2455e-05));\n",
       "\n",
       "obj32.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj32.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj32.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj32.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj32.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj32.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj32);\n",
       "scene.add(obj32);\n",
       "\n",
       "var obj33 = new THREE.Object3D();\n",
       "obj33.name = \"unnamed__34\";\n",
       "obj33.userData.explodable = 1;\n",
       "obj33.userData.points = [];\n",
       "obj33.userData.points.push(new PMPoint(-0.785714, 0.61859, 0.0122449));\n",
       "obj33.userData.points.push(new PMPoint(-0.635135, 0.772401, 0.000273923));\n",
       "obj33.userData.points.push(new PMPoint(-0.684211, 0.729285, 6.49238e-05));\n",
       "\n",
       "obj33.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj33.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj33.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj33.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj33.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj33.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj33);\n",
       "scene.add(obj33);\n",
       "\n",
       "var obj34 = new THREE.Object3D();\n",
       "obj34.name = \"unnamed__35\";\n",
       "obj34.userData.explodable = 1;\n",
       "obj34.userData.points = [];\n",
       "obj34.userData.points.push(new PMPoint(-0.785714, 0.61859, 0.0122449));\n",
       "obj34.userData.points.push(new PMPoint(-0.884615, 0.466321, 0.000138683));\n",
       "obj34.userData.points.push(new PMPoint(-0.860825, 0.508902, 6.37687e-05));\n",
       "\n",
       "obj34.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj34.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj34.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj34.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj34.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj34.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj34);\n",
       "scene.add(obj34);\n",
       "\n",
       "var obj35 = new THREE.Object3D();\n",
       "obj35.name = \"unnamed__36\";\n",
       "obj35.userData.explodable = 1;\n",
       "obj35.userData.points = [];\n",
       "obj35.userData.points.push(new PMPoint(-0.928571, 0.371154, 0.00085034));\n",
       "obj35.userData.points.push(new PMPoint(-0.884615, 0.466321, 0.000138683));\n",
       "obj35.userData.points.push(new PMPoint(-0.902878, 0.429897, 3.10543e-05));\n",
       "\n",
       "obj35.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj35.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj35.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj35.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj35.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj35.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj35);\n",
       "scene.add(obj35);\n",
       "\n",
       "var obj36 = new THREE.Object3D();\n",
       "obj36.name = \"unnamed__37\";\n",
       "obj36.userData.explodable = 1;\n",
       "obj36.userData.points = [];\n",
       "obj36.userData.points.push(new PMPoint(-0.928571, 0.371154, 0.00085034));\n",
       "obj36.userData.points.push(new PMPoint(-0.965116, 0.261822, 0.0003245));\n",
       "obj36.userData.points.push(new PMPoint(-0.951613, 0.307299, 2.43887e-05));\n",
       "\n",
       "obj36.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj36.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj36.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj36.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj36.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj36.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj36);\n",
       "scene.add(obj36);\n",
       "\n",
       "var obj37 = new THREE.Object3D();\n",
       "obj37.name = \"unnamed__38\";\n",
       "obj37.userData.explodable = 1;\n",
       "obj37.userData.points = [];\n",
       "obj37.userData.points.push(new PMPoint(-1, 0, 0.0375));\n",
       "obj37.userData.points.push(new PMPoint(-0.965116, 0.261822, 0.0003245));\n",
       "obj37.userData.points.push(new PMPoint(-0.979452, 0.201677, 7.03697e-05));\n",
       "\n",
       "obj37.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj37.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj37.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj37.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj37.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj37.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj37);\n",
       "scene.add(obj37);\n",
       "\n",
       "var obj38 = new THREE.Object3D();\n",
       "obj38.name = \"unnamed__39\";\n",
       "obj38.userData.explodable = 1;\n",
       "obj38.userData.points = [];\n",
       "obj38.userData.points.push(new PMPoint(-1, 0, 0.0375));\n",
       "obj38.userData.points.push(new PMPoint(-0.973684, -0.227901, 0.000184672));\n",
       "obj38.userData.points.push(new PMPoint(-0.983516, -0.180818, 4.52844e-05));\n",
       "\n",
       "obj38.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj38.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj38.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj38.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj38.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj38.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj38);\n",
       "scene.add(obj38);\n",
       "\n",
       "var obj39 = new THREE.Object3D();\n",
       "obj39.name = \"unnamed__40\";\n",
       "obj39.userData.explodable = 1;\n",
       "obj39.userData.points = [];\n",
       "obj39.userData.points.push(new PMPoint(-0.951613, -0.307299, 0.000390218));\n",
       "obj39.userData.points.push(new PMPoint(-0.973684, -0.227901, 0.000184672));\n",
       "obj39.userData.points.push(new PMPoint(-0.965116, -0.261822, 1.26758e-05));\n",
       "\n",
       "obj39.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj39.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj39.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj39.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj39.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj39.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj39);\n",
       "scene.add(obj39);\n",
       "\n",
       "var obj40 = new THREE.Object3D();\n",
       "obj40.name = \"unnamed__41\";\n",
       "obj40.userData.explodable = 1;\n",
       "obj40.userData.points = [];\n",
       "obj40.userData.points.push(new PMPoint(-0.951613, -0.307299, 0.000390218));\n",
       "obj40.userData.points.push(new PMPoint(-0.928571, -0.371154, 5.31463e-05));\n",
       "obj40.userData.points.push(new PMPoint(-0.937788, -0.347208, 1.27418e-05));\n",
       "\n",
       "obj40.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj40.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj40.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj40.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj40.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj40.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj40);\n",
       "scene.add(obj40);\n",
       "\n",
       "var obj41 = new THREE.Object3D();\n",
       "obj41.name = \"unnamed__42\";\n",
       "obj41.userData.explodable = 1;\n",
       "obj41.userData.points = [];\n",
       "obj41.userData.points.push(new PMPoint(-0.884615, -0.466321, 0.0035503));\n",
       "obj41.userData.points.push(new PMPoint(-0.928571, -0.371154, 5.31463e-05));\n",
       "obj41.userData.points.push(new PMPoint(-0.917178, -0.398478, 2.25827e-05));\n",
       "\n",
       "obj41.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj41.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj41.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj41.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj41.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj41.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj41);\n",
       "scene.add(obj41);\n",
       "\n",
       "var obj42 = new THREE.Object3D();\n",
       "obj42.name = \"unnamed__43\";\n",
       "obj42.userData.explodable = 1;\n",
       "obj42.userData.points = [];\n",
       "obj42.userData.points.push(new PMPoint(-0.884615, -0.466321, 0.0035503));\n",
       "obj42.userData.points.push(new PMPoint(-0.829114, -0.55908, 6.00865e-05));\n",
       "obj42.userData.points.push(new PMPoint(-0.846154, -0.532939, 1.54093e-05));\n",
       "\n",
       "obj42.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj42.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj42.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj42.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj42.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj42.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj42);\n",
       "scene.add(obj42);\n",
       "\n",
       "var obj43 = new THREE.Object3D();\n",
       "obj43.name = \"unnamed__44\";\n",
       "obj43.userData.explodable = 1;\n",
       "obj43.userData.points = [];\n",
       "obj43.userData.points.push(new PMPoint(-0.785714, -0.61859, 0.000765306));\n",
       "obj43.userData.points.push(new PMPoint(-0.829114, -0.55908, 6.00865e-05));\n",
       "obj43.userData.points.push(new PMPoint(-0.813433, -0.581659, 1.48511e-05));\n",
       "\n",
       "obj43.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj43.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj43.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj43.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj43.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj43.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj43);\n",
       "scene.add(obj43);\n",
       "\n",
       "var obj44 = new THREE.Object3D();\n",
       "obj44.name = \"unnamed__45\";\n",
       "obj44.userData.explodable = 1;\n",
       "obj44.userData.points = [];\n",
       "obj44.userData.points.push(new PMPoint(-0.785714, -0.61859, 0.000765306));\n",
       "obj44.userData.points.push(new PMPoint(-0.72449, -0.689286, 0.000156185));\n",
       "obj44.userData.points.push(new PMPoint(-0.751656, -0.659556, 2.63146e-05));\n",
       "\n",
       "obj44.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj44.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj44.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj44.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj44.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj44.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj44);\n",
       "scene.add(obj44);\n",
       "\n",
       "var obj45 = new THREE.Object3D();\n",
       "obj45.name = \"unnamed__46\";\n",
       "obj45.userData.explodable = 1;\n",
       "obj45.userData.points = [];\n",
       "obj45.userData.points.push(new PMPoint(-0.5, -0.866025, 0.0666667));\n",
       "obj45.userData.points.push(new PMPoint(-0.72449, -0.689286, 0.000156185));\n",
       "obj45.userData.points.push(new PMPoint(-0.684211, -0.729285, 0.000103878));\n",
       "\n",
       "obj45.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj45.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj45.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj45.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj45.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj45.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj45);\n",
       "scene.add(obj45);\n",
       "\n",
       "var obj46 = new THREE.Object3D();\n",
       "obj46.name = \"unnamed__47\";\n",
       "obj46.userData.explodable = 1;\n",
       "obj46.userData.points = [];\n",
       "obj46.userData.points.push(new PMPoint(-0.5, -0.866025, 0.0666667));\n",
       "obj46.userData.points.push(new PMPoint(-0.234694, -0.972069, 0.000156185));\n",
       "obj46.userData.points.push(new PMPoint(-0.289474, -0.957186, 0.000103878));\n",
       "\n",
       "obj46.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj46.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj46.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj46.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj46.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj46.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj46);\n",
       "scene.add(obj46);\n",
       "\n",
       "var obj47 = new THREE.Object3D();\n",
       "obj47.name = \"unnamed__48\";\n",
       "obj47.userData.explodable = 1;\n",
       "obj47.userData.points = [];\n",
       "obj47.userData.points.push(new PMPoint(-0.142857, -0.989743, 0.000765306));\n",
       "obj47.userData.points.push(new PMPoint(-0.234694, -0.972069, 0.000156185));\n",
       "obj47.userData.points.push(new PMPoint(-0.195364, -0.980731, 2.63146e-05));\n",
       "\n",
       "obj47.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj47.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj47.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj47.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj47.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj47.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj47);\n",
       "scene.add(obj47);\n",
       "\n",
       "var obj48 = new THREE.Object3D();\n",
       "obj48.name = \"unnamed__49\";\n",
       "obj48.userData.explodable = 1;\n",
       "obj48.userData.points = [];\n",
       "obj48.userData.points.push(new PMPoint(-0.142857, -0.989743, 0.000765306));\n",
       "obj48.userData.points.push(new PMPoint(-0.0696203, -0.997574, 6.00865e-05));\n",
       "obj48.userData.points.push(new PMPoint(-0.097015, -0.995283, 1.48511e-05));\n",
       "\n",
       "obj48.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj48.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj48.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj48.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj48.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj48.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj48);\n",
       "scene.add(obj48);\n",
       "\n",
       "var obj49 = new THREE.Object3D();\n",
       "obj49.name = \"unnamed__50\";\n",
       "obj49.userData.explodable = 1;\n",
       "obj49.userData.points = [];\n",
       "obj49.userData.points.push(new PMPoint(0.0384615, -0.99926, 0.0035503));\n",
       "obj49.userData.points.push(new PMPoint(-0.0696203, -0.997574, 6.00865e-05));\n",
       "obj49.userData.points.push(new PMPoint(-0.0384616, -0.99926, 1.54093e-05));\n",
       "\n",
       "obj49.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj49.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj49.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj49.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj49.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj49.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj49);\n",
       "scene.add(obj49);\n",
       "\n",
       "var obj50 = new THREE.Object3D();\n",
       "obj50.name = \"unnamed__51\";\n",
       "obj50.userData.explodable = 1;\n",
       "obj50.userData.points = [];\n",
       "obj50.userData.points.push(new PMPoint(0.0384615, -0.99926, 0.0035503));\n",
       "obj50.userData.points.push(new PMPoint(0.142857, -0.989743, 5.31463e-05));\n",
       "obj50.userData.points.push(new PMPoint(0.113497, -0.993538, 2.25827e-05));\n",
       "\n",
       "obj50.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj50.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj50.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj50.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj50.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj50.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj50);\n",
       "scene.add(obj50);\n",
       "\n",
       "var obj51 = new THREE.Object3D();\n",
       "obj51.name = \"unnamed__52\";\n",
       "obj51.userData.explodable = 1;\n",
       "obj51.userData.points = [];\n",
       "obj51.userData.points.push(new PMPoint(0.209677, -0.977771, 0.000390219));\n",
       "obj51.userData.points.push(new PMPoint(0.142857, -0.989743, 5.31463e-05));\n",
       "obj51.userData.points.push(new PMPoint(0.168203, -0.985752, 1.27418e-05));\n",
       "\n",
       "obj51.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj51.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj51.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj51.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj51.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj51.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj51);\n",
       "scene.add(obj51);\n",
       "\n",
       "var obj52 = new THREE.Object3D();\n",
       "obj52.name = \"unnamed__53\";\n",
       "obj52.userData.explodable = 1;\n",
       "obj52.userData.points = [];\n",
       "obj52.userData.points.push(new PMPoint(0.209677, -0.977771, 0.000390219));\n",
       "obj52.userData.points.push(new PMPoint(0.289474, -0.957186, 0.000184672));\n",
       "obj52.userData.points.push(new PMPoint(0.255814, -0.966726, 1.26758e-05));\n",
       "\n",
       "obj52.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj52.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj52.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj52.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj52.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj52.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj52);\n",
       "scene.add(obj52);\n",
       "\n",
       "var obj53 = new THREE.Object3D();\n",
       "obj53.name = \"unnamed__54\";\n",
       "obj53.userData.explodable = 1;\n",
       "obj53.userData.points = [];\n",
       "obj53.userData.points.push(new PMPoint(0.5, -0.866025, 0.0375));\n",
       "obj53.userData.points.push(new PMPoint(0.289474, -0.957186, 0.000184672));\n",
       "obj53.userData.points.push(new PMPoint(0.335165, -0.94216, 4.52844e-05));\n",
       "\n",
       "obj53.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj53.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj53.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj53.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj53.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj53.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj53);\n",
       "scene.add(obj53);\n",
       "\n",
       "var obj54 = new THREE.Object3D();\n",
       "obj54.name = \"unnamed__55\";\n",
       "obj54.userData.explodable = 1;\n",
       "obj54.userData.points = [];\n",
       "obj54.userData.points.push(new PMPoint(0.5, -0.866025, 0.0375));\n",
       "obj54.userData.points.push(new PMPoint(0.709302, -0.704904, 0.0003245));\n",
       "obj54.userData.points.push(new PMPoint(0.664384, -0.747392, 7.03697e-05));\n",
       "\n",
       "obj54.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj54.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj54.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj54.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj54.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj54.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj54);\n",
       "scene.add(obj54);\n",
       "\n",
       "var obj55 = new THREE.Object3D();\n",
       "obj55.name = \"unnamed__56\";\n",
       "obj55.userData.explodable = 1;\n",
       "obj55.userData.points = [];\n",
       "obj55.userData.points.push(new PMPoint(0.785714, -0.61859, 0.00085034));\n",
       "obj55.userData.points.push(new PMPoint(0.709302, -0.704904, 0.0003245));\n",
       "obj55.userData.points.push(new PMPoint(0.741935, -0.670471, 2.43887e-05));\n",
       "\n",
       "obj55.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj55.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj55.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj55.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj55.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj55.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj55);\n",
       "scene.add(obj55);\n",
       "\n",
       "var obj56 = new THREE.Object3D();\n",
       "obj56.name = \"unnamed__57\";\n",
       "obj56.userData.explodable = 1;\n",
       "obj56.userData.points = [];\n",
       "obj56.userData.points.push(new PMPoint(0.785714, -0.61859, 0.00085034));\n",
       "obj56.userData.points.push(new PMPoint(0.846154, -0.532939, 0.000138683));\n",
       "obj56.userData.points.push(new PMPoint(0.823741, -0.566966, 3.10543e-05));\n",
       "\n",
       "obj56.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj56.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj56.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj56.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj56.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj56.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj56);\n",
       "scene.add(obj56);\n",
       "\n",
       "var obj57 = new THREE.Object3D();\n",
       "obj57.name = \"unnamed__58\";\n",
       "obj57.userData.explodable = 1;\n",
       "obj57.userData.points = [];\n",
       "obj57.userData.points.push(new PMPoint(0.928571, -0.371154, 0.0122449));\n",
       "obj57.userData.points.push(new PMPoint(0.846154, -0.532939, 0.000138683));\n",
       "obj57.userData.points.push(new PMPoint(0.871134, -0.491045, 6.37687e-05));\n",
       "\n",
       "obj57.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj57.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj57.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj57.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj57.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj57.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj57);\n",
       "scene.add(obj57);\n",
       "\n",
       "var obj58 = new THREE.Object3D();\n",
       "obj58.name = \"unnamed__59\";\n",
       "obj58.userData.explodable = 1;\n",
       "obj58.userData.points = [];\n",
       "obj58.userData.points.push(new PMPoint(0.928571, -0.371154, 0.0122449));\n",
       "obj58.userData.points.push(new PMPoint(0.986486, -0.163843, 0.000273923));\n",
       "obj58.userData.points.push(new PMPoint(0.973684, -0.227901, 6.49238e-05));\n",
       "\n",
       "obj58.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj58.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj58.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj58.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj58.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj58.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj58);\n",
       "scene.add(obj58);\n",
       "\n",
       "var obj59 = new THREE.Object3D();\n",
       "obj59.name = \"unnamed__60\";\n",
       "obj59.userData.explodable = 1;\n",
       "obj59.userData.points = [];\n",
       "obj59.userData.points.push(new PMPoint(1, 0, 0.00416667));\n",
       "obj59.userData.points.push(new PMPoint(0.986486, -0.163843, 0.000273923));\n",
       "obj59.userData.points.push(new PMPoint(0.994505, -0.104684, 7.2455e-05));\n",
       "\n",
       "obj59.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj59.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj59.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj59.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj59.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj59.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj59);\n",
       "scene.add(obj59);\n",
       "\n",
       "var obj60 = new THREE.Object3D();\n",
       "obj60.name = \"unnamed__61\";\n",
       "obj60.userData.explodable = 1;\n",
       "obj60.userData.points = [];\n",
       "obj60.userData.points.push(new PMPoint(1, 0, 0.00416667));\n",
       "obj60.userData.points.push(new PMPoint(0.973684, 0.227901, 0.00103878));\n",
       "obj60.userData.points.push(new PMPoint(0.991803, 0.127774, 0.000161247));\n",
       "\n",
       "obj60.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj60.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj60.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj60.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj60.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj60.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj60);\n",
       "scene.add(obj60);\n",
       "\n",
       "var obj61 = new THREE.Object3D();\n",
       "obj61.name = \"unnamed__62\";\n",
       "obj61.userData.explodable = 1;\n",
       "obj61.userData.points = [];\n",
       "obj61.userData.points.push(new PMPoint(0.5, 0.866025, 0.6));\n",
       "obj61.userData.points.push(new PMPoint(0.973684, 0.227901, 0.00103878));\n",
       "obj61.userData.points.push(new PMPoint(0.928571, 0.371154, 0.000765306));\n",
       "\n",
       "obj61.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj61.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj61.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj61.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj61.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj61.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj61);\n",
       "scene.add(obj61);\n",
       "\n",
       "var obj62 = new THREE.Object3D();\n",
       "obj62.name = \"unnamed__63\";\n",
       "obj62.userData.explodable = 1;\n",
       "obj62.userData.points = [];\n",
       "obj62.userData.points.push(new PMPoint(0.5, 0.866025, 0.6));\n",
       "obj62.userData.points.push(new PMPoint(-0.142857, 0.989743, 0.000765306));\n",
       "obj62.userData.points.push(new PMPoint(-0.0384616, 0.99926, 0.000394477));\n",
       "\n",
       "obj62.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj62.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj62.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj62.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj62.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj62.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj62);\n",
       "scene.add(obj62);\n",
       "\n",
       "var obj63 = new THREE.Object3D();\n",
       "obj63.name = \"unnamed__64\";\n",
       "obj63.userData.explodable = 1;\n",
       "obj63.userData.points = [];\n",
       "obj63.userData.points.push(new PMPoint(-0.289474, 0.957186, 0.00103878));\n",
       "obj63.userData.points.push(new PMPoint(-0.142857, 0.989743, 0.000765306));\n",
       "obj63.userData.points.push(new PMPoint(-0.209677, 0.977771, 6.93722e-05));\n",
       "\n",
       "obj63.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj63.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj63.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj63.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj63.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj63.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj63);\n",
       "scene.add(obj63);\n",
       "\n",
       "var obj64 = new THREE.Object3D();\n",
       "obj64.name = \"unnamed__65\";\n",
       "obj64.userData.explodable = 1;\n",
       "obj64.userData.points = [];\n",
       "obj64.userData.points.push(new PMPoint(-0.289474, 0.957186, 0.00103878));\n",
       "obj64.userData.points.push(new PMPoint(-0.385246, 0.922814, 0.000161247));\n",
       "obj64.userData.points.push(new PMPoint(-0.351351, 0.936244, 2.73923e-05));\n",
       "\n",
       "obj64.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj64.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj64.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj64.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj64.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj64.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj64);\n",
       "scene.add(obj64);\n",
       "\n",
       "var obj65 = new THREE.Object3D();\n",
       "obj65.name = \"unnamed__66\";\n",
       "obj65.userData.explodable = 1;\n",
       "obj65.userData.points = [];\n",
       "obj65.userData.points.push(new PMPoint(-0.5, 0.866025, 0.00416667));\n",
       "obj65.userData.points.push(new PMPoint(-0.385246, 0.922814, 0.000161247));\n",
       "obj65.userData.points.push(new PMPoint(-0.42126, 0.90694, 2.325e-05));\n",
       "\n",
       "obj65.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj65.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj65.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj65.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj65.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj65.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj65);\n",
       "scene.add(obj65);\n",
       "\n",
       "var obj66 = new THREE.Object3D();\n",
       "obj66.name = \"unnamed__67\";\n",
       "obj66.userData.explodable = 1;\n",
       "obj66.userData.points = [];\n",
       "obj66.userData.points.push(new PMPoint(-0.5, 0.866025, 0.00416667));\n",
       "obj66.userData.points.push(new PMPoint(-0.587912, 0.808925, 7.2455e-05));\n",
       "obj66.userData.points.push(new PMPoint(-0.565089, 0.82503, 1.31298e-05));\n",
       "\n",
       "obj66.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj66.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj66.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj66.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj66.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj66.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj66);\n",
       "scene.add(obj66);\n",
       "\n",
       "var obj67 = new THREE.Object3D();\n",
       "obj67.name = \"unnamed__68\";\n",
       "obj67.userData.explodable = 1;\n",
       "obj67.userData.points = [];\n",
       "obj67.userData.points.push(new PMPoint(-0.635135, 0.772401, 0.000273923));\n",
       "obj67.userData.points.push(new PMPoint(-0.587912, 0.808925, 7.2455e-05));\n",
       "obj67.userData.points.push(new PMPoint(-0.606557, 0.79504, 0));\n",
       "\n",
       "obj67.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj67.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj67.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj67.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj67.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj67.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj67);\n",
       "scene.add(obj67);\n",
       "\n",
       "var obj68 = new THREE.Object3D();\n",
       "obj68.name = \"unnamed__69\";\n",
       "obj68.userData.explodable = 1;\n",
       "obj68.userData.points = [];\n",
       "obj68.userData.points.push(new PMPoint(-0.635135, 0.772401, 0.000273923));\n",
       "obj68.userData.points.push(new PMPoint(-0.684211, 0.729285, 6.49238e-05));\n",
       "obj68.userData.points.push(new PMPoint(-0.664384, 0.747392, 1.25102e-05));\n",
       "\n",
       "obj68.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj68.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj68.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj68.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj68.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj68.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj68);\n",
       "scene.add(obj68);\n",
       "\n",
       "var obj69 = new THREE.Object3D();\n",
       "obj69.name = \"unnamed__70\";\n",
       "obj69.userData.explodable = 1;\n",
       "obj69.userData.points = [];\n",
       "obj69.userData.points.push(new PMPoint(-0.785714, 0.61859, 0.0122449));\n",
       "obj69.userData.points.push(new PMPoint(-0.684211, 0.729285, 6.49238e-05));\n",
       "obj69.userData.points.push(new PMPoint(-0.709302, 0.704904, 3.60555e-05));\n",
       "\n",
       "obj69.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj69.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj69.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj69.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj69.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj69.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj69);\n",
       "scene.add(obj69);\n",
       "\n",
       "var obj70 = new THREE.Object3D();\n",
       "obj70.name = \"unnamed__71\";\n",
       "obj70.userData.explodable = 1;\n",
       "obj70.userData.points = [];\n",
       "obj70.userData.points.push(new PMPoint(-0.785714, 0.61859, 0.0122449));\n",
       "obj70.userData.points.push(new PMPoint(-0.860825, 0.508902, 6.37687e-05));\n",
       "obj70.userData.points.push(new PMPoint(-0.846154, 0.532939, 1.54093e-05));\n",
       "\n",
       "obj70.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj70.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj70.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj70.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj70.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj70.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj70);\n",
       "scene.add(obj70);\n",
       "\n",
       "var obj71 = new THREE.Object3D();\n",
       "obj71.name = \"unnamed__72\";\n",
       "obj71.userData.explodable = 1;\n",
       "obj71.userData.points = [];\n",
       "obj71.userData.points.push(new PMPoint(-0.884615, 0.466321, 0.000138683));\n",
       "obj71.userData.points.push(new PMPoint(-0.860825, 0.508902, 6.37687e-05));\n",
       "obj71.userData.points.push(new PMPoint(-0.871134, 0.491045, 0));\n",
       "\n",
       "obj71.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj71.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj71.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj71.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj71.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj71.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj71);\n",
       "scene.add(obj71);\n",
       "\n",
       "var obj72 = new THREE.Object3D();\n",
       "obj72.name = \"unnamed__73\";\n",
       "obj72.userData.explodable = 1;\n",
       "obj72.userData.points = [];\n",
       "obj72.userData.points.push(new PMPoint(-0.884615, 0.466321, 0.000138683));\n",
       "obj72.userData.points.push(new PMPoint(-0.902878, 0.429897, 3.10543e-05));\n",
       "obj72.userData.points.push(new PMPoint(-0.896122, 0.443808, 0));\n",
       "\n",
       "obj72.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj72.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj72.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj72.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj72.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj72.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj72);\n",
       "scene.add(obj72);\n",
       "\n",
       "var obj73 = new THREE.Object3D();\n",
       "obj73.name = \"unnamed__74\";\n",
       "obj73.userData.explodable = 1;\n",
       "obj73.userData.points = [];\n",
       "obj73.userData.points.push(new PMPoint(-0.928571, 0.371154, 0.00085034));\n",
       "obj73.userData.points.push(new PMPoint(-0.902878, 0.429897, 3.10543e-05));\n",
       "obj73.userData.points.push(new PMPoint(-0.910448, 0.413624, 0));\n",
       "\n",
       "obj73.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj73.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj73.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj73.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj73.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj73.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj73);\n",
       "scene.add(obj73);\n",
       "\n",
       "var obj74 = new THREE.Object3D();\n",
       "obj74.name = \"unnamed__75\";\n",
       "obj74.userData.explodable = 1;\n",
       "obj74.userData.points = [];\n",
       "obj74.userData.points.push(new PMPoint(-0.928571, 0.371154, 0.00085034));\n",
       "obj74.userData.points.push(new PMPoint(-0.951613, 0.307299, 2.43887e-05));\n",
       "obj74.userData.points.push(new PMPoint(-0.945344, 0.326074, 0));\n",
       "\n",
       "obj74.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj74.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj74.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj74.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj74.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj74.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj74);\n",
       "scene.add(obj74);\n",
       "\n",
       "var obj75 = new THREE.Object3D();\n",
       "obj75.name = \"unnamed__76\";\n",
       "obj75.userData.explodable = 1;\n",
       "obj75.userData.points = [];\n",
       "obj75.userData.points.push(new PMPoint(-0.965116, 0.261822, 0.0003245));\n",
       "obj75.userData.points.push(new PMPoint(-0.951613, 0.307299, 2.43887e-05));\n",
       "obj75.userData.points.push(new PMPoint(-0.956869, 0.29052, 0));\n",
       "\n",
       "obj75.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj75.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj75.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj75.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj75.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj75.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj75);\n",
       "scene.add(obj75);\n",
       "\n",
       "var obj76 = new THREE.Object3D();\n",
       "obj76.name = \"unnamed__77\";\n",
       "obj76.userData.explodable = 1;\n",
       "obj76.userData.points = [];\n",
       "obj76.userData.points.push(new PMPoint(-0.965116, 0.261822, 0.0003245));\n",
       "obj76.userData.points.push(new PMPoint(-0.979452, 0.201677, 7.03697e-05));\n",
       "obj76.userData.points.push(new PMPoint(-0.973684, 0.227901, 1.1542e-05));\n",
       "\n",
       "obj76.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj76.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj76.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj76.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj76.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj76.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj76);\n",
       "scene.add(obj76);\n",
       "\n",
       "var obj77 = new THREE.Object3D();\n",
       "obj77.name = \"unnamed__78\";\n",
       "obj77.userData.explodable = 1;\n",
       "obj77.userData.points = [];\n",
       "obj77.userData.points.push(new PMPoint(-1, 0, 0.0375));\n",
       "obj77.userData.points.push(new PMPoint(-0.979452, 0.201677, 7.03697e-05));\n",
       "obj77.userData.points.push(new PMPoint(-0.986486, 0.163843, 3.04358e-05));\n",
       "\n",
       "obj77.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj77.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj77.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj77.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj77.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj77.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj77);\n",
       "scene.add(obj77);\n",
       "\n",
       "var obj78 = new THREE.Object3D();\n",
       "obj78.name = \"unnamed__79\";\n",
       "obj78.userData.explodable = 1;\n",
       "obj78.userData.points = [];\n",
       "obj78.userData.points.push(new PMPoint(-1, 0, 0.0375));\n",
       "obj78.userData.points.push(new PMPoint(-0.983516, -0.180818, 4.52844e-05));\n",
       "obj78.userData.points.push(new PMPoint(-0.988722, -0.149764, 2.11996e-05));\n",
       "\n",
       "obj78.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj78.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj78.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj78.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj78.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj78.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj78);\n",
       "scene.add(obj78);\n",
       "\n",
       "var obj79 = new THREE.Object3D();\n",
       "obj79.name = \"unnamed__80\";\n",
       "obj79.userData.explodable = 1;\n",
       "obj79.userData.points = [];\n",
       "obj79.userData.points.push(new PMPoint(-0.973684, -0.227901, 0.000184672));\n",
       "obj79.userData.points.push(new PMPoint(-0.983516, -0.180818, 4.52844e-05));\n",
       "obj79.userData.points.push(new PMPoint(-0.979452, -0.201677, 0));\n",
       "\n",
       "obj79.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj79.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj79.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj79.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj79.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj79.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj79);\n",
       "scene.add(obj79);\n",
       "\n",
       "var obj80 = new THREE.Object3D();\n",
       "obj80.name = \"unnamed__81\";\n",
       "obj80.userData.explodable = 1;\n",
       "obj80.userData.points = [];\n",
       "obj80.userData.points.push(new PMPoint(-0.973684, -0.227901, 0.000184672));\n",
       "obj80.userData.points.push(new PMPoint(-0.965116, -0.261822, 1.26758e-05));\n",
       "obj80.userData.points.push(new PMPoint(-0.968384, -0.249464, 0));\n",
       "\n",
       "obj80.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj80.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj80.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj80.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj80.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj80.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj80);\n",
       "scene.add(obj80);\n",
       "\n",
       "var obj81 = new THREE.Object3D();\n",
       "obj81.name = \"unnamed__82\";\n",
       "obj81.userData.explodable = 1;\n",
       "obj81.userData.points = [];\n",
       "obj81.userData.points.push(new PMPoint(-0.951613, -0.307299, 0.000390218));\n",
       "obj81.userData.points.push(new PMPoint(-0.965116, -0.261822, 1.26758e-05));\n",
       "obj81.userData.points.push(new PMPoint(-0.961318, -0.275441, 0));\n",
       "\n",
       "obj81.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj81.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj81.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj81.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj81.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj81.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj81);\n",
       "scene.add(obj81);\n",
       "\n",
       "var obj82 = new THREE.Object3D();\n",
       "obj82.name = \"unnamed__83\";\n",
       "obj82.userData.explodable = 1;\n",
       "obj82.userData.points = [];\n",
       "obj82.userData.points.push(new PMPoint(-0.951613, -0.307299, 0.000390218));\n",
       "obj82.userData.points.push(new PMPoint(-0.937788, -0.347208, 1.27418e-05));\n",
       "obj82.userData.points.push(new PMPoint(-0.941748, -0.336321, 0));\n",
       "\n",
       "obj82.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj82.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj82.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj82.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj82.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj82.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj82);\n",
       "scene.add(obj82);\n",
       "\n",
       "var obj83 = new THREE.Object3D();\n",
       "obj83.name = \"unnamed__84\";\n",
       "obj83.userData.explodable = 1;\n",
       "obj83.userData.points = [];\n",
       "obj83.userData.points.push(new PMPoint(-0.928571, -0.371154, 5.31463e-05));\n",
       "obj83.userData.points.push(new PMPoint(-0.937788, -0.347208, 1.27418e-05));\n",
       "obj83.userData.points.push(new PMPoint(-0.934326, -0.35642, 0));\n",
       "\n",
       "obj83.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj83.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj83.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj83.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj83.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj83.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj83);\n",
       "scene.add(obj83);\n",
       "\n",
       "var obj84 = new THREE.Object3D();\n",
       "obj84.name = \"unnamed__85\";\n",
       "obj84.userData.explodable = 1;\n",
       "obj84.userData.points = [];\n",
       "obj84.userData.points.push(new PMPoint(-0.928571, -0.371154, 5.31463e-05));\n",
       "obj84.userData.points.push(new PMPoint(-0.917178, -0.398478, 2.25827e-05));\n",
       "obj84.userData.points.push(new PMPoint(-0.922037, -0.387101, 0));\n",
       "\n",
       "obj84.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj84.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj84.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj84.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj84.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj84.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj84);\n",
       "scene.add(obj84);\n",
       "\n",
       "var obj85 = new THREE.Object3D();\n",
       "obj85.name = \"unnamed__86\";\n",
       "obj85.userData.explodable = 1;\n",
       "obj85.userData.points = [];\n",
       "obj85.userData.points.push(new PMPoint(-0.884615, -0.466321, 0.0035503));\n",
       "obj85.userData.points.push(new PMPoint(-0.917178, -0.398478, 2.25827e-05));\n",
       "obj85.userData.points.push(new PMPoint(-0.910448, -0.413624, 0));\n",
       "\n",
       "obj85.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj85.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj85.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj85.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj85.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj85.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj85);\n",
       "scene.add(obj85);\n",
       "\n",
       "var obj86 = new THREE.Object3D();\n",
       "obj86.name = \"unnamed__87\";\n",
       "obj86.userData.explodable = 1;\n",
       "obj86.userData.points = [];\n",
       "obj86.userData.points.push(new PMPoint(-0.884615, -0.466321, 0.0035503));\n",
       "obj86.userData.points.push(new PMPoint(-0.846154, -0.532939, 1.54093e-05));\n",
       "obj86.userData.points.push(new PMPoint(-0.855212, -0.518278, 0));\n",
       "\n",
       "obj86.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj86.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj86.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj86.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj86.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj86.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj86);\n",
       "scene.add(obj86);\n",
       "\n",
       "var obj87 = new THREE.Object3D();\n",
       "obj87.name = \"unnamed__88\";\n",
       "obj87.userData.explodable = 1;\n",
       "obj87.userData.points = [];\n",
       "obj87.userData.points.push(new PMPoint(-0.829114, -0.55908, 6.00865e-05));\n",
       "obj87.userData.points.push(new PMPoint(-0.846154, -0.532939, 1.54093e-05));\n",
       "obj87.userData.points.push(new PMPoint(-0.839169, -0.543872, 0));\n",
       "\n",
       "obj87.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj87.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj87.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj87.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj87.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj87.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj87);\n",
       "scene.add(obj87);\n",
       "\n",
       "var obj88 = new THREE.Object3D();\n",
       "obj88.name = \"unnamed__89\";\n",
       "obj88.userData.explodable = 1;\n",
       "obj88.userData.points = [];\n",
       "obj88.userData.points.push(new PMPoint(-0.829114, -0.55908, 6.00865e-05));\n",
       "obj88.userData.points.push(new PMPoint(-0.813433, -0.581659, 1.48511e-05));\n",
       "obj88.userData.points.push(new PMPoint(-0.819549, -0.573009, 0));\n",
       "\n",
       "obj88.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj88.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj88.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj88.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj88.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj88.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj88);\n",
       "scene.add(obj88);\n",
       "\n",
       "var obj89 = new THREE.Object3D();\n",
       "obj89.name = \"unnamed__90\";\n",
       "obj89.userData.explodable = 1;\n",
       "obj89.userData.points = [];\n",
       "obj89.userData.points.push(new PMPoint(-0.785714, -0.61859, 0.000765306));\n",
       "obj89.userData.points.push(new PMPoint(-0.813433, -0.581659, 1.48511e-05));\n",
       "obj89.userData.points.push(new PMPoint(-0.806069, -0.591822, 0));\n",
       "\n",
       "obj89.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj89.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj89.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj89.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj89.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj89.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj89);\n",
       "scene.add(obj89);\n",
       "\n",
       "var obj90 = new THREE.Object3D();\n",
       "obj90.name = \"unnamed__91\";\n",
       "obj90.userData.explodable = 1;\n",
       "obj90.userData.points = [];\n",
       "obj90.userData.points.push(new PMPoint(-0.785714, -0.61859, 0.000765306));\n",
       "obj90.userData.points.push(new PMPoint(-0.751656, -0.659556, 2.63146e-05));\n",
       "obj90.userData.points.push(new PMPoint(-0.762136, -0.647417, 0));\n",
       "\n",
       "obj90.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj90.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj90.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj90.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj90.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj90.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj90);\n",
       "scene.add(obj90);\n",
       "\n",
       "var obj91 = new THREE.Object3D();\n",
       "obj91.name = \"unnamed__92\";\n",
       "obj91.userData.explodable = 1;\n",
       "obj91.userData.points = [];\n",
       "obj91.userData.points.push(new PMPoint(-0.72449, -0.689286, 0.000156185));\n",
       "obj91.userData.points.push(new PMPoint(-0.751656, -0.659556, 2.63146e-05));\n",
       "obj91.userData.points.push(new PMPoint(-0.741936, -0.670471, 0));\n",
       "\n",
       "obj91.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj91.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj91.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj91.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj91.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj91.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj91);\n",
       "scene.add(obj91);\n",
       "\n",
       "var obj92 = new THREE.Object3D();\n",
       "obj92.name = \"unnamed__93\";\n",
       "obj92.userData.explodable = 1;\n",
       "obj92.userData.points = [];\n",
       "obj92.userData.points.push(new PMPoint(-0.72449, -0.689286, 0.000156185));\n",
       "obj92.userData.points.push(new PMPoint(-0.684211, -0.729285, 0.000103878));\n",
       "obj92.userData.points.push(new PMPoint(-0.702429, -0.711754, 0));\n",
       "\n",
       "obj92.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj92.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj92.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj92.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj92.userData.facets = [[1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj92.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj92);\n",
       "scene.add(obj92);\n",
       "\n",
       "var obj93 = new THREE.Object3D();\n",
       "obj93.name = \"unnamed__94\";\n",
       "obj93.userData.explodable = 1;\n",
       "obj93.userData.points = [];\n",
       "obj93.userData.points.push(new PMPoint(-0.5, -0.866025, 0.0666667));\n",
       "obj93.userData.points.push(new PMPoint(-0.684211, -0.729285, 0.000103878));\n",
       "obj93.userData.points.push(new PMPoint(-0.655963, -0.754793, 5.05008e-05));\n",
       "\n",
       "obj93.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj93.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj93.userData.edgeindices = [0, 1, 0, 2, 1, 2];\n",
       "   <!-- Edge style -->\n",
       "obj93.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj93.userData.facets = [[0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj93.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj93);\n",
       "scene.add(obj93);\n",
       "\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "function textSpriteMaterial(message, parameters) {\n",
       "    if ( parameters === undefined ) parameters = {};\n",
       "    var fontface = \"Helvetica\";\n",
       "    var fontsize = parameters.hasOwnProperty(\"fontsize\") ? parameters[\"fontsize\"] : 15;\n",
       "    fontsize = fontsize*10;\n",
       "    var lines = message.split('\\\\n');\n",
       "    var size = 512;\n",
       "    for(var i = 0; i<lines.length; i++){\n",
       "        var tmp = lines[i].length;\n",
       "        while(tmp*fontsize > size){\n",
       "           fontsize--;\n",
       "        }\n",
       "    }\n",
       "    \n",
       "    var canvas = document.createElement('canvas');\n",
       "    canvas.width = size;\n",
       "    canvas.height = size;\n",
       "    var context = canvas.getContext('2d');\n",
       "    context.fillStyle = \"rgba(255, 255, 255, 0)\";\n",
       "    context.fill();\n",
       "    context.font = fontsize + \"px \" + fontface;\n",
       "    \n",
       "    // text color\n",
       "    context.fillStyle = \"rgba(0, 0, 0, 1.0)\";\n",
       "     for(var i = 0; i<lines.length; i++){\n",
       "        context.fillText(lines[i], size/2, size/2+i*fontsize);\n",
       "     }\n",
       "    \n",
       "    // canvas contents will be used for a texture\n",
       "    var texture = new THREE.Texture(canvas);\n",
       "    texture.needsUpdate = true;\n",
       "    \n",
       "    var spriteMaterial = new THREE.SpriteMaterial({map: texture, depthTest: true, depthWrite: false, polygonOffset: true, polygonOffsetFactor: -1, polygonOffsetUnits: 1 });\n",
       "    return spriteMaterial;\n",
       "}\n",
       "\n",
       "\n",
       "// ---------------------- INITIALIZING OBJECTS--------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "function init_object(obj) {\n",
       "    if (obj.userData.hasOwnProperty(\"pointmaterial\")) {\n",
       "        init_points(obj);\n",
       "        modelContains.points = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"pointlabels\")) {\n",
       "        init_pointlabels(obj);\n",
       "        modelContains.pointlabels = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"edgematerial\")) {\n",
       "        init_lines(obj);\n",
       "        modelContains.lines = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"edgelabels\")) {\n",
       "        init_edgelabels(obj);\n",
       "        modelContains.edgelabels = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"arrowstyle\")) {\n",
       "        init_arrowheads(obj);\n",
       "        modelContains.arrowheads = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"facetmaterial\")) {\n",
       "        init_faces(obj);\n",
       "        modelContains.faces = true;\n",
       "    }\n",
       "}\n",
       "\n",
       "function init_points(obj) {\n",
       "    var pointgroup = new THREE.Group();\n",
       "    pointgroup.name = \"points\";\n",
       "    var points = obj.userData.points;\n",
       "    var radii = obj.userData.pointradii;\n",
       "    var materials = obj.userData.pointmaterial;\n",
       "    var geometry,material;\n",
       "    if (!Array.isArray(radii)) {\n",
       "        geometry = new THREE.SphereBufferGeometry(radii);  \n",
       "    }\n",
       "    if (!Array.isArray(materials)) {\n",
       "        material = materials;\n",
       "    }\n",
       "    for (var i=0; i<points.length; i++) {\n",
       "        var point = points[i];\n",
       "        if (Array.isArray(radii)) {\n",
       "            if (radii[i] == 0) {\n",
       "                continue;\n",
       "            }\n",
       "            geometry = new THREE.SphereBufferGeometry(radii[i]);  \n",
       "        } \n",
       "        if (Array.isArray(materials)) {\n",
       "            material = materials[i];     \n",
       "        } \n",
       "        var sphere = new THREE.Mesh(geometry, material);\n",
       "        point.addSphere(sphere);\n",
       "        pointgroup.add(sphere);\n",
       "    }\n",
       "    obj.add(pointgroup);\n",
       "}\n",
       "\n",
       "function init_pointlabels(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var labels = obj.userData.pointlabels;\n",
       "    var pointlabels = new THREE.Group();\n",
       "    pointlabels.name = \"pointlabels\";\n",
       "    if (Array.isArray(labels)) {\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "            var spriteMaterial = textSpriteMaterial( labels[i] );\n",
       "\t        var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            point.addLabel(sprite);\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    } else {\n",
       "        var spriteMaterial = textSpriteMaterial( labels );\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "\t        var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            point.addLabel(sprite);\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    }\n",
       "    obj.add(pointlabels);\n",
       "}\n",
       "\n",
       "function init_lines(obj) {\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var points = obj.userData.points;\n",
       "    var materials = obj.userData.edgematerial;\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    var bufarr = new Float32Array( obj.userData.edgeindices.length * 3 );\n",
       "    var bufattr = new THREE.Float32BufferAttribute( bufarr, 3 );\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    geometry.setAttribute('position', bufattr);\n",
       "    if (Array.isArray(materials)) {     \n",
       "        for (var i=0; i<materials.length; i++) {\n",
       "            geometry.addGroup(2*i,2,i);\n",
       "        }\n",
       "    }\n",
       "    var lines = new THREE.LineSegments(geometry, materials);\n",
       "    lines.name = \"lines\";\n",
       "    obj.add(lines);\n",
       "    updateEdgesPosition(obj);\n",
       "}\n",
       "\n",
       "function init_edgelabels(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var labels = obj.userData.edgelabels;\n",
       "    var edgelabels = new THREE.Group();\n",
       "    edgelabels.name = \"edgelabels\";\n",
       "    if (Array.isArray(labels)) {\n",
       "        for (var i=0; i<edgeindices.length; i=i+2) {\n",
       "            var point = points[i];\n",
       "            var spriteMaterial = textSpriteMaterial( labels[i] );\n",
       "            var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[i]].vector,points[edgeindices[i+1]].vector).multiplyScalar(0.5));\n",
       "            edgelabels.add(sprite);\n",
       "        }\n",
       "    } else {\n",
       "        var spriteMaterial = textSpriteMaterial( labels );\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "            var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[i]].vector,points[edgeindices[i+1]].vector).multiplyScalar(0.5));\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    }\n",
       "    obj.add(edgelabels);\n",
       "}\n",
       "\n",
       "function init_arrowheads(obj) {\n",
       "    var arrowheads = new THREE.Group();\n",
       "    arrowheads.name = \"arrowheads\";\n",
       "    var arrowstyle = obj.userData.arrowstyle;\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var edgematerials = obj.userData.edgematerial;\n",
       "    var points = obj.userData.points;\n",
       "    var material;\n",
       "    if (!Array.isArray(edgematerials)) {\n",
       "        material = new THREE.MeshBasicMaterial( {color: edgematerials.color} );\n",
       "    }\n",
       "\n",
       "    for (var i=0; i<edgeindices.length; i=i+2) {\n",
       "        var start = points[edgeindices[i]];\n",
       "        var end = points[edgeindices[i+1]];\n",
       "        var dist = start.vector.distanceTo( end.vector ) - start.radius() - end.radius();\n",
       "        if (dist <= 0) {\n",
       "            continue;\n",
       "        }\n",
       "        var dir = new THREE.Vector3().subVectors(end.vector,start.vector);\n",
       "        dir.normalize();\n",
       "        var axis = new THREE.Vector3().set(dir.z,0,-dir.x);\n",
       "        axis.normalize();\n",
       "        var radians = Math.acos( dir.y );\n",
       "        var radius = dist/25;\n",
       "        var height = dist/5;\n",
       "        var geometry = new THREE.ConeBufferGeometry(radius,height);\n",
       "        var position = new THREE.Vector3().addVectors(start.vector,dir.clone().multiplyScalar(start.radius()+dist-height/2));\n",
       "        if (Array.isArray(edgematerials)) {\n",
       "            material = new THREE.MeshBasicMaterial( {color: edgematerials[i].color} );\n",
       "        }\n",
       "        var cone = new THREE.Mesh( geometry, material );\n",
       "        cone.quaternion.setFromAxisAngle(axis,radians);;\n",
       "        cone.position.copy(position);;\n",
       "        arrowheads.add(cone);\n",
       "    }\n",
       "    obj.add(arrowheads);\n",
       "}\n",
       "\n",
       "function init_faces(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var facets = obj.userData.facets;\n",
       "    obj.userData.triangleindices = [];\n",
       "    for (var i=0; i<facets.length; i++) {\n",
       "        facet = facets[i];\n",
       "        for (var t=0; t<facet.length-2; t++) {\n",
       "            obj.userData.triangleindices.push(facet[0],facet[t+1],facet[t+2]);  \n",
       "        }\n",
       "    }\n",
       "    var bufarr = new Float32Array( obj.userData.triangleindices.length * 3 );\n",
       "    var bufattr = new THREE.Float32BufferAttribute(bufarr,3);\n",
       "    \n",
       "    var materials = obj.userData.facetmaterial;\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    geometry.setAttribute('position',bufattr);\n",
       "    if (Array.isArray(materials)) {\n",
       "        var tricount = 0;\n",
       "        var facet;\n",
       "        for (var i=0; i<facets.length; i++) {\n",
       "            facet = facets[i];\n",
       "            geometry.addGroup(tricount,(facet.length-2)*3,i);\n",
       "            tricount += (facet.length-2)*3;\n",
       "        }\n",
       "    }\n",
       "    var mesh = new THREE.Mesh(geometry, materials);\n",
       "    mesh.name = \"faces\";\n",
       "    obj.add(mesh); \n",
       "    updateFacesPosition(obj);\n",
       "}\n",
       "// //INITIALIZING\n",
       "\n",
       "\n",
       "function updateFacesPosition(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var indices = obj.userData.triangleindices;\n",
       "    var faces = obj.getObjectByName(\"faces\");\n",
       "    var ba = faces.geometry.getAttribute(\"position\");\n",
       "    for (var i=0; i<indices.length; i++) {\n",
       "        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); \n",
       "    }\n",
       "    faces.geometry.attributes.position.needsUpdate = true;\n",
       "    \n",
       "}\n",
       "\n",
       "function updateEdgesPosition(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var indices = obj.userData.edgeindices;\n",
       "    var lines = obj.getObjectByName(\"lines\");\n",
       "    var ba = lines.geometry.getAttribute(\"position\"); \n",
       "    for (var i=0; i<indices.length; i++) {\n",
       "        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); \n",
       "    }\n",
       "    lines.geometry.attributes.position.needsUpdate = true;\n",
       "}\n",
       "\n",
       "function onWindowResize() {\n",
       "    renderer.setSize( three.clientWidth, three.clientHeight );\n",
       "    svgRenderer.setSize( three.clientWidth, three.clientHeight );\n",
       "    updateCamera();\n",
       "}\n",
       "\n",
       "function updateCamera() {\n",
       "    var width = three.clientWidth;\n",
       "    var height = three.clientHeight;\n",
       "    var aspect = width / height;\n",
       "    if (camera.type == \"OrthographicCamera\") {\n",
       "        camera.left = frustumSize * aspect / - 2;\n",
       "        camera.right = frustumSize * aspect / 2;\n",
       "        camera.top = frustumSize / 2;\n",
       "        camera.bottom = - frustumSize / 2;\n",
       "    } else if (camera.type == \"PerspectiveCamera\") {\n",
       "        camera.aspect = aspect;\n",
       "    }\n",
       "    camera.updateProjectionMatrix();\n",
       "}\n",
       "\n",
       "function changeCamera(event) {\n",
       "    var selindex = event.currentTarget.selectedIndex;\n",
       "    camera = cameras[selindex];\n",
       "    control = controls[selindex];\n",
       "    control.enabled = true; \n",
       "    for (var i=0; i<controls.length; i++) {\n",
       "        if (i!=selindex) {\n",
       "            controls[i].enabled = false;\n",
       "        }\n",
       "    }\n",
       "    updateCamera();\n",
       "}\n",
       "\n",
       "var camtypenode = document.getElementById('cameraType_8');\n",
       "camtypenode.onchange = changeCamera;\n",
       "camtypenode.dispatchEvent(new Event('change'));\n",
       "\n",
       "onWindowResize();\n",
       "window.addEventListener('resize', onWindowResize);\t\n",
       "\n",
       "\n",
       "var xRotationEnabled = false;\n",
       "var yRotationEnabled = false;\n",
       "var zRotationEnabled = false;\n",
       "var rotationSpeedFactor = 1;\n",
       "var settingsShown = false;\n",
       "var labelsShown = true;\n",
       "var intervals = [];\n",
       "var timeouts = [];\n",
       "var explodingSpeed = 0.05;\n",
       "var explodeScale = 0;\n",
       "var XMLS = new XMLSerializer();\n",
       "var svgElement;\n",
       "var renderId;\n",
       "\n",
       "var render = function () {\n",
       "\n",
       "\trenderId = requestAnimationFrame(render);\n",
       "\n",
       "//\tcomment in for automatic explosion\n",
       "//\texplode(updateFactor());\n",
       "\n",
       "    var phi = 0.02 * rotationSpeedFactor;\n",
       "\n",
       "    if (xRotationEnabled) {\n",
       "        scene.rotation.x += phi;\n",
       "    }\n",
       "    if (yRotationEnabled) {\n",
       "        scene.rotation.y += phi;\n",
       "    }\n",
       "    if (zRotationEnabled) {\n",
       "        scene.rotation.z += phi;\n",
       "    }\n",
       "\n",
       "    control.update();\n",
       "    renderer.render(scene, camera);\n",
       "};\n",
       "\n",
       "if ( THREE.WEBGL.isWebGLAvailable() ) {\n",
       "\trender();\n",
       "} else {\n",
       "\tvar warning = WEBGL.getWebGLErrorMessage();\n",
       "\tthree.appendChild( warning );\n",
       "}\n",
       "    \n",
       "function changeTransparency() {\n",
       "    var opacity = 1-Number(event.currentTarget.value);\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        child = scene.children[i];\n",
       "        if ( child.userData.hasOwnProperty(\"facetmaterial\") ) {\n",
       "            if (Array.isArray(child.userData.facetmaterial)) {\n",
       "                for (var j=0; j<child.userData.facetmaterial.length; j++) {\n",
       "                    child.userData.facetmaterial[j].opacity = opacity;\n",
       "                }\n",
       "            } else {\n",
       "                child.userData.facetmaterial.opacity = opacity;\n",
       "            }    \n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function changeRotationX(event){\n",
       "    xRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "function changeRotationY(event){\n",
       "    yRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "function changeRotationZ(event){\n",
       "    zRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "\n",
       "function changeRotationSpeedFactor(event){\n",
       "    rotationSpeedFactor = Number(event.currentTarget.value);\n",
       "}\n",
       "\n",
       "function resetScene(){\n",
       "    scene.rotation.set(0,0,0);\n",
       "    camera.position.set(0,0,5);\n",
       "    camera.up.set(0,1,0);\n",
       "}\n",
       "\n",
       "function showSettings(event){\n",
       "    document.getElementById('settings_8').style.visibility = 'visible';\n",
       "    document.getElementById('showSettingsButton_8').style.visibility = 'hidden';\n",
       "    document.getElementById('hideSettingsButton_8').style.visibility = 'visible';\n",
       "    settingsShown = true;\n",
       "}\n",
       "\n",
       "function hideSettings(event){\n",
       "    document.getElementById('settings_8').style.visibility = 'hidden';\n",
       "    document.getElementById('showSettingsButton_8').style.visibility = 'visible';\n",
       "    document.getElementById('hideSettingsButton_8').style.visibility = 'hidden';\n",
       "    settingsShown = false;\n",
       "}\n",
       "\n",
       "\n",
       "\n",
       "var pos = 150* Math.PI;\n",
       "\n",
       "function updateFactor() {\n",
       "    pos++;\n",
       "    return Math.sin(.01*pos)+1;\n",
       "}\n",
       "\n",
       "// ------------------------ FOLDING ------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "// rotate point p around axis defined by points p1 and p2 by given angle\n",
       "function rotate(p, p1, p2, angle ){   \n",
       "    angle = -angle;\n",
       "    var x = p.x, y = p.y, z = p.z, \n",
       "    a = p1.x, b = p1.y, c = p1.z, \n",
       "    u = p2.x-p1.x, v = p2.y-p1.y, w = p2.z-p1.z;\n",
       "    var result = [];\n",
       "    var L = u*u + v*v + w*w;\n",
       "    var sqrt = Math.sqrt;\n",
       "    var cos = Math.cos;\n",
       "    var sin = Math.sin;\n",
       "\n",
       "    result[0] = ((a*(v*v+w*w)-u*(b*v+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*x*cos(angle)+sqrt(L)*(-c*v+b*w-w*y+v*z)*sin(angle))/L;\n",
       "    result[1] = ((b*(u*u+w*w)-v*(a*u+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*y*cos(angle)+sqrt(L)*(c*u-a*w+w*x-u*z)*sin(angle))/L;\n",
       "    result[2] = ((c*(u*u+v*v)-w*(a*u+b*v-u*x-v*y-w*z))*(1-cos(angle))+L*z*cos(angle)+sqrt(L)*(-b*u+a*v-v*x+u*y)*sin(angle))/L;\n",
       "\n",
       "    return result;\n",
       "}\n",
       "\n",
       "var fold = function(event){\n",
       "    var obj = foldables[Number(event.currentTarget.name)];\n",
       "    var foldvalue = Number(event.currentTarget.value);\n",
       "    var scale = foldvalue - obj.userData.oldscale;\n",
       "\n",
       "    for (var j=0; j<obj.userData.axes.length; j++) {\n",
       "        rotateVertices(obj, j, scale);\n",
       "    }\n",
       "    update(obj);\n",
       "    obj.userData.oldscale += scale;\n",
       "    lookAtBarycenter(obj);\n",
       "}\n",
       "\n",
       "function lookAtBarycenter(obj){\n",
       "    control.target = barycenter(obj);\n",
       "}\n",
       "\n",
       "function barycenter(obj) {\n",
       "    var center = new THREE.Vector3(0,0,0);\n",
       "    var points = obj.userData.points;\n",
       "    for (var i=0; i<points.length; i++){\n",
       "        center.add(points[i].vector);\n",
       "    }\n",
       "    center.divideScalar(points.length);\n",
       "    return center;\n",
       "}\n",
       "\n",
       "function rotateVertices(obj, edge, scale) {\n",
       "    var axes = obj.userData.axes;\n",
       "    var subtrees = obj.userData.subtrees;\n",
       "    var points = obj.userData.points;\n",
       "    var angles = obj.userData.angles;\n",
       "    if (edge < axes.length){\n",
       "        for (var j=0; j<subtrees[edge].length; j++){\n",
       "            var rotP = rotate(points[subtrees[edge][j]].vector, points[axes[edge][0]].vector,points[axes[edge][1]].vector, scale * (Math.PI - angles[edge]));\n",
       "            points[subtrees[edge][j]].set(rotP[0],rotP[1],rotP[2]);\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function update(obj) {\n",
       "   updateFacesPosition(obj);\n",
       "   updateEdgesPosition(obj);\n",
       "}\n",
       "\n",
       "if (foldables.length) {\n",
       "    var settings = document.getElementById('settings_8');\n",
       "    var foldDiv = document.createElement('div');\n",
       "    foldDiv.id = 'fold_8';\n",
       "    var title = document.createElement('strong');\n",
       "    title.innerHTML = 'Fold';\n",
       "    foldDiv.appendChild(title);\n",
       "    foldDiv.className = 'group';\n",
       "    for (var i=0; i<foldables.length; i++) {\n",
       "        var range = document.createElement('input');\n",
       "        range.type = 'range';\n",
       "        range.min = 0;\n",
       "        range.max = 1;\n",
       "        range.value = 0;\n",
       "        range.step = 0.001;\n",
       "        range.name = String(i);\n",
       "        range.oninput = fold;\n",
       "        foldDiv.appendChild(range);\n",
       "    }\n",
       "    lookAtBarycenter(foldables[0]);\n",
       "    settings.insertBefore(foldDiv,settings.childNodes[0]);\n",
       "}\n",
       "\n",
       "    \n",
       "// ---------------------- EXPLOSION ------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "if (explodableModel) {\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        obj = scene.children[i];\n",
       "        if ( obj.userData.explodable ) {\n",
       "            computeCentroid(obj);\n",
       "        }\n",
       "    }\n",
       "    document.getElementById('explodeRange_8').oninput = triggerExplode;\n",
       "    document.getElementById('explodeCheckbox_8').onchange = triggerAutomaticExplode;\n",
       "    document.getElementById('explodingSpeedRange_8').oninput = setExplodingSpeed;\n",
       "}\n",
       "\n",
       "function computeCentroid(obj) {\n",
       "    centroid = new THREE.Vector3();\n",
       "    obj.userData.points.forEach(function(pmpoint) {\n",
       "        centroid.add(pmpoint.vector);\t\t\t\n",
       "    });\n",
       "    centroid.divideScalar(obj.userData.points.length);\n",
       "    obj.userData.centroid = centroid;\n",
       "}\n",
       "\n",
       "function explode(factor) {\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        var obj = scene.children[i];\n",
       "        if (obj.userData.hasOwnProperty(\"centroid\")) { \n",
       "            var c = obj.userData.centroid;\n",
       "            obj.position.set(c.x*factor, c.y*factor, c.z*factor);\n",
       "        }\n",
       "    }\t\n",
       "}\n",
       "\n",
       "function triggerExplode(event){\n",
       "    explodeScale = Number(event.currentTarget.value);\n",
       "    explode(explodeScale);\n",
       "}\n",
       "\n",
       "function setExplodingSpeed(event){\n",
       "    explodingSpeed = Number(event.currentTarget.value);\n",
       "}\n",
       "\n",
       "function triggerAutomaticExplode(event){\n",
       "    if (event.currentTarget.checked){\n",
       "        startExploding();\n",
       "    } else {\n",
       "        clearIntervals();\n",
       "    }\t\n",
       "}\n",
       "\n",
       "function startExploding(){\n",
       "    intervals.push(setInterval(explodingInterval, 25));\n",
       "}\n",
       "\n",
       "\n",
       "function explodingInterval(){\n",
       "    explodeScale += explodingSpeed;\n",
       "    if (explodeScale <= 6){ \n",
       "        explode(explodeScale);\n",
       "    }\n",
       "    else{\n",
       "        explode(6);\n",
       "        explodeScale = 6;\n",
       "        clearIntervals();\n",
       "        timeouts.push(setTimeout(startUnexploding, 3000));\n",
       "    }\n",
       "    document.getElementById('explodeRange_8').value = explodeScale;\n",
       "}\n",
       "\n",
       "\n",
       "function startUnexploding(){\n",
       "    intervals.push(setInterval(unexplodingInterval, 25));\n",
       "}\n",
       "\n",
       "function unexplodingInterval(){\n",
       "    explodeScale -= explodingSpeed;\n",
       "    if (explodeScale >= 0){\t\n",
       "        explode(explodeScale);\n",
       "    }\n",
       "    else {\n",
       "        explode(0);\n",
       "        explodeScale = 0;\n",
       "        clearIntervals();\n",
       "        timeouts.push(setTimeout(startExploding, 3000));\n",
       "    }\n",
       "    document.getElementById('explodeRange_8').value = explodeScale;\n",
       "}\n",
       "\n",
       "function clearIntervals(){\n",
       "    intervals.forEach(function(interval){\n",
       "        clearInterval(interval);\n",
       "    });\n",
       "    intervals = [];\n",
       "    timeouts.forEach(function(timeout){\n",
       "        clearTimeout(timeout);\n",
       "    });\n",
       "    timeouts = [];\n",
       "}\n",
       "\n",
       "// ---------------------- DISPLAY --------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "const objectTypeInnerHTMLs = { points: \"Points\", pointlabels: \"Point labels\", lines: \"Edges\", edgelabels: \"Edge labels\", faces: \"Faces\", arrowheads: \"Arrow heads\" };\n",
       "const objectTypeVisible = {};\n",
       "Object.assign(objectTypeVisible,modelContains);\n",
       "const sortedObjectTypeKeys = Object.keys(objectTypeInnerHTMLs).sort();\n",
       "const shownObjectTypesList = document.getElementById('shownObjectTypesList_8');\n",
       "\n",
       "function setVisibility(bool,objname) {\n",
       "    for (var i=0; i<scene.children.length; i++){\n",
       "        var obj = scene.children[i].getObjectByName(objname);\n",
       "        if (obj) {\n",
       "            obj.visible = bool;\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function toggleObjectTypeVisibility(event){\n",
       "    var name = event.currentTarget.name;\n",
       "    var checked = event.currentTarget.checked;\n",
       "    objectTypeVisible[name] = checked;\n",
       "    setVisibility(checked,name);\n",
       "}\n",
       "\n",
       "for (var i=0; i<sortedObjectTypeKeys.length; i++){\n",
       "    var key = sortedObjectTypeKeys[i];\n",
       "    if (modelContains[key]) {\n",
       "        var objTypeNode = document.createElement('span');\n",
       "        objTypeNode.innerHTML = objectTypeInnerHTMLs[key] + '<br>';\n",
       "        var checkbox = document.createElement('input');\n",
       "        checkbox.type = 'checkbox';\n",
       "        checkbox.checked = true;\n",
       "        checkbox.name = key;\n",
       "        checkbox.onchange = toggleObjectTypeVisibility;\n",
       "        shownObjectTypesList.appendChild(checkbox);\n",
       "        shownObjectTypesList.appendChild(objTypeNode);\n",
       "    }\n",
       "}\n",
       "\n",
       "// ------------------------------------------------------\n",
       "\n",
       "function toggleObjectVisibility(event){\n",
       "    var nr = Number(event.currentTarget.name);\n",
       "    scene.children[nr].visible = event.currentTarget.checked;\n",
       "}\n",
       "\n",
       "// append checkboxes for displaying or hiding objects\n",
       "var shownObjectsList = document.getElementById('shownObjectsList_8');\n",
       "for (var i=0; i<scene.children.length; i++){\n",
       "    obj = scene.children[i];\n",
       "    var objNode = document.createElement('span');\n",
       "    objNode.innerHTML = obj.name + '<br>';\n",
       "    var checkbox = document.createElement('input');\n",
       "    checkbox.type = 'checkbox';\n",
       "    checkbox.checked = true;\n",
       "    checkbox.name = String(i);\n",
       "    checkbox.onchange = toggleObjectVisibility;\n",
       "    shownObjectsList.appendChild(checkbox);\n",
       "    shownObjectsList.appendChild(objNode);\n",
       "}\n",
       "\n",
       "// ---------------------- SVG ------------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "function takeSvgScreenshot() {\n",
       "    if (objectTypeVisible[\"pointlabels\"]) {\n",
       "        setVisibility(false,\"pointlabels\");\n",
       "    }\n",
       "    if (objectTypeVisible[\"edgelabels\"]) {\n",
       "        setVisibility(false,\"edgelabels\");\n",
       "    }\n",
       "    svgRenderer.render(scene,camera);\n",
       "    svgElement = XMLS.serializeToString(svgRenderer.domElement);\n",
       "    \n",
       "    if (objectTypeVisible[\"pointlabels\"]) {\n",
       "        setVisibility(true,\"pointlabels\");\n",
       "    }\n",
       "    if (objectTypeVisible[\"edgelabels\"]) {\n",
       "        setVisibility(true,\"edgelabels\");\n",
       "    }\n",
       "\n",
       "    if (document.getElementById('tab_8').checked){\n",
       "        //show in new tab\n",
       "        var myWindow = window.open(\"\",\"\");\n",
       "        myWindow.document.body.innerHTML = svgElement;\n",
       "    } else{\n",
       "        // download svg file \n",
       "        download(\"screenshot.svg\", svgElement);\n",
       "    }\n",
       "}\n",
       "\n",
       "function download(filename, text) {\n",
       "    var element = document.createElement('a');\n",
       "    element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));\n",
       "    element.setAttribute('download', filename);\n",
       "\n",
       "    element.style.display = 'none';\n",
       "    document.body.appendChild(element);\n",
       "\n",
       "    element.click();\n",
       "\n",
       "    document.body.removeChild(element);\n",
       "}\n",
       "\n",
       "\n",
       "document.getElementById('transparencyRange_8').oninput = changeTransparency;\n",
       "document.getElementById('changeRotationX_8').onchange = changeRotationX;\n",
       "document.getElementById('changeRotationY_8').onchange = changeRotationY;\n",
       "document.getElementById('changeRotationZ_8').onchange = changeRotationZ;\n",
       "document.getElementById('resetButton_8').onclick = resetScene;\n",
       "document.getElementById('rotationSpeedRange_8').oninput = changeRotationSpeedFactor;\n",
       "document.getElementById('takeScreenshot_8').onclick = takeSvgScreenshot;\n",
       "document.getElementById('showSettingsButton_8').onclick = showSettings;\n",
       "document.getElementById('hideSettingsButton_8').onclick = hideSettings;\n",
       "\n",
       "\n",
       "// ------------------ SHORTCUTS --------------------------------------------\n",
       "// -------------------------------------------------------------------------\n",
       "\n",
       "/**\n",
       " * http://www.openjs.com/scripts/events/keyboard_shortcuts/\n",
       " * Version : 2.01.B\n",
       " * By Binny V A\n",
       " * License : BSD\n",
       " */\n",
       "shortcut = {\n",
       "\t'all_shortcuts':{},//All the shortcuts are stored in this array\n",
       "\t'add': function(shortcut_combination,callback,opt) {\n",
       "\t\t//Provide a set of default options\n",
       "\t\tvar default_options = {\n",
       "\t\t\t'type':'keydown',\n",
       "\t\t\t'propagate':false,\n",
       "\t\t\t'disable_in_input':false,\n",
       "\t\t\t'target':document,\n",
       "\t\t\t'keycode':false\n",
       "\t\t}\n",
       "\t\tif(!opt) opt = default_options;\n",
       "\t\telse {\n",
       "\t\t\tfor(var dfo in default_options) {\n",
       "\t\t\t\tif(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo];\n",
       "\t\t\t}\n",
       "\t\t}\n",
       "\n",
       "\t\tvar ele = opt.target;\n",
       "\t\tif(typeof opt.target == 'string') ele = document.getElementById(opt.target);\n",
       "\t\tvar ths = this;\n",
       "\t\tshortcut_combination = shortcut_combination.toLowerCase();\n",
       "\n",
       "\t\t//The function to be called at keypress\n",
       "\t\tvar func = function(e) {\n",
       "\t\t\te = e || window.event;\n",
       "\t\t\t\n",
       "\t\t\tif(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields\n",
       "\t\t\t\tvar element;\n",
       "\t\t\t\tif(e.target) element=e.target;\n",
       "\t\t\t\telse if(e.srcElement) element=e.srcElement;\n",
       "\t\t\t\tif(element.nodeType==3) element=element.parentNode;\n",
       "\n",
       "\t\t\t\tif(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return;\n",
       "\t\t\t}\n",
       "\t\n",
       "\t\t\t//Find Which key is pressed\n",
       "\t\t\tif (e.keyCode) code = e.keyCode;\n",
       "\t\t\telse if (e.which) code = e.which;\n",
       "\t\t\tvar character = String.fromCharCode(code).toLowerCase();\n",
       "\t\t\t\n",
       "\t\t\tif(code == 188) character=\",\"; //If the user presses , when the type is onkeydown\n",
       "\t\t\tif(code == 190) character=\".\"; //If the user presses , when the type is onkeydown\n",
       "\n",
       "\t\t\tvar keys = shortcut_combination.split(\"+\");\n",
       "\t\t\t//Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked\n",
       "\t\t\tvar kp = 0;\n",
       "\t\t\t\n",
       "\t\t\t//Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken\n",
       "\t\t\tvar shift_nums = {\n",
       "\t\t\t\t\"`\":\"~\",\n",
       "\t\t\t\t\"1\":\"!\",\n",
       "\t\t\t\t\"2\":\"@\",\n",
       "\t\t\t\t\"3\":\"#\",\n",
       "\t\t\t\t\"4\":\"$\",\n",
       "\t\t\t\t\"5\":\"%\",\n",
       "\t\t\t\t\"6\":\"^\",\n",
       "\t\t\t\t\"7\":\"&\",\n",
       "\t\t\t\t\"8\":\"*\",\n",
       "\t\t\t\t\"9\":\"(\",\n",
       "\t\t\t\t\"0\":\")\",\n",
       "\t\t\t\t\"-\":\"_\",\n",
       "\t\t\t\t\"=\":\"+\",\n",
       "\t\t\t\t\";\":\":\",\n",
       "\t\t\t\t\"'\":\"\\\"\",\n",
       "\t\t\t\t\",\":\"<\",\n",
       "\t\t\t\t\".\":\">\",\n",
       "\t\t\t\t\"/\":\"?\",\n",
       "\t\t\t\t\"\\\\\":\"|\"\n",
       "\t\t\t}\n",
       "\t\t\t//Special Keys - and their codes\n",
       "\t\t\tvar special_keys = {\n",
       "\t\t\t\t'esc':27,\n",
       "\t\t\t\t'escape':27,\n",
       "\t\t\t\t'tab':9,\n",
       "\t\t\t\t'space':32,\n",
       "\t\t\t\t'return':13,\n",
       "\t\t\t\t'enter':13,\n",
       "\t\t\t\t'backspace':8,\n",
       "\t\n",
       "\t\t\t\t'scrolllock':145,\n",
       "\t\t\t\t'scroll_lock':145,\n",
       "\t\t\t\t'scroll':145,\n",
       "\t\t\t\t'capslock':20,\n",
       "\t\t\t\t'caps_lock':20,\n",
       "\t\t\t\t'caps':20,\n",
       "\t\t\t\t'numlock':144,\n",
       "\t\t\t\t'num_lock':144,\n",
       "\t\t\t\t'num':144,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'pause':19,\n",
       "\t\t\t\t'break':19,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'insert':45,\n",
       "\t\t\t\t'home':36,\n",
       "\t\t\t\t'delete':46,\n",
       "\t\t\t\t'end':35,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'pageup':33,\n",
       "\t\t\t\t'page_up':33,\n",
       "\t\t\t\t'pu':33,\n",
       "\t\n",
       "\t\t\t\t'pagedown':34,\n",
       "\t\t\t\t'page_down':34,\n",
       "\t\t\t\t'pd':34,\n",
       "\t\n",
       "\t\t\t\t'left':37,\n",
       "\t\t\t\t'up':38,\n",
       "\t\t\t\t'right':39,\n",
       "\t\t\t\t'down':40,\n",
       "\t\n",
       "\t\t\t\t'f1':112,\n",
       "\t\t\t\t'f2':113,\n",
       "\t\t\t\t'f3':114,\n",
       "\t\t\t\t'f4':115,\n",
       "\t\t\t\t'f5':116,\n",
       "\t\t\t\t'f6':117,\n",
       "\t\t\t\t'f7':118,\n",
       "\t\t\t\t'f8':119,\n",
       "\t\t\t\t'f9':120,\n",
       "\t\t\t\t'f10':121,\n",
       "\t\t\t\t'f11':122,\n",
       "\t\t\t\t'f12':123\n",
       "\t\t\t}\n",
       "\t\n",
       "\t\t\tvar modifiers = { \n",
       "\t\t\t\tshift: { wanted:false, pressed:false},\n",
       "\t\t\t\tctrl : { wanted:false, pressed:false},\n",
       "\t\t\t\talt  : { wanted:false, pressed:false},\n",
       "\t\t\t\tmeta : { wanted:false, pressed:false}\t//Meta is Mac specific\n",
       "\t\t\t};\n",
       "                        \n",
       "\t\t\tif(e.ctrlKey)\tmodifiers.ctrl.pressed = true;\n",
       "\t\t\tif(e.shiftKey)\tmodifiers.shift.pressed = true;\n",
       "\t\t\tif(e.altKey)\tmodifiers.alt.pressed = true;\n",
       "\t\t\tif(e.metaKey)   modifiers.meta.pressed = true;\n",
       "                        \n",
       "\t\t\tfor(var i=0; k=keys[i],i<keys.length; i++) {\n",
       "\t\t\t\t//Modifiers\n",
       "\t\t\t\tif(k == 'ctrl' || k == 'control') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.ctrl.wanted = true;\n",
       "\n",
       "\t\t\t\t} else if(k == 'shift') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.shift.wanted = true;\n",
       "\n",
       "\t\t\t\t} else if(k == 'alt') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.alt.wanted = true;\n",
       "\t\t\t\t} else if(k == 'meta') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.meta.wanted = true;\n",
       "\t\t\t\t} else if(k.length > 1) { //If it is a special key\n",
       "\t\t\t\t\tif(special_keys[k] == code) kp++;\n",
       "\t\t\t\t\t\n",
       "\t\t\t\t} else if(opt['keycode']) {\n",
       "\t\t\t\t\tif(opt['keycode'] == code) kp++;\n",
       "\n",
       "\t\t\t\t} else { //The special keys did not match\n",
       "\t\t\t\t\tif(character == k) kp++;\n",
       "\t\t\t\t\telse {\n",
       "\t\t\t\t\t\tif(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase\n",
       "\t\t\t\t\t\t\tcharacter = shift_nums[character]; \n",
       "\t\t\t\t\t\t\tif(character == k) kp++;\n",
       "\t\t\t\t\t\t}\n",
       "\t\t\t\t\t}\n",
       "\t\t\t\t}\n",
       "\t\t\t}\n",
       "\t\t\t\n",
       "\t\t\tif(kp == keys.length && \n",
       "\t\t\t\t\t\tmodifiers.ctrl.pressed == modifiers.ctrl.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.shift.pressed == modifiers.shift.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.alt.pressed == modifiers.alt.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.meta.pressed == modifiers.meta.wanted) {\n",
       "\t\t\t\tcallback(e);\n",
       "\t\n",
       "\t\t\t\tif(!opt['propagate']) { //Stop the event\n",
       "\t\t\t\t\t//e.cancelBubble is supported by IE - this will kill the bubbling process.\n",
       "\t\t\t\t\te.cancelBubble = true;\n",
       "\t\t\t\t\te.returnValue = false;\n",
       "\t\n",
       "\t\t\t\t\t//e.stopPropagation works in Firefox.\n",
       "\t\t\t\t\tif (e.stopPropagation) {\n",
       "\t\t\t\t\t\te.stopPropagation();\n",
       "\t\t\t\t\t\te.preventDefault();\n",
       "\t\t\t\t\t}\n",
       "\t\t\t\t\treturn false;\n",
       "\t\t\t\t}\n",
       "\t\t\t}\n",
       "\t\t}\n",
       "\t\tthis.all_shortcuts[shortcut_combination] = {\n",
       "\t\t\t'callback':func, \n",
       "\t\t\t'target':ele, \n",
       "\t\t\t'event': opt['type']\n",
       "\t\t};\n",
       "\t\t//Attach the function with the event\n",
       "\t\tif(ele.addEventListener) ele.addEventListener(opt['type'], func, false);\n",
       "\t\telse if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func);\n",
       "\t\telse ele['on'+opt['type']] = func;\n",
       "\t},\n",
       "\n",
       "\t//Remove the shortcut - just specify the shortcut and I will remove the binding\n",
       "\t'remove':function(shortcut_combination) {\n",
       "\t\tshortcut_combination = shortcut_combination.toLowerCase();\n",
       "\t\tvar binding = this.all_shortcuts[shortcut_combination];\n",
       "\t\tdelete(this.all_shortcuts[shortcut_combination])\n",
       "\t\tif(!binding) return;\n",
       "\t\tvar type = binding['event'];\n",
       "\t\tvar ele = binding['target'];\n",
       "\t\tvar callback = binding['callback'];\n",
       "\n",
       "\t\tif(ele.detachEvent) ele.detachEvent('on'+type, callback);\n",
       "\t\telse if(ele.removeEventListener) ele.removeEventListener(type, callback, false);\n",
       "\t\telse ele['on'+type] = false;\n",
       "\t}\n",
       "}\n",
       "\n",
       "shortcut.add(\"Alt+Left\",function() {\n",
       "\tvar event = new Event('click');\n",
       "\tif (settingsShown){\n",
       "\t\tdocument.getElementById('hideSettingsButton_8').dispatchEvent(event);\n",
       "\t} else {\n",
       "\t\tdocument.getElementById('showSettingsButton_8').dispatchEvent(event);\n",
       "\t}\n",
       "});\n",
       "\n",
       "\n",
       "// COMMON_CODE_BLOCK_END\n",
       "\n",
       "});});\n",
       "      </script>\n",
       "   </body>\n",
       "</html>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "$d0 = $s->gkz_dome(0,5);\n",
    "$d0->VISUAL(FacetColor=>'80 180 255');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### More examples can be studied via the following:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "# a torus with two cusps (6 edges)\n",
    "$T2 = new Matrix<Int>([[0,0,6,5],[0,0,1,10],[0,0,8,2],[1,0,11,4],[1,0,7,3],[1,0,9,0]]);\n",
    "\n",
    "# a sphere with four cusps (6 edges)\n",
    "$S4 = new Matrix<Int>([[1,0,2,6],[2,1,4,9],[0,2,0,11],[3,0,8,5],[1,3,1,10],[2,3,3,7]]);\n",
    "\n",
    "# a double torus with two cusps (12 edges)\n",
    "$DT2 = new Matrix<Int>([[0,0,8,10],[0,0,12,14],[0,0,16,18],[0,0,20,22],[1,0,23,2],[1,0,13,3],[1,0,9,1],[1,0,11,4],[1,0,15,6],[1,0,21,7],[1,0,17,5],[1,0,19,0]]);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To study 4-dim. secondary fans the following method is useful. It intersects the secondary fan with the 3-dim. standard simplex."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "sub norm($){\n",
    "   my $B = new Matrix(shift);\n",
    "   for (my $i = 0; $i < $B->rows(); ++$i) {\n",
    "      my $sum = 0;\n",
    "      for (my $j = 1; $j < $B->cols(); ++$j) {\n",
    "         $sum = $sum + $B->elem($i,$j);\n",
    "      }\n",
    "      $x = 1/$sum;\n",
    "      $B->row($i) = $x * $B->row($i);\n",
    "   }\n",
    "   return $B;\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "$s = new HyperbolicSurface(DCEL=>$S4,PENNER_COORDINATES=>[1,1,1,1,1,1],SPECIAL_POINT=>[1,0]);\n",
    "$f = $s->SECONDARY_FAN;\n",
    "$v = ones_vector | $f->RAYS;\n",
    "$a = norm($v);\n",
    "$b = $a->minor(All,~[0]);\n",
    "$c = ones_vector | $b;"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<!--\n",
       "polymake for knusper\n",
       "Thu Aug 27 11:35:49 2020\n",
       "pcom:pro\n",
       "-->\n",
       "\n",
       "\n",
       "<html>\n",
       "   <head>\n",
       "      <meta charset=utf-8>\n",
       "      <title>pcom:pro</title>\n",
       "      <style>\n",
       "/*\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "*/\n",
       "         html {overflow: scroll;}\n",
       "         strong{font-size: 18px;}\n",
       "         canvas { z-index: 8; }\n",
       "         input[type='radio'] {margin-left:0;}\n",
       "         input[type='checkbox'] {margin-right:7px; margin-left: 0px; padding-left:0px;}\n",
       "         .group{padding-bottom: 15px;}\n",
       "         .settings * {z-index: 11; }\n",
       "         .settings{z-index: 10; font-family: Arial, Helvetica, sans-serif; margin-left: 30px; visibility: hidden; width: 14em; height: 96%; border: solid 1px silver; padding: 2px; overflow-y: scroll; box-sizing: border-box; background-color: white; position: absolute;}\n",
       "         .indented{margin-left: 20px; margin-top: 10px; padding-bottom: 0px;} \n",
       "         .shownObjectsList{overflow: auto; max-width: 150px; max-height: 150px;}\n",
       "         .showSettingsButton{visibility: visible; z-index: 12; position: absolute }\n",
       "         .hideSettingsButton{visibility: hidden; z-index: 12; position: absolute; opacity: 0.5}\n",
       "         button{margin-left: 0; margin-top: 10px}\n",
       "         img{cursor: pointer;}\n",
       "         .suboption{padding-top: 15px;}\n",
       "         #model75723269610 { width: 100%; height: 100%; }\n",
       "         .threejs_container { width: 100%; height: 75vh;}\n",
       "         .settings{max-height: 74vh} \n",
       "         input[type=range] {\n",
       "           -webkit-appearance: none;\n",
       "           padding:0; \n",
       "           width:90%; \n",
       "           margin-left: auto;\n",
       "           margin-right: auto;\n",
       "           margin-top: 15px;\n",
       "           margin-bottom: 15px;\n",
       "           display: block;\t\n",
       "         }\n",
       "         input[type=range]:focus {\n",
       "           outline: none;\n",
       "         }\n",
       "         input[type=range]::-webkit-slider-runnable-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "           background: #E3E3E3;\n",
       "           border-radius: 0px;\n",
       "           border: 0px solid #000000;\n",
       "         }\n",
       "         input[type=range]::-webkit-slider-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "           -webkit-appearance: none;\n",
       "           margin-top: -5px;\n",
       "         }\n",
       "         input[type=range]:focus::-webkit-slider-runnable-track {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "         input[type=range]::-moz-range-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "           background: #E3E3E3;\n",
       "           border-radius: 0px;\n",
       "           border: 0px solid #000000;\n",
       "         }\n",
       "         input[type=range]::-moz-range-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "         }\n",
       "         input[type=range]::-ms-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           background: transparent;\n",
       "           border-color: transparent;\n",
       "           color: transparent;\n",
       "         }\n",
       "         input[type=range]::-ms-fill-lower {\n",
       "           background: #E3E3E3;\n",
       "           border: 0px solid #000000;\n",
       "           border-radius: 0px;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "         }\n",
       "         input[type=range]::-ms-fill-upper {\n",
       "           background: #E3E3E3;\n",
       "           border: 0px solid #000000;\n",
       "           border-radius: 0px;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "         }\n",
       "         input[type=range]::-ms-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "         }\n",
       "         input[type=range]:focus::-ms-fill-lower {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "         input[type=range]:focus::-ms-fill-upper {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "/*\n",
       "// COMMON_CODE_BLOCK_END\n",
       "*/\n",
       "\t\t</style>\n",
       "   </head>\n",
       "<body>\n",
       "   <div class='threejs_container'>\n",
       "\t\t<div id='settings_9' class='settings'>\n",
       "\t\t\t<div class=group id='explode_9'>\n",
       "\t\t\t\t<strong>Explode</strong>\n",
       "\t\t\t\t<input id='explodeRange_9' type='range' min=0 max=6 step=0.01 value=0>\n",
       "\t\t\t\t<div class=indented><input id='explodeCheckbox_9' type='checkbox'>Automatic explosion</div>\n",
       "\t\t\t\t<div class=suboption>Exploding speed</div>\n",
       "\t\t\t\t<input id='explodingSpeedRange_9' type='range' min=0 max=0.5 step=0.001 value=0.05>\n",
       "\t\t\t</div>\n",
       "\t\n",
       "\t\t\t<div class=group id='transparency_9' class='transparency'>\n",
       "\t\t\t\t<strong>Transparency</strong>\n",
       "\t\t\t\t<input id='transparencyRange_9' type='range' min=0 max=1 step=0.01 value=0>\n",
       "\t\t\t</div>\n",
       "\t\t\t\n",
       "\t\t\t<div class=group id='rotation_9'>\n",
       "\t\t\t\t<strong>Rotation</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationX_9'> x-axis</div>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationY_9'> y-axis</div>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationZ_9'> z-axis</div>\n",
       "\t\t\t\t\t<button id='resetButton_9'>Reset</button>\n",
       "\t\t\t\t</div>\n",
       "\n",
       "\t\t\t\t<div class=suboption>Rotation speed</div>\n",
       "\t\t\t\t<input id='rotationSpeedRange_9' type='range' min=0 max=5 step=0.01 value=2>\n",
       "\t\t\t</div>\n",
       "\n",
       "\n",
       "\t\t\t<div class=group id='display_9'>\n",
       "\t\t\t\t<strong>Display</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<div id='shownObjectTypesList_9' class='shownObjectsList'></div>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t\t<div class=suboption>Objects</div>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t   <div id='shownObjectsList_9' class='shownObjectsList'></div>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t</div>\n",
       "         \n",
       "         <div class=group id='camera_9'>\n",
       "            <strong>Camera</strong>\n",
       "            <div class=indented>\n",
       "               <form>\n",
       "                  <select id=\"cameraType_9\">\n",
       "                     <option value='perspective' selected> Perspective<br></option>\n",
       "                     <option value='orthographic' > Orthographic<br></option>\n",
       "                  </select>\n",
       "               </form>\n",
       "            </div>\n",
       "         </div>\n",
       "\n",
       "\t\t\t<div class=group id='svg_9'>\n",
       "\t\t\t\t<strong>SVG</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<form>\n",
       "\t\t\t\t\t\t<input type=\"radio\" name='screenshotMode' value='download' id='download_9' checked> Download<br>\n",
       "\t\t\t\t\t\t<input type=\"radio\" name='screenshotMode' value='tab' id='tab_9' > New tab<br>\n",
       "\t\t\t\t\t</form>\n",
       "\t\t\t\t\t<button id='takeScreenshot_9'>Screenshot</button>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t</div>\n",
       "\n",
       "\t\t</div>\t<!-- end of settings -->\n",
       "\t\t<img id='hideSettingsButton_9' class='hideSettingsButton' src='/kernelspecs/polymake/close.svg' width=20px\">\n",
       "\t\t<img id='showSettingsButton_9' class='showSettingsButton' src='/kernelspecs/polymake/menu.svg' width=20px\">\n",
       "<div id=\"model75723269610\"></div>\n",
       "</div>\n",
       "   <script>\n",
       "    requirejs.config({\n",
       "      paths: {\n",
       "        three: '/kernelspecs/polymake/three',\n",
       "        TrackballControls: '/kernelspecs/polymake/TrackballControls',\n",
       "        OrbitControls: '/kernelspecs/polymake/OrbitControls',\n",
       "        Projector: '/kernelspecs/polymake/Projector',\n",
       "        SVGRenderer: '/kernelspecs/polymake/SVGRenderer',\n",
       "        WEBGL: '/kernelspecs/polymake/WebGL',\n",
       "      },\n",
       "      shim: {\n",
       "        'three': { exports: 'THREE'},\n",
       "        'SVGRenderer': { deps: [ 'three' ], exports: 'THREE.SVGRenderer' },\n",
       "        'WEBGL': { deps: [ 'three' ], exports: 'THREE.WEBGL' },\n",
       "        'Projector': { deps: [ 'three' ], exports: 'THREE.Projector' },\n",
       "        'TrackballControls': { deps: [ 'three' ], exports: 'THREE.TrackballControls' },\n",
       "        'OrbitControls': { deps: [ 'three' ], exports: 'THREE.OrbitControls' },\n",
       "      }\n",
       "    });\n",
       "    \n",
       "    require(['three'],function(THREE){\n",
       "        window.THREE = THREE;\n",
       "      require(['TrackballControls', 'OrbitControls', 'Projector', 'SVGRenderer', 'WEBGL'],\n",
       "               function(TrackballControls, OrbitControls, Projector, SVGRenderer, WEBGL) {\n",
       "    THREE.TrackballControls = TrackballControls;\n",
       "    THREE.OrbitControls = OrbitControls;\n",
       "    THREE.Projector = Projector;\n",
       "    THREE.SVGRenderer = SVGRenderer;\n",
       "    THREE.WEBGL = WEBGL;\n",
       "\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "\n",
       "const intervalLength = 25; // for automatic animations\n",
       "const explodableModel = true; \n",
       "const modelContains = { points: false, pointlabels: false, lines: false, edgelabels: false, faces: false, arrowheads: false };\n",
       "const foldables = [];\n",
       "\n",
       "var three = document.getElementById(\"model75723269610\");\n",
       "var scene = new THREE.Scene();\n",
       "var renderer = new THREE.WebGLRenderer( { antialias: true } );\n",
       "var svgRenderer = new THREE.SVGRenderer( { antialias: true } );\n",
       "renderer.setPixelRatio( window.devicePixelRatio );\n",
       "renderer.setClearColor(0xFFFFFF, 1);\n",
       "svgRenderer.setClearColor(0xFFFFFF, 1);\n",
       "three.appendChild(renderer.domElement);\n",
       "\n",
       "var frustumSize = 4;\n",
       "var cameras = [new THREE.PerspectiveCamera(75, 1, 0.1, 1000), new THREE.OrthographicCamera()];\n",
       "cameras.forEach(function(cam) {\n",
       "    cam.position.set(0, 0, 5);\n",
       "    cam.lookAt(0, 0, 0);  \n",
       "    cam.up.set(0, 1, 0);         \n",
       "});\n",
       "var controls = [new THREE.TrackballControls(cameras[0], three), new THREE.OrbitControls(cameras[1], three)];\n",
       "var camera, control;\n",
       "\n",
       "controls[0].zoomSpeed = 0.2;\n",
       "controls[0].rotateSpeed = 4;\n",
       "\n",
       "\n",
       "// class to allow move points together with labels and spheres\n",
       "var PMPoint = function (x,y,z) {\n",
       "   this.vector = new THREE.Vector3(x,y,z);\n",
       "   this.sprite = null;\n",
       "   this.sphere = null;\n",
       "}\n",
       "PMPoint.prototype.addLabel = function(labelsprite) {\n",
       "   this.sprite = labelsprite;\n",
       "   this.sprite.position.copy(this.vector);\n",
       "}\n",
       "PMPoint.prototype.addSphere = function(spheremesh) {\n",
       "   this.sphere = spheremesh;\n",
       "   this.sphere.position.copy(this.vector);\n",
       "}\n",
       "PMPoint.prototype.set = function(x,y,z) {\n",
       "   this.vector.set(x,y,z);\n",
       "   if (this.sprite) {\n",
       "      this.sprite.position.copy(this.vector);\n",
       "   }\n",
       "   if (this.sphere) {\n",
       "      this.sphere.position.copy(this.vector);\n",
       "   }\n",
       "}\n",
       "PMPoint.prototype.radius = function() {\n",
       "   if (this.sphere) {\n",
       "      return this.sphere.geometry.parameters.radius;\n",
       "   } else {\n",
       "      return 0;\n",
       "   }\n",
       "};\n",
       "// select the target node\n",
       "var target = document.querySelector('#model75723269610');\n",
       "\n",
       "// create an observer instance\n",
       "var observer = new MutationObserver(function(mutations) {\n",
       "   mutations.forEach(function(mutation) {\n",
       "      if (mutation.removedNodes && mutation.removedNodes.length > 0) {\n",
       "         cancelAnimationFrame(renderId);\n",
       "         observer.disconnect();\n",
       "         console.log(\"cancelled frame \"+renderId);\n",
       "      }\n",
       "   });\n",
       "});\n",
       "\n",
       "// configuration of the observer:\n",
       "var config = { childList: true, characterData: true }\n",
       "\n",
       "// pass in the target node, as well as the observer options\n",
       "while (target) {\n",
       "   if (target.className==\"output\") {\n",
       "      observer.observe(target, config);\n",
       "      break;\n",
       "   }\n",
       "   target = target.parentNode;\n",
       "}\n",
       "\n",
       "// COMMON_CODE_BLOCK_END\n",
       "\n",
       "var obj0 = new THREE.Object3D();\n",
       "obj0.name = \"_bounded\";\n",
       "obj0.userData.explodable = 1;\n",
       "obj0.userData.points = [];\n",
       "obj0.userData.points.push(new PMPoint(6.6, 6.6, 5.6));\n",
       "obj0.userData.points.push(new PMPoint(4.6, 6.6, 4.6));\n",
       "obj0.userData.points.push(new PMPoint(1, 1, 3));\n",
       "obj0.userData.points.push(new PMPoint(1, 3, 1));\n",
       "obj0.userData.points.push(new PMPoint(0, 1, 1));\n",
       "obj0.userData.points.push(new PMPoint(1, 1, 0));\n",
       "obj0.userData.points.push(new PMPoint(0.333333, 0.333333, 0.333333));\n",
       "obj0.userData.points.push(new PMPoint(1, 0, 1));\n",
       "obj0.userData.points.push(new PMPoint(3, 1, 1));\n",
       "obj0.userData.points.push(new PMPoint(6.6, 4.6, 4.6));\n",
       "obj0.userData.points.push(new PMPoint(4.6, 4.6, 6.6));\n",
       "obj0.userData.points.push(new PMPoint(6.6, 5.6, 6.6));\n",
       "obj0.userData.points.push(new PMPoint(5.6, 6.6, 6.6));\n",
       "obj0.userData.points.push(new PMPoint(6.6, 6.6, 6.6));\n",
       "\n",
       "obj0.userData.pointradii = [0, 0, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0, 0, 0, 0, 0, 0.02];\n",
       "   <!-- Vertex style -->\n",
       "obj0.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj0.userData.edgeindices = [0, 1, 1, 3, 2, 4, 3, 4, 3, 5, 4, 6, 5, 6, 2, 7, 6, 7, 5, 8, 7, 8, 0, 9, 8, 9, 2, 10, 9, 11, 10, 11, 1, 12, 10, 12, 0, 13, 11, 13, 12, 13];\n",
       "   <!-- Edge style -->\n",
       "obj0.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj0.userData.facets = [[3, 4, 2, 10, 12, 1], [6, 4, 3, 5], [2, 4, 6, 7], [10, 2, 7, 8, 9, 11], [7, 6, 5, 8], [3, 1, 0, 9, 8, 5], [11, 9, 0, 13], [1, 12, 13, 0], [12, 10, 11, 13]];\n",
       "   <!-- Facet style -->\n",
       "obj0.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj0);\n",
       "scene.add(obj0);\n",
       "\n",
       "var obj1 = new THREE.Object3D();\n",
       "obj1.name = \"_bounded\";\n",
       "obj1.userData.explodable = 1;\n",
       "obj1.userData.points = [];\n",
       "obj1.userData.points.push(new PMPoint(1, 6.6, 4.6));\n",
       "obj1.userData.points.push(new PMPoint(4.6, 6.6, 4.6));\n",
       "obj1.userData.points.push(new PMPoint(1, 3, 1));\n",
       "obj1.userData.points.push(new PMPoint(0, 1, 1));\n",
       "obj1.userData.points.push(new PMPoint(1, 1, 3));\n",
       "obj1.userData.points.push(new PMPoint(1, 4.6, 6.6));\n",
       "obj1.userData.points.push(new PMPoint(4.6, 4.6, 6.6));\n",
       "obj1.userData.points.push(new PMPoint(5.6, 6.6, 6.6));\n",
       "obj1.userData.points.push(new PMPoint(0, 6.6, 6.6));\n",
       "\n",
       "obj1.userData.pointradii = [0, 0, 0.02, 0.02, 0.02, 0, 0, 0, 0, 0.02];\n",
       "   <!-- Vertex style -->\n",
       "obj1.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj1.userData.edgeindices = [0, 1, 0, 2, 1, 2, 2, 3, 3, 4, 4, 5, 4, 6, 5, 6, 1, 7, 6, 7, 0, 8, 3, 8, 5, 8, 7, 8];\n",
       "   <!-- Edge style -->\n",
       "obj1.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj1.userData.facets = [[4, 5, 8, 3], [6, 5, 4], [2, 0, 1], [3, 8, 0, 2], [4, 3, 2, 1, 7, 6], [8, 7, 1, 0], [8, 5, 6, 7]];\n",
       "   <!-- Facet style -->\n",
       "obj1.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj1);\n",
       "scene.add(obj1);\n",
       "\n",
       "var obj2 = new THREE.Object3D();\n",
       "obj2.name = \"unnamed__1\";\n",
       "obj2.userData.explodable = 1;\n",
       "obj2.userData.points = [];\n",
       "obj2.userData.points.push(new PMPoint(1, 1, 3));\n",
       "obj2.userData.points.push(new PMPoint(0, 1, 1));\n",
       "obj2.userData.points.push(new PMPoint(1, 0, 1));\n",
       "obj2.userData.points.push(new PMPoint(0.333333, 0.333333, 0.333333));\n",
       "obj2.userData.points.push(new PMPoint(0, 0, 1));\n",
       "\n",
       "obj2.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj2.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj2.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 0, 4, 1, 4, 2, 4, 3, 4];\n",
       "   <!-- Edge style -->\n",
       "obj2.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj2.userData.facets = [[3, 4, 1], [3, 2, 4], [0, 4, 2], [1, 4, 0], [3, 1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj2.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj2);\n",
       "scene.add(obj2);\n",
       "\n",
       "var obj3 = new THREE.Object3D();\n",
       "obj3.name = \"_bounded\";\n",
       "obj3.userData.explodable = 1;\n",
       "obj3.userData.points = [];\n",
       "obj3.userData.points.push(new PMPoint(6.6, 1, 4.6));\n",
       "obj3.userData.points.push(new PMPoint(6.6, 4.6, 4.6));\n",
       "obj3.userData.points.push(new PMPoint(3, 1, 1));\n",
       "obj3.userData.points.push(new PMPoint(1, 0, 1));\n",
       "obj3.userData.points.push(new PMPoint(1, 1, 3));\n",
       "obj3.userData.points.push(new PMPoint(4.6, 1, 6.6));\n",
       "obj3.userData.points.push(new PMPoint(4.6, 4.6, 6.6));\n",
       "obj3.userData.points.push(new PMPoint(6.6, 5.6, 6.6));\n",
       "obj3.userData.points.push(new PMPoint(6.6, 0, 6.6));\n",
       "\n",
       "obj3.userData.pointradii = [0, 0, 0.02, 0.02, 0.02, 0, 0, 0, 0, 0.02];\n",
       "   <!-- Vertex style -->\n",
       "obj3.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj3.userData.edgeindices = [0, 1, 0, 2, 1, 2, 2, 3, 3, 4, 4, 5, 4, 6, 5, 6, 1, 7, 6, 7, 0, 8, 3, 8, 5, 8, 7, 8];\n",
       "   <!-- Edge style -->\n",
       "obj3.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj3.userData.facets = [[5, 4, 3, 8], [6, 4, 5], [2, 1, 0], [8, 3, 2, 0], [3, 4, 6, 7, 1, 2], [1, 7, 8, 0], [5, 8, 7, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj3.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj3);\n",
       "scene.add(obj3);\n",
       "\n",
       "var obj4 = new THREE.Object3D();\n",
       "obj4.name = \"_bounded\";\n",
       "obj4.userData.explodable = 1;\n",
       "obj4.userData.points = [];\n",
       "obj4.userData.points.push(new PMPoint(6.6, 4.6, 1));\n",
       "obj4.userData.points.push(new PMPoint(6.6, 4.6, 4.6));\n",
       "obj4.userData.points.push(new PMPoint(3, 1, 1));\n",
       "obj4.userData.points.push(new PMPoint(1, 1, 0));\n",
       "obj4.userData.points.push(new PMPoint(1, 3, 1));\n",
       "obj4.userData.points.push(new PMPoint(4.6, 6.6, 1));\n",
       "obj4.userData.points.push(new PMPoint(4.6, 6.6, 4.6));\n",
       "obj4.userData.points.push(new PMPoint(6.6, 6.6, 5.6));\n",
       "obj4.userData.points.push(new PMPoint(6.6, 6.6, 0));\n",
       "\n",
       "obj4.userData.pointradii = [0, 0, 0.02, 0.02, 0.02, 0, 0, 0, 0, 0.02];\n",
       "   <!-- Vertex style -->\n",
       "obj4.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj4.userData.edgeindices = [0, 1, 0, 2, 1, 2, 2, 3, 3, 4, 4, 5, 4, 6, 5, 6, 1, 7, 6, 7, 0, 8, 3, 8, 5, 8, 7, 8];\n",
       "   <!-- Edge style -->\n",
       "obj4.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj4.userData.facets = [[4, 5, 8, 3], [6, 5, 4], [2, 0, 1], [3, 8, 0, 2], [4, 3, 2, 1, 7, 6], [8, 7, 1, 0], [8, 5, 6, 7]];\n",
       "   <!-- Facet style -->\n",
       "obj4.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj4);\n",
       "scene.add(obj4);\n",
       "\n",
       "var obj5 = new THREE.Object3D();\n",
       "obj5.name = \"unnamed__2\";\n",
       "obj5.userData.explodable = 1;\n",
       "obj5.userData.points = [];\n",
       "obj5.userData.points.push(new PMPoint(1, 3, 1));\n",
       "obj5.userData.points.push(new PMPoint(0, 1, 1));\n",
       "obj5.userData.points.push(new PMPoint(1, 1, 0));\n",
       "obj5.userData.points.push(new PMPoint(0.333333, 0.333333, 0.333333));\n",
       "obj5.userData.points.push(new PMPoint(0, 1, 0));\n",
       "\n",
       "obj5.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj5.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj5.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 0, 4, 1, 4, 2, 4, 3, 4];\n",
       "   <!-- Edge style -->\n",
       "obj5.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj5.userData.facets = [[3, 4, 2], [3, 1, 4], [0, 4, 1], [2, 4, 0], [3, 2, 0, 1]];\n",
       "   <!-- Facet style -->\n",
       "obj5.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj5);\n",
       "scene.add(obj5);\n",
       "\n",
       "var obj6 = new THREE.Object3D();\n",
       "obj6.name = \"unnamed__3\";\n",
       "obj6.userData.explodable = 1;\n",
       "obj6.userData.points = [];\n",
       "obj6.userData.points.push(new PMPoint(3, 1, 1));\n",
       "obj6.userData.points.push(new PMPoint(1, 0, 1));\n",
       "obj6.userData.points.push(new PMPoint(1, 1, 0));\n",
       "obj6.userData.points.push(new PMPoint(0.333333, 0.333333, 0.333333));\n",
       "obj6.userData.points.push(new PMPoint(1, 0, 0));\n",
       "\n",
       "obj6.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj6.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj6.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 0, 4, 1, 4, 2, 4, 3, 4];\n",
       "   <!-- Edge style -->\n",
       "obj6.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj6.userData.facets = [[4, 3, 2], [1, 3, 4], [0, 1, 4], [4, 2, 0], [2, 3, 1, 0]];\n",
       "   <!-- Facet style -->\n",
       "obj6.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj6);\n",
       "scene.add(obj6);\n",
       "\n",
       "var obj7 = new THREE.Object3D();\n",
       "obj7.name = \"_bounded\";\n",
       "obj7.userData.explodable = 1;\n",
       "obj7.userData.points = [];\n",
       "obj7.userData.points.push(new PMPoint(1, 1, 3));\n",
       "obj7.userData.points.push(new PMPoint(0, 1, 3));\n",
       "obj7.userData.points.push(new PMPoint(0, 1, 1));\n",
       "obj7.userData.points.push(new PMPoint(0, 6.6, 6.6));\n",
       "obj7.userData.points.push(new PMPoint(0, 4.6, 6.6));\n",
       "obj7.userData.points.push(new PMPoint(1, 4.6, 6.6));\n",
       "\n",
       "obj7.userData.pointradii = [0.02, 0.02, 0.02, 0, 0, 0, 0.02];\n",
       "   <!-- Vertex style -->\n",
       "obj7.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj7.userData.edgeindices = [0, 1, 0, 2, 1, 2, 2, 3, 1, 4, 3, 4, 0, 5, 3, 5, 4, 5];\n",
       "   <!-- Edge style -->\n",
       "obj7.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj7.userData.facets = [[4, 1, 0, 5], [2, 1, 4, 3], [0, 1, 2], [5, 0, 2, 3], [4, 5, 3]];\n",
       "   <!-- Facet style -->\n",
       "obj7.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj7);\n",
       "scene.add(obj7);\n",
       "\n",
       "var obj8 = new THREE.Object3D();\n",
       "obj8.name = \"_bounded\";\n",
       "obj8.userData.explodable = 1;\n",
       "obj8.userData.points = [];\n",
       "obj8.userData.points.push(new PMPoint(1, 1, 3));\n",
       "obj8.userData.points.push(new PMPoint(2.2, 2.2, 6.6));\n",
       "obj8.userData.points.push(new PMPoint(1, 4.6, 6.6));\n",
       "obj8.userData.points.push(new PMPoint(4.6, 4.6, 6.6));\n",
       "\n",
       "obj8.userData.pointradii = [0.02, 0, 0, 0, 0.02];\n",
       "   <!-- Vertex style -->\n",
       "obj8.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj8.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj8.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj8.userData.facets = [[0, 1, 2], [3, 1, 0], [0, 2, 3], [2, 1, 3]];\n",
       "   <!-- Facet style -->\n",
       "obj8.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj8);\n",
       "scene.add(obj8);\n",
       "\n",
       "var obj9 = new THREE.Object3D();\n",
       "obj9.name = \"_bounded\";\n",
       "obj9.userData.explodable = 1;\n",
       "obj9.userData.points = [];\n",
       "obj9.userData.points.push(new PMPoint(1, 3, 1));\n",
       "obj9.userData.points.push(new PMPoint(2.2, 6.6, 2.2));\n",
       "obj9.userData.points.push(new PMPoint(1, 6.6, 4.6));\n",
       "obj9.userData.points.push(new PMPoint(4.6, 6.6, 4.6));\n",
       "\n",
       "obj9.userData.pointradii = [0.02, 0, 0, 0, 0.02];\n",
       "   <!-- Vertex style -->\n",
       "obj9.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj9.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj9.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj9.userData.facets = [[1, 0, 2], [3, 0, 1], [2, 0, 3], [1, 2, 3]];\n",
       "   <!-- Facet style -->\n",
       "obj9.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj9);\n",
       "scene.add(obj9);\n",
       "\n",
       "var obj10 = new THREE.Object3D();\n",
       "obj10.name = \"_bounded\";\n",
       "obj10.userData.explodable = 1;\n",
       "obj10.userData.points = [];\n",
       "obj10.userData.points.push(new PMPoint(1, 3, 1));\n",
       "obj10.userData.points.push(new PMPoint(0, 3, 1));\n",
       "obj10.userData.points.push(new PMPoint(0, 1, 1));\n",
       "obj10.userData.points.push(new PMPoint(0, 6.6, 6.6));\n",
       "obj10.userData.points.push(new PMPoint(0, 6.6, 4.6));\n",
       "obj10.userData.points.push(new PMPoint(1, 6.6, 4.6));\n",
       "\n",
       "obj10.userData.pointradii = [0.02, 0.02, 0.02, 0, 0, 0, 0.02];\n",
       "   <!-- Vertex style -->\n",
       "obj10.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj10.userData.edgeindices = [0, 1, 0, 2, 1, 2, 2, 3, 1, 4, 3, 4, 0, 5, 3, 5, 4, 5];\n",
       "   <!-- Edge style -->\n",
       "obj10.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj10.userData.facets = [[1, 4, 5, 0], [3, 4, 1, 2], [1, 0, 2], [0, 5, 3, 2], [5, 4, 3]];\n",
       "   <!-- Facet style -->\n",
       "obj10.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj10);\n",
       "scene.add(obj10);\n",
       "\n",
       "var obj11 = new THREE.Object3D();\n",
       "obj11.name = \"unnamed__4\";\n",
       "obj11.userData.explodable = 1;\n",
       "obj11.userData.points = [];\n",
       "obj11.userData.points.push(new PMPoint(1, 1, 3));\n",
       "obj11.userData.points.push(new PMPoint(0, 1, 1));\n",
       "obj11.userData.points.push(new PMPoint(0, 0, 1));\n",
       "obj11.userData.points.push(new PMPoint(0, 1, 3));\n",
       "\n",
       "obj11.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj11.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj11.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj11.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj11.userData.facets = [[1, 3, 0], [2, 3, 1], [0, 3, 2], [1, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj11.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj11);\n",
       "scene.add(obj11);\n",
       "\n",
       "var obj12 = new THREE.Object3D();\n",
       "obj12.name = \"unnamed__5\";\n",
       "obj12.userData.explodable = 1;\n",
       "obj12.userData.points = [];\n",
       "obj12.userData.points.push(new PMPoint(1, 1, 3));\n",
       "obj12.userData.points.push(new PMPoint(1, 0, 1));\n",
       "obj12.userData.points.push(new PMPoint(0, 0, 1));\n",
       "obj12.userData.points.push(new PMPoint(1, 0, 3));\n",
       "\n",
       "obj12.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj12.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj12.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj12.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj12.userData.facets = [[0, 3, 1], [2, 3, 0], [1, 3, 2], [0, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj12.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj12);\n",
       "scene.add(obj12);\n",
       "\n",
       "var obj13 = new THREE.Object3D();\n",
       "obj13.name = \"unnamed__6\";\n",
       "obj13.userData.explodable = 1;\n",
       "obj13.userData.points = [];\n",
       "obj13.userData.points.push(new PMPoint(0, 1, 1));\n",
       "obj13.userData.points.push(new PMPoint(0.333333, 0.333333, 0.333333));\n",
       "obj13.userData.points.push(new PMPoint(0, 0, 1));\n",
       "obj13.userData.points.push(new PMPoint(0, 0.333333, 0.333333));\n",
       "\n",
       "obj13.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj13.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj13.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj13.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj13.userData.facets = [[3, 0, 1], [2, 0, 3], [1, 0, 2], [3, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj13.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj13);\n",
       "scene.add(obj13);\n",
       "\n",
       "var obj14 = new THREE.Object3D();\n",
       "obj14.name = \"unnamed__7\";\n",
       "obj14.userData.explodable = 1;\n",
       "obj14.userData.points = [];\n",
       "obj14.userData.points.push(new PMPoint(1, 0, 1));\n",
       "obj14.userData.points.push(new PMPoint(0.333333, 0.333333, 0.333333));\n",
       "obj14.userData.points.push(new PMPoint(0, 0, 1));\n",
       "obj14.userData.points.push(new PMPoint(0.333333, 0, 0.333333));\n",
       "\n",
       "obj14.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj14.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj14.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj14.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj14.userData.facets = [[1, 0, 3], [2, 0, 1], [3, 0, 2], [1, 3, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj14.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj14);\n",
       "scene.add(obj14);\n",
       "\n",
       "var obj15 = new THREE.Object3D();\n",
       "obj15.name = \"_bounded\";\n",
       "obj15.userData.explodable = 1;\n",
       "obj15.userData.points = [];\n",
       "obj15.userData.points.push(new PMPoint(1, 1, 3));\n",
       "obj15.userData.points.push(new PMPoint(2.2, 2.2, 6.6));\n",
       "obj15.userData.points.push(new PMPoint(4.6, 1, 6.6));\n",
       "obj15.userData.points.push(new PMPoint(4.6, 4.6, 6.6));\n",
       "\n",
       "obj15.userData.pointradii = [0.02, 0, 0, 0, 0.02];\n",
       "   <!-- Vertex style -->\n",
       "obj15.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj15.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj15.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj15.userData.facets = [[0, 1, 3], [2, 1, 0], [0, 3, 2], [3, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj15.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj15);\n",
       "scene.add(obj15);\n",
       "\n",
       "var obj16 = new THREE.Object3D();\n",
       "obj16.name = \"_bounded\";\n",
       "obj16.userData.explodable = 1;\n",
       "obj16.userData.points = [];\n",
       "obj16.userData.points.push(new PMPoint(1, 1, 3));\n",
       "obj16.userData.points.push(new PMPoint(1, 0, 3));\n",
       "obj16.userData.points.push(new PMPoint(1, 0, 1));\n",
       "obj16.userData.points.push(new PMPoint(6.6, 0, 6.6));\n",
       "obj16.userData.points.push(new PMPoint(4.6, 0, 6.6));\n",
       "obj16.userData.points.push(new PMPoint(4.6, 1, 6.6));\n",
       "\n",
       "obj16.userData.pointradii = [0.02, 0.02, 0.02, 0, 0, 0, 0.02];\n",
       "   <!-- Vertex style -->\n",
       "obj16.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj16.userData.edgeindices = [0, 1, 0, 2, 1, 2, 2, 3, 1, 4, 3, 4, 0, 5, 3, 5, 4, 5];\n",
       "   <!-- Edge style -->\n",
       "obj16.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj16.userData.facets = [[0, 1, 4, 5], [2, 1, 0], [4, 1, 2, 3], [0, 5, 3, 2], [5, 4, 3]];\n",
       "   <!-- Facet style -->\n",
       "obj16.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj16);\n",
       "scene.add(obj16);\n",
       "\n",
       "var obj17 = new THREE.Object3D();\n",
       "obj17.name = \"_bounded\";\n",
       "obj17.userData.explodable = 1;\n",
       "obj17.userData.points = [];\n",
       "obj17.userData.points.push(new PMPoint(3, 1, 1));\n",
       "obj17.userData.points.push(new PMPoint(6.6, 2.2, 2.2));\n",
       "obj17.userData.points.push(new PMPoint(6.6, 4.6, 4.6));\n",
       "obj17.userData.points.push(new PMPoint(6.6, 1, 4.6));\n",
       "\n",
       "obj17.userData.pointradii = [0.02, 0, 0, 0, 0.02];\n",
       "   <!-- Vertex style -->\n",
       "obj17.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj17.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj17.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj17.userData.facets = [[0, 2, 1], [3, 2, 0], [0, 1, 3], [1, 2, 3]];\n",
       "   <!-- Facet style -->\n",
       "obj17.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj17);\n",
       "scene.add(obj17);\n",
       "\n",
       "var obj18 = new THREE.Object3D();\n",
       "obj18.name = \"_bounded\";\n",
       "obj18.userData.explodable = 1;\n",
       "obj18.userData.points = [];\n",
       "obj18.userData.points.push(new PMPoint(3, 1, 1));\n",
       "obj18.userData.points.push(new PMPoint(3, 0, 1));\n",
       "obj18.userData.points.push(new PMPoint(1, 0, 1));\n",
       "obj18.userData.points.push(new PMPoint(6.6, 0, 6.6));\n",
       "obj18.userData.points.push(new PMPoint(6.6, 0, 4.6));\n",
       "obj18.userData.points.push(new PMPoint(6.6, 1, 4.6));\n",
       "\n",
       "obj18.userData.pointradii = [0.02, 0.02, 0.02, 0, 0, 0, 0.02];\n",
       "   <!-- Vertex style -->\n",
       "obj18.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj18.userData.edgeindices = [0, 1, 0, 2, 1, 2, 2, 3, 1, 4, 3, 4, 0, 5, 3, 5, 4, 5];\n",
       "   <!-- Edge style -->\n",
       "obj18.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj18.userData.facets = [[1, 0, 5, 4], [2, 0, 1], [1, 4, 3, 2], [5, 0, 2, 3], [4, 5, 3]];\n",
       "   <!-- Facet style -->\n",
       "obj18.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj18);\n",
       "scene.add(obj18);\n",
       "\n",
       "var obj19 = new THREE.Object3D();\n",
       "obj19.name = \"_bounded\";\n",
       "obj19.userData.explodable = 1;\n",
       "obj19.userData.points = [];\n",
       "obj19.userData.points.push(new PMPoint(1, 3, 1));\n",
       "obj19.userData.points.push(new PMPoint(2.2, 6.6, 2.2));\n",
       "obj19.userData.points.push(new PMPoint(4.6, 6.6, 4.6));\n",
       "obj19.userData.points.push(new PMPoint(4.6, 6.6, 1));\n",
       "\n",
       "obj19.userData.pointradii = [0.02, 0, 0, 0, 0.02];\n",
       "   <!-- Vertex style -->\n",
       "obj19.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj19.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj19.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj19.userData.facets = [[0, 2, 1], [3, 2, 0], [0, 1, 3], [1, 2, 3]];\n",
       "   <!-- Facet style -->\n",
       "obj19.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj19);\n",
       "scene.add(obj19);\n",
       "\n",
       "var obj20 = new THREE.Object3D();\n",
       "obj20.name = \"_bounded\";\n",
       "obj20.userData.explodable = 1;\n",
       "obj20.userData.points = [];\n",
       "obj20.userData.points.push(new PMPoint(3, 1, 1));\n",
       "obj20.userData.points.push(new PMPoint(6.6, 2.2, 2.2));\n",
       "obj20.userData.points.push(new PMPoint(6.6, 4.6, 4.6));\n",
       "obj20.userData.points.push(new PMPoint(6.6, 4.6, 1));\n",
       "\n",
       "obj20.userData.pointradii = [0.02, 0, 0, 0, 0.02];\n",
       "   <!-- Vertex style -->\n",
       "obj20.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj20.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj20.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj20.userData.facets = [[0, 2, 3], [1, 2, 0], [0, 3, 1], [3, 2, 1]];\n",
       "   <!-- Facet style -->\n",
       "obj20.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj20);\n",
       "scene.add(obj20);\n",
       "\n",
       "var obj21 = new THREE.Object3D();\n",
       "obj21.name = \"_bounded\";\n",
       "obj21.userData.explodable = 1;\n",
       "obj21.userData.points = [];\n",
       "obj21.userData.points.push(new PMPoint(1, 3, 1));\n",
       "obj21.userData.points.push(new PMPoint(1, 3, 0));\n",
       "obj21.userData.points.push(new PMPoint(1, 1, 0));\n",
       "obj21.userData.points.push(new PMPoint(6.6, 6.6, 0));\n",
       "obj21.userData.points.push(new PMPoint(4.6, 6.6, 0));\n",
       "obj21.userData.points.push(new PMPoint(4.6, 6.6, 1));\n",
       "\n",
       "obj21.userData.pointradii = [0.02, 0.02, 0.02, 0, 0, 0, 0.02];\n",
       "   <!-- Vertex style -->\n",
       "obj21.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj21.userData.edgeindices = [0, 1, 0, 2, 1, 2, 2, 3, 1, 4, 3, 4, 0, 5, 3, 5, 4, 5];\n",
       "   <!-- Edge style -->\n",
       "obj21.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj21.userData.facets = [[1, 0, 5, 4], [2, 0, 1], [5, 0, 2, 3], [1, 4, 3, 2], [4, 5, 3]];\n",
       "   <!-- Facet style -->\n",
       "obj21.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj21);\n",
       "scene.add(obj21);\n",
       "\n",
       "var obj22 = new THREE.Object3D();\n",
       "obj22.name = \"_bounded\";\n",
       "obj22.userData.explodable = 1;\n",
       "obj22.userData.points = [];\n",
       "obj22.userData.points.push(new PMPoint(3, 1, 1));\n",
       "obj22.userData.points.push(new PMPoint(3, 1, 0));\n",
       "obj22.userData.points.push(new PMPoint(1, 1, 0));\n",
       "obj22.userData.points.push(new PMPoint(6.6, 6.6, 0));\n",
       "obj22.userData.points.push(new PMPoint(6.6, 4.6, 0));\n",
       "obj22.userData.points.push(new PMPoint(6.6, 4.6, 1));\n",
       "\n",
       "obj22.userData.pointradii = [0.02, 0.02, 0.02, 0, 0, 0, 0.02];\n",
       "   <!-- Vertex style -->\n",
       "obj22.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj22.userData.edgeindices = [0, 1, 0, 2, 1, 2, 2, 3, 1, 4, 3, 4, 0, 5, 3, 5, 4, 5];\n",
       "   <!-- Edge style -->\n",
       "obj22.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj22.userData.facets = [[0, 1, 4, 5], [2, 1, 0], [0, 5, 3, 2], [4, 1, 2, 3], [5, 4, 3]];\n",
       "   <!-- Facet style -->\n",
       "obj22.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj22);\n",
       "scene.add(obj22);\n",
       "\n",
       "var obj23 = new THREE.Object3D();\n",
       "obj23.name = \"unnamed__8\";\n",
       "obj23.userData.explodable = 1;\n",
       "obj23.userData.points = [];\n",
       "obj23.userData.points.push(new PMPoint(1, 3, 1));\n",
       "obj23.userData.points.push(new PMPoint(0, 1, 1));\n",
       "obj23.userData.points.push(new PMPoint(0, 1, 0));\n",
       "obj23.userData.points.push(new PMPoint(0, 3, 1));\n",
       "\n",
       "obj23.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj23.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj23.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj23.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj23.userData.facets = [[3, 1, 0], [2, 1, 3], [0, 1, 2], [3, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj23.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj23);\n",
       "scene.add(obj23);\n",
       "\n",
       "var obj24 = new THREE.Object3D();\n",
       "obj24.name = \"unnamed__9\";\n",
       "obj24.userData.explodable = 1;\n",
       "obj24.userData.points = [];\n",
       "obj24.userData.points.push(new PMPoint(0, 1, 1));\n",
       "obj24.userData.points.push(new PMPoint(0.333333, 0.333333, 0.333333));\n",
       "obj24.userData.points.push(new PMPoint(0, 1, 0));\n",
       "obj24.userData.points.push(new PMPoint(0, 0.333333, 0.333333));\n",
       "\n",
       "obj24.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj24.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj24.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj24.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj24.userData.facets = [[2, 0, 1], [3, 0, 2], [1, 0, 3], [2, 1, 3]];\n",
       "   <!-- Facet style -->\n",
       "obj24.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj24);\n",
       "scene.add(obj24);\n",
       "\n",
       "var obj25 = new THREE.Object3D();\n",
       "obj25.name = \"unnamed__10\";\n",
       "obj25.userData.explodable = 1;\n",
       "obj25.userData.points = [];\n",
       "obj25.userData.points.push(new PMPoint(1, 3, 1));\n",
       "obj25.userData.points.push(new PMPoint(1, 1, 0));\n",
       "obj25.userData.points.push(new PMPoint(0, 1, 0));\n",
       "obj25.userData.points.push(new PMPoint(1, 3, 0));\n",
       "\n",
       "obj25.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj25.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj25.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj25.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj25.userData.facets = [[3, 0, 1], [2, 0, 3], [1, 0, 2], [3, 1, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj25.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj25);\n",
       "scene.add(obj25);\n",
       "\n",
       "var obj26 = new THREE.Object3D();\n",
       "obj26.name = \"unnamed__11\";\n",
       "obj26.userData.explodable = 1;\n",
       "obj26.userData.points = [];\n",
       "obj26.userData.points.push(new PMPoint(1, 1, 0));\n",
       "obj26.userData.points.push(new PMPoint(0.333333, 0.333333, 0.333333));\n",
       "obj26.userData.points.push(new PMPoint(0, 1, 0));\n",
       "obj26.userData.points.push(new PMPoint(0.333333, 0.333333, 0));\n",
       "\n",
       "obj26.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj26.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj26.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj26.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj26.userData.facets = [[0, 1, 3], [2, 1, 0], [3, 1, 2], [0, 3, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj26.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj26);\n",
       "scene.add(obj26);\n",
       "\n",
       "var obj27 = new THREE.Object3D();\n",
       "obj27.name = \"unnamed__12\";\n",
       "obj27.userData.explodable = 1;\n",
       "obj27.userData.points = [];\n",
       "obj27.userData.points.push(new PMPoint(1, 0, 1));\n",
       "obj27.userData.points.push(new PMPoint(0.333333, 0.333333, 0.333333));\n",
       "obj27.userData.points.push(new PMPoint(1, 0, 0));\n",
       "obj27.userData.points.push(new PMPoint(0.333333, 0, 0.333333));\n",
       "\n",
       "obj27.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj27.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj27.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj27.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj27.userData.facets = [[1, 0, 2], [3, 0, 1], [2, 0, 3], [1, 2, 3]];\n",
       "   <!-- Facet style -->\n",
       "obj27.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj27);\n",
       "scene.add(obj27);\n",
       "\n",
       "var obj28 = new THREE.Object3D();\n",
       "obj28.name = \"unnamed__13\";\n",
       "obj28.userData.explodable = 1;\n",
       "obj28.userData.points = [];\n",
       "obj28.userData.points.push(new PMPoint(3, 1, 1));\n",
       "obj28.userData.points.push(new PMPoint(1, 0, 1));\n",
       "obj28.userData.points.push(new PMPoint(1, 0, 0));\n",
       "obj28.userData.points.push(new PMPoint(3, 0, 1));\n",
       "\n",
       "obj28.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj28.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj28.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj28.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj28.userData.facets = [[0, 1, 3], [2, 1, 0], [3, 1, 2], [0, 3, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj28.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj28);\n",
       "scene.add(obj28);\n",
       "\n",
       "var obj29 = new THREE.Object3D();\n",
       "obj29.name = \"unnamed__14\";\n",
       "obj29.userData.explodable = 1;\n",
       "obj29.userData.points = [];\n",
       "obj29.userData.points.push(new PMPoint(3, 1, 1));\n",
       "obj29.userData.points.push(new PMPoint(1, 1, 0));\n",
       "obj29.userData.points.push(new PMPoint(1, 0, 0));\n",
       "obj29.userData.points.push(new PMPoint(3, 1, 0));\n",
       "\n",
       "obj29.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj29.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj29.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj29.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj29.userData.facets = [[1, 0, 3], [2, 0, 1], [3, 0, 2], [1, 3, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj29.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj29);\n",
       "scene.add(obj29);\n",
       "\n",
       "var obj30 = new THREE.Object3D();\n",
       "obj30.name = \"unnamed__15\";\n",
       "obj30.userData.explodable = 1;\n",
       "obj30.userData.points = [];\n",
       "obj30.userData.points.push(new PMPoint(1, 1, 0));\n",
       "obj30.userData.points.push(new PMPoint(0.333333, 0.333333, 0.333333));\n",
       "obj30.userData.points.push(new PMPoint(1, 0, 0));\n",
       "obj30.userData.points.push(new PMPoint(0.333333, 0.333333, 0));\n",
       "\n",
       "obj30.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj30.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj30.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj30.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj30.userData.facets = [[0, 1, 2], [3, 1, 0], [2, 1, 3], [0, 2, 3]];\n",
       "   <!-- Facet style -->\n",
       "obj30.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj30);\n",
       "scene.add(obj30);\n",
       "\n",
       "var obj31 = new THREE.Object3D();\n",
       "obj31.name = \"_bounded\";\n",
       "obj31.userData.explodable = 1;\n",
       "obj31.userData.points = [];\n",
       "obj31.userData.points.push(new PMPoint(0, 1, 3));\n",
       "obj31.userData.points.push(new PMPoint(1, 1, 3));\n",
       "obj31.userData.points.push(new PMPoint(0, 4.6, 6.6));\n",
       "obj31.userData.points.push(new PMPoint(1, 4.6, 6.6));\n",
       "obj31.userData.points.push(new PMPoint(2.2, 2.2, 6.6));\n",
       "obj31.userData.points.push(new PMPoint(0, 2.2, 6.6));\n",
       "\n",
       "obj31.userData.pointradii = [0.02, 0.02, 0, 0, 0, 0, 0.02];\n",
       "   <!-- Vertex style -->\n",
       "obj31.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj31.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 1, 4, 3, 4, 0, 5, 2, 5, 4, 5];\n",
       "   <!-- Edge style -->\n",
       "obj31.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj31.userData.facets = [[2, 0, 5], [4, 1, 3], [1, 0, 2, 3], [5, 0, 1, 4], [2, 5, 4, 3]];\n",
       "   <!-- Facet style -->\n",
       "obj31.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj31);\n",
       "scene.add(obj31);\n",
       "\n",
       "var obj32 = new THREE.Object3D();\n",
       "obj32.name = \"_bounded\";\n",
       "obj32.userData.explodable = 1;\n",
       "obj32.userData.points = [];\n",
       "obj32.userData.points.push(new PMPoint(0, 3, 1));\n",
       "obj32.userData.points.push(new PMPoint(1, 3, 1));\n",
       "obj32.userData.points.push(new PMPoint(0, 6.6, 4.6));\n",
       "obj32.userData.points.push(new PMPoint(1, 6.6, 4.6));\n",
       "obj32.userData.points.push(new PMPoint(2.2, 6.6, 2.2));\n",
       "obj32.userData.points.push(new PMPoint(0, 6.6, 2.2));\n",
       "\n",
       "obj32.userData.pointradii = [0.02, 0.02, 0, 0, 0, 0, 0.02];\n",
       "   <!-- Vertex style -->\n",
       "obj32.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj32.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 1, 4, 3, 4, 0, 5, 2, 5, 4, 5];\n",
       "   <!-- Edge style -->\n",
       "obj32.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj32.userData.facets = [[0, 2, 5], [4, 3, 1], [3, 2, 0, 1], [0, 5, 4, 1], [5, 2, 3, 4]];\n",
       "   <!-- Facet style -->\n",
       "obj32.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj32);\n",
       "scene.add(obj32);\n",
       "\n",
       "var obj33 = new THREE.Object3D();\n",
       "obj33.name = \"unnamed__16\";\n",
       "obj33.userData.explodable = 1;\n",
       "obj33.userData.points = [];\n",
       "obj33.userData.points.push(new PMPoint(1, 1, 3));\n",
       "obj33.userData.points.push(new PMPoint(0, 0, 1));\n",
       "obj33.userData.points.push(new PMPoint(0, 1, 3));\n",
       "obj33.userData.points.push(new PMPoint(1, 0, 3));\n",
       "obj33.userData.points.push(new PMPoint(0, 0, 3));\n",
       "\n",
       "obj33.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj33.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj33.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 1, 4, 2, 4, 3, 4];\n",
       "   <!-- Edge style -->\n",
       "obj33.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj33.userData.facets = [[4, 1, 3], [4, 2, 1], [0, 1, 2], [3, 1, 0], [4, 3, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj33.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj33);\n",
       "scene.add(obj33);\n",
       "\n",
       "var obj34 = new THREE.Object3D();\n",
       "obj34.name = \"unnamed__17\";\n",
       "obj34.userData.explodable = 1;\n",
       "obj34.userData.points = [];\n",
       "obj34.userData.points.push(new PMPoint(0.333333, 0.333333, 0.333333));\n",
       "obj34.userData.points.push(new PMPoint(0, 0, 1));\n",
       "obj34.userData.points.push(new PMPoint(0, 0.333333, 0.333333));\n",
       "obj34.userData.points.push(new PMPoint(0.333333, 0, 0.333333));\n",
       "obj34.userData.points.push(new PMPoint(0, 0, 0.333333));\n",
       "\n",
       "obj34.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj34.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj34.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 1, 4, 2, 4, 3, 4];\n",
       "   <!-- Edge style -->\n",
       "obj34.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj34.userData.facets = [[1, 4, 3], [2, 4, 1], [0, 2, 1], [1, 3, 0], [3, 4, 2, 0]];\n",
       "   <!-- Facet style -->\n",
       "obj34.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj34);\n",
       "scene.add(obj34);\n",
       "\n",
       "var obj35 = new THREE.Object3D();\n",
       "obj35.name = \"_bounded\";\n",
       "obj35.userData.explodable = 1;\n",
       "obj35.userData.points = [];\n",
       "obj35.userData.points.push(new PMPoint(1, 0, 3));\n",
       "obj35.userData.points.push(new PMPoint(1, 1, 3));\n",
       "obj35.userData.points.push(new PMPoint(4.6, 0, 6.6));\n",
       "obj35.userData.points.push(new PMPoint(4.6, 1, 6.6));\n",
       "obj35.userData.points.push(new PMPoint(2.2, 2.2, 6.6));\n",
       "obj35.userData.points.push(new PMPoint(2.2, 0, 6.6));\n",
       "\n",
       "obj35.userData.pointradii = [0.02, 0.02, 0, 0, 0, 0, 0.02];\n",
       "   <!-- Vertex style -->\n",
       "obj35.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj35.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 1, 4, 3, 4, 0, 5, 2, 5, 4, 5];\n",
       "   <!-- Edge style -->\n",
       "obj35.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj35.userData.facets = [[0, 2, 5], [4, 3, 1], [3, 2, 0, 1], [0, 5, 4, 1], [5, 2, 3, 4]];\n",
       "   <!-- Facet style -->\n",
       "obj35.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj35);\n",
       "scene.add(obj35);\n",
       "\n",
       "var obj36 = new THREE.Object3D();\n",
       "obj36.name = \"_bounded\";\n",
       "obj36.userData.explodable = 1;\n",
       "obj36.userData.points = [];\n",
       "obj36.userData.points.push(new PMPoint(3, 1, 1));\n",
       "obj36.userData.points.push(new PMPoint(3, 0, 1));\n",
       "obj36.userData.points.push(new PMPoint(6.6, 1, 4.6));\n",
       "obj36.userData.points.push(new PMPoint(6.6, 0, 4.6));\n",
       "obj36.userData.points.push(new PMPoint(6.6, 0, 2.2));\n",
       "obj36.userData.points.push(new PMPoint(6.6, 2.2, 2.2));\n",
       "\n",
       "obj36.userData.pointradii = [0.02, 0.02, 0, 0, 0, 0, 0.02];\n",
       "   <!-- Vertex style -->\n",
       "obj36.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj36.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 1, 4, 3, 4, 0, 5, 2, 5, 4, 5];\n",
       "   <!-- Edge style -->\n",
       "obj36.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj36.userData.facets = [[3, 1, 4], [5, 0, 2], [0, 1, 3, 2], [4, 1, 0, 5], [3, 4, 5, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj36.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj36);\n",
       "scene.add(obj36);\n",
       "\n",
       "var obj37 = new THREE.Object3D();\n",
       "obj37.name = \"_bounded\";\n",
       "obj37.userData.explodable = 1;\n",
       "obj37.userData.points = [];\n",
       "obj37.userData.points.push(new PMPoint(1, 3, 0));\n",
       "obj37.userData.points.push(new PMPoint(1, 3, 1));\n",
       "obj37.userData.points.push(new PMPoint(4.6, 6.6, 0));\n",
       "obj37.userData.points.push(new PMPoint(4.6, 6.6, 1));\n",
       "obj37.userData.points.push(new PMPoint(2.2, 6.6, 2.2));\n",
       "obj37.userData.points.push(new PMPoint(2.2, 6.6, 0));\n",
       "\n",
       "obj37.userData.pointradii = [0.02, 0.02, 0, 0, 0, 0, 0.02];\n",
       "   <!-- Vertex style -->\n",
       "obj37.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj37.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 1, 4, 3, 4, 0, 5, 2, 5, 4, 5];\n",
       "   <!-- Edge style -->\n",
       "obj37.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj37.userData.facets = [[2, 0, 5], [4, 1, 3], [1, 0, 2, 3], [5, 0, 1, 4], [2, 5, 4, 3]];\n",
       "   <!-- Facet style -->\n",
       "obj37.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj37);\n",
       "scene.add(obj37);\n",
       "\n",
       "var obj38 = new THREE.Object3D();\n",
       "obj38.name = \"_bounded\";\n",
       "obj38.userData.explodable = 1;\n",
       "obj38.userData.points = [];\n",
       "obj38.userData.points.push(new PMPoint(3, 1, 0));\n",
       "obj38.userData.points.push(new PMPoint(3, 1, 1));\n",
       "obj38.userData.points.push(new PMPoint(6.6, 4.6, 0));\n",
       "obj38.userData.points.push(new PMPoint(6.6, 4.6, 1));\n",
       "obj38.userData.points.push(new PMPoint(6.6, 2.2, 2.2));\n",
       "obj38.userData.points.push(new PMPoint(6.6, 2.2, 0));\n",
       "\n",
       "obj38.userData.pointradii = [0.02, 0.02, 0, 0, 0, 0, 0.02];\n",
       "   <!-- Vertex style -->\n",
       "obj38.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj38.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 1, 4, 3, 4, 0, 5, 2, 5, 4, 5];\n",
       "   <!-- Edge style -->\n",
       "obj38.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj38.userData.facets = [[0, 2, 5], [4, 3, 1], [3, 2, 0, 1], [0, 5, 4, 1], [5, 2, 3, 4]];\n",
       "   <!-- Facet style -->\n",
       "obj38.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj38);\n",
       "scene.add(obj38);\n",
       "\n",
       "var obj39 = new THREE.Object3D();\n",
       "obj39.name = \"unnamed__18\";\n",
       "obj39.userData.explodable = 1;\n",
       "obj39.userData.points = [];\n",
       "obj39.userData.points.push(new PMPoint(1, 3, 1));\n",
       "obj39.userData.points.push(new PMPoint(0, 1, 0));\n",
       "obj39.userData.points.push(new PMPoint(0, 3, 1));\n",
       "obj39.userData.points.push(new PMPoint(1, 3, 0));\n",
       "obj39.userData.points.push(new PMPoint(0, 3, 0));\n",
       "\n",
       "obj39.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj39.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj39.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 1, 4, 2, 4, 3, 4];\n",
       "   <!-- Edge style -->\n",
       "obj39.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj39.userData.facets = [[1, 4, 3], [2, 4, 1], [0, 2, 1], [1, 3, 0], [3, 4, 2, 0]];\n",
       "   <!-- Facet style -->\n",
       "obj39.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj39);\n",
       "scene.add(obj39);\n",
       "\n",
       "var obj40 = new THREE.Object3D();\n",
       "obj40.name = \"unnamed__19\";\n",
       "obj40.userData.explodable = 1;\n",
       "obj40.userData.points = [];\n",
       "obj40.userData.points.push(new PMPoint(0.333333, 0.333333, 0.333333));\n",
       "obj40.userData.points.push(new PMPoint(0, 1, 0));\n",
       "obj40.userData.points.push(new PMPoint(0, 0.333333, 0.333333));\n",
       "obj40.userData.points.push(new PMPoint(0.333333, 0.333333, 0));\n",
       "obj40.userData.points.push(new PMPoint(0, 0.333333, 0));\n",
       "\n",
       "obj40.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj40.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj40.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 1, 4, 2, 4, 3, 4];\n",
       "   <!-- Edge style -->\n",
       "obj40.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj40.userData.facets = [[4, 1, 3], [4, 2, 1], [0, 1, 2], [3, 1, 0], [4, 3, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj40.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj40);\n",
       "scene.add(obj40);\n",
       "\n",
       "var obj41 = new THREE.Object3D();\n",
       "obj41.name = \"unnamed__20\";\n",
       "obj41.userData.explodable = 1;\n",
       "obj41.userData.points = [];\n",
       "obj41.userData.points.push(new PMPoint(0.333333, 0.333333, 0.333333));\n",
       "obj41.userData.points.push(new PMPoint(1, 0, 0));\n",
       "obj41.userData.points.push(new PMPoint(0.333333, 0, 0.333333));\n",
       "obj41.userData.points.push(new PMPoint(0.333333, 0.333333, 0));\n",
       "obj41.userData.points.push(new PMPoint(0.333333, 0, 0));\n",
       "\n",
       "obj41.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj41.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj41.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 1, 4, 2, 4, 3, 4];\n",
       "   <!-- Edge style -->\n",
       "obj41.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj41.userData.facets = [[1, 4, 3], [2, 4, 1], [0, 2, 1], [1, 3, 0], [3, 4, 2, 0]];\n",
       "   <!-- Facet style -->\n",
       "obj41.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj41);\n",
       "scene.add(obj41);\n",
       "\n",
       "var obj42 = new THREE.Object3D();\n",
       "obj42.name = \"unnamed__21\";\n",
       "obj42.userData.explodable = 1;\n",
       "obj42.userData.points = [];\n",
       "obj42.userData.points.push(new PMPoint(3, 1, 1));\n",
       "obj42.userData.points.push(new PMPoint(1, 0, 0));\n",
       "obj42.userData.points.push(new PMPoint(3, 0, 1));\n",
       "obj42.userData.points.push(new PMPoint(3, 1, 0));\n",
       "obj42.userData.points.push(new PMPoint(3, 0, 0));\n",
       "\n",
       "obj42.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj42.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj42.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 1, 4, 2, 4, 3, 4];\n",
       "   <!-- Edge style -->\n",
       "obj42.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj42.userData.facets = [[4, 1, 3], [4, 2, 1], [0, 1, 2], [3, 1, 0], [4, 3, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj42.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj42);\n",
       "scene.add(obj42);\n",
       "\n",
       "var obj43 = new THREE.Object3D();\n",
       "obj43.name = \"_bounded\";\n",
       "obj43.userData.explodable = 1;\n",
       "obj43.userData.points = [];\n",
       "obj43.userData.points.push(new PMPoint(1, 1, 3));\n",
       "obj43.userData.points.push(new PMPoint(1, 0, 3));\n",
       "obj43.userData.points.push(new PMPoint(0, 0, 3));\n",
       "obj43.userData.points.push(new PMPoint(0, 1, 3));\n",
       "obj43.userData.points.push(new PMPoint(0, 2.2, 6.6));\n",
       "obj43.userData.points.push(new PMPoint(0, 0, 6.6));\n",
       "obj43.userData.points.push(new PMPoint(2.2, 2.2, 6.6));\n",
       "obj43.userData.points.push(new PMPoint(2.2, 0, 6.6));\n",
       "\n",
       "obj43.userData.pointradii = [0.02, 0.02, 0.02, 0.02, 0, 0, 0, 0, 0.02];\n",
       "   <!-- Vertex style -->\n",
       "obj43.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj43.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 3, 4, 2, 5, 4, 5, 0, 6, 4, 6, 1, 7, 5, 7, 6, 7];\n",
       "   <!-- Edge style -->\n",
       "obj43.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj43.userData.facets = [[5, 2, 1, 7], [3, 2, 5, 4], [0, 3, 4, 6], [7, 1, 0, 6], [1, 2, 3, 0], [5, 7, 6, 4]];\n",
       "   <!-- Facet style -->\n",
       "obj43.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj43);\n",
       "scene.add(obj43);\n",
       "\n",
       "var obj44 = new THREE.Object3D();\n",
       "obj44.name = \"_bounded\";\n",
       "obj44.userData.explodable = 1;\n",
       "obj44.userData.points = [];\n",
       "obj44.userData.points.push(new PMPoint(1, 3, 1));\n",
       "obj44.userData.points.push(new PMPoint(1, 3, 0));\n",
       "obj44.userData.points.push(new PMPoint(0, 3, 0));\n",
       "obj44.userData.points.push(new PMPoint(0, 3, 1));\n",
       "obj44.userData.points.push(new PMPoint(0, 6.6, 2.2));\n",
       "obj44.userData.points.push(new PMPoint(0, 6.6, 0));\n",
       "obj44.userData.points.push(new PMPoint(2.2, 6.6, 2.2));\n",
       "obj44.userData.points.push(new PMPoint(2.2, 6.6, 0));\n",
       "\n",
       "obj44.userData.pointradii = [0.02, 0.02, 0.02, 0.02, 0, 0, 0, 0, 0.02];\n",
       "   <!-- Vertex style -->\n",
       "obj44.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj44.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 3, 4, 2, 5, 4, 5, 0, 6, 4, 6, 1, 7, 5, 7, 6, 7];\n",
       "   <!-- Edge style -->\n",
       "obj44.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj44.userData.facets = [[2, 5, 7, 1], [4, 5, 2, 3], [6, 4, 3, 0], [1, 7, 6, 0], [2, 1, 0, 3], [7, 5, 4, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj44.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj44);\n",
       "scene.add(obj44);\n",
       "\n",
       "var obj45 = new THREE.Object3D();\n",
       "obj45.name = \"unnamed__22\";\n",
       "obj45.userData.explodable = 1;\n",
       "obj45.userData.points = [];\n",
       "obj45.userData.points.push(new PMPoint(0.333333, 0.333333, 0.333333));\n",
       "obj45.userData.points.push(new PMPoint(0, 0.333333, 0.333333));\n",
       "obj45.userData.points.push(new PMPoint(0.333333, 0, 0.333333));\n",
       "obj45.userData.points.push(new PMPoint(0.333333, 0.333333, 0));\n",
       "obj45.userData.points.push(new PMPoint(0, 0, 0.333333));\n",
       "obj45.userData.points.push(new PMPoint(0, 0.333333, 0));\n",
       "obj45.userData.points.push(new PMPoint(0.333333, 0, 0));\n",
       "obj45.userData.points.push(new PMPoint(0, 0, 0));\n",
       "\n",
       "obj45.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj45.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj45.userData.edgeindices = [0, 1, 0, 2, 0, 3, 1, 4, 2, 4, 1, 5, 3, 5, 2, 6, 3, 6, 4, 7, 5, 7, 6, 7];\n",
       "   <!-- Edge style -->\n",
       "obj45.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj45.userData.facets = [[7, 5, 3, 6], [1, 5, 7, 4], [7, 6, 2, 4], [0, 1, 4, 2], [3, 5, 1, 0], [6, 3, 0, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj45.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj45);\n",
       "scene.add(obj45);\n",
       "\n",
       "var obj46 = new THREE.Object3D();\n",
       "obj46.name = \"_bounded\";\n",
       "obj46.userData.explodable = 1;\n",
       "obj46.userData.points = [];\n",
       "obj46.userData.points.push(new PMPoint(3, 1, 0));\n",
       "obj46.userData.points.push(new PMPoint(3, 0, 0));\n",
       "obj46.userData.points.push(new PMPoint(3, 0, 1));\n",
       "obj46.userData.points.push(new PMPoint(3, 1, 1));\n",
       "obj46.userData.points.push(new PMPoint(6.6, 2.2, 2.2));\n",
       "obj46.userData.points.push(new PMPoint(6.6, 0, 2.2));\n",
       "obj46.userData.points.push(new PMPoint(6.6, 2.2, 0));\n",
       "obj46.userData.points.push(new PMPoint(6.6, 0, 0));\n",
       "\n",
       "obj46.userData.pointradii = [0.02, 0.02, 0.02, 0.02, 0, 0, 0, 0, 0.02];\n",
       "   <!-- Vertex style -->\n",
       "obj46.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj46.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 3, 4, 2, 5, 4, 5, 0, 6, 4, 6, 1, 7, 5, 7, 6, 7];\n",
       "   <!-- Edge style -->\n",
       "obj46.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj46.userData.facets = [[7, 1, 0, 6], [2, 1, 7, 5], [3, 2, 5, 4], [6, 0, 3, 4], [0, 1, 2, 3], [7, 6, 4, 5]];\n",
       "   <!-- Facet style -->\n",
       "obj46.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj46);\n",
       "scene.add(obj46);\n",
       "\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "function textSpriteMaterial(message, parameters) {\n",
       "    if ( parameters === undefined ) parameters = {};\n",
       "    var fontface = \"Helvetica\";\n",
       "    var fontsize = parameters.hasOwnProperty(\"fontsize\") ? parameters[\"fontsize\"] : 15;\n",
       "    fontsize = fontsize*10;\n",
       "    var lines = message.split('\\\\n');\n",
       "    var size = 512;\n",
       "    for(var i = 0; i<lines.length; i++){\n",
       "        var tmp = lines[i].length;\n",
       "        while(tmp*fontsize > size){\n",
       "           fontsize--;\n",
       "        }\n",
       "    }\n",
       "    \n",
       "    var canvas = document.createElement('canvas');\n",
       "    canvas.width = size;\n",
       "    canvas.height = size;\n",
       "    var context = canvas.getContext('2d');\n",
       "    context.fillStyle = \"rgba(255, 255, 255, 0)\";\n",
       "    context.fill();\n",
       "    context.font = fontsize + \"px \" + fontface;\n",
       "    \n",
       "    // text color\n",
       "    context.fillStyle = \"rgba(0, 0, 0, 1.0)\";\n",
       "     for(var i = 0; i<lines.length; i++){\n",
       "        context.fillText(lines[i], size/2, size/2+i*fontsize);\n",
       "     }\n",
       "    \n",
       "    // canvas contents will be used for a texture\n",
       "    var texture = new THREE.Texture(canvas);\n",
       "    texture.needsUpdate = true;\n",
       "    \n",
       "    var spriteMaterial = new THREE.SpriteMaterial({map: texture, depthTest: true, depthWrite: false, polygonOffset: true, polygonOffsetFactor: -1, polygonOffsetUnits: 1 });\n",
       "    return spriteMaterial;\n",
       "}\n",
       "\n",
       "\n",
       "// ---------------------- INITIALIZING OBJECTS--------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "function init_object(obj) {\n",
       "    if (obj.userData.hasOwnProperty(\"pointmaterial\")) {\n",
       "        init_points(obj);\n",
       "        modelContains.points = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"pointlabels\")) {\n",
       "        init_pointlabels(obj);\n",
       "        modelContains.pointlabels = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"edgematerial\")) {\n",
       "        init_lines(obj);\n",
       "        modelContains.lines = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"edgelabels\")) {\n",
       "        init_edgelabels(obj);\n",
       "        modelContains.edgelabels = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"arrowstyle\")) {\n",
       "        init_arrowheads(obj);\n",
       "        modelContains.arrowheads = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"facetmaterial\")) {\n",
       "        init_faces(obj);\n",
       "        modelContains.faces = true;\n",
       "    }\n",
       "}\n",
       "\n",
       "function init_points(obj) {\n",
       "    var pointgroup = new THREE.Group();\n",
       "    pointgroup.name = \"points\";\n",
       "    var points = obj.userData.points;\n",
       "    var radii = obj.userData.pointradii;\n",
       "    var materials = obj.userData.pointmaterial;\n",
       "    var geometry,material;\n",
       "    if (!Array.isArray(radii)) {\n",
       "        geometry = new THREE.SphereBufferGeometry(radii);  \n",
       "    }\n",
       "    if (!Array.isArray(materials)) {\n",
       "        material = materials;\n",
       "    }\n",
       "    for (var i=0; i<points.length; i++) {\n",
       "        var point = points[i];\n",
       "        if (Array.isArray(radii)) {\n",
       "            if (radii[i] == 0) {\n",
       "                continue;\n",
       "            }\n",
       "            geometry = new THREE.SphereBufferGeometry(radii[i]);  \n",
       "        } \n",
       "        if (Array.isArray(materials)) {\n",
       "            material = materials[i];     \n",
       "        } \n",
       "        var sphere = new THREE.Mesh(geometry, material);\n",
       "        point.addSphere(sphere);\n",
       "        pointgroup.add(sphere);\n",
       "    }\n",
       "    obj.add(pointgroup);\n",
       "}\n",
       "\n",
       "function init_pointlabels(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var labels = obj.userData.pointlabels;\n",
       "    var pointlabels = new THREE.Group();\n",
       "    pointlabels.name = \"pointlabels\";\n",
       "    if (Array.isArray(labels)) {\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "            var spriteMaterial = textSpriteMaterial( labels[i] );\n",
       "\t        var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            point.addLabel(sprite);\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    } else {\n",
       "        var spriteMaterial = textSpriteMaterial( labels );\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "\t        var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            point.addLabel(sprite);\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    }\n",
       "    obj.add(pointlabels);\n",
       "}\n",
       "\n",
       "function init_lines(obj) {\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var points = obj.userData.points;\n",
       "    var materials = obj.userData.edgematerial;\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    var bufarr = new Float32Array( obj.userData.edgeindices.length * 3 );\n",
       "    var bufattr = new THREE.Float32BufferAttribute( bufarr, 3 );\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    geometry.setAttribute('position', bufattr);\n",
       "    if (Array.isArray(materials)) {     \n",
       "        for (var i=0; i<materials.length; i++) {\n",
       "            geometry.addGroup(2*i,2,i);\n",
       "        }\n",
       "    }\n",
       "    var lines = new THREE.LineSegments(geometry, materials);\n",
       "    lines.name = \"lines\";\n",
       "    obj.add(lines);\n",
       "    updateEdgesPosition(obj);\n",
       "}\n",
       "\n",
       "function init_edgelabels(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var labels = obj.userData.edgelabels;\n",
       "    var edgelabels = new THREE.Group();\n",
       "    edgelabels.name = \"edgelabels\";\n",
       "    if (Array.isArray(labels)) {\n",
       "        for (var i=0; i<edgeindices.length; i=i+2) {\n",
       "            var point = points[i];\n",
       "            var spriteMaterial = textSpriteMaterial( labels[i] );\n",
       "            var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[i]].vector,points[edgeindices[i+1]].vector).multiplyScalar(0.5));\n",
       "            edgelabels.add(sprite);\n",
       "        }\n",
       "    } else {\n",
       "        var spriteMaterial = textSpriteMaterial( labels );\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "            var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[i]].vector,points[edgeindices[i+1]].vector).multiplyScalar(0.5));\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    }\n",
       "    obj.add(edgelabels);\n",
       "}\n",
       "\n",
       "function init_arrowheads(obj) {\n",
       "    var arrowheads = new THREE.Group();\n",
       "    arrowheads.name = \"arrowheads\";\n",
       "    var arrowstyle = obj.userData.arrowstyle;\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var edgematerials = obj.userData.edgematerial;\n",
       "    var points = obj.userData.points;\n",
       "    var material;\n",
       "    if (!Array.isArray(edgematerials)) {\n",
       "        material = new THREE.MeshBasicMaterial( {color: edgematerials.color} );\n",
       "    }\n",
       "\n",
       "    for (var i=0; i<edgeindices.length; i=i+2) {\n",
       "        var start = points[edgeindices[i]];\n",
       "        var end = points[edgeindices[i+1]];\n",
       "        var dist = start.vector.distanceTo( end.vector ) - start.radius() - end.radius();\n",
       "        if (dist <= 0) {\n",
       "            continue;\n",
       "        }\n",
       "        var dir = new THREE.Vector3().subVectors(end.vector,start.vector);\n",
       "        dir.normalize();\n",
       "        var axis = new THREE.Vector3().set(dir.z,0,-dir.x);\n",
       "        axis.normalize();\n",
       "        var radians = Math.acos( dir.y );\n",
       "        var radius = dist/25;\n",
       "        var height = dist/5;\n",
       "        var geometry = new THREE.ConeBufferGeometry(radius,height);\n",
       "        var position = new THREE.Vector3().addVectors(start.vector,dir.clone().multiplyScalar(start.radius()+dist-height/2));\n",
       "        if (Array.isArray(edgematerials)) {\n",
       "            material = new THREE.MeshBasicMaterial( {color: edgematerials[i].color} );\n",
       "        }\n",
       "        var cone = new THREE.Mesh( geometry, material );\n",
       "        cone.quaternion.setFromAxisAngle(axis,radians);;\n",
       "        cone.position.copy(position);;\n",
       "        arrowheads.add(cone);\n",
       "    }\n",
       "    obj.add(arrowheads);\n",
       "}\n",
       "\n",
       "function init_faces(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var facets = obj.userData.facets;\n",
       "    obj.userData.triangleindices = [];\n",
       "    for (var i=0; i<facets.length; i++) {\n",
       "        facet = facets[i];\n",
       "        for (var t=0; t<facet.length-2; t++) {\n",
       "            obj.userData.triangleindices.push(facet[0],facet[t+1],facet[t+2]);  \n",
       "        }\n",
       "    }\n",
       "    var bufarr = new Float32Array( obj.userData.triangleindices.length * 3 );\n",
       "    var bufattr = new THREE.Float32BufferAttribute(bufarr,3);\n",
       "    \n",
       "    var materials = obj.userData.facetmaterial;\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    geometry.setAttribute('position',bufattr);\n",
       "    if (Array.isArray(materials)) {\n",
       "        var tricount = 0;\n",
       "        var facet;\n",
       "        for (var i=0; i<facets.length; i++) {\n",
       "            facet = facets[i];\n",
       "            geometry.addGroup(tricount,(facet.length-2)*3,i);\n",
       "            tricount += (facet.length-2)*3;\n",
       "        }\n",
       "    }\n",
       "    var mesh = new THREE.Mesh(geometry, materials);\n",
       "    mesh.name = \"faces\";\n",
       "    obj.add(mesh); \n",
       "    updateFacesPosition(obj);\n",
       "}\n",
       "// //INITIALIZING\n",
       "\n",
       "\n",
       "function updateFacesPosition(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var indices = obj.userData.triangleindices;\n",
       "    var faces = obj.getObjectByName(\"faces\");\n",
       "    var ba = faces.geometry.getAttribute(\"position\");\n",
       "    for (var i=0; i<indices.length; i++) {\n",
       "        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); \n",
       "    }\n",
       "    faces.geometry.attributes.position.needsUpdate = true;\n",
       "    \n",
       "}\n",
       "\n",
       "function updateEdgesPosition(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var indices = obj.userData.edgeindices;\n",
       "    var lines = obj.getObjectByName(\"lines\");\n",
       "    var ba = lines.geometry.getAttribute(\"position\"); \n",
       "    for (var i=0; i<indices.length; i++) {\n",
       "        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); \n",
       "    }\n",
       "    lines.geometry.attributes.position.needsUpdate = true;\n",
       "}\n",
       "\n",
       "function onWindowResize() {\n",
       "    renderer.setSize( three.clientWidth, three.clientHeight );\n",
       "    svgRenderer.setSize( three.clientWidth, three.clientHeight );\n",
       "    updateCamera();\n",
       "}\n",
       "\n",
       "function updateCamera() {\n",
       "    var width = three.clientWidth;\n",
       "    var height = three.clientHeight;\n",
       "    var aspect = width / height;\n",
       "    if (camera.type == \"OrthographicCamera\") {\n",
       "        camera.left = frustumSize * aspect / - 2;\n",
       "        camera.right = frustumSize * aspect / 2;\n",
       "        camera.top = frustumSize / 2;\n",
       "        camera.bottom = - frustumSize / 2;\n",
       "    } else if (camera.type == \"PerspectiveCamera\") {\n",
       "        camera.aspect = aspect;\n",
       "    }\n",
       "    camera.updateProjectionMatrix();\n",
       "}\n",
       "\n",
       "function changeCamera(event) {\n",
       "    var selindex = event.currentTarget.selectedIndex;\n",
       "    camera = cameras[selindex];\n",
       "    control = controls[selindex];\n",
       "    control.enabled = true; \n",
       "    for (var i=0; i<controls.length; i++) {\n",
       "        if (i!=selindex) {\n",
       "            controls[i].enabled = false;\n",
       "        }\n",
       "    }\n",
       "    updateCamera();\n",
       "}\n",
       "\n",
       "var camtypenode = document.getElementById('cameraType_9');\n",
       "camtypenode.onchange = changeCamera;\n",
       "camtypenode.dispatchEvent(new Event('change'));\n",
       "\n",
       "onWindowResize();\n",
       "window.addEventListener('resize', onWindowResize);\t\n",
       "\n",
       "\n",
       "var xRotationEnabled = false;\n",
       "var yRotationEnabled = false;\n",
       "var zRotationEnabled = false;\n",
       "var rotationSpeedFactor = 1;\n",
       "var settingsShown = false;\n",
       "var labelsShown = true;\n",
       "var intervals = [];\n",
       "var timeouts = [];\n",
       "var explodingSpeed = 0.05;\n",
       "var explodeScale = 0;\n",
       "var XMLS = new XMLSerializer();\n",
       "var svgElement;\n",
       "var renderId;\n",
       "\n",
       "var render = function () {\n",
       "\n",
       "\trenderId = requestAnimationFrame(render);\n",
       "\n",
       "//\tcomment in for automatic explosion\n",
       "//\texplode(updateFactor());\n",
       "\n",
       "    var phi = 0.02 * rotationSpeedFactor;\n",
       "\n",
       "    if (xRotationEnabled) {\n",
       "        scene.rotation.x += phi;\n",
       "    }\n",
       "    if (yRotationEnabled) {\n",
       "        scene.rotation.y += phi;\n",
       "    }\n",
       "    if (zRotationEnabled) {\n",
       "        scene.rotation.z += phi;\n",
       "    }\n",
       "\n",
       "    control.update();\n",
       "    renderer.render(scene, camera);\n",
       "};\n",
       "\n",
       "if ( THREE.WEBGL.isWebGLAvailable() ) {\n",
       "\trender();\n",
       "} else {\n",
       "\tvar warning = WEBGL.getWebGLErrorMessage();\n",
       "\tthree.appendChild( warning );\n",
       "}\n",
       "    \n",
       "function changeTransparency() {\n",
       "    var opacity = 1-Number(event.currentTarget.value);\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        child = scene.children[i];\n",
       "        if ( child.userData.hasOwnProperty(\"facetmaterial\") ) {\n",
       "            if (Array.isArray(child.userData.facetmaterial)) {\n",
       "                for (var j=0; j<child.userData.facetmaterial.length; j++) {\n",
       "                    child.userData.facetmaterial[j].opacity = opacity;\n",
       "                }\n",
       "            } else {\n",
       "                child.userData.facetmaterial.opacity = opacity;\n",
       "            }    \n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function changeRotationX(event){\n",
       "    xRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "function changeRotationY(event){\n",
       "    yRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "function changeRotationZ(event){\n",
       "    zRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "\n",
       "function changeRotationSpeedFactor(event){\n",
       "    rotationSpeedFactor = Number(event.currentTarget.value);\n",
       "}\n",
       "\n",
       "function resetScene(){\n",
       "    scene.rotation.set(0,0,0);\n",
       "    camera.position.set(0,0,5);\n",
       "    camera.up.set(0,1,0);\n",
       "}\n",
       "\n",
       "function showSettings(event){\n",
       "    document.getElementById('settings_9').style.visibility = 'visible';\n",
       "    document.getElementById('showSettingsButton_9').style.visibility = 'hidden';\n",
       "    document.getElementById('hideSettingsButton_9').style.visibility = 'visible';\n",
       "    settingsShown = true;\n",
       "}\n",
       "\n",
       "function hideSettings(event){\n",
       "    document.getElementById('settings_9').style.visibility = 'hidden';\n",
       "    document.getElementById('showSettingsButton_9').style.visibility = 'visible';\n",
       "    document.getElementById('hideSettingsButton_9').style.visibility = 'hidden';\n",
       "    settingsShown = false;\n",
       "}\n",
       "\n",
       "\n",
       "\n",
       "var pos = 150* Math.PI;\n",
       "\n",
       "function updateFactor() {\n",
       "    pos++;\n",
       "    return Math.sin(.01*pos)+1;\n",
       "}\n",
       "\n",
       "// ------------------------ FOLDING ------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "// rotate point p around axis defined by points p1 and p2 by given angle\n",
       "function rotate(p, p1, p2, angle ){   \n",
       "    angle = -angle;\n",
       "    var x = p.x, y = p.y, z = p.z, \n",
       "    a = p1.x, b = p1.y, c = p1.z, \n",
       "    u = p2.x-p1.x, v = p2.y-p1.y, w = p2.z-p1.z;\n",
       "    var result = [];\n",
       "    var L = u*u + v*v + w*w;\n",
       "    var sqrt = Math.sqrt;\n",
       "    var cos = Math.cos;\n",
       "    var sin = Math.sin;\n",
       "\n",
       "    result[0] = ((a*(v*v+w*w)-u*(b*v+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*x*cos(angle)+sqrt(L)*(-c*v+b*w-w*y+v*z)*sin(angle))/L;\n",
       "    result[1] = ((b*(u*u+w*w)-v*(a*u+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*y*cos(angle)+sqrt(L)*(c*u-a*w+w*x-u*z)*sin(angle))/L;\n",
       "    result[2] = ((c*(u*u+v*v)-w*(a*u+b*v-u*x-v*y-w*z))*(1-cos(angle))+L*z*cos(angle)+sqrt(L)*(-b*u+a*v-v*x+u*y)*sin(angle))/L;\n",
       "\n",
       "    return result;\n",
       "}\n",
       "\n",
       "var fold = function(event){\n",
       "    var obj = foldables[Number(event.currentTarget.name)];\n",
       "    var foldvalue = Number(event.currentTarget.value);\n",
       "    var scale = foldvalue - obj.userData.oldscale;\n",
       "\n",
       "    for (var j=0; j<obj.userData.axes.length; j++) {\n",
       "        rotateVertices(obj, j, scale);\n",
       "    }\n",
       "    update(obj);\n",
       "    obj.userData.oldscale += scale;\n",
       "    lookAtBarycenter(obj);\n",
       "}\n",
       "\n",
       "function lookAtBarycenter(obj){\n",
       "    control.target = barycenter(obj);\n",
       "}\n",
       "\n",
       "function barycenter(obj) {\n",
       "    var center = new THREE.Vector3(0,0,0);\n",
       "    var points = obj.userData.points;\n",
       "    for (var i=0; i<points.length; i++){\n",
       "        center.add(points[i].vector);\n",
       "    }\n",
       "    center.divideScalar(points.length);\n",
       "    return center;\n",
       "}\n",
       "\n",
       "function rotateVertices(obj, edge, scale) {\n",
       "    var axes = obj.userData.axes;\n",
       "    var subtrees = obj.userData.subtrees;\n",
       "    var points = obj.userData.points;\n",
       "    var angles = obj.userData.angles;\n",
       "    if (edge < axes.length){\n",
       "        for (var j=0; j<subtrees[edge].length; j++){\n",
       "            var rotP = rotate(points[subtrees[edge][j]].vector, points[axes[edge][0]].vector,points[axes[edge][1]].vector, scale * (Math.PI - angles[edge]));\n",
       "            points[subtrees[edge][j]].set(rotP[0],rotP[1],rotP[2]);\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function update(obj) {\n",
       "   updateFacesPosition(obj);\n",
       "   updateEdgesPosition(obj);\n",
       "}\n",
       "\n",
       "if (foldables.length) {\n",
       "    var settings = document.getElementById('settings_9');\n",
       "    var foldDiv = document.createElement('div');\n",
       "    foldDiv.id = 'fold_9';\n",
       "    var title = document.createElement('strong');\n",
       "    title.innerHTML = 'Fold';\n",
       "    foldDiv.appendChild(title);\n",
       "    foldDiv.className = 'group';\n",
       "    for (var i=0; i<foldables.length; i++) {\n",
       "        var range = document.createElement('input');\n",
       "        range.type = 'range';\n",
       "        range.min = 0;\n",
       "        range.max = 1;\n",
       "        range.value = 0;\n",
       "        range.step = 0.001;\n",
       "        range.name = String(i);\n",
       "        range.oninput = fold;\n",
       "        foldDiv.appendChild(range);\n",
       "    }\n",
       "    lookAtBarycenter(foldables[0]);\n",
       "    settings.insertBefore(foldDiv,settings.childNodes[0]);\n",
       "}\n",
       "\n",
       "    \n",
       "// ---------------------- EXPLOSION ------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "if (explodableModel) {\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        obj = scene.children[i];\n",
       "        if ( obj.userData.explodable ) {\n",
       "            computeCentroid(obj);\n",
       "        }\n",
       "    }\n",
       "    document.getElementById('explodeRange_9').oninput = triggerExplode;\n",
       "    document.getElementById('explodeCheckbox_9').onchange = triggerAutomaticExplode;\n",
       "    document.getElementById('explodingSpeedRange_9').oninput = setExplodingSpeed;\n",
       "}\n",
       "\n",
       "function computeCentroid(obj) {\n",
       "    centroid = new THREE.Vector3();\n",
       "    obj.userData.points.forEach(function(pmpoint) {\n",
       "        centroid.add(pmpoint.vector);\t\t\t\n",
       "    });\n",
       "    centroid.divideScalar(obj.userData.points.length);\n",
       "    obj.userData.centroid = centroid;\n",
       "}\n",
       "\n",
       "function explode(factor) {\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        var obj = scene.children[i];\n",
       "        if (obj.userData.hasOwnProperty(\"centroid\")) { \n",
       "            var c = obj.userData.centroid;\n",
       "            obj.position.set(c.x*factor, c.y*factor, c.z*factor);\n",
       "        }\n",
       "    }\t\n",
       "}\n",
       "\n",
       "function triggerExplode(event){\n",
       "    explodeScale = Number(event.currentTarget.value);\n",
       "    explode(explodeScale);\n",
       "}\n",
       "\n",
       "function setExplodingSpeed(event){\n",
       "    explodingSpeed = Number(event.currentTarget.value);\n",
       "}\n",
       "\n",
       "function triggerAutomaticExplode(event){\n",
       "    if (event.currentTarget.checked){\n",
       "        startExploding();\n",
       "    } else {\n",
       "        clearIntervals();\n",
       "    }\t\n",
       "}\n",
       "\n",
       "function startExploding(){\n",
       "    intervals.push(setInterval(explodingInterval, 25));\n",
       "}\n",
       "\n",
       "\n",
       "function explodingInterval(){\n",
       "    explodeScale += explodingSpeed;\n",
       "    if (explodeScale <= 6){ \n",
       "        explode(explodeScale);\n",
       "    }\n",
       "    else{\n",
       "        explode(6);\n",
       "        explodeScale = 6;\n",
       "        clearIntervals();\n",
       "        timeouts.push(setTimeout(startUnexploding, 3000));\n",
       "    }\n",
       "    document.getElementById('explodeRange_9').value = explodeScale;\n",
       "}\n",
       "\n",
       "\n",
       "function startUnexploding(){\n",
       "    intervals.push(setInterval(unexplodingInterval, 25));\n",
       "}\n",
       "\n",
       "function unexplodingInterval(){\n",
       "    explodeScale -= explodingSpeed;\n",
       "    if (explodeScale >= 0){\t\n",
       "        explode(explodeScale);\n",
       "    }\n",
       "    else {\n",
       "        explode(0);\n",
       "        explodeScale = 0;\n",
       "        clearIntervals();\n",
       "        timeouts.push(setTimeout(startExploding, 3000));\n",
       "    }\n",
       "    document.getElementById('explodeRange_9').value = explodeScale;\n",
       "}\n",
       "\n",
       "function clearIntervals(){\n",
       "    intervals.forEach(function(interval){\n",
       "        clearInterval(interval);\n",
       "    });\n",
       "    intervals = [];\n",
       "    timeouts.forEach(function(timeout){\n",
       "        clearTimeout(timeout);\n",
       "    });\n",
       "    timeouts = [];\n",
       "}\n",
       "\n",
       "// ---------------------- DISPLAY --------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "const objectTypeInnerHTMLs = { points: \"Points\", pointlabels: \"Point labels\", lines: \"Edges\", edgelabels: \"Edge labels\", faces: \"Faces\", arrowheads: \"Arrow heads\" };\n",
       "const objectTypeVisible = {};\n",
       "Object.assign(objectTypeVisible,modelContains);\n",
       "const sortedObjectTypeKeys = Object.keys(objectTypeInnerHTMLs).sort();\n",
       "const shownObjectTypesList = document.getElementById('shownObjectTypesList_9');\n",
       "\n",
       "function setVisibility(bool,objname) {\n",
       "    for (var i=0; i<scene.children.length; i++){\n",
       "        var obj = scene.children[i].getObjectByName(objname);\n",
       "        if (obj) {\n",
       "            obj.visible = bool;\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function toggleObjectTypeVisibility(event){\n",
       "    var name = event.currentTarget.name;\n",
       "    var checked = event.currentTarget.checked;\n",
       "    objectTypeVisible[name] = checked;\n",
       "    setVisibility(checked,name);\n",
       "}\n",
       "\n",
       "for (var i=0; i<sortedObjectTypeKeys.length; i++){\n",
       "    var key = sortedObjectTypeKeys[i];\n",
       "    if (modelContains[key]) {\n",
       "        var objTypeNode = document.createElement('span');\n",
       "        objTypeNode.innerHTML = objectTypeInnerHTMLs[key] + '<br>';\n",
       "        var checkbox = document.createElement('input');\n",
       "        checkbox.type = 'checkbox';\n",
       "        checkbox.checked = true;\n",
       "        checkbox.name = key;\n",
       "        checkbox.onchange = toggleObjectTypeVisibility;\n",
       "        shownObjectTypesList.appendChild(checkbox);\n",
       "        shownObjectTypesList.appendChild(objTypeNode);\n",
       "    }\n",
       "}\n",
       "\n",
       "// ------------------------------------------------------\n",
       "\n",
       "function toggleObjectVisibility(event){\n",
       "    var nr = Number(event.currentTarget.name);\n",
       "    scene.children[nr].visible = event.currentTarget.checked;\n",
       "}\n",
       "\n",
       "// append checkboxes for displaying or hiding objects\n",
       "var shownObjectsList = document.getElementById('shownObjectsList_9');\n",
       "for (var i=0; i<scene.children.length; i++){\n",
       "    obj = scene.children[i];\n",
       "    var objNode = document.createElement('span');\n",
       "    objNode.innerHTML = obj.name + '<br>';\n",
       "    var checkbox = document.createElement('input');\n",
       "    checkbox.type = 'checkbox';\n",
       "    checkbox.checked = true;\n",
       "    checkbox.name = String(i);\n",
       "    checkbox.onchange = toggleObjectVisibility;\n",
       "    shownObjectsList.appendChild(checkbox);\n",
       "    shownObjectsList.appendChild(objNode);\n",
       "}\n",
       "\n",
       "// ---------------------- SVG ------------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "function takeSvgScreenshot() {\n",
       "    if (objectTypeVisible[\"pointlabels\"]) {\n",
       "        setVisibility(false,\"pointlabels\");\n",
       "    }\n",
       "    if (objectTypeVisible[\"edgelabels\"]) {\n",
       "        setVisibility(false,\"edgelabels\");\n",
       "    }\n",
       "    svgRenderer.render(scene,camera);\n",
       "    svgElement = XMLS.serializeToString(svgRenderer.domElement);\n",
       "    \n",
       "    if (objectTypeVisible[\"pointlabels\"]) {\n",
       "        setVisibility(true,\"pointlabels\");\n",
       "    }\n",
       "    if (objectTypeVisible[\"edgelabels\"]) {\n",
       "        setVisibility(true,\"edgelabels\");\n",
       "    }\n",
       "\n",
       "    if (document.getElementById('tab_9').checked){\n",
       "        //show in new tab\n",
       "        var myWindow = window.open(\"\",\"\");\n",
       "        myWindow.document.body.innerHTML = svgElement;\n",
       "    } else{\n",
       "        // download svg file \n",
       "        download(\"screenshot.svg\", svgElement);\n",
       "    }\n",
       "}\n",
       "\n",
       "function download(filename, text) {\n",
       "    var element = document.createElement('a');\n",
       "    element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));\n",
       "    element.setAttribute('download', filename);\n",
       "\n",
       "    element.style.display = 'none';\n",
       "    document.body.appendChild(element);\n",
       "\n",
       "    element.click();\n",
       "\n",
       "    document.body.removeChild(element);\n",
       "}\n",
       "\n",
       "\n",
       "document.getElementById('transparencyRange_9').oninput = changeTransparency;\n",
       "document.getElementById('changeRotationX_9').onchange = changeRotationX;\n",
       "document.getElementById('changeRotationY_9').onchange = changeRotationY;\n",
       "document.getElementById('changeRotationZ_9').onchange = changeRotationZ;\n",
       "document.getElementById('resetButton_9').onclick = resetScene;\n",
       "document.getElementById('rotationSpeedRange_9').oninput = changeRotationSpeedFactor;\n",
       "document.getElementById('takeScreenshot_9').onclick = takeSvgScreenshot;\n",
       "document.getElementById('showSettingsButton_9').onclick = showSettings;\n",
       "document.getElementById('hideSettingsButton_9').onclick = hideSettings;\n",
       "\n",
       "\n",
       "// ------------------ SHORTCUTS --------------------------------------------\n",
       "// -------------------------------------------------------------------------\n",
       "\n",
       "/**\n",
       " * http://www.openjs.com/scripts/events/keyboard_shortcuts/\n",
       " * Version : 2.01.B\n",
       " * By Binny V A\n",
       " * License : BSD\n",
       " */\n",
       "shortcut = {\n",
       "\t'all_shortcuts':{},//All the shortcuts are stored in this array\n",
       "\t'add': function(shortcut_combination,callback,opt) {\n",
       "\t\t//Provide a set of default options\n",
       "\t\tvar default_options = {\n",
       "\t\t\t'type':'keydown',\n",
       "\t\t\t'propagate':false,\n",
       "\t\t\t'disable_in_input':false,\n",
       "\t\t\t'target':document,\n",
       "\t\t\t'keycode':false\n",
       "\t\t}\n",
       "\t\tif(!opt) opt = default_options;\n",
       "\t\telse {\n",
       "\t\t\tfor(var dfo in default_options) {\n",
       "\t\t\t\tif(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo];\n",
       "\t\t\t}\n",
       "\t\t}\n",
       "\n",
       "\t\tvar ele = opt.target;\n",
       "\t\tif(typeof opt.target == 'string') ele = document.getElementById(opt.target);\n",
       "\t\tvar ths = this;\n",
       "\t\tshortcut_combination = shortcut_combination.toLowerCase();\n",
       "\n",
       "\t\t//The function to be called at keypress\n",
       "\t\tvar func = function(e) {\n",
       "\t\t\te = e || window.event;\n",
       "\t\t\t\n",
       "\t\t\tif(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields\n",
       "\t\t\t\tvar element;\n",
       "\t\t\t\tif(e.target) element=e.target;\n",
       "\t\t\t\telse if(e.srcElement) element=e.srcElement;\n",
       "\t\t\t\tif(element.nodeType==3) element=element.parentNode;\n",
       "\n",
       "\t\t\t\tif(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return;\n",
       "\t\t\t}\n",
       "\t\n",
       "\t\t\t//Find Which key is pressed\n",
       "\t\t\tif (e.keyCode) code = e.keyCode;\n",
       "\t\t\telse if (e.which) code = e.which;\n",
       "\t\t\tvar character = String.fromCharCode(code).toLowerCase();\n",
       "\t\t\t\n",
       "\t\t\tif(code == 188) character=\",\"; //If the user presses , when the type is onkeydown\n",
       "\t\t\tif(code == 190) character=\".\"; //If the user presses , when the type is onkeydown\n",
       "\n",
       "\t\t\tvar keys = shortcut_combination.split(\"+\");\n",
       "\t\t\t//Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked\n",
       "\t\t\tvar kp = 0;\n",
       "\t\t\t\n",
       "\t\t\t//Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken\n",
       "\t\t\tvar shift_nums = {\n",
       "\t\t\t\t\"`\":\"~\",\n",
       "\t\t\t\t\"1\":\"!\",\n",
       "\t\t\t\t\"2\":\"@\",\n",
       "\t\t\t\t\"3\":\"#\",\n",
       "\t\t\t\t\"4\":\"$\",\n",
       "\t\t\t\t\"5\":\"%\",\n",
       "\t\t\t\t\"6\":\"^\",\n",
       "\t\t\t\t\"7\":\"&\",\n",
       "\t\t\t\t\"8\":\"*\",\n",
       "\t\t\t\t\"9\":\"(\",\n",
       "\t\t\t\t\"0\":\")\",\n",
       "\t\t\t\t\"-\":\"_\",\n",
       "\t\t\t\t\"=\":\"+\",\n",
       "\t\t\t\t\";\":\":\",\n",
       "\t\t\t\t\"'\":\"\\\"\",\n",
       "\t\t\t\t\",\":\"<\",\n",
       "\t\t\t\t\".\":\">\",\n",
       "\t\t\t\t\"/\":\"?\",\n",
       "\t\t\t\t\"\\\\\":\"|\"\n",
       "\t\t\t}\n",
       "\t\t\t//Special Keys - and their codes\n",
       "\t\t\tvar special_keys = {\n",
       "\t\t\t\t'esc':27,\n",
       "\t\t\t\t'escape':27,\n",
       "\t\t\t\t'tab':9,\n",
       "\t\t\t\t'space':32,\n",
       "\t\t\t\t'return':13,\n",
       "\t\t\t\t'enter':13,\n",
       "\t\t\t\t'backspace':8,\n",
       "\t\n",
       "\t\t\t\t'scrolllock':145,\n",
       "\t\t\t\t'scroll_lock':145,\n",
       "\t\t\t\t'scroll':145,\n",
       "\t\t\t\t'capslock':20,\n",
       "\t\t\t\t'caps_lock':20,\n",
       "\t\t\t\t'caps':20,\n",
       "\t\t\t\t'numlock':144,\n",
       "\t\t\t\t'num_lock':144,\n",
       "\t\t\t\t'num':144,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'pause':19,\n",
       "\t\t\t\t'break':19,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'insert':45,\n",
       "\t\t\t\t'home':36,\n",
       "\t\t\t\t'delete':46,\n",
       "\t\t\t\t'end':35,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'pageup':33,\n",
       "\t\t\t\t'page_up':33,\n",
       "\t\t\t\t'pu':33,\n",
       "\t\n",
       "\t\t\t\t'pagedown':34,\n",
       "\t\t\t\t'page_down':34,\n",
       "\t\t\t\t'pd':34,\n",
       "\t\n",
       "\t\t\t\t'left':37,\n",
       "\t\t\t\t'up':38,\n",
       "\t\t\t\t'right':39,\n",
       "\t\t\t\t'down':40,\n",
       "\t\n",
       "\t\t\t\t'f1':112,\n",
       "\t\t\t\t'f2':113,\n",
       "\t\t\t\t'f3':114,\n",
       "\t\t\t\t'f4':115,\n",
       "\t\t\t\t'f5':116,\n",
       "\t\t\t\t'f6':117,\n",
       "\t\t\t\t'f7':118,\n",
       "\t\t\t\t'f8':119,\n",
       "\t\t\t\t'f9':120,\n",
       "\t\t\t\t'f10':121,\n",
       "\t\t\t\t'f11':122,\n",
       "\t\t\t\t'f12':123\n",
       "\t\t\t}\n",
       "\t\n",
       "\t\t\tvar modifiers = { \n",
       "\t\t\t\tshift: { wanted:false, pressed:false},\n",
       "\t\t\t\tctrl : { wanted:false, pressed:false},\n",
       "\t\t\t\talt  : { wanted:false, pressed:false},\n",
       "\t\t\t\tmeta : { wanted:false, pressed:false}\t//Meta is Mac specific\n",
       "\t\t\t};\n",
       "                        \n",
       "\t\t\tif(e.ctrlKey)\tmodifiers.ctrl.pressed = true;\n",
       "\t\t\tif(e.shiftKey)\tmodifiers.shift.pressed = true;\n",
       "\t\t\tif(e.altKey)\tmodifiers.alt.pressed = true;\n",
       "\t\t\tif(e.metaKey)   modifiers.meta.pressed = true;\n",
       "                        \n",
       "\t\t\tfor(var i=0; k=keys[i],i<keys.length; i++) {\n",
       "\t\t\t\t//Modifiers\n",
       "\t\t\t\tif(k == 'ctrl' || k == 'control') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.ctrl.wanted = true;\n",
       "\n",
       "\t\t\t\t} else if(k == 'shift') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.shift.wanted = true;\n",
       "\n",
       "\t\t\t\t} else if(k == 'alt') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.alt.wanted = true;\n",
       "\t\t\t\t} else if(k == 'meta') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.meta.wanted = true;\n",
       "\t\t\t\t} else if(k.length > 1) { //If it is a special key\n",
       "\t\t\t\t\tif(special_keys[k] == code) kp++;\n",
       "\t\t\t\t\t\n",
       "\t\t\t\t} else if(opt['keycode']) {\n",
       "\t\t\t\t\tif(opt['keycode'] == code) kp++;\n",
       "\n",
       "\t\t\t\t} else { //The special keys did not match\n",
       "\t\t\t\t\tif(character == k) kp++;\n",
       "\t\t\t\t\telse {\n",
       "\t\t\t\t\t\tif(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase\n",
       "\t\t\t\t\t\t\tcharacter = shift_nums[character]; \n",
       "\t\t\t\t\t\t\tif(character == k) kp++;\n",
       "\t\t\t\t\t\t}\n",
       "\t\t\t\t\t}\n",
       "\t\t\t\t}\n",
       "\t\t\t}\n",
       "\t\t\t\n",
       "\t\t\tif(kp == keys.length && \n",
       "\t\t\t\t\t\tmodifiers.ctrl.pressed == modifiers.ctrl.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.shift.pressed == modifiers.shift.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.alt.pressed == modifiers.alt.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.meta.pressed == modifiers.meta.wanted) {\n",
       "\t\t\t\tcallback(e);\n",
       "\t\n",
       "\t\t\t\tif(!opt['propagate']) { //Stop the event\n",
       "\t\t\t\t\t//e.cancelBubble is supported by IE - this will kill the bubbling process.\n",
       "\t\t\t\t\te.cancelBubble = true;\n",
       "\t\t\t\t\te.returnValue = false;\n",
       "\t\n",
       "\t\t\t\t\t//e.stopPropagation works in Firefox.\n",
       "\t\t\t\t\tif (e.stopPropagation) {\n",
       "\t\t\t\t\t\te.stopPropagation();\n",
       "\t\t\t\t\t\te.preventDefault();\n",
       "\t\t\t\t\t}\n",
       "\t\t\t\t\treturn false;\n",
       "\t\t\t\t}\n",
       "\t\t\t}\n",
       "\t\t}\n",
       "\t\tthis.all_shortcuts[shortcut_combination] = {\n",
       "\t\t\t'callback':func, \n",
       "\t\t\t'target':ele, \n",
       "\t\t\t'event': opt['type']\n",
       "\t\t};\n",
       "\t\t//Attach the function with the event\n",
       "\t\tif(ele.addEventListener) ele.addEventListener(opt['type'], func, false);\n",
       "\t\telse if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func);\n",
       "\t\telse ele['on'+opt['type']] = func;\n",
       "\t},\n",
       "\n",
       "\t//Remove the shortcut - just specify the shortcut and I will remove the binding\n",
       "\t'remove':function(shortcut_combination) {\n",
       "\t\tshortcut_combination = shortcut_combination.toLowerCase();\n",
       "\t\tvar binding = this.all_shortcuts[shortcut_combination];\n",
       "\t\tdelete(this.all_shortcuts[shortcut_combination])\n",
       "\t\tif(!binding) return;\n",
       "\t\tvar type = binding['event'];\n",
       "\t\tvar ele = binding['target'];\n",
       "\t\tvar callback = binding['callback'];\n",
       "\n",
       "\t\tif(ele.detachEvent) ele.detachEvent('on'+type, callback);\n",
       "\t\telse if(ele.removeEventListener) ele.removeEventListener(type, callback, false);\n",
       "\t\telse ele['on'+type] = false;\n",
       "\t}\n",
       "}\n",
       "\n",
       "shortcut.add(\"Alt+Left\",function() {\n",
       "\tvar event = new Event('click');\n",
       "\tif (settingsShown){\n",
       "\t\tdocument.getElementById('hideSettingsButton_9').dispatchEvent(event);\n",
       "\t} else {\n",
       "\t\tdocument.getElementById('showSettingsButton_9').dispatchEvent(event);\n",
       "\t}\n",
       "});\n",
       "\n",
       "\n",
       "// COMMON_CODE_BLOCK_END\n",
       "\n",
       "});});\n",
       "      </script>\n",
       "   </body>\n",
       "</html>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "$q = new fan::PolyhedralComplex(POINTS=>$c,INPUT_POLYTOPES=>rows($f->MAXIMAL_CONES));\n",
    "$pro = fan::project_full($q);\n",
    "$pro->VISUAL;"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "polymake",
   "language": "polymake",
   "name": "polymake"
  },
  "language_info": {
   "codemirror_mode": "perl",
   "file_extension": ".pl",
   "mimetype": "text/x-polymake",
   "name": "polymake"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
