 
     class func parseCoordinates(_ element: AEXMLElement) -> [CLLocationCoordinate2D] {
         var coordinates: [CLLocationCoordinate2D] = []
-        let lines: [String] = element.string.characters.split(omittingEmptySubsequences: true, whereSeparator:  {$0 == "\n" || $0 == " "}).map { String($0) }
-        for line: String in lines {
-            let points: [String] = line.characters.split(omittingEmptySubsequences: true, whereSeparator: {$0 == ","}).map { String($0) }
+        let lines: [String] = element.string.components(separatedBy: CharacterSet.whitespacesAndNewlines)
+        for line in lines {
+            let points: [String] = line.components(separatedBy: ",")
             assert(points.count >= 2, "points lenth is \(points)")
             coordinates.append(CLLocationCoordinate2DMake(atof(points[1]), atof(points[0])))
         }


public struct KMLConfig {
    // Able to replace with customized parser
    public static var tags: Dictionary<String, KMLElement.Type> = [
        KMLTag.Style.str : KMLStyle.self,
        KMLTag.StyleMap.str : KMLStyleMap.self,
        KMLTag.PolyStyle.str : KMLPolyStyle.self,
        KMLTag.LineStyle.str : KMLLineStyle.self,
        KMLTag.BalloonStyle.str : KMLBalloonStyle.self,
        KMLTag.MultiGeometry.str : KMLMultiGeometry.self,
        KMLTag.Polygon.str : KMLPolygon.self,
        KMLTag.LineString.str : KMLLineString.self,
        KMLTag.Point.str : KMLPoint.self,
        KMLTag.Folder.str : KMLElement.self,
        KMLTag.Placemark.str : KMLPlacemark.self,
        KMLTag.Icon.str : KMLIcon.self,
        KMLTag.IconStyle.str : KMLIconStyle.self
    ]
}


    }
}

open class KMLLineString: KMLElement {

    open var tessellate: Bool = false
