1{
2 "cells": [
3  {
4   "cell_type": "markdown",
5   "metadata": {},
6   "source": [
7    "# Polymake jupyter tutorials that should end up on the website\n",
8    "\n",
9    "\n",
10    "\n",
11    "Jupyter notebooks support github flavored markdown `gfm` which will be further treated by `pandocfilters` and `pandoc` during the conversion to dokuwiki. Here are some useful links:\n",
12    "\n",
13    "- [Working with markdown Cells in jupyter](https://jupyter-notebook.readthedocs.io/en/stable/examples/Notebook/Working%20With%20Markdown%20Cells.html)\n",
14    "- [github flavored markdown specs](https://github.github.com/gfm/)\n",
15    "- [pandoc](https://pandoc.org/)\n",
16    "- [pandocfilters](https://github.com/jgm/pandocfilters)\n",
17    "\n",
18    "In order to make everything work in both jupyter and dokuwiki (and without reediting much after conversion), there are a few general things to take note of :\n",
19    "\n",
20    "- Use only lower case letters, digits, hyphens and underscores for your notebook name. `[a-z0-9_-]`\n",
21    "- Do not put code (with backticks) inside of link or image captions\n",
22    "\n",
23    "Others require their own section:"
24   ]
25  },
26  {
27   "attachments": {
28    "logo.png": {
29     "image/png": "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"
30    }
31   },
32   "cell_type": "markdown",
33   "metadata": {},
34   "source": [
35    "## Markdown\n",
36    "### Embedding images\n",
37    "\n",
38    "Filenames of images should be lower case aswell and they should be base64 attached. Dragging and dropping them into the notebook creates a syntax like `![tooltip](attachment:logo.png)`. \n",
39    "![tooltip](attachment:logo.png)\n",
40    "\n",
41    "This syntax, however, does not support image formatting inside of the notebook or the dokuwiki page it will end up on. Thus, if you need more control use img tags and their style attribute. Some examples: \n",
42    "\n",
43    "An inline image: `<img src=attachment:logo.png width=15 alt=\"tooltip\" style=\"display: inline\">` <img src=attachment:logo.png width=15 alt=\"tooltip\" style=\"display: inline\">\n",
44    "\n",
45    "As a block: `<img src=attachment:logo.png alt=\"tooltip\"><img>`\n",
46    "<img src=attachment:logo.png alt=\"tooltip\"><img>\n",
47    "\n",
48    "\n",
49    "To display the image as a centered block in dokuwiki, like it is the default in jupyter, you may add something like `style=\"display: block, margin-left: auto, margin-right: auto\"` or use the css `class=\"center-block\"`\n",
50    "<img src=attachment:logo.png alt=\"tooltip\" class=\"center-block\">\n",
51    "\n",
52    "Attached images will be extracted and the conversion process handles the replacement of \"attachment:\" with a proper link to the image in dokuwiki.  "
53   ]
54  },
55  {
56   "cell_type": "markdown",
57   "metadata": {},
58   "source": [
59    "### Links\n",
60    "\n",
61    "To other ipynbs: \n",
62    "\n",
63    "`[Tutorial on Polytopes](apps_polytope.ipynb)`:\n",
64    "[Tutorial on polytopes](apps_polytope.ipynb)\n",
65    "\n",
66    "Internal section links: \n",
67    "\n",
68    "`[Markdown testing](#Markdown-testing)`:\n",
69    "[Markdown testing](#Markdown-testing)\n",
70    "\n",
71    "Due to differing seperation characters `-` in jupyter and `_` in polymake dokuwiki, it is not possible to link to section headings with hyphens directly, yet simply adding a dokuwiki friendly hyperlink `<a id=\"a_non_hyphen_free_heading\"></a>` is a workaround: \n",
72    "\n",
73    "`[A non hyphen-free heading](#a_non_hyphen_free_heading)`:\n",
74    "[A non hyphen-free heading](#a_non_hyphen_free_heading)\n",
75    "\n",
76    "Links to sections in other ipynbs: \n",
77    "\n",
78    "`[Convex Hulls in the tutorial on polytopes](apps_polytope.ipynb#Convex-Hulls)`\n",
79    "[Convex Hulls in the tutorial on polytopes](apps_polytope.ipynb#Convex-Hulls)\n",
80    "\n",
81    "To something in the documentation: \n",
82    "\n",
83    "`[linearprogram properties](https://polymake.org/doku.php/documentation/latest/polytope/linearprogram#properties)`\n",
84    "[linearprogram properties](https://polymake.org/doku.php/documentation/latest/polytope/linearprogram#properties)\n",
85    "\n",
86    "To a downloadable file:\n",
87    "\n",
88    "`[filtrationexample]https://polymake.org/lib/exe/fetch.php/tutorial/filtrationexample.top`\n",
89    "[filtrationexample](https://polymake.org/lib/exe/fetch.php/tutorial/filtrationexample.top)\n",
90    "\n",
91    "\n",
92    "<a name=\"a_non_hyphen_free_heading\"></a>\n",
93    "### A non hyphen-free heading "
94   ]
95  },
96  {
97   "cell_type": "markdown",
98   "metadata": {},
99   "source": [
100    "## Code\n",
101    "\n",
102    "Svg and threejs output created in notebooks will also end up on the dokuwiki website. Thus, for working with notebooks that already contain svg output, it is recommended to have the perl SVG module installed and svg configured\n",
103    "\n",
104    "```perl\n",
105    "reconfigure(\"common::svg.rules\");\n",
106    "```\n",
107    "\n",
108    "If svg is configured, it will be the prefered output for lattices in jupyter polymake."
109   ]
110  },
111  {
112   "cell_type": "code",
113   "execution_count": 1,
114   "metadata": {},
115   "outputs": [
116    {
117     "data": {
118      "text/html": [
119       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n",
120       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.0//EN\" \"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd\">\n",
121       "<svg height=\"841pt\" id=\"document\" viewBox=\"0 -824 570 824\" width=\"595pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:svg=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
122       "\t<title id=\"document_title\">unnamed</title>\n",
123       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"253.883125864454\" x2=\"297.5\" y1=\"-597.5\" y2=\"-774.5\" />\n",
124       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"341.666666666667\" x2=\"297.5\" y1=\"-597.5\" y2=\"-774.5\" />\n",
125       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"166.099585062241\" x2=\"297.5\" y1=\"-597.5\" y2=\"-774.5\" />\n",
126       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"429.45020746888\" x2=\"297.5\" y1=\"-597.5\" y2=\"-774.5\" />\n",
127       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"517.233748271093\" x2=\"297.5\" y1=\"-597.5\" y2=\"-774.5\" />\n",
128       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"78.3160442600276\" x2=\"297.5\" y1=\"-597.5\" y2=\"-774.5\" />\n",
129       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"142.916666666667\" x2=\"253.883125864454\" y1=\"-420.5\" y2=\"-597.5\" />\n",
130       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"142.916666666667\" x2=\"166.099585062241\" y1=\"-420.5\" y2=\"-597.5\" />\n",
131       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"363.75\" x2=\"253.883125864454\" y1=\"-420.5\" y2=\"-597.5\" />\n",
132       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"363.75\" x2=\"429.45020746888\" y1=\"-420.5\" y2=\"-597.5\" />\n",
133       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"407.916666666667\" x2=\"253.883125864454\" y1=\"-420.5\" y2=\"-597.5\" />\n",
134       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"407.916666666667\" x2=\"517.233748271093\" y1=\"-420.5\" y2=\"-597.5\" />\n",
135       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"98.75\" x2=\"253.883125864454\" y1=\"-420.5\" y2=\"-597.5\" />\n",
136       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"98.75\" x2=\"78.3160442600276\" y1=\"-420.5\" y2=\"-597.5\" />\n",
137       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"231.25\" x2=\"341.666666666667\" y1=\"-420.5\" y2=\"-597.5\" />\n",
138       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"231.25\" x2=\"166.099585062241\" y1=\"-420.5\" y2=\"-597.5\" />\n",
139       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"452.083333333333\" x2=\"341.666666666667\" y1=\"-420.5\" y2=\"-597.5\" />\n",
140       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"452.083333333333\" x2=\"429.45020746888\" y1=\"-420.5\" y2=\"-597.5\" />\n",
141       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"496.25\" x2=\"341.666666666667\" y1=\"-420.5\" y2=\"-597.5\" />\n",
142       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"496.25\" x2=\"517.233748271093\" y1=\"-420.5\" y2=\"-597.5\" />\n",
143       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"187.083333333333\" x2=\"341.666666666667\" y1=\"-420.5\" y2=\"-597.5\" />\n",
144       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"187.083333333333\" x2=\"78.3160442600276\" y1=\"-420.5\" y2=\"-597.5\" />\n",
145       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"319.583333333333\" x2=\"166.099585062241\" y1=\"-420.5\" y2=\"-597.5\" />\n",
146       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"319.583333333333\" x2=\"517.233748271093\" y1=\"-420.5\" y2=\"-597.5\" />\n",
147       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"54.5833333333333\" x2=\"166.099585062241\" y1=\"-420.5\" y2=\"-597.5\" />\n",
148       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"54.5833333333333\" x2=\"78.3160442600276\" y1=\"-420.5\" y2=\"-597.5\" />\n",
149       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"540.416666666667\" x2=\"429.45020746888\" y1=\"-420.5\" y2=\"-597.5\" />\n",
150       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"540.416666666667\" x2=\"517.233748271093\" y1=\"-420.5\" y2=\"-597.5\" />\n",
151       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"275.416666666667\" x2=\"429.45020746888\" y1=\"-420.5\" y2=\"-597.5\" />\n",
152       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"275.416666666667\" x2=\"78.3160442600276\" y1=\"-420.5\" y2=\"-597.5\" />\n",
153       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"290.337837837838\" x2=\"142.916666666667\" y1=\"-243.5\" y2=\"-420.5\" />\n",
154       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"290.337837837838\" x2=\"407.916666666667\" y1=\"-243.5\" y2=\"-420.5\" />\n",
155       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"290.337837837838\" x2=\"319.583333333333\" y1=\"-243.5\" y2=\"-420.5\" />\n",
156       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"347.635135135135\" x2=\"231.25\" y1=\"-243.5\" y2=\"-420.5\" />\n",
157       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"347.635135135135\" x2=\"496.25\" y1=\"-243.5\" y2=\"-420.5\" />\n",
158       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"347.635135135135\" x2=\"319.583333333333\" y1=\"-243.5\" y2=\"-420.5\" />\n",
159       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"433.581081081081\" x2=\"363.75\" y1=\"-243.5\" y2=\"-420.5\" />\n",
160       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"433.581081081081\" x2=\"407.916666666667\" y1=\"-243.5\" y2=\"-420.5\" />\n",
161       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"433.581081081081\" x2=\"540.416666666667\" y1=\"-243.5\" y2=\"-420.5\" />\n",
162       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"490.878378378378\" x2=\"452.083333333333\" y1=\"-243.5\" y2=\"-420.5\" />\n",
163       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"490.878378378378\" x2=\"496.25\" y1=\"-243.5\" y2=\"-420.5\" />\n",
164       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"490.878378378378\" x2=\"540.416666666667\" y1=\"-243.5\" y2=\"-420.5\" />\n",
165       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"104.121621621622\" x2=\"142.916666666667\" y1=\"-243.5\" y2=\"-420.5\" />\n",
166       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"104.121621621622\" x2=\"98.75\" y1=\"-243.5\" y2=\"-420.5\" />\n",
167       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"104.121621621622\" x2=\"54.5833333333333\" y1=\"-243.5\" y2=\"-420.5\" />\n",
168       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"161.418918918919\" x2=\"231.25\" y1=\"-243.5\" y2=\"-420.5\" />\n",
169       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"161.418918918919\" x2=\"187.083333333333\" y1=\"-243.5\" y2=\"-420.5\" />\n",
170       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"161.418918918919\" x2=\"54.5833333333333\" y1=\"-243.5\" y2=\"-420.5\" />\n",
171       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"247.364864864865\" x2=\"363.75\" y1=\"-243.5\" y2=\"-420.5\" />\n",
172       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"247.364864864865\" x2=\"98.75\" y1=\"-243.5\" y2=\"-420.5\" />\n",
173       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"247.364864864865\" x2=\"275.416666666667\" y1=\"-243.5\" y2=\"-420.5\" />\n",
174       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"312.696067436731\" x2=\"452.083333333333\" y1=\"-243.5\" y2=\"-420.5\" />\n",
175       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"312.696067436731\" x2=\"187.083333333333\" y1=\"-243.5\" y2=\"-420.5\" />\n",
176       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"312.696067436731\" x2=\"275.416666666667\" y1=\"-243.5\" y2=\"-420.5\" />\n",
177       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"297.5\" x2=\"290.337837837838\" y1=\"-66.5\" y2=\"-243.5\" />\n",
178       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"297.5\" x2=\"347.635135135135\" y1=\"-66.5\" y2=\"-243.5\" />\n",
179       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"297.5\" x2=\"433.581081081081\" y1=\"-66.5\" y2=\"-243.5\" />\n",
180       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"297.5\" x2=\"490.878378378378\" y1=\"-66.5\" y2=\"-243.5\" />\n",
181       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"297.5\" x2=\"104.121621621622\" y1=\"-66.5\" y2=\"-243.5\" />\n",
182       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"297.5\" x2=\"161.418918918919\" y1=\"-66.5\" y2=\"-243.5\" />\n",
183       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"297.5\" x2=\"247.364864864865\" y1=\"-66.5\" y2=\"-243.5\" />\n",
184       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"297.5\" x2=\"312.696067436731\" y1=\"-66.5\" y2=\"-243.5\" />\n",
185       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(0,0,0); stroke: rgb(0,0,0); stroke-width: 1\" width=\"14.52\" x=\"290.24\" y=\"-782.5\" />\n",
186       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"297.5\" y=\"-772\"> </text>\n",
187       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"38.32\" x=\"234.723125864454\" y=\"-605.5\" />\n",
188       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"253.883125864454\" y=\"-595\">0 2 4 6</text>\n",
189       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"38.32\" x=\"322.506666666667\" y=\"-605.5\" />\n",
190       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"341.666666666667\" y=\"-595\">1 3 5 7</text>\n",
191       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"38.32\" x=\"146.939585062241\" y=\"-605.5\" />\n",
192       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"166.099585062241\" y=\"-595\">0 1 4 5</text>\n",
193       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"38.32\" x=\"410.29020746888\" y=\"-605.5\" />\n",
194       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"429.45020746888\" y=\"-595\">2 3 6 7</text>\n",
195       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"38.32\" x=\"498.073748271093\" y=\"-605.5\" />\n",
196       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"517.233748271093\" y=\"-595\">0 1 2 3</text>\n",
197       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"38.32\" x=\"59.1560442600276\" y=\"-605.5\" />\n",
198       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"78.3160442600276\" y=\"-595\">4 5 6 7</text>\n",
199       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"19.28\" x=\"133.276666666667\" y=\"-428.5\" />\n",
200       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"142.916666666667\" y=\"-418\">0 4</text>\n",
201       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"19.28\" x=\"354.11\" y=\"-428.5\" />\n",
202       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"363.75\" y=\"-418\">2 6</text>\n",
203       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"19.28\" x=\"398.276666666667\" y=\"-428.5\" />\n",
204       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"407.916666666667\" y=\"-418\">0 2</text>\n",
205       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"19.28\" x=\"89.11\" y=\"-428.5\" />\n",
206       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"98.75\" y=\"-418\">4 6</text>\n",
207       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"19.28\" x=\"221.61\" y=\"-428.5\" />\n",
208       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"231.25\" y=\"-418\">1 5</text>\n",
209       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"19.28\" x=\"442.443333333333\" y=\"-428.5\" />\n",
210       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"452.083333333333\" y=\"-418\">3 7</text>\n",
211       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"19.28\" x=\"486.61\" y=\"-428.5\" />\n",
212       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"496.25\" y=\"-418\">1 3</text>\n",
213       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"19.28\" x=\"177.443333333333\" y=\"-428.5\" />\n",
214       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"187.083333333333\" y=\"-418\">5 7</text>\n",
215       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"19.28\" x=\"309.943333333333\" y=\"-428.5\" />\n",
216       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"319.583333333333\" y=\"-418\">0 1</text>\n",
217       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"19.28\" x=\"44.9433333333333\" y=\"-428.5\" />\n",
218       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"54.5833333333333\" y=\"-418\">4 5</text>\n",
219       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"19.28\" x=\"530.776666666667\" y=\"-428.5\" />\n",
220       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"540.416666666667\" y=\"-418\">2 3</text>\n",
221       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"19.28\" x=\"265.776666666667\" y=\"-428.5\" />\n",
222       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"275.416666666667\" y=\"-418\">6 7</text>\n",
223       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"9.76\" x=\"285.457837837838\" y=\"-251.5\" />\n",
224       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"290.337837837838\" y=\"-241\">0</text>\n",
225       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"9.76\" x=\"342.755135135135\" y=\"-251.5\" />\n",
226       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"347.635135135135\" y=\"-241\">1</text>\n",
227       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"9.76\" x=\"428.701081081081\" y=\"-251.5\" />\n",
228       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"433.581081081081\" y=\"-241\">2</text>\n",
229       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"9.76\" x=\"485.998378378378\" y=\"-251.5\" />\n",
230       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"490.878378378378\" y=\"-241\">3</text>\n",
231       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"9.76\" x=\"99.2416216216216\" y=\"-251.5\" />\n",
232       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"104.121621621622\" y=\"-241\">4</text>\n",
233       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"9.76\" x=\"156.538918918919\" y=\"-251.5\" />\n",
234       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"161.418918918919\" y=\"-241\">5</text>\n",
235       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"9.76\" x=\"242.484864864865\" y=\"-251.5\" />\n",
236       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"247.364864864865\" y=\"-241\">6</text>\n",
237       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"9.76\" x=\"307.816067436731\" y=\"-251.5\" />\n",
238       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"312.696067436731\" y=\"-241\">7</text>\n",
239       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"14.52\" x=\"290.24\" y=\"-74.5\" />\n",
240       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"297.5\" y=\"-64\"> </text>\n",
241       "\t<!--\n",
242       "\tGenerated using the Perl SVG Module V2.84\n",
243       "\tby Ronan Oger\n",
244       "\tInfo: http://www.roitsystems.com/\n",
245       "\t-->\n",
246       "</svg>"
247      ]
248     },
249     "metadata": {},
250     "output_type": "display_data"
251    },
252    {
253     "data": {
254      "text/html": [
255       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n",
256       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.0//EN\" \"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd\">\n",
257       "<svg height=\"841pt\" id=\"document\" viewBox=\"0 -824 570 824\" width=\"595pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:svg=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
258       "\t<title id=\"document_title\">unnamed</title>\n",
259       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"517.233748271093\" x2=\"297.5\" y1=\"-597.5\" y2=\"-774.5\" />\n",
260       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"78.3160442600276\" x2=\"297.5\" y1=\"-597.5\" y2=\"-774.5\" />\n",
261       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"429.45020746888\" x2=\"297.5\" y1=\"-597.5\" y2=\"-774.5\" />\n",
262       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"253.883125864454\" x2=\"297.5\" y1=\"-597.5\" y2=\"-774.5\" />\n",
263       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"166.099585062241\" x2=\"297.5\" y1=\"-597.5\" y2=\"-774.5\" />\n",
264       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"341.666666666667\" x2=\"297.5\" y1=\"-597.5\" y2=\"-774.5\" />\n",
265       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"540.416666666667\" x2=\"517.233748271093\" y1=\"-420.5\" y2=\"-597.5\" />\n",
266       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"540.416666666667\" x2=\"429.45020746888\" y1=\"-420.5\" y2=\"-597.5\" />\n",
267       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"407.916666666667\" x2=\"517.233748271093\" y1=\"-420.5\" y2=\"-597.5\" />\n",
268       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"407.916666666667\" x2=\"253.883125864454\" y1=\"-420.5\" y2=\"-597.5\" />\n",
269       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"363.75\" x2=\"517.233748271093\" y1=\"-420.5\" y2=\"-597.5\" />\n",
270       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"363.75\" x2=\"166.099585062241\" y1=\"-420.5\" y2=\"-597.5\" />\n",
271       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"496.25\" x2=\"517.233748271093\" y1=\"-420.5\" y2=\"-597.5\" />\n",
272       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"496.25\" x2=\"341.666666666667\" y1=\"-420.5\" y2=\"-597.5\" />\n",
273       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"231.25\" x2=\"78.3160442600276\" y1=\"-420.5\" y2=\"-597.5\" />\n",
274       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"231.25\" x2=\"429.45020746888\" y1=\"-420.5\" y2=\"-597.5\" />\n",
275       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"98.75\" x2=\"78.3160442600276\" y1=\"-420.5\" y2=\"-597.5\" />\n",
276       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"98.75\" x2=\"253.883125864454\" y1=\"-420.5\" y2=\"-597.5\" />\n",
277       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"54.5833333333333\" x2=\"78.3160442600276\" y1=\"-420.5\" y2=\"-597.5\" />\n",
278       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"54.5833333333333\" x2=\"166.099585062241\" y1=\"-420.5\" y2=\"-597.5\" />\n",
279       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"187.083333333333\" x2=\"78.3160442600276\" y1=\"-420.5\" y2=\"-597.5\" />\n",
280       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"187.083333333333\" x2=\"341.666666666667\" y1=\"-420.5\" y2=\"-597.5\" />\n",
281       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"275.416666666667\" x2=\"429.45020746888\" y1=\"-420.5\" y2=\"-597.5\" />\n",
282       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"275.416666666667\" x2=\"166.099585062241\" y1=\"-420.5\" y2=\"-597.5\" />\n",
283       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"452.083333333333\" x2=\"429.45020746888\" y1=\"-420.5\" y2=\"-597.5\" />\n",
284       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"452.083333333333\" x2=\"341.666666666667\" y1=\"-420.5\" y2=\"-597.5\" />\n",
285       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"142.916666666667\" x2=\"253.883125864454\" y1=\"-420.5\" y2=\"-597.5\" />\n",
286       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"142.916666666667\" x2=\"166.099585062241\" y1=\"-420.5\" y2=\"-597.5\" />\n",
287       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"319.583333333333\" x2=\"253.883125864454\" y1=\"-420.5\" y2=\"-597.5\" />\n",
288       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"319.583333333333\" x2=\"341.666666666667\" y1=\"-420.5\" y2=\"-597.5\" />\n",
289       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"390.608108108108\" x2=\"540.416666666667\" y1=\"-243.5\" y2=\"-420.5\" />\n",
290       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"390.608108108108\" x2=\"363.75\" y1=\"-243.5\" y2=\"-420.5\" />\n",
291       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"390.608108108108\" x2=\"275.416666666667\" y1=\"-243.5\" y2=\"-420.5\" />\n",
292       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"190.067567567568\" x2=\"231.25\" y1=\"-243.5\" y2=\"-420.5\" />\n",
293       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"190.067567567568\" x2=\"54.5833333333333\" y1=\"-243.5\" y2=\"-420.5\" />\n",
294       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"190.067567567568\" x2=\"275.416666666667\" y1=\"-243.5\" y2=\"-420.5\" />\n",
295       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"304.662162162162\" x2=\"407.916666666667\" y1=\"-243.5\" y2=\"-420.5\" />\n",
296       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"304.662162162162\" x2=\"363.75\" y1=\"-243.5\" y2=\"-420.5\" />\n",
297       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"304.662162162162\" x2=\"142.916666666667\" y1=\"-243.5\" y2=\"-420.5\" />\n",
298       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"104.121621621622\" x2=\"98.75\" y1=\"-243.5\" y2=\"-420.5\" />\n",
299       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"104.121621621622\" x2=\"54.5833333333333\" y1=\"-243.5\" y2=\"-420.5\" />\n",
300       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"104.121621621622\" x2=\"142.916666666667\" y1=\"-243.5\" y2=\"-420.5\" />\n",
301       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"490.878378378378\" x2=\"540.416666666667\" y1=\"-243.5\" y2=\"-420.5\" />\n",
302       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"490.878378378378\" x2=\"496.25\" y1=\"-243.5\" y2=\"-420.5\" />\n",
303       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"490.878378378378\" x2=\"452.083333333333\" y1=\"-243.5\" y2=\"-420.5\" />\n",
304       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"282.303932563269\" x2=\"231.25\" y1=\"-243.5\" y2=\"-420.5\" />\n",
305       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"282.303932563269\" x2=\"187.083333333333\" y1=\"-243.5\" y2=\"-420.5\" />\n",
306       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"282.303932563269\" x2=\"452.083333333333\" y1=\"-243.5\" y2=\"-420.5\" />\n",
307       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"412.966337707002\" x2=\"407.916666666667\" y1=\"-243.5\" y2=\"-420.5\" />\n",
308       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"412.966337707002\" x2=\"496.25\" y1=\"-243.5\" y2=\"-420.5\" />\n",
309       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"412.966337707002\" x2=\"319.583333333333\" y1=\"-243.5\" y2=\"-420.5\" />\n",
310       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"212.425797166461\" x2=\"98.75\" y1=\"-243.5\" y2=\"-420.5\" />\n",
311       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"212.425797166461\" x2=\"187.083333333333\" y1=\"-243.5\" y2=\"-420.5\" />\n",
312       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"212.425797166461\" x2=\"319.583333333333\" y1=\"-243.5\" y2=\"-420.5\" />\n",
313       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"297.5\" x2=\"390.608108108108\" y1=\"-66.5\" y2=\"-243.5\" />\n",
314       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"297.5\" x2=\"190.067567567568\" y1=\"-66.5\" y2=\"-243.5\" />\n",
315       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"297.5\" x2=\"304.662162162162\" y1=\"-66.5\" y2=\"-243.5\" />\n",
316       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"297.5\" x2=\"104.121621621622\" y1=\"-66.5\" y2=\"-243.5\" />\n",
317       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"297.5\" x2=\"490.878378378378\" y1=\"-66.5\" y2=\"-243.5\" />\n",
318       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"297.5\" x2=\"282.303932563269\" y1=\"-66.5\" y2=\"-243.5\" />\n",
319       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"297.5\" x2=\"412.966337707002\" y1=\"-66.5\" y2=\"-243.5\" />\n",
320       "\t<line stroke=\"rgb(0,0,0)\" stroke-width=\"1\" x1=\"297.5\" x2=\"212.425797166461\" y1=\"-66.5\" y2=\"-243.5\" />\n",
321       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(0,0,0); stroke: rgb(0,0,0); stroke-width: 1\" width=\"14.52\" x=\"290.24\" y=\"-782.5\" />\n",
322       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"297.5\" y=\"-772\"> </text>\n",
323       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"38.32\" x=\"498.073748271093\" y=\"-605.5\" />\n",
324       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"517.233748271093\" y=\"-595\">0 2 4 6</text>\n",
325       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"38.32\" x=\"59.1560442600276\" y=\"-605.5\" />\n",
326       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"78.3160442600276\" y=\"-595\">1 3 5 7</text>\n",
327       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"38.32\" x=\"410.29020746888\" y=\"-605.5\" />\n",
328       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"429.45020746888\" y=\"-595\">0 1 4 5</text>\n",
329       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"38.32\" x=\"234.723125864454\" y=\"-605.5\" />\n",
330       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"253.883125864454\" y=\"-595\">2 3 6 7</text>\n",
331       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"38.32\" x=\"146.939585062241\" y=\"-605.5\" />\n",
332       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"166.099585062241\" y=\"-595\">0 1 2 3</text>\n",
333       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"38.32\" x=\"322.506666666667\" y=\"-605.5\" />\n",
334       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"341.666666666667\" y=\"-595\">4 5 6 7</text>\n",
335       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"19.28\" x=\"530.776666666667\" y=\"-428.5\" />\n",
336       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"540.416666666667\" y=\"-418\">0 4</text>\n",
337       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"19.28\" x=\"398.276666666667\" y=\"-428.5\" />\n",
338       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"407.916666666667\" y=\"-418\">2 6</text>\n",
339       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"19.28\" x=\"354.11\" y=\"-428.5\" />\n",
340       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"363.75\" y=\"-418\">0 2</text>\n",
341       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"19.28\" x=\"486.61\" y=\"-428.5\" />\n",
342       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"496.25\" y=\"-418\">4 6</text>\n",
343       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"19.28\" x=\"221.61\" y=\"-428.5\" />\n",
344       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"231.25\" y=\"-418\">1 5</text>\n",
345       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"19.28\" x=\"89.11\" y=\"-428.5\" />\n",
346       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"98.75\" y=\"-418\">3 7</text>\n",
347       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"19.28\" x=\"44.9433333333333\" y=\"-428.5\" />\n",
348       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"54.5833333333333\" y=\"-418\">1 3</text>\n",
349       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"19.28\" x=\"177.443333333333\" y=\"-428.5\" />\n",
350       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"187.083333333333\" y=\"-418\">5 7</text>\n",
351       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"19.28\" x=\"265.776666666667\" y=\"-428.5\" />\n",
352       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"275.416666666667\" y=\"-418\">0 1</text>\n",
353       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"19.28\" x=\"442.443333333333\" y=\"-428.5\" />\n",
354       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"452.083333333333\" y=\"-418\">4 5</text>\n",
355       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"19.28\" x=\"133.276666666667\" y=\"-428.5\" />\n",
356       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"142.916666666667\" y=\"-418\">2 3</text>\n",
357       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"19.28\" x=\"309.943333333333\" y=\"-428.5\" />\n",
358       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"319.583333333333\" y=\"-418\">6 7</text>\n",
359       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"9.76\" x=\"385.728108108108\" y=\"-251.5\" />\n",
360       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"390.608108108108\" y=\"-241\">0</text>\n",
361       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"9.76\" x=\"185.187567567568\" y=\"-251.5\" />\n",
362       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"190.067567567568\" y=\"-241\">1</text>\n",
363       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"9.76\" x=\"299.782162162162\" y=\"-251.5\" />\n",
364       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"304.662162162162\" y=\"-241\">2</text>\n",
365       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"9.76\" x=\"99.2416216216216\" y=\"-251.5\" />\n",
366       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"104.121621621622\" y=\"-241\">3</text>\n",
367       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"9.76\" x=\"485.998378378378\" y=\"-251.5\" />\n",
368       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"490.878378378378\" y=\"-241\">4</text>\n",
369       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"9.76\" x=\"277.423932563269\" y=\"-251.5\" />\n",
370       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"282.303932563269\" y=\"-241\">5</text>\n",
371       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"9.76\" x=\"408.086337707002\" y=\"-251.5\" />\n",
372       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"412.966337707002\" y=\"-241\">6</text>\n",
373       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"9.76\" x=\"207.545797166461\" y=\"-251.5\" />\n",
374       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"212.425797166461\" y=\"-241\">7</text>\n",
375       "\t<rect height=\"13.5\" rx=\"0\" ry=\"0\" style=\"fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1\" width=\"14.52\" x=\"290.24\" y=\"-74.5\" />\n",
376       "\t<text font-family=\"Times-Roman\" font-size=\"10\" text-anchor=\"middle\" x=\"297.5\" y=\"-64\"> </text>\n",
377       "\t<!--\n",
378       "\tGenerated using the Perl SVG Module V2.84\n",
379       "\tby Ronan Oger\n",
380       "\tInfo: http://www.roitsystems.com/\n",
381       "\t-->\n",
382       "</svg>"
383      ]
384     },
385     "metadata": {},
386     "output_type": "display_data"
387    },
388    {
389     "data": {
390      "text/html": [
391       "<details><summary><pre style=\"display:inline\"><small>Click here for additional output</small></pre></summary>\n",
392       "<pre>\n",
393       "polymake: used package SVG\n",
394       "   Generated using the Perl SVG Module\n",
395       "   by Ronan Oger\n",
396       "\n",
397       "</pre>\n",
398       "</details>\n"
399      ]
400     },
401     "metadata": {},
402     "output_type": "display_data"
403    }
404   ],
405   "source": [
406    "svg(cube(3)->HASSE_DIAGRAM->VISUAL);\n",
407    "cube(3)->HASSE_DIAGRAM->VISUAL;"
408   ]
409  },
410  {
411   "cell_type": "code",
412   "execution_count": 2,
413   "metadata": {},
414   "outputs": [
415    {
416     "data": {
417      "text/html": [
418       "<!--\n",
419       "polymake for knusper\n",
420       "Thu Aug 27 11:38:57 2020\n",
421       "unnamed\n",
422       "-->\n",
423       "\n",
424       "\n",
425       "<html>\n",
426       "   <head>\n",
427       "      <meta charset=utf-8>\n",
428       "      <title>unnamed</title>\n",
429       "      <style>\n",
430       "/*\n",
431       "// COMMON_CODE_BLOCK_BEGIN\n",
432       "*/\n",
433       "         html {overflow: scroll;}\n",
434       "         strong{font-size: 18px;}\n",
435       "         canvas { z-index: 8; }\n",
436       "         input[type='radio'] {margin-left:0;}\n",
437       "         input[type='checkbox'] {margin-right:7px; margin-left: 0px; padding-left:0px;}\n",
438       "         .group{padding-bottom: 15px;}\n",
439       "         .settings * {z-index: 11; }\n",
440       "         .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",
441       "         .indented{margin-left: 20px; margin-top: 10px; padding-bottom: 0px;} \n",
442       "         .shownObjectsList{overflow: auto; max-width: 150px; max-height: 150px;}\n",
443       "         .showSettingsButton{visibility: visible; z-index: 12; position: absolute }\n",
444       "         .hideSettingsButton{visibility: hidden; z-index: 12; position: absolute; opacity: 0.5}\n",
445       "         button{margin-left: 0; margin-top: 10px}\n",
446       "         img{cursor: pointer;}\n",
447       "         .suboption{padding-top: 15px;}\n",
448       "         #model12887458766 { width: 100%; height: 100%; }\n",
449       "         .threejs_container { width: 100%; height: 75vh;}\n",
450       "         .settings{max-height: 74vh} \n",
451       "         input[type=range] {\n",
452       "           -webkit-appearance: none;\n",
453       "           padding:0; \n",
454       "           width:90%; \n",
455       "           margin-left: auto;\n",
456       "           margin-right: auto;\n",
457       "           margin-top: 15px;\n",
458       "           margin-bottom: 15px;\n",
459       "           display: block;\t\n",
460       "         }\n",
461       "         input[type=range]:focus {\n",
462       "           outline: none;\n",
463       "         }\n",
464       "         input[type=range]::-webkit-slider-runnable-track {\n",
465       "           height: 4px;\n",
466       "           cursor: pointer;\n",
467       "           animate: 0.2s;\n",
468       "           box-shadow: 0px 0px 0px #000000;\n",
469       "           background: #E3E3E3;\n",
470       "           border-radius: 0px;\n",
471       "           border: 0px solid #000000;\n",
472       "         }\n",
473       "         input[type=range]::-webkit-slider-thumb {\n",
474       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
475       "           border: 1px solid #ABABAB;\n",
476       "           height: 13px;\n",
477       "           width: 25px;\n",
478       "           border-radius: 20px;\n",
479       "           background: #E0E0E0;\n",
480       "           cursor: pointer;\n",
481       "           -webkit-appearance: none;\n",
482       "           margin-top: -5px;\n",
483       "         }\n",
484       "         input[type=range]:focus::-webkit-slider-runnable-track {\n",
485       "           background: #E3E3E3;\n",
486       "         }\n",
487       "         input[type=range]::-moz-range-track {\n",
488       "           height: 4px;\n",
489       "           cursor: pointer;\n",
490       "           animate: 0.2s;\n",
491       "           box-shadow: 0px 0px 0px #000000;\n",
492       "           background: #E3E3E3;\n",
493       "           border-radius: 0px;\n",
494       "           border: 0px solid #000000;\n",
495       "         }\n",
496       "         input[type=range]::-moz-range-thumb {\n",
497       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
498       "           border: 1px solid #ABABAB;\n",
499       "           height: 13px;\n",
500       "           width: 25px;\n",
501       "           border-radius: 20px;\n",
502       "           background: #E0E0E0;\n",
503       "           cursor: pointer;\n",
504       "         }\n",
505       "         input[type=range]::-ms-track {\n",
506       "           height: 4px;\n",
507       "           cursor: pointer;\n",
508       "           animate: 0.2s;\n",
509       "           background: transparent;\n",
510       "           border-color: transparent;\n",
511       "           color: transparent;\n",
512       "         }\n",
513       "         input[type=range]::-ms-fill-lower {\n",
514       "           background: #E3E3E3;\n",
515       "           border: 0px solid #000000;\n",
516       "           border-radius: 0px;\n",
517       "           box-shadow: 0px 0px 0px #000000;\n",
518       "         }\n",
519       "         input[type=range]::-ms-fill-upper {\n",
520       "           background: #E3E3E3;\n",
521       "           border: 0px solid #000000;\n",
522       "           border-radius: 0px;\n",
523       "           box-shadow: 0px 0px 0px #000000;\n",
524       "         }\n",
525       "         input[type=range]::-ms-thumb {\n",
526       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
527       "           border: 1px solid #ABABAB;\n",
528       "           height: 13px;\n",
529       "           width: 25px;\n",
530       "           border-radius: 20px;\n",
531       "           background: #E0E0E0;\n",
532       "           cursor: pointer;\n",
533       "         }\n",
534       "         input[type=range]:focus::-ms-fill-lower {\n",
535       "           background: #E3E3E3;\n",
536       "         }\n",
537       "         input[type=range]:focus::-ms-fill-upper {\n",
538       "           background: #E3E3E3;\n",
539       "         }\n",
540       "/*\n",
541       "// COMMON_CODE_BLOCK_END\n",
542       "*/\n",
543       "\t\t</style>\n",
544       "   </head>\n",
545       "<body>\n",
546       "   <div class='threejs_container'>\n",
547       "\t\t<div id='settings_0' class='settings'>\n",
548       "\t\t\t<div class=group id='transparency_0' class='transparency'>\n",
549       "\t\t\t\t<strong>Transparency</strong>\n",
550       "\t\t\t\t<input id='transparencyRange_0' type='range' min=0 max=1 step=0.01 value=0>\n",
551       "\t\t\t</div>\n",
552       "\t\t\t\n",
553       "\t\t\t<div class=group id='rotation_0'>\n",
554       "\t\t\t\t<strong>Rotation</strong>\n",
555       "\t\t\t\t<div class=indented>\n",
556       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationX_0'> x-axis</div>\n",
557       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationY_0'> y-axis</div>\n",
558       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationZ_0'> z-axis</div>\n",
559       "\t\t\t\t\t<button id='resetButton_0'>Reset</button>\n",
560       "\t\t\t\t</div>\n",
561       "\n",
562       "\t\t\t\t<div class=suboption>Rotation speed</div>\n",
563       "\t\t\t\t<input id='rotationSpeedRange_0' type='range' min=0 max=5 step=0.01 value=2>\n",
564       "\t\t\t</div>\n",
565       "\n",
566       "\n",
567       "\t\t\t<div class=group id='display_0'>\n",
568       "\t\t\t\t<strong>Display</strong>\n",
569       "\t\t\t\t<div class=indented>\n",
570       "\t\t\t\t\t<div id='shownObjectTypesList_0' class='shownObjectsList'></div>\n",
571       "\t\t\t\t</div>\n",
572       "\t\t\t\t<div class=suboption>Objects</div>\n",
573       "\t\t\t\t<div class=indented>\n",
574       "\t\t\t\t   <div id='shownObjectsList_0' class='shownObjectsList'></div>\n",
575       "\t\t\t\t</div>\n",
576       "\t\t\t</div>\n",
577       "         \n",
578       "         <div class=group id='camera_0'>\n",
579       "            <strong>Camera</strong>\n",
580       "            <div class=indented>\n",
581       "               <form>\n",
582       "                  <select id=\"cameraType_0\">\n",
583       "                     <option value='perspective' selected> Perspective<br></option>\n",
584       "                     <option value='orthographic' > Orthographic<br></option>\n",
585       "                  </select>\n",
586       "               </form>\n",
587       "            </div>\n",
588       "         </div>\n",
589       "\n",
590       "\t\t\t<div class=group id='svg_0'>\n",
591       "\t\t\t\t<strong>SVG</strong>\n",
592       "\t\t\t\t<div class=indented>\n",
593       "\t\t\t\t\t<form>\n",
594       "\t\t\t\t\t\t<input type=\"radio\" name='screenshotMode' value='download' id='download_0' checked> Download<br>\n",
595       "\t\t\t\t\t\t<input type=\"radio\" name='screenshotMode' value='tab' id='tab_0' > New tab<br>\n",
596       "\t\t\t\t\t</form>\n",
597       "\t\t\t\t\t<button id='takeScreenshot_0'>Screenshot</button>\n",
598       "\t\t\t\t</div>\n",
599       "\t\t\t</div>\n",
600       "\n",
601       "\t\t</div>\t<!-- end of settings -->\n",
602       "\t\t<img id='hideSettingsButton_0' class='hideSettingsButton' src='/kernelspecs/polymake/close.svg' width=20px\">\n",
603       "\t\t<img id='showSettingsButton_0' class='showSettingsButton' src='/kernelspecs/polymake/menu.svg' width=20px\">\n",
604       "<div id=\"model12887458766\"></div>\n",
605       "</div>\n",
606       "   <script>\n",
607       "    requirejs.config({\n",
608       "      paths: {\n",
609       "        three: '/kernelspecs/polymake/three',\n",
610       "        TrackballControls: '/kernelspecs/polymake/TrackballControls',\n",
611       "        OrbitControls: '/kernelspecs/polymake/OrbitControls',\n",
612       "        Projector: '/kernelspecs/polymake/Projector',\n",
613       "        SVGRenderer: '/kernelspecs/polymake/SVGRenderer',\n",
614       "        WEBGL: '/kernelspecs/polymake/WebGL',\n",
615       "      },\n",
616       "      shim: {\n",
617       "        'three': { exports: 'THREE'},\n",
618       "        'SVGRenderer': { deps: [ 'three' ], exports: 'THREE.SVGRenderer' },\n",
619       "        'WEBGL': { deps: [ 'three' ], exports: 'THREE.WEBGL' },\n",
620       "        'Projector': { deps: [ 'three' ], exports: 'THREE.Projector' },\n",
621       "        'TrackballControls': { deps: [ 'three' ], exports: 'THREE.TrackballControls' },\n",
622       "        'OrbitControls': { deps: [ 'three' ], exports: 'THREE.OrbitControls' },\n",
623       "      }\n",
624       "    });\n",
625       "    \n",
626       "    require(['three'],function(THREE){\n",
627       "        window.THREE = THREE;\n",
628       "      require(['TrackballControls', 'OrbitControls', 'Projector', 'SVGRenderer', 'WEBGL'],\n",
629       "               function(TrackballControls, OrbitControls, Projector, SVGRenderer, WEBGL) {\n",
630       "    THREE.TrackballControls = TrackballControls;\n",
631       "    THREE.OrbitControls = OrbitControls;\n",
632       "    THREE.Projector = Projector;\n",
633       "    THREE.SVGRenderer = SVGRenderer;\n",
634       "    THREE.WEBGL = WEBGL;\n",
635       "\n",
636       "// COMMON_CODE_BLOCK_BEGIN\n",
637       "\n",
638       "const intervalLength = 25; // for automatic animations\n",
639       "const explodableModel = false; \n",
640       "const modelContains = { points: false, pointlabels: false, lines: false, edgelabels: false, faces: false, arrowheads: false };\n",
641       "const foldables = [];\n",
642       "\n",
643       "var three = document.getElementById(\"model12887458766\");\n",
644       "var scene = new THREE.Scene();\n",
645       "var renderer = new THREE.WebGLRenderer( { antialias: true } );\n",
646       "var svgRenderer = new THREE.SVGRenderer( { antialias: true } );\n",
647       "renderer.setPixelRatio( window.devicePixelRatio );\n",
648       "renderer.setClearColor(0xFFFFFF, 1);\n",
649       "svgRenderer.setClearColor(0xFFFFFF, 1);\n",
650       "three.appendChild(renderer.domElement);\n",
651       "\n",
652       "var frustumSize = 4;\n",
653       "var cameras = [new THREE.PerspectiveCamera(75, 1, 0.1, 1000), new THREE.OrthographicCamera()];\n",
654       "cameras.forEach(function(cam) {\n",
655       "    cam.position.set(0, 0, 5);\n",
656       "    cam.lookAt(0, 0, 0);  \n",
657       "    cam.up.set(0, 1, 0);         \n",
658       "});\n",
659       "var controls = [new THREE.TrackballControls(cameras[0], three), new THREE.OrbitControls(cameras[1], three)];\n",
660       "var camera, control;\n",
661       "\n",
662       "controls[0].zoomSpeed = 0.2;\n",
663       "controls[0].rotateSpeed = 4;\n",
664       "\n",
665       "\n",
666       "// class to allow move points together with labels and spheres\n",
667       "var PMPoint = function (x,y,z) {\n",
668       "   this.vector = new THREE.Vector3(x,y,z);\n",
669       "   this.sprite = null;\n",
670       "   this.sphere = null;\n",
671       "}\n",
672       "PMPoint.prototype.addLabel = function(labelsprite) {\n",
673       "   this.sprite = labelsprite;\n",
674       "   this.sprite.position.copy(this.vector);\n",
675       "}\n",
676       "PMPoint.prototype.addSphere = function(spheremesh) {\n",
677       "   this.sphere = spheremesh;\n",
678       "   this.sphere.position.copy(this.vector);\n",
679       "}\n",
680       "PMPoint.prototype.set = function(x,y,z) {\n",
681       "   this.vector.set(x,y,z);\n",
682       "   if (this.sprite) {\n",
683       "      this.sprite.position.copy(this.vector);\n",
684       "   }\n",
685       "   if (this.sphere) {\n",
686       "      this.sphere.position.copy(this.vector);\n",
687       "   }\n",
688       "}\n",
689       "PMPoint.prototype.radius = function() {\n",
690       "   if (this.sphere) {\n",
691       "      return this.sphere.geometry.parameters.radius;\n",
692       "   } else {\n",
693       "      return 0;\n",
694       "   }\n",
695       "};\n",
696       "// select the target node\n",
697       "var target = document.querySelector('#model12887458766');\n",
698       "\n",
699       "// create an observer instance\n",
700       "var observer = new MutationObserver(function(mutations) {\n",
701       "   mutations.forEach(function(mutation) {\n",
702       "      if (mutation.removedNodes && mutation.removedNodes.length > 0) {\n",
703       "         cancelAnimationFrame(renderId);\n",
704       "         observer.disconnect();\n",
705       "         console.log(\"cancelled frame \"+renderId);\n",
706       "      }\n",
707       "   });\n",
708       "});\n",
709       "\n",
710       "// configuration of the observer:\n",
711       "var config = { childList: true, characterData: true }\n",
712       "\n",
713       "// pass in the target node, as well as the observer options\n",
714       "while (target) {\n",
715       "   if (target.className==\"output\") {\n",
716       "      observer.observe(target, config);\n",
717       "      break;\n",
718       "   }\n",
719       "   target = target.parentNode;\n",
720       "}\n",
721       "\n",
722       "// COMMON_CODE_BLOCK_END\n",
723       "\n",
724       "var obj0 = new THREE.Object3D();\n",
725       "obj0.name = \"unnamed__1\";\n",
726       "obj0.userData.explodable = 1;\n",
727       "obj0.userData.points = [];\n",
728       "obj0.userData.points.push(new PMPoint(-1, -1, -1));\n",
729       "obj0.userData.points.push(new PMPoint(1, -1, -1));\n",
730       "obj0.userData.points.push(new PMPoint(-1, 1, -1));\n",
731       "obj0.userData.points.push(new PMPoint(1, 1, -1));\n",
732       "obj0.userData.points.push(new PMPoint(-1, -1, 1));\n",
733       "obj0.userData.points.push(new PMPoint(1, -1, 1));\n",
734       "obj0.userData.points.push(new PMPoint(-1, 1, 1));\n",
735       "obj0.userData.points.push(new PMPoint(1, 1, 1));\n",
736       "\n",
737       "obj0.userData.pointradii = 0.02;\n",
738       "   <!-- Vertex style -->\n",
739       "obj0.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
740       "obj0.userData.pointlabels = [\"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\"];\n",
741       "obj0.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 0, 4, 1, 5, 4, 5, 2, 6, 4, 6, 3, 7, 5, 7, 6, 7];\n",
742       "   <!-- Edge style -->\n",
743       "obj0.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
744       "obj0.userData.facets = [[0, 4, 6, 2], [7, 5, 1, 3], [5, 4, 0, 1], [2, 6, 7, 3], [0, 2, 3, 1], [6, 4, 5, 7]];\n",
745       "   <!-- Facet style -->\n",
746       "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",
747       "init_object(obj0);\n",
748       "scene.add(obj0);\n",
749       "\n",
750       "// COMMON_CODE_BLOCK_BEGIN\n",
751       "function textSpriteMaterial(message, parameters) {\n",
752       "    if ( parameters === undefined ) parameters = {};\n",
753       "    var fontface = \"Helvetica\";\n",
754       "    var fontsize = parameters.hasOwnProperty(\"fontsize\") ? parameters[\"fontsize\"] : 15;\n",
755       "    fontsize = fontsize*10;\n",
756       "    var lines = message.split('\\\\n');\n",
757       "    var size = 512;\n",
758       "    for(var i = 0; i<lines.length; i++){\n",
759       "        var tmp = lines[i].length;\n",
760       "        while(tmp*fontsize > size){\n",
761       "           fontsize--;\n",
762       "        }\n",
763       "    }\n",
764       "    \n",
765       "    var canvas = document.createElement('canvas');\n",
766       "    canvas.width = size;\n",
767       "    canvas.height = size;\n",
768       "    var context = canvas.getContext('2d');\n",
769       "    context.fillStyle = \"rgba(255, 255, 255, 0)\";\n",
770       "    context.fill();\n",
771       "    context.font = fontsize + \"px \" + fontface;\n",
772       "    \n",
773       "    // text color\n",
774       "    context.fillStyle = \"rgba(0, 0, 0, 1.0)\";\n",
775       "     for(var i = 0; i<lines.length; i++){\n",
776       "        context.fillText(lines[i], size/2, size/2+i*fontsize);\n",
777       "     }\n",
778       "    \n",
779       "    // canvas contents will be used for a texture\n",
780       "    var texture = new THREE.Texture(canvas);\n",
781       "    texture.needsUpdate = true;\n",
782       "    \n",
783       "    var spriteMaterial = new THREE.SpriteMaterial({map: texture, depthTest: true, depthWrite: false, polygonOffset: true, polygonOffsetFactor: -1, polygonOffsetUnits: 1 });\n",
784       "    return spriteMaterial;\n",
785       "}\n",
786       "\n",
787       "\n",
788       "// ---------------------- INITIALIZING OBJECTS--------------------------------------\n",
789       "// ---------------------------------------------------------------------------------\n",
790       "\n",
791       "function init_object(obj) {\n",
792       "    if (obj.userData.hasOwnProperty(\"pointmaterial\")) {\n",
793       "        init_points(obj);\n",
794       "        modelContains.points = true;\n",
795       "    }\n",
796       "    if (obj.userData.hasOwnProperty(\"pointlabels\")) {\n",
797       "        init_pointlabels(obj);\n",
798       "        modelContains.pointlabels = true;\n",
799       "    }\n",
800       "    if (obj.userData.hasOwnProperty(\"edgematerial\")) {\n",
801       "        init_lines(obj);\n",
802       "        modelContains.lines = true;\n",
803       "    }\n",
804       "    if (obj.userData.hasOwnProperty(\"edgelabels\")) {\n",
805       "        init_edgelabels(obj);\n",
806       "        modelContains.edgelabels = true;\n",
807       "    }\n",
808       "    if (obj.userData.hasOwnProperty(\"arrowstyle\")) {\n",
809       "        init_arrowheads(obj);\n",
810       "        modelContains.arrowheads = true;\n",
811       "    }\n",
812       "    if (obj.userData.hasOwnProperty(\"facetmaterial\")) {\n",
813       "        init_faces(obj);\n",
814       "        modelContains.faces = true;\n",
815       "    }\n",
816       "}\n",
817       "\n",
818       "function init_points(obj) {\n",
819       "    var pointgroup = new THREE.Group();\n",
820       "    pointgroup.name = \"points\";\n",
821       "    var points = obj.userData.points;\n",
822       "    var radii = obj.userData.pointradii;\n",
823       "    var materials = obj.userData.pointmaterial;\n",
824       "    var geometry,material;\n",
825       "    if (!Array.isArray(radii)) {\n",
826       "        geometry = new THREE.SphereBufferGeometry(radii);  \n",
827       "    }\n",
828       "    if (!Array.isArray(materials)) {\n",
829       "        material = materials;\n",
830       "    }\n",
831       "    for (var i=0; i<points.length; i++) {\n",
832       "        var point = points[i];\n",
833       "        if (Array.isArray(radii)) {\n",
834       "            if (radii[i] == 0) {\n",
835       "                continue;\n",
836       "            }\n",
837       "            geometry = new THREE.SphereBufferGeometry(radii[i]);  \n",
838       "        } \n",
839       "        if (Array.isArray(materials)) {\n",
840       "            material = materials[i];     \n",
841       "        } \n",
842       "        var sphere = new THREE.Mesh(geometry, material);\n",
843       "        point.addSphere(sphere);\n",
844       "        pointgroup.add(sphere);\n",
845       "    }\n",
846       "    obj.add(pointgroup);\n",
847       "}\n",
848       "\n",
849       "function init_pointlabels(obj) {\n",
850       "    var points = obj.userData.points;\n",
851       "    var labels = obj.userData.pointlabels;\n",
852       "    var pointlabels = new THREE.Group();\n",
853       "    pointlabels.name = \"pointlabels\";\n",
854       "    if (Array.isArray(labels)) {\n",
855       "        for (var i=0; i<points.length; i++) {\n",
856       "            var point = points[i];\n",
857       "            var spriteMaterial = textSpriteMaterial( labels[i] );\n",
858       "\t        var sprite = new THREE.Sprite(spriteMaterial);\n",
859       "            point.addLabel(sprite);\n",
860       "            pointlabels.add(sprite);\n",
861       "        }\n",
862       "    } else {\n",
863       "        var spriteMaterial = textSpriteMaterial( labels );\n",
864       "        for (var i=0; i<points.length; i++) {\n",
865       "            var point = points[i];\n",
866       "\t        var sprite = new THREE.Sprite(spriteMaterial);\n",
867       "            point.addLabel(sprite);\n",
868       "            pointlabels.add(sprite);\n",
869       "        }\n",
870       "    }\n",
871       "    obj.add(pointlabels);\n",
872       "}\n",
873       "\n",
874       "function init_lines(obj) {\n",
875       "    var edgeindices = obj.userData.edgeindices;\n",
876       "    var points = obj.userData.points;\n",
877       "    var materials = obj.userData.edgematerial;\n",
878       "    var geometry = new THREE.BufferGeometry();\n",
879       "    var bufarr = new Float32Array( obj.userData.edgeindices.length * 3 );\n",
880       "    var bufattr = new THREE.Float32BufferAttribute( bufarr, 3 );\n",
881       "    var geometry = new THREE.BufferGeometry();\n",
882       "    geometry.setAttribute('position', bufattr);\n",
883       "    if (Array.isArray(materials)) {     \n",
884       "        for (var i=0; i<materials.length; i++) {\n",
885       "            geometry.addGroup(2*i,2,i);\n",
886       "        }\n",
887       "    }\n",
888       "    var lines = new THREE.LineSegments(geometry, materials);\n",
889       "    lines.name = \"lines\";\n",
890       "    obj.add(lines);\n",
891       "    updateEdgesPosition(obj);\n",
892       "}\n",
893       "\n",
894       "function init_edgelabels(obj) {\n",
895       "    var points = obj.userData.points;\n",
896       "    var edgeindices = obj.userData.edgeindices;\n",
897       "    var labels = obj.userData.edgelabels;\n",
898       "    var edgelabels = new THREE.Group();\n",
899       "    edgelabels.name = \"edgelabels\";\n",
900       "    if (Array.isArray(labels)) {\n",
901       "        for (var i=0; i<edgeindices.length; i=i+2) {\n",
902       "            var point = points[i];\n",
903       "            var spriteMaterial = textSpriteMaterial( labels[i] );\n",
904       "            var sprite = new THREE.Sprite(spriteMaterial);\n",
905       "            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[i]].vector,points[edgeindices[i+1]].vector).multiplyScalar(0.5));\n",
906       "            edgelabels.add(sprite);\n",
907       "        }\n",
908       "    } else {\n",
909       "        var spriteMaterial = textSpriteMaterial( labels );\n",
910       "        for (var i=0; i<points.length; i++) {\n",
911       "            var point = points[i];\n",
912       "            var sprite = new THREE.Sprite(spriteMaterial);\n",
913       "            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[i]].vector,points[edgeindices[i+1]].vector).multiplyScalar(0.5));\n",
914       "            pointlabels.add(sprite);\n",
915       "        }\n",
916       "    }\n",
917       "    obj.add(edgelabels);\n",
918       "}\n",
919       "\n",
920       "function init_arrowheads(obj) {\n",
921       "    var arrowheads = new THREE.Group();\n",
922       "    arrowheads.name = \"arrowheads\";\n",
923       "    var arrowstyle = obj.userData.arrowstyle;\n",
924       "    var edgeindices = obj.userData.edgeindices;\n",
925       "    var edgematerials = obj.userData.edgematerial;\n",
926       "    var points = obj.userData.points;\n",
927       "    var material;\n",
928       "    if (!Array.isArray(edgematerials)) {\n",
929       "        material = new THREE.MeshBasicMaterial( {color: edgematerials.color} );\n",
930       "    }\n",
931       "\n",
932       "    for (var i=0; i<edgeindices.length; i=i+2) {\n",
933       "        var start = points[edgeindices[i]];\n",
934       "        var end = points[edgeindices[i+1]];\n",
935       "        var dist = start.vector.distanceTo( end.vector ) - start.radius() - end.radius();\n",
936       "        if (dist <= 0) {\n",
937       "            continue;\n",
938       "        }\n",
939       "        var dir = new THREE.Vector3().subVectors(end.vector,start.vector);\n",
940       "        dir.normalize();\n",
941       "        var axis = new THREE.Vector3().set(dir.z,0,-dir.x);\n",
942       "        axis.normalize();\n",
943       "        var radians = Math.acos( dir.y );\n",
944       "        var radius = dist/25;\n",
945       "        var height = dist/5;\n",
946       "        var geometry = new THREE.ConeBufferGeometry(radius,height);\n",
947       "        var position = new THREE.Vector3().addVectors(start.vector,dir.clone().multiplyScalar(start.radius()+dist-height/2));\n",
948       "        if (Array.isArray(edgematerials)) {\n",
949       "            material = new THREE.MeshBasicMaterial( {color: edgematerials[i].color} );\n",
950       "        }\n",
951       "        var cone = new THREE.Mesh( geometry, material );\n",
952       "        cone.quaternion.setFromAxisAngle(axis,radians);;\n",
953       "        cone.position.copy(position);;\n",
954       "        arrowheads.add(cone);\n",
955       "    }\n",
956       "    obj.add(arrowheads);\n",
957       "}\n",
958       "\n",
959       "function init_faces(obj) {\n",
960       "    var points = obj.userData.points;\n",
961       "    var facets = obj.userData.facets;\n",
962       "    obj.userData.triangleindices = [];\n",
963       "    for (var i=0; i<facets.length; i++) {\n",
964       "        facet = facets[i];\n",
965       "        for (var t=0; t<facet.length-2; t++) {\n",
966       "            obj.userData.triangleindices.push(facet[0],facet[t+1],facet[t+2]);  \n",
967       "        }\n",
968       "    }\n",
969       "    var bufarr = new Float32Array( obj.userData.triangleindices.length * 3 );\n",
970       "    var bufattr = new THREE.Float32BufferAttribute(bufarr,3);\n",
971       "    \n",
972       "    var materials = obj.userData.facetmaterial;\n",
973       "    var geometry = new THREE.BufferGeometry();\n",
974       "    geometry.setAttribute('position',bufattr);\n",
975       "    if (Array.isArray(materials)) {\n",
976       "        var tricount = 0;\n",
977       "        var facet;\n",
978       "        for (var i=0; i<facets.length; i++) {\n",
979       "            facet = facets[i];\n",
980       "            geometry.addGroup(tricount,(facet.length-2)*3,i);\n",
981       "            tricount += (facet.length-2)*3;\n",
982       "        }\n",
983       "    }\n",
984       "    var mesh = new THREE.Mesh(geometry, materials);\n",
985       "    mesh.name = \"faces\";\n",
986       "    obj.add(mesh); \n",
987       "    updateFacesPosition(obj);\n",
988       "}\n",
989       "// //INITIALIZING\n",
990       "\n",
991       "\n",
992       "function updateFacesPosition(obj) {\n",
993       "    var points = obj.userData.points;\n",
994       "    var indices = obj.userData.triangleindices;\n",
995       "    var faces = obj.getObjectByName(\"faces\");\n",
996       "    var ba = faces.geometry.getAttribute(\"position\");\n",
997       "    for (var i=0; i<indices.length; i++) {\n",
998       "        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); \n",
999       "    }\n",
1000       "    faces.geometry.attributes.position.needsUpdate = true;\n",
1001       "    \n",
1002       "}\n",
1003       "\n",
1004       "function updateEdgesPosition(obj) {\n",
1005       "    var points = obj.userData.points;\n",
1006       "    var indices = obj.userData.edgeindices;\n",
1007       "    var lines = obj.getObjectByName(\"lines\");\n",
1008       "    var ba = lines.geometry.getAttribute(\"position\"); \n",
1009       "    for (var i=0; i<indices.length; i++) {\n",
1010       "        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); \n",
1011       "    }\n",
1012       "    lines.geometry.attributes.position.needsUpdate = true;\n",
1013       "}\n",
1014       "\n",
1015       "function onWindowResize() {\n",
1016       "    renderer.setSize( three.clientWidth, three.clientHeight );\n",
1017       "    svgRenderer.setSize( three.clientWidth, three.clientHeight );\n",
1018       "    updateCamera();\n",
1019       "}\n",
1020       "\n",
1021       "function updateCamera() {\n",
1022       "    var width = three.clientWidth;\n",
1023       "    var height = three.clientHeight;\n",
1024       "    var aspect = width / height;\n",
1025       "    if (camera.type == \"OrthographicCamera\") {\n",
1026       "        camera.left = frustumSize * aspect / - 2;\n",
1027       "        camera.right = frustumSize * aspect / 2;\n",
1028       "        camera.top = frustumSize / 2;\n",
1029       "        camera.bottom = - frustumSize / 2;\n",
1030       "    } else if (camera.type == \"PerspectiveCamera\") {\n",
1031       "        camera.aspect = aspect;\n",
1032       "    }\n",
1033       "    camera.updateProjectionMatrix();\n",
1034       "}\n",
1035       "\n",
1036       "function changeCamera(event) {\n",
1037       "    var selindex = event.currentTarget.selectedIndex;\n",
1038       "    camera = cameras[selindex];\n",
1039       "    control = controls[selindex];\n",
1040       "    control.enabled = true; \n",
1041       "    for (var i=0; i<controls.length; i++) {\n",
1042       "        if (i!=selindex) {\n",
1043       "            controls[i].enabled = false;\n",
1044       "        }\n",
1045       "    }\n",
1046       "    updateCamera();\n",
1047       "}\n",
1048       "\n",
1049       "var camtypenode = document.getElementById('cameraType_0');\n",
1050       "camtypenode.onchange = changeCamera;\n",
1051       "camtypenode.dispatchEvent(new Event('change'));\n",
1052       "\n",
1053       "onWindowResize();\n",
1054       "window.addEventListener('resize', onWindowResize);\t\n",
1055       "\n",
1056       "\n",
1057       "var xRotationEnabled = false;\n",
1058       "var yRotationEnabled = false;\n",
1059       "var zRotationEnabled = false;\n",
1060       "var rotationSpeedFactor = 1;\n",
1061       "var settingsShown = false;\n",
1062       "var labelsShown = true;\n",
1063       "var intervals = [];\n",
1064       "var timeouts = [];\n",
1065       "var explodingSpeed = 0.05;\n",
1066       "var explodeScale = 0;\n",
1067       "var XMLS = new XMLSerializer();\n",
1068       "var svgElement;\n",
1069       "var renderId;\n",
1070       "\n",
1071       "var render = function () {\n",
1072       "\n",
1073       "\trenderId = requestAnimationFrame(render);\n",
1074       "\n",
1075       "//\tcomment in for automatic explosion\n",
1076       "//\texplode(updateFactor());\n",
1077       "\n",
1078       "    var phi = 0.02 * rotationSpeedFactor;\n",
1079       "\n",
1080       "    if (xRotationEnabled) {\n",
1081       "        scene.rotation.x += phi;\n",
1082       "    }\n",
1083       "    if (yRotationEnabled) {\n",
1084       "        scene.rotation.y += phi;\n",
1085       "    }\n",
1086       "    if (zRotationEnabled) {\n",
1087       "        scene.rotation.z += phi;\n",
1088       "    }\n",
1089       "\n",
1090       "    control.update();\n",
1091       "    renderer.render(scene, camera);\n",
1092       "};\n",
1093       "\n",
1094       "if ( THREE.WEBGL.isWebGLAvailable() ) {\n",
1095       "\trender();\n",
1096       "} else {\n",
1097       "\tvar warning = WEBGL.getWebGLErrorMessage();\n",
1098       "\tthree.appendChild( warning );\n",
1099       "}\n",
1100       "    \n",
1101       "function changeTransparency() {\n",
1102       "    var opacity = 1-Number(event.currentTarget.value);\n",
1103       "    for (var i=0; i<scene.children.length; i++) {\n",
1104       "        child = scene.children[i];\n",
1105       "        if ( child.userData.hasOwnProperty(\"facetmaterial\") ) {\n",
1106       "            if (Array.isArray(child.userData.facetmaterial)) {\n",
1107       "                for (var j=0; j<child.userData.facetmaterial.length; j++) {\n",
1108       "                    child.userData.facetmaterial[j].opacity = opacity;\n",
1109       "                }\n",
1110       "            } else {\n",
1111       "                child.userData.facetmaterial.opacity = opacity;\n",
1112       "            }    \n",
1113       "        }\n",
1114       "    }\n",
1115       "}\n",
1116       "\n",
1117       "function changeRotationX(event){\n",
1118       "    xRotationEnabled = event.currentTarget.checked;\n",
1119       "}\t\n",
1120       "\n",
1121       "function changeRotationY(event){\n",
1122       "    yRotationEnabled = event.currentTarget.checked;\n",
1123       "}\t\n",
1124       "\n",
1125       "function changeRotationZ(event){\n",
1126       "    zRotationEnabled = event.currentTarget.checked;\n",
1127       "}\t\n",
1128       "\n",
1129       "\n",
1130       "function changeRotationSpeedFactor(event){\n",
1131       "    rotationSpeedFactor = Number(event.currentTarget.value);\n",
1132       "}\n",
1133       "\n",
1134       "function resetScene(){\n",
1135       "    scene.rotation.set(0,0,0);\n",
1136       "    camera.position.set(0,0,5);\n",
1137       "    camera.up.set(0,1,0);\n",
1138       "}\n",
1139       "\n",
1140       "function showSettings(event){\n",
1141       "    document.getElementById('settings_0').style.visibility = 'visible';\n",
1142       "    document.getElementById('showSettingsButton_0').style.visibility = 'hidden';\n",
1143       "    document.getElementById('hideSettingsButton_0').style.visibility = 'visible';\n",
1144       "    settingsShown = true;\n",
1145       "}\n",
1146       "\n",
1147       "function hideSettings(event){\n",
1148       "    document.getElementById('settings_0').style.visibility = 'hidden';\n",
1149       "    document.getElementById('showSettingsButton_0').style.visibility = 'visible';\n",
1150       "    document.getElementById('hideSettingsButton_0').style.visibility = 'hidden';\n",
1151       "    settingsShown = false;\n",
1152       "}\n",
1153       "\n",
1154       "\n",
1155       "\n",
1156       "var pos = 150* Math.PI;\n",
1157       "\n",
1158       "function updateFactor() {\n",
1159       "    pos++;\n",
1160       "    return Math.sin(.01*pos)+1;\n",
1161       "}\n",
1162       "\n",
1163       "// ------------------------ FOLDING ------------------------------------------------\n",
1164       "// ---------------------------------------------------------------------------------\n",
1165       "// rotate point p around axis defined by points p1 and p2 by given angle\n",
1166       "function rotate(p, p1, p2, angle ){   \n",
1167       "    angle = -angle;\n",
1168       "    var x = p.x, y = p.y, z = p.z, \n",
1169       "    a = p1.x, b = p1.y, c = p1.z, \n",
1170       "    u = p2.x-p1.x, v = p2.y-p1.y, w = p2.z-p1.z;\n",
1171       "    var result = [];\n",
1172       "    var L = u*u + v*v + w*w;\n",
1173       "    var sqrt = Math.sqrt;\n",
1174       "    var cos = Math.cos;\n",
1175       "    var sin = Math.sin;\n",
1176       "\n",
1177       "    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",
1178       "    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",
1179       "    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",
1180       "\n",
1181       "    return result;\n",
1182       "}\n",
1183       "\n",
1184       "var fold = function(event){\n",
1185       "    var obj = foldables[Number(event.currentTarget.name)];\n",
1186       "    var foldvalue = Number(event.currentTarget.value);\n",
1187       "    var scale = foldvalue - obj.userData.oldscale;\n",
1188       "\n",
1189       "    for (var j=0; j<obj.userData.axes.length; j++) {\n",
1190       "        rotateVertices(obj, j, scale);\n",
1191       "    }\n",
1192       "    update(obj);\n",
1193       "    obj.userData.oldscale += scale;\n",
1194       "    lookAtBarycenter(obj);\n",
1195       "}\n",
1196       "\n",
1197       "function lookAtBarycenter(obj){\n",
1198       "    control.target = barycenter(obj);\n",
1199       "}\n",
1200       "\n",
1201       "function barycenter(obj) {\n",
1202       "    var center = new THREE.Vector3(0,0,0);\n",
1203       "    var points = obj.userData.points;\n",
1204       "    for (var i=0; i<points.length; i++){\n",
1205       "        center.add(points[i].vector);\n",
1206       "    }\n",
1207       "    center.divideScalar(points.length);\n",
1208       "    return center;\n",
1209       "}\n",
1210       "\n",
1211       "function rotateVertices(obj, edge, scale) {\n",
1212       "    var axes = obj.userData.axes;\n",
1213       "    var subtrees = obj.userData.subtrees;\n",
1214       "    var points = obj.userData.points;\n",
1215       "    var angles = obj.userData.angles;\n",
1216       "    if (edge < axes.length){\n",
1217       "        for (var j=0; j<subtrees[edge].length; j++){\n",
1218       "            var rotP = rotate(points[subtrees[edge][j]].vector, points[axes[edge][0]].vector,points[axes[edge][1]].vector, scale * (Math.PI - angles[edge]));\n",
1219       "            points[subtrees[edge][j]].set(rotP[0],rotP[1],rotP[2]);\n",
1220       "        }\n",
1221       "    }\n",
1222       "}\n",
1223       "\n",
1224       "function update(obj) {\n",
1225       "   updateFacesPosition(obj);\n",
1226       "   updateEdgesPosition(obj);\n",
1227       "}\n",
1228       "\n",
1229       "if (foldables.length) {\n",
1230       "    var settings = document.getElementById('settings_0');\n",
1231       "    var foldDiv = document.createElement('div');\n",
1232       "    foldDiv.id = 'fold_0';\n",
1233       "    var title = document.createElement('strong');\n",
1234       "    title.innerHTML = 'Fold';\n",
1235       "    foldDiv.appendChild(title);\n",
1236       "    foldDiv.className = 'group';\n",
1237       "    for (var i=0; i<foldables.length; i++) {\n",
1238       "        var range = document.createElement('input');\n",
1239       "        range.type = 'range';\n",
1240       "        range.min = 0;\n",
1241       "        range.max = 1;\n",
1242       "        range.value = 0;\n",
1243       "        range.step = 0.001;\n",
1244       "        range.name = String(i);\n",
1245       "        range.oninput = fold;\n",
1246       "        foldDiv.appendChild(range);\n",
1247       "    }\n",
1248       "    lookAtBarycenter(foldables[0]);\n",
1249       "    settings.insertBefore(foldDiv,settings.childNodes[0]);\n",
1250       "}\n",
1251       "\n",
1252       "    \n",
1253       "// ---------------------- EXPLOSION ------------------------------------------------\n",
1254       "// ---------------------------------------------------------------------------------\n",
1255       "\n",
1256       "if (explodableModel) {\n",
1257       "    for (var i=0; i<scene.children.length; i++) {\n",
1258       "        obj = scene.children[i];\n",
1259       "        if ( obj.userData.explodable ) {\n",
1260       "            computeCentroid(obj);\n",
1261       "        }\n",
1262       "    }\n",
1263       "    document.getElementById('explodeRange_0').oninput = triggerExplode;\n",
1264       "    document.getElementById('explodeCheckbox_0').onchange = triggerAutomaticExplode;\n",
1265       "    document.getElementById('explodingSpeedRange_0').oninput = setExplodingSpeed;\n",
1266       "}\n",
1267       "\n",
1268       "function computeCentroid(obj) {\n",
1269       "    centroid = new THREE.Vector3();\n",
1270       "    obj.userData.points.forEach(function(pmpoint) {\n",
1271       "        centroid.add(pmpoint.vector);\t\t\t\n",
1272       "    });\n",
1273       "    centroid.divideScalar(obj.userData.points.length);\n",
1274       "    obj.userData.centroid = centroid;\n",
1275       "}\n",
1276       "\n",
1277       "function explode(factor) {\n",
1278       "    for (var i=0; i<scene.children.length; i++) {\n",
1279       "        var obj = scene.children[i];\n",
1280       "        if (obj.userData.hasOwnProperty(\"centroid\")) { \n",
1281       "            var c = obj.userData.centroid;\n",
1282       "            obj.position.set(c.x*factor, c.y*factor, c.z*factor);\n",
1283       "        }\n",
1284       "    }\t\n",
1285       "}\n",
1286       "\n",
1287       "function triggerExplode(event){\n",
1288       "    explodeScale = Number(event.currentTarget.value);\n",
1289       "    explode(explodeScale);\n",
1290       "}\n",
1291       "\n",
1292       "function setExplodingSpeed(event){\n",
1293       "    explodingSpeed = Number(event.currentTarget.value);\n",
1294       "}\n",
1295       "\n",
1296       "function triggerAutomaticExplode(event){\n",
1297       "    if (event.currentTarget.checked){\n",
1298       "        startExploding();\n",
1299       "    } else {\n",
1300       "        clearIntervals();\n",
1301       "    }\t\n",
1302       "}\n",
1303       "\n",
1304       "function startExploding(){\n",
1305       "    intervals.push(setInterval(explodingInterval, 25));\n",
1306       "}\n",
1307       "\n",
1308       "\n",
1309       "function explodingInterval(){\n",
1310       "    explodeScale += explodingSpeed;\n",
1311       "    if (explodeScale <= 6){ \n",
1312       "        explode(explodeScale);\n",
1313       "    }\n",
1314       "    else{\n",
1315       "        explode(6);\n",
1316       "        explodeScale = 6;\n",
1317       "        clearIntervals();\n",
1318       "        timeouts.push(setTimeout(startUnexploding, 3000));\n",
1319       "    }\n",
1320       "    document.getElementById('explodeRange_0').value = explodeScale;\n",
1321       "}\n",
1322       "\n",
1323       "\n",
1324       "function startUnexploding(){\n",
1325       "    intervals.push(setInterval(unexplodingInterval, 25));\n",
1326       "}\n",
1327       "\n",
1328       "function unexplodingInterval(){\n",
1329       "    explodeScale -= explodingSpeed;\n",
1330       "    if (explodeScale >= 0){\t\n",
1331       "        explode(explodeScale);\n",
1332       "    }\n",
1333       "    else {\n",
1334       "        explode(0);\n",
1335       "        explodeScale = 0;\n",
1336       "        clearIntervals();\n",
1337       "        timeouts.push(setTimeout(startExploding, 3000));\n",
1338       "    }\n",
1339       "    document.getElementById('explodeRange_0').value = explodeScale;\n",
1340       "}\n",
1341       "\n",
1342       "function clearIntervals(){\n",
1343       "    intervals.forEach(function(interval){\n",
1344       "        clearInterval(interval);\n",
1345       "    });\n",
1346       "    intervals = [];\n",
1347       "    timeouts.forEach(function(timeout){\n",
1348       "        clearTimeout(timeout);\n",
1349       "    });\n",
1350       "    timeouts = [];\n",
1351       "}\n",
1352       "\n",
1353       "// ---------------------- DISPLAY --------------------------------------------------\n",
1354       "// ---------------------------------------------------------------------------------\n",
1355       "\n",
1356       "const objectTypeInnerHTMLs = { points: \"Points\", pointlabels: \"Point labels\", lines: \"Edges\", edgelabels: \"Edge labels\", faces: \"Faces\", arrowheads: \"Arrow heads\" };\n",
1357       "const objectTypeVisible = {};\n",
1358       "Object.assign(objectTypeVisible,modelContains);\n",
1359       "const sortedObjectTypeKeys = Object.keys(objectTypeInnerHTMLs).sort();\n",
1360       "const shownObjectTypesList = document.getElementById('shownObjectTypesList_0');\n",
1361       "\n",
1362       "function setVisibility(bool,objname) {\n",
1363       "    for (var i=0; i<scene.children.length; i++){\n",
1364       "        var obj = scene.children[i].getObjectByName(objname);\n",
1365       "        if (obj) {\n",
1366       "            obj.visible = bool;\n",
1367       "        }\n",
1368       "    }\n",
1369       "}\n",
1370       "\n",
1371       "function toggleObjectTypeVisibility(event){\n",
1372       "    var name = event.currentTarget.name;\n",
1373       "    var checked = event.currentTarget.checked;\n",
1374       "    objectTypeVisible[name] = checked;\n",
1375       "    setVisibility(checked,name);\n",
1376       "}\n",
1377       "\n",
1378       "for (var i=0; i<sortedObjectTypeKeys.length; i++){\n",
1379       "    var key = sortedObjectTypeKeys[i];\n",
1380       "    if (modelContains[key]) {\n",
1381       "        var objTypeNode = document.createElement('span');\n",
1382       "        objTypeNode.innerHTML = objectTypeInnerHTMLs[key] + '<br>';\n",
1383       "        var checkbox = document.createElement('input');\n",
1384       "        checkbox.type = 'checkbox';\n",
1385       "        checkbox.checked = true;\n",
1386       "        checkbox.name = key;\n",
1387       "        checkbox.onchange = toggleObjectTypeVisibility;\n",
1388       "        shownObjectTypesList.appendChild(checkbox);\n",
1389       "        shownObjectTypesList.appendChild(objTypeNode);\n",
1390       "    }\n",
1391       "}\n",
1392       "\n",
1393       "// ------------------------------------------------------\n",
1394       "\n",
1395       "function toggleObjectVisibility(event){\n",
1396       "    var nr = Number(event.currentTarget.name);\n",
1397       "    scene.children[nr].visible = event.currentTarget.checked;\n",
1398       "}\n",
1399       "\n",
1400       "// append checkboxes for displaying or hiding objects\n",
1401       "var shownObjectsList = document.getElementById('shownObjectsList_0');\n",
1402       "for (var i=0; i<scene.children.length; i++){\n",
1403       "    obj = scene.children[i];\n",
1404       "    var objNode = document.createElement('span');\n",
1405       "    objNode.innerHTML = obj.name + '<br>';\n",
1406       "    var checkbox = document.createElement('input');\n",
1407       "    checkbox.type = 'checkbox';\n",
1408       "    checkbox.checked = true;\n",
1409       "    checkbox.name = String(i);\n",
1410       "    checkbox.onchange = toggleObjectVisibility;\n",
1411       "    shownObjectsList.appendChild(checkbox);\n",
1412       "    shownObjectsList.appendChild(objNode);\n",
1413       "}\n",
1414       "\n",
1415       "// ---------------------- SVG ------------------------------------------------------\n",
1416       "// ---------------------------------------------------------------------------------\n",
1417       "\n",
1418       "function takeSvgScreenshot() {\n",
1419       "    if (objectTypeVisible[\"pointlabels\"]) {\n",
1420       "        setVisibility(false,\"pointlabels\");\n",
1421       "    }\n",
1422       "    if (objectTypeVisible[\"edgelabels\"]) {\n",
1423       "        setVisibility(false,\"edgelabels\");\n",
1424       "    }\n",
1425       "    svgRenderer.render(scene,camera);\n",
1426       "    svgElement = XMLS.serializeToString(svgRenderer.domElement);\n",
1427       "    \n",
1428       "    if (objectTypeVisible[\"pointlabels\"]) {\n",
1429       "        setVisibility(true,\"pointlabels\");\n",
1430       "    }\n",
1431       "    if (objectTypeVisible[\"edgelabels\"]) {\n",
1432       "        setVisibility(true,\"edgelabels\");\n",
1433       "    }\n",
1434       "\n",
1435       "    if (document.getElementById('tab_0').checked){\n",
1436       "        //show in new tab\n",
1437       "        var myWindow = window.open(\"\",\"\");\n",
1438       "        myWindow.document.body.innerHTML = svgElement;\n",
1439       "    } else{\n",
1440       "        // download svg file \n",
1441       "        download(\"screenshot.svg\", svgElement);\n",
1442       "    }\n",
1443       "}\n",
1444       "\n",
1445       "function download(filename, text) {\n",
1446       "    var element = document.createElement('a');\n",
1447       "    element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));\n",
1448       "    element.setAttribute('download', filename);\n",
1449       "\n",
1450       "    element.style.display = 'none';\n",
1451       "    document.body.appendChild(element);\n",
1452       "\n",
1453       "    element.click();\n",
1454       "\n",
1455       "    document.body.removeChild(element);\n",
1456       "}\n",
1457       "\n",
1458       "\n",
1459       "document.getElementById('transparencyRange_0').oninput = changeTransparency;\n",
1460       "document.getElementById('changeRotationX_0').onchange = changeRotationX;\n",
1461       "document.getElementById('changeRotationY_0').onchange = changeRotationY;\n",
1462       "document.getElementById('changeRotationZ_0').onchange = changeRotationZ;\n",
1463       "document.getElementById('resetButton_0').onclick = resetScene;\n",
1464       "document.getElementById('rotationSpeedRange_0').oninput = changeRotationSpeedFactor;\n",
1465       "document.getElementById('takeScreenshot_0').onclick = takeSvgScreenshot;\n",
1466       "document.getElementById('showSettingsButton_0').onclick = showSettings;\n",
1467       "document.getElementById('hideSettingsButton_0').onclick = hideSettings;\n",
1468       "\n",
1469       "\n",
1470       "// ------------------ SHORTCUTS --------------------------------------------\n",
1471       "// -------------------------------------------------------------------------\n",
1472       "\n",
1473       "/**\n",
1474       " * http://www.openjs.com/scripts/events/keyboard_shortcuts/\n",
1475       " * Version : 2.01.B\n",
1476       " * By Binny V A\n",
1477       " * License : BSD\n",
1478       " */\n",
1479       "shortcut = {\n",
1480       "\t'all_shortcuts':{},//All the shortcuts are stored in this array\n",
1481       "\t'add': function(shortcut_combination,callback,opt) {\n",
1482       "\t\t//Provide a set of default options\n",
1483       "\t\tvar default_options = {\n",
1484       "\t\t\t'type':'keydown',\n",
1485       "\t\t\t'propagate':false,\n",
1486       "\t\t\t'disable_in_input':false,\n",
1487       "\t\t\t'target':document,\n",
1488       "\t\t\t'keycode':false\n",
1489       "\t\t}\n",
1490       "\t\tif(!opt) opt = default_options;\n",
1491       "\t\telse {\n",
1492       "\t\t\tfor(var dfo in default_options) {\n",
1493       "\t\t\t\tif(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo];\n",
1494       "\t\t\t}\n",
1495       "\t\t}\n",
1496       "\n",
1497       "\t\tvar ele = opt.target;\n",
1498       "\t\tif(typeof opt.target == 'string') ele = document.getElementById(opt.target);\n",
1499       "\t\tvar ths = this;\n",
1500       "\t\tshortcut_combination = shortcut_combination.toLowerCase();\n",
1501       "\n",
1502       "\t\t//The function to be called at keypress\n",
1503       "\t\tvar func = function(e) {\n",
1504       "\t\t\te = e || window.event;\n",
1505       "\t\t\t\n",
1506       "\t\t\tif(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields\n",
1507       "\t\t\t\tvar element;\n",
1508       "\t\t\t\tif(e.target) element=e.target;\n",
1509       "\t\t\t\telse if(e.srcElement) element=e.srcElement;\n",
1510       "\t\t\t\tif(element.nodeType==3) element=element.parentNode;\n",
1511       "\n",
1512       "\t\t\t\tif(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return;\n",
1513       "\t\t\t}\n",
1514       "\t\n",
1515       "\t\t\t//Find Which key is pressed\n",
1516       "\t\t\tif (e.keyCode) code = e.keyCode;\n",
1517       "\t\t\telse if (e.which) code = e.which;\n",
1518       "\t\t\tvar character = String.fromCharCode(code).toLowerCase();\n",
1519       "\t\t\t\n",
1520       "\t\t\tif(code == 188) character=\",\"; //If the user presses , when the type is onkeydown\n",
1521       "\t\t\tif(code == 190) character=\".\"; //If the user presses , when the type is onkeydown\n",
1522       "\n",
1523       "\t\t\tvar keys = shortcut_combination.split(\"+\");\n",
1524       "\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",
1525       "\t\t\tvar kp = 0;\n",
1526       "\t\t\t\n",
1527       "\t\t\t//Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken\n",
1528       "\t\t\tvar shift_nums = {\n",
1529       "\t\t\t\t\"`\":\"~\",\n",
1530       "\t\t\t\t\"1\":\"!\",\n",
1531       "\t\t\t\t\"2\":\"@\",\n",
1532       "\t\t\t\t\"3\":\"#\",\n",
1533       "\t\t\t\t\"4\":\"$\",\n",
1534       "\t\t\t\t\"5\":\"%\",\n",
1535       "\t\t\t\t\"6\":\"^\",\n",
1536       "\t\t\t\t\"7\":\"&\",\n",
1537       "\t\t\t\t\"8\":\"*\",\n",
1538       "\t\t\t\t\"9\":\"(\",\n",
1539       "\t\t\t\t\"0\":\")\",\n",
1540       "\t\t\t\t\"-\":\"_\",\n",
1541       "\t\t\t\t\"=\":\"+\",\n",
1542       "\t\t\t\t\";\":\":\",\n",
1543       "\t\t\t\t\"'\":\"\\\"\",\n",
1544       "\t\t\t\t\",\":\"<\",\n",
1545       "\t\t\t\t\".\":\">\",\n",
1546       "\t\t\t\t\"/\":\"?\",\n",
1547       "\t\t\t\t\"\\\\\":\"|\"\n",
1548       "\t\t\t}\n",
1549       "\t\t\t//Special Keys - and their codes\n",
1550       "\t\t\tvar special_keys = {\n",
1551       "\t\t\t\t'esc':27,\n",
1552       "\t\t\t\t'escape':27,\n",
1553       "\t\t\t\t'tab':9,\n",
1554       "\t\t\t\t'space':32,\n",
1555       "\t\t\t\t'return':13,\n",
1556       "\t\t\t\t'enter':13,\n",
1557       "\t\t\t\t'backspace':8,\n",
1558       "\t\n",
1559       "\t\t\t\t'scrolllock':145,\n",
1560       "\t\t\t\t'scroll_lock':145,\n",
1561       "\t\t\t\t'scroll':145,\n",
1562       "\t\t\t\t'capslock':20,\n",
1563       "\t\t\t\t'caps_lock':20,\n",
1564       "\t\t\t\t'caps':20,\n",
1565       "\t\t\t\t'numlock':144,\n",
1566       "\t\t\t\t'num_lock':144,\n",
1567       "\t\t\t\t'num':144,\n",
1568       "\t\t\t\t\n",
1569       "\t\t\t\t'pause':19,\n",
1570       "\t\t\t\t'break':19,\n",
1571       "\t\t\t\t\n",
1572       "\t\t\t\t'insert':45,\n",
1573       "\t\t\t\t'home':36,\n",
1574       "\t\t\t\t'delete':46,\n",
1575       "\t\t\t\t'end':35,\n",
1576       "\t\t\t\t\n",
1577       "\t\t\t\t'pageup':33,\n",
1578       "\t\t\t\t'page_up':33,\n",
1579       "\t\t\t\t'pu':33,\n",
1580       "\t\n",
1581       "\t\t\t\t'pagedown':34,\n",
1582       "\t\t\t\t'page_down':34,\n",
1583       "\t\t\t\t'pd':34,\n",
1584       "\t\n",
1585       "\t\t\t\t'left':37,\n",
1586       "\t\t\t\t'up':38,\n",
1587       "\t\t\t\t'right':39,\n",
1588       "\t\t\t\t'down':40,\n",
1589       "\t\n",
1590       "\t\t\t\t'f1':112,\n",
1591       "\t\t\t\t'f2':113,\n",
1592       "\t\t\t\t'f3':114,\n",
1593       "\t\t\t\t'f4':115,\n",
1594       "\t\t\t\t'f5':116,\n",
1595       "\t\t\t\t'f6':117,\n",
1596       "\t\t\t\t'f7':118,\n",
1597       "\t\t\t\t'f8':119,\n",
1598       "\t\t\t\t'f9':120,\n",
1599       "\t\t\t\t'f10':121,\n",
1600       "\t\t\t\t'f11':122,\n",
1601       "\t\t\t\t'f12':123\n",
1602       "\t\t\t}\n",
1603       "\t\n",
1604       "\t\t\tvar modifiers = { \n",
1605       "\t\t\t\tshift: { wanted:false, pressed:false},\n",
1606       "\t\t\t\tctrl : { wanted:false, pressed:false},\n",
1607       "\t\t\t\talt  : { wanted:false, pressed:false},\n",
1608       "\t\t\t\tmeta : { wanted:false, pressed:false}\t//Meta is Mac specific\n",
1609       "\t\t\t};\n",
1610       "                        \n",
1611       "\t\t\tif(e.ctrlKey)\tmodifiers.ctrl.pressed = true;\n",
1612       "\t\t\tif(e.shiftKey)\tmodifiers.shift.pressed = true;\n",
1613       "\t\t\tif(e.altKey)\tmodifiers.alt.pressed = true;\n",
1614       "\t\t\tif(e.metaKey)   modifiers.meta.pressed = true;\n",
1615       "                        \n",
1616       "\t\t\tfor(var i=0; k=keys[i],i<keys.length; i++) {\n",
1617       "\t\t\t\t//Modifiers\n",
1618       "\t\t\t\tif(k == 'ctrl' || k == 'control') {\n",
1619       "\t\t\t\t\tkp++;\n",
1620       "\t\t\t\t\tmodifiers.ctrl.wanted = true;\n",
1621       "\n",
1622       "\t\t\t\t} else if(k == 'shift') {\n",
1623       "\t\t\t\t\tkp++;\n",
1624       "\t\t\t\t\tmodifiers.shift.wanted = true;\n",
1625       "\n",
1626       "\t\t\t\t} else if(k == 'alt') {\n",
1627       "\t\t\t\t\tkp++;\n",
1628       "\t\t\t\t\tmodifiers.alt.wanted = true;\n",
1629       "\t\t\t\t} else if(k == 'meta') {\n",
1630       "\t\t\t\t\tkp++;\n",
1631       "\t\t\t\t\tmodifiers.meta.wanted = true;\n",
1632       "\t\t\t\t} else if(k.length > 1) { //If it is a special key\n",
1633       "\t\t\t\t\tif(special_keys[k] == code) kp++;\n",
1634       "\t\t\t\t\t\n",
1635       "\t\t\t\t} else if(opt['keycode']) {\n",
1636       "\t\t\t\t\tif(opt['keycode'] == code) kp++;\n",
1637       "\n",
1638       "\t\t\t\t} else { //The special keys did not match\n",
1639       "\t\t\t\t\tif(character == k) kp++;\n",
1640       "\t\t\t\t\telse {\n",
1641       "\t\t\t\t\t\tif(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase\n",
1642       "\t\t\t\t\t\t\tcharacter = shift_nums[character]; \n",
1643       "\t\t\t\t\t\t\tif(character == k) kp++;\n",
1644       "\t\t\t\t\t\t}\n",
1645       "\t\t\t\t\t}\n",
1646       "\t\t\t\t}\n",
1647       "\t\t\t}\n",
1648       "\t\t\t\n",
1649       "\t\t\tif(kp == keys.length && \n",
1650       "\t\t\t\t\t\tmodifiers.ctrl.pressed == modifiers.ctrl.wanted &&\n",
1651       "\t\t\t\t\t\tmodifiers.shift.pressed == modifiers.shift.wanted &&\n",
1652       "\t\t\t\t\t\tmodifiers.alt.pressed == modifiers.alt.wanted &&\n",
1653       "\t\t\t\t\t\tmodifiers.meta.pressed == modifiers.meta.wanted) {\n",
1654       "\t\t\t\tcallback(e);\n",
1655       "\t\n",
1656       "\t\t\t\tif(!opt['propagate']) { //Stop the event\n",
1657       "\t\t\t\t\t//e.cancelBubble is supported by IE - this will kill the bubbling process.\n",
1658       "\t\t\t\t\te.cancelBubble = true;\n",
1659       "\t\t\t\t\te.returnValue = false;\n",
1660       "\t\n",
1661       "\t\t\t\t\t//e.stopPropagation works in Firefox.\n",
1662       "\t\t\t\t\tif (e.stopPropagation) {\n",
1663       "\t\t\t\t\t\te.stopPropagation();\n",
1664       "\t\t\t\t\t\te.preventDefault();\n",
1665       "\t\t\t\t\t}\n",
1666       "\t\t\t\t\treturn false;\n",
1667       "\t\t\t\t}\n",
1668       "\t\t\t}\n",
1669       "\t\t}\n",
1670       "\t\tthis.all_shortcuts[shortcut_combination] = {\n",
1671       "\t\t\t'callback':func, \n",
1672       "\t\t\t'target':ele, \n",
1673       "\t\t\t'event': opt['type']\n",
1674       "\t\t};\n",
1675       "\t\t//Attach the function with the event\n",
1676       "\t\tif(ele.addEventListener) ele.addEventListener(opt['type'], func, false);\n",
1677       "\t\telse if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func);\n",
1678       "\t\telse ele['on'+opt['type']] = func;\n",
1679       "\t},\n",
1680       "\n",
1681       "\t//Remove the shortcut - just specify the shortcut and I will remove the binding\n",
1682       "\t'remove':function(shortcut_combination) {\n",
1683       "\t\tshortcut_combination = shortcut_combination.toLowerCase();\n",
1684       "\t\tvar binding = this.all_shortcuts[shortcut_combination];\n",
1685       "\t\tdelete(this.all_shortcuts[shortcut_combination])\n",
1686       "\t\tif(!binding) return;\n",
1687       "\t\tvar type = binding['event'];\n",
1688       "\t\tvar ele = binding['target'];\n",
1689       "\t\tvar callback = binding['callback'];\n",
1690       "\n",
1691       "\t\tif(ele.detachEvent) ele.detachEvent('on'+type, callback);\n",
1692       "\t\telse if(ele.removeEventListener) ele.removeEventListener(type, callback, false);\n",
1693       "\t\telse ele['on'+type] = false;\n",
1694       "\t}\n",
1695       "}\n",
1696       "\n",
1697       "shortcut.add(\"Alt+Left\",function() {\n",
1698       "\tvar event = new Event('click');\n",
1699       "\tif (settingsShown){\n",
1700       "\t\tdocument.getElementById('hideSettingsButton_0').dispatchEvent(event);\n",
1701       "\t} else {\n",
1702       "\t\tdocument.getElementById('showSettingsButton_0').dispatchEvent(event);\n",
1703       "\t}\n",
1704       "});\n",
1705       "\n",
1706       "\n",
1707       "// COMMON_CODE_BLOCK_END\n",
1708       "\n",
1709       "});});\n",
1710       "      </script>\n",
1711       "   </body>\n",
1712       "</html>"
1713      ]
1714     },
1715     "metadata": {},
1716     "output_type": "display_data"
1717    },
1718    {
1719     "data": {
1720      "text/html": [
1721       "<!--\n",
1722       "polymake for knusper\n",
1723       "Thu Aug 27 11:38:57 2020\n",
1724       "unnamed\n",
1725       "-->\n",
1726       "\n",
1727       "\n",
1728       "<html>\n",
1729       "   <head>\n",
1730       "      <meta charset=utf-8>\n",
1731       "      <title>unnamed</title>\n",
1732       "      <style>\n",
1733       "/*\n",
1734       "// COMMON_CODE_BLOCK_BEGIN\n",
1735       "*/\n",
1736       "         html {overflow: scroll;}\n",
1737       "         strong{font-size: 18px;}\n",
1738       "         canvas { z-index: 8; }\n",
1739       "         input[type='radio'] {margin-left:0;}\n",
1740       "         input[type='checkbox'] {margin-right:7px; margin-left: 0px; padding-left:0px;}\n",
1741       "         .group{padding-bottom: 15px;}\n",
1742       "         .settings * {z-index: 11; }\n",
1743       "         .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",
1744       "         .indented{margin-left: 20px; margin-top: 10px; padding-bottom: 0px;} \n",
1745       "         .shownObjectsList{overflow: auto; max-width: 150px; max-height: 150px;}\n",
1746       "         .showSettingsButton{visibility: visible; z-index: 12; position: absolute }\n",
1747       "         .hideSettingsButton{visibility: hidden; z-index: 12; position: absolute; opacity: 0.5}\n",
1748       "         button{margin-left: 0; margin-top: 10px}\n",
1749       "         img{cursor: pointer;}\n",
1750       "         .suboption{padding-top: 15px;}\n",
1751       "         #model37327624959 { width: 100%; height: 100%; }\n",
1752       "         .threejs_container { width: 100%; height: 75vh;}\n",
1753       "         .settings{max-height: 74vh} \n",
1754       "         input[type=range] {\n",
1755       "           -webkit-appearance: none;\n",
1756       "           padding:0; \n",
1757       "           width:90%; \n",
1758       "           margin-left: auto;\n",
1759       "           margin-right: auto;\n",
1760       "           margin-top: 15px;\n",
1761       "           margin-bottom: 15px;\n",
1762       "           display: block;\t\n",
1763       "         }\n",
1764       "         input[type=range]:focus {\n",
1765       "           outline: none;\n",
1766       "         }\n",
1767       "         input[type=range]::-webkit-slider-runnable-track {\n",
1768       "           height: 4px;\n",
1769       "           cursor: pointer;\n",
1770       "           animate: 0.2s;\n",
1771       "           box-shadow: 0px 0px 0px #000000;\n",
1772       "           background: #E3E3E3;\n",
1773       "           border-radius: 0px;\n",
1774       "           border: 0px solid #000000;\n",
1775       "         }\n",
1776       "         input[type=range]::-webkit-slider-thumb {\n",
1777       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
1778       "           border: 1px solid #ABABAB;\n",
1779       "           height: 13px;\n",
1780       "           width: 25px;\n",
1781       "           border-radius: 20px;\n",
1782       "           background: #E0E0E0;\n",
1783       "           cursor: pointer;\n",
1784       "           -webkit-appearance: none;\n",
1785       "           margin-top: -5px;\n",
1786       "         }\n",
1787       "         input[type=range]:focus::-webkit-slider-runnable-track {\n",
1788       "           background: #E3E3E3;\n",
1789       "         }\n",
1790       "         input[type=range]::-moz-range-track {\n",
1791       "           height: 4px;\n",
1792       "           cursor: pointer;\n",
1793       "           animate: 0.2s;\n",
1794       "           box-shadow: 0px 0px 0px #000000;\n",
1795       "           background: #E3E3E3;\n",
1796       "           border-radius: 0px;\n",
1797       "           border: 0px solid #000000;\n",
1798       "         }\n",
1799       "         input[type=range]::-moz-range-thumb {\n",
1800       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
1801       "           border: 1px solid #ABABAB;\n",
1802       "           height: 13px;\n",
1803       "           width: 25px;\n",
1804       "           border-radius: 20px;\n",
1805       "           background: #E0E0E0;\n",
1806       "           cursor: pointer;\n",
1807       "         }\n",
1808       "         input[type=range]::-ms-track {\n",
1809       "           height: 4px;\n",
1810       "           cursor: pointer;\n",
1811       "           animate: 0.2s;\n",
1812       "           background: transparent;\n",
1813       "           border-color: transparent;\n",
1814       "           color: transparent;\n",
1815       "         }\n",
1816       "         input[type=range]::-ms-fill-lower {\n",
1817       "           background: #E3E3E3;\n",
1818       "           border: 0px solid #000000;\n",
1819       "           border-radius: 0px;\n",
1820       "           box-shadow: 0px 0px 0px #000000;\n",
1821       "         }\n",
1822       "         input[type=range]::-ms-fill-upper {\n",
1823       "           background: #E3E3E3;\n",
1824       "           border: 0px solid #000000;\n",
1825       "           border-radius: 0px;\n",
1826       "           box-shadow: 0px 0px 0px #000000;\n",
1827       "         }\n",
1828       "         input[type=range]::-ms-thumb {\n",
1829       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
1830       "           border: 1px solid #ABABAB;\n",
1831       "           height: 13px;\n",
1832       "           width: 25px;\n",
1833       "           border-radius: 20px;\n",
1834       "           background: #E0E0E0;\n",
1835       "           cursor: pointer;\n",
1836       "         }\n",
1837       "         input[type=range]:focus::-ms-fill-lower {\n",
1838       "           background: #E3E3E3;\n",
1839       "         }\n",
1840       "         input[type=range]:focus::-ms-fill-upper {\n",
1841       "           background: #E3E3E3;\n",
1842       "         }\n",
1843       "/*\n",
1844       "// COMMON_CODE_BLOCK_END\n",
1845       "*/\n",
1846       "\t\t</style>\n",
1847       "   </head>\n",
1848       "<body>\n",
1849       "   <div class='threejs_container'>\n",
1850       "\t\t<div id='settings_1' class='settings'>\n",
1851       "\t\t\t<div class=group id='transparency_1' class='transparency'>\n",
1852       "\t\t\t\t<strong>Transparency</strong>\n",
1853       "\t\t\t\t<input id='transparencyRange_1' type='range' min=0 max=1 step=0.01 value=0>\n",
1854       "\t\t\t</div>\n",
1855       "\t\t\t\n",
1856       "\t\t\t<div class=group id='rotation_1'>\n",
1857       "\t\t\t\t<strong>Rotation</strong>\n",
1858       "\t\t\t\t<div class=indented>\n",
1859       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationX_1'> x-axis</div>\n",
1860       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationY_1'> y-axis</div>\n",
1861       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationZ_1'> z-axis</div>\n",
1862       "\t\t\t\t\t<button id='resetButton_1'>Reset</button>\n",
1863       "\t\t\t\t</div>\n",
1864       "\n",
1865       "\t\t\t\t<div class=suboption>Rotation speed</div>\n",
1866       "\t\t\t\t<input id='rotationSpeedRange_1' type='range' min=0 max=5 step=0.01 value=2>\n",
1867       "\t\t\t</div>\n",
1868       "\n",
1869       "\n",
1870       "\t\t\t<div class=group id='display_1'>\n",
1871       "\t\t\t\t<strong>Display</strong>\n",
1872       "\t\t\t\t<div class=indented>\n",
1873       "\t\t\t\t\t<div id='shownObjectTypesList_1' class='shownObjectsList'></div>\n",
1874       "\t\t\t\t</div>\n",
1875       "\t\t\t\t<div class=suboption>Objects</div>\n",
1876       "\t\t\t\t<div class=indented>\n",
1877       "\t\t\t\t   <div id='shownObjectsList_1' class='shownObjectsList'></div>\n",
1878       "\t\t\t\t</div>\n",
1879       "\t\t\t</div>\n",
1880       "         \n",
1881       "         <div class=group id='camera_1'>\n",
1882       "            <strong>Camera</strong>\n",
1883       "            <div class=indented>\n",
1884       "               <form>\n",
1885       "                  <select id=\"cameraType_1\">\n",
1886       "                     <option value='perspective' selected> Perspective<br></option>\n",
1887       "                     <option value='orthographic' > Orthographic<br></option>\n",
1888       "                  </select>\n",
1889       "               </form>\n",
1890       "            </div>\n",
1891       "         </div>\n",
1892       "\n",
1893       "\t\t\t<div class=group id='svg_1'>\n",
1894       "\t\t\t\t<strong>SVG</strong>\n",
1895       "\t\t\t\t<div class=indented>\n",
1896       "\t\t\t\t\t<form>\n",
1897       "\t\t\t\t\t\t<input type=\"radio\" name='screenshotMode' value='download' id='download_1' checked> Download<br>\n",
1898       "\t\t\t\t\t\t<input type=\"radio\" name='screenshotMode' value='tab' id='tab_1' > New tab<br>\n",
1899       "\t\t\t\t\t</form>\n",
1900       "\t\t\t\t\t<button id='takeScreenshot_1'>Screenshot</button>\n",
1901       "\t\t\t\t</div>\n",
1902       "\t\t\t</div>\n",
1903       "\n",
1904       "\t\t</div>\t<!-- end of settings -->\n",
1905       "\t\t<img id='hideSettingsButton_1' class='hideSettingsButton' src='/kernelspecs/polymake/close.svg' width=20px\">\n",
1906       "\t\t<img id='showSettingsButton_1' class='showSettingsButton' src='/kernelspecs/polymake/menu.svg' width=20px\">\n",
1907       "<div id=\"model37327624959\"></div>\n",
1908       "</div>\n",
1909       "   <script>\n",
1910       "    requirejs.config({\n",
1911       "      paths: {\n",
1912       "        three: '/kernelspecs/polymake/three',\n",
1913       "        TrackballControls: '/kernelspecs/polymake/TrackballControls',\n",
1914       "        OrbitControls: '/kernelspecs/polymake/OrbitControls',\n",
1915       "        Projector: '/kernelspecs/polymake/Projector',\n",
1916       "        SVGRenderer: '/kernelspecs/polymake/SVGRenderer',\n",
1917       "        WEBGL: '/kernelspecs/polymake/WebGL',\n",
1918       "      },\n",
1919       "      shim: {\n",
1920       "        'three': { exports: 'THREE'},\n",
1921       "        'SVGRenderer': { deps: [ 'three' ], exports: 'THREE.SVGRenderer' },\n",
1922       "        'WEBGL': { deps: [ 'three' ], exports: 'THREE.WEBGL' },\n",
1923       "        'Projector': { deps: [ 'three' ], exports: 'THREE.Projector' },\n",
1924       "        'TrackballControls': { deps: [ 'three' ], exports: 'THREE.TrackballControls' },\n",
1925       "        'OrbitControls': { deps: [ 'three' ], exports: 'THREE.OrbitControls' },\n",
1926       "      }\n",
1927       "    });\n",
1928       "    \n",
1929       "    require(['three'],function(THREE){\n",
1930       "        window.THREE = THREE;\n",
1931       "      require(['TrackballControls', 'OrbitControls', 'Projector', 'SVGRenderer', 'WEBGL'],\n",
1932       "               function(TrackballControls, OrbitControls, Projector, SVGRenderer, WEBGL) {\n",
1933       "    THREE.TrackballControls = TrackballControls;\n",
1934       "    THREE.OrbitControls = OrbitControls;\n",
1935       "    THREE.Projector = Projector;\n",
1936       "    THREE.SVGRenderer = SVGRenderer;\n",
1937       "    THREE.WEBGL = WEBGL;\n",
1938       "\n",
1939       "// COMMON_CODE_BLOCK_BEGIN\n",
1940       "\n",
1941       "const intervalLength = 25; // for automatic animations\n",
1942       "const explodableModel = false; \n",
1943       "const modelContains = { points: false, pointlabels: false, lines: false, edgelabels: false, faces: false, arrowheads: false };\n",
1944       "const foldables = [];\n",
1945       "\n",
1946       "var three = document.getElementById(\"model37327624959\");\n",
1947       "var scene = new THREE.Scene();\n",
1948       "var renderer = new THREE.WebGLRenderer( { antialias: true } );\n",
1949       "var svgRenderer = new THREE.SVGRenderer( { antialias: true } );\n",
1950       "renderer.setPixelRatio( window.devicePixelRatio );\n",
1951       "renderer.setClearColor(0xFFFFFF, 1);\n",
1952       "svgRenderer.setClearColor(0xFFFFFF, 1);\n",
1953       "three.appendChild(renderer.domElement);\n",
1954       "\n",
1955       "var frustumSize = 4;\n",
1956       "var cameras = [new THREE.PerspectiveCamera(75, 1, 0.1, 1000), new THREE.OrthographicCamera()];\n",
1957       "cameras.forEach(function(cam) {\n",
1958       "    cam.position.set(0, 0, 5);\n",
1959       "    cam.lookAt(0, 0, 0);  \n",
1960       "    cam.up.set(0, 1, 0);         \n",
1961       "});\n",
1962       "var controls = [new THREE.TrackballControls(cameras[0], three), new THREE.OrbitControls(cameras[1], three)];\n",
1963       "var camera, control;\n",
1964       "\n",
1965       "controls[0].zoomSpeed = 0.2;\n",
1966       "controls[0].rotateSpeed = 4;\n",
1967       "\n",
1968       "\n",
1969       "// class to allow move points together with labels and spheres\n",
1970       "var PMPoint = function (x,y,z) {\n",
1971       "   this.vector = new THREE.Vector3(x,y,z);\n",
1972       "   this.sprite = null;\n",
1973       "   this.sphere = null;\n",
1974       "}\n",
1975       "PMPoint.prototype.addLabel = function(labelsprite) {\n",
1976       "   this.sprite = labelsprite;\n",
1977       "   this.sprite.position.copy(this.vector);\n",
1978       "}\n",
1979       "PMPoint.prototype.addSphere = function(spheremesh) {\n",
1980       "   this.sphere = spheremesh;\n",
1981       "   this.sphere.position.copy(this.vector);\n",
1982       "}\n",
1983       "PMPoint.prototype.set = function(x,y,z) {\n",
1984       "   this.vector.set(x,y,z);\n",
1985       "   if (this.sprite) {\n",
1986       "      this.sprite.position.copy(this.vector);\n",
1987       "   }\n",
1988       "   if (this.sphere) {\n",
1989       "      this.sphere.position.copy(this.vector);\n",
1990       "   }\n",
1991       "}\n",
1992       "PMPoint.prototype.radius = function() {\n",
1993       "   if (this.sphere) {\n",
1994       "      return this.sphere.geometry.parameters.radius;\n",
1995       "   } else {\n",
1996       "      return 0;\n",
1997       "   }\n",
1998       "};\n",
1999       "// select the target node\n",
2000       "var target = document.querySelector('#model37327624959');\n",
2001       "\n",
2002       "// create an observer instance\n",
2003       "var observer = new MutationObserver(function(mutations) {\n",
2004       "   mutations.forEach(function(mutation) {\n",
2005       "      if (mutation.removedNodes && mutation.removedNodes.length > 0) {\n",
2006       "         cancelAnimationFrame(renderId);\n",
2007       "         observer.disconnect();\n",
2008       "         console.log(\"cancelled frame \"+renderId);\n",
2009       "      }\n",
2010       "   });\n",
2011       "});\n",
2012       "\n",
2013       "// configuration of the observer:\n",
2014       "var config = { childList: true, characterData: true }\n",
2015       "\n",
2016       "// pass in the target node, as well as the observer options\n",
2017       "while (target) {\n",
2018       "   if (target.className==\"output\") {\n",
2019       "      observer.observe(target, config);\n",
2020       "      break;\n",
2021       "   }\n",
2022       "   target = target.parentNode;\n",
2023       "}\n",
2024       "\n",
2025       "// COMMON_CODE_BLOCK_END\n",
2026       "\n",
2027       "var obj0 = new THREE.Object3D();\n",
2028       "obj0.name = \"unnamed__1\";\n",
2029       "obj0.userData.explodable = 1;\n",
2030       "obj0.userData.points = [];\n",
2031       "obj0.userData.points.push(new PMPoint(0, 0, 0));\n",
2032       "obj0.userData.points.push(new PMPoint(1, 0, 0));\n",
2033       "obj0.userData.points.push(new PMPoint(0, 1, 0));\n",
2034       "obj0.userData.points.push(new PMPoint(0, 0, 1));\n",
2035       "\n",
2036       "obj0.userData.pointradii = 0.02;\n",
2037       "   <!-- Vertex style -->\n",
2038       "obj0.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
2039       "obj0.userData.pointlabels = [\"0\", \"1\", \"2\", \"3\"];\n",
2040       "obj0.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];\n",
2041       "   <!-- Edge style -->\n",
2042       "obj0.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
2043       "obj0.userData.facets = [[2, 3, 1], [0, 3, 2], [1, 3, 0], [2, 1, 0]];\n",
2044       "   <!-- Facet style -->\n",
2045       "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",
2046       "init_object(obj0);\n",
2047       "scene.add(obj0);\n",
2048       "\n",
2049       "// COMMON_CODE_BLOCK_BEGIN\n",
2050       "function textSpriteMaterial(message, parameters) {\n",
2051       "    if ( parameters === undefined ) parameters = {};\n",
2052       "    var fontface = \"Helvetica\";\n",
2053       "    var fontsize = parameters.hasOwnProperty(\"fontsize\") ? parameters[\"fontsize\"] : 15;\n",
2054       "    fontsize = fontsize*10;\n",
2055       "    var lines = message.split('\\\\n');\n",
2056       "    var size = 512;\n",
2057       "    for(var i = 0; i<lines.length; i++){\n",
2058       "        var tmp = lines[i].length;\n",
2059       "        while(tmp*fontsize > size){\n",
2060       "           fontsize--;\n",
2061       "        }\n",
2062       "    }\n",
2063       "    \n",
2064       "    var canvas = document.createElement('canvas');\n",
2065       "    canvas.width = size;\n",
2066       "    canvas.height = size;\n",
2067       "    var context = canvas.getContext('2d');\n",
2068       "    context.fillStyle = \"rgba(255, 255, 255, 0)\";\n",
2069       "    context.fill();\n",
2070       "    context.font = fontsize + \"px \" + fontface;\n",
2071       "    \n",
2072       "    // text color\n",
2073       "    context.fillStyle = \"rgba(0, 0, 0, 1.0)\";\n",
2074       "     for(var i = 0; i<lines.length; i++){\n",
2075       "        context.fillText(lines[i], size/2, size/2+i*fontsize);\n",
2076       "     }\n",
2077       "    \n",
2078       "    // canvas contents will be used for a texture\n",
2079       "    var texture = new THREE.Texture(canvas);\n",
2080       "    texture.needsUpdate = true;\n",
2081       "    \n",
2082       "    var spriteMaterial = new THREE.SpriteMaterial({map: texture, depthTest: true, depthWrite: false, polygonOffset: true, polygonOffsetFactor: -1, polygonOffsetUnits: 1 });\n",
2083       "    return spriteMaterial;\n",
2084       "}\n",
2085       "\n",
2086       "\n",
2087       "// ---------------------- INITIALIZING OBJECTS--------------------------------------\n",
2088       "// ---------------------------------------------------------------------------------\n",
2089       "\n",
2090       "function init_object(obj) {\n",
2091       "    if (obj.userData.hasOwnProperty(\"pointmaterial\")) {\n",
2092       "        init_points(obj);\n",
2093       "        modelContains.points = true;\n",
2094       "    }\n",
2095       "    if (obj.userData.hasOwnProperty(\"pointlabels\")) {\n",
2096       "        init_pointlabels(obj);\n",
2097       "        modelContains.pointlabels = true;\n",
2098       "    }\n",
2099       "    if (obj.userData.hasOwnProperty(\"edgematerial\")) {\n",
2100       "        init_lines(obj);\n",
2101       "        modelContains.lines = true;\n",
2102       "    }\n",
2103       "    if (obj.userData.hasOwnProperty(\"edgelabels\")) {\n",
2104       "        init_edgelabels(obj);\n",
2105       "        modelContains.edgelabels = true;\n",
2106       "    }\n",
2107       "    if (obj.userData.hasOwnProperty(\"arrowstyle\")) {\n",
2108       "        init_arrowheads(obj);\n",
2109       "        modelContains.arrowheads = true;\n",
2110       "    }\n",
2111       "    if (obj.userData.hasOwnProperty(\"facetmaterial\")) {\n",
2112       "        init_faces(obj);\n",
2113       "        modelContains.faces = true;\n",
2114       "    }\n",
2115       "}\n",
2116       "\n",
2117       "function init_points(obj) {\n",
2118       "    var pointgroup = new THREE.Group();\n",
2119       "    pointgroup.name = \"points\";\n",
2120       "    var points = obj.userData.points;\n",
2121       "    var radii = obj.userData.pointradii;\n",
2122       "    var materials = obj.userData.pointmaterial;\n",
2123       "    var geometry,material;\n",
2124       "    if (!Array.isArray(radii)) {\n",
2125       "        geometry = new THREE.SphereBufferGeometry(radii);  \n",
2126       "    }\n",
2127       "    if (!Array.isArray(materials)) {\n",
2128       "        material = materials;\n",
2129       "    }\n",
2130       "    for (var i=0; i<points.length; i++) {\n",
2131       "        var point = points[i];\n",
2132       "        if (Array.isArray(radii)) {\n",
2133       "            if (radii[i] == 0) {\n",
2134       "                continue;\n",
2135       "            }\n",
2136       "            geometry = new THREE.SphereBufferGeometry(radii[i]);  \n",
2137       "        } \n",
2138       "        if (Array.isArray(materials)) {\n",
2139       "            material = materials[i];     \n",
2140       "        } \n",
2141       "        var sphere = new THREE.Mesh(geometry, material);\n",
2142       "        point.addSphere(sphere);\n",
2143       "        pointgroup.add(sphere);\n",
2144       "    }\n",
2145       "    obj.add(pointgroup);\n",
2146       "}\n",
2147       "\n",
2148       "function init_pointlabels(obj) {\n",
2149       "    var points = obj.userData.points;\n",
2150       "    var labels = obj.userData.pointlabels;\n",
2151       "    var pointlabels = new THREE.Group();\n",
2152       "    pointlabels.name = \"pointlabels\";\n",
2153       "    if (Array.isArray(labels)) {\n",
2154       "        for (var i=0; i<points.length; i++) {\n",
2155       "            var point = points[i];\n",
2156       "            var spriteMaterial = textSpriteMaterial( labels[i] );\n",
2157       "\t        var sprite = new THREE.Sprite(spriteMaterial);\n",
2158       "            point.addLabel(sprite);\n",
2159       "            pointlabels.add(sprite);\n",
2160       "        }\n",
2161       "    } else {\n",
2162       "        var spriteMaterial = textSpriteMaterial( labels );\n",
2163       "        for (var i=0; i<points.length; i++) {\n",
2164       "            var point = points[i];\n",
2165       "\t        var sprite = new THREE.Sprite(spriteMaterial);\n",
2166       "            point.addLabel(sprite);\n",
2167       "            pointlabels.add(sprite);\n",
2168       "        }\n",
2169       "    }\n",
2170       "    obj.add(pointlabels);\n",
2171       "}\n",
2172       "\n",
2173       "function init_lines(obj) {\n",
2174       "    var edgeindices = obj.userData.edgeindices;\n",
2175       "    var points = obj.userData.points;\n",
2176       "    var materials = obj.userData.edgematerial;\n",
2177       "    var geometry = new THREE.BufferGeometry();\n",
2178       "    var bufarr = new Float32Array( obj.userData.edgeindices.length * 3 );\n",
2179       "    var bufattr = new THREE.Float32BufferAttribute( bufarr, 3 );\n",
2180       "    var geometry = new THREE.BufferGeometry();\n",
2181       "    geometry.setAttribute('position', bufattr);\n",
2182       "    if (Array.isArray(materials)) {     \n",
2183       "        for (var i=0; i<materials.length; i++) {\n",
2184       "            geometry.addGroup(2*i,2,i);\n",
2185       "        }\n",
2186       "    }\n",
2187       "    var lines = new THREE.LineSegments(geometry, materials);\n",
2188       "    lines.name = \"lines\";\n",
2189       "    obj.add(lines);\n",
2190       "    updateEdgesPosition(obj);\n",
2191       "}\n",
2192       "\n",
2193       "function init_edgelabels(obj) {\n",
2194       "    var points = obj.userData.points;\n",
2195       "    var edgeindices = obj.userData.edgeindices;\n",
2196       "    var labels = obj.userData.edgelabels;\n",
2197       "    var edgelabels = new THREE.Group();\n",
2198       "    edgelabels.name = \"edgelabels\";\n",
2199       "    if (Array.isArray(labels)) {\n",
2200       "        for (var i=0; i<edgeindices.length; i=i+2) {\n",
2201       "            var point = points[i];\n",
2202       "            var spriteMaterial = textSpriteMaterial( labels[i] );\n",
2203       "            var sprite = new THREE.Sprite(spriteMaterial);\n",
2204       "            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[i]].vector,points[edgeindices[i+1]].vector).multiplyScalar(0.5));\n",
2205       "            edgelabels.add(sprite);\n",
2206       "        }\n",
2207       "    } else {\n",
2208       "        var spriteMaterial = textSpriteMaterial( labels );\n",
2209       "        for (var i=0; i<points.length; i++) {\n",
2210       "            var point = points[i];\n",
2211       "            var sprite = new THREE.Sprite(spriteMaterial);\n",
2212       "            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[i]].vector,points[edgeindices[i+1]].vector).multiplyScalar(0.5));\n",
2213       "            pointlabels.add(sprite);\n",
2214       "        }\n",
2215       "    }\n",
2216       "    obj.add(edgelabels);\n",
2217       "}\n",
2218       "\n",
2219       "function init_arrowheads(obj) {\n",
2220       "    var arrowheads = new THREE.Group();\n",
2221       "    arrowheads.name = \"arrowheads\";\n",
2222       "    var arrowstyle = obj.userData.arrowstyle;\n",
2223       "    var edgeindices = obj.userData.edgeindices;\n",
2224       "    var edgematerials = obj.userData.edgematerial;\n",
2225       "    var points = obj.userData.points;\n",
2226       "    var material;\n",
2227       "    if (!Array.isArray(edgematerials)) {\n",
2228       "        material = new THREE.MeshBasicMaterial( {color: edgematerials.color} );\n",
2229       "    }\n",
2230       "\n",
2231       "    for (var i=0; i<edgeindices.length; i=i+2) {\n",
2232       "        var start = points[edgeindices[i]];\n",
2233       "        var end = points[edgeindices[i+1]];\n",
2234       "        var dist = start.vector.distanceTo( end.vector ) - start.radius() - end.radius();\n",
2235       "        if (dist <= 0) {\n",
2236       "            continue;\n",
2237       "        }\n",
2238       "        var dir = new THREE.Vector3().subVectors(end.vector,start.vector);\n",
2239       "        dir.normalize();\n",
2240       "        var axis = new THREE.Vector3().set(dir.z,0,-dir.x);\n",
2241       "        axis.normalize();\n",
2242       "        var radians = Math.acos( dir.y );\n",
2243       "        var radius = dist/25;\n",
2244       "        var height = dist/5;\n",
2245       "        var geometry = new THREE.ConeBufferGeometry(radius,height);\n",
2246       "        var position = new THREE.Vector3().addVectors(start.vector,dir.clone().multiplyScalar(start.radius()+dist-height/2));\n",
2247       "        if (Array.isArray(edgematerials)) {\n",
2248       "            material = new THREE.MeshBasicMaterial( {color: edgematerials[i].color} );\n",
2249       "        }\n",
2250       "        var cone = new THREE.Mesh( geometry, material );\n",
2251       "        cone.quaternion.setFromAxisAngle(axis,radians);;\n",
2252       "        cone.position.copy(position);;\n",
2253       "        arrowheads.add(cone);\n",
2254       "    }\n",
2255       "    obj.add(arrowheads);\n",
2256       "}\n",
2257       "\n",
2258       "function init_faces(obj) {\n",
2259       "    var points = obj.userData.points;\n",
2260       "    var facets = obj.userData.facets;\n",
2261       "    obj.userData.triangleindices = [];\n",
2262       "    for (var i=0; i<facets.length; i++) {\n",
2263       "        facet = facets[i];\n",
2264       "        for (var t=0; t<facet.length-2; t++) {\n",
2265       "            obj.userData.triangleindices.push(facet[0],facet[t+1],facet[t+2]);  \n",
2266       "        }\n",
2267       "    }\n",
2268       "    var bufarr = new Float32Array( obj.userData.triangleindices.length * 3 );\n",
2269       "    var bufattr = new THREE.Float32BufferAttribute(bufarr,3);\n",
2270       "    \n",
2271       "    var materials = obj.userData.facetmaterial;\n",
2272       "    var geometry = new THREE.BufferGeometry();\n",
2273       "    geometry.setAttribute('position',bufattr);\n",
2274       "    if (Array.isArray(materials)) {\n",
2275       "        var tricount = 0;\n",
2276       "        var facet;\n",
2277       "        for (var i=0; i<facets.length; i++) {\n",
2278       "            facet = facets[i];\n",
2279       "            geometry.addGroup(tricount,(facet.length-2)*3,i);\n",
2280       "            tricount += (facet.length-2)*3;\n",
2281       "        }\n",
2282       "    }\n",
2283       "    var mesh = new THREE.Mesh(geometry, materials);\n",
2284       "    mesh.name = \"faces\";\n",
2285       "    obj.add(mesh); \n",
2286       "    updateFacesPosition(obj);\n",
2287       "}\n",
2288       "// //INITIALIZING\n",
2289       "\n",
2290       "\n",
2291       "function updateFacesPosition(obj) {\n",
2292       "    var points = obj.userData.points;\n",
2293       "    var indices = obj.userData.triangleindices;\n",
2294       "    var faces = obj.getObjectByName(\"faces\");\n",
2295       "    var ba = faces.geometry.getAttribute(\"position\");\n",
2296       "    for (var i=0; i<indices.length; i++) {\n",
2297       "        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); \n",
2298       "    }\n",
2299       "    faces.geometry.attributes.position.needsUpdate = true;\n",
2300       "    \n",
2301       "}\n",
2302       "\n",
2303       "function updateEdgesPosition(obj) {\n",
2304       "    var points = obj.userData.points;\n",
2305       "    var indices = obj.userData.edgeindices;\n",
2306       "    var lines = obj.getObjectByName(\"lines\");\n",
2307       "    var ba = lines.geometry.getAttribute(\"position\"); \n",
2308       "    for (var i=0; i<indices.length; i++) {\n",
2309       "        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); \n",
2310       "    }\n",
2311       "    lines.geometry.attributes.position.needsUpdate = true;\n",
2312       "}\n",
2313       "\n",
2314       "function onWindowResize() {\n",
2315       "    renderer.setSize( three.clientWidth, three.clientHeight );\n",
2316       "    svgRenderer.setSize( three.clientWidth, three.clientHeight );\n",
2317       "    updateCamera();\n",
2318       "}\n",
2319       "\n",
2320       "function updateCamera() {\n",
2321       "    var width = three.clientWidth;\n",
2322       "    var height = three.clientHeight;\n",
2323       "    var aspect = width / height;\n",
2324       "    if (camera.type == \"OrthographicCamera\") {\n",
2325       "        camera.left = frustumSize * aspect / - 2;\n",
2326       "        camera.right = frustumSize * aspect / 2;\n",
2327       "        camera.top = frustumSize / 2;\n",
2328       "        camera.bottom = - frustumSize / 2;\n",
2329       "    } else if (camera.type == \"PerspectiveCamera\") {\n",
2330       "        camera.aspect = aspect;\n",
2331       "    }\n",
2332       "    camera.updateProjectionMatrix();\n",
2333       "}\n",
2334       "\n",
2335       "function changeCamera(event) {\n",
2336       "    var selindex = event.currentTarget.selectedIndex;\n",
2337       "    camera = cameras[selindex];\n",
2338       "    control = controls[selindex];\n",
2339       "    control.enabled = true; \n",
2340       "    for (var i=0; i<controls.length; i++) {\n",
2341       "        if (i!=selindex) {\n",
2342       "            controls[i].enabled = false;\n",
2343       "        }\n",
2344       "    }\n",
2345       "    updateCamera();\n",
2346       "}\n",
2347       "\n",
2348       "var camtypenode = document.getElementById('cameraType_1');\n",
2349       "camtypenode.onchange = changeCamera;\n",
2350       "camtypenode.dispatchEvent(new Event('change'));\n",
2351       "\n",
2352       "onWindowResize();\n",
2353       "window.addEventListener('resize', onWindowResize);\t\n",
2354       "\n",
2355       "\n",
2356       "var xRotationEnabled = false;\n",
2357       "var yRotationEnabled = false;\n",
2358       "var zRotationEnabled = false;\n",
2359       "var rotationSpeedFactor = 1;\n",
2360       "var settingsShown = false;\n",
2361       "var labelsShown = true;\n",
2362       "var intervals = [];\n",
2363       "var timeouts = [];\n",
2364       "var explodingSpeed = 0.05;\n",
2365       "var explodeScale = 0;\n",
2366       "var XMLS = new XMLSerializer();\n",
2367       "var svgElement;\n",
2368       "var renderId;\n",
2369       "\n",
2370       "var render = function () {\n",
2371       "\n",
2372       "\trenderId = requestAnimationFrame(render);\n",
2373       "\n",
2374       "//\tcomment in for automatic explosion\n",
2375       "//\texplode(updateFactor());\n",
2376       "\n",
2377       "    var phi = 0.02 * rotationSpeedFactor;\n",
2378       "\n",
2379       "    if (xRotationEnabled) {\n",
2380       "        scene.rotation.x += phi;\n",
2381       "    }\n",
2382       "    if (yRotationEnabled) {\n",
2383       "        scene.rotation.y += phi;\n",
2384       "    }\n",
2385       "    if (zRotationEnabled) {\n",
2386       "        scene.rotation.z += phi;\n",
2387       "    }\n",
2388       "\n",
2389       "    control.update();\n",
2390       "    renderer.render(scene, camera);\n",
2391       "};\n",
2392       "\n",
2393       "if ( THREE.WEBGL.isWebGLAvailable() ) {\n",
2394       "\trender();\n",
2395       "} else {\n",
2396       "\tvar warning = WEBGL.getWebGLErrorMessage();\n",
2397       "\tthree.appendChild( warning );\n",
2398       "}\n",
2399       "    \n",
2400       "function changeTransparency() {\n",
2401       "    var opacity = 1-Number(event.currentTarget.value);\n",
2402       "    for (var i=0; i<scene.children.length; i++) {\n",
2403       "        child = scene.children[i];\n",
2404       "        if ( child.userData.hasOwnProperty(\"facetmaterial\") ) {\n",
2405       "            if (Array.isArray(child.userData.facetmaterial)) {\n",
2406       "                for (var j=0; j<child.userData.facetmaterial.length; j++) {\n",
2407       "                    child.userData.facetmaterial[j].opacity = opacity;\n",
2408       "                }\n",
2409       "            } else {\n",
2410       "                child.userData.facetmaterial.opacity = opacity;\n",
2411       "            }    \n",
2412       "        }\n",
2413       "    }\n",
2414       "}\n",
2415       "\n",
2416       "function changeRotationX(event){\n",
2417       "    xRotationEnabled = event.currentTarget.checked;\n",
2418       "}\t\n",
2419       "\n",
2420       "function changeRotationY(event){\n",
2421       "    yRotationEnabled = event.currentTarget.checked;\n",
2422       "}\t\n",
2423       "\n",
2424       "function changeRotationZ(event){\n",
2425       "    zRotationEnabled = event.currentTarget.checked;\n",
2426       "}\t\n",
2427       "\n",
2428       "\n",
2429       "function changeRotationSpeedFactor(event){\n",
2430       "    rotationSpeedFactor = Number(event.currentTarget.value);\n",
2431       "}\n",
2432       "\n",
2433       "function resetScene(){\n",
2434       "    scene.rotation.set(0,0,0);\n",
2435       "    camera.position.set(0,0,5);\n",
2436       "    camera.up.set(0,1,0);\n",
2437       "}\n",
2438       "\n",
2439       "function showSettings(event){\n",
2440       "    document.getElementById('settings_1').style.visibility = 'visible';\n",
2441       "    document.getElementById('showSettingsButton_1').style.visibility = 'hidden';\n",
2442       "    document.getElementById('hideSettingsButton_1').style.visibility = 'visible';\n",
2443       "    settingsShown = true;\n",
2444       "}\n",
2445       "\n",
2446       "function hideSettings(event){\n",
2447       "    document.getElementById('settings_1').style.visibility = 'hidden';\n",
2448       "    document.getElementById('showSettingsButton_1').style.visibility = 'visible';\n",
2449       "    document.getElementById('hideSettingsButton_1').style.visibility = 'hidden';\n",
2450       "    settingsShown = false;\n",
2451       "}\n",
2452       "\n",
2453       "\n",
2454       "\n",
2455       "var pos = 150* Math.PI;\n",
2456       "\n",
2457       "function updateFactor() {\n",
2458       "    pos++;\n",
2459       "    return Math.sin(.01*pos)+1;\n",
2460       "}\n",
2461       "\n",
2462       "// ------------------------ FOLDING ------------------------------------------------\n",
2463       "// ---------------------------------------------------------------------------------\n",
2464       "// rotate point p around axis defined by points p1 and p2 by given angle\n",
2465       "function rotate(p, p1, p2, angle ){   \n",
2466       "    angle = -angle;\n",
2467       "    var x = p.x, y = p.y, z = p.z, \n",
2468       "    a = p1.x, b = p1.y, c = p1.z, \n",
2469       "    u = p2.x-p1.x, v = p2.y-p1.y, w = p2.z-p1.z;\n",
2470       "    var result = [];\n",
2471       "    var L = u*u + v*v + w*w;\n",
2472       "    var sqrt = Math.sqrt;\n",
2473       "    var cos = Math.cos;\n",
2474       "    var sin = Math.sin;\n",
2475       "\n",
2476       "    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",
2477       "    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",
2478       "    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",
2479       "\n",
2480       "    return result;\n",
2481       "}\n",
2482       "\n",
2483       "var fold = function(event){\n",
2484       "    var obj = foldables[Number(event.currentTarget.name)];\n",
2485       "    var foldvalue = Number(event.currentTarget.value);\n",
2486       "    var scale = foldvalue - obj.userData.oldscale;\n",
2487       "\n",
2488       "    for (var j=0; j<obj.userData.axes.length; j++) {\n",
2489       "        rotateVertices(obj, j, scale);\n",
2490       "    }\n",
2491       "    update(obj);\n",
2492       "    obj.userData.oldscale += scale;\n",
2493       "    lookAtBarycenter(obj);\n",
2494       "}\n",
2495       "\n",
2496       "function lookAtBarycenter(obj){\n",
2497       "    control.target = barycenter(obj);\n",
2498       "}\n",
2499       "\n",
2500       "function barycenter(obj) {\n",
2501       "    var center = new THREE.Vector3(0,0,0);\n",
2502       "    var points = obj.userData.points;\n",
2503       "    for (var i=0; i<points.length; i++){\n",
2504       "        center.add(points[i].vector);\n",
2505       "    }\n",
2506       "    center.divideScalar(points.length);\n",
2507       "    return center;\n",
2508       "}\n",
2509       "\n",
2510       "function rotateVertices(obj, edge, scale) {\n",
2511       "    var axes = obj.userData.axes;\n",
2512       "    var subtrees = obj.userData.subtrees;\n",
2513       "    var points = obj.userData.points;\n",
2514       "    var angles = obj.userData.angles;\n",
2515       "    if (edge < axes.length){\n",
2516       "        for (var j=0; j<subtrees[edge].length; j++){\n",
2517       "            var rotP = rotate(points[subtrees[edge][j]].vector, points[axes[edge][0]].vector,points[axes[edge][1]].vector, scale * (Math.PI - angles[edge]));\n",
2518       "            points[subtrees[edge][j]].set(rotP[0],rotP[1],rotP[2]);\n",
2519       "        }\n",
2520       "    }\n",
2521       "}\n",
2522       "\n",
2523       "function update(obj) {\n",
2524       "   updateFacesPosition(obj);\n",
2525       "   updateEdgesPosition(obj);\n",
2526       "}\n",
2527       "\n",
2528       "if (foldables.length) {\n",
2529       "    var settings = document.getElementById('settings_1');\n",
2530       "    var foldDiv = document.createElement('div');\n",
2531       "    foldDiv.id = 'fold_1';\n",
2532       "    var title = document.createElement('strong');\n",
2533       "    title.innerHTML = 'Fold';\n",
2534       "    foldDiv.appendChild(title);\n",
2535       "    foldDiv.className = 'group';\n",
2536       "    for (var i=0; i<foldables.length; i++) {\n",
2537       "        var range = document.createElement('input');\n",
2538       "        range.type = 'range';\n",
2539       "        range.min = 0;\n",
2540       "        range.max = 1;\n",
2541       "        range.value = 0;\n",
2542       "        range.step = 0.001;\n",
2543       "        range.name = String(i);\n",
2544       "        range.oninput = fold;\n",
2545       "        foldDiv.appendChild(range);\n",
2546       "    }\n",
2547       "    lookAtBarycenter(foldables[0]);\n",
2548       "    settings.insertBefore(foldDiv,settings.childNodes[0]);\n",
2549       "}\n",
2550       "\n",
2551       "    \n",
2552       "// ---------------------- EXPLOSION ------------------------------------------------\n",
2553       "// ---------------------------------------------------------------------------------\n",
2554       "\n",
2555       "if (explodableModel) {\n",
2556       "    for (var i=0; i<scene.children.length; i++) {\n",
2557       "        obj = scene.children[i];\n",
2558       "        if ( obj.userData.explodable ) {\n",
2559       "            computeCentroid(obj);\n",
2560       "        }\n",
2561       "    }\n",
2562       "    document.getElementById('explodeRange_1').oninput = triggerExplode;\n",
2563       "    document.getElementById('explodeCheckbox_1').onchange = triggerAutomaticExplode;\n",
2564       "    document.getElementById('explodingSpeedRange_1').oninput = setExplodingSpeed;\n",
2565       "}\n",
2566       "\n",
2567       "function computeCentroid(obj) {\n",
2568       "    centroid = new THREE.Vector3();\n",
2569       "    obj.userData.points.forEach(function(pmpoint) {\n",
2570       "        centroid.add(pmpoint.vector);\t\t\t\n",
2571       "    });\n",
2572       "    centroid.divideScalar(obj.userData.points.length);\n",
2573       "    obj.userData.centroid = centroid;\n",
2574       "}\n",
2575       "\n",
2576       "function explode(factor) {\n",
2577       "    for (var i=0; i<scene.children.length; i++) {\n",
2578       "        var obj = scene.children[i];\n",
2579       "        if (obj.userData.hasOwnProperty(\"centroid\")) { \n",
2580       "            var c = obj.userData.centroid;\n",
2581       "            obj.position.set(c.x*factor, c.y*factor, c.z*factor);\n",
2582       "        }\n",
2583       "    }\t\n",
2584       "}\n",
2585       "\n",
2586       "function triggerExplode(event){\n",
2587       "    explodeScale = Number(event.currentTarget.value);\n",
2588       "    explode(explodeScale);\n",
2589       "}\n",
2590       "\n",
2591       "function setExplodingSpeed(event){\n",
2592       "    explodingSpeed = Number(event.currentTarget.value);\n",
2593       "}\n",
2594       "\n",
2595       "function triggerAutomaticExplode(event){\n",
2596       "    if (event.currentTarget.checked){\n",
2597       "        startExploding();\n",
2598       "    } else {\n",
2599       "        clearIntervals();\n",
2600       "    }\t\n",
2601       "}\n",
2602       "\n",
2603       "function startExploding(){\n",
2604       "    intervals.push(setInterval(explodingInterval, 25));\n",
2605       "}\n",
2606       "\n",
2607       "\n",
2608       "function explodingInterval(){\n",
2609       "    explodeScale += explodingSpeed;\n",
2610       "    if (explodeScale <= 6){ \n",
2611       "        explode(explodeScale);\n",
2612       "    }\n",
2613       "    else{\n",
2614       "        explode(6);\n",
2615       "        explodeScale = 6;\n",
2616       "        clearIntervals();\n",
2617       "        timeouts.push(setTimeout(startUnexploding, 3000));\n",
2618       "    }\n",
2619       "    document.getElementById('explodeRange_1').value = explodeScale;\n",
2620       "}\n",
2621       "\n",
2622       "\n",
2623       "function startUnexploding(){\n",
2624       "    intervals.push(setInterval(unexplodingInterval, 25));\n",
2625       "}\n",
2626       "\n",
2627       "function unexplodingInterval(){\n",
2628       "    explodeScale -= explodingSpeed;\n",
2629       "    if (explodeScale >= 0){\t\n",
2630       "        explode(explodeScale);\n",
2631       "    }\n",
2632       "    else {\n",
2633       "        explode(0);\n",
2634       "        explodeScale = 0;\n",
2635       "        clearIntervals();\n",
2636       "        timeouts.push(setTimeout(startExploding, 3000));\n",
2637       "    }\n",
2638       "    document.getElementById('explodeRange_1').value = explodeScale;\n",
2639       "}\n",
2640       "\n",
2641       "function clearIntervals(){\n",
2642       "    intervals.forEach(function(interval){\n",
2643       "        clearInterval(interval);\n",
2644       "    });\n",
2645       "    intervals = [];\n",
2646       "    timeouts.forEach(function(timeout){\n",
2647       "        clearTimeout(timeout);\n",
2648       "    });\n",
2649       "    timeouts = [];\n",
2650       "}\n",
2651       "\n",
2652       "// ---------------------- DISPLAY --------------------------------------------------\n",
2653       "// ---------------------------------------------------------------------------------\n",
2654       "\n",
2655       "const objectTypeInnerHTMLs = { points: \"Points\", pointlabels: \"Point labels\", lines: \"Edges\", edgelabels: \"Edge labels\", faces: \"Faces\", arrowheads: \"Arrow heads\" };\n",
2656       "const objectTypeVisible = {};\n",
2657       "Object.assign(objectTypeVisible,modelContains);\n",
2658       "const sortedObjectTypeKeys = Object.keys(objectTypeInnerHTMLs).sort();\n",
2659       "const shownObjectTypesList = document.getElementById('shownObjectTypesList_1');\n",
2660       "\n",
2661       "function setVisibility(bool,objname) {\n",
2662       "    for (var i=0; i<scene.children.length; i++){\n",
2663       "        var obj = scene.children[i].getObjectByName(objname);\n",
2664       "        if (obj) {\n",
2665       "            obj.visible = bool;\n",
2666       "        }\n",
2667       "    }\n",
2668       "}\n",
2669       "\n",
2670       "function toggleObjectTypeVisibility(event){\n",
2671       "    var name = event.currentTarget.name;\n",
2672       "    var checked = event.currentTarget.checked;\n",
2673       "    objectTypeVisible[name] = checked;\n",
2674       "    setVisibility(checked,name);\n",
2675       "}\n",
2676       "\n",
2677       "for (var i=0; i<sortedObjectTypeKeys.length; i++){\n",
2678       "    var key = sortedObjectTypeKeys[i];\n",
2679       "    if (modelContains[key]) {\n",
2680       "        var objTypeNode = document.createElement('span');\n",
2681       "        objTypeNode.innerHTML = objectTypeInnerHTMLs[key] + '<br>';\n",
2682       "        var checkbox = document.createElement('input');\n",
2683       "        checkbox.type = 'checkbox';\n",
2684       "        checkbox.checked = true;\n",
2685       "        checkbox.name = key;\n",
2686       "        checkbox.onchange = toggleObjectTypeVisibility;\n",
2687       "        shownObjectTypesList.appendChild(checkbox);\n",
2688       "        shownObjectTypesList.appendChild(objTypeNode);\n",
2689       "    }\n",
2690       "}\n",
2691       "\n",
2692       "// ------------------------------------------------------\n",
2693       "\n",
2694       "function toggleObjectVisibility(event){\n",
2695       "    var nr = Number(event.currentTarget.name);\n",
2696       "    scene.children[nr].visible = event.currentTarget.checked;\n",
2697       "}\n",
2698       "\n",
2699       "// append checkboxes for displaying or hiding objects\n",
2700       "var shownObjectsList = document.getElementById('shownObjectsList_1');\n",
2701       "for (var i=0; i<scene.children.length; i++){\n",
2702       "    obj = scene.children[i];\n",
2703       "    var objNode = document.createElement('span');\n",
2704       "    objNode.innerHTML = obj.name + '<br>';\n",
2705       "    var checkbox = document.createElement('input');\n",
2706       "    checkbox.type = 'checkbox';\n",
2707       "    checkbox.checked = true;\n",
2708       "    checkbox.name = String(i);\n",
2709       "    checkbox.onchange = toggleObjectVisibility;\n",
2710       "    shownObjectsList.appendChild(checkbox);\n",
2711       "    shownObjectsList.appendChild(objNode);\n",
2712       "}\n",
2713       "\n",
2714       "// ---------------------- SVG ------------------------------------------------------\n",
2715       "// ---------------------------------------------------------------------------------\n",
2716       "\n",
2717       "function takeSvgScreenshot() {\n",
2718       "    if (objectTypeVisible[\"pointlabels\"]) {\n",
2719       "        setVisibility(false,\"pointlabels\");\n",
2720       "    }\n",
2721       "    if (objectTypeVisible[\"edgelabels\"]) {\n",
2722       "        setVisibility(false,\"edgelabels\");\n",
2723       "    }\n",
2724       "    svgRenderer.render(scene,camera);\n",
2725       "    svgElement = XMLS.serializeToString(svgRenderer.domElement);\n",
2726       "    \n",
2727       "    if (objectTypeVisible[\"pointlabels\"]) {\n",
2728       "        setVisibility(true,\"pointlabels\");\n",
2729       "    }\n",
2730       "    if (objectTypeVisible[\"edgelabels\"]) {\n",
2731       "        setVisibility(true,\"edgelabels\");\n",
2732       "    }\n",
2733       "\n",
2734       "    if (document.getElementById('tab_1').checked){\n",
2735       "        //show in new tab\n",
2736       "        var myWindow = window.open(\"\",\"\");\n",
2737       "        myWindow.document.body.innerHTML = svgElement;\n",
2738       "    } else{\n",
2739       "        // download svg file \n",
2740       "        download(\"screenshot.svg\", svgElement);\n",
2741       "    }\n",
2742       "}\n",
2743       "\n",
2744       "function download(filename, text) {\n",
2745       "    var element = document.createElement('a');\n",
2746       "    element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));\n",
2747       "    element.setAttribute('download', filename);\n",
2748       "\n",
2749       "    element.style.display = 'none';\n",
2750       "    document.body.appendChild(element);\n",
2751       "\n",
2752       "    element.click();\n",
2753       "\n",
2754       "    document.body.removeChild(element);\n",
2755       "}\n",
2756       "\n",
2757       "\n",
2758       "document.getElementById('transparencyRange_1').oninput = changeTransparency;\n",
2759       "document.getElementById('changeRotationX_1').onchange = changeRotationX;\n",
2760       "document.getElementById('changeRotationY_1').onchange = changeRotationY;\n",
2761       "document.getElementById('changeRotationZ_1').onchange = changeRotationZ;\n",
2762       "document.getElementById('resetButton_1').onclick = resetScene;\n",
2763       "document.getElementById('rotationSpeedRange_1').oninput = changeRotationSpeedFactor;\n",
2764       "document.getElementById('takeScreenshot_1').onclick = takeSvgScreenshot;\n",
2765       "document.getElementById('showSettingsButton_1').onclick = showSettings;\n",
2766       "document.getElementById('hideSettingsButton_1').onclick = hideSettings;\n",
2767       "\n",
2768       "\n",
2769       "// ------------------ SHORTCUTS --------------------------------------------\n",
2770       "// -------------------------------------------------------------------------\n",
2771       "\n",
2772       "/**\n",
2773       " * http://www.openjs.com/scripts/events/keyboard_shortcuts/\n",
2774       " * Version : 2.01.B\n",
2775       " * By Binny V A\n",
2776       " * License : BSD\n",
2777       " */\n",
2778       "shortcut = {\n",
2779       "\t'all_shortcuts':{},//All the shortcuts are stored in this array\n",
2780       "\t'add': function(shortcut_combination,callback,opt) {\n",
2781       "\t\t//Provide a set of default options\n",
2782       "\t\tvar default_options = {\n",
2783       "\t\t\t'type':'keydown',\n",
2784       "\t\t\t'propagate':false,\n",
2785       "\t\t\t'disable_in_input':false,\n",
2786       "\t\t\t'target':document,\n",
2787       "\t\t\t'keycode':false\n",
2788       "\t\t}\n",
2789       "\t\tif(!opt) opt = default_options;\n",
2790       "\t\telse {\n",
2791       "\t\t\tfor(var dfo in default_options) {\n",
2792       "\t\t\t\tif(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo];\n",
2793       "\t\t\t}\n",
2794       "\t\t}\n",
2795       "\n",
2796       "\t\tvar ele = opt.target;\n",
2797       "\t\tif(typeof opt.target == 'string') ele = document.getElementById(opt.target);\n",
2798       "\t\tvar ths = this;\n",
2799       "\t\tshortcut_combination = shortcut_combination.toLowerCase();\n",
2800       "\n",
2801       "\t\t//The function to be called at keypress\n",
2802       "\t\tvar func = function(e) {\n",
2803       "\t\t\te = e || window.event;\n",
2804       "\t\t\t\n",
2805       "\t\t\tif(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields\n",
2806       "\t\t\t\tvar element;\n",
2807       "\t\t\t\tif(e.target) element=e.target;\n",
2808       "\t\t\t\telse if(e.srcElement) element=e.srcElement;\n",
2809       "\t\t\t\tif(element.nodeType==3) element=element.parentNode;\n",
2810       "\n",
2811       "\t\t\t\tif(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return;\n",
2812       "\t\t\t}\n",
2813       "\t\n",
2814       "\t\t\t//Find Which key is pressed\n",
2815       "\t\t\tif (e.keyCode) code = e.keyCode;\n",
2816       "\t\t\telse if (e.which) code = e.which;\n",
2817       "\t\t\tvar character = String.fromCharCode(code).toLowerCase();\n",
2818       "\t\t\t\n",
2819       "\t\t\tif(code == 188) character=\",\"; //If the user presses , when the type is onkeydown\n",
2820       "\t\t\tif(code == 190) character=\".\"; //If the user presses , when the type is onkeydown\n",
2821       "\n",
2822       "\t\t\tvar keys = shortcut_combination.split(\"+\");\n",
2823       "\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",
2824       "\t\t\tvar kp = 0;\n",
2825       "\t\t\t\n",
2826       "\t\t\t//Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken\n",
2827       "\t\t\tvar shift_nums = {\n",
2828       "\t\t\t\t\"`\":\"~\",\n",
2829       "\t\t\t\t\"1\":\"!\",\n",
2830       "\t\t\t\t\"2\":\"@\",\n",
2831       "\t\t\t\t\"3\":\"#\",\n",
2832       "\t\t\t\t\"4\":\"$\",\n",
2833       "\t\t\t\t\"5\":\"%\",\n",
2834       "\t\t\t\t\"6\":\"^\",\n",
2835       "\t\t\t\t\"7\":\"&\",\n",
2836       "\t\t\t\t\"8\":\"*\",\n",
2837       "\t\t\t\t\"9\":\"(\",\n",
2838       "\t\t\t\t\"0\":\")\",\n",
2839       "\t\t\t\t\"-\":\"_\",\n",
2840       "\t\t\t\t\"=\":\"+\",\n",
2841       "\t\t\t\t\";\":\":\",\n",
2842       "\t\t\t\t\"'\":\"\\\"\",\n",
2843       "\t\t\t\t\",\":\"<\",\n",
2844       "\t\t\t\t\".\":\">\",\n",
2845       "\t\t\t\t\"/\":\"?\",\n",
2846       "\t\t\t\t\"\\\\\":\"|\"\n",
2847       "\t\t\t}\n",
2848       "\t\t\t//Special Keys - and their codes\n",
2849       "\t\t\tvar special_keys = {\n",
2850       "\t\t\t\t'esc':27,\n",
2851       "\t\t\t\t'escape':27,\n",
2852       "\t\t\t\t'tab':9,\n",
2853       "\t\t\t\t'space':32,\n",
2854       "\t\t\t\t'return':13,\n",
2855       "\t\t\t\t'enter':13,\n",
2856       "\t\t\t\t'backspace':8,\n",
2857       "\t\n",
2858       "\t\t\t\t'scrolllock':145,\n",
2859       "\t\t\t\t'scroll_lock':145,\n",
2860       "\t\t\t\t'scroll':145,\n",
2861       "\t\t\t\t'capslock':20,\n",
2862       "\t\t\t\t'caps_lock':20,\n",
2863       "\t\t\t\t'caps':20,\n",
2864       "\t\t\t\t'numlock':144,\n",
2865       "\t\t\t\t'num_lock':144,\n",
2866       "\t\t\t\t'num':144,\n",
2867       "\t\t\t\t\n",
2868       "\t\t\t\t'pause':19,\n",
2869       "\t\t\t\t'break':19,\n",
2870       "\t\t\t\t\n",
2871       "\t\t\t\t'insert':45,\n",
2872       "\t\t\t\t'home':36,\n",
2873       "\t\t\t\t'delete':46,\n",
2874       "\t\t\t\t'end':35,\n",
2875       "\t\t\t\t\n",
2876       "\t\t\t\t'pageup':33,\n",
2877       "\t\t\t\t'page_up':33,\n",
2878       "\t\t\t\t'pu':33,\n",
2879       "\t\n",
2880       "\t\t\t\t'pagedown':34,\n",
2881       "\t\t\t\t'page_down':34,\n",
2882       "\t\t\t\t'pd':34,\n",
2883       "\t\n",
2884       "\t\t\t\t'left':37,\n",
2885       "\t\t\t\t'up':38,\n",
2886       "\t\t\t\t'right':39,\n",
2887       "\t\t\t\t'down':40,\n",
2888       "\t\n",
2889       "\t\t\t\t'f1':112,\n",
2890       "\t\t\t\t'f2':113,\n",
2891       "\t\t\t\t'f3':114,\n",
2892       "\t\t\t\t'f4':115,\n",
2893       "\t\t\t\t'f5':116,\n",
2894       "\t\t\t\t'f6':117,\n",
2895       "\t\t\t\t'f7':118,\n",
2896       "\t\t\t\t'f8':119,\n",
2897       "\t\t\t\t'f9':120,\n",
2898       "\t\t\t\t'f10':121,\n",
2899       "\t\t\t\t'f11':122,\n",
2900       "\t\t\t\t'f12':123\n",
2901       "\t\t\t}\n",
2902       "\t\n",
2903       "\t\t\tvar modifiers = { \n",
2904       "\t\t\t\tshift: { wanted:false, pressed:false},\n",
2905       "\t\t\t\tctrl : { wanted:false, pressed:false},\n",
2906       "\t\t\t\talt  : { wanted:false, pressed:false},\n",
2907       "\t\t\t\tmeta : { wanted:false, pressed:false}\t//Meta is Mac specific\n",
2908       "\t\t\t};\n",
2909       "                        \n",
2910       "\t\t\tif(e.ctrlKey)\tmodifiers.ctrl.pressed = true;\n",
2911       "\t\t\tif(e.shiftKey)\tmodifiers.shift.pressed = true;\n",
2912       "\t\t\tif(e.altKey)\tmodifiers.alt.pressed = true;\n",
2913       "\t\t\tif(e.metaKey)   modifiers.meta.pressed = true;\n",
2914       "                        \n",
2915       "\t\t\tfor(var i=0; k=keys[i],i<keys.length; i++) {\n",
2916       "\t\t\t\t//Modifiers\n",
2917       "\t\t\t\tif(k == 'ctrl' || k == 'control') {\n",
2918       "\t\t\t\t\tkp++;\n",
2919       "\t\t\t\t\tmodifiers.ctrl.wanted = true;\n",
2920       "\n",
2921       "\t\t\t\t} else if(k == 'shift') {\n",
2922       "\t\t\t\t\tkp++;\n",
2923       "\t\t\t\t\tmodifiers.shift.wanted = true;\n",
2924       "\n",
2925       "\t\t\t\t} else if(k == 'alt') {\n",
2926       "\t\t\t\t\tkp++;\n",
2927       "\t\t\t\t\tmodifiers.alt.wanted = true;\n",
2928       "\t\t\t\t} else if(k == 'meta') {\n",
2929       "\t\t\t\t\tkp++;\n",
2930       "\t\t\t\t\tmodifiers.meta.wanted = true;\n",
2931       "\t\t\t\t} else if(k.length > 1) { //If it is a special key\n",
2932       "\t\t\t\t\tif(special_keys[k] == code) kp++;\n",
2933       "\t\t\t\t\t\n",
2934       "\t\t\t\t} else if(opt['keycode']) {\n",
2935       "\t\t\t\t\tif(opt['keycode'] == code) kp++;\n",
2936       "\n",
2937       "\t\t\t\t} else { //The special keys did not match\n",
2938       "\t\t\t\t\tif(character == k) kp++;\n",
2939       "\t\t\t\t\telse {\n",
2940       "\t\t\t\t\t\tif(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase\n",
2941       "\t\t\t\t\t\t\tcharacter = shift_nums[character]; \n",
2942       "\t\t\t\t\t\t\tif(character == k) kp++;\n",
2943       "\t\t\t\t\t\t}\n",
2944       "\t\t\t\t\t}\n",
2945       "\t\t\t\t}\n",
2946       "\t\t\t}\n",
2947       "\t\t\t\n",
2948       "\t\t\tif(kp == keys.length && \n",
2949       "\t\t\t\t\t\tmodifiers.ctrl.pressed == modifiers.ctrl.wanted &&\n",
2950       "\t\t\t\t\t\tmodifiers.shift.pressed == modifiers.shift.wanted &&\n",
2951       "\t\t\t\t\t\tmodifiers.alt.pressed == modifiers.alt.wanted &&\n",
2952       "\t\t\t\t\t\tmodifiers.meta.pressed == modifiers.meta.wanted) {\n",
2953       "\t\t\t\tcallback(e);\n",
2954       "\t\n",
2955       "\t\t\t\tif(!opt['propagate']) { //Stop the event\n",
2956       "\t\t\t\t\t//e.cancelBubble is supported by IE - this will kill the bubbling process.\n",
2957       "\t\t\t\t\te.cancelBubble = true;\n",
2958       "\t\t\t\t\te.returnValue = false;\n",
2959       "\t\n",
2960       "\t\t\t\t\t//e.stopPropagation works in Firefox.\n",
2961       "\t\t\t\t\tif (e.stopPropagation) {\n",
2962       "\t\t\t\t\t\te.stopPropagation();\n",
2963       "\t\t\t\t\t\te.preventDefault();\n",
2964       "\t\t\t\t\t}\n",
2965       "\t\t\t\t\treturn false;\n",
2966       "\t\t\t\t}\n",
2967       "\t\t\t}\n",
2968       "\t\t}\n",
2969       "\t\tthis.all_shortcuts[shortcut_combination] = {\n",
2970       "\t\t\t'callback':func, \n",
2971       "\t\t\t'target':ele, \n",
2972       "\t\t\t'event': opt['type']\n",
2973       "\t\t};\n",
2974       "\t\t//Attach the function with the event\n",
2975       "\t\tif(ele.addEventListener) ele.addEventListener(opt['type'], func, false);\n",
2976       "\t\telse if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func);\n",
2977       "\t\telse ele['on'+opt['type']] = func;\n",
2978       "\t},\n",
2979       "\n",
2980       "\t//Remove the shortcut - just specify the shortcut and I will remove the binding\n",
2981       "\t'remove':function(shortcut_combination) {\n",
2982       "\t\tshortcut_combination = shortcut_combination.toLowerCase();\n",
2983       "\t\tvar binding = this.all_shortcuts[shortcut_combination];\n",
2984       "\t\tdelete(this.all_shortcuts[shortcut_combination])\n",
2985       "\t\tif(!binding) return;\n",
2986       "\t\tvar type = binding['event'];\n",
2987       "\t\tvar ele = binding['target'];\n",
2988       "\t\tvar callback = binding['callback'];\n",
2989       "\n",
2990       "\t\tif(ele.detachEvent) ele.detachEvent('on'+type, callback);\n",
2991       "\t\telse if(ele.removeEventListener) ele.removeEventListener(type, callback, false);\n",
2992       "\t\telse ele['on'+type] = false;\n",
2993       "\t}\n",
2994       "}\n",
2995       "\n",
2996       "shortcut.add(\"Alt+Left\",function() {\n",
2997       "\tvar event = new Event('click');\n",
2998       "\tif (settingsShown){\n",
2999       "\t\tdocument.getElementById('hideSettingsButton_1').dispatchEvent(event);\n",
3000       "\t} else {\n",
3001       "\t\tdocument.getElementById('showSettingsButton_1').dispatchEvent(event);\n",
3002       "\t}\n",
3003       "});\n",
3004       "\n",
3005       "\n",
3006       "// COMMON_CODE_BLOCK_END\n",
3007       "\n",
3008       "});});\n",
3009       "      </script>\n",
3010       "   </body>\n",
3011       "</html>"
3012      ]
3013     },
3014     "metadata": {},
3015     "output_type": "display_data"
3016    },
3017    {
3018     "data": {
3019      "text/html": [
3020       "<details><summary><pre style=\"display:inline\"><small>Click here for additional output</small></pre></summary>\n",
3021       "<pre>\n",
3022       "polymake: used package threejs\n",
3023       "   Three.js is a lightweight cross-browser JavaScript library/API used to create and display animated 3D computer graphics on a Web browser.\n",
3024       "   See http://github.com/mrdoob for the source code.\n",
3025       "\n",
3026       "polymake: used package cdd\n",
3027       "  cddlib\n",
3028       "  Implementation of the double description method of Motzkin et al.\n",
3029       "  Copyright by Komei Fukuda.\n",
3030       "  http://www-oldurls.inf.ethz.ch/personal/fukudak/cdd_home/\n",
3031       "\n",
3032       "</pre>\n",
3033       "</details>\n"
3034      ]
3035     },
3036     "metadata": {},
3037     "output_type": "display_data"
3038    }
3039   ],
3040   "source": [
3041    "# two threejs outputs\n",
3042    "cube(3)->VISUAL;\n",
3043    "simplex(3)->VISUAL;"
3044   ]
3045  },
3046  {
3047   "cell_type": "markdown",
3048   "metadata": {},
3049   "source": [
3050    "### Markdown\n",
3051    "\n",
3052    "For testing and comparing.\n",
3053    "\n",
3054    "#### sub sup del and s\n",
3055    "\n",
3056    "<sub>subscript</sub>\n",
3057    "<sup>supscript</sup>\n",
3058    "<del>deleted</del>\n",
3059    "<s>deleted</s>\n",
3060    "\n",
3061    "These tags are explicitly processed while conversion.\n",
3062    "\n",
3063    "\n",
3064    "\n",
3065    "\n",
3066    "\n",
3067    "\n",
3068    "\n",
3069    "\n",
3070    "\n",
3071    "\n",
3072    "#### Emphasis\n",
3073    "\n",
3074    "*This text will be italic*\n",
3075    "_This will also be italic_\n",
3076    "\n",
3077    "**This text will be bold**\n",
3078    "__This will also be bold__\n",
3079    "\n",
3080    "_You **can** combine them_\n",
3081    "\n",
3082    "#### Lists\n",
3083    "\n",
3084    "##### Unordered\n",
3085    "\n",
3086    "* Item 1\n",
3087    "* Item 2\n",
3088    "  * Item 2a\n",
3089    "  * Item 2b\n",
3090    "\n",
3091    "##### Ordered\n",
3092    "\n",
3093    "1. Item 1\n",
3094    "1. Item 2\n",
3095    "1. Item 3\n",
3096    "   1. Item 3a\n",
3097    "   1. Item 3b\n",
3098    "\n",
3099    "##### Task Lists\n",
3100    "\n",
3101    "- [x] @mentions, #refs, [links](), **formatting**, and <del>tags</del> supported\n",
3102    "- [x] list syntax required (any unordered or ordered list supported)\n",
3103    "- [x] this is a complete item\n",
3104    "- [ ] this is an incomplete item\n",
3105    "\n",
3106    "##### Tables\n",
3107    "\n",
3108    "You can create tables by assembling a list of words and dividing them with hyphens - (for the first row), and then separating each column with a pipe |:\n",
3109    "\n",
3110    "First Header | Second Header\n",
3111    "------------ | -------------\n",
3112    "Content from cell 1 | Content from cell 2\n",
3113    "Content in the first column | Content in the second column\n",
3114    "\n",
3115    "\n",
3116    "##### Strikethrough\n",
3117    "\n",
3118    "Any word wrapped with two tildes (like ~~this~~) will appear crossed out."
3119   ]
3120  },
3121  {
3122   "cell_type": "code",
3123   "execution_count": null,
3124   "metadata": {},
3125   "outputs": [],
3126   "source": []
3127  }
3128 ],
3129 "metadata": {
3130  "kernelspec": {
3131   "display_name": "polymake",
3132   "language": "polymake",
3133   "name": "polymake"
3134  },
3135  "language_info": {
3136   "codemirror_mode": "perl",
3137   "file_extension": ".pl",
3138   "mimetype": "text/x-polymake",
3139   "name": "polymake"
3140  }
3141 },
3142 "nbformat": 4,
3143 "nbformat_minor": 2
3144}
3145