code: @NonNull
    public static List<Point> decode(@NonNull final String encodedPath, int precision) {
      int len = encodedPath.length();
  
      // OSRM uses precision=6, the default Polyline spec divides by 1E5, capping at precision=5
      double factor = Math.pow(10, precision);
  
      // For speed we preallocate to an upper bound on the final length, then
      // truncate the array before returning.
      final List<Point> path = new ArrayList<>();
      int index = 0;
      int lat = 0;
      int lng = 0;
  
      while (index < len) {
        int result = 1;
        int shift = 0;
        int temp;
        do {
          temp = encodedPath.charAt(index++) - 63 - 1;
          result += temp << shift;
          shift += 5;
        }
        while (temp >= 0x1f);
        lat += (result & 1) != 0 ? ~(result >> 1) : (result >> 1);
  
        result = 1;
        shift = 0;
        do {
          temp = encodedPath.charAt(index++) - 63 - 1;
          result += temp << shift;
          shift += 5;
        }
        while (temp >= 0x1f);
        lng += (result & 1) != 0 ? ~(result >> 1) : (result >> 1);
  
        path.add(Point.fromLngLat(lng / factor, lat / factor));
      }
  
      return path;
    }
docs: Decodes an encoded path string into a sequence of {@link Point}.
  
  @param encodedPath a String representing an encoded path string
  @param precision   OSRMv4 uses 6, OSRMv5 and Google uses 5
  @return list of {@link Point} making up the line
  @see <a href="https://github.com/mapbox/polyline/blob/master/src/polyline.js">Part of algorithm came from this source</a>
  @see <a href="https://github.com/googlemaps/android-maps-utils/blob/master/library/src/com/google/maps/android/PolyUtil.java">Part of algorithm came from this source.</a>
  @since 1.0.0