{"action":"created","comment":{"url":"https://api.github.com/repos/scala-js/scala-js/pulls/comments/28065241","id":28065241,"diff_hunk":"@@ -0,0 +1,978 @@\n+/*\n+ *  Ported by Alistair Johnson from  https://github.com/gwtproject/gwt/blob/master/user/super/com/google/gwt/emul/java/math/Division.java\n+ *  Original license copied below:\n+ */\n+\n+/*\n+ * Copyright 2009 Google Inc.\n+ *\n+ * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n+ * use this file except in compliance with the License. You may obtain a copy of\n+ * the License at\n+ *\n+ * http://www.apache.org/licenses/LICENSE-2.0\n+ *\n+ * Unless required by applicable law or agreed to in writing, software\n+ * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n+ * License for the specific language governing permissions and limitations under\n+ * the License.\n+ */\n+\n+/*\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\n+ * contributor license agreements. See the NOTICE file distributed with this\n+ * work for additional information regarding copyright ownership. The ASF\n+ * licenses this file to You under the Apache License, Version 2.0 (the\n+ * \"License\"); you may not use this file except in compliance with the License.\n+ * You may obtain a copy of the License at\n+ *\n+ * http://www.apache.org/licenses/LICENSE-2.0\n+ *\n+ * Unless required by applicable law or agreed to in writing, software\n+ * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n+ * License for the specific language governing permissions and limitations under\n+ * the License.\n+ *\n+ * INCLUDES MODIFICATIONS BY RICHARD ZSCHECH AS WELL AS GOOGLE.\n+ */\n+\n+package java.math\n+\n+import scala.annotation.tailrec\n+\n+/**\n+ * Object that provides all operations related with division and modular\n+ * arithmetic to {@link BigInteger}. Some methods are provided in both mutable\n+ * and immutable way. There are several variants provided listed below:\n+ *\n+ * <ul type=\"circle\"> <li><b>Division</b> <ul type=\"circle\"> <li>\n+ * {@link BigInteger} division and remainder by {@link BigInteger}.</li> <li>\n+ * {@link BigInteger} division and remainder by {@code int}.</li> <li><i>gcd</i>\n+ * between {@link BigInteger} numbers.</li> </ul> </li> <li><b>Modular\n+ * arithmetic </b> <ul type=\"circle\"> <li>Modular exponentiation between\n+ * {@link BigInteger} numbers.</li> <li>Modular inverse of a {@link BigInteger}\n+ * numbers.</li> </ul> </li> </ul>\n+ */\n+object Division {\n+\n+  private val UINT_MAX = 0xffffffffL\n+  \n+  /**\n+   * Divides the array 'a' by the array 'b' and gets the quotient and the\n+   * remainder. Implements the Knuth's division algorithm. See D. Knuth, The Art\n+   * of Computer Programming, vol. 2. Steps D1-D8 correspond the steps in the\n+   * algorithm description.\n+   *\n+   * @param quot the quotient\n+   * @param quotLength the quotient's length\n+   * @param a the dividend\n+   * @param aLength the dividend's length\n+   * @param b the divisor\n+   * @param bLength the divisor's length\n+   * @return the remainder\n+   */\n+  def divide(quot: Array[Int], quotLength: Int, a: Array[Int], aLength: Int,\n+        b: Array[Int],  bLength: Int): Array[Int] = {\n+    val normA = new Array[Int](aLength + 1) // the normalized dividend an extra byte is needed for correct shift\n+    val normB = new Array[Int](bLength + 1) // the normalized divisor\n+    val normBLength = bLength\n+    /*\n+     * Step D1: normalize a and b and put the results to a1 and b1 the\n+     * normalized divisor's first digit must be >= 2^31\n+     */\n+    val divisorShift = java.lang.Integer.numberOfLeadingZeros(b(bLength - 1))\n+    if (divisorShift != 0) {\n+      BitLevel.shiftLeft(normB, b, 0, divisorShift)\n+      BitLevel.shiftLeft(normA, a, 0, divisorShift)\n+    } else {\n+      System.arraycopy(a, 0, normA, 0, aLength)\n+      System.arraycopy(b, 0, normB, 0, bLength)\n+    }\n+    val firstDivisorDigit = normB(normBLength - 1)\n+    // Step D2: set the quotient index\n+    var i = quotLength - 1\n+    var j = aLength\n+\n+    while (i >= 0) {\n+      // Step D3: calculate a guess digit guessDigit\n+      var guessDigit = 0\n+      if (normA(j) == firstDivisorDigit) {\n+        // set guessDigit to the largest unsigned int value\n+        guessDigit = -1\n+      } else {\n+        val product: Long =\n+          ((normA(j) & UINT_MAX) << 32) + (normA(j - 1) & UINT_MAX)\n+        val res: Long = Division.divideLongByInt(product, firstDivisorDigit)\n+        guessDigit = res.toInt // the quotient of divideLongByInt\n+        var rem = (res >> 32).toInt // the remainder of divideLongByInt\n+        // decrease guessDigit by 1 while leftHand > rightHand\n+        if (guessDigit != 0) {\n+          //var leftHand: Long = 0\n+          //var rightHand: Long = 0\n+         // var rOverflowed = false\n+          guessDigit += 1 // to have the proper value in the loop below\n+\n+          @inline\n+          @tailrec\n+          def loop(): Unit = {\n+            guessDigit -= 1\n+            // leftHand always fits in an unsigned long\n+            val leftHand: Long =\n+              (guessDigit & UINT_MAX) * (normB(normBLength - 2) & UINT_MAX)\n+\n+            // rightHand can overflow. In this case the loop condition will be\n+            // true in the next step of the loop\n+            val rightHand: Long = (rem.toLong << 32) + (normA(j - 2) & UINT_MAX)\n+            val longR: Long = (rem & UINT_MAX) + (firstDivisorDigit & UINT_MAX)\n+            // checks that longR does not fit in an unsigned int.\n+            // this ensures that rightHand will overflow unsigned long in the next step\n+            if (!(Integer.numberOfLeadingZeros((longR >>> 32).toInt) < 32)) {\n+              rem = longR.toInt\n+\n+              if ((leftHand ^ Long.MinValue) > (rightHand ^ Long.MinValue))\n+                loop\n+            }\n+          }\n+          loop()\n+        }\n+      }\n+\n+      // Step D4: multiply normB by guessDigit and subtract the production\n+      // from normA.\n+      if (guessDigit != 0) {\n+        val borrow = Division.multiplyAndSubtract(normA, j - normBLength, normB, normBLength, guessDigit)\n+        // Step D5: check the borrow\n+        if (borrow != 0) {\n+          // Step D6: compensating addition\n+          guessDigit -= 1\n+          var carry: Long = 0\n+          for (k <- 0 until normBLength) {\n+            carry += (normA(j - normBLength + k) & UINT_MAX) + (normB(k) & UINT_MAX)\n+            normA(j - normBLength + k) = carry.toInt\n+            carry >>>= 32\n+          }\n+        }\n+      }\n+      if (quot != null) {\n+        quot(i) = guessDigit\n+      }\n+      // Step D7\n+      j -= 1\n+      i -= 1\n+    }\n+    /*\n+     * Step D8: we got the remainder in normA. Denormalize it id needed\n+     */\n+    if (divisorShift != 0) {\n+      // reuse normB\n+      BitLevel.shiftRight(normB, normBLength, normA, 0, divisorShift)\n+      return normB\n+    }\n+    System.arraycopy(normA, 0, normB, 0, bLength)\n+    normA\n+  }\n+\n+  /**\n+   * Computes the quotient and the remainder after a division by an {@code int}\n+   * number.\n+   *\n+   * @return an array of the form {@code [quotient, remainder]}.\n+   */\n+  def divideAndRemainderByInteger(bi: BigInteger, divisor: Int,\n+        divisorSign: Int): Array[BigInteger] = {\n+    val valDigits = bi.digits\n+    val valLen = bi.numberLength\n+    val valSign = bi.sign\n+    if (valLen == 1) {\n+      val a: Long = valDigits(0) & UINT_MAX\n+      val b: Long = divisor & UINT_MAX\n+      var quo: Long = a / b\n+      var rem: Long = a % b\n+      if (valSign != divisorSign)\n+        quo = -quo\n+      if (valSign < 0)\n+        rem = -rem\n+\n+      Array(BigInteger.valueOf(quo), BigInteger.valueOf(rem))\n+    } else {\n+      val quotientLength = valLen\n+      val quotientSign = if (valSign == divisorSign) 1 else -1\n+      val quotientDigits = new Array[Int](quotientLength)\n+      var remainderDigits: Array[Int] = Array()\n+      val div = divideArrayByInt(quotientDigits, valDigits, valLen, divisor)\n+      remainderDigits = Array(div)\n+      val result0 = new BigInteger(quotientSign, quotientLength, quotientDigits)\n+      val result1 = new BigInteger(valSign, 1, remainderDigits)\n+      result0.cutOffLeadingZeroes()\n+      result1.cutOffLeadingZeroes()\n+      Array(result0, result1)\n+    }\n+  }\n+\n+  /**\n+   * Divides an array by an integer value. Implements the Knuth's division\n+   * algorithm. See D. Knuth, The Art of Computer Programming, vol. 2.\n+   *\n+   * @param dest the quotient\n+   * @param src the dividend\n+   * @param srcLength the length of the dividend\n+   * @param divisor the divisor\n+   * @return remainder\n+   */\n+  def divideArrayByInt(dest: Array[Int], src: Array[Int], srcLength: Int,\n+        divisor: Int): Int = {\n+    var rem:Long = 0\n+    val bLong:Long = divisor & UINT_MAX\n+    var i = srcLength - 1\n+    while (i >= 0) {\n+      val temp: Long = (rem << 32) | (src(i) & UINT_MAX)\n+      var quot: Long = 0l\n+      if (temp >= 0) {\n+        quot = temp / bLong\n+        rem = temp % bLong\n+      } else {\n+        /*\n+         * make the dividend positive shifting it right by 1 bit then get the\n+         * quotient an remainder and correct them properly\n+         */\n+        val aPos: Long = temp >>> 1\n+        val bPos: Long = divisor >>> 1\n+        quot = aPos / bPos\n+        rem = aPos % bPos\n+        // double the remainder and add 1 if a is odd\n+        rem = (rem << 1) + (temp & 1)\n+        if ((divisor & 1) != 0) {\n+          // the divisor is odd\n+          if (quot <= rem) {\n+            rem -= quot\n+          } else {\n+            if (quot - rem <= bLong) {\n+              rem += bLong - quot\n+              quot -= 1\n+            } else {\n+              rem += (bLong << 1) - quot\n+              quot -= 2\n+            }\n+          }\n+        }\n+      }\n+      dest(i) = (quot & UINT_MAX).toInt\n+      i -= 1\n+    }\n+    rem.toInt\n+  }\n+\n+  /**\n+   * Divides an unsigned long a by an unsigned int b. It is supposed that the\n+   * most significant bit of b is set to 1, i.e. b < 0\n+   *\n+   * @param a the dividend\n+   * @param b the divisor\n+   * @return the long value containing the unsigned integer remainder in the\n+   *         left half and the unsigned integer quotient in the right half\n+   */\n+  def divideLongByInt(a: Long, b: Int): Long = {\n+    var quot: Long = 0l\n+    var rem: Long = 0l\n+    val bLong: Long = b & UINT_MAX\n+    if (a >= 0) {\n+      quot = a / bLong\n+      rem = a % bLong\n+    } else {\n+      /*\n+       * Make the dividend positive shifting it right by 1 bit then get the\n+       * quotient an remainder and correct them properly\n+       */\n+      val aPos:Long = a >>> 1\n+      val bPos:Long = b >>> 1\n+      quot = aPos / bPos\n+      rem = aPos % bPos\n+      // double the remainder and add 1 if a is odd\n+      rem = (rem << 1) + (a & 1)\n+      if ((b & 1) != 0) {  // the divisor is odd\n+        if (quot <= rem) {\n+          rem -= quot\n+        } else {\n+          if (quot - rem <= bLong) {\n+            rem += bLong - quot\n+            quot -= 1\n+          } else {\n+            rem += (bLong << 1) - quot\n+            quot -= 2\n+          }\n+        }\n+      }\n+    }\n+    (rem << 32) | (quot & UINT_MAX)\n+  }\n+\n+  /**\n+   * Performs modular exponentiation using the Montgomery Reduction. It requires\n+   * that all parameters be positive and the modulus be even. Based <i>The\n+   * square and multiply algorithm and the Montgomery Reduction C. K. Koc -\n+   * Montgomery Reduction with Even Modulus</i>. The square and multiply\n+   * algorithm and the Montgomery Reduction.\n+   *\n+   * @ar.org.fitc.ref \"C. K. Koc - Montgomery Reduction with Even Modulus\"\n+   * @see BigInteger#modPow(BigInteger, BigInteger)\n+   */\n+  def evenModPow(base: BigInteger, exponent: BigInteger,\n+        modulus: BigInteger): BigInteger = {\n+    // STEP 1: Obtain the factorization 'modulus'= q * 2^j.\n+    val j = modulus.getLowestSetBit\n+    val q = modulus.shiftRight(j)\n+\n+    // STEP 2: Compute x1 := base^exponent (mod q).\n+    val x1 = oddModPow(base, exponent, q)\n+\n+    // STEP 3: Compute x2 := base^exponent (mod 2^j).\n+    val x2 = pow2ModPow(base, exponent, j)\n+\n+    // STEP 4: Compute q^(-1) (mod 2^j) and y := (x2-x1) * q^(-1) (mod 2^j)\n+    val qInv = modPow2Inverse(q, j)\n+    var y = x2.subtract(x1).multiply(qInv)\n+    inplaceModPow2(y, j)\n+    if (y.sign < 0)\n+      y = y.add(BigInteger.getPowerOfTwo(j))\n+\n+    // STEP 5: Compute and return: x1 + q * y\n+    x1.add(q.multiply(y))\n+  }\n+\n+  /**\n+   * Performs the final reduction of the Montgomery algorithm.\n+   *\n+   * @see #monPro(BigInteger, BigInteger, BigInteger, long)\n+   * @see #monSquare(BigInteger, BigInteger, long)\n+   */\n+  def finalSubtraction(res: Array[Int], modulus: BigInteger): BigInteger = {\n+    // skipping leading zeros\n+    val modulusLen = modulus.numberLength\n+    var doSub = res(modulusLen) != 0\n+    if (!doSub) {\n+      val modulusDigits = modulus.digits\n+      doSub = true\n+      var i = modulusLen - 1\n+      while (i >= 0) {\n+        if (res(i) != modulusDigits(i)) {\n+          doSub =\n+            (res(i) != 0) && ((res(i) & UINT_MAX) > (modulusDigits(i) & UINT_MAX))\n+          //force break\n+          i = 0\n+        }\n+        i -= 1\n+      }\n+    }\n+    val result = new BigInteger(1, modulusLen + 1, res)\n+    if (doSub)\n+      Elementary.inplaceSubtract(result, modulus)\n+\n+    result.cutOffLeadingZeroes()\n+    result\n+  }\n+\n+  /**\n+   * @param m a positive modulus Return the greatest common divisor of op1 and\n+   *          op2,\n+   *\n+   * @param op1 must be greater than zero\n+   * @param op2 must be greater than zero\n+   * @see BigInteger#gcd(BigInteger)\n+   * @return {@code GCD(op1, op2)}\n+   */\n+  def gcdBinary(val1: BigInteger, val2: BigInteger): BigInteger = {\n+    var op1 = val1\n+    var op2 = val2\n+\n+    /*\n+     * Divide both number the maximal possible times by 2 without rounding\n+     * gcd(2*a, 2*b) = 2 * gcd(a,b)\n+     */\n+    val lsb1 = op1.getLowestSetBit\n+    val lsb2 = op2.getLowestSetBit\n+    val pow2Count = Math.min(lsb1, lsb2)\n+    BitLevel.inplaceShiftRight(op1, lsb1)\n+    BitLevel.inplaceShiftRight(op2, lsb2)\n+\n+    // I want op2 > op1\n+    if (op1.compareTo(op2) == BigInteger.GREATER) {\n+      val swap: BigInteger = op1\n+      op1 = op2\n+      op2 = swap\n+    }\n+\n+    @inline\n+    @tailrec\n+    def loop(): Unit = {\n+      // INV: op2 >= op1 && both are odd unless op1 = 0\n+\n+      // Optimization for small operands\n+      // (op2.bitLength() < 32) implies by INV (op1.bitLength() < 32)\n+      if ((op2.numberLength == 1) && (op2.digits(0) > 0)) {\n+        op2 = BigInteger.valueOf(Division.gcdBinary(op1.intValue(), op2.intValue()))\n+      } else {\n+        // Implements one step of the Euclidean algorithm\n+        // To reduce one operand if it's much smaller than the other one\n+        if (op2.numberLength > op1.numberLength * 1.2) {\n+          op2 = op2.remainder(op1)\n+          if (op2.signum() != 0) {\n+            BitLevel.inplaceShiftRight(op2, op2.getLowestSetBit)\n+          }\n+        } else {\n+          // Use Knuth's algorithm of successive subtract and shifting\n+          do {\n+            Elementary.inplaceSubtract(op2, op1)\n+            BitLevel.inplaceShiftRight(op2, op2.getLowestSetBit)\n+          } while (op2.compareTo(op1) >= BigInteger.EQUALS);\n+        }\n+        // now op1 >= op2\n+        val swap: BigInteger = op2\n+        op2 = op1\n+        op1 = swap\n+        if (op1.sign != 0)\n+          loop\n+      }\n+    }\n+\n+    loop()\n+    op2.shiftLeft(pow2Count)\n+  }\n+\n+  /**\n+   * Performs the same as {@link #gcdBinary(BigInteger, BigInteger)}, but with\n+   * numbers of 31 bits, represented in positives values of {@code Int} type.\n+   *\n+   * @param op1 a positive number\n+   * @param op2 a positive number\n+   * @see #gcdBinary(BigInteger, BigInteger)\n+   * @return <code>GCD(op1, op2)</code>\n+   */\n+  def gcdBinary(val1: Int, val2: Int): Int = {\n+    var op1= val1\n+    var op2= val2","path":"javalib/src/main/scala/java/math/Division.scala","position":454,"original_position":454,"commit_id":"a92f3b24c0b473f82ba0e05c017d34c2a439edf5","original_commit_id":"a92f3b24c0b473f82ba0e05c017d34c2a439edf5","user":{"login":"sjrd","id":535934,"avatar_url":"https://avatars.githubusercontent.com/u/535934?v=3","gravatar_id":"","url":"https://api.github.com/users/sjrd","html_url":"https://github.com/sjrd","followers_url":"https://api.github.com/users/sjrd/followers","following_url":"https://api.github.com/users/sjrd/following{/other_user}","gists_url":"https://api.github.com/users/sjrd/gists{/gist_id}","starred_url":"https://api.github.com/users/sjrd/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sjrd/subscriptions","organizations_url":"https://api.github.com/users/sjrd/orgs","repos_url":"https://api.github.com/users/sjrd/repos","events_url":"https://api.github.com/users/sjrd/events{/privacy}","received_events_url":"https://api.github.com/users/sjrd/received_events","type":"User","site_admin":false},"body":"Missing spaces before `=`","created_at":"2015-04-09T14:21:01Z","updated_at":"2015-04-09T14:21:01Z","html_url":"https://github.com/scala-js/scala-js/pull/1549#discussion_r28065241","pull_request_url":"https://api.github.com/repos/scala-js/scala-js/pulls/1549","_links":{"self":{"href":"https://api.github.com/repos/scala-js/scala-js/pulls/comments/28065241"},"html":{"href":"https://github.com/scala-js/scala-js/pull/1549#discussion_r28065241"},"pull_request":{"href":"https://api.github.com/repos/scala-js/scala-js/pulls/1549"}}},"pull_request":{"url":"https://api.github.com/repos/scala-js/scala-js/pulls/1549","id":31272316,"html_url":"https://github.com/scala-js/scala-js/pull/1549","diff_url":"https://github.com/scala-js/scala-js/pull/1549.diff","patch_url":"https://github.com/scala-js/scala-js/pull/1549.patch","issue_url":"https://api.github.com/repos/scala-js/scala-js/issues/1549","number":1549,"state":"open","locked":false,"title":"BigDecimal and BigInteger","user":{"login":"InTheNow","id":5887373,"avatar_url":"https://avatars.githubusercontent.com/u/5887373?v=3","gravatar_id":"","url":"https://api.github.com/users/InTheNow","html_url":"https://github.com/InTheNow","followers_url":"https://api.github.com/users/InTheNow/followers","following_url":"https://api.github.com/users/InTheNow/following{/other_user}","gists_url":"https://api.github.com/users/InTheNow/gists{/gist_id}","starred_url":"https://api.github.com/users/InTheNow/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/InTheNow/subscriptions","organizations_url":"https://api.github.com/users/InTheNow/orgs","repos_url":"https://api.github.com/users/InTheNow/repos","events_url":"https://api.github.com/users/InTheNow/events{/privacy}","received_events_url":"https://api.github.com/users/InTheNow/received_events","type":"User","site_admin":false},"body":"Implements https://github.com/scala-js/scala-js/issues/373\r\n\r\nNotes: \r\n- There are four tests marked as xit, all relating to float infinity being casted to doubl infinity\r\n- There are a couple of comments of \"Todo:\" where some functionality _could_ go into main javalib.\r\n","created_at":"2015-03-16T18:45:35Z","updated_at":"2015-04-09T14:21:02Z","closed_at":null,"merged_at":null,"merge_commit_sha":"031eed65e50d46bb4429373dddfc8c6903fae858","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/scala-js/scala-js/pulls/1549/commits","review_comments_url":"https://api.github.com/repos/scala-js/scala-js/pulls/1549/comments","review_comment_url":"https://api.github.com/repos/scala-js/scala-js/pulls/comments{/number}","comments_url":"https://api.github.com/repos/scala-js/scala-js/issues/1549/comments","statuses_url":"https://api.github.com/repos/scala-js/scala-js/statuses/a92f3b24c0b473f82ba0e05c017d34c2a439edf5","head":{"label":"InTheNow:BigNumerics","ref":"BigNumerics","sha":"a92f3b24c0b473f82ba0e05c017d34c2a439edf5","user":{"login":"InTheNow","id":5887373,"avatar_url":"https://avatars.githubusercontent.com/u/5887373?v=3","gravatar_id":"","url":"https://api.github.com/users/InTheNow","html_url":"https://github.com/InTheNow","followers_url":"https://api.github.com/users/InTheNow/followers","following_url":"https://api.github.com/users/InTheNow/following{/other_user}","gists_url":"https://api.github.com/users/InTheNow/gists{/gist_id}","starred_url":"https://api.github.com/users/InTheNow/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/InTheNow/subscriptions","organizations_url":"https://api.github.com/users/InTheNow/orgs","repos_url":"https://api.github.com/users/InTheNow/repos","events_url":"https://api.github.com/users/InTheNow/events{/privacy}","received_events_url":"https://api.github.com/users/InTheNow/received_events","type":"User","site_admin":false},"repo":{"id":16174535,"name":"scala-js","full_name":"InTheNow/scala-js","owner":{"login":"InTheNow","id":5887373,"avatar_url":"https://avatars.githubusercontent.com/u/5887373?v=3","gravatar_id":"","url":"https://api.github.com/users/InTheNow","html_url":"https://github.com/InTheNow","followers_url":"https://api.github.com/users/InTheNow/followers","following_url":"https://api.github.com/users/InTheNow/following{/other_user}","gists_url":"https://api.github.com/users/InTheNow/gists{/gist_id}","starred_url":"https://api.github.com/users/InTheNow/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/InTheNow/subscriptions","organizations_url":"https://api.github.com/users/InTheNow/orgs","repos_url":"https://api.github.com/users/InTheNow/repos","events_url":"https://api.github.com/users/InTheNow/events{/privacy}","received_events_url":"https://api.github.com/users/InTheNow/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/InTheNow/scala-js","description":"Scala.js, a Scala to JavaScript compiler","fork":true,"url":"https://api.github.com/repos/InTheNow/scala-js","forks_url":"https://api.github.com/repos/InTheNow/scala-js/forks","keys_url":"https://api.github.com/repos/InTheNow/scala-js/keys{/key_id}","collaborators_url":"https://api.github.com/repos/InTheNow/scala-js/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/InTheNow/scala-js/teams","hooks_url":"https://api.github.com/repos/InTheNow/scala-js/hooks","issue_events_url":"https://api.github.com/repos/InTheNow/scala-js/issues/events{/number}","events_url":"https://api.github.com/repos/InTheNow/scala-js/events","assignees_url":"https://api.github.com/repos/InTheNow/scala-js/assignees{/user}","branches_url":"https://api.github.com/repos/InTheNow/scala-js/branches{/branch}","tags_url":"https://api.github.com/repos/InTheNow/scala-js/tags","blobs_url":"https://api.github.com/repos/InTheNow/scala-js/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/InTheNow/scala-js/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/InTheNow/scala-js/git/refs{/sha}","trees_url":"https://api.github.com/repos/InTheNow/scala-js/git/trees{/sha}","statuses_url":"https://api.github.com/repos/InTheNow/scala-js/statuses/{sha}","languages_url":"https://api.github.com/repos/InTheNow/scala-js/languages","stargazers_url":"https://api.github.com/repos/InTheNow/scala-js/stargazers","contributors_url":"https://api.github.com/repos/InTheNow/scala-js/contributors","subscribers_url":"https://api.github.com/repos/InTheNow/scala-js/subscribers","subscription_url":"https://api.github.com/repos/InTheNow/scala-js/subscription","commits_url":"https://api.github.com/repos/InTheNow/scala-js/commits{/sha}","git_commits_url":"https://api.github.com/repos/InTheNow/scala-js/git/commits{/sha}","comments_url":"https://api.github.com/repos/InTheNow/scala-js/comments{/number}","issue_comment_url":"https://api.github.com/repos/InTheNow/scala-js/issues/comments{/number}","contents_url":"https://api.github.com/repos/InTheNow/scala-js/contents/{+path}","compare_url":"https://api.github.com/repos/InTheNow/scala-js/compare/{base}...{head}","merges_url":"https://api.github.com/repos/InTheNow/scala-js/merges","archive_url":"https://api.github.com/repos/InTheNow/scala-js/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/InTheNow/scala-js/downloads","issues_url":"https://api.github.com/repos/InTheNow/scala-js/issues{/number}","pulls_url":"https://api.github.com/repos/InTheNow/scala-js/pulls{/number}","milestones_url":"https://api.github.com/repos/InTheNow/scala-js/milestones{/number}","notifications_url":"https://api.github.com/repos/InTheNow/scala-js/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/InTheNow/scala-js/labels{/name}","releases_url":"https://api.github.com/repos/InTheNow/scala-js/releases{/id}","created_at":"2014-01-23T14:24:12Z","updated_at":"2015-04-07T12:49:33Z","pushed_at":"2015-04-07T15:52:18Z","git_url":"git://github.com/InTheNow/scala-js.git","ssh_url":"git@github.com:InTheNow/scala-js.git","clone_url":"https://github.com/InTheNow/scala-js.git","svn_url":"https://github.com/InTheNow/scala-js","homepage":"http://www.scala-js.org/","size":7940,"stargazers_count":0,"watchers_count":0,"language":"Scala","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":"scala-js:master","ref":"master","sha":"6bb21c20032a5d0d810b0b7769365f127ee45ea8","user":{"login":"scala-js","id":6039724,"avatar_url":"https://avatars.githubusercontent.com/u/6039724?v=3","gravatar_id":"","url":"https://api.github.com/users/scala-js","html_url":"https://github.com/scala-js","followers_url":"https://api.github.com/users/scala-js/followers","following_url":"https://api.github.com/users/scala-js/following{/other_user}","gists_url":"https://api.github.com/users/scala-js/gists{/gist_id}","starred_url":"https://api.github.com/users/scala-js/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/scala-js/subscriptions","organizations_url":"https://api.github.com/users/scala-js/orgs","repos_url":"https://api.github.com/users/scala-js/repos","events_url":"https://api.github.com/users/scala-js/events{/privacy}","received_events_url":"https://api.github.com/users/scala-js/received_events","type":"Organization","site_admin":false},"repo":{"id":8272315,"name":"scala-js","full_name":"scala-js/scala-js","owner":{"login":"scala-js","id":6039724,"avatar_url":"https://avatars.githubusercontent.com/u/6039724?v=3","gravatar_id":"","url":"https://api.github.com/users/scala-js","html_url":"https://github.com/scala-js","followers_url":"https://api.github.com/users/scala-js/followers","following_url":"https://api.github.com/users/scala-js/following{/other_user}","gists_url":"https://api.github.com/users/scala-js/gists{/gist_id}","starred_url":"https://api.github.com/users/scala-js/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/scala-js/subscriptions","organizations_url":"https://api.github.com/users/scala-js/orgs","repos_url":"https://api.github.com/users/scala-js/repos","events_url":"https://api.github.com/users/scala-js/events{/privacy}","received_events_url":"https://api.github.com/users/scala-js/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/scala-js/scala-js","description":"Scala.js, the Scala to JavaScript compiler","fork":false,"url":"https://api.github.com/repos/scala-js/scala-js","forks_url":"https://api.github.com/repos/scala-js/scala-js/forks","keys_url":"https://api.github.com/repos/scala-js/scala-js/keys{/key_id}","collaborators_url":"https://api.github.com/repos/scala-js/scala-js/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/scala-js/scala-js/teams","hooks_url":"https://api.github.com/repos/scala-js/scala-js/hooks","issue_events_url":"https://api.github.com/repos/scala-js/scala-js/issues/events{/number}","events_url":"https://api.github.com/repos/scala-js/scala-js/events","assignees_url":"https://api.github.com/repos/scala-js/scala-js/assignees{/user}","branches_url":"https://api.github.com/repos/scala-js/scala-js/branches{/branch}","tags_url":"https://api.github.com/repos/scala-js/scala-js/tags","blobs_url":"https://api.github.com/repos/scala-js/scala-js/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/scala-js/scala-js/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/scala-js/scala-js/git/refs{/sha}","trees_url":"https://api.github.com/repos/scala-js/scala-js/git/trees{/sha}","statuses_url":"https://api.github.com/repos/scala-js/scala-js/statuses/{sha}","languages_url":"https://api.github.com/repos/scala-js/scala-js/languages","stargazers_url":"https://api.github.com/repos/scala-js/scala-js/stargazers","contributors_url":"https://api.github.com/repos/scala-js/scala-js/contributors","subscribers_url":"https://api.github.com/repos/scala-js/scala-js/subscribers","subscription_url":"https://api.github.com/repos/scala-js/scala-js/subscription","commits_url":"https://api.github.com/repos/scala-js/scala-js/commits{/sha}","git_commits_url":"https://api.github.com/repos/scala-js/scala-js/git/commits{/sha}","comments_url":"https://api.github.com/repos/scala-js/scala-js/comments{/number}","issue_comment_url":"https://api.github.com/repos/scala-js/scala-js/issues/comments{/number}","contents_url":"https://api.github.com/repos/scala-js/scala-js/contents/{+path}","compare_url":"https://api.github.com/repos/scala-js/scala-js/compare/{base}...{head}","merges_url":"https://api.github.com/repos/scala-js/scala-js/merges","archive_url":"https://api.github.com/repos/scala-js/scala-js/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/scala-js/scala-js/downloads","issues_url":"https://api.github.com/repos/scala-js/scala-js/issues{/number}","pulls_url":"https://api.github.com/repos/scala-js/scala-js/pulls{/number}","milestones_url":"https://api.github.com/repos/scala-js/scala-js/milestones{/number}","notifications_url":"https://api.github.com/repos/scala-js/scala-js/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/scala-js/scala-js/labels{/name}","releases_url":"https://api.github.com/repos/scala-js/scala-js/releases{/id}","created_at":"2013-02-18T16:33:55Z","updated_at":"2015-04-09T14:15:38Z","pushed_at":"2015-04-07T15:53:17Z","git_url":"git://github.com/scala-js/scala-js.git","ssh_url":"git@github.com:scala-js/scala-js.git","clone_url":"https://github.com/scala-js/scala-js.git","svn_url":"https://github.com/scala-js/scala-js","homepage":"http://www.scala-js.org/","size":14927,"stargazers_count":1604,"watchers_count":1604,"language":"Scala","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":125,"mirror_url":null,"open_issues_count":45,"forks":125,"open_issues":45,"watchers":1604,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/scala-js/scala-js/pulls/1549"},"html":{"href":"https://github.com/scala-js/scala-js/pull/1549"},"issue":{"href":"https://api.github.com/repos/scala-js/scala-js/issues/1549"},"comments":{"href":"https://api.github.com/repos/scala-js/scala-js/issues/1549/comments"},"review_comments":{"href":"https://api.github.com/repos/scala-js/scala-js/pulls/1549/comments"},"review_comment":{"href":"https://api.github.com/repos/scala-js/scala-js/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/scala-js/scala-js/pulls/1549/commits"},"statuses":{"href":"https://api.github.com/repos/scala-js/scala-js/statuses/a92f3b24c0b473f82ba0e05c017d34c2a439edf5"}}}}