Introduction: Geometron "Hello, World"

Picture of Geometron "Hello, World"

Geometron is a purely geometry-based language for interacting with machines. The commands are geometric figures described by a series of geometric actions. I will be documenting the full language in The Book of Geometron, which is a work in progress, but I'm publishing this tutorial so that it's possible to just get a taste and get the thing basically working. This tutorial has one goal only: minimum functionality. Following the traditions of computer languages, I'm using the phrase "hello, world", although as a purely geometric language the output, like the code, is all shapes.

If this project works, there will be a way to control computers without using math and English based code, but purely geometric symbols, which can be learned and used without reference to specific human or machine languages.

To do this tutorial you need a text editor, but you can use the one that came free with your computer, which will be TextEdit.app on the mac and notepad on the PC. Of course if you use something designed for code that's great too, or vi or EMACS or whatever, but you won't need any of that--just the ability to paste text into a file and save it, without editing it at all.

Step 1: Get Your Local Copy of the Geometron Hypercube Editor

Picture of Get Your Local Copy of the Geometron Hypercube Editor

Copy and paste the following into a text editor(make sure you get all of it) and save it as editor.html. This html file is the entire Geometron language, and by saving this you have a local copy of the whole thing which will run inside your browser(it should work on all browsers and all operating systems). You can tell that you got the whole thing if it ends with "". Scroll down in your text editor and make sure that's true.

<!DOCTYPE HTML>
<html>
<head>
<title>Geometron Hypercube Editor</title>
<script id = "bytecodeScript">
/*
040:0333
041:0333,0336,0336,0332,0332,0332,0330,0336,0331,0336,0341,0330,0330,0330,0337,0337,0337,0342,0336,0336,0336,0331,0331,0331,0331,0331,0337,0337,0333,0337,0337
042:0333,0330,0336,0332,0336,0332,0331,0342,0333,0342,0333,0330,0337,0337,0331
043:0333,0336,0336,0332,0332,0332,0333,0336,0332,0337,0337,0337,0342,0336,0336,0333,0337,0337,0342,0336,0336,0332,0332,0336,0332,0330,0330,0330,0335,0337,0337,0337,0342,0336,0336,0336,0332,0332,0337,0337,0337,0342,0336,0336,0336,0332,0332,0332,0337,0337,0337,0330,0334,0331
044:0333,0336,0330,0332,0336,0330,0350,0335,0335,0334,0350,0343,0334,0334,0343,0334,0334,0343,0334,0334,0343,0334,0334,0343,0334,0334,0330,0330,0343,0335,0335,0343,0335,0335,0334,0334,0334,0334,0334,0334,0343,0334,0334,0343,0334,0334,0343,0334,0334,0343,0335,0335,0335,0335,0335,0335,0335,0335,0351,0351,0330,0335,0335,0333,0333,0337,0337,0336,0332,0337,0342,0336,0333,0337
045:0333,0336,0332,0332,0350,0335,0337,0310,0337,0342,0336,0313,0334,0351,0336,0336,0330,0330,0330,0333,0341,0331,0331,0331,0333,0333,0330,0341,0333,0331,0337,0337
046:0333,0336,0332,0330,0336,0330,0341,0331,0334,0350,0334,0342,0334,0330,0343,0335,0335,0343,0334,0334,0334,0334,0334,0334,0351,0333,0350,0334,0342,0335,0335,0335,0335,0342,0334,0334,0336,0342,0334,0351,0331,0331,0333,0333,0337,0337,0337
047:0333,0336,0330,0332,0336,0330,0342,0333,0333,0331,0331,0331,0337,0337
050:0333,0336,0330,0334,0331,0331,0337,0337,0350,0350,0350,0343,0350,0334,0334,0343,0335,0335,0335,0335,0335,0343,0334,0334,0334,0351,0351,0351,0351,0336,0330,0335,0336,0332,0331,0337
051:0333,0336,0330,0335,0337,0331,0331,0337,0350,0350,0350,0343,0350,0334,0334,0343,0335,0335,0335,0335,0343,0334,0334,0351,0351,0351,0351,0330,0335,0335,0335,0336,0336,0331,0336,0333,0337,0337
052:0333,0336,0332,0330,0352,0342,0335,0335,0342,0335,0335,0342,0335,0335,0342,0335,0335,0342,0335,0335,0342,0335,0335,0353,0331,0333,0337
053:0333,0336,0330,0332,0336,0342,0335,0342,0335,0342,0335,0342,0335,0331,0331,0333,0333,0337,0337
054:0333,0336,0332,0336,0334,0350,0334,0342,0335,0351,0335,0333,0337,0337
055:0333,0336,0330,0332,0335,0336,0342,0331,0342,0333,0333,0330,0330,0330,0334,0337,0337
056:0333,0336,0332,0336,0336,0341,0333,0333,0333,0337,0337,0337
057:0333,0332,0350,0335,0310,0337,0342,0336,0313,0334,0351,0333
060:0313,0304,0336,0336,0330,0333,0330,0330,0343,0331,0331,0334,0334,0343,0332,0334,0334,0337,0342,0332,0342,0336,0331,0337,0337,0350,0350,0335,0350,0350,0335,0350,0334,0311,0337,0310,0336,0342,0337,0311,0336,0335,0351,0334,0351,0351,0334,0304,0333,0336,0336,0332,0337,0337
061:0304,0313,0335,0336,0342,0336,0330,0334,0337,0337,0342,0330,0334,0350,0334,0336,0336,0310,0337,0342,0336,0313,0335,0351,0335,0337,0331,0331,0333,0336,0336,0332,0337,0337,0337
062:0304,0313,0335,0336,0342,0336,0330,0334,0330,0330,0330,0343,0331,0331,0331,0332,0337,0337,0306,0350,0335,0342,0334,0304,0333,0336,0336,0332,0337,0337
063:0313,0304,0336,0336,0330,0333,0335,0343,0332,0332,0343,0334,0350,0343,0331,0331,0335,0335,0335,0335,0343,0330,0334,0334,0334,0334,0304,0333,0336,0333,0337,0337,0337
064:0333,0336,0332,0337,0342,0336,0330,0334,0342,0330,0335,0350,0335,0342,0334,0351,0331,0337,0336,0333,0336,0333,0337,0337
065:0313,0304,0336,0336,0330,0333,0335,0343,0335,0335,0350,0334,0350,0334,0343,0334,0351,0351,0331,0331,0331,0334,0342,0335,0335,0342,0330,0334,0342,0330,0342,0330,0334,0342,0330,0333,0333,0334,0333,0336,0333,0337,0337,0337
066:0304,0313,0336,0336,0332,0337,0337,0333,0336,0336,0332,0332,0330,0341,0332,0350,0350,0335,0337,0337,0342,0336,0336,0334,0351,0351,0333,0333,0333,0331,0336,0332,0337,0337,0337
067:0336,0332,0336,0336,0333,0337,0337,0337,0333,0336,0332,0350,0350,0335,0337,0342,0330,0334,0334,0334,0334,0334,0336,0342,0351,0351,0335,0350,0350,0335,0337,0331,0334,0351,0351,0336,0333,0337
070:0304,0313,0336,0336,0336,0332,0332,0337,0337,0337,0333,0336,0332,0336,0330,0341,0330,0330,0341,0333,0333,0331,0331,0331,0336,0332,0337,0337,0337
071:0304,0313,0336,0336,0332,0337,0337,0333,0336,0336,0332,0337,0337,0342,0336,0330,0336,0330,0332,0341,0333,0333,0330,0337,0337,0331
072:0333,0336,0332,0330,0336,0336,0336,0341,0331,0331,0331,0331,0331,0331,0331,0341,0333,0333,0333,0333,0331,0337,0337,0337,0337
073:0333,0336,0332,0330,0336,0336,0336,0341,0331,0331,0331,0331,0334,0334,0337,0337,0350,0335,0342,0335,0351,0335,0331,0333,0337,0337
074:0333,0336,0330,0332,0350,0335,0342,0335,0335,0342,0335,0351,0330,0335,0335,0333,0337
075:0333,0336,0336,0332,0330,0334,0337,0342,0336,0333,0337,0342,0336,0332,0332,0335,0333,0337,0337
076:0333,0336,0330,0332,0350,0334,0342,0334,0334,0342,0335,0335,0335,0351,0331,0333,0337,
077:0333,0336,0336,0332,0332,0330,0336,0331,0341,0330,0330,0342,0330,0330,0330,0343,0335,0335,0350,0334,0343,0335,0351,0330,0342,0335,0335,0337,0331,0331,0331,0336,0330,0333,0333,0333,0337,0337,0337
0100:0333,0336,0332,0330,0336,0336,0341,0337,0343,0334,0343,0334,0334,0336,0330,0342,0331,0337,0350,0335,0335,0343,0351,0330,0330,0335,0335,0333,0333,0337,0337
0101:0304,0313,0311,0305,0350,0350,0335,0342,0351,0335,0336,0333,0334,0334,0337,0342,0336,0336,0330,0334,0334,0342,0335,0335,0331,0350,0335,0337,0337,0304,0313,0336,0336,0336,0333,0337,0337,0337
0102:0304,0313,0336,0336,0336,0333,0337,0337,0337,0342,0330,0335,0336,0336,0342,0333,0333,0342,0332,0330,0343,0333,0333,0343,0333,0331,0342,0334,0337,0333,0336,0336,0333,0337,0337,0337,0304,0313
0103:0333,0336,0330,0332,0334,0343,0335,0335,0350,0334,0334,0343,0335,0335,0335,0335,0343,0351,0330,0335,0335,0333,0337,0304,0313
0104:0333,0332,0342,0336,0330,0350,0335,0343,0335,0335,0343,0335,0351,0330,0335,0335,0336,0333,0337,0333,0337,0304,0313
0105:0304,0313,0333,0336,0332,0336,0332,0332,0337,0337,0342,0335,0336,0342,0332,0336,0342,0337,0332,0342,0336,0331,0334,0337,0337,0333,0331,0304,0313
0106:0304,0313,0333,0336,0332,0336,0332,0332,0337,0337,0342,0335,0336,0332,0336,0342,0337,0332,0342,0336,0331,0334,0337,0337,0333,0331,0304,0313
0107:0304,0313,0333,0336,0330,0332,0334,0343,0335,0335,0350,0334,0334,0343,0335,0335,0335,0335,0343,0351,0330,0335,0335,0333,0337,0336,0336,0332,0336,0333,0337,0342,0330,0334,0342,0335,0331,0333,0337,0337,0304,0313
0110:0304,0313,0333,0336,0336,0332,0332,0337,0337,0342,0336,0332,0337,0342,0336,0330,0335,0342,0330,0334,0331,0336,0333,0337,0337,0304,0313
0111:0304,0313,0333,0336,0336,0332,0332,0334,0337,0342,0336,0330,0335,0337,0337,0342,0330,0336,0336,0334,0342,0335,0335,0342,0330,0330,0334,0337,0337,0331
0112:0304,0313,0333,0336,0330,0332,0342,0330,0335,0336,0342,0334,0334,0342,0334,0330,0330,0342,0330,0333,0343,0335,0335,0333,0331,0333,0336,0333,0337,0337,0337
0113:0304,0313,0333,0336,0332,0332,0337,0342,0336,0330,0350,0335,0310,0337,0342,0336,0313,0335,0335,0310,0337,0342,0336,0313,0335,0351,0330,0335,0335,0333,0337,0304,0313,0336,0336,0336,0333,0337,0337,0337
0114:0333,0336,0332,0336,0332,0337,0337,0342,0336,0335,0342,0330,0336,0330,0334,0337,0337
0115:0304,0310,0342,0330,0335,0306,0335,0311,0336,0342,0330,0334,0334,0342,0330,0334,0334,0334,0334,0350,0335,0337,0342,0330,0304,0335,0335,0313,0336,0336,0336,0333,0337,0337,0337
0116:0342,0330,0335,0306,0335,0313,0337,0312,0336,0342,0330,0334,0334,0350,0334,0337,0313,0336,0304,0342,0336,0336,0336,0333,0337,0337,0337
0117:0333,0336,0330,0332,0341,0331,0333,0337
0120:0333,0332,0336,0336,0333,0337,0337,0342,0336,0330,0336,0330,0333,0341,0333,0333,0330,0337,0337,0331
0121:0333,0336,0330,0332,0341,0335,0335,0336,0330,0332,0350,0334,0337,0342,0334,0351,0334,0333,0331,0336,0330,0337,0337
0122:0304,0313,0336,0336,0336,0333,0337,0337,0337,0342,0330,0335,0336,0336,0342,0333,0333,0342,0332,0330,0343,0333,0335,0337,0306,0350,0334,0337,0312,0336,0342,0337,0313,0336,0335,0330,0304,0334,0334,0333,0336,0336,0336,0332,0337,0337,0337,0337
0123:0313,0304,0336,0336,0332,0337,0337,0336,0330,0333,0336,0330,0343,0334,0350,0334,0343,0332,0332,0334,0334,0334,0334,0343,0335,0335,0335,0351,0343,0335,0335,0333,0331,0333,0337,0337
0124:0333,0336,0332,0337,0342,0330,0336,0335,0342,0331,0342,0330,0330,0334,0337,0331
0125:0333,0336,0336,0330,0332,0337,0342,0330,0336,0342,0331,0331,0332,0332,0342,0330,0342,0330,0342,0331,0331,0333,0335,0335,0343,0330,0335,0335,0337,0333,0337
0126:0333,0336,0332,0350,0350,0335,0337,0342,0334,0334,0342,0335,0335,0334,0351,0351,0336,0333,0337
0127:0336,0336,0336,0333,0333,0337,0337,0337,0304,0313,0350,0350,0350,0334,0342,0335,0335,0336,0342,0330,0304,0335,0350,0350,0335,0335,0335,0342,0330,0304,0334,0350,0334,0350,0334,0337,0342,0334,0350,0335,0304,0336,0336,0333,0336,0333,0337,0337,0337
0130:0313,0306,0350,0337,0312,0336,0335,0342,0334,0304,0337,0313,0336,0330,0335,0306,0335,0337,0312,0336,0342,0330,0334,0304,0334,0337,0313,0336,0336,0336,0336,0333,0337,0337,0337
0131:0304,0313,0336,0336,0336,0332,0337,0337,0337,0336,0333,0342,0330,0306,0350,0334,0337,0312,0336,0342,0335,0335,0342,0337,0313,0336,0334,0304,0331,0333,0337,0336,0336,0336,0332,0337,0337,0337
0132:0304,0335,0312,0336,0342,0337,0332,0336,0342,0337,0333,0306,0336,0334,0313,0337,0342,0335,0304,0336,0330,0334,0312,0337,0313,0336,0336,0336,0333,0337,0337,0337
0133:0333,0336,0336,0332,0332,0337,0337,0342,0330,0335,0336,0336,0342,0337,0337,0333,0336,0336,0342,0330,0330,0334,0337,0337
0134:0333,0336,0336,0332,0337,0337,0350,0350,0334,0342,0335,0351,0351,0336,0336,0333,0337,0337
0135:0333,0336,0336,0332,0337,0337,0342,0336,0336,0334,0342,0333,0333,0333,0333,0342,0335,0333,0337,0337,0331
0136:0333,0330,0336,0332,0334,0334,0350,0335,0342,0334,0334,0342,0334,0351,0334,0333,0337,0331
0137:0333,0334,0336,0336,0330,0337,0342,0336,0331,0335,0337,0337
0140:0333,0336,0332,0330,0336,0330,0350,0334,0342,0335,0351,0330,0333,0333,0337,0337,0331
0141:0304,0313,0336,0336,0336,0332,0332,0337,0337,0337,0333,0336,0332,0336,0330,0341,0333,0342,0331,0342,0330,0330,0332,0333,0333,0331,0331,0337,0337,0336,0336,0336,0332,0337,0337,0337,0313,0304
0142:0304,0313,0336,0336,0332,0337,0337,0333,0336,0336,0332,0332,0332,0337,0337,0342,0336,0336,0330,0333,0341,0333,0333,0331,0337,0337,0336,0336,0336,0332,0337,0337,0337,0304,0313
0143:0304,0313,0336,0336,0332,0337,0337,0333,0336,0332,0336,0330,0350,0343,0334,0334,0343,0334,0334,0343,0334,0334,0330,0330,0334,0334,0351,0331,0336,0332,0337,0337,0337
0144:0333,0336,0336,0332,0332,0337,0337,0342,0336,0336,0330,0332,0341,0333,0333,0331,0337,0337
0145:0304,0313,0336,0336,0332,0337,0337,0333,0336,0336,0332,0330,0332,0343,0334,0334,0350,0335,0343,0334,0343,0335,0335,0342,0351,0335,0335,0342,0333,0330,0330,0334,0336,0332,0337,0337,0337
0146:0304,0313,0336,0336,0332,0337,0337,,0333,0336,0336,0332,0332,0337,0342,0330,0336,0336,0342,0330,0333,0343,0332,0331,0331,0335,0337,0336,0342,0334,0334,0342,0335,0331,0331,0331,0333,0333,0333,0333,0337,0337,0337,0304,0313,0336,0336,0336,0332,0337,0337,0337
0147:0304,0313,0336,0336,0336,0332,0332,0337,0337,0337,0333,0336,0332,0336,0330,0341,0333,0342,0331,0342,0331,0342,0331,0342,0332,0335,0335,0343,0331,0331,0332,0332,0334,0334,0337,0337,0336,0336,0336,0332,0337,0337,0337
0150:0304,0313,0342,0336,0330,0333,0336,0331,0332,0343,0333,0334,0334,0342,0330,0334,0334,0336,0333,0337,0337,0337
0151:0333,0336,0336,0332,0332,0332,0342,0330,0336,0342,0330,0330,0330,0336,0341,0331,0331,0331,0331,0331,0331,0331,0331,0331,0331,0337,0333,0333,0337,0337,0337
0152:0333,0336,0336,0332,0332,0332,0342,0331,0342,0332,0335,0335,0343,0332,0331,0331,0331,0336,0336,0341,0330,0330,0330,0330,0330,0330,0330,0330,0335,0335,0337,0333,0333,0337,0337,0337
0153:0304,0313,0336,0336,0332,0337,0337,0333,0336,0336,0332,0332,0332,0337,0342,0330,0336,0342,0331,0350,0335,0342,0335,0335,0310,0337,0342,0336,0313,0334,0351,0334,0331,0333,0336,0333,0337,,0337,0337,0304,0313
0154:0304,0313,0336,0336,0336,0332,0337,0337,0337,0333,0336,0336,0332,0332,0332,0336,0336,0350,0335,0342,0334,0337,0337,0337,0342,0330,0336,0342,0330,0334,0334,0334,0336,0342,0335,0351,0335,0337,0331,0331,0331,0333,0337,0337
0155:0304,0313,0333,0336,0332,0336,0332,0336,0332,0332,0337,0337,0342,0336,0333,0330,0336,0332,0343,0333,0333,0343,0332,0331,0342,0331,0342,0337,0333,0342,0333,0337,0337
0156:0304,0313,0333,0336,0332,0336,0332,0336,0332,0332,0337,0337,0342,0336,0333,0330,0336,0332,0343,0333,0331,0331,0337,0342,0333,0337,0337
0157:0304,0313,0333,0336,0332,0336,0332,0330,0341,0333,0333,0331,0337,0337
0160:0304,0313,0336,0336,0332,0337,0337,,0333,0336,0332,0336,0332,0342,0335,0335,0337,0342,0336,0331,0332,0341,0333,0334,0334,0342,0331,0333,0333,0333,0337,0337
0161:0304,0313,0333,0336,0332,0336,0330,0332,0341,0333,0342,0331,0331,0337,0342,0336,0333,0334,0334,0336,0333,0343,0335,0335,0330,0330,0333,0337,0337,0337
0162:0333,0336,0332,0336,0332,0337,0342,0330,0336,0336,0342,0350,0335,0350,0337,0337,0335,0342,0335,0351,0351,0330,0334,0331,0336,0336,0333,0337,0337,0337
0163:0304,0313,0336,0336,0332,0337,0337,0333,0336,0336,0332,0332,0330,0336,0330,0350,0343,0334,0334,0343,0334,0350,0334,0343,0334,0351,0330,0330,0343,0334,0334,0343,0334,0334,0335,0343,0334,0351,0331,0333,0333,0337,0337,0337
0164:0304,0313,0333,0336,0332,0342,0330,0336,0342,0334,0342,0335,0335,0342,0333,0333,0336,0330,0335,0343,0335,0335,0333,0333,0333,0337,0337,0337
0165:0304,0313,0336,0336,0330,0342,0333,0334,0334,0343,0332,0334,0334,0342,0334,0334,0342,0330,0335,0335,0336,0333,0337,0337,0337
0166:0304,0313,0336,0336,0332,0337,0337,0333,0336,0332,0350,0350,0334,0342,0335,0335,0342,0334,0351,0351,0333,0337,0336,0336,0336,0332,0337,0337,0337
0167:0336,0336,0336,0333,0337,0337,0337,0313,0304,0336,0336,0336,0333,0337,0350,0350,0334,0337,0342,0335,0335,0336,0342,0330,0335,0335,0335,0335,0335,0335,0342,0330,0334,0334,0334,0334,0334,0334,0337,0342,0334,0304,0336,0333,0336,0333,0337,0337,0337
0170:0304,0313,0336,0306,0350,0335,0342,0351,0336,0333,0334,0337,0342,0350,0335,0304,0336,0336,0333,0337,0337,0337
0171:0304,0313,0336,0336,0332,0337,0337,0333,0336,0332,0336,0350,0335,0337,0350,0334,0342,0334,0334,0342,0334,0334,0334,0334,0334,0334,0342,0334,0351,0351,0335,0335,0333,0337,0336,0336,0336,0332,0337,0337,0337
0172:0304,0313,0336,0350,0335,0310,0337,0342,0330,0334,0334,0334,0336,0342,0334,0337,0330,0334,0334,0334,0336,0342,0330,0334,0334,0304,0313,0337,0336,0336,0336,0333,0337,0337,0337
0173:0333,0336,0330,0332,0336,0336,0330,0334,0350,0334,0342,0335,0335,0335,0342,0330,0335,0342,0334,0331,0331,0331,0334,0342,0335,0331,0342,0335,0335,0335,0342,0335,0351,0335,0335,0331,0331,0333,0333,0337,0337,0337
0174:0333,0336,0332,0337,0342,0330,0336,0336,0342,0337,0337,0331,0336,0336,0331,0342,0330,0333,0337,0337
0175:0333,0336,0336,0332,0332,0330,0330,0336,0330,0342,0330,0350,0334,0342,0335,0331,0335,0335,0335,0342,0335,0330,0330,0334,0334,0334,0342,0335,0335,0335,0342,0330,0335,0342,0334,0351,0330,0330,0335,0335,0333,0333,0333,0337,0337,0337
0176:0333,0336,0330,0332,0330,0336,0331,0350,0334,0342,0335,0335,0342,0334,0351,0332,0350,0335,0342,0334,0351,0333,0333,0333,0331,0331,0331,0337,0337
01300:0333,0200,0336,0330,0332,0340,0350,0335,0336,0330,0342,0331,0331,0331,0342,0330,0330,0335,0335,0331,0331,0342,0330,0330,0330,0342,0331,0334,0334,0334,0351,0331,0331,0333,0333,0337,0337
01304:0333,0200,0336,0330,0332,0341,0342,0335,0342,0335,0342,0335,0342,0350,0335,0351,0336,0336,0330,0330,0341,0331,0331,0335,0330,0330,0341,0331,0331,0335,0330,0330,0341,0331,0331,0335,0330,0330,0341,0331,0331,0350,0334,0351,0337,0337,0330,0335,0335,0333,0337
01305:0333,0200,0336,0330,0332,0305,0342,0335,0342,0335,0342,0335,0342,0335,0342,0335,0341,0350,0335,0351,0336,0330,0336,0336,0341,0337,0337,0331,0335,0330,0336,0336,0341,0337,0337,0331,0335,0330,0336,0336,0341,0337,0337,0331,0335,0330,0336,0336,0341,0337,0337,0331,0335,0330,0336,0336,0341,0337,0337,0331,0350,0335,0304,0337,0331,0333,0337
01306:0333,0200,0336,0330,0332,0306,0342,0335,0342,0335,0342,0335,0342,0335,0342,0335,0341,0350,0335,0351,0336,0330,0336,0336,0341,0337,0337,0331,0335,0330,0336,0336,0341,0337,0337,0331,0335,0330,0336,0336,0341,0337,0337,0331,0335,0330,0336,0336,0341,0337,0337,0331,0335,0330,0336,0336,0341,0337,0337,0331,0350,0335,0335,0335,0337,0342,0334,0336,0330,0336,0336,0341,0337,0337,0331,0304,0335,0337,0331,0333,0337
01310:0333,0200,0336,0332,0350,0335,0310,0337,0342,0330,0334,0334,0342,0330,0334,0334,0342,0330,0334,0334,0342,0330,0334,0334,0334,0351,0336,0313,0333,0337
01311:0335,0305,0342,0334,0311,0337,0342,0336,0335,0330,0334,0350,0334,0337,0342,0334,0334,0304,0336,0313,0335,0200,0334,0305,0350,0335,0342,0330,0335,0335,0335,0311,0336,0342,0330,0334,0334,0334,0336,0342,0335,0335,0335,0337,0331,0334,0334,0334,0337,0331,0334,0313,0304,0335
01312:0333,0200,0352,0334,0342,0330,0334,0334,0334,0334,0342,0334,0312,0337,0313,0336,0342,0330,0334,0334,0334,0334,0336,0342,0334,0334,0304,0312,0336,0313,0337,0333,0337
01313:0333,0200,0336,0336,0332,0332,0330,0342,0334,0342,0330,0335,0342,0330,0335,0342,0330,0342,0330,0335,0342,0330,0335,0342,0335,0331,0333,0337,0337
01314:0333,0200,0314,0336,0332,0332,0330,0200,0333,0200,0333,0200,0331,0337,0313
01315:0333,0313,0200,0336,0330,0332,0341,0335,0342,0334,0334,0342,0334,0334,0330,0334,0331,0337
01316:0333,0200,0336,0336,0330,0332,0332,0332,0336,0341,0330,0330,0330,0330,0341,0333,0333,0331,0331,0341,0333,0333,0330,0330,0341,0331,0331,0331,0331,0341,0333,0333,0331,0331,0337,0337,0337,
01317:0333,0200,0336,0336,0330,0332,0336,0330,0333,0337,0342,0336,0330,0334,0337,0337,0342,0330,0336,0342,0330,0335,0336,0342,0331,0342,0332,0330,0337,0337,0333,0333,0331,0337
01320:0333,0200,0336,0336,0330,0332,0337,0320,0204,0336,0333,0331,0337,0337,
01321:0333,0200,0336,0336,0330,0332,0337,0321,0204,0336,0333,0331,0337,0337,
01322:0333,0200,0336,0336,0330,0332,0337,0322,0204,0336,0333,0331,0337,0337,
01323:0333,0200,0336,0336,0330,0332,0337,0323,0204,0336,0333,0331,0337,0337,
01324:0333,0200,0336,0336,0330,0332,0337,0324,0204,0336,0333,0331,0337,0337,
01325:0333,0200,0336,0336,0330,0332,0337,0325,0204,0336,0333,0331,0337,0337,
01326:0333,0200,0336,0336,0330,0332,0337,0326,0204,0336,0333,0331,0337,0337,
01327:0333,0200,0336,0336,0330,0332,0337,0327,0204,0336,0333,0331,0337,0337,
01330:0333,0200,0313,0336,0336,0330,0332,0336,0332,0337,0342,0334,0342,0330,0335,0342,0330,0334,0336,0342,0330,0335,0350,0335,0337,0310,0337,0342,0330,0335,0335,0342,0330,0335,0335,0335,0336,0313,0336,0342,0330,0351,0335,0331,0331,0331,0331,0333,0333,0333,0337,0337,0337
01331:0333,0200,0335,0335,0333,0331,0313,0336,0336,0330,0332,0336,0332,0337,0342,0334,0342,0330,0335,0342,0330,0334,0336,0342,0330,0335,0350,0335,0337,0310,0337,0342,0330,0335,0335,0342,0330,0335,0335,0335,0336,0313,0336,0342,0330,0351,0335,0331,0331,0331,0331,0333,0333,0333,0337,0337,0337,0332,0335,0335,0331
01332:0333,0200,0334,0333,0313,0336,0336,0330,0332,0336,0332,0337,0342,0334,0342,0330,0335,0342,0330,0334,0336,0342,0330,0335,0350,0335,0337,0310,0337,0342,0330,0335,0335,0342,0330,0335,0335,0335,0336,0313,0336,0342,0330,0351,0335,0331,0331,0331,0331,0333,0333,0333,0337,0337,0337,0335,0331
01333:0333,0200,0335,0331,0313,0336,0336,0330,0332,0336,0332,0337,0342,0334,0342,0330,0335,0342,0330,0334,0336,0342,0330,0335,0350,0335,0337,0310,0337,0342,0330,0335,0335,0342,0330,0335,0335,0335,0336,0313,0336,0342,0330,0351,0335,0331,0331,0331,0331,0333,0333,0333,0337,0337,0337,0330,0334
01334:0333,0200,0336,0330,0332,0336,0350,0343,0334,0334,0343,0334,0334,0343,0334,0342,0335,0330,0336,0330,0334,0334,0334,0337,0342,0334,0351,0336,0331,0337,0337,0333,0337
01335:0333,0200,0336,0330,0332,0336,0350,0343,0334,0334,0343,0334,0334,0343,0334,0334,0334,0342,0334,0330,0336,0330,0335,0335,0335,0337,0342,0336,0335,0331,0351,0337,0337,0332,0335,0335,0337,0331
01336:0333,0200,0336,0330,0334,0336,0330,0337,0342,0336,0331,0335,0337,0331,0337
01337:0333,0200,0336,0330,0332,0336,0342,0334,0342,0334,0342,0334,0342,0330,0330,0334,0337,0331,0337
01340:0333,0200,0336,0330,0332,0340,0333,0331,0337
01341:0333,0200,0336,0330,0332,0341,0340,0333,0331,0337
01342:0333,0200,0336,0330,0332,0334,0336,0342,0330,0340,0331,0335,0335,0342,0330,0340,0333,0333,0330,0334,0337,0337
01343:0333,0200,0336,0330,0332,0350,0343,0335,0342,0334,0334,0342,0335,0340,0351,0331,0333,0337
01344:0304,0313,0333,0200,0336,0332,0344,0333,0337
01345:0304,0313,0333,0200,0336,0332,0345,0333,0337
01346:0304,0313,0333,0200,0336,0332,0346,0333,0337
01347:0304,0313,0333,0200,0336,0332,0336,0330,0330,0347,0331,0331,0337,0333,0337,
01350:0333,0200,0336,0330,0332,0350,0335,0342,0335,0335,0342,0334,0336,0336,0342,0330,0330,0342,0331,0331,0351,0337,0337,0334,0333,0331,0337
01351:0333,0200,0336,0332,0330,0350,0335,0336,0336,0342,0330,0330,0342,0330,0330,0342,0331,0331,0331,0331,0335,0337,0337,0342,0335,0342,0334,0351,0333,0330,0334,0337
01352:0333,0200,0336,0330,0332,0335,0350,0352,0334,0334,0334,0342,0335,0335,0336,0336,0342,0330,0330,0342,0331,0331,0335,0335,0342,0330,0330,0342,0331,0331,0335,0335,0337,0337,0342,0335,0335,0335,0351,0353,0330,0334,0334,0333,0337
01353:0333,0200,0336,0330,0332,0335,0350,0352,0334,0342,0335,0335,0342,0335,0335,0336,0336,0342,0330,0330,0342,0331,0331,0334,0334,0334,0334,0334,0334,0342,0330,0330,0342,0331,0331,0335,0335,0335,0351,0353,0337,0337,0333,0330,0334,0337
01362:0333,0200,0336,0336,0330,0332,0332,0332,0340,0342,0330,0342,0330,0335,0342,0330,0342,0330,0350,0334,0334,0334,0342,0334,0334,0335,0334,0342,0334,0304,0330,0330,0330,0334,0334,0333,0337,0337,
01363:0304,0313,0333,0200,0336,0332,0330,0336,0330,0332,0335,0342,0330,0342,0330,0335,0342,0330,0342,0330,0334,0350,0334,0342,0334,0334,0342,0340,0335,0304,0331,0333,0337,0337
01365:0313,0304,0333,0200,0336,0330,0332,0336,0331,0332,0337,0350,0350,0334,0342,0335,0335,0342,0334,0304,0333,0350,0350,0334,0342,0335,0335,0342,0334,0304,0336,0333,0331,0337,0337
01200:0333,0200,0336,0336,0330,0332,0337,0200,0336,0331,0333,0337,0337
01201:0304,0313,0333,0200,0336,0336,0330,0330,0332,0332,0332,0335,0336,0337,0337,0342,0330,0335,0350,0335,0336,0336,0342,0335,0335,0342,0335,0304,0337,0331,0331,0333,0337,0337
01020:0304,0333,0200,0336,0330,0332,0336,0336,0332,0337,0200,0333,0333,0200,0332,0332,0336,0330,0335,0337,0342,0330,0350,0335,0335,0351,0333,0350,0336,0334,0342,0334,0334,0342,0337,0335,0351,0333,0336,0333,0331,0337,0337,0331,0337,0304,0336,0330,0330,0336,0330,0334,0331,0337,0337
01021:0304,0333,0200,0336,0330,0332,0336,0336,0332,0337,0200,0333,0333,0200,0332,0332,0336,0330,0335,0337,0342,0330,0350,0335,0335,0335,0336,0342,0335,0335,0342,0337,0335,0351,0333,0336,0333,0331,0337,0337,0331,0337,0304
01022:0333,0200,0336,0336,0330,0330,0332,0332,0332,0336,0336,0333,0337,0337,0336,0330,0336,0333,0337,0337,0200,0333,0200,0333,0200,0331,0331,0332,0332,0200,0333,0200,0333,0200,0336,0333,0331,0337,0337,0332,0330,0336,0336,0331,0337,0342,0330,0335,0350,0335,0336,0342,0335,0335,0342,0337,0335,0335,0335,0351,0331,0331,0331,0333,0333,0336,0330,0337,0337,0337
01023:0333,0200,0336,0336,0330,0330,0332,0332,0332,0336,0336,0333,0337,0337,0336,0330,0336,0333,0337,0337,0200,0333,0200,0333,0200,0331,0331,0332,0332,0200,0333,0200,0333,0200,0336,0333,0331,0337,0337,0332,0330,0336,0336,0331,0337,0335,0335,0331,0342,0330,0335,0350,0335,0336,0342,0335,0335,0342,0337,0335,0335,0335,0351,0331,0331,0331,0333,0333,0336,0330,0337,0337,0337,0335,0335,0331,0333
01024:0333,0200,0336,0336,0330,0332,0337,0200,0336,0336,0330,0332,0337,0200,0336,0336,0330,0332,0337,0200,0333,0333,0333,0331,0331,0331,0336,0331,0333,0337,0337,0337,0337
01025:0333,0200,0336,0336,0330,0332,0337,0336,0336,0330,0332,0337,0200,0336,0336,0330,0332,0337,0200,0333,0333,0333,0331,0331,0331,0336,0331,0333,0337,0337,0337,0337
01026:0333,0200,0336,0330,0332,0336,0336,0333,0331,0337,0200,0306,0335,0342,0332,0342,0330,0335,0335,0342,0335,0335,0335,0335,0331,0334,0304,0332,0306,0335,0342,0330,0350,0335,0342,0334,0331,0335,0304,0334,0331,0332,0335,0336,0332,0337,0342,0330,0350,0335,0335,0335,0336,0342,0335,0335,0342,0335,0304,0331,0331,0331,0331,0333,0333,0333,0333,0333,0337,0337,0337
01027:0333,0200,0336,0330,0332,0336,0336,0333,0331,0337,0332,0200,0306,0335,0342,0332,0342,0330,0335,0335,0342,0335,0335,0335,0335,0331,0334,0304,0332,0306,0335,0342,0330,0350,0335,0342,0334,0331,0335,0304,0334,0331,0333,0333,0330,0335,0342,0330,0350,0335,0335,0335,0336,0342,0335,0335,0342,0335,0304,0331,0331,0331,0331,0331,0333,0337,0337,0337
01010:0333,0200,0350,0334,0310,0337,0342,0336,0332,0335,0335,0337,0342,0336,0333,0334,0351,0313
01030:0333,0200,0336,0332,0337,0350,0350,0350,0342,0335,0342,0335,0342,0335,0342,0335,0342,0335,0342,0334,0334,0334,0334,0334,0334,0342,0334,0342,0334,0342,0334,0342,0334,0334,0342,0335,0335,0335,0335,0335,0335,0335,0335,0335,0335,0335,0335,0342,0334,0334,0334,0334,0334,0334,0304,0343,0336,0333,0337
01031:0333,0200,0336,0330,0332,0336,0332,0331,0123,0126,0107,0330,0330,0332,0332,0330,0335,0335,0336,0330,0332,0337,0201,0335,0350,0335,0336,0342,0335,0335,0342,0334,0304,0333,0333,0333,0333,0331,0331,0331,0331,0331,0332,0336,0333,0336,0332,0337,0337,0337,0337,0337,
0400:0300
0200:0304,0342,0330,0334,0342,0330,0334,0342,0330,0334,0342,0330,0334
0201:0342,0330,
01201:0304,0313,0333,0200,0336,0336,0330,0330,0332,0332,0332,0335,0336,0337,0337,0342,0330,0335,0350,0335,0336,0336,0342,0335,0335,0342,0335,0304,0337,0331,0331,0333,0337,0337
01344:0333,0200,0336,0330,0332,0336,0332,0340,0335,0337,0342,0330,0340,0334,0332,0336,0331,0332,0331,0337,0337,0202,
0202:0304,0313,0350,0335,0336,0336,0342,0333,0342,0333,0342,0333,0342,0333,0334,0304,0337,0337,
01345:0202,0200,0350,0334,0343,0335,0304,
01346:0202,0200,0350,0334,0332,0335,0335,0343,0333,0335,0304,0334,
01202:0202,0200,
01203:0304,0313,0202,0332,0333,0200,0336,0336,0330,0330,0332,0332,0332,0335,0336,0337,0337,0342,0330,0335,0350,0335,0336,0336,0342,0335,0335,0342,0335,0304,0337,0331,0331,0333,0337,0337,
0203:0344,0330
0204:0362,0203,0334,0203,0334,0203,0334,0203,0334,0363
01204:0202,0200,0336,0336,0330,0332,0337,0200,0336,0331,0333,0337,0337,
01365:0313,0304,0333,0200,0336,0330,0332,0336,0331,0332,0337,0350,0350,0334,0342,0335,0335,0342,0334,0304,0333,0350,0350,0334,0342,0335,0335,0342,0334,0304,0336,0333,0331,0337,0337
01205:0202,0200,0336,0336,0330,0332,0332,0332,0330,0205,0331,0331,0332,0337,0337,0333,
0205:0362,0203,0335,0203,0203,0335,0203,0335,0203,0203,0335,0363,0336,0330,0333,0336,0331,0332,0337,0365,0336,0332,0331,0337,0337,
0206:0336,0332,0337,0362,0203,0334,0336,0203,0335,0350,0335,0337,0310,0337,0203,0335,0335,0203,0335,0304,0335,0336,0313,0336,0203,0334,0337,0203,0363,0335,0335,0336,0332,0337,
01206:0202,0200,0336,0332,0206,0333,0337,
01366:0333,0200,0336,0336,0332,0332,0332,0330,0335,0337,0366,0340,0342,0330,0332,0335,0335,0367,0335,0336,0333,0330,0337,0337,0331
01367:0333,0200,0336,0336,0332,0332,0332,0330,0335,0337,0366,0330,0332,0335,0335,0367,0335,0336,0340,0334,0337,0342,0336,0333,0330,0337,0337,0331,0335,0331,0336,0332,0337,
0500:0150,0164,0164,0160,0163,072,057,057,0151,056,0151,0155,0147,0165,0162,056,0143,0157,0155,057,0162,0143,060,0157,0153,0147,0130,056,0152,0160,0147,
0501:0150,0164,0164,0160,0163,072,057,057,0151,056,0151,0155,0147,0165,0162,056,0143,0157,0155,057,0116,060,0130,0113,065,0117,0124,056,0152,0160,0147,
0502:0150,0164,0164,0160,0163,072,057,057,0151,056,0151,0155,0147,0165,0162,056,0143,0157,0155,057,0107,0150,0121,0131,066,067,0167,056,0152,0160,0147,
0503:0150,0164,0164,0160,0163,072,057,057,0151,056,0151,0155,0147,0165,0162,056,0143,0157,0155,057,0144,067,0144,0166,0115,0125,0130,056,0152,0160,0147,
0504:0150,0164,0164,0160,0163,072,057,057,0151,056,0151,0155,0147,0165,0162,056,0143,0157,0155,057,071,0111,066,0152,0102,0156,0154,056,0152,0160,0147,
0505:0150,0164,0164,0160,0163,072,057,057,0151,056,0151,0155,0147,0165,0162,056,0143,0157,0155,057,0153,0122,0141,0172,0157,0120,0111,056,0152,0160,0147,
0506:0150,0164,0164,0160,0163,072,057,057,0151,056,0151,0155,0147,0165,0162,056,0143,0157,0155,057,0113,060,0112,0153,0103,0143,071,056,0152,0160,0147,
0507:0150,0164,0164,0160,0163,072,057,057,0151,056,0151,0155,0147,0165,0162,056,0143,0157,0155,057,0164,0124,0103,070,0132,0115,0141,056,0152,0160,0147,
0510:0150,0164,0164,0160,0163,072,057,057,0151,056,0151,0155,0147,0165,0162,056,0143,0157,0155,057,0153,0122,0141,0172,0157,0120,0111,056,0152,0160,0147,
01370:0333,0200,0336,0336,0332,0332,0336,0330,0337,0337,0342,0330,0336,0342,0331,0335,0342,0330,0336,0342,0330,0334,0342,0330,0337,0342,0330,0337,0336,0336,0342,0330,0334,0342,0330,0342,0330,0342,0330,0335,0331,0331,0331,0331,0331,0333,0333,0335,0335,0342,0330,0334,0350,0334,0342,0334,0334,0342,0335,0351,0332,0332,0330,0330,0330,0333,0335,0306,0342,0336,0331,0337,0337,0342,0330,0334,0334,0342,0330,0334,0334,0342,0330,0334,0334,0304,0334,0333,0333,0336,0336,0332,0337,0337,0337,0331,0337
01371:0333,0200,0336,0336,0332,0332,0336,0330,0337,0337,0342,0330,0336,0342,0331,0335,0342,0330,0336,0342,0330,0334,0342,0330,0337,0342,0330,0337,0336,0336,0342,0330,0334,0342,0330,0342,0330,0342,0330,0335,0331,0331,0332,0332,0335,0342,0330,0334,0334,0350,0335,0342,0334,0334,0342,0335,0335,0335,0351,0333,0336,0331,0331,0331,0333,0335,0337,0337,0306,0342,0330,0334,0334,0342,0330,0334,0334,0342,0330,0334,0334,0304,0330,0330,0336,0336,0331,0334,0337,0337,0337,0331,0336,0336,0336,0330,0337,0337,0337,0337
01372:0333,0200,0336,0336,0332,0332,0336,0330,0337,0337,0342,0330,0336,0342,0331,0335,0342,0330,0336,0342,0330,0334,0342,0330,0337,0342,0330,0337,0336,0336,0342,0330,0334,0342,0330,0342,0330,0342,0330,0335,0331,0331,0331,0331,0331,0333,0333,0335,0335,0342,0330,0334,0350,0334,0342,0334,0334,0342,0335,0351,0332,0332,0330,0330,0330,0336,0331,0333,0337,0337,0342,0330,0335,0342,0330,0335,0342,0330,0335,0342,0330,0335,0333,0333,0336,0336,0332,0337,0337,0337,0331,0336,0336,0336,0330,0337,0337,0337,0337
01373:0333,0200,0336,0336,0332,0332,0336,0330,0337,0337,0342,0330,0336,0342,0331,0335,0342,0330,0336,0342,0330,0334,0342,0330,0337,0342,0330,0337,0336,0336,0342,0330,0334,0342,0330,0342,0330,0342,0330,0335,0331,0331,0332,0332,0335,0342,0330,0334,0334,0350,0335,0342,0334,0334,0342,0335,0335,0335,0351,0333,0331,0331,0336,0330,0333,0337,0337,0342,0330,0335,0342,0330,0335,0342,0330,0335,0342,0330,0335,0333,0333,0331,0331,0336,0336,0330,0332,0337,0337,0337,0337
01374:0333,0200,0336,0336,0332,0332,0336,0330,0337,0337,0342,0330,0336,0342,0331,0335,0342,0330,0336,0342,0330,0334,0342,0330,0337,0342,0330,0337,0336,0336,0342,0330,0334,0342,0330,0342,0330,0342,0330,0335,0331,0331,0331,0331,0331,0333,0333,0335,0335,0342,0330,0334,0350,0334,0342,0334,0334,0342,0335,0351,0332,0332,0330,0330,0330,0333,0335,0305,0342,0330,0334,0342,0330,0334,0342,0330,0334,0342,0330,0334,0342,0330,0334,0304,0334,0333,0333,0333,0331,0331,0331,0331,0337,0337,0337
01375:0333,0200,0336,0336,0332,0332,0336,0330,0337,0337,0342,0330,0336,0342,0331,0335,0342,0330,0336,0342,0330,0334,0342,0330,0337,0342,0330,0337,0336,0336,0342,0330,0334,0342,0330,0342,0330,0342,0330,0335,0331,0331,0332,0332,0335,0342,0330,0334,0334,0350,0335,0342,0334,0334,0342,0335,0335,0335,0351,0333,0331,0331,0333,0330,0335,0305,0342,0330,0334,0342,0330,0334,0342,0330,0334,0342,0330,0334,0342,0330,0334,0304,0330,0330,0330,0334,0331,0331,0331,0331,0337,0337,0337
01376:0333,0200,0336,0336,0332,0332,0336,0330,0337,0337,0342,0330,0336,0342,0331,0335,0342,0330,0336,0342,0330,0334,0342,0330,0337,0342,0330,0337,0336,0336,0342,0330,0334,0342,0330,0342,0330,0342,0330,0335,0331,0331,0331,0331,0331,0333,0333,0335,0335,0342,0330,0334,0350,0334,0342,0334,0334,0342,0335,0351,0332,0332,0330,0330,0330,0335,0330,0306,0342,0330,0334,0342,0330,0334,0342,0330,0334,0342,0330,0334,0342,0330,0334,0342,0330,0334,0304,0330,0330,0330,0334,0337,0337,0331,0337
01377:0333,0200,0336,0336,0332,0332,0336,0330,0337,0337,0342,0330,0336,0342,0331,0335,0342,0330,0336,0342,0330,0334,0342,0330,0337,0342,0330,0337,0336,0336,0342,0330,0334,0342,0330,0342,0330,0342,0330,0335,0331,0331,0332,0332,0335,0342,0330,0334,0334,0350,0335,0342,0334,0334,0342,0335,0335,0335,0351,0333,0331,0333,0335,0306,0342,0330,0334,0342,0330,0334,0342,0330,0334,0342,0330,0334,0342,0330,0334,0342,0330,0334,0304,0333,0330,0330,0330,0334,0331,0331,0331,0337,0337,0337
0600:0122,0157,0157,0164,040,0115,0141,0147,0151,0143,040,0133,060,060,055,060,063,067,0135,
0601:0106,0157,0156,0164,040,0133,060,064,060,055,060,061,067,066,0135,
0602:0123,0150,0141,0160,0145,0163,040,0133,060,062,060,060,055,060,062,067,067,0135,
0603:0107,0145,0157,0155,0145,0164,0162,0171,040,0101,0143,0164,0151,0157,0156,0163,040,0133,060,063,060,060,055,060,063,067,067,0135,
0604:0111,0155,0141,0147,0145,0163,040,0133,060,065,060,060,055,060,065,067,067,0135,
0605:0127,0157,0162,0144,0163,040,0133,060,066,060,060,055,060,066,067,067,0135,
0606:0115,0141,0164,0150,040,0133,060,067,060,060,055,060,067,067,067,0135,
0274:0333,0331,0362,0203,0334,0203,0334,0203,0334,0203,0334,0363,0330,0332,
0250:0305,0311,0336,0362,0203,0335,0350,0335,0337,0203,0305,0335,0335,0203,0363,0335,0350,0335,0305,
0251:0305,0311,0336,0362,0203,0334,0350,0334,0337,0203,0305,0334,0334,0203,0363,0334,0350,0334,0305,
0252:0305,0311,0337,0362,0203,0335,0335,0203,0335,0350,0335,0336,0203,0363,0335,0335,0335,0305,
0253:0305,0311,0337,0362,0203,0334,0334,0203,0334,0350,0334,0336,0203,0363,0334,0334,0334,0305,
0254:0305,0311,0335,0362,0203,0335,0335,0336,0203,0335,0203,0363,0335,0337,
0255:0311,0305,0334,0362,0203,0334,0334,0336,0203,0334,0203,0363,0334,0337,
0256:0305,0311,0335,0362,0203,0335,0335,0337,0203,0335,0335,0336,0203,0363,
0257:0305,0311,0334,0362,0203,0334,0334,0337,0203,0334,0334,0336,0203,0363,
0260:0311,0305,0333,0350,0334,0337,0362,0203,0305,0334,0334,0336,0203,0334,0203,0363,0334,0334,0334,0330,0335,0335,0350,0334,0305,
0261:0311,0305,0332,0350,0335,0305,0337,0362,0203,0335,0335,0336,0203,0335,0203,0363,0331,0350,0335,0335,0335,0305,0336,0331,0337,
01250:0333,0200,0336,0332,0330,0250,0304,0313,0331,0333,0337,
01251:0333,0200,0336,0332,0330,0251,0304,0313,0331,0333,0337,
01252:0333,0200,0336,0332,0330,0252,0304,0313,0331,0333,0337,
01253:0333,0200,0336,0332,0330,0253,0304,0313,0331,0333,0337,
01254:0333,0200,0336,0332,0330,0254,0304,0313,0331,0333,0337,
01255:0333,0200,0336,0332,0330,0255,0304,0313,0331,0333,0337,
01256:0333,0200,0336,0332,0330,0256,0304,0313,0331,0333,0337,
01257:0333,0200,0336,0332,0330,0257,0304,0313,0331,0333,0337,
01260:0333,0200,0336,0332,0330,0260,0304,0313,0331,0333,0337,
01261:0333,0200,0336,0332,0330,0261,0304,0313,0331,0333,0337,
0176:0330,0336,0336,0336,0331,0331,0333,0333,0341,0331,0331,0331,0331,0331,0331,0333,0333,0333,0333,0337,0337,0337,
045:0336,0333,0330,0336,0332,0330,0335,0335,0366,0335,0332,0332,0331,0367,0335,0335,0366,0335,0335,0334,0332,0331,0331,0334,0336,0331,0337,0367,0336,0335,0335,0366,0332,0332,0334,0333,0337,0336,0334,0334,0367,0337,0335,0335,0201,0336,0342,0335,0335,0331,0331,0333,0333,0333,0333,0337,0337,0337,
*/
</script>
<!--
<script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
-->
<!--<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>-->
<script>

  	inPath = false;//move to true after path started, back to false after path ended
	explodeIndex = 0;
	explodeLimit = 100000;
	currentTable = []; 
	for(var index = 0;index < 01777;index ++){
		currentTable.push("");
	}  
	var inputbytecode = document.getElementById("bytecodeScript").text;
	
	var bytecodearray = inputbytecode.split("\n");

	for(var index = 0;index < bytecodearray.length;index++){
		if(bytecodearray[index].includes(":")){
			var localBytecode = bytecodearray[index].split(":");
			var localAddress = parseInt(localBytecode[0],8);
			currentTable[localAddress] = localBytecode[1];
		}
	}
	myFont = "Futura";
	currentWord = "Word";
	currentSVG = "";
	currentAddress = 0401;
	currentGlyph = currentTable[currentAddress];
	currentGlyphArray = currentGlyph.split(",");
	cursorPosition = currentGlyphArray.length;
	phi = 0.5*(Math.sqrt(5) + 1);
	unit = 100;
	scaleFactor = 2;
	side = unit;
	thetaStep = Math.PI/2;
	theta0 = -Math.PI/2; 
	theta = theta0;

	x0 = 200;
	y0 = 200;
	x = x0;
	y = y0;

	cursor = {
		x:x,
		y:y,
		theta:theta,
		thetaStep:thetaStep,
		side:side,
		glyph:"0362,0344,0363,0336,0330,0340,0331,0337,0337,0330,0340,0331,0336,0334,0362,0344,0363,0335,0335,0362,0344,0363"
	}


</script>
</head>
<body>
<div class = "atom" id = "masterRoot"></div>
<div id = "glyphTableEditor" class = "atom" style = "display:block">	
	<canvas style = "display:none;" id = "invisibleCanvas"></canvas>
	<div class = "atom"  style = "width:450px;height:450px;padding:40px 0px 0px 40px">
		<canvas width = "400" height = "400" id = "plotCanvas" style = "border:solid"></canvas>
	</div>
	<div id = "wordPanel" class = "atom" onchange = "updateWordOption();">
		string:<input id = "wordInput" onchange = "updateWordInput();"></input>
		<select id = "wordSelect">
		</select>
		bytecode:<input id = "wordCode"></input>
	</div>
	<div id = "spellDiv">
		<canvas width = "3000" height = "30" id = "spellCanvas" style = "border:solid;float:left;"></canvas>
		<input size = "6" id = "addr" style = "float:left;" onchange = "updateAddr();"></input>
		<input style = "float:left;" size = "428" id = "glyphBytecode" onchange = "updateGlyph()"></input>
	</div>
	<div class = "atom" style = "width:610px;height:auto" id = "controlPad">
		<div style = "width:95px;height:100px;float:left" id = "directionPad"></div>
		<div style = "width:210px;height:30px;float:left" id = "anglePad"></div>
		<div style = "width:180px;height:30px;float:left" id = "scalePad"></div>
		<div style = "width:125px;height:100px;float:right;" id = "rootPad"></div>
		<div style = "width:384px;height:100px;float:left" id = "drawPad"></div>
		<input style = "float:left;margin:0px" size = "80" id = "drawGlyphGlyph" onchange = "updateDrawGlyphs();"></input>
	</div>
	<p>
	<div class = "atom">
		<textarea id = "mainTextArea"  cols = "84" rows = "12">
		</textarea>
	</div>
</div>


<script>

var newSelect = document.getElementById("wordSelect");
for(var index = 0600;index < 0700;index++){
	var newOption = document.createElement("OPTION");
	newOption.text = "0" + index.toString(8);
	newSelect.appendChild(newOption);
}

currentNode = document.getElementById("directionPad");
//buildPanel([0334,0330,0335,0332,0300,0333,0336,0331,0337]);
buildPanel("0334,0330,0335,0332,0300,0333,0336,0331,0337");

currentNode = document.getElementById("anglePad");
buildPanel("0304,0305,0306,0350,0351,0352,0353");

currentNode = document.getElementById("scalePad");
buildPanel("0310,0311,0312,0313,0314,0316");

currentNode = document.getElementById("rootPad");
buildPanel("020,010,021,022,023,024,025,026,027,031");


currentNode = document.getElementById("drawPad");
drawGlyphsGlyph = "0200,0201,0340,0341,0342,0343,0362,0203,0363";
document.getElementById("drawGlyphGlyph").value = drawGlyphsGlyph;
buildPanel(drawGlyphsGlyph);

ctx = document.getElementById("plotCanvas").getContext("2d");
currentGlyph = currentTable[currentAddress];
redraw();

currentNode = document.getElementById("masterRoot");
appendGlyphButton(030);

function buildPanel(glyphsGlyph){
	var glyphsGlyphArray = glyphsGlyph.split(",");
	var buttonArray = [];
	for(var index = 0;index < glyphsGlyphArray.length;index++){
		buttonArray.push(parseInt(glyphsGlyphArray[index],8));
	}
	for(var index = 0;index < buttonArray.length;index++){
		appendGlyphButton(buttonArray[index]);
	}
}

function updateWordOption(){
	wordAddress = parseInt(document.getElementById("wordSelect").value,8);
	document.getElementById("wordInput").value = byteCode2string(currentTable[wordAddress]);
}

function updateWordInput(){
	wordAddress = parseInt(document.getElementById("wordSelect").value,8);
	currentTable[wordAddress] = string2byteCode(document.getElementById("wordInput").value);
	document.getElementById("wordCode").value = string2byteCode(document.getElementById("wordInput").value);
}

function updateAddr(){
	currentAddress = parseInt(document.getElementById("addr").value,8);
	currentGlyph = currentTable[currentAddress];
	currentGlyphArray = currentGlyph.split(",");
	cursorPosition = currentGlyphArray.length;
	redraw();
}

function updateGlyph(){
	currentGlyph = document.getElementById("glyphBytecode").value;
	currentGlyph = commaCleaner(currentGlyph);
	currentTable[currentAddress] = currentGlyph;
	currentGlyphArray = currentGlyph.split(",");
	cursorPosition = currentGlyphArray.length;
	redraw();	
}

function updateDrawGlyphs(){
	currentNode = document.getElementById("drawPad");
	while (currentNode.hasChildNodes()) {
		currentNode.removeChild(currentNode.childNodes[0]);
	}
	drawGlyphsGlyph = document.getElementById("drawGlyphGlyph").value;
	buildPanel(drawGlyphsGlyph);
}

function roctalChar(localAddress){
	drawGlyph("0313,0336,0336,0336,0274,0333,0331,0274,0333,0331,0337,");
	for(var bitIndex = 8;bitIndex >= 0;bitIndex--){
		if(((localAddress>>bitIndex)&1)==1){
			doTheThing(0274);// data square
		}
		doTheThing(0333);
		if((bitIndex == 6)||(bitIndex == 3)){
			drawGlyph("0331,0332,0332,0332");
		}
	}
	drawGlyph("0331,0337,0337,0200,0330");
	
	drawGlyph("0332,0336,0336,0331,0331,");
	currentWord = ((localAddress >> 6)&7).toString();	
	drawGlyph("0365,0331,");
	currentWord = ((localAddress >> 3)&7).toString();	
	drawGlyph("0365,0331,");
	currentWord = ((localAddress)&7).toString();	
	drawGlyph("0365,0331,");
	drawGlyph("0330,0337,0337,0330,0333,");	
}

function redraw(){
	x0 = 200;
	y0 = 200;
	unit = 100;
	//draw the glyph:
	ctx = document.getElementById("plotCanvas").getContext("2d");
	//draw current glyph:
	doTheThing(0300);
//	ctx.fillStyle = "#808080"
	ctx.clearRect(0,0,400,400);
	doTheThing(0300);

	drawGlyph(currentGlyph);
	//draw the cursor:
	ctx = document.getElementById("invisibleCanvas").getContext("2d");
	getCursor();
	ctx = document.getElementById("plotCanvas").getContext("2d");
	drawGlyph(cursor.glyph);

	//spell:
	ctx = document.getElementById("spellCanvas").getContext("2d");
	ctx.clearRect(0,0,3000,40);
	unit = 20;
	x0 = 5;
	y0 = 25;
	doTheThing(0300);
	spellGlyph(currentGlyph);
	
	document.getElementById("addr").value = "0" + currentAddress.toString(8);
	document.getElementById("glyphBytecode").value = currentGlyph;
	explodeIndex = 0;	
}


function appendGlyphButton(localCommand){
	glyphButtonSize = 30;
	var newCanvas = document.createElement("CANVAS");		
	newCanvas.width = glyphButtonSize;
	newCanvas.height = glyphButtonSize;
	newCanvas.className = "glyphButtons";
	ctx = newCanvas.getContext("2d");
	ctx.fillStyle="white";
	ctx.fillRect(5, 5, glyphButtonSize-10, glyphButtonSize-10);
	ctx.fillStyle="black";
	doTheThing(0300);			
	x = 5;
	y = glyphButtonSize-5;
	side = glyphButtonSize-10;
	doTheThing(localCommand + 01000);
	if(localCommand < 040){
		newCanvas.onclick = function(){
			localRoot(localCommand);
		}	
	}
	if(localCommand >= 040){
		newCanvas.onclick = function(){
			cursorAction(localCommand);	
			redraw();	
		}
	}
	currentNode.appendChild(newCanvas);
}


function cursorAction(localCommand){
	currentGlyphArray = currentGlyph.split(",");
	if(cursorPosition > currentGlyphArray.length){
		cursorPosition = currentGlyphArray.length;
	}
	currentGlyph = "";
	doTheThing(0300);
	
	for(var index = 0;index < cursorPosition;index++){
		currentGlyph += currentGlyphArray[index] + ",";	
		var localAction = parseInt(currentGlyphArray[index],8);
		if( !((localAction >= 0340) && (localAction < 0344)) ){
			doTheThing(localAction);
		}
	}
	if(localCommand != undefined){
		if( !((localCommand >= 0340) && (localCommand < 0344)) ){
			doTheThing(localCommand);
		}
	}
	cursor.x = x;
	cursor.y = y;
	cursor.theta = theta;
	cursor.thetaStep = thetaStep;
	cursor.side = side;
	if(localCommand != undefined){
		currentGlyph += "0" + localCommand.toString(8) + ",";
	}	
	for(var index = cursorPosition;index < currentGlyphArray.length;index++){
		currentGlyph += currentGlyphArray[index] + ",";		
	}
	cursorPosition++;	
	currentGlyph = commaCleaner(currentGlyph);
}

function getCursor(){

	currentGlyphArray = currentGlyph.split(",");
	var foo = "";
	doTheThing(0300);
	for(var index = 0;index < cursorPosition;index++){
		foo += currentGlyphArray[index] + ",";	
		var localAction = parseInt(currentGlyphArray[index],8);
		doTheThing(localAction);
	}
	cursor.x = x;
	cursor.y = y;
	cursor.theta = theta;
	cursor.thetaStep = thetaStep;
	cursor.side = side;

}

function commaCleaner(dirtyGlyph){ //remove extra commas from glyph
	var dirtyArray = dirtyGlyph.split(",");
	var cleanGlyph = "";
	for(var index = 0;index < dirtyArray.length;index++){
		if(dirtyArray[index] != ""){
			cleanGlyph += dirtyArray[index] + ",";
		}
	}
	return cleanGlyph;
}

function drawGlyph(localString){
	var tempArray = localString.split(',');
	for(var index = 0;index < tempArray.length;index++){
		if(explodeIndex < explodeLimit){
			doTheThing(parseInt(tempArray[index],8));
		}
	}
}

function spellGlyph(localString){
	var tempArray = localString.split(',');
	for(var index = 0;index < tempArray.length;index++){
		    ctx.lineWidth = 2;
	      ctx.strokeStyle="black";

		doTheThing(parseInt(tempArray[index],8) + 01000);
		if(index == cursorPosition-1){
			drawGlyph("0336,0333,0336,0330,0341,0331,0337,0333,0337");
		}
	}
}

function byteCode2string(localByteCode){
	var localString = "";
	var stringArray = localByteCode.split(",");
	for(var index = 0;index < stringArray.length;index++){
		var myCharCode = String.fromCharCode(parseInt(stringArray[index],8));
		if(parseInt(stringArray[index],8) >= 040 && parseInt(stringArray[index],8) < 0177 ){
			localString += myCharCode;
		}
		if(parseInt(stringArray[index],8) == 012){//newline
			localString += myCharCode;
		}
		if(parseInt(stringArray[index],8) == 011){//vertical tab
			localString += myCharCode;
		}
		
	}
	return localString;
}

function string2byteCode(localString){
	var localByteCode = "";
	for(var stringIndex = 0;stringIndex < localString.length;stringIndex++){
		var tempCharCode = localString.charCodeAt(stringIndex);
		if(tempCharCode != 0){
			localByteCode += "0";
			localByteCode += tempCharCode.toString(8);
			localByteCode += ",";
		}
	}
	return localByteCode;
}
function doTheThing(localCommand){
 	 explodeIndex++;
 	 if(explodeIndex > explodeLimit){
		explodeIndex = 0;
 	 }
     if(localCommand >= 0600 && localCommand < 0700){
    	//get the glyph, turn it into ascii, make it the Word:
    	if(currentTable[localCommand] != undefined){
    	 	currentWord = byteCode2string(currentTable[localCommand]);
    	}	
    }
     if((localCommand > 02000)&&(localCommand < 03000)){
    	roctalChar(localCommand - 02000);
    }
    if(localCommand >= 0040 && localCommand <= 0277){//shapes and fonts
		 drawGlyph(currentTable[localCommand]);    	    
    }
    if(localCommand >= 0400 && localCommand <= 0477){//manuscript glyphs
		 drawGlyph(currentTable[localCommand]);    	    
    }
    if(localCommand >= 01000 && localCommand <= 01377){//symbol glyphs
		 drawGlyph(currentTable[localCommand]);    	    
    }
 
    if(localCommand == 0300){
      x = x0;
      y = y0;
      theta = theta0;
      side = unit;
      thetaStep = Math.PI/2;
      scaleFactor = 2;
      ctx.lineWidth = 2;
      ctx.strokeStyle="black";
      ctx.fillStyle="black";
    }
    if(localCommand == 0304){
      thetaStep = Math.PI/2;
    }
    if(localCommand == 0305){
      thetaStep = 2*Math.PI/5;
    }
    if(localCommand == 0306){
      thetaStep = Math.PI/3;
    }    
    if(localCommand == 0310){
       scaleFactor = Math.sqrt(2); 
    }
    if(localCommand == 0311){
       scaleFactor = phi; //"golden" ratio 
    }
    if(localCommand == 0312){
       scaleFactor = Math.sqrt(3); 
    }
    if(localCommand == 0313){
      scaleFactor = 2;  //2x
    }
    if(localCommand == 0314){
      scaleFactor = 3;  //3x
    }
    if(localCommand == 0315){
      scaleFactor = 3.14159;  //pi*
    }    
    if(localCommand == 0316){
      scaleFactor = 5;  //5*
    }        
    if(localCommand == 0317){
       side = unit; 
    }
    if(localCommand == 0320){
		ctx.strokeStyle="black";
    	ctx.lineWidth = 2;    	
    	ctx.fillStyle = "black";
    }
    if(localCommand == 0321){
		ctx.strokeStyle = "yellow";
    	ctx.lineWidth = 2;    	
    	ctx.fillStyle = "yellow";
    }
    if(localCommand == 0322){
		ctx.strokeStyle="orange";
    	ctx.lineWidth = 2;
    	ctx.fillStyle = "orange";    
    }
    if(localCommand == 0323){
		ctx.strokeStyle="white";
    	ctx.lineWidth = 2;
    	ctx.fillStyle = "white";    
    }
    if(localCommand == 0324){
		ctx.strokeStyle="red";
    	ctx.lineWidth = 2;
    	ctx.fillStyle = "red";    
    }
    if(localCommand == 0325){
		ctx.strokeStyle="green";
    	ctx.lineWidth = 2;
    	ctx.fillStyle = "green";    
    }
    if(localCommand == 0326){
		ctx.strokeStyle="purple";
    	ctx.lineWidth = 2;
    	ctx.fillStyle = "purple";    
    }
    if(localCommand == 0327){
		ctx.strokeStyle="blue";
    	ctx.lineWidth = 2;
    	ctx.fillStyle = "blue";    
    }
    if(localCommand == 0330){
      x += side*Math.cos(theta);   
      y += side*Math.sin(theta); 
    }
    if(localCommand == 0331){
      x -= side*Math.cos(theta);   
      y -= side*Math.sin(theta); 
    }
    if(localCommand == 0332){
      x += side*Math.cos(theta - thetaStep);
      y += side*Math.sin(theta - thetaStep);
    }
    if(localCommand == 0333){
      x += side*Math.cos(theta + thetaStep);
      y += side*Math.sin(theta + thetaStep);
    }
    if(localCommand == 0334){
      theta -= thetaStep; // CCW
    }
    if(localCommand == 0335){
      theta += thetaStep; // CW
    }
    if(localCommand == 0336){
      side /= scaleFactor; // -
    }
    if(localCommand == 0337){
      side *= scaleFactor; // +
    }
    if(localCommand == 0340){  //point
		ctx.beginPath();
		ctx.arc(x, y, 3, 0, 2 * Math.PI);
		ctx.fill();	
		ctx.closePath();
		currentSVG += "<circle cx=\"";
		currentSVG += Math.round(x).toString();
		currentSVG += "\" cy = \"";
		currentSVG += Math.round(y).toString();
		currentSVG += "\" r = \"3\" stroke = \"black\" stroke-width = \"2\" ";
		currentSVG += "fill = \"black\" />\n";		
    }
    if(localCommand == 0341){  //circle
		ctx.beginPath();
		ctx.arc(x, y, side, 0, 2 * Math.PI);
		ctx.closePath();
		ctx.stroke();
		currentSVG += "    <circle cx=\"";
		currentSVG += Math.round(x).toString();
		currentSVG += "\" cy = \"";
		currentSVG += Math.round(y).toString();
		currentSVG += "\" r = \"" + side.toString() + "\" stroke = \"black\" stroke-width = \"2\" ";
		currentSVG += "fill = \"none\" />\n";		

    }
    if(localCommand == 0342){   //line
    	ctx.beginPath();
    	ctx.moveTo(x,y);
		ctx.lineTo(x + side*Math.cos(theta),y + side*Math.sin(theta));
		ctx.stroke();		
   		ctx.closePath();
   		
   		var x2 = Math.round(x + side*Math.cos(theta));
   		var y2 = Math.round(y + side*Math.sin(theta));
   		currentSVG += "    <line x1=\""+Math.round(x).toString()+"\" y1=\""+Math.round(y).toString()+"\" x2=\""+x2.toString()+"\" y2=\""+y2.toString()+"\" style=\"stroke:black;stroke-width:2\" />\n"

    }
    if(localCommand == 0343){
    	ctx.beginPath();
		ctx.arc(x, y, side, theta - thetaStep,theta + thetaStep);
		ctx.stroke();
		ctx.closePath();
		localString = "";
		localString += "  <path d=\"";	
		localString += "M";
		var localInt = x + side*Math.cos(theta - thetaStep);
		localString += localInt.toString();
		localString += " ";
		localInt = y + side*Math.sin(theta - thetaStep);
		localString += localInt.toString();
		currentSVG += localString;
		localString = "           A" + side.toString() + " " + side.toString() + " 0 0 1 ";
		localInt = x + side*Math.cos(theta + thetaStep);
		localString += localInt.toString() + " ";
		localInt = y + side*Math.sin(theta + thetaStep);
		localString += localInt.toString() + "\" fill = \"none\" stroke = \"black\" stroke-width = \"2\" />\n";
		currentSVG += localString;

    }
    if(localCommand == 0344){   //part of a poly line or path 
		ctx.lineTo(x + side*Math.cos(theta),y + side*Math.sin(theta));
		ctx.stroke();		

   		var x2 = Math.round(x + side*Math.cos(theta));
   		var y2 = Math.round(y + side*Math.sin(theta));
   		currentSVG += "L" + x2 + " " + y2 + " ";

    }
    if(localCommand == 0345){  //arc
		ctx.arc(x, y, side, theta - thetaStep,theta + thetaStep);
		ctx.stroke();
    }
    if(localCommand == 0346){  //arc, reverse direction
		ctx.arc(x, y, side, theta + thetaStep,theta - thetaStep,true);
		ctx.stroke();
    }
    if(localCommand == 0347){  //filled circle
		ctx.beginPath();
		ctx.arc(x, y, side, 0, 2 * Math.PI);
		ctx.closePath();
		ctx.stroke();
		ctx.fill();
		currentSVG += "    <circle cx=\"";
		currentSVG += Math.round(x).toString();
		currentSVG += "\" cy = \"";
		currentSVG += Math.round(y).toString();
		currentSVG += "\" r = \"" + side.toString() + "\" stroke = \"black\" stroke-width = \"2\" ";
		currentSVG += "fill = \"black\" />\n";		

	}


    if(localCommand == 0350){
      thetaStep /= 2;  //angle/2
    }
    if(localCommand == 0351){
      thetaStep *= 2;  //2angle
    }
    if(localCommand == 0352){
      thetaStep /= 3; //angle/3
    }
    if(localCommand == 0353){
      thetaStep *= 3; //3angle
    }

    if(localCommand == 0362){
	   ctx.beginPath();
	   ctx.moveTo(x,y);
	   currentSVG += "	<path d = \"M";
	   currentSVG += Math.round(x).toString() + " ";
	   currentSVG += Math.round(y).toString() + " ";

//	   currentSVG += "  <polyline points=\"";		

    }
    if(localCommand == 0363){
	   ctx.closePath();
	   ctx.stroke();		
	   ctx.fill();		
	   currentSVG += "Z\""+ " stroke = \"black\" stroke-width = \"2\" fill = \"none\" "+"/>";
	   
	   
    }

    if(localCommand == 0365){
        ctx.font=side.toString(8) + "px " + myFont;
		ctx.fillText(currentWord,x,y);
		currentSVG += "    <text x=\"";
		currentSVG += Math.round(x).toString();
		currentSVG += "\" y = \"";
		currentSVG += Math.round(y).toString();
		currentSVG += "\" fill = \"black\""; 
		currentSVG += " font-size = \"";
		currentSVG += side + "px\"";
		currentSVG += " font-family = \"futura\"";
		currentSVG += ">";
		currentSVG += currentWord;
		currentSVG += "</text>\n";	
    }
	if(localCommand == 0366){
		ctx.beginPath();
		ctx.moveTo(Math.round(x),Math.round(y));
		cpx1 = Math.round(x + side*Math.cos(theta));
		cpy1 = Math.round(y + side*Math.sin(theta));
		currentSVG += "<path    d = \"M";
		currentSVG += (Math.round(x)).toString() + ",";
		currentSVG += (Math.round(y)).toString() + " C";
		currentSVG += cpx1.toString() + "," + cpy1.toString() + " ";
		
//<path  d="M100,200 C150,150 200,150 250,200" />
	}
	if(localCommand == 0367){
		x2 = Math.round(x);
		y2 = Math.round(y);
		cpx2 = Math.round(x + side*Math.cos(theta));
		cpy2 = Math.round(y + side*Math.sin(theta));
		ctx.bezierCurveTo(cpx1,cpy1,cpx2,cpy2,x2,y2);
		ctx.stroke();
		currentSVG += cpx2.toString() + "," + cpy2.toString() + " ";
		currentSVG += x2.toString() + "," + y2.toString() + "\" fill = \"none\" stroke-width = \"2\" stroke = \"black\" />";		
	}
// stroke = "black" stroke-width = "2"
}

function localRoot(localCommand){//010 octal  = 8 decimal = delete as per ASCII spec
//	localCommand = parseInt(localCommand,8);

	if(localCommand == 010){
		currentGlyphArray = currentGlyph.split(",");
		
		firstHalf = "";
		secondHalf = "";	
		for(var index = 0;index < cursorPosition - 1;index++){
			firstHalf += currentGlyphArray[index] + ",";
		}
		for(var index = cursorPosition;index < currentGlyphArray.length;index++){
			secondHalf += currentGlyphArray[index] + ",";
		}				
		currentGlyph = firstHalf + secondHalf;
		if(cursorPosition > 0){
			cursorPosition--;
		}
		currentGlyph = commaCleaner(currentGlyph);

		redraw();
	}

	if(localCommand == 0020){//cursor forward
		cursorPosition--;
		if(cursorPosition < 0){
			cursorPosition = currentGlyphArray.length;			
		}

		redraw();
	}
	if(localCommand == 0021){//cursor back
		cursorPosition++;
		if(cursorPosition > currentGlyphArray.length ){
			cursorPosition = 0;
		}
		redraw();
	}	
	if(localCommand == 0022){//move to previous glyph in table
		currentGlyph = document.getElementById("glyphBytecode").value;
		currentGlyph = commaCleaner(currentGlyph);
		currentTable[currentAddress] = currentGlyph;
		currentAddress--;
		currentGlyph = currentTable[currentAddress];
		currentGlyphArray = currentGlyph.split(",");
		cursorPosition = currentGlyphArray.length;
		redraw();
	}
	if(localCommand == 0023){//move to next glyph in table
		currentGlyph = document.getElementById("glyphBytecode").value;
		currentGlyph = commaCleaner(currentGlyph);
		currentTable[currentAddress] = currentGlyph;
		currentAddress++;
		currentGlyph = currentTable[currentAddress];
		currentGlyphArray = currentGlyph.split(",");
		cursorPosition = currentGlyphArray.length;
		redraw();

	}	
	if(localCommand == 0024){//from action to symbol
		if(currentAddress < 01000 && currentAddress > 0){
			currentAddress += 01000;
			currentGlyph = currentTable[currentAddress];

		}
		currentGlyphArray = currentGlyph.split(",");
		cursorPosition = currentGlyphArray.length;
		redraw();

	}	
	if(localCommand == 0025){//from symbol to action
		if(currentAddress > 01000 && currentAddress < 02000){
			currentAddress -= 01000;
			currentGlyph = currentTable[currentAddress];
		}
		currentGlyphArray = currentGlyph.split(",");
		cursorPosition = currentGlyphArray.length;
		redraw();
	}
	
	if(localCommand == 0026){//import full geometron hypercube
		var localString = document.getElementById("mainTextArea").value;
		var inputStack = localString.split("\n");
		for(var index = 0;index < inputStack.length;index++){
			var stackLine = inputStack[index].split(":");
			var localAddress = parseInt(stackLine[0],8);
			var localGlyph = stackLine[1];
			currentTable[localAddress] = localGlyph;
		}
		currentGlyph = currentTable[currentAddress];
		currentGlyphArray = currentGlyph.split(",");
		cursorPosition = currentGlyphArray.length;
		redraw();

	}
	if(localCommand == 0027){//export full geometron hypercube
		var localString = "";
		for(var index = 0;index < currentTable.length;index++){
			localString += "0" + index.toString(8) + ":" + currentTable[index] + "\n";
		}
		document.getElementById("mainTextArea").value = localString;
	}
	if(localCommand == 030){
		if(document.getElementById("glyphTableEditor").style.display != "none"){
			document.getElementById("glyphTableEditor").style.display = "none";
		}else{
			document.getElementById("glyphTableEditor").style.display = "block";
		}
	}
	if(localCommand == 031){//export SVG
		currentSVG = "";
		x0 = 200;
		y0 = 200;
		unit = 100;
		ctx = document.getElementById("invisibleCanvas").getContext("2d");
		doTheThing(0300);		
		drawGlyph(currentGlyph);

		var localString= "<svg width=\"400\" height=\"400\" viewbox = \"0 0 400 400\"  xmlns=\"http://www.w3.org/2000/svg\" style = \"border:solid;\">\n";		
		localString += currentSVG;
		localString += "</svg>";
		document.getElementById("mainTextArea").value = localString;
	}

}

</script>

<style>
html {
	height: 100%;
	background: black;
}

.atom{
	width: auto;
	height: auto;
	border-style: solid;
	border-width: 6px;
	border-color: purple;
	border-radius: 25px;
	padding: 10px 10px 10px 10px;
	margin: 10px 10px 10px 10px;
	background: white;	
	font-size: 16px;
	font-family: "Century Schoolbook";
	text-align: left;
	float:left;
}
#spellDiv{
	width: 600px;
	height: auto;
	border-style: solid;
	border-width: 6px;
	border-color: purple;
	border-radius: 25px;
	padding: 15px 15px 15px 15px;
	margin: 10px 10px 10px 10px;
	background: white;	
	float:left;
	overflow: scroll;
}

#plotCanvas{
	border-style: solid;
	border-width: 1px;
	border-color: black;
	border-radius: 5px;

}
.glyphButtons{
    border-style: solid;
    border-width: 0px;
    border-color: black;
    background: white;	
}
.glyphButtons:hover{
    background: gray;	

}
.glyphButtons:active{
    background: yellow;	
}
#glyphTableEditor{
	background: gray;	
}

td{
	padding: 15px 15px 15px 15px;
	margin: 10px 10px 10px 10px;

}
</style>
</center>
</body>
</html>	

Step 2: Open the Editor, Move the Cursor Around

Picture of Open the Editor, Move the Cursor Around

With the html file saved somewhere on your computer that's easy to find, double click on the icon for it, which should open it in your default browser.

What you should see is what is in the screenshot included here. It's complicated. But you only need a very small fraction right now to get started. What you need is to be able to move the cursor, and draw things. For this step, just look at the control panel in the far left of the panel with all the funny symbols, as shown in the screenshot with the arrows. Move your pointer over that and click on the buttons to see what they do.

Start with the arrows, and note that this is a discrete motion: up, down, left and right, always the same distance. Now click on "+" and "-" and see what that does. Then rotate with the rotation arrows, try them all, then click the middle button to reset back to where you started, and play around some more to get the feel for it. To restart, just reload the page in your browser with control-R(PC) or command-R(mac). None of this requires an Internet connection.

When you are comfortable with the cursor, reload the browser again and move to the next step. If the whole thing won't load initially make sure you didn't accidentally either leave something out or copy/paste too much in the previous step.

Step 3: Draw Your Art

Picture of Draw Your Art

The equivalent of "hello, world" for a purely geometry-based language is to draw a pair of points and circles, the so-called vesica piscis, a common figure in classical geometry which is also used often in modern design. To draw this, click the point button which is denoted by a point, then the circle button denoted by a circle(see screenshots). Then hit one of the four movement arrows(up, down, left or right, doesn't matter which), and repeat this process. You should now see the figure shown.

This is simple enough that if you don't like what you see, just control-R(PC) or command-R(mac) again to reload and try again. Try some other shapes as well if you want. No harm can come from clicking random buttons, all you are doing is editing information in the front end of your browser--nothing on your hard drive or on the real Internet is being affected by your actions.

You drew a thing! But this is still not quite useful, we still need to export the information.

Step 4: Export SVG, Save File

Picture of Export SVG, Save File

When you like what you see on the screen(it has circles on it), click the export to SVG button, which is an arrow pointing to the letters "SVG" as shown in the screenshot here. When you click that button, the text area in the lower right should suddenly be populated with code.

Now highlight all the code that you see, as shown in the screen shot, and paste it into an empty file in a text editor. Save this file as something like "test.svg". The editor might ask you if you are sure you want to add the ".svg" at the end, and make sure that you do, and that you don't accidentally save it as a ".txt". When this is done the file should appear as shown in the icon here, with a preview of the final file.

Step 5: Open the Svg in Other Software

Picture of Open the Svg in Other Software

Now that you have an svg, you can open it in your browser to look at it, or edit it with Illustrator or Inkscape(basically a free Illustrator), and import it into the newer versions of Microsoft Office. So that's basically it! With the ability to make an svg file, you can integrate art made in Geometron into existing workflows.

Step 6:

Picture of

Step 7: Share Code

Picture of Share Code

The series of numbers you see near the graphical code are the addresses of those geometry actions, and they can by copied and pasted. The field with those numbers in it can be both written to and copied from. Try copying the following into the text field and hitting "enter":

0310,0336,0336,0336,0313,0331,0332,0335,0306,0337,0341,0201,0341,0334,0201,0341,0334,0201,0341,0334,0201,0341,0334,0201,0341,0334,0201,0334,0334,0330,0341,0337,0341,

Whatever you make yourself should change the code in this window, and if you copy it to your clipboard you can share it wherever you want. You could send it in a chat window, post it here, or save it to a text file. That is the save method in this editor: you export the string with the numbers in it and save it.

This is the first of many tutorials of this kind.

Comments

About This Instructable

137views

4favorites

Bio: I'm an applied physicist by training(phd Yale 2006, BA Berkeley 1998, math and physics), and have done physics research in the federal government ... More »
More by lafelabs:Bezier Paths in GeometronUsing Words in GeometronGeometron Shape Table Edit
Add instructable to: