{"action":"created","comment":{"url":"https://api.github.com/repos/akormushin/fizteh-java-2015/pulls/comments/40172892","id":40172892,"diff_hunk":"@@ -0,0 +1,722 @@\n+package ru.fizteh.fivt.students.thefacetakt.TwitterStream;\n+\n+/**\n+ * Created by thefacetakt on 17.09.15.\n+ */\n+\n+import com.beust.jcommander.*;\n+import twitter4j.*;\n+\n+import java.io.*;\n+import java.net.MalformedURLException;\n+import java.net.URI;\n+import java.net.URISyntaxException;\n+import java.net.URL;\n+import java.text.SimpleDateFormat;\n+import java.util.*;\n+\n+class Location {\n+    private double latitude;\n+    private double longitude;\n+    private String name;\n+\n+    public double getLatitude() {\n+        return latitude;\n+    }\n+\n+    public double getLongitude() {\n+        return longitude;\n+    }\n+\n+    public String getName() {\n+        return name;\n+    }\n+\n+    public void setName(String newName) {\n+        this.name = newName;\n+    }\n+\n+\n+    Location(double newLatitude, double newLongitude) {\n+        this.latitude = newLatitude;\n+        this.longitude = newLongitude;\n+    }\n+}\n+\n+class InvalidLocationException extends Exception {\n+    InvalidLocationException() {\n+    }\n+\n+    InvalidLocationException(String message) {\n+        super(message);\n+    }\n+}\n+\n+class QueryLimitException extends Exception {\n+    QueryLimitException() {\n+    }\n+\n+    QueryLimitException(String message) {\n+        super(message);\n+    }\n+}\n+\n+class PlaceLocationResolver {\n+    static final String LOCATION_DEFINITION_ERROR\n+            = \"Problem while location definition\";\n+\n+    private static HashMap<String, Location> cache\n+            = new HashMap<String, Location>();\n+    private static String googleMapsKey;\n+    private static String yandexMapsKey;\n+\n+    static void init() {\n+        try {\n+            BufferedReader mapsKeyFile = new BufferedReader(\n+                    new FileReader(\"src/main/resources/geo.properties\")\n+            );\n+            googleMapsKey = mapsKeyFile.readLine();\n+            yandexMapsKey = mapsKeyFile.readLine();\n+            mapsKeyFile.close();\n+        } catch (IOException e) {\n+            System.err.println(\"Something went terribly wrong: no maps \"\n+                    + \"key found\");\n+            System.exit(1);\n+        }\n+    }\n+\n+\n+    static Location resolvePlaceLocationGoogle(String nameOfLocation)\n+            throws InvalidLocationException, QueryLimitException {\n+        int numberOfTries = 0;\n+\n+        do {\n+            URL googleMapsURL = null;\n+            try {\n+                try {\n+                    URI uri = new URI(\"https\",\n+                            \"maps.googleapis.com\",\n+                            \"/maps/api/geocode/json\",\n+                            \"address=\" + nameOfLocation + \"&key=\"\n+                                    + googleMapsKey,\n+                            null);\n+                    googleMapsURL = uri.toURL();\n+                } catch (URISyntaxException e) {\n+                    e.printStackTrace();\n+                }\n+            } catch (MalformedURLException e) {\n+                System.err.println(e.getMessage());\n+                ++numberOfTries;\n+                continue;\n+            }\n+\n+            try {\n+                BufferedReader in = new BufferedReader(new InputStreamReader(\n+                        googleMapsURL.openStream()));\n+\n+                String currentInfo;\n+                StringBuilder responseStrBuilder = new StringBuilder();\n+                while ((currentInfo = in.readLine()) != null) {\n+                    responseStrBuilder.append(currentInfo);\n+                }\n+\n+                JSONObject locationInfo =\n+                        new JSONObject(responseStrBuilder.toString());\n+\n+                String status = locationInfo.getString(\"status\");\n+                if (status.equals(\"OVER_QUERY_LIMIT\")) {\n+                    throw new QueryLimitException(\"Google\");\n+                }\n+                if (!status.equals(\"OK\")) {\n+                    throw new InvalidLocationException(\"Unknown place\");\n+                }\n+\n+                locationInfo = locationInfo\n+                        .getJSONArray(\"results\")\n+                        .getJSONObject(0)\n+                        .getJSONObject(\"geometry\")\n+                        .getJSONObject(\"location\");\n+\n+                return new Location(\n+                        Double.parseDouble(locationInfo.getString(\"lat\")),\n+                        Double.parseDouble(locationInfo.getString(\"lng\")));\n+            } catch (IOException | JSONException e) {\n+                System.out.println(e.getMessage());\n+                ++numberOfTries;\n+                continue;\n+            }\n+        }\n+        while (numberOfTries < TwitterStream.MAX_NUMBER_OF_TRIES);\n+        System.err.println(LOCATION_DEFINITION_ERROR);\n+        System.exit(1);\n+        return null;\n+    }\n+\n+    static Location resolvePlaceLocationYandex(String nameOfLocation)\n+            throws InvalidLocationException {\n+        int numberOfTries = 0;\n+\n+        do {\n+            URL yandexMapsURL = null;\n+            try {\n+                try {\n+                    URI uri = new URI(\"https\",\n+                            \"geocode-maps.yandex.ru\",\n+                            \"/1.x/\",\n+                            \"geocode=\" + nameOfLocation\n+                                    + \"&key=\" + yandexMapsKey\n+                                    + \"&format=json\",\n+                            null);\n+                    yandexMapsURL = uri.toURL();\n+                } catch (URISyntaxException e) {\n+                    e.printStackTrace();\n+                }\n+            } catch (MalformedURLException e) {\n+                System.err.println(e.getMessage());\n+                ++numberOfTries;\n+                continue;\n+            }\n+\n+            try {\n+                assert yandexMapsURL != null;\n+\n+                BufferedReader in = new BufferedReader(new InputStreamReader(\n+                        yandexMapsURL.openStream()));\n+\n+                String currentInfo;\n+                StringBuilder responseStrBuilder = new StringBuilder();\n+                while ((currentInfo = in.readLine()) != null) {\n+                    responseStrBuilder.append(currentInfo);\n+                }\n+\n+                JSONObject locationInfo =\n+                        new JSONObject(responseStrBuilder.toString())\n+                                .getJSONObject(\"response\")\n+                                .getJSONObject(\"GeoObjectCollection\");\n+\n+                if (Integer.parseInt(locationInfo\n+                        .getJSONObject(\"metaDataProperty\")\n+                        .getJSONObject(\"GeocoderResponseMetaData\")\n+                        .getString(\"found\")) == 0) {\n+                    throw new InvalidLocationException(\"Unknown place\");\n+                }\n+\n+                locationInfo = locationInfo\n+                        .getJSONArray(\"featureMember\")\n+                        .getJSONObject(0)\n+                        .getJSONObject(\"GeoObject\")\n+                        .getJSONObject(\"Point\");\n+                String[] coordinates =\n+                        locationInfo.getString(\"pos\").split(\" \");\n+\n+                return new Location(\n+                        Double.parseDouble(coordinates[1]),\n+                        Double.parseDouble(coordinates[0]));\n+            } catch (IOException | JSONException e) {\n+                System.out.println(e.getMessage());\n+                ++numberOfTries;\n+            }\n+        }\n+        while (numberOfTries < TwitterStream.MAX_NUMBER_OF_TRIES);\n+        System.err.println(LOCATION_DEFINITION_ERROR);\n+        System.exit(1);\n+        return null;\n+    }\n+\n+    static Location resolvePlaceLocation(String nameOfLocation)\n+            throws InvalidLocationException {\n+        nameOfLocation = nameOfLocation.trim();\n+\n+        if (nameOfLocation.length() == 0) {\n+            throw new InvalidLocationException(\"empty address\");\n+        }\n+\n+        if (!cache.containsKey(nameOfLocation)) {\n+\n+            try {\n+                Location result\n+                        = resolvePlaceLocationGoogle(nameOfLocation);\n+                cache.put(nameOfLocation, result);\n+            } catch (QueryLimitException e) {\n+                try {\n+                    Location result\n+                            = resolvePlaceLocationYandex(nameOfLocation);\n+                    cache.put(nameOfLocation, result);\n+                } catch (InvalidLocationException ie) {\n+                    cache.put(nameOfLocation, null);\n+                }\n+            } catch (InvalidLocationException e) {\n+                cache.put(nameOfLocation, null);\n+            }\n+\n+        }\n+\n+        if (cache.get(nameOfLocation) == null) {\n+            throw new InvalidLocationException(\"Unknown place\");\n+        }\n+        return cache.get(nameOfLocation);\n+    }\n+\n+    static Location resolveCurrentLocation() {\n+        int numberOfTries = 0;\n+\n+        do {\n+            URL whatIsMyCity;\n+            try {\n+                whatIsMyCity = new URL(\"http://ipinfo.io/json\");\n+            } catch (MalformedURLException e) {\n+                ++numberOfTries;\n+                continue;\n+            }\n+\n+            try {\n+                BufferedReader in = new BufferedReader(new InputStreamReader(\n+                        whatIsMyCity.openStream()));\n+\n+                String currentInfo;\n+                StringBuilder responseStrBuilder = new StringBuilder();\n+                while ((currentInfo = in.readLine()) != null) {\n+                    responseStrBuilder.append(currentInfo);\n+                }\n+\n+                JSONObject locationInfo =\n+                        new JSONObject(responseStrBuilder.toString());\n+\n+                String[] coordinates = locationInfo\n+                        .getString(\"loc\").split(\",\");\n+\n+                Location result = new Location(\n+                        Double.parseDouble(coordinates[0]),\n+                        Double.parseDouble(coordinates[1]));\n+                result.setName(locationInfo.getString(\"city\"));\n+                return result;\n+            } catch (IOException | JSONException e) {\n+                ++numberOfTries;\n+            }\n+        }\n+        while (numberOfTries < TwitterStream.MAX_NUMBER_OF_TRIES);\n+\n+        System.err.println(LOCATION_DEFINITION_ERROR);\n+        System.exit(1);\n+        return new Location(0, 0);\n+    }\n+}\n+\n+class JCommanderSetting {\n+\n+    static final String DEFAULT_LOCATION = \"nearby\";\n+\n+    @Parameter(names = {\"--query\", \"-q\"},\n+            description = \"query or keywords for stream\",\n+            variableArity = true)\n+    private List<String> queries = new ArrayList<>();\n+\n+    @Parameter(names = {\"--place\", \"-p\"}, description = \"location\")\n+    private String location = DEFAULT_LOCATION;\n+\n+    @Parameter(names = {\"--stream\", \"-s\"},\n+            description = \"is stream enabled\")\n+    private boolean stream = false;\n+\n+    @Parameter(names = {\"--hideRetweets\"}, description = \"hide retweets\")\n+    private boolean hideRetweets = false;\n+\n+    @Parameter(names = {\"--limit\", \"-l\"}, description = \"limit of tweets\")\n+    private Integer limit = Integer.MAX_VALUE;\n+\n+    @Parameter(names = {\"--help\", \"-h\"},\n+            description = \"show help\", help = true)\n+    private boolean help;\n+\n+    public List<String> getQueries() {\n+        return queries;\n+    }\n+    public String getLocation() {\n+        return location;\n+    }\n+\n+    public boolean isStream() {\n+        return stream;\n+    }\n+\n+    public boolean isHideRetweets() {\n+        return hideRetweets;\n+    }\n+\n+    public Integer getLimit() {\n+        return limit;\n+    }\n+\n+    public boolean isHelp() {\n+        return help;\n+    }\n+}\n+\n+class Declenser {\n+    static final int FIRST_IMPORTANT_MOD = 100;\n+    static final int SECOND_IMPORTANT_MOD = 10;\n+\n+    static final int FIRST_CASE_LEFT_BORDER = 11;\n+    static final int FIRST_CASE_RIGHT_BORDER = 19;\n+\n+    static final int SECOND_CASE = 1;\n+\n+    static final int THIRD_CASE_LEFT_BORDER = 2;\n+    static final int THIRD_CASE_RIGHT_BORDER = 4;\n+\n+    static String declensionScheme(long n, String[] cases) {\n+        n = n % FIRST_IMPORTANT_MOD;\n+        if (FIRST_CASE_LEFT_BORDER <= n\n+                && n <= FIRST_CASE_RIGHT_BORDER) {\n+            return cases[0];\n+        }\n+\n+        n = n % SECOND_IMPORTANT_MOD;\n+        if (n == SECOND_CASE) {\n+            return cases[1];\n+        }\n+        if (THIRD_CASE_LEFT_BORDER <= n\n+                && n <= THIRD_CASE_RIGHT_BORDER) {\n+            return cases[2];\n+        }\n+        return cases[0];\n+    }\n+\n+    static String retweetDeclension(long n) {\n+        String[] cases = {\"ретвитов\", \"ретвит\", \"ретвита\"};\n+        return declensionScheme(n, cases);\n+    }\n+\n+    static String minutesDeclension(long n) {\n+        String[] cases = {\"минут\", \"минуту\", \"минуты\"};\n+        return declensionScheme(n, cases);\n+    }\n+\n+    static String hoursDeclension(long n) {\n+        String[] cases = {\"часов\", \"час\", \"часа\"};\n+        return declensionScheme(n, cases);\n+    }\n+\n+    static String daysDeclension(long n) {\n+        String[] cases = {\"дней\", \"день\", \"дня\"};\n+        return declensionScheme(n, cases);\n+    }\n+}\n+\n+\n+public class TwitterStream {\n+\n+    static final int MINUSES_COUNT = 140;\n+    static final int MAX_NUMBER_OF_TRIES = 2;\n+    static final double RADIUS = 10;\n+    static final String RADIUS_UNIT = \"km\";\n+\n+\n+\n+    static void printSeparator() {\n+        for (int i = 0; i < MINUSES_COUNT; ++i) {\n+            System.out.print(\"-\");\n+        }\n+        System.out.println();\n+    }\n+\n+    static Location resolveLocation(String passedLocation) {\n+        Location result = null;\n+        if (passedLocation == JCommanderSetting.DEFAULT_LOCATION) {\n+            result = PlaceLocationResolver.resolveCurrentLocation();\n+        } else {\n+            try {\n+                result = PlaceLocationResolver\n+                        .resolvePlaceLocation(passedLocation);\n+                result.setName(passedLocation);\n+            } catch (InvalidLocationException e) {\n+                System.err.println(e.getMessage());\n+                System.exit(1);\n+            }\n+        }\n+        return result;\n+    }\n+\n+    static class TimeFormatter {\n+        static final int MILLISECONDS_IN_SECOND = 1000;\n+        static final int MILLISECONDS_IN_MINUTE = 60 * MILLISECONDS_IN_SECOND;\n+        static final int MILLISECONDS_IN_HOUR = 60 * MILLISECONDS_IN_MINUTE;\n+        static final int MILLISECONDS_IN_DAY = 24 * MILLISECONDS_IN_HOUR;\n+\n+        static String formatTime(long currentTime, long timeToFormat) {\n+            if (currentTime - timeToFormat < 2 * MILLISECONDS_IN_MINUTE) {\n+                return \"Только что\";\n+            }\n+            if (currentTime - timeToFormat < MILLISECONDS_IN_HOUR) {\n+                long n = ((currentTime - timeToFormat)\n+                        / MILLISECONDS_IN_MINUTE);\n+                return String.valueOf(n)\n+                        + \" \" + Declenser.minutesDeclension(n) + \" назад\";\n+            }\n+\n+            SimpleDateFormat formatter = new SimpleDateFormat(\"dd/MM/yyy\");\n+\n+            if (formatter.format(currentTime).equals(\n+                    formatter.format(timeToFormat))) {\n+                long n = (currentTime - timeToFormat) / MILLISECONDS_IN_HOUR;\n+                return String.valueOf(n) + \" \" + Declenser.hoursDeclension(n)\n+                        + \" назад\";\n+            }\n+\n+            Calendar currentCalendar = Calendar.getInstance();\n+            currentCalendar.setTimeInMillis(currentTime);\n+            Calendar givenCalendar = Calendar.getInstance();\n+            givenCalendar.setTimeInMillis(timeToFormat);\n+\n+            currentCalendar.add(Calendar.DAY_OF_MONTH, -1);\n+            if (formatter.format(currentCalendar.getTimeInMillis()).equals(\n+                    formatter.format(givenCalendar.getTimeInMillis()))) {\n+                return \"вчера\";\n+            }\n+            long n = (currentTime - timeToFormat) / MILLISECONDS_IN_DAY;\n+            return String.valueOf(n) + \" \" + Declenser.daysDeclension(n)\n+                    + \" назад\";\n+        }\n+    }\n+\n+    static final String ANSI_RESET = \"\\u001B[0m\";\n+    static final String ANSI_BLUE = \"\\u001B[34m\";\n+    static void printNick(String nick) {\n+\n+        System.out.print(\"@\" + ANSI_BLUE + nick + \": \" + ANSI_RESET);\n+    }\n+\n+    static final int RT_SPACE_AT_LENGTH = 4;\n+    static void printTweet(Status status) {\n+        printNick(status.getUser().getScreenName());\n+        if (!status.isRetweet()) {\n+            System.out.print(status.getText());\n+\n+            if (status.getRetweetCount() != 0) {\n+                System.out.print(\" (\"\n+                        + status.getRetweetCount() + \" \"\n+                        + Declenser.retweetDeclension(status.getRetweetCount())\n+                        + \")\"\n+                );\n+            }\n+        } else {\n+            System.out.print(\"ретвитнул \");\n+            String[] splittedText = status.getText().split(\":\");\n+            //RT @nick:\n+\n+            String originalNick = splittedText[0].substring(RT_SPACE_AT_LENGTH);\n+            printNick(originalNick);\n+            ArrayList<String> originalText = new ArrayList<String>(\n+                    Arrays.asList(splittedText)\n+                    .subList(1, splittedText.length -  1)\n+            );\n+\n+            System.out.print(String.join(\":\", originalText));\n+        }\n+        System.out.println();\n+    }\n+\n+    static void printTweetsOnce(JCommanderSetting jCommanderSettings,\n+                              Location currentLocation, String queryString) {\n+\n+        int numberOfTries = 0;\n+\n+        do {\n+            try {\n+                Twitter twitter = TwitterFactory.getSingleton();\n+\n+                Query query = new Query(queryString).geoCode(\n+                        new GeoLocation(\n+                                currentLocation.getLatitude(),\n+                                currentLocation.getLongitude()), RADIUS,\n+                        RADIUS_UNIT);\n+\n+                query.setCount(jCommanderSettings.getLimit());\n+\n+                QueryResult result = twitter.search(query);\n+\n+\n+                long currentTime = System.currentTimeMillis();\n+\n+                List<Status> tweets = result.getTweets();\n+                Collections.reverse(tweets);\n+\n+                if (tweets.size() == 0) {\n+                    System.out.println(\"Не найдено ни одного твита\");\n+                    printSeparator();\n+                }\n+\n+                for (Status status : tweets) {\n+                    if (!status.isRetweet()\n+                            || !jCommanderSettings.isHideRetweets()) {\n+\n+                        System.out.print(\"[\"\n+                                + TimeFormatter.formatTime(currentTime,\n+                                status.getCreatedAt().getTime()) + \"] \");\n+\n+                        printTweet(status);\n+\n+                        printSeparator();\n+                    }\n+                }\n+                numberOfTries = MAX_NUMBER_OF_TRIES;\n+            } catch (TwitterException te) {\n+                ++numberOfTries;\n+                if (numberOfTries == MAX_NUMBER_OF_TRIES) {\n+                    System.out.println(te.getMessage());\n+                    System.err.println(\"Something went terribly wrong, \"\n+                            + \"probably - connection + error\");\n+                    System.exit(1);","path":"thefacetakt/src/main/java/ru/fizteh/fivt/students/thefacetakt/TwitterStream/TwitterStream.java","position":566,"original_position":569,"commit_id":"e8f970f50fa660d92b313920fd267dcd1d95e89a","original_commit_id":"313898b883c97dea5b1eefa27380aa8e92988644","user":{"login":"akormushin","id":1074038,"avatar_url":"https://avatars.githubusercontent.com/u/1074038?v=3","gravatar_id":"","url":"https://api.github.com/users/akormushin","html_url":"https://github.com/akormushin","followers_url":"https://api.github.com/users/akormushin/followers","following_url":"https://api.github.com/users/akormushin/following{/other_user}","gists_url":"https://api.github.com/users/akormushin/gists{/gist_id}","starred_url":"https://api.github.com/users/akormushin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/akormushin/subscriptions","organizations_url":"https://api.github.com/users/akormushin/orgs","repos_url":"https://api.github.com/users/akormushin/repos","events_url":"https://api.github.com/users/akormushin/events{/privacy}","received_events_url":"https://api.github.com/users/akormushin/received_events","type":"User","site_admin":false},"body":"Это скользкая дорожка. При exit не отрабатывают блоки finally. Его крайне не рекомендуется использовать повсеместно. Лучше во всех методах выкидывать исключения, например, throw new MyException(). А в main() их ловить и там уже вызывать System.exit(1);","created_at":"2015-09-23T05:58:37Z","updated_at":"2015-09-23T05:58:37Z","html_url":"https://github.com/akormushin/fizteh-java-2015/pull/44#discussion_r40172892","pull_request_url":"https://api.github.com/repos/akormushin/fizteh-java-2015/pulls/44","_links":{"self":{"href":"https://api.github.com/repos/akormushin/fizteh-java-2015/pulls/comments/40172892"},"html":{"href":"https://github.com/akormushin/fizteh-java-2015/pull/44#discussion_r40172892"},"pull_request":{"href":"https://api.github.com/repos/akormushin/fizteh-java-2015/pulls/44"}}},"pull_request":{"url":"https://api.github.com/repos/akormushin/fizteh-java-2015/pulls/44","id":45556438,"html_url":"https://github.com/akormushin/fizteh-java-2015/pull/44","diff_url":"https://github.com/akormushin/fizteh-java-2015/pull/44.diff","patch_url":"https://github.com/akormushin/fizteh-java-2015/pull/44.patch","issue_url":"https://api.github.com/repos/akormushin/fizteh-java-2015/issues/44","number":44,"state":"open","locked":false,"title":"Степан Каргальцев, 494, TwitterStream","user":{"login":"thefacetakt","id":6473746,"avatar_url":"https://avatars.githubusercontent.com/u/6473746?v=3","gravatar_id":"","url":"https://api.github.com/users/thefacetakt","html_url":"https://github.com/thefacetakt","followers_url":"https://api.github.com/users/thefacetakt/followers","following_url":"https://api.github.com/users/thefacetakt/following{/other_user}","gists_url":"https://api.github.com/users/thefacetakt/gists{/gist_id}","starred_url":"https://api.github.com/users/thefacetakt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thefacetakt/subscriptions","organizations_url":"https://api.github.com/users/thefacetakt/orgs","repos_url":"https://api.github.com/users/thefacetakt/repos","events_url":"https://api.github.com/users/thefacetakt/events{/privacy}","received_events_url":"https://api.github.com/users/thefacetakt/received_events","type":"User","site_admin":false},"body":"Кажется, реализовано все кроме ESC-фичи ~~(и ctrl-D)~~\r\n\r\nЧтобы работало, надо в ~~src~~ resources положить twitter4j.properties, а так же файлик geo.properties, где в первой строчке указан google maps api key, во второй - yandex maps api key\r\n \r\n","created_at":"2015-09-21T14:40:06Z","updated_at":"2015-09-23T05:58:37Z","closed_at":null,"merged_at":null,"merge_commit_sha":"77dbfb8307f3edd07eeb5da1061db9537c4ccd68","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/akormushin/fizteh-java-2015/pulls/44/commits","review_comments_url":"https://api.github.com/repos/akormushin/fizteh-java-2015/pulls/44/comments","review_comment_url":"https://api.github.com/repos/akormushin/fizteh-java-2015/pulls/comments{/number}","comments_url":"https://api.github.com/repos/akormushin/fizteh-java-2015/issues/44/comments","statuses_url":"https://api.github.com/repos/akormushin/fizteh-java-2015/statuses/e8f970f50fa660d92b313920fd267dcd1d95e89a","head":{"label":"thefacetakt:master","ref":"master","sha":"e8f970f50fa660d92b313920fd267dcd1d95e89a","user":{"login":"thefacetakt","id":6473746,"avatar_url":"https://avatars.githubusercontent.com/u/6473746?v=3","gravatar_id":"","url":"https://api.github.com/users/thefacetakt","html_url":"https://github.com/thefacetakt","followers_url":"https://api.github.com/users/thefacetakt/followers","following_url":"https://api.github.com/users/thefacetakt/following{/other_user}","gists_url":"https://api.github.com/users/thefacetakt/gists{/gist_id}","starred_url":"https://api.github.com/users/thefacetakt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thefacetakt/subscriptions","organizations_url":"https://api.github.com/users/thefacetakt/orgs","repos_url":"https://api.github.com/users/thefacetakt/repos","events_url":"https://api.github.com/users/thefacetakt/events{/privacy}","received_events_url":"https://api.github.com/users/thefacetakt/received_events","type":"User","site_admin":false},"repo":{"id":42360547,"name":"fizteh-java-2015","full_name":"thefacetakt/fizteh-java-2015","owner":{"login":"thefacetakt","id":6473746,"avatar_url":"https://avatars.githubusercontent.com/u/6473746?v=3","gravatar_id":"","url":"https://api.github.com/users/thefacetakt","html_url":"https://github.com/thefacetakt","followers_url":"https://api.github.com/users/thefacetakt/followers","following_url":"https://api.github.com/users/thefacetakt/following{/other_user}","gists_url":"https://api.github.com/users/thefacetakt/gists{/gist_id}","starred_url":"https://api.github.com/users/thefacetakt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thefacetakt/subscriptions","organizations_url":"https://api.github.com/users/thefacetakt/orgs","repos_url":"https://api.github.com/users/thefacetakt/repos","events_url":"https://api.github.com/users/thefacetakt/events{/privacy}","received_events_url":"https://api.github.com/users/thefacetakt/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/thefacetakt/fizteh-java-2015","description":"","fork":true,"url":"https://api.github.com/repos/thefacetakt/fizteh-java-2015","forks_url":"https://api.github.com/repos/thefacetakt/fizteh-java-2015/forks","keys_url":"https://api.github.com/repos/thefacetakt/fizteh-java-2015/keys{/key_id}","collaborators_url":"https://api.github.com/repos/thefacetakt/fizteh-java-2015/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/thefacetakt/fizteh-java-2015/teams","hooks_url":"https://api.github.com/repos/thefacetakt/fizteh-java-2015/hooks","issue_events_url":"https://api.github.com/repos/thefacetakt/fizteh-java-2015/issues/events{/number}","events_url":"https://api.github.com/repos/thefacetakt/fizteh-java-2015/events","assignees_url":"https://api.github.com/repos/thefacetakt/fizteh-java-2015/assignees{/user}","branches_url":"https://api.github.com/repos/thefacetakt/fizteh-java-2015/branches{/branch}","tags_url":"https://api.github.com/repos/thefacetakt/fizteh-java-2015/tags","blobs_url":"https://api.github.com/repos/thefacetakt/fizteh-java-2015/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/thefacetakt/fizteh-java-2015/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/thefacetakt/fizteh-java-2015/git/refs{/sha}","trees_url":"https://api.github.com/repos/thefacetakt/fizteh-java-2015/git/trees{/sha}","statuses_url":"https://api.github.com/repos/thefacetakt/fizteh-java-2015/statuses/{sha}","languages_url":"https://api.github.com/repos/thefacetakt/fizteh-java-2015/languages","stargazers_url":"https://api.github.com/repos/thefacetakt/fizteh-java-2015/stargazers","contributors_url":"https://api.github.com/repos/thefacetakt/fizteh-java-2015/contributors","subscribers_url":"https://api.github.com/repos/thefacetakt/fizteh-java-2015/subscribers","subscription_url":"https://api.github.com/repos/thefacetakt/fizteh-java-2015/subscription","commits_url":"https://api.github.com/repos/thefacetakt/fizteh-java-2015/commits{/sha}","git_commits_url":"https://api.github.com/repos/thefacetakt/fizteh-java-2015/git/commits{/sha}","comments_url":"https://api.github.com/repos/thefacetakt/fizteh-java-2015/comments{/number}","issue_comment_url":"https://api.github.com/repos/thefacetakt/fizteh-java-2015/issues/comments{/number}","contents_url":"https://api.github.com/repos/thefacetakt/fizteh-java-2015/contents/{+path}","compare_url":"https://api.github.com/repos/thefacetakt/fizteh-java-2015/compare/{base}...{head}","merges_url":"https://api.github.com/repos/thefacetakt/fizteh-java-2015/merges","archive_url":"https://api.github.com/repos/thefacetakt/fizteh-java-2015/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/thefacetakt/fizteh-java-2015/downloads","issues_url":"https://api.github.com/repos/thefacetakt/fizteh-java-2015/issues{/number}","pulls_url":"https://api.github.com/repos/thefacetakt/fizteh-java-2015/pulls{/number}","milestones_url":"https://api.github.com/repos/thefacetakt/fizteh-java-2015/milestones{/number}","notifications_url":"https://api.github.com/repos/thefacetakt/fizteh-java-2015/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/thefacetakt/fizteh-java-2015/labels{/name}","releases_url":"https://api.github.com/repos/thefacetakt/fizteh-java-2015/releases{/id}","created_at":"2015-09-12T14:49:56Z","updated_at":"2015-09-14T18:33:17Z","pushed_at":"2015-09-23T05:53:26Z","git_url":"git://github.com/thefacetakt/fizteh-java-2015.git","ssh_url":"git@github.com:thefacetakt/fizteh-java-2015.git","clone_url":"https://github.com/thefacetakt/fizteh-java-2015.git","svn_url":"https://github.com/thefacetakt/fizteh-java-2015","homepage":null,"size":228,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"akormushin:master","ref":"master","sha":"178ca99f02705e1798abda31d0ca5171c12043b8","user":{"login":"akormushin","id":1074038,"avatar_url":"https://avatars.githubusercontent.com/u/1074038?v=3","gravatar_id":"","url":"https://api.github.com/users/akormushin","html_url":"https://github.com/akormushin","followers_url":"https://api.github.com/users/akormushin/followers","following_url":"https://api.github.com/users/akormushin/following{/other_user}","gists_url":"https://api.github.com/users/akormushin/gists{/gist_id}","starred_url":"https://api.github.com/users/akormushin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/akormushin/subscriptions","organizations_url":"https://api.github.com/users/akormushin/orgs","repos_url":"https://api.github.com/users/akormushin/repos","events_url":"https://api.github.com/users/akormushin/events{/privacy}","received_events_url":"https://api.github.com/users/akormushin/received_events","type":"User","site_admin":false},"repo":{"id":42108549,"name":"fizteh-java-2015","full_name":"akormushin/fizteh-java-2015","owner":{"login":"akormushin","id":1074038,"avatar_url":"https://avatars.githubusercontent.com/u/1074038?v=3","gravatar_id":"","url":"https://api.github.com/users/akormushin","html_url":"https://github.com/akormushin","followers_url":"https://api.github.com/users/akormushin/followers","following_url":"https://api.github.com/users/akormushin/following{/other_user}","gists_url":"https://api.github.com/users/akormushin/gists{/gist_id}","starred_url":"https://api.github.com/users/akormushin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/akormushin/subscriptions","organizations_url":"https://api.github.com/users/akormushin/orgs","repos_url":"https://api.github.com/users/akormushin/repos","events_url":"https://api.github.com/users/akormushin/events{/privacy}","received_events_url":"https://api.github.com/users/akormushin/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/akormushin/fizteh-java-2015","description":"","fork":false,"url":"https://api.github.com/repos/akormushin/fizteh-java-2015","forks_url":"https://api.github.com/repos/akormushin/fizteh-java-2015/forks","keys_url":"https://api.github.com/repos/akormushin/fizteh-java-2015/keys{/key_id}","collaborators_url":"https://api.github.com/repos/akormushin/fizteh-java-2015/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/akormushin/fizteh-java-2015/teams","hooks_url":"https://api.github.com/repos/akormushin/fizteh-java-2015/hooks","issue_events_url":"https://api.github.com/repos/akormushin/fizteh-java-2015/issues/events{/number}","events_url":"https://api.github.com/repos/akormushin/fizteh-java-2015/events","assignees_url":"https://api.github.com/repos/akormushin/fizteh-java-2015/assignees{/user}","branches_url":"https://api.github.com/repos/akormushin/fizteh-java-2015/branches{/branch}","tags_url":"https://api.github.com/repos/akormushin/fizteh-java-2015/tags","blobs_url":"https://api.github.com/repos/akormushin/fizteh-java-2015/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/akormushin/fizteh-java-2015/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/akormushin/fizteh-java-2015/git/refs{/sha}","trees_url":"https://api.github.com/repos/akormushin/fizteh-java-2015/git/trees{/sha}","statuses_url":"https://api.github.com/repos/akormushin/fizteh-java-2015/statuses/{sha}","languages_url":"https://api.github.com/repos/akormushin/fizteh-java-2015/languages","stargazers_url":"https://api.github.com/repos/akormushin/fizteh-java-2015/stargazers","contributors_url":"https://api.github.com/repos/akormushin/fizteh-java-2015/contributors","subscribers_url":"https://api.github.com/repos/akormushin/fizteh-java-2015/subscribers","subscription_url":"https://api.github.com/repos/akormushin/fizteh-java-2015/subscription","commits_url":"https://api.github.com/repos/akormushin/fizteh-java-2015/commits{/sha}","git_commits_url":"https://api.github.com/repos/akormushin/fizteh-java-2015/git/commits{/sha}","comments_url":"https://api.github.com/repos/akormushin/fizteh-java-2015/comments{/number}","issue_comment_url":"https://api.github.com/repos/akormushin/fizteh-java-2015/issues/comments{/number}","contents_url":"https://api.github.com/repos/akormushin/fizteh-java-2015/contents/{+path}","compare_url":"https://api.github.com/repos/akormushin/fizteh-java-2015/compare/{base}...{head}","merges_url":"https://api.github.com/repos/akormushin/fizteh-java-2015/merges","archive_url":"https://api.github.com/repos/akormushin/fizteh-java-2015/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/akormushin/fizteh-java-2015/downloads","issues_url":"https://api.github.com/repos/akormushin/fizteh-java-2015/issues{/number}","pulls_url":"https://api.github.com/repos/akormushin/fizteh-java-2015/pulls{/number}","milestones_url":"https://api.github.com/repos/akormushin/fizteh-java-2015/milestones{/number}","notifications_url":"https://api.github.com/repos/akormushin/fizteh-java-2015/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/akormushin/fizteh-java-2015/labels{/name}","releases_url":"https://api.github.com/repos/akormushin/fizteh-java-2015/releases{/id}","created_at":"2015-09-08T11:37:54Z","updated_at":"2015-09-14T13:54:17Z","pushed_at":"2015-09-23T05:53:26Z","git_url":"git://github.com/akormushin/fizteh-java-2015.git","ssh_url":"git@github.com:akormushin/fizteh-java-2015.git","clone_url":"https://github.com/akormushin/fizteh-java-2015.git","svn_url":"https://github.com/akormushin/fizteh-java-2015","homepage":null,"size":1486,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":37,"mirror_url":null,"open_issues_count":15,"forks":37,"open_issues":15,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/akormushin/fizteh-java-2015/pulls/44"},"html":{"href":"https://github.com/akormushin/fizteh-java-2015/pull/44"},"issue":{"href":"https://api.github.com/repos/akormushin/fizteh-java-2015/issues/44"},"comments":{"href":"https://api.github.com/repos/akormushin/fizteh-java-2015/issues/44/comments"},"review_comments":{"href":"https://api.github.com/repos/akormushin/fizteh-java-2015/pulls/44/comments"},"review_comment":{"href":"https://api.github.com/repos/akormushin/fizteh-java-2015/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/akormushin/fizteh-java-2015/pulls/44/commits"},"statuses":{"href":"https://api.github.com/repos/akormushin/fizteh-java-2015/statuses/e8f970f50fa660d92b313920fd267dcd1d95e89a"}}}}