{"action":"created","comment":{"url":"https://api.github.com/repos/dartsim/dart/pulls/comments/36255211","id":36255211,"diff_hunk":"@@ -0,0 +1,94 @@\n+/*\n+ * Copyright (c) 2015, Georgia Tech Research Corporation\n+ * All rights reserved.\n+ *\n+ * Author(s): Michael Koval <mkoval@cs.cmu.edu>\n+ *\n+ * Georgia Tech Graphics Lab and Humanoid Robotics Lab\n+ *\n+ * Directed by Prof. C. Karen Liu and Prof. Mike Stilman\n+ * <karenliu@cc.gatech.edu> <mstilman@cc.gatech.edu>\n+ *\n+ * This file is provided under the following \"BSD-style\" License:\n+ *   Redistribution and use in source and binary forms, with or\n+ *   without modification, are permitted provided that the following\n+ *   conditions are met:\n+ *   * Redistributions of source code must retain the above copyright\n+ *     notice, this list of conditions and the following disclaimer.\n+ *   * Redistributions in binary form must reproduce the above\n+ *     copyright notice, this list of conditions and the following\n+ *     disclaimer in the documentation and/or other materials provided\n+ *     with the distribution.\n+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n+ *   CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n+ *   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n+ *   MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n+ *   DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n+ *   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF\n+ *   USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED\n+ *   AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n+ *   LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n+ *   ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n+ *   POSSIBILITY OF SUCH DAMAGE.\n+ */\n+\n+#ifndef DART_UTILS_COMPOSITERESOURCERETRIEVER_H_\n+#define DART_UTILS_COMPOSITERESOURCERETRIEVER_H_\n+\n+#include <unordered_map>\n+#include <vector>\n+#include \"dart/common/ResourceRetriever.h\"\n+\n+namespace dart {\n+namespace utils {\n+\n+/// CompositeResourceRetriever allows multiple \\ref ResourceRetriever to be\n+/// used interchangably by: (1) associating each \\ref ResourceRetriever with a\n+/// particular URI schema and/or (2) providing a precedence order for trying\n+/// multiple retrievers.\n+class CompositeResourceRetriever : public virtual common::ResourceRetriever\n+{\n+public:\n+  virtual ~CompositeResourceRetriever() = default;\n+\n+  /// \\brief Add a default \\ref ResourceRetriever for all URIs.\n+  /// This \\ref ResourceRetriever will be called after all schema-specific\n+  /// ResourceRetrievers, if any, have failed. This method may be called\n+  /// multiple times. In that case, the ResourceRetrievers will be queried\n+  /// in the same order in which they were added.\n+  void addDefaultRetriever(\n+    const common::ResourceRetrieverPtr& _resourceRetriever);\n+\n+  /// \\brief Add a default \\ref ResourceRetriever for \\a _schema\n+  /// This \\ref ResourceRetriever will be called after URIs that match the\n+  /// specified schema. This method may be called multiple times. In that\n+  /// case, the ResourceRetrievers will be queried in the same order in which\n+  /// they were added.\n+  bool addSchemaRetriever(\n+    const std::string& _schema,\n+    const common::ResourceRetrieverPtr& _resourceRetriever);\n+\n+  // Documentation inherited.\n+  bool exists(const std::string& _uri) override;\n+\n+  // Documentation inherited.\n+  common::ResourcePtr retrieve(const std::string& _uri) override;\n+\n+private:\n+  std::vector<common::ResourceRetrieverPtr> getRetrievers(const std::string& _uri);","path":"dart/utils/CompositeResourceRetriever.h","position":80,"original_position":80,"commit_id":"0dd9c529651811d809e19c7d4105f69f9c7c9ec5","original_commit_id":"0dd9c529651811d809e19c7d4105f69f9c7c9ec5","user":{"login":"jslee02","id":4038467,"avatar_url":"https://avatars.githubusercontent.com/u/4038467?v=3","gravatar_id":"","url":"https://api.github.com/users/jslee02","html_url":"https://github.com/jslee02","followers_url":"https://api.github.com/users/jslee02/followers","following_url":"https://api.github.com/users/jslee02/following{/other_user}","gists_url":"https://api.github.com/users/jslee02/gists{/gist_id}","starred_url":"https://api.github.com/users/jslee02/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jslee02/subscriptions","organizations_url":"https://api.github.com/users/jslee02/orgs","repos_url":"https://api.github.com/users/jslee02/repos","events_url":"https://api.github.com/users/jslee02/events{/privacy}","received_events_url":"https://api.github.com/users/jslee02/received_events","type":"User","site_admin":false},"body":"Exceeded 80 columns. Please wrap this line as:\r\n```cpp\r\n  std::vector<common::ResourceRetrieverPtr> getRetrievers(\r\n      const std::string& _uri);\r\n```","created_at":"2015-08-04T23:33:26Z","updated_at":"2015-08-04T23:33:26Z","html_url":"https://github.com/dartsim/dart/pull/464#discussion_r36255211","pull_request_url":"https://api.github.com/repos/dartsim/dart/pulls/464","_links":{"self":{"href":"https://api.github.com/repos/dartsim/dart/pulls/comments/36255211"},"html":{"href":"https://github.com/dartsim/dart/pull/464#discussion_r36255211"},"pull_request":{"href":"https://api.github.com/repos/dartsim/dart/pulls/464"}}},"pull_request":{"url":"https://api.github.com/repos/dartsim/dart/pulls/464","id":40527861,"html_url":"https://github.com/dartsim/dart/pull/464","diff_url":"https://github.com/dartsim/dart/pull/464.diff","patch_url":"https://github.com/dartsim/dart/pull/464.patch","issue_url":"https://api.github.com/repos/dartsim/dart/issues/464","number":464,"state":"open","locked":false,"title":"Support for generic URIs","user":{"login":"mkoval","id":142251,"avatar_url":"https://avatars.githubusercontent.com/u/142251?v=3","gravatar_id":"","url":"https://api.github.com/users/mkoval","html_url":"https://github.com/mkoval","followers_url":"https://api.github.com/users/mkoval/followers","following_url":"https://api.github.com/users/mkoval/following{/other_user}","gists_url":"https://api.github.com/users/mkoval/gists{/gist_id}","starred_url":"https://api.github.com/users/mkoval/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mkoval/subscriptions","organizations_url":"https://api.github.com/users/mkoval/orgs","repos_url":"https://api.github.com/users/mkoval/repos","events_url":"https://api.github.com/users/mkoval/events{/privacy}","received_events_url":"https://api.github.com/users/mkoval/received_events","type":"User","site_admin":false},"body":"This pull request adds full-fledged URI support to DART. This generalizes the rudimentary support for `package://` URIs in `DartLoader` to the other file loaders and for loading meshes. I believe that this pull request is fully backwards compatible (with one minor exception), so I'd like to get this into DART 5.1.\r\n\r\nThe key idea is that external resources should be specified by **URIs, not paths**, nested resources should **resolved relative to their parent URI**, and it should be **possible for the user to add support for custom URIs** without modifying DART.\r\n\r\nThis pull request adds the following classes:\r\n\r\n1. `common::ResourceRetriever` provides a standard interface for opening am URI and returning a...\r\n2. `common::Resource` provides file-like access to a resource using an `fread`-like API\r\n3. `common::LocalResourceRetriever` provides access to local paths and `file://` URIs using the standard library\r\n4. `common::Uri` class that provides URI parsing and merging functionality with no dependencies (painstakingly implemented from RFC 3986)\r\n4. `utils::PackageResourceRetriever` resolves `package://` URIs to `file://` URis using a user-specified mapping. This mimics the behavior of `addPackageDirectory` on `DartLoader`\r\n5. `utils::SchemaResourceRetriever` adds support for using multiple `ResourceRetrievers` at the same time; e.g. to support both `file://` and `package://` URIs.\r\n6. `dynamics::AssimpResourceInputResourceAdaptor` maps between the DART's `Resource` and `ResourceRetriever` classes and the corresponding Assimp `IOFile` and `IOSystem` classes. This allows Assimp to transparently load meshes that consist of multiple files (e.g. external textures).\r\n\r\nIt also makes the following API changes:\r\n\r\n1. `MeshShape` optionally takes a `ResourceRetriever` argument. If specified, this is made available through a `getResourceRetriever` function, e.g. to resolve textures using the same `ResourceRetriever` as was used to load the mesh.\r\n2. `MeshShape` now supports arbitrary URIs, which are accessible using the `getMeshUri` method. If the URI is a `file://` URI, then it is also available (for backwards compatibility) via the `getMeshPath` method.\r\n3. `SdfParser` and `SkelParser` methods now take an optional `ResourceRetriever` argument and use it resolve both the input URI and any embedded URIs. If not specified, the argument defaults to a `LocalResourceRetriever`.\r\n4. `SkelParser` now resolves meshes relative to the `.skel` file instead of assuming that they are in `DART_DATA_PATH`. This technically *breaks backwards compatibility*. However, it makes the class so much more useful that I think it's worth it.\r\n4. `DartLoader` now optionally accepts a `ResourceRetriever` argument (see above). If not specified, it defaults to a `SchemaResourceRetriever` that uses a `LocalResourceRetriever` to resolve `file://` URIs and a `PackageResourceRetriever` to resolve `package://` URIs.\r\n5. `DartLoader`'s `addPackageDirectory` function is deprecated in favor of passing a custom `ResourceRetriever`.\r\n6. `DartLoader` is refactored to use primarily static methods. In DART 6.0, we can remove `addPackageDirectory` and provide an entirely static API.\r\n\r\nThese features **add no dependencies** if the compiler has full C++11 support. Unfortunately, the version of `libstdc++` shipped with GCC 4.8 (this is the version distributed on Ubuntu 14.04) and below have [a broken implementation of `std::regex`](http://stackoverflow.com/a/12665408/111426). [There isn't a reliable way of testing the version of `libstdc++`](http://stackoverflow.com/q/31506594/111426) in both GCC and Clang, so I fall back on Boost.Regex if I detect `libstdc++` being used at all.\r\n\r\nThis is a big pull request, so I am sure I missed something. Please post if you have any questions or see anything that may break backwards compatibility.","created_at":"2015-07-22T03:45:49Z","updated_at":"2015-08-04T23:33:26Z","closed_at":null,"merged_at":null,"merge_commit_sha":"afca0f986b719b747f73c3d917970b303f7e7964","assignee":null,"milestone":{"url":"https://api.github.com/repos/dartsim/dart/milestones/11","html_url":"https://github.com/dartsim/dart/milestones/DART%205.1.0","labels_url":"https://api.github.com/repos/dartsim/dart/milestones/11/labels","id":1173741,"number":11,"title":"DART 5.1.0","description":"","creator":{"login":"jslee02","id":4038467,"avatar_url":"https://avatars.githubusercontent.com/u/4038467?v=3","gravatar_id":"","url":"https://api.github.com/users/jslee02","html_url":"https://github.com/jslee02","followers_url":"https://api.github.com/users/jslee02/followers","following_url":"https://api.github.com/users/jslee02/following{/other_user}","gists_url":"https://api.github.com/users/jslee02/gists{/gist_id}","starred_url":"https://api.github.com/users/jslee02/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jslee02/subscriptions","organizations_url":"https://api.github.com/users/jslee02/orgs","repos_url":"https://api.github.com/users/jslee02/repos","events_url":"https://api.github.com/users/jslee02/events{/privacy}","received_events_url":"https://api.github.com/users/jslee02/received_events","type":"User","site_admin":false},"open_issues":7,"closed_issues":26,"state":"open","created_at":"2015-06-21T00:19:16Z","updated_at":"2015-08-04T23:25:41Z","due_on":"2015-08-30T15:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/dartsim/dart/pulls/464/commits","review_comments_url":"https://api.github.com/repos/dartsim/dart/pulls/464/comments","review_comment_url":"https://api.github.com/repos/dartsim/dart/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dartsim/dart/issues/464/comments","statuses_url":"https://api.github.com/repos/dartsim/dart/statuses/0dd9c529651811d809e19c7d4105f69f9c7c9ec5","head":{"label":"mkoval:feature/ResourceRetriever","ref":"feature/ResourceRetriever","sha":"0dd9c529651811d809e19c7d4105f69f9c7c9ec5","user":{"login":"mkoval","id":142251,"avatar_url":"https://avatars.githubusercontent.com/u/142251?v=3","gravatar_id":"","url":"https://api.github.com/users/mkoval","html_url":"https://github.com/mkoval","followers_url":"https://api.github.com/users/mkoval/followers","following_url":"https://api.github.com/users/mkoval/following{/other_user}","gists_url":"https://api.github.com/users/mkoval/gists{/gist_id}","starred_url":"https://api.github.com/users/mkoval/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mkoval/subscriptions","organizations_url":"https://api.github.com/users/mkoval/orgs","repos_url":"https://api.github.com/users/mkoval/repos","events_url":"https://api.github.com/users/mkoval/events{/privacy}","received_events_url":"https://api.github.com/users/mkoval/received_events","type":"User","site_admin":false},"repo":{"id":38646593,"name":"dart","full_name":"mkoval/dart","owner":{"login":"mkoval","id":142251,"avatar_url":"https://avatars.githubusercontent.com/u/142251?v=3","gravatar_id":"","url":"https://api.github.com/users/mkoval","html_url":"https://github.com/mkoval","followers_url":"https://api.github.com/users/mkoval/followers","following_url":"https://api.github.com/users/mkoval/following{/other_user}","gists_url":"https://api.github.com/users/mkoval/gists{/gist_id}","starred_url":"https://api.github.com/users/mkoval/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mkoval/subscriptions","organizations_url":"https://api.github.com/users/mkoval/orgs","repos_url":"https://api.github.com/users/mkoval/repos","events_url":"https://api.github.com/users/mkoval/events{/privacy}","received_events_url":"https://api.github.com/users/mkoval/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/mkoval/dart","description":"Dynamic Animation and Robotics Toolkit","fork":true,"url":"https://api.github.com/repos/mkoval/dart","forks_url":"https://api.github.com/repos/mkoval/dart/forks","keys_url":"https://api.github.com/repos/mkoval/dart/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mkoval/dart/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mkoval/dart/teams","hooks_url":"https://api.github.com/repos/mkoval/dart/hooks","issue_events_url":"https://api.github.com/repos/mkoval/dart/issues/events{/number}","events_url":"https://api.github.com/repos/mkoval/dart/events","assignees_url":"https://api.github.com/repos/mkoval/dart/assignees{/user}","branches_url":"https://api.github.com/repos/mkoval/dart/branches{/branch}","tags_url":"https://api.github.com/repos/mkoval/dart/tags","blobs_url":"https://api.github.com/repos/mkoval/dart/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mkoval/dart/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mkoval/dart/git/refs{/sha}","trees_url":"https://api.github.com/repos/mkoval/dart/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mkoval/dart/statuses/{sha}","languages_url":"https://api.github.com/repos/mkoval/dart/languages","stargazers_url":"https://api.github.com/repos/mkoval/dart/stargazers","contributors_url":"https://api.github.com/repos/mkoval/dart/contributors","subscribers_url":"https://api.github.com/repos/mkoval/dart/subscribers","subscription_url":"https://api.github.com/repos/mkoval/dart/subscription","commits_url":"https://api.github.com/repos/mkoval/dart/commits{/sha}","git_commits_url":"https://api.github.com/repos/mkoval/dart/git/commits{/sha}","comments_url":"https://api.github.com/repos/mkoval/dart/comments{/number}","issue_comment_url":"https://api.github.com/repos/mkoval/dart/issues/comments{/number}","contents_url":"https://api.github.com/repos/mkoval/dart/contents/{+path}","compare_url":"https://api.github.com/repos/mkoval/dart/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mkoval/dart/merges","archive_url":"https://api.github.com/repos/mkoval/dart/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mkoval/dart/downloads","issues_url":"https://api.github.com/repos/mkoval/dart/issues{/number}","pulls_url":"https://api.github.com/repos/mkoval/dart/pulls{/number}","milestones_url":"https://api.github.com/repos/mkoval/dart/milestones{/number}","notifications_url":"https://api.github.com/repos/mkoval/dart/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mkoval/dart/labels{/name}","releases_url":"https://api.github.com/repos/mkoval/dart/releases{/id}","created_at":"2015-07-06T21:14:10Z","updated_at":"2015-07-06T21:14:16Z","pushed_at":"2015-08-04T05:58:12Z","git_url":"git://github.com/mkoval/dart.git","ssh_url":"git@github.com:mkoval/dart.git","clone_url":"https://github.com/mkoval/dart.git","svn_url":"https://github.com/mkoval/dart","homepage":"http://dartsim.github.io/","size":99457,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"dartsim:master","ref":"master","sha":"43935863d9e702a72475039436e74fb889babf1b","user":{"login":"dartsim","id":4191609,"avatar_url":"https://avatars.githubusercontent.com/u/4191609?v=3","gravatar_id":"","url":"https://api.github.com/users/dartsim","html_url":"https://github.com/dartsim","followers_url":"https://api.github.com/users/dartsim/followers","following_url":"https://api.github.com/users/dartsim/following{/other_user}","gists_url":"https://api.github.com/users/dartsim/gists{/gist_id}","starred_url":"https://api.github.com/users/dartsim/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dartsim/subscriptions","organizations_url":"https://api.github.com/users/dartsim/orgs","repos_url":"https://api.github.com/users/dartsim/repos","events_url":"https://api.github.com/users/dartsim/events{/privacy}","received_events_url":"https://api.github.com/users/dartsim/received_events","type":"Organization","site_admin":false},"repo":{"id":2418592,"name":"dart","full_name":"dartsim/dart","owner":{"login":"dartsim","id":4191609,"avatar_url":"https://avatars.githubusercontent.com/u/4191609?v=3","gravatar_id":"","url":"https://api.github.com/users/dartsim","html_url":"https://github.com/dartsim","followers_url":"https://api.github.com/users/dartsim/followers","following_url":"https://api.github.com/users/dartsim/following{/other_user}","gists_url":"https://api.github.com/users/dartsim/gists{/gist_id}","starred_url":"https://api.github.com/users/dartsim/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dartsim/subscriptions","organizations_url":"https://api.github.com/users/dartsim/orgs","repos_url":"https://api.github.com/users/dartsim/repos","events_url":"https://api.github.com/users/dartsim/events{/privacy}","received_events_url":"https://api.github.com/users/dartsim/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/dartsim/dart","description":"Dynamic Animation and Robotics Toolkit","fork":false,"url":"https://api.github.com/repos/dartsim/dart","forks_url":"https://api.github.com/repos/dartsim/dart/forks","keys_url":"https://api.github.com/repos/dartsim/dart/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dartsim/dart/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dartsim/dart/teams","hooks_url":"https://api.github.com/repos/dartsim/dart/hooks","issue_events_url":"https://api.github.com/repos/dartsim/dart/issues/events{/number}","events_url":"https://api.github.com/repos/dartsim/dart/events","assignees_url":"https://api.github.com/repos/dartsim/dart/assignees{/user}","branches_url":"https://api.github.com/repos/dartsim/dart/branches{/branch}","tags_url":"https://api.github.com/repos/dartsim/dart/tags","blobs_url":"https://api.github.com/repos/dartsim/dart/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dartsim/dart/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dartsim/dart/git/refs{/sha}","trees_url":"https://api.github.com/repos/dartsim/dart/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dartsim/dart/statuses/{sha}","languages_url":"https://api.github.com/repos/dartsim/dart/languages","stargazers_url":"https://api.github.com/repos/dartsim/dart/stargazers","contributors_url":"https://api.github.com/repos/dartsim/dart/contributors","subscribers_url":"https://api.github.com/repos/dartsim/dart/subscribers","subscription_url":"https://api.github.com/repos/dartsim/dart/subscription","commits_url":"https://api.github.com/repos/dartsim/dart/commits{/sha}","git_commits_url":"https://api.github.com/repos/dartsim/dart/git/commits{/sha}","comments_url":"https://api.github.com/repos/dartsim/dart/comments{/number}","issue_comment_url":"https://api.github.com/repos/dartsim/dart/issues/comments{/number}","contents_url":"https://api.github.com/repos/dartsim/dart/contents/{+path}","compare_url":"https://api.github.com/repos/dartsim/dart/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dartsim/dart/merges","archive_url":"https://api.github.com/repos/dartsim/dart/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dartsim/dart/downloads","issues_url":"https://api.github.com/repos/dartsim/dart/issues{/number}","pulls_url":"https://api.github.com/repos/dartsim/dart/pulls{/number}","milestones_url":"https://api.github.com/repos/dartsim/dart/milestones{/number}","notifications_url":"https://api.github.com/repos/dartsim/dart/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dartsim/dart/labels{/name}","releases_url":"https://api.github.com/repos/dartsim/dart/releases{/id}","created_at":"2011-09-19T21:53:51Z","updated_at":"2015-07-27T18:46:29Z","pushed_at":"2015-08-04T23:25:34Z","git_url":"git://github.com/dartsim/dart.git","ssh_url":"git@github.com:dartsim/dart.git","clone_url":"https://github.com/dartsim/dart.git","svn_url":"https://github.com/dartsim/dart","homepage":"http://dartsim.github.io/","size":114169,"stargazers_count":71,"watchers_count":71,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":50,"mirror_url":null,"open_issues_count":112,"forks":50,"open_issues":112,"watchers":71,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dartsim/dart/pulls/464"},"html":{"href":"https://github.com/dartsim/dart/pull/464"},"issue":{"href":"https://api.github.com/repos/dartsim/dart/issues/464"},"comments":{"href":"https://api.github.com/repos/dartsim/dart/issues/464/comments"},"review_comments":{"href":"https://api.github.com/repos/dartsim/dart/pulls/464/comments"},"review_comment":{"href":"https://api.github.com/repos/dartsim/dart/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dartsim/dart/pulls/464/commits"},"statuses":{"href":"https://api.github.com/repos/dartsim/dart/statuses/0dd9c529651811d809e19c7d4105f69f9c7c9ec5"}}}}