{"action":"created","comment":{"url":"https://api.github.com/repos/OSVR/OSVR-Core/pulls/comments/33880683","id":33880683,"diff_hunk":"@@ -0,0 +1,258 @@\n+/** @file\n+    @brief Implementation\n+\n+    @date 2015\n+\n+    @author\n+    Sensics, Inc.\n+    <http://sensics.com/osvr>\n+*/\n+\n+// Copyright 2015 Sensics, Inc.\n+//\n+// Licensed under the Apache License, Version 2.0 (the \"License\");\n+// you may not use this file except in compliance with the License.\n+// You may obtain a copy of the License at\n+//\n+// \thttp://www.apache.org/licenses/LICENSE-2.0\n+//\n+// Unless required by applicable law or agreed to in writing, software\n+// distributed under the License is distributed on an \"AS IS\" BASIS,\n+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+// See the License for the specific language governing permissions and\n+// limitations under the License.\n+\n+// Internal Includes\n+#include \"EyeTrackerRemoteFactory.h\"\n+#include \"VRPNConnectionCollection.h\"\n+#include <osvr/Common/ClientInterface.h>\n+#include <osvr/Common/PathTreeFull.h>\n+#include <osvr/Util/ChannelCountC.h>\n+#include <osvr/Util/UniquePtr.h>\n+#include <osvr/Common/OriginalSource.h>\n+#include \"InterfaceTree.h\"\n+#include <osvr/Util/Verbosity.h>\n+#include <osvr/Common/CreateDevice.h>\n+\n+#include <osvr/Common/EyeTrackerComponent.h>\n+#include <osvr/Common/Location2DComponent.h>\n+#include <osvr/Common/DirectionComponent.h>\n+#include <osvr/Common/RoutingConstants.h>\n+#include <osvr/Common/InterfaceState.h>\n+\n+// Library/third-party includes\n+#include <boost/lexical_cast.hpp>\n+#include <boost/any.hpp>\n+#include <boost/variant/get.hpp>\n+#include <boost/lexical_cast.hpp>\n+#include <boost/optional.hpp>\n+#include <json/value.h>\n+#include <json/reader.h>\n+\n+// Standard includes\n+#include <iostream>\n+#include <string>\n+\n+namespace osvr {\n+namespace client {\n+\n+    class NetworkEyeTrackerRemoteHandler : public RemoteHandler {\n+      public:\n+        struct Options {\n+            Options()\n+                : reportDirection(false), reportBasePoint(false),\n+                  reportLocation2D(false), reportBlink(false), dirIface() {}\n+            bool reportDirection;\n+            bool reportBasePoint;\n+            bool reportLocation2D;\n+            bool reportBlink;\n+            osvr::common::ClientInterfacePtr dirIface;\n+            osvr::common::ClientInterfacePtr locationIface;\n+            osvr::common::ClientInterfacePtr trackerIface;\n+            osvr::common::ClientInterfacePtr buttonIface;\n+        };\n+\n+        NetworkEyeTrackerRemoteHandler(\n+            vrpn_ConnectionPtr const &conn, std::string const &deviceName,\n+            Options const &options, boost::optional<OSVR_ChannelCount> sensor,\n+            common::InterfaceList &ifaces)\n+            : m_dev(common::createClientDevice(deviceName, conn)),\n+              m_interfaces(ifaces), m_all(!sensor.is_initialized()),\n+              m_opts(options), m_sensor(sensor) {\n+            auto eyetracker = common::EyeTrackerComponent::create();\n+            m_dev->addComponent(eyetracker);\n+            eyetracker->registerEyeHandler(\n+                [&](common::OSVR_EyeNotification const &data,\n+                    util::time::TimeValue const &timestamp) {\n+                    m_handleEyeTracking(data, timestamp);\n+                });\n+            OSVR_DEV_VERBOSE(\"Constructed an Eye Handler for \" << deviceName);\n+        }\n+\n+        /// @brief Deleted assignment operator.\n+        NetworkEyeTrackerRemoteHandler &\n+        operator=(NetworkEyeTrackerRemoteHandler const &) = delete;\n+\n+        virtual ~NetworkEyeTrackerRemoteHandler() {\n+            /// @todo do we need to unregister?\n+        }\n+\n+        virtual void update() { m_dev->update(); }\n+\n+      private:\n+        void m_handleEyeTracking3d(common::OSVR_EyeNotification const &data,\n+                                   util::time::TimeValue const &timestamp) {\n+\n+            OSVR_EyeTracker3DReport report;\n+            report.sensor = data.sensor;\n+            report.directionValid = false;\n+            report.basePointValid = false;\n+            util::time::TimeValue timest = timestamp;\n+            if (m_opts.reportDirection) {\n+                report.directionValid =\n+                    m_opts.dirIface->getState<OSVR_DirectionReport>(\n+                        timest, report.state.direction);\n+            }\n+            if (m_opts.reportBasePoint) {\n+                report.basePointValid =\n+                    m_opts.trackerIface->getState<OSVR_PositionReport>(\n+                        timest, report.state.basePoint);\n+            }\n+            if (!(report.basePointValid || report.directionValid)) {\n+                return; // don't send an empty report.\n+            }\n+            for (auto &iface : m_interfaces) {\n+                iface->triggerCallbacks(timestamp, report);\n+            }\n+        }\n+\n+        void m_handleEyeTracking2d(common::OSVR_EyeNotification const &data,\n+                                   util::time::TimeValue const &timestamp) {\n+\n+            OSVR_EyeTracker2DReport report;\n+            report.sensor = data.sensor;\n+            report.locationValid = false;\n+            util::time::TimeValue timest = timestamp;\n+\n+            if (m_opts.reportLocation2D) {\n+                report.locationValid =\n+                    m_opts.locationIface->getState<OSVR_Location2DReport>(\n+                        timest, report.state);\n+            }\n+            if (!(report.locationValid)) {\n+                return; // don't send an empty report.\n+            }\n+\n+            for (auto &iface : m_interfaces) {\n+                iface->triggerCallbacks(timestamp, report);\n+            }\n+        }\n+\n+        void m_handleEyeBlink(common::OSVR_EyeNotification const &data,\n+                              util::time::TimeValue const &timestamp) {\n+\n+            OSVR_EyeTrackerBlinkReport report;\n+            report.sensor = data.sensor;\n+            report.blinkValid = false;\n+            util::time::TimeValue timest = timestamp;\n+\n+            if (m_opts.reportLocation2D) {\n+                report.blinkValid =\n+                    m_opts.locationIface->getState<OSVR_ButtonReport>(\n+                        timest, report.state);\n+            }\n+            if (!(report.blinkValid)) {\n+                return; // don't send an empty report.\n+            }\n+\n+            for (auto &iface : m_interfaces) {\n+                iface->triggerCallbacks(timestamp, report);\n+            }\n+        }\n+\n+        void m_handleEyeTracking(common::OSVR_EyeNotification const &data,\n+                                 util::time::TimeValue const &timestamp) {\n+            if (!m_all && *m_sensor != data.sensor) {\n+                /// doesn't match our filter.\n+                return;\n+            }\n+\n+            m_handleEyeTracking3d(data, timestamp);\n+            m_handleEyeTracking2d(data, timestamp);\n+            m_handleEyeBlink(data, timestamp);\n+        }\n+\n+        common::BaseDevicePtr m_dev;\n+        common::InterfaceList &m_interfaces;\n+        bool m_all;\n+        Options m_opts;\n+        boost::optional<OSVR_ChannelCount> m_sensor;\n+    };\n+\n+    EyeTrackerRemoteFactory::EyeTrackerRemoteFactory(\n+        VRPNConnectionCollection const &conns)\n+        : m_conns(conns) {}\n+\n+    shared_ptr<RemoteHandler> EyeTrackerRemoteFactory::\n+    operator()(common::OriginalSource const &source,\n+               common::InterfaceList &ifaces, common::ClientContext &ctx) {\n+\n+        shared_ptr<RemoteHandler> ret;\n+\n+        NetworkEyeTrackerRemoteHandler::Options opts;\n+\n+        auto myDescriptor = source.getDeviceElement().getDescriptor();\n+\n+        if (myDescriptor[\"interfaces\"][\"eyetracker\"].isMember(\"direction\")) {\n+            opts.reportDirection = true;\n+            const std::string iface =\n+                common::getPathSeparator() +\n+                source.getDeviceElement().getDeviceName() + \"/direction\";","path":"src/osvr/Client/EyeTrackerRemoteFactory.cpp","position":210,"original_position":210,"commit_id":"5b0e3b9e44da9ef392771926f7a09a0cebb26c5a","original_commit_id":"5b0e3b9e44da9ef392771926f7a09a0cebb26c5a","user":{"login":"rpavlik","id":61129,"avatar_url":"https://avatars.githubusercontent.com/u/61129?v=3","gravatar_id":"","url":"https://api.github.com/users/rpavlik","html_url":"https://github.com/rpavlik","followers_url":"https://api.github.com/users/rpavlik/followers","following_url":"https://api.github.com/users/rpavlik/following{/other_user}","gists_url":"https://api.github.com/users/rpavlik/gists{/gist_id}","starred_url":"https://api.github.com/users/rpavlik/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rpavlik/subscriptions","organizations_url":"https://api.github.com/users/rpavlik/orgs","repos_url":"https://api.github.com/users/rpavlik/repos","events_url":"https://api.github.com/users/rpavlik/events{/privacy}","received_events_url":"https://api.github.com/users/rpavlik/received_events","type":"User","site_admin":false},"body":"So in this case this would have worked (adding a path sep to the beginning of the device name) but in general that can't be assumed - external VRPN devices break that assumption. Better to use `common::getFullPath` on the `common::PathNode`.","created_at":"2015-07-03T21:01:00Z","updated_at":"2015-07-03T21:01:00Z","html_url":"https://github.com/OSVR/OSVR-Core/pull/94#discussion_r33880683","pull_request_url":"https://api.github.com/repos/OSVR/OSVR-Core/pulls/94","_links":{"self":{"href":"https://api.github.com/repos/OSVR/OSVR-Core/pulls/comments/33880683"},"html":{"href":"https://github.com/OSVR/OSVR-Core/pull/94#discussion_r33880683"},"pull_request":{"href":"https://api.github.com/repos/OSVR/OSVR-Core/pulls/94"}}},"pull_request":{"url":"https://api.github.com/repos/OSVR/OSVR-Core/pulls/94","id":34076704,"html_url":"https://github.com/OSVR/OSVR-Core/pull/94","diff_url":"https://github.com/OSVR/OSVR-Core/pull/94.diff","patch_url":"https://github.com/OSVR/OSVR-Core/pull/94.patch","issue_url":"https://api.github.com/repos/OSVR/OSVR-Core/issues/94","number":94,"state":"open","locked":false,"title":"Eyetracker","user":{"login":"rpavlik","id":61129,"avatar_url":"https://avatars.githubusercontent.com/u/61129?v=3","gravatar_id":"","url":"https://api.github.com/users/rpavlik","html_url":"https://github.com/rpavlik","followers_url":"https://api.github.com/users/rpavlik/followers","following_url":"https://api.github.com/users/rpavlik/following{/other_user}","gists_url":"https://api.github.com/users/rpavlik/gists{/gist_id}","starred_url":"https://api.github.com/users/rpavlik/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rpavlik/subscriptions","organizations_url":"https://api.github.com/users/rpavlik/orgs","repos_url":"https://api.github.com/users/rpavlik/repos","events_url":"https://api.github.com/users/rpavlik/events{/privacy}","received_events_url":"https://api.github.com/users/rpavlik/received_events","type":"User","site_admin":false},"body":"Making this branch a pull request so that it's easier to comment on.","created_at":"2015-04-24T19:03:31Z","updated_at":"2015-07-03T21:01:00Z","closed_at":null,"merged_at":null,"merge_commit_sha":"7d36fa03f27c72b6507b21e4c0197bf512223cec","assignee":{"login":"mars979","id":10812091,"avatar_url":"https://avatars.githubusercontent.com/u/10812091?v=3","gravatar_id":"","url":"https://api.github.com/users/mars979","html_url":"https://github.com/mars979","followers_url":"https://api.github.com/users/mars979/followers","following_url":"https://api.github.com/users/mars979/following{/other_user}","gists_url":"https://api.github.com/users/mars979/gists{/gist_id}","starred_url":"https://api.github.com/users/mars979/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mars979/subscriptions","organizations_url":"https://api.github.com/users/mars979/orgs","repos_url":"https://api.github.com/users/mars979/repos","events_url":"https://api.github.com/users/mars979/events{/privacy}","received_events_url":"https://api.github.com/users/mars979/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/OSVR/OSVR-Core/pulls/94/commits","review_comments_url":"https://api.github.com/repos/OSVR/OSVR-Core/pulls/94/comments","review_comment_url":"https://api.github.com/repos/OSVR/OSVR-Core/pulls/comments{/number}","comments_url":"https://api.github.com/repos/OSVR/OSVR-Core/issues/94/comments","statuses_url":"https://api.github.com/repos/OSVR/OSVR-Core/statuses/5b0e3b9e44da9ef392771926f7a09a0cebb26c5a","head":{"label":"OSVR:eyetracker","ref":"eyetracker","sha":"5b0e3b9e44da9ef392771926f7a09a0cebb26c5a","user":{"login":"OSVR","id":10343613,"avatar_url":"https://avatars.githubusercontent.com/u/10343613?v=3","gravatar_id":"","url":"https://api.github.com/users/OSVR","html_url":"https://github.com/OSVR","followers_url":"https://api.github.com/users/OSVR/followers","following_url":"https://api.github.com/users/OSVR/following{/other_user}","gists_url":"https://api.github.com/users/OSVR/gists{/gist_id}","starred_url":"https://api.github.com/users/OSVR/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/OSVR/subscriptions","organizations_url":"https://api.github.com/users/OSVR/orgs","repos_url":"https://api.github.com/users/OSVR/repos","events_url":"https://api.github.com/users/OSVR/events{/privacy}","received_events_url":"https://api.github.com/users/OSVR/received_events","type":"Organization","site_admin":false},"repo":{"id":25528375,"name":"OSVR-Core","full_name":"OSVR/OSVR-Core","owner":{"login":"OSVR","id":10343613,"avatar_url":"https://avatars.githubusercontent.com/u/10343613?v=3","gravatar_id":"","url":"https://api.github.com/users/OSVR","html_url":"https://github.com/OSVR","followers_url":"https://api.github.com/users/OSVR/followers","following_url":"https://api.github.com/users/OSVR/following{/other_user}","gists_url":"https://api.github.com/users/OSVR/gists{/gist_id}","starred_url":"https://api.github.com/users/OSVR/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/OSVR/subscriptions","organizations_url":"https://api.github.com/users/OSVR/orgs","repos_url":"https://api.github.com/users/OSVR/repos","events_url":"https://api.github.com/users/OSVR/events{/privacy}","received_events_url":"https://api.github.com/users/OSVR/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/OSVR/OSVR-Core","description":"The core libraries, applications, and plugins of the OSVR software platform.","fork":false,"url":"https://api.github.com/repos/OSVR/OSVR-Core","forks_url":"https://api.github.com/repos/OSVR/OSVR-Core/forks","keys_url":"https://api.github.com/repos/OSVR/OSVR-Core/keys{/key_id}","collaborators_url":"https://api.github.com/repos/OSVR/OSVR-Core/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/OSVR/OSVR-Core/teams","hooks_url":"https://api.github.com/repos/OSVR/OSVR-Core/hooks","issue_events_url":"https://api.github.com/repos/OSVR/OSVR-Core/issues/events{/number}","events_url":"https://api.github.com/repos/OSVR/OSVR-Core/events","assignees_url":"https://api.github.com/repos/OSVR/OSVR-Core/assignees{/user}","branches_url":"https://api.github.com/repos/OSVR/OSVR-Core/branches{/branch}","tags_url":"https://api.github.com/repos/OSVR/OSVR-Core/tags","blobs_url":"https://api.github.com/repos/OSVR/OSVR-Core/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/OSVR/OSVR-Core/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/OSVR/OSVR-Core/git/refs{/sha}","trees_url":"https://api.github.com/repos/OSVR/OSVR-Core/git/trees{/sha}","statuses_url":"https://api.github.com/repos/OSVR/OSVR-Core/statuses/{sha}","languages_url":"https://api.github.com/repos/OSVR/OSVR-Core/languages","stargazers_url":"https://api.github.com/repos/OSVR/OSVR-Core/stargazers","contributors_url":"https://api.github.com/repos/OSVR/OSVR-Core/contributors","subscribers_url":"https://api.github.com/repos/OSVR/OSVR-Core/subscribers","subscription_url":"https://api.github.com/repos/OSVR/OSVR-Core/subscription","commits_url":"https://api.github.com/repos/OSVR/OSVR-Core/commits{/sha}","git_commits_url":"https://api.github.com/repos/OSVR/OSVR-Core/git/commits{/sha}","comments_url":"https://api.github.com/repos/OSVR/OSVR-Core/comments{/number}","issue_comment_url":"https://api.github.com/repos/OSVR/OSVR-Core/issues/comments{/number}","contents_url":"https://api.github.com/repos/OSVR/OSVR-Core/contents/{+path}","compare_url":"https://api.github.com/repos/OSVR/OSVR-Core/compare/{base}...{head}","merges_url":"https://api.github.com/repos/OSVR/OSVR-Core/merges","archive_url":"https://api.github.com/repos/OSVR/OSVR-Core/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/OSVR/OSVR-Core/downloads","issues_url":"https://api.github.com/repos/OSVR/OSVR-Core/issues{/number}","pulls_url":"https://api.github.com/repos/OSVR/OSVR-Core/pulls{/number}","milestones_url":"https://api.github.com/repos/OSVR/OSVR-Core/milestones{/number}","notifications_url":"https://api.github.com/repos/OSVR/OSVR-Core/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/OSVR/OSVR-Core/labels{/name}","releases_url":"https://api.github.com/repos/OSVR/OSVR-Core/releases{/id}","created_at":"2014-10-21T14:56:46Z","updated_at":"2015-07-02T15:30:03Z","pushed_at":"2015-07-03T20:33:40Z","git_url":"git://github.com/OSVR/OSVR-Core.git","ssh_url":"git@github.com:OSVR/OSVR-Core.git","clone_url":"https://github.com/OSVR/OSVR-Core.git","svn_url":"https://github.com/OSVR/OSVR-Core","homepage":"","size":13911,"stargazers_count":37,"watchers_count":37,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":8,"mirror_url":null,"open_issues_count":92,"forks":8,"open_issues":92,"watchers":37,"default_branch":"master"}},"base":{"label":"OSVR:master","ref":"master","sha":"0f15a69d1c08041b73e8691e508bba7871bd16c4","user":{"login":"OSVR","id":10343613,"avatar_url":"https://avatars.githubusercontent.com/u/10343613?v=3","gravatar_id":"","url":"https://api.github.com/users/OSVR","html_url":"https://github.com/OSVR","followers_url":"https://api.github.com/users/OSVR/followers","following_url":"https://api.github.com/users/OSVR/following{/other_user}","gists_url":"https://api.github.com/users/OSVR/gists{/gist_id}","starred_url":"https://api.github.com/users/OSVR/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/OSVR/subscriptions","organizations_url":"https://api.github.com/users/OSVR/orgs","repos_url":"https://api.github.com/users/OSVR/repos","events_url":"https://api.github.com/users/OSVR/events{/privacy}","received_events_url":"https://api.github.com/users/OSVR/received_events","type":"Organization","site_admin":false},"repo":{"id":25528375,"name":"OSVR-Core","full_name":"OSVR/OSVR-Core","owner":{"login":"OSVR","id":10343613,"avatar_url":"https://avatars.githubusercontent.com/u/10343613?v=3","gravatar_id":"","url":"https://api.github.com/users/OSVR","html_url":"https://github.com/OSVR","followers_url":"https://api.github.com/users/OSVR/followers","following_url":"https://api.github.com/users/OSVR/following{/other_user}","gists_url":"https://api.github.com/users/OSVR/gists{/gist_id}","starred_url":"https://api.github.com/users/OSVR/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/OSVR/subscriptions","organizations_url":"https://api.github.com/users/OSVR/orgs","repos_url":"https://api.github.com/users/OSVR/repos","events_url":"https://api.github.com/users/OSVR/events{/privacy}","received_events_url":"https://api.github.com/users/OSVR/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/OSVR/OSVR-Core","description":"The core libraries, applications, and plugins of the OSVR software platform.","fork":false,"url":"https://api.github.com/repos/OSVR/OSVR-Core","forks_url":"https://api.github.com/repos/OSVR/OSVR-Core/forks","keys_url":"https://api.github.com/repos/OSVR/OSVR-Core/keys{/key_id}","collaborators_url":"https://api.github.com/repos/OSVR/OSVR-Core/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/OSVR/OSVR-Core/teams","hooks_url":"https://api.github.com/repos/OSVR/OSVR-Core/hooks","issue_events_url":"https://api.github.com/repos/OSVR/OSVR-Core/issues/events{/number}","events_url":"https://api.github.com/repos/OSVR/OSVR-Core/events","assignees_url":"https://api.github.com/repos/OSVR/OSVR-Core/assignees{/user}","branches_url":"https://api.github.com/repos/OSVR/OSVR-Core/branches{/branch}","tags_url":"https://api.github.com/repos/OSVR/OSVR-Core/tags","blobs_url":"https://api.github.com/repos/OSVR/OSVR-Core/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/OSVR/OSVR-Core/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/OSVR/OSVR-Core/git/refs{/sha}","trees_url":"https://api.github.com/repos/OSVR/OSVR-Core/git/trees{/sha}","statuses_url":"https://api.github.com/repos/OSVR/OSVR-Core/statuses/{sha}","languages_url":"https://api.github.com/repos/OSVR/OSVR-Core/languages","stargazers_url":"https://api.github.com/repos/OSVR/OSVR-Core/stargazers","contributors_url":"https://api.github.com/repos/OSVR/OSVR-Core/contributors","subscribers_url":"https://api.github.com/repos/OSVR/OSVR-Core/subscribers","subscription_url":"https://api.github.com/repos/OSVR/OSVR-Core/subscription","commits_url":"https://api.github.com/repos/OSVR/OSVR-Core/commits{/sha}","git_commits_url":"https://api.github.com/repos/OSVR/OSVR-Core/git/commits{/sha}","comments_url":"https://api.github.com/repos/OSVR/OSVR-Core/comments{/number}","issue_comment_url":"https://api.github.com/repos/OSVR/OSVR-Core/issues/comments{/number}","contents_url":"https://api.github.com/repos/OSVR/OSVR-Core/contents/{+path}","compare_url":"https://api.github.com/repos/OSVR/OSVR-Core/compare/{base}...{head}","merges_url":"https://api.github.com/repos/OSVR/OSVR-Core/merges","archive_url":"https://api.github.com/repos/OSVR/OSVR-Core/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/OSVR/OSVR-Core/downloads","issues_url":"https://api.github.com/repos/OSVR/OSVR-Core/issues{/number}","pulls_url":"https://api.github.com/repos/OSVR/OSVR-Core/pulls{/number}","milestones_url":"https://api.github.com/repos/OSVR/OSVR-Core/milestones{/number}","notifications_url":"https://api.github.com/repos/OSVR/OSVR-Core/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/OSVR/OSVR-Core/labels{/name}","releases_url":"https://api.github.com/repos/OSVR/OSVR-Core/releases{/id}","created_at":"2014-10-21T14:56:46Z","updated_at":"2015-07-02T15:30:03Z","pushed_at":"2015-07-03T20:33:40Z","git_url":"git://github.com/OSVR/OSVR-Core.git","ssh_url":"git@github.com:OSVR/OSVR-Core.git","clone_url":"https://github.com/OSVR/OSVR-Core.git","svn_url":"https://github.com/OSVR/OSVR-Core","homepage":"","size":13911,"stargazers_count":37,"watchers_count":37,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":8,"mirror_url":null,"open_issues_count":92,"forks":8,"open_issues":92,"watchers":37,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/OSVR/OSVR-Core/pulls/94"},"html":{"href":"https://github.com/OSVR/OSVR-Core/pull/94"},"issue":{"href":"https://api.github.com/repos/OSVR/OSVR-Core/issues/94"},"comments":{"href":"https://api.github.com/repos/OSVR/OSVR-Core/issues/94/comments"},"review_comments":{"href":"https://api.github.com/repos/OSVR/OSVR-Core/pulls/94/comments"},"review_comment":{"href":"https://api.github.com/repos/OSVR/OSVR-Core/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/OSVR/OSVR-Core/pulls/94/commits"},"statuses":{"href":"https://api.github.com/repos/OSVR/OSVR-Core/statuses/5b0e3b9e44da9ef392771926f7a09a0cebb26c5a"}}}}