[
  {
    "path": ".gitignore",
    "content": "# Created by .ignore support plugin (hsz.mobi)\n### Example user template template\n### Example user template\n\n# IntelliJ project files\n.idea\n*.iml\nout\ngen\n.time2code-faas-cli-minikube.yml\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "## Contributing\n\n### Guidelines\n\nHere are a few guidelines for contributing:\n\n* If you have found a bug please raise an issue and fill out the whole template.\n* Don't raise PRs for typos, these aren't necessary - just raise an Issue\n* If you would like to contribute to the codebase please raise an issue to propose the change and fill out the whole template.\n* If the documentation can be improved / translated etc please raise an issue to discuss. \n\n* Please always provide a summary of what you changed, how you did it and how it can be tested.\n\n### Community\n\nThis project is written in mostly HTML and Javascript on the frontend, Python-Flask for serving the WebIDE Pages, and Python for the code execution management on the OpenFaaS framework.  If you'd like to help in any way then that would be more than welcome whatever your level of experience.\n\n### License\n\nThis project is licensed under the MIT License.\n\n#### Sign your work\n\nThe sign-off is a simple line at the end of the explanation for a patch. Your\nsignature certifies that you wrote the patch or otherwise have the right to pass\nit on as an open-source patch. The rules are pretty simple: if you can certify\nthe below (from [developercertificate.org](http://developercertificate.org/)):\n\n```\nDeveloper Certificate of Origin\nVersion 1.1\n\nCopyright (C) 2004, 2006 The Linux Foundation and its contributors.\n1 Letterman Drive\nSuite D4700\nSan Francisco, CA, 94129\n\nEveryone is permitted to copy and distribute verbatim copies of this\nlicense document, but changing it is not allowed.\n\nDeveloper's Certificate of Origin 1.1\n\nBy making a contribution to this project, I certify that:\n\n(a) The contribution was created in whole or in part by me and I\n    have the right to submit it under the open source license\n    indicated in the file; or\n\n(b) The contribution is based upon previous work that, to the best\n    of my knowledge, is covered under an appropriate open source\n    license and I have the right under that license to submit that\n    work with modifications, whether created in whole or in part\n    by me, under the same open source license (unless I am\n    permitted to submit under a different license), as indicated\n    in the file; or\n\n(c) The contribution was provided directly to me by some other\n    person who certified (a), (b) or (c) and I have not modified\n    it.\n\n(d) I understand and agree that this project and the contribution\n    are public and that a record of the contribution (including all\n    personal information I submit with it, including my sign-off) is\n    maintained indefinitely and may be redistributed consistent with\n    this project or the open source license(s) involved.\n```\n\nThen you just add a line to every git commit message:\n\n    Signed-off-by: Joe Smith <joe.smith@email.com>\n\nUse your real name (sorry, no pseudonyms or anonymous contributions.)\n\nIf you set your `user.name` and `user.email` git configs, you can sign your\ncommit automatically with `git commit -s`.\n\n* Please sign your commits with `git commit -s` so that commits are traceable."
  },
  {
    "path": "Dockerfile",
    "content": "FROM alpine\n\nRUN apk add -Uuv --no-cache python3 \\\n    && apk upgrade -v --available --no-cache \\\n    && apk add ca-certificates && pip3 install --no-cache-dir --upgrade pip setuptools wheel \\\n    && pip3 install requests flask markdown\n\n# ADD https://github.com/alexellis/faas/releases/download/0.6.15/fwatchdog /usr/bin\nADD https://github.com/openfaas-incubator/of-watchdog/releases/download/0.2.1/of-watchdog /usr/bin/fwatchdog\n\n\nRUN chmod +x /usr/bin/fwatchdog\n\nWORKDIR /root/\n\n# COPY ide.py .\nCOPY ide_server.py .\nCOPY handler.py .\nCOPY templates ./templates\n\nENV fprocess=\"python3 handler.py\"\nENV cgi_headers=\"true\"\nENV cgi_body=\"true\"\nENV mode=\"serializing\"\nENV content_type=\"text/html\"\n\nHEALTHCHECK --interval=1s CMD [ -e /tmp/.lock ] || exit 1\n\nCMD [\"fwatchdog\"]"
  },
  {
    "path": "Dockerfile.nofaas",
    "content": "FROM alpine\n\nRUN apk add -Uuv --no-cache python3 \\\n    && apk upgrade -v --available --no-cache \\\n    && apk add ca-certificates && pip3 install --no-cache-dir --upgrade pip setuptools wheel \\\n    && pip3 install requests flask markdown pymdown.extensions Pygments\n\nWORKDIR /root/\n\nCOPY static ./static\nCOPY ide-server.py .\nCOPY templates ./templates\n\nEXPOSE 5555\n\nCMD [\"python3\", \"ide-server.py\"]"
  },
  {
    "path": "FortranSample.md",
    "content": "# Test out your code\n\n## Random instructions\n\nLike any programming language, we need to start with Hello World. Click the code\n\n```fortran\nprogram hello\n   Print *, \"Hello World!\"\nend program Hello\n```\n\nThen click the `RUN IT` button at the bottom navigation bar.\n\nWait a sec...\n\ndot dot dot\n\nand your code is complete.\n\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2017 Kristopher Jock Reed\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "QuickCodeTutorial.md",
    "content": "## Code Tutorial\n\nThis is a quick tutorial to highlight the tutorial page feature of Time2Code.  It is generated from MarkDown pages on GitHub.\n\nI will do a few quick HTTP Request code examples you can try in a few languages.\n\n### Golang\n\nSelect the Golang code language from the menu button on the bottom navbar.\n\n![](https://raw.githubusercontent.com/JockDaRock/Time2Code/master/images/lang_sel.png)\n\nThen enter the Code below in the **IDE** on the **right**.\n\n```golang\npackage main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io/ioutil\"\n)\n\nfunc main() {\n\n\turl := \"http://api.open-notify.org/iss-now.json\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"cache-control\", \"no-cache\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := ioutil.ReadAll(res.Body)\n\n\tfmt.Println(res)\n\tfmt.Println(string(body))\n\n}\n```\nClick the **RUN IT** button and watch as your code is executed quickly.\n\nClick the **CLEAR TERM** button once you are done and Repeat the same steps as above for the NodeJS and Python examples.\n\n**AND Dont forget to select the appropriate code langauge when running the different code snippets.**\n\n### NodeJS\n\n```node\nvar request = require(\"request\");\n\nvar options = { method: 'GET',\n  url: 'http://api.open-notify.org/iss-now.json',\n  headers: { 'cache-control': 'no-cache' } };\n\nrequest(options, function (error, response, body) {\n  if (error) throw new Error(error);\n\n  console.log(body);\n});\n```\n\n### Python\n\n\n```python\nimport requests\n\nurl = \"http://api.open-notify.org/iss-now.json\"\n\nr = requests.get(url)\n\nprint(r.text)\n```\n<br>\n<br>\n<br>\n<br>\n<br>\n<br>\n<br>\n<br>\n<br>\n<br>\n<br>\n<br>\n<br>\n<br>\n"
  },
  {
    "path": "QuickCodeTutorial_PWK.md",
    "content": "## Code Tutorial\n\nThis is a quick tutorial to highlight the tutorial page feature of Time2Code.  It is generated from MarkDown pages on GitHub.\n\nI will do a few quick HTTP Request code examples you can try in a few languages.\n\nIf you are viewing this on GitHub you will need to get Time2Code started before you can do anything else.\n\nFirst click the **Try in PWD** Button.\n\n[![Try in PWD](https://cdn.rawgit.com/play-with-docker/stacks/cff22438/assets/images/button.png)](http://play-with-docker.com?stack=https://raw.githubusercontent.com/JockDaRock/Time2Code/master/time2code-swarm-deploy.yml&stack_name=time2code)\n\nOnce Time2Code is started up click the 5555 tab at the top of the Play-With-Docker site.\n\n![](https://raw.githubusercontent.com/JockDaRock/Time2Code/master/images/PWD-5555.png)\n\nAdd `/tutorial?tut=https://github.com/JockDaRock/Time2Code/blob/master/QuickCodeTutorial.md` to the URL in the browser.\n\nContinue with the instructions below...\n\n### Golang\n\nSelect the Golang code language from the menu button on the bottom navbar.\n\n![](https://raw.githubusercontent.com/JockDaRock/Time2Code/master/images/lang_sel.png)\n\nThen enter the Code below in the **IDE** on the **right**.\n\n```Golang\npackage main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"io/ioutil\"\n)\n\nfunc main() {\n\n\turl := \"http://api.open-notify.org/iss-now.json\"\n\n\treq, _ := http.NewRequest(\"GET\", url, nil)\n\n\treq.Header.Add(\"cache-control\", \"no-cache\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\n\tdefer res.Body.Close()\n\tbody, _ := ioutil.ReadAll(res.Body)\n\n\tfmt.Println(res)\n\tfmt.Println(string(body))\n\n}\n```\nClick the **RUN IT** button and watch as your code is executed quickly.\n\nClick the **CLEAR TERM** button once you are done and Repeat the same steps as above for the NodeJS and Python examples.\n\n**AND Dont forget to select the appropriate code language when running the different code snippets.**\n\n### NodeJS\n\n```NodeJS\nvar request = require(\"request\");\n\nvar options = { method: 'GET',\n  url: 'http://api.open-notify.org/iss-now.json',\n  headers: { 'cache-control': 'no-cache' } };\n\nrequest(options, function (error, response, body) {\n  if (error) throw new Error(error);\n\n  console.log(body);\n});\n```\n\n### Python\n\n\n```Python\nimport requests\n\nurl = \"http://api.open-notify.org/iss-now.json\"\n\nr = requests.get(url)\n\nprint(r.text)\n```\n<br>\n<br>\n<br>\n<br>\n<br>\n<br>\n<br>\n<br>\n<br>\n<br>\n<br>\n<br>\n<br>\n<br>\n"
  },
  {
    "path": "README.md",
    "content": "# Time2Code\nA portable, scalable web based code editor to integrate into your code learning experiences.\n\nThe goal is to make deploying your own web based code editor easier and more fun.\n\n![](/images/code_gif.gif)\n\n## Tech Overview\n* The Code execution backend is built off of the serverless [FaaS](http://docs.get-faas.com/) Framework for scalability and ability to support many languages.  Support for [k8s](https://kubernetes.io/) is ready through [faas-netes](https://github.com/alexellis/faas-netes) and appears to be working well.\n\n* UI Modelled after the wonderful [Play-with-Moby Site](http://play-with-moby.com) and the wonderful work the guys at [Play-With-Docker](https://github.com/play-with-docker/play-with-docker) do to make our Docker Learning Experiences Better.\n\n* Function handling and code execution are being handled by Python processes.  Python handles the STDIN of all of the function requests and then passes it to the desired language for interpretation and execution or compilation and execution.\n\n* Web site is being driven by the [Flask](http://flask.pocoo.org/) Framework\n\n* Code editor is built from [Ace Editor](https://ace.c9.io/) project.\n\n* Terminal is built from [XTermJS](https://xtermjs.org/).\n\n## Up and Running\n\n### Docker Swarm\n\nThe following snippet will initialize your swarm, Time2Code, FaaS and Time2code functions.\n\n```sh\n$ docker swarm init --advertise-addr eth0 && \\\n  git clone https://github.com/JockDaRock/Time2Code && \\\n  cd Time2Code && \\\n  bash time2deploy.sh && \\\n  docker service ls\n```\n\nIf you are on your laptop navigate to http://127.0.0.1:5555 and start coding.\n\n### Kubernetes - minikube\n\n> Note: Revisiting this and revamping kubernetes deployment...\n\nYou will need to have [minikube installed](https://kubernetes.io/docs/tasks/tools/install-minikube/) before you begin.\n\nType the following snippets will get minikube started and faas-netes loaded into the kube cluster.\n\n`$ git clone https://github.com/JockDaRock/Time2Code`\n\n`$ minikube start` or `$ minikube start --vm-driver=xhyve`\n\nThen run the following bash script to load FaaS and Time2Code...\n\n`$ bash ./minikube.sh'\n\nOnce the script is complete it will provide you with the url, like this http://192.168.99.100:31114/, to reach the Time2Code web editor.  **BEFORE** you start using it, you will need to deploy the code execution functions after the FaaS services have started.  It might take a minute or two for all of the necessary Kube pods to be Running.  Keep checking the pods with `kubectl get pods`.  \n\nTo deploy the functions use the following command in your terminal.\n\n`$ faas-cli -action deploy -f ./time2code-faas-cli-minikube.yml`\n\nOnce the kube pods for the code execution are running you can get to coding :)!\n\n![](images/python_sample0.png)\n\n## Latest News\n\n[Time2Code: Functions as Service and Code as a Function](https://medium.com/@JockDaRock/time2code-functions-as-service-and-code-as-a-function-3d9125fc49fb)\n\nMore to come...\n\n\n\n## Coding Languages Currently Supported\n\n* Python, Golang, Powershell, NodeJS, ... more coming very soon.\n\n* Currently working on... I am currently working C# code execution. Most of my tests are running well, but need to iron out some necessary dependencies and other issues.\n\n#### Repos for language specific code execution handlers\n* [Python](https://github.com/JockDaRock/Time2Py)\n* [Golang](https://github.com/JockDaRock/Time2Go)\n* [NodeJS](https://github.com/JockDaRock/Time2NodeJS)\n* [Powershell](https://github.com/JockDaRock/Time2Powershell) (WIP)\n* [C#](https://github.com/JockDaRock/Time2CSharp) (WIP)\n* Fortran\n\n\n## Roadmap and Contributing\n\nCurrently in progress:\n\n* Adding markdown and instruction functionality to accompany code execution. - check and check\n\n* Add language dependency builder for code execution functions.\n\n* Kubernetes Support - check and check\n\nTime2Code is written mostly in HTML and Javascript on the FrontEnd, Python and Flask to handle the WebIDE pages, and Python on the backend to handle code language execution on the OpenFaaS framework. This project is MIT licensed - contributions are welcomed whether that means providing feedback, testing existing and new features or hacking on the source. This project is still in early stages so I need people to generally try functionality and provide feedback. I need help building new code execution handlers for different languages or suggestions for languages to add. I also need help reducing the image sizes for the Microsoft languages handlers ([Powershell](https://github.com/JockDaRock/Time2Powershell) and [C#](https://github.com/JockDaRock/Time2CSharp)).\n\n"
  },
  {
    "path": "Sample.md",
    "content": "# Test out your code\n\n## Random instructions\n\nStick this code in the right panel.\n\n```python\nimport requests\n\nurl = \"https://httpbin.org/get\"\n\nr = requests.get(url)\n\nprint(r.status_code)\nprint(r.headers)\nprint(r.text)\n```\n\nThen click the `RUN IT` button at the bottom navigation bar.\n\nWait a sec...\n\ndot dot dot\n\nand the your code complete.\n\n"
  },
  {
    "path": "code.txt",
    "content": "import requests\nimport json\n\nurl = \"https://sandboxapicem.cisco.com/api/v1/ticket\"\n\npayload = {\"username\": \"devnetuser\", \"password\": \"Cisco123!\"}\ndata = json.dumps(payload)\nprint(data)\nheaders = {\"content-type\": \"application/json\"}\n\nresponse = requests.post(url, data=data, headers=headers, verify=False)\n\nprint(response.text)"
  },
  {
    "path": "deploy_pwk.sh",
    "content": "#!/bin/sh\n\nyum update -y && yum install -y git\n\nkubeadm init --apiserver-advertise-address $(hostname -i) && \\\nkubectl apply -n kube-system -f \"https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\\n')\"\n\ncd /root/\ngit clone https://github.com/alexellis/faas-netes.git \\\n && cd faas-netes && kubectl apply -f faas.yml,rbac.yml,monitoring.yml\n\ncd /root/\ncurl -sSL cli.get-faas.com | sh\ngit clone https://github.com/JockDaRock/Time2Code.git \\\n&& cd Time2Code && git checkout dev\nfaas-cli -action deploy -f ~/Time2Code/time2code-faas-cli-functions.yml\n"
  },
  {
    "path": "docker-compose.yml",
    "content": "version: \"3.0\"\nservices:\n  time2codeserver:\n    build:\n      context: .\n      dockerfile: Dockerfile.nofaas\n    image: jockdarock/time2codeserver:latest\n    networks:\n      - time2net\n    ports:\n      - \"5555:5555\"\nnetworks:\n    time2net:\n        driver: overlay"
  },
  {
    "path": "handler.py",
    "content": "#!/usr/bin/python\nfrom wsgiref.handlers import CGIHandler\nimport os\nfrom ide_server import app\n\nquery_params = os.getenv(\"Http_Query\", default=\"\")\nwhole_path = os.getenv(\"Http_Path\", default=\"/ip\")\nsplit_path = whole_path.split('/')\nif len(split_path) > 3:\n    route_path = '/' + '/'.join(split_path[3:])\nelse:\n    route_path = \"/\"\nhttp_method = os.getenv(\"Http_Method\", default=\"GET\")\n\n\nclass ProxyFix(object):\n    def __init__(self, app):\n        self.app = app\n\n    def __call__(self, environ, start_response):\n        environ['SERVER_NAME'] = \"127.0.0.1\"\n        environ['SERVER_PORT'] = \"8080\"\n        environ['REQUEST_METHOD'] = http_method\n        environ['SCRIPT_NAME'] = \"\"\n        environ['PATH_INFO'] = route_path\n        environ['QUERY_STRING'] = query_params\n        environ['SERVER_PROTOCOL'] = \"HTTP/1.1\"\n        environ['Http_X_Forwarded_For'] = os.getenv(\"Http_X_Forwarded_For\", \"127.0.0.1\")\n        return self.app(environ, start_response)\n\n\nclass HeaderRewriterFix(object):\n\n    def __init__(self, app, remove_headers=None, add_headers=None):\n        self.app = app\n        self.remove_headers = set(x.lower() for x in (remove_headers or ()))\n        self.add_headers = list(add_headers or ())\n\n    def __call__(self, environ, start_response):\n        def rewriting_start_response(status, headers, exc_info=None):\n            new_headers = []\n            return start_response(status, new_headers, exc_info)\n        return self.app(environ, rewriting_start_response)\n\nif __name__ == '__main__':\n    app.wsgi_app = ProxyFix(app.wsgi_app)\n    app.wsgi_app = HeaderRewriterFix(app.wsgi_app, remove_headers=['Status'])\n    CGIHandler().run(app)\n"
  },
  {
    "path": "ide-server.py",
    "content": "from flask import Flask, request, render_template, Markup\nimport requests\nfrom urllib.parse import urlparse\nimport markdown\nimport os\nimport subprocess\nimport socket\n\n\napp = Flask(__name__)\n\ntry:\n    # Looking for the IP address on the K8s\n    faas = \"faas-netesd.default\"\n    ip = socket.getaddrinfo(faas, 0, 0, 0, 0)\n    faas_port = 8080\n    swarm_tag = \"\"\nexcept Exception:\n    # finds Docker swarm host IP upon no K8s\n    p1 = subprocess.Popen([\"/sbin/ip\", \"route\"], stdout=subprocess.PIPE)\n    p2 = subprocess.Popen([\"awk\", \"/default/ { print $3 }\"], stdin=p1.stdout, stdout=subprocess.PIPE)\n    faas = (p2.stdout).read().decode(\"utf-8\").replace(\"\\n\", \"\")\n    faas_port = 8080\n    swarm_tag = \"time2code_\"\n\n\n@app.route('/')\ndef time2code():\n    text = request.args.get('code')\n    lang = request.args.get('lang')\n    straight_text = request.args.get('straight_text')\n    code_text = \"\"\n\n    if text:\n        r_text = requests.get(text + \"?raw=true\")\n        code_text = r_text.text\n    elif straight_text:\n        code_text = straight_text\n    else:\n        code_text = \"\"\n\n    if lang:\n        code_lang = lang\n    else:\n        code_lang = \"python3\"\n\n    return render_template('index-panel.html', code_text=code_text, code_lang=code_lang)\n\n\n@app.route('/code', methods=['POST'])\ndef code():\n    if request.method == 'POST':\n        data = request.data\n        lang = request.args.get('lang')\n        hosturl = urlparse(request.url)\n        host = hosturl.hostname\n        # url = \"http://%s:%s/function/time2py\" % host\n        url = \"http://%s:%s/function/%s%s\" % (faas, faas_port, swarm_tag, lang)\n        # print(url)\n        headers = {\"Content-Type\": \"text/plain\"}\n\n        code_exec = requests.post(url, data=data, headers=headers)\n\n        resp = code_exec.text\n\n        # print(resp)\n\n        return resp\n\n\n@app.route('/tutorial')\ndef tutorial():\n    text = request.args.get('code')\n    lang = request.args.get('lang')\n    straight_text = request.args.get('straight_text')\n    get_tut = request.args.get('tut')\n    code_text = \"\"\n    tut_url = \"\"\n    mark = \"\"\n\n    if get_tut:\n        tut_url = get_tut + \"?raw=true\"\n        r_tut = requests.get(tut_url)\n        mark = r_tut.text\n    else:\n        tut_url = \"https://raw.githubusercontent.com/JockDaRock/Time2Code/master/Sample.md?raw=true\"\n        r_tut = requests.get(tut_url)\n        mark = r_tut.text\n\n    if text:\n        r_text = requests.get(text + \"?raw=true\")\n        code_text = r_text.text\n    elif straight_text:\n        code_text = straight_text\n\n    if lang:\n        code_lang = lang\n    else:\n        code_lang = \"python3\"\n\n    content = Markup(markdown.markdown(mark, extensions=['pymdownx.github', 'pymdownx.highlight']))\n    return render_template('index-tut.html', markdown=content, code_text=code_text, code_lang=code_lang)\n\n\nif __name__ == '__main__':\n    app.run(host=\"0.0.0.0\", port=5555, debug=True)\n\n"
  },
  {
    "path": "ide.py",
    "content": "from flask import Flask, request, render_template, Markup\nimport requests\nfrom urllib.parse import urlparse\nimport markdown\nfrom wsgiref.handlers import CGIHandler\n\napp = Flask(__name__)\n\n\n@app.route('/')\ndef time2code():\n    url = \"https://raw.githubusercontent.com/JockDaRock/Time2Code/master/Sample.md\"\n    r = requests.get(url)\n    mark = r.text\n\n    content = Markup(markdown.markdown(mark))\n    return render_template('index-panel.html', markd=content)\n\n\nclass ProxyFix(object):\n    def __init__(self, app):\n        self.app = app\n\n    def __call__(self, environ, start_response):\n        environ['SERVER_NAME'] = \"localhost\"\n        environ['SERVER_PORT'] = \"8080\"\n        environ['REQUEST_METHOD'] = \"GET\"\n        environ['SCRIPT_NAME'] = \"\"\n        environ['PATH_INFO'] = \"/\"\n        environ['QUERY_STRING'] = \"\"\n        environ['SERVER_PROTOCOL'] = \"HTTP/1.1\"\n        return self.app(environ, start_response)\n\nif __name__ == '__main__':\n    app.wsgi_app = ProxyFix(app.wsgi_app)\n    CGIHandler().run(app)\n"
  },
  {
    "path": "ide_server.py",
    "content": "from flask import Flask, request, render_template, Markup\nimport requests\nfrom urllib.parse import urlparse\nimport markdown\nimport os\nimport subprocess\nimport socket\n\n\napp = Flask(__name__)\n\n\n@app.route('/')\ndef time2code():\n    text = request.args.get('code')\n    lang = request.args.get('lang')\n    straight_text = request.args.get('straight_text')\n    code_text = \"\"\n\n    if text:\n        r_text = requests.get(text + \"?raw=true\")\n        code_text = r_text.text\n    elif straight_text:\n        code_text = straight_text\n    else:\n        code_text = \"\"\n\n    if lang:\n        code_lang = lang\n    else:\n        code_lang = \"python3\"\n\n    return render_template('index.html', code_text=code_text, code_lang=code_lang)\n\n\n@app.route('/tutorial')\ndef tutorial():\n    text = request.args.get('code')\n    lang = request.args.get('lang')\n    straight_text = request.args.get('straight_text')\n    get_tut = request.args.get('tut')\n    code_text = \"\"\n    tut_url = \"\"\n    mark = \"\"\n\n    if get_tut:\n        tut_url = get_tut + \"?raw=true\"\n        r_tut = requests.get(tut_url)\n        mark = r_tut.text\n    else:\n        tut_url = \"https://raw.githubusercontent.com/JockDaRock/Time2Code/master/Sample.md?raw=true\"\n        r_tut = requests.get(tut_url)\n        mark = r_tut.text\n\n    if text:\n        r_text = requests.get(text + \"?raw=true\")\n        code_text = r_text.text\n    elif straight_text:\n        code_text = straight_text\n\n    if lang:\n        code_lang = lang\n    else:\n        code_lang = \"python3\"\n\n    content = Markup(markdown.markdown(mark, extensions=['pymdownx.github', 'pymdownx.highlight']))\n    return render_template('index-tutorial.html', markdown=content, code_text=code_text, code_lang=code_lang)\n\n\nif __name__ == '__main__':\n    app.run(host=\"0.0.0.0\", port=5555, debug=True)\n\n"
  },
  {
    "path": "k8s_templates/aci-beta.yml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  name: time2codeserver\nspec:\n  type: LoadBalancer\n  ports:\n  - name: time2codeserver-5555\n    port: 5555\n    protocol: TCP\n    targetPort: 5555\n  selector:\n    app: time2codeserver\n    component: time2codeserver\n\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: gateway\n  labels:\n    app: gateway\nspec:\n  type: LoadBalancer\n  ports:\n    - port: 8080\n      protocol: TCP\n      targetPort: 8080\n  selector:\n    app: gateway\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: faas-netesd\n  labels:\n    app: faas-netesd\nspec:\n  type: LoadBalancer\n  ports:\n    - port: 8080\n      protocol: TCP\n      targetPort: 8080\n  selector:\n    app: faas-netesd\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: prometheus\n  labels:\n    app: prometheus\nspec:\n  type: LoadBalancer\n  ports:\n    - port: 9090\n      protocol: TCP\n      targetPort: 9090\n  selector:\n    app: prometheus\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: alertmanager\n  labels:\n    app: alertmanager\nspec:\n  type: LoadBalancer\n  ports:\n    - port: 9093\n      protocol: TCP\n      targetPort: 9093\n  selector:\n    app: alertmanager\n\n\n\n---\napiVersion: apps/v1beta1 # for versions before 1.6.0 use extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: alertmanager\nspec:\n  replicas: 1\n  template:\n    metadata:\n      labels:\n        app: alertmanager\n    spec:\n      containers:\n      - name: alertmanager\n        image: functions/alertmanager:latest-k8s\n        imagePullPolicy: Always\n        imagePullPolicy: Always\n        command: [\"/bin/alertmanager\",\"-config.file=/alertmanager.yml\", \"-storage.path=/alertmanager\"]\n        ports:\n        - containerPort: 9003\n          protocol: TCP\n      restartPolicy: Always\n      volumes: null\n\n---\napiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: csharp-experimental\nspec:\n  replicas: 0\n  rollbackTo:\n    revision: 0\n  selector:\n    matchLabels:\n      app: time2code\n      component: csharp-experimental\n  strategy:\n    rollingUpdate:\n      maxSurge: 1000\n      maxUnavailable: 0\n    type: RollingUpdate\n  template:\n    metadata:\n      labels:\n        app: time2code\n        component: csharp-experimental\n    spec:\n      containers:\n      - env:\n        - name: fprocess\n          value: python3 time2CSharp.py\n        - name: https_proxy\n          value: $https_proxy\n        - name: no_proxy\n          value: gateway\n        - name: read_timeout\n          value: \"60\"\n        - name: write_timeout\n          value: \"60\"\n        image: jockdarock/time2csharp:latest\n        imagePullPolicy: Always\n        name: csharp-experimental\n  nodename: aci-connector\n\n---\napiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: gateway\nspec:\n  replicas: 1\n  rollbackTo:\n    revision: 0\n  selector:\n    matchLabels:\n      app: time2code\n      component: gateway\n  strategy:\n    rollingUpdate:\n      maxSurge: 10\n      maxUnavailable: 1\n    type: RollingUpdate\n  template:\n    metadata:\n      labels:\n        app: time2code\n        component: gateway\n    spec:\n      containers:\n      - env:\n        - name: dnsrr\n          value: \"true\"\n        - name: read_timeout\n          value: \"60\"\n        - name: write_timeout\n          value: \"60\"\n        - name: functions_provider_url\n          value: \"http://faas-netesd.default:8080/\"\n        image: functions/gateway:0.5.8-alpha\n        imagePullPolicy: Always\n        name: gateway\n        ports:\n        - containerPort: 8080\n          protocol: TCP\n      restartPolicy: Always\n\n---\napiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: golang\nspec:\n  replicas: 1\n  rollbackTo:\n    revision: 0\n  selector:\n    matchLabels:\n      app: time2code\n      component: golang\n  strategy:\n    rollingUpdate:\n      maxSurge: 1000\n      maxUnavailable: 1\n    type: RollingUpdate\n  template:\n    metadata:\n      labels:\n        app: time2code\n        component: golang\n    spec:\n      containers:\n      - env:\n        - name: fprocess\n          value: python3 time2go.py\n        - name: https_proxy\n          value: $https_proxy\n        - name: no_proxy\n          value: gateway\n        - name: read_timeout\n          value: \"60\"\n        - name: write_timeout\n          value: \"60\"\n        image: jockdarock/time2go:latest\n        imagePullPolicy: Always\n        name: golang\n      nodename: aci-connector\n\n---\napiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: nodejs\nspec:\n  replicas: 0\n  rollbackTo:\n    revision: 0\n  selector:\n    matchLabels:\n      app: time2code\n      component: nodejs\n  strategy:\n    rollingUpdate:\n      maxSurge: 1000\n      maxUnavailable: 0\n    type: RollingUpdate\n  template:\n    metadata:\n      labels:\n        app: time2code\n        component: nodejs\n    spec:\n      containers:\n      - env:\n        - name: fprocess\n          value: python3 time2nodejs.py\n        - name: https_proxy\n          value: $https_proxy\n        - name: no_proxy\n          value: gateway\n        - name: read_timeout\n          value: \"60\"\n        - name: write_timeout\n          value: \"60\"\n        image: jockdarock/time2nodejs:latest\n        imagePullPolicy: Always\n        name: nodejs\n      nodename: aci-connector\n\n---\napiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: powershell\nspec:\n  replicas: 0\n  rollbackTo:\n    revision: 0\n  selector:\n    matchLabels:\n      app: time2code\n      component: powershell\n  strategy:\n    rollingUpdate:\n      maxSurge: 1000\n      maxUnavailable: 0\n    type: RollingUpdate\n  template:\n    metadata:\n      labels:\n        app: time2code\n        component: powershell\n    spec:\n      containers:\n      - env:\n        - name: fprocess\n          value: python3 time2powershell.py\n        - name: https_proxy\n          value: $https_proxy\n        - name: no_proxy\n          value: gateway\n        - name: read_timeout\n          value: \"60\"\n        - name: write_timeout\n          value: \"60\"\n        image: jockdarock/time2powershell:latest\n        imagePullPolicy: Always\n        name: powershell\n        volumeMounts: null\n      volumes: null\n      nodename: aci-connector\n\n---\napiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: prometheus\nspec:\n  replicas: 1\n  template:\n    metadata:\n      labels:\n        app: prometheus\n    spec:\n      containers:\n      - name: prometheus\n        image: functions/prometheus:latest-k8s\n        imagePullPolicy: Always\n        command: [\"prometheus\",\"-config.file=/etc/prometheus/prometheus.yml\", \"-storage.local.path=/prometheus\", \"-storage.local.memory-chunks=10000\", \"--alertmanager.url=http://alertmanager.default:9093\"]\n        imagePullPolicy: Always\n        ports:\n        - containerPort: 9090\n          protocol: TCP\n\n---\napiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: python\nspec:\n  replicas: 0\n  rollbackTo:\n    revision: 0\n  selector:\n    matchLabels:\n      app: time2code\n      component: python\n  strategy:\n    rollingUpdate:\n      maxSurge: 1000\n      maxUnavailable: 0\n    type: RollingUpdate\n  template:\n    metadata:\n      labels:\n        app: time2code\n        component: python\n    spec:\n      containers:\n      - env:\n        - name: fprocess\n          value: python3 time2py.py\n        - name: https_proxy\n          value: $https_proxy\n        - name: no_proxy\n          value: gateway\n        - name: read_timeout\n          value: \"60\"\n        - name: write_timeout\n          value: \"60\"\n        image: jockdarock/time2py:latest\n        imagePullPolicy: Always\n        name: python\n        volumeMounts: null\n      volumes: null\n      nodename: aci-connector\n\n---\napiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: time2codeserver\nspec:\n  replicas: 3\n  rollbackTo:\n    revision: 0\n  selector:\n    matchLabels:\n      app: time2code\n      component: time2codeserver\n  strategy:\n    rollingUpdate:\n      maxSurge: 10\n      maxUnavailable: 2\n    type: RollingUpdate\n  template:\n    metadata:\n      labels:\n        app: time2code\n        component: time2codeserver\n    spec:\n      containers:\n      - image: jockdarock/time2codeserver:latest\n        name: time2codeserver\n        imagePullPolicy: Always\n        env:\n        - name: time2code_provider_url\n          value: \"http://time2codeserver.default:5555\"\n        ports:\n        - containerPort: 5555\n          protocol: TCP\n        volumeMounts: null\n      restartPolicy: Always\n      volumes: null"
  },
  {
    "path": "k8s_templates/faas_function_k8s.yml",
    "content": "apiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: csharp-experimental\nspec:\n  replicas: 0\n  rollbackTo:\n    revision: 0\n  selector:\n    matchLabels:\n      app: time2code\n      component: csharp-experimental\n  strategy:\n    rollingUpdate:\n      maxSurge: 1000\n      maxUnavailable: 0\n    type: RollingUpdate\n  template:\n    metadata:\n      labels:\n        app: time2code\n        component: csharp-experimental\n    spec:\n      containers:\n      - env:\n        - name: fprocess\n          value: python3 time2CSharp.py\n        - name: https_proxy\n          value: $https_proxy\n        - name: no_proxy\n          value: gateway\n        - name: read_timeout\n          value: \"60\"\n        - name: write_timeout\n          value: \"60\"\n        image: jockdarock/time2csharp:latest\n        imagePullPolicy: Always\n        name: csharp-experimental\n      nodeSelector:\n        dedicated: aci-connector\n\n---\napiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: golang\nspec:\n  replicas: 1\n  rollbackTo:\n    revision: 0\n  selector:\n    matchLabels:\n      app: time2code\n      component: golang\n  strategy:\n    rollingUpdate:\n      maxSurge: 1000\n      maxUnavailable: 1\n    type: RollingUpdate\n  template:\n    metadata:\n      labels:\n        app: time2code\n        component: golang\n    spec:\n      containers:\n      - env:\n        - name: fprocess\n          value: python3 time2go.py\n        - name: https_proxy\n          value: $https_proxy\n        - name: no_proxy\n          value: gateway\n        - name: read_timeout\n          value: \"60\"\n        - name: write_timeout\n          value: \"60\"\n        image: jockdarock/time2go:latest\n        imagePullPolicy: Always\n        name: golang\n      nodeSelector:\n        dedicated: aci-connector\n\n---\napiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: nodejs\nspec:\n  replicas: 0\n  rollbackTo:\n    revision: 0\n  selector:\n    matchLabels:\n      app: time2code\n      component: nodejs\n  strategy:\n    rollingUpdate:\n      maxSurge: 1000\n      maxUnavailable: 0\n    type: RollingUpdate\n  template:\n    metadata:\n      labels:\n        app: time2code\n        component: nodejs\n    spec:\n      containers:\n      - env:\n        - name: fprocess\n          value: python3 time2nodejs.py\n        - name: https_proxy\n          value: $https_proxy\n        - name: no_proxy\n          value: gateway\n        - name: read_timeout\n          value: \"60\"\n        - name: write_timeout\n          value: \"60\"\n        image: jockdarock/time2nodejs:latest\n        imagePullPolicy: Always\n        name: nodejs\n      nodeSelector:\n        dedicated: aci-connector\n\n---\napiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: powershell\nspec:\n  replicas: 0\n  rollbackTo:\n    revision: 0\n  selector:\n    matchLabels:\n      app: time2code\n      component: powershell\n  strategy:\n    rollingUpdate:\n      maxSurge: 1000\n      maxUnavailable: 0\n    type: RollingUpdate\n  template:\n    metadata:\n      labels:\n        app: time2code\n        component: powershell\n    spec:\n      containers:\n      - env:\n        - name: fprocess\n          value: python3 time2powershell.py\n        - name: https_proxy\n          value: $https_proxy\n        - name: no_proxy\n          value: gateway\n        - name: read_timeout\n          value: \"60\"\n        - name: write_timeout\n          value: \"60\"\n        image: jockdarock/time2powershell:latest\n        imagePullPolicy: Always\n        name: powershell\n        volumeMounts: null\n      volumes: null\n      nodeSelector:\n        dedicated: aci-connector\n\n---\napiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: python\nspec:\n  replicas: 0\n  rollbackTo:\n    revision: 0\n  selector:\n    matchLabels:\n      app: time2code\n      component: python\n  strategy:\n    rollingUpdate:\n      maxSurge: 1000\n      maxUnavailable: 0\n    type: RollingUpdate\n  template:\n    metadata:\n      labels:\n        app: time2code\n        component: python\n    spec:\n      containers:\n      - env:\n        - name: fprocess\n          value: python3 time2py.py\n        - name: https_proxy\n          value: $https_proxy\n        - name: no_proxy\n          value: gateway\n        - name: read_timeout\n          value: \"60\"\n        - name: write_timeout\n          value: \"60\"\n        image: jockdarock/time2py:latest\n        imagePullPolicy: Always\n        name: python\n        volumeMounts: null\n      volumes: null\n      nodeSelector:\n        dedicated: aci-connector"
  },
  {
    "path": "k8s_templates/str8_k8s.yml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  name: time2codeserver\nspec:\n  type: LoadBalancer\n  ports:\n  - name: time2codeserver-5555\n    port: 5555\n    protocol: TCP\n    targetPort: 5555\n  selector:\n    app: time2codeserver\n    component: time2codeserver\n\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: gateway\n  labels:\n    app: gateway\nspec:\n  type: LoadBalancer\n  ports:\n    - port: 8080\n      protocol: TCP\n      targetPort: 8080\n  selector:\n    app: gateway\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: faas-netesd\n  labels:\n    app: faas-netesd\nspec:\n  type: LoadBalancer\n  ports:\n    - port: 8080\n      protocol: TCP\n      targetPort: 8080\n  selector:\n    app: faas-netesd\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: prometheus\n  labels:\n    app: prometheus\nspec:\n  type: LoadBalancer\n  ports:\n    - port: 9090\n      protocol: TCP\n      targetPort: 9090\n  selector:\n    app: prometheus\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: alertmanager\n  labels:\n    app: alertmanager\nspec:\n  type: LoadBalancer\n  ports:\n    - port: 9093\n      protocol: TCP\n      targetPort: 9093\n  selector:\n    app: alertmanager\n\n\n\n---\napiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: time2codeserver\nspec:\n  replicas: 3\n  rollbackTo:\n    revision: 0\n  selector:\n    matchLabels:\n      app: time2codeserver\n      component: time2codeserver\n  strategy:\n    rollingUpdate:\n      maxSurge: 3\n      maxUnavailable: 1\n    type: RollingUpdate\n  template:\n    metadata:\n      labels:\n        app: time2codeserver\n        component: time2codeserver\n    spec:\n      containers:\n      - image: jockdarock/time2codeserver:latest\n        name: time2codeserver\n        imagePullPolicy: Always\n        env:\n        - name: time2code_provider_url\n          value: \"http://time2codeserver.default.svc.cluster.local:5555\"\n        ports:\n        - containerPort: 5555\n          protocol: TCP\n      restartPolicy: Always\n---\napiVersion: apps/v1beta1 # for versions before 1.6.0 use extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: faas-netesd\nspec:\n  replicas: 1\n  template:\n    metadata:\n      labels:\n        app: faas-netesd\n    spec:\n      containers:\n      - name: faas-netesd\n        image: functions/faas-netesd:0.3.4\n        imagePullPolicy: Always\n        ports:\n        - containerPort: 8080\n          protocol: TCP\n---\napiVersion: apps/v1beta1 # for versions before 1.6.0 use extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: gateway\nspec:\n  replicas: 1\n  template:\n    metadata:\n      labels:\n        app: gateway\n    spec:\n      containers:\n      - name: gateway\n        image: functions/gateway:0.6.13\n        imagePullPolicy: Always\n        env:\n        - name: functions_provider_url\n          value: \"http://faas-netesd.default.svc.cluster.local:8080/\"\n        ports:\n        - containerPort: 8080\n          protocol: TCP\n---\napiVersion: apps/v1beta1 # for versions before 1.6.0 use extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: prometheus\nspec:\n  replicas: 1\n  template:\n    metadata:\n      labels:\n        app: prometheus\n    spec:\n      containers:\n      - name: prometheus\n        image: functions/prometheus:latest-k8s\n        command: [\"prometheus\",\"-config.file=/etc/prometheus/prometheus.yml\", \"-storage.local.path=/prometheus\", \"-storage.local.memory-chunks=10000\", \"--alertmanager.url=http://alertmanager.default:9093\"]\n        imagePullPolicy: Always\n        ports:\n        - containerPort: 9090\n          protocol: TCP\n---\napiVersion: apps/v1beta1 # for versions before 1.6.0 use extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: alertmanager\nspec:\n  replicas: 1\n  template:\n    metadata:\n      labels:\n        app: alertmanager\n    spec:\n      containers:\n      - name: alertmanager\n        image: functions/alertmanager:latest-k8s\n        imagePullPolicy: Always\n        command: [\"/bin/alertmanager\",\"-config.file=/alertmanager.yml\", \"-storage.path=/alertmanager\"]\n        ports:\n        - containerPort: 9003\n          protocol: TCP\n---\n"
  },
  {
    "path": "minikube.sh",
    "content": "#! /bin/bash\n\ngit clone https://github.com/alexellis/faas-netes\n\ncurl -sSL cli.get-faas.com | sudo sh\n\nkubectl apply -f faas-netes/faas.yml,faas-netes/monitoring.yml,./time2code-server-k8s.yml\n\nsed \"s/localhost:31112/$(minikube ip):31112/\" time2code-faas-cli-functions.yml > .time2code-faas-cli-minikube.yml\n\necho \"Load the Code execution Functions with the faas-cli and then navigate to this site http://$(minikube ip):31114 in your favorite browser.\"\n"
  },
  {
    "path": "templates/alloy_server.html",
    "content": "<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Base Test Une</title>\n    <script src=\"http://cdn.alloyui.com/3.0.1/aui/aui-min.js\"></script>\n    <link href=\"http://cdn.alloyui.com/3.0.1/aui-css/css/bootstrap.min.css\" rel=\"stylesheet\"></link>\n    <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n    <script src=\"https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js\"></script>\n    <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n\n</head>\n<body>\n    <div id=\"myWrapper\">\n      <form class=\"form\">\n        <div class=\"form-group\">\n          <label for=\"mode\" class=\"control-label\">Language Mode:</label>\n          <select id=\"mode\" class=\"form-control\">\n            <option>python</option>\n            <option>json</option>\n            <option>golang</option>\n          </select>\n        </div>\n      </form>\n      <div id=\"myEditor\"></div>\n    </div>\n    <script>\n        YUI().use(\n          'aui-ace-autocomplete-base',\n          function(Y) {\n            var editor = new Y.AceEditor(\n              {\n                boundingBox: '#myEditor',\n                height: '200',\n                mode: 'python',\n                value: 'print(\"Hello there!!!\")',\n                width: '700',\n                theme: 'chaos'\n              }\n            ).render();\n            editor.ace.config.set('themPath\n\n            var mode = Y.one('#mode');\n\n            if (mode) {\n              var contents = {\n                python: 'print(\"Hello there!!!\")',\n                golang: 'package main\\r\\n\\r\\nimport \"fmt\"\\r\\n\\r\\nfunc main(){\\r\\n\\r\\t\\r\\t}',\n                json: '{\"value\": \"Write something here...\"}'\n              };\n\n              var currentMode = 'python';\n\n              var updateValue = function() {\n                editor.set('value', contents[currentMode]);\n              };\n\n              mode.on(\n                'change',\n                function(event) {\n                  currentMode = this.val();\n                  editor.set('mode', currentMode);\n                  updateValue();\n                }\n              );\n            }\n          }\n        );\n    </script>\n\n</body>\n</html>"
  },
  {
    "path": "templates/base_test.html",
    "content": "<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Base Test Une</title>\n    <script src=\"https://cdn.rawgit.com/ajaxorg/ace-builds/812e2c56aed246931a667f16c28b096e34597016/src/ace.js\" type=\"text/javascript\"></script>\n\n</head>\n<body>\n    <style type=\"text/css\">\n        #IDE {\n            position: absolute;\n            width: 100%;\n            height: 85%;\n            background-color:black;\n        }\n        #button {\n            position:relative;\n            transition: .5s ease;\n            top: 550px;\n            left: 33%;\n\n            z-index: 99999;\n        }\n    </style>\n    <div id=\"IDE\">\n\n    </div>\n    <script>\n        var IDE = ace.edit(\"IDE\");\n        IDE.setTheme(\"ace/theme/chaos\");\n        IDE.session.setMode(\"ace/mode/python\")\n    </script>\n    <div>\n        <button id=\"button\">RUN</button>\n    </div>\n    <div id=\"console\" class=\"ui-widget-content\"></div>\n    <style>\n        /* The console container element */\n        #console {\n          position: absolute;\n          width: 400px;\n          height: 500px;\n          background-color:black;\n          z-index: 99990;\n          right: 15px;\n        }\n        /* The inner console element. */\n        .jqconsole {\n            padding: 10px;\n        }\n        /* The cursor. */\n        .jqconsole-cursor {\n            background-color: gray;\n        }\n        /* The cursor color when the console looses focus. */\n        .jqconsole-blurred .jqconsole-cursor {\n            background-color: #666;\n        }\n        /* The current prompt text color */\n        .jqconsole-prompt {\n            color: #0d0;\n        }\n        /* The command history */\n        .jqconsole-old-prompt {\n            color: #0b0;\n            font-weight: normal;\n        }\n        /* The text color when in input mode. */\n        .jqconsole-input {\n            color: #dd0;\n        }\n        /* Previously entered input. */\n        .jqconsole-old-input {\n            color: #bb0;\n            font-weight: normal;\n        }\n        /* The text color of the output. */\n        .jqconsole-output {\n            color: white;\n        }\n    </style>\n    <script src=\"http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js\" type=\"text/javascript\" charset=\"utf-8\"></script>\n    <script src=\"https://cdn.rawgit.com/replit/jq-console/master/lib/jqconsole.js\" type=\"text/javascript\" charset=\"utf-8\"></script>\n    <script>\n\n\n      $(document).ready(function(){\n            var jqconsole = $('#console').jqconsole('>>>\\n');\n            $(\"button\").click(function(){\n                jqconsole.Reset();\n                var IDE = ace.edit(\"IDE\");\n                var code = IDE.getValue();\n                var url = \"http://\" + location.hostname + \":8080/function/{{ code_exec }}\";\n                console.log(url)\n                $.ajax({\n                    url: url,\n                    type: 'post',\n                    dataType: 'text',\n                    headers: {'Content-Type': 'text/plain'},\n                    // data: \"print('hey')\",\n                    data: code,\n                    success: function (data) {\n                        console.log(data);\n                        $(function () {\n                            var writePrompt = function () {\n                                jqconsole.Prompt(false);\n                                jqconsole.Write(data + '\\n', 'jqconsole-output');\n                              // Start the prompt with history enabled.\n                              // jqconsole.Prompt(false, function (input) {\n                                // Output input with the class jqconsole-output.\n                                //jqconsole.Write(input + '\\n', 'jqconsole-output');\n                                // Restart the prompt.\n                                //startPrompt();\n                              };\n                            writePrompt();\n                        });\n                    },\n                });\n            });\n        });\n    </script>\n\n</body>\n</html>"
  },
  {
    "path": "templates/base_test_server.html",
    "content": "<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Base Test Une</title>\n    <script src=\"https://cdn.rawgit.com/ajaxorg/ace-builds/812e2c56aed246931a667f16c28b096e34597016/src/ace.js\" type=\"text/javascript\"></script>\n\n</head>\n<body>\n    <style type=\"text/css\">\n        #IDE {\n            position: absolute;\n            width: 100%;\n            height: 85%;\n            background-color:black;\n        }\n        #button {\n            position:relative;\n            transition: .5s ease;\n            top: 550px;\n            left: 33%;\n\n            z-index: 99999;\n        }\n    </style>\n    <div id=\"IDE\">\n\n    </div>\n    <script>\n        var IDE = ace.edit(\"IDE\");\n        IDE.setTheme(\"ace/theme/chaos\");\n        IDE.session.setMode(\"ace/mode/python\")\n    </script>\n    <div>\n        <button id=\"button\">RUN</button>\n    </div>\n    <div id=\"console\" class=\"ui-widget-content\"></div>\n    <style>\n        /* The console container element */\n        #console {\n          position: absolute;\n          width: 400px;\n          height: 500px;\n          background-color:black;\n          z-index: 99990;\n          right: 15px;\n        }\n        /* The inner console element. */\n        .jqconsole {\n            padding: 10px;\n        }\n        /* The cursor. */\n        .jqconsole-cursor {\n            background-color: gray;\n        }\n        /* The cursor color when the console looses focus. */\n        .jqconsole-blurred .jqconsole-cursor {\n            background-color: #666;\n        }\n        /* The current prompt text color */\n        .jqconsole-prompt {\n            color: #0d0;\n        }\n        /* The command history */\n        .jqconsole-old-prompt {\n            color: #0b0;\n            font-weight: normal;\n        }\n        /* The text color when in input mode. */\n        .jqconsole-input {\n            color: #dd0;\n        }\n        /* Previously entered input. */\n        .jqconsole-old-input {\n            color: #bb0;\n            font-weight: normal;\n        }\n        /* The text color of the output. */\n        .jqconsole-output {\n            color: white;\n        }\n    </style>\n    <script src=\"http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js\" type=\"text/javascript\" charset=\"utf-8\"></script>\n    <script src=\"https://cdn.rawgit.com/replit/jq-console/8baeef38/lib/jqconsole.js\" type=\"text/javascript\" charset=\"utf-8\"></script>\n    <script>\n\n\n      $(document).ready(function(){\n            var jqconsole = $('#console').jqconsole('>>>\\n');\n            $(\"button\").click(function(){\n                jqconsole.Reset();\n                var IDE = ace.edit(\"IDE\");\n                var code = IDE.getValue();\n                var url = \"http://\" + location.host + \"/code/{{ code_exec }}\";\n                console.log(url)\n                $.ajax({\n                    url: url,\n                    type: 'post',\n                    dataType: 'text',\n                    headers: {'Content-Type': 'text/plain'},\n                    // data: \"print('hey')\",\n                    data: code,\n                    success: function (data) {\n                        console.log(data);\n                        $(function () {\n                            var writePrompt = function () {\n                                jqconsole.Prompt(false);\n                                jqconsole.Write(data + '\\n', 'jqconsole-output');\n                              // Start the prompt with history enabled.\n                              // jqconsole.Prompt(false, function (input) {\n                                // Output input with the class jqconsole-output.\n                                //jqconsole.Write(input + '\\n', 'jqconsole-output');\n                                // Restart the prompt.\n                                //startPrompt();\n                              };\n                            writePrompt();\n                        });\n                    },\n                });\n            });\n        });\n    </script>\n\n</body>\n</html>"
  },
  {
    "path": "templates/boostrap_server.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <title>Bootstrap Example</title>\n  <meta charset=\"utf-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n  <link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\">\n  <script src=\"https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js\"></script>\n  <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script>\n    <script src=\"https://cdn.rawgit.com/ajaxorg/ace-builds/812e2c56aed246931a667f16c28b096e34597016/src/ace.js\" type=\"text/javascript\"></script>\n</head>\n<body>\n\n<div class=\"container-fluid\">\n  <h1>Hello World!</h1>\n  <p>Resize the browser window to see the effect.</p>\n  <div class=\"row\">\n    <style>\n        #code-instruct {\n            height: 500px;\n        }\n    </style>\n    <div id=\"code-instruc\" class=\"col-lg-4\">\n        {{ markd }}\n    </div>\n            <div class=\"col-lg-4\">\n                <div class=\"panel panel-defaults\"\n                    <div id=\"IDE-header\" class=\"panel-heading\">\n                        <h3 class=\"panel-title\">Editor</h3>\n                    </div>\n                    <div id=\"IDE-body\" class=\"panel-body\">\n                        <style type=\"text/css\">\n                            #IDE {\n                                height: 500px;\n                                background-color:black;\n                            }\n\n                            #IDE-header {\n                                background-color:black;\n                            }\n                            #IDE-body {\n                                background-color:black;\n                            }\n                        </style>\n                        <div id=\"IDE\">print(\"Hello\")</div>\n                        <script>\n                            var IDE = ace.edit(\"IDE\");\n                            IDE.setTheme(\"ace/theme/chaos\");\n                            IDE.session.setMode(\"ace/mode/python\")\n                        </script>\n                    </div>\n                </div>\n            </div>\n\n\n            <div class=\"col-lg-4\">\n                <div class=\"panel panel-defaults\">\n                    <div id=\"console-body\" class=\"panel-body\">\n                        <div id=\"console\" class=\"ui-widget-content\"></div>\n                            <style>\n                                /* The console container element */\n                                #console {\n                                  height: 500px;\n                                  background-color:black;\n                                }\n                                #console-body {\n                                  background-color:black;\n                                }\n                                /* The inner console element. */\n                                .jqconsole {\n                                    padding: 10px;\n                                }\n                                /* The cursor. */\n                                .jqconsole-cursor {\n                                    background-color: gray;\n                                }\n                                /* The cursor color when the console looses focus. */\n                                .jqconsole-blurred .jqconsole-cursor {\n                                    background-color: #666;\n                                }\n                                /* The current prompt text color */\n                                .jqconsole-prompt {\n                                    color: #0d0;\n                                }\n                                /* The command history */\n                                .jqconsole-old-prompt {\n                                    color: #0b0;\n                                    font-weight: normal;\n                                }\n                                /* The text color when in input mode. */\n                                .jqconsole-input {\n                                    color: #dd0;\n                                }\n                                /* Previously entered input. */\n                                .jqconsole-old-input {\n                                    color: #bb0;\n                                    font-weight: normal;\n                                }\n                                /* The text color of the output. */\n                                .jqconsole-output {\n                                    color: white;\n                                }\n                            </style>\n                            <script src=\"http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js\" type=\"text/javascript\" charset=\"utf-8\"></script>\n                            <script src=\"https://cdn.rawgit.com/replit/jq-console/8baeef38/lib/jqconsole.js\" type=\"text/javascript\" charset=\"utf-8\"></script>\n                            <script>\n\n\n                              $(document).ready(function(){\n                                    var jqconsole = $('#console').jqconsole('>>>\\n');\n                                    $(\"button\").click(function(){\n                                        jqconsole.Reset();\n                                        var IDE = ace.edit(\"IDE\");\n                                        var code = IDE.getValue();\n                                        var url = \"http://\" + location.host + \"/code/{{ code_exec }}\";\n                                        console.log(url)\n                                        $.ajax({\n                                            url: url,\n                                            type: 'post',\n                                            dataType: 'text',\n                                            headers: {'Content-Type': 'text/plain'},\n                                            // data: \"print('hey')\",\n                                            data: code,\n                                            success: function (data) {\n                                                console.log(data);\n                                                $(function () {\n                                                    var writePrompt = function () {\n                                                        jqconsole.Prompt(false);\n                                                        jqconsole.Write(data + '\\n', 'jqconsole-output');\n                                                      // Start the prompt with history enabled.\n                                                      // jqconsole.Prompt(false, function (input) {\n                                                        // Output input with the class jqconsole-output.\n                                                        //jqconsole.Write(input + '\\n', 'jqconsole-output');\n                                                        // Restart the prompt.\n                                                        //startPrompt();\n                                                      };\n                                                    writePrompt();\n                                                });\n                                            },\n                                        });\n                                    });\n                                });\n                            </script>\n                    </div>\n                </div>\n            </div>\n\n\n  </div>\n</div>\n\n</body>\n</html>"
  },
  {
    "path": "templates/index-panel.html",
    "content": "<html>\n\n  <head>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n\n<!-- UI based on the Play-With-Moby site and by the team at Play-With-Docker and the learning experiences they deliver everyday -->\n\n\n<link href=\"//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\" rel=\"stylesheet\">\n<link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/bootswatch/3.3.7/darkly/bootstrap.min.css\">\n<link rel=\"stylesheet\" href=\"https://fonts.googleapis.com/css?family=Lato:400,700,400italic\">\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/ace/1.2.8/ace.js\" type=\"text/javascript\"></script>\n<script src=\"http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js\" type=\"text/javascript\" charset=\"utf-8\"></script>\n<script src=\"https://cdn.rawgit.com/replit/jq-console/8baeef38/lib/jqconsole.js\" type=\"text/javascript\" charset=\"utf-8\"></script>\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/xterm/2.8.1/xterm.js\"></script>\n<link href=\"https://cdnjs.cloudflare.com/ajax/libs/xterm/2.8.1/xterm.css\" rel=\"stylesheet\"/>\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/xterm/2.8.1/addons/fit/fit.js\"></script>\n\n<style>\n    html, body {\n        height: 100%;\n        background-color: #052f47;\n        color: #fff\n    }\n    img {\n        max-width: 100%\n    }\n    .mt50 {\n        margin-top: 50px\n    }\n    .mt20 {\n        margin-top: 20px\n    }\n    .mt10 {\n        margin-top: 10px\n    }\n    .mb10 {\n        margin-bottom: 10px\n    }\n    body {\n        display: flex;\n        flex-direction: column\n    }\n    body>* {\n        flex: none\n    }\n    #IDE {\n        background-color: #24323a\n    }\n    #terminal {\n        height: 100%;\n    }\n    .navbar-header {\n        margin-top: 5px\n    }\n    .navbar-header button {\n        margin-left: 10px\n    }\n    .navbar-header input {\n        color: #000;\n        margin-left: 5px;\n        width: 300px;\n        display: none\n    }\n    .navbar {\n        border-radius: 0px;\n        margin-bottom: 0px\n    }\n    .navbar.navbar-inverse {\n        background-color: #052f47;\n        border-color: #052f47\n    }\n    .navbar.navbar-inverse a, .navbar.navbar-inverse .navbar-nav li a {\n        color: #fff\n    }\n    .navbar.navbar-inverse a:hover, .navbar.navbar-inverse .navbar-nav li a:hover {\n        text-decoration: underline\n    }\n    footer {\n        background-color: #052f47\n    }\n    .navbar-brand {\n        font-weight: 900;\n        margin-left: 0px !important;\n        vertical-align: middle;\n        float: none\n    }\n    @media screen and (max-width: 600px) {\n        .navbar-brand {\n            font-size: 1.5em\n        }\n    }\n    .panel {\n        border: none;\n        box-shadow: 0px 0px 1px #828282\n    }\n    .panel:hover {\n        box-shadow: 0px 0px 6px #828282\n    }\n    .social {\n        list-style: none;\n        display: inline;\n        margin-left: 10px;\n        padding: 5px 8px\n    }\n    .social:hover {\n        opacity: 0.7\n    }\n    .social img {\n        width: 20px\n    }\n    .quora img {\n        width: 17px\n    }\n    .facebook img {\n        width: 16px\n    }\n    .panel-container {\n        display: flex;\n        flex-direction: row;\n        overflow: hidden;\n        height: 100%;\n        flex: 1 1 auto;\n        xtouch-action: none\n    }\n    .terminal {\n        font-size: 15px\n    }\n    .panel-left, IDE {\n        flex: 0 0 auto;\n        width: 50%;\n        min-width: 150px\n    }\n    .content {\n        padding: 0 15px;\n        overflow-y: auto\n    }\n    .content {\n        padding: 0 15px\n    }\n    .splitter {\n        flex: 0 0 auto;\n        width: 18px;\n        background: url(https://raw.githubusercontent.com/RickStrahl/jquery-resizable/master/assets/vsizegrip.png) center center no-repeat #101e26;\n        min-height: 200px;\n        cursor: col-resize\n    }\n    .panel-right {\n        display: flex;\n        flex-direction: column;\n        flex: 1 1 auto;\n        width: 100%;\n        background-color: #000000\n    }\n    .panel-right>div {\n        flex: 1 1 auto;\n        margin-bottom: 15px;\n        overflow-y: auto\n    }\n    .panel-right>div:last-of-type {\n        margin-bottom: 0px\n    }\n    .panel-right>div.initialized {\n        background-color: black\n    }\n    .post-tag {\n        display: inline-block;\n        background: rgba(42, 122, 226, 0.15);\n        padding: 0 .5rem;\n        margin-right: .5rem;\n        border-radius: 4px;\n        color: #2a7ae2;\n        font-family: \"Open Sans\", serif;\n        font-size: 90%\n    }\n    .post-tag:before {\n        content: \"\\f02b\";\n        font-family: FontAwesome;\n        padding-right: .5em\n    }\n    .post-tag:hover {\n        text-decoration: none;\n        background: #2a7ae2;\n        color: #fff\n    }\n    small .post-tag {\n        background: #eee;\n        color: #000\n    }\n    small .post-tag:before {\n        content: none\n    }\n    small .post-tag:hover {\n        text-decoration: none;\n        background: #000;\n        color: #fff;\n        cursor: default\n    }\n    .tags-expo :target:before {\n        content: \"\";\n        display: block;\n        height: 72px;\n        margin: -72px 0 0\n    }\n    @media (min-width: 38em) {\n        .tags-expo .tags-expo-list {\n            font-size: 2.9rem\n        }\n        .tags-expo .tags-expo-list .post-tag {\n            margin: .2em .3em\n        }\n    }\n    .tags-expo .tags-expo-section {\n        font-family: \"Open Sans\", serif\n    }\n    .tags-expo .tags-expo-section ul {\n        list-style-type: circle;\n        list-style-position: inside;\n        padding: 0\n    }\n    .tags-expo .tags-expo-section ul li {\n        padding: 0 1rem\n    }\n    .tags-expo .tags-expo-section ul li:hover {\n        list-style-type: disc\n    }\n    .tags-expo .tags-expo-section a {\n        font-size: 20px\n    }\n    .tags-expo .tags-expo-section .post-date {\n        display: inline-block;\n        font-size: 80%;\n        color: #000;\n        margin: 0;\n        padding: 0\n    }\n</style>\n\n<link href=\"https://maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css\" rel=\"stylesheet\">\n</head>\n  <body>\n\n    <header class=\"site-header\">\n<nav class=\"navbar navbar-default navbar-inverse\">\n\n    <div class=\"container\">\n      <div class=\"logo\"><img src=\"../static/TIME2CODE-grey.png\"></div>\n        <div class=\"navbar-header\">\n        <!--<a class=\"navbar-brand\" href=\"/\">Time2Code</a>-->\n          <button type=\"button\" class=\"navbar-toggle collapsed\" data-toggle=\"collapse\" data-target=\"#bs-example-navbar-collapse-1\" aria-expanded=\"false\">\n            <span class=\"sr-only\">Toggle navigation</span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n          </button>\n\n        </div>\n  </div><!-- /.container-fluid -->\n</nav>\n</header>\n\n\n    <div class=\"panel-container\">\n        <div class=\"panel-left\" id=\"IDE\"/>\n    </div>\n\n    <div class=\"splitter\">\n    </div>\n    <div class=\"panel-right\">\n        <div id=\"terminal\"></div>\n          <script>\n\n          </script>\n    </div>\n</div>\n\n\n<script src=\"https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js\"></script>\n<script src=\"https://rawgit.com/RickStrahl/jquery-resizable/master/dist/jquery-resizable.min.js\"></script>\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/ace/1.2.7/ace.js\"></script>\n<script>\n    var IDE = ace.edit(\"IDE\");\n\n    IDE.setTheme(\"ace/theme/vibrant_ink\");\n    IDE.session.setMode(\"ace/mode/python\");\n\n    IDE.setShowPrintMargin(false);\n\n    $(\".panel-left\").resizable({\n        handleSelector: \".splitter\",\n        resizeHeight: false,\n    });\n</script>\n\n\n\n  <footer>\n    <nav class=\"navbar navbar-default\">\n      <div class=\"container-fluid\">\n        <ul class=\"nav navbar-nav\">\n            <li>\n                <button id=\"code\" onclick=\"termchange()\" class=\"btn btn-success navbar-btn\">RUN IT</button>\n                <button id=\"code\" onclick=\"termclear()\" class=\"btn btn-danger navbar-btn\">CLEAR TERM</button>\n            </li>\n            <form class=\"navbar-form navbar-right\">\n                <div class=\"form-group\">\n                  <select id=\"mode\" class=\"form-control\" style=\"float:right;\">\n                    <option label=\"python\" value=\"python3\">python3</option>\n                    <option label=\"golang\" value=\"golang\">golang</option>\n                    <option label=\"javascript\" value=\"nodejs\">nodejs</option>\n                    <option label=\"fortran\" value=\"fortran\">fortran</option>\n                    <option label=\"ruby\" value=\"ruby\">ruby</option>\n                    <option label=\"powershell\" value=\"powershell\">powershell</option>\n                    <option label=\"csharp\" value=\"csharp-experimental\">csharp-experimental</option>\n                  </select>\n                    <script>\n                        document.getElementById(\"mode\").value = \"{{ code_lang }}\";\n                        var modeElement = document.getElementById(\"mode\");\n                        mode = modeElement.options[modeElement.selectedIndex].label;\n                        var IDE = ace.edit(\"IDE\");\n                        var code = $('<textarea />').html(`{{ code_text }}`).text();\n                        IDE.setValue(code, -1);\n                        IDE.session.setMode(\"ace/mode/\" + mode);\n                        document.addEventListener(\"DOMContentLoaded\", function(event){\n                            $(\"#mode\").change(function() {\n                                var modeElement = document.getElementById(\"mode\");\n                                mode = modeElement.options[modeElement.selectedIndex].label;\n                                console.log(mode);\n                                var IDE = ace.edit(\"IDE\");\n                                IDE.setTheme(\"ace/theme/vibrant_ink\");\n                                IDE.session.setMode(\"ace/mode/\" + mode);\n                                IDE.setOption(\"showPrintMargin\", false);\n                            });\n                        });\n                    </script>\n                </div>\n            </form>\n      </div>\n    </nav>\n\n</footer>\n\n  <script src=\"https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js\"></script>\n  <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\" integrity=\"sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa\" crossorigin=\"anonymous\"></script>\n  <script>\n        function sleep(ms) {\n          return new Promise(resolve => setTimeout(resolve, ms));\n        }\n\n        var term = new Terminal({cursorBlink: false, rows: 40});\n        term.open(document.getElementById('terminal'));\n\n        function termchange() {\n                    var getmode = document.getElementById(\"mode\");\n                    var mode = getmode.options[getmode.selectedIndex].label;\n                    var mode_code = getmode.options[getmode.selectedIndex].value;\n                    var IDE = ace.edit(\"IDE\");\n                    var code = IDE.getValue();\n                    var url = \"http://\" + location.host + \"/code?lang=\" + mode_code;\n                    console.log(url)\n                    $.ajax({\n                        url: url,\n                        type: 'post',\n                        dataType: 'text',\n                        headers: {'Content-Type': 'text/plain'},\n                        // data: \"print('hey')\",\n                        data: code,\n                        success: function (data) {\n                            console.log(data);\n                            $(function () {\n                                var writePrompt = function () {\n                                    var termData = data.replace(/\\r?\\n/g, \"\\r\\n\");\n                                    term.writeln(termData);\n                                  };\n                                writePrompt();\n                                term.scrollToBottom();\n                            });\n                        },\n                    });\n\n                };\n\n        async function termclear() {\n            term.destroy();\n            await sleep(100);\n            term = new Terminal({cursorBlink: false, rows: 40});\n            term.open(document.getElementById('terminal'));\n        };\n    </script>\n\n\n\n  </body>\n\n</html>"
  },
  {
    "path": "templates/index-tut.html",
    "content": "<html>\n\n  <head>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n\n<!-- UI based on the Play-With-Moby site and by the team at Play-With-Docker and the learning experiences they deliver everyday -->\n\n\n<link href=\"//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\" rel=\"stylesheet\">\n<link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/bootswatch/3.3.7/darkly/bootstrap.min.css\">\n<link rel=\"stylesheet\" href=\"https://fonts.googleapis.com/css?family=Lato:400,700,400italic\">\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/ace/1.2.8/ace.js\" type=\"text/javascript\"></script>\n<script src=\"http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js\" type=\"text/javascript\" charset=\"utf-8\"></script>\n<script src=\"https://cdn.rawgit.com/replit/jq-console/8baeef38/lib/jqconsole.js\" type=\"text/javascript\" charset=\"utf-8\"></script>\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/xterm/2.8.1/xterm.js\"></script>\n<link href=\"https://cdnjs.cloudflare.com/ajax/libs/xterm/2.8.1/xterm.css\" rel=\"stylesheet\"/>\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/xterm/2.8.1/addons/fit/fit.js\"></script>\n<script src=\"https://cdn.rawgit.com/showdownjs/showdown/<version tag>/dist/showdown.min.js\"></script>\n\n<style>\n    html, body {\n        height: 100%;\n        background-color: #24323a;\n        color: #fff;\n        overflow: auto;\n    }\n    body {\n        display: flex;\n        flex-direction: column\n    }\n    body>* {\n        flex: none\n    }\n    #window {\n        margin: 0;\n        width: 100%;\n        height: 100%;\n    }\n    #IDE {\n        background-color: #000000;\n    }\n    #tutorial {\n        padding-top: 25px;\n        padding-right: 25px;\n        padding-bottom: 25px;\n        padding-left: 25px;\n    }\n    #terminal {\n        height: 75%;\n        overflow: hidden;\n    }\n    .ace_layer ace_gutter-layer ace_folding-enabled {\n        background-color: #000000;\n    }\n    .navbar-header {\n        margin-top: 5px\n    }\n    .navbar-header button {\n        margin-left: 10px\n    }\n    .navbar-header input {\n        color: #000;\n        margin-left: 5px;\n        width: 300px;\n        display: none\n    }\n    .navbar {\n        border-radius: 0px;\n        margin-bottom: 0px;\n        postion: fixed;\n    }\n    .navbar.navbar-inverse, .navbar.navbar-default {\n        background-color: #052f47;\n        border-color: #052f47\n    }\n    .navbar.navbar-inverse a, .navbar.navbar-inverse .navbar-nav li a {\n        color: #fff\n    }\n    .navbar.navbar-inverse a:hover, .navbar.navbar-inverse .navbar-nav li a:hover {\n        text-decoration: underline\n    }\n    footer {\n        background-color: #052f47;\n        position: fixed;\n        bottom: 0;\n        width: 100%;\n    }\n    .navbar-brand {\n        font-weight: 900;\n        margin-left: 0px !important;\n        vertical-align: middle;\n        float: none\n    }\n    .panel {\n        border: none;\n        box-shadow: 0px 0px 1px #828282\n    }\n    .panel:hover {\n        box-shadow: 0px 0px 6px #828282\n    }\n    .panel-container-vertical {\n        display: flex;\n        flex-direction: column;\n        height: 100%;\n        overflow: hidden;\n    }\n    .panel-top {\n        flex: 0 0 auto;\n        height: 50%;\n        width: 100%;\n    }\n    .panel-bottom {\n        flex: 1 1 auto;\n        background-color: #000000;\n    }\n    .panel-container {\n        display: flex;\n        flex-direction: row;\n        overflow: hidden;\n        height: 100%;\n        xtouch-action: none;\n    }\n    .terminal {\n        font-size: 15px\n    }\n    .panel-left {\n        flex: 0 0 auto;\n        width: 50%;\n        min-width: 150px;\n    }\n    .splitter {\n        flex: 0 0 auto;\n        width: 18px;\n        background: url(https://raw.githubusercontent.com/RickStrahl/jquery-resizable/master/assets/vsizegrip.png) center center no-repeat #101e26;\n        min-height: 200px;\n        cursor: col-resize;\n    }\n    .splitter-horizontal {\n        flex: 0 0 auto;\n        height: 5px;\n        background: url(https://raw.githubusercontent.com/RickStrahl/jquery-resizable/master/assets/hsizegrip.png) center center no-repeat #101e26;\n        cursor: row-resize;\n    }\n    .panel-right {\n        flex: 1 1 auto;\n        width: 100%;\n        background: #24323a\n    }\n    .pagination {\n        clear:both;\n        position:relative;\n        text-align:center;\n    }\n    .center {\n        text-align: center;\n    }\n</style>\n\n<link href=\"https://maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css\" rel=\"stylesheet\">\n</head>\n  <body>\n\n    <header class=\"site-header\">\n\n</header>\n<nav class=\"navbar navbar-default navbar-inverse\">\n\n    <div class=\"container\">\n      <div class=\"logo\"><img src=\"/static/TIME2CODE-grey.png\"></div>\n        <div class=\"navbar-header\">\n        <!--<a class=\"navbar-brand\" href=\"/\">Time2Code</a>-->\n          <button type=\"button\" class=\"navbar-toggle collapsed\" data-toggle=\"collapse\" data-target=\"#bs-example-navbar-collapse-1\" aria-expanded=\"false\">\n            <span class=\"sr-only\">Toggle navigation</span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n          </button>\n\n        </div>\n  </div><!-- /.container-fluid -->\n</nav>\n    <div class=\"panel-container-vertical\">\n    <div class=\"panel-container\">\n\n        <div class=\"panel-left\" style=\"overflow:auto;\">\n\n                <div id=\"tutorial\">{{ markdown }}</div>\n                <div class=\"center\" hidden><ul class=\"pagination\" id=\"buttons\">\n                    <li><a href=\"#\">«</a></li>\n                    <li><a href=\"#\">1</a></li>\n                    <li><a href=\"#\">2</a></li>\n                    <li><a href=\"#\">3</a></li>\n                    <li><a href=\"#\">4</a></li>\n                    <li><a href=\"#\">5</a></li>\n                    <li><a href=\"#\">6</a></li>\n                    <li><a href=\"#\">»</a></li>\n                </ul></div>\n\n        </div>\n\n        <div class=\"splitter\">\n        </div>\n\n        <div class=\"panel-right\" >\n            <div class=\"panel-top\" id=\"IDE\">{{ code_text }}</div>\n\n            <div class=\"splitter-horizontal\">\n            </div>\n\n            <div class=\"panel-bottom\">\n                <div id=\"terminal\">\n                </div>\n            </div>\n        </div>\n      </div>\n\n    </div>\n\n\n<script src=\"https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js\"></script>\n<script src=\"https://rawgit.com/RickStrahl/jquery-resizable/master/dist/jquery-resizable.min.js\"></script>\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/ace/1.2.7/ace.js\"></script>\n<script>\n    var IDE = ace.edit(\"IDE\");\n\n    IDE.setTheme(\"ace/theme/vibrant_ink\");\n    IDE.session.setMode(\"ace/mode/python\");\n\n    IDE.setShowPrintMargin(false);\n\n    $(\".panel-left\").resizable({\n        handleSelector: \".splitter\",\n        resizeHeight: false,\n    });\n</script>\n\n  <footer>\n    <nav class=\"navbar navbar-default\">\n      <div class=\"container-fluid\">\n        <ul class=\"nav navbar-nav\">\n            <li>\n                <button id=\"code\" onclick=\"termchange()\" class=\"btn btn-success navbar-btn\">RUN IT</button>\n                <button id=\"code\" onclick=\"termclear()\" class=\"btn btn-danger navbar-btn\">CLEAR TERM</button>\n            </li>\n            <form class=\"navbar-form navbar-right\">\n                <div class=\"form-group\">\n                  <select id=\"mode\" class=\"form-control\" style=\"float:right;\">\n                    <option label=\"python\" value=\"python3\">python3</option>\n                    <option label=\"golang\" value=\"golang\">golang</option>\n                    <option label=\"javascript\" value=\"nodejs\">nodejs</option>\n                    <option label=\"fortran\" value=\"fortran\">fortran</option>\n                    <option label=\"ruby\" value=\"ruby\">ruby</option>\n                    <option label=\"powershell\" value=\"powershell\">powershell</option>\n                    <option label=\"csharp\" value=\"csharp-experimental\">csharp-experimental</option>\n                  </select>\n                    <script>\n                        document.getElementById(\"mode\").value = \"{{ code_lang }}\";\n                        var modeElement = document.getElementById(\"mode\");\n                        mode = modeElement.options[modeElement.selectedIndex].label;\n                        var IDE = ace.edit(\"IDE\");\n                        IDE.session.setMode(\"ace/mode/\" + mode);\n                        var code = $('<textarea />').html(`{{ code_text }}`).text();\n                        IDE.setValue(code, -1);\n                        document.addEventListener(\"DOMContentLoaded\", function(event){\n                            $(\"#mode\").change(function() {\n                                var modeElement = document.getElementById(\"mode\");\n                                mode = modeElement.options[modeElement.selectedIndex].label;\n                                console.log(mode);\n                                var IDE = ace.edit(\"IDE\");\n                                IDE.setTheme(\"ace/theme/vibrant_ink\");\n                                IDE.session.setMode(\"ace/mode/\" + mode);\n                                IDE.setOption(\"showPrintMargin\", false);\n                            });\n                        });\n\n\n\n                    </script>\n                </div>\n            </form>\n        </ul>\n      </div>\n    </nav>\n\n</footer>\n\n  <script src=\"https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js\"></script>\n  <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\" integrity=\"sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa\" crossorigin=\"anonymous\"></script>\n  <script>\n        function sleep(ms) {\n          return new Promise(resolve => setTimeout(resolve, ms));\n        }\n\n        Terminal.loadAddon('fit');\n        var term = new Terminal({cursorBlink: false, rows: 12});\n        term.open(document.getElementById('terminal'));\n\n        async function termclear() {\n            term.destroy();\n            await sleep(100);\n            term = new Terminal({cursorBlink: false, rows: 12});\n            term.open(document.getElementById('terminal'));\n        };\n\n        function termchange() {\n                    var getmode = document.getElementById(\"mode\");\n                    var mode = getmode.options[getmode.selectedIndex].label;\n                    var mode_code = getmode.options[getmode.selectedIndex].value;\n                    var IDE = ace.edit(\"IDE\");\n                    var code = IDE.getValue();\n                    var url = \"http://\" + location.host + \"/code?lang=\" + mode_code;\n                    console.log(url);\n                    termclear()\n                    $.ajax({\n                        url: url,\n                        type: 'post',\n                        dataType: 'text',\n                        headers: {'Content-Type': 'text/plain'},\n                        // data: \"print('hey')\",\n                        data: code,\n                        success: function (data) {\n                            console.log(data);\n                            $(function () {\n                                var writePrompt = function () {\n                                    var termData = data.replace(/\\r?\\n/g, \"\\r\\n\");\n                                    term.writeln(termData);\n                                  };\n                                writePrompt();\n                                term.scrollToBottom();\n                            });\n                        },\n                    });\n\n                };\n\n\n        $(\"pre\").each(function() {\n            $(this).click(function() {\n                console.log($(this).text());\n                document.execCommand(\"copy\");\n                var IDE = ace.edit(\"IDE\");\n                var code = $('<textarea />').html($(this).text()).text();\n                IDE.setValue(code, -1);\n            })\n        });\n    </script>\n\n\n\n  </body>\n\n</html>"
  },
  {
    "path": "templates/index-tutorial.html",
    "content": "<html>\n\n  <head>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n\n<!-- UI based on the Play-With-Moby site and by the team at Play-With-Docker and the learning experiences they deliver everyday -->\n\n\n<link href=\"//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\" rel=\"stylesheet\">\n<link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/bootswatch/3.3.7/darkly/bootstrap.min.css\">\n<link rel=\"stylesheet\" href=\"https://fonts.googleapis.com/css?family=Lato:400,700,400italic\">\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/ace/1.2.8/ace.js\" type=\"text/javascript\"></script>\n<script src=\"http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js\" type=\"text/javascript\" charset=\"utf-8\"></script>\n<script src=\"https://cdn.rawgit.com/replit/jq-console/8baeef38/lib/jqconsole.js\" type=\"text/javascript\" charset=\"utf-8\"></script>\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/xterm/2.8.1/xterm.js\"></script>\n<link href=\"https://cdnjs.cloudflare.com/ajax/libs/xterm/2.8.1/xterm.css\" rel=\"stylesheet\"/>\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/xterm/2.8.1/addons/fit/fit.js\"></script>\n<script src=\"https://cdn.rawgit.com/showdownjs/showdown/<version tag>/dist/showdown.min.js\"></script>\n\n<style>\n    html, body {\n        height: 100%;\n        background-color: #24323a;\n        color: #fff;\n        overflow: auto;\n    }\n    body {\n        display: flex;\n        flex-direction: column\n    }\n    body>* {\n        flex: none\n    }\n    #window {\n        margin: 0;\n        width: 100%;\n        height: 100%;\n    }\n    #IDE {\n        background-color: #000000;\n    }\n    #tutorial {\n        padding-top: 25px;\n        padding-right: 25px;\n        padding-bottom: 25px;\n        padding-left: 25px;\n    }\n    #terminal {\n        height: 75%;\n        overflow: hidden;\n    }\n    .ace_layer ace_gutter-layer ace_folding-enabled {\n        background-color: #000000;\n    }\n    .navbar-header {\n        margin-top: 5px\n    }\n    .navbar-header button {\n        margin-left: 10px\n    }\n    .navbar-header input {\n        color: #000;\n        margin-left: 5px;\n        width: 300px;\n        display: none\n    }\n    .navbar {\n        border-radius: 0px;\n        margin-bottom: 0px;\n        postion: fixed;\n    }\n    .navbar.navbar-inverse, .navbar.navbar-default {\n        background-color: #052f47;\n        border-color: #052f47\n    }\n    .navbar.navbar-inverse a, .navbar.navbar-inverse .navbar-nav li a {\n        color: #fff\n    }\n    .navbar.navbar-inverse a:hover, .navbar.navbar-inverse .navbar-nav li a:hover {\n        text-decoration: underline\n    }\n    footer {\n        background-color: #052f47;\n        position: fixed;\n        bottom: 0;\n        width: 100%;\n    }\n    .navbar-brand {\n        font-weight: 900;\n        margin-left: 0px !important;\n        vertical-align: middle;\n        float: none\n    }\n    .panel {\n        border: none;\n        box-shadow: 0px 0px 1px #828282\n    }\n    .panel:hover {\n        box-shadow: 0px 0px 6px #828282\n    }\n    .panel-container-vertical {\n        display: flex;\n        flex-direction: column;\n        height: 100%;\n        overflow: hidden;\n    }\n    .panel-top {\n        flex: 0 0 auto;\n        height: 50%;\n        width: 100%;\n    }\n    .panel-bottom {\n        flex: 1 1 auto;\n        background-color: #000000;\n    }\n    .panel-container {\n        display: flex;\n        flex-direction: row;\n        overflow: hidden;\n        height: 100%;\n        xtouch-action: none;\n    }\n    .terminal {\n        font-size: 15px\n    }\n    .panel-left {\n        flex: 0 0 auto;\n        width: 50%;\n        min-width: 150px;\n    }\n    .splitter {\n        flex: 0 0 auto;\n        width: 18px;\n        background: url(https://raw.githubusercontent.com/RickStrahl/jquery-resizable/master/assets/vsizegrip.png) center center no-repeat #101e26;\n        min-height: 200px;\n        cursor: col-resize;\n    }\n    .splitter-horizontal {\n        flex: 0 0 auto;\n        height: 5px;\n        background: url(https://raw.githubusercontent.com/RickStrahl/jquery-resizable/master/assets/hsizegrip.png) center center no-repeat #101e26;\n        cursor: row-resize;\n    }\n    .panel-right {\n        flex: 1 1 auto;\n        width: 100%;\n        background: #24323a\n    }\n    .pagination {\n        clear:both;\n        position:relative;\n        text-align:center;\n    }\n    .center {\n        text-align: center;\n    }\n</style>\n\n<link href=\"https://maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css\" rel=\"stylesheet\">\n</head>\n  <body>\n\n    <header class=\"site-header\">\n\n</header>\n<nav class=\"navbar navbar-default navbar-inverse\">\n\n    <div class=\"container\">\n      <div class=\"logo\"><img src=\"/static/TIME2CODE-grey.png\"></div>\n        <div class=\"navbar-header\">\n        <!--<a class=\"navbar-brand\" href=\"/\">Time2Code</a>-->\n          <button type=\"button\" class=\"navbar-toggle collapsed\" data-toggle=\"collapse\" data-target=\"#bs-example-navbar-collapse-1\" aria-expanded=\"false\">\n            <span class=\"sr-only\">Toggle navigation</span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n          </button>\n\n        </div>\n  </div><!-- /.container-fluid -->\n</nav>\n    <div class=\"panel-container-vertical\">\n    <div class=\"panel-container\">\n\n        <div class=\"panel-left\" style=\"overflow:auto;\">\n\n                <div id=\"tutorial\">{{ markdown }}</div>\n                <div class=\"center\" hidden><ul class=\"pagination\" id=\"buttons\">\n                    <li><a href=\"#\">«</a></li>\n                    <li><a href=\"#\">1</a></li>\n                    <li><a href=\"#\">2</a></li>\n                    <li><a href=\"#\">3</a></li>\n                    <li><a href=\"#\">4</a></li>\n                    <li><a href=\"#\">5</a></li>\n                    <li><a href=\"#\">6</a></li>\n                    <li><a href=\"#\">»</a></li>\n                </ul></div>\n\n        </div>\n\n        <div class=\"splitter\">\n        </div>\n\n        <div class=\"panel-right\" >\n            <div class=\"panel-top\" id=\"IDE\">{{ code_text }}</div>\n\n            <div class=\"splitter-horizontal\">\n            </div>\n\n            <div class=\"panel-bottom\">\n                <div id=\"terminal\">\n                </div>\n            </div>\n        </div>\n      </div>\n\n    </div>\n\n\n<script src=\"https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js\"></script>\n<script src=\"https://rawgit.com/RickStrahl/jquery-resizable/master/dist/jquery-resizable.min.js\"></script>\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/ace/1.2.7/ace.js\"></script>\n<script>\n    var IDE = ace.edit(\"IDE\");\n\n    IDE.setTheme(\"ace/theme/vibrant_ink\");\n    IDE.session.setMode(\"ace/mode/python\");\n\n    IDE.setShowPrintMargin(false);\n\n    $(\".panel-left\").resizable({\n        handleSelector: \".splitter\",\n        resizeHeight: false,\n    });\n</script>\n\n  <footer>\n    <nav class=\"navbar navbar-default\">\n      <div class=\"container-fluid\">\n        <ul class=\"nav navbar-nav\">\n            <li>\n                <button id=\"code\" onclick=\"termchange()\" class=\"btn btn-success navbar-btn\">RUN IT</button>\n                <button id=\"code\" onclick=\"termclear()\" class=\"btn btn-danger navbar-btn\">CLEAR TERM</button>\n            </li>\n            <form class=\"navbar-form navbar-right\">\n                <div class=\"form-group\">\n                  <select id=\"mode\" class=\"form-control\" style=\"float:right;\">\n                    <option label=\"python\" value=\"python3\">python3</option>\n                    <option label=\"golang\" value=\"golang\">golang</option>\n                    <option label=\"javascript\" value=\"nodejs\">nodejs</option>\n                    <option label=\"fortran\" value=\"fortran\">fortran</option>\n                    <option label=\"ruby\" value=\"ruby\">ruby</option>\n                    <option label=\"powershell\" value=\"powershell\">powershell</option>\n                    <option label=\"csharp\" value=\"csharp-experimental\">csharp-experimental</option>\n                  </select>\n                    <script>\n                        document.getElementById(\"mode\").value = \"{{ code_lang }}\";\n                        var modeElement = document.getElementById(\"mode\");\n                        mode = modeElement.options[modeElement.selectedIndex].label;\n                        var IDE = ace.edit(\"IDE\");\n                        IDE.session.setMode(\"ace/mode/\" + mode);\n                        var code = $('<textarea />').html(`{{ code_text }}`).text();\n                        IDE.setValue(code, -1);\n                        document.addEventListener(\"DOMContentLoaded\", function(event){\n                            $(\"#mode\").change(function() {\n                                var modeElement = document.getElementById(\"mode\");\n                                mode = modeElement.options[modeElement.selectedIndex].label;\n                                console.log(mode);\n                                var IDE = ace.edit(\"IDE\");\n                                IDE.setTheme(\"ace/theme/vibrant_ink\");\n                                IDE.session.setMode(\"ace/mode/\" + mode);\n                                IDE.setOption(\"showPrintMargin\", false);\n                            });\n                        });\n\n\n\n                    </script>\n                </div>\n            </form>\n        </ul>\n      </div>\n    </nav>\n\n</footer>\n\n  <script src=\"https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js\"></script>\n  <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\" integrity=\"sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa\" crossorigin=\"anonymous\"></script>\n  <script>\n        function sleep(ms) {\n          return new Promise(resolve => setTimeout(resolve, ms));\n        }\n\n        Terminal.loadAddon('fit');\n        var term = new Terminal({cursorBlink: false, rows: 12});\n        term.open(document.getElementById('terminal'));\n\n        async function termclear() {\n            term.destroy();\n            await sleep(100);\n            term = new Terminal({cursorBlink: false, rows: 12});\n            term.open(document.getElementById('terminal'));\n        };\n\n        function termchange() {\n                    var getmode = document.getElementById(\"mode\");\n                    var mode = getmode.options[getmode.selectedIndex].label;\n                    var mode_code = getmode.options[getmode.selectedIndex].value;\n                    var IDE = ace.edit(\"IDE\");\n                    var code = IDE.getValue();\n                    var url = \"http://\" + location.host + \"/function/\" + mode_code;\n                    console.log(url);\n                    termclear()\n                    $.ajax({\n                        url: url,\n                        type: 'post',\n                        dataType: 'text',\n                        headers: {'Content-Type': 'text/plain'},\n                        // data: \"print('hey')\",\n                        data: code,\n                        success: function (data) {\n                            console.log(data);\n                            $(function () {\n                                var writePrompt = function () {\n                                    var termData = data.replace(/\\r?\\n/g, \"\\r\\n\");\n                                    term.writeln(termData);\n                                  };\n                                writePrompt();\n                                term.scrollToBottom();\n                            });\n                        },\n                    });\n\n                };\n\n\n        $(\"pre\").each(function() {\n            $(this).click(function() {\n                console.log($(this).text());\n                document.execCommand(\"copy\");\n                var IDE = ace.edit(\"IDE\");\n                var code = $('<textarea />').html($(this).text()).text();\n                IDE.setValue(code, -1);\n            })\n        });\n    </script>\n\n\n\n  </body>\n\n</html>"
  },
  {
    "path": "templates/index.html",
    "content": "<html>\n\n  <head>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n\n<!-- UI based on the Play-With-Moby site and by the team at Play-With-Docker and the learning experiences they deliver everyday -->\n\n\n<link href=\"//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\" rel=\"stylesheet\">\n<link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/bootswatch/3.3.7/darkly/bootstrap.min.css\">\n<link rel=\"stylesheet\" href=\"https://fonts.googleapis.com/css?family=Lato:400,700,400italic\">\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/ace/1.2.8/ace.js\" type=\"text/javascript\"></script>\n<script src=\"http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js\" type=\"text/javascript\" charset=\"utf-8\"></script>\n<script src=\"https://cdn.rawgit.com/replit/jq-console/8baeef38/lib/jqconsole.js\" type=\"text/javascript\" charset=\"utf-8\"></script>\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/xterm/2.8.1/xterm.js\"></script>\n<link href=\"https://cdnjs.cloudflare.com/ajax/libs/xterm/2.8.1/xterm.css\" rel=\"stylesheet\"/>\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/xterm/2.8.1/addons/fit/fit.js\"></script>\n\n<style>\n    html, body {\n        height: 100%;\n        background-color: #052f47;\n        color: #fff\n    }\n    img {\n        max-width: 100%\n    }\n    .mt50 {\n        margin-top: 50px\n    }\n    .mt20 {\n        margin-top: 20px\n    }\n    .mt10 {\n        margin-top: 10px\n    }\n    .mb10 {\n        margin-bottom: 10px\n    }\n    body {\n        display: flex;\n        flex-direction: column\n    }\n    body>* {\n        flex: none\n    }\n    #IDE {\n        background-color: #24323a\n    }\n    #terminal {\n        height: 100%;\n    }\n    .navbar-header {\n        margin-top: 5px\n    }\n    .navbar-header button {\n        margin-left: 10px\n    }\n    .navbar-header input {\n        color: #000;\n        margin-left: 5px;\n        width: 300px;\n        display: none\n    }\n    .navbar {\n        border-radius: 0px;\n        margin-bottom: 0px\n    }\n    .navbar.navbar-inverse {\n        background-color: #052f47;\n        border-color: #052f47\n    }\n    .navbar.navbar-inverse a, .navbar.navbar-inverse .navbar-nav li a {\n        color: #fff\n    }\n    .navbar.navbar-inverse a:hover, .navbar.navbar-inverse .navbar-nav li a:hover {\n        text-decoration: underline\n    }\n    footer {\n        background-color: #052f47\n    }\n    .navbar-brand {\n        font-weight: 900;\n        margin-left: 0px !important;\n        vertical-align: middle;\n        float: none\n    }\n    @media screen and (max-width: 600px) {\n        .navbar-brand {\n            font-size: 1.5em\n        }\n    }\n    .panel {\n        border: none;\n        box-shadow: 0px 0px 1px #828282\n    }\n    .panel:hover {\n        box-shadow: 0px 0px 6px #828282\n    }\n    .social {\n        list-style: none;\n        display: inline;\n        margin-left: 10px;\n        padding: 5px 8px\n    }\n    .social:hover {\n        opacity: 0.7\n    }\n    .social img {\n        width: 20px\n    }\n    .quora img {\n        width: 17px\n    }\n    .facebook img {\n        width: 16px\n    }\n    .panel-container {\n        display: flex;\n        flex-direction: row;\n        overflow: hidden;\n        height: 100%;\n        flex: 1 1 auto;\n        xtouch-action: none\n    }\n    .terminal {\n        font-size: 15px\n    }\n    .panel-left, IDE {\n        flex: 0 0 auto;\n        width: 50%;\n        min-width: 150px\n    }\n    .content {\n        padding: 0 15px;\n        overflow-y: auto\n    }\n    .content {\n        padding: 0 15px\n    }\n    .splitter {\n        flex: 0 0 auto;\n        width: 18px;\n        background: url(https://raw.githubusercontent.com/RickStrahl/jquery-resizable/master/assets/vsizegrip.png) center center no-repeat #101e26;\n        min-height: 200px;\n        cursor: col-resize\n    }\n    .panel-right {\n        display: flex;\n        flex-direction: column;\n        flex: 1 1 auto;\n        width: 100%;\n        background-color: #000000\n    }\n    .panel-right>div {\n        flex: 1 1 auto;\n        margin-bottom: 15px;\n        overflow-y: auto\n    }\n    .panel-right>div:last-of-type {\n        margin-bottom: 0px\n    }\n    .panel-right>div.initialized {\n        background-color: black\n    }\n    .post-tag {\n        display: inline-block;\n        background: rgba(42, 122, 226, 0.15);\n        padding: 0 .5rem;\n        margin-right: .5rem;\n        border-radius: 4px;\n        color: #2a7ae2;\n        font-family: \"Open Sans\", serif;\n        font-size: 90%\n    }\n    .post-tag:before {\n        content: \"\\f02b\";\n        font-family: FontAwesome;\n        padding-right: .5em\n    }\n    .post-tag:hover {\n        text-decoration: none;\n        background: #2a7ae2;\n        color: #fff\n    }\n    small .post-tag {\n        background: #eee;\n        color: #000\n    }\n    small .post-tag:before {\n        content: none\n    }\n    small .post-tag:hover {\n        text-decoration: none;\n        background: #000;\n        color: #fff;\n        cursor: default\n    }\n    .tags-expo :target:before {\n        content: \"\";\n        display: block;\n        height: 72px;\n        margin: -72px 0 0\n    }\n    @media (min-width: 38em) {\n        .tags-expo .tags-expo-list {\n            font-size: 2.9rem\n        }\n        .tags-expo .tags-expo-list .post-tag {\n            margin: .2em .3em\n        }\n    }\n    .tags-expo .tags-expo-section {\n        font-family: \"Open Sans\", serif\n    }\n    .tags-expo .tags-expo-section ul {\n        list-style-type: circle;\n        list-style-position: inside;\n        padding: 0\n    }\n    .tags-expo .tags-expo-section ul li {\n        padding: 0 1rem\n    }\n    .tags-expo .tags-expo-section ul li:hover {\n        list-style-type: disc\n    }\n    .tags-expo .tags-expo-section a {\n        font-size: 20px\n    }\n    .tags-expo .tags-expo-section .post-date {\n        display: inline-block;\n        font-size: 80%;\n        color: #000;\n        margin: 0;\n        padding: 0\n    }\n</style>\n\n<link href=\"https://maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css\" rel=\"stylesheet\">\n</head>\n  <body>\n\n    <header class=\"site-header\">\n<nav class=\"navbar navbar-default navbar-inverse\">\n\n    <div class=\"container\">\n      <div class=\"logo\"><img src=\"../static/TIME2CODE-grey.png\"></div>\n        <div class=\"navbar-header\">\n        <!--<a class=\"navbar-brand\" href=\"/\">Time2Code</a>-->\n          <button type=\"button\" class=\"navbar-toggle collapsed\" data-toggle=\"collapse\" data-target=\"#bs-example-navbar-collapse-1\" aria-expanded=\"false\">\n            <span class=\"sr-only\">Toggle navigation</span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n          </button>\n\n        </div>\n  </div><!-- /.container-fluid -->\n</nav>\n</header>\n\n\n    <div class=\"panel-container\">\n        <div class=\"panel-left\" id=\"IDE\"/>\n    </div>\n\n    <div class=\"splitter\">\n    </div>\n    <div class=\"panel-right\">\n        <div id=\"terminal\"></div>\n          <script>\n\n          </script>\n    </div>\n</div>\n\n\n<script src=\"https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js\"></script>\n<script src=\"https://rawgit.com/RickStrahl/jquery-resizable/master/dist/jquery-resizable.min.js\"></script>\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/ace/1.2.7/ace.js\"></script>\n<script>\n    var IDE = ace.edit(\"IDE\");\n\n    IDE.setTheme(\"ace/theme/vibrant_ink\");\n    IDE.session.setMode(\"ace/mode/python\");\n\n    IDE.setShowPrintMargin(false);\n\n    $(\".panel-left\").resizable({\n        handleSelector: \".splitter\",\n        resizeHeight: false,\n    });\n</script>\n\n\n\n  <footer>\n    <nav class=\"navbar navbar-default\">\n      <div class=\"container-fluid\">\n        <ul class=\"nav navbar-nav\">\n            <li>\n                <button id=\"code\" onclick=\"termchange()\" class=\"btn btn-success navbar-btn\">RUN IT</button>\n                <button id=\"code\" onclick=\"termclear()\" class=\"btn btn-danger navbar-btn\">CLEAR TERM</button>\n            </li>\n            <form class=\"navbar-form navbar-right\">\n                <div class=\"form-group\">\n                  <select id=\"mode\" class=\"form-control\" style=\"float:right;\">\n                    <option label=\"python\" value=\"python3\">python3</option>\n                    <option label=\"golang\" value=\"golang\">golang</option>\n                    <option label=\"javascript\" value=\"nodejs\">nodejs</option>\n                    <option label=\"fortran\" value=\"fortran\">fortran</option>\n                    <option label=\"ruby\" value=\"ruby\">ruby</option>\n                    <option label=\"powershell\" value=\"powershell\">powershell</option>\n                    <option label=\"csharp\" value=\"csharp-experimental\">csharp-experimental</option>\n                  </select>\n                    <script>\n                        document.getElementById(\"mode\").value = \"{{ code_lang }}\";\n                        var modeElement = document.getElementById(\"mode\");\n                        mode = modeElement.options[modeElement.selectedIndex].label;\n                        var IDE = ace.edit(\"IDE\");\n                        var code = $('<textarea />').html(`{{ code_text }}`).text();\n                        IDE.setValue(code, -1);\n                        IDE.session.setMode(\"ace/mode/\" + mode);\n                        document.addEventListener(\"DOMContentLoaded\", function(event){\n                            $(\"#mode\").change(function() {\n                                var modeElement = document.getElementById(\"mode\");\n                                mode = modeElement.options[modeElement.selectedIndex].label;\n                                console.log(mode);\n                                var IDE = ace.edit(\"IDE\");\n                                IDE.setTheme(\"ace/theme/vibrant_ink\");\n                                IDE.session.setMode(\"ace/mode/\" + mode);\n                                IDE.setOption(\"showPrintMargin\", false);\n                            });\n                        });\n                    </script>\n                </div>\n            </form>\n      </div>\n    </nav>\n\n</footer>\n\n  <script src=\"https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js\"></script>\n  <script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\" integrity=\"sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa\" crossorigin=\"anonymous\"></script>\n  <script>\n        function sleep(ms) {\n          return new Promise(resolve => setTimeout(resolve, ms));\n        }\n\n        var term = new Terminal({cursorBlink: false, rows: 40});\n        term.open(document.getElementById('terminal'));\n\n        function termchange() {\n                    var getmode = document.getElementById(\"mode\");\n                    var mode = getmode.options[getmode.selectedIndex].label;\n                    var mode_code = getmode.options[getmode.selectedIndex].value;\n                    var IDE = ace.edit(\"IDE\");\n                    var code = IDE.getValue();\n                    var url = \"http://\" + location.host + \"/function/\" + mode_code;\n                    console.log(url)\n                    $.ajax({\n                        url: url,\n                        type: 'post',\n                        dataType: 'text',\n                        headers: {'Content-Type': 'text/plain'},\n                        // data: \"print('hey')\",\n                        data: code,\n                        success: function (data) {\n                            console.log(data);\n                            $(function () {\n                                var writePrompt = function () {\n                                    var termData = data.replace(/\\r?\\n/g, \"\\r\\n\");\n                                    term.writeln(termData);\n                                  };\n                                writePrompt();\n                                term.scrollToBottom();\n                            });\n                        },\n                    });\n\n                };\n\n        async function termclear() {\n            term.destroy();\n            await sleep(100);\n            term = new Terminal({cursorBlink: false, rows: 40});\n            term.open(document.getElementById('terminal'));\n        };\n    </script>\n\n\n\n  </body>\n\n</html>"
  },
  {
    "path": "time2code-faas-cli-functions.yml",
    "content": "provider:\n  name: faas\n  gateway: http://localhost:31112\n\nfunctions:\n  time2code:\n    fprocess: python3 handler.py\n    image: jockdarock/time2code:master\n  golang:\n    fprocess: python3 time2go.py\n    image: jockdarock/time2go:latest\n\n  python3:\n    fprocess: python3 time2py.py\n    image: jockdarock/time2py:latest\n\n  powershell:\n    fprocess: python3 time2powershell.py\n    image: jockdarock/time2powershell:latest\n\n  nodejs:\n    fprocess: python3 time2nodejs.py\n    image: jockdarock/time2nodejs:latest\n\n  csharp-experimental:\n    fprocess: python3 time2CSharp.py\n    image: jockdarock/time2csharp:latest\n\n  fortran:\n    fprocess: python3 time2fortran.py\n    image: jockdarock/time2fortran:latest\n\n  ruby:\n    fprocess: python3 time2ruby.py\n    image: jockdarock/time2ruby:latest\n"
  },
  {
    "path": "time2code-server-k8s.yml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  name: time2codeserver\nspec:\n  type: LoadBalancer\n  ports:\n  - name: time2codeserver-5555\n    port: 5555\n    protocol: TCP\n    targetPort: 5555\n  selector:\n    app: time2codeserver\n    component: time2codeserver\n\n---\napiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: time2codeserver\nspec:\n  replicas: 3\n  rollbackTo:\n    revision: 0\n  selector:\n    matchLabels:\n      app: time2codeserver\n      component: time2codeserver\n  strategy:\n    rollingUpdate:\n      maxSurge: 3\n      maxUnavailable: 1\n    type: RollingUpdate\n  template:\n    metadata:\n      labels:\n        app: time2codeserver\n        component: time2codeserver\n    spec:\n      containers:\n      - image: jockdarock/time2codeserver:latest\n        name: time2codeserver\n        imagePullPolicy: Always\n        env:\n        - name: time2code_provider_url\n          value: \"http://time2codeserver.default:5555\"\n        ports:\n        - containerPort: 5555\n          protocol: TCP\n      restartPolicy: Always\n"
  },
  {
    "path": "time2code-swarm-deploy.yml",
    "content": "version: \"3\"\nservices:\n# Setup FaaS Framework First\n# Core API services for FaaS are pinned, HA is provided for functions.\n    gateway:\n        volumes:\n            - \"/var/run/docker.sock:/var/run/docker.sock\"\n        ports:\n            - 8080:8080\n        image: functions/gateway:0.6.13\n        networks:\n            - functions\n        environment:\n            dnsrr: \"true\"  # Temporarily use dnsrr in place of VIP while issue persists on PWD\n            read_timeout: \"60\"\n            write_timeout: \"60\"\n        deploy:\n            placement:\n                constraints: [node.role == manager]\n\n    prometheus:\n        image: functions/prometheus:latest  # autobuild from Dockerfile in repo.\n        command: \"-config.file=/etc/prometheus/prometheus.yml -storage.local.path=/prometheus -storage.local.memory-chunks=10000 --alertmanager.url=http://alertmanager:9093\"\n        ports:\n            - 9090:9090\n        depends_on:\n            - gateway\n            - alertmanager\n        environment:\n            no_proxy: \"gateway\"\n        networks:\n            - functions\n        deploy:\n            placement:\n                constraints: [node.role == manager]\n\n    alertmanager:\n        image: functions/alertmanager:latest    # autobuild from Dockerfile in repo.\n        environment:\n            no_proxy: \"gateway\"\n        command:\n            - '-config.file=/alertmanager.yml'\n        networks:\n            - functions\n        ports:\n            - 9093:9093\n        deploy:\n            placement:\n                constraints: [node.role == manager]\n\n    # Code execution functions on FaaS\n    # Python Code Execution\n    python3:\n        image: jockdarock/time2py:latest\n        labels:\n            function: \"true\"\n        depends_on:\n            - gateway\n        networks:\n            - functions\n        environment:\n            fprocess: \"python3 time2py.py\"\n            no_proxy: \"gateway\"\n            https_proxy: $https_proxy\n            read_timeout: \"60\"\n            write_timeout: \"60\"\n\n    # Golang Code Execution\n    golang:\n        image: jockdarock/time2go:latest\n        labels:\n            function: \"true\"\n        depends_on:\n            - gateway\n        networks:\n            - functions\n        environment:\n            fprocess: \"python3 time2go.py\"\n            no_proxy: \"gateway\"\n            https_proxy: $https_proxy\n            read_timeout: \"60\"\n            write_timeout: \"60\"\n\n    # Powershell Code Execution\n    powershell:\n        image: jockdarock/time2powershell:latest\n        labels:\n            function: \"true\"\n        depends_on:\n            - gateway\n        networks:\n            - functions\n        environment:\n            fprocess: \"python3 time2powershell.py\"\n            no_proxy: \"gateway\"\n            https_proxy: $https_proxy\n            read_timeout: \"60\"\n            write_timeout: \"60\"\n\n    # DotNet / C# Code Execution\n    csharp-experimental:\n        image: jockdarock/time2csharp:latest\n        labels:\n            function: \"true\"\n        depends_on:\n            - gateway\n        networks:\n            - functions\n        environment:\n            fprocess: \"python3 time2CSharp.py\"\n            no_proxy: \"gateway\"\n            https_proxy: $https_proxy\n            read_timeout: \"60\"\n            write_timeout: \"60\"\n\n    # NodeJS Code Execution\n    nodejs:\n        image: jockdarock/time2nodejs:latest\n        labels:\n            function: \"true\"\n        depends_on:\n            - gateway\n        networks:\n            - functions\n        environment:\n            fprocess: \"python3 time2nodejs.py\"\n            no_proxy: \"gateway\"\n            https_proxy: $https_proxy\n            read_timeout: \"60\"\n            write_timeout: \"60\"\n\n    # Fortran Code Execution\n    fortran:\n        image: jockdarock/time2fortran:latest\n        labels:\n            function: \"true\"\n        depends_on:\n            - gateway\n        networks:\n            - functions\n        environment:\n            fprocess: \"python3 time2fortran.py\"\n            no_proxy: \"gateway\"\n            https_proxy: $https_proxy\n            read_timeout: \"60\"\n            write_timeout: \"60\"\n\n    # Fortran Code Execution\n    ruby:\n        image: jockdarock/time2ruby:latest\n        labels:\n            function: \"true\"\n        depends_on:\n            - gateway\n        networks:\n            - functions\n        environment:\n            fprocess: \"python3 time2ruby.py\"\n            no_proxy: \"gateway\"\n            https_proxy: $https_proxy\n            read_timeout: \"60\"\n            write_timeout: \"60\"\n\n    # Time2Code Code Editor / Flask Web Server\n    time2codeserver:\n      depends_on:\n            - gateway\n      build:\n        context: .\n        dockerfile: Dockerfile.nofaas\n      deploy:\n        replicas: 2\n      image: jockdarock/time2codeserver:latest\n      networks:\n        - functions\n      ports:\n        - \"5555:5555\"\n\nnetworks:\n    functions:\n        driver: overlay\n\n"
  },
  {
    "path": "time2deploy.sh",
    "content": "#!/bin/sh\n\necho \"Deploying Time2Code on FaaS\"\ncurl -O https://raw.githubusercontent.com/JockDaRock/Time2Code/master/time2code-swarm-deploy.yml\ndocker stack deploy time2code --compose-file time2code-swarm-deploy.yml"
  }
]