Source code for alex.applications.PublicTransportInfoEN.test_hdc_policy

from datetime import datetime, timedelta
from unittest import TestCase
from datetime import time as dttime
from alex.applications.PublicTransportInfoEN.directions import GoogleDirections, Travel

from alex.applications.PublicTransportInfoEN.hdc_policy import PTIENHDCPolicy
from alex.components.dm import Ontology
from alex.components.dm.dddstate import DeterministicDiscriminativeDialogueState
from alex.components.slu.da import DialogueAct
from alex.utils.config import Config, as_project_path


[docs]class TestPTIENHDCPolicy(TestCase): # ===== GATHERING CONNECTION INFORMATION ===== # find a bus connection from Broadway Queens to seventh avenue and forty second street
[docs] def test_gather_connection_info_from_street_to_stop(self): self.set_ds_connection_info(from_stop="Central Park") self.set_ds_street_connection_info(to_street="Wall St") req_da, iconfirm_da, conn_info = self.policy.gather_connection_info(self.ds, self.ds.get_accepted_slots(0.8)) self.assertEquals(0, len(iconfirm_da)) self.assertEquals(1, len(req_da)) self.assertEquals('Central Park', conn_info.from_stop) self.assertEquals('Wall St', conn_info.to_stop)
[docs] def test_gather_connection_info_combined(self): self.set_ds_connection_info(to_city="Queens") self.set_ds_street_connection_info(to_street="42 St", to_street2="7 Ave", from_street="58 Dr") req_da, iconfirm_da, conn_info = self.policy.gather_connection_info(self.ds, self.ds.get_accepted_slots(0.8)) self.assertEquals(0, len(iconfirm_da)) self.assertEquals(0, len(req_da)) self.assertEquals('Queens', conn_info.to_city) self.assertEquals('42 St and 7 Ave', conn_info.to_stop) self.assertEquals('58 Dr', conn_info.from_stop) self.assertEquals('Queens', conn_info.from_city)
[docs] def test_gather_connection_info_from_streets_to_stops2(self): self.set_ds_connection_info(to_city="New York", from_city="Baltimore") req_da, iconfirm_da, conn_info = self.policy.gather_connection_info(self.ds, self.ds.get_accepted_slots(0.8)) self.assertEquals(0, len(iconfirm_da)) self.assertEquals(0, len(req_da)) self.assertEquals('Baltimore', conn_info.from_city) self.assertEquals('New York', conn_info.to_city)
[docs] def test_gather_connection_info_from_streets_to_stops(self): self.set_ds_street_connection_info(from_street="105 St", from_street2="5 Ave") self.set_ds_connection_info(to_stop="Central Park") req_da, iconfirm_da, conn_info = self.policy.gather_connection_info(self.ds, self.ds.get_accepted_slots(0.8)) self.assertEquals(0, len(iconfirm_da)) self.assertEquals(0, len(req_da)) self.assertEquals('105 St and 5 Ave', conn_info.from_stop) self.assertEquals('Central Park', conn_info.to_stop) self.assertEquals('New York', conn_info.to_city)
[docs] def test_gather_connection_info_infer_from_borough(self): self.set_ds_street_connection_info(from_street="1 Ave", to_street="101 Ave", to_borough="Brooklyn") req_da, iconfirm_da, conn_info = self.policy.gather_connection_info(self.ds, self.ds.get_accepted_slots(0.8)) self.assertEquals(0, len(req_da)) self.assertEquals(0, len(iconfirm_da)) self.assertEquals('Brooklyn', conn_info.from_city) self.assertEquals('1 Ave', conn_info.from_stop) self.assertEquals('Brooklyn', conn_info.to_city) self.assertEquals('101 Ave', conn_info.to_stop)
[docs] def test_gather_connection_info_request_to_borough(self): self.set_ds_street_connection_info(from_street="1 Ave", to_street="101 St") req_da, iconfirm_da, conn_info = self.policy.gather_connection_info(self.ds, self.ds.get_accepted_slots(0.8)) self.assertEquals(0, len(iconfirm_da)) self.assertEquals(DialogueAct('request(to_borough)'),str(req_da)) self.assertEquals('New York', conn_info.from_city) self.assertEquals('1 Ave', conn_info.from_stop) self.assertEquals('New York', conn_info.to_city) self.assertEquals('101 St', conn_info.to_stop) # def test_gather_connection_info_street_infer_from_city(self): # self.set_ds_street_connection_info(from_street="1 Av", to_borough="Bronx") # req_da, iconfirm_da, conn_info = self.policy.gather_connection_info(self.ds, self.ds.get_accepted_slots(0.8)) # self.assertEquals(DialogueAct('iconfirm(to_city="Baltimore")&iconfirm(from_city="New York")'), iconfirm_da) # self.assertEquals(0, len(req_da)) # self.assertEquals('Bronx', conn_info.to_city) # self.assertEquals('Bronx', conn_info.from_city) # self.assertEquals('1 Av', conn_info.from_street)
[docs] def test_gather_connection_info_street_infer_to_borough(self): self.set_ds_street_connection_info(to_street="1 Ct", from_borough="Manhattan") req_da, iconfirm_da, conn_info = self.policy.gather_connection_info(self.ds, self.ds.get_accepted_slots(0.8)) self.assertEquals(0, len(iconfirm_da)) self.assertEquals(DialogueAct('request(from_stop)'),str(req_da)) self.assertEquals('1 Ct', conn_info.to_stop) self.assertEquals('Brooklyn', conn_info.to_city) self.assertEquals('Manhattan', conn_info.from_city)
[docs] def test_gather_connection_info_street_infer_from_to_borough(self): self.set_ds_street_connection_info(from_street="1 Ave", to_street="1 Ct") req_da, iconfirm_da, conn_info = self.policy.gather_connection_info(self.ds, self.ds.get_accepted_slots(0.8)) self.assertEquals(0, len(iconfirm_da)) self.assertEquals(0, len(req_da)) self.assertEquals('1 Ave', conn_info.from_stop) self.assertEquals('Brooklyn', conn_info.to_city) self.assertEquals('1 Ct', conn_info.to_stop) self.assertEquals('Brooklyn', conn_info.from_city)
[docs] def test_gather_connection_info_request_from_street(self): self.set_ds_street_connection_info(to_street="1 Ct") req_da, iconfirm_da, conn_info = self.policy.gather_connection_info(self.ds, self.ds.get_accepted_slots(0.8)) self.assertEquals(0, len(iconfirm_da)) self.assertEquals(DialogueAct('request(from_stop)'),str(req_da)) self.assertEquals('1 Ct', conn_info.to_stop)
[docs] def test_gather_connection_info_request_to_street(self): self.set_ds_street_connection_info(from_street="1 Ave") req_da, iconfirm_da, conn_info = self.policy.gather_connection_info(self.ds, self.ds.get_accepted_slots(0.8)) self.assertEquals(0, len(iconfirm_da)) self.assertEquals(DialogueAct('request(to_stop)'), str(req_da)) self.assertEquals('1 Ave', conn_info.from_stop)
[docs] def test_gather_connection_info_infer_from_city(self): self.set_ds_connection_info(from_stop="City Hall", to_stop="Broadway", to_city="New York") req_da, iconfirm_da, conn_info = self.policy.gather_connection_info(self.ds, self.ds.get_accepted_slots(0.8)) self.assertEquals(0, len(req_da)) self.assertEquals(0, len(iconfirm_da)) self.assertEquals('New York', conn_info.from_city) self.assertEquals('City Hall', conn_info.from_stop) self.assertEquals('New York', conn_info.to_city) self.assertEquals('Broadway', conn_info.to_stop)
[docs] def test_gather_connection_info_request_to_city(self): self.set_ds_connection_info(from_stop="City Hall", to_stop="Broadway") req_da, iconfirm_da, conn_info = self.policy.gather_connection_info(self.ds, self.ds.get_accepted_slots(0.8)) self.assertEquals(0, len(iconfirm_da)) self.assertEquals(DialogueAct('request(to_city)'),str(req_da)) self.assertEquals('none', conn_info.from_city) self.assertEquals('City Hall', conn_info.from_stop) self.assertEquals('none', conn_info.to_city) self.assertEquals('Broadway', conn_info.to_stop)
[docs] def test_gather_connection_info_infer_from_city_iconfirm(self): self.set_ds_connection_info(from_stop="Wall Street", to_city="Baltimore") req_da, iconfirm_da, conn_info = self.policy.gather_connection_info(self.ds, self.ds.get_accepted_slots(0.8)) self.assertEquals(0, len(req_da)) self.assertEquals(DialogueAct('iconfirm(to_city="Baltimore")&iconfirm(from_city="New York")'), iconfirm_da) self.assertEquals('Baltimore', conn_info.to_city) self.assertEquals('New York', conn_info.from_city) self.assertEquals('Wall Street', conn_info.from_stop)
[docs] def test_gather_connection_info_infer_to_city(self): self.set_ds_connection_info(to_stop="Central Park", from_city="Ohio") req_da, iconfirm_da, conn_info = self.policy.gather_connection_info(self.ds, self.ds.get_accepted_slots(0.8)) self.assertEquals(0, len(req_da)) self.assertEquals(DialogueAct('iconfirm(to_city="New York")&iconfirm(from_city="Ohio")'), iconfirm_da) self.assertEquals('Central Park', conn_info.to_stop) self.assertEquals('New York', conn_info.to_city) self.assertEquals('Ohio', conn_info.from_city)
[docs] def test_gather_connection_info_infer_from_to_city(self): self.set_ds_connection_info(to_stop="Central Park", from_stop="Wall Street") req_da, iconfirm_da, conn_info = self.policy.gather_connection_info(self.ds, self.ds.get_accepted_slots(0.8)) self.assertEquals(0, len(iconfirm_da)) self.assertEquals(0, len(req_da)) self.assertEquals('Central Park', conn_info.to_stop) self.assertEquals('New York', conn_info.to_city) self.assertEquals('Wall Street', conn_info.from_stop) self.assertEquals('New York', conn_info.from_city)
[docs] def test_gather_connection_info_request_to_stop_from_empty(self): req_da, iconfirm_da, conn_info = self.policy.gather_connection_info(self.ds, self.ds.get_accepted_slots(0.8)) self.assertEquals(0, len(iconfirm_da)) self.assertEquals(DialogueAct("request(to_stop)"),str(req_da))
[docs] def test_gather_connection_info_request_from_stop(self): self.set_ds_connection_info(to_stop="Central Park") req_da, iconfirm_da, conn_info = self.policy.gather_connection_info(self.ds, self.ds.get_accepted_slots(0.8)) self.assertEquals(0, len(iconfirm_da)) self.assertEquals(DialogueAct("request(from_stop)"),str(req_da)) self.assertEquals('Central Park', conn_info.to_stop) self.assertEquals('New York', conn_info.to_city)
[docs] def test_gather_connection_info_request_to_stop(self): self.set_ds_connection_info(from_stop="Wall Street") req_da, iconfirm_da, conn_info = self.policy.gather_connection_info(self.ds, self.ds.get_accepted_slots(0.8)) self.assertEquals(0, len(iconfirm_da)) self.assertEquals(DialogueAct("request(to_stop)"),str(req_da)) self.assertEquals('Wall Street', conn_info.from_stop) self.assertEquals('New York', conn_info.from_city) # ===== DEPARTURE TIMES =====
[docs] def test_req_departure_time_rel_missed(self): self.set_ds_directions() self.ds.directions[0].legs[0].steps[1].departure_time = self.now - timedelta(minutes=1) dialogue_act = self.policy.req_departure_time_rel(self.ds) self.assertEquals(3, len(dialogue_act.dais)) self.assertEquals('inform(vehicle="subway")', str(dialogue_act.dais[0])) self.assertEquals('apology()', str(dialogue_act.dais[1])) self.assertEquals('inform(missed_connection="true")', str(dialogue_act.dais[2]))
[docs] def test_req_departure_time_rel_now(self): self.set_ds_directions() self.ds.directions[0].legs[0].steps[1].departure_time = self.now dialogue_act = self.policy.req_departure_time_rel(self.ds) self.assertEquals(3, len(dialogue_act.dais)) self.assertEquals('inform(vehicle="subway")', str(dialogue_act.dais[0])) self.assertEquals('inform(from_stop="eighty sixth street")', str(dialogue_act.dais[1])) self.assertEquals('inform(departure_time_rel="now")', str(dialogue_act.dais[2]))
[docs] def test_req_departure_time_rel_in_five_minutes(self): self.set_ds_directions() self.ds.directions[0].legs[0].steps[1].departure_time = self.now + timedelta(minutes=5) dialogue_act = self.policy.req_departure_time_rel(self.ds) self.assertEquals(3, len(dialogue_act.dais)) self.assertEquals('inform(vehicle="subway")', str(dialogue_act.dais[0])) self.assertEquals('inform(from_stop="eighty sixth street")', str(dialogue_act.dais[1])) self.assertEquals('inform(departure_time_rel="0:05")', str(dialogue_act.dais[2]))
[docs] def test_req_departure_time_abs(self): self.set_ds_directions() dialogue_act = self.policy.req_departure_time(self.ds) self.assertEquals(3, len(dialogue_act.dais)) self.assertEquals('inform(from_stop="eighty sixth street")', str(dialogue_act.dais[0])) self.assertEquals('inform(vehicle="subway")', str(dialogue_act.dais[1])) self.assertEquals('inform(departure_time="01:46:PM")', str(dialogue_act.dais[2])) # ===== ARRIVAL TIMES =====
[docs] def test_req_arrival_time_rel_in_five_minutes(self): self.set_ds_directions() self.ds.directions[0].legs[0].steps[1].arrival_time = self.now + timedelta(minutes=5) dialogue_act = self.policy.req_arrival_time_rel(self.ds) self.assertEquals(3, len(dialogue_act.dais)) self.assertEquals('inform(to_stop="wall street")', str(dialogue_act.dais[0])) self.assertEquals('inform(vehicle="subway")', str(dialogue_act.dais[1])) self.assertEquals('inform(arrival_time_rel="0:05")', str(dialogue_act.dais[2]))
[docs] def test_req_arrival_time_abs(self): self.set_ds_directions() dialogue_act = self.policy.req_arrival_time(self.ds) self.assertEquals(3, len(dialogue_act.dais)) self.assertEquals('inform(to_stop="wall street")', str(dialogue_act.dais[0])) self.assertEquals('inform(vehicle="subway")', str(dialogue_act.dais[1])) self.assertEquals('inform(arrival_time="02:04:PM")', str(dialogue_act.dais[2])) # ===== TIME INTERPRETATION =====
[docs] def test_interpret_time_string_now(self): time, _ = self.policy.interpret_time('now', 'none', 'none', 'none', 'none') self.assertEquals(time, self.now)
[docs] def test_interpret_time_empty(self): time, _ = self.policy.interpret_time('none', 'none', 'none', 'none', 'none') self.assertEquals(time, self.now)
[docs] def test_interpret_time_in_twenty_minutes(self): time, _ = self.policy.interpret_time('none', 'none', '0:20', 'none', 'none') true_time = self.now + timedelta(minutes=20) self.assertEquals(true_time, time)
[docs] def test_interpret_time_tomorrow(self): time, _ = self.policy.interpret_time('none', 'none', 'none', 'tomorrow', 'none') true_time = self.now + timedelta(days=1) self.assertEquals(true_time, time)
[docs] def test_interpret_time_tomorrow_at_eight_pm(self): time, _ = self.policy.interpret_time('8:00', 'pm', 'none', 'tomorrow', 'none') true_time = datetime.combine(self.now + timedelta(days=1), dttime(hour=20)) self.assertEquals(true_time, time)
[docs] def test_interpret_time_morning(self): time, _ = self.policy.interpret_time('none', 'morning', 'none', 'none', 'none') true_time = datetime.combine(self.now, dttime(hour=6)) true_time += timedelta(days=1) if true_time < datetime.now() else timedelta(hours=0) self.assertEquals(true_time, time) # ===== SET UP AND CONSTANTS =====
[docs] def set_ds_directions(self): travel = Travel(from_city='New York', from_stop='Wall street', from_stop_geo=None, to_stop_geo=None, to_city='New York', to_stop='Central park', vehicle='none', max_transfers='none') self.ds.directions = GoogleDirections(input_json=self.get_directions_json(), travel=travel) self.ds['route_alternative'] = 0
[docs] def set_ds_connection_info(self, to_stop='none', from_stop='none', to_city='none', from_city='none'): self.ds.slots['to_stop'].scale(0.0) self.ds.slots['to_stop'].add(to_stop, 1.0) self.ds.slots['from_stop'].scale(0.0) self.ds.slots['from_stop'].add(from_stop, 1.0) self.ds.slots['to_city'].scale(0.0) self.ds.slots['to_city'].add(to_city, 1.0) self.ds.slots['from_city'].scale(0.0) self.ds.slots['from_city'].add(from_city, 1.0)
[docs] def set_ds_street_connection_info(self, to_street='none', to_street2='none', to_borough='none', from_street='none', from_street2='none', from_borough='none'): self.ds.slots['to_street'].scale(0.0) self.ds.slots['to_street'].add(to_street, 1.0) self.ds.slots['to_street2'].scale(0.0) self.ds.slots['to_street2'].add(to_street2, 1.0) self.ds.slots['to_borough'].scale(0.0) self.ds.slots['to_borough'].add(to_borough, 1.0) self.ds.slots['from_street'].scale(0.0) self.ds.slots['from_street'].add(from_street, 1.0) self.ds.slots['from_street2'].scale(0.0) self.ds.slots['from_street2'].add(from_street2, 1.0) self.ds.slots['from_borough'].scale(0.0) self.ds.slots['from_borough'].add(from_borough, 1.0)
[docs] def get_clean_ds(self): ds = DeterministicDiscriminativeDialogueState(self.cfg, self.ontology) # add time so it wont randomly (1/10) ask for departure_time ds.slots['time'].scale(0.0) ds.slots['time'].add('value', 1.0) return ds
[docs] def setUp(self): self.cfg = Config.load_configs(log=False) self.cfg.update(self.get_config()) self.ontology = Ontology(self.cfg['DM']['ontology']) self.policy = PTIENHDCPolicy(self.cfg, self.ontology) self.now = datetime.now() self.now -= timedelta(seconds=self.now.second, microseconds=self.now.microsecond) self.utcnow = datetime.utcnow() self.utcnow -= timedelta(seconds=self.utcnow.second, microseconds=self.utcnow.microsecond) self.ds = self.get_clean_ds()
[docs] def get_config(self): return { 'PublicTransportInfoEN': { 'max_turns': 120, }, 'DM': { 'debug': True, 'type': 'basic', 'epilogue': { # if set to None, no question is asked # 'final_question': u"I have one last question, have You obtained desired information?", 'final_question': None, # if set to None, no code is given # if set to a valid url, a code is given and reported to the url as "url.format(code=code)" # 'final_code_url': None, 'final_code_url': 'https://147.251.253.9/?q={code}&a=1', # time in seconds before valid dialogue can successfully end (to prevent from saying hello, good bye) 'final_code_min_turn_count': 5, 'final_code_text_min_turn_count_not_reached': u"I'm sorry, You haven't met the minimum question count limit.", # the message is generated as "final_code_text.format(code=code)" 'final_code_text': u'Your code is {code} .', 'final_code_text_repeat': u' I repeat, ', # initialise the seed of the code generation algorithm 'code_seed': 1, }, 'basic': { 'debug': True, }, 'ontology': as_project_path('applications/PublicTransportInfoEN/data/ontology.py'), 'dialogue_state': { 'type': DeterministicDiscriminativeDialogueState, }, 'DeterministicDiscriminativeDialogueState': { #'type' : 'MDP', 'type' : 'UFAL_DSTC_1.0_approx', }, 'dialogue_policy': { 'type': PTIENHDCPolicy, 'PTIENHDCPolicy': { 'accept_prob_ludait': 0.5, 'accept_prob_being_requested': 0.8, 'accept_prob_being_confirmed': 0.8, 'accept_prob_being_selected': 0.8, 'accept_prob_noninformed': 0.8, 'accept_prob': 0.8, 'confirm_prob': 0.4, 'select_prob': 0.4, 'min_change_prob': 0.1, } }, }, }
[docs] def get_directions_json(self): return{ 'routes': [{ 'overview_polyline': { 'points': 'yi|wFhlmbMTe@b@i@f@U`@GFg@Rm@P}@L{@Fe@J]T]ZMRWJUH[@c@Bg@Dm@Jq@T_AnBsBdC{HnCuIgGaE|A{ETs@N_@tc@vYhdArq@b_Axm@XXPb@Lh@rAjJH^N\\RVrr@td@zn@za@PHd@Hd@Dh@AdCUz@Av@B~O`Cv@Xl@d@f@n@t@nA\\^nMlKtGnEdMnJFFRLf@VnDbAj@XnLpJvY`WTNXHXD|DTh@Fb@N`@TdDpChBhBVZPb@Nf@~C|RHXXj@FHhDrCpPtMQ_A\\u@hAmBrCmFjAmC' }, 'warnings': ['Walking directions are in beta. Use caution \u2013 This route may be missing sidewalks or pedestrian paths.'], 'bounds': { 'northeast': { 'lat': 40.7825267, 'lng': -73.955589 }, 'southwest': { 'lat': 40.7060081, 'lng': -74.011862 } }, 'waypoint_order': [], 'summary': '', 'copyrights': 'Map data \xa92015 Google', 'legs': [{ 'distance': { 'text': '6.8 mi', 'value': 10887 }, 'end_address': '58 Wall Street, New York, NY 10005, USA', 'via_waypoint': [], 'start_address': '1 West 86th Street, New York, NY 10024, USA', 'arrival_time': { 'text': '2:07pm', 'time_zone': 'America/New_York', 'value': 1422904073 }, 'steps': [{ 'html_instructions': 'Walk to 86 St', 'distance': { 'text': '0.7 mi', 'value': 1088 }, 'travel_mode': 'WALKING', 'start_location': { 'lat': 40.7825267, 'lng': -73.9656492 }, 'polyline': { 'points': 'yi|wFhlmbMHQJSNURSPKTI`@GFg@FSJYFUHg@Dc@FW@UDOBMFOT]ZMLODGDIDKDOBK@K?W@Q@U@SBYDSD]Li@FUnBsBdC{H~BqHNc@_C}AgCcBxAsEBGFO@E@GHUN_@' }, 'duration': { 'text': '13 mins', 'value': 801 }, 'steps': [{ 'html_instructions': 'Head <b>southeast</b>', 'distance': { 'text': '299 ft', 'value': 91 }, 'travel_mode': 'WALKING', 'start_location': { 'lat': 40.7825267, 'lng': -73.9656492 }, 'polyline': { 'points': 'yi|wFhlmbMHQJSNURSPKTI`@G' }, 'duration': { 'text': '1 min', 'value': 63 }, 'end_location': { 'lat': 40.7818661, 'lng': -73.96509809999999 } }, { 'html_instructions': 'Turn <b>left</b> toward <b>E 84th St</b>', 'distance': { 'text': '0.2 mi', 'value': 303 }, 'travel_mode': 'WALKING', 'maneuver': 'turn-left', 'start_location': { 'lat': 40.7818661, 'lng': -73.96509809999999 }, 'polyline': { 'points': 'ue|wFzhmbMFg@FSJYFUHg@Dc@FW@UDOBMFOT]ZMLODGDIDKDOBK@K?W@Q@U@SBYDSD]Li@FU' }, 'duration': { 'text': '3 mins', 'value': 202 }, 'end_location': { 'lat': 40.78077830000001, 'lng': -73.9619483 } }, { 'html_instructions': 'Continue onto <b>E 84th St</b>', 'distance': { 'text': '0.2 mi', 'value': 396 }, 'travel_mode': 'WALKING', 'start_location': { 'lat': 40.78077830000001, 'lng': -73.9619483 }, 'polyline': { 'points': '{~{wFdulbMnBsBdC{H~BqHNc@' }, 'duration': { 'text': '5 mins', 'value': 319 }, 'end_location': { 'lat': 40.7788333, 'lng': -73.9580794 } }, { 'html_instructions': 'Turn <b>left</b> onto <b>Park Ave</b>', 'distance': { 'text': '0.1 mi', 'value': 167 }, 'travel_mode': 'WALKING', 'maneuver': 'turn-left', 'start_location': { 'lat': 40.7788333, 'lng': -73.9580794 }, 'polyline': { 'points': 'ur{wF~|kbM_C}AgCcB' }, 'duration': { 'text': '2 mins', 'value': 123 }, 'end_location': { 'lat': 40.7801464, 'lng': -73.95711109999999 } }, { 'html_instructions': 'Turn <b>right</b> onto <b>E 86th St</b><div style="font-size:0.9em">Destination will be on the right</div>', 'distance': { 'text': '430 ft', 'value': 131 }, 'travel_mode': 'WALKING', 'maneuver': 'turn-right', 'start_location': { 'lat': 40.7801464, 'lng': -73.95711109999999 }, 'polyline': { 'points': '}z{wF|vkbMxAsEBGFO@E@GHUN_@' }, 'duration': { 'text': '2 mins', 'value': 94 }, 'end_location': { 'lat': 40.779492, 'lng': -73.955589 } }], 'end_location': { 'lat': 40.779492, 'lng': -73.955589 } }, { 'html_instructions': 'Subway towards Crown Hts - Utica Av', 'distance': { 'text': '5.9 mi', 'value': 9506 }, 'travel_mode': 'TRANSIT', 'start_location': { 'lat': 40.779492, 'lng': -73.955589 }, 'polyline': { 'points': 'yv{wFlmkbMtc@vYfa@~W`b@rXz`@tWx\\vTFDDDFDDDDFDDBFDHBFBHBHBH@HBJ@Jd@`Dh@tD@F@F@FBF@FBFBFBDBFBDDDDDBDDDDDl_@tVxQrL`SrMxZfSHDFBH@FBH@H@H@H@F?H@J?H?HAH?JAPCPCPCPANAPANANAN?L?L?N?L@L?J@lNtBPBNBNBLDLDLDLFJFJHJHHHJHHJFJHLDHDJDHFHDHDHFFFHDFFFFFFFDFFDHFvLvJtGnEdMnJBBBBDBBBBBD@BBDBB@DBB@D@B@DBB@xCx@@@B?@@B?@@B@@?@@B@@@B?@@@@B@B@B@@@@@@?@@@@B@@@@@@@B@@@@@BB|K`JxFbFpQtODBDBDBBBDBDBD@DBD@F@D@D@D?F@D?`DRJ@H?H@J?H@HBF@HBHBFDHBFDFDFDFF|ChCbBbBDDDFDDDFDDBFDHBFBHBFBHBHBJ@HBJvC`R@D@F@D@DBD@FBB@DBDBD@DBBBBBDBBhDrCpPtM' }, 'transit_details': { 'num_stops': 6, 'departure_stop': { 'location': { 'lat': 40.779492, 'lng': -73.955589 }, 'name': '86 St' }, 'headsign': 'Crown Hts - Utica Av', 'arrival_time': { 'text': '2:04pm', 'time_zone': 'America/New_York', 'value': 1422903870 }, 'arrival_stop': { 'location': { 'lat': 40.707557, 'lng': -74.011862 }, 'name': 'Wall St' }, 'line': { 'name': 'Lexington Avenue Express', 'short_name': '4', 'color': '#00933c', 'agencies': [{ 'url': 'http://www.mta.info/', 'phone': '1 718-330-1234', 'name': 'MTA New York City Transit' }], 'url': 'http://web.mta.info/nyct/service/pdf/t4cur.pdf', 'vehicle': { 'type': 'SUBWAY', 'name': 'Subway', 'icon': '//maps.gstatic.com/mapfiles/transit/iw/6/metro.png' }, 'icon': '//maps.gstatic.com/mapfiles/transit/iw/6/us-ny-mta/4.png' }, 'departure_time': { 'text': '1:46pm', 'time_zone': 'America/New_York', 'value': 1422902790 } }, 'duration': { 'text': '18 mins', 'value': 1080 }, 'end_location': { 'lat': 40.707557, 'lng': -74.011862 } }, { 'html_instructions': 'Walk to 58 Wall Street, New York, NY 10005, USA', 'distance': { 'text': '0.2 mi', 'value': 293 }, 'travel_mode': 'WALKING', 'start_location': { 'lat': 40.707557, 'lng': -74.011862 }, 'polyline': { 'points': 'gumwFbmvbMQ_A\\u@hAmBrCmFjAmC' }, 'duration': { 'text': '3 mins', 'value': 202 }, 'steps': [{ 'html_instructions': 'Head <b>southeast</b> on <b>Wall St</b> toward <b>New St</b>', 'distance': { 'text': '0.2 mi', 'value': 293 }, 'travel_mode': 'WALKING', 'start_location': { 'lat': 40.707557, 'lng': -74.011862 }, 'polyline': { 'points': 'gumwFbmvbMQ_A\\u@hAmBrCmFjAmC' }, 'duration': { 'text': '3 mins', 'value': 202 }, 'end_location': { 'lat': 40.7060081, 'lng': -74.00881509999999 } }], 'end_location': { 'lat': 40.7060081, 'lng': -74.00881509999999 } }], 'duration': { 'text': '35 mins', 'value': 2085 }, 'end_location': { 'lat': 40.7060081, 'lng': -74.00881509999999 }, 'start_location': { 'lat': 40.7825267, 'lng': -73.9656492 }, 'departure_time': { 'text': '1:33pm', 'time_zone': 'America/New_York', 'value': 1422901988 } }] }, { 'overview_polyline': { 'points': 'yi|wFhlmbMTe@b@i@f@U`@GFg@Rm@P}@L{@Fe@J]T]ZMRWJUH[@c@Bg@Dm@Jq@T_AnBsBdC{HnCuIgGaE|A{ETs@N_@tc@vYhdArq@b_Axm@XXPb@Lh@rAjJH^N\\RVrr@td@zn@za@PHd@Hd@Dh@AdCUz@Av@B~O`Cv@Xl@d@f@n@t@nA\\^nMlKtGnEdMnJFFRLf@VnDbAj@XnLpJvY`WTNXHXD|DTh@Fb@N`@TdDpChBhBVZPb@Nf@~C|RHXXj@FHhDrCpPtMQ_A\\u@hAmBrCmFjAmC' }, 'warnings': ['Walking directions are in beta. Use caution \u2013 This route may be missing sidewalks or pedestrian paths.'], 'bounds': { 'northeast': { 'lat': 40.7825267, 'lng': -73.955589 }, 'southwest': { 'lat': 40.7060081, 'lng': -74.011862 } }, 'waypoint_order': [], 'summary': '', 'copyrights': 'Map data \xa92015 Google', 'legs': [{ 'distance': { 'text': '6.8 mi', 'value': 10887 }, 'end_address': '58 Wall Street, New York, NY 10005, USA', 'via_waypoint': [], 'start_address': '1 West 86th Street, New York, NY 10024, USA', 'arrival_time': { 'text': '2:11pm', 'time_zone': 'America/New_York', 'value': 1422904313 }, 'steps': [{ 'html_instructions': 'Walk to 86 St', 'distance': { 'text': '0.7 mi', 'value': 1088 }, 'travel_mode': 'WALKING', 'start_location': { 'lat': 40.7825267, 'lng': -73.9656492 }, 'polyline': { 'points': 'yi|wFhlmbMHQJSNURSPKTI`@GFg@FSJYFUHg@Dc@FW@UDOBMFOT]ZMLODGDIDKDOBK@K?W@Q@U@SBYDSD]Li@FUnBsBdC{H~BqHNc@_C}AgCcBxAsEBGFO@E@GHUN_@' }, 'duration': { 'text': '13 mins', 'value': 801 }, 'steps': [{ 'html_instructions': 'Head <b>southeast</b>', 'distance': { 'text': '299 ft', 'value': 91 }, 'travel_mode': 'WALKING', 'start_location': { 'lat': 40.7825267, 'lng': -73.9656492 }, 'polyline': { 'points': 'yi|wFhlmbMHQJSNURSPKTI`@G' }, 'duration': { 'text': '1 min', 'value': 63 }, 'end_location': { 'lat': 40.7818661, 'lng': -73.96509809999999 } }, { 'html_instructions': 'Turn <b>left</b> toward <b>E 84th St</b>', 'distance': { 'text': '0.2 mi', 'value': 303 }, 'travel_mode': 'WALKING', 'maneuver': 'turn-left', 'start_location': { 'lat': 40.7818661, 'lng': -73.96509809999999 }, 'polyline': { 'points': 'ue|wFzhmbMFg@FSJYFUHg@Dc@FW@UDOBMFOT]ZMLODGDIDKDOBK@K?W@Q@U@SBYDSD]Li@FU' }, 'duration': { 'text': '3 mins', 'value': 202 }, 'end_location': { 'lat': 40.78077830000001, 'lng': -73.9619483 } }, { 'html_instructions': 'Continue onto <b>E 84th St</b>', 'distance': { 'text': '0.2 mi', 'value': 396 }, 'travel_mode': 'WALKING', 'start_location': { 'lat': 40.78077830000001, 'lng': -73.9619483 }, 'polyline': { 'points': '{~{wFdulbMnBsBdC{H~BqHNc@' }, 'duration': { 'text': '5 mins', 'value': 319 }, 'end_location': { 'lat': 40.7788333, 'lng': -73.9580794 } }, { 'html_instructions': 'Turn <b>left</b> onto <b>Park Ave</b>', 'distance': { 'text': '0.1 mi', 'value': 167 }, 'travel_mode': 'WALKING', 'maneuver': 'turn-left', 'start_location': { 'lat': 40.7788333, 'lng': -73.9580794 }, 'polyline': { 'points': 'ur{wF~|kbM_C}AgCcB' }, 'duration': { 'text': '2 mins', 'value': 123 }, 'end_location': { 'lat': 40.7801464, 'lng': -73.95711109999999 } }, { 'html_instructions': 'Turn <b>right</b> onto <b>E 86th St</b><div style="font-size:0.9em">Destination will be on the right</div>', 'distance': { 'text': '430 ft', 'value': 131 }, 'travel_mode': 'WALKING', 'maneuver': 'turn-right', 'start_location': { 'lat': 40.7801464, 'lng': -73.95711109999999 }, 'polyline': { 'points': '}z{wF|vkbMxAsEBGFO@E@GHUN_@' }, 'duration': { 'text': '2 mins', 'value': 94 }, 'end_location': { 'lat': 40.779492, 'lng': -73.955589 } }], 'end_location': { 'lat': 40.779492, 'lng': -73.955589 } }, { 'html_instructions': 'Subway towards Flatbush Av - Brooklyn College', 'distance': { 'text': '5.9 mi', 'value': 9506 }, 'travel_mode': 'TRANSIT', 'start_location': { 'lat': 40.779492, 'lng': -73.955589 }, 'polyline': { 'points': 'yv{wFlmkbMtc@vYfa@~W`b@rXz`@tWx\\vTFDDDFDDDDFDDBFDHBFBHBHBH@HBJ@Jd@`Dh@tD@F@F@FBF@FBFBFBDBFBDDDDDBDDDDDl_@tVxQrL`SrMxZfSHDFBH@FBH@H@H@H@F?H@J?H?HAH?JAPCPCPCPANAPANANAN?L?L?N?L@L?J@lNtBPBNBNBLDLDLDLFJFJHJHHHJHHJFJHLDHDJDHFHDHDHFFFHDFFFFFFFDFFDHFvLvJtGnEdMnJBBBBDBBBBBD@BBDBB@DBB@D@B@DBB@xCx@@@B?@@B?@@B@@?@@B@@@B?@@@@B@B@B@@@@@@?@@@@B@@@@@@@B@@@@@BB|K`JxFbFpQtODBDBDBBBDBDBD@DBD@F@D@D@D?F@D?`DRJ@H?H@J?H@HBF@HBHBFDHBFDFDFDFF|ChCbBbBDDDFDDDFDDBFDHBFBHBFBHBHBJ@HBJvC`R@D@F@D@DBD@FBB@DBDBD@DBBBBBDBBhDrCpPtM' }, 'transit_details': { 'num_stops': 6, 'departure_stop': { 'location': { 'lat': 40.779492, 'lng': -73.955589 }, 'name': '86 St' }, 'headsign': 'Flatbush Av - Brooklyn College', 'arrival_time': { 'text': '2:08pm', 'time_zone': 'America/New_York', 'value': 1422904110 }, 'arrival_stop': { 'location': { 'lat': 40.707557, 'lng': -74.011862 }, 'name': 'Wall St' }, 'line': { 'name': 'Lexington Avenue Express', 'short_name': '5', 'color': '#00933c', 'agencies': [{ 'url': 'http://www.mta.info/', 'phone': '1 718-330-1234', 'name': 'MTA New York City Transit' }], 'url': 'http://web.mta.info/nyct/service/pdf/t5cur.pdf', 'vehicle': { 'type': 'SUBWAY', 'name': 'Subway', 'icon': '//maps.gstatic.com/mapfiles/transit/iw/6/metro.png' }, 'icon': '//maps.gstatic.com/mapfiles/transit/iw/6/us-ny-mta/5.png' }, 'departure_time': { 'text': '1:50pm', 'time_zone': 'America/New_York', 'value': 1422903030 } }, 'duration': { 'text': '18 mins', 'value': 1080 }, 'end_location': { 'lat': 40.707557, 'lng': -74.011862 } }, { 'html_instructions': 'Walk to 58 Wall Street, New York, NY 10005, USA', 'distance': { 'text': '0.2 mi', 'value': 293 }, 'travel_mode': 'WALKING', 'start_location': { 'lat': 40.707557, 'lng': -74.011862 }, 'polyline': { 'points': 'gumwFbmvbMQ_A\\u@hAmBrCmFjAmC' }, 'duration': { 'text': '3 mins', 'value': 202 }, 'steps': [{ 'html_instructions': 'Head <b>southeast</b> on <b>Wall St</b> toward <b>New St</b>', 'distance': { 'text': '0.2 mi', 'value': 293 }, 'travel_mode': 'WALKING', 'start_location': { 'lat': 40.707557, 'lng': -74.011862 }, 'polyline': { 'points': 'gumwFbmvbMQ_A\\u@hAmBrCmFjAmC' }, 'duration': { 'text': '3 mins', 'value': 202 }, 'end_location': { 'lat': 40.7060081, 'lng': -74.00881509999999 } }], 'end_location': { 'lat': 40.7060081, 'lng': -74.00881509999999 } }], 'duration': { 'text': '35 mins', 'value': 2085 }, 'end_location': { 'lat': 40.7060081, 'lng': -74.00881509999999 }, 'start_location': { 'lat': 40.7825267, 'lng': -73.9656492 }, 'departure_time': { 'text': '1:37pm', 'time_zone': 'America/New_York', 'value': 1422902228 } }] }, { 'overview_polyline': { 'points': 'yi|wFhlmbMTe@b@i@f@U`@GFg@Rm@P}@L{@Fe@J]T]ZMRWJUH[@c@Bg@Dm@Jq@T_AnBsBdC{HnCuIgGaE|A{ETs@N_@tc@vYhdArq@b_Axm@XXPb@Lh@rAjJH^N\\RVrr@td@zn@za@PHd@Hd@Dh@AdCUz@Av@B~O`Cv@Xl@d@f@n@t@nA\\^nMlKtGnEdMnJFFRLf@VnDbAj@XnLpJvY`WTNXHXD|DTh@Fb@N`@TdDpChBhBVZPb@Nf@~C|RHXXj@FHhDrCpPtMQ_A\\u@hAmBrCmFjAmC' }, 'warnings': ['Walking directions are in beta. Use caution \u2013 This route may be missing sidewalks or pedestrian paths.'], 'bounds': { 'northeast': { 'lat': 40.7825267, 'lng': -73.955589 }, 'southwest': { 'lat': 40.7060081, 'lng': -74.011862 } }, 'waypoint_order': [], 'summary': '', 'copyrights': 'Map data \xa92015 Google', 'legs': [{ 'distance': { 'text': '6.8 mi', 'value': 10887 }, 'end_address': '58 Wall Street, New York, NY 10005, USA', 'via_waypoint': [], 'start_address': '1 West 86th Street, New York, NY 10024, USA', 'arrival_time': { 'text': '2:15pm', 'time_zone': 'America/New_York', 'value': 1422904553 }, 'steps': [{ 'html_instructions': 'Walk to 86 St', 'distance': { 'text': '0.7 mi', 'value': 1088 }, 'travel_mode': 'WALKING', 'start_location': { 'lat': 40.7825267, 'lng': -73.9656492 }, 'polyline': { 'points': 'yi|wFhlmbMHQJSNURSPKTI`@GFg@FSJYFUHg@Dc@FW@UDOBMFOT]ZMLODGDIDKDOBK@K?W@Q@U@SBYDSD]Li@FUnBsBdC{H~BqHNc@_C}AgCcBxAsEBGFO@E@GHUN_@' }, 'duration': { 'text': '13 mins', 'value': 801 }, 'steps': [{ 'html_instructions': 'Head <b>southeast</b>', 'distance': { 'text': '299 ft', 'value': 91 }, 'travel_mode': 'WALKING', 'start_location': { 'lat': 40.7825267, 'lng': -73.9656492 }, 'polyline': { 'points': 'yi|wFhlmbMHQJSNURSPKTI`@G' }, 'duration': { 'text': '1 min', 'value': 63 }, 'end_location': { 'lat': 40.7818661, 'lng': -73.96509809999999 } }, { 'html_instructions': 'Turn <b>left</b> toward <b>E 84th St</b>', 'distance': { 'text': '0.2 mi', 'value': 303 }, 'travel_mode': 'WALKING', 'maneuver': 'turn-left', 'start_location': { 'lat': 40.7818661, 'lng': -73.96509809999999 }, 'polyline': { 'points': 'ue|wFzhmbMFg@FSJYFUHg@Dc@FW@UDOBMFOT]ZMLODGDIDKDOBK@K?W@Q@U@SBYDSD]Li@FU' }, 'duration': { 'text': '3 mins', 'value': 202 }, 'end_location': { 'lat': 40.78077830000001, 'lng': -73.9619483 } }, { 'html_instructions': 'Continue onto <b>E 84th St</b>', 'distance': { 'text': '0.2 mi', 'value': 396 }, 'travel_mode': 'WALKING', 'start_location': { 'lat': 40.78077830000001, 'lng': -73.9619483 }, 'polyline': { 'points': '{~{wFdulbMnBsBdC{H~BqHNc@' }, 'duration': { 'text': '5 mins', 'value': 319 }, 'end_location': { 'lat': 40.7788333, 'lng': -73.9580794 } }, { 'html_instructions': 'Turn <b>left</b> onto <b>Park Ave</b>', 'distance': { 'text': '0.1 mi', 'value': 167 }, 'travel_mode': 'WALKING', 'maneuver': 'turn-left', 'start_location': { 'lat': 40.7788333, 'lng': -73.9580794 }, 'polyline': { 'points': 'ur{wF~|kbM_C}AgCcB' }, 'duration': { 'text': '2 mins', 'value': 123 }, 'end_location': { 'lat': 40.7801464, 'lng': -73.95711109999999 } }, { 'html_instructions': 'Turn <b>right</b> onto <b>E 86th St</b><div style="font-size:0.9em">Destination will be on the right</div>', 'distance': { 'text': '430 ft', 'value': 131 }, 'travel_mode': 'WALKING', 'maneuver': 'turn-right', 'start_location': { 'lat': 40.7801464, 'lng': -73.95711109999999 }, 'polyline': { 'points': '}z{wF|vkbMxAsEBGFO@E@GHUN_@' }, 'duration': { 'text': '2 mins', 'value': 94 }, 'end_location': { 'lat': 40.779492, 'lng': -73.955589 } }], 'end_location': { 'lat': 40.779492, 'lng': -73.955589 } }, { 'html_instructions': 'Subway towards Crown Hts - Utica Av', 'distance': { 'text': '5.9 mi', 'value': 9506 }, 'travel_mode': 'TRANSIT', 'start_location': { 'lat': 40.779492, 'lng': -73.955589 }, 'polyline': { 'points': 'yv{wFlmkbMtc@vYfa@~W`b@rXz`@tWx\\vTFDDDFDDDDFDDBFDHBFBHBHBH@HBJ@Jd@`Dh@tD@F@F@FBF@FBFBFBDBFBDDDDDBDDDDDl_@tVxQrL`SrMxZfSHDFBH@FBH@H@H@H@F?H@J?H?HAH?JAPCPCPCPANAPANANAN?L?L?N?L@L?J@lNtBPBNBNBLDLDLDLFJFJHJHHHJHHJFJHLDHDJDHFHDHDHFFFHDFFFFFFFDFFDHFvLvJtGnEdMnJBBBBDBBBBBD@BBDBB@DBB@D@B@DBB@xCx@@@B?@@B?@@B@@?@@B@@@B?@@@@B@B@B@@@@@@?@@@@B@@@@@@@B@@@@@BB|K`JxFbFpQtODBDBDBBBDBDBD@DBD@F@D@D@D?F@D?`DRJ@H?H@J?H@HBF@HBHBFDHBFDFDFDFF|ChCbBbBDDDFDDDFDDBFDHBFBHBFBHBHBJ@HBJvC`R@D@F@D@DBD@FBB@DBDBD@DBBBBBDBBhDrCpPtM' }, 'transit_details': { 'num_stops': 6, 'departure_stop': { 'location': { 'lat': 40.779492, 'lng': -73.955589 }, 'name': '86 St' }, 'headsign': 'Crown Hts - Utica Av', 'arrival_time': { 'text': '2:12pm', 'time_zone': 'America/New_York', 'value': 1422904350 }, 'arrival_stop': { 'location': { 'lat': 40.707557, 'lng': -74.011862 }, 'name': 'Wall St' }, 'line': { 'name': 'Lexington Avenue Express', 'short_name': '4', 'color': '#00933c', 'agencies': [{ 'url': 'http://www.mta.info/', 'phone': '1 718-330-1234', 'name': 'MTA New York City Transit' }], 'url': 'http://web.mta.info/nyct/service/pdf/t4cur.pdf', 'vehicle': { 'type': 'SUBWAY', 'name': 'Subway', 'icon': '//maps.gstatic.com/mapfiles/transit/iw/6/metro.png' }, 'icon': '//maps.gstatic.com/mapfiles/transit/iw/6/us-ny-mta/4.png' }, 'departure_time': { 'text': '1:54pm', 'time_zone': 'America/New_York', 'value': 1422903270 } }, 'duration': { 'text': '18 mins', 'value': 1080 }, 'end_location': { 'lat': 40.707557, 'lng': -74.011862 } }, { 'html_instructions': 'Walk to 58 Wall Street, New York, NY 10005, USA', 'distance': { 'text': '0.2 mi', 'value': 293 }, 'travel_mode': 'WALKING', 'start_location': { 'lat': 40.707557, 'lng': -74.011862 }, 'polyline': { 'points': 'gumwFbmvbMQ_A\\u@hAmBrCmFjAmC' }, 'duration': { 'text': '3 mins', 'value': 202 }, 'steps': [{ 'html_instructions': 'Head <b>southeast</b> on <b>Wall St</b> toward <b>New St</b>', 'distance': { 'text': '0.2 mi', 'value': 293 }, 'travel_mode': 'WALKING', 'start_location': { 'lat': 40.707557, 'lng': -74.011862 }, 'polyline': { 'points': 'gumwFbmvbMQ_A\\u@hAmBrCmFjAmC' }, 'duration': { 'text': '3 mins', 'value': 202 }, 'end_location': { 'lat': 40.7060081, 'lng': -74.00881509999999 } }], 'end_location': { 'lat': 40.7060081, 'lng': -74.00881509999999 } }], 'duration': { 'text': '35 mins', 'value': 2085 }, 'end_location': { 'lat': 40.7060081, 'lng': -74.00881509999999 }, 'start_location': { 'lat': 40.7825267, 'lng': -73.9656492 }, 'departure_time': { 'text': '1:41pm', 'time_zone': 'America/New_York', 'value': 1422902468 } }] }, { 'overview_polyline': { 'points': 'yi|wFhlmbMKZIz@?nAKF@t@Cf@Gd@KZ]`@g@VYD_@@]I[n@e@r@[XGRALAV?v@[h@e@r@Yt@EX?`@qEwCg@a@f_Axm@`qAxz@xeCdaBdEpC^N\\J^D\\?^C^K\\Ob[wOZMx@Kv@Dv@XbLpHj@ZvIzDnAh@pObFjVjHl@Hn@@r@AbEK~IMx@Dv@Nv@X`c@h[b@X`@P`@F^C\\KZUZ_@xEmLP^vBtB`B~AlAxAxDfDpBdBrCmFjAmC' }, 'warnings': ['Walking directions are in beta. Use caution \u2013 This route may be missing sidewalks or pedestrian paths.'], 'bounds': { 'northeast': { 'lat': 40.785868, 'lng': -73.9656492 }, 'southwest': { 'lat': 40.7060081, 'lng': -74.01072309999999 } }, 'waypoint_order': [], 'summary': '', 'copyrights': 'Map data \xa92015 Google', 'legs': [{ 'distance': { 'text': '6.7 mi', 'value': 10741 }, 'end_address': '58 Wall Street, New York, NY 10005, USA', 'via_waypoint': [], 'start_address': '1 West 86th Street, New York, NY 10024, USA', 'arrival_time': { 'text': '2:18pm', 'time_zone': 'America/New_York', 'value': 1422904725 }, 'steps': [{ 'html_instructions': 'Walk to 86 St', 'distance': { 'text': '0.4 mi', 'value': 622 }, 'travel_mode': 'WALKING', 'start_location': { 'lat': 40.7825267, 'lng': -73.9656492 }, 'polyline': { 'points': 'yi|wFhlmbMCFGRE\\C\\?Z?r@?@KD@F?@@LA\\AVANGd@KZSVIHUNQFKBM@OBOAMAOGMVMV[d@IL[XGRAF?D?HAL?H?l@ORKTS^QROXIZEX?`@iCeBgAq@MKYU' }, 'duration': { 'text': '8 mins', 'value': 457 }, 'steps': [{ 'html_instructions': 'Head <b>northwest</b>', 'distance': { 'text': '243 ft', 'value': 74 }, 'travel_mode': 'WALKING', 'start_location': { 'lat': 40.7825267, 'lng': -73.9656492 }, 'polyline': { 'points': 'yi|wFhlmbMCFGRE\\C\\?Z?r@?@' }, 'duration': { 'text': '1 min', 'value': 55 }, 'end_location': { 'lat': 40.7826353, 'lng': -73.96649950000001 } }, { 'html_instructions': 'Turn <b>right</b> toward <b>Central Park West</b>', 'distance': { 'text': '26 ft', 'value': 8 }, 'travel_mode': 'WALKING', 'maneuver': 'turn-right', 'start_location': { 'lat': 40.7826353, 'lng': -73.96649950000001 }, 'polyline': { 'points': 'oj|wFrqmbMKD' }, 'duration': { 'text': '1 min', 'value': 6 }, 'end_location': { 'lat': 40.7827013, 'lng': -73.9665271 } }, { 'html_instructions': 'Turn <b>left</b> toward <b>Central Park West</b>', 'distance': { 'text': '0.1 mi', 'value': 166 }, 'travel_mode': 'WALKING', 'maneuver': 'turn-left', 'start_location': { 'lat': 40.7827013, 'lng': -73.9665271 }, 'polyline': { 'points': '{j|wFxqmbM@F?@@LA\\AVANGd@KZSVIHUNQFKBM@OBOAMAOG' }, 'duration': { 'text': '2 mins', 'value': 122 }, 'end_location': { 'lat': 40.7835959, 'lng': -73.9676142 } }, { 'html_instructions': 'Turn <b>left</b> toward <b>Central Park West</b>', 'distance': { 'text': '0.1 mi', 'value': 232 }, 'travel_mode': 'WALKING', 'maneuver': 'turn-left', 'start_location': { 'lat': 40.7835959, 'lng': -73.9676142 }, 'polyline': { 'points': 'op|wFpxmbMMVMV[d@IL[XGRAF?D?HAL?H?l@ORKTS^QROXIZEX?`@' }, 'duration': { 'text': '3 mins', 'value': 163 }, 'end_location': { 'lat': 40.7846217, 'lng': -73.9698525 } }, { 'html_instructions': 'Turn <b>right</b> onto <b>Central Park West</b><div style="font-size:0.9em">Destination will be on the right</div>', 'distance': { 'text': '466 ft', 'value': 142 }, 'travel_mode': 'WALKING', 'maneuver': 'turn-right', 'start_location': { 'lat': 40.7846217, 'lng': -73.9698525 }, 'polyline': { 'points': '{v|wFpfnbMiCeBgAq@MKYU' }, 'duration': { 'text': '2 mins', 'value': 111 }, 'end_location': { 'lat': 40.785868, 'lng': -73.968916 } }], 'end_location': { 'lat': 40.785868, 'lng': -73.968916 } }, { 'html_instructions': 'Subway towards Euclid Av', 'distance': { 'text': '5.9 mi', 'value': 9505 }, 'travel_mode': 'TRANSIT', 'start_location': { 'lat': 40.785868, 'lng': -73.968916 }, 'polyline': { 'points': 'u~|wFv`nbMvZbSnc@tYpl@h`@tS~MdIjFrDbCd_@nVj^xUzf@`\\j^xUvDdCLJNFNFLDNDNBN@L?N?NANANENENELIrZoONGLGLENCLCLALAL?L@L@L@LBLDLFLF~DjCBBD@xE~CDBDBDBB@DBDBBBD@BBD@DBB@D@DBB@rHfDJDHDHDHBHDHBHBFDHBFBH@FBFBF@FBtMjEhU`HJBH@JBH@JBJ@J@J?J@J?J?L?J?L?JAzDKF?nIKNAL@L?N@L@L@LBLBLDLDLDLDLFJHLFpWhRtIlGPLPJPHNFPBNBN?NCNCLGLILKLOLOJSlEyK' }, 'transit_details': { 'num_stops': 13, 'departure_stop': { 'location': { 'lat': 40.785868, 'lng': -73.968916 }, 'name': '86 St' }, 'headsign': 'Euclid Av', 'arrival_time': { 'text': '2:11pm', 'time_zone': 'America/New_York', 'value': 1422904290 }, 'arrival_stop': { 'location': { 'lat': 40.710197, 'lng': -74.007691 }, 'name': 'Fulton St' }, 'line': { 'name': '8 Avenue Local', 'short_name': 'C', 'color': '#2850ad', 'agencies': [{ 'url': 'http://www.mta.info/', 'phone': '1 718-330-1234', 'name': 'MTA New York City Transit' }], 'text_color': '#ffffff', 'url': 'http://web.mta.info/nyct/service/pdf/tccur.pdf', 'vehicle': { 'type': 'SUBWAY', 'name': 'Subway', 'icon': '//maps.gstatic.com/mapfiles/transit/iw/6/metro.png' }, 'icon': '//maps.gstatic.com/mapfiles/transit/iw/6/us-ny-mta/C.png' }, 'departure_time': { 'text': '1:50pm', 'time_zone': 'America/New_York', 'value': 1422903000 } }, 'duration': { 'text': '22 mins', 'value': 1290 }, 'end_location': { 'lat': 40.710197, 'lng': -74.007691 } }, { 'html_instructions': 'Walk to 58 Wall Street, New York, NY 10005, USA', 'distance': { 'text': '0.4 mi', 'value': 614 }, 'travel_mode': 'WALKING', 'start_location': { 'lat': 40.710197, 'lng': -74.007691 }, 'polyline': { 'points': 'wenwF`subMP^vBtB`B~AlAxA|AtAzApApBdBrCmFjAmC' }, 'duration': { 'text': '7 mins', 'value': 434 }, 'steps': [{ 'html_instructions': 'Head <b>southwest</b> on <b>Nassau St</b> toward <b>John St</b>', 'distance': { 'text': '0.3 mi', 'value': 410 }, 'travel_mode': 'WALKING', 'start_location': { 'lat': 40.710197, 'lng': -74.007691 }, 'polyline': { 'points': 'wenwF`subMP^vBtB`B~AlAxA|AtAzApApBdB' }, 'duration': { 'text': '5 mins', 'value': 293 }, 'end_location': { 'lat': 40.7071295, 'lng': -74.01072309999999 } }, { 'html_instructions': 'Turn <b>left</b> onto <b>Wall St</b>', 'distance': { 'text': '0.1 mi', 'value': 204 }, 'travel_mode': 'WALKING', 'maneuver': 'turn-left', 'start_location': { 'lat': 40.7071295, 'lng': -74.01072309999999 }, 'polyline': { 'points': 'qrmwF~evbMrCmFjAmC' }, 'duration': { 'text': '2 mins', 'value': 141 }, 'end_location': { 'lat': 40.7060081, 'lng': -74.00881509999999 } }], 'end_location': { 'lat': 40.7060081, 'lng': -74.00881509999999 } }], 'duration': { 'text': '36 mins', 'value': 2184 }, 'end_location': { 'lat': 40.7060081, 'lng': -74.00881509999999 }, 'start_location': { 'lat': 40.7825267, 'lng': -73.9656492 }, 'departure_time': { 'text': '1:42pm', 'time_zone': 'America/New_York', 'value': 1422902541 } }] }], 'status': 'OK' }