{"action":"created","comment":{"url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/pulls/comments/51359135","id":51359135,"diff_hunk":"@@ -0,0 +1,168 @@\n+/*\r\n+ * (c) 2015- Hourglass Resurrection Team\r\n+ * Hourglass Resurrection is licensed under GPL v2.\r\n+ * Refer to the file COPYING.txt in the project root.\r\n+ */\r\n+\r\n+#pragma once\r\n+\r\n+#include <Windows.h>\r\n+\r\n+#include <print.h>\r\n+\r\n+/*\r\n+ * Memory Manager\r\n+ * --------------\r\n+ * This is a manager of dynamic allocations that allows us to have full control of the heap.\r\n+ * This manager uses a best fit allocation model to not waste more RAM than necessary, and it\r\n+ * allocates all the objects as Shared Memory Objects. Using Shared Memory Objects allows for easy\r\n+ * access from the executable, in order to have an effective RAM Search.\r\n+ * Another benefit to Shared Memory Objects is that it becomes easier to manage save states with\r\n+ * these over regular RAM pages as we can have full READ / WRITE access from the executable side,\r\n+ * as well as shared ownership.\r\n+ *\r\n+ * There is a downside to this approach, and that is if the games use any libc, libc++ or STL\r\n+ * contaners in it's own code, as there will be 2 layers doing the same thing, which means both the\r\n+ * game and we will be keeping a memory map, wasting a bit of RAM. This is unavoidable.\r\n+ * Microsoft also opted for enforcing an Allocation Granularity that may be much larger than the\r\n+ * page size in the system. This is to be fully compatible with the exotic Alpha AVX RISC CPU.\r\n+ * The compatibility with this CPU puts extra strain on this implementation, as it becomes extra\r\n+ * important to put small allocations in the same block, or code like\r\n+ * \"char* ptr = malloc(sizeof(char));\" is going to provide a very nice chock, instead of allocating\r\n+ * a small number of bytes, it will allocate at least 64 kilobytes.\r\n+ *\r\n+ * The memory manager is also responsible for the heap allocations done by the DLL itself, the way\r\n+ * it is solved is that the Allocation function takes an optional boolean to allocate internally.\r\n+ * Allocating internally means that we will use an address outside of the regular scope, but still\r\n+ * within the 32bit application limit. This is handled by being \"large address aware\" which gives\r\n+ * us this access to the \"unreachable\" >2 GB address space.\r\n+ * It is really important to keep the allocations apart, since some games that are not capable of\r\n+ * handling addresses of >2 GB may still use as much of the 2 GB as possible. We must for that\r\n+ * reason be really careful about our own allocations in that space and do all we can to stay in\r\n+ * our own allotted region.\r\n+ *\r\n+ * All of the above means that new and malloc are entirely forbidden(!) in the DLL. To handle STL\r\n+ * containers use the ManagedAllocator.\r\n+ *\r\n+ * Reference material (including reference material linked by the webpage):\r\n+ * https://msdn.microsoft.com/en-us/library/windows/desktop/aa366912%28v=vs.85%29.aspx\r\n+ * https://blogs.msdn.microsoft.com/oldnewthing/20031008-00/?p=42223/\r\n+ *\r\n+ * -- Warepire\r\n+ */\r\n+namespace MemoryManager\r\n+{\r\n+    enum AllocationFlags : UINT\r\n+    {\r\n+        ALLOC_WRITE     = 0x00000001,\r\n+        ALLOC_READONLY  = 0x00000002,\r\n+        ALLOC_EXECUTE   = 0x00000004,\r\n+        ALLOC_ZEROINIT  = 0x00000008,\r\n+        REALLOC_NO_MOVE = 0x00000010,\r\n+    };\r\n+\r\n+    void Init();\r\n+\r\n+    LPVOID Allocate(UINT bytes, UINT flags);\r\n+    LPVOID Reallocate(LPVOID address, UINT bytes, UINT flags);\r\n+    void Deallocate(LPVOID address);\r\n+\r\n+    SIZE_T GetSizeOfAllocation(LPCVOID address);\r\n+};\r\n+\r\n+/*\r\n+ * Gotta break some of the coding standard here as the function names etc are expected to be named\r\n+ * like they are here. Otherwise the allocator doesn't work.\r\n+ * -- Warepire\r\n+ */\r\n+template<class T>\r\n+class ManagedAllocator\r\n+{\r\n+public:\r\n+    typedef T               value_type;\r\n+    typedef T*              pointer;\r\n+    typedef const T*        const_pointer;\r\n+    typedef T&              reference;\r\n+    typedef const T&        const_reference;\r\n+    typedef std::size_t     size_type;\r\n+    typedef std::ptrdiff_t  difference_type;\r\n+\r\n+    template<class U>\r\n+    struct rebind\r\n+    {\r\n+        typedef ManagedAllocator<U> other;\r\n+    };\r\n+\r\n+    /*\r\n+     * Microsoft cannot follow standards with nothrow-declaring stuff... sigh...\r\n+     */\r\n+    __nothrow ManagedAllocator() {}\r\n+    __nothrow ManagedAllocator(const ManagedAllocator& alloc) {}\r\n+    template<class U>\r\n+    __nothrow ManagedAllocator(const ManagedAllocator<U>& alloc) {}\r\n+    ~ManagedAllocator() {}\r\n+\r\n+    pointer address(reference x) const\r\n+    {\r\n+        debugprintf(__FUNCTION__ \" called.\\n\");\r\n+        return &x;\r\n+    }\r\n+    const_pointer address(const_reference x) const\r\n+    {\r\n+        debugprintf(__FUNCTION__ \" called.\\n\");\r\n+        return &x;\r\n+    }\r\n+\r\n+    pointer allocate(size_type n, const_pointer hint = 0)\r\n+    {\r\n+        debugprintf(__FUNCTION__ \" called.\\n\");\r\n+        static const UINT flags = MemoryManager::ALLOC_WRITE;\r\n+        return reinterpret_cast<pointer>(MemoryManager::Allocate(n * sizeof(value_type), flags));\r\n+    }\r\n+    void deallocate(pointer p, size_type n)\r\n+    {\r\n+        debugprintf(__FUNCTION__ \" called.\\n\");\r","path":"wintasee/MemoryManager/MemoryManager.h","position":124,"original_position":124,"commit_id":"5a13474287d4ecd5b2fab801f728039675d9263a","original_commit_id":"5a13474287d4ecd5b2fab801f728039675d9263a","user":{"login":"YaLTeR","id":1794388,"avatar_url":"https://avatars.githubusercontent.com/u/1794388?v=3","gravatar_id":"","url":"https://api.github.com/users/YaLTeR","html_url":"https://github.com/YaLTeR","followers_url":"https://api.github.com/users/YaLTeR/followers","following_url":"https://api.github.com/users/YaLTeR/following{/other_user}","gists_url":"https://api.github.com/users/YaLTeR/gists{/gist_id}","starred_url":"https://api.github.com/users/YaLTeR/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/YaLTeR/subscriptions","organizations_url":"https://api.github.com/users/YaLTeR/orgs","repos_url":"https://api.github.com/users/YaLTeR/repos","events_url":"https://api.github.com/users/YaLTeR/events{/privacy}","received_events_url":"https://api.github.com/users/YaLTeR/received_events","type":"User","site_admin":false},"body":"ENTER() can be used","created_at":"2016-01-31T11:35:25Z","updated_at":"2016-01-31T11:35:25Z","html_url":"https://github.com/Hourglass-Resurrection/Hourglass-Resurrection/pull/32#discussion_r51359135","pull_request_url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/pulls/32","_links":{"self":{"href":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/pulls/comments/51359135"},"html":{"href":"https://github.com/Hourglass-Resurrection/Hourglass-Resurrection/pull/32#discussion_r51359135"},"pull_request":{"href":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/pulls/32"}}},"pull_request":{"url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/pulls/32","id":57765534,"html_url":"https://github.com/Hourglass-Resurrection/Hourglass-Resurrection/pull/32","diff_url":"https://github.com/Hourglass-Resurrection/Hourglass-Resurrection/pull/32.diff","patch_url":"https://github.com/Hourglass-Resurrection/Hourglass-Resurrection/pull/32.patch","issue_url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/issues/32","number":32,"state":"open","locked":false,"title":"[WIP - NOT FOR MERGE] DLL & EXE: Memory manager","user":{"login":"Warepire","id":4831577,"avatar_url":"https://avatars.githubusercontent.com/u/4831577?v=3","gravatar_id":"","url":"https://api.github.com/users/Warepire","html_url":"https://github.com/Warepire","followers_url":"https://api.github.com/users/Warepire/followers","following_url":"https://api.github.com/users/Warepire/following{/other_user}","gists_url":"https://api.github.com/users/Warepire/gists{/gist_id}","starred_url":"https://api.github.com/users/Warepire/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Warepire/subscriptions","organizations_url":"https://api.github.com/users/Warepire/orgs","repos_url":"https://api.github.com/users/Warepire/repos","events_url":"https://api.github.com/users/Warepire/events{/privacy}","received_events_url":"https://api.github.com/users/Warepire/received_events","type":"User","site_admin":false},"body":"Due the size of this patch I am hereby submitting it for continuous review.\r\n\r\nThe goal of this when it is complete is that the Hourglass executable will have write permission by default to all memory that the game process allocates, and thus (hopefully) eliminate the BSoDs that has been seen. This will at least fix some sneaky memory leaks and whatnot.\r\n\r\nAnother long term goal is to enable save-states to become cross-session, and to implement a much better RAM Search.\r\n\r\nThis probably needs a bigger write-up later. Please refer to the comments in the code.","created_at":"2016-01-31T10:44:43Z","updated_at":"2016-01-31T11:35:25Z","closed_at":null,"merged_at":null,"merge_commit_sha":"9ba2896dcc6098dfde54af53e5f29d7d939bcad7","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/pulls/32/commits","review_comments_url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/pulls/32/comments","review_comment_url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/issues/32/comments","statuses_url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/statuses/5a13474287d4ecd5b2fab801f728039675d9263a","head":{"label":"Warepire:memory_manager","ref":"memory_manager","sha":"5a13474287d4ecd5b2fab801f728039675d9263a","user":{"login":"Warepire","id":4831577,"avatar_url":"https://avatars.githubusercontent.com/u/4831577?v=3","gravatar_id":"","url":"https://api.github.com/users/Warepire","html_url":"https://github.com/Warepire","followers_url":"https://api.github.com/users/Warepire/followers","following_url":"https://api.github.com/users/Warepire/following{/other_user}","gists_url":"https://api.github.com/users/Warepire/gists{/gist_id}","starred_url":"https://api.github.com/users/Warepire/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Warepire/subscriptions","organizations_url":"https://api.github.com/users/Warepire/orgs","repos_url":"https://api.github.com/users/Warepire/repos","events_url":"https://api.github.com/users/Warepire/events{/privacy}","received_events_url":"https://api.github.com/users/Warepire/received_events","type":"User","site_admin":false},"repo":{"id":29933495,"name":"Hourglass-Resurrection","full_name":"Warepire/Hourglass-Resurrection","owner":{"login":"Warepire","id":4831577,"avatar_url":"https://avatars.githubusercontent.com/u/4831577?v=3","gravatar_id":"","url":"https://api.github.com/users/Warepire","html_url":"https://github.com/Warepire","followers_url":"https://api.github.com/users/Warepire/followers","following_url":"https://api.github.com/users/Warepire/following{/other_user}","gists_url":"https://api.github.com/users/Warepire/gists{/gist_id}","starred_url":"https://api.github.com/users/Warepire/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Warepire/subscriptions","organizations_url":"https://api.github.com/users/Warepire/orgs","repos_url":"https://api.github.com/users/Warepire/repos","events_url":"https://api.github.com/users/Warepire/events{/privacy}","received_events_url":"https://api.github.com/users/Warepire/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/Warepire/Hourglass-Resurrection","description":"Main repository for Hourglass-Resurrection, containing the source code for the executable and the DLL.","fork":true,"url":"https://api.github.com/repos/Warepire/Hourglass-Resurrection","forks_url":"https://api.github.com/repos/Warepire/Hourglass-Resurrection/forks","keys_url":"https://api.github.com/repos/Warepire/Hourglass-Resurrection/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Warepire/Hourglass-Resurrection/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Warepire/Hourglass-Resurrection/teams","hooks_url":"https://api.github.com/repos/Warepire/Hourglass-Resurrection/hooks","issue_events_url":"https://api.github.com/repos/Warepire/Hourglass-Resurrection/issues/events{/number}","events_url":"https://api.github.com/repos/Warepire/Hourglass-Resurrection/events","assignees_url":"https://api.github.com/repos/Warepire/Hourglass-Resurrection/assignees{/user}","branches_url":"https://api.github.com/repos/Warepire/Hourglass-Resurrection/branches{/branch}","tags_url":"https://api.github.com/repos/Warepire/Hourglass-Resurrection/tags","blobs_url":"https://api.github.com/repos/Warepire/Hourglass-Resurrection/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Warepire/Hourglass-Resurrection/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Warepire/Hourglass-Resurrection/git/refs{/sha}","trees_url":"https://api.github.com/repos/Warepire/Hourglass-Resurrection/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Warepire/Hourglass-Resurrection/statuses/{sha}","languages_url":"https://api.github.com/repos/Warepire/Hourglass-Resurrection/languages","stargazers_url":"https://api.github.com/repos/Warepire/Hourglass-Resurrection/stargazers","contributors_url":"https://api.github.com/repos/Warepire/Hourglass-Resurrection/contributors","subscribers_url":"https://api.github.com/repos/Warepire/Hourglass-Resurrection/subscribers","subscription_url":"https://api.github.com/repos/Warepire/Hourglass-Resurrection/subscription","commits_url":"https://api.github.com/repos/Warepire/Hourglass-Resurrection/commits{/sha}","git_commits_url":"https://api.github.com/repos/Warepire/Hourglass-Resurrection/git/commits{/sha}","comments_url":"https://api.github.com/repos/Warepire/Hourglass-Resurrection/comments{/number}","issue_comment_url":"https://api.github.com/repos/Warepire/Hourglass-Resurrection/issues/comments{/number}","contents_url":"https://api.github.com/repos/Warepire/Hourglass-Resurrection/contents/{+path}","compare_url":"https://api.github.com/repos/Warepire/Hourglass-Resurrection/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Warepire/Hourglass-Resurrection/merges","archive_url":"https://api.github.com/repos/Warepire/Hourglass-Resurrection/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Warepire/Hourglass-Resurrection/downloads","issues_url":"https://api.github.com/repos/Warepire/Hourglass-Resurrection/issues{/number}","pulls_url":"https://api.github.com/repos/Warepire/Hourglass-Resurrection/pulls{/number}","milestones_url":"https://api.github.com/repos/Warepire/Hourglass-Resurrection/milestones{/number}","notifications_url":"https://api.github.com/repos/Warepire/Hourglass-Resurrection/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Warepire/Hourglass-Resurrection/labels{/name}","releases_url":"https://api.github.com/repos/Warepire/Hourglass-Resurrection/releases{/id}","deployments_url":"https://api.github.com/repos/Warepire/Hourglass-Resurrection/deployments","created_at":"2015-01-27T20:29:48Z","updated_at":"2016-01-30T20:31:17Z","pushed_at":"2016-01-31T06:12:59Z","git_url":"git://github.com/Warepire/Hourglass-Resurrection.git","ssh_url":"git@github.com:Warepire/Hourglass-Resurrection.git","clone_url":"https://github.com/Warepire/Hourglass-Resurrection.git","svn_url":"https://github.com/Warepire/Hourglass-Resurrection","homepage":"","size":2314,"stargazers_count":1,"watchers_count":1,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":1,"forks":1,"open_issues":1,"watchers":1,"default_branch":"master"}},"base":{"label":"Hourglass-Resurrection:master","ref":"master","sha":"87fe8f1530ad17cd60a231acefff16f3891eb9c1","user":{"login":"Hourglass-Resurrection","id":10700473,"avatar_url":"https://avatars.githubusercontent.com/u/10700473?v=3","gravatar_id":"","url":"https://api.github.com/users/Hourglass-Resurrection","html_url":"https://github.com/Hourglass-Resurrection","followers_url":"https://api.github.com/users/Hourglass-Resurrection/followers","following_url":"https://api.github.com/users/Hourglass-Resurrection/following{/other_user}","gists_url":"https://api.github.com/users/Hourglass-Resurrection/gists{/gist_id}","starred_url":"https://api.github.com/users/Hourglass-Resurrection/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Hourglass-Resurrection/subscriptions","organizations_url":"https://api.github.com/users/Hourglass-Resurrection/orgs","repos_url":"https://api.github.com/users/Hourglass-Resurrection/repos","events_url":"https://api.github.com/users/Hourglass-Resurrection/events{/privacy}","received_events_url":"https://api.github.com/users/Hourglass-Resurrection/received_events","type":"Organization","site_admin":false},"repo":{"id":29834002,"name":"Hourglass-Resurrection","full_name":"Hourglass-Resurrection/Hourglass-Resurrection","owner":{"login":"Hourglass-Resurrection","id":10700473,"avatar_url":"https://avatars.githubusercontent.com/u/10700473?v=3","gravatar_id":"","url":"https://api.github.com/users/Hourglass-Resurrection","html_url":"https://github.com/Hourglass-Resurrection","followers_url":"https://api.github.com/users/Hourglass-Resurrection/followers","following_url":"https://api.github.com/users/Hourglass-Resurrection/following{/other_user}","gists_url":"https://api.github.com/users/Hourglass-Resurrection/gists{/gist_id}","starred_url":"https://api.github.com/users/Hourglass-Resurrection/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Hourglass-Resurrection/subscriptions","organizations_url":"https://api.github.com/users/Hourglass-Resurrection/orgs","repos_url":"https://api.github.com/users/Hourglass-Resurrection/repos","events_url":"https://api.github.com/users/Hourglass-Resurrection/events{/privacy}","received_events_url":"https://api.github.com/users/Hourglass-Resurrection/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Hourglass-Resurrection/Hourglass-Resurrection","description":"Main repository for Hourglass-Resurrection, containing the source code for the executable and the DLL.","fork":false,"url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection","forks_url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/forks","keys_url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/teams","hooks_url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/hooks","issue_events_url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/issues/events{/number}","events_url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/events","assignees_url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/assignees{/user}","branches_url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/branches{/branch}","tags_url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/tags","blobs_url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/git/refs{/sha}","trees_url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/statuses/{sha}","languages_url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/languages","stargazers_url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/stargazers","contributors_url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/contributors","subscribers_url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/subscribers","subscription_url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/subscription","commits_url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/commits{/sha}","git_commits_url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/git/commits{/sha}","comments_url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/comments{/number}","issue_comment_url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/issues/comments{/number}","contents_url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/contents/{+path}","compare_url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/merges","archive_url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/downloads","issues_url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/issues{/number}","pulls_url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/pulls{/number}","milestones_url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/milestones{/number}","notifications_url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/labels{/name}","releases_url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/releases{/id}","deployments_url":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/deployments","created_at":"2015-01-25T22:22:22Z","updated_at":"2016-01-30T00:53:41Z","pushed_at":"2016-01-31T10:44:43Z","git_url":"git://github.com/Hourglass-Resurrection/Hourglass-Resurrection.git","ssh_url":"git@github.com:Hourglass-Resurrection/Hourglass-Resurrection.git","clone_url":"https://github.com/Hourglass-Resurrection/Hourglass-Resurrection.git","svn_url":"https://github.com/Hourglass-Resurrection/Hourglass-Resurrection","homepage":"","size":2243,"stargazers_count":15,"watchers_count":15,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":17,"mirror_url":null,"open_issues_count":17,"forks":17,"open_issues":17,"watchers":15,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/pulls/32"},"html":{"href":"https://github.com/Hourglass-Resurrection/Hourglass-Resurrection/pull/32"},"issue":{"href":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/issues/32"},"comments":{"href":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/issues/32/comments"},"review_comments":{"href":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/pulls/32/comments"},"review_comment":{"href":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/pulls/32/commits"},"statuses":{"href":"https://api.github.com/repos/Hourglass-Resurrection/Hourglass-Resurrection/statuses/5a13474287d4ecd5b2fab801f728039675d9263a"}}}}