{"action":"created","comment":{"url":"https://api.github.com/repos/auvsi-suas/interop/pulls/comments/79309855","id":79309855,"diff_hunk":"@@ -0,0 +1,510 @@\n+Getting Started\n+===============\n+\n+This section describes how to go from setting up the Interoperability Server to\n+completing interop tasks with the provided client library. The following code\n+and command examples work with the competition's host operating system, Ubuntu\n+16.04.\n+\n+\n+Prerequisites\n+-------------\n+\n+The Interoperability System builds on top a set of standard technologies. These\n+technologies should be learned and understood prior to using the\n+Interoperability System. The following are resources the reader can use to\n+learn these technologies.\n+\n+#. `Ubuntu 16.04 <http://www.ubuntu.com/download/desktop/install-ubuntu-desktop>`__\n+#. `Ubuntu Terminal <https://help.ubuntu.com/community/UsingTheTerminal>`__\n+#. `Linux Shell <http://linuxcommand.org/learning_the_shell.php>`__\n+#. `Git <https://git-scm.com/doc>`__\n+#. `Github <https://guides.github.com/activities/hello-world/>`__\n+#. `Docker <https://docs.docker.com/engine/getstarted/>`__\n+#. `Python <https://docs.python.org/2/tutorial/>`__\n+#. `Virtualenv <https://virtualenv.pypa.io/en/stable/>`__\n+#. `Pip <https://pip.pypa.io/en/stable/user_guide/>`__\n+#. `Django <https://docs.djangoproject.com/en/1.8/intro/>`__\n+#. `Postgres <https://www.postgresql.org/docs/9.3/static/index.html>`__\n+#. `Apache <http://httpd.apache.org/docs/2.0/>`__\n+\n+\n+Computers and Networking\n+------------------------\n+\n+This subsection describes the computer and networking setup at competition. The\n+teams should replicate this setup to test their integration.\n+\n+**IP Addresses, Username, & Password.** At Check-In and Orientation, teams will\n+be given a static IP address, a DHCP IP address range, the server IP address\n+and port, a username, and a password. The static IP address (e.g.\n+``10.10.10.3``) will be a single address unique to the team which can be used\n+to connect to the system. The DHCP range will be a common range that will be\n+provisioned to teams automatically by the interop router. The router will be on\n+the subnet ``10.10.130.XXX`` with subnet mask ``255.255.255.0``. The server IP\n+address and port will be used to communicate with the interop server (e.g.\n+``http://10.10.130.2:8000``). The username (e.g. ``testuser``) and password\n+(e.g. ``testpass``) will be the interop server login credentials required to\n+execute requests. The username will not be for a superuser/administrator\n+account on the server.\n+\n+**Ethernet Cord.** During Mission Setup, the teams will be provided a single\n+ethernet cord. This cord will connect the team's system to the interop router,\n+which will be connected to the interop server. The mission clock will end once\n+the team has evacuated the runway and returned this ethernet cord.\n+\n+The following shows how the Interoperability System will be connected, and the\n+recommended means of connecting the team's system. Note the IP addresses are\n+examples.\n+\n+.. graphviz::\n+\n+  graph interop {\n+\tsplines=ortho;\n+    node [shape=box];\n+    subgraph cluster_judges {\n+\t  color=blue;\n+      label=\"Judges\";\n+      subgraph cluster_interop_router {\n+        style=filled;\n+        color=lightgrey;\n+        label=\"Interop Router: 10.10.130.1\";\n+        node [style=filled,color=white];\n+  \t    interop_lan0 [label=\"LAN 0: 10.10.130.2\"];\n+\t    interop_lan1 [label=\"LAN 1: 10.10.130.3\"];\n+\t\tinterop_lan1 -- interop_lan0;\n+      }\n+\t  interop_server [label=\"Interop Server: 10.10.130.2\"];\n+  \t  interop_lan0 -- interop_server;\n+   }\n+\n+\tsubgraph cluster_team {\n+\t  color=blue;\n+      label=\"Team\";\n+      subgraph cluster_team_router {\n+        style=filled;\n+        color=lightgrey;\n+        label=\"Team Router: 192.168.1.1\";\n+        node [style=filled,color=white];\n+        team_wlan [label=\"WLAN: 10.10.130.3\"];\n+        team_lan0 [label=\"LAN 0: 192.168.1.2\"];\n+\t\tteam_wlan -- team_lan0;\n+      }\n+      team_computer [label=\"Team Computer: 192.168.1.2\"];\n+      team_lan0 -- team_computer;\n+    }\n+\n+    interop_lan1 -- team_wlan [constraint=false];\n+  }\n+\n+**Interop Hardware**. The hardware consists of a router and a computer. The\n+router will be configured to have a static IP address range, and a DHCP IP\n+address range. All connected judge computers will be at a static IP address.\n+The judges may also use network configuration, like VLANs, to further isolate\n+network traffic. The interop host machine will be a computer running Ubuntu\n+14.04 or 16.04, and will run the server Docker image to host the inteorp server.\n+\n+**Interop Supporting Hardware**. The judges have additional hardware to improve\n+reliability of the interop deployment. The judges use an additional computer to\n+act as a black-box prober which continuously executes requests to validate\n+availability. The judges also use UPS battery backups to prevent unavailability\n+due to generator power loss.\n+\n+**Team Router**. The judges recommend that teams use a router to have a\n+separate subnet. The judge provided ethernet cord will then connect a LAN port\n+on the interop router to the WAN port on the team's router. This will allow\n+multiple team computers to communicate with the interop server at the same\n+time. This will also allow a single computer to simultaneously communicate with\n+the interop server and other team computers.\n+\n+**Team Machine**. The teams will need at least one computer to communicate with\n+the interop server. The judges recommend that teams leverage the provided\n+client library and tools, which are available in the client Docker image.\n+Teams may also integrate directly via the HTTP + JSON protocol.\n+\n+\n+Git Repository\n+--------------\n+\n+The Interoperability System is developed through the `AUVSI SUAS Competition\n+Repository <https://github.com/auvsi-suas/interop>`__. The first step is to\n+clone the repository locally.\n+\n+.. code-block:: bash\n+\n+    sudo apt-get install -y git\n+    cd ~/\n+    git clone https://github.com/auvsi-suas/interop.git\n+\n+\n+Docker Images\n+-------------\n+\n+The Interoperability System is released to teams as Docker images.  The images\n+can be used to run the server and client tools with minimal setup.\n+\n+**Setup the Host Computer**. The next step is to setup the host computer\n+(Ubuntu 16.04) to run Docker images. The repo provides a script in the\n+repository to do such.  For alternative deployments, you can use the `Docker\n+Engine Installation <https://docs.docker.com/engine/installation/>`__ guide.\n+\n+.. code-block:: bash\n+\n+    cd ~/interop\n+    ./tools/setup_docker.sh\n+    ./tools/setup_tools.sh\n+\n+\n+auvsisuas/interop.server\n+~~~~~~~~~~~~~~~~~~~~~~~~\n+\n+**Create and Start Container**. The interop server is provided as a Docker\n+image and should be run as a Docker container. The repo provides a script to\n+run the container in a standard way: it creates the container, runs it in the\n+background, uses port ``8000`` for the web server, and restarts automatically\n+(e.g. on failure or boot) unless explicitly stopped.\n+\n+.. code-block:: bash\n+\n+    cd ~/interop\n+    ./server/run.sh\n+\n+**Stop and Start**. Once the server is running, it can be stopped and started\n+again. Note that the ``run.sh`` creates and starts the container- it can't be\n+used to start an existing stopped container. The following can start and stop\n+the container.\n+\n+.. code-block:: bash\n+\n+    sudo docker stop interop.server\n+    sudo docker start interop.server\n+\n+**Container Shell**. To inspect state, use local server tools (e.g. Django's\n+management tool), or do other container-local actions, you can start a bash\n+shell inside of the container. The following shows how to start the shell.\n+\n+.. code-block:: bash\n+\n+    sudo docker exec -it interop.server bash\n+\n+**Dump Database, Dump Server Log**. The shell will start the user inside of the\n+working directory (server source code) at ``/interop/server``. The following\n+shows how to dump the database to standard output, dump the server log file to\n+standard output, and exit the shell.\n+\n+.. code-block:: bash\n+\n+    cd /interop/server\n+    python manage.py dumpdata\n+\n+    cd /var/log/apache2\n+    cat interop_server_error.log\n+\n+    exit\n+\n+**Remove Container**. The container will maintain database and log state\n+between starts and stops of the same container. The state, which includes data\n+like telemetry will automatically be deleted if the container is removed. The\n+following can remove a container.\n+\n+.. code-block:: bash\n+\n+    sudo docker stop interop.server\n+    sudo docker rm interop.server\n+\n+\n+auvsisuas/interop.client\n+~~~~~~~~~~~~~~~~~~~~~~~~\n+\n+**Create Container & Start Shell**. The interop client library and tools are\n+provided as a Docker image and can be run as a Docker container. The repo\n+provides a script to run the container in a standard way: it creates the\n+container and starts a pre-configured shell.\n+\n+.. code-block:: bash\n+\n+    cd ~/interop\n+    ./client/run.sh\n+\n+**Get Missions**. The client image provides a script to request mission details\n+from the interoperability server, and it can be executed from the container\n+shell. The following shows how to execute it for the default testing user\n+(``testuser``) if the interop server was at ``192.168.1.2:8000``.\n+\n+.. code-block:: bash\n+\n+    cd /interop/client\n+    ./tools/get_missions.py --url http://192.168.1.2:8000 \\\n+        --username testuser --password testpass\n+\n+**Upload Targets**. The client image provides a script to upload targets to the\n+interop server from a tab-delimited text file and a set of target images. The\n+required file format can be found in the `competition rules\n+<http://www.auvsi-suas.org/static/competitions/2016/auvsi_suas-2016-rules.pdf>`__.\n+The following shows how to upload targets from the client container shell.\n+\n+.. code-block:: bash\n+\n+    cd /interop/client\n+    ./tools/upload_targets.py --url http://192.168.1.2:8000 \\\n+        --username testuser --password testpass \\\n+        --target_filepath tools/testdata/targets.txt --imagery_dir tools/testdata/\n+\n+**Probe Server**. The client image provides a script to continuously execute\n+dummy interop requests to test server availability. The following shows how to\n+execute the prober from the client container shell.\n+\n+.. code-block:: bash\n+\n+    cd /interop/client\n+    ./tools/prober.py --url http://192.168.1.2:8000 \\\n+        --username testuser --password testpass \\\n+        --interop_time 1.0\n+\n+\n+Mission Configuration\n+---------------------\n+\n+This section describes how to configure a mission as an administrator on a\n+running interop server.\n+\n+**Preconfigured Users**. The interop server Docker image comes with 2 users\n+preconfigured: a test team user (``testuser``, ``testpass``), and a test admin\n+user (``testadmin``, ``testpass``). At competition, the judges will have a\n+secret admin account (``testadmin`` will be deleted), and the teams will be\n+given a new team account (not ``testuser`` with ``testpass``). Don't confuse\n+the capabilities of the two accounts! Don't hard-code the username and\n+password!\n+\n+**Admin Web Login**. The interop server has an admin webpage that can be used\n+to configure the server. Navigate to `<http://localhost:8000>`__ in a web\n+browser. You may need to replace ``localhost:8000`` if you've configured the\n+setup differently. This will prompt for an admin account login, so enter the\n+preconfigured user: ``testadmin`` with password ``testpass``.\n+\n+**SUAS Admin Dashboard**. After login it will show the SUAS made admin\n+dashboard. It will have a navigation bar with system-wide and mission-specific\n+links. The homagepage for the dashboard will also list the current missions,\n+and should show the single mission which comes with the image. If you click the\n+mission, you will be brought to a mission-specific dashboard. Click the \"Help\"\n+button on the mission dashboard to learn how to use this interface.\n+\n+* System\n+\n+   * *Live View (KML)*. Downloads a KML file which can be opened in Google\n+     Earth to view real-time information. This provides a visualization that\n+     complements the one provided in this interface.\n+   * *Export Data (KML)*. Downloads a KML file which can be opened in Google\n+     Earth to view the UAS telemetry and other mission data after the mission\n+     is completed.\n+   * *Edit Data*. Opens the Django Admin Interface which can be used to\n+     configure missions and view raw data.\n+   * *Clear Cache*. Caching is used to improve performance of certain\n+     operations. The caches automatically expire, so users shouldn't need to\n+     use this, but data modification mid-mission may require explicit clearing\n+     to react faster.\n+\n+* Mission\n+\n+   * *Dashboard*. Navigates to the dashboard showing all mission elements,\n+     active team details, etc.\n+   * *Review Targets*. Navigates to the page to review targets submitted.\n+   * *Evaluate Teams (CSV)*. Evaluates the teams for the mission being viewed.\n+     This is otherwise the same as the System link.\n+\n+\n+**Django Admin Dashboard**. From the SUAS Admin Dashboard, you can use the menu\n+``System > Edit Data`` to open the Django Admin dashboard. You should know how\n+to use this interface from the Prerequisite work. The following explains the\n+key models for configuration.\n+\n+==================  ===========================================================\n+Model Name          Description\n+==================  ===========================================================\n+User                The user accounts.\n+GpsPosition         A GPS position (latitude & longitude).\n+AerialPosition      An aerial position (GPS position & altitude).\n+Waypoint            An ordered aerial position (aerial position & order ID).\n+FlyZone             A flight boundary polygon (Waypoints and min/max altitude).\n+StationaryObstacle  A stationary obstacle (GPS position, radius, & height).\n+MovingObstacle      A moving obstacle (Waypoints, speed, & radius).\n+Targets             The user submitted targets, and judge \"true\" targets.\n+MissionConfig       Mission configuration that groups sub-objects logically.\n+UasTelemetry        The user uploaded telemetry (aerial position & time).\n+==================  ===========================================================\n+\n+**Mission Configuration**. To configure a mission, create or edit the\n+``MissionConfig`` object to specify the desired flight boundaries, waypoints,\n+true targets (for grading base targets), etc. Once the updated mission and\n+subobjects have been saved, the cache should be cleared via the SUAS\n+Dashboard's menu ``System > Clear Cache``.\n+\n+**Mission Clock Events**. When the mission clock for a team starts, the interop\n+judge creates a ``MissionClockEvent`` for the team indicating the team has gone\n+on the clock. The judge creates another object to indicate the team has gone\n+off the clock. The time is automatically set at time of save. This is used to\n+evaluate mission clock time and to ensure target review doesn't start before\n+targets are frozen.\n+\n+**Takeoff or Landing Events**. When a team takes off and when a team lands, the\n+interop judge creates a ``TakeoffOrLandingEvent`` to mark the evenet. The time\n+is automatically set at time of save. This is used to evaluate UAS telemetry\n+rates, waypoints, and collisions only while airborne.\n+\n+\n+Interop Integration\n+-------------------\n+\n+This section provides examples for how to integrate with the interop server\n+beyond using the provided tools.\n+\n+\n+Example Request with CURL\n+~~~~~~~~~~~~~~~~~~~~~~~~~\n+\n+The following is an example of how to perform interoperability using the\n+``curl`` command. **This is too inefficient to achieve a sufficient\n+update rate**. This merely shows how simple it is to implement\n+interoperability from standard HTTP and JSON.\n+\n+The curl command has the following parameters:\n+\n+#. **-b**: The place to save received cookies.\n+#. **-c**: The place to load and send cookies.","path":"docs/getting_started.rst","position":373,"original_position":373,"commit_id":"753bb2d7e82718ef42f5cdc0e72d575c2db0bda1","original_commit_id":"753bb2d7e82718ef42f5cdc0e72d575c2db0bda1","user":{"login":"pmtischler","id":2326936,"avatar_url":"https://avatars.githubusercontent.com/u/2326936?v=3","gravatar_id":"","url":"https://api.github.com/users/pmtischler","html_url":"https://github.com/pmtischler","followers_url":"https://api.github.com/users/pmtischler/followers","following_url":"https://api.github.com/users/pmtischler/following{/other_user}","gists_url":"https://api.github.com/users/pmtischler/gists{/gist_id}","starred_url":"https://api.github.com/users/pmtischler/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pmtischler/subscriptions","organizations_url":"https://api.github.com/users/pmtischler/orgs","repos_url":"https://api.github.com/users/pmtischler/repos","events_url":"https://api.github.com/users/pmtischler/events{/privacy}","received_events_url":"https://api.github.com/users/pmtischler/received_events","type":"User","site_admin":false},"body":"Done.","created_at":"2016-09-18T16:46:31Z","updated_at":"2016-09-18T16:46:31Z","html_url":"https://github.com/auvsi-suas/interop/pull/172#discussion_r79309855","pull_request_url":"https://api.github.com/repos/auvsi-suas/interop/pulls/172","_links":{"self":{"href":"https://api.github.com/repos/auvsi-suas/interop/pulls/comments/79309855"},"html":{"href":"https://github.com/auvsi-suas/interop/pull/172#discussion_r79309855"},"pull_request":{"href":"https://api.github.com/repos/auvsi-suas/interop/pulls/172"}}},"pull_request":{"url":"https://api.github.com/repos/auvsi-suas/interop/pulls/172","id":85224658,"html_url":"https://github.com/auvsi-suas/interop/pull/172","diff_url":"https://github.com/auvsi-suas/interop/pull/172.diff","patch_url":"https://github.com/auvsi-suas/interop/pull/172.patch","issue_url":"https://api.github.com/repos/auvsi-suas/interop/issues/172","number":172,"state":"open","locked":false,"title":"Switch to Docker. Restructure Repo. Remove Puppet.","user":{"login":"pmtischler","id":2326936,"avatar_url":"https://avatars.githubusercontent.com/u/2326936?v=3","gravatar_id":"","url":"https://api.github.com/users/pmtischler","html_url":"https://github.com/pmtischler","followers_url":"https://api.github.com/users/pmtischler/followers","following_url":"https://api.github.com/users/pmtischler/following{/other_user}","gists_url":"https://api.github.com/users/pmtischler/gists{/gist_id}","starred_url":"https://api.github.com/users/pmtischler/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pmtischler/subscriptions","organizations_url":"https://api.github.com/users/pmtischler/orgs","repos_url":"https://api.github.com/users/pmtischler/repos","events_url":"https://api.github.com/users/pmtischler/events{/privacy}","received_events_url":"https://api.github.com/users/pmtischler/received_events","type":"User","site_admin":false},"body":"Fixes #103\r\n\r\nAdd Dockerfiles and utility scripts to create an image for the server\r\nand an image for the client. Use separate images to provide granular\r\ndeployment, and allow teams to build custom image from client image.\r\n\r\nRestructure repo so subdirectories (server, client, tools) seperately\r\nsetup/build and run, mirroring Docker structure.\r\n\r\nRemove Puppet because it adds another dependency which has caused\r\nflakiness and breakages. It's less useful with Docker images built from\r\nscratch each time. Docker needs all setup in Dockerfile (not Puppet) in \r\norder to do incremental builds.\r\n\r\nSimplify and update the documentation to match new structure.","created_at":"2016-09-14T13:11:20Z","updated_at":"2016-09-18T16:46:31Z","closed_at":null,"merged_at":null,"merge_commit_sha":"2e2fb522dd6c2e0153799183835887255fecad68","assignee":{"login":"prattmic","id":1293187,"avatar_url":"https://avatars.githubusercontent.com/u/1293187?v=3","gravatar_id":"","url":"https://api.github.com/users/prattmic","html_url":"https://github.com/prattmic","followers_url":"https://api.github.com/users/prattmic/followers","following_url":"https://api.github.com/users/prattmic/following{/other_user}","gists_url":"https://api.github.com/users/prattmic/gists{/gist_id}","starred_url":"https://api.github.com/users/prattmic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/prattmic/subscriptions","organizations_url":"https://api.github.com/users/prattmic/orgs","repos_url":"https://api.github.com/users/prattmic/repos","events_url":"https://api.github.com/users/prattmic/events{/privacy}","received_events_url":"https://api.github.com/users/prattmic/received_events","type":"User","site_admin":false},"assignees":[{"login":"prattmic","id":1293187,"avatar_url":"https://avatars.githubusercontent.com/u/1293187?v=3","gravatar_id":"","url":"https://api.github.com/users/prattmic","html_url":"https://github.com/prattmic","followers_url":"https://api.github.com/users/prattmic/followers","following_url":"https://api.github.com/users/prattmic/following{/other_user}","gists_url":"https://api.github.com/users/prattmic/gists{/gist_id}","starred_url":"https://api.github.com/users/prattmic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/prattmic/subscriptions","organizations_url":"https://api.github.com/users/prattmic/orgs","repos_url":"https://api.github.com/users/prattmic/repos","events_url":"https://api.github.com/users/prattmic/events{/privacy}","received_events_url":"https://api.github.com/users/prattmic/received_events","type":"User","site_admin":false}],"milestone":{"url":"https://api.github.com/repos/auvsi-suas/interop/milestones/5","html_url":"https://github.com/auvsi-suas/interop/milestones/Next%20Year's%20Competition","labels_url":"https://api.github.com/repos/auvsi-suas/interop/milestones/5/labels","id":1545548,"number":5,"title":"Next Year's Competition","description":"","creator":{"login":"pmtischler","id":2326936,"avatar_url":"https://avatars.githubusercontent.com/u/2326936?v=3","gravatar_id":"","url":"https://api.github.com/users/pmtischler","html_url":"https://github.com/pmtischler","followers_url":"https://api.github.com/users/pmtischler/followers","following_url":"https://api.github.com/users/pmtischler/following{/other_user}","gists_url":"https://api.github.com/users/pmtischler/gists{/gist_id}","starred_url":"https://api.github.com/users/pmtischler/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pmtischler/subscriptions","organizations_url":"https://api.github.com/users/pmtischler/orgs","repos_url":"https://api.github.com/users/pmtischler/repos","events_url":"https://api.github.com/users/pmtischler/events{/privacy}","received_events_url":"https://api.github.com/users/pmtischler/received_events","type":"User","site_admin":false},"open_issues":2,"closed_issues":11,"state":"open","created_at":"2016-01-27T02:59:19Z","updated_at":"2016-09-14T13:11:20Z","due_on":"2016-09-15T04:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/auvsi-suas/interop/pulls/172/commits","review_comments_url":"https://api.github.com/repos/auvsi-suas/interop/pulls/172/comments","review_comment_url":"https://api.github.com/repos/auvsi-suas/interop/pulls/comments{/number}","comments_url":"https://api.github.com/repos/auvsi-suas/interop/issues/172/comments","statuses_url":"https://api.github.com/repos/auvsi-suas/interop/statuses/753bb2d7e82718ef42f5cdc0e72d575c2db0bda1","head":{"label":"auvsi-suas:docker","ref":"docker","sha":"753bb2d7e82718ef42f5cdc0e72d575c2db0bda1","user":{"login":"auvsi-suas","id":13365550,"avatar_url":"https://avatars.githubusercontent.com/u/13365550?v=3","gravatar_id":"","url":"https://api.github.com/users/auvsi-suas","html_url":"https://github.com/auvsi-suas","followers_url":"https://api.github.com/users/auvsi-suas/followers","following_url":"https://api.github.com/users/auvsi-suas/following{/other_user}","gists_url":"https://api.github.com/users/auvsi-suas/gists{/gist_id}","starred_url":"https://api.github.com/users/auvsi-suas/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/auvsi-suas/subscriptions","organizations_url":"https://api.github.com/users/auvsi-suas/orgs","repos_url":"https://api.github.com/users/auvsi-suas/repos","events_url":"https://api.github.com/users/auvsi-suas/events{/privacy}","received_events_url":"https://api.github.com/users/auvsi-suas/received_events","type":"Organization","site_admin":false},"repo":{"id":42521702,"name":"interop","full_name":"auvsi-suas/interop","owner":{"login":"auvsi-suas","id":13365550,"avatar_url":"https://avatars.githubusercontent.com/u/13365550?v=3","gravatar_id":"","url":"https://api.github.com/users/auvsi-suas","html_url":"https://github.com/auvsi-suas","followers_url":"https://api.github.com/users/auvsi-suas/followers","following_url":"https://api.github.com/users/auvsi-suas/following{/other_user}","gists_url":"https://api.github.com/users/auvsi-suas/gists{/gist_id}","starred_url":"https://api.github.com/users/auvsi-suas/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/auvsi-suas/subscriptions","organizations_url":"https://api.github.com/users/auvsi-suas/orgs","repos_url":"https://api.github.com/users/auvsi-suas/repos","events_url":"https://api.github.com/users/auvsi-suas/events{/privacy}","received_events_url":"https://api.github.com/users/auvsi-suas/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/auvsi-suas/interop","description":"Interoperability System for the AUVSI SUAS Competition.","fork":false,"url":"https://api.github.com/repos/auvsi-suas/interop","forks_url":"https://api.github.com/repos/auvsi-suas/interop/forks","keys_url":"https://api.github.com/repos/auvsi-suas/interop/keys{/key_id}","collaborators_url":"https://api.github.com/repos/auvsi-suas/interop/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/auvsi-suas/interop/teams","hooks_url":"https://api.github.com/repos/auvsi-suas/interop/hooks","issue_events_url":"https://api.github.com/repos/auvsi-suas/interop/issues/events{/number}","events_url":"https://api.github.com/repos/auvsi-suas/interop/events","assignees_url":"https://api.github.com/repos/auvsi-suas/interop/assignees{/user}","branches_url":"https://api.github.com/repos/auvsi-suas/interop/branches{/branch}","tags_url":"https://api.github.com/repos/auvsi-suas/interop/tags","blobs_url":"https://api.github.com/repos/auvsi-suas/interop/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/auvsi-suas/interop/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/auvsi-suas/interop/git/refs{/sha}","trees_url":"https://api.github.com/repos/auvsi-suas/interop/git/trees{/sha}","statuses_url":"https://api.github.com/repos/auvsi-suas/interop/statuses/{sha}","languages_url":"https://api.github.com/repos/auvsi-suas/interop/languages","stargazers_url":"https://api.github.com/repos/auvsi-suas/interop/stargazers","contributors_url":"https://api.github.com/repos/auvsi-suas/interop/contributors","subscribers_url":"https://api.github.com/repos/auvsi-suas/interop/subscribers","subscription_url":"https://api.github.com/repos/auvsi-suas/interop/subscription","commits_url":"https://api.github.com/repos/auvsi-suas/interop/commits{/sha}","git_commits_url":"https://api.github.com/repos/auvsi-suas/interop/git/commits{/sha}","comments_url":"https://api.github.com/repos/auvsi-suas/interop/comments{/number}","issue_comment_url":"https://api.github.com/repos/auvsi-suas/interop/issues/comments{/number}","contents_url":"https://api.github.com/repos/auvsi-suas/interop/contents/{+path}","compare_url":"https://api.github.com/repos/auvsi-suas/interop/compare/{base}...{head}","merges_url":"https://api.github.com/repos/auvsi-suas/interop/merges","archive_url":"https://api.github.com/repos/auvsi-suas/interop/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/auvsi-suas/interop/downloads","issues_url":"https://api.github.com/repos/auvsi-suas/interop/issues{/number}","pulls_url":"https://api.github.com/repos/auvsi-suas/interop/pulls{/number}","milestones_url":"https://api.github.com/repos/auvsi-suas/interop/milestones{/number}","notifications_url":"https://api.github.com/repos/auvsi-suas/interop/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/auvsi-suas/interop/labels{/name}","releases_url":"https://api.github.com/repos/auvsi-suas/interop/releases{/id}","deployments_url":"https://api.github.com/repos/auvsi-suas/interop/deployments","created_at":"2015-09-15T13:38:54Z","updated_at":"2016-09-02T04:23:20Z","pushed_at":"2016-09-16T02:21:49Z","git_url":"git://github.com/auvsi-suas/interop.git","ssh_url":"git@github.com:auvsi-suas/interop.git","clone_url":"https://github.com/auvsi-suas/interop.git","svn_url":"https://github.com/auvsi-suas/interop","homepage":null,"size":49245,"stargazers_count":29,"watchers_count":29,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":22,"mirror_url":null,"open_issues_count":15,"forks":22,"open_issues":15,"watchers":29,"default_branch":"master"}},"base":{"label":"auvsi-suas:master","ref":"master","sha":"509f36562fc895433fcd01da755a35dd04581025","user":{"login":"auvsi-suas","id":13365550,"avatar_url":"https://avatars.githubusercontent.com/u/13365550?v=3","gravatar_id":"","url":"https://api.github.com/users/auvsi-suas","html_url":"https://github.com/auvsi-suas","followers_url":"https://api.github.com/users/auvsi-suas/followers","following_url":"https://api.github.com/users/auvsi-suas/following{/other_user}","gists_url":"https://api.github.com/users/auvsi-suas/gists{/gist_id}","starred_url":"https://api.github.com/users/auvsi-suas/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/auvsi-suas/subscriptions","organizations_url":"https://api.github.com/users/auvsi-suas/orgs","repos_url":"https://api.github.com/users/auvsi-suas/repos","events_url":"https://api.github.com/users/auvsi-suas/events{/privacy}","received_events_url":"https://api.github.com/users/auvsi-suas/received_events","type":"Organization","site_admin":false},"repo":{"id":42521702,"name":"interop","full_name":"auvsi-suas/interop","owner":{"login":"auvsi-suas","id":13365550,"avatar_url":"https://avatars.githubusercontent.com/u/13365550?v=3","gravatar_id":"","url":"https://api.github.com/users/auvsi-suas","html_url":"https://github.com/auvsi-suas","followers_url":"https://api.github.com/users/auvsi-suas/followers","following_url":"https://api.github.com/users/auvsi-suas/following{/other_user}","gists_url":"https://api.github.com/users/auvsi-suas/gists{/gist_id}","starred_url":"https://api.github.com/users/auvsi-suas/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/auvsi-suas/subscriptions","organizations_url":"https://api.github.com/users/auvsi-suas/orgs","repos_url":"https://api.github.com/users/auvsi-suas/repos","events_url":"https://api.github.com/users/auvsi-suas/events{/privacy}","received_events_url":"https://api.github.com/users/auvsi-suas/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/auvsi-suas/interop","description":"Interoperability System for the AUVSI SUAS Competition.","fork":false,"url":"https://api.github.com/repos/auvsi-suas/interop","forks_url":"https://api.github.com/repos/auvsi-suas/interop/forks","keys_url":"https://api.github.com/repos/auvsi-suas/interop/keys{/key_id}","collaborators_url":"https://api.github.com/repos/auvsi-suas/interop/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/auvsi-suas/interop/teams","hooks_url":"https://api.github.com/repos/auvsi-suas/interop/hooks","issue_events_url":"https://api.github.com/repos/auvsi-suas/interop/issues/events{/number}","events_url":"https://api.github.com/repos/auvsi-suas/interop/events","assignees_url":"https://api.github.com/repos/auvsi-suas/interop/assignees{/user}","branches_url":"https://api.github.com/repos/auvsi-suas/interop/branches{/branch}","tags_url":"https://api.github.com/repos/auvsi-suas/interop/tags","blobs_url":"https://api.github.com/repos/auvsi-suas/interop/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/auvsi-suas/interop/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/auvsi-suas/interop/git/refs{/sha}","trees_url":"https://api.github.com/repos/auvsi-suas/interop/git/trees{/sha}","statuses_url":"https://api.github.com/repos/auvsi-suas/interop/statuses/{sha}","languages_url":"https://api.github.com/repos/auvsi-suas/interop/languages","stargazers_url":"https://api.github.com/repos/auvsi-suas/interop/stargazers","contributors_url":"https://api.github.com/repos/auvsi-suas/interop/contributors","subscribers_url":"https://api.github.com/repos/auvsi-suas/interop/subscribers","subscription_url":"https://api.github.com/repos/auvsi-suas/interop/subscription","commits_url":"https://api.github.com/repos/auvsi-suas/interop/commits{/sha}","git_commits_url":"https://api.github.com/repos/auvsi-suas/interop/git/commits{/sha}","comments_url":"https://api.github.com/repos/auvsi-suas/interop/comments{/number}","issue_comment_url":"https://api.github.com/repos/auvsi-suas/interop/issues/comments{/number}","contents_url":"https://api.github.com/repos/auvsi-suas/interop/contents/{+path}","compare_url":"https://api.github.com/repos/auvsi-suas/interop/compare/{base}...{head}","merges_url":"https://api.github.com/repos/auvsi-suas/interop/merges","archive_url":"https://api.github.com/repos/auvsi-suas/interop/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/auvsi-suas/interop/downloads","issues_url":"https://api.github.com/repos/auvsi-suas/interop/issues{/number}","pulls_url":"https://api.github.com/repos/auvsi-suas/interop/pulls{/number}","milestones_url":"https://api.github.com/repos/auvsi-suas/interop/milestones{/number}","notifications_url":"https://api.github.com/repos/auvsi-suas/interop/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/auvsi-suas/interop/labels{/name}","releases_url":"https://api.github.com/repos/auvsi-suas/interop/releases{/id}","deployments_url":"https://api.github.com/repos/auvsi-suas/interop/deployments","created_at":"2015-09-15T13:38:54Z","updated_at":"2016-09-02T04:23:20Z","pushed_at":"2016-09-16T02:21:49Z","git_url":"git://github.com/auvsi-suas/interop.git","ssh_url":"git@github.com:auvsi-suas/interop.git","clone_url":"https://github.com/auvsi-suas/interop.git","svn_url":"https://github.com/auvsi-suas/interop","homepage":null,"size":49245,"stargazers_count":29,"watchers_count":29,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":22,"mirror_url":null,"open_issues_count":15,"forks":22,"open_issues":15,"watchers":29,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/auvsi-suas/interop/pulls/172"},"html":{"href":"https://github.com/auvsi-suas/interop/pull/172"},"issue":{"href":"https://api.github.com/repos/auvsi-suas/interop/issues/172"},"comments":{"href":"https://api.github.com/repos/auvsi-suas/interop/issues/172/comments"},"review_comments":{"href":"https://api.github.com/repos/auvsi-suas/interop/pulls/172/comments"},"review_comment":{"href":"https://api.github.com/repos/auvsi-suas/interop/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/auvsi-suas/interop/pulls/172/commits"},"statuses":{"href":"https://api.github.com/repos/auvsi-suas/interop/statuses/753bb2d7e82718ef42f5cdc0e72d575c2db0bda1"}}}}
{"actor":{"display_login":"pmtischler"}}