code: func NewPathFromEncoding(encoded string, factor ...int) *Path {
  	var count, index int
  
  	f := 1.0e5
  	if len(factor) != 0 {
  		f = float64(factor[0])
  	}
  
  	p := &Path{PointSet{}}
  	tempLatLng := [2]int{0, 0}
  
  	for index < len(encoded) {
  		var result int
  		var b = 0x20
  		var shift uint
  
  		for b >= 0x20 && index < len(encoded) {
  			b = int(encoded[index]) - 63
  			index++
  
  			result |= (b & 0x1f) << shift
  			shift += 5
  		}
  
  		// sign dection
  		if result&1 != 0 {
  			result = ^(result >> 1)
  		} else {
  			result = result >> 1
  		}
  
  		if count%2 == 0 {
  			result += tempLatLng[0]
  			tempLatLng[0] = result
  		} else {
  			result += tempLatLng[1]
  			tempLatLng[1] = result
  
  			p.PointSet = append(p.PointSet, Point{float64(tempLatLng[1]) / f, float64(tempLatLng[0]) / f})
  		}
  
  		count++
  	}
  
  	return p
  }
docs: // NewPathFromEncoding is the inverse of path.Encode. It takes a string encoding of a lat/lng path
  // and returns the actual path it represents. Factor defaults to 1.0e5,
  // the same used by Google for polyline encoding.