{"action":"created","comment":{"url":"https://api.github.com/repos/arrayfire/arrayfire/pulls/comments/198383923","pull_request_review_id":132302004,"id":198383923,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDE5ODM4MzkyMw==","diff_hunk":"@@ -8,145 +8,128 @@\n  ********************************************************/\n \n #include \"symbol_manager.hpp\"\n-#include <algorithm>\n-#include <vector>\n-#include <string>\n-#include <cmath>\n #include <af/version.h>\n+#include <common/module_loading.hpp>\n+\n+#include <cmath>\n+#include <string>\n+#include <type_traits>\n+\n+\n+#ifndef WIN_OS\n+#include <dlfcn.h>\n+#else\n+#include <Windows.h>\n+#endif\n+\n+using common::loadLibrary;\n+using common::unloadLibrary;\n \n+using std::extent;\n using std::string;\n-using std::replace;\n \n namespace unified\n {\n \n-static const char* LIB_AF_BKND_NAME[NUM_BACKENDS] = {\"cpu\", \"cuda\", \"opencl\"};\n #if defined(OS_WIN)\n-static const char* LIB_AF_BKND_PREFIX = \"af\";\n+static const char* LIB_AF_BKND_PREFIX = \"\";\n static const char* LIB_AF_BKND_SUFFIX = \".dll\";\n+#define PATH_SEPARATOR \"\\\\\"\n #define RTLD_LAZY 0\n #else\n+\n #if defined(__APPLE__)\n-#define SO_SUFFIX_HELPER(VER) \".\" #VER \".dylib\"\n+#  define SO_SUFFIX_HELPER(VER) \".\" #VER \".dylib\"\n #else\n-#define SO_SUFFIX_HELPER(VER) \".so.\" #VER\n-#endif // APPLE\n-static const char* LIB_AF_BKND_PREFIX = \"libaf\";\n+#  define SO_SUFFIX_HELPER(VER) \".so.\" #VER\n+#endif\n+   static const char* LIB_AF_BKND_PREFIX = \"lib\";\n+#  define PATH_SEPARATOR \"/\"\n \n-#define GET_SO_SUFFIX(VER) SO_SUFFIX_HELPER(VER)\n-static const char* LIB_AF_BKND_SUFFIX = GET_SO_SUFFIX(AF_VERSION_MAJOR);\n+#  define GET_SO_SUFFIX(VER) SO_SUFFIX_HELPER(VER)\n+   static const char* LIB_AF_BKND_SUFFIX = GET_SO_SUFFIX(AF_VERSION_MAJOR);\n #endif\n \n-static const char* LIB_AF_ENVARS[NUM_ENV_VARS] = {\"AF_PATH\", \"AF_BUILD_PATH\"};\n-static const char* LIB_AF_RPATHS[NUM_ENV_VARS] = {\"/lib/\", \"/src/backend/\"};\n-static const bool LIB_AF_RPATH_SUFFIX[NUM_ENV_VARS] = {false, true};\n+string getBkndLibName(const af_backend backend) {\n+    string ret;\n+    switch (backend) {\n+        case AF_BACKEND_CUDA: ret = string(LIB_AF_BKND_PREFIX) + \"afcuda\" + LIB_AF_BKND_SUFFIX; break;\n+        case AF_BACKEND_OPENCL: ret = string(LIB_AF_BKND_PREFIX) + \"afopencl\" + LIB_AF_BKND_SUFFIX; break;\n+        case AF_BACKEND_CPU: ret = string(LIB_AF_BKND_PREFIX) + \"afcpu\" + LIB_AF_BKND_SUFFIX; break;\n+        default: assert(1!=1 && \"Invalid backend\");\n+    }\n+    return ret;\n+}\n+string getBackendDirectoryName(const af_backend backend) {\n+    string ret;\n+    switch (backend) {\n+        case AF_BACKEND_CUDA: ret = \"cuda\"; break;\n+        case AF_BACKEND_OPENCL: ret = \"opencl\"; break;\n+        case AF_BACKEND_CPU: ret = \"cpu\"; break;\n+        default: assert(1!=1 && \"Invalid backend\");\n+      }\n+    return ret;\n+}\n \n-inline string getBkndLibName(const int backend_index)\n-{\n-    int i = backend_index >=0 && backend_index<NUM_BACKENDS ? backend_index : 0;\n-    return string(LIB_AF_BKND_PREFIX) + LIB_AF_BKND_NAME[i] + LIB_AF_BKND_SUFFIX;\n+string join_path(string first) {\n+    return first;\n+}\n+\n+template<typename... ARGS>\n+string join_path(string first, ARGS... args) {\n+    if(first.empty()) { return join_path(args...); }\n+    else              { return first + PATH_SEPARATOR + join_path(args...); }\n }\n \n /*flag parameter is not used on windows platform */\n-LibHandle openDynLibrary(const int bknd_idx, int flag=RTLD_LAZY)\n+LibHandle openDynLibrary(const af_backend bknd_idx, int flag=RTLD_LAZY)\n {\n-    /*\n-     * The default search path is the colon separated list of\n-     * paths stored in the environment variables:\n-     * * LD_LIBRARY_PATH(Linux/Unix/Apple)\n-     * * DYLD_LIBRARY_PATH (Apple)\n-     * * PATH (Windows)\n-    */\n+    // The default search path is the colon separated list of paths stored in\n+    // the environment variables:\n     string bkndLibName = getBkndLibName(bknd_idx);\n     string show_flag = getEnvVar(\"AF_SHOW_LOAD_PATH\");\n     bool show_load_path = show_flag==\"1\";\n \n-#if defined(OS_WIN)\n-    HMODULE retVal = LoadLibrary(bkndLibName.c_str());\n-#else\n-    LibHandle retVal = dlopen(bkndLibName.c_str(), flag);\n-#endif\n-    if(retVal != NULL) { // Success\n-        if (show_load_path)\n-            printf(\"Using %s from system path\\n\", bkndLibName.c_str());\n-    } else {\n-        /*\n-         * In the event that dlopen returns NULL, search for the lib\n-         * in hard coded paths based on the environment variables\n-         * defined in the constant string array LIB_AF_PATHS\n-         * * AF_PATH\n-         * * AF_BUILD_PATH\n-         *\n-         * Note: This does not guarantee successful loading as the dependent\n-         * libraries may still not load\n-        */\n-\n-        for (int i=0; i<NUM_ENV_VARS; ++i) {\n-            string abs_path = getEnvVar(LIB_AF_ENVARS[i])\n-                                 + LIB_AF_RPATHS[i]\n-                                 + (LIB_AF_RPATH_SUFFIX[i] ? LIB_AF_BKND_NAME[bknd_idx]+ string(\"/\") : \"\")\n-                                 + bkndLibName;\n-#if defined(OS_WIN)\n-            replace(abs_path.begin(), abs_path.end(), '/', '\\\\');\n-            retVal = LoadLibrary(abs_path.c_str());\n+    string paths[] = {\n+        \"\",  // Default paths\n+        \".\", // Shared libraries in current directory\n+        // Running from the CMake Build directory\n+        join_path(\".\", \"src\", \"backend\", getBackendDirectoryName(bknd_idx)),\n+        // Running from the test directory\n+        join_path(\"..\", \"src\", \"backend\", getBackendDirectoryName(bknd_idx)),\n+        // Environment variable PATHS\n+        join_path(getEnvVar(\"AF_BUILD_PATH\"), \"src\", \"backend\", getBackendDirectoryName(bknd_idx)),\n+        join_path(getEnvVar(\"AF_PATH\"), \"lib\"),\n+        join_path(getEnvVar(\"AF_PATH\"), \"lib64\"),\n+\n+        // Common install paths\n+#if !defined(OS_WIN)\n+        \"/opt/arrayfire-3/lib/\",\n+        \"/opt/arrayfire/lib/\",\n+        \"/usr/local/lib/\",\n+        \"/usr/local/arrayfire/lib/\"\n #else\n-            retVal = dlopen(abs_path.c_str(), flag);\n+        join_path(getEnvVar(\"ProgramFiles\"), \"ArrayFire\", \"lib\"),\n+        join_path(getEnvVar(\"ProgramFiles\"), \"ArrayFire\", \"v3\", \"lib\")\n #endif\n-            if (retVal!=NULL) {\n-                if (show_load_path)\n-                    printf(\"Using %s\\n\", abs_path.c_str());\n-                // if the current absolute path based dlopen\n-                // search is a success, then abandon search\n-                // and proceed for compute\n-                break;\n-            }\n-        }\n+    };\n \n-#if !defined(OS_WIN)\n-        /*\n-         * If Linux/OSX, then the following are also checked\n-         * (only if lib is not found)\n-         * /opt/arrayfire/lib\n-         * /opt/arrayfire-3/lib\n-         * /usr/local/lib\n-         * /usr/local/arrayfire/lib\n-         * /usr/local/arrayfire-3/lib\n-        */\n-        if (retVal == NULL) {\n-            static const\n-            std::vector<std::string> extraLibPaths {\"/opt/arrayfire-3/lib/\",\n-                                                    \"/opt/arrayfire/lib/\",\n-                                                    \"/usr/local/lib/\",\n-                                                    \"/usr/local/arrayfire-3/lib/\",\n-                                                    \"/usr/local/arrayfire/lib/\",\n-                                                   };\n-\n-            for (auto libPath: extraLibPaths) {\n-                string abs_path = libPath + bkndLibName;\n-                retVal = dlopen(abs_path.c_str(), flag);\n-                if (retVal != NULL) {\n-                    if (show_load_path)\n-                        printf(\"Using %s\\n\", abs_path.c_str());\n-                    // if the current absolute path based dlopen\n-                    // search is a success, then abandon search\n-                    // and proceed for compute\n-                    break;\n-                }\n+    LibHandle retVal = nullptr;\n+    for (int i = 0; i < extent<decltype(paths)>::value; i++) {","path":"src/api/unified/symbol_manager.cpp","position":null,"original_position":207,"commit_id":"ccbb82d90845cb0b9b874eb1c3703a5e02c4641f","original_commit_id":"54215b1ee95fe2a3da9347de25ca1c0c97ceae34","user":{"login":"9prady9","id":3270458,"node_id":"MDQ6VXNlcjMyNzA0NTg=","avatar_url":"https://avatars3.githubusercontent.com/u/3270458?v=4","gravatar_id":"","url":"https://api.github.com/users/9prady9","html_url":"https://github.com/9prady9","followers_url":"https://api.github.com/users/9prady9/followers","following_url":"https://api.github.com/users/9prady9/following{/other_user}","gists_url":"https://api.github.com/users/9prady9/gists{/gist_id}","starred_url":"https://api.github.com/users/9prady9/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/9prady9/subscriptions","organizations_url":"https://api.github.com/users/9prady9/orgs","repos_url":"https://api.github.com/users/9prady9/repos","events_url":"https://api.github.com/users/9prady9/events{/privacy}","received_events_url":"https://api.github.com/users/9prady9/received_events","type":"User","site_admin":false},"body":":+1:  `extent<decltype(paths)>::value`","created_at":"2018-06-27T06:54:38Z","updated_at":"2018-06-27T06:57:14Z","html_url":"https://github.com/arrayfire/arrayfire/pull/2216#discussion_r198383923","pull_request_url":"https://api.github.com/repos/arrayfire/arrayfire/pulls/2216","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/arrayfire/arrayfire/pulls/comments/198383923"},"html":{"href":"https://github.com/arrayfire/arrayfire/pull/2216#discussion_r198383923"},"pull_request":{"href":"https://api.github.com/repos/arrayfire/arrayfire/pulls/2216"}}},"pull_request":{"url":"https://api.github.com/repos/arrayfire/arrayfire/pulls/2216","id":197622753,"node_id":"MDExOlB1bGxSZXF1ZXN0MTk3NjIyNzUz","html_url":"https://github.com/arrayfire/arrayfire/pull/2216","diff_url":"https://github.com/arrayfire/arrayfire/pull/2216.diff","patch_url":"https://github.com/arrayfire/arrayfire/pull/2216.patch","issue_url":"https://api.github.com/repos/arrayfire/arrayfire/issues/2216","number":2216,"state":"open","locked":false,"title":"Refactor symbolic manager and add logging support","user":{"login":"umar456","id":457510,"node_id":"MDQ6VXNlcjQ1NzUxMA==","avatar_url":"https://avatars1.githubusercontent.com/u/457510?v=4","gravatar_id":"","url":"https://api.github.com/users/umar456","html_url":"https://github.com/umar456","followers_url":"https://api.github.com/users/umar456/followers","following_url":"https://api.github.com/users/umar456/following{/other_user}","gists_url":"https://api.github.com/users/umar456/gists{/gist_id}","starred_url":"https://api.github.com/users/umar456/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/umar456/subscriptions","organizations_url":"https://api.github.com/users/umar456/orgs","repos_url":"https://api.github.com/users/umar456/repos","events_url":"https://api.github.com/users/umar456/events{/privacy}","received_events_url":"https://api.github.com/users/umar456/received_events","type":"User","site_admin":false},"body":"* Use functions defined in module_loading.hpp headers\r\n* Add support for logging","created_at":"2018-06-27T05:52:03Z","updated_at":"2018-06-27T06:57:14Z","closed_at":null,"merged_at":null,"merge_commit_sha":"128b140f3bf5ab2671d9be3b9b05b584eede9062","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":{"url":"https://api.github.com/repos/arrayfire/arrayfire/milestones/24","html_url":"https://github.com/arrayfire/arrayfire/milestone/24","labels_url":"https://api.github.com/repos/arrayfire/arrayfire/milestones/24/labels","id":3154660,"node_id":"MDk6TWlsZXN0b25lMzE1NDY2MA==","number":24,"title":"v3.6.1","description":"","creator":{"login":"mlloreda","id":226625,"node_id":"MDQ6VXNlcjIyNjYyNQ==","avatar_url":"https://avatars2.githubusercontent.com/u/226625?v=4","gravatar_id":"","url":"https://api.github.com/users/mlloreda","html_url":"https://github.com/mlloreda","followers_url":"https://api.github.com/users/mlloreda/followers","following_url":"https://api.github.com/users/mlloreda/following{/other_user}","gists_url":"https://api.github.com/users/mlloreda/gists{/gist_id}","starred_url":"https://api.github.com/users/mlloreda/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mlloreda/subscriptions","organizations_url":"https://api.github.com/users/mlloreda/orgs","repos_url":"https://api.github.com/users/mlloreda/repos","events_url":"https://api.github.com/users/mlloreda/events{/privacy}","received_events_url":"https://api.github.com/users/mlloreda/received_events","type":"User","site_admin":false},"open_issues":3,"closed_issues":28,"state":"open","created_at":"2018-03-01T20:27:34Z","updated_at":"2018-06-27T05:54:46Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/arrayfire/arrayfire/pulls/2216/commits","review_comments_url":"https://api.github.com/repos/arrayfire/arrayfire/pulls/2216/comments","review_comment_url":"https://api.github.com/repos/arrayfire/arrayfire/pulls/comments{/number}","comments_url":"https://api.github.com/repos/arrayfire/arrayfire/issues/2216/comments","statuses_url":"https://api.github.com/repos/arrayfire/arrayfire/statuses/ccbb82d90845cb0b9b874eb1c3703a5e02c4641f","head":{"label":"umar456:refactor_sym_man","ref":"refactor_sym_man","sha":"ccbb82d90845cb0b9b874eb1c3703a5e02c4641f","user":{"login":"umar456","id":457510,"node_id":"MDQ6VXNlcjQ1NzUxMA==","avatar_url":"https://avatars1.githubusercontent.com/u/457510?v=4","gravatar_id":"","url":"https://api.github.com/users/umar456","html_url":"https://github.com/umar456","followers_url":"https://api.github.com/users/umar456/followers","following_url":"https://api.github.com/users/umar456/following{/other_user}","gists_url":"https://api.github.com/users/umar456/gists{/gist_id}","starred_url":"https://api.github.com/users/umar456/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/umar456/subscriptions","organizations_url":"https://api.github.com/users/umar456/orgs","repos_url":"https://api.github.com/users/umar456/repos","events_url":"https://api.github.com/users/umar456/events{/privacy}","received_events_url":"https://api.github.com/users/umar456/received_events","type":"User","site_admin":false},"repo":{"id":27382503,"node_id":"MDEwOlJlcG9zaXRvcnkyNzM4MjUwMw==","name":"arrayfire","full_name":"umar456/arrayfire","owner":{"login":"umar456","id":457510,"node_id":"MDQ6VXNlcjQ1NzUxMA==","avatar_url":"https://avatars1.githubusercontent.com/u/457510?v=4","gravatar_id":"","url":"https://api.github.com/users/umar456","html_url":"https://github.com/umar456","followers_url":"https://api.github.com/users/umar456/followers","following_url":"https://api.github.com/users/umar456/following{/other_user}","gists_url":"https://api.github.com/users/umar456/gists{/gist_id}","starred_url":"https://api.github.com/users/umar456/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/umar456/subscriptions","organizations_url":"https://api.github.com/users/umar456/orgs","repos_url":"https://api.github.com/users/umar456/repos","events_url":"https://api.github.com/users/umar456/events{/privacy}","received_events_url":"https://api.github.com/users/umar456/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/umar456/arrayfire","description":"ArrayFire: a general purpose GPU library.","fork":true,"url":"https://api.github.com/repos/umar456/arrayfire","forks_url":"https://api.github.com/repos/umar456/arrayfire/forks","keys_url":"https://api.github.com/repos/umar456/arrayfire/keys{/key_id}","collaborators_url":"https://api.github.com/repos/umar456/arrayfire/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/umar456/arrayfire/teams","hooks_url":"https://api.github.com/repos/umar456/arrayfire/hooks","issue_events_url":"https://api.github.com/repos/umar456/arrayfire/issues/events{/number}","events_url":"https://api.github.com/repos/umar456/arrayfire/events","assignees_url":"https://api.github.com/repos/umar456/arrayfire/assignees{/user}","branches_url":"https://api.github.com/repos/umar456/arrayfire/branches{/branch}","tags_url":"https://api.github.com/repos/umar456/arrayfire/tags","blobs_url":"https://api.github.com/repos/umar456/arrayfire/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/umar456/arrayfire/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/umar456/arrayfire/git/refs{/sha}","trees_url":"https://api.github.com/repos/umar456/arrayfire/git/trees{/sha}","statuses_url":"https://api.github.com/repos/umar456/arrayfire/statuses/{sha}","languages_url":"https://api.github.com/repos/umar456/arrayfire/languages","stargazers_url":"https://api.github.com/repos/umar456/arrayfire/stargazers","contributors_url":"https://api.github.com/repos/umar456/arrayfire/contributors","subscribers_url":"https://api.github.com/repos/umar456/arrayfire/subscribers","subscription_url":"https://api.github.com/repos/umar456/arrayfire/subscription","commits_url":"https://api.github.com/repos/umar456/arrayfire/commits{/sha}","git_commits_url":"https://api.github.com/repos/umar456/arrayfire/git/commits{/sha}","comments_url":"https://api.github.com/repos/umar456/arrayfire/comments{/number}","issue_comment_url":"https://api.github.com/repos/umar456/arrayfire/issues/comments{/number}","contents_url":"https://api.github.com/repos/umar456/arrayfire/contents/{+path}","compare_url":"https://api.github.com/repos/umar456/arrayfire/compare/{base}...{head}","merges_url":"https://api.github.com/repos/umar456/arrayfire/merges","archive_url":"https://api.github.com/repos/umar456/arrayfire/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/umar456/arrayfire/downloads","issues_url":"https://api.github.com/repos/umar456/arrayfire/issues{/number}","pulls_url":"https://api.github.com/repos/umar456/arrayfire/pulls{/number}","milestones_url":"https://api.github.com/repos/umar456/arrayfire/milestones{/number}","notifications_url":"https://api.github.com/repos/umar456/arrayfire/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/umar456/arrayfire/labels{/name}","releases_url":"https://api.github.com/repos/umar456/arrayfire/releases{/id}","deployments_url":"https://api.github.com/repos/umar456/arrayfire/deployments","created_at":"2014-12-01T14:15:25Z","updated_at":"2018-06-21T16:37:33Z","pushed_at":"2018-06-27T06:44:32Z","git_url":"git://github.com/umar456/arrayfire.git","ssh_url":"git@github.com:umar456/arrayfire.git","clone_url":"https://github.com/umar456/arrayfire.git","svn_url":"https://github.com/umar456/arrayfire","homepage":"http://arrayfire.com","size":11463,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":1,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"arrayfire:master","ref":"master","sha":"8ecbe6147347c05e2fab6983c4b8258ad940b56a","user":{"login":"arrayfire","id":5395442,"node_id":"MDEyOk9yZ2FuaXphdGlvbjUzOTU0NDI=","avatar_url":"https://avatars0.githubusercontent.com/u/5395442?v=4","gravatar_id":"","url":"https://api.github.com/users/arrayfire","html_url":"https://github.com/arrayfire","followers_url":"https://api.github.com/users/arrayfire/followers","following_url":"https://api.github.com/users/arrayfire/following{/other_user}","gists_url":"https://api.github.com/users/arrayfire/gists{/gist_id}","starred_url":"https://api.github.com/users/arrayfire/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/arrayfire/subscriptions","organizations_url":"https://api.github.com/users/arrayfire/orgs","repos_url":"https://api.github.com/users/arrayfire/repos","events_url":"https://api.github.com/users/arrayfire/events{/privacy}","received_events_url":"https://api.github.com/users/arrayfire/received_events","type":"Organization","site_admin":false},"repo":{"id":25889802,"node_id":"MDEwOlJlcG9zaXRvcnkyNTg4OTgwMg==","name":"arrayfire","full_name":"arrayfire/arrayfire","owner":{"login":"arrayfire","id":5395442,"node_id":"MDEyOk9yZ2FuaXphdGlvbjUzOTU0NDI=","avatar_url":"https://avatars0.githubusercontent.com/u/5395442?v=4","gravatar_id":"","url":"https://api.github.com/users/arrayfire","html_url":"https://github.com/arrayfire","followers_url":"https://api.github.com/users/arrayfire/followers","following_url":"https://api.github.com/users/arrayfire/following{/other_user}","gists_url":"https://api.github.com/users/arrayfire/gists{/gist_id}","starred_url":"https://api.github.com/users/arrayfire/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/arrayfire/subscriptions","organizations_url":"https://api.github.com/users/arrayfire/orgs","repos_url":"https://api.github.com/users/arrayfire/repos","events_url":"https://api.github.com/users/arrayfire/events{/privacy}","received_events_url":"https://api.github.com/users/arrayfire/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/arrayfire/arrayfire","description":"ArrayFire: a general purpose GPU library.","fork":false,"url":"https://api.github.com/repos/arrayfire/arrayfire","forks_url":"https://api.github.com/repos/arrayfire/arrayfire/forks","keys_url":"https://api.github.com/repos/arrayfire/arrayfire/keys{/key_id}","collaborators_url":"https://api.github.com/repos/arrayfire/arrayfire/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/arrayfire/arrayfire/teams","hooks_url":"https://api.github.com/repos/arrayfire/arrayfire/hooks","issue_events_url":"https://api.github.com/repos/arrayfire/arrayfire/issues/events{/number}","events_url":"https://api.github.com/repos/arrayfire/arrayfire/events","assignees_url":"https://api.github.com/repos/arrayfire/arrayfire/assignees{/user}","branches_url":"https://api.github.com/repos/arrayfire/arrayfire/branches{/branch}","tags_url":"https://api.github.com/repos/arrayfire/arrayfire/tags","blobs_url":"https://api.github.com/repos/arrayfire/arrayfire/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/arrayfire/arrayfire/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/arrayfire/arrayfire/git/refs{/sha}","trees_url":"https://api.github.com/repos/arrayfire/arrayfire/git/trees{/sha}","statuses_url":"https://api.github.com/repos/arrayfire/arrayfire/statuses/{sha}","languages_url":"https://api.github.com/repos/arrayfire/arrayfire/languages","stargazers_url":"https://api.github.com/repos/arrayfire/arrayfire/stargazers","contributors_url":"https://api.github.com/repos/arrayfire/arrayfire/contributors","subscribers_url":"https://api.github.com/repos/arrayfire/arrayfire/subscribers","subscription_url":"https://api.github.com/repos/arrayfire/arrayfire/subscription","commits_url":"https://api.github.com/repos/arrayfire/arrayfire/commits{/sha}","git_commits_url":"https://api.github.com/repos/arrayfire/arrayfire/git/commits{/sha}","comments_url":"https://api.github.com/repos/arrayfire/arrayfire/comments{/number}","issue_comment_url":"https://api.github.com/repos/arrayfire/arrayfire/issues/comments{/number}","contents_url":"https://api.github.com/repos/arrayfire/arrayfire/contents/{+path}","compare_url":"https://api.github.com/repos/arrayfire/arrayfire/compare/{base}...{head}","merges_url":"https://api.github.com/repos/arrayfire/arrayfire/merges","archive_url":"https://api.github.com/repos/arrayfire/arrayfire/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/arrayfire/arrayfire/downloads","issues_url":"https://api.github.com/repos/arrayfire/arrayfire/issues{/number}","pulls_url":"https://api.github.com/repos/arrayfire/arrayfire/pulls{/number}","milestones_url":"https://api.github.com/repos/arrayfire/arrayfire/milestones{/number}","notifications_url":"https://api.github.com/repos/arrayfire/arrayfire/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/arrayfire/arrayfire/labels{/name}","releases_url":"https://api.github.com/repos/arrayfire/arrayfire/releases{/id}","deployments_url":"https://api.github.com/repos/arrayfire/arrayfire/deployments","created_at":"2014-10-28T20:58:33Z","updated_at":"2018-06-25T19:59:18Z","pushed_at":"2018-06-27T06:44:34Z","git_url":"git://github.com/arrayfire/arrayfire.git","ssh_url":"git@github.com:arrayfire/arrayfire.git","clone_url":"https://github.com/arrayfire/arrayfire.git","svn_url":"https://github.com/arrayfire/arrayfire","homepage":"https://arrayfire.com","size":11489,"stargazers_count":2133,"watchers_count":2133,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":320,"mirror_url":null,"archived":false,"open_issues_count":197,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":320,"open_issues":197,"watchers":2133,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/arrayfire/arrayfire/pulls/2216"},"html":{"href":"https://github.com/arrayfire/arrayfire/pull/2216"},"issue":{"href":"https://api.github.com/repos/arrayfire/arrayfire/issues/2216"},"comments":{"href":"https://api.github.com/repos/arrayfire/arrayfire/issues/2216/comments"},"review_comments":{"href":"https://api.github.com/repos/arrayfire/arrayfire/pulls/2216/comments"},"review_comment":{"href":"https://api.github.com/repos/arrayfire/arrayfire/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/arrayfire/arrayfire/pulls/2216/commits"},"statuses":{"href":"https://api.github.com/repos/arrayfire/arrayfire/statuses/ccbb82d90845cb0b9b874eb1c3703a5e02c4641f"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"9prady9"}}