From 9268409f3a6c178f61fa09595a6ef8d07b6e9720 Mon Sep 17 00:00:00 2001 From: Jacob Fielding Date: Sun, 22 Sep 2024 17:50:08 -0700 Subject: [PATCH 01/20] WIP for publishing a current annotations object --- Package.swift | 4 +- android/build.gradle | 3 +- android/core/build.gradle | 2 + .../ferrostar/core/NavigationViewModel.kt | 9 +- .../core/extensions/TripStateExtensions.kt | 27 + .../core/mock/MockNavigationState.kt | 3 +- .../ferrostar/core/models/AnnotationValue.kt | 12 + android/gradle/libs.versions.toml | 2 + .../Sources/FerrostarCore/FerrostarCore.swift | 3 +- .../Mock/MockNavigationState.swift | 9 +- .../FerrostarCore/NavigationState.swift | 25 + .../DynamicallyOrientingNavigationView.swift | 4 +- .../Views/LandscapeNavigationView.swift | 4 +- .../Views/NavigationMapView.swift | 4 +- .../LandscapeNavigationOverlayView.swift | 12 +- .../PortraitNavigationOverlayView.swift | 10 +- .../Views/PortraitNavigationView.swift | 4 +- apple/Sources/UniFFI/ferrostar.swift | 147 +- common/Cargo.lock | 14 +- common/ferrostar/Cargo.toml | 3 +- common/ferrostar/src/algorithms.rs | 11 + common/ferrostar/src/models.rs | 26 +- .../src/navigation_controller/mod.rs | 24 + .../src/navigation_controller/models.rs | 5 +- .../src/navigation_controller/test_helpers.rs | 1 + .../src/routing_adapters/algorithms.rs | 26 + common/ferrostar/src/routing_adapters/mod.rs | 1 + .../src/routing_adapters/osrm/algorithms.rs | 83 + .../src/routing_adapters/osrm/mod.rs | 80 +- .../src/routing_adapters/osrm/models.rs | 40 +- ..._osrm__tests__parse_valhalla_osrm.snap.new | 9356 +++++++++++++++++ ...parse_valhalla_osrm_with_via_ways.snap.new | 7475 +++++++++++++ sample.json | 1117 ++ web/package-lock.json | 4 +- web/package.json | 2 +- 35 files changed, 18459 insertions(+), 93 deletions(-) create mode 100644 android/core/src/main/java/com/stadiamaps/ferrostar/core/models/AnnotationValue.kt create mode 100644 common/ferrostar/src/routing_adapters/algorithms.rs create mode 100644 common/ferrostar/src/routing_adapters/osrm/algorithms.rs create mode 100644 common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__tests__parse_valhalla_osrm.snap.new create mode 100644 common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__tests__parse_valhalla_osrm_with_via_ways.snap.new create mode 100644 sample.json diff --git a/Package.swift b/Package.swift index 219f5b10..d51ad22f 100644 --- a/Package.swift +++ b/Package.swift @@ -5,7 +5,7 @@ import PackageDescription let binaryTarget: Target let maplibreSwiftUIDSLPackage: Package.Dependency -let useLocalFramework = false +let useLocalFramework = true let useLocalMapLibreSwiftUIDSL = false if useLocalFramework { @@ -16,7 +16,7 @@ if useLocalFramework { path: "./common/target/ios/libferrostar-rs.xcframework" ) } else { - let releaseTag = "0.12.0" + let releaseTag = "0.13.0" let releaseChecksum = "41040ba2beb0f9ef615d2d5b2479f7feec70e72422d20752fab40a6495f0ef93" binaryTarget = .binaryTarget( name: "FerrostarCoreRS", diff --git a/android/build.gradle b/android/build.gradle index ee71caef..f8f382a2 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -8,9 +8,10 @@ plugins { alias libs.plugins.paparazzi apply false alias libs.plugins.compose.compiler apply false alias libs.plugins.mavenPublish apply false + alias libs.plugins.kotlinSerialization apply false } allprojects { group = "com.stadiamaps.ferrostar" - version = "0.12.0" + version = "0.13.0" } diff --git a/android/core/build.gradle b/android/core/build.gradle index d0f070d3..471660f7 100644 --- a/android/core/build.gradle +++ b/android/core/build.gradle @@ -7,6 +7,7 @@ plugins { alias libs.plugins.cargo.ndk alias libs.plugins.ktfmt alias libs.plugins.mavenPublish + alias libs.plugins.kotlinSerialization } android { @@ -53,6 +54,7 @@ dependencies { implementation(platform(libs.okhttp.bom)) implementation(libs.okhttp.core) implementation libs.moshi + implementation libs.moshi.kotlin // TODO: Migrate version to TOML (doesn't work). Likely related issue: https://github.com/gradle/gradle/issues/21267 //noinspection UseTomlInstead diff --git a/android/core/src/main/java/com/stadiamaps/ferrostar/core/NavigationViewModel.kt b/android/core/src/main/java/com/stadiamaps/ferrostar/core/NavigationViewModel.kt index f1c0e364..80c3043f 100644 --- a/android/core/src/main/java/com/stadiamaps/ferrostar/core/NavigationViewModel.kt +++ b/android/core/src/main/java/com/stadiamaps/ferrostar/core/NavigationViewModel.kt @@ -3,9 +3,11 @@ package com.stadiamaps.ferrostar.core import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.stadiamaps.ferrostar.core.extensions.annotation import com.stadiamaps.ferrostar.core.extensions.deviation import com.stadiamaps.ferrostar.core.extensions.progress import com.stadiamaps.ferrostar.core.extensions.visualInstruction +import com.stadiamaps.ferrostar.core.models.AnnotationValue import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.map @@ -70,7 +72,12 @@ class DefaultNavigationViewModel( .map { coreState -> lastLocation = when (coreState.tripState) { - is TripState.Navigating -> coreState.tripState.snappedUserLocation + is TripState.Navigating -> { + Log.d("NavigationViewModel", "current annotations: ${coreState.tripState.annotation( + AnnotationValue::class.java)}") + + coreState.tripState.snappedUserLocation + } is TripState.Complete, TripState.Idle -> locationProvider.lastLocation } diff --git a/android/core/src/main/java/com/stadiamaps/ferrostar/core/extensions/TripStateExtensions.kt b/android/core/src/main/java/com/stadiamaps/ferrostar/core/extensions/TripStateExtensions.kt index 03b2b5ac..8e1dda3f 100644 --- a/android/core/src/main/java/com/stadiamaps/ferrostar/core/extensions/TripStateExtensions.kt +++ b/android/core/src/main/java/com/stadiamaps/ferrostar/core/extensions/TripStateExtensions.kt @@ -1,6 +1,10 @@ package com.stadiamaps.ferrostar.core.extensions +import com.squareup.moshi.JsonAdapter +import com.squareup.moshi.Moshi +import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory import uniffi.ferrostar.TripState +import java.nio.charset.StandardCharsets /** * Get the progress of the trip while navigating. @@ -41,3 +45,26 @@ fun TripState.deviation() = is TripState.Complete, TripState.Idle -> null } + +/** + * Get the route annotations at the user's current location. + * + * This function will deserialize the annotation bytes provided by the trip + * state. + * + * @param type The json data class that annotations should be deserialized to. + * @return The annotation data or null if the trip is not navigating. + */ +inline fun TripState.annotation(type: Class): T? = + when (this) { + is TripState.Navigating -> { + this.annotationBytes?.let { + val moshi: Moshi = Moshi.Builder().add(KotlinJsonAdapterFactory()).build() + val jsonAdapter: JsonAdapter = moshi.adapter(type) + val jsonString = it.toString(Charsets.UTF_8) + jsonAdapter.fromJson(jsonString) + } + } + is TripState.Complete, + TripState.Idle -> null + } \ No newline at end of file diff --git a/android/core/src/main/java/com/stadiamaps/ferrostar/core/mock/MockNavigationState.kt b/android/core/src/main/java/com/stadiamaps/ferrostar/core/mock/MockNavigationState.kt index 116612d8..4c891e51 100644 --- a/android/core/src/main/java/com/stadiamaps/ferrostar/core/mock/MockNavigationState.kt +++ b/android/core/src/main/java/com/stadiamaps/ferrostar/core/mock/MockNavigationState.kt @@ -54,7 +54,8 @@ fun NavigationState.Companion.pedestrianExample(): NavigationState { secondaryContent = null, triggerDistanceBeforeManeuver = 0.0, ), - spokenInstruction = null), + spokenInstruction = null, + annotationBytes = null), routeGeometry = listOf(), isCalculatingNewRoute = false) } diff --git a/android/core/src/main/java/com/stadiamaps/ferrostar/core/models/AnnotationValue.kt b/android/core/src/main/java/com/stadiamaps/ferrostar/core/models/AnnotationValue.kt new file mode 100644 index 00000000..5d64a31b --- /dev/null +++ b/android/core/src/main/java/com/stadiamaps/ferrostar/core/models/AnnotationValue.kt @@ -0,0 +1,12 @@ +package com.stadiamaps.ferrostar.core.models + +import com.squareup.moshi.Json + +data class AnnotationValue( + val distance: Double, + val duration: Double, + @Json(name = "max_speed_mps") + val maxSpeedMps: Double?, + @Json(name = "speed_mps") + val speedMps: Double +) \ No newline at end of file diff --git a/android/gradle/libs.versions.toml b/android/gradle/libs.versions.toml index 7acc1234..3ee7c9b2 100644 --- a/android/gradle/libs.versions.toml +++ b/android/gradle/libs.versions.toml @@ -52,6 +52,7 @@ androidx-compose-ui-test-manifest = { group = "androidx.compose.ui", name = "ui- okhttp-bom = { group = "com.squareup.okhttp3", name = "okhttp-bom", version.ref = "okhttp" } okhttp-core = { group = "com.squareup.okhttp3", name = "okhttp" } moshi = { group = "com.squareup.moshi", name = "moshi", version.ref = "moshi" } +moshi-kotlin = { group = "com.squareup.moshi", name = "moshi-kotlin", version.ref = "moshi" } okhttp-mock = { group = "com.github.gmazzo", name = "okhttp-mock", version.ref = "okhttp-mock" } # MapLibre maplibre-compose = { group = "io.github.rallista", name = "maplibre-compose", version.ref = "maplibre-compose" } @@ -73,3 +74,4 @@ cargo-ndk = { id = "com.github.willir.rust.cargo-ndk-android", version.ref = "ca ktfmt = { id = "com.ncorti.ktfmt.gradle", version.ref = "ktfmt" } paparazzi = { id = "app.cash.paparazzi", version.ref = "paparazzi" } mavenPublish = { id = "com.vanniktech.maven.publish", version.ref = "mavenPublish" } +kotlinSerialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } \ No newline at end of file diff --git a/apple/Sources/FerrostarCore/FerrostarCore.swift b/apple/Sources/FerrostarCore/FerrostarCore.swift index 766be0b5..d4a14558 100644 --- a/apple/Sources/FerrostarCore/FerrostarCore.swift +++ b/apple/Sources/FerrostarCore/FerrostarCore.swift @@ -267,7 +267,8 @@ public protocol FerrostarCoreDelegate: AnyObject { progress: _, deviation: deviation, visualInstruction: _, - spokenInstruction: spokenInstruction + spokenInstruction: spokenInstruction, + annotationBytes: _ ): switch deviation { case .noDeviation: diff --git a/apple/Sources/FerrostarCore/Mock/MockNavigationState.swift b/apple/Sources/FerrostarCore/Mock/MockNavigationState.swift index 033e864b..046bdb3e 100644 --- a/apple/Sources/FerrostarCore/Mock/MockNavigationState.swift +++ b/apple/Sources/FerrostarCore/Mock/MockNavigationState.swift @@ -25,7 +25,8 @@ public extension NavigationState { ), deviation: .noDeviation, visualInstruction: nil, - spokenInstruction: nil + spokenInstruction: nil, + annotationBytes: nil ), routeGeometry: samplePedestrianWaypoints, isCalculatingNewRoute: false @@ -63,7 +64,8 @@ public extension NavigationState { secondaryContent: nil, triggerDistanceBeforeManeuver: 42.0 ), ], - spokenInstructions: [] + spokenInstructions: [], + annotations: nil ), ], remainingWaypoints: [], @@ -74,7 +76,8 @@ public extension NavigationState { ), deviation: .noDeviation, visualInstruction: nil, - spokenInstruction: nil + spokenInstruction: nil, + annotationBytes: nil ), routeGeometry: samplePedestrianWaypoints, isCalculatingNewRoute: false diff --git a/apple/Sources/FerrostarCore/NavigationState.swift b/apple/Sources/FerrostarCore/NavigationState.swift index 987695f5..67ba57eb 100644 --- a/apple/Sources/FerrostarCore/NavigationState.swift +++ b/apple/Sources/FerrostarCore/NavigationState.swift @@ -20,4 +20,29 @@ public struct NavigationState: Hashable { self.routeGeometry = routeGeometry self.isCalculatingNewRoute = isCalculatingNewRoute } + + public var currentProgress: TripProgress? { + guard case let .navigating(_, _, _, _, progress: progress, _, _, + _, _) = tripState else { + return nil + } + + return progress + } + + public var currentVisualInstruction: VisualInstruction? { + guard case let .navigating(_, _, _, _, _, _, visualInstruction: visualInstruction, _, _) = tripState else { + return nil + } + + return visualInstruction + } + +// public func currentAnnotation() throws -> T? { +// guard case let .navigating(_, _, _, _, _, _, _, _, annotationBytes: annotationBytes) = tripState else { +// return nil +// } +// +// return +// } } diff --git a/apple/Sources/FerrostarMapLibreUI/Views/DynamicallyOrientingNavigationView.swift b/apple/Sources/FerrostarMapLibreUI/Views/DynamicallyOrientingNavigationView.swift index 75ddf6ba..1cd18902 100644 --- a/apple/Sources/FerrostarMapLibreUI/Views/DynamicallyOrientingNavigationView.swift +++ b/apple/Sources/FerrostarMapLibreUI/Views/DynamicallyOrientingNavigationView.swift @@ -134,7 +134,7 @@ public struct DynamicallyOrientingNavigationView: View, CustomizableNavigatingIn formatter.locale = Locale(identifier: "en-US") formatter.units = .imperial - guard case let .navigating(_, snappedUserLocation: userLocation, _, _, _, _, _, _) = state.tripState else { + guard case let .navigating(_, snappedUserLocation: userLocation, _, _, _, _, _, _, _) = state.tripState else { return EmptyView() } @@ -153,7 +153,7 @@ public struct DynamicallyOrientingNavigationView: View, CustomizableNavigatingIn formatter.locale = Locale(identifier: "en-US") formatter.units = .metric - guard case let .navigating(_, snappedUserLocation: userLocation, _, _, _, _, _, _) = state.tripState else { + guard case let .navigating(_, snappedUserLocation: userLocation, _, _, _, _, _, _, _) = state.tripState else { return EmptyView() } diff --git a/apple/Sources/FerrostarMapLibreUI/Views/LandscapeNavigationView.swift b/apple/Sources/FerrostarMapLibreUI/Views/LandscapeNavigationView.swift index f929c1df..5c3809f2 100644 --- a/apple/Sources/FerrostarMapLibreUI/Views/LandscapeNavigationView.swift +++ b/apple/Sources/FerrostarMapLibreUI/Views/LandscapeNavigationView.swift @@ -103,7 +103,7 @@ public struct LandscapeNavigationView: View { formatter.locale = Locale(identifier: "en-US") formatter.units = .imperial - guard case let .navigating(_, snappedUserLocation: userLocation, _, _, _, _, _, _) = state.tripState else { + guard case let .navigating(_, snappedUserLocation: userLocation, _, _, _, _, _, _, _) = state.tripState else { return EmptyView() } @@ -124,7 +124,7 @@ public struct LandscapeNavigationView: View { formatter.locale = Locale(identifier: "en-US") formatter.units = .metric - guard case let .navigating(_, snappedUserLocation: userLocation, _, _, _, _, _, _) = state.tripState else { + guard case let .navigating(_, snappedUserLocation: userLocation, _, _, _, _, _, _, _) = state.tripState else { return EmptyView() } diff --git a/apple/Sources/FerrostarMapLibreUI/Views/NavigationMapView.swift b/apple/Sources/FerrostarMapLibreUI/Views/NavigationMapView.swift index 56165e77..8b42fef3 100644 --- a/apple/Sources/FerrostarMapLibreUI/Views/NavigationMapView.swift +++ b/apple/Sources/FerrostarMapLibreUI/Views/NavigationMapView.swift @@ -83,7 +83,7 @@ public struct NavigationMapView: View { } private func updateCameraIfNeeded() { - if case let .navigating(_, snappedUserLocation: userLocation, _, _, _, _, _, _) = navigationState?.tripState, + if case let .navigating(_, snappedUserLocation: userLocation, _, _, _, _, _, _, _) = navigationState?.tripState, // There is no reason to push an update if the coordinate and heading are the same. // That's all that gets displayed, so it's all that MapLibre should care about. locationManager.lastLocation.coordinate != userLocation.coordinates @@ -98,7 +98,7 @@ public struct NavigationMapView: View { // TODO: Make map URL configurable but gitignored let state = NavigationState.modifiedPedestrianExample(droppingNWaypoints: 4) - guard case let .navigating(_, snappedUserLocation: userLocation, _, _, _, _, _, _) = state.tripState else { + guard case let .navigating(_, snappedUserLocation: userLocation, _, _, _, _, _, _, _) = state.tripState else { return EmptyView() } diff --git a/apple/Sources/FerrostarMapLibreUI/Views/Overylays/LandscapeNavigationOverlayView.swift b/apple/Sources/FerrostarMapLibreUI/Views/Overylays/LandscapeNavigationOverlayView.swift index e85e41fc..a281c31a 100644 --- a/apple/Sources/FerrostarMapLibreUI/Views/Overylays/LandscapeNavigationOverlayView.swift +++ b/apple/Sources/FerrostarMapLibreUI/Views/Overylays/LandscapeNavigationOverlayView.swift @@ -47,10 +47,9 @@ struct LandscapeNavigationOverlayView: View, CustomizableNavigatingInnerGridView var body: some View { HStack { VStack { - if case let .navigating(_, _, _, _, progress: progress, _, visualInstruction: visualInstruction, - _) = navigationState?.tripState, - let visualInstruction - { + if case .navigating = navigationState?.tripState, + let visualInstruction = navigationState?.currentVisualInstruction, + let progress = navigationState?.currentProgress { InstructionsView( visualInstruction: visualInstruction, distanceFormatter: formatterCollection.distanceFormatter, @@ -58,10 +57,11 @@ struct LandscapeNavigationOverlayView: View, CustomizableNavigatingInnerGridView ) .padding(.top, 16) } - + Spacer() - if case let .navigating(_, _, _, _, progress: progress, _, _, _) = navigationState?.tripState { + if case .navigating = navigationState?.tripState, + let progress = navigationState?.currentProgress { ArrivalView( progress: progress, onTapExit: onTapExit diff --git a/apple/Sources/FerrostarMapLibreUI/Views/Overylays/PortraitNavigationOverlayView.swift b/apple/Sources/FerrostarMapLibreUI/Views/Overylays/PortraitNavigationOverlayView.swift index cfecd6f3..1786fb6a 100644 --- a/apple/Sources/FerrostarMapLibreUI/Views/Overylays/PortraitNavigationOverlayView.swift +++ b/apple/Sources/FerrostarMapLibreUI/Views/Overylays/PortraitNavigationOverlayView.swift @@ -46,10 +46,9 @@ struct PortraitNavigationOverlayView: View, CustomizableNavigatingInnerGridView var body: some View { VStack { - if case let .navigating(_, _, _, _, progress: progress, _, visualInstruction: visualInstruction, - _) = navigationState?.tripState, - let visualInstruction - { + if case .navigating = navigationState?.tripState, + let visualInstruction = navigationState?.currentVisualInstruction, + let progress = navigationState?.currentProgress { InstructionsView( visualInstruction: visualInstruction, distanceFormatter: formatterCollection.distanceFormatter, @@ -81,7 +80,8 @@ struct PortraitNavigationOverlayView: View, CustomizableNavigatingInnerGridView } .padding(.horizontal, 16) - if case let .navigating(_, _, _, _, progress: progress, _, _, _) = navigationState?.tripState { + if case .navigating = navigationState?.tripState, + let progress = navigationState?.currentProgress { ArrivalView( progress: progress, onTapExit: onTapExit diff --git a/apple/Sources/FerrostarMapLibreUI/Views/PortraitNavigationView.swift b/apple/Sources/FerrostarMapLibreUI/Views/PortraitNavigationView.swift index 1b6a29af..ed12ed90 100644 --- a/apple/Sources/FerrostarMapLibreUI/Views/PortraitNavigationView.swift +++ b/apple/Sources/FerrostarMapLibreUI/Views/PortraitNavigationView.swift @@ -104,7 +104,7 @@ public struct PortraitNavigationView: View, CustomizableNavigatingInnerGridView formatter.locale = Locale(identifier: "en-US") formatter.units = .imperial - guard case let .navigating(_, snappedUserLocation: userLocation, _, _, _, _, _, _) = state.tripState else { + guard case let .navigating(_, snappedUserLocation: userLocation, _, _, _, _, _, _, _) = state.tripState else { return EmptyView() } @@ -124,7 +124,7 @@ public struct PortraitNavigationView: View, CustomizableNavigatingInnerGridView formatter.locale = Locale(identifier: "en-US") formatter.units = .metric - guard case let .navigating(_, snappedUserLocation: userLocation, _, _, _, _, _, _) = state.tripState else { + guard case let .navigating(_, snappedUserLocation: userLocation, _, _, _, _, _, _, _) = state.tripState else { return EmptyView() } diff --git a/apple/Sources/UniFFI/ferrostar.swift b/apple/Sources/UniFFI/ferrostar.swift index c05264f9..76d2a7d7 100644 --- a/apple/Sources/UniFFI/ferrostar.swift +++ b/apple/Sources/UniFFI/ferrostar.swift @@ -1913,6 +1913,9 @@ public func FfiConverterTypeRoute_lower(_ value: Route) -> RustBuffer { * the next step. */ public struct RouteStep { + /** + * The full route geometry for this step. + */ public var geometry: [GeographicCoordinate] /** * The distance, in meters, to travel along the route after the maneuver to reach the next step. @@ -1942,33 +1945,43 @@ public struct RouteStep { * A list of prompts to announce (via speech synthesis) at specific points along the step. */ public var spokenInstructions: [SpokenInstruction] + /** + * A list of json attribute objects as a byte array. + */ + public var annotations: [Data]? // Default memberwise initializers are never public by default, so we // declare one manually. - public init(geometry: [GeographicCoordinate], - /** - * The distance, in meters, to travel along the route after the maneuver to reach the next step. - */ distance: Double, - /** - * The estimated duration, in seconds, that it will take to complete this step. - */ duration: Double, - /** - * The name of the road being traveled on (useful for certain UI styles). - */ roadName: String?, - /** - * A description of the maneuver (ex: "Turn wright onto main street"). - * - * Note for UI implementers: the context this appears in (or doesn't) - * depends somewhat on your use case and routing engine. - * For example, this field is useful as a written instruction in Valhalla. - */ instruction: String, - /** - * A list of instructions for visual display (usually as banners) at specific points along the step. - */ visualInstructions: [VisualInstruction], - /** - * A list of prompts to announce (via speech synthesis) at specific points along the step. - */ spokenInstructions: [SpokenInstruction]) - { + public init( + /** + * The full route geometry for this step. + */ geometry: [GeographicCoordinate], + /** + * The distance, in meters, to travel along the route after the maneuver to reach the next step. + */ distance: Double, + /** + * The estimated duration, in seconds, that it will take to complete this step. + */ duration: Double, + /** + * The name of the road being traveled on (useful for certain UI styles). + */ roadName: String?, + /** + * A description of the maneuver (ex: "Turn wright onto main street"). + * + * Note for UI implementers: the context this appears in (or doesn't) + * depends somewhat on your use case and routing engine. + * For example, this field is useful as a written instruction in Valhalla. + */ instruction: String, + /** + * A list of instructions for visual display (usually as banners) at specific points along the step. + */ visualInstructions: [VisualInstruction], + /** + * A list of prompts to announce (via speech synthesis) at specific points along the step. + */ spokenInstructions: [SpokenInstruction], + /** + * A list of json attribute objects as a byte array. + */ annotations: [Data]? + ) { self.geometry = geometry self.distance = distance self.duration = duration @@ -1976,6 +1989,7 @@ public struct RouteStep { self.instruction = instruction self.visualInstructions = visualInstructions self.spokenInstructions = spokenInstructions + self.annotations = annotations } } @@ -2002,6 +2016,9 @@ extension RouteStep: Equatable, Hashable { if lhs.spokenInstructions != rhs.spokenInstructions { return false } + if lhs.annotations != rhs.annotations { + return false + } return true } @@ -2013,6 +2030,7 @@ extension RouteStep: Equatable, Hashable { hasher.combine(instruction) hasher.combine(visualInstructions) hasher.combine(spokenInstructions) + hasher.combine(annotations) } } @@ -2025,7 +2043,8 @@ public struct FfiConverterTypeRouteStep: FfiConverterRustBuffer { roadName: FfiConverterOptionString.read(from: &buf), instruction: FfiConverterString.read(from: &buf), visualInstructions: FfiConverterSequenceTypeVisualInstruction.read(from: &buf), - spokenInstructions: FfiConverterSequenceTypeSpokenInstruction.read(from: &buf) + spokenInstructions: FfiConverterSequenceTypeSpokenInstruction.read(from: &buf), + annotations: FfiConverterOptionSequenceData.read(from: &buf) ) } @@ -2037,6 +2056,7 @@ public struct FfiConverterTypeRouteStep: FfiConverterRustBuffer { FfiConverterString.write(value.instruction, into: &buf) FfiConverterSequenceTypeVisualInstruction.write(value.visualInstructions, into: &buf) FfiConverterSequenceTypeSpokenInstruction.write(value.spokenInstructions, into: &buf) + FfiConverterOptionSequenceData.write(value.annotations, into: &buf) } } @@ -3464,7 +3484,11 @@ public enum TripState { * The most recent spoken instruction that should be synthesized using TTS. * * Note it is the responsibility of the platform layer to ensure that utterances are not synthesized multiple times. This property simply reports the current spoken instruction. - */ spokenInstruction: SpokenInstruction? + */ spokenInstruction: SpokenInstruction?, + /** + * Annotation data at the current location. + * This is represented as a json formatted byte array to allow for flexible encoding of custom annotations. + */ annotationBytes: Data? ) /** * The navigation controller has reached the end of the trip. @@ -3488,7 +3512,8 @@ public struct FfiConverterTypeTripState: FfiConverterRustBuffer { progress: FfiConverterTypeTripProgress.read(from: &buf), deviation: FfiConverterTypeRouteDeviation.read(from: &buf), visualInstruction: FfiConverterOptionTypeVisualInstruction.read(from: &buf), - spokenInstruction: FfiConverterOptionTypeSpokenInstruction.read(from: &buf) + spokenInstruction: FfiConverterOptionTypeSpokenInstruction.read(from: &buf), + annotationBytes: FfiConverterOptionData.read(from: &buf) ) case 3: return .complete @@ -3510,7 +3535,8 @@ public struct FfiConverterTypeTripState: FfiConverterRustBuffer { progress, deviation, visualInstruction, - spokenInstruction + spokenInstruction, + annotationBytes ): writeInt(&buf, Int32(2)) FfiConverterOptionUInt64.write(currentStepGeometryIndex, into: &buf) @@ -3521,6 +3547,7 @@ public struct FfiConverterTypeTripState: FfiConverterRustBuffer { FfiConverterTypeRouteDeviation.write(deviation, into: &buf) FfiConverterOptionTypeVisualInstruction.write(visualInstruction, into: &buf) FfiConverterOptionTypeSpokenInstruction.write(spokenInstruction, into: &buf) + FfiConverterOptionData.write(annotationBytes, into: &buf) case .complete: writeInt(&buf, Int32(3)) @@ -3676,6 +3703,27 @@ private struct FfiConverterOptionString: FfiConverterRustBuffer { } } +private struct FfiConverterOptionData: FfiConverterRustBuffer { + typealias SwiftType = Data? + + public static func write(_ value: SwiftType, into buf: inout [UInt8]) { + guard let value else { + writeInt(&buf, Int8(0)) + return + } + writeInt(&buf, Int8(1)) + FfiConverterData.write(value, into: &buf) + } + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> SwiftType { + switch try readInt(&buf) as Int8 { + case 0: return nil + case 1: return try FfiConverterData.read(from: &buf) + default: throw UniffiInternalError.unexpectedOptionalTag + } + } +} + private struct FfiConverterOptionTypeCourseOverGround: FfiConverterRustBuffer { typealias SwiftType = CourseOverGround? @@ -3823,6 +3871,49 @@ private struct FfiConverterOptionTypeManeuverType: FfiConverterRustBuffer { } } +private struct FfiConverterOptionSequenceData: FfiConverterRustBuffer { + typealias SwiftType = [Data]? + + public static func write(_ value: SwiftType, into buf: inout [UInt8]) { + guard let value else { + writeInt(&buf, Int8(0)) + return + } + writeInt(&buf, Int8(1)) + FfiConverterSequenceData.write(value, into: &buf) + } + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> SwiftType { + switch try readInt(&buf) as Int8 { + case 0: return nil + case 1: return try FfiConverterSequenceData.read(from: &buf) + default: throw UniffiInternalError.unexpectedOptionalTag + } + } +} + +private struct FfiConverterSequenceData: FfiConverterRustBuffer { + typealias SwiftType = [Data] + + public static func write(_ value: [Data], into buf: inout [UInt8]) { + let len = Int32(value.count) + writeInt(&buf, len) + for item in value { + FfiConverterData.write(item, into: &buf) + } + } + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> [Data] { + let len: Int32 = try readInt(&buf) + var seq = [Data]() + seq.reserveCapacity(Int(len)) + for _ in 0 ..< len { + try seq.append(FfiConverterData.read(from: &buf)) + } + return seq + } +} + private struct FfiConverterSequenceTypeGeographicCoordinate: FfiConverterRustBuffer { typealias SwiftType = [GeographicCoordinate] diff --git a/common/Cargo.lock b/common/Cargo.lock index 3933ac31..09a8b7b2 100644 --- a/common/Cargo.lock +++ b/common/Cargo.lock @@ -313,7 +313,7 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79127ed59a85d7687c409e9978547cffb7dc79675355ed22da6b66fd5f6ead01" dependencies = [ - "itertools", + "itertools 0.11.0", "num-traits", ] @@ -337,12 +337,13 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "ferrostar" -version = "0.12.0" +version = "0.13.0" dependencies = [ "assert-json-diff", "geo", "getrandom", "insta", + "itertools 0.13.0", "polyline", "proptest", "rstest", @@ -608,6 +609,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.11" diff --git a/common/ferrostar/Cargo.toml b/common/ferrostar/Cargo.toml index 797d2211..5ae289be 100644 --- a/common/ferrostar/Cargo.toml +++ b/common/ferrostar/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "ferrostar" -version = "0.12.0" +version = "0.13.0" readme = "README.md" description = "The core of modern turn-by-turn navigation." keywords = ["navigation", "routing", "valhalla", "osrm"] @@ -39,6 +39,7 @@ uuid = { version = "1.10.0", features = ["v4", "serde"] } getrandom = { version = "0.2.15", optional = true } wasm-bindgen = { version = "0.2.93", optional = true } web-time = { version = "1.1.0", features = ["serde"], optional = true } +itertools = "0.13.0" [build-dependencies] uniffi = { workspace = true, features = ["build"] } diff --git a/common/ferrostar/src/algorithms.rs b/common/ferrostar/src/algorithms.rs index a4639293..bdbb8f4c 100644 --- a/common/ferrostar/src/algorithms.rs +++ b/common/ferrostar/src/algorithms.rs @@ -487,6 +487,17 @@ pub(crate) fn get_linestring(geometry: &[GeographicCoordinate]) -> LineString { .collect() } +/// Get a slice of an array that matches the contents of another slice. +pub fn slice_indexes(array: Vec, slice: Vec) -> Option<(usize, usize)> +where + T: PartialEq, +{ + // Find the starting position of the slice in the array + array.windows(slice.len()) + .position(|window| window == slice) + .map(|start| (start, start + slice.len())) +} + #[cfg(test)] /// Creates a user location at the given coordinates, /// with all other values set to defaults or (in the case of the timestamp), the current time. diff --git a/common/ferrostar/src/models.rs b/common/ferrostar/src/models.rs index bb1504a4..90e298c5 100644 --- a/common/ferrostar/src/models.rs +++ b/common/ferrostar/src/models.rs @@ -252,12 +252,6 @@ pub struct Route { pub steps: Vec, } -impl Route { - pub(crate) fn get_linestring(&self) -> LineString { - get_linestring(&self.geometry) - } -} - /// Helper function for getting the route as an encoded polyline. /// /// Mostly used for debugging. @@ -278,6 +272,7 @@ fn get_route_polyline(route: &Route, precision: u32) -> Result, /// The distance, in meters, to travel along the route after the maneuver to reach the next step. pub distance: f64, @@ -295,6 +290,8 @@ pub struct RouteStep { pub visual_instructions: Vec, /// A list of prompts to announce (via speech synthesis) at specific points along the step. pub spoken_instructions: Vec, + /// A list of json attribute objects as a byte array. + pub annotations: Option>>, } impl RouteStep { @@ -337,6 +334,23 @@ impl RouteStep { distance_to_end_of_step - instruction.trigger_distance_before_maneuver <= 5.0 }) } + + /// Get the annotation data at a specific point along the step. + /// + /// `at_coordinate_index` is the index of the coordinate in the step geometry. + pub fn get_current_annotation_json(&self, at_coordinate_index: u64) -> Option> { + match &self.annotations { + None => return None, + Some(annotations) => { + if at_coordinate_index as usize >= annotations.len() { + panic!("Index {at_coordinate_index} out of bounds for annotations"); + } + + let annotation = annotations[at_coordinate_index as usize].clone(); + return Some(annotation); + } + } + } } /// An instruction that can be synthesized using a TTS engine to announce an upcoming maneuver. diff --git a/common/ferrostar/src/navigation_controller/mod.rs b/common/ferrostar/src/navigation_controller/mod.rs index bd47699b..ae314c62 100644 --- a/common/ferrostar/src/navigation_controller/mod.rs +++ b/common/ferrostar/src/navigation_controller/mod.rs @@ -68,6 +68,11 @@ impl NavigationController { let spoken_instruction = current_route_step .get_current_spoken_instruction(progress.distance_to_next_maneuver) .cloned(); + let annotation_bytes = if let Some(current_index) = current_step_geometry_index { + current_route_step.get_current_annotation_json(current_index) + } else { + None + }; TripState::Navigating { current_step_geometry_index, @@ -79,6 +84,7 @@ impl NavigationController { deviation, visual_instruction, spoken_instruction, + annotation_bytes, } } @@ -145,6 +151,12 @@ impl NavigationController { let spoken_instruction = current_step .get_current_spoken_instruction(progress.distance_to_next_maneuver) .cloned(); + let annotation_bytes = + if let Some(at_coordinate_index) = current_step_geometry_index { + current_step.get_current_annotation_json(*at_coordinate_index) + } else { + None + }; TripState::Navigating { current_step_geometry_index: *current_step_geometry_index, @@ -157,6 +169,7 @@ impl NavigationController { deviation: *deviation, visual_instruction, spoken_instruction, + annotation_bytes, } } StepAdvanceStatus::EndOfRoute => TripState::Complete, @@ -183,6 +196,7 @@ impl NavigationController { deviation, visual_instruction, spoken_instruction, + annotation_bytes, .. } => { let Some(current_step) = remaining_steps.first() else { @@ -212,6 +226,7 @@ impl NavigationController { deviation: *deviation, visual_instruction: visual_instruction.clone(), spoken_instruction: spoken_instruction.clone(), + annotation_bytes: annotation_bytes.clone(), }; match if should_advance_to_next_step( @@ -237,6 +252,7 @@ impl NavigationController { deviation: _, visual_instruction: _, spoken_instruction: _, + annotation_bytes: _, } => { // Recalculate deviation. This happens later, as the current step may have changed. // The distance to the next maneuver will be updated by advance_to_next_step if needed. @@ -256,6 +272,13 @@ impl NavigationController { .get_current_spoken_instruction(progress.distance_to_next_maneuver) .cloned(); + let annotation_bytes = + if let Some(at_coordinate_index) = current_step_geometry_index { + current_step.get_current_annotation_json(at_coordinate_index) + } else { + None + }; + TripState::Navigating { current_step_geometry_index, snapped_user_location, @@ -265,6 +288,7 @@ impl NavigationController { deviation, visual_instruction, spoken_instruction, + annotation_bytes, } } TripState::Complete => TripState::Complete, diff --git a/common/ferrostar/src/navigation_controller/models.rs b/common/ferrostar/src/navigation_controller/models.rs index 30793dcc..d7ba1f94 100644 --- a/common/ferrostar/src/navigation_controller/models.rs +++ b/common/ferrostar/src/navigation_controller/models.rs @@ -6,7 +6,7 @@ use crate::models::{RouteStep, SpokenInstruction, UserLocation, VisualInstructio use alloc::vec::Vec; use geo::LineString; #[cfg(feature = "wasm-bindgen")] -use serde::{Deserialize, Serialize}; +use serde::Deserialize; /// High-level state describing progress through a route. #[derive(Debug, Clone, PartialEq)] @@ -65,6 +65,9 @@ pub enum TripState { /// /// Note it is the responsibility of the platform layer to ensure that utterances are not synthesized multiple times. This property simply reports the current spoken instruction. spoken_instruction: Option, + /// Annotation data at the current location. + /// This is represented as a json formatted byte array to allow for flexible encoding of custom annotations. + annotation_bytes: Option>, }, /// The navigation controller has reached the end of the trip. Complete, diff --git a/common/ferrostar/src/navigation_controller/test_helpers.rs b/common/ferrostar/src/navigation_controller/test_helpers.rs index 980607d7..fd89e4d1 100644 --- a/common/ferrostar/src/navigation_controller/test_helpers.rs +++ b/common/ferrostar/src/navigation_controller/test_helpers.rs @@ -30,6 +30,7 @@ pub fn gen_dummy_route_step( instruction: "".to_string(), visual_instructions: vec![], spoken_instructions: vec![], + annotations: None, } } diff --git a/common/ferrostar/src/routing_adapters/algorithms.rs b/common/ferrostar/src/routing_adapters/algorithms.rs new file mode 100644 index 00000000..97dccb8b --- /dev/null +++ b/common/ferrostar/src/routing_adapters/algorithms.rs @@ -0,0 +1,26 @@ +use polyline::decode_polyline; + +use crate::models::GeographicCoordinate; + +use super::error::ParsingError; + +/// Parse a polyline-encoded geometry string into a list of geographic coordinates. +/// If the polyline cannot be decoded, a [ParsingError] results. +pub fn get_coordinates_from_geometry( + geometry: &String, + polyline_precision: u32, +) -> Result, ParsingError> { + let linestring = decode_polyline(geometry, polyline_precision).map_err(|error| { + ParsingError::ParseError { + error: error.to_string(), + } + })?; + + // TODO: Trait for this common pattern? + let linestring = linestring + .coords() + .map(|coord| GeographicCoordinate::from(*coord)) + .collect(); + + Ok(linestring) +} diff --git a/common/ferrostar/src/routing_adapters/mod.rs b/common/ferrostar/src/routing_adapters/mod.rs index ecf2fff9..7448b4e6 100644 --- a/common/ferrostar/src/routing_adapters/mod.rs +++ b/common/ferrostar/src/routing_adapters/mod.rs @@ -53,6 +53,7 @@ use alloc::{string::String, sync::Arc, vec::Vec}; use crate::routing_adapters::osrm::OsrmResponseParser; use crate::routing_adapters::valhalla::ValhallaHttpRequestGenerator; +pub mod algorithms; pub mod error; pub mod osrm; pub mod valhalla; diff --git a/common/ferrostar/src/routing_adapters/osrm/algorithms.rs b/common/ferrostar/src/routing_adapters/osrm/algorithms.rs new file mode 100644 index 00000000..995de8d9 --- /dev/null +++ b/common/ferrostar/src/routing_adapters/osrm/algorithms.rs @@ -0,0 +1,83 @@ +use super::models::{Annotation, AnnotationValue, MaxSpeed, MaxSpeedUnits}; +use itertools::izip; + +/// Get's he slice of annotations +pub fn get_annotation_slice( + start_index: usize, + end_index: usize, + annotations: Option>, +) -> Option> { + return if let Some(annotations) = &annotations { + let annot_len = annotations.len(); + + println!("Step Indexes: (start_index = {start_index}, end_index={end_index}, annotation.len: {annot_len})"); + + let slice = &annotations[start_index..end_index]; + Some(slice.to_vec()) + } else { + None + }; +} + +/// Converts all single value annotation vectors into a single vector of values. +pub fn zip_annotations(annotations: Annotation) -> Vec { + izip!( + annotations.distance, + annotations.duration, + annotations.max_speed, + annotations.speed + ) + .map(|(distance, duration, max_speed, speed)| AnnotationValue { + distance, + duration, + max_speed_mps: convert_max_speed_to_mps(max_speed), + speed_mps: speed, + }) + .collect() +} + +/// Converts a max speed value to meters per second. +pub fn convert_max_speed_to_mps(max_speed: MaxSpeed) -> Option { + match max_speed { + MaxSpeed::Known { speed, unit } => match unit { + MaxSpeedUnits::KilometersPerHour => return Some(speed * 0.27778), + MaxSpeedUnits::MilesPerHour => return Some(speed * 0.44704), + }, + #[allow(unused)] + MaxSpeed::Unknown { unknown } => return None, + } +} + +// TODO: Snapshot test a zip annotations test case. + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn test_max_speed_unknown() { + let max_speed = MaxSpeed::Unknown { unknown: true }; + assert_eq!(convert_max_speed_to_mps(max_speed), None); + } + + #[test] + fn test_max_speed_kph() { + let max_speed = MaxSpeed::Known { + speed: 100.0, + unit: MaxSpeedUnits::KilometersPerHour, + }; + assert_eq!( + convert_max_speed_to_mps(max_speed), + Some(27.778000000000002) + ); + } + + #[test] + fn test_max_speed_mph() { + let max_speed = MaxSpeed::Known { + speed: 60.0, + unit: MaxSpeedUnits::MilesPerHour, + }; + assert_eq!(convert_max_speed_to_mps(max_speed), Some(26.8224)); + } +} diff --git a/common/ferrostar/src/routing_adapters/osrm/mod.rs b/common/ferrostar/src/routing_adapters/osrm/mod.rs index 040348b8..3ddb3ffb 100644 --- a/common/ferrostar/src/routing_adapters/osrm/mod.rs +++ b/common/ferrostar/src/routing_adapters/osrm/mod.rs @@ -1,5 +1,6 @@ //! Response parsing for OSRM-compatible JSON (including Stadia Maps, Valhalla, Mapbox, etc.). +pub(crate) mod algorithms; pub(crate) mod models; use super::RouteResponseParser; @@ -7,12 +8,15 @@ use crate::models::{ GeographicCoordinate, RouteStep, SpokenInstruction, VisualInstruction, VisualInstructionContent, Waypoint, WaypointKind, }; +use crate::routing_adapters::algorithms::get_coordinates_from_geometry; use crate::routing_adapters::{ osrm::models::{ - Route as OsrmRoute, RouteResponse, RouteStep as OsrmRouteStep, Waypoint as OsrmWaypoint, + AnnotationValue, Route as OsrmRoute, RouteResponse, RouteStep as OsrmRouteStep, + Waypoint as OsrmWaypoint, }, ParsingError, Route, }; +use algorithms::get_annotation_slice; #[cfg(all(not(feature = "std"), feature = "alloc"))] use alloc::{string::ToString, vec, vec::Vec}; use geo::BoundingRect; @@ -83,20 +87,52 @@ impl Route { } })?; if let Some(bbox) = linestring.bounding_rect() { - let geometry = linestring + let geometry: Vec = linestring .coords() .map(|coord| GeographicCoordinate::from(*coord)) .collect(); + println!("Route geometry length: {}", geometry.len()); + let steps = route .legs .iter() .flat_map(|leg| { - leg.steps - .iter() - .map(|step| RouteStep::from_osrm(step, polyline_precision)) + // Converts all single value annotation vectors into a single vector witih a value object. + let annotations = if let Some(leg_annotation) = &leg.annotation { + Some(algorithms::zip_annotations(leg_annotation.clone())) + } else { + None + }; + + // Index for the annotations slice + let mut start_index: usize = 0; + + return leg.steps.iter().map(move |step| { + let step_geometry = + get_coordinates_from_geometry(&step.geometry, polyline_precision)?; + + // Slice the annotations for the current step. The annotations array represents segments between coordinates + // and is thus one element shorter than the geometry array. To account for this, we need to subtract 2 from + // the length of the geometry array on each step (one to account for the 0-based index, and one to account + // for the length difference). + let step_index_len = step_geometry.len() - 2 as usize; + let end_index = start_index + step_index_len; + + let annotation_slice = + get_annotation_slice(start_index, end_index, annotations.clone()); + + start_index = end_index; + + return RouteStep::from_osrm_and_geom( + &step, + step_geometry, + annotation_slice, + ); + }); }) .collect::, _>>()?; + Ok(Route { geometry, bbox: bbox.into(), @@ -113,18 +149,11 @@ impl Route { } impl RouteStep { - fn from_osrm(value: &OsrmRouteStep, polyline_precision: u32) -> Result { - let linestring = decode_polyline(&value.geometry, polyline_precision).map_err(|error| { - ParsingError::ParseError { - error: error.to_string(), - } - })?; - // TODO: Trait for this common pattern? - let geometry = linestring - .coords() - .map(|coord| GeographicCoordinate::from(*coord)) - .collect(); - + fn from_osrm_and_geom( + value: &OsrmRouteStep, + geometry: Vec, + annotations: Option>, + ) -> Result { let visual_instructions = value .banner_instructions .iter() @@ -158,6 +187,22 @@ impl RouteStep { }) .collect(); + // Convert the annotations to a vectory of json byte objects. + // The host platform can then parse an arbitrary annotation object. + let annotations_as_bytes = if let Some(annotations) = annotations { + let mapped: Result>, ParsingError> = annotations + .iter() + .map(|annotation| { + serde_json::to_vec(annotation).map_err(|e| ParsingError::ParseError { + error: e.to_string(), + }) + }) + .collect(); + Some(mapped?) + } else { + None + }; + Ok(RouteStep { geometry, // TODO: Investigate using the haversine distance or geodesics to normalize. @@ -168,6 +213,7 @@ impl RouteStep { instruction: value.maneuver.get_instruction(), visual_instructions, spoken_instructions, + annotations: annotations_as_bytes, }) } } diff --git a/common/ferrostar/src/routing_adapters/osrm/models.rs b/common/ferrostar/src/routing_adapters/osrm/models.rs index c735451e..b1dbdc77 100644 --- a/common/ferrostar/src/routing_adapters/osrm/models.rs +++ b/common/ferrostar/src/routing_adapters/osrm/models.rs @@ -7,7 +7,7 @@ use crate::models::{ManeuverModifier, ManeuverType}; #[cfg(feature = "alloc")] use alloc::{string::String, vec::Vec}; -use serde::Deserialize; +use serde::{Deserialize, Serialize}; #[derive(Deserialize, Debug)] #[serde(transparent)] @@ -68,7 +68,7 @@ pub struct RouteLeg { } /// An annotation of a route leg with fine-grained information about segments or nodes. -#[derive(Deserialize, Debug)] +#[derive(Deserialize, Debug, Clone)] pub struct Annotation { /// The duration between each pair of coordinates, in seconds. pub duration: Vec, @@ -87,14 +87,40 @@ pub struct Annotation { /// NOTE: This annotation is not in the official spec, but is a common extension used by Mapbox /// and Valhalla. #[serde(default, rename = "maxspeed")] - #[allow(dead_code)] - max_speed: Vec, + pub max_speed: Vec, +} + +/// A flattened OSRM flavored annotation object. +/// This represents the value for each annotation type and is typically surfaced for each +/// geometry segment. +#[derive(Serialize, Debug, Clone, PartialEq)] +pub struct AnnotationValue { + pub distance: f64, + pub duration: f64, + /// The speed limit for this geometry segment in meters per second. + /// If the speed limit is unknown, this will be `None`. + pub max_speed_mps: Option, + /// The expected travel speed. + pub speed_mps: f64, +} + +/// The MaxSpeed units that can be associated with annotations. +/// [MaxSpeed/Units](https://wiki.openstreetmap.org/wiki/Map_Features/Units#Speed) +/// TODO: We could generalize this as or map from this to a `UnitSpeed` enum. +#[derive(Deserialize, PartialEq, Debug, Clone)] +pub enum MaxSpeedUnits { + #[serde(rename = "km/h")] + KilometersPerHour, + #[serde(rename = "mph")] + MilesPerHour, } /// The local posted speed limit between a pair of coordinates. -#[derive(Deserialize, Debug)] -pub struct MaxSpeed { - // TODO +#[derive(Deserialize, Debug, Clone)] +#[serde(untagged)] +pub enum MaxSpeed { + Unknown { unknown: bool }, + Known { speed: f64, unit: MaxSpeedUnits }, } #[derive(Deserialize, Debug)] diff --git a/common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__tests__parse_valhalla_osrm.snap.new b/common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__tests__parse_valhalla_osrm.snap.new new file mode 100644 index 00000000..cfb15f05 --- /dev/null +++ b/common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__tests__parse_valhalla_osrm.snap.new @@ -0,0 +1,9356 @@ +--- +source: ferrostar/src/routing_adapters/osrm/mod.rs +assertion_line: 244 +expression: routes +--- +- geometry: + - lat: 59.442643 + lng: 24.765368 + - lat: 59.442644 + lng: 24.765372 + - lat: 59.442596 + lng: 24.765043 + - lat: 59.442597 + lng: 24.764917 + - lat: 59.442617 + lng: 24.764716 + - lat: 59.442739 + lng: 24.763568 + - lat: 59.442754 + lng: 24.763449 + - lat: 59.442671 + lng: 24.763423 + - lat: 59.442709 + lng: 24.763155 + - lat: 59.442749 + lng: 24.763063 + - lat: 59.442819 + lng: 24.763 + - lat: 59.442834 + lng: 24.762904 + - lat: 59.442841 + lng: 24.762858 + - lat: 59.442918 + lng: 24.762356 + - lat: 59.442936 + lng: 24.762237 + - lat: 59.442957 + lng: 24.762218 + - lat: 59.443129 + lng: 24.762072 + - lat: 59.443156 + lng: 24.762052 + - lat: 59.443526 + lng: 24.761765 + - lat: 59.443564 + lng: 24.761733 + - lat: 59.4439 + lng: 24.761432 + - lat: 59.443487 + lng: 24.759273 + - lat: 59.443533 + lng: 24.759243 + - lat: 59.443622 + lng: 24.759185 + - lat: 59.44365 + lng: 24.759167 + - lat: 59.443712 + lng: 24.759127 + - lat: 59.443701 + lng: 24.759061 + - lat: 59.443693 + lng: 24.759007 + - lat: 59.443674 + lng: 24.758853 + - lat: 59.443719 + lng: 24.758831 + - lat: 59.443739 + lng: 24.758825 + - lat: 59.443824 + lng: 24.758783 + - lat: 59.444002 + lng: 24.75869 + - lat: 59.444052 + lng: 24.758636 + - lat: 59.444086 + lng: 24.75862 + - lat: 59.444176 + lng: 24.758576 + - lat: 59.444346 + lng: 24.75849 + - lat: 59.444417 + lng: 24.758402 + - lat: 59.444448 + lng: 24.758392 + - lat: 59.444431 + lng: 24.758246 + - lat: 59.444579 + lng: 24.75819 + - lat: 59.444893 + lng: 24.75805 + - lat: 59.444979 + lng: 24.757981 + - lat: 59.445069 + lng: 24.757636 + - lat: 59.444948 + lng: 24.754468 + - lat: 59.444939 + lng: 24.75424 + - lat: 59.444903 + lng: 24.753388 + - lat: 59.444898 + lng: 24.75326 + - lat: 59.44489 + lng: 24.753154 + - lat: 59.444855 + lng: 24.752151 + - lat: 59.444835 + lng: 24.751726 + - lat: 59.444834 + lng: 24.751684 + - lat: 59.444834 + lng: 24.751667 + - lat: 59.444833 + lng: 24.751609 + - lat: 59.444827 + lng: 24.7513 + - lat: 59.444829 + lng: 24.751265 + - lat: 59.444834 + lng: 24.751183 + - lat: 59.444849 + lng: 24.751063 + - lat: 59.444866 + lng: 24.750981 + - lat: 59.444899 + lng: 24.750819 + - lat: 59.444936 + lng: 24.750656 + - lat: 59.444991 + lng: 24.750416 + - lat: 59.444997 + lng: 24.750389 + - lat: 59.445137 + lng: 24.749787 + - lat: 59.445194 + lng: 24.749523 + - lat: 59.445282 + lng: 24.749169 + - lat: 59.445326 + lng: 24.74898 + - lat: 59.445314 + lng: 24.748832 + - lat: 59.445299 + lng: 24.748602 + - lat: 59.445294 + lng: 24.748497 + - lat: 59.445298 + lng: 24.748451 + - lat: 59.445335 + lng: 24.748365 + - lat: 59.445568 + lng: 24.747739 + - lat: 59.44562 + lng: 24.747619 + - lat: 59.44569 + lng: 24.747459 + - lat: 59.445773 + lng: 24.747265 + - lat: 59.445799 + lng: 24.747205 + - lat: 59.445869 + lng: 24.747082 + - lat: 59.445948 + lng: 24.746945 + - lat: 59.446119 + lng: 24.746691 + - lat: 59.44613 + lng: 24.746674 + - lat: 59.446266 + lng: 24.746516 + - lat: 59.446392 + lng: 24.746383 + - lat: 59.447073 + lng: 24.745802 + - lat: 59.447676 + lng: 24.745279 + - lat: 59.447848 + lng: 24.74511 + - lat: 59.448038 + lng: 24.744866 + - lat: 59.448255 + lng: 24.744526 + - lat: 59.448443 + lng: 24.744152 + - lat: 59.448527 + lng: 24.743973 + - lat: 59.448671 + lng: 24.743545 + - lat: 59.448768 + lng: 24.743184 + - lat: 59.448916 + lng: 24.742627 + - lat: 59.449029 + lng: 24.74203 + - lat: 59.449132 + lng: 24.741172 + - lat: 59.449157 + lng: 24.741044 + - lat: 59.449276 + lng: 24.740442 + - lat: 59.44946 + lng: 24.739543 + - lat: 59.449578 + lng: 24.73963 + - lat: 59.449652 + lng: 24.739675 + - lat: 59.449697 + lng: 24.739489 + - lat: 59.449733 + lng: 24.739454 + - lat: 59.449727 + lng: 24.739369 + - lat: 59.44975 + lng: 24.73924 + - lat: 59.449766 + lng: 24.739172 + - lat: 59.449773 + lng: 24.73913 + - lat: 59.449812 + lng: 24.739014 + - lat: 59.450009 + lng: 24.738034 + - lat: 59.450135 + lng: 24.737365 + - lat: 59.450207 + lng: 24.737042 + - lat: 59.450228 + lng: 24.736911 + - lat: 59.450277 + lng: 24.736613 + - lat: 59.450327 + lng: 24.736371 + - lat: 59.450403 + lng: 24.735904 + - lat: 59.450537 + lng: 24.735241 + - lat: 59.45058 + lng: 24.734953 + - lat: 59.450687 + lng: 24.734123 + - lat: 59.450703 + lng: 24.733977 + - lat: 59.45072 + lng: 24.73391 + - lat: 59.450751 + lng: 24.733895 + - lat: 59.450757 + lng: 24.733797 + - lat: 59.450765 + lng: 24.733721 + - lat: 59.450787 + lng: 24.733717 + - lat: 59.451083 + lng: 24.732819 + - lat: 59.451334 + lng: 24.732043 + - lat: 59.451338 + lng: 24.732015 + - lat: 59.451348 + lng: 24.731938 + - lat: 59.451372 + lng: 24.731837 + - lat: 59.451409 + lng: 24.73182 + - lat: 59.45143 + lng: 24.731764 + - lat: 59.45141 + lng: 24.731691 + - lat: 59.451419 + lng: 24.7316 + - lat: 59.451441 + lng: 24.731523 + - lat: 59.451503 + lng: 24.731316 + - lat: 59.451843 + lng: 24.73025 + - lat: 59.451886 + lng: 24.730235 + - lat: 59.451907 + lng: 24.730259 + - lat: 59.452026 + lng: 24.729829 + - lat: 59.452169 + lng: 24.729962 + - lat: 59.452226 + lng: 24.730034 + bbox: + sw: + lat: 59.442596 + lng: 24.729829 + ne: + lat: 59.452226 + lng: 24.765372 + distance: 2604.35 + waypoints: + - coordinate: + lat: 59.442643 + lng: 24.765368 + kind: Break + - coordinate: + lat: 59.452226 + lng: 24.730034 + kind: Break + steps: + - geometry: + - lat: 59.442643 + lng: 24.765368 + - lat: 59.442644 + lng: 24.765372 + - lat: 59.442596 + lng: 24.765043 + - lat: 59.442597 + lng: 24.764917 + - lat: 59.442617 + lng: 24.764716 + - lat: 59.442739 + lng: 24.763568 + - lat: 59.442754 + lng: 24.763449 + distance: 111.251 + duration: 90.107 + road_name: "" + instruction: Walk west on the walkway. + visual_instructions: + - primary_content: + text: Turn left onto the walkway. + maneuver_type: turn + maneuver_modifier: left + roundabout_exit_degrees: ~ + secondary_content: ~ + trigger_distance_before_maneuver: 111.251 + spoken_instructions: + - text: Walk west on the walkway. + ssml: "Walk west on the walkway." + trigger_distance_before_maneuver: 111.251 + - text: "In 200 feet, Turn left onto the walkway." + ssml: "In 200 feet, Turn left onto the walkway." + trigger_distance_before_maneuver: 60 + annotations: + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 48 + - 46 + - 50 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 48 + - 46 + - 49 + - 56 + - 52 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 51 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 57 + - 46 + - 52 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 53 + - 46 + - 51 + - 49 + - 53 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 51 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 55 + - 46 + - 49 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 53 + - 46 + - 54 + - 51 + - 57 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 51 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 49 + - 46 + - 54 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 57 + - 46 + - 56 + - 49 + - 56 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 50 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 54 + - 54 + - 46 + - 52 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 53 + - 49 + - 46 + - 53 + - 51 + - 57 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 51 + - 125 + - geometry: + - lat: 59.442754 + lng: 24.763449 + - lat: 59.442671 + lng: 24.763423 + distance: 9 + duration: 6.353 + road_name: "" + instruction: Turn left onto the walkway. + visual_instructions: + - primary_content: + text: Laeva + maneuver_type: turn + maneuver_modifier: right + roundabout_exit_degrees: ~ + secondary_content: ~ + trigger_distance_before_maneuver: 9 + spoken_instructions: + - text: "In 14 feet, Turn right onto Laeva." + ssml: "In 14 feet, Turn right onto Laeva." + trigger_distance_before_maneuver: 4.5 + annotations: [] + - geometry: + - lat: 59.442671 + lng: 24.763423 + - lat: 59.442709 + lng: 24.763155 + distance: 16 + duration: 12.424 + road_name: Laeva + instruction: Turn right onto Laeva. + visual_instructions: + - primary_content: + text: Bear right. + maneuver_type: turn + maneuver_modifier: slight right + roundabout_exit_degrees: ~ + secondary_content: ~ + trigger_distance_before_maneuver: 16 + spoken_instructions: + - text: "In 26 feet, Bear right." + ssml: "In 26 feet, Bear right." + trigger_distance_before_maneuver: 8 + annotations: [] + - geometry: + - lat: 59.442709 + lng: 24.763155 + - lat: 59.442749 + lng: 24.763063 + - lat: 59.442819 + lng: 24.763 + distance: 15 + duration: 11.224 + road_name: "" + instruction: Bear right. + visual_instructions: + - primary_content: + text: Bear left onto the walkway. + maneuver_type: turn + maneuver_modifier: slight left + roundabout_exit_degrees: ~ + secondary_content: ~ + trigger_distance_before_maneuver: 15 + spoken_instructions: + - text: "In 24 feet, Bear left onto the walkway." + ssml: "In 24 feet, Bear left onto the walkway." + trigger_distance_before_maneuver: 7.5 + annotations: + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 54 + - 46 + - 57 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 52 + - 46 + - 56 + - 57 + - 56 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - geometry: + - lat: 59.442819 + lng: 24.763 + - lat: 59.442834 + lng: 24.762904 + - lat: 59.442841 + lng: 24.762858 + - lat: 59.442918 + lng: 24.762356 + distance: 38 + duration: 26.824 + road_name: "" + instruction: Bear left onto the walkway. + visual_instructions: + - primary_content: + text: Continue. + maneuver_type: new name + maneuver_modifier: straight + roundabout_exit_degrees: ~ + secondary_content: ~ + trigger_distance_before_maneuver: 38 + spoken_instructions: + - text: "In 62 feet, Continue." + ssml: "In 62 feet, Continue." + trigger_distance_before_maneuver: 19 + annotations: + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 57 + - 46 + - 52 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 54 + - 46 + - 54 + - 48 + - 52 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 53 + - 46 + - 55 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 50 + - 46 + - 50 + - 50 + - 55 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 56 + - 46 + - 51 + - 51 + - 51 + - 52 + - 48 + - 48 + - 48 + - 48 + - 48 + - 48 + - 48 + - 48 + - 48 + - 48 + - 49 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 51 + - 125 + - geometry: + - lat: 59.442918 + lng: 24.762356 + - lat: 59.442936 + lng: 24.762237 + distance: 7 + duration: 4.941 + road_name: "" + instruction: Continue. + visual_instructions: + - primary_content: + text: Admiralisild; Admiral Bridge + maneuver_type: turn + maneuver_modifier: right + roundabout_exit_degrees: ~ + secondary_content: ~ + trigger_distance_before_maneuver: 7 + spoken_instructions: + - text: "In 11 feet, Turn right onto Admiralisild/Admiral Bridge." + ssml: "In 11 feet, Turn right onto Admiralisild/Admiral Bridge." + trigger_distance_before_maneuver: 3.5 + annotations: [] + - geometry: + - lat: 59.442936 + lng: 24.762237 + - lat: 59.442957 + lng: 24.762218 + - lat: 59.443129 + lng: 24.762072 + - lat: 59.443156 + lng: 24.762052 + - lat: 59.443526 + lng: 24.761765 + distance: 70 + duration: 52.275 + road_name: Admiralisild; Admiral Bridge + instruction: Turn right onto Admiralisild/Admiral Bridge. + visual_instructions: + - primary_content: + text: Continue on the walkway. + maneuver_type: new name + maneuver_modifier: straight + roundabout_exit_degrees: ~ + secondary_content: ~ + trigger_distance_before_maneuver: 70 + spoken_instructions: + - text: "In 200 feet, Continue on the walkway." + ssml: "In 200 feet, Continue on the walkway." + trigger_distance_before_maneuver: 60 + annotations: + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 54 + - 46 + - 57 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 53 + - 46 + - 49 + - 50 + - 55 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 51 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 56 + - 46 + - 54 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 54 + - 46 + - 52 + - 49 + - 50 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 51 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 53 + - 46 + - 55 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 52 + - 46 + - 48 + - 49 + - 50 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - geometry: + - lat: 59.443526 + lng: 24.761765 + - lat: 59.443564 + lng: 24.761733 + - lat: 59.4439 + lng: 24.761432 + distance: 46 + duration: 33.471 + road_name: "" + instruction: Continue on the walkway. + visual_instructions: + - primary_content: + text: Turn left onto the walkway. + maneuver_type: turn + maneuver_modifier: left + roundabout_exit_degrees: ~ + secondary_content: ~ + trigger_distance_before_maneuver: 46 + spoken_instructions: + - text: "In 75 feet, Turn left onto the walkway." + ssml: "In 75 feet, Turn left onto the walkway." + trigger_distance_before_maneuver: 23 + annotations: + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 46 + - 55 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 46 + - 57 + - 49 + - 57 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - geometry: + - lat: 59.4439 + lng: 24.761432 + - lat: 59.443487 + lng: 24.759273 + distance: 131 + duration: 101.718 + road_name: "" + instruction: Turn left onto the walkway. + visual_instructions: + - primary_content: + text: Turn right onto the walkway. + maneuver_type: turn + maneuver_modifier: right + roundabout_exit_degrees: ~ + secondary_content: ~ + trigger_distance_before_maneuver: 131 + spoken_instructions: + - text: "In 200 feet, Turn right onto the walkway." + ssml: "In 200 feet, Turn right onto the walkway." + trigger_distance_before_maneuver: 60 + annotations: [] + - geometry: + - lat: 59.443487 + lng: 24.759273 + - lat: 59.443533 + lng: 24.759243 + - lat: 59.443622 + lng: 24.759185 + - lat: 59.44365 + lng: 24.759167 + - lat: 59.443712 + lng: 24.759127 + distance: 25 + duration: 21.906 + road_name: "" + instruction: Turn right onto the walkway. + visual_instructions: + - primary_content: + text: Turn left onto the walkway. + maneuver_type: turn + maneuver_modifier: left + roundabout_exit_degrees: ~ + secondary_content: ~ + trigger_distance_before_maneuver: 25 + spoken_instructions: + - text: "In 41 feet, Turn left onto the walkway." + ssml: "In 41 feet, Turn left onto the walkway." + trigger_distance_before_maneuver: 12.5 + annotations: + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 57 + - 46 + - 55 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 50 + - 48 + - 46 + - 57 + - 52 + - 55 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 55 + - 46 + - 48 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 52 + - 46 + - 57 + - 54 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 46 + - 54 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 46 + - 56 + - 49 + - 53 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - geometry: + - lat: 59.443712 + lng: 24.759127 + - lat: 59.443701 + lng: 24.759061 + - lat: 59.443693 + lng: 24.759007 + - lat: 59.443674 + lng: 24.758853 + distance: 16 + duration: 12.294 + road_name: "" + instruction: Turn left onto the walkway. + visual_instructions: + - primary_content: + text: Logi + maneuver_type: turn + maneuver_modifier: right + roundabout_exit_degrees: ~ + secondary_content: ~ + trigger_distance_before_maneuver: 16 + spoken_instructions: + - text: "In 26 feet, Turn right onto Logi." + ssml: "In 26 feet, Turn right onto Logi." + trigger_distance_before_maneuver: 8 + annotations: + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 48 + - 46 + - 57 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 52 + - 46 + - 55 + - 50 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 51 + - 46 + - 50 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 50 + - 46 + - 50 + - 54 + - 55 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - geometry: + - lat: 59.443674 + lng: 24.758853 + - lat: 59.443719 + lng: 24.758831 + - lat: 59.443739 + lng: 24.758825 + - lat: 59.443824 + lng: 24.758783 + - lat: 59.444002 + lng: 24.75869 + - lat: 59.444052 + lng: 24.758636 + - lat: 59.444086 + lng: 24.75862 + - lat: 59.444176 + lng: 24.758576 + - lat: 59.444346 + lng: 24.75849 + - lat: 59.444417 + lng: 24.758402 + - lat: 59.444448 + lng: 24.758392 + distance: 91 + duration: 72.235 + road_name: Logi + instruction: Turn right onto Logi. + visual_instructions: + - primary_content: + text: Turn left onto the walkway. + maneuver_type: turn + maneuver_modifier: left + roundabout_exit_degrees: ~ + secondary_content: ~ + trigger_distance_before_maneuver: 91 + spoken_instructions: + - text: "In 200 feet, Turn left onto the walkway." + ssml: "In 200 feet, Turn left onto the walkway." + trigger_distance_before_maneuver: 60 + annotations: + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 52 + - 52 + - 46 + - 51 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 51 + - 51 + - 46 + - 49 + - 50 + - 56 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 51 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 52 + - 46 + - 54 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 51 + - 46 + - 50 + - 52 + - 56 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 52 + - 49 + - 46 + - 49 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 50 + - 57 + - 46 + - 48 + - 49 + - 50 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 51 + - 48 + - 46 + - 53 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 48 + - 49 + - 46 + - 51 + - 54 + - 55 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 51 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 53 + - 46 + - 52 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 51 + - 46 + - 56 + - 48 + - 56 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 48 + - 46 + - 52 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 56 + - 46 + - 56 + - 52 + - 49 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 50 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 51 + - 46 + - 51 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 50 + - 46 + - 53 + - 57 + - 50 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 51 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 55 + - 46 + - 51 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 53 + - 46 + - 55 + - 52 + - 50 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 51 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 51 + - 46 + - 57 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 50 + - 46 + - 55 + - 55 + - 52 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - geometry: + - lat: 59.444448 + lng: 24.758392 + - lat: 59.444431 + lng: 24.758246 + distance: 8 + duration: 5.647 + road_name: "" + instruction: Turn left onto the walkway. + visual_instructions: + - primary_content: + text: Turn right onto the walkway. + maneuver_type: turn + maneuver_modifier: right + roundabout_exit_degrees: ~ + secondary_content: ~ + trigger_distance_before_maneuver: 8 + spoken_instructions: + - text: "In 13 feet, Turn right onto the walkway." + ssml: "In 13 feet, Turn right onto the walkway." + trigger_distance_before_maneuver: 4 + annotations: [] + - geometry: + - lat: 59.444431 + lng: 24.758246 + - lat: 59.444579 + lng: 24.75819 + - lat: 59.444893 + lng: 24.75805 + - lat: 59.444979 + lng: 24.757981 + - lat: 59.445069 + lng: 24.757636 + distance: 85 + duration: 64.447 + road_name: "" + instruction: Turn right onto the walkway. + visual_instructions: + - primary_content: + text: Kultuurikilomeeter + maneuver_type: turn + maneuver_modifier: slight left + roundabout_exit_degrees: ~ + secondary_content: ~ + trigger_distance_before_maneuver: 85 + spoken_instructions: + - text: "In 200 feet, Bear left onto Kultuurikilomeeter." + ssml: "In 200 feet, Bear left onto Kultuurikilomeeter." + trigger_distance_before_maneuver: 60 + annotations: + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 51 + - 46 + - 50 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 50 + - 46 + - 50 + - 52 + - 55 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 57 + - 46 + - 48 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 54 + - 46 + - 51 + - 51 + - 49 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 53 + - 46 + - 50 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 51 + - 46 + - 54 + - 52 + - 51 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - geometry: + - lat: 59.445069 + lng: 24.757636 + - lat: 59.444948 + lng: 24.754468 + - lat: 59.444939 + lng: 24.75424 + - lat: 59.444903 + lng: 24.753388 + - lat: 59.444898 + lng: 24.75326 + - lat: 59.44489 + lng: 24.753154 + - lat: 59.444855 + lng: 24.752151 + - lat: 59.444835 + lng: 24.751726 + - lat: 59.444834 + lng: 24.751684 + - lat: 59.444834 + lng: 24.751667 + - lat: 59.444833 + lng: 24.751609 + - lat: 59.444827 + lng: 24.7513 + - lat: 59.444829 + lng: 24.751265 + - lat: 59.444834 + lng: 24.751183 + - lat: 59.444849 + lng: 24.751063 + - lat: 59.444866 + lng: 24.750981 + - lat: 59.444899 + lng: 24.750819 + - lat: 59.444936 + lng: 24.750656 + - lat: 59.444991 + lng: 24.750416 + - lat: 59.444997 + lng: 24.750389 + - lat: 59.445137 + lng: 24.749787 + - lat: 59.445194 + lng: 24.749523 + - lat: 59.445282 + lng: 24.749169 + - lat: 59.445326 + lng: 24.74898 + - lat: 59.445314 + lng: 24.748832 + - lat: 59.445299 + lng: 24.748602 + - lat: 59.445294 + lng: 24.748497 + - lat: 59.445298 + lng: 24.748451 + - lat: 59.445335 + lng: 24.748365 + - lat: 59.445568 + lng: 24.747739 + - lat: 59.44562 + lng: 24.747619 + - lat: 59.44569 + lng: 24.747459 + - lat: 59.445773 + lng: 24.747265 + - lat: 59.445799 + lng: 24.747205 + - lat: 59.445869 + lng: 24.747082 + - lat: 59.445948 + lng: 24.746945 + - lat: 59.446119 + lng: 24.746691 + - lat: 59.44613 + lng: 24.746674 + - lat: 59.446266 + lng: 24.746516 + - lat: 59.446392 + lng: 24.746383 + - lat: 59.447073 + lng: 24.745802 + - lat: 59.447676 + lng: 24.745279 + - lat: 59.447848 + lng: 24.74511 + - lat: 59.448038 + lng: 24.744866 + - lat: 59.448255 + lng: 24.744526 + - lat: 59.448443 + lng: 24.744152 + - lat: 59.448527 + lng: 24.743973 + - lat: 59.448671 + lng: 24.743545 + - lat: 59.448768 + lng: 24.743184 + - lat: 59.448916 + lng: 24.742627 + - lat: 59.449029 + lng: 24.74203 + - lat: 59.449132 + lng: 24.741172 + - lat: 59.449157 + lng: 24.741044 + - lat: 59.449276 + lng: 24.740442 + - lat: 59.44946 + lng: 24.739543 + distance: 1254 + duration: 966.424 + road_name: Kultuurikilomeeter + instruction: Bear left onto Kultuurikilomeeter. + visual_instructions: + - primary_content: + text: Turn right onto the walkway. + maneuver_type: turn + maneuver_modifier: right + roundabout_exit_degrees: ~ + secondary_content: ~ + trigger_distance_before_maneuver: 1254 + spoken_instructions: + - text: "In 200 feet, Turn right onto the walkway." + ssml: "In 200 feet, Turn right onto the walkway." + trigger_distance_before_maneuver: 60 + annotations: + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 46 + - 51 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 46 + - 53 + - 56 + - 57 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 57 + - 46 + - 56 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 54 + - 46 + - 56 + - 56 + - 55 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 48 + - 46 + - 53 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 52 + - 46 + - 52 + - 55 + - 50 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 54 + - 46 + - 52 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 52 + - 46 + - 52 + - 56 + - 50 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 51 + - 46 + - 57 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 50 + - 46 + - 55 + - 52 + - 55 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 48 + - 46 + - 51 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 55 + - 46 + - 50 + - 56 + - 56 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 57 + - 46 + - 53 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 51 + - 46 + - 55 + - 57 + - 51 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 57 + - 46 + - 51 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 54 + - 46 + - 53 + - 57 + - 52 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 51 + - 46 + - 53 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 50 + - 46 + - 52 + - 54 + - 57 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 56 + - 46 + - 53 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 53 + - 46 + - 57 + - 56 + - 51 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 54 + - 46 + - 56 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 51 + - 46 + - 48 + - 50 + - 55 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 51 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 51 + - 53 + - 46 + - 56 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 50 + - 55 + - 46 + - 56 + - 51 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 51 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 48 + - 46 + - 51 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 56 + - 46 + - 48 + - 50 + - 56 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 51 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 49 + - 46 + - 57 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 53 + - 46 + - 52 + - 57 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 55 + - 57 + - 46 + - 56 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 50 + - 54 + - 46 + - 57 + - 48 + - 56 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 50 + - 46 + - 57 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 50 + - 46 + - 49 + - 53 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 49 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 52 + - 56 + - 46 + - 52 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 51 + - 52 + - 46 + - 49 + - 53 + - 50 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 55 + - 46 + - 51 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 53 + - 46 + - 49 + - 50 + - 57 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 54 + - 46 + - 49 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 52 + - 46 + - 50 + - 56 + - 49 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 53 + - 54 + - 46 + - 57 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 52 + - 50 + - 46 + - 53 + - 55 + - 49 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 51 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 52 + - 46 + - 50 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 56 + - 46 + - 48 + - 55 + - 51 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 51 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 46 + - 52 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 46 + - 55 + - 56 + - 49 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 51 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 46 + - 48 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 48 + - 46 + - 54 + - 56 + - 49 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 51 + - 46 + - 51 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 50 + - 46 + - 51 + - 49 + - 56 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 55 + - 46 + - 53 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 55 + - 46 + - 54 + - 54 + - 52 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 48 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 46 + - 48 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 50 + - 46 + - 48 + - 49 + - 50 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 48 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 52 + - 46 + - 55 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 52 + - 46 + - 55 + - 49 + - 55 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 48 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 55 + - 46 + - 48 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 55 + - 46 + - 48 + - 53 + - 57 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 48 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 53 + - 46 + - 48 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 53 + - 46 + - 48 + - 53 + - 56 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 48 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 57 + - 46 + - 57 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 55 + - 46 + - 54 + - 54 + - 57 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 51 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 48 + - 46 + - 49 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 55 + - 46 + - 56 + - 52 + - 52 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 51 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 52 + - 46 + - 57 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 48 + - 46 + - 53 + - 49 + - 54 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 46 + - 55 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 46 + - 49 + - 55 + - 55 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 51 + - 55 + - 46 + - 53 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 50 + - 54 + - 46 + - 52 + - 52 + - 53 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 54 + - 46 + - 50 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 49 + - 46 + - 52 + - 53 + - 56 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 50 + - 46 + - 51 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 53 + - 46 + - 55 + - 52 + - 49 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 49 + - 46 + - 56 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 56 + - 46 + - 51 + - 48 + - 52 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 56 + - 46 + - 53 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 53 + - 46 + - 57 + - 56 + - 55 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 51 + - 46 + - 49 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 51 + - 46 + - 50 + - 52 + - 54 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 48 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 54 + - 46 + - 48 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 52 + - 46 + - 50 + - 49 + - 51 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 46 + - 54 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 46 + - 56 + - 54 + - 52 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 54 + - 46 + - 52 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 52 + - 46 + - 55 + - 55 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 51 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 52 + - 51 + - 46 + - 57 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 51 + - 50 + - 46 + - 56 + - 53 + - 50 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 51 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 56 + - 46 + - 57 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 54 + - 46 + - 54 + - 55 + - 55 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 51 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 49 + - 46 + - 57 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 56 + - 46 + - 57 + - 51 + - 56 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 51 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 52 + - 46 + - 51 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 48 + - 46 + - 55 + - 51 + - 55 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 51 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 52 + - 46 + - 53 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 51 + - 46 + - 51 + - 51 + - 57 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 51 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 48 + - 46 + - 52 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 55 + - 46 + - 56 + - 49 + - 56 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 51 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 49 + - 46 + - 55 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 49 + - 46 + - 48 + - 48 + - 54 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 49 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 51 + - 46 + - 57 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 50 + - 50 + - 46 + - 51 + - 57 + - 52 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 49 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 46 + - 54 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 46 + - 51 + - 50 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 50 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 55 + - 46 + - 54 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 52 + - 46 + - 56 + - 57 + - 51 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 50 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 53 + - 46 + - 57 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 51 + - 46 + - 52 + - 56 + - 51 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 50 + - 125 + - geometry: + - lat: 59.44946 + lng: 24.739543 + - lat: 59.449578 + lng: 24.73963 + - lat: 59.449652 + lng: 24.739675 + distance: 23 + duration: 18.235 + road_name: "" + instruction: Turn right onto the walkway. + visual_instructions: + - primary_content: + text: Turn left onto the walkway. + maneuver_type: turn + maneuver_modifier: left + roundabout_exit_degrees: ~ + secondary_content: ~ + trigger_distance_before_maneuver: 23 + spoken_instructions: + - text: "In 37 feet, Turn left onto the walkway." + ssml: "In 37 feet, Turn left onto the walkway." + trigger_distance_before_maneuver: 11.5 + annotations: + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 56 + - 50 + - 46 + - 54 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 54 + - 57 + - 46 + - 57 + - 57 + - 52 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 50 + - 125 + - geometry: + - lat: 59.449652 + lng: 24.739675 + - lat: 59.449697 + lng: 24.739489 + - lat: 59.449733 + lng: 24.739454 + distance: 16 + duration: 11.294 + road_name: "" + instruction: Turn left onto the walkway. + visual_instructions: + - primary_content: + text: Turn left onto the crosswalk. + maneuver_type: turn + maneuver_modifier: left + roundabout_exit_degrees: ~ + secondary_content: ~ + trigger_distance_before_maneuver: 16 + spoken_instructions: + - text: "In 26 feet, Turn left onto the crosswalk." + ssml: "In 26 feet, Turn left onto the crosswalk." + trigger_distance_before_maneuver: 8 + annotations: + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 55 + - 51 + - 46 + - 52 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 53 + - 49 + - 46 + - 55 + - 56 + - 52 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - geometry: + - lat: 59.449733 + lng: 24.739454 + - lat: 59.449727 + lng: 24.739369 + - lat: 59.44975 + lng: 24.73924 + - lat: 59.449766 + lng: 24.739172 + - lat: 59.449773 + lng: 24.73913 + - lat: 59.449812 + lng: 24.739014 + - lat: 59.450009 + lng: 24.738034 + - lat: 59.450135 + lng: 24.737365 + - lat: 59.450207 + lng: 24.737042 + - lat: 59.450228 + lng: 24.736911 + - lat: 59.450277 + lng: 24.736613 + - lat: 59.450327 + lng: 24.736371 + - lat: 59.450403 + lng: 24.735904 + - lat: 59.450537 + lng: 24.735241 + - lat: 59.45058 + lng: 24.734953 + - lat: 59.450687 + lng: 24.734123 + - lat: 59.450703 + lng: 24.733977 + - lat: 59.45072 + lng: 24.73391 + - lat: 59.450751 + lng: 24.733895 + - lat: 59.450757 + lng: 24.733797 + - lat: 59.450765 + lng: 24.733721 + distance: 347 + duration: 263.849 + road_name: "" + instruction: Turn left onto the crosswalk. + visual_instructions: + - primary_content: + text: Turn right onto the walkway. + maneuver_type: turn + maneuver_modifier: right + roundabout_exit_degrees: ~ + secondary_content: ~ + trigger_distance_before_maneuver: 347 + spoken_instructions: + - text: "In 200 feet, Turn right onto the walkway." + ssml: "In 200 feet, Turn right onto the walkway." + trigger_distance_before_maneuver: 60 + annotations: + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 49 + - 46 + - 52 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 53 + - 46 + - 49 + - 48 + - 56 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 53 + - 46 + - 51 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 57 + - 46 + - 57 + - 54 + - 57 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 51 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 51 + - 48 + - 46 + - 57 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 50 + - 52 + - 46 + - 52 + - 49 + - 53 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 51 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 57 + - 46 + - 56 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 50 + - 51 + - 46 + - 53 + - 51 + - 49 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 51 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 51 + - 46 + - 56 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 48 + - 46 + - 56 + - 57 + - 57 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 51 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 57 + - 46 + - 48 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 51 + - 50 + - 46 + - 49 + - 56 + - 55 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 48 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 51 + - 46 + - 49 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 54 + - 46 + - 51 + - 49 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 51 + - 53 + - 46 + - 54 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 50 + - 53 + - 46 + - 49 + - 48 + - 52 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 51 + - 54 + - 46 + - 48 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 50 + - 53 + - 46 + - 52 + - 52 + - 53 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 52 + - 57 + - 46 + - 57 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 51 + - 53 + - 46 + - 50 + - 49 + - 51 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 55 + - 46 + - 56 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 53 + - 46 + - 52 + - 55 + - 55 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 51 + - 54 + - 46 + - 53 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 50 + - 53 + - 46 + - 55 + - 57 + - 57 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 53 + - 52 + - 46 + - 56 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 51 + - 56 + - 46 + - 55 + - 48 + - 57 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 52 + - 46 + - 48 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 57 + - 46 + - 57 + - 48 + - 50 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 56 + - 46 + - 54 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 54 + - 46 + - 48 + - 56 + - 54 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 49 + - 46 + - 55 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 56 + - 46 + - 50 + - 50 + - 56 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 52 + - 46 + - 53 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 51 + - 46 + - 49 + - 53 + - 54 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 52 + - 46 + - 57 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 51 + - 46 + - 52 + - 50 + - 55 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 55 + - 46 + - 55 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 53 + - 46 + - 52 + - 54 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - geometry: + - lat: 59.450765 + lng: 24.733721 + - lat: 59.450787 + lng: 24.733717 + distance: 2 + duration: 1.412 + road_name: "" + instruction: Turn right onto the walkway. + visual_instructions: + - primary_content: + text: Turn left onto the walkway. + maneuver_type: turn + maneuver_modifier: left + roundabout_exit_degrees: ~ + secondary_content: ~ + trigger_distance_before_maneuver: 2 + spoken_instructions: + - text: "In 3 feet, Turn left onto the walkway." + ssml: "In 3 feet, Turn left onto the walkway." + trigger_distance_before_maneuver: 1 + annotations: [] + - geometry: + - lat: 59.450787 + lng: 24.733717 + - lat: 59.451083 + lng: 24.732819 + - lat: 59.451334 + lng: 24.732043 + - lat: 59.451338 + lng: 24.732015 + - lat: 59.451348 + lng: 24.731938 + - lat: 59.451372 + lng: 24.731837 + - lat: 59.451409 + lng: 24.73182 + - lat: 59.45143 + lng: 24.731764 + - lat: 59.45141 + lng: 24.731691 + - lat: 59.451419 + lng: 24.7316 + - lat: 59.451441 + lng: 24.731523 + - lat: 59.451503 + lng: 24.731316 + - lat: 59.451843 + lng: 24.73025 + - lat: 59.451886 + lng: 24.730235 + - lat: 59.451907 + lng: 24.730259 + distance: 241 + duration: 184.456 + road_name: "" + instruction: Turn left onto the walkway. + visual_instructions: + - primary_content: + text: Allveelaeva + maneuver_type: turn + maneuver_modifier: slight left + roundabout_exit_degrees: ~ + secondary_content: ~ + trigger_distance_before_maneuver: 241 + spoken_instructions: + - text: "In 200 feet, Bear left onto Allveelaeva." + ssml: "In 200 feet, Bear left onto Allveelaeva." + trigger_distance_before_maneuver: 60 + annotations: + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 52 + - 46 + - 50 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 50 + - 46 + - 57 + - 57 + - 51 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 46 + - 53 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 46 + - 56 + - 55 + - 49 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 51 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 55 + - 46 + - 57 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 53 + - 46 + - 56 + - 56 + - 56 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 51 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 53 + - 57 + - 46 + - 54 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 52 + - 52 + - 46 + - 54 + - 49 + - 55 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 51 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 52 + - 48 + - 46 + - 52 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 51 + - 48 + - 46 + - 50 + - 48 + - 54 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 51 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 48 + - 46 + - 48 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 53 + - 46 + - 52 + - 57 + - 54 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 51 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 55 + - 46 + - 56 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 53 + - 46 + - 52 + - 56 + - 55 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 55 + - 46 + - 55 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 50 + - 46 + - 53 + - 49 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 52 + - 46 + - 56 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 48 + - 46 + - 52 + - 51 + - 52 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 55 + - 46 + - 55 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 57 + - 46 + - 53 + - 56 + - 53 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 52 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 52 + - 48 + - 46 + - 52 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 51 + - 49 + - 46 + - 51 + - 52 + - 55 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 51 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 55 + - 46 + - 48 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 51 + - 46 + - 49 + - 56 + - 56 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 51 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 52 + - 56 + - 46 + - 52 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 51 + - 55 + - 46 + - 54 + - 50 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 51 + - 125 + - geometry: + - lat: 59.451907 + lng: 24.730259 + - lat: 59.452026 + lng: 24.729829 + distance: 28 + duration: 20.951 + road_name: Allveelaeva + instruction: Bear left onto Allveelaeva. + visual_instructions: + - primary_content: + text: Peetri + maneuver_type: turn + maneuver_modifier: right + roundabout_exit_degrees: ~ + secondary_content: ~ + trigger_distance_before_maneuver: 28 + spoken_instructions: + - text: "In 45 feet, Turn right onto Peetri." + ssml: "In 45 feet, Turn right onto Peetri." + trigger_distance_before_maneuver: 14 + annotations: [] + - geometry: + - lat: 59.452026 + lng: 24.729829 + - lat: 59.452169 + lng: 24.729962 + - lat: 59.452226 + lng: 24.730034 + distance: 25.099 + duration: 24.804 + road_name: Peetri + instruction: Turn right onto Peetri. + visual_instructions: + - primary_content: + text: You have arrived at your destination. + maneuver_type: arrive + maneuver_modifier: ~ + roundabout_exit_degrees: ~ + secondary_content: ~ + trigger_distance_before_maneuver: 25.099 + spoken_instructions: + - text: "In 41 feet, You have arrived at your destination." + ssml: "In 41 feet, You have arrived at your destination." + trigger_distance_before_maneuver: 12.5495 + annotations: + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 56 + - 46 + - 53 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 54 + - 46 + - 54 + - 56 + - 49 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 49 + - 46 + - 51 + - 125 + - geometry: + - lat: 59.452226 + lng: 24.730034 + - lat: 59.452226 + lng: 24.730034 + distance: 0 + duration: 0 + road_name: Peetri + instruction: You have arrived at your destination. + visual_instructions: + - primary_content: + text: You have arrived at your destination. + maneuver_type: arrive + maneuver_modifier: ~ + roundabout_exit_degrees: ~ + secondary_content: ~ + trigger_distance_before_maneuver: 0 + spoken_instructions: [] + annotations: [] diff --git a/common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__tests__parse_valhalla_osrm_with_via_ways.snap.new b/common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__tests__parse_valhalla_osrm_with_via_ways.snap.new new file mode 100644 index 00000000..4554a3c1 --- /dev/null +++ b/common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__tests__parse_valhalla_osrm_with_via_ways.snap.new @@ -0,0 +1,7475 @@ +--- +source: ferrostar/src/routing_adapters/osrm/mod.rs +assertion_line: 253 +expression: routes +--- +- geometry: + - lat: 28.795656 + lng: -82.036056 + - lat: 28.795632 + lng: -82.03602 + - lat: 28.795446 + lng: -82.035862 + - lat: 28.795242 + lng: -82.035787 + - lat: 28.794865 + lng: -82.035633 + - lat: 28.794788 + lng: -82.035601 + - lat: 28.794687 + lng: -82.035548 + - lat: 28.794614 + lng: -82.03551 + - lat: 28.794567 + lng: -82.035518 + - lat: 28.794504 + lng: -82.035542 + - lat: 28.794436 + lng: -82.035511 + - lat: 28.794273 + lng: -82.035351 + - lat: 28.794139 + lng: -82.0352 + - lat: 28.793991 + lng: -82.035104 + - lat: 28.793934 + lng: -82.035044 + - lat: 28.793761 + lng: -82.034758 + - lat: 28.793597 + lng: -82.034492 + - lat: 28.793455 + lng: -82.034264 + - lat: 28.793318 + lng: -82.033963 + - lat: 28.79323 + lng: -82.033796 + - lat: 28.793138 + lng: -82.033645 + - lat: 28.793118 + lng: -82.033577 + - lat: 28.793107 + lng: -82.033531 + - lat: 28.793056 + lng: -82.033182 + - lat: 28.792997 + lng: -82.032977 + - lat: 28.792985 + lng: -82.032905 + - lat: 28.792979 + lng: -82.032845 + - lat: 28.792977 + lng: -82.032804 + - lat: 28.79296 + lng: -82.032524 + - lat: 28.792979 + lng: -82.032225 + - lat: 28.792998 + lng: -82.031982 + - lat: 28.793005 + lng: -82.031645 + - lat: 28.793011 + lng: -82.031423 + - lat: 28.793038 + lng: -82.031166 + - lat: 28.793149 + lng: -82.030774 + - lat: 28.793239 + lng: -82.030562 + - lat: 28.793445 + lng: -82.030225 + - lat: 28.79353 + lng: -82.030069 + - lat: 28.793602 + lng: -82.029863 + - lat: 28.793634 + lng: -82.029825 + - lat: 28.793661 + lng: -82.029777 + - lat: 28.793727 + lng: -82.029683 + - lat: 28.793881 + lng: -82.029487 + - lat: 28.793972 + lng: -82.029351 + - lat: 28.79407 + lng: -82.029159 + - lat: 28.79413 + lng: -82.028968 + - lat: 28.794172 + lng: -82.028687 + - lat: 28.794177 + lng: -82.028508 + - lat: 28.79416 + lng: -82.028333 + - lat: 28.794116 + lng: -82.028138 + - lat: 28.794097 + lng: -82.028035 + - lat: 28.794078 + lng: -82.027959 + - lat: 28.794075 + lng: -82.027904 + - lat: 28.794079 + lng: -82.02769 + - lat: 28.79408 + lng: -82.027554 + - lat: 28.794052 + lng: -82.027401 + - lat: 28.794058 + lng: -82.027272 + - lat: 28.794071 + lng: -82.027151 + - lat: 28.794099 + lng: -82.026985 + - lat: 28.794129 + lng: -82.02673 + - lat: 28.794118 + lng: -82.026562 + - lat: 28.794086 + lng: -82.026389 + - lat: 28.794032 + lng: -82.026212 + - lat: 28.793989 + lng: -82.026094 + - lat: 28.793908 + lng: -82.025904 + - lat: 28.793767 + lng: -82.02561 + - lat: 28.793575 + lng: -82.025339 + - lat: 28.793382 + lng: -82.025152 + - lat: 28.793051 + lng: -82.024889 + - lat: 28.792853 + lng: -82.024677 + - lat: 28.792666 + lng: -82.024502 + - lat: 28.792613 + lng: -82.024391 + - lat: 28.792553 + lng: -82.024229 + - lat: 28.792517 + lng: -82.024048 + - lat: 28.792452 + lng: -82.023868 + - lat: 28.792434 + lng: -82.02372 + - lat: 28.792409 + lng: -82.023507 + - lat: 28.792369 + lng: -82.023212 + - lat: 28.792307 + lng: -82.02297 + - lat: 28.792235 + lng: -82.022756 + - lat: 28.792102 + lng: -82.022403 + - lat: 28.791981 + lng: -82.022172 + - lat: 28.791823 + lng: -82.021943 + - lat: 28.791628 + lng: -82.02171 + - lat: 28.791463 + lng: -82.021494 + - lat: 28.791281 + lng: -82.021204 + - lat: 28.791179 + lng: -82.021008 + - lat: 28.791133 + lng: -82.020892 + - lat: 28.79109 + lng: -82.020755 + - lat: 28.791046 + lng: -82.020511 + - lat: 28.790976 + lng: -82.020256 + - lat: 28.790942 + lng: -82.020122 + - lat: 28.790931 + lng: -82.019895 + - lat: 28.790906 + lng: -82.019766 + - lat: 28.790841 + lng: -82.019569 + - lat: 28.790763 + lng: -82.019381 + - lat: 28.7906 + lng: -82.019078 + - lat: 28.790396 + lng: -82.01882 + - lat: 28.790264 + lng: -82.018582 + - lat: 28.790157 + lng: -82.018303 + - lat: 28.790106 + lng: -82.018021 + bbox: + sw: + lat: 28.790106 + lng: -82.036056 + ne: + lat: 28.795656 + lng: -82.018021 + distance: 2089.442 + waypoints: + - coordinate: + lat: 28.795656 + lng: -82.036056 + kind: Break + - coordinate: + lat: 28.795446 + lng: -82.035862 + kind: Via + - coordinate: + lat: 28.790106 + lng: -82.018021 + kind: Break + steps: + - geometry: + - lat: 28.795656 + lng: -82.036056 + - lat: 28.795632 + lng: -82.03602 + - lat: 28.795446 + lng: -82.035862 + - lat: 28.795242 + lng: -82.035787 + - lat: 28.794865 + lng: -82.035633 + - lat: 28.794788 + lng: -82.035601 + - lat: 28.794687 + lng: -82.035548 + - lat: 28.794614 + lng: -82.03551 + - lat: 28.794567 + lng: -82.035518 + - lat: 28.794504 + lng: -82.035542 + - lat: 28.794436 + lng: -82.035511 + - lat: 28.794273 + lng: -82.035351 + - lat: 28.794139 + lng: -82.0352 + - lat: 28.793991 + lng: -82.035104 + - lat: 28.793934 + lng: -82.035044 + - lat: 28.793761 + lng: -82.034758 + - lat: 28.793597 + lng: -82.034492 + - lat: 28.793455 + lng: -82.034264 + - lat: 28.793318 + lng: -82.033963 + - lat: 28.79323 + lng: -82.033796 + - lat: 28.793138 + lng: -82.033645 + - lat: 28.793118 + lng: -82.033577 + - lat: 28.793107 + lng: -82.033531 + - lat: 28.793056 + lng: -82.033182 + - lat: 28.792997 + lng: -82.032977 + - lat: 28.792985 + lng: -82.032905 + - lat: 28.792979 + lng: -82.032845 + - lat: 28.792977 + lng: -82.032804 + - lat: 28.79296 + lng: -82.032524 + - lat: 28.792979 + lng: -82.032225 + - lat: 28.792998 + lng: -82.031982 + - lat: 28.793005 + lng: -82.031645 + - lat: 28.793011 + lng: -82.031423 + - lat: 28.793038 + lng: -82.031166 + - lat: 28.793149 + lng: -82.030774 + - lat: 28.793239 + lng: -82.030562 + - lat: 28.793445 + lng: -82.030225 + - lat: 28.79353 + lng: -82.030069 + - lat: 28.793602 + lng: -82.029863 + - lat: 28.793634 + lng: -82.029825 + - lat: 28.793661 + lng: -82.029777 + - lat: 28.793727 + lng: -82.029683 + - lat: 28.793881 + lng: -82.029487 + - lat: 28.793972 + lng: -82.029351 + - lat: 28.79407 + lng: -82.029159 + - lat: 28.79413 + lng: -82.028968 + - lat: 28.794172 + lng: -82.028687 + - lat: 28.794177 + lng: -82.028508 + - lat: 28.79416 + lng: -82.028333 + - lat: 28.794116 + lng: -82.028138 + - lat: 28.794097 + lng: -82.028035 + - lat: 28.794078 + lng: -82.027959 + - lat: 28.794075 + lng: -82.027904 + - lat: 28.794079 + lng: -82.02769 + - lat: 28.79408 + lng: -82.027554 + - lat: 28.794052 + lng: -82.027401 + - lat: 28.794058 + lng: -82.027272 + - lat: 28.794071 + lng: -82.027151 + - lat: 28.794099 + lng: -82.026985 + - lat: 28.794129 + lng: -82.02673 + - lat: 28.794118 + lng: -82.026562 + - lat: 28.794086 + lng: -82.026389 + - lat: 28.794032 + lng: -82.026212 + - lat: 28.793989 + lng: -82.026094 + - lat: 28.793908 + lng: -82.025904 + - lat: 28.793767 + lng: -82.02561 + - lat: 28.793575 + lng: -82.025339 + - lat: 28.793382 + lng: -82.025152 + - lat: 28.793051 + lng: -82.024889 + - lat: 28.792853 + lng: -82.024677 + - lat: 28.792666 + lng: -82.024502 + - lat: 28.792613 + lng: -82.024391 + - lat: 28.792553 + lng: -82.024229 + - lat: 28.792517 + lng: -82.024048 + - lat: 28.792452 + lng: -82.023868 + - lat: 28.792434 + lng: -82.02372 + - lat: 28.792409 + lng: -82.023507 + - lat: 28.792369 + lng: -82.023212 + - lat: 28.792307 + lng: -82.02297 + - lat: 28.792235 + lng: -82.022756 + - lat: 28.792102 + lng: -82.022403 + - lat: 28.791981 + lng: -82.022172 + - lat: 28.791823 + lng: -82.021943 + - lat: 28.791628 + lng: -82.02171 + - lat: 28.791463 + lng: -82.021494 + - lat: 28.791281 + lng: -82.021204 + - lat: 28.791179 + lng: -82.021008 + - lat: 28.791133 + lng: -82.020892 + - lat: 28.79109 + lng: -82.020755 + - lat: 28.791046 + lng: -82.020511 + - lat: 28.790976 + lng: -82.020256 + - lat: 28.790942 + lng: -82.020122 + - lat: 28.790931 + lng: -82.019895 + - lat: 28.790906 + lng: -82.019766 + - lat: 28.790841 + lng: -82.019569 + - lat: 28.790763 + lng: -82.019381 + - lat: 28.7906 + lng: -82.019078 + - lat: 28.790396 + lng: -82.01882 + - lat: 28.790264 + lng: -82.018582 + - lat: 28.790157 + lng: -82.018303 + - lat: 28.790106 + lng: -82.018021 + distance: 2089.442 + duration: 301.262 + road_name: "" + instruction: Drive southeast. + visual_instructions: + - primary_content: + text: You have arrived at your destination. + maneuver_type: arrive + maneuver_modifier: ~ + roundabout_exit_degrees: ~ + secondary_content: ~ + trigger_distance_before_maneuver: 2089.442 + spoken_instructions: + - text: Drive southeast. + ssml: "Drive southeast." + trigger_distance_before_maneuver: 2089.442 + - text: "In 200 feet, You have arrived at your destination." + ssml: "In 200 feet, You have arrived at your destination." + trigger_distance_before_maneuver: 60 + annotations: + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 52 + - 46 + - 52 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 48 + - 46 + - 54 + - 51 + - 53 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 53 + - 46 + - 56 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 51 + - 46 + - 55 + - 49 + - 55 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 51 + - 46 + - 57 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 51 + - 46 + - 52 + - 51 + - 54 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 52 + - 52 + - 46 + - 54 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 54 + - 46 + - 52 + - 49 + - 57 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 57 + - 46 + - 49 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 46 + - 51 + - 49 + - 52 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 50 + - 46 + - 52 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 46 + - 55 + - 56 + - 50 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 56 + - 46 + - 57 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 46 + - 50 + - 56 + - 54 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 53 + - 46 + - 51 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 48 + - 46 + - 55 + - 54 + - 50 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 55 + - 46 + - 52 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 46 + - 48 + - 54 + - 53 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 56 + - 46 + - 50 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 46 + - 49 + - 55 + - 52 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 51 + - 46 + - 57 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 51 + - 46 + - 52 + - 52 + - 55 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 49 + - 46 + - 48 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 51 + - 46 + - 48 + - 49 + - 57 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 57 + - 46 + - 48 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 50 + - 46 + - 55 + - 50 + - 57 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 56 + - 46 + - 54 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 46 + - 50 + - 52 + - 51 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 51 + - 51 + - 46 + - 57 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 52 + - 46 + - 56 + - 56 + - 50 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 51 + - 49 + - 46 + - 55 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 52 + - 46 + - 53 + - 54 + - 57 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 55 + - 46 + - 51 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 51 + - 46 + - 57 + - 50 + - 57 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 51 + - 51 + - 46 + - 49 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 52 + - 46 + - 55 + - 54 + - 53 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 57 + - 46 + - 48 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 50 + - 46 + - 55 + - 51 + - 56 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 55 + - 46 + - 57 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 50 + - 46 + - 53 + - 56 + - 52 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 55 + - 46 + - 48 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 46 + - 48 + - 48 + - 56 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 52 + - 46 + - 55 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 48 + - 46 + - 54 + - 55 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 51 + - 52 + - 46 + - 53 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 52 + - 46 + - 57 + - 55 + - 49 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 49 + - 46 + - 48 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 51 + - 46 + - 48 + - 51 + - 49 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 55 + - 46 + - 50 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 46 + - 48 + - 51 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 53 + - 46 + - 57 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 48 + - 46 + - 56 + - 52 + - 56 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 52 + - 46 + - 48 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 48 + - 46 + - 53 + - 55 + - 55 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 55 + - 46 + - 52 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 51 + - 46 + - 57 + - 52 + - 51 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 57 + - 46 + - 50 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 52 + - 46 + - 50 + - 49 + - 49 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 51 + - 46 + - 56 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 51 + - 46 + - 52 + - 50 + - 55 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 51 + - 50 + - 46 + - 57 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 52 + - 46 + - 55 + - 51 + - 54 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 49 + - 46 + - 55 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 51 + - 46 + - 49 + - 50 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 53 + - 46 + - 51 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 51 + - 46 + - 54 + - 51 + - 54 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 52 + - 48 + - 46 + - 50 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 53 + - 46 + - 55 + - 56 + - 55 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 51 + - 46 + - 48 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 51 + - 46 + - 51 + - 48 + - 57 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 52 + - 48 + - 46 + - 49 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 53 + - 46 + - 55 + - 55 + - 50 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 55 + - 46 + - 57 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 50 + - 46 + - 53 + - 56 + - 49 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 49 + - 46 + - 54 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 51 + - 46 + - 49 + - 49 + - 54 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 53 + - 46 + - 49 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 48 + - 46 + - 55 + - 52 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 53 + - 46 + - 54 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 48 + - 46 + - 56 + - 48 + - 49 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 49 + - 46 + - 56 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 46 + - 54 + - 57 + - 50 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 53 + - 46 + - 55 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 51 + - 46 + - 54 + - 57 + - 56 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 54 + - 46 + - 55 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 50 + - 46 + - 52 + - 48 + - 52 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 49 + - 46 + - 55 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 51 + - 46 + - 49 + - 50 + - 49 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 57 + - 46 + - 56 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 50 + - 46 + - 56 + - 53 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 55 + - 46 + - 56 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 52 + - 46 + - 48 + - 48 + - 53 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 55 + - 46 + - 53 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 50 + - 46 + - 53 + - 49 + - 54 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 55 + - 46 + - 50 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 50 + - 46 + - 52 + - 55 + - 51 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 57 + - 46 + - 54 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 50 + - 46 + - 56 + - 50 + - 57 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 48 + - 46 + - 51 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 46 + - 52 + - 55 + - 57 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 55 + - 46 + - 55 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 46 + - 49 + - 49 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 53 + - 46 + - 52 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 48 + - 46 + - 55 + - 55 + - 52 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 48 + - 46 + - 57 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 51 + - 46 + - 48 + - 48 + - 55 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 51 + - 46 + - 51 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 46 + - 57 + - 49 + - 49 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 53 + - 46 + - 50 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 50 + - 46 + - 49 + - 57 + - 54 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 50 + - 46 + - 54 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 46 + - 56 + - 49 + - 53 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 49 + - 46 + - 57 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 46 + - 55 + - 49 + - 51 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 54 + - 46 + - 53 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 50 + - 46 + - 51 + - 55 + - 53 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 53 + - 46 + - 49 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 51 + - 46 + - 54 + - 49 + - 52 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 54 + - 46 + - 52 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 50 + - 46 + - 51 + - 54 + - 55 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 55 + - 46 + - 50 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 50 + - 46 + - 52 + - 56 + - 52 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 56 + - 46 + - 51 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 50 + - 46 + - 54 + - 51 + - 51 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 50 + - 46 + - 53 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 46 + - 55 + - 57 + - 53 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 48 + - 46 + - 54 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 50 + - 46 + - 57 + - 54 + - 56 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 51 + - 50 + - 46 + - 55 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 52 + - 46 + - 55 + - 48 + - 56 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 51 + - 52 + - 46 + - 48 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 52 + - 46 + - 56 + - 57 + - 54 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 56 + - 46 + - 50 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 52 + - 46 + - 48 + - 53 + - 57 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 52 + - 52 + - 46 + - 57 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 54 + - 46 + - 52 + - 54 + - 54 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 51 + - 48 + - 46 + - 50 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 52 + - 46 + - 51 + - 53 + - 50 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 54 + - 46 + - 57 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 51 + - 46 + - 56 + - 55 + - 55 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 50 + - 46 + - 51 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 46 + - 55 + - 55 + - 54 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 55 + - 46 + - 50 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 50 + - 46 + - 52 + - 55 + - 49 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 56 + - 46 + - 49 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 50 + - 46 + - 54 + - 48 + - 55 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 57 + - 46 + - 48 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 50 + - 46 + - 55 + - 51 + - 53 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 52 + - 46 + - 54 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 50 + - 46 + - 48 + - 57 + - 57 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 49 + - 46 + - 48 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 51 + - 46 + - 48 + - 49 + - 57 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 57 + - 46 + - 49 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 52 + - 46 + - 49 + - 57 + - 52 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 52 + - 46 + - 54 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 51 + - 46 + - 53 + - 52 + - 50 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 50 + - 46 + - 52 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 51 + - 46 + - 50 + - 50 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 51 + - 55 + - 46 + - 53 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 53 + - 46 + - 51 + - 57 + - 56 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 54 + - 46 + - 51 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 51 + - 46 + - 55 + - 56 + - 49 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 56 + - 46 + - 52 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 52 + - 46 + - 48 + - 57 + - 52 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 51 + - 49 + - 46 + - 52 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 52 + - 46 + - 53 + - 50 + - 54 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 56 + - 46 + - 48 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 52 + - 46 + - 48 + - 50 + - 53 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 51 + - 52 + - 46 + - 56 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 53 + - 46 + - 48 + - 49 + - 49 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 50 + - 46 + - 50 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 51 + - 46 + - 50 + - 48 + - 50 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 50 + - 46 + - 52 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 46 + - 55 + - 56 + - 57 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 52 + - 46 + - 50 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 50 + - 46 + - 48 + - 52 + - 52 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 52 + - 46 + - 51 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 51 + - 46 + - 53 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 54 + - 46 + - 49 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 51 + - 46 + - 55 + - 53 + - 52 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 51 + - 46 + - 54 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 46 + - 57 + - 54 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 50 + - 46 + - 50 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 51 + - 46 + - 49 + - 57 + - 52 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 49 + - 50 + - 46 + - 57 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 49 + - 46 + - 56 + - 53 + - 54 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 48 + - 46 + - 53 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 50 + - 46 + - 57 + - 53 + - 55 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 48 + - 46 + - 51 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 50 + - 46 + - 57 + - 50 + - 50 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 51 + - 52 + - 46 + - 55 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 52 + - 46 + - 57 + - 57 + - 53 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 51 + - 51 + - 46 + - 57 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 52 + - 46 + - 56 + - 56 + - 50 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 55 + - 46 + - 53 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 51 + - 46 + - 57 + - 53 + - 55 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - - 123 + - 34 + - 100 + - 105 + - 115 + - 116 + - 97 + - 110 + - 99 + - 101 + - 34 + - 58 + - 50 + - 57 + - 46 + - 55 + - 44 + - 34 + - 100 + - 117 + - 114 + - 97 + - 116 + - 105 + - 111 + - 110 + - 34 + - 58 + - 52 + - 46 + - 50 + - 55 + - 56 + - 44 + - 34 + - 109 + - 97 + - 120 + - 95 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 110 + - 117 + - 108 + - 108 + - 44 + - 34 + - 115 + - 112 + - 101 + - 101 + - 100 + - 95 + - 109 + - 112 + - 115 + - 34 + - 58 + - 54 + - 46 + - 57 + - 125 + - geometry: + - lat: 28.790106 + lng: -82.018021 + - lat: 28.790106 + lng: -82.018021 + distance: 0 + duration: 0 + road_name: "" + instruction: You have arrived at your destination. + visual_instructions: + - primary_content: + text: You have arrived at your destination. + maneuver_type: arrive + maneuver_modifier: ~ + roundabout_exit_degrees: ~ + secondary_content: ~ + trigger_distance_before_maneuver: 0 + spoken_instructions: [] + annotations: [] diff --git a/sample.json b/sample.json new file mode 100644 index 00000000..55ad0285 --- /dev/null +++ b/sample.json @@ -0,0 +1,1117 @@ +{ + "routes": [ + { + "voiceLocale": "en-US", + "weight_name": "bicycle", + "weight": 983.142, + "duration": 380.368, + "distance": 1514.872, + "legs": [ + { + "via_waypoints": [], + "annotation": { + "maxspeed": [ + { "unknown": true }, + { "unknown": true }, + { "unknown": true }, + { "unknown": true }, + { "unknown": true }, + { "unknown": true }, + { "unknown": true }, + { "unknown": true }, + { "unknown": true }, + { "unknown": true }, + { "unknown": true }, + { "unknown": true }, + { "unknown": true }, + { "unknown": true }, + { "speed": 40, "unit": "km/h" }, + { "speed": 40, "unit": "km/h" }, + { "speed": 40, "unit": "km/h" }, + { "speed": 40, "unit": "km/h" }, + { "speed": 40, "unit": "km/h" }, + { "speed": 40, "unit": "km/h" }, + { "speed": 40, "unit": "km/h" }, + { "speed": 40, "unit": "km/h" }, + { "speed": 40, "unit": "km/h" }, + { "speed": 40, "unit": "km/h" }, + { "speed": 40, "unit": "km/h" }, + { "speed": 40, "unit": "km/h" }, + { "speed": 40, "unit": "km/h" }, + { "speed": 40, "unit": "km/h" }, + { "speed": 40, "unit": "km/h" }, + { "speed": 40, "unit": "km/h" }, + { "speed": 40, "unit": "km/h" }, + { "speed": 40, "unit": "km/h" }, + { "speed": 40, "unit": "km/h" }, + { "speed": 40, "unit": "km/h" }, + { "speed": 40, "unit": "km/h" }, + { "unknown": true }, + { "unknown": true }, + { "unknown": true }, + { "unknown": true }, + { "unknown": true }, + { "speed": 40, "unit": "km/h" }, + { "speed": 40, "unit": "km/h" }, + { "speed": 40, "unit": "km/h" }, + { "speed": 40, "unit": "km/h" }, + { "speed": 40, "unit": "km/h" }, + { "speed": 40, "unit": "km/h" }, + { "speed": 40, "unit": "km/h" }, + { "speed": 40, "unit": "km/h" }, + { "speed": 40, "unit": "km/h" }, + { "speed": 40, "unit": "km/h" }, + { "speed": 40, "unit": "km/h" }, + { "speed": 40, "unit": "km/h" }, + { "speed": 40, "unit": "km/h" }, + { "speed": 40, "unit": "km/h" }, + { "unknown": true }, + { "unknown": true }, + { "unknown": true }, + { "unknown": true }, + { "unknown": true }, + { "unknown": true }, + { "unknown": true }, + { "unknown": true }, + { "unknown": true }, + { "unknown": true }, + { "unknown": true }, + { "unknown": true }, + { "unknown": true }, + { "unknown": true }, + { "unknown": true }, + { "unknown": true }, + { "unknown": true }, + { "unknown": true }, + { "unknown": true }, + { "unknown": true } + ], + "speed": [ + 5.0, 5.0, 5.0, 5.0, 3.3, 3.3, 3.3, 3.3, 4.7, 4.7, 5.0, 5.0, 2.8, + 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 6.1, 6.1, 6.1, 5.0, 5.0, + 5.0, 5.0, 5.0, 4.7, 4.7, 5.0, 5.0, 5.0, 4.2, 5.0, 5.0, 5.0, 4.2, + 5.0, 5.0, 5.0, 6.9, 6.9, 5.0, 5.0, 4.2, 4.2, 4.2, 4.2, 4.2, 4.2, + 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 4.2, 4.2, 4.2, 4.2, 6.1, + 5.0, 5.0, 6.9, 6.9, 6.9, 4.7, 4.2, 4.2, 4.2 + ], + "distance": [ + 63.1, 24.4, 8.9, 8.2, 4.4, 4.5, 4.1, 50.8, 19.4, 13.1, 1.5, 7.4, + 85.3, 11.5, 1.2, 8.7, 3.6, 118.7, 6.4, 10.1, 7.5, 76.3, 20.5, + 31.1, 9.3, 9.6, 13.9, 9.2, 19.3, 34.0, 0.4, 19.1, 24.0, 8.2, 15.9, + 9.5, 15.8, 22.0, 46.1, 11.9, 10.8, 12.3, 108.4, 8.7, 12.3, 15.8, + 9.6, 6.6, 7.3, 25.3, 23.4, 44.7, 7.9, 17.1, 9.6, 4.0, 29.9, 7.7, + 7.4, 16.1, 13.3, 48.5, 7.5, 23.7, 41.3, 6.2, 13.9, 31.9, 31.1, + 11.8, 18.4, 4.9, 10.6, 8.9 + ], + "duration": [ + 12.625, 4.886, 1.777, 1.641, 1.324, 1.354, 1.234, 15.239, 4.101, + 2.77, 0.291, 1.476, 30.702, 2.301, 0.234, 1.744, 0.73, 23.738, + 1.282, 2.014, 1.49, 12.49, 3.352, 5.084, 1.87, 1.925, 2.777, + 1.835, 3.864, 7.201, 0.094, 3.829, 4.806, 1.637, 3.824, 1.896, + 3.156, 4.395, 11.073, 2.384, 2.155, 2.46, 15.608, 1.256, 2.457, + 3.156, 2.306, 1.577, 1.743, 6.07, 5.617, 10.728, 1.587, 3.412, + 1.918, 0.795, 5.979, 1.53, 1.482, 3.217, 3.185, 11.649, 1.789, + 5.688, 6.756, 1.231, 2.773, 4.593, 4.479, 1.693, 3.903, 1.168, + 2.532, 2.135 + ] + }, + "admins": [{ "iso_3166_1_alpha3": "USA", "iso_3166_1": "US" }], + "weight": 983.142, + "duration": 380.368, + "steps": [ + { + "voiceInstructions": [ + { + "ssmlAnnouncement": "Bike west on Jefferson Street. Then Turn left onto Hyde Street.", + "announcement": "Bike west on Jefferson Street. Then Turn left onto Hyde Street.", + "distanceAlongGeometry": 96.6 + }, + { + "ssmlAnnouncement": "Turn left onto Hyde Street.", + "announcement": "Turn left onto Hyde Street.", + "distanceAlongGeometry": 41.0 + } + ], + "intersections": [ + { + "entry": [true], + "bearings": [261], + "duration": 12.711, + "admin_index": 0, + "out": 0, + "weight": 25.676, + "geometry_index": 0, + "location": [-122.419695, 37.807712] + }, + { + "entry": [false, true, true], + "in": 0, + "bearings": [81, 261, 351], + "duration": 5.1, + "turn_weight": 0.672, + "turn_duration": 0.3, + "admin_index": 0, + "out": 1, + "weight": 10.367, + "geometry_index": 1, + "location": [-122.420404, 37.807623] + }, + { + "bearings": [81, 170, 270, 352], + "entry": [false, false, true, false], + "in": 0, + "turn_weight": 3.36, + "turn_duration": 1.5, + "admin_index": 0, + "out": 2, + "geometry_index": 2, + "location": [-122.420678, 37.807587] + } + ], + "bannerInstructions": [ + { + "primary": { + "type": "turn", + "modifier": "left", + "text": "Hyde Street", + "components": [{ "text": "Hyde Street", "type": "text" }] + }, + "distanceAlongGeometry": 96.557 + } + ], + "speedLimitUnit": "mph", + "maneuver": { + "instruction": "Bike west on Jefferson Street.", + "type": "depart", + "bearing_after": 261, + "bearing_before": 0, + "location": [-122.419695, 37.807712] + }, + "speedLimitSign": "mutcd", + "name": "Jefferson Street", + "duration": 21.111, + "distance": 96.557, + "driving_side": "left", + "weight": 43.039, + "mode": "cycling", + "geometry": "_erbgA|}{nhFpDhk@fAbP?hE" + }, + { + "voiceInstructions": [ + { + "ssmlAnnouncement": "Continue for 200 meters.", + "announcement": "Continue for 200 meters.", + "distanceAlongGeometry": 200.0 + }, + { + "ssmlAnnouncement": "In 90 meters, Turn right onto North Point Street.", + "announcement": "In 90 meters, Turn right onto North Point Street.", + "distanceAlongGeometry": 94.4 + }, + { + "ssmlAnnouncement": "Turn right onto North Point Street.", + "announcement": "Turn right onto North Point Street.", + "distanceAlongGeometry": 40.0 + } + ], + "intersections": [ + { + "entry": [false, true, true, true], + "in": 0, + "bearings": [90, 172, 269, 353], + "duration": 2.2, + "turn_weight": 6.902, + "turn_duration": 0.6, + "admin_index": 0, + "out": 1, + "weight": 10.217, + "geometry_index": 3, + "location": [-122.420779, 37.807587] + }, + { + "entry": [false, true, false, false], + "in": 3, + "bearings": [82, 166, 259, 352], + "duration": 20.7, + "turn_weight": 3.36, + "turn_duration": 1.5, + "admin_index": 0, + "out": 1, + "weight": 71.215, + "geometry_index": 4, + "location": [-122.420766, 37.807514] + }, + { + "entry": [true, false], + "in": 1, + "bearings": [171, 351], + "duration": 4.324, + "turn_weight": 0.672, + "turn_duration": 0.3, + "admin_index": 0, + "out": 0, + "weight": 9.158, + "geometry_index": 8, + "location": [-122.420633, 37.806952] + }, + { + "entry": [false, true, false, false], + "in": 3, + "bearings": [107, 166, 289, 351], + "duration": 4.253, + "turn_weight": 3.36, + "turn_duration": 1.5, + "admin_index": 0, + "out": 1, + "weight": 9.166, + "geometry_index": 9, + "location": [-122.4206, 37.80678] + }, + { + "entry": [true, true, true, false], + "in": 3, + "bearings": [86, 174, 260, 346], + "duration": 3.3, + "turn_weight": 3.36, + "turn_duration": 1.5, + "admin_index": 0, + "out": 1, + "weight": 7.089, + "geometry_index": 10, + "location": [-122.420564, 37.806666] + }, + { + "entry": [false, true, false, false], + "in": 3, + "bearings": [82, 171, 260, 354], + "duration": 32.1, + "turn_weight": 3.36, + "turn_duration": 1.5, + "admin_index": 0, + "out": 1, + "weight": 134.453, + "geometry_index": 12, + "location": [-122.420554, 37.806587] + }, + { + "bearings": [82, 171, 260, 351], + "entry": [false, true, false, false], + "in": 3, + "turn_weight": 3.36, + "turn_duration": 1.5, + "admin_index": 0, + "out": 1, + "geometry_index": 13, + "location": [-122.420405, 37.80583] + } + ], + "bannerInstructions": [ + { + "primary": { + "type": "turn", + "modifier": "right", + "text": "North Point Street", + "components": [ + { "text": "North Point Street", "type": "text" } + ] + }, + "distanceAlongGeometry": 210.0 + } + ], + "speedLimitUnit": "mph", + "maneuver": { + "modifier": "left", + "instruction": "Turn left onto Hyde Street.", + "type": "turn", + "bearing_after": 172, + "bearing_before": 270, + "location": [-122.420779, 37.807587] + }, + "speedLimitSign": "mutcd", + "name": "Hyde Street", + "duration": 70.776, + "distance": 210.0, + "driving_side": "left", + "weight": 249.63, + "mode": "cycling", + "geometry": "e}qbgAta~nhFpCYlAQhAi@dA]d[oDvIaAbFgAXCbCOhn@iHjEi@" + }, + { + "voiceInstructions": [ + { + "ssmlAnnouncement": "Continue for 400 meters.", + "announcement": "Continue for 400 meters.", + "distanceAlongGeometry": 437.0 + }, + { + "ssmlAnnouncement": "In 100 meters, Turn left onto Van Ness Avenue.", + "announcement": "In 100 meters, Turn left onto Van Ness Avenue.", + "distanceAlongGeometry": 138.9 + }, + { + "ssmlAnnouncement": "Turn left onto Van Ness Avenue.", + "announcement": "Turn left onto Van Ness Avenue.", + "distanceAlongGeometry": 40.0 + } + ], + "intersections": [ + { + "entry": [true, true, true, false], + "in": 3, + "bearings": [82, 172, 261, 351], + "duration": 5.0, + "turn_weight": 18.23, + "turn_duration": 3.0, + "admin_index": 0, + "out": 2, + "weight": 21.268, + "geometry_index": 14, + "location": [-122.420384, 37.805728] + }, + { + "entry": [false, false, true, false], + "in": 0, + "bearings": [81, 172, 261, 351], + "duration": 27.3, + "turn_weight": 3.36, + "turn_duration": 1.5, + "admin_index": 0, + "out": 2, + "weight": 42.547, + "geometry_index": 16, + "location": [-122.420495, 37.805714] + }, + { + "entry": [false, false, true, false], + "in": 0, + "bearings": [81, 170, 251, 351], + "duration": 3.5, + "turn_weight": 3.825, + "turn_duration": 1.5, + "admin_index": 0, + "out": 2, + "weight": 6.863, + "geometry_index": 19, + "location": [-122.421941, 37.805534] + }, + { + "entry": [true, false, true, true], + "in": 1, + "bearings": [1, 71, 182, 251], + "duration": 3.1, + "turn_weight": 3.36, + "turn_duration": 1.5, + "admin_index": 0, + "out": 3, + "weight": 5.79, + "geometry_index": 20, + "location": [-122.422049, 37.805504] + }, + { + "entry": [false, false, true, false], + "in": 0, + "bearings": [71, 170, 261, 351], + "duration": 13.936, + "turn_weight": 3.36, + "turn_duration": 1.5, + "admin_index": 0, + "out": 2, + "weight": 21.783, + "geometry_index": 21, + "location": [-122.422129, 37.805482] + }, + { + "entry": [false, false, true], + "in": 0, + "bearings": [81, 242, 261], + "duration": 8.809, + "turn_weight": 0.672, + "turn_duration": 0.3, + "admin_index": 0, + "out": 2, + "weight": 13.277, + "geometry_index": 22, + "location": [-122.422986, 37.805374] + }, + { + "entry": [false, false, true, false], + "in": 0, + "bearings": [81, 170, 261, 351], + "duration": 3.3, + "turn_weight": 3.36, + "turn_duration": 1.5, + "admin_index": 0, + "out": 2, + "weight": 6.094, + "geometry_index": 24, + "location": [-122.423565, 37.805302] + }, + { + "entry": [false, true, true, true, true], + "in": 0, + "bearings": [81, 111, 170, 261, 351], + "duration": 3.5, + "turn_weight": 3.36, + "turn_duration": 1.5, + "admin_index": 0, + "out": 3, + "weight": 6.398, + "geometry_index": 25, + "location": [-122.42367, 37.805289] + }, + { + "entry": [false, false, true, false], + "in": 0, + "bearings": [81, 170, 261, 351], + "duration": 6.1, + "turn_weight": 3.36, + "turn_duration": 1.5, + "admin_index": 0, + "out": 2, + "weight": 10.347, + "geometry_index": 26, + "location": [-122.423778, 37.805275] + }, + { + "entry": [false, true, true], + "in": 0, + "bearings": [81, 261, 349], + "duration": 4.1, + "turn_weight": 0.672, + "turn_duration": 0.3, + "admin_index": 0, + "out": 1, + "weight": 6.444, + "geometry_index": 28, + "location": [-122.424037, 37.805243] + }, + { + "entry": [false, true, true], + "in": 0, + "bearings": [81, 261, 351], + "duration": 7.5, + "turn_weight": 0.672, + "turn_duration": 0.3, + "admin_index": 0, + "out": 1, + "weight": 11.878, + "geometry_index": 29, + "location": [-122.424254, 37.805216] + }, + { + "entry": [false, true, true], + "in": 0, + "bearings": [81, 261, 351], + "duration": 4.1, + "turn_weight": 0.672, + "turn_duration": 0.3, + "admin_index": 0, + "out": 1, + "weight": 6.444, + "geometry_index": 31, + "location": [-122.424641, 37.805168] + }, + { + "entry": [false, true, true], + "in": 0, + "bearings": [81, 261, 351], + "duration": 5.1, + "turn_weight": 0.672, + "turn_duration": 0.3, + "admin_index": 0, + "out": 1, + "weight": 7.963, + "geometry_index": 32, + "location": [-122.424856, 37.805141] + }, + { + "entry": [false, false, true, false], + "in": 0, + "bearings": [81, 168, 261, 349], + "duration": 3.1, + "turn_weight": 3.36, + "turn_duration": 1.5, + "admin_index": 0, + "out": 2, + "weight": 5.79, + "geometry_index": 33, + "location": [-122.425126, 37.805108] + }, + { + "bearings": [3, 81, 179, 261], + "entry": [true, false, false, true], + "in": 1, + "turn_weight": 5.04, + "turn_duration": 2.25, + "admin_index": 0, + "out": 3, + "geometry_index": 34, + "location": [-122.425218, 37.805097] + } + ], + "bannerInstructions": [ + { + "primary": { + "type": "end of road", + "modifier": "left", + "text": "Van Ness Avenue", + "components": [ + { "text": "Van Ness Avenue", "type": "text" } + ] + }, + "distanceAlongGeometry": 447.0 + } + ], + "speedLimitUnit": "mph", + "maneuver": { + "modifier": "right", + "instruction": "Turn right onto North Point Street.", + "type": "turn", + "bearing_after": 261, + "bearing_before": 171, + "location": [-122.420384, 37.805728] + }, + "speedLimitSign": "mutcd", + "name": "North Point Street", + "duration": 104.536, + "distance": 447.0, + "driving_side": "left", + "weight": 186.401, + "mode": "cycling", + "geometry": "_inbgA~h}nhFBXVbEHpAjIhrAPnCz@vEj@~CvEpt@x@jMtAxTXpEZvEd@vHXlEt@pL|AzV@Ht@lL`AzOTvDj@dJ" + }, + { + "voiceInstructions": [ + { + "ssmlAnnouncement": "Turn right onto Bay Street.", + "announcement": "Turn right onto Bay Street.", + "distanceAlongGeometry": 40.0 + } + ], + "intersections": [ + { + "entry": [false, true, false], + "in": 0, + "bearings": [81, 169, 344], + "duration": 5.6, + "turn_weight": 6.902, + "turn_duration": 0.6, + "admin_index": 0, + "out": 1, + "weight": 18.026, + "geometry_index": 35, + "location": [-122.425397, 37.805075] + }, + { + "entry": [true, false], + "in": 1, + "bearings": [171, 350], + "duration": 4.7, + "turn_weight": 0.672, + "turn_duration": 0.3, + "admin_index": 0, + "out": 0, + "weight": 10.461, + "geometry_index": 37, + "location": [-122.425345, 37.804852] + }, + { + "entry": [true, false], + "in": 1, + "bearings": [171, 351], + "duration": 11.34, + "turn_weight": 0.672, + "turn_duration": 0.3, + "admin_index": 0, + "out": 0, + "weight": 27.304, + "geometry_index": 38, + "location": [-122.425306, 37.804657] + }, + { + "bearings": [82, 172, 260, 351], + "entry": [false, true, false, false], + "in": 3, + "turn_weight": 3.36, + "turn_duration": 1.5, + "admin_index": 0, + "out": 1, + "geometry_index": 39, + "location": [-122.425221, 37.804248] + } + ], + "bannerInstructions": [ + { + "primary": { + "type": "turn", + "modifier": "right", + "text": "Bay Street", + "components": [{ "text": "Bay Street", "type": "text" }] + }, + "distanceAlongGeometry": 105.0 + } + ], + "speedLimitUnit": "mph", + "maneuver": { + "modifier": "left", + "instruction": "Turn left onto Van Ness Avenue.", + "type": "end of road", + "bearing_after": 169, + "bearing_before": 261, + "location": [-122.425397, 37.805075] + }, + "speedLimitSign": "mutcd", + "name": "Van Ness Avenue", + "duration": 25.54, + "distance": 105.0, + "driving_side": "left", + "weight": 64.49, + "mode": "cycling", + "geometry": "e`mbgAhbgohFdDo@vGw@dKmApXiDrEe@" + }, + { + "voiceInstructions": [ + { + "ssmlAnnouncement": "Turn right onto Franklin Street.", + "announcement": "Turn right onto Franklin Street.", + "distanceAlongGeometry": 68.8 + } + ], + "intersections": [ + { + "entry": [true, true, true, false], + "in": 3, + "bearings": [82, 170, 261, 352], + "duration": 9.2, + "turn_weight": 49.44, + "turn_duration": 7.0, + "admin_index": 0, + "out": 2, + "weight": 54.914, + "geometry_index": 40, + "location": [-122.425202, 37.804142] + }, + { + "entry": [false, false, true, false], + "in": 0, + "bearings": [81, 170, 261, 349], + "duration": 3.15, + "turn_weight": 1.71, + "turn_duration": 0.75, + "admin_index": 0, + "out": 2, + "weight": 7.682, + "geometry_index": 41, + "location": [-122.425323, 37.804127] + }, + { + "bearings": [81, 261, 352], + "entry": [false, true, true], + "in": 0, + "turn_weight": 0.342, + "turn_duration": 0.15, + "admin_index": 0, + "out": 1, + "geometry_index": 42, + "location": [-122.425461, 37.804109] + } + ], + "bannerInstructions": [ + { + "primary": { + "type": "turn", + "modifier": "right", + "text": "Franklin Street", + "components": [ + { "text": "Franklin Street", "type": "text" } + ] + }, + "distanceAlongGeometry": 140.0 + } + ], + "speedLimitUnit": "mph", + "maneuver": { + "modifier": "right", + "instruction": "Turn right onto Bay Street.", + "type": "turn", + "bearing_after": 261, + "bearing_before": 172, + "location": [-122.425202, 37.804142] + }, + "speedLimitSign": "mutcd", + "name": "Bay Street", + "duration": 29.348, + "distance": 140.0, + "driving_side": "left", + "weight": 105.493, + "mode": "cycling", + "geometry": "{ekbgAbvfohF\\pFb@rGpH`kAVbE" + }, + { + "voiceInstructions": [ + { + "ssmlAnnouncement": "In 100 meters, Bear left onto Pope Road.", + "announcement": "In 100 meters, Bear left onto Pope Road.", + "distanceAlongGeometry": 134.1 + }, + { + "ssmlAnnouncement": "Bear left onto Pope Road.", + "announcement": "Bear left onto Pope Road.", + "distanceAlongGeometry": 40.0 + } + ], + "intersections": [ + { + "entry": [false, false, true, true, false, true], + "in": 1, + "bearings": [25, 81, 170, 260, 320, 351], + "duration": 10.6, + "turn_weight": 26.5, + "turn_duration": 5.0, + "admin_index": 0, + "out": 5, + "weight": 35.292, + "geometry_index": 44, + "location": [-122.426776, 37.803944] + }, + { + "entry": [true, false, false], + "in": 1, + "bearings": [11, 171, 339], + "duration": 29.28, + "turn_weight": 3.72, + "turn_duration": 1.2, + "admin_index": 0, + "out": 0, + "weight": 53.071, + "geometry_index": 46, + "location": [-122.426826, 37.804193] + }, + { + "entry": [true, false, true, true], + "in": 1, + "bearings": [106, 166, 270, 343], + "duration": 3.85, + "turn_weight": 4.95, + "turn_duration": 2.25, + "admin_index": 0, + "out": 3, + "weight": 7.462, + "geometry_index": 52, + "location": [-122.427041, 37.805217] + }, + { + "bearings": [84, 163, 342], + "entry": [false, false, true], + "in": 1, + "turn_weight": 0.99, + "turn_duration": 0.45, + "admin_index": 0, + "out": 2, + "geometry_index": 53, + "location": [-122.427068, 37.805285] + } + ], + "bannerInstructions": [ + { + "primary": { + "type": "turn", + "modifier": "slight left", + "text": "Pope Road", + "components": [{ "text": "Pope Road", "type": "text" }] + }, + "distanceAlongGeometry": 170.0 + } + ], + "speedLimitUnit": "mph", + "maneuver": { + "modifier": "right", + "instruction": "Turn right onto Franklin Street.", + "type": "turn", + "bearing_after": 351, + "bearing_before": 261, + "location": [-122.426776, 37.803944] + }, + "speedLimitSign": "mutcd", + "name": "Franklin Street", + "duration": 47.58, + "distance": 170.0, + "driving_side": "left", + "weight": 102.153, + "mode": "cycling", + "geometry": "oyjbgAnxiohFyEj@wGv@eD{@uBCaCL}LlByKtBiWzFgCt@cHtB" + }, + { + "voiceInstructions": [ + { + "ssmlAnnouncement": "In 100 meters, Turn left onto Funston Road.", + "announcement": "In 100 meters, Turn left onto Funston Road.", + "distanceAlongGeometry": 147.9 + }, + { + "ssmlAnnouncement": "Turn left onto Funston Road.", + "announcement": "Turn left onto Funston Road.", + "distanceAlongGeometry": 45.3 + } + ], + "intersections": [ + { + "entry": [true, false, true, true, true, true], + "in": 1, + "bearings": [84, 162, 187, 239, 315, 345], + "duration": 4.25, + "turn_weight": 10.625, + "turn_duration": 2.25, + "admin_index": 0, + "out": 4, + "weight": 13.765, + "geometry_index": 54, + "location": [-122.427127, 37.805431] + }, + { + "entry": [false, false, false, true], + "in": 1, + "bearings": [70, 135, 260, 312], + "duration": 15.25, + "turn_weight": 4.95, + "turn_duration": 2.25, + "admin_index": 0, + "out": 3, + "weight": 25.36, + "geometry_index": 55, + "location": [-122.427204, 37.805492] + }, + { + "entry": [false, true, true], + "in": 0, + "bearings": [147, 222, 332], + "duration": 22.77, + "turn_weight": 0.99, + "turn_duration": 0.45, + "admin_index": 0, + "out": 2, + "weight": 40.217, + "geometry_index": 60, + "location": [-122.427707, 37.805914] + }, + { + "bearings": [76, 165, 255, 345], + "entry": [false, false, false, true], + "in": 1, + "turn_weight": 4.95, + "turn_duration": 2.25, + "admin_index": 0, + "out": 3, + "geometry_index": 64, + "location": [-122.428168, 37.806658] + } + ], + "bannerInstructions": [ + { + "primary": { + "type": "end of road", + "modifier": "left", + "text": "Funston Road", + "components": [{ "text": "Funston Road", "type": "text" }] + }, + "distanceAlongGeometry": 209.0 + } + ], + "speedLimitUnit": "mph", + "maneuver": { + "modifier": "slight left", + "instruction": "Bear left onto Pope Road.", + "type": "turn", + "bearing_after": 315, + "bearing_before": 342, + "location": [-122.427127, 37.805431] + }, + "speedLimitSign": "mutcd", + "name": "Pope Road", + "duration": 51.229, + "distance": 209.0, + "driving_side": "left", + "weight": 94.574, + "mode": "cycling", + "geometry": "mvmbgAlnjohFyBxCs@|@yIfOaBxBiBdBqFfEsEhCcVfQ{B~@{KfCmUjF" + }, + { + "voiceInstructions": [ + { + "ssmlAnnouncement": "Turn right. Then Your destination will be on the left.", + "announcement": "Turn right. Then Your destination will be on the left.", + "distanceAlongGeometry": 66.7 + } + ], + "intersections": [ + { + "entry": [true, false, true], + "in": 1, + "bearings": [77, 165, 256], + "duration": 4.9, + "turn_weight": 7.79, + "turn_duration": 0.9, + "admin_index": 0, + "out": 2, + "weight": 14.07, + "geometry_index": 65, + "location": [-122.428286, 37.807017] + }, + { + "bearings": [76, 166, 255], + "entry": [false, false, true], + "in": 0, + "turn_weight": 0.99, + "turn_duration": 0.45, + "admin_index": 0, + "out": 2, + "geometry_index": 67, + "location": [-122.428507, 37.806974] + } + ], + "bannerInstructions": [ + { + "primary": { + "type": "turn", + "modifier": "right", + "text": "Turn right.", + "components": [{ "text": "Turn right.", "type": "text" }] + }, + "distanceAlongGeometry": 95.0 + } + ], + "speedLimitUnit": "mph", + "maneuver": { + "modifier": "left", + "instruction": "Turn left onto Funston Road.", + "type": "end of road", + "bearing_after": 256, + "bearing_before": 345, + "location": [-122.428286, 37.807017] + }, + "speedLimitSign": "mutcd", + "name": "Funston Road", + "duration": 16.15, + "distance": 95.0, + "driving_side": "left", + "weight": 32.421, + "mode": "cycling", + "geometry": "qypbgAzvlohFXfCz@pHnC|T}OjDgEtA" + }, + { + "voiceInstructions": [ + { + "ssmlAnnouncement": "Your destination is on the left.", + "announcement": "Your destination is on the left.", + "distanceAlongGeometry": 40.0 + } + ], + "intersections": [ + { + "entry": [true, false, true], + "in": 1, + "bearings": [86, 162, 279], + "duration": 7.812, + "turn_weight": 86.6, + "turn_duration": 4.0, + "admin_index": 0, + "out": 0, + "weight": 93.039, + "geometry_index": 70, + "location": [-122.428987, 37.807273] + }, + { + "bearings": [25, 79, 266], + "entry": [false, true, false], + "in": 2, + "turn_weight": 1.17, + "turn_duration": 0.45, + "admin_index": 0, + "out": 1, + "geometry_index": 71, + "location": [-122.428778, 37.807285] + } + ], + "bannerInstructions": [ + { + "primary": { + "type": "arrive", + "modifier": "left", + "text": "Your destination is on the left.", + "components": [ + { + "text": "Your destination is on the left.", + "type": "text" + } + ] + }, + "distanceAlongGeometry": 42.314 + } + ], + "speedLimitUnit": "mph", + "maneuver": { + "modifier": "right", + "instruction": "Turn right.", + "type": "turn", + "bearing_after": 86, + "bearing_before": 342, + "location": [-122.428987, 37.807273] + }, + "speedLimitSign": "mutcd", + "name": "", + "duration": 14.097, + "distance": 42.314, + "driving_side": "left", + "weight": 104.942, + "mode": "cycling", + "geometry": "qiqbgAtbnohFWaL]gBWmFf@cE" + }, + { + "intersections": [ + { + "bearings": [276], + "entry": [true], + "in": 0, + "admin_index": 0, + "geometry_index": 74, + "location": [-122.428509, 37.807292] + } + ], + "voiceInstructions": [], + "bannerInstructions": [], + "speedLimitUnit": "mph", + "maneuver": { + "modifier": "left", + "instruction": "Your destination is on the left.", + "type": "arrive", + "bearing_after": 0, + "bearing_before": 96, + "location": [-122.428509, 37.807292] + }, + "speedLimitSign": "mutcd", + "name": "", + "duration": 0.0, + "distance": 0.0, + "driving_side": "left", + "weight": 0.0, + "mode": "cycling", + "geometry": "wjqbgAxdmohF??" + } + ], + "distance": 1514.872, + "summary": "Hyde Street, North Point Street" + } + ], + "geometry": "_erbgA|}{nhFpDhk@fAbP?hEpCYlAQhAi@dA]d[oDvIaAbFgAXCbCOhn@iHjEi@BXVbEHpAjIhrAPnCz@vEj@~CvEpt@x@jMtAxTXpEZvEd@vHXlEt@pL|AzV@Ht@lL`AzOTvDj@dJdDo@vGw@dKmApXiDrEe@\\pFb@rGpH`kAVbEyEj@wGv@eD{@uBCaCL}LlByKtBiWzFgCt@cHtByBxCs@|@yIfOaBxBiBdBqFfEsEhCcVfQ{B~@{KfCmUjFXfCz@pHnC|T}OjDgEtAWaL]gBWmFf@cE" + } + ], + "waypoints": [ + { + "distance": 6.693, + "name": "Jefferson Street", + "location": [-122.419695, 37.807712] + }, + { "distance": 33.988, "name": "", "location": [-122.428509, 37.807292] } + ], + "code": "Ok" +} diff --git a/web/package-lock.json b/web/package-lock.json index e16d63ec..c38cec2b 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -1,12 +1,12 @@ { "name": "@stadiamaps/ferrostar-webcomponents", - "version": "0.12.0", + "version": "0.13.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@stadiamaps/ferrostar-webcomponents", - "version": "0.12.0", + "version": "0.13.0", "license": "BSD-3-Clause", "dependencies": { "@stadiamaps/ferrostar": "file:../common/ferrostar/pkg", diff --git a/web/package.json b/web/package.json index 013d9579..7307795b 100644 --- a/web/package.json +++ b/web/package.json @@ -6,7 +6,7 @@ "CatMe0w (https://github.com/CatMe0w)", "Luke Seelenbinder " ], - "version": "0.12.0", + "version": "0.13.0", "license": "BSD-3-Clause", "type": "module", "main": "./dist/ferrostar-webcomponents.js", From a887242c589aa4ef1aa71730fd44b4f548537612 Mon Sep 17 00:00:00 2001 From: Jacob Fielding Date: Sun, 22 Sep 2024 17:50:32 -0700 Subject: [PATCH 02/20] WIP for publishing a current annotations object --- sample.json | 1117 --------------------------------------------------- 1 file changed, 1117 deletions(-) delete mode 100644 sample.json diff --git a/sample.json b/sample.json deleted file mode 100644 index 55ad0285..00000000 --- a/sample.json +++ /dev/null @@ -1,1117 +0,0 @@ -{ - "routes": [ - { - "voiceLocale": "en-US", - "weight_name": "bicycle", - "weight": 983.142, - "duration": 380.368, - "distance": 1514.872, - "legs": [ - { - "via_waypoints": [], - "annotation": { - "maxspeed": [ - { "unknown": true }, - { "unknown": true }, - { "unknown": true }, - { "unknown": true }, - { "unknown": true }, - { "unknown": true }, - { "unknown": true }, - { "unknown": true }, - { "unknown": true }, - { "unknown": true }, - { "unknown": true }, - { "unknown": true }, - { "unknown": true }, - { "unknown": true }, - { "speed": 40, "unit": "km/h" }, - { "speed": 40, "unit": "km/h" }, - { "speed": 40, "unit": "km/h" }, - { "speed": 40, "unit": "km/h" }, - { "speed": 40, "unit": "km/h" }, - { "speed": 40, "unit": "km/h" }, - { "speed": 40, "unit": "km/h" }, - { "speed": 40, "unit": "km/h" }, - { "speed": 40, "unit": "km/h" }, - { "speed": 40, "unit": "km/h" }, - { "speed": 40, "unit": "km/h" }, - { "speed": 40, "unit": "km/h" }, - { "speed": 40, "unit": "km/h" }, - { "speed": 40, "unit": "km/h" }, - { "speed": 40, "unit": "km/h" }, - { "speed": 40, "unit": "km/h" }, - { "speed": 40, "unit": "km/h" }, - { "speed": 40, "unit": "km/h" }, - { "speed": 40, "unit": "km/h" }, - { "speed": 40, "unit": "km/h" }, - { "speed": 40, "unit": "km/h" }, - { "unknown": true }, - { "unknown": true }, - { "unknown": true }, - { "unknown": true }, - { "unknown": true }, - { "speed": 40, "unit": "km/h" }, - { "speed": 40, "unit": "km/h" }, - { "speed": 40, "unit": "km/h" }, - { "speed": 40, "unit": "km/h" }, - { "speed": 40, "unit": "km/h" }, - { "speed": 40, "unit": "km/h" }, - { "speed": 40, "unit": "km/h" }, - { "speed": 40, "unit": "km/h" }, - { "speed": 40, "unit": "km/h" }, - { "speed": 40, "unit": "km/h" }, - { "speed": 40, "unit": "km/h" }, - { "speed": 40, "unit": "km/h" }, - { "speed": 40, "unit": "km/h" }, - { "speed": 40, "unit": "km/h" }, - { "unknown": true }, - { "unknown": true }, - { "unknown": true }, - { "unknown": true }, - { "unknown": true }, - { "unknown": true }, - { "unknown": true }, - { "unknown": true }, - { "unknown": true }, - { "unknown": true }, - { "unknown": true }, - { "unknown": true }, - { "unknown": true }, - { "unknown": true }, - { "unknown": true }, - { "unknown": true }, - { "unknown": true }, - { "unknown": true }, - { "unknown": true }, - { "unknown": true } - ], - "speed": [ - 5.0, 5.0, 5.0, 5.0, 3.3, 3.3, 3.3, 3.3, 4.7, 4.7, 5.0, 5.0, 2.8, - 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 6.1, 6.1, 6.1, 5.0, 5.0, - 5.0, 5.0, 5.0, 4.7, 4.7, 5.0, 5.0, 5.0, 4.2, 5.0, 5.0, 5.0, 4.2, - 5.0, 5.0, 5.0, 6.9, 6.9, 5.0, 5.0, 4.2, 4.2, 4.2, 4.2, 4.2, 4.2, - 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 4.2, 4.2, 4.2, 4.2, 6.1, - 5.0, 5.0, 6.9, 6.9, 6.9, 4.7, 4.2, 4.2, 4.2 - ], - "distance": [ - 63.1, 24.4, 8.9, 8.2, 4.4, 4.5, 4.1, 50.8, 19.4, 13.1, 1.5, 7.4, - 85.3, 11.5, 1.2, 8.7, 3.6, 118.7, 6.4, 10.1, 7.5, 76.3, 20.5, - 31.1, 9.3, 9.6, 13.9, 9.2, 19.3, 34.0, 0.4, 19.1, 24.0, 8.2, 15.9, - 9.5, 15.8, 22.0, 46.1, 11.9, 10.8, 12.3, 108.4, 8.7, 12.3, 15.8, - 9.6, 6.6, 7.3, 25.3, 23.4, 44.7, 7.9, 17.1, 9.6, 4.0, 29.9, 7.7, - 7.4, 16.1, 13.3, 48.5, 7.5, 23.7, 41.3, 6.2, 13.9, 31.9, 31.1, - 11.8, 18.4, 4.9, 10.6, 8.9 - ], - "duration": [ - 12.625, 4.886, 1.777, 1.641, 1.324, 1.354, 1.234, 15.239, 4.101, - 2.77, 0.291, 1.476, 30.702, 2.301, 0.234, 1.744, 0.73, 23.738, - 1.282, 2.014, 1.49, 12.49, 3.352, 5.084, 1.87, 1.925, 2.777, - 1.835, 3.864, 7.201, 0.094, 3.829, 4.806, 1.637, 3.824, 1.896, - 3.156, 4.395, 11.073, 2.384, 2.155, 2.46, 15.608, 1.256, 2.457, - 3.156, 2.306, 1.577, 1.743, 6.07, 5.617, 10.728, 1.587, 3.412, - 1.918, 0.795, 5.979, 1.53, 1.482, 3.217, 3.185, 11.649, 1.789, - 5.688, 6.756, 1.231, 2.773, 4.593, 4.479, 1.693, 3.903, 1.168, - 2.532, 2.135 - ] - }, - "admins": [{ "iso_3166_1_alpha3": "USA", "iso_3166_1": "US" }], - "weight": 983.142, - "duration": 380.368, - "steps": [ - { - "voiceInstructions": [ - { - "ssmlAnnouncement": "Bike west on Jefferson Street. Then Turn left onto Hyde Street.", - "announcement": "Bike west on Jefferson Street. Then Turn left onto Hyde Street.", - "distanceAlongGeometry": 96.6 - }, - { - "ssmlAnnouncement": "Turn left onto Hyde Street.", - "announcement": "Turn left onto Hyde Street.", - "distanceAlongGeometry": 41.0 - } - ], - "intersections": [ - { - "entry": [true], - "bearings": [261], - "duration": 12.711, - "admin_index": 0, - "out": 0, - "weight": 25.676, - "geometry_index": 0, - "location": [-122.419695, 37.807712] - }, - { - "entry": [false, true, true], - "in": 0, - "bearings": [81, 261, 351], - "duration": 5.1, - "turn_weight": 0.672, - "turn_duration": 0.3, - "admin_index": 0, - "out": 1, - "weight": 10.367, - "geometry_index": 1, - "location": [-122.420404, 37.807623] - }, - { - "bearings": [81, 170, 270, 352], - "entry": [false, false, true, false], - "in": 0, - "turn_weight": 3.36, - "turn_duration": 1.5, - "admin_index": 0, - "out": 2, - "geometry_index": 2, - "location": [-122.420678, 37.807587] - } - ], - "bannerInstructions": [ - { - "primary": { - "type": "turn", - "modifier": "left", - "text": "Hyde Street", - "components": [{ "text": "Hyde Street", "type": "text" }] - }, - "distanceAlongGeometry": 96.557 - } - ], - "speedLimitUnit": "mph", - "maneuver": { - "instruction": "Bike west on Jefferson Street.", - "type": "depart", - "bearing_after": 261, - "bearing_before": 0, - "location": [-122.419695, 37.807712] - }, - "speedLimitSign": "mutcd", - "name": "Jefferson Street", - "duration": 21.111, - "distance": 96.557, - "driving_side": "left", - "weight": 43.039, - "mode": "cycling", - "geometry": "_erbgA|}{nhFpDhk@fAbP?hE" - }, - { - "voiceInstructions": [ - { - "ssmlAnnouncement": "Continue for 200 meters.", - "announcement": "Continue for 200 meters.", - "distanceAlongGeometry": 200.0 - }, - { - "ssmlAnnouncement": "In 90 meters, Turn right onto North Point Street.", - "announcement": "In 90 meters, Turn right onto North Point Street.", - "distanceAlongGeometry": 94.4 - }, - { - "ssmlAnnouncement": "Turn right onto North Point Street.", - "announcement": "Turn right onto North Point Street.", - "distanceAlongGeometry": 40.0 - } - ], - "intersections": [ - { - "entry": [false, true, true, true], - "in": 0, - "bearings": [90, 172, 269, 353], - "duration": 2.2, - "turn_weight": 6.902, - "turn_duration": 0.6, - "admin_index": 0, - "out": 1, - "weight": 10.217, - "geometry_index": 3, - "location": [-122.420779, 37.807587] - }, - { - "entry": [false, true, false, false], - "in": 3, - "bearings": [82, 166, 259, 352], - "duration": 20.7, - "turn_weight": 3.36, - "turn_duration": 1.5, - "admin_index": 0, - "out": 1, - "weight": 71.215, - "geometry_index": 4, - "location": [-122.420766, 37.807514] - }, - { - "entry": [true, false], - "in": 1, - "bearings": [171, 351], - "duration": 4.324, - "turn_weight": 0.672, - "turn_duration": 0.3, - "admin_index": 0, - "out": 0, - "weight": 9.158, - "geometry_index": 8, - "location": [-122.420633, 37.806952] - }, - { - "entry": [false, true, false, false], - "in": 3, - "bearings": [107, 166, 289, 351], - "duration": 4.253, - "turn_weight": 3.36, - "turn_duration": 1.5, - "admin_index": 0, - "out": 1, - "weight": 9.166, - "geometry_index": 9, - "location": [-122.4206, 37.80678] - }, - { - "entry": [true, true, true, false], - "in": 3, - "bearings": [86, 174, 260, 346], - "duration": 3.3, - "turn_weight": 3.36, - "turn_duration": 1.5, - "admin_index": 0, - "out": 1, - "weight": 7.089, - "geometry_index": 10, - "location": [-122.420564, 37.806666] - }, - { - "entry": [false, true, false, false], - "in": 3, - "bearings": [82, 171, 260, 354], - "duration": 32.1, - "turn_weight": 3.36, - "turn_duration": 1.5, - "admin_index": 0, - "out": 1, - "weight": 134.453, - "geometry_index": 12, - "location": [-122.420554, 37.806587] - }, - { - "bearings": [82, 171, 260, 351], - "entry": [false, true, false, false], - "in": 3, - "turn_weight": 3.36, - "turn_duration": 1.5, - "admin_index": 0, - "out": 1, - "geometry_index": 13, - "location": [-122.420405, 37.80583] - } - ], - "bannerInstructions": [ - { - "primary": { - "type": "turn", - "modifier": "right", - "text": "North Point Street", - "components": [ - { "text": "North Point Street", "type": "text" } - ] - }, - "distanceAlongGeometry": 210.0 - } - ], - "speedLimitUnit": "mph", - "maneuver": { - "modifier": "left", - "instruction": "Turn left onto Hyde Street.", - "type": "turn", - "bearing_after": 172, - "bearing_before": 270, - "location": [-122.420779, 37.807587] - }, - "speedLimitSign": "mutcd", - "name": "Hyde Street", - "duration": 70.776, - "distance": 210.0, - "driving_side": "left", - "weight": 249.63, - "mode": "cycling", - "geometry": "e}qbgAta~nhFpCYlAQhAi@dA]d[oDvIaAbFgAXCbCOhn@iHjEi@" - }, - { - "voiceInstructions": [ - { - "ssmlAnnouncement": "Continue for 400 meters.", - "announcement": "Continue for 400 meters.", - "distanceAlongGeometry": 437.0 - }, - { - "ssmlAnnouncement": "In 100 meters, Turn left onto Van Ness Avenue.", - "announcement": "In 100 meters, Turn left onto Van Ness Avenue.", - "distanceAlongGeometry": 138.9 - }, - { - "ssmlAnnouncement": "Turn left onto Van Ness Avenue.", - "announcement": "Turn left onto Van Ness Avenue.", - "distanceAlongGeometry": 40.0 - } - ], - "intersections": [ - { - "entry": [true, true, true, false], - "in": 3, - "bearings": [82, 172, 261, 351], - "duration": 5.0, - "turn_weight": 18.23, - "turn_duration": 3.0, - "admin_index": 0, - "out": 2, - "weight": 21.268, - "geometry_index": 14, - "location": [-122.420384, 37.805728] - }, - { - "entry": [false, false, true, false], - "in": 0, - "bearings": [81, 172, 261, 351], - "duration": 27.3, - "turn_weight": 3.36, - "turn_duration": 1.5, - "admin_index": 0, - "out": 2, - "weight": 42.547, - "geometry_index": 16, - "location": [-122.420495, 37.805714] - }, - { - "entry": [false, false, true, false], - "in": 0, - "bearings": [81, 170, 251, 351], - "duration": 3.5, - "turn_weight": 3.825, - "turn_duration": 1.5, - "admin_index": 0, - "out": 2, - "weight": 6.863, - "geometry_index": 19, - "location": [-122.421941, 37.805534] - }, - { - "entry": [true, false, true, true], - "in": 1, - "bearings": [1, 71, 182, 251], - "duration": 3.1, - "turn_weight": 3.36, - "turn_duration": 1.5, - "admin_index": 0, - "out": 3, - "weight": 5.79, - "geometry_index": 20, - "location": [-122.422049, 37.805504] - }, - { - "entry": [false, false, true, false], - "in": 0, - "bearings": [71, 170, 261, 351], - "duration": 13.936, - "turn_weight": 3.36, - "turn_duration": 1.5, - "admin_index": 0, - "out": 2, - "weight": 21.783, - "geometry_index": 21, - "location": [-122.422129, 37.805482] - }, - { - "entry": [false, false, true], - "in": 0, - "bearings": [81, 242, 261], - "duration": 8.809, - "turn_weight": 0.672, - "turn_duration": 0.3, - "admin_index": 0, - "out": 2, - "weight": 13.277, - "geometry_index": 22, - "location": [-122.422986, 37.805374] - }, - { - "entry": [false, false, true, false], - "in": 0, - "bearings": [81, 170, 261, 351], - "duration": 3.3, - "turn_weight": 3.36, - "turn_duration": 1.5, - "admin_index": 0, - "out": 2, - "weight": 6.094, - "geometry_index": 24, - "location": [-122.423565, 37.805302] - }, - { - "entry": [false, true, true, true, true], - "in": 0, - "bearings": [81, 111, 170, 261, 351], - "duration": 3.5, - "turn_weight": 3.36, - "turn_duration": 1.5, - "admin_index": 0, - "out": 3, - "weight": 6.398, - "geometry_index": 25, - "location": [-122.42367, 37.805289] - }, - { - "entry": [false, false, true, false], - "in": 0, - "bearings": [81, 170, 261, 351], - "duration": 6.1, - "turn_weight": 3.36, - "turn_duration": 1.5, - "admin_index": 0, - "out": 2, - "weight": 10.347, - "geometry_index": 26, - "location": [-122.423778, 37.805275] - }, - { - "entry": [false, true, true], - "in": 0, - "bearings": [81, 261, 349], - "duration": 4.1, - "turn_weight": 0.672, - "turn_duration": 0.3, - "admin_index": 0, - "out": 1, - "weight": 6.444, - "geometry_index": 28, - "location": [-122.424037, 37.805243] - }, - { - "entry": [false, true, true], - "in": 0, - "bearings": [81, 261, 351], - "duration": 7.5, - "turn_weight": 0.672, - "turn_duration": 0.3, - "admin_index": 0, - "out": 1, - "weight": 11.878, - "geometry_index": 29, - "location": [-122.424254, 37.805216] - }, - { - "entry": [false, true, true], - "in": 0, - "bearings": [81, 261, 351], - "duration": 4.1, - "turn_weight": 0.672, - "turn_duration": 0.3, - "admin_index": 0, - "out": 1, - "weight": 6.444, - "geometry_index": 31, - "location": [-122.424641, 37.805168] - }, - { - "entry": [false, true, true], - "in": 0, - "bearings": [81, 261, 351], - "duration": 5.1, - "turn_weight": 0.672, - "turn_duration": 0.3, - "admin_index": 0, - "out": 1, - "weight": 7.963, - "geometry_index": 32, - "location": [-122.424856, 37.805141] - }, - { - "entry": [false, false, true, false], - "in": 0, - "bearings": [81, 168, 261, 349], - "duration": 3.1, - "turn_weight": 3.36, - "turn_duration": 1.5, - "admin_index": 0, - "out": 2, - "weight": 5.79, - "geometry_index": 33, - "location": [-122.425126, 37.805108] - }, - { - "bearings": [3, 81, 179, 261], - "entry": [true, false, false, true], - "in": 1, - "turn_weight": 5.04, - "turn_duration": 2.25, - "admin_index": 0, - "out": 3, - "geometry_index": 34, - "location": [-122.425218, 37.805097] - } - ], - "bannerInstructions": [ - { - "primary": { - "type": "end of road", - "modifier": "left", - "text": "Van Ness Avenue", - "components": [ - { "text": "Van Ness Avenue", "type": "text" } - ] - }, - "distanceAlongGeometry": 447.0 - } - ], - "speedLimitUnit": "mph", - "maneuver": { - "modifier": "right", - "instruction": "Turn right onto North Point Street.", - "type": "turn", - "bearing_after": 261, - "bearing_before": 171, - "location": [-122.420384, 37.805728] - }, - "speedLimitSign": "mutcd", - "name": "North Point Street", - "duration": 104.536, - "distance": 447.0, - "driving_side": "left", - "weight": 186.401, - "mode": "cycling", - "geometry": "_inbgA~h}nhFBXVbEHpAjIhrAPnCz@vEj@~CvEpt@x@jMtAxTXpEZvEd@vHXlEt@pL|AzV@Ht@lL`AzOTvDj@dJ" - }, - { - "voiceInstructions": [ - { - "ssmlAnnouncement": "Turn right onto Bay Street.", - "announcement": "Turn right onto Bay Street.", - "distanceAlongGeometry": 40.0 - } - ], - "intersections": [ - { - "entry": [false, true, false], - "in": 0, - "bearings": [81, 169, 344], - "duration": 5.6, - "turn_weight": 6.902, - "turn_duration": 0.6, - "admin_index": 0, - "out": 1, - "weight": 18.026, - "geometry_index": 35, - "location": [-122.425397, 37.805075] - }, - { - "entry": [true, false], - "in": 1, - "bearings": [171, 350], - "duration": 4.7, - "turn_weight": 0.672, - "turn_duration": 0.3, - "admin_index": 0, - "out": 0, - "weight": 10.461, - "geometry_index": 37, - "location": [-122.425345, 37.804852] - }, - { - "entry": [true, false], - "in": 1, - "bearings": [171, 351], - "duration": 11.34, - "turn_weight": 0.672, - "turn_duration": 0.3, - "admin_index": 0, - "out": 0, - "weight": 27.304, - "geometry_index": 38, - "location": [-122.425306, 37.804657] - }, - { - "bearings": [82, 172, 260, 351], - "entry": [false, true, false, false], - "in": 3, - "turn_weight": 3.36, - "turn_duration": 1.5, - "admin_index": 0, - "out": 1, - "geometry_index": 39, - "location": [-122.425221, 37.804248] - } - ], - "bannerInstructions": [ - { - "primary": { - "type": "turn", - "modifier": "right", - "text": "Bay Street", - "components": [{ "text": "Bay Street", "type": "text" }] - }, - "distanceAlongGeometry": 105.0 - } - ], - "speedLimitUnit": "mph", - "maneuver": { - "modifier": "left", - "instruction": "Turn left onto Van Ness Avenue.", - "type": "end of road", - "bearing_after": 169, - "bearing_before": 261, - "location": [-122.425397, 37.805075] - }, - "speedLimitSign": "mutcd", - "name": "Van Ness Avenue", - "duration": 25.54, - "distance": 105.0, - "driving_side": "left", - "weight": 64.49, - "mode": "cycling", - "geometry": "e`mbgAhbgohFdDo@vGw@dKmApXiDrEe@" - }, - { - "voiceInstructions": [ - { - "ssmlAnnouncement": "Turn right onto Franklin Street.", - "announcement": "Turn right onto Franklin Street.", - "distanceAlongGeometry": 68.8 - } - ], - "intersections": [ - { - "entry": [true, true, true, false], - "in": 3, - "bearings": [82, 170, 261, 352], - "duration": 9.2, - "turn_weight": 49.44, - "turn_duration": 7.0, - "admin_index": 0, - "out": 2, - "weight": 54.914, - "geometry_index": 40, - "location": [-122.425202, 37.804142] - }, - { - "entry": [false, false, true, false], - "in": 0, - "bearings": [81, 170, 261, 349], - "duration": 3.15, - "turn_weight": 1.71, - "turn_duration": 0.75, - "admin_index": 0, - "out": 2, - "weight": 7.682, - "geometry_index": 41, - "location": [-122.425323, 37.804127] - }, - { - "bearings": [81, 261, 352], - "entry": [false, true, true], - "in": 0, - "turn_weight": 0.342, - "turn_duration": 0.15, - "admin_index": 0, - "out": 1, - "geometry_index": 42, - "location": [-122.425461, 37.804109] - } - ], - "bannerInstructions": [ - { - "primary": { - "type": "turn", - "modifier": "right", - "text": "Franklin Street", - "components": [ - { "text": "Franklin Street", "type": "text" } - ] - }, - "distanceAlongGeometry": 140.0 - } - ], - "speedLimitUnit": "mph", - "maneuver": { - "modifier": "right", - "instruction": "Turn right onto Bay Street.", - "type": "turn", - "bearing_after": 261, - "bearing_before": 172, - "location": [-122.425202, 37.804142] - }, - "speedLimitSign": "mutcd", - "name": "Bay Street", - "duration": 29.348, - "distance": 140.0, - "driving_side": "left", - "weight": 105.493, - "mode": "cycling", - "geometry": "{ekbgAbvfohF\\pFb@rGpH`kAVbE" - }, - { - "voiceInstructions": [ - { - "ssmlAnnouncement": "In 100 meters, Bear left onto Pope Road.", - "announcement": "In 100 meters, Bear left onto Pope Road.", - "distanceAlongGeometry": 134.1 - }, - { - "ssmlAnnouncement": "Bear left onto Pope Road.", - "announcement": "Bear left onto Pope Road.", - "distanceAlongGeometry": 40.0 - } - ], - "intersections": [ - { - "entry": [false, false, true, true, false, true], - "in": 1, - "bearings": [25, 81, 170, 260, 320, 351], - "duration": 10.6, - "turn_weight": 26.5, - "turn_duration": 5.0, - "admin_index": 0, - "out": 5, - "weight": 35.292, - "geometry_index": 44, - "location": [-122.426776, 37.803944] - }, - { - "entry": [true, false, false], - "in": 1, - "bearings": [11, 171, 339], - "duration": 29.28, - "turn_weight": 3.72, - "turn_duration": 1.2, - "admin_index": 0, - "out": 0, - "weight": 53.071, - "geometry_index": 46, - "location": [-122.426826, 37.804193] - }, - { - "entry": [true, false, true, true], - "in": 1, - "bearings": [106, 166, 270, 343], - "duration": 3.85, - "turn_weight": 4.95, - "turn_duration": 2.25, - "admin_index": 0, - "out": 3, - "weight": 7.462, - "geometry_index": 52, - "location": [-122.427041, 37.805217] - }, - { - "bearings": [84, 163, 342], - "entry": [false, false, true], - "in": 1, - "turn_weight": 0.99, - "turn_duration": 0.45, - "admin_index": 0, - "out": 2, - "geometry_index": 53, - "location": [-122.427068, 37.805285] - } - ], - "bannerInstructions": [ - { - "primary": { - "type": "turn", - "modifier": "slight left", - "text": "Pope Road", - "components": [{ "text": "Pope Road", "type": "text" }] - }, - "distanceAlongGeometry": 170.0 - } - ], - "speedLimitUnit": "mph", - "maneuver": { - "modifier": "right", - "instruction": "Turn right onto Franklin Street.", - "type": "turn", - "bearing_after": 351, - "bearing_before": 261, - "location": [-122.426776, 37.803944] - }, - "speedLimitSign": "mutcd", - "name": "Franklin Street", - "duration": 47.58, - "distance": 170.0, - "driving_side": "left", - "weight": 102.153, - "mode": "cycling", - "geometry": "oyjbgAnxiohFyEj@wGv@eD{@uBCaCL}LlByKtBiWzFgCt@cHtB" - }, - { - "voiceInstructions": [ - { - "ssmlAnnouncement": "In 100 meters, Turn left onto Funston Road.", - "announcement": "In 100 meters, Turn left onto Funston Road.", - "distanceAlongGeometry": 147.9 - }, - { - "ssmlAnnouncement": "Turn left onto Funston Road.", - "announcement": "Turn left onto Funston Road.", - "distanceAlongGeometry": 45.3 - } - ], - "intersections": [ - { - "entry": [true, false, true, true, true, true], - "in": 1, - "bearings": [84, 162, 187, 239, 315, 345], - "duration": 4.25, - "turn_weight": 10.625, - "turn_duration": 2.25, - "admin_index": 0, - "out": 4, - "weight": 13.765, - "geometry_index": 54, - "location": [-122.427127, 37.805431] - }, - { - "entry": [false, false, false, true], - "in": 1, - "bearings": [70, 135, 260, 312], - "duration": 15.25, - "turn_weight": 4.95, - "turn_duration": 2.25, - "admin_index": 0, - "out": 3, - "weight": 25.36, - "geometry_index": 55, - "location": [-122.427204, 37.805492] - }, - { - "entry": [false, true, true], - "in": 0, - "bearings": [147, 222, 332], - "duration": 22.77, - "turn_weight": 0.99, - "turn_duration": 0.45, - "admin_index": 0, - "out": 2, - "weight": 40.217, - "geometry_index": 60, - "location": [-122.427707, 37.805914] - }, - { - "bearings": [76, 165, 255, 345], - "entry": [false, false, false, true], - "in": 1, - "turn_weight": 4.95, - "turn_duration": 2.25, - "admin_index": 0, - "out": 3, - "geometry_index": 64, - "location": [-122.428168, 37.806658] - } - ], - "bannerInstructions": [ - { - "primary": { - "type": "end of road", - "modifier": "left", - "text": "Funston Road", - "components": [{ "text": "Funston Road", "type": "text" }] - }, - "distanceAlongGeometry": 209.0 - } - ], - "speedLimitUnit": "mph", - "maneuver": { - "modifier": "slight left", - "instruction": "Bear left onto Pope Road.", - "type": "turn", - "bearing_after": 315, - "bearing_before": 342, - "location": [-122.427127, 37.805431] - }, - "speedLimitSign": "mutcd", - "name": "Pope Road", - "duration": 51.229, - "distance": 209.0, - "driving_side": "left", - "weight": 94.574, - "mode": "cycling", - "geometry": "mvmbgAlnjohFyBxCs@|@yIfOaBxBiBdBqFfEsEhCcVfQ{B~@{KfCmUjF" - }, - { - "voiceInstructions": [ - { - "ssmlAnnouncement": "Turn right. Then Your destination will be on the left.", - "announcement": "Turn right. Then Your destination will be on the left.", - "distanceAlongGeometry": 66.7 - } - ], - "intersections": [ - { - "entry": [true, false, true], - "in": 1, - "bearings": [77, 165, 256], - "duration": 4.9, - "turn_weight": 7.79, - "turn_duration": 0.9, - "admin_index": 0, - "out": 2, - "weight": 14.07, - "geometry_index": 65, - "location": [-122.428286, 37.807017] - }, - { - "bearings": [76, 166, 255], - "entry": [false, false, true], - "in": 0, - "turn_weight": 0.99, - "turn_duration": 0.45, - "admin_index": 0, - "out": 2, - "geometry_index": 67, - "location": [-122.428507, 37.806974] - } - ], - "bannerInstructions": [ - { - "primary": { - "type": "turn", - "modifier": "right", - "text": "Turn right.", - "components": [{ "text": "Turn right.", "type": "text" }] - }, - "distanceAlongGeometry": 95.0 - } - ], - "speedLimitUnit": "mph", - "maneuver": { - "modifier": "left", - "instruction": "Turn left onto Funston Road.", - "type": "end of road", - "bearing_after": 256, - "bearing_before": 345, - "location": [-122.428286, 37.807017] - }, - "speedLimitSign": "mutcd", - "name": "Funston Road", - "duration": 16.15, - "distance": 95.0, - "driving_side": "left", - "weight": 32.421, - "mode": "cycling", - "geometry": "qypbgAzvlohFXfCz@pHnC|T}OjDgEtA" - }, - { - "voiceInstructions": [ - { - "ssmlAnnouncement": "Your destination is on the left.", - "announcement": "Your destination is on the left.", - "distanceAlongGeometry": 40.0 - } - ], - "intersections": [ - { - "entry": [true, false, true], - "in": 1, - "bearings": [86, 162, 279], - "duration": 7.812, - "turn_weight": 86.6, - "turn_duration": 4.0, - "admin_index": 0, - "out": 0, - "weight": 93.039, - "geometry_index": 70, - "location": [-122.428987, 37.807273] - }, - { - "bearings": [25, 79, 266], - "entry": [false, true, false], - "in": 2, - "turn_weight": 1.17, - "turn_duration": 0.45, - "admin_index": 0, - "out": 1, - "geometry_index": 71, - "location": [-122.428778, 37.807285] - } - ], - "bannerInstructions": [ - { - "primary": { - "type": "arrive", - "modifier": "left", - "text": "Your destination is on the left.", - "components": [ - { - "text": "Your destination is on the left.", - "type": "text" - } - ] - }, - "distanceAlongGeometry": 42.314 - } - ], - "speedLimitUnit": "mph", - "maneuver": { - "modifier": "right", - "instruction": "Turn right.", - "type": "turn", - "bearing_after": 86, - "bearing_before": 342, - "location": [-122.428987, 37.807273] - }, - "speedLimitSign": "mutcd", - "name": "", - "duration": 14.097, - "distance": 42.314, - "driving_side": "left", - "weight": 104.942, - "mode": "cycling", - "geometry": "qiqbgAtbnohFWaL]gBWmFf@cE" - }, - { - "intersections": [ - { - "bearings": [276], - "entry": [true], - "in": 0, - "admin_index": 0, - "geometry_index": 74, - "location": [-122.428509, 37.807292] - } - ], - "voiceInstructions": [], - "bannerInstructions": [], - "speedLimitUnit": "mph", - "maneuver": { - "modifier": "left", - "instruction": "Your destination is on the left.", - "type": "arrive", - "bearing_after": 0, - "bearing_before": 96, - "location": [-122.428509, 37.807292] - }, - "speedLimitSign": "mutcd", - "name": "", - "duration": 0.0, - "distance": 0.0, - "driving_side": "left", - "weight": 0.0, - "mode": "cycling", - "geometry": "wjqbgAxdmohF??" - } - ], - "distance": 1514.872, - "summary": "Hyde Street, North Point Street" - } - ], - "geometry": "_erbgA|}{nhFpDhk@fAbP?hEpCYlAQhAi@dA]d[oDvIaAbFgAXCbCOhn@iHjEi@BXVbEHpAjIhrAPnCz@vEj@~CvEpt@x@jMtAxTXpEZvEd@vHXlEt@pL|AzV@Ht@lL`AzOTvDj@dJdDo@vGw@dKmApXiDrEe@\\pFb@rGpH`kAVbEyEj@wGv@eD{@uBCaCL}LlByKtBiWzFgCt@cHtByBxCs@|@yIfOaBxBiBdBqFfEsEhCcVfQ{B~@{KfCmUjFXfCz@pHnC|T}OjDgEtAWaL]gBWmFf@cE" - } - ], - "waypoints": [ - { - "distance": 6.693, - "name": "Jefferson Street", - "location": [-122.419695, 37.807712] - }, - { "distance": 33.988, "name": "", "location": [-122.428509, 37.807292] } - ], - "code": "Ok" -} From 4b16c31df570e1b32605203191978f1147d4e515 Mon Sep 17 00:00:00 2001 From: Archdoog Date: Mon, 23 Sep 2024 00:56:30 +0000 Subject: [PATCH 03/20] Apply automatic changes --- Package.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Package.swift b/Package.swift index d51ad22f..25944a33 100644 --- a/Package.swift +++ b/Package.swift @@ -5,7 +5,7 @@ import PackageDescription let binaryTarget: Target let maplibreSwiftUIDSLPackage: Package.Dependency -let useLocalFramework = true +let useLocalFramework = false let useLocalMapLibreSwiftUIDSL = false if useLocalFramework { From bb84d48f919a9c93e07f62969146521880670472 Mon Sep 17 00:00:00 2001 From: Jacob Fielding Date: Mon, 23 Sep 2024 17:02:34 -0700 Subject: [PATCH 04/20] Apply suggestions from code review Co-authored-by: Ian Wagner --- .../src/routing_adapters/osrm/algorithms.rs | 7 ++++--- .../ferrostar/src/routing_adapters/osrm/models.rs | 15 +++++++-------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/common/ferrostar/src/routing_adapters/osrm/algorithms.rs b/common/ferrostar/src/routing_adapters/osrm/algorithms.rs index 995de8d9..b0eae17a 100644 --- a/common/ferrostar/src/routing_adapters/osrm/algorithms.rs +++ b/common/ferrostar/src/routing_adapters/osrm/algorithms.rs @@ -2,7 +2,7 @@ use super::models::{Annotation, AnnotationValue, MaxSpeed, MaxSpeedUnits}; use itertools::izip; /// Get's he slice of annotations -pub fn get_annotation_slice( +pub(crate) fn get_annotation_slice( start_index: usize, end_index: usize, annotations: Option>, @@ -19,8 +19,9 @@ pub fn get_annotation_slice( }; } -/// Converts all single value annotation vectors into a single vector of values. -pub fn zip_annotations(annotations: Annotation) -> Vec { +/// Converts the the OSRM-style annotation object consisting of separate arrays +/// to a single vector of parsed objects (one for each coordinate pair). +pub(crate) fn zip_annotations(annotations: Annotation) -> Vec { izip!( annotations.distance, annotations.duration, diff --git a/common/ferrostar/src/routing_adapters/osrm/models.rs b/common/ferrostar/src/routing_adapters/osrm/models.rs index b1dbdc77..5f8a3f87 100644 --- a/common/ferrostar/src/routing_adapters/osrm/models.rs +++ b/common/ferrostar/src/routing_adapters/osrm/models.rs @@ -90,18 +90,17 @@ pub struct Annotation { pub max_speed: Vec, } -/// A flattened OSRM flavored annotation object. -/// This represents the value for each annotation type and is typically surfaced for each -/// geometry segment. +/// An extended OSRM set of annotations. +/// This captures attributes between two points of travel in the route geometry. #[derive(Serialize, Debug, Clone, PartialEq)] pub struct AnnotationValue { - pub distance: f64, - pub duration: f64, + pub distance: f32, + pub duration: f32, /// The speed limit for this geometry segment in meters per second. /// If the speed limit is unknown, this will be `None`. - pub max_speed_mps: Option, - /// The expected travel speed. - pub speed_mps: f64, + pub speed_limit: Option, + /// The estimated travel speed, in meters/second. + pub estimated_speed: f32, } /// The MaxSpeed units that can be associated with annotations. From 377ab59ca5c447185f69aad32f8ca92b58923975 Mon Sep 17 00:00:00 2001 From: Jacob Fielding Date: Mon, 23 Sep 2024 17:03:35 -0700 Subject: [PATCH 05/20] Annotations fixes from PR feedback --- common/ferrostar/src/algorithms.rs | 11 -------- .../src/navigation_controller/mod.rs | 27 +++++++------------ .../src/routing_adapters/osrm/algorithms.rs | 6 ++--- 3 files changed, 13 insertions(+), 31 deletions(-) diff --git a/common/ferrostar/src/algorithms.rs b/common/ferrostar/src/algorithms.rs index bdbb8f4c..a4639293 100644 --- a/common/ferrostar/src/algorithms.rs +++ b/common/ferrostar/src/algorithms.rs @@ -487,17 +487,6 @@ pub(crate) fn get_linestring(geometry: &[GeographicCoordinate]) -> LineString { .collect() } -/// Get a slice of an array that matches the contents of another slice. -pub fn slice_indexes(array: Vec, slice: Vec) -> Option<(usize, usize)> -where - T: PartialEq, -{ - // Find the starting position of the slice in the array - array.windows(slice.len()) - .position(|window| window == slice) - .map(|start| (start, start + slice.len())) -} - #[cfg(test)] /// Creates a user location at the given coordinates, /// with all other values set to defaults or (in the case of the timestamp), the current time. diff --git a/common/ferrostar/src/navigation_controller/mod.rs b/common/ferrostar/src/navigation_controller/mod.rs index ae314c62..a610d6c2 100644 --- a/common/ferrostar/src/navigation_controller/mod.rs +++ b/common/ferrostar/src/navigation_controller/mod.rs @@ -68,11 +68,10 @@ impl NavigationController { let spoken_instruction = current_route_step .get_current_spoken_instruction(progress.distance_to_next_maneuver) .cloned(); - let annotation_bytes = if let Some(current_index) = current_step_geometry_index { - current_route_step.get_current_annotation_json(current_index) - } else { - None - }; + + let annotation_bytes = current_step_geometry_index + .map(|index| current_route_step.get_current_annotation_json(index)) + .flatten(); TripState::Navigating { current_step_geometry_index, @@ -151,12 +150,9 @@ impl NavigationController { let spoken_instruction = current_step .get_current_spoken_instruction(progress.distance_to_next_maneuver) .cloned(); - let annotation_bytes = - if let Some(at_coordinate_index) = current_step_geometry_index { - current_step.get_current_annotation_json(*at_coordinate_index) - } else { - None - }; + let annotation_bytes = current_step_geometry_index + .map(|index| current_route_step.get_current_annotation_json(index)) + .flatten(); TripState::Navigating { current_step_geometry_index: *current_step_geometry_index, @@ -272,12 +268,9 @@ impl NavigationController { .get_current_spoken_instruction(progress.distance_to_next_maneuver) .cloned(); - let annotation_bytes = - if let Some(at_coordinate_index) = current_step_geometry_index { - current_step.get_current_annotation_json(at_coordinate_index) - } else { - None - }; + let annotation_bytes = current_step_geometry_index + .map(|index| current_step.get_current_annotation_json(index)) + .flatten(); TripState::Navigating { current_step_geometry_index, diff --git a/common/ferrostar/src/routing_adapters/osrm/algorithms.rs b/common/ferrostar/src/routing_adapters/osrm/algorithms.rs index 995de8d9..9168cbe1 100644 --- a/common/ferrostar/src/routing_adapters/osrm/algorithms.rs +++ b/common/ferrostar/src/routing_adapters/osrm/algorithms.rs @@ -2,7 +2,7 @@ use super::models::{Annotation, AnnotationValue, MaxSpeed, MaxSpeedUnits}; use itertools::izip; /// Get's he slice of annotations -pub fn get_annotation_slice( +pub(crate) fn get_annotation_slice( start_index: usize, end_index: usize, annotations: Option>, @@ -20,7 +20,7 @@ pub fn get_annotation_slice( } /// Converts all single value annotation vectors into a single vector of values. -pub fn zip_annotations(annotations: Annotation) -> Vec { +pub(crate) fn zip_annotations(annotations: Annotation) -> Vec { izip!( annotations.distance, annotations.duration, @@ -37,7 +37,7 @@ pub fn zip_annotations(annotations: Annotation) -> Vec { } /// Converts a max speed value to meters per second. -pub fn convert_max_speed_to_mps(max_speed: MaxSpeed) -> Option { +pub(crate) fn convert_max_speed_to_mps(max_speed: MaxSpeed) -> Option { match max_speed { MaxSpeed::Known { speed, unit } => match unit { MaxSpeedUnits::KilometersPerHour => return Some(speed * 0.27778), From 9755d87dbdd24110fe93524f7dfa912bcba05502 Mon Sep 17 00:00:00 2001 From: Jacob Fielding Date: Wed, 25 Sep 2024 19:13:53 -0700 Subject: [PATCH 06/20] Vastly improved and tested from the last push --- .../ferrostar/core/FerrostarCoreTest.kt | 3 +- .../ferrostar/core/NavigationViewModel.kt | 9 +- .../core/extensions/TripStateExtensions.kt | 27 - .../core/mock/MockNavigationState.kt | 2 +- .../ferrostar/core/models/AnnotationValue.kt | 12 - .../Sources/FerrostarCore/FerrostarCore.swift | 2 +- .../Mock/MockNavigationState.swift | 4 +- .../FerrostarCore/NavigationState.swift | 14 +- apple/Sources/UniFFI/ferrostar.swift | 79 +- common/ferrostar/src/algorithms.rs | 6 +- common/ferrostar/src/models.rs | 35 +- .../src/navigation_controller/mod.rs | 29 +- .../src/navigation_controller/models.rs | 2 +- .../src/routing_adapters/algorithms.rs | 4 +- .../ferrostar/src/routing_adapters/error.rs | 2 + .../src/routing_adapters/osrm/algorithms.rs | 133 +- .../src/routing_adapters/osrm/mod.rs | 84 +- .../src/routing_adapters/osrm/models.rs | 118 +- ...srm__algorithms__test__zip_annotation.snap | 27 + ...models__tests__deserialize_annotation.snap | 82 + ...ers__osrm__tests__parse_valhalla_osrm.snap | 162 + ..._osrm__tests__parse_valhalla_osrm.snap.new | 9356 ----------------- ...ts__parse_valhalla_osrm_with_via_ways.snap | 102 + ...parse_valhalla_osrm_with_via_ways.snap.new | 7475 ------------- 24 files changed, 635 insertions(+), 17134 deletions(-) delete mode 100644 android/core/src/main/java/com/stadiamaps/ferrostar/core/models/AnnotationValue.kt create mode 100644 common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__algorithms__test__zip_annotation.snap create mode 100644 common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__models__tests__deserialize_annotation.snap delete mode 100644 common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__tests__parse_valhalla_osrm.snap.new delete mode 100644 common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__tests__parse_valhalla_osrm_with_via_ways.snap.new diff --git a/android/core/src/androidTest/java/com/stadiamaps/ferrostar/core/FerrostarCoreTest.kt b/android/core/src/androidTest/java/com/stadiamaps/ferrostar/core/FerrostarCoreTest.kt index 2a27b0fe..98e23c2c 100644 --- a/android/core/src/androidTest/java/com/stadiamaps/ferrostar/core/FerrostarCoreTest.kt +++ b/android/core/src/androidTest/java/com/stadiamaps/ferrostar/core/FerrostarCoreTest.kt @@ -119,7 +119,8 @@ class FerrostarCoreTest { secondaryContent = null, triggerDistanceBeforeManeuver = 42.0)), spokenInstructions = listOf(), - duration = 0.0))) + duration = 0.0, + annotations = null))) @Test fun test401UnauthorizedRouteResponse() = runTest { diff --git a/android/core/src/main/java/com/stadiamaps/ferrostar/core/NavigationViewModel.kt b/android/core/src/main/java/com/stadiamaps/ferrostar/core/NavigationViewModel.kt index 80c3043f..f1c0e364 100644 --- a/android/core/src/main/java/com/stadiamaps/ferrostar/core/NavigationViewModel.kt +++ b/android/core/src/main/java/com/stadiamaps/ferrostar/core/NavigationViewModel.kt @@ -3,11 +3,9 @@ package com.stadiamaps.ferrostar.core import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.stadiamaps.ferrostar.core.extensions.annotation import com.stadiamaps.ferrostar.core.extensions.deviation import com.stadiamaps.ferrostar.core.extensions.progress import com.stadiamaps.ferrostar.core.extensions.visualInstruction -import com.stadiamaps.ferrostar.core.models.AnnotationValue import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.map @@ -72,12 +70,7 @@ class DefaultNavigationViewModel( .map { coreState -> lastLocation = when (coreState.tripState) { - is TripState.Navigating -> { - Log.d("NavigationViewModel", "current annotations: ${coreState.tripState.annotation( - AnnotationValue::class.java)}") - - coreState.tripState.snappedUserLocation - } + is TripState.Navigating -> coreState.tripState.snappedUserLocation is TripState.Complete, TripState.Idle -> locationProvider.lastLocation } diff --git a/android/core/src/main/java/com/stadiamaps/ferrostar/core/extensions/TripStateExtensions.kt b/android/core/src/main/java/com/stadiamaps/ferrostar/core/extensions/TripStateExtensions.kt index 8e1dda3f..03b2b5ac 100644 --- a/android/core/src/main/java/com/stadiamaps/ferrostar/core/extensions/TripStateExtensions.kt +++ b/android/core/src/main/java/com/stadiamaps/ferrostar/core/extensions/TripStateExtensions.kt @@ -1,10 +1,6 @@ package com.stadiamaps.ferrostar.core.extensions -import com.squareup.moshi.JsonAdapter -import com.squareup.moshi.Moshi -import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory import uniffi.ferrostar.TripState -import java.nio.charset.StandardCharsets /** * Get the progress of the trip while navigating. @@ -45,26 +41,3 @@ fun TripState.deviation() = is TripState.Complete, TripState.Idle -> null } - -/** - * Get the route annotations at the user's current location. - * - * This function will deserialize the annotation bytes provided by the trip - * state. - * - * @param type The json data class that annotations should be deserialized to. - * @return The annotation data or null if the trip is not navigating. - */ -inline fun TripState.annotation(type: Class): T? = - when (this) { - is TripState.Navigating -> { - this.annotationBytes?.let { - val moshi: Moshi = Moshi.Builder().add(KotlinJsonAdapterFactory()).build() - val jsonAdapter: JsonAdapter = moshi.adapter(type) - val jsonString = it.toString(Charsets.UTF_8) - jsonAdapter.fromJson(jsonString) - } - } - is TripState.Complete, - TripState.Idle -> null - } \ No newline at end of file diff --git a/android/core/src/main/java/com/stadiamaps/ferrostar/core/mock/MockNavigationState.kt b/android/core/src/main/java/com/stadiamaps/ferrostar/core/mock/MockNavigationState.kt index 4c891e51..e62420cf 100644 --- a/android/core/src/main/java/com/stadiamaps/ferrostar/core/mock/MockNavigationState.kt +++ b/android/core/src/main/java/com/stadiamaps/ferrostar/core/mock/MockNavigationState.kt @@ -55,7 +55,7 @@ fun NavigationState.Companion.pedestrianExample(): NavigationState { triggerDistanceBeforeManeuver = 0.0, ), spokenInstruction = null, - annotationBytes = null), + annotationJson = null), routeGeometry = listOf(), isCalculatingNewRoute = false) } diff --git a/android/core/src/main/java/com/stadiamaps/ferrostar/core/models/AnnotationValue.kt b/android/core/src/main/java/com/stadiamaps/ferrostar/core/models/AnnotationValue.kt deleted file mode 100644 index 5d64a31b..00000000 --- a/android/core/src/main/java/com/stadiamaps/ferrostar/core/models/AnnotationValue.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.stadiamaps.ferrostar.core.models - -import com.squareup.moshi.Json - -data class AnnotationValue( - val distance: Double, - val duration: Double, - @Json(name = "max_speed_mps") - val maxSpeedMps: Double?, - @Json(name = "speed_mps") - val speedMps: Double -) \ No newline at end of file diff --git a/apple/Sources/FerrostarCore/FerrostarCore.swift b/apple/Sources/FerrostarCore/FerrostarCore.swift index d4a14558..b6645787 100644 --- a/apple/Sources/FerrostarCore/FerrostarCore.swift +++ b/apple/Sources/FerrostarCore/FerrostarCore.swift @@ -268,7 +268,7 @@ public protocol FerrostarCoreDelegate: AnyObject { deviation: deviation, visualInstruction: _, spokenInstruction: spokenInstruction, - annotationBytes: _ + annotationJson: _ ): switch deviation { case .noDeviation: diff --git a/apple/Sources/FerrostarCore/Mock/MockNavigationState.swift b/apple/Sources/FerrostarCore/Mock/MockNavigationState.swift index 046bdb3e..fe6b5d62 100644 --- a/apple/Sources/FerrostarCore/Mock/MockNavigationState.swift +++ b/apple/Sources/FerrostarCore/Mock/MockNavigationState.swift @@ -26,7 +26,7 @@ public extension NavigationState { deviation: .noDeviation, visualInstruction: nil, spokenInstruction: nil, - annotationBytes: nil + annotationJson: nil ), routeGeometry: samplePedestrianWaypoints, isCalculatingNewRoute: false @@ -77,7 +77,7 @@ public extension NavigationState { deviation: .noDeviation, visualInstruction: nil, spokenInstruction: nil, - annotationBytes: nil + annotationJson: nil ), routeGeometry: samplePedestrianWaypoints, isCalculatingNewRoute: false diff --git a/apple/Sources/FerrostarCore/NavigationState.swift b/apple/Sources/FerrostarCore/NavigationState.swift index 67ba57eb..86863968 100644 --- a/apple/Sources/FerrostarCore/NavigationState.swift +++ b/apple/Sources/FerrostarCore/NavigationState.swift @@ -38,11 +38,11 @@ public struct NavigationState: Hashable { return visualInstruction } -// public func currentAnnotation() throws -> T? { -// guard case let .navigating(_, _, _, _, _, _, _, _, annotationBytes: annotationBytes) = tripState else { -// return nil -// } -// -// return -// } + public var currentAnnotationJSON: String? { + guard case let .navigating(_, _, _, _, _, _, _, _, annotationJson: annotationJson) = tripState else { + return nil + } + + return annotationJson + } } diff --git a/apple/Sources/UniFFI/ferrostar.swift b/apple/Sources/UniFFI/ferrostar.swift index 76d2a7d7..65809f45 100644 --- a/apple/Sources/UniFFI/ferrostar.swift +++ b/apple/Sources/UniFFI/ferrostar.swift @@ -1946,9 +1946,9 @@ public struct RouteStep { */ public var spokenInstructions: [SpokenInstruction] /** - * A list of json attribute objects as a byte array. + * A list of json encoded strings representing annotations between each coordinate along the step. */ - public var annotations: [Data]? + public var annotations: [String]? // Default memberwise initializers are never public by default, so we // declare one manually. @@ -1979,8 +1979,8 @@ public struct RouteStep { * A list of prompts to announce (via speech synthesis) at specific points along the step. */ spokenInstructions: [SpokenInstruction], /** - * A list of json attribute objects as a byte array. - */ annotations: [Data]? + * A list of json encoded strings representing annotations between each coordinate along the step. + */ annotations: [String]? ) { self.geometry = geometry self.distance = distance @@ -2044,7 +2044,7 @@ public struct FfiConverterTypeRouteStep: FfiConverterRustBuffer { instruction: FfiConverterString.read(from: &buf), visualInstructions: FfiConverterSequenceTypeVisualInstruction.read(from: &buf), spokenInstructions: FfiConverterSequenceTypeSpokenInstruction.read(from: &buf), - annotations: FfiConverterOptionSequenceData.read(from: &buf) + annotations: FfiConverterOptionSequenceString.read(from: &buf) ) } @@ -2056,7 +2056,7 @@ public struct FfiConverterTypeRouteStep: FfiConverterRustBuffer { FfiConverterString.write(value.instruction, into: &buf) FfiConverterSequenceTypeVisualInstruction.write(value.visualInstructions, into: &buf) FfiConverterSequenceTypeSpokenInstruction.write(value.spokenInstructions, into: &buf) - FfiConverterOptionSequenceData.write(value.annotations, into: &buf) + FfiConverterOptionSequenceString.write(value.annotations, into: &buf) } } @@ -3010,6 +3010,7 @@ extension ModelError: Foundation.LocalizedError { public enum ParsingError { case ParseError(error: String) + case Annotations(error: String) case InvalidStatusCode(code: String) case UnknownParsingError } @@ -3023,10 +3024,13 @@ public struct FfiConverterTypeParsingError: FfiConverterRustBuffer { case 1: return try .ParseError( error: FfiConverterString.read(from: &buf) ) - case 2: return try .InvalidStatusCode( + case 2: return try .Annotations( + error: FfiConverterString.read(from: &buf) + ) + case 3: return try .InvalidStatusCode( code: FfiConverterString.read(from: &buf) ) - case 3: return .UnknownParsingError + case 4: return .UnknownParsingError default: throw UniffiInternalError.unexpectedEnumCase } } @@ -3037,12 +3041,16 @@ public struct FfiConverterTypeParsingError: FfiConverterRustBuffer { writeInt(&buf, Int32(1)) FfiConverterString.write(error, into: &buf) - case let .InvalidStatusCode(code): + case let .Annotations(error): writeInt(&buf, Int32(2)) + FfiConverterString.write(error, into: &buf) + + case let .InvalidStatusCode(code): + writeInt(&buf, Int32(3)) FfiConverterString.write(code, into: &buf) case .UnknownParsingError: - writeInt(&buf, Int32(3)) + writeInt(&buf, Int32(4)) } } } @@ -3488,7 +3496,7 @@ public enum TripState { /** * Annotation data at the current location. * This is represented as a json formatted byte array to allow for flexible encoding of custom annotations. - */ annotationBytes: Data? + */ annotationJson: String? ) /** * The navigation controller has reached the end of the trip. @@ -3513,7 +3521,7 @@ public struct FfiConverterTypeTripState: FfiConverterRustBuffer { deviation: FfiConverterTypeRouteDeviation.read(from: &buf), visualInstruction: FfiConverterOptionTypeVisualInstruction.read(from: &buf), spokenInstruction: FfiConverterOptionTypeSpokenInstruction.read(from: &buf), - annotationBytes: FfiConverterOptionData.read(from: &buf) + annotationJson: FfiConverterOptionString.read(from: &buf) ) case 3: return .complete @@ -3536,7 +3544,7 @@ public struct FfiConverterTypeTripState: FfiConverterRustBuffer { deviation, visualInstruction, spokenInstruction, - annotationBytes + annotationJson ): writeInt(&buf, Int32(2)) FfiConverterOptionUInt64.write(currentStepGeometryIndex, into: &buf) @@ -3547,7 +3555,7 @@ public struct FfiConverterTypeTripState: FfiConverterRustBuffer { FfiConverterTypeRouteDeviation.write(deviation, into: &buf) FfiConverterOptionTypeVisualInstruction.write(visualInstruction, into: &buf) FfiConverterOptionTypeSpokenInstruction.write(spokenInstruction, into: &buf) - FfiConverterOptionData.write(annotationBytes, into: &buf) + FfiConverterOptionString.write(annotationJson, into: &buf) case .complete: writeInt(&buf, Int32(3)) @@ -3703,27 +3711,6 @@ private struct FfiConverterOptionString: FfiConverterRustBuffer { } } -private struct FfiConverterOptionData: FfiConverterRustBuffer { - typealias SwiftType = Data? - - public static func write(_ value: SwiftType, into buf: inout [UInt8]) { - guard let value else { - writeInt(&buf, Int8(0)) - return - } - writeInt(&buf, Int8(1)) - FfiConverterData.write(value, into: &buf) - } - - public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> SwiftType { - switch try readInt(&buf) as Int8 { - case 0: return nil - case 1: return try FfiConverterData.read(from: &buf) - default: throw UniffiInternalError.unexpectedOptionalTag - } - } -} - private struct FfiConverterOptionTypeCourseOverGround: FfiConverterRustBuffer { typealias SwiftType = CourseOverGround? @@ -3871,8 +3858,8 @@ private struct FfiConverterOptionTypeManeuverType: FfiConverterRustBuffer { } } -private struct FfiConverterOptionSequenceData: FfiConverterRustBuffer { - typealias SwiftType = [Data]? +private struct FfiConverterOptionSequenceString: FfiConverterRustBuffer { + typealias SwiftType = [String]? public static func write(_ value: SwiftType, into buf: inout [UInt8]) { guard let value else { @@ -3880,35 +3867,35 @@ private struct FfiConverterOptionSequenceData: FfiConverterRustBuffer { return } writeInt(&buf, Int8(1)) - FfiConverterSequenceData.write(value, into: &buf) + FfiConverterSequenceString.write(value, into: &buf) } public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> SwiftType { switch try readInt(&buf) as Int8 { case 0: return nil - case 1: return try FfiConverterSequenceData.read(from: &buf) + case 1: return try FfiConverterSequenceString.read(from: &buf) default: throw UniffiInternalError.unexpectedOptionalTag } } } -private struct FfiConverterSequenceData: FfiConverterRustBuffer { - typealias SwiftType = [Data] +private struct FfiConverterSequenceString: FfiConverterRustBuffer { + typealias SwiftType = [String] - public static func write(_ value: [Data], into buf: inout [UInt8]) { + public static func write(_ value: [String], into buf: inout [UInt8]) { let len = Int32(value.count) writeInt(&buf, len) for item in value { - FfiConverterData.write(item, into: &buf) + FfiConverterString.write(item, into: &buf) } } - public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> [Data] { + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> [String] { let len: Int32 = try readInt(&buf) - var seq = [Data]() + var seq = [String]() seq.reserveCapacity(Int(len)) for _ in 0 ..< len { - try seq.append(FfiConverterData.read(from: &buf)) + try seq.append(FfiConverterString.read(from: &buf)) } return seq } diff --git a/common/ferrostar/src/algorithms.rs b/common/ferrostar/src/algorithms.rs index a4639293..83852350 100644 --- a/common/ferrostar/src/algorithms.rs +++ b/common/ferrostar/src/algorithms.rs @@ -73,9 +73,9 @@ pub fn index_of_closest_segment_origin(location: UserLocation, line: &LineString .map(|(index, _)| index as u64) } -/// Get the bearing to the next point on the LineString. +/// Get the bearing to the next point on the `LineString`. /// -/// Returns [`None`] if the index points at or past the last point in the LineString. +/// Returns [`None`] if the index points at or past the last point in the `LineString`. fn get_bearing_to_next_point( index_along_line: usize, line: &LineString, @@ -89,7 +89,7 @@ fn get_bearing_to_next_point( let degrees = normalize_bearing(current.geodesic_bearing(next)); Some(CourseOverGround { - degrees: degrees as u16, + degrees, accuracy: None, }) } diff --git a/common/ferrostar/src/models.rs b/common/ferrostar/src/models.rs index 90e298c5..333d77d8 100644 --- a/common/ferrostar/src/models.rs +++ b/common/ferrostar/src/models.rs @@ -12,7 +12,8 @@ use alloc::{string::String, vec::Vec}; use geo::{Coord, LineString, Point, Rect}; #[cfg(feature = "uniffi")] use polyline::encode_coordinates; -use serde::Deserialize; +use serde::{Deserialize, Serialize}; +use serde_json::Value; #[cfg(all(feature = "std", not(feature = "web-time")))] use std::time::SystemTime; @@ -20,9 +21,7 @@ use std::time::SystemTime; #[cfg(feature = "web-time")] use web_time::SystemTime; -#[cfg(any(test, feature = "wasm-bindgen"))] -use serde::Serialize; - +use std::collections::BTreeMap; use uuid::Uuid; use crate::algorithms::get_linestring; @@ -290,8 +289,8 @@ pub struct RouteStep { pub visual_instructions: Vec, /// A list of prompts to announce (via speech synthesis) at specific points along the step. pub spoken_instructions: Vec, - /// A list of json attribute objects as a byte array. - pub annotations: Option>>, + /// A list of json encoded strings representing annotations between each coordinate along the step. + pub annotations: Option>, } impl RouteStep { @@ -338,18 +337,10 @@ impl RouteStep { /// Get the annotation data at a specific point along the step. /// /// `at_coordinate_index` is the index of the coordinate in the step geometry. - pub fn get_current_annotation_json(&self, at_coordinate_index: u64) -> Option> { - match &self.annotations { - None => return None, - Some(annotations) => { - if at_coordinate_index as usize >= annotations.len() { - panic!("Index {at_coordinate_index} out of bounds for annotations"); - } - - let annotation = annotations[at_coordinate_index as usize].clone(); - return Some(annotation); - } - } + pub fn get_current_annotation_json(&self, at_coordinate_index: u64) -> Option { + self.annotations + .as_ref() + .and_then(|annotations| annotations.get(at_coordinate_index as usize).cloned()) } } @@ -468,6 +459,14 @@ pub struct VisualInstruction { pub trigger_distance_before_maneuver: f64, } +/// A flat annotations string value map that can be used to store arbitrary +/// annotation values. +#[derive(Deserialize, Serialize, Debug, Clone, PartialEq)] +pub struct AnyAnnotationValue { + #[serde(flatten)] + pub value: BTreeMap, +} + #[cfg(test)] #[cfg(feature = "uniffi")] mod tests { diff --git a/common/ferrostar/src/navigation_controller/mod.rs b/common/ferrostar/src/navigation_controller/mod.rs index a610d6c2..2529c869 100644 --- a/common/ferrostar/src/navigation_controller/mod.rs +++ b/common/ferrostar/src/navigation_controller/mod.rs @@ -69,9 +69,8 @@ impl NavigationController { .get_current_spoken_instruction(progress.distance_to_next_maneuver) .cloned(); - let annotation_bytes = current_step_geometry_index - .map(|index| current_route_step.get_current_annotation_json(index)) - .flatten(); + let annotation_json = current_step_geometry_index + .and_then(|index| current_route_step.get_current_annotation_json(index)); TripState::Navigating { current_step_geometry_index, @@ -83,7 +82,7 @@ impl NavigationController { deviation, visual_instruction, spoken_instruction, - annotation_bytes, + annotation_json, } } @@ -150,9 +149,8 @@ impl NavigationController { let spoken_instruction = current_step .get_current_spoken_instruction(progress.distance_to_next_maneuver) .cloned(); - let annotation_bytes = current_step_geometry_index - .map(|index| current_route_step.get_current_annotation_json(index)) - .flatten(); + let annotation_json = current_step_geometry_index + .and_then(|index| current_step.get_current_annotation_json(index)); TripState::Navigating { current_step_geometry_index: *current_step_geometry_index, @@ -165,7 +163,7 @@ impl NavigationController { deviation: *deviation, visual_instruction, spoken_instruction, - annotation_bytes, + annotation_json, } } StepAdvanceStatus::EndOfRoute => TripState::Complete, @@ -192,7 +190,7 @@ impl NavigationController { deviation, visual_instruction, spoken_instruction, - annotation_bytes, + annotation_json, .. } => { let Some(current_step) = remaining_steps.first() else { @@ -222,7 +220,7 @@ impl NavigationController { deviation: *deviation, visual_instruction: visual_instruction.clone(), spoken_instruction: spoken_instruction.clone(), - annotation_bytes: annotation_bytes.clone(), + annotation_json: annotation_json.clone(), }; match if should_advance_to_next_step( @@ -248,7 +246,7 @@ impl NavigationController { deviation: _, visual_instruction: _, spoken_instruction: _, - annotation_bytes: _, + annotation_json: _, } => { // Recalculate deviation. This happens later, as the current step may have changed. // The distance to the next maneuver will be updated by advance_to_next_step if needed. @@ -268,9 +266,8 @@ impl NavigationController { .get_current_spoken_instruction(progress.distance_to_next_maneuver) .cloned(); - let annotation_bytes = current_step_geometry_index - .map(|index| current_step.get_current_annotation_json(index)) - .flatten(); + let annotation_json = current_step_geometry_index + .and_then(|index| current_step.get_current_annotation_json(index)); TripState::Navigating { current_step_geometry_index, @@ -281,7 +278,7 @@ impl NavigationController { deviation, visual_instruction, spoken_instruction, - annotation_bytes, + annotation_json, } } TripState::Complete => TripState::Complete, @@ -310,7 +307,7 @@ impl NavigationController { // Get the index of the closest segment origin to the snapped user location. let current_step_geometry_index = - index_of_closest_segment_origin(snapped_user_location, &line); + index_of_closest_segment_origin(snapped_user_location, line); // Snap the user's course to the line if the configuration specifies it. let snapped_with_course: UserLocation = match &self.config.snapped_location_course_filtering diff --git a/common/ferrostar/src/navigation_controller/models.rs b/common/ferrostar/src/navigation_controller/models.rs index d7ba1f94..14b7edcc 100644 --- a/common/ferrostar/src/navigation_controller/models.rs +++ b/common/ferrostar/src/navigation_controller/models.rs @@ -67,7 +67,7 @@ pub enum TripState { spoken_instruction: Option, /// Annotation data at the current location. /// This is represented as a json formatted byte array to allow for flexible encoding of custom annotations. - annotation_bytes: Option>, + annotation_json: Option, }, /// The navigation controller has reached the end of the trip. Complete, diff --git a/common/ferrostar/src/routing_adapters/algorithms.rs b/common/ferrostar/src/routing_adapters/algorithms.rs index 97dccb8b..dc452e9f 100644 --- a/common/ferrostar/src/routing_adapters/algorithms.rs +++ b/common/ferrostar/src/routing_adapters/algorithms.rs @@ -5,9 +5,9 @@ use crate::models::GeographicCoordinate; use super::error::ParsingError; /// Parse a polyline-encoded geometry string into a list of geographic coordinates. -/// If the polyline cannot be decoded, a [ParsingError] results. +/// If the polyline cannot be decoded, a [`ParsingError`] results. pub fn get_coordinates_from_geometry( - geometry: &String, + geometry: &str, polyline_precision: u32, ) -> Result, ParsingError> { let linestring = decode_polyline(geometry, polyline_precision).map_err(|error| { diff --git a/common/ferrostar/src/routing_adapters/error.rs b/common/ferrostar/src/routing_adapters/error.rs index 8c2d29c0..53bc7a70 100644 --- a/common/ferrostar/src/routing_adapters/error.rs +++ b/common/ferrostar/src/routing_adapters/error.rs @@ -57,6 +57,8 @@ pub enum ParsingError { // TODO: Unable to find route and other common errors #[cfg_attr(feature = "std", error("Failed to parse route response: {error}."))] ParseError { error: String }, + #[cfg_attr(feature = "std", error("Failed to parse annotations: {error}."))] + Annotations { error: String }, #[cfg_attr( feature = "std", error("Routing adapter returned an unexpected status code: {code}.") diff --git a/common/ferrostar/src/routing_adapters/osrm/algorithms.rs b/common/ferrostar/src/routing_adapters/osrm/algorithms.rs index 980c53b7..46abd54f 100644 --- a/common/ferrostar/src/routing_adapters/osrm/algorithms.rs +++ b/common/ferrostar/src/routing_adapters/osrm/algorithms.rs @@ -1,84 +1,89 @@ -use super::models::{Annotation, AnnotationValue, MaxSpeed, MaxSpeedUnits}; -use itertools::izip; +use super::models::AnyAnnotation; +use crate::models::AnyAnnotationValue; +use crate::routing_adapters::error::ParsingError; +use serde_json::Value; +use std::collections::BTreeMap; -/// Get's he slice of annotations +/// Get's the slice of annotations +/// +/// Throws an [`ParsingError`] if the annotations are not present or the slice is out of bounds. pub(crate) fn get_annotation_slice( + annotations: Option>, start_index: usize, end_index: usize, - annotations: Option>, -) -> Option> { - return if let Some(annotations) = &annotations { - let annot_len = annotations.len(); - - println!("Step Indexes: (start_index = {start_index}, end_index={end_index}, annotation.len: {annot_len})"); - - let slice = &annotations[start_index..end_index]; - Some(slice.to_vec()) - } else { - None - }; +) -> Result, ParsingError> { + annotations + .ok_or(ParsingError::Annotations { + error: "No annotations".to_string(), + })? + .get(start_index..end_index) + .ok_or(ParsingError::Annotations { + error: "Annotations slice index out of bounds ({start_index}..{end_index})".to_string(), + }) + .map(<[AnyAnnotationValue]>::to_vec) } /// Converts the the OSRM-style annotation object consisting of separate arrays /// to a single vector of parsed objects (one for each coordinate pair). -pub(crate) fn zip_annotations(annotations: Annotation) -> Vec { - izip!( - annotations.distance, - annotations.duration, - annotations.max_speed, - annotations.speed - ) - .map(|(distance, duration, max_speed, speed)| AnnotationValue { - distance, - duration, - max_speed_mps: convert_max_speed_to_mps(max_speed), - speed_mps: speed, - }) - .collect() -} +pub(crate) fn zip_annotations(annotation: AnyAnnotation) -> Vec { + let source: BTreeMap> = annotation.values; -/// Converts a max speed value to meters per second. -pub(crate) fn convert_max_speed_to_mps(max_speed: MaxSpeed) -> Option { - match max_speed { - MaxSpeed::Known { speed, unit } => match unit { - MaxSpeedUnits::KilometersPerHour => return Some(speed * 0.27778), - MaxSpeedUnits::MilesPerHour => return Some(speed * 0.44704), - }, - #[allow(unused)] - MaxSpeed::Unknown { unknown } => return None, - } -} + // Get the length of the array (assumed to be the same for all annotations) + let length = source.values().next().map_or(0, Vec::len); -// TODO: Snapshot test a zip annotations test case. + return (0..length) + .map(|i| { + source + .iter() + .filter_map(|(key, values)| { + // Values is the vector at a specific key in the original annotations object. + values + .get(i) // For each key, get the value at the index i. + .map(|v| (key.clone(), v.clone())) // Convert the key and value to a tuple. + }) + .collect::>() // Collect the key-value pairs into a hashmap. + }) + .map(|value| AnyAnnotationValue { value }) + .collect::>(); +} #[cfg(test)] mod test { + use std::collections::BTreeMap; + + use serde_json::Map; + use super::*; #[test] - fn test_max_speed_unknown() { - let max_speed = MaxSpeed::Unknown { unknown: true }; - assert_eq!(convert_max_speed_to_mps(max_speed), None); - } + fn test_zip_annotation() { + let json_str = r#"{ + "distance": [1.2, 2.24, 3.24], + "duration": [4, 5, 6], + "speed": [10, 11, 12], + "max_speed": [{ + "speed": 56, + "unit": "km/h" + }, { + "speed": 12, + "unit": "mi/h" + }, { + "unknown": true + }], + "traffic": ["bad", "ok", "good"], + "construction": [null, true, null] + }"#; - #[test] - fn test_max_speed_kph() { - let max_speed = MaxSpeed::Known { - speed: 100.0, - unit: MaxSpeedUnits::KilometersPerHour, - }; - assert_eq!( - convert_max_speed_to_mps(max_speed), - Some(27.778000000000002) - ); - } + let json_value: Map = serde_json::from_str(json_str).unwrap(); + let values: BTreeMap> = json_value + .iter() + .map(|(k, v)| (k.to_string(), v.as_array().unwrap().clone())) + .collect(); - #[test] - fn test_max_speed_mph() { - let max_speed = MaxSpeed::Known { - speed: 60.0, - unit: MaxSpeedUnits::MilesPerHour, - }; - assert_eq!(convert_max_speed_to_mps(max_speed), Some(26.8224)); + // Construct the annotation object. + let annotation = AnyAnnotation { values }; + let result = zip_annotations(annotation); + + insta::assert_yaml_snapshot!(result); } } diff --git a/common/ferrostar/src/routing_adapters/osrm/mod.rs b/common/ferrostar/src/routing_adapters/osrm/mod.rs index 3ddb3ffb..bbe4af88 100644 --- a/common/ferrostar/src/routing_adapters/osrm/mod.rs +++ b/common/ferrostar/src/routing_adapters/osrm/mod.rs @@ -5,14 +5,13 @@ pub(crate) mod models; use super::RouteResponseParser; use crate::models::{ - GeographicCoordinate, RouteStep, SpokenInstruction, VisualInstruction, + AnyAnnotationValue, GeographicCoordinate, RouteStep, SpokenInstruction, VisualInstruction, VisualInstructionContent, Waypoint, WaypointKind, }; use crate::routing_adapters::algorithms::get_coordinates_from_geometry; use crate::routing_adapters::{ osrm::models::{ - AnnotationValue, Route as OsrmRoute, RouteResponse, RouteStep as OsrmRouteStep, - Waypoint as OsrmWaypoint, + Route as OsrmRoute, RouteResponse, RouteStep as OsrmRouteStep, Waypoint as OsrmWaypoint, }, ParsingError, Route, }; @@ -92,18 +91,15 @@ impl Route { .map(|coord| GeographicCoordinate::from(*coord)) .collect(); - println!("Route geometry length: {}", geometry.len()); - let steps = route .legs .iter() .flat_map(|leg| { // Converts all single value annotation vectors into a single vector witih a value object. - let annotations = if let Some(leg_annotation) = &leg.annotation { - Some(algorithms::zip_annotations(leg_annotation.clone())) - } else { - None - }; + let annotations = leg + .annotation + .as_ref() + .map(|leg_annotation| algorithms::zip_annotations(leg_annotation.clone())); // Index for the annotations slice let mut start_index: usize = 0; @@ -112,20 +108,18 @@ impl Route { let step_geometry = get_coordinates_from_geometry(&step.geometry, polyline_precision)?; - // Slice the annotations for the current step. The annotations array represents segments between coordinates - // and is thus one element shorter than the geometry array. To account for this, we need to subtract 2 from - // the length of the geometry array on each step (one to account for the 0-based index, and one to account - // for the length difference). - let step_index_len = step_geometry.len() - 2 as usize; + // Slice the annotations for the current step. + // The annotations array represents segments between coordinates. + let step_index_len = step_geometry.len() - 1_usize; let end_index = start_index + step_index_len; let annotation_slice = - get_annotation_slice(start_index, end_index, annotations.clone()); + get_annotation_slice(annotations.clone(), start_index, end_index).ok(); start_index = end_index; return RouteStep::from_osrm_and_geom( - &step, + step, step_geometry, annotation_slice, ); @@ -152,7 +146,7 @@ impl RouteStep { fn from_osrm_and_geom( value: &OsrmRouteStep, geometry: Vec, - annotations: Option>, + annotations: Option>, ) -> Result { let visual_instructions = value .banner_instructions @@ -187,21 +181,15 @@ impl RouteStep { }) .collect(); - // Convert the annotations to a vectory of json byte objects. + // Convert the annotations to a vector of json strings. + // This allows us to safely pass the RouteStep through the FFI boundary. // The host platform can then parse an arbitrary annotation object. - let annotations_as_bytes = if let Some(annotations) = annotations { - let mapped: Result>, ParsingError> = annotations + let annotations_as_strings: Option> = annotations.map(|annotations_vec| { + annotations_vec .iter() - .map(|annotation| { - serde_json::to_vec(annotation).map_err(|e| ParsingError::ParseError { - error: e.to_string(), - }) - }) - .collect(); - Some(mapped?) - } else { - None - }; + .map(|annotation| serde_json::to_string(annotation).unwrap()) + .collect() + }); Ok(RouteStep { geometry, @@ -213,7 +201,7 @@ impl RouteStep { instruction: value.maneuver.get_instruction(), visual_instructions, spoken_instructions, - annotations: annotations_as_bytes, + annotations: annotations_as_strings, }) } } @@ -252,4 +240,36 @@ mod tests { .expect("Unable to parse Valhalla OSRM response"); insta::assert_yaml_snapshot!(routes); } + + #[test] + fn parse_valhalla_asserting_annotation_lengths() { + let parser = OsrmResponseParser::new(6); + let routes = parser + .parse_response(VALHALLA_OSRM_RESPONSE.into()) + .expect("Unable to parse Valhalla OSRM response"); + + // Loop through every step and validate that the length of the annotations + // matches the length of the geometry minus one. This is because each annotation + // represents a segment between two coordinates. + for (route_index, route) in routes.iter().enumerate() { + for (step_index, step) in route.steps.iter().enumerate() { + if step_index == route.steps.len() - 1 { + // The arrival step is 2 of the same coordinates. + // So annotations will be None. + assert_eq!(step.annotations, None); + continue; + } + + let step = step.clone(); + let annotations = step.annotations.expect("No annotations"); + assert_eq!( + annotations.len(), + step.geometry.len() - 1, + "Route {}, Step {}", + route_index, + step_index + ); + } + } + } } diff --git a/common/ferrostar/src/routing_adapters/osrm/models.rs b/common/ferrostar/src/routing_adapters/osrm/models.rs index 8071cecf..4fa6e2ff 100644 --- a/common/ferrostar/src/routing_adapters/osrm/models.rs +++ b/common/ferrostar/src/routing_adapters/osrm/models.rs @@ -5,9 +5,11 @@ //! needed for navigation. use crate::models::{ManeuverModifier, ManeuverType}; -#[cfg(feature = "alloc")] use alloc::{string::String, vec::Vec}; -use serde::{Deserialize, Serialize}; +use serde::Deserialize; +use serde_json::Value; +#[cfg(feature = "alloc")] +use std::collections::BTreeMap; #[derive(Deserialize, Debug)] #[serde(transparent)] @@ -55,7 +57,7 @@ pub struct Route { /// A route between exactly two waypoints. #[derive(Deserialize, Debug)] pub struct RouteLeg { - pub annotation: Option, + pub annotation: Option, /// The estimated travel time, in seconds. pub duration: f64, /// The distance traveled this leg, in meters. @@ -67,43 +69,13 @@ pub struct RouteLeg { pub via_waypoints: Vec, } -/// An annotation of a route leg with fine-grained information about segments or nodes. -#[derive(Deserialize, Debug, Clone)] -pub struct Annotation { - /// The duration between each pair of coordinates, in seconds. - pub duration: Vec, - /// The distance between each pair of coordinates, in meters. - pub distance: Vec, - - /// The average speed used in the calculation between the two points in each pair of - /// coordinates, in meters per second. - /// - /// NOTE: This annotation is not in the official spec, but is a common extension used by Mapbox - /// and Valhalla. - #[serde(default)] - pub speed: Vec, - /// The local posted speed limit between each pair of coordinates. - /// - /// NOTE: This annotation is not in the official spec, but is a common extension used by Mapbox - /// and Valhalla. - #[serde(default, rename = "maxspeed")] - pub max_speed: Vec, +#[derive(Deserialize, Debug, Clone, PartialEq)] +pub struct AnyAnnotation { + #[serde(flatten)] + pub values: BTreeMap>, } -/// An extended OSRM set of annotations. -/// This captures attributes between two points of travel in the route geometry. -#[derive(Serialize, Debug, Clone, PartialEq)] -pub struct AnnotationValue { - pub distance: Option, - pub duration: Option, - /// The speed limit for this geometry segment in meters per second. - /// If the speed limit is unknown, this will be `None`. - pub speed_limit: Option, - /// The estimated travel speed, in meters/second. - pub estimated_speed: Option, -} - -/// The MaxSpeed units that can be associated with annotations. +/// The max speed json units that can be associated with annotations. /// [MaxSpeed/Units](https://wiki.openstreetmap.org/wiki/Map_Features/Units#Speed) /// TODO: We could generalize this as or map from this to a `UnitSpeed` enum. #[derive(Deserialize, PartialEq, Debug, Clone)] @@ -115,13 +87,28 @@ pub enum MaxSpeedUnits { } /// The local posted speed limit between a pair of coordinates. -#[derive(Deserialize, Debug, Clone)] -#[serde(untagged)] +#[derive(Debug, Clone)] +#[allow(dead_code)] // TODO: https://github.com/stadiamaps/ferrostar/issues/271 pub enum MaxSpeed { Unknown { unknown: bool }, Known { speed: f64, unit: MaxSpeedUnits }, } +#[allow(dead_code)] // TODO: https://github.com/stadiamaps/ferrostar/issues/271 +impl MaxSpeed { + /// Get the max speed as meters per second. + pub fn get_as_meters_per_second(&self) -> Option { + match self { + MaxSpeed::Known { speed, unit } => match unit { + MaxSpeedUnits::KilometersPerHour => Some(speed * 0.27778), + MaxSpeedUnits::MilesPerHour => Some(speed * 0.44704), + }, + #[allow(unused)] + MaxSpeed::Unknown { unknown } => None, + } + } +} + #[derive(Deserialize, Debug)] pub struct RouteStep { /// The distance from the start of the current maneuver to the following step, in meters. @@ -403,30 +390,10 @@ mod tests { ] }"#; - let annotation: Annotation = + let annotation: AnyAnnotation = serde_json::from_str(data).expect("Failed to parse Annotation"); - assert_eq!( - annotation.duration, - vec![1.0, 1.2, 2.0, 1.6, 1.8, 2.0, 3.6, 1.7] - ); - assert_eq!( - annotation.distance, - vec![ - 4.294596842089401, - 5.051172053200946, - 5.533254065167979, - 6.576513793849532, - 7.4449640160938015, - 8.468757534990829, - 15.202780313562714, - 7.056346577326572 - ] - ); - assert_eq!( - annotation.speed, - vec![4.3, 4.2, 2.8, 4.1, 4.1, 4.2, 4.2, 4.2] - ); + insta::assert_debug_snapshot!(annotation); } #[test] @@ -530,4 +497,31 @@ mod tests { assert_eq!(secondary.maneuver_type, Some(ManeuverType::Turn)); assert_eq!(secondary.maneuver_modifier, Some(ManeuverModifier::Left)); } + + #[test] + fn test_max_speed_unknown() { + let max_speed = MaxSpeed::Unknown { unknown: true }; + assert_eq!(max_speed.get_as_meters_per_second(), None); + } + + #[test] + fn test_max_speed_kph() { + let max_speed = MaxSpeed::Known { + speed: 100.0, + unit: MaxSpeedUnits::KilometersPerHour, + }; + assert_eq!( + max_speed.get_as_meters_per_second(), + Some(27.778000000000002) + ); + } + + #[test] + fn test_max_speed_mph() { + let max_speed = MaxSpeed::Known { + speed: 60.0, + unit: MaxSpeedUnits::MilesPerHour, + }; + assert_eq!(max_speed.get_as_meters_per_second(), Some(26.8224)); + } } diff --git a/common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__algorithms__test__zip_annotation.snap b/common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__algorithms__test__zip_annotation.snap new file mode 100644 index 00000000..2b7972af --- /dev/null +++ b/common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__algorithms__test__zip_annotation.snap @@ -0,0 +1,27 @@ +--- +source: ferrostar/src/routing_adapters/osrm/algorithms.rs +expression: result +--- +- construction: ~ + distance: 1.2 + duration: 4 + max_speed: + speed: 56 + unit: km/h + speed: 10 + traffic: bad +- construction: true + distance: 2.24 + duration: 5 + max_speed: + speed: 12 + unit: mi/h + speed: 11 + traffic: ok +- construction: ~ + distance: 3.24 + duration: 6 + max_speed: + unknown: true + speed: 12 + traffic: good diff --git a/common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__models__tests__deserialize_annotation.snap b/common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__models__tests__deserialize_annotation.snap new file mode 100644 index 00000000..1b3dd6b6 --- /dev/null +++ b/common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__models__tests__deserialize_annotation.snap @@ -0,0 +1,82 @@ +--- +source: ferrostar/src/routing_adapters/osrm/models.rs +expression: annotation +--- +AnyAnnotation { + values: { + "congestion": [ + String("low"), + String("moderate"), + String("moderate"), + String("moderate"), + String("heavy"), + String("heavy"), + String("heavy"), + String("heavy"), + ], + "distance": [ + Number(4.294596842089401), + Number(5.051172053200946), + Number(5.533254065167979), + Number(6.576513793849532), + Number(7.4449640160938015), + Number(8.468757534990829), + Number(15.202780313562714), + Number(7.056346577326572), + ], + "duration": [ + Number(1), + Number(1.2), + Number(2), + Number(1.6), + Number(1.8), + Number(2), + Number(3.6), + Number(1.7), + ], + "maxspeed": [ + Object { + "speed": Number(56), + "unit": String("km/h"), + }, + Object { + "speed": Number(56), + "unit": String("km/h"), + }, + Object { + "speed": Number(56), + "unit": String("km/h"), + }, + Object { + "speed": Number(56), + "unit": String("km/h"), + }, + Object { + "speed": Number(56), + "unit": String("km/h"), + }, + Object { + "speed": Number(56), + "unit": String("km/h"), + }, + Object { + "speed": Number(56), + "unit": String("km/h"), + }, + Object { + "speed": Number(56), + "unit": String("km/h"), + }, + ], + "speed": [ + Number(4.3), + Number(4.2), + Number(2.8), + Number(4.1), + Number(4.1), + Number(4.2), + Number(4.2), + Number(4.2), + ], + }, +} diff --git a/common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__tests__parse_valhalla_osrm.snap b/common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__tests__parse_valhalla_osrm.snap index c917cb64..5f7d0529 100644 --- a/common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__tests__parse_valhalla_osrm.snap +++ b/common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__tests__parse_valhalla_osrm.snap @@ -335,6 +335,13 @@ expression: routes - text: "In 200 feet, Turn left onto the walkway." ssml: "In 200 feet, Turn left onto the walkway." trigger_distance_before_maneuver: 60 + annotations: + - "{\"distance\":0.2,\"duration\":0.184,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + - "{\"distance\":19.4,\"duration\":15.315,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + - "{\"distance\":7.1,\"duration\":5.639,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + - "{\"distance\":11.6,\"duration\":9.818,\"maxspeed\":{\"unknown\":true},\"speed\":1.2}" + - "{\"distance\":66.4,\"duration\":51.539,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + - "{\"distance\":6.9,\"duration\":4.898,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - geometry: - lat: 59.442754 lng: 24.763449 @@ -356,6 +363,8 @@ expression: routes - text: "In 14 feet, Turn right onto Laeva." ssml: "In 14 feet, Turn right onto Laeva." trigger_distance_before_maneuver: 4.5 + annotations: + - "{\"distance\":9.4,\"duration\":6.604,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - geometry: - lat: 59.442671 lng: 24.763423 @@ -377,6 +386,8 @@ expression: routes - text: "In 26 feet, Bear right." ssml: "In 26 feet, Bear right." trigger_distance_before_maneuver: 8 + annotations: + - "{\"distance\":15.7,\"duration\":12.227,\"maxspeed\":{\"speed\":30,\"unit\":\"km/h\"},\"speed\":1.3}" - geometry: - lat: 59.442709 lng: 24.763155 @@ -400,6 +411,9 @@ expression: routes - text: "In 24 feet, Bear left onto the walkway." ssml: "In 24 feet, Bear left onto the walkway." trigger_distance_before_maneuver: 7.5 + annotations: + - "{\"distance\":6.9,\"duration\":5.127,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + - "{\"distance\":8.6,\"duration\":6.412,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - geometry: - lat: 59.442819 lng: 24.763 @@ -425,6 +439,10 @@ expression: routes - text: "In 62 feet, Continue." ssml: "In 62 feet, Continue." trigger_distance_before_maneuver: 19 + annotations: + - "{\"distance\":5.7,\"duration\":4.012,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":2.7,\"duration\":1.919,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":29.7,\"duration\":20.947,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - geometry: - lat: 59.442918 lng: 24.762356 @@ -446,6 +464,8 @@ expression: routes - text: "In 11 feet, Turn right onto Admiralisild/Admiral Bridge." ssml: "In 11 feet, Turn right onto Admiralisild/Admiral Bridge." trigger_distance_before_maneuver: 3.5 + annotations: + - "{\"distance\":7.0,\"duration\":4.96,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - geometry: - lat: 59.442936 lng: 24.762237 @@ -473,6 +493,11 @@ expression: routes - text: "In 200 feet, Continue on the walkway." ssml: "In 200 feet, Continue on the walkway." trigger_distance_before_maneuver: 60 + annotations: + - "{\"distance\":2.6,\"duration\":1.815,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":20.9,\"duration\":14.72,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":3.2,\"duration\":2.267,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":44.3,\"duration\":33.128,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - geometry: - lat: 59.443526 lng: 24.761765 @@ -496,6 +521,9 @@ expression: routes - text: "In 75 feet, Turn left onto the walkway." ssml: "In 75 feet, Turn left onto the walkway." trigger_distance_before_maneuver: 23 + annotations: + - "{\"distance\":4.6,\"duration\":3.248,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":41.1,\"duration\":29.012,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - geometry: - lat: 59.4439 lng: 24.761432 @@ -517,6 +545,8 @@ expression: routes - text: "In 200 feet, Turn right onto the walkway." ssml: "In 200 feet, Turn right onto the walkway." trigger_distance_before_maneuver: 60 + annotations: + - "{\"distance\":130.5,\"duration\":101.367,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - geometry: - lat: 59.443487 lng: 24.759273 @@ -544,6 +574,11 @@ expression: routes - text: "In 41 feet, Turn left onto the walkway." ssml: "In 41 feet, Turn left onto the walkway." trigger_distance_before_maneuver: 12.5 + annotations: + - "{\"distance\":5.4,\"duration\":3.808,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":10.4,\"duration\":8.841,\"maxspeed\":{\"unknown\":true},\"speed\":1.2}" + - "{\"distance\":3.3,\"duration\":2.592,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + - "{\"distance\":7.3,\"duration\":5.742,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - geometry: - lat: 59.443712 lng: 24.759127 @@ -569,6 +604,10 @@ expression: routes - text: "In 26 feet, Turn right onto Logi." ssml: "In 26 feet, Turn right onto Logi." trigger_distance_before_maneuver: 8 + annotations: + - "{\"distance\":3.9,\"duration\":2.774,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":3.2,\"duration\":2.247,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":9.0,\"duration\":6.331,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - geometry: - lat: 59.443674 lng: 24.758853 @@ -608,6 +647,17 @@ expression: routes - text: "In 200 feet, Turn left onto the walkway." ssml: "In 200 feet, Turn left onto the walkway." trigger_distance_before_maneuver: 60 + annotations: + - "{\"distance\":5.2,\"duration\":3.643,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":2.3,\"duration\":1.589,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":9.8,\"duration\":6.887,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":20.5,\"duration\":14.472,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":6.4,\"duration\":4.482,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":3.9,\"duration\":2.747,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":10.3,\"duration\":7.288,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":19.5,\"duration\":13.793,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":9.3,\"duration\":6.594,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":3.5,\"duration\":2.469,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - geometry: - lat: 59.444448 lng: 24.758392 @@ -629,6 +679,8 @@ expression: routes - text: "In 13 feet, Turn right onto the walkway." ssml: "In 13 feet, Turn right onto the walkway." trigger_distance_before_maneuver: 4 + annotations: + - "{\"distance\":8.5,\"duration\":5.983,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - geometry: - lat: 59.444431 lng: 24.758246 @@ -656,6 +708,11 @@ expression: routes - text: "In 200 feet, Bear left onto Kultuurikilomeeter." ssml: "In 200 feet, Bear left onto Kultuurikilomeeter." trigger_distance_before_maneuver: 60 + annotations: + - "{\"distance\":16.8,\"duration\":13.027,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + - "{\"distance\":35.8,\"duration\":27.83,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + - "{\"distance\":10.3,\"duration\":8.028,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + - "{\"distance\":21.9,\"duration\":15.49,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - geometry: - lat: 59.445069 lng: 24.757636 @@ -783,6 +840,61 @@ expression: routes - text: "In 200 feet, Turn right onto the walkway." ssml: "In 200 feet, Turn right onto the walkway." trigger_distance_before_maneuver: 60 + annotations: + - "{\"distance\":179.8,\"duration\":126.908,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":12.9,\"duration\":12.15,\"maxspeed\":{\"unknown\":true},\"speed\":1.1}" + - "{\"distance\":48.4,\"duration\":34.152,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":7.3,\"duration\":5.129,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":6.1,\"duration\":4.281,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":56.9,\"duration\":42.571,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + - "{\"distance\":24.2,\"duration\":18.073,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + - "{\"distance\":2.4,\"duration\":1.781,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + - "{\"distance\":1.0,\"duration\":0.681,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":3.3,\"duration\":2.318,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":17.5,\"duration\":17.664,\"maxspeed\":{\"unknown\":true},\"speed\":1.0}" + - "{\"distance\":2.0,\"duration\":2.012,\"maxspeed\":{\"unknown\":true},\"speed\":1.0}" + - "{\"distance\":4.7,\"duration\":4.717,\"maxspeed\":{\"unknown\":true},\"speed\":1.0}" + - "{\"distance\":7.0,\"duration\":7.059,\"maxspeed\":{\"unknown\":true},\"speed\":1.0}" + - "{\"distance\":5.0,\"duration\":5.058,\"maxspeed\":{\"unknown\":true},\"speed\":1.0}" + - "{\"distance\":9.9,\"duration\":7.669,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + - "{\"distance\":10.1,\"duration\":7.844,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + - "{\"distance\":14.9,\"duration\":10.516,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":1.7,\"duration\":1.177,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":37.5,\"duration\":26.445,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":16.2,\"duration\":11.458,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":22.3,\"duration\":15.741,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":11.8,\"duration\":8.304,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":8.5,\"duration\":5.987,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":13.1,\"duration\":13.246,\"maxspeed\":{\"unknown\":true},\"speed\":1.0}" + - "{\"distance\":6.0,\"duration\":4.213,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":2.6,\"duration\":1.864,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":6.4,\"duration\":4.77,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + - "{\"distance\":43.9,\"duration\":32.852,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + - "{\"distance\":8.9,\"duration\":6.677,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + - "{\"distance\":11.9,\"duration\":8.938,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + - "{\"distance\":14.3,\"duration\":10.737,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + - "{\"distance\":4.5,\"duration\":3.339,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + - "{\"distance\":10.4,\"duration\":7.818,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + - "{\"distance\":11.7,\"duration\":11.006,\"maxspeed\":{\"unknown\":true},\"speed\":1.1}" + - "{\"distance\":23.9,\"duration\":22.394,\"maxspeed\":{\"unknown\":true},\"speed\":1.1}" + - "{\"distance\":1.6,\"duration\":1.32,\"maxspeed\":{\"unknown\":true},\"speed\":1.2}" + - "{\"distance\":17.6,\"duration\":14.893,\"maxspeed\":{\"unknown\":true},\"speed\":1.2}" + - "{\"distance\":15.9,\"duration\":13.483,\"maxspeed\":{\"unknown\":true},\"speed\":1.2}" + - "{\"distance\":82.6,\"duration\":69.994,\"maxspeed\":{\"unknown\":true},\"speed\":1.2}" + - "{\"distance\":73.4,\"duration\":51.784,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":21.4,\"duration\":15.108,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":25.3,\"duration\":19.969,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + - "{\"distance\":30.9,\"duration\":24.415,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + - "{\"distance\":29.8,\"duration\":23.531,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + - "{\"distance\":13.8,\"duration\":10.899,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + - "{\"distance\":29.0,\"duration\":32.187,\"maxspeed\":{\"unknown\":true},\"speed\":0.9}" + - "{\"distance\":23.1,\"duration\":16.31,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":35.6,\"duration\":25.104,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":36.0,\"duration\":25.445,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":49.9,\"duration\":35.213,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":7.8,\"duration\":5.477,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":36.5,\"duration\":25.799,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":54.8,\"duration\":38.709,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - geometry: - lat: 59.44946 lng: 24.739543 @@ -806,6 +918,9 @@ expression: routes - text: "In 37 feet, Turn left onto the walkway." ssml: "In 37 feet, Turn left onto the walkway." trigger_distance_before_maneuver: 11.5 + annotations: + - "{\"distance\":14.0,\"duration\":9.902,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":8.6,\"duration\":6.086,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - geometry: - lat: 59.449652 lng: 24.739675 @@ -829,6 +944,9 @@ expression: routes - text: "In 26 feet, Turn left onto the crosswalk." ssml: "In 26 feet, Turn left onto the crosswalk." trigger_distance_before_maneuver: 8 + annotations: + - "{\"distance\":11.7,\"duration\":8.228,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":4.5,\"duration\":3.156,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - geometry: - lat: 59.449733 lng: 24.739454 @@ -888,6 +1006,27 @@ expression: routes - text: "In 200 feet, Turn right onto the walkway." ssml: "In 200 feet, Turn right onto the walkway." trigger_distance_before_maneuver: 60 + annotations: + - "{\"distance\":4.9,\"duration\":3.427,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":7.7,\"duration\":5.46,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":4.2,\"duration\":2.993,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":2.5,\"duration\":1.871,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + - "{\"distance\":7.9,\"duration\":5.888,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + - "{\"distance\":59.6,\"duration\":44.617,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + - "{\"distance\":40.4,\"duration\":30.206,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + - "{\"distance\":20.0,\"duration\":15.496,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + - "{\"distance\":7.8,\"duration\":5.487,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":17.7,\"duration\":12.51,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":14.8,\"duration\":10.434,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":27.7,\"duration\":19.585,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":40.4,\"duration\":31.347,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + - "{\"distance\":17.0,\"duration\":13.188,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + - "{\"distance\":48.4,\"duration\":37.62,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + - "{\"distance\":8.5,\"duration\":6.681,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + - "{\"distance\":4.2,\"duration\":3.349,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + - "{\"distance\":3.6,\"duration\":2.809,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + - "{\"distance\":5.6,\"duration\":3.942,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":4.4,\"duration\":3.1,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - geometry: - lat: 59.450765 lng: 24.733721 @@ -909,6 +1048,8 @@ expression: routes - text: "In 3 feet, Turn left onto the walkway." ssml: "In 3 feet, Turn left onto the walkway." trigger_distance_before_maneuver: 1 + annotations: + - "{\"distance\":2.5,\"duration\":1.737,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - geometry: - lat: 59.450787 lng: 24.733717 @@ -956,6 +1097,21 @@ expression: routes - text: "In 200 feet, Bear left onto Allveelaeva." ssml: "In 200 feet, Bear left onto Allveelaeva." trigger_distance_before_maneuver: 60 + annotations: + - "{\"distance\":60.6,\"duration\":45.312,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + - "{\"distance\":52.0,\"duration\":40.41,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + - "{\"distance\":1.6,\"duration\":1.278,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + - "{\"distance\":4.5,\"duration\":3.174,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":6.3,\"duration\":4.898,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + - "{\"distance\":4.2,\"duration\":3.284,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + - "{\"distance\":3.9,\"duration\":3.057,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + - "{\"distance\":4.7,\"duration\":3.644,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + - "{\"distance\":5.2,\"duration\":4.072,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + - "{\"distance\":5.0,\"duration\":3.527,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":13.6,\"duration\":13.723,\"maxspeed\":{\"unknown\":true},\"speed\":1.0}" + - "{\"distance\":71.2,\"duration\":50.263,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":4.9,\"duration\":3.432,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + - "{\"distance\":2.7,\"duration\":1.908,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - geometry: - lat: 59.451907 lng: 24.730259 @@ -977,6 +1133,8 @@ expression: routes - text: "In 45 feet, Turn right onto Peetri." ssml: "In 45 feet, Turn right onto Peetri." trigger_distance_before_maneuver: 14 + annotations: + - "{\"distance\":27.7,\"duration\":20.727,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - geometry: - lat: 59.452026 lng: 24.729829 @@ -1000,6 +1158,9 @@ expression: routes - text: "In 41 feet, You have arrived at your destination." ssml: "In 41 feet, You have arrived at your destination." trigger_distance_before_maneuver: 12.5495 + annotations: + - "{\"distance\":17.6,\"duration\":17.401,\"maxspeed\":{\"unknown\":true},\"speed\":1.0}" + - "{\"distance\":7.5,\"duration\":7.403,\"maxspeed\":{\"unknown\":true},\"speed\":1.0}" - geometry: - lat: 59.452226 lng: 24.730034 @@ -1018,3 +1179,4 @@ expression: routes secondary_content: ~ trigger_distance_before_maneuver: 0 spoken_instructions: [] + annotations: ~ diff --git a/common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__tests__parse_valhalla_osrm.snap.new b/common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__tests__parse_valhalla_osrm.snap.new deleted file mode 100644 index cfb15f05..00000000 --- a/common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__tests__parse_valhalla_osrm.snap.new +++ /dev/null @@ -1,9356 +0,0 @@ ---- -source: ferrostar/src/routing_adapters/osrm/mod.rs -assertion_line: 244 -expression: routes ---- -- geometry: - - lat: 59.442643 - lng: 24.765368 - - lat: 59.442644 - lng: 24.765372 - - lat: 59.442596 - lng: 24.765043 - - lat: 59.442597 - lng: 24.764917 - - lat: 59.442617 - lng: 24.764716 - - lat: 59.442739 - lng: 24.763568 - - lat: 59.442754 - lng: 24.763449 - - lat: 59.442671 - lng: 24.763423 - - lat: 59.442709 - lng: 24.763155 - - lat: 59.442749 - lng: 24.763063 - - lat: 59.442819 - lng: 24.763 - - lat: 59.442834 - lng: 24.762904 - - lat: 59.442841 - lng: 24.762858 - - lat: 59.442918 - lng: 24.762356 - - lat: 59.442936 - lng: 24.762237 - - lat: 59.442957 - lng: 24.762218 - - lat: 59.443129 - lng: 24.762072 - - lat: 59.443156 - lng: 24.762052 - - lat: 59.443526 - lng: 24.761765 - - lat: 59.443564 - lng: 24.761733 - - lat: 59.4439 - lng: 24.761432 - - lat: 59.443487 - lng: 24.759273 - - lat: 59.443533 - lng: 24.759243 - - lat: 59.443622 - lng: 24.759185 - - lat: 59.44365 - lng: 24.759167 - - lat: 59.443712 - lng: 24.759127 - - lat: 59.443701 - lng: 24.759061 - - lat: 59.443693 - lng: 24.759007 - - lat: 59.443674 - lng: 24.758853 - - lat: 59.443719 - lng: 24.758831 - - lat: 59.443739 - lng: 24.758825 - - lat: 59.443824 - lng: 24.758783 - - lat: 59.444002 - lng: 24.75869 - - lat: 59.444052 - lng: 24.758636 - - lat: 59.444086 - lng: 24.75862 - - lat: 59.444176 - lng: 24.758576 - - lat: 59.444346 - lng: 24.75849 - - lat: 59.444417 - lng: 24.758402 - - lat: 59.444448 - lng: 24.758392 - - lat: 59.444431 - lng: 24.758246 - - lat: 59.444579 - lng: 24.75819 - - lat: 59.444893 - lng: 24.75805 - - lat: 59.444979 - lng: 24.757981 - - lat: 59.445069 - lng: 24.757636 - - lat: 59.444948 - lng: 24.754468 - - lat: 59.444939 - lng: 24.75424 - - lat: 59.444903 - lng: 24.753388 - - lat: 59.444898 - lng: 24.75326 - - lat: 59.44489 - lng: 24.753154 - - lat: 59.444855 - lng: 24.752151 - - lat: 59.444835 - lng: 24.751726 - - lat: 59.444834 - lng: 24.751684 - - lat: 59.444834 - lng: 24.751667 - - lat: 59.444833 - lng: 24.751609 - - lat: 59.444827 - lng: 24.7513 - - lat: 59.444829 - lng: 24.751265 - - lat: 59.444834 - lng: 24.751183 - - lat: 59.444849 - lng: 24.751063 - - lat: 59.444866 - lng: 24.750981 - - lat: 59.444899 - lng: 24.750819 - - lat: 59.444936 - lng: 24.750656 - - lat: 59.444991 - lng: 24.750416 - - lat: 59.444997 - lng: 24.750389 - - lat: 59.445137 - lng: 24.749787 - - lat: 59.445194 - lng: 24.749523 - - lat: 59.445282 - lng: 24.749169 - - lat: 59.445326 - lng: 24.74898 - - lat: 59.445314 - lng: 24.748832 - - lat: 59.445299 - lng: 24.748602 - - lat: 59.445294 - lng: 24.748497 - - lat: 59.445298 - lng: 24.748451 - - lat: 59.445335 - lng: 24.748365 - - lat: 59.445568 - lng: 24.747739 - - lat: 59.44562 - lng: 24.747619 - - lat: 59.44569 - lng: 24.747459 - - lat: 59.445773 - lng: 24.747265 - - lat: 59.445799 - lng: 24.747205 - - lat: 59.445869 - lng: 24.747082 - - lat: 59.445948 - lng: 24.746945 - - lat: 59.446119 - lng: 24.746691 - - lat: 59.44613 - lng: 24.746674 - - lat: 59.446266 - lng: 24.746516 - - lat: 59.446392 - lng: 24.746383 - - lat: 59.447073 - lng: 24.745802 - - lat: 59.447676 - lng: 24.745279 - - lat: 59.447848 - lng: 24.74511 - - lat: 59.448038 - lng: 24.744866 - - lat: 59.448255 - lng: 24.744526 - - lat: 59.448443 - lng: 24.744152 - - lat: 59.448527 - lng: 24.743973 - - lat: 59.448671 - lng: 24.743545 - - lat: 59.448768 - lng: 24.743184 - - lat: 59.448916 - lng: 24.742627 - - lat: 59.449029 - lng: 24.74203 - - lat: 59.449132 - lng: 24.741172 - - lat: 59.449157 - lng: 24.741044 - - lat: 59.449276 - lng: 24.740442 - - lat: 59.44946 - lng: 24.739543 - - lat: 59.449578 - lng: 24.73963 - - lat: 59.449652 - lng: 24.739675 - - lat: 59.449697 - lng: 24.739489 - - lat: 59.449733 - lng: 24.739454 - - lat: 59.449727 - lng: 24.739369 - - lat: 59.44975 - lng: 24.73924 - - lat: 59.449766 - lng: 24.739172 - - lat: 59.449773 - lng: 24.73913 - - lat: 59.449812 - lng: 24.739014 - - lat: 59.450009 - lng: 24.738034 - - lat: 59.450135 - lng: 24.737365 - - lat: 59.450207 - lng: 24.737042 - - lat: 59.450228 - lng: 24.736911 - - lat: 59.450277 - lng: 24.736613 - - lat: 59.450327 - lng: 24.736371 - - lat: 59.450403 - lng: 24.735904 - - lat: 59.450537 - lng: 24.735241 - - lat: 59.45058 - lng: 24.734953 - - lat: 59.450687 - lng: 24.734123 - - lat: 59.450703 - lng: 24.733977 - - lat: 59.45072 - lng: 24.73391 - - lat: 59.450751 - lng: 24.733895 - - lat: 59.450757 - lng: 24.733797 - - lat: 59.450765 - lng: 24.733721 - - lat: 59.450787 - lng: 24.733717 - - lat: 59.451083 - lng: 24.732819 - - lat: 59.451334 - lng: 24.732043 - - lat: 59.451338 - lng: 24.732015 - - lat: 59.451348 - lng: 24.731938 - - lat: 59.451372 - lng: 24.731837 - - lat: 59.451409 - lng: 24.73182 - - lat: 59.45143 - lng: 24.731764 - - lat: 59.45141 - lng: 24.731691 - - lat: 59.451419 - lng: 24.7316 - - lat: 59.451441 - lng: 24.731523 - - lat: 59.451503 - lng: 24.731316 - - lat: 59.451843 - lng: 24.73025 - - lat: 59.451886 - lng: 24.730235 - - lat: 59.451907 - lng: 24.730259 - - lat: 59.452026 - lng: 24.729829 - - lat: 59.452169 - lng: 24.729962 - - lat: 59.452226 - lng: 24.730034 - bbox: - sw: - lat: 59.442596 - lng: 24.729829 - ne: - lat: 59.452226 - lng: 24.765372 - distance: 2604.35 - waypoints: - - coordinate: - lat: 59.442643 - lng: 24.765368 - kind: Break - - coordinate: - lat: 59.452226 - lng: 24.730034 - kind: Break - steps: - - geometry: - - lat: 59.442643 - lng: 24.765368 - - lat: 59.442644 - lng: 24.765372 - - lat: 59.442596 - lng: 24.765043 - - lat: 59.442597 - lng: 24.764917 - - lat: 59.442617 - lng: 24.764716 - - lat: 59.442739 - lng: 24.763568 - - lat: 59.442754 - lng: 24.763449 - distance: 111.251 - duration: 90.107 - road_name: "" - instruction: Walk west on the walkway. - visual_instructions: - - primary_content: - text: Turn left onto the walkway. - maneuver_type: turn - maneuver_modifier: left - roundabout_exit_degrees: ~ - secondary_content: ~ - trigger_distance_before_maneuver: 111.251 - spoken_instructions: - - text: Walk west on the walkway. - ssml: "Walk west on the walkway." - trigger_distance_before_maneuver: 111.251 - - text: "In 200 feet, Turn left onto the walkway." - ssml: "In 200 feet, Turn left onto the walkway." - trigger_distance_before_maneuver: 60 - annotations: - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 48 - - 46 - - 50 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 48 - - 46 - - 49 - - 56 - - 52 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 51 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 57 - - 46 - - 52 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 53 - - 46 - - 51 - - 49 - - 53 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 51 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 55 - - 46 - - 49 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 53 - - 46 - - 54 - - 51 - - 57 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 51 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 49 - - 46 - - 54 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 57 - - 46 - - 56 - - 49 - - 56 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 50 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 54 - - 54 - - 46 - - 52 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 53 - - 49 - - 46 - - 53 - - 51 - - 57 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 51 - - 125 - - geometry: - - lat: 59.442754 - lng: 24.763449 - - lat: 59.442671 - lng: 24.763423 - distance: 9 - duration: 6.353 - road_name: "" - instruction: Turn left onto the walkway. - visual_instructions: - - primary_content: - text: Laeva - maneuver_type: turn - maneuver_modifier: right - roundabout_exit_degrees: ~ - secondary_content: ~ - trigger_distance_before_maneuver: 9 - spoken_instructions: - - text: "In 14 feet, Turn right onto Laeva." - ssml: "In 14 feet, Turn right onto Laeva." - trigger_distance_before_maneuver: 4.5 - annotations: [] - - geometry: - - lat: 59.442671 - lng: 24.763423 - - lat: 59.442709 - lng: 24.763155 - distance: 16 - duration: 12.424 - road_name: Laeva - instruction: Turn right onto Laeva. - visual_instructions: - - primary_content: - text: Bear right. - maneuver_type: turn - maneuver_modifier: slight right - roundabout_exit_degrees: ~ - secondary_content: ~ - trigger_distance_before_maneuver: 16 - spoken_instructions: - - text: "In 26 feet, Bear right." - ssml: "In 26 feet, Bear right." - trigger_distance_before_maneuver: 8 - annotations: [] - - geometry: - - lat: 59.442709 - lng: 24.763155 - - lat: 59.442749 - lng: 24.763063 - - lat: 59.442819 - lng: 24.763 - distance: 15 - duration: 11.224 - road_name: "" - instruction: Bear right. - visual_instructions: - - primary_content: - text: Bear left onto the walkway. - maneuver_type: turn - maneuver_modifier: slight left - roundabout_exit_degrees: ~ - secondary_content: ~ - trigger_distance_before_maneuver: 15 - spoken_instructions: - - text: "In 24 feet, Bear left onto the walkway." - ssml: "In 24 feet, Bear left onto the walkway." - trigger_distance_before_maneuver: 7.5 - annotations: - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 54 - - 46 - - 57 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 52 - - 46 - - 56 - - 57 - - 56 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - geometry: - - lat: 59.442819 - lng: 24.763 - - lat: 59.442834 - lng: 24.762904 - - lat: 59.442841 - lng: 24.762858 - - lat: 59.442918 - lng: 24.762356 - distance: 38 - duration: 26.824 - road_name: "" - instruction: Bear left onto the walkway. - visual_instructions: - - primary_content: - text: Continue. - maneuver_type: new name - maneuver_modifier: straight - roundabout_exit_degrees: ~ - secondary_content: ~ - trigger_distance_before_maneuver: 38 - spoken_instructions: - - text: "In 62 feet, Continue." - ssml: "In 62 feet, Continue." - trigger_distance_before_maneuver: 19 - annotations: - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 57 - - 46 - - 52 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 54 - - 46 - - 54 - - 48 - - 52 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 53 - - 46 - - 55 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 50 - - 46 - - 50 - - 50 - - 55 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 56 - - 46 - - 51 - - 51 - - 51 - - 52 - - 48 - - 48 - - 48 - - 48 - - 48 - - 48 - - 48 - - 48 - - 48 - - 48 - - 49 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 51 - - 125 - - geometry: - - lat: 59.442918 - lng: 24.762356 - - lat: 59.442936 - lng: 24.762237 - distance: 7 - duration: 4.941 - road_name: "" - instruction: Continue. - visual_instructions: - - primary_content: - text: Admiralisild; Admiral Bridge - maneuver_type: turn - maneuver_modifier: right - roundabout_exit_degrees: ~ - secondary_content: ~ - trigger_distance_before_maneuver: 7 - spoken_instructions: - - text: "In 11 feet, Turn right onto Admiralisild/Admiral Bridge." - ssml: "In 11 feet, Turn right onto Admiralisild/Admiral Bridge." - trigger_distance_before_maneuver: 3.5 - annotations: [] - - geometry: - - lat: 59.442936 - lng: 24.762237 - - lat: 59.442957 - lng: 24.762218 - - lat: 59.443129 - lng: 24.762072 - - lat: 59.443156 - lng: 24.762052 - - lat: 59.443526 - lng: 24.761765 - distance: 70 - duration: 52.275 - road_name: Admiralisild; Admiral Bridge - instruction: Turn right onto Admiralisild/Admiral Bridge. - visual_instructions: - - primary_content: - text: Continue on the walkway. - maneuver_type: new name - maneuver_modifier: straight - roundabout_exit_degrees: ~ - secondary_content: ~ - trigger_distance_before_maneuver: 70 - spoken_instructions: - - text: "In 200 feet, Continue on the walkway." - ssml: "In 200 feet, Continue on the walkway." - trigger_distance_before_maneuver: 60 - annotations: - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 54 - - 46 - - 57 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 53 - - 46 - - 49 - - 50 - - 55 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 51 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 56 - - 46 - - 54 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 54 - - 46 - - 52 - - 49 - - 50 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 51 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 53 - - 46 - - 55 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 52 - - 46 - - 48 - - 49 - - 50 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - geometry: - - lat: 59.443526 - lng: 24.761765 - - lat: 59.443564 - lng: 24.761733 - - lat: 59.4439 - lng: 24.761432 - distance: 46 - duration: 33.471 - road_name: "" - instruction: Continue on the walkway. - visual_instructions: - - primary_content: - text: Turn left onto the walkway. - maneuver_type: turn - maneuver_modifier: left - roundabout_exit_degrees: ~ - secondary_content: ~ - trigger_distance_before_maneuver: 46 - spoken_instructions: - - text: "In 75 feet, Turn left onto the walkway." - ssml: "In 75 feet, Turn left onto the walkway." - trigger_distance_before_maneuver: 23 - annotations: - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 46 - - 55 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 46 - - 57 - - 49 - - 57 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - geometry: - - lat: 59.4439 - lng: 24.761432 - - lat: 59.443487 - lng: 24.759273 - distance: 131 - duration: 101.718 - road_name: "" - instruction: Turn left onto the walkway. - visual_instructions: - - primary_content: - text: Turn right onto the walkway. - maneuver_type: turn - maneuver_modifier: right - roundabout_exit_degrees: ~ - secondary_content: ~ - trigger_distance_before_maneuver: 131 - spoken_instructions: - - text: "In 200 feet, Turn right onto the walkway." - ssml: "In 200 feet, Turn right onto the walkway." - trigger_distance_before_maneuver: 60 - annotations: [] - - geometry: - - lat: 59.443487 - lng: 24.759273 - - lat: 59.443533 - lng: 24.759243 - - lat: 59.443622 - lng: 24.759185 - - lat: 59.44365 - lng: 24.759167 - - lat: 59.443712 - lng: 24.759127 - distance: 25 - duration: 21.906 - road_name: "" - instruction: Turn right onto the walkway. - visual_instructions: - - primary_content: - text: Turn left onto the walkway. - maneuver_type: turn - maneuver_modifier: left - roundabout_exit_degrees: ~ - secondary_content: ~ - trigger_distance_before_maneuver: 25 - spoken_instructions: - - text: "In 41 feet, Turn left onto the walkway." - ssml: "In 41 feet, Turn left onto the walkway." - trigger_distance_before_maneuver: 12.5 - annotations: - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 57 - - 46 - - 55 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 50 - - 48 - - 46 - - 57 - - 52 - - 55 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 55 - - 46 - - 48 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 52 - - 46 - - 57 - - 54 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 46 - - 54 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 46 - - 56 - - 49 - - 53 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - geometry: - - lat: 59.443712 - lng: 24.759127 - - lat: 59.443701 - lng: 24.759061 - - lat: 59.443693 - lng: 24.759007 - - lat: 59.443674 - lng: 24.758853 - distance: 16 - duration: 12.294 - road_name: "" - instruction: Turn left onto the walkway. - visual_instructions: - - primary_content: - text: Logi - maneuver_type: turn - maneuver_modifier: right - roundabout_exit_degrees: ~ - secondary_content: ~ - trigger_distance_before_maneuver: 16 - spoken_instructions: - - text: "In 26 feet, Turn right onto Logi." - ssml: "In 26 feet, Turn right onto Logi." - trigger_distance_before_maneuver: 8 - annotations: - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 48 - - 46 - - 57 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 52 - - 46 - - 55 - - 50 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 51 - - 46 - - 50 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 50 - - 46 - - 50 - - 54 - - 55 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - geometry: - - lat: 59.443674 - lng: 24.758853 - - lat: 59.443719 - lng: 24.758831 - - lat: 59.443739 - lng: 24.758825 - - lat: 59.443824 - lng: 24.758783 - - lat: 59.444002 - lng: 24.75869 - - lat: 59.444052 - lng: 24.758636 - - lat: 59.444086 - lng: 24.75862 - - lat: 59.444176 - lng: 24.758576 - - lat: 59.444346 - lng: 24.75849 - - lat: 59.444417 - lng: 24.758402 - - lat: 59.444448 - lng: 24.758392 - distance: 91 - duration: 72.235 - road_name: Logi - instruction: Turn right onto Logi. - visual_instructions: - - primary_content: - text: Turn left onto the walkway. - maneuver_type: turn - maneuver_modifier: left - roundabout_exit_degrees: ~ - secondary_content: ~ - trigger_distance_before_maneuver: 91 - spoken_instructions: - - text: "In 200 feet, Turn left onto the walkway." - ssml: "In 200 feet, Turn left onto the walkway." - trigger_distance_before_maneuver: 60 - annotations: - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 52 - - 52 - - 46 - - 51 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 51 - - 51 - - 46 - - 49 - - 50 - - 56 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 51 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 52 - - 46 - - 54 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 51 - - 46 - - 50 - - 52 - - 56 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 52 - - 49 - - 46 - - 49 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 50 - - 57 - - 46 - - 48 - - 49 - - 50 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 51 - - 48 - - 46 - - 53 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 48 - - 49 - - 46 - - 51 - - 54 - - 55 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 51 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 53 - - 46 - - 52 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 51 - - 46 - - 56 - - 48 - - 56 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 48 - - 46 - - 52 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 56 - - 46 - - 56 - - 52 - - 49 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 50 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 51 - - 46 - - 51 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 50 - - 46 - - 53 - - 57 - - 50 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 51 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 55 - - 46 - - 51 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 53 - - 46 - - 55 - - 52 - - 50 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 51 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 51 - - 46 - - 57 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 50 - - 46 - - 55 - - 55 - - 52 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - geometry: - - lat: 59.444448 - lng: 24.758392 - - lat: 59.444431 - lng: 24.758246 - distance: 8 - duration: 5.647 - road_name: "" - instruction: Turn left onto the walkway. - visual_instructions: - - primary_content: - text: Turn right onto the walkway. - maneuver_type: turn - maneuver_modifier: right - roundabout_exit_degrees: ~ - secondary_content: ~ - trigger_distance_before_maneuver: 8 - spoken_instructions: - - text: "In 13 feet, Turn right onto the walkway." - ssml: "In 13 feet, Turn right onto the walkway." - trigger_distance_before_maneuver: 4 - annotations: [] - - geometry: - - lat: 59.444431 - lng: 24.758246 - - lat: 59.444579 - lng: 24.75819 - - lat: 59.444893 - lng: 24.75805 - - lat: 59.444979 - lng: 24.757981 - - lat: 59.445069 - lng: 24.757636 - distance: 85 - duration: 64.447 - road_name: "" - instruction: Turn right onto the walkway. - visual_instructions: - - primary_content: - text: Kultuurikilomeeter - maneuver_type: turn - maneuver_modifier: slight left - roundabout_exit_degrees: ~ - secondary_content: ~ - trigger_distance_before_maneuver: 85 - spoken_instructions: - - text: "In 200 feet, Bear left onto Kultuurikilomeeter." - ssml: "In 200 feet, Bear left onto Kultuurikilomeeter." - trigger_distance_before_maneuver: 60 - annotations: - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 51 - - 46 - - 50 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 50 - - 46 - - 50 - - 52 - - 55 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 57 - - 46 - - 48 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 54 - - 46 - - 51 - - 51 - - 49 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 53 - - 46 - - 50 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 51 - - 46 - - 54 - - 52 - - 51 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - geometry: - - lat: 59.445069 - lng: 24.757636 - - lat: 59.444948 - lng: 24.754468 - - lat: 59.444939 - lng: 24.75424 - - lat: 59.444903 - lng: 24.753388 - - lat: 59.444898 - lng: 24.75326 - - lat: 59.44489 - lng: 24.753154 - - lat: 59.444855 - lng: 24.752151 - - lat: 59.444835 - lng: 24.751726 - - lat: 59.444834 - lng: 24.751684 - - lat: 59.444834 - lng: 24.751667 - - lat: 59.444833 - lng: 24.751609 - - lat: 59.444827 - lng: 24.7513 - - lat: 59.444829 - lng: 24.751265 - - lat: 59.444834 - lng: 24.751183 - - lat: 59.444849 - lng: 24.751063 - - lat: 59.444866 - lng: 24.750981 - - lat: 59.444899 - lng: 24.750819 - - lat: 59.444936 - lng: 24.750656 - - lat: 59.444991 - lng: 24.750416 - - lat: 59.444997 - lng: 24.750389 - - lat: 59.445137 - lng: 24.749787 - - lat: 59.445194 - lng: 24.749523 - - lat: 59.445282 - lng: 24.749169 - - lat: 59.445326 - lng: 24.74898 - - lat: 59.445314 - lng: 24.748832 - - lat: 59.445299 - lng: 24.748602 - - lat: 59.445294 - lng: 24.748497 - - lat: 59.445298 - lng: 24.748451 - - lat: 59.445335 - lng: 24.748365 - - lat: 59.445568 - lng: 24.747739 - - lat: 59.44562 - lng: 24.747619 - - lat: 59.44569 - lng: 24.747459 - - lat: 59.445773 - lng: 24.747265 - - lat: 59.445799 - lng: 24.747205 - - lat: 59.445869 - lng: 24.747082 - - lat: 59.445948 - lng: 24.746945 - - lat: 59.446119 - lng: 24.746691 - - lat: 59.44613 - lng: 24.746674 - - lat: 59.446266 - lng: 24.746516 - - lat: 59.446392 - lng: 24.746383 - - lat: 59.447073 - lng: 24.745802 - - lat: 59.447676 - lng: 24.745279 - - lat: 59.447848 - lng: 24.74511 - - lat: 59.448038 - lng: 24.744866 - - lat: 59.448255 - lng: 24.744526 - - lat: 59.448443 - lng: 24.744152 - - lat: 59.448527 - lng: 24.743973 - - lat: 59.448671 - lng: 24.743545 - - lat: 59.448768 - lng: 24.743184 - - lat: 59.448916 - lng: 24.742627 - - lat: 59.449029 - lng: 24.74203 - - lat: 59.449132 - lng: 24.741172 - - lat: 59.449157 - lng: 24.741044 - - lat: 59.449276 - lng: 24.740442 - - lat: 59.44946 - lng: 24.739543 - distance: 1254 - duration: 966.424 - road_name: Kultuurikilomeeter - instruction: Bear left onto Kultuurikilomeeter. - visual_instructions: - - primary_content: - text: Turn right onto the walkway. - maneuver_type: turn - maneuver_modifier: right - roundabout_exit_degrees: ~ - secondary_content: ~ - trigger_distance_before_maneuver: 1254 - spoken_instructions: - - text: "In 200 feet, Turn right onto the walkway." - ssml: "In 200 feet, Turn right onto the walkway." - trigger_distance_before_maneuver: 60 - annotations: - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 46 - - 51 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 46 - - 53 - - 56 - - 57 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 57 - - 46 - - 56 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 54 - - 46 - - 56 - - 56 - - 55 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 48 - - 46 - - 53 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 52 - - 46 - - 52 - - 55 - - 50 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 54 - - 46 - - 52 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 52 - - 46 - - 52 - - 56 - - 50 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 51 - - 46 - - 57 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 50 - - 46 - - 55 - - 52 - - 55 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 48 - - 46 - - 51 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 55 - - 46 - - 50 - - 56 - - 56 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 57 - - 46 - - 53 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 51 - - 46 - - 55 - - 57 - - 51 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 57 - - 46 - - 51 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 54 - - 46 - - 53 - - 57 - - 52 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 51 - - 46 - - 53 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 50 - - 46 - - 52 - - 54 - - 57 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 56 - - 46 - - 53 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 53 - - 46 - - 57 - - 56 - - 51 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 54 - - 46 - - 56 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 51 - - 46 - - 48 - - 50 - - 55 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 51 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 51 - - 53 - - 46 - - 56 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 50 - - 55 - - 46 - - 56 - - 51 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 51 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 48 - - 46 - - 51 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 56 - - 46 - - 48 - - 50 - - 56 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 51 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 49 - - 46 - - 57 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 53 - - 46 - - 52 - - 57 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 55 - - 57 - - 46 - - 56 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 50 - - 54 - - 46 - - 57 - - 48 - - 56 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 50 - - 46 - - 57 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 50 - - 46 - - 49 - - 53 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 49 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 52 - - 56 - - 46 - - 52 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 51 - - 52 - - 46 - - 49 - - 53 - - 50 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 55 - - 46 - - 51 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 53 - - 46 - - 49 - - 50 - - 57 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 54 - - 46 - - 49 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 52 - - 46 - - 50 - - 56 - - 49 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 53 - - 54 - - 46 - - 57 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 52 - - 50 - - 46 - - 53 - - 55 - - 49 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 51 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 52 - - 46 - - 50 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 56 - - 46 - - 48 - - 55 - - 51 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 51 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 46 - - 52 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 46 - - 55 - - 56 - - 49 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 51 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 46 - - 48 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 48 - - 46 - - 54 - - 56 - - 49 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 51 - - 46 - - 51 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 50 - - 46 - - 51 - - 49 - - 56 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 55 - - 46 - - 53 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 55 - - 46 - - 54 - - 54 - - 52 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 48 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 46 - - 48 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 50 - - 46 - - 48 - - 49 - - 50 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 48 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 52 - - 46 - - 55 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 52 - - 46 - - 55 - - 49 - - 55 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 48 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 55 - - 46 - - 48 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 55 - - 46 - - 48 - - 53 - - 57 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 48 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 53 - - 46 - - 48 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 53 - - 46 - - 48 - - 53 - - 56 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 48 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 57 - - 46 - - 57 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 55 - - 46 - - 54 - - 54 - - 57 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 51 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 48 - - 46 - - 49 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 55 - - 46 - - 56 - - 52 - - 52 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 51 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 52 - - 46 - - 57 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 48 - - 46 - - 53 - - 49 - - 54 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 46 - - 55 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 46 - - 49 - - 55 - - 55 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 51 - - 55 - - 46 - - 53 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 50 - - 54 - - 46 - - 52 - - 52 - - 53 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 54 - - 46 - - 50 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 49 - - 46 - - 52 - - 53 - - 56 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 50 - - 46 - - 51 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 53 - - 46 - - 55 - - 52 - - 49 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 49 - - 46 - - 56 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 56 - - 46 - - 51 - - 48 - - 52 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 56 - - 46 - - 53 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 53 - - 46 - - 57 - - 56 - - 55 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 51 - - 46 - - 49 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 51 - - 46 - - 50 - - 52 - - 54 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 48 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 54 - - 46 - - 48 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 52 - - 46 - - 50 - - 49 - - 51 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 46 - - 54 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 46 - - 56 - - 54 - - 52 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 54 - - 46 - - 52 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 52 - - 46 - - 55 - - 55 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 51 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 52 - - 51 - - 46 - - 57 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 51 - - 50 - - 46 - - 56 - - 53 - - 50 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 51 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 56 - - 46 - - 57 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 54 - - 46 - - 54 - - 55 - - 55 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 51 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 49 - - 46 - - 57 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 56 - - 46 - - 57 - - 51 - - 56 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 51 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 52 - - 46 - - 51 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 48 - - 46 - - 55 - - 51 - - 55 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 51 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 52 - - 46 - - 53 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 51 - - 46 - - 51 - - 51 - - 57 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 51 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 48 - - 46 - - 52 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 55 - - 46 - - 56 - - 49 - - 56 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 51 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 49 - - 46 - - 55 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 49 - - 46 - - 48 - - 48 - - 54 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 49 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 51 - - 46 - - 57 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 50 - - 50 - - 46 - - 51 - - 57 - - 52 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 49 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 46 - - 54 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 46 - - 51 - - 50 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 50 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 55 - - 46 - - 54 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 52 - - 46 - - 56 - - 57 - - 51 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 50 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 53 - - 46 - - 57 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 51 - - 46 - - 52 - - 56 - - 51 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 50 - - 125 - - geometry: - - lat: 59.44946 - lng: 24.739543 - - lat: 59.449578 - lng: 24.73963 - - lat: 59.449652 - lng: 24.739675 - distance: 23 - duration: 18.235 - road_name: "" - instruction: Turn right onto the walkway. - visual_instructions: - - primary_content: - text: Turn left onto the walkway. - maneuver_type: turn - maneuver_modifier: left - roundabout_exit_degrees: ~ - secondary_content: ~ - trigger_distance_before_maneuver: 23 - spoken_instructions: - - text: "In 37 feet, Turn left onto the walkway." - ssml: "In 37 feet, Turn left onto the walkway." - trigger_distance_before_maneuver: 11.5 - annotations: - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 56 - - 50 - - 46 - - 54 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 54 - - 57 - - 46 - - 57 - - 57 - - 52 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 50 - - 125 - - geometry: - - lat: 59.449652 - lng: 24.739675 - - lat: 59.449697 - lng: 24.739489 - - lat: 59.449733 - lng: 24.739454 - distance: 16 - duration: 11.294 - road_name: "" - instruction: Turn left onto the walkway. - visual_instructions: - - primary_content: - text: Turn left onto the crosswalk. - maneuver_type: turn - maneuver_modifier: left - roundabout_exit_degrees: ~ - secondary_content: ~ - trigger_distance_before_maneuver: 16 - spoken_instructions: - - text: "In 26 feet, Turn left onto the crosswalk." - ssml: "In 26 feet, Turn left onto the crosswalk." - trigger_distance_before_maneuver: 8 - annotations: - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 55 - - 51 - - 46 - - 52 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 53 - - 49 - - 46 - - 55 - - 56 - - 52 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - geometry: - - lat: 59.449733 - lng: 24.739454 - - lat: 59.449727 - lng: 24.739369 - - lat: 59.44975 - lng: 24.73924 - - lat: 59.449766 - lng: 24.739172 - - lat: 59.449773 - lng: 24.73913 - - lat: 59.449812 - lng: 24.739014 - - lat: 59.450009 - lng: 24.738034 - - lat: 59.450135 - lng: 24.737365 - - lat: 59.450207 - lng: 24.737042 - - lat: 59.450228 - lng: 24.736911 - - lat: 59.450277 - lng: 24.736613 - - lat: 59.450327 - lng: 24.736371 - - lat: 59.450403 - lng: 24.735904 - - lat: 59.450537 - lng: 24.735241 - - lat: 59.45058 - lng: 24.734953 - - lat: 59.450687 - lng: 24.734123 - - lat: 59.450703 - lng: 24.733977 - - lat: 59.45072 - lng: 24.73391 - - lat: 59.450751 - lng: 24.733895 - - lat: 59.450757 - lng: 24.733797 - - lat: 59.450765 - lng: 24.733721 - distance: 347 - duration: 263.849 - road_name: "" - instruction: Turn left onto the crosswalk. - visual_instructions: - - primary_content: - text: Turn right onto the walkway. - maneuver_type: turn - maneuver_modifier: right - roundabout_exit_degrees: ~ - secondary_content: ~ - trigger_distance_before_maneuver: 347 - spoken_instructions: - - text: "In 200 feet, Turn right onto the walkway." - ssml: "In 200 feet, Turn right onto the walkway." - trigger_distance_before_maneuver: 60 - annotations: - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 49 - - 46 - - 52 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 53 - - 46 - - 49 - - 48 - - 56 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 53 - - 46 - - 51 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 57 - - 46 - - 57 - - 54 - - 57 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 51 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 51 - - 48 - - 46 - - 57 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 50 - - 52 - - 46 - - 52 - - 49 - - 53 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 51 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 57 - - 46 - - 56 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 50 - - 51 - - 46 - - 53 - - 51 - - 49 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 51 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 51 - - 46 - - 56 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 48 - - 46 - - 56 - - 57 - - 57 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 51 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 57 - - 46 - - 48 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 51 - - 50 - - 46 - - 49 - - 56 - - 55 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 48 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 51 - - 46 - - 49 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 54 - - 46 - - 51 - - 49 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 51 - - 53 - - 46 - - 54 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 50 - - 53 - - 46 - - 49 - - 48 - - 52 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 51 - - 54 - - 46 - - 48 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 50 - - 53 - - 46 - - 52 - - 52 - - 53 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 52 - - 57 - - 46 - - 57 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 51 - - 53 - - 46 - - 50 - - 49 - - 51 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 55 - - 46 - - 56 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 53 - - 46 - - 52 - - 55 - - 55 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 51 - - 54 - - 46 - - 53 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 50 - - 53 - - 46 - - 55 - - 57 - - 57 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 53 - - 52 - - 46 - - 56 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 51 - - 56 - - 46 - - 55 - - 48 - - 57 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 52 - - 46 - - 48 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 57 - - 46 - - 57 - - 48 - - 50 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 56 - - 46 - - 54 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 54 - - 46 - - 48 - - 56 - - 54 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 49 - - 46 - - 55 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 56 - - 46 - - 50 - - 50 - - 56 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 52 - - 46 - - 53 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 51 - - 46 - - 49 - - 53 - - 54 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 52 - - 46 - - 57 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 51 - - 46 - - 52 - - 50 - - 55 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 55 - - 46 - - 55 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 53 - - 46 - - 52 - - 54 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - geometry: - - lat: 59.450765 - lng: 24.733721 - - lat: 59.450787 - lng: 24.733717 - distance: 2 - duration: 1.412 - road_name: "" - instruction: Turn right onto the walkway. - visual_instructions: - - primary_content: - text: Turn left onto the walkway. - maneuver_type: turn - maneuver_modifier: left - roundabout_exit_degrees: ~ - secondary_content: ~ - trigger_distance_before_maneuver: 2 - spoken_instructions: - - text: "In 3 feet, Turn left onto the walkway." - ssml: "In 3 feet, Turn left onto the walkway." - trigger_distance_before_maneuver: 1 - annotations: [] - - geometry: - - lat: 59.450787 - lng: 24.733717 - - lat: 59.451083 - lng: 24.732819 - - lat: 59.451334 - lng: 24.732043 - - lat: 59.451338 - lng: 24.732015 - - lat: 59.451348 - lng: 24.731938 - - lat: 59.451372 - lng: 24.731837 - - lat: 59.451409 - lng: 24.73182 - - lat: 59.45143 - lng: 24.731764 - - lat: 59.45141 - lng: 24.731691 - - lat: 59.451419 - lng: 24.7316 - - lat: 59.451441 - lng: 24.731523 - - lat: 59.451503 - lng: 24.731316 - - lat: 59.451843 - lng: 24.73025 - - lat: 59.451886 - lng: 24.730235 - - lat: 59.451907 - lng: 24.730259 - distance: 241 - duration: 184.456 - road_name: "" - instruction: Turn left onto the walkway. - visual_instructions: - - primary_content: - text: Allveelaeva - maneuver_type: turn - maneuver_modifier: slight left - roundabout_exit_degrees: ~ - secondary_content: ~ - trigger_distance_before_maneuver: 241 - spoken_instructions: - - text: "In 200 feet, Bear left onto Allveelaeva." - ssml: "In 200 feet, Bear left onto Allveelaeva." - trigger_distance_before_maneuver: 60 - annotations: - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 52 - - 46 - - 50 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 50 - - 46 - - 57 - - 57 - - 51 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 46 - - 53 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 46 - - 56 - - 55 - - 49 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 51 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 55 - - 46 - - 57 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 53 - - 46 - - 56 - - 56 - - 56 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 51 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 53 - - 57 - - 46 - - 54 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 52 - - 52 - - 46 - - 54 - - 49 - - 55 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 51 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 52 - - 48 - - 46 - - 52 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 51 - - 48 - - 46 - - 50 - - 48 - - 54 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 51 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 48 - - 46 - - 48 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 53 - - 46 - - 52 - - 57 - - 54 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 51 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 55 - - 46 - - 56 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 53 - - 46 - - 52 - - 56 - - 55 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 55 - - 46 - - 55 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 50 - - 46 - - 53 - - 49 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 52 - - 46 - - 56 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 48 - - 46 - - 52 - - 51 - - 52 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 55 - - 46 - - 55 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 57 - - 46 - - 53 - - 56 - - 53 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 52 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 52 - - 48 - - 46 - - 52 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 51 - - 49 - - 46 - - 51 - - 52 - - 55 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 51 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 55 - - 46 - - 48 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 51 - - 46 - - 49 - - 56 - - 56 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 51 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 52 - - 56 - - 46 - - 52 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 51 - - 55 - - 46 - - 54 - - 50 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 51 - - 125 - - geometry: - - lat: 59.451907 - lng: 24.730259 - - lat: 59.452026 - lng: 24.729829 - distance: 28 - duration: 20.951 - road_name: Allveelaeva - instruction: Bear left onto Allveelaeva. - visual_instructions: - - primary_content: - text: Peetri - maneuver_type: turn - maneuver_modifier: right - roundabout_exit_degrees: ~ - secondary_content: ~ - trigger_distance_before_maneuver: 28 - spoken_instructions: - - text: "In 45 feet, Turn right onto Peetri." - ssml: "In 45 feet, Turn right onto Peetri." - trigger_distance_before_maneuver: 14 - annotations: [] - - geometry: - - lat: 59.452026 - lng: 24.729829 - - lat: 59.452169 - lng: 24.729962 - - lat: 59.452226 - lng: 24.730034 - distance: 25.099 - duration: 24.804 - road_name: Peetri - instruction: Turn right onto Peetri. - visual_instructions: - - primary_content: - text: You have arrived at your destination. - maneuver_type: arrive - maneuver_modifier: ~ - roundabout_exit_degrees: ~ - secondary_content: ~ - trigger_distance_before_maneuver: 25.099 - spoken_instructions: - - text: "In 41 feet, You have arrived at your destination." - ssml: "In 41 feet, You have arrived at your destination." - trigger_distance_before_maneuver: 12.5495 - annotations: - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 56 - - 46 - - 53 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 54 - - 46 - - 54 - - 56 - - 49 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 49 - - 46 - - 51 - - 125 - - geometry: - - lat: 59.452226 - lng: 24.730034 - - lat: 59.452226 - lng: 24.730034 - distance: 0 - duration: 0 - road_name: Peetri - instruction: You have arrived at your destination. - visual_instructions: - - primary_content: - text: You have arrived at your destination. - maneuver_type: arrive - maneuver_modifier: ~ - roundabout_exit_degrees: ~ - secondary_content: ~ - trigger_distance_before_maneuver: 0 - spoken_instructions: [] - annotations: [] diff --git a/common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__tests__parse_valhalla_osrm_with_via_ways.snap b/common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__tests__parse_valhalla_osrm_with_via_ways.snap index 0c33a6c3..de3e0e44 100644 --- a/common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__tests__parse_valhalla_osrm_with_via_ways.snap +++ b/common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__tests__parse_valhalla_osrm_with_via_ways.snap @@ -449,6 +449,107 @@ expression: routes - text: "In 200 feet, You have arrived at your destination." ssml: "In 200 feet, You have arrived at your destination." trigger_distance_before_maneuver: 60 + annotations: + - "{\"distance\":4.4,\"duration\":0.635,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":25.8,\"duration\":3.717,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":23.9,\"duration\":3.436,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":44.6,\"duration\":6.419,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":9.1,\"duration\":1.314,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":12.4,\"duration\":1.782,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":8.9,\"duration\":1.286,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":5.3,\"duration\":0.762,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":7.4,\"duration\":1.065,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":8.2,\"duration\":1.174,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":23.9,\"duration\":3.447,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":21.0,\"duration\":3.019,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":19.0,\"duration\":2.729,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":8.6,\"duration\":1.243,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":33.9,\"duration\":4.882,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":31.7,\"duration\":4.569,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":27.3,\"duration\":3.929,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":33.1,\"duration\":4.765,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":19.0,\"duration\":2.738,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":17.9,\"duration\":2.584,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":7.0,\"duration\":1.008,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":4.7,\"duration\":0.67,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":34.5,\"duration\":4.971,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":21.0,\"duration\":3.031,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":7.2,\"duration\":1.03,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":5.9,\"duration\":0.848,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":4.0,\"duration\":0.577,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":27.4,\"duration\":3.943,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":29.2,\"duration\":4.211,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":23.8,\"duration\":3.427,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":32.9,\"duration\":4.736,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":21.7,\"duration\":3.12,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":25.3,\"duration\":3.636,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":40.2,\"duration\":5.787,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":23.0,\"duration\":3.309,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":40.1,\"duration\":5.772,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":17.9,\"duration\":2.581,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":21.6,\"duration\":3.116,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":5.1,\"duration\":0.74,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":5.6,\"duration\":0.801,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":11.8,\"duration\":1.692,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":25.7,\"duration\":3.698,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":16.7,\"duration\":2.404,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":21.7,\"duration\":3.121,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":19.8,\"duration\":2.85,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":27.8,\"duration\":4.005,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":17.5,\"duration\":2.516,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":17.2,\"duration\":2.473,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":19.6,\"duration\":2.829,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":10.3,\"duration\":1.479,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":7.7,\"duration\":1.11,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":5.4,\"duration\":0.774,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":20.9,\"duration\":3.007,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":13.3,\"duration\":1.911,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":15.2,\"duration\":2.196,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":12.6,\"duration\":1.815,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":11.9,\"duration\":1.713,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":16.5,\"duration\":2.375,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":25.1,\"duration\":3.614,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":16.4,\"duration\":2.367,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":17.2,\"duration\":2.484,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":18.3,\"duration\":2.633,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":12.5,\"duration\":1.795,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":20.6,\"duration\":2.968,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":32.7,\"duration\":4.708,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":34.0,\"duration\":4.896,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":28.2,\"duration\":4.059,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":44.9,\"duration\":6.466,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":30.2,\"duration\":4.352,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":26.9,\"duration\":3.877,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":12.3,\"duration\":1.776,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":17.2,\"duration\":2.471,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":18.1,\"duration\":2.607,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":19.0,\"duration\":2.735,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":14.6,\"duration\":2.099,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":21.0,\"duration\":3.019,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":29.1,\"duration\":4.194,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":24.6,\"duration\":3.542,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":22.4,\"duration\":3.22,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":37.5,\"duration\":5.398,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":26.3,\"duration\":3.781,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":28.4,\"duration\":4.094,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":31.4,\"duration\":4.526,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":28.0,\"duration\":4.025,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":34.8,\"duration\":5.011,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":22.2,\"duration\":3.202,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":12.4,\"duration\":1.789,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":14.2,\"duration\":2.044,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":24.3,\"duration\":3.5,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":26.1,\"duration\":3.754,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":13.6,\"duration\":1.96,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":22.2,\"duration\":3.194,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":12.9,\"duration\":1.856,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":20.5,\"duration\":2.957,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":20.3,\"duration\":2.922,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":34.7,\"duration\":4.995,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":33.9,\"duration\":4.882,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":27.5,\"duration\":3.957,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":29.7,\"duration\":4.278,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + - "{\"distance\":28.1,\"duration\":4.048,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - geometry: - lat: 28.790106 lng: -82.018021 @@ -467,3 +568,4 @@ expression: routes secondary_content: ~ trigger_distance_before_maneuver: 0 spoken_instructions: [] + annotations: ~ diff --git a/common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__tests__parse_valhalla_osrm_with_via_ways.snap.new b/common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__tests__parse_valhalla_osrm_with_via_ways.snap.new deleted file mode 100644 index 4554a3c1..00000000 --- a/common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__tests__parse_valhalla_osrm_with_via_ways.snap.new +++ /dev/null @@ -1,7475 +0,0 @@ ---- -source: ferrostar/src/routing_adapters/osrm/mod.rs -assertion_line: 253 -expression: routes ---- -- geometry: - - lat: 28.795656 - lng: -82.036056 - - lat: 28.795632 - lng: -82.03602 - - lat: 28.795446 - lng: -82.035862 - - lat: 28.795242 - lng: -82.035787 - - lat: 28.794865 - lng: -82.035633 - - lat: 28.794788 - lng: -82.035601 - - lat: 28.794687 - lng: -82.035548 - - lat: 28.794614 - lng: -82.03551 - - lat: 28.794567 - lng: -82.035518 - - lat: 28.794504 - lng: -82.035542 - - lat: 28.794436 - lng: -82.035511 - - lat: 28.794273 - lng: -82.035351 - - lat: 28.794139 - lng: -82.0352 - - lat: 28.793991 - lng: -82.035104 - - lat: 28.793934 - lng: -82.035044 - - lat: 28.793761 - lng: -82.034758 - - lat: 28.793597 - lng: -82.034492 - - lat: 28.793455 - lng: -82.034264 - - lat: 28.793318 - lng: -82.033963 - - lat: 28.79323 - lng: -82.033796 - - lat: 28.793138 - lng: -82.033645 - - lat: 28.793118 - lng: -82.033577 - - lat: 28.793107 - lng: -82.033531 - - lat: 28.793056 - lng: -82.033182 - - lat: 28.792997 - lng: -82.032977 - - lat: 28.792985 - lng: -82.032905 - - lat: 28.792979 - lng: -82.032845 - - lat: 28.792977 - lng: -82.032804 - - lat: 28.79296 - lng: -82.032524 - - lat: 28.792979 - lng: -82.032225 - - lat: 28.792998 - lng: -82.031982 - - lat: 28.793005 - lng: -82.031645 - - lat: 28.793011 - lng: -82.031423 - - lat: 28.793038 - lng: -82.031166 - - lat: 28.793149 - lng: -82.030774 - - lat: 28.793239 - lng: -82.030562 - - lat: 28.793445 - lng: -82.030225 - - lat: 28.79353 - lng: -82.030069 - - lat: 28.793602 - lng: -82.029863 - - lat: 28.793634 - lng: -82.029825 - - lat: 28.793661 - lng: -82.029777 - - lat: 28.793727 - lng: -82.029683 - - lat: 28.793881 - lng: -82.029487 - - lat: 28.793972 - lng: -82.029351 - - lat: 28.79407 - lng: -82.029159 - - lat: 28.79413 - lng: -82.028968 - - lat: 28.794172 - lng: -82.028687 - - lat: 28.794177 - lng: -82.028508 - - lat: 28.79416 - lng: -82.028333 - - lat: 28.794116 - lng: -82.028138 - - lat: 28.794097 - lng: -82.028035 - - lat: 28.794078 - lng: -82.027959 - - lat: 28.794075 - lng: -82.027904 - - lat: 28.794079 - lng: -82.02769 - - lat: 28.79408 - lng: -82.027554 - - lat: 28.794052 - lng: -82.027401 - - lat: 28.794058 - lng: -82.027272 - - lat: 28.794071 - lng: -82.027151 - - lat: 28.794099 - lng: -82.026985 - - lat: 28.794129 - lng: -82.02673 - - lat: 28.794118 - lng: -82.026562 - - lat: 28.794086 - lng: -82.026389 - - lat: 28.794032 - lng: -82.026212 - - lat: 28.793989 - lng: -82.026094 - - lat: 28.793908 - lng: -82.025904 - - lat: 28.793767 - lng: -82.02561 - - lat: 28.793575 - lng: -82.025339 - - lat: 28.793382 - lng: -82.025152 - - lat: 28.793051 - lng: -82.024889 - - lat: 28.792853 - lng: -82.024677 - - lat: 28.792666 - lng: -82.024502 - - lat: 28.792613 - lng: -82.024391 - - lat: 28.792553 - lng: -82.024229 - - lat: 28.792517 - lng: -82.024048 - - lat: 28.792452 - lng: -82.023868 - - lat: 28.792434 - lng: -82.02372 - - lat: 28.792409 - lng: -82.023507 - - lat: 28.792369 - lng: -82.023212 - - lat: 28.792307 - lng: -82.02297 - - lat: 28.792235 - lng: -82.022756 - - lat: 28.792102 - lng: -82.022403 - - lat: 28.791981 - lng: -82.022172 - - lat: 28.791823 - lng: -82.021943 - - lat: 28.791628 - lng: -82.02171 - - lat: 28.791463 - lng: -82.021494 - - lat: 28.791281 - lng: -82.021204 - - lat: 28.791179 - lng: -82.021008 - - lat: 28.791133 - lng: -82.020892 - - lat: 28.79109 - lng: -82.020755 - - lat: 28.791046 - lng: -82.020511 - - lat: 28.790976 - lng: -82.020256 - - lat: 28.790942 - lng: -82.020122 - - lat: 28.790931 - lng: -82.019895 - - lat: 28.790906 - lng: -82.019766 - - lat: 28.790841 - lng: -82.019569 - - lat: 28.790763 - lng: -82.019381 - - lat: 28.7906 - lng: -82.019078 - - lat: 28.790396 - lng: -82.01882 - - lat: 28.790264 - lng: -82.018582 - - lat: 28.790157 - lng: -82.018303 - - lat: 28.790106 - lng: -82.018021 - bbox: - sw: - lat: 28.790106 - lng: -82.036056 - ne: - lat: 28.795656 - lng: -82.018021 - distance: 2089.442 - waypoints: - - coordinate: - lat: 28.795656 - lng: -82.036056 - kind: Break - - coordinate: - lat: 28.795446 - lng: -82.035862 - kind: Via - - coordinate: - lat: 28.790106 - lng: -82.018021 - kind: Break - steps: - - geometry: - - lat: 28.795656 - lng: -82.036056 - - lat: 28.795632 - lng: -82.03602 - - lat: 28.795446 - lng: -82.035862 - - lat: 28.795242 - lng: -82.035787 - - lat: 28.794865 - lng: -82.035633 - - lat: 28.794788 - lng: -82.035601 - - lat: 28.794687 - lng: -82.035548 - - lat: 28.794614 - lng: -82.03551 - - lat: 28.794567 - lng: -82.035518 - - lat: 28.794504 - lng: -82.035542 - - lat: 28.794436 - lng: -82.035511 - - lat: 28.794273 - lng: -82.035351 - - lat: 28.794139 - lng: -82.0352 - - lat: 28.793991 - lng: -82.035104 - - lat: 28.793934 - lng: -82.035044 - - lat: 28.793761 - lng: -82.034758 - - lat: 28.793597 - lng: -82.034492 - - lat: 28.793455 - lng: -82.034264 - - lat: 28.793318 - lng: -82.033963 - - lat: 28.79323 - lng: -82.033796 - - lat: 28.793138 - lng: -82.033645 - - lat: 28.793118 - lng: -82.033577 - - lat: 28.793107 - lng: -82.033531 - - lat: 28.793056 - lng: -82.033182 - - lat: 28.792997 - lng: -82.032977 - - lat: 28.792985 - lng: -82.032905 - - lat: 28.792979 - lng: -82.032845 - - lat: 28.792977 - lng: -82.032804 - - lat: 28.79296 - lng: -82.032524 - - lat: 28.792979 - lng: -82.032225 - - lat: 28.792998 - lng: -82.031982 - - lat: 28.793005 - lng: -82.031645 - - lat: 28.793011 - lng: -82.031423 - - lat: 28.793038 - lng: -82.031166 - - lat: 28.793149 - lng: -82.030774 - - lat: 28.793239 - lng: -82.030562 - - lat: 28.793445 - lng: -82.030225 - - lat: 28.79353 - lng: -82.030069 - - lat: 28.793602 - lng: -82.029863 - - lat: 28.793634 - lng: -82.029825 - - lat: 28.793661 - lng: -82.029777 - - lat: 28.793727 - lng: -82.029683 - - lat: 28.793881 - lng: -82.029487 - - lat: 28.793972 - lng: -82.029351 - - lat: 28.79407 - lng: -82.029159 - - lat: 28.79413 - lng: -82.028968 - - lat: 28.794172 - lng: -82.028687 - - lat: 28.794177 - lng: -82.028508 - - lat: 28.79416 - lng: -82.028333 - - lat: 28.794116 - lng: -82.028138 - - lat: 28.794097 - lng: -82.028035 - - lat: 28.794078 - lng: -82.027959 - - lat: 28.794075 - lng: -82.027904 - - lat: 28.794079 - lng: -82.02769 - - lat: 28.79408 - lng: -82.027554 - - lat: 28.794052 - lng: -82.027401 - - lat: 28.794058 - lng: -82.027272 - - lat: 28.794071 - lng: -82.027151 - - lat: 28.794099 - lng: -82.026985 - - lat: 28.794129 - lng: -82.02673 - - lat: 28.794118 - lng: -82.026562 - - lat: 28.794086 - lng: -82.026389 - - lat: 28.794032 - lng: -82.026212 - - lat: 28.793989 - lng: -82.026094 - - lat: 28.793908 - lng: -82.025904 - - lat: 28.793767 - lng: -82.02561 - - lat: 28.793575 - lng: -82.025339 - - lat: 28.793382 - lng: -82.025152 - - lat: 28.793051 - lng: -82.024889 - - lat: 28.792853 - lng: -82.024677 - - lat: 28.792666 - lng: -82.024502 - - lat: 28.792613 - lng: -82.024391 - - lat: 28.792553 - lng: -82.024229 - - lat: 28.792517 - lng: -82.024048 - - lat: 28.792452 - lng: -82.023868 - - lat: 28.792434 - lng: -82.02372 - - lat: 28.792409 - lng: -82.023507 - - lat: 28.792369 - lng: -82.023212 - - lat: 28.792307 - lng: -82.02297 - - lat: 28.792235 - lng: -82.022756 - - lat: 28.792102 - lng: -82.022403 - - lat: 28.791981 - lng: -82.022172 - - lat: 28.791823 - lng: -82.021943 - - lat: 28.791628 - lng: -82.02171 - - lat: 28.791463 - lng: -82.021494 - - lat: 28.791281 - lng: -82.021204 - - lat: 28.791179 - lng: -82.021008 - - lat: 28.791133 - lng: -82.020892 - - lat: 28.79109 - lng: -82.020755 - - lat: 28.791046 - lng: -82.020511 - - lat: 28.790976 - lng: -82.020256 - - lat: 28.790942 - lng: -82.020122 - - lat: 28.790931 - lng: -82.019895 - - lat: 28.790906 - lng: -82.019766 - - lat: 28.790841 - lng: -82.019569 - - lat: 28.790763 - lng: -82.019381 - - lat: 28.7906 - lng: -82.019078 - - lat: 28.790396 - lng: -82.01882 - - lat: 28.790264 - lng: -82.018582 - - lat: 28.790157 - lng: -82.018303 - - lat: 28.790106 - lng: -82.018021 - distance: 2089.442 - duration: 301.262 - road_name: "" - instruction: Drive southeast. - visual_instructions: - - primary_content: - text: You have arrived at your destination. - maneuver_type: arrive - maneuver_modifier: ~ - roundabout_exit_degrees: ~ - secondary_content: ~ - trigger_distance_before_maneuver: 2089.442 - spoken_instructions: - - text: Drive southeast. - ssml: "Drive southeast." - trigger_distance_before_maneuver: 2089.442 - - text: "In 200 feet, You have arrived at your destination." - ssml: "In 200 feet, You have arrived at your destination." - trigger_distance_before_maneuver: 60 - annotations: - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 52 - - 46 - - 52 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 48 - - 46 - - 54 - - 51 - - 53 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 53 - - 46 - - 56 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 51 - - 46 - - 55 - - 49 - - 55 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 51 - - 46 - - 57 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 51 - - 46 - - 52 - - 51 - - 54 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 52 - - 52 - - 46 - - 54 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 54 - - 46 - - 52 - - 49 - - 57 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 57 - - 46 - - 49 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 46 - - 51 - - 49 - - 52 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 50 - - 46 - - 52 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 46 - - 55 - - 56 - - 50 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 56 - - 46 - - 57 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 46 - - 50 - - 56 - - 54 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 53 - - 46 - - 51 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 48 - - 46 - - 55 - - 54 - - 50 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 55 - - 46 - - 52 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 46 - - 48 - - 54 - - 53 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 56 - - 46 - - 50 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 46 - - 49 - - 55 - - 52 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 51 - - 46 - - 57 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 51 - - 46 - - 52 - - 52 - - 55 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 49 - - 46 - - 48 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 51 - - 46 - - 48 - - 49 - - 57 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 57 - - 46 - - 48 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 50 - - 46 - - 55 - - 50 - - 57 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 56 - - 46 - - 54 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 46 - - 50 - - 52 - - 51 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 51 - - 51 - - 46 - - 57 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 52 - - 46 - - 56 - - 56 - - 50 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 51 - - 49 - - 46 - - 55 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 52 - - 46 - - 53 - - 54 - - 57 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 55 - - 46 - - 51 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 51 - - 46 - - 57 - - 50 - - 57 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 51 - - 51 - - 46 - - 49 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 52 - - 46 - - 55 - - 54 - - 53 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 57 - - 46 - - 48 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 50 - - 46 - - 55 - - 51 - - 56 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 55 - - 46 - - 57 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 50 - - 46 - - 53 - - 56 - - 52 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 55 - - 46 - - 48 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 46 - - 48 - - 48 - - 56 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 52 - - 46 - - 55 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 48 - - 46 - - 54 - - 55 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 51 - - 52 - - 46 - - 53 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 52 - - 46 - - 57 - - 55 - - 49 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 49 - - 46 - - 48 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 51 - - 46 - - 48 - - 51 - - 49 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 55 - - 46 - - 50 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 46 - - 48 - - 51 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 53 - - 46 - - 57 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 48 - - 46 - - 56 - - 52 - - 56 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 52 - - 46 - - 48 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 48 - - 46 - - 53 - - 55 - - 55 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 55 - - 46 - - 52 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 51 - - 46 - - 57 - - 52 - - 51 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 57 - - 46 - - 50 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 52 - - 46 - - 50 - - 49 - - 49 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 51 - - 46 - - 56 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 51 - - 46 - - 52 - - 50 - - 55 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 51 - - 50 - - 46 - - 57 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 52 - - 46 - - 55 - - 51 - - 54 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 49 - - 46 - - 55 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 51 - - 46 - - 49 - - 50 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 53 - - 46 - - 51 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 51 - - 46 - - 54 - - 51 - - 54 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 52 - - 48 - - 46 - - 50 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 53 - - 46 - - 55 - - 56 - - 55 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 51 - - 46 - - 48 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 51 - - 46 - - 51 - - 48 - - 57 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 52 - - 48 - - 46 - - 49 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 53 - - 46 - - 55 - - 55 - - 50 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 55 - - 46 - - 57 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 50 - - 46 - - 53 - - 56 - - 49 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 49 - - 46 - - 54 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 51 - - 46 - - 49 - - 49 - - 54 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 53 - - 46 - - 49 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 48 - - 46 - - 55 - - 52 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 53 - - 46 - - 54 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 48 - - 46 - - 56 - - 48 - - 49 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 49 - - 46 - - 56 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 46 - - 54 - - 57 - - 50 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 53 - - 46 - - 55 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 51 - - 46 - - 54 - - 57 - - 56 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 54 - - 46 - - 55 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 50 - - 46 - - 52 - - 48 - - 52 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 49 - - 46 - - 55 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 51 - - 46 - - 49 - - 50 - - 49 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 57 - - 46 - - 56 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 50 - - 46 - - 56 - - 53 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 55 - - 46 - - 56 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 52 - - 46 - - 48 - - 48 - - 53 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 55 - - 46 - - 53 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 50 - - 46 - - 53 - - 49 - - 54 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 55 - - 46 - - 50 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 50 - - 46 - - 52 - - 55 - - 51 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 57 - - 46 - - 54 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 50 - - 46 - - 56 - - 50 - - 57 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 48 - - 46 - - 51 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 46 - - 52 - - 55 - - 57 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 55 - - 46 - - 55 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 46 - - 49 - - 49 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 53 - - 46 - - 52 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 48 - - 46 - - 55 - - 55 - - 52 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 48 - - 46 - - 57 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 51 - - 46 - - 48 - - 48 - - 55 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 51 - - 46 - - 51 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 46 - - 57 - - 49 - - 49 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 53 - - 46 - - 50 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 50 - - 46 - - 49 - - 57 - - 54 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 50 - - 46 - - 54 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 46 - - 56 - - 49 - - 53 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 49 - - 46 - - 57 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 46 - - 55 - - 49 - - 51 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 54 - - 46 - - 53 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 50 - - 46 - - 51 - - 55 - - 53 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 53 - - 46 - - 49 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 51 - - 46 - - 54 - - 49 - - 52 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 54 - - 46 - - 52 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 50 - - 46 - - 51 - - 54 - - 55 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 55 - - 46 - - 50 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 50 - - 46 - - 52 - - 56 - - 52 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 56 - - 46 - - 51 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 50 - - 46 - - 54 - - 51 - - 51 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 50 - - 46 - - 53 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 46 - - 55 - - 57 - - 53 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 48 - - 46 - - 54 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 50 - - 46 - - 57 - - 54 - - 56 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 51 - - 50 - - 46 - - 55 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 52 - - 46 - - 55 - - 48 - - 56 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 51 - - 52 - - 46 - - 48 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 52 - - 46 - - 56 - - 57 - - 54 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 56 - - 46 - - 50 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 52 - - 46 - - 48 - - 53 - - 57 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 52 - - 52 - - 46 - - 57 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 54 - - 46 - - 52 - - 54 - - 54 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 51 - - 48 - - 46 - - 50 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 52 - - 46 - - 51 - - 53 - - 50 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 54 - - 46 - - 57 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 51 - - 46 - - 56 - - 55 - - 55 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 50 - - 46 - - 51 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 46 - - 55 - - 55 - - 54 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 55 - - 46 - - 50 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 50 - - 46 - - 52 - - 55 - - 49 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 56 - - 46 - - 49 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 50 - - 46 - - 54 - - 48 - - 55 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 57 - - 46 - - 48 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 50 - - 46 - - 55 - - 51 - - 53 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 52 - - 46 - - 54 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 50 - - 46 - - 48 - - 57 - - 57 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 49 - - 46 - - 48 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 51 - - 46 - - 48 - - 49 - - 57 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 57 - - 46 - - 49 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 52 - - 46 - - 49 - - 57 - - 52 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 52 - - 46 - - 54 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 51 - - 46 - - 53 - - 52 - - 50 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 50 - - 46 - - 52 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 51 - - 46 - - 50 - - 50 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 51 - - 55 - - 46 - - 53 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 53 - - 46 - - 51 - - 57 - - 56 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 54 - - 46 - - 51 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 51 - - 46 - - 55 - - 56 - - 49 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 56 - - 46 - - 52 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 52 - - 46 - - 48 - - 57 - - 52 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 51 - - 49 - - 46 - - 52 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 52 - - 46 - - 53 - - 50 - - 54 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 56 - - 46 - - 48 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 52 - - 46 - - 48 - - 50 - - 53 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 51 - - 52 - - 46 - - 56 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 53 - - 46 - - 48 - - 49 - - 49 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 50 - - 46 - - 50 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 51 - - 46 - - 50 - - 48 - - 50 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 50 - - 46 - - 52 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 46 - - 55 - - 56 - - 57 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 52 - - 46 - - 50 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 50 - - 46 - - 48 - - 52 - - 52 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 52 - - 46 - - 51 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 51 - - 46 - - 53 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 54 - - 46 - - 49 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 51 - - 46 - - 55 - - 53 - - 52 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 51 - - 46 - - 54 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 46 - - 57 - - 54 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 50 - - 46 - - 50 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 51 - - 46 - - 49 - - 57 - - 52 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 49 - - 50 - - 46 - - 57 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 49 - - 46 - - 56 - - 53 - - 54 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 48 - - 46 - - 53 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 50 - - 46 - - 57 - - 53 - - 55 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 48 - - 46 - - 51 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 50 - - 46 - - 57 - - 50 - - 50 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 51 - - 52 - - 46 - - 55 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 52 - - 46 - - 57 - - 57 - - 53 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 51 - - 51 - - 46 - - 57 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 52 - - 46 - - 56 - - 56 - - 50 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 55 - - 46 - - 53 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 51 - - 46 - - 57 - - 53 - - 55 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - - 123 - - 34 - - 100 - - 105 - - 115 - - 116 - - 97 - - 110 - - 99 - - 101 - - 34 - - 58 - - 50 - - 57 - - 46 - - 55 - - 44 - - 34 - - 100 - - 117 - - 114 - - 97 - - 116 - - 105 - - 111 - - 110 - - 34 - - 58 - - 52 - - 46 - - 50 - - 55 - - 56 - - 44 - - 34 - - 109 - - 97 - - 120 - - 95 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 110 - - 117 - - 108 - - 108 - - 44 - - 34 - - 115 - - 112 - - 101 - - 101 - - 100 - - 95 - - 109 - - 112 - - 115 - - 34 - - 58 - - 54 - - 46 - - 57 - - 125 - - geometry: - - lat: 28.790106 - lng: -82.018021 - - lat: 28.790106 - lng: -82.018021 - distance: 0 - duration: 0 - road_name: "" - instruction: You have arrived at your destination. - visual_instructions: - - primary_content: - text: You have arrived at your destination. - maneuver_type: arrive - maneuver_modifier: ~ - roundabout_exit_degrees: ~ - secondary_content: ~ - trigger_distance_before_maneuver: 0 - spoken_instructions: [] - annotations: [] From 4be334c832400acf25c73e38339091849f13598a Mon Sep 17 00:00:00 2001 From: Jacob Fielding Date: Wed, 25 Sep 2024 19:42:12 -0700 Subject: [PATCH 07/20] Swiftformat and wasm-pack build fix --- apple/Sources/FerrostarCore/NavigationState.swift | 15 ++++++++------- .../LandscapeNavigationOverlayView.swift | 10 ++++++---- .../Overylays/PortraitNavigationOverlayView.swift | 8 +++++--- .../ferrostar/src/navigation_controller/models.rs | 2 +- 4 files changed, 20 insertions(+), 15 deletions(-) diff --git a/apple/Sources/FerrostarCore/NavigationState.swift b/apple/Sources/FerrostarCore/NavigationState.swift index 86863968..ff7bb9f9 100644 --- a/apple/Sources/FerrostarCore/NavigationState.swift +++ b/apple/Sources/FerrostarCore/NavigationState.swift @@ -20,29 +20,30 @@ public struct NavigationState: Hashable { self.routeGeometry = routeGeometry self.isCalculatingNewRoute = isCalculatingNewRoute } - + public var currentProgress: TripProgress? { guard case let .navigating(_, _, _, _, progress: progress, _, _, - _, _) = tripState else { + _, _) = tripState + else { return nil } - + return progress } - + public var currentVisualInstruction: VisualInstruction? { guard case let .navigating(_, _, _, _, _, _, visualInstruction: visualInstruction, _, _) = tripState else { return nil } - + return visualInstruction } - + public var currentAnnotationJSON: String? { guard case let .navigating(_, _, _, _, _, _, _, _, annotationJson: annotationJson) = tripState else { return nil } - + return annotationJson } } diff --git a/apple/Sources/FerrostarMapLibreUI/Views/Overylays/LandscapeNavigationOverlayView.swift b/apple/Sources/FerrostarMapLibreUI/Views/Overylays/LandscapeNavigationOverlayView.swift index 8da3c647..aa13684f 100644 --- a/apple/Sources/FerrostarMapLibreUI/Views/Overylays/LandscapeNavigationOverlayView.swift +++ b/apple/Sources/FerrostarMapLibreUI/Views/Overylays/LandscapeNavigationOverlayView.swift @@ -48,19 +48,21 @@ struct LandscapeNavigationOverlayView: View, CustomizableNavigatingInnerGridView HStack { VStack { if case .navigating = navigationState?.tripState, - let visualInstruction = navigationState?.currentVisualInstruction, - let progress = navigationState?.currentProgress { + let visualInstruction = navigationState?.currentVisualInstruction, + let progress = navigationState?.currentProgress + { InstructionsView( visualInstruction: visualInstruction, distanceFormatter: formatterCollection.distanceFormatter, distanceToNextManeuver: progress.distanceToNextManeuver ) } - + Spacer() if case .navigating = navigationState?.tripState, - let progress = navigationState?.currentProgress { + let progress = navigationState?.currentProgress + { ArrivalView( progress: progress, onTapExit: onTapExit diff --git a/apple/Sources/FerrostarMapLibreUI/Views/Overylays/PortraitNavigationOverlayView.swift b/apple/Sources/FerrostarMapLibreUI/Views/Overylays/PortraitNavigationOverlayView.swift index 3ef2249d..3a3ec2cd 100644 --- a/apple/Sources/FerrostarMapLibreUI/Views/Overylays/PortraitNavigationOverlayView.swift +++ b/apple/Sources/FerrostarMapLibreUI/Views/Overylays/PortraitNavigationOverlayView.swift @@ -47,8 +47,9 @@ struct PortraitNavigationOverlayView: View, CustomizableNavigatingInnerGridView var body: some View { VStack { if case .navigating = navigationState?.tripState, - let visualInstruction = navigationState?.currentVisualInstruction, - let progress = navigationState?.currentProgress { + let visualInstruction = navigationState?.currentVisualInstruction, + let progress = navigationState?.currentProgress + { InstructionsView( visualInstruction: visualInstruction, distanceFormatter: formatterCollection.distanceFormatter, @@ -79,7 +80,8 @@ struct PortraitNavigationOverlayView: View, CustomizableNavigatingInnerGridView } if case .navigating = navigationState?.tripState, - let progress = navigationState?.currentProgress { + let progress = navigationState?.currentProgress + { ArrivalView( progress: progress, onTapExit: onTapExit diff --git a/common/ferrostar/src/navigation_controller/models.rs b/common/ferrostar/src/navigation_controller/models.rs index d71d2c84..b43dda47 100644 --- a/common/ferrostar/src/navigation_controller/models.rs +++ b/common/ferrostar/src/navigation_controller/models.rs @@ -6,7 +6,7 @@ use crate::models::{RouteStep, SpokenInstruction, UserLocation, VisualInstructio use alloc::vec::Vec; use geo::LineString; #[cfg(feature = "wasm-bindgen")] -use serde::Deserialize; +use serde::{Deserialize, Serialize}; /// High-level state describing progress through a route. #[derive(Debug, Clone, PartialEq)] From e150d29828b1ab58ba78646c10ff28e950196c3b Mon Sep 17 00:00:00 2001 From: Jacob Fielding Date: Wed, 25 Sep 2024 19:47:56 -0700 Subject: [PATCH 08/20] Corrected route snapshot errors on Apple --- .../FerrostarCoreTests.swift | 5 +- .../test200MockGETRouteResponse.1.txt | 1 + .../test200MockPOSTRouteResponse.1.txt | 1 + .../test200MockRouteResponse.1.txt | 54 ------------------- .../testCustomRouteProvider.1.txt | 1 + .../testValhalalCostingOptionsJSON.1.txt | 12 +++++ .../testValhallaRouteParsing.1.txt | 12 +++++ 7 files changed, 30 insertions(+), 56 deletions(-) delete mode 100644 apple/Tests/FerrostarCoreTests/__Snapshots__/FerrostarCoreTests/test200MockRouteResponse.1.txt diff --git a/apple/Tests/FerrostarCoreTests/FerrostarCoreTests.swift b/apple/Tests/FerrostarCoreTests/FerrostarCoreTests.swift index 9e18292e..5e7354f5 100644 --- a/apple/Tests/FerrostarCoreTests/FerrostarCoreTests.swift +++ b/apple/Tests/FerrostarCoreTests/FerrostarCoreTests.swift @@ -34,13 +34,14 @@ let mockRoute = Route( distance: 1, duration: 0, roadName: "foo road", - instruction: "Sail straight", + instruction: "Sail straight", // 🏴‍☠️⛵️ visualInstructions: [VisualInstruction( primaryContent: instructionContent, secondaryContent: nil, triggerDistanceBeforeManeuver: 42 )], - spokenInstructions: [] + spokenInstructions: [], + annotations: nil )] ) diff --git a/apple/Tests/FerrostarCoreTests/__Snapshots__/FerrostarCoreTests/test200MockGETRouteResponse.1.txt b/apple/Tests/FerrostarCoreTests/__Snapshots__/FerrostarCoreTests/test200MockGETRouteResponse.1.txt index 7538b68e..1646aa68 100644 --- a/apple/Tests/FerrostarCoreTests/__Snapshots__/FerrostarCoreTests/test200MockGETRouteResponse.1.txt +++ b/apple/Tests/FerrostarCoreTests/__Snapshots__/FerrostarCoreTests/test200MockGETRouteResponse.1.txt @@ -17,6 +17,7 @@ - lng: 1.0 ▿ steps: 1 element ▿ RouteStep + - annotations: Optional>.none - distance: 1.0 - duration: 0.0 ▿ geometry: 2 elements diff --git a/apple/Tests/FerrostarCoreTests/__Snapshots__/FerrostarCoreTests/test200MockPOSTRouteResponse.1.txt b/apple/Tests/FerrostarCoreTests/__Snapshots__/FerrostarCoreTests/test200MockPOSTRouteResponse.1.txt index 7538b68e..1646aa68 100644 --- a/apple/Tests/FerrostarCoreTests/__Snapshots__/FerrostarCoreTests/test200MockPOSTRouteResponse.1.txt +++ b/apple/Tests/FerrostarCoreTests/__Snapshots__/FerrostarCoreTests/test200MockPOSTRouteResponse.1.txt @@ -17,6 +17,7 @@ - lng: 1.0 ▿ steps: 1 element ▿ RouteStep + - annotations: Optional>.none - distance: 1.0 - duration: 0.0 ▿ geometry: 2 elements diff --git a/apple/Tests/FerrostarCoreTests/__Snapshots__/FerrostarCoreTests/test200MockRouteResponse.1.txt b/apple/Tests/FerrostarCoreTests/__Snapshots__/FerrostarCoreTests/test200MockRouteResponse.1.txt deleted file mode 100644 index 7538b68e..00000000 --- a/apple/Tests/FerrostarCoreTests/__Snapshots__/FerrostarCoreTests/test200MockRouteResponse.1.txt +++ /dev/null @@ -1,54 +0,0 @@ -▿ 1 element - ▿ Route - ▿ bbox: BoundingBox - ▿ ne: GeographicCoordinate - - lat: 1.0 - - lng: 1.0 - ▿ sw: GeographicCoordinate - - lat: 0.0 - - lng: 0.0 - - distance: 1.0 - ▿ geometry: 2 elements - ▿ GeographicCoordinate - - lat: 0.0 - - lng: 0.0 - ▿ GeographicCoordinate - - lat: 1.0 - - lng: 1.0 - ▿ steps: 1 element - ▿ RouteStep - - distance: 1.0 - - duration: 0.0 - ▿ geometry: 2 elements - ▿ GeographicCoordinate - - lat: 0.0 - - lng: 0.0 - ▿ GeographicCoordinate - - lat: 1.0 - - lng: 1.0 - - instruction: "Sail straight" - ▿ roadName: Optional - - some: "foo road" - - spokenInstructions: 0 elements - ▿ visualInstructions: 1 element - ▿ VisualInstruction - ▿ primaryContent: VisualInstructionContent - ▿ maneuverModifier: Optional - - some: ManeuverModifier.straight - ▿ maneuverType: Optional - - some: ManeuverType.depart - - roundaboutExitDegrees: Optional.none - - text: "Sail straight" - - secondaryContent: Optional.none - - triggerDistanceBeforeManeuver: 42.0 - ▿ waypoints: 2 elements - ▿ Waypoint - ▿ coordinate: GeographicCoordinate - - lat: 0.0 - - lng: 0.0 - - kind: WaypointKind.break - ▿ Waypoint - ▿ coordinate: GeographicCoordinate - - lat: 1.0 - - lng: 1.0 - - kind: WaypointKind.break diff --git a/apple/Tests/FerrostarCoreTests/__Snapshots__/FerrostarCoreTests/testCustomRouteProvider.1.txt b/apple/Tests/FerrostarCoreTests/__Snapshots__/FerrostarCoreTests/testCustomRouteProvider.1.txt index 7538b68e..1646aa68 100644 --- a/apple/Tests/FerrostarCoreTests/__Snapshots__/FerrostarCoreTests/testCustomRouteProvider.1.txt +++ b/apple/Tests/FerrostarCoreTests/__Snapshots__/FerrostarCoreTests/testCustomRouteProvider.1.txt @@ -17,6 +17,7 @@ - lng: 1.0 ▿ steps: 1 element ▿ RouteStep + - annotations: Optional>.none - distance: 1.0 - duration: 0.0 ▿ geometry: 2 elements diff --git a/apple/Tests/FerrostarCoreTests/__Snapshots__/FerrostarCoreTests/testValhalalCostingOptionsJSON.1.txt b/apple/Tests/FerrostarCoreTests/__Snapshots__/FerrostarCoreTests/testValhalalCostingOptionsJSON.1.txt index ce00d071..2c228567 100644 --- a/apple/Tests/FerrostarCoreTests/__Snapshots__/FerrostarCoreTests/testValhalalCostingOptionsJSON.1.txt +++ b/apple/Tests/FerrostarCoreTests/__Snapshots__/FerrostarCoreTests/testValhalalCostingOptionsJSON.1.txt @@ -41,6 +41,17 @@ - lng: -149.548581 ▿ steps: 2 elements ▿ RouteStep + ▿ annotations: Optional> + ▿ some: 9 elements + - "{\"distance\":23.6,\"duration\":0.956,\"maxspeed\":{\"speed\":89,\"unit\":\"km/h\"},\"speed\":24.7}" + - "{\"distance\":14.9,\"duration\":0.603,\"maxspeed\":{\"speed\":89,\"unit\":\"km/h\"},\"speed\":24.7}" + - "{\"distance\":9.6,\"duration\":0.387,\"maxspeed\":{\"speed\":89,\"unit\":\"km/h\"},\"speed\":24.7}" + - "{\"distance\":13.2,\"duration\":0.535,\"maxspeed\":{\"speed\":89,\"unit\":\"km/h\"},\"speed\":24.7}" + - "{\"distance\":25,\"duration\":1.011,\"maxspeed\":{\"speed\":89,\"unit\":\"km/h\"},\"speed\":24.7}" + - "{\"distance\":28.1,\"duration\":1.135,\"maxspeed\":{\"speed\":89,\"unit\":\"km/h\"},\"speed\":24.7}" + - "{\"distance\":38.1,\"duration\":1.539,\"maxspeed\":{\"speed\":89,\"unit\":\"km/h\"},\"speed\":24.7}" + - "{\"distance\":41.6,\"duration\":1.683,\"maxspeed\":{\"speed\":89,\"unit\":\"km/h\"},\"speed\":24.7}" + - "{\"distance\":90,\"duration\":3.641,\"maxspeed\":{\"speed\":89,\"unit\":\"km/h\"},\"speed\":24.7}" - distance: 284.0 - duration: 11.488 ▿ geometry: 10 elements @@ -80,6 +91,7 @@ - spokenInstructions: 0 elements - visualInstructions: 0 elements ▿ RouteStep + - annotations: Optional>.none - distance: 0.0 - duration: 0.0 ▿ geometry: 2 elements diff --git a/apple/Tests/FerrostarCoreTests/__Snapshots__/ValhallaCoreTests/testValhallaRouteParsing.1.txt b/apple/Tests/FerrostarCoreTests/__Snapshots__/ValhallaCoreTests/testValhallaRouteParsing.1.txt index ce00d071..2c228567 100644 --- a/apple/Tests/FerrostarCoreTests/__Snapshots__/ValhallaCoreTests/testValhallaRouteParsing.1.txt +++ b/apple/Tests/FerrostarCoreTests/__Snapshots__/ValhallaCoreTests/testValhallaRouteParsing.1.txt @@ -41,6 +41,17 @@ - lng: -149.548581 ▿ steps: 2 elements ▿ RouteStep + ▿ annotations: Optional> + ▿ some: 9 elements + - "{\"distance\":23.6,\"duration\":0.956,\"maxspeed\":{\"speed\":89,\"unit\":\"km/h\"},\"speed\":24.7}" + - "{\"distance\":14.9,\"duration\":0.603,\"maxspeed\":{\"speed\":89,\"unit\":\"km/h\"},\"speed\":24.7}" + - "{\"distance\":9.6,\"duration\":0.387,\"maxspeed\":{\"speed\":89,\"unit\":\"km/h\"},\"speed\":24.7}" + - "{\"distance\":13.2,\"duration\":0.535,\"maxspeed\":{\"speed\":89,\"unit\":\"km/h\"},\"speed\":24.7}" + - "{\"distance\":25,\"duration\":1.011,\"maxspeed\":{\"speed\":89,\"unit\":\"km/h\"},\"speed\":24.7}" + - "{\"distance\":28.1,\"duration\":1.135,\"maxspeed\":{\"speed\":89,\"unit\":\"km/h\"},\"speed\":24.7}" + - "{\"distance\":38.1,\"duration\":1.539,\"maxspeed\":{\"speed\":89,\"unit\":\"km/h\"},\"speed\":24.7}" + - "{\"distance\":41.6,\"duration\":1.683,\"maxspeed\":{\"speed\":89,\"unit\":\"km/h\"},\"speed\":24.7}" + - "{\"distance\":90,\"duration\":3.641,\"maxspeed\":{\"speed\":89,\"unit\":\"km/h\"},\"speed\":24.7}" - distance: 284.0 - duration: 11.488 ▿ geometry: 10 elements @@ -80,6 +91,7 @@ - spokenInstructions: 0 elements - visualInstructions: 0 elements ▿ RouteStep + - annotations: Optional>.none - distance: 0.0 - duration: 0.0 ▿ geometry: 2 elements From 7ab2cc847c6db4dcb00f1f925cf74c07f1a04886 Mon Sep 17 00:00:00 2001 From: Jacob Fielding Date: Sun, 29 Sep 2024 11:30:31 -0700 Subject: [PATCH 09/20] Reverted BTreeMap to HashMap and adjusted insta configuration --- common/Cargo.lock | 118 +++++++++++ common/ferrostar/Cargo.toml | 2 +- common/ferrostar/src/models.rs | 4 +- common/ferrostar/src/routing_adapters/mod.rs | 2 +- .../src/routing_adapters/osrm/mod.rs | 18 +- .../src/routing_adapters/osrm/models.rs | 8 +- ...models__tests__deserialize_annotation.snap | 133 +++++-------- ...ers__osrm__tests__parse_valhalla_osrm.snap | 185 +++--------------- ...ts__parse_valhalla_osrm_with_via_ways.snap | 104 +--------- ...srm__utilities__test__zip_annotation.snap} | 2 +- .../osrm/{algorithms.rs => utilities.rs} | 13 +- .../{algorithms.rs => utilities.rs} | 0 12 files changed, 226 insertions(+), 363 deletions(-) rename common/ferrostar/src/routing_adapters/osrm/snapshots/{ferrostar__routing_adapters__osrm__algorithms__test__zip_annotation.snap => ferrostar__routing_adapters__osrm__utilities__test__zip_annotation.snap} (86%) rename common/ferrostar/src/routing_adapters/osrm/{algorithms.rs => utilities.rs} (87%) rename common/ferrostar/src/routing_adapters/{algorithms.rs => utilities.rs} (100%) diff --git a/common/Cargo.lock b/common/Cargo.lock index fdffe172..9eede095 100644 --- a/common/Cargo.lock +++ b/common/Cargo.lock @@ -174,6 +174,15 @@ version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + [[package]] name = "bumpalo" version = "3.16.0" @@ -307,6 +316,35 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "cpufeatures" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + [[package]] name = "earcutr" version = "0.4.3" @@ -468,6 +506,16 @@ dependencies = [ "slab", ] +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + [[package]] name = "geo" version = "0.28.0" @@ -590,6 +638,8 @@ dependencies = [ "console", "lazy_static", "linked-hash-map", + "pest", + "pest_derive", "serde", "similar", ] @@ -733,6 +783,51 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "pest" +version = "2.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219c0dcc30b6a27553f9cc242972b67f75b60eb0db71f0b5462f38b058c41546" +dependencies = [ + "memchr", + "thiserror", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e1288dbd7786462961e69bfd4df7848c1e37e8b74303dbdab82c3a9cdd2809" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1381c29a877c6d34b8c176e734f35d7f7f5b3adaefe940cb4d1bb7af94678e2e" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pest_meta" +version = "2.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0934d6907f148c22a3acbda520c7eed243ad7487a30f51f6ce52b58b7077a8a" +dependencies = [ + "once_cell", + "pest", + "sha2", +] + [[package]] name = "pin-project-lite" version = "0.2.14" @@ -1035,6 +1130,17 @@ dependencies = [ "serde", ] +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "shlex" version = "1.3.0" @@ -1170,6 +1276,18 @@ dependencies = [ "winnow", ] +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "ucd-trie" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" + [[package]] name = "unarray" version = "0.1.4" diff --git a/common/ferrostar/Cargo.toml b/common/ferrostar/Cargo.toml index 5da7d74f..c65f200b 100644 --- a/common/ferrostar/Cargo.toml +++ b/common/ferrostar/Cargo.toml @@ -47,7 +47,7 @@ uniffi = { workspace = true, features = ["build"] } [dev-dependencies] assert-json-diff = "2.0.2" proptest = { version = "1.5.0", default-features = false } -insta = { version = "1.40.0", features = ["yaml"] } +insta = { version = "1.40.0", features = ["yaml", "json", "redactions"] } rstest = "0.22.0" wasm-bindgen-test = "0.3" diff --git a/common/ferrostar/src/models.rs b/common/ferrostar/src/models.rs index 333d77d8..d44f71b0 100644 --- a/common/ferrostar/src/models.rs +++ b/common/ferrostar/src/models.rs @@ -21,7 +21,7 @@ use std::time::SystemTime; #[cfg(feature = "web-time")] use web_time::SystemTime; -use std::collections::BTreeMap; +use std::collections::HashMap; use uuid::Uuid; use crate::algorithms::get_linestring; @@ -464,7 +464,7 @@ pub struct VisualInstruction { #[derive(Deserialize, Serialize, Debug, Clone, PartialEq)] pub struct AnyAnnotationValue { #[serde(flatten)] - pub value: BTreeMap, + pub value: HashMap, } #[cfg(test)] diff --git a/common/ferrostar/src/routing_adapters/mod.rs b/common/ferrostar/src/routing_adapters/mod.rs index 7448b4e6..456145a5 100644 --- a/common/ferrostar/src/routing_adapters/mod.rs +++ b/common/ferrostar/src/routing_adapters/mod.rs @@ -53,9 +53,9 @@ use alloc::{string::String, sync::Arc, vec::Vec}; use crate::routing_adapters::osrm::OsrmResponseParser; use crate::routing_adapters::valhalla::ValhallaHttpRequestGenerator; -pub mod algorithms; pub mod error; pub mod osrm; +pub mod utilities; pub mod valhalla; /// A route request generated by a [`RouteRequestGenerator`]. diff --git a/common/ferrostar/src/routing_adapters/osrm/mod.rs b/common/ferrostar/src/routing_adapters/osrm/mod.rs index bbe4af88..79de318b 100644 --- a/common/ferrostar/src/routing_adapters/osrm/mod.rs +++ b/common/ferrostar/src/routing_adapters/osrm/mod.rs @@ -1,25 +1,25 @@ //! Response parsing for OSRM-compatible JSON (including Stadia Maps, Valhalla, Mapbox, etc.). -pub(crate) mod algorithms; pub(crate) mod models; +pub(crate) mod utilities; use super::RouteResponseParser; use crate::models::{ AnyAnnotationValue, GeographicCoordinate, RouteStep, SpokenInstruction, VisualInstruction, VisualInstructionContent, Waypoint, WaypointKind, }; -use crate::routing_adapters::algorithms::get_coordinates_from_geometry; +use crate::routing_adapters::utilities::get_coordinates_from_geometry; use crate::routing_adapters::{ osrm::models::{ Route as OsrmRoute, RouteResponse, RouteStep as OsrmRouteStep, Waypoint as OsrmWaypoint, }, ParsingError, Route, }; -use algorithms::get_annotation_slice; #[cfg(all(not(feature = "std"), feature = "alloc"))] use alloc::{string::ToString, vec, vec::Vec}; use geo::BoundingRect; use polyline::decode_polyline; +use utilities::get_annotation_slice; use uuid::Uuid; /// A response parser for OSRM-compatible routing backends. @@ -99,7 +99,7 @@ impl Route { let annotations = leg .annotation .as_ref() - .map(|leg_annotation| algorithms::zip_annotations(leg_annotation.clone())); + .map(|leg_annotation| utilities::zip_annotations(leg_annotation.clone())); // Index for the annotations slice let mut start_index: usize = 0; @@ -229,7 +229,10 @@ mod tests { let routes = parser .parse_response(VALHALLA_OSRM_RESPONSE.into()) .expect("Unable to parse Valhalla OSRM response"); - insta::assert_yaml_snapshot!(routes); + + insta::assert_yaml_snapshot!(routes, { + ".**.annotations" => "redacted annotations json strings vec" + }); } #[test] @@ -238,7 +241,10 @@ mod tests { let routes = parser .parse_response(VALHALLA_OSRM_RESPONSE_VIA_WAYS.into()) .expect("Unable to parse Valhalla OSRM response"); - insta::assert_yaml_snapshot!(routes); + + insta::assert_yaml_snapshot!(routes, { + ".**.annotations" => "redacted annotations json strings vec" + }); } #[test] diff --git a/common/ferrostar/src/routing_adapters/osrm/models.rs b/common/ferrostar/src/routing_adapters/osrm/models.rs index 4fa6e2ff..3e0493e8 100644 --- a/common/ferrostar/src/routing_adapters/osrm/models.rs +++ b/common/ferrostar/src/routing_adapters/osrm/models.rs @@ -9,7 +9,7 @@ use alloc::{string::String, vec::Vec}; use serde::Deserialize; use serde_json::Value; #[cfg(feature = "alloc")] -use std::collections::BTreeMap; +use std::collections::HashMap; #[derive(Deserialize, Debug)] #[serde(transparent)] @@ -72,7 +72,7 @@ pub struct RouteLeg { #[derive(Deserialize, Debug, Clone, PartialEq)] pub struct AnyAnnotation { #[serde(flatten)] - pub values: BTreeMap>, + pub values: HashMap>, } /// The max speed json units that can be associated with annotations. @@ -393,7 +393,9 @@ mod tests { let annotation: AnyAnnotation = serde_json::from_str(data).expect("Failed to parse Annotation"); - insta::assert_debug_snapshot!(annotation); + insta::with_settings!({sort_maps => true}, { + insta::assert_yaml_snapshot!(annotation.values); + }); } #[test] diff --git a/common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__models__tests__deserialize_annotation.snap b/common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__models__tests__deserialize_annotation.snap index 1b3dd6b6..2df935ad 100644 --- a/common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__models__tests__deserialize_annotation.snap +++ b/common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__models__tests__deserialize_annotation.snap @@ -1,82 +1,57 @@ --- source: ferrostar/src/routing_adapters/osrm/models.rs -expression: annotation +expression: annotation.values --- -AnyAnnotation { - values: { - "congestion": [ - String("low"), - String("moderate"), - String("moderate"), - String("moderate"), - String("heavy"), - String("heavy"), - String("heavy"), - String("heavy"), - ], - "distance": [ - Number(4.294596842089401), - Number(5.051172053200946), - Number(5.533254065167979), - Number(6.576513793849532), - Number(7.4449640160938015), - Number(8.468757534990829), - Number(15.202780313562714), - Number(7.056346577326572), - ], - "duration": [ - Number(1), - Number(1.2), - Number(2), - Number(1.6), - Number(1.8), - Number(2), - Number(3.6), - Number(1.7), - ], - "maxspeed": [ - Object { - "speed": Number(56), - "unit": String("km/h"), - }, - Object { - "speed": Number(56), - "unit": String("km/h"), - }, - Object { - "speed": Number(56), - "unit": String("km/h"), - }, - Object { - "speed": Number(56), - "unit": String("km/h"), - }, - Object { - "speed": Number(56), - "unit": String("km/h"), - }, - Object { - "speed": Number(56), - "unit": String("km/h"), - }, - Object { - "speed": Number(56), - "unit": String("km/h"), - }, - Object { - "speed": Number(56), - "unit": String("km/h"), - }, - ], - "speed": [ - Number(4.3), - Number(4.2), - Number(2.8), - Number(4.1), - Number(4.1), - Number(4.2), - Number(4.2), - Number(4.2), - ], - }, -} +congestion: + - low + - moderate + - moderate + - moderate + - heavy + - heavy + - heavy + - heavy +distance: + - 4.294596842089401 + - 5.051172053200946 + - 5.533254065167979 + - 6.576513793849532 + - 7.4449640160938015 + - 8.468757534990829 + - 15.202780313562714 + - 7.056346577326572 +duration: + - 1 + - 1.2 + - 2 + - 1.6 + - 1.8 + - 2 + - 3.6 + - 1.7 +maxspeed: + - speed: 56 + unit: km/h + - speed: 56 + unit: km/h + - speed: 56 + unit: km/h + - speed: 56 + unit: km/h + - speed: 56 + unit: km/h + - speed: 56 + unit: km/h + - speed: 56 + unit: km/h + - speed: 56 + unit: km/h +speed: + - 4.3 + - 4.2 + - 2.8 + - 4.1 + - 4.1 + - 4.2 + - 4.2 + - 4.2 diff --git a/common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__tests__parse_valhalla_osrm.snap b/common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__tests__parse_valhalla_osrm.snap index 5f7d0529..a85b2f77 100644 --- a/common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__tests__parse_valhalla_osrm.snap +++ b/common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__tests__parse_valhalla_osrm.snap @@ -335,13 +335,7 @@ expression: routes - text: "In 200 feet, Turn left onto the walkway." ssml: "In 200 feet, Turn left onto the walkway." trigger_distance_before_maneuver: 60 - annotations: - - "{\"distance\":0.2,\"duration\":0.184,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - - "{\"distance\":19.4,\"duration\":15.315,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - - "{\"distance\":7.1,\"duration\":5.639,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - - "{\"distance\":11.6,\"duration\":9.818,\"maxspeed\":{\"unknown\":true},\"speed\":1.2}" - - "{\"distance\":66.4,\"duration\":51.539,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - - "{\"distance\":6.9,\"duration\":4.898,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + annotations: redacted annotations json strings vec - geometry: - lat: 59.442754 lng: 24.763449 @@ -363,8 +357,7 @@ expression: routes - text: "In 14 feet, Turn right onto Laeva." ssml: "In 14 feet, Turn right onto Laeva." trigger_distance_before_maneuver: 4.5 - annotations: - - "{\"distance\":9.4,\"duration\":6.604,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + annotations: redacted annotations json strings vec - geometry: - lat: 59.442671 lng: 24.763423 @@ -386,8 +379,7 @@ expression: routes - text: "In 26 feet, Bear right." ssml: "In 26 feet, Bear right." trigger_distance_before_maneuver: 8 - annotations: - - "{\"distance\":15.7,\"duration\":12.227,\"maxspeed\":{\"speed\":30,\"unit\":\"km/h\"},\"speed\":1.3}" + annotations: redacted annotations json strings vec - geometry: - lat: 59.442709 lng: 24.763155 @@ -411,9 +403,7 @@ expression: routes - text: "In 24 feet, Bear left onto the walkway." ssml: "In 24 feet, Bear left onto the walkway." trigger_distance_before_maneuver: 7.5 - annotations: - - "{\"distance\":6.9,\"duration\":5.127,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - - "{\"distance\":8.6,\"duration\":6.412,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + annotations: redacted annotations json strings vec - geometry: - lat: 59.442819 lng: 24.763 @@ -439,10 +429,7 @@ expression: routes - text: "In 62 feet, Continue." ssml: "In 62 feet, Continue." trigger_distance_before_maneuver: 19 - annotations: - - "{\"distance\":5.7,\"duration\":4.012,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":2.7,\"duration\":1.919,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":29.7,\"duration\":20.947,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + annotations: redacted annotations json strings vec - geometry: - lat: 59.442918 lng: 24.762356 @@ -464,8 +451,7 @@ expression: routes - text: "In 11 feet, Turn right onto Admiralisild/Admiral Bridge." ssml: "In 11 feet, Turn right onto Admiralisild/Admiral Bridge." trigger_distance_before_maneuver: 3.5 - annotations: - - "{\"distance\":7.0,\"duration\":4.96,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + annotations: redacted annotations json strings vec - geometry: - lat: 59.442936 lng: 24.762237 @@ -493,11 +479,7 @@ expression: routes - text: "In 200 feet, Continue on the walkway." ssml: "In 200 feet, Continue on the walkway." trigger_distance_before_maneuver: 60 - annotations: - - "{\"distance\":2.6,\"duration\":1.815,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":20.9,\"duration\":14.72,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":3.2,\"duration\":2.267,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":44.3,\"duration\":33.128,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + annotations: redacted annotations json strings vec - geometry: - lat: 59.443526 lng: 24.761765 @@ -521,9 +503,7 @@ expression: routes - text: "In 75 feet, Turn left onto the walkway." ssml: "In 75 feet, Turn left onto the walkway." trigger_distance_before_maneuver: 23 - annotations: - - "{\"distance\":4.6,\"duration\":3.248,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":41.1,\"duration\":29.012,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + annotations: redacted annotations json strings vec - geometry: - lat: 59.4439 lng: 24.761432 @@ -545,8 +525,7 @@ expression: routes - text: "In 200 feet, Turn right onto the walkway." ssml: "In 200 feet, Turn right onto the walkway." trigger_distance_before_maneuver: 60 - annotations: - - "{\"distance\":130.5,\"duration\":101.367,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + annotations: redacted annotations json strings vec - geometry: - lat: 59.443487 lng: 24.759273 @@ -574,11 +553,7 @@ expression: routes - text: "In 41 feet, Turn left onto the walkway." ssml: "In 41 feet, Turn left onto the walkway." trigger_distance_before_maneuver: 12.5 - annotations: - - "{\"distance\":5.4,\"duration\":3.808,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":10.4,\"duration\":8.841,\"maxspeed\":{\"unknown\":true},\"speed\":1.2}" - - "{\"distance\":3.3,\"duration\":2.592,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - - "{\"distance\":7.3,\"duration\":5.742,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + annotations: redacted annotations json strings vec - geometry: - lat: 59.443712 lng: 24.759127 @@ -604,10 +579,7 @@ expression: routes - text: "In 26 feet, Turn right onto Logi." ssml: "In 26 feet, Turn right onto Logi." trigger_distance_before_maneuver: 8 - annotations: - - "{\"distance\":3.9,\"duration\":2.774,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":3.2,\"duration\":2.247,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":9.0,\"duration\":6.331,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + annotations: redacted annotations json strings vec - geometry: - lat: 59.443674 lng: 24.758853 @@ -647,17 +619,7 @@ expression: routes - text: "In 200 feet, Turn left onto the walkway." ssml: "In 200 feet, Turn left onto the walkway." trigger_distance_before_maneuver: 60 - annotations: - - "{\"distance\":5.2,\"duration\":3.643,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":2.3,\"duration\":1.589,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":9.8,\"duration\":6.887,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":20.5,\"duration\":14.472,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":6.4,\"duration\":4.482,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":3.9,\"duration\":2.747,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":10.3,\"duration\":7.288,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":19.5,\"duration\":13.793,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":9.3,\"duration\":6.594,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":3.5,\"duration\":2.469,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + annotations: redacted annotations json strings vec - geometry: - lat: 59.444448 lng: 24.758392 @@ -679,8 +641,7 @@ expression: routes - text: "In 13 feet, Turn right onto the walkway." ssml: "In 13 feet, Turn right onto the walkway." trigger_distance_before_maneuver: 4 - annotations: - - "{\"distance\":8.5,\"duration\":5.983,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + annotations: redacted annotations json strings vec - geometry: - lat: 59.444431 lng: 24.758246 @@ -708,11 +669,7 @@ expression: routes - text: "In 200 feet, Bear left onto Kultuurikilomeeter." ssml: "In 200 feet, Bear left onto Kultuurikilomeeter." trigger_distance_before_maneuver: 60 - annotations: - - "{\"distance\":16.8,\"duration\":13.027,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - - "{\"distance\":35.8,\"duration\":27.83,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - - "{\"distance\":10.3,\"duration\":8.028,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - - "{\"distance\":21.9,\"duration\":15.49,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + annotations: redacted annotations json strings vec - geometry: - lat: 59.445069 lng: 24.757636 @@ -840,61 +797,7 @@ expression: routes - text: "In 200 feet, Turn right onto the walkway." ssml: "In 200 feet, Turn right onto the walkway." trigger_distance_before_maneuver: 60 - annotations: - - "{\"distance\":179.8,\"duration\":126.908,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":12.9,\"duration\":12.15,\"maxspeed\":{\"unknown\":true},\"speed\":1.1}" - - "{\"distance\":48.4,\"duration\":34.152,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":7.3,\"duration\":5.129,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":6.1,\"duration\":4.281,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":56.9,\"duration\":42.571,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - - "{\"distance\":24.2,\"duration\":18.073,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - - "{\"distance\":2.4,\"duration\":1.781,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - - "{\"distance\":1.0,\"duration\":0.681,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":3.3,\"duration\":2.318,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":17.5,\"duration\":17.664,\"maxspeed\":{\"unknown\":true},\"speed\":1.0}" - - "{\"distance\":2.0,\"duration\":2.012,\"maxspeed\":{\"unknown\":true},\"speed\":1.0}" - - "{\"distance\":4.7,\"duration\":4.717,\"maxspeed\":{\"unknown\":true},\"speed\":1.0}" - - "{\"distance\":7.0,\"duration\":7.059,\"maxspeed\":{\"unknown\":true},\"speed\":1.0}" - - "{\"distance\":5.0,\"duration\":5.058,\"maxspeed\":{\"unknown\":true},\"speed\":1.0}" - - "{\"distance\":9.9,\"duration\":7.669,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - - "{\"distance\":10.1,\"duration\":7.844,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - - "{\"distance\":14.9,\"duration\":10.516,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":1.7,\"duration\":1.177,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":37.5,\"duration\":26.445,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":16.2,\"duration\":11.458,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":22.3,\"duration\":15.741,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":11.8,\"duration\":8.304,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":8.5,\"duration\":5.987,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":13.1,\"duration\":13.246,\"maxspeed\":{\"unknown\":true},\"speed\":1.0}" - - "{\"distance\":6.0,\"duration\":4.213,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":2.6,\"duration\":1.864,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":6.4,\"duration\":4.77,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - - "{\"distance\":43.9,\"duration\":32.852,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - - "{\"distance\":8.9,\"duration\":6.677,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - - "{\"distance\":11.9,\"duration\":8.938,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - - "{\"distance\":14.3,\"duration\":10.737,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - - "{\"distance\":4.5,\"duration\":3.339,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - - "{\"distance\":10.4,\"duration\":7.818,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - - "{\"distance\":11.7,\"duration\":11.006,\"maxspeed\":{\"unknown\":true},\"speed\":1.1}" - - "{\"distance\":23.9,\"duration\":22.394,\"maxspeed\":{\"unknown\":true},\"speed\":1.1}" - - "{\"distance\":1.6,\"duration\":1.32,\"maxspeed\":{\"unknown\":true},\"speed\":1.2}" - - "{\"distance\":17.6,\"duration\":14.893,\"maxspeed\":{\"unknown\":true},\"speed\":1.2}" - - "{\"distance\":15.9,\"duration\":13.483,\"maxspeed\":{\"unknown\":true},\"speed\":1.2}" - - "{\"distance\":82.6,\"duration\":69.994,\"maxspeed\":{\"unknown\":true},\"speed\":1.2}" - - "{\"distance\":73.4,\"duration\":51.784,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":21.4,\"duration\":15.108,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":25.3,\"duration\":19.969,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - - "{\"distance\":30.9,\"duration\":24.415,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - - "{\"distance\":29.8,\"duration\":23.531,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - - "{\"distance\":13.8,\"duration\":10.899,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - - "{\"distance\":29.0,\"duration\":32.187,\"maxspeed\":{\"unknown\":true},\"speed\":0.9}" - - "{\"distance\":23.1,\"duration\":16.31,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":35.6,\"duration\":25.104,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":36.0,\"duration\":25.445,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":49.9,\"duration\":35.213,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":7.8,\"duration\":5.477,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":36.5,\"duration\":25.799,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":54.8,\"duration\":38.709,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + annotations: redacted annotations json strings vec - geometry: - lat: 59.44946 lng: 24.739543 @@ -918,9 +821,7 @@ expression: routes - text: "In 37 feet, Turn left onto the walkway." ssml: "In 37 feet, Turn left onto the walkway." trigger_distance_before_maneuver: 11.5 - annotations: - - "{\"distance\":14.0,\"duration\":9.902,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":8.6,\"duration\":6.086,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + annotations: redacted annotations json strings vec - geometry: - lat: 59.449652 lng: 24.739675 @@ -944,9 +845,7 @@ expression: routes - text: "In 26 feet, Turn left onto the crosswalk." ssml: "In 26 feet, Turn left onto the crosswalk." trigger_distance_before_maneuver: 8 - annotations: - - "{\"distance\":11.7,\"duration\":8.228,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":4.5,\"duration\":3.156,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + annotations: redacted annotations json strings vec - geometry: - lat: 59.449733 lng: 24.739454 @@ -1006,27 +905,7 @@ expression: routes - text: "In 200 feet, Turn right onto the walkway." ssml: "In 200 feet, Turn right onto the walkway." trigger_distance_before_maneuver: 60 - annotations: - - "{\"distance\":4.9,\"duration\":3.427,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":7.7,\"duration\":5.46,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":4.2,\"duration\":2.993,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":2.5,\"duration\":1.871,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - - "{\"distance\":7.9,\"duration\":5.888,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - - "{\"distance\":59.6,\"duration\":44.617,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - - "{\"distance\":40.4,\"duration\":30.206,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - - "{\"distance\":20.0,\"duration\":15.496,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - - "{\"distance\":7.8,\"duration\":5.487,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":17.7,\"duration\":12.51,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":14.8,\"duration\":10.434,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":27.7,\"duration\":19.585,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":40.4,\"duration\":31.347,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - - "{\"distance\":17.0,\"duration\":13.188,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - - "{\"distance\":48.4,\"duration\":37.62,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - - "{\"distance\":8.5,\"duration\":6.681,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - - "{\"distance\":4.2,\"duration\":3.349,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - - "{\"distance\":3.6,\"duration\":2.809,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - - "{\"distance\":5.6,\"duration\":3.942,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":4.4,\"duration\":3.1,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + annotations: redacted annotations json strings vec - geometry: - lat: 59.450765 lng: 24.733721 @@ -1048,8 +927,7 @@ expression: routes - text: "In 3 feet, Turn left onto the walkway." ssml: "In 3 feet, Turn left onto the walkway." trigger_distance_before_maneuver: 1 - annotations: - - "{\"distance\":2.5,\"duration\":1.737,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + annotations: redacted annotations json strings vec - geometry: - lat: 59.450787 lng: 24.733717 @@ -1097,21 +975,7 @@ expression: routes - text: "In 200 feet, Bear left onto Allveelaeva." ssml: "In 200 feet, Bear left onto Allveelaeva." trigger_distance_before_maneuver: 60 - annotations: - - "{\"distance\":60.6,\"duration\":45.312,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - - "{\"distance\":52.0,\"duration\":40.41,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - - "{\"distance\":1.6,\"duration\":1.278,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - - "{\"distance\":4.5,\"duration\":3.174,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":6.3,\"duration\":4.898,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - - "{\"distance\":4.2,\"duration\":3.284,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - - "{\"distance\":3.9,\"duration\":3.057,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - - "{\"distance\":4.7,\"duration\":3.644,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - - "{\"distance\":5.2,\"duration\":4.072,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" - - "{\"distance\":5.0,\"duration\":3.527,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":13.6,\"duration\":13.723,\"maxspeed\":{\"unknown\":true},\"speed\":1.0}" - - "{\"distance\":71.2,\"duration\":50.263,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":4.9,\"duration\":3.432,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" - - "{\"distance\":2.7,\"duration\":1.908,\"maxspeed\":{\"unknown\":true},\"speed\":1.4}" + annotations: redacted annotations json strings vec - geometry: - lat: 59.451907 lng: 24.730259 @@ -1133,8 +997,7 @@ expression: routes - text: "In 45 feet, Turn right onto Peetri." ssml: "In 45 feet, Turn right onto Peetri." trigger_distance_before_maneuver: 14 - annotations: - - "{\"distance\":27.7,\"duration\":20.727,\"maxspeed\":{\"unknown\":true},\"speed\":1.3}" + annotations: redacted annotations json strings vec - geometry: - lat: 59.452026 lng: 24.729829 @@ -1158,9 +1021,7 @@ expression: routes - text: "In 41 feet, You have arrived at your destination." ssml: "In 41 feet, You have arrived at your destination." trigger_distance_before_maneuver: 12.5495 - annotations: - - "{\"distance\":17.6,\"duration\":17.401,\"maxspeed\":{\"unknown\":true},\"speed\":1.0}" - - "{\"distance\":7.5,\"duration\":7.403,\"maxspeed\":{\"unknown\":true},\"speed\":1.0}" + annotations: redacted annotations json strings vec - geometry: - lat: 59.452226 lng: 24.730034 @@ -1179,4 +1040,4 @@ expression: routes secondary_content: ~ trigger_distance_before_maneuver: 0 spoken_instructions: [] - annotations: ~ + annotations: redacted annotations json strings vec diff --git a/common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__tests__parse_valhalla_osrm_with_via_ways.snap b/common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__tests__parse_valhalla_osrm_with_via_ways.snap index de3e0e44..12d7697b 100644 --- a/common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__tests__parse_valhalla_osrm_with_via_ways.snap +++ b/common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__tests__parse_valhalla_osrm_with_via_ways.snap @@ -449,107 +449,7 @@ expression: routes - text: "In 200 feet, You have arrived at your destination." ssml: "In 200 feet, You have arrived at your destination." trigger_distance_before_maneuver: 60 - annotations: - - "{\"distance\":4.4,\"duration\":0.635,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":25.8,\"duration\":3.717,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":23.9,\"duration\":3.436,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":44.6,\"duration\":6.419,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":9.1,\"duration\":1.314,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":12.4,\"duration\":1.782,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":8.9,\"duration\":1.286,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":5.3,\"duration\":0.762,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":7.4,\"duration\":1.065,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":8.2,\"duration\":1.174,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":23.9,\"duration\":3.447,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":21.0,\"duration\":3.019,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":19.0,\"duration\":2.729,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":8.6,\"duration\":1.243,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":33.9,\"duration\":4.882,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":31.7,\"duration\":4.569,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":27.3,\"duration\":3.929,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":33.1,\"duration\":4.765,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":19.0,\"duration\":2.738,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":17.9,\"duration\":2.584,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":7.0,\"duration\":1.008,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":4.7,\"duration\":0.67,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":34.5,\"duration\":4.971,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":21.0,\"duration\":3.031,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":7.2,\"duration\":1.03,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":5.9,\"duration\":0.848,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":4.0,\"duration\":0.577,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":27.4,\"duration\":3.943,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":29.2,\"duration\":4.211,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":23.8,\"duration\":3.427,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":32.9,\"duration\":4.736,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":21.7,\"duration\":3.12,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":25.3,\"duration\":3.636,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":40.2,\"duration\":5.787,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":23.0,\"duration\":3.309,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":40.1,\"duration\":5.772,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":17.9,\"duration\":2.581,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":21.6,\"duration\":3.116,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":5.1,\"duration\":0.74,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":5.6,\"duration\":0.801,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":11.8,\"duration\":1.692,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":25.7,\"duration\":3.698,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":16.7,\"duration\":2.404,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":21.7,\"duration\":3.121,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":19.8,\"duration\":2.85,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":27.8,\"duration\":4.005,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":17.5,\"duration\":2.516,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":17.2,\"duration\":2.473,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":19.6,\"duration\":2.829,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":10.3,\"duration\":1.479,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":7.7,\"duration\":1.11,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":5.4,\"duration\":0.774,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":20.9,\"duration\":3.007,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":13.3,\"duration\":1.911,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":15.2,\"duration\":2.196,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":12.6,\"duration\":1.815,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":11.9,\"duration\":1.713,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":16.5,\"duration\":2.375,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":25.1,\"duration\":3.614,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":16.4,\"duration\":2.367,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":17.2,\"duration\":2.484,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":18.3,\"duration\":2.633,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":12.5,\"duration\":1.795,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":20.6,\"duration\":2.968,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":32.7,\"duration\":4.708,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":34.0,\"duration\":4.896,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":28.2,\"duration\":4.059,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":44.9,\"duration\":6.466,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":30.2,\"duration\":4.352,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":26.9,\"duration\":3.877,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":12.3,\"duration\":1.776,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":17.2,\"duration\":2.471,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":18.1,\"duration\":2.607,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":19.0,\"duration\":2.735,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":14.6,\"duration\":2.099,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":21.0,\"duration\":3.019,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":29.1,\"duration\":4.194,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":24.6,\"duration\":3.542,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":22.4,\"duration\":3.22,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":37.5,\"duration\":5.398,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":26.3,\"duration\":3.781,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":28.4,\"duration\":4.094,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":31.4,\"duration\":4.526,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":28.0,\"duration\":4.025,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":34.8,\"duration\":5.011,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":22.2,\"duration\":3.202,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":12.4,\"duration\":1.789,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":14.2,\"duration\":2.044,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":24.3,\"duration\":3.5,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":26.1,\"duration\":3.754,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":13.6,\"duration\":1.96,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":22.2,\"duration\":3.194,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":12.9,\"duration\":1.856,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":20.5,\"duration\":2.957,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":20.3,\"duration\":2.922,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":34.7,\"duration\":4.995,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":33.9,\"duration\":4.882,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":27.5,\"duration\":3.957,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":29.7,\"duration\":4.278,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" - - "{\"distance\":28.1,\"duration\":4.048,\"maxspeed\":{\"unknown\":true},\"speed\":6.9}" + annotations: redacted annotations json strings vec - geometry: - lat: 28.790106 lng: -82.018021 @@ -568,4 +468,4 @@ expression: routes secondary_content: ~ trigger_distance_before_maneuver: 0 spoken_instructions: [] - annotations: ~ + annotations: redacted annotations json strings vec diff --git a/common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__algorithms__test__zip_annotation.snap b/common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__utilities__test__zip_annotation.snap similarity index 86% rename from common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__algorithms__test__zip_annotation.snap rename to common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__utilities__test__zip_annotation.snap index 2b7972af..3d12ed26 100644 --- a/common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__algorithms__test__zip_annotation.snap +++ b/common/ferrostar/src/routing_adapters/osrm/snapshots/ferrostar__routing_adapters__osrm__utilities__test__zip_annotation.snap @@ -1,5 +1,5 @@ --- -source: ferrostar/src/routing_adapters/osrm/algorithms.rs +source: ferrostar/src/routing_adapters/osrm/utilities.rs expression: result --- - construction: ~ diff --git a/common/ferrostar/src/routing_adapters/osrm/algorithms.rs b/common/ferrostar/src/routing_adapters/osrm/utilities.rs similarity index 87% rename from common/ferrostar/src/routing_adapters/osrm/algorithms.rs rename to common/ferrostar/src/routing_adapters/osrm/utilities.rs index 46abd54f..147a2a4c 100644 --- a/common/ferrostar/src/routing_adapters/osrm/algorithms.rs +++ b/common/ferrostar/src/routing_adapters/osrm/utilities.rs @@ -2,7 +2,7 @@ use super::models::AnyAnnotation; use crate::models::AnyAnnotationValue; use crate::routing_adapters::error::ParsingError; use serde_json::Value; -use std::collections::BTreeMap; +use std::collections::HashMap; /// Get's the slice of annotations /// @@ -26,7 +26,7 @@ pub(crate) fn get_annotation_slice( /// Converts the the OSRM-style annotation object consisting of separate arrays /// to a single vector of parsed objects (one for each coordinate pair). pub(crate) fn zip_annotations(annotation: AnyAnnotation) -> Vec { - let source: BTreeMap> = annotation.values; + let source: HashMap> = annotation.values; // Get the length of the array (assumed to be the same for all annotations) let length = source.values().next().map_or(0, Vec::len); @@ -41,7 +41,7 @@ pub(crate) fn zip_annotations(annotation: AnyAnnotation) -> Vec>() // Collect the key-value pairs into a hashmap. + .collect::>() // Collect the key-value pairs into a hashmap. }) .map(|value| AnyAnnotationValue { value }) .collect::>(); @@ -49,7 +49,6 @@ pub(crate) fn zip_annotations(annotation: AnyAnnotation) -> Vec = serde_json::from_str(json_str).unwrap(); - let values: BTreeMap> = json_value + let values: HashMap> = json_value .iter() .map(|(k, v)| (k.to_string(), v.as_array().unwrap().clone())) .collect(); @@ -84,6 +83,8 @@ mod test { let annotation = AnyAnnotation { values }; let result = zip_annotations(annotation); - insta::assert_yaml_snapshot!(result); + insta::with_settings!({sort_maps => true}, { + insta::assert_yaml_snapshot!(result); + }); } } diff --git a/common/ferrostar/src/routing_adapters/algorithms.rs b/common/ferrostar/src/routing_adapters/utilities.rs similarity index 100% rename from common/ferrostar/src/routing_adapters/algorithms.rs rename to common/ferrostar/src/routing_adapters/utilities.rs From a00be57b66f96e6102a8f786874baa2114175976 Mon Sep 17 00:00:00 2001 From: Jacob Fielding Date: Sun, 29 Sep 2024 12:18:49 -0700 Subject: [PATCH 10/20] Modifications based on comments --- common/ferrostar/src/routing_adapters/osrm/mod.rs | 6 +++++- common/ferrostar/src/routing_adapters/osrm/utilities.rs | 4 ++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/common/ferrostar/src/routing_adapters/osrm/mod.rs b/common/ferrostar/src/routing_adapters/osrm/mod.rs index 79de318b..8a6b6103 100644 --- a/common/ferrostar/src/routing_adapters/osrm/mod.rs +++ b/common/ferrostar/src/routing_adapters/osrm/mod.rs @@ -1,7 +1,7 @@ //! Response parsing for OSRM-compatible JSON (including Stadia Maps, Valhalla, Mapbox, etc.). pub(crate) mod models; -pub(crate) mod utilities; +pub mod utilities; use super::RouteResponseParser; use crate::models::{ @@ -110,6 +110,10 @@ impl Route { // Slice the annotations for the current step. // The annotations array represents segments between coordinates. + // + // 1. Annotations should never repeat. + // 2. Each step has one less annotation than coordinate. + // 3. The last step never has annotations as it's two of the route's last coordinate (duplicate). let step_index_len = step_geometry.len() - 1_usize; let end_index = start_index + step_index_len; diff --git a/common/ferrostar/src/routing_adapters/osrm/utilities.rs b/common/ferrostar/src/routing_adapters/osrm/utilities.rs index 147a2a4c..13c36df9 100644 --- a/common/ferrostar/src/routing_adapters/osrm/utilities.rs +++ b/common/ferrostar/src/routing_adapters/osrm/utilities.rs @@ -4,9 +4,9 @@ use crate::routing_adapters::error::ParsingError; use serde_json::Value; use std::collections::HashMap; -/// Get's the slice of annotations +/// Gets a slice of the route's annotations array. /// -/// Throws an [`ParsingError`] if the annotations are not present or the slice is out of bounds. +/// Returns a [`ParsingError`] if the annotations are not present or the slice is out of bounds. pub(crate) fn get_annotation_slice( annotations: Option>, start_index: usize, From 2a0f39af58355d5255b9fa8b9d2b1a880f8b6df6 Mon Sep 17 00:00:00 2001 From: Jacob Fielding Date: Sun, 29 Sep 2024 12:26:57 -0700 Subject: [PATCH 11/20] Bumped verion to 0.16.0 --- Package.swift | 2 +- android/build.gradle | 2 +- common/Cargo.lock | 2 +- common/ferrostar/Cargo.toml | 2 +- web/package-lock.json | 6 +++--- web/package.json | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Package.swift b/Package.swift index c675e63f..e34c1180 100644 --- a/Package.swift +++ b/Package.swift @@ -16,7 +16,7 @@ if useLocalFramework { path: "./common/target/ios/libferrostar-rs.xcframework" ) } else { - let releaseTag = "0.15.0" + let releaseTag = "0.16.0" let releaseChecksum = "c44d86ae31e1fccde4a9e42fdb8474504dfee40338a341e3131f894208e3b7b2" binaryTarget = .binaryTarget( name: "FerrostarCoreRS", diff --git a/android/build.gradle b/android/build.gradle index 72ea2807..bf0e91b8 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -13,5 +13,5 @@ plugins { allprojects { group = "com.stadiamaps.ferrostar" - version = "0.15.0" + version = "0.16.0" } diff --git a/common/Cargo.lock b/common/Cargo.lock index 9eede095..66be98d2 100644 --- a/common/Cargo.lock +++ b/common/Cargo.lock @@ -375,7 +375,7 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "ferrostar" -version = "0.15.0" +version = "0.16.0" dependencies = [ "assert-json-diff", "geo", diff --git a/common/ferrostar/Cargo.toml b/common/ferrostar/Cargo.toml index c65f200b..dde43349 100644 --- a/common/ferrostar/Cargo.toml +++ b/common/ferrostar/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "ferrostar" -version = "0.15.0" +version = "0.16.0" readme = "README.md" description = "The core of modern turn-by-turn navigation." keywords = ["navigation", "routing", "valhalla", "osrm"] diff --git a/web/package-lock.json b/web/package-lock.json index c5585ffa..8f290c3f 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -1,12 +1,12 @@ { "name": "@stadiamaps/ferrostar-webcomponents", - "version": "0.15.0", + "version": "0.16.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@stadiamaps/ferrostar-webcomponents", - "version": "0.15.0", + "version": "0.16.0", "license": "BSD-3-Clause", "dependencies": { "@stadiamaps/ferrostar": "file:../common/ferrostar/pkg", @@ -25,7 +25,7 @@ }, "../common/ferrostar/pkg": { "name": "@stadiamaps/ferrostar", - "version": "0.13.3", + "version": "0.15.0", "license": "BSD-3-Clause" }, "node_modules/@ampproject/remapping": { diff --git a/web/package.json b/web/package.json index 1f451624..5f66f9fa 100644 --- a/web/package.json +++ b/web/package.json @@ -6,7 +6,7 @@ "CatMe0w (https://github.com/CatMe0w)", "Luke Seelenbinder " ], - "version": "0.15.0", + "version": "0.16.0", "license": "BSD-3-Clause", "type": "module", "main": "./dist/ferrostar-webcomponents.js", From b4a28c63a1efd8f98b2c4755b4ee24b87b1d1ae8 Mon Sep 17 00:00:00 2001 From: Jacob Fielding Date: Sun, 29 Sep 2024 13:14:42 -0700 Subject: [PATCH 12/20] Workaround for temporary annotations test on apple --- Package.swift | 2 +- .../FerrostarCoreTests.swift | 18 ++++++++++++++++-- ...xt => testValhallaCostingOptionsJSON.1.txt} | 12 +----------- 3 files changed, 18 insertions(+), 14 deletions(-) rename apple/Tests/FerrostarCoreTests/__Snapshots__/FerrostarCoreTests/{testValhalalCostingOptionsJSON.1.txt => testValhallaCostingOptionsJSON.1.txt} (74%) diff --git a/Package.swift b/Package.swift index e34c1180..4018726e 100644 --- a/Package.swift +++ b/Package.swift @@ -5,7 +5,7 @@ import PackageDescription let binaryTarget: Target let maplibreSwiftUIDSLPackage: Package.Dependency -let useLocalFramework = false +let useLocalFramework = true let useLocalMapLibreSwiftUIDSL = false if useLocalFramework { diff --git a/apple/Tests/FerrostarCoreTests/FerrostarCoreTests.swift b/apple/Tests/FerrostarCoreTests/FerrostarCoreTests.swift index 06945f9d..a9e62dc5 100644 --- a/apple/Tests/FerrostarCoreTests/FerrostarCoreTests.swift +++ b/apple/Tests/FerrostarCoreTests/FerrostarCoreTests.swift @@ -218,7 +218,7 @@ final class FerrostarCoreTests: XCTestCase { } @MainActor - func testValhalalCostingOptionsJSON() async throws { + func testValhallaCostingOptionsJSON() async throws { let mockSession = MockURLSession() mockSession.registerMock( forMethod: "POST", @@ -253,7 +253,21 @@ final class FerrostarCoreTests: XCTestCase { ), waypoints: [Waypoint(coordinate: GeographicCoordinate(lat: 60.5349908, lng: -149.5485806), kind: .break)] ) - assertSnapshot(of: routes, as: .dump) + + // Redact the annotations in each RouteStep for snapshot assertion. + // TODO: Revamp this test once an annotations parsing strategy is chosen + let final = routes.map { route in + var route = route + let newSteps = route.steps.map { step in + var step = step + step.annotations = nil + return step + } + route.steps = newSteps + return route + } + + assertSnapshot(of: final, as: .dump) } @MainActor diff --git a/apple/Tests/FerrostarCoreTests/__Snapshots__/FerrostarCoreTests/testValhalalCostingOptionsJSON.1.txt b/apple/Tests/FerrostarCoreTests/__Snapshots__/FerrostarCoreTests/testValhallaCostingOptionsJSON.1.txt similarity index 74% rename from apple/Tests/FerrostarCoreTests/__Snapshots__/FerrostarCoreTests/testValhalalCostingOptionsJSON.1.txt rename to apple/Tests/FerrostarCoreTests/__Snapshots__/FerrostarCoreTests/testValhallaCostingOptionsJSON.1.txt index 2c228567..fd991b65 100644 --- a/apple/Tests/FerrostarCoreTests/__Snapshots__/FerrostarCoreTests/testValhalalCostingOptionsJSON.1.txt +++ b/apple/Tests/FerrostarCoreTests/__Snapshots__/FerrostarCoreTests/testValhallaCostingOptionsJSON.1.txt @@ -41,17 +41,7 @@ - lng: -149.548581 ▿ steps: 2 elements ▿ RouteStep - ▿ annotations: Optional> - ▿ some: 9 elements - - "{\"distance\":23.6,\"duration\":0.956,\"maxspeed\":{\"speed\":89,\"unit\":\"km/h\"},\"speed\":24.7}" - - "{\"distance\":14.9,\"duration\":0.603,\"maxspeed\":{\"speed\":89,\"unit\":\"km/h\"},\"speed\":24.7}" - - "{\"distance\":9.6,\"duration\":0.387,\"maxspeed\":{\"speed\":89,\"unit\":\"km/h\"},\"speed\":24.7}" - - "{\"distance\":13.2,\"duration\":0.535,\"maxspeed\":{\"speed\":89,\"unit\":\"km/h\"},\"speed\":24.7}" - - "{\"distance\":25,\"duration\":1.011,\"maxspeed\":{\"speed\":89,\"unit\":\"km/h\"},\"speed\":24.7}" - - "{\"distance\":28.1,\"duration\":1.135,\"maxspeed\":{\"speed\":89,\"unit\":\"km/h\"},\"speed\":24.7}" - - "{\"distance\":38.1,\"duration\":1.539,\"maxspeed\":{\"speed\":89,\"unit\":\"km/h\"},\"speed\":24.7}" - - "{\"distance\":41.6,\"duration\":1.683,\"maxspeed\":{\"speed\":89,\"unit\":\"km/h\"},\"speed\":24.7}" - - "{\"distance\":90,\"duration\":3.641,\"maxspeed\":{\"speed\":89,\"unit\":\"km/h\"},\"speed\":24.7}" + - annotations: Optional>.none - distance: 284.0 - duration: 11.488 ▿ geometry: 10 elements From 0a562b6dc13d398e80f2e2a1152bfc2fb738c958 Mon Sep 17 00:00:00 2001 From: Archdoog Date: Sun, 29 Sep 2024 20:15:09 +0000 Subject: [PATCH 13/20] Apply automatic changes --- Package.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Package.swift b/Package.swift index 4018726e..e34c1180 100644 --- a/Package.swift +++ b/Package.swift @@ -5,7 +5,7 @@ import PackageDescription let binaryTarget: Target let maplibreSwiftUIDSLPackage: Package.Dependency -let useLocalFramework = true +let useLocalFramework = false let useLocalMapLibreSwiftUIDSL = false if useLocalFramework { From eaf263282a8661ad219699bf065127822b56acd0 Mon Sep 17 00:00:00 2001 From: Jacob Fielding Date: Sun, 29 Sep 2024 13:50:07 -0700 Subject: [PATCH 14/20] Applied swiftformat --- apple/Tests/FerrostarCoreTests/FerrostarCoreTests.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apple/Tests/FerrostarCoreTests/FerrostarCoreTests.swift b/apple/Tests/FerrostarCoreTests/FerrostarCoreTests.swift index a9e62dc5..0ae2a5fe 100644 --- a/apple/Tests/FerrostarCoreTests/FerrostarCoreTests.swift +++ b/apple/Tests/FerrostarCoreTests/FerrostarCoreTests.swift @@ -253,7 +253,7 @@ final class FerrostarCoreTests: XCTestCase { ), waypoints: [Waypoint(coordinate: GeographicCoordinate(lat: 60.5349908, lng: -149.5485806), kind: .break)] ) - + // Redact the annotations in each RouteStep for snapshot assertion. // TODO: Revamp this test once an annotations parsing strategy is chosen let final = routes.map { route in @@ -266,7 +266,7 @@ final class FerrostarCoreTests: XCTestCase { route.steps = newSteps return route } - + assertSnapshot(of: final, as: .dump) } From 793042215c953a75fe29df4c88b6616379cd3018 Mon Sep 17 00:00:00 2001 From: Jacob Fielding Date: Sun, 29 Sep 2024 14:09:54 -0700 Subject: [PATCH 15/20] Applied redaction to valhalla route parsing --- Package.swift | 2 +- .../FerrostarCoreTests/ValhallaCoreTests.swift | 15 ++++++++++++++- .../testValhallaRouteParsing.1.txt | 12 +----------- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/Package.swift b/Package.swift index e34c1180..4018726e 100644 --- a/Package.swift +++ b/Package.swift @@ -5,7 +5,7 @@ import PackageDescription let binaryTarget: Target let maplibreSwiftUIDSLPackage: Package.Dependency -let useLocalFramework = false +let useLocalFramework = true let useLocalMapLibreSwiftUIDSL = false if useLocalFramework { diff --git a/apple/Tests/FerrostarCoreTests/ValhallaCoreTests.swift b/apple/Tests/FerrostarCoreTests/ValhallaCoreTests.swift index 4ea3497f..0700313d 100644 --- a/apple/Tests/FerrostarCoreTests/ValhallaCoreTests.swift +++ b/apple/Tests/FerrostarCoreTests/ValhallaCoreTests.swift @@ -40,6 +40,19 @@ final class ValhallaCoreTests: XCTestCase { waypoints: [Waypoint(coordinate: GeographicCoordinate(lat: 60.5349908, lng: -149.5485806), kind: .break)] ) - assertSnapshot(of: routes, as: .dump) + // Redact the annotations in each RouteStep for snapshot assertion. + // TODO: Revamp this test once an annotations parsing strategy is chosen + let final = routes.map { route in + var route = route + let newSteps = route.steps.map { step in + var step = step + step.annotations = nil + return step + } + route.steps = newSteps + return route + } + + assertSnapshot(of: final, as: .dump) } } diff --git a/apple/Tests/FerrostarCoreTests/__Snapshots__/ValhallaCoreTests/testValhallaRouteParsing.1.txt b/apple/Tests/FerrostarCoreTests/__Snapshots__/ValhallaCoreTests/testValhallaRouteParsing.1.txt index 2c228567..fd991b65 100644 --- a/apple/Tests/FerrostarCoreTests/__Snapshots__/ValhallaCoreTests/testValhallaRouteParsing.1.txt +++ b/apple/Tests/FerrostarCoreTests/__Snapshots__/ValhallaCoreTests/testValhallaRouteParsing.1.txt @@ -41,17 +41,7 @@ - lng: -149.548581 ▿ steps: 2 elements ▿ RouteStep - ▿ annotations: Optional> - ▿ some: 9 elements - - "{\"distance\":23.6,\"duration\":0.956,\"maxspeed\":{\"speed\":89,\"unit\":\"km/h\"},\"speed\":24.7}" - - "{\"distance\":14.9,\"duration\":0.603,\"maxspeed\":{\"speed\":89,\"unit\":\"km/h\"},\"speed\":24.7}" - - "{\"distance\":9.6,\"duration\":0.387,\"maxspeed\":{\"speed\":89,\"unit\":\"km/h\"},\"speed\":24.7}" - - "{\"distance\":13.2,\"duration\":0.535,\"maxspeed\":{\"speed\":89,\"unit\":\"km/h\"},\"speed\":24.7}" - - "{\"distance\":25,\"duration\":1.011,\"maxspeed\":{\"speed\":89,\"unit\":\"km/h\"},\"speed\":24.7}" - - "{\"distance\":28.1,\"duration\":1.135,\"maxspeed\":{\"speed\":89,\"unit\":\"km/h\"},\"speed\":24.7}" - - "{\"distance\":38.1,\"duration\":1.539,\"maxspeed\":{\"speed\":89,\"unit\":\"km/h\"},\"speed\":24.7}" - - "{\"distance\":41.6,\"duration\":1.683,\"maxspeed\":{\"speed\":89,\"unit\":\"km/h\"},\"speed\":24.7}" - - "{\"distance\":90,\"duration\":3.641,\"maxspeed\":{\"speed\":89,\"unit\":\"km/h\"},\"speed\":24.7}" + - annotations: Optional>.none - distance: 284.0 - duration: 11.488 ▿ geometry: 10 elements From 3cf7c371cb4b9796f7d8162bcf059d37cd3e5a3d Mon Sep 17 00:00:00 2001 From: Archdoog Date: Sun, 29 Sep 2024 21:10:21 +0000 Subject: [PATCH 16/20] Apply automatic changes --- Package.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Package.swift b/Package.swift index 4018726e..e34c1180 100644 --- a/Package.swift +++ b/Package.swift @@ -5,7 +5,7 @@ import PackageDescription let binaryTarget: Target let maplibreSwiftUIDSLPackage: Package.Dependency -let useLocalFramework = true +let useLocalFramework = false let useLocalMapLibreSwiftUIDSL = false if useLocalFramework { From 7b7feb06f0a4957314df8d1acfed23b5824df14a Mon Sep 17 00:00:00 2001 From: Jacob Fielding Date: Sun, 29 Sep 2024 14:26:49 -0700 Subject: [PATCH 17/20] Applied redaction to valhalla route parsing --- Package.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Package.swift b/Package.swift index 4018726e..e34c1180 100644 --- a/Package.swift +++ b/Package.swift @@ -5,7 +5,7 @@ import PackageDescription let binaryTarget: Target let maplibreSwiftUIDSLPackage: Package.Dependency -let useLocalFramework = true +let useLocalFramework = false let useLocalMapLibreSwiftUIDSL = false if useLocalFramework { From b4e801bab66c9959549736dbbe5365a1bd445954 Mon Sep 17 00:00:00 2001 From: Jacob Fielding Date: Mon, 30 Sep 2024 20:08:15 -0700 Subject: [PATCH 18/20] Upgrading ParsingError naming --- Package.swift | 15 ++++++---- apple/Sources/UniFFI/ferrostar.swift | 28 ++++++++++++------- common/ferrostar/Cargo.toml | 2 +- .../ferrostar/src/routing_adapters/error.rs | 10 ++++--- .../src/routing_adapters/osrm/mod.rs | 4 +-- .../src/routing_adapters/osrm/utilities.rs | 4 +-- .../src/routing_adapters/utilities.rs | 2 +- 7 files changed, 39 insertions(+), 26 deletions(-) diff --git a/Package.swift b/Package.swift index e34c1180..bab2baf7 100644 --- a/Package.swift +++ b/Package.swift @@ -20,7 +20,8 @@ if useLocalFramework { let releaseChecksum = "c44d86ae31e1fccde4a9e42fdb8474504dfee40338a341e3131f894208e3b7b2" binaryTarget = .binaryTarget( name: "FerrostarCoreRS", - url: "https://github.com/stadiamaps/ferrostar/releases/download/\(releaseTag)/libferrostar-rs.xcframework.zip", + url: + "https://github.com/stadiamaps/ferrostar/releases/download/\(releaseTag)/libferrostar-rs.xcframework.zip", checksum: releaseChecksum ) } @@ -38,7 +39,7 @@ let package = Package( name: "FerrostarCore", defaultLocalization: "en", platforms: [ - .iOS(.v15), + .iOS(.v15) ], products: [ // Products define the executables and libraries a package produces, and make them visible to other packages. @@ -48,8 +49,10 @@ let package = Package( ), .library( name: "FerrostarMapLibreUI", - targets: ["FerrostarMapLibreUI", - "FerrostarSwiftUI"] // TODO: Remove FerrostarSwiftUI from FerrostarMapLibreUI once we can fix the demo app swift package config (broken in Xcode 15.3) + targets: [ + "FerrostarMapLibreUI", + "FerrostarSwiftUI", + ] // TODO: Remove FerrostarSwiftUI from FerrostarMapLibreUI once we can fix the demo app swift package config (broken in Xcode 15.3) ), .library( name: "FerrostarSwiftUI", @@ -82,11 +85,11 @@ let package = Package( .target( name: "FerrostarSwiftUI", dependencies: [ - .target(name: "FerrostarCore"), + .target(name: "FerrostarCore") ], path: "apple/Sources/FerrostarSwiftUI", resources: [ - .process("Resources"), + .process("Resources") ] ), .target( diff --git a/apple/Sources/UniFFI/ferrostar.swift b/apple/Sources/UniFFI/ferrostar.swift index 8308bfab..575c5aeb 100644 --- a/apple/Sources/UniFFI/ferrostar.swift +++ b/apple/Sources/UniFFI/ferrostar.swift @@ -3009,8 +3009,9 @@ extension ModelError: Foundation.LocalizedError { } public enum ParsingError { - case ParseError(error: String) - case Annotations(error: String) + case InvalidRouteObject(error: String) + case InvalidGeometry(error: String) + case MalformedAnnotations(error: String) case InvalidStatusCode(code: String) case UnknownParsingError } @@ -3021,36 +3022,43 @@ public struct FfiConverterTypeParsingError: FfiConverterRustBuffer { public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> ParsingError { let variant: Int32 = try readInt(&buf) switch variant { - case 1: return try .ParseError( + case 1: return try .InvalidRouteObject( error: FfiConverterString.read(from: &buf) ) - case 2: return try .Annotations( + case 2: return try .InvalidGeometry( error: FfiConverterString.read(from: &buf) ) - case 3: return try .InvalidStatusCode( + case 3: return try .MalformedAnnotations( + error: FfiConverterString.read(from: &buf) + ) + case 4: return try .InvalidStatusCode( code: FfiConverterString.read(from: &buf) ) - case 4: return .UnknownParsingError + case 5: return .UnknownParsingError default: throw UniffiInternalError.unexpectedEnumCase } } public static func write(_ value: ParsingError, into buf: inout [UInt8]) { switch value { - case let .ParseError(error): + case let .InvalidRouteObject(error): writeInt(&buf, Int32(1)) FfiConverterString.write(error, into: &buf) - case let .Annotations(error): + case let .InvalidGeometry(error): writeInt(&buf, Int32(2)) FfiConverterString.write(error, into: &buf) - case let .InvalidStatusCode(code): + case let .MalformedAnnotations(error): writeInt(&buf, Int32(3)) + FfiConverterString.write(error, into: &buf) + + case let .InvalidStatusCode(code): + writeInt(&buf, Int32(4)) FfiConverterString.write(code, into: &buf) case .UnknownParsingError: - writeInt(&buf, Int32(4)) + writeInt(&buf, Int32(5)) } } } diff --git a/common/ferrostar/Cargo.toml b/common/ferrostar/Cargo.toml index dde43349..104c1080 100644 --- a/common/ferrostar/Cargo.toml +++ b/common/ferrostar/Cargo.toml @@ -47,7 +47,7 @@ uniffi = { workspace = true, features = ["build"] } [dev-dependencies] assert-json-diff = "2.0.2" proptest = { version = "1.5.0", default-features = false } -insta = { version = "1.40.0", features = ["yaml", "json", "redactions"] } +insta = { version = "1.40.0", features = ["yaml", "redactions"] } rstest = "0.22.0" wasm-bindgen-test = "0.3" diff --git a/common/ferrostar/src/routing_adapters/error.rs b/common/ferrostar/src/routing_adapters/error.rs index 40b973cd..f380a0de 100644 --- a/common/ferrostar/src/routing_adapters/error.rs +++ b/common/ferrostar/src/routing_adapters/error.rs @@ -58,10 +58,12 @@ impl From for RoutingRequestGenerationError { #[cfg_attr(feature = "uniffi", derive(uniffi::Error))] pub enum ParsingError { // TODO: Unable to find route and other common errors - #[cfg_attr(feature = "std", error("Failed to parse route response: {error}."))] - ParseError { error: String }, + #[cfg_attr(feature = "std", error("Failed to parse route json object: {error}."))] + InvalidRouteObject { error: String }, + #[cfg_attr(feature = "std", error("Failed to parse route geometry: {error}."))] + InvalidGeometry { error: String }, #[cfg_attr(feature = "std", error("Failed to parse annotations: {error}."))] - Annotations { error: String }, + MalformedAnnotations { error: String }, #[cfg_attr( feature = "std", error("Routing adapter returned an unexpected status code: {code}.") @@ -83,7 +85,7 @@ impl From for ParsingError { impl From for ParsingError { fn from(e: serde_json::Error) -> Self { - ParsingError::ParseError { + ParsingError::InvalidRouteObject { error: e.to_string(), } } diff --git a/common/ferrostar/src/routing_adapters/osrm/mod.rs b/common/ferrostar/src/routing_adapters/osrm/mod.rs index 8a6b6103..6881abc6 100644 --- a/common/ferrostar/src/routing_adapters/osrm/mod.rs +++ b/common/ferrostar/src/routing_adapters/osrm/mod.rs @@ -81,7 +81,7 @@ impl Route { .collect(); let linestring = decode_polyline(&route.geometry, polyline_precision).map_err(|error| { - ParsingError::ParseError { + ParsingError::InvalidGeometry { error: error.to_string(), } })?; @@ -139,7 +139,7 @@ impl Route { steps, }) } else { - Err(ParsingError::ParseError { + Err(ParsingError::InvalidGeometry { error: "Bounding box could not be calculated".to_string(), }) } diff --git a/common/ferrostar/src/routing_adapters/osrm/utilities.rs b/common/ferrostar/src/routing_adapters/osrm/utilities.rs index 13c36df9..e7a5ced7 100644 --- a/common/ferrostar/src/routing_adapters/osrm/utilities.rs +++ b/common/ferrostar/src/routing_adapters/osrm/utilities.rs @@ -13,11 +13,11 @@ pub(crate) fn get_annotation_slice( end_index: usize, ) -> Result, ParsingError> { annotations - .ok_or(ParsingError::Annotations { + .ok_or(ParsingError::MalformedAnnotations { error: "No annotations".to_string(), })? .get(start_index..end_index) - .ok_or(ParsingError::Annotations { + .ok_or(ParsingError::MalformedAnnotations { error: "Annotations slice index out of bounds ({start_index}..{end_index})".to_string(), }) .map(<[AnyAnnotationValue]>::to_vec) diff --git a/common/ferrostar/src/routing_adapters/utilities.rs b/common/ferrostar/src/routing_adapters/utilities.rs index dc452e9f..09442faf 100644 --- a/common/ferrostar/src/routing_adapters/utilities.rs +++ b/common/ferrostar/src/routing_adapters/utilities.rs @@ -11,7 +11,7 @@ pub fn get_coordinates_from_geometry( polyline_precision: u32, ) -> Result, ParsingError> { let linestring = decode_polyline(geometry, polyline_precision).map_err(|error| { - ParsingError::ParseError { + ParsingError::InvalidGeometry { error: error.to_string(), } })?; From ea92dca20e0438cb0042fca5b9ae3d584d990025 Mon Sep 17 00:00:00 2001 From: Jacob Fielding Date: Mon, 30 Sep 2024 20:10:39 -0700 Subject: [PATCH 19/20] Upgrading ParsingError naming --- common/ferrostar/src/models.rs | 2 +- common/ferrostar/src/navigation_controller/mod.rs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/common/ferrostar/src/models.rs b/common/ferrostar/src/models.rs index d44f71b0..fa7ea635 100644 --- a/common/ferrostar/src/models.rs +++ b/common/ferrostar/src/models.rs @@ -337,7 +337,7 @@ impl RouteStep { /// Get the annotation data at a specific point along the step. /// /// `at_coordinate_index` is the index of the coordinate in the step geometry. - pub fn get_current_annotation_json(&self, at_coordinate_index: u64) -> Option { + pub fn get_annotation_at_current_index(&self, at_coordinate_index: u64) -> Option { self.annotations .as_ref() .and_then(|annotations| annotations.get(at_coordinate_index as usize).cloned()) diff --git a/common/ferrostar/src/navigation_controller/mod.rs b/common/ferrostar/src/navigation_controller/mod.rs index 2529c869..9ab5619b 100644 --- a/common/ferrostar/src/navigation_controller/mod.rs +++ b/common/ferrostar/src/navigation_controller/mod.rs @@ -70,7 +70,7 @@ impl NavigationController { .cloned(); let annotation_json = current_step_geometry_index - .and_then(|index| current_route_step.get_current_annotation_json(index)); + .and_then(|index| current_route_step.get_annotation_at_current_index(index)); TripState::Navigating { current_step_geometry_index, @@ -150,7 +150,7 @@ impl NavigationController { .get_current_spoken_instruction(progress.distance_to_next_maneuver) .cloned(); let annotation_json = current_step_geometry_index - .and_then(|index| current_step.get_current_annotation_json(index)); + .and_then(|index| current_step.get_annotation_at_current_index(index)); TripState::Navigating { current_step_geometry_index: *current_step_geometry_index, @@ -267,7 +267,7 @@ impl NavigationController { .cloned(); let annotation_json = current_step_geometry_index - .and_then(|index| current_step.get_current_annotation_json(index)); + .and_then(|index| current_step.get_annotation_at_current_index(index)); TripState::Navigating { current_step_geometry_index, From d5d5d89edb3ed8c30c38591c7f1aa544506b1cad Mon Sep 17 00:00:00 2001 From: Jacob Fielding Date: Mon, 30 Sep 2024 20:12:03 -0700 Subject: [PATCH 20/20] Upgrading ParsingError naming --- Package.swift | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Package.swift b/Package.swift index bab2baf7..8d14c752 100644 --- a/Package.swift +++ b/Package.swift @@ -21,7 +21,7 @@ if useLocalFramework { binaryTarget = .binaryTarget( name: "FerrostarCoreRS", url: - "https://github.com/stadiamaps/ferrostar/releases/download/\(releaseTag)/libferrostar-rs.xcframework.zip", + "https://github.com/stadiamaps/ferrostar/releases/download/\(releaseTag)/libferrostar-rs.xcframework.zip", checksum: releaseChecksum ) } @@ -39,7 +39,7 @@ let package = Package( name: "FerrostarCore", defaultLocalization: "en", platforms: [ - .iOS(.v15) + .iOS(.v15), ], products: [ // Products define the executables and libraries a package produces, and make them visible to other packages. @@ -52,7 +52,7 @@ let package = Package( targets: [ "FerrostarMapLibreUI", "FerrostarSwiftUI", - ] // TODO: Remove FerrostarSwiftUI from FerrostarMapLibreUI once we can fix the demo app swift package config (broken in Xcode 15.3) + ] // TODO: Remove FerrostarSwiftUI from FerrostarMapLibreUI once we can fix the demo app swift package config (broken in Xcode 15.3) ), .library( name: "FerrostarSwiftUI", @@ -85,11 +85,11 @@ let package = Package( .target( name: "FerrostarSwiftUI", dependencies: [ - .target(name: "FerrostarCore") + .target(name: "FerrostarCore"), ], path: "apple/Sources/FerrostarSwiftUI", resources: [ - .process("Resources") + .process("Resources"), ] ), .target(