{"version":3,"file":"./schedule-618a338f8aa80711a48dc1cbaa6084ae.js","mappings":"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","sources":["webpack://site-dotcom/webpack/runtime/chunk loaded","webpack://site-dotcom/./ts/app/channels.ts","webpack://site-dotcom/./ts/components/Alerts.tsx","webpack://site-dotcom/./ts/components/ExpandableBlock.tsx","webpack://site-dotcom/./ts/components/GlxOpen.tsx","webpack://site-dotcom/./ts/components/Loading.tsx","webpack://site-dotcom/./ts/components/MatchHighlight.tsx","webpack://site-dotcom/./ts/components/Modal.tsx","webpack://site-dotcom/./ts/components/SearchBox.tsx","webpack://site-dotcom/./ts/helpers/aria-props.ts","webpack://site-dotcom/./ts/helpers/css.ts","webpack://site-dotcom/./ts/helpers/date.ts","webpack://site-dotcom/./ts/helpers/fetch-json.ts","webpack://site-dotcom/./ts/helpers/fetch.ts","webpack://site-dotcom/./ts/helpers/icon.tsx","webpack://site-dotcom/./ts/helpers/keyboard-events-react.ts","webpack://site-dotcom/./ts/helpers/keyboard-events.ts","webpack://site-dotcom/./ts/helpers/prediction-helpers.tsx","webpack://site-dotcom/./ts/helpers/render-fa.tsx","webpack://site-dotcom/./ts/helpers/render-svg.tsx","webpack://site-dotcom/./ts/helpers/routes.ts","webpack://site-dotcom/./ts/helpers/service.ts","webpack://site-dotcom/./ts/helpers/stop-tree.ts","webpack://site-dotcom/./ts/helpers/text.ts","webpack://site-dotcom/./ts/helpers/use-await-interval.ts","webpack://site-dotcom/./ts/helpers/use-fetch.ts","webpack://site-dotcom/./ts/helpers/use-provider.ts","webpack://site-dotcom/./ts/hooks/useChannel.ts","webpack://site-dotcom/./ts/hooks/useDirectionChangeEvent.ts","webpack://site-dotcom/./ts/hooks/useHoursOfOperation.ts","webpack://site-dotcom/./ts/hooks/useIsGlxOpen.ts","webpack://site-dotcom/./ts/hooks/useRealtime.ts","webpack://site-dotcom/./ts/leaflet/bounds.ts","webpack://site-dotcom/./ts/leaflet/components/Map.tsx","webpack://site-dotcom/./ts/leaflet/icon.ts","webpack://site-dotcom/./ts/models/alert.ts","webpack://site-dotcom/./ts/models/prediction.ts","webpack://site-dotcom/./ts/models/route.ts","webpack://site-dotcom/./ts/models/vehicle.ts","webpack://site-dotcom/./ts/projects/components/RouteIcon.tsx","webpack://site-dotcom/./ts/schedule-entry.ts","webpack://site-dotcom/./ts/schedule/components/AdditionalLineInfo.tsx","webpack://site-dotcom/./ts/schedule/components/Connections.tsx","webpack://site-dotcom/./ts/schedule/components/ContentTeasers.tsx","webpack://site-dotcom/./ts/schedule/components/DefaultHoursOfOperation.tsx","webpack://site-dotcom/./ts/schedule/components/Fares.tsx","webpack://site-dotcom/./ts/schedule/components/GreenLineScheduleLinks.tsx","webpack://site-dotcom/./ts/schedule/components/HoursOfOperation.tsx","webpack://site-dotcom/./ts/schedule/components/Map.tsx","webpack://site-dotcom/./ts/schedule/components/PDFSchedules.tsx","webpack://site-dotcom/./ts/schedule/components/RapidTransitHoursOfOperation.tsx","webpack://site-dotcom/./ts/schedule/components/ScheduleDirection.tsx","webpack://site-dotcom/./ts/schedule/components/ScheduleFinder.tsx","webpack://site-dotcom/./ts/schedule/components/ScheduleLoader.tsx","webpack://site-dotcom/./ts/schedule/components/ScheduleNote.tsx","webpack://site-dotcom/./ts/schedule/components/UpcomingHolidays.tsx","webpack://site-dotcom/./ts/schedule/components/direction/BusMenu.tsx","webpack://site-dotcom/./ts/schedule/components/direction/GreenLineMenu.tsx","webpack://site-dotcom/./ts/schedule/components/direction/ScheduleDirectionButton.tsx","webpack://site-dotcom/./ts/schedule/components/direction/ScheduleDirectionMenu.tsx","webpack://site-dotcom/./ts/schedule/components/direction/menu-helpers.ts","webpack://site-dotcom/./ts/schedule/components/direction/reducer.ts","webpack://site-dotcom/./ts/schedule/components/line-diagram/CrowdingPill.tsx","webpack://site-dotcom/./ts/schedule/components/line-diagram/ExpandableBranch.tsx","webpack://site-dotcom/./ts/schedule/components/line-diagram/LineDiagram.tsx","webpack://site-dotcom/./ts/schedule/components/line-diagram/LineDiagramWithStops.tsx","webpack://site-dotcom/./ts/schedule/components/line-diagram/LiveCrowdingIcon.tsx","webpack://site-dotcom/./ts/schedule/components/line-diagram/StopCard.tsx","webpack://site-dotcom/./ts/schedule/components/line-diagram/StopConnections.tsx","webpack://site-dotcom/./ts/schedule/components/line-diagram/StopFeatures.tsx","webpack://site-dotcom/./ts/schedule/components/line-diagram/StopPredictions.tsx","webpack://site-dotcom/./ts/schedule/components/line-diagram/VehicleIcons.tsx","webpack://site-dotcom/./ts/schedule/components/line-diagram/graphics/Diagram.tsx","webpack://site-dotcom/./ts/schedule/components/line-diagram/graphics/Line.tsx","webpack://site-dotcom/./ts/schedule/components/line-diagram/graphics/Merges.tsx","webpack://site-dotcom/./ts/schedule/components/line-diagram/graphics/Stop.tsx","webpack://site-dotcom/./ts/schedule/components/line-diagram/graphics/graphic-helpers.tsx","webpack://site-dotcom/./ts/schedule/components/line-diagram/graphics/useTreeStopPositions.ts","webpack://site-dotcom/./ts/schedule/components/line-diagram/line-diagram-helpers.ts","webpack://site-dotcom/./ts/schedule/components/schedule-finder/OriginListItem.tsx","webpack://site-dotcom/./ts/schedule/components/schedule-finder/OriginModalContent.tsx","webpack://site-dotcom/./ts/schedule/components/schedule-finder/ScheduleFinderForm.tsx","webpack://site-dotcom/./ts/schedule/components/schedule-finder/ScheduleFinderModal.tsx","webpack://site-dotcom/./ts/schedule/components/schedule-finder/ScheduleModalContent.tsx","webpack://site-dotcom/./ts/schedule/components/schedule-finder/SelectContainer.tsx","webpack://site-dotcom/./ts/schedule/components/schedule-finder/daily-schedule/AccordionRow.tsx","webpack://site-dotcom/./ts/schedule/components/schedule-finder/daily-schedule/DailySchedule.tsx","webpack://site-dotcom/./ts/schedule/components/schedule-finder/daily-schedule/DailyScheduleSubway.tsx","webpack://site-dotcom/./ts/schedule/components/schedule-finder/daily-schedule/ScheduleTable.tsx","webpack://site-dotcom/./ts/schedule/components/schedule-finder/daily-schedule/ServiceOptGroup.tsx","webpack://site-dotcom/./ts/schedule/components/schedule-finder/daily-schedule/TableRow.tsx","webpack://site-dotcom/./ts/schedule/components/schedule-finder/daily-schedule/TripDetails.tsx","webpack://site-dotcom/./ts/schedule/components/schedule-finder/daily-schedule/TripStop.tsx","webpack://site-dotcom/./ts/schedule/components/schedule-finder/upcoming-departures/TripDetails.tsx","webpack://site-dotcom/./ts/schedule/components/schedule-finder/upcoming-departures/TripStop.tsx","webpack://site-dotcom/./ts/schedule/components/schedule-finder/upcoming-departures/UpcomingDepartures.tsx","webpack://site-dotcom/./ts/schedule/helpers/hoursOfOperationHelpers.tsx","webpack://site-dotcom/./ts/schedule/schedule-loader.tsx","webpack://site-dotcom/./ts/schedule/store/ScheduleStore.tsx","webpack://site-dotcom/./ts/stop/components/PillLink.tsx","webpack://site-dotcom/./ts/stop/components/RoutePillList.tsx","webpack://site-dotcom/./static/images/glx-logo.svg","webpack://site-dotcom/./static/images/icon-accessible-small.svg","webpack://site-dotcom/./static/images/icon-alerts-triangle.svg","webpack://site-dotcom/./static/images/icon-blue-line-default.svg","webpack://site-dotcom/./static/images/icon-cancelled-default.svg","webpack://site-dotcom/./static/images/icon-change-direction.svg","webpack://site-dotcom/./static/images/icon-checkmark.svg","webpack://site-dotcom/./static/images/icon-crowding.svg","webpack://site-dotcom/./static/images/icon-down-arrow.svg","webpack://site-dotcom/./static/images/icon-green-line-b-small.svg","webpack://site-dotcom/./static/images/icon-green-line-c-small.svg","webpack://site-dotcom/./static/images/icon-green-line-d-small.svg","webpack://site-dotcom/./static/images/icon-green-line-e-small.svg","webpack://site-dotcom/./static/images/icon-green-line-small.svg","webpack://site-dotcom/./static/images/icon-live-clock.svg","webpack://site-dotcom/./static/images/icon-mattapan-line-small.svg","webpack://site-dotcom/./static/images/icon-mode-bus-small.svg","webpack://site-dotcom/./static/images/icon-mode-commuter-rail-small.svg","webpack://site-dotcom/./static/images/icon-mode-ferry-small.svg","webpack://site-dotcom/./static/images/icon-mode-subway-default.svg","webpack://site-dotcom/./static/images/icon-orange-line-small.svg","webpack://site-dotcom/./static/images/icon-pdf-default.svg","webpack://site-dotcom/./static/images/icon-red-line-small.svg","webpack://site-dotcom/./static/images/icon-schedule-finder.svg","webpack://site-dotcom/./static/images/icon-search-reverse-default.svg","webpack://site-dotcom/./static/images/icon-shuttle-default.svg","webpack://site-dotcom/./static/images/icon-silver-line-small.svg","webpack://site-dotcom/./static/images/icon-snow-default.svg","webpack://site-dotcom/./static/images/icon-vehicle-bordered-expanded.svg","webpack://site-dotcom/webpack/bootstrap","webpack://site-dotcom/webpack/runtime/amd define","webpack://site-dotcom/webpack/runtime/compat get default export","webpack://site-dotcom/webpack/runtime/define property getters","webpack://site-dotcom/webpack/runtime/global","webpack://site-dotcom/webpack/runtime/harmony module decorator","webpack://site-dotcom/webpack/runtime/hasOwnProperty shorthand","webpack://site-dotcom/webpack/runtime/make namespace object","webpack://site-dotcom/webpack/runtime/node module decorator","webpack://site-dotcom/webpack/runtime/runtimeId","webpack://site-dotcom/webpack/runtime/jsonp chunk loading","webpack://site-dotcom/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","import { Socket, Channel } from \"phoenix\";\n\ndeclare global {\n  interface Window {\n    channels: { [id: string]: Channel };\n    socket: Socket;\n  }\n}\n\ntype UpdateEventName = \"reset\" | \"add\" | \"update\";\n\ninterface UpdateEvent<DataType> {\n  event: UpdateEventName;\n  data: DataType;\n}\n\ninterface RemoveEvent {\n  event: \"remove\";\n  data: string[];\n}\n\nexport type SocketEvent<DataType> = UpdateEvent<DataType> | RemoveEvent;\n\nconst isVehicleChannel = (channelId: string): boolean =>\n  channelId.includes(\"vehicles:\") && channelId !== \"vehicles:remove\";\n\nconst joinChannel = <T>(channelId: string): void => {\n  if (!window.socket) return;\n\n  if (!window.channels[channelId]) {\n    window.channels[channelId] = window.socket.channel(channelId, {});\n  }\n\n  const channel = window.channels[channelId];\n\n  if (![\"joined\", \"joining\"].includes(channel.state)) {\n    channel\n      .join()\n      .receive(\"error\", ({ reason }) =>\n        /* eslint-disable no-console */\n        console.error(`failed to join ${channelId}`, reason)\n      )\n      .receive(\"ok\", () => {\n        console.log(`success joining ${channelId}`);\n        /* eslint-enable no-console */\n        if (isVehicleChannel(channelId)) {\n          const [, route_id, direction_id] = channelId.split(\":\");\n          channel.push(\"init\", { route_id, direction_id });\n        }\n      });\n  }\n\n  channel.on(\"data\", (data: T) => {\n    const event = new CustomEvent<T>(channelId, { detail: data });\n    document.dispatchEvent(event);\n  });\n\n  if (isVehicleChannel(channelId)) {\n    joinChannel(\"vehicles:remove\");\n  }\n};\n\nconst leaveChannel = (id: string): void => {\n  if (window.channels && window.channels[id]) {\n    window.channels[id].off(\"data\");\n    window.channels[id].leave();\n    delete window.channels[id];\n  }\n  if (id.includes(\"vehicles:\") && id !== \"vehicles:remove\") {\n    leaveChannel(\"vehicles:remove\");\n  }\n};\n\nfunction setupChannels(): void {\n  window.socket = new Socket(\"/socket\", {});\n  window.socket.connect();\n  window.channels = {};\n\n  document.addEventListener(\"turbolinks:load\", () => {\n    document.querySelectorAll(\"[data-channel]\").forEach(el => {\n      const channelId = el.getAttribute(\"data-channel\");\n      if (channelId) joinChannel(channelId);\n    });\n  });\n\n  // leave subscribed channels when navigating away from a page.\n  function leaveAllChannels(): void {\n    Object.keys(window.channels).forEach(id => leaveChannel(id));\n  }\n  document.addEventListener(\"turbolinks:before-render\", leaveAllChannels);\n  window.addEventListener(\"beforeunload\", leaveAllChannels);\n}\n\nexport { joinChannel, leaveChannel };\nexport default setupChannels;\n","import React, { ReactElement, useState } from \"react\";\nimport { Alert as AlertType, Lifecycle } from \"../__v3api\";\nimport { handleReactEnterKeyPress } from \"../helpers/keyboard-events-react\";\nimport { caret } from \"../helpers/icon\";\nimport renderSVG from \"../helpers/render-svg\";\nimport shuttleIcon from \"../../static/images/icon-shuttle-default.svg\";\nimport cancelIcon from \"../../static/images/icon-cancelled-default.svg\";\nimport snowIcon from \"../../static/images/icon-snow-default.svg\";\nimport alertIcon from \"../../static/images/icon-alerts-triangle.svg\";\n\ninterface Props {\n  alerts: AlertType[];\n}\n\nconst alertClassNames = (\n  { priority, description }: AlertType,\n  expanded: boolean\n): string => {\n  const classNames = `c-alert-item c-alert-item--${priority}`;\n  if (description) {\n    if (expanded) {\n      return `${classNames} c-alert-item--expandable c-alert-item--open`;\n    }\n    return `${classNames} c-alert-item--expandable c-alert-item--closed`;\n  }\n  return classNames;\n};\n\nexport const iconForAlert = ({\n  priority,\n  effect\n}: AlertType): ReactElement<HTMLElement> | null => {\n  if (priority === \"low\") return null;\n  if (priority === \"system\")\n    return renderSVG(\"c-svg__icon-alerts-triangle\", alertIcon);\n  switch (effect) {\n    case \"suspension\":\n    case \"cancellation\":\n      return renderSVG(\"c-svg__icon-cancelled-default\", cancelIcon);\n    case \"snow_route\":\n      return renderSVG(\"c-svg__icon-snow-default\", snowIcon);\n    case \"shuttle\":\n      return renderSVG(\"c-svg__icon-shuttle-default\", shuttleIcon);\n    default:\n      return renderSVG(\"c-svg__icon-alerts-triangle\", alertIcon);\n  }\n};\n\nconst humanLifecycle = (lifecycle: Lifecycle): string | null => {\n  switch (lifecycle) {\n    case \"new\":\n    case \"unknown\":\n      return null;\n    case \"upcoming\":\n    case \"ongoing_upcoming\":\n      return \"Upcoming\";\n    case \"ongoing\":\n      return \"Ongoing\";\n    default:\n      return null;\n  }\n};\n\nexport const humanLabelForAlert = ({\n  effect,\n  severity,\n  lifecycle\n}: AlertType): string | null => {\n  if (effect === \"delay\") {\n    switch (severity) {\n      case 0:\n      case 1:\n      case 2:\n        return null;\n      case 3:\n        return \"up to 10 minutes\";\n      case 4:\n        return \"up to 15 minutes\";\n      case 5:\n        return \"up to 20 minutes\";\n      case 6:\n        return \"up to 25 minutes\";\n      case 7:\n        return \"up to 30 minutes\";\n      case 8:\n        return \"30+ minutes\";\n      case 9:\n        return \"more than an hour\";\n      default:\n        return humanLifecycle(lifecycle);\n    }\n  }\n  return humanLifecycle(lifecycle);\n};\n\nexport const alertLabel = (alert: AlertType): ReactElement<HTMLElement> => {\n  const alertClasses = [\"u-small-caps\", \"c-alert-item__badge\"];\n  if (alert.priority === \"system\") {\n    alertClasses.push(\"c-alert-item__badge--system\");\n  }\n  if (\n    alert.lifecycle === \"upcoming\" ||\n    alert.lifecycle === \"ongoing_upcoming\"\n  ) {\n    alertClasses.push(\"c-alert-item__badge--upcoming\");\n  }\n  return (\n    <span className={alertClasses.join(\" \")}>{humanLabelForAlert(alert)}</span>\n  );\n};\n\nexport const effectNameForAlert = (alert: AlertType): string =>\n  alert.effect\n    .split(\"_\")\n    .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n    .join(\" \");\n\nconst caretIcon = (\n  noDescription: boolean,\n  expanded: boolean\n): ReactElement<HTMLElement> | null => {\n  if (noDescription) return null;\n  return caret(\"c-expandable-block__header-caret--black\", expanded);\n};\n\nconst alertDescription = (alert: AlertType): ReactElement<HTMLElement> => (\n  <div\n    className={`c-alert-item__bottom c-alert-item__buttom--${alert.priority}`}\n    // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex\n    tabIndex={0}\n    role=\"region\"\n    aria-labelledby={`alert-${alert.id}`}\n    ref={panel => panel && panel.focus()}\n  >\n    <div className=\"c-alert-item__description\">\n      <div\n        // eslint-disable-next-line react/no-danger\n        dangerouslySetInnerHTML={{\n          __html: alert.description\n        }}\n      />\n      <div className=\"c-alert-item__updated\">{alert.updated_at}</div>\n    </div>\n  </div>\n);\n\nexport const Alert = ({\n  alert\n}: {\n  alert: AlertType;\n}): ReactElement<HTMLElement> => {\n  const [expanded, toggleExpanded] = useState(false);\n  const onClick = (): void => toggleExpanded(!expanded);\n\n  const alertUrl = alert.url ? alert.url : \"\";\n\n  // remove [http:// | https:// | www.] from alert URL:\n  let strippedAlertUrl = alertUrl.replace(/(https?:\\/\\/)?(www\\.)?/i, \"\");\n\n  // capitalize 'mbta' (special case):\n  strippedAlertUrl = strippedAlertUrl.replace(/mbta/gi, \"MBTA\");\n\n  const headerContent = alert.url\n    ? `${alert.header}<span>&nbsp;</span><a href=\"${alert.url}\" target=\"_blank\">${strippedAlertUrl}</a>`\n    : alert.header;\n\n  return (\n    <li\n      id={`alert-${alert.id}`}\n      tabIndex={0}\n      className={alertClassNames(alert, expanded)}\n      onClick={onClick}\n      onKeyPress={e => handleReactEnterKeyPress(e, onClick)}\n      aria-expanded={expanded}\n      // eslint-disable-next-line jsx-a11y/no-noninteractive-element-to-interactive-role\n      role=\"button\"\n    >\n      <div className=\"c-alert-item__icon\">{iconForAlert(alert)}</div>\n      <div className=\"c-alert-item__top\">\n        <div className=\"c-alert-item__top-text-container\">\n          <div className=\"c-alert-item__effect\">\n            {`${effectNameForAlert(alert)} `}\n            {humanLabelForAlert(alert) ? alertLabel(alert) : null}\n          </div>\n          {/* eslint-disable-next-line react/no-danger */}\n          <div dangerouslySetInnerHTML={{ __html: headerContent }} />\n        </div>\n        <div className=\"c-alert-item__top-caret-container\">\n          {caretIcon(alert.description === \"\", expanded)}\n        </div>\n      </div>\n      {expanded && alert.description ? alertDescription(alert) : null}\n      {/* No javascript support */}\n      {alert.description ? (\n        <noscript>{alertDescription(alert)}</noscript>\n      ) : null}\n    </li>\n  );\n};\n\nconst Alerts = ({ alerts }: Props): ReactElement<HTMLElement> => (\n  <div className=\"container\">\n    <div className=\"page-section\">\n      <ul className=\"c-alert-group\">\n        {alerts.map((alert: AlertType) => (\n          <Alert key={alert.id} alert={alert} />\n        ))}\n      </ul>\n    </div>\n  </div>\n);\n\nexport default Alerts;\n","import React, { ReactElement, useState } from \"react\";\nimport { isString } from \"lodash\";\nimport { handleReactEnterKeyPress } from \"../helpers/keyboard-events-react\";\nimport renderSvg from \"../helpers/render-svg\";\nimport renderFa from \"../helpers/render-fa\";\nimport { caret } from \"../helpers/icon\";\n\nexport interface ExpandableBlockHeader {\n  text: string | ReactElement<HTMLElement>;\n  iconSvgText: string | null;\n  classOverride?: string;\n}\n\n// If dispatch is provided in Props, the block will not\n// track its own state -- the parent is fully responsible\n// for tracking the expanded/collapsed state.\n// If dispatch is not provided, the block will\n// track its own state.\ninterface Props {\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  dispatch?: React.Dispatch<any>;\n  notifyExpanded?: (isExpanded: boolean) => void;\n  initiallyExpanded: boolean;\n  initiallyFocused?: boolean;\n  header: ExpandableBlockHeader;\n  children: ReactElement<HTMLElement>;\n  id: string;\n  panelClassName?: string;\n  preventScroll?: boolean;\n}\n\ninterface State {\n  expanded: boolean;\n  focused?: boolean;\n}\n\nexport interface ClickExpandableBlockAction {\n  type: \"CLICK_EXPANDABLE_BLOCK\";\n  payload: {\n    expanded: boolean;\n    focused: boolean;\n    id: string;\n  };\n}\n\nconst ExpandableBlock = (props: Props): ReactElement<HTMLElement> => {\n  const {\n    header: { text, iconSvgText, classOverride },\n    dispatch,\n    notifyExpanded,\n    initiallyExpanded,\n    initiallyFocused,\n    children,\n    id,\n    panelClassName,\n    preventScroll\n  } = props;\n\n  const initialState = {\n    expanded: initiallyExpanded,\n    focused: initiallyFocused\n  };\n\n  const action: ClickExpandableBlockAction = {\n    type: \"CLICK_EXPANDABLE_BLOCK\",\n    payload: {\n      expanded: initiallyExpanded === true,\n      focused: initiallyFocused === true,\n      id\n    }\n  };\n\n  const [hookedState, toggleExpanded] = useState(initialState);\n  const { state, onClick } = dispatch\n    ? {\n        state: initialState,\n        onClick: () => dispatch(action)\n      }\n    : {\n        state: hookedState,\n        onClick: () => {\n          const expanded = !hookedState.expanded;\n          toggleExpanded({ expanded, focused: true });\n          if (notifyExpanded) notifyExpanded(expanded);\n        }\n      };\n  const { expanded, focused }: State = state;\n  const headerId = `header-${id}`;\n  const panelId = `panel-${id}`;\n  const iconHelper = iconSvgText?.slice(0, 3) !== \"fa-\" ? renderSvg : renderFa;\n  const classOverrideString = isString(classOverride) ? classOverride : \"\";\n\n  return (\n    <>\n      <h3\n        className={`c-expandable-block__header ${classOverrideString}`}\n        tabIndex={0}\n        id={headerId}\n        aria-expanded={expanded}\n        aria-controls={panelId}\n        // eslint-disable-next-line jsx-a11y/no-noninteractive-element-to-interactive-role\n        role=\"button\"\n        onClick={onClick}\n        onKeyPress={e => handleReactEnterKeyPress(e, onClick)}\n      >\n        {iconSvgText\n          ? iconHelper(\"c-expandable-block__header-icon\", iconSvgText)\n          : null}\n        <div className=\"c-expandable-block__header-text\">\n          {text}\n          {caret(\"c-expandable-block__header-caret\", expanded)}\n        </div>\n      </h3>\n      {expanded ? (\n        <div\n          className={`c-expandable-block__panel ${panelClassName || \"\"}`}\n          // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex\n          tabIndex={0}\n          role=\"region\"\n          id={panelId}\n          aria-labelledby={headerId}\n          ref={panel =>\n            panel &&\n            focused &&\n            panel.focus({\n              preventScroll: !!preventScroll\n            })\n          }\n        >\n          {children}\n        </div>\n      ) : null}\n      {/* No javascript support */}\n      <noscript>\n        <style>{`#${headerId} { display: none; }`}</style>\n        <h3 className=\"c-expandable-block__header\">\n          {iconSvgText\n            ? renderSvg(\"c-expandable-block__header-icon\", iconSvgText)\n            : null}\n          {text}\n          {caret(\"c-expandable-block__header-caret\", true)}\n        </h3>\n        <div className=\"c-expandable-block__panel\" role=\"region\">\n          {children}\n        </div>\n      </noscript>\n    </>\n  );\n};\n\nexport default ExpandableBlock;\n","import React, { ReactElement } from \"react\";\nimport useIsGlxOpen from \"../hooks/useIsGlxOpen\";\nimport renderSvg from \"../helpers/render-svg\";\nimport glxLogo from \"../../static/images/glx-logo.svg\";\n\nconst glxLogoElement = (pageType: string): JSX.Element | null => {\n  if (pageType === \"schedule-finder\") return null;\n\n  return renderSvg(\"glx-logo\", glxLogo);\n};\n\nconst GlxOpen = ({\n  pageType,\n  stopId\n}: {\n  pageType: \"station-page\" | \"schedule-finder\" | \"line-diagram\";\n  stopId: string;\n}): ReactElement<HTMLElement> | null => {\n  const isGlxOpen = useIsGlxOpen(stopId)[0];\n  let textContent;\n\n  if (pageType === \"station-page\") {\n    textContent = \"STATION NOW OPEN\";\n  } else {\n    textContent = \"NOW OPEN\";\n  }\n\n  /* istanbul ignore else */\n  if (isGlxOpen) {\n    return (\n      <div className=\"glx-open-container\">\n        {glxLogoElement(pageType)}\n        <span className=\"glx-open-message\">{textContent}</span>\n      </div>\n    );\n  }\n\n  return null;\n};\n\nexport default GlxOpen;\n","import React, { ReactElement } from \"react\";\n\nconst Loading = (): ReactElement<HTMLElement> => (\n  <div className=\"c-spinner__container\">\n    <div className=\"c-spinner\">Loading...</div>\n  </div>\n);\n\nexport default Loading;\n","import React, { DetailedReactHTMLElement, useEffect, useState } from \"react\";\n\n// React.createElement is used as opposed to the dangerouslySetInnerHTML prop to\n// make the component contents easier to parse in testing\n\ninterface Props {\n  text: string;\n  matchQuery?: string;\n}\n\n// React component for highlighting matching text will wrap the first substring\n// matching the matchQuery in a <b></b> and return the HTML result\nconst MatchHighlight = ({\n  text,\n  matchQuery\n}: Props): DetailedReactHTMLElement<{}, HTMLElement> => {\n  const [childNodes, setChildNodes] = useState<\n    (DetailedReactHTMLElement<{}, HTMLElement> | string)[]\n  >([text]);\n\n  useEffect(() => {\n    if (matchQuery && matchQuery !== \"\") {\n      const matched = text.match(new RegExp(matchQuery, \"i\"));\n      if (matched && matched[0]) {\n        // split text on first instance of match only\n        const [precedingText, ...moreTexts] = text.split(matched[0]);\n        const subsequentText = moreTexts.join(matched[0]);\n        setChildNodes([\n          precedingText,\n          React.createElement(\"b\", { className: \"u-highlight\" }, matched[0]),\n          subsequentText\n        ]);\n      }\n    } else {\n      setChildNodes([text]);\n    }\n  }, [text, matchQuery, setChildNodes]);\n\n  return React.createElement(\"span\", {}, ...childNodes);\n};\n\nexport default MatchHighlight;\n","import React, {\n  MouseEvent,\n  ReactElement,\n  ReactNode,\n  useEffect,\n  useLayoutEffect,\n  useRef\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport createFocusTrap from \"focus-trap\";\nimport { handleReactExitKeyPress } from \"../helpers/keyboard-events-react\";\nimport {\n  AriaLabel,\n  AriaLabelledBy,\n  labelOrDescribedBy\n} from \"../helpers/aria-props\";\n\ninterface Props {\n  children: ReactNode;\n  closeText?: string | ReactElement<HTMLElement>;\n  role?: \"dialog\" | \"alertdialog\";\n  ariaLabel: AriaLabel | AriaLabelledBy;\n  focusElementId?: string; // a selector string to the DOM node that will receive focus when the model is first opened\n  className?: string;\n  closeModal: () => void;\n}\n\ninterface ModalContentProps {\n  children: ReactNode;\n  closeText: string | ReactElement<HTMLElement>;\n  role: string;\n  ariaLabel: AriaLabel | AriaLabelledBy;\n  closeModal: () => void;\n  focusElementId: string;\n  bodyPadding: string;\n  scrollBarPadding: number;\n  className?: string;\n}\n\nconst ModalContent = ({\n  children,\n  closeText,\n  closeModal,\n  role,\n  ariaLabel,\n  focusElementId,\n  bodyPadding,\n  scrollBarPadding,\n  className = \"\"\n}: ModalContentProps): ReactElement<HTMLElement> => {\n  const asideRef = useRef<HTMLElement>(null);\n  const onClickAway = (e: MouseEvent): void => {\n    if (e.target === asideRef.current) closeModal();\n  };\n\n  // In Chrome (and others?), swapping out the modal content doesn't reset the\n  // scroll position. Here we reset it manually whenever the content changes.\n  const scrollRef = useRef<HTMLDivElement>(null);\n  useEffect(() => {\n    if (scrollRef.current && scrollRef.current.scrollTo) {\n      scrollRef.current.scrollTo({ top: 0 });\n    }\n  }, [children]);\n\n  useEffect(() => {\n    document.addEventListener(\"turbolinks:before-visit\", closeModal, {\n      passive: true\n    });\n\n    return () =>\n      document.removeEventListener(\"turbolinks:before-visit\", closeModal);\n  }, [closeModal]);\n\n  useLayoutEffect(() => {\n    // Activate trap and disable scroll on background body\n    const trap = createFocusTrap(\"#modal-cover\", {\n      initialFocus: `#${focusElementId}`,\n      clickOutsideDeactivates: true\n    });\n    trap.activate();\n\n    const bodyWrapper = document.getElementById(\"body-wrapper\");\n    if (bodyWrapper) {\n      // aria-hidden for mobile devices where we want to emulate \"focus\" behavior\n      bodyWrapper.setAttribute(\"aria-hidden\", \"true\");\n      document.body.classList.add(\"modal-open\");\n      bodyWrapper.style.paddingRight = `${scrollBarPadding}px`;\n    }\n\n    // Deactivate\n    return () => {\n      if (bodyWrapper) {\n        bodyWrapper.setAttribute(\"aria-hidden\", \"false\");\n        document.body.classList.remove(\"modal-open\");\n        bodyWrapper.style.paddingRight = bodyPadding;\n      }\n      trap.deactivate();\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n\n  return createPortal(\n    // This does have a role\n    // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions\n    <aside\n      ref={asideRef}\n      aria-modal\n      {...labelOrDescribedBy(ariaLabel)}\n      role={role}\n      id=\"modal-cover\"\n      className=\"c-modal__cover\"\n      tabIndex={-1}\n      onKeyDown={e => handleReactExitKeyPress(e, closeModal)}\n      onClick={e => onClickAway(e)}\n    >\n      <div ref={scrollRef} className={`c-modal ${className}`}>\n        <button\n          id=\"modal-close\"\n          className=\"btn btn-secondary c-modal__close\"\n          onClick={() => closeModal()}\n          type=\"button\"\n        >\n          {closeText}\n        </button>\n        <div className=\"c-modal__content\">{children}</div>\n      </div>\n    </aside>,\n    document.body\n  );\n};\n\ninterface ModalWithNoScrollProps extends Props {\n  priorPadding: string;\n  paddingRight: number;\n}\n\nconst Modal = ({\n  children,\n  closeText = \"Close\",\n  role = \"dialog\",\n  ariaLabel,\n  focusElementId = \"modal-close\",\n  priorPadding,\n  paddingRight,\n  className,\n  closeModal\n}: ModalWithNoScrollProps): ReactElement<HTMLElement> | null => (\n  <ModalContent\n    bodyPadding={priorPadding}\n    scrollBarPadding={paddingRight}\n    closeText={closeText}\n    role={role}\n    ariaLabel={ariaLabel}\n    focusElementId={focusElementId}\n    className={className}\n    closeModal={closeModal}\n  >\n    {children}\n  </ModalContent>\n);\n\n// Wrap modal to account for disabling scroll bar on background body\nconst WrappedModal = (props: Props): ReactElement<HTMLElement> | null => {\n  if (typeof document !== \"undefined\") {\n    const bodyWrapper = document.getElementById(\"body-wrapper\");\n    const priorPadding =\n      (bodyWrapper && bodyWrapper.style.paddingRight) || \"0px\";\n    const paddingRight = bodyWrapper\n      ? window.innerWidth - bodyWrapper.clientWidth\n      : 0;\n    return (\n      <Modal\n        {...props}\n        priorPadding={priorPadding}\n        paddingRight={paddingRight}\n      />\n    );\n  }\n  /* istanbul ignore next */\n  return null;\n};\n\nexport default WrappedModal;\n","import React, { ReactElement, useState, useEffect } from \"react\";\nimport { searchIcon } from \"../helpers/icon\";\n\ninterface Props {\n  id: string;\n  labelText: string;\n  onChange: (q: string) => void;\n  placeholder?: string;\n  className?: string;\n}\n\nconst SearchBox = ({\n  id,\n  labelText,\n  onChange,\n  placeholder,\n  className\n}: Props): ReactElement<HTMLElement> | null => {\n  const [query, setQuery] = useState(\"\");\n\n  useEffect(() => {\n    onChange(query);\n  }, [query, onChange]);\n\n  return (\n    <div className={`${className} c-form__input-container`}>\n      <label htmlFor={id} className=\"sr-only\">\n        {labelText}\n      </label>\n      <input\n        className=\"c-form__input\"\n        id={id}\n        type=\"text\"\n        onChange={event => {\n          setQuery(event.target.value);\n        }}\n        value={query}\n        placeholder={placeholder || labelText}\n      />\n      {query !== \"\" && (\n        <button\n          className=\"c-form__reset-btn btn-link\"\n          aria-label=\"reset\"\n          type=\"button\"\n          onClick={() => {\n            setQuery(\"\");\n          }}\n        >\n          <i\n            aria-hidden=\"true\"\n            className=\"c-form__reset-icon fa fa-times-circle\"\n          />\n        </button>\n      )}\n      <button\n        className=\"c-form__submit-btn\"\n        aria-label=\"search\"\n        type=\"button\"\n        onClick={() => {\n          setQuery(query);\n        }}\n      >\n        {searchIcon(\"c-svg__icon-search-reverse-default\")}\n      </button>\n    </div>\n  );\n};\n\nexport default SearchBox;\n","export type AriaLabelling = AriaLabel | AriaLabelledBy;\n\nexport interface AriaLabel {\n  label: string;\n}\n\nexport interface AriaLabelledBy {\n  elementId: string;\n}\n\ninterface AriaLabelProp {\n  \"aria-label\": string;\n}\n\ninterface AriaLabelledByProp {\n  \"aria-labelledby\": string;\n}\n\nconst isLabel = (label: AriaLabelling): label is AriaLabel =>\n  (label as AriaLabel).label !== undefined;\n\nexport const labelOrDescribedBy = (\n  label: AriaLabel | AriaLabelledBy\n): AriaLabelProp | AriaLabelledByProp => {\n  if (isLabel(label)) {\n    return { \"aria-label\": label.label };\n  }\n  return { \"aria-labelledby\": label.elementId };\n};\n","import {\n  isABusRoute,\n  isACommuterRailRoute,\n  isAGreenLineRoute,\n  isASilverLineRoute\n} from \"../models/route\";\nimport { Route } from \"../__v3api\";\n\nexport const routeToCSSClass = (route: string): string =>\n  route.toLowerCase().replace(/[ _]/g, \"-\");\n\nexport const busClass = (route: Route): string =>\n  isABusRoute(route) && !isASilverLineRoute(route) ? \"bus-route-sign\" : \"\";\n\nexport const routeToModeName = (route: Route): string => {\n  if (isACommuterRailRoute(route)) return \"commuter-rail\";\n  if (route.type === 4) return \"ferry\";\n  if (route.id === \"Red\" || route.id === \"Mattapan\") return \"red-line\";\n  if (route.id === \"Orange\") return \"orange-line\";\n  if (route.id === \"Blue\") return \"blue-line\";\n  if (isAGreenLineRoute(route)) return \"green-line\";\n  if (isASilverLineRoute(route)) return \"silver-line\";\n  if (isABusRoute(route)) return \"bus\";\n  return \"unknown\";\n};\n\nexport const routeBgClass = (route: Route): string =>\n  `u-bg--${routeToModeName(route)}`;\n","import { getMinutes, parseISO } from \"date-fns\";\nimport { formatInTimeZone } from \"date-fns-tz\";\n\n// this returns a Date() in the browser time zone, unlike new Date(unformatted)\nexport const stringToDateObject = (unformatted: string): Date => {\n  const [year, month, day] = unformatted\n    .split(/-/)\n    .map(part => Number.parseInt(part, 10));\n\n  // Remember that months in JS are 0-indexed for some reason, hence \"month - 1\".\n  const parsedDate = new Date(year, month - 1, day);\n  return parsedDate;\n};\n\n// Returns a date in the form of \"2019-08-07\"\nexport const dateObjectToString = (date: Date): string =>\n  [\n    date.getFullYear(),\n    `0${date.getMonth() + 1}`.slice(-2),\n    `0${date.getDate()}`.slice(-2)\n  ].join(\"-\");\n\n// Returns a date in the form of \"August 7, 2019\"\nexport const formattedDate = (unformatted: string): string => {\n  const parsedDate = stringToDateObject(unformatted);\n  return parsedDate.toLocaleDateString(\"en-US\", {\n    year: \"numeric\",\n    month: \"long\",\n    day: \"numeric\",\n    timeZone: \"UTC\"\n  });\n};\n\n// Returns a date in the form of \"Aug 7\"\nexport const shortDate = (date: Date): string =>\n  date.toLocaleDateString(\"en-US\", {\n    month: \"short\",\n    day: \"numeric\",\n    timeZone: \"UTC\"\n  });\n\nexport const compareStringTimes = (\n  timeStr1: string[],\n  timeStr2: string[]\n): string => {\n  const today = new Date();\n  const dateFormatted = new Intl.DateTimeFormat(\"en-US\").format(today);\n\n  const fullDate1 = `${dateFormatted} ${timeStr1.join(\"\")}`; // \"11/24/2013 2:10 PM\"\n  const fullDate2 = `${dateFormatted} ${timeStr2.join(\"\")}`;\n\n  const timeInMs1 = new Date(fullDate1).getTime();\n  const timeInMs2 = new Date(fullDate2).getTime();\n\n  let comparison = \"eq\";\n  if (timeInMs1 < timeInMs2) {\n    comparison = \"lt\";\n  } else if (timeInMs1 > timeInMs2) {\n    comparison = \"gt\";\n  }\n  return comparison;\n};\n\nexport const formatToBostonTime = (dateTimeString: string): string => {\n  const dateTime = parseISO(dateTimeString);\n  let formatString = \"h:mm aa\"; // 5:00 AM\n  if (getMinutes(dateTime) === 0) {\n    formatString = \"h aa\"; // 5 AM\n  }\n  return formatInTimeZone(dateTime, \"America/New_York\", formatString);\n};\n\nexport default formattedDate;\n","export const isFetchFailed = <T>(r: FetchResult<T>): r is FetchFailed =>\n  r && typeof r === \"object\" && \"statusText\" in r;\n\nexport const throwIfFetchFailed = <T>(result: FetchResult<T>): T => {\n  if (isFetchFailed(result)) {\n    throw new Error(`Fetch failed: ${result}`);\n  }\n\n  return result;\n};\n\nexport type FetchFailed = Response;\nexport type FetchResult<T> = T | FetchFailed;\nexport const fetchJson = async <T>(\n  ...args: Parameters<typeof fetch>\n): Promise<FetchResult<T>> => {\n  const resp = await fetch(...args);\n  if (!resp.ok) {\n    return resp;\n  }\n\n  return resp.json();\n};\n\nexport const fetchJsonOrThrow = async <T>(\n  ...args: Parameters<typeof fetch>\n): Promise<T> => fetchJson<T>(...args).then(throwIfFetchFailed);\n","export type fetchAction =\n  // @ts-ignore should add a generic here\n  | { type: \"FETCH_COMPLETE\"; payload: any } // eslint-disable-line\n  | { type: \"FETCH_ERROR\" }\n  | { type: \"FETCH_STARTED\" };\n\nexport interface State {\n  // @ts-ignore should add a generic\n  data: any | null; // eslint-disable-line\n  isLoading: boolean;\n  error: boolean;\n}\n\nexport const reducer = (state: State, action: fetchAction): State => {\n  switch (action.type) {\n    case \"FETCH_STARTED\":\n      return { ...state, isLoading: true, error: false, data: null };\n    case \"FETCH_COMPLETE\":\n      return { ...state, data: action.payload, isLoading: false, error: false };\n    case \"FETCH_ERROR\":\n      return { ...state, error: true, isLoading: false };\n    default:\n      return state;\n  }\n};\n","import React, { ReactElement } from \"react\";\nimport renderSvg from \"./render-svg\";\nimport { isASilverLineRoute } from \"../models/route\";\nimport accessibleIconSvg from \"../../static/images/icon-accessible-small.svg\";\nimport alertIconSvg from \"../../static/images/icon-alerts-triangle.svg\";\nimport blueLineIconSvg from \"../../static/images/icon-blue-line-default.svg\";\nimport busIconSvg from \"../../static/images/icon-mode-bus-small.svg\";\nimport commuterRailIconSvg from \"../../static/images/icon-mode-commuter-rail-small.svg\";\nimport ferryIconSvg from \"../../static/images/icon-mode-ferry-small.svg\";\nimport genericSubwayIconSvg from \"../../static/images/icon-mode-subway-default.svg\";\nimport greenLineIconSvg from \"../../static/images/icon-green-line-small.svg\";\nimport greenBLineIconSvg from \"../../static/images/icon-green-line-b-small.svg\";\nimport greenCLineIconSvg from \"../../static/images/icon-green-line-c-small.svg\";\nimport greenDLineIconSvg from \"../../static/images/icon-green-line-d-small.svg\";\nimport greenELineIconSvg from \"../../static/images/icon-green-line-e-small.svg\";\nimport mattapanLineIconSvg from \"../../static/images/icon-mattapan-line-small.svg\";\nimport orangeLineIconSvg from \"../../static/images/icon-orange-line-small.svg\";\nimport redLineIconSvg from \"../../static/images/icon-red-line-small.svg\";\nimport silverLineIconSvg from \"../../static/images/icon-silver-line-small.svg\";\nimport vehicleArrowSvg from \"../../static/images/icon-vehicle-bordered-expanded.svg\";\nimport searchIconSvg from \"../../static/images/icon-search-reverse-default.svg\";\nimport crowdingIconSvg from \"../../static/images/icon-crowding.svg\";\nimport renderFa from \"./render-fa\";\n\nexport const accessibleIcon = (className: string = \"\"): JSX.Element =>\n  renderSvg(className, accessibleIconSvg, false);\n\nexport const alertIcon = (className: string = \"\"): JSX.Element =>\n  renderSvg(className, alertIconSvg, false);\n\nexport const blueLineIcon = (className: string = \"\"): JSX.Element =>\n  renderSvg(className, blueLineIconSvg, false);\n\nexport const busIcon = (className: string = \"\"): JSX.Element =>\n  renderSvg(className, busIconSvg, false);\n\nexport const commuterRailIcon = (className: string = \"\"): JSX.Element =>\n  renderSvg(className, commuterRailIconSvg, false);\n\nexport const ferryIcon = (className: string = \"\"): JSX.Element =>\n  renderSvg(className, ferryIconSvg, false);\n\nexport const genericSubwayIcon = (className: string = \"\"): JSX.Element =>\n  renderSvg(className, genericSubwayIconSvg, false);\n\nexport const greenLineIcon = (className: string = \"\"): JSX.Element =>\n  renderSvg(className, greenLineIconSvg, false);\n\nexport const greenBLineIcon = (className: string = \"\"): JSX.Element =>\n  renderSvg(className, greenBLineIconSvg, false);\n\nexport const greenCLineIcon = (className: string = \"\"): JSX.Element =>\n  renderSvg(className, greenCLineIconSvg, false);\n\nexport const greenDLineIcon = (className: string = \"\"): JSX.Element =>\n  renderSvg(className, greenDLineIconSvg, false);\n\nexport const greenELineIcon = (className: string = \"\"): JSX.Element =>\n  renderSvg(className, greenELineIconSvg, false);\n\nexport const mattapanLineIcon = (className: string = \"\"): JSX.Element =>\n  renderSvg(className, mattapanLineIconSvg, false);\n\nexport const orangeLineIcon = (className: string = \"\"): JSX.Element =>\n  renderSvg(className, orangeLineIconSvg, false);\n\nexport const parkingIcon = (className: string = \"\"): JSX.Element =>\n  renderFa(className, \"fa-square-parking\", false);\n\nexport const redLineIcon = (className: string = \"\"): JSX.Element =>\n  renderSvg(className, redLineIconSvg, false);\n\nexport const silverLineIcon = (className: string = \"\"): JSX.Element =>\n  renderSvg(className, silverLineIconSvg, false);\n\nexport const vehicleArrowIcon = (className: string = \"\"): JSX.Element =>\n  renderSvg(className, vehicleArrowSvg, false);\n\nexport const searchIcon = (className: string = \"\"): JSX.Element =>\n  renderSvg(className, searchIconSvg, false);\n\nexport const modeIcon = (routeId: string): JSX.Element | undefined => {\n  if (routeId.startsWith(\"CR-\")) return commuterRailIcon(\"c-svg__icon\");\n  if (routeId.startsWith(\"Boat-\")) return ferryIcon(\"c-svg__icon\");\n  if (routeId === \"Blue\") return blueLineIcon(\"c-svg__icon\");\n  if (routeId === \"Green\") return greenLineIcon(\"c-svg__icon\");\n  if (routeId === \"Green-B\") return greenBLineIcon(\"c-svg__icon\");\n  if (routeId === \"Green-C\") return greenCLineIcon(\"c-svg__icon\");\n  if (routeId === \"Green-D\") return greenDLineIcon(\"c-svg__icon\");\n  if (routeId === \"Green-E\") return greenELineIcon(\"c-svg__icon\");\n  if (routeId === \"Mattapan\") return mattapanLineIcon(\"c-svg__icon\");\n  if (routeId === \"Orange\") return orangeLineIcon(\"c-svg__icon\");\n  if (routeId === \"Red\") return redLineIcon(\"c-svg__icon\");\n  if (isASilverLineRoute(routeId)) return silverLineIcon(\"c-svg__icon\");\n\n  return busIcon(\"c-svg__icon-bus-small\");\n};\n\nexport const caret = (\n  className: string,\n  expanded: boolean\n): ReactElement<HTMLElement> => {\n  const unicodeCharacter = expanded ? \"&#xF106;\" : \"&#xF107;\";\n  return (\n    <span\n      className={`fa ${className}`}\n      // eslint-disable-next-line react/no-danger\n      dangerouslySetInnerHTML={{ __html: unicodeCharacter }}\n    />\n  );\n};\n\n/*\nA minimal component that gives its child component\na basic tooltip containing the specified text. Has no\nvisual appearance itself.\n\nNote: data-selector=\"true\" and data-original-title are\nspecified here in order to preserve `title` text post-trigger\n*/\n\n// Corresponds to Bootstrap's tooltip options\ninterface TooltipOptions {\n  animation?: boolean;\n  container?: string | HTMLElement | false;\n  delay?: number | object;\n  html?: boolean;\n  placement?: string | Function;\n  selector?: string;\n  template?: string;\n  title?: string | HTMLElement | Function;\n  trigger?: string;\n  constraints?: [];\n  offset?: string;\n}\n\nconst defaultTooltipOptions: TooltipOptions = {\n  animation: true,\n  html: false,\n  placement: \"top\",\n  trigger: \"hover focus\"\n};\n\nexport const TooltipWrapper: React.FC<{\n  children: JSX.Element;\n  tooltipText: string;\n  tooltipOptions?: TooltipOptions;\n  href?: string;\n}> = ({ children, tooltipText, tooltipOptions, href }): JSX.Element => {\n  const options = Object.assign({}, defaultTooltipOptions, tooltipOptions);\n\n  const Tag = href ? \"a\" : \"span\";\n\n  return (\n    <Tag\n      href={href}\n      data-toggle=\"tooltip\"\n      data-trigger={options.trigger}\n      data-placement={options.placement}\n      data-animation={options.animation}\n      data-html={options.html}\n      data-selector=\"true\"\n      data-original-title={tooltipText}\n    >\n      {children}\n    </Tag>\n  );\n};\n\nexport const crowdingIcon = (className: string = \"\"): JSX.Element =>\n  renderSvg(`c-svg__icon c-icon__crowding ${className}`, crowdingIconSvg, true);\n","import { KeyboardEvent as ReactKeyboardEvent } from \"react\";\n\n// for React\nexport const handleReactEnterKeyPress = (\n  e: ReactKeyboardEvent,\n  onClick: Function\n): void => {\n  if (e.key === \"Enter\") {\n    onClick();\n  }\n};\n\nexport const handleReactExitKeyPress = (\n  e: ReactKeyboardEvent,\n  onClick: Function\n): void => {\n  if (e.key === \"Escape\") {\n    onClick();\n  }\n};\n","export const isEnter = (key: number | string): boolean =>\n  key === \"Enter\" || key === 13;\n\nexport const isEscape = (key: number | string): boolean =>\n  key === \"Escape\" || key === 27;\n\n// for vanilla JS\nexport const handleNativeEnterKeyPress = (\n  e: KeyboardEvent,\n  cb: Function\n): void => (isEnter(e.key || e.keyCode) ? cb(e) : () => {});\n\nexport const handleNativeEscapeKeyPress = (\n  e: KeyboardEvent,\n  cb: Function\n): void => (isEscape(e.key || e.keyCode) ? cb(e) : () => {});\n","import React, { ReactElement } from \"react\";\nimport { PredictedOrScheduledTime } from \"../__v3api\";\nimport { isSkippedOrCancelled } from \"../models/prediction\";\nimport { TripPrediction } from \"../schedule/components/__trips\";\nimport { compareStringTimes } from \"./date\";\n\nconst delayForCommuterRail = (\n  data: PredictedOrScheduledTime,\n  className = \"\"\n): ReactElement<HTMLElement> => (\n  <>\n    <div className={`${className ? `${className}--delayed` : \"\"}`}>\n      {data.scheduled_time!.join(\"\")}\n    </div>\n    <div className={className}>\n      {data.prediction && data.prediction.time.join(\"\")}\n    </div>\n  </>\n);\n\nexport const timeForCommuterRail = (\n  data: PredictedOrScheduledTime,\n  className = \"\"\n): ReactElement<HTMLElement> => {\n  const { delay, prediction, scheduled_time: scheduledTime } = data;\n\n  if (delay >= 5 && prediction) {\n    return delayForCommuterRail(data, className);\n  }\n\n  let time = prediction ? prediction.time : scheduledTime;\n\n  // when 'On time', show the scheduled time only if it's later than the predicted time:\n  if (\n    scheduledTime &&\n    prediction &&\n    prediction.time[2] !== \"min\" &&\n    compareStringTimes(prediction.time, scheduledTime) === \"lt\"\n  ) {\n    // \"On time\"\n    time = scheduledTime;\n  }\n\n  return <div className={className}>{time!.join(\"\")}</div>;\n};\n\nexport const statusForCommuterRail = ({\n  delay,\n  scheduled_time: scheduledTime,\n  prediction\n}: PredictedOrScheduledTime): string | null => {\n  // If there is a human-entered status string, prioritize that\n  if (prediction && prediction.status) return prediction.status;\n\n  if (isSkippedOrCancelled((prediction as unknown) as TripPrediction))\n    return \"Canceled\";\n\n  // Indicate \"Delayed\" if train is delayed 5+ minutes\n  if (delay >= 5) return `Delayed ${delay} min`;\n\n  // Indicate \"On time\" if train otherwise has a prediction\n  // Indicate \"Scheduled\" if train is not \"Delayed\" and we have a scheduled time\n  // (even if there is no real-time prediction)\n  if (scheduledTime && prediction) return \"On time\";\n  if (scheduledTime) return \"Scheduled\";\n\n  // We have just a prediction with no scheduled time, so we can't say whether\n  // the train is on time, delayed, etc.\n  return null;\n};\n\nexport const trackForCommuterRail = ({\n  prediction\n}: PredictedOrScheduledTime): string =>\n  prediction && prediction.track ? ` track ${prediction.track}` : \"\";\n","import React from \"react\";\n\nconst FontAwesomeIcon = (\n  className: string,\n  svgName: string,\n  ariaHide: boolean = true\n): JSX.Element => (\n  <i\n    className={\n      className\n        ? `fa ${svgName} notranslate ${className}`\n        : `fa ${svgName} notranslate`\n    }\n    aria-hidden={ariaHide ? \"true\" : \"false\"}\n  />\n);\n\nexport default FontAwesomeIcon;\n","import React from \"react\";\n\nconst SVGIcon = (\n  className: string,\n  svgText: string,\n  ariaHide: boolean = true\n): JSX.Element => (\n  <span\n    className={className ? `notranslate ${className}` : \"notranslate\"}\n    aria-hidden={ariaHide ? \"true\" : \"false\"}\n    // eslint-disable-next-line react/no-danger\n    dangerouslySetInnerHTML={{ __html: svgText }}\n  />\n);\n\nexport default SVGIcon;\n","import { RouteStop } from \"../schedule/components/__schedule\";\nimport { RouteWithDirection, TypedRoutes } from \"../stop/components/__stop\";\nimport { isABusRoute } from \"../models/route\";\nimport { Route } from \"../__v3api\";\n\nexport function isBusRouteStop(stop: RouteStop): boolean {\n  return !!stop.route && isABusRoute(stop.route);\n}\n\nexport function routesWithDirectionsAreAllBusStops(\n  routes: RouteWithDirection[]\n): boolean {\n  return (\n    routes.length > 0 &&\n    routes.reduce((acc: boolean, r) => isABusRoute(r.route) && acc, true)\n  );\n}\n\nexport function typedRoutesHasBusRoute(routes: TypedRoutes[]): boolean {\n  return !!routes.find(r => r.group_name === \"bus\");\n}\n\nexport function routesHasBusRoute(routes: Route[]): boolean {\n  return !!routes.find(r => isABusRoute(r));\n}\n","import _, { Dictionary } from \"lodash\";\nimport {\n  Service,\n  DayInteger,\n  ServiceType,\n  ServiceTypicality\n} from \"../__v3api\";\nimport { shortDate, stringToDateObject, dateObjectToString } from \"./date\";\n\nexport enum ServiceGroupNames {\n  HOLIDAY = \"Holiday Schedules\",\n  CURRENT = \"Current Schedules\",\n  FUTURE = \"Future Schedules\",\n  OTHER = \"Other Schedules\"\n}\n\nexport const serviceStartDateComparator = (\n  service1: Service,\n  service2: Service\n): number =>\n  stringToDateObject(service1.start_date).getTime() -\n  stringToDateObject(service2.start_date).getTime();\n\nconst isInRemovedDates = (service: Service, currentDate: Date): boolean =>\n  service.removed_dates.includes(dateObjectToString(currentDate));\n\nconst isInAddedDates = (service: Service, currentDate: Date): boolean =>\n  service.added_dates.includes(dateObjectToString(currentDate));\n\nconst isOnValidDay = (service: Service, currentDate: Date): boolean => {\n  let currentDay = currentDate.getDay();\n  // different numbering from valid_days for sunday\n  currentDay = currentDay === 0 ? 7 : currentDay;\n  return service.valid_days.includes(currentDay as DayInteger);\n};\n\nexport const isInCurrentService = (\n  service: Service,\n  currentDate: Date\n): boolean => {\n  const serviceStartDate = stringToDateObject(service.start_date);\n  const serviceEndDate = stringToDateObject(service.end_date);\n  return (\n    isInAddedDates(service, currentDate) ||\n    (currentDate >= serviceStartDate && currentDate <= serviceEndDate)\n  );\n};\n\nexport const isInCurrentRating = (\n  service: Service,\n  currentDate: Date\n): boolean => {\n  if (!service.rating_start_date) {\n    return false;\n  }\n  const ratingStartDate = stringToDateObject(service.rating_start_date!);\n  if (!service.rating_end_date) {\n    // this might be a commuter rail or ferry. treat null rating end as infinite?\n    return currentDate >= ratingStartDate;\n  }\n  const ratingEndDate = stringToDateObject(service.rating_end_date!);\n  return currentDate >= ratingStartDate && currentDate <= ratingEndDate;\n};\n\nexport const isCurrentValidService = (\n  service: Service,\n  currentDate: Date\n): boolean => {\n  // check against added dates\n  if (isInAddedDates(service, currentDate)) {\n    return true;\n  }\n\n  // check against removed dates\n  if (isInRemovedDates(service, currentDate)) {\n    return false;\n  }\n\n  // check on valid_days\n  if (!isOnValidDay(service, currentDate)) {\n    return false;\n  }\n\n  // check within rating dates\n  return isInCurrentRating(service, currentDate);\n};\n\nexport const startToEnd = (\n  startDateObject: Date,\n  endDateObject: Date\n): string => `${shortDate(startDateObject)} to ${shortDate(endDateObject)}`;\n\nexport const isInFutureService = (\n  service: Service,\n  currentDate: Date\n): boolean => {\n  const serviceStartDate = stringToDateObject(service.start_date);\n  const serviceEndDate = stringToDateObject(service.end_date);\n  return currentDate < serviceStartDate && currentDate < serviceEndDate;\n};\n\nexport const isInFutureRating = (\n  service: Service,\n  currentDate: Date\n): boolean => {\n  if (!service.rating_end_date) {\n    if (service.rating_start_date) {\n      return currentDate < stringToDateObject(service.rating_start_date!);\n    }\n    return false;\n  }\n\n  const ratingStartDate = stringToDateObject(service.rating_start_date!);\n  const ratingEndDate = stringToDateObject(service.rating_end_date!);\n  return currentDate < ratingStartDate && currentDate < ratingEndDate;\n};\n\nconst areSimilarServices = (service1: Service, service2: Service): boolean => {\n  const properties = [\n    \"valid_days\",\n    \"typicality\",\n    \"type\",\n    \"rating_start_date\",\n    \"rating_end_date\",\n    \"name\",\n    \"description\"\n  ];\n  return _.every(properties, (p: keyof Service) =>\n    _.isEqual(service2[p], service1[p])\n  );\n};\n\n// If two similar services are present, show only one. Choose the first\n// sequentially (this depends on the input list already being sorted by\n// start_date).\nexport const dedupeServices = (services: Service[]): Service[] =>\n  _.uniqWith(services, areSimilarServices);\n\nexport const groupServicesByDateRating = (\n  services: Service[],\n  currentDate: Date\n): Dictionary<Service[]> =>\n  _.groupBy(services, (service: Service) => {\n    if (service.typicality === \"holiday_service\") {\n      return ServiceGroupNames.HOLIDAY;\n    }\n\n    if (service.type === \"other\") {\n      return ServiceGroupNames.OTHER;\n    }\n\n    // if there's no rating end date, this is probably a CR or Ferry\n    // don't use the rating dates in the returned text in that case.\n    // additionally, prioritize current service/rating in grouping\n    if (!service.rating_end_date) {\n      if (\n        isInCurrentService(service, currentDate) ||\n        isInCurrentRating(service, currentDate)\n      ) {\n        return ServiceGroupNames.CURRENT;\n      }\n      if (isInFutureRating(service, currentDate)) {\n        return ServiceGroupNames.FUTURE;\n      }\n    }\n\n    const ratingStartDate = stringToDateObject(service.rating_start_date!);\n    const ratingEndDate = stringToDateObject(service.rating_end_date!);\n\n    if (isInCurrentRating(service, currentDate)) {\n      return `${ServiceGroupNames.CURRENT} (${\n        service.rating_description\n      }, ends ${shortDate(ratingEndDate)})`;\n    }\n\n    if (isInFutureRating(service, currentDate)) {\n      return `${ServiceGroupNames.FUTURE} (${\n        service.rating_description\n      }, starts ${shortDate(ratingStartDate)})`;\n    }\n\n    return ServiceGroupNames.OTHER;\n  });\n\n// sort the option groups\nconst optGroupOrder: { [key: string]: number } = {\n  [ServiceGroupNames.CURRENT]: 4,\n  [ServiceGroupNames.HOLIDAY]: 3,\n  [ServiceGroupNames.FUTURE]: 2,\n  [ServiceGroupNames.OTHER]: 1\n};\n\n// sort the service types\nconst serviceTypeOrder: { [key in ServiceType]: number } = {\n  weekday: 4,\n  saturday: 3,\n  sunday: 2,\n  other: 1\n};\n\n/* eslint-disable camelcase */\n// sort the service typicalities\nconst serviceTypicalityOrder: { [key in ServiceTypicality]: number } = {\n  unplanned_disruption: 4,\n  planned_disruption: 3,\n  holiday_service: 2,\n  extra_service: 1,\n  typical_service: 0,\n  unknown: 0\n};\n/* eslint-enable camelcase */\n\n// enable sorting of services by rating dates,\n// service type, service typicality, and service dates\nexport const serviceComparator = (\n  {\n    type: type1,\n    valid_days: validDays1,\n    typicality: typicality1,\n    start_date: date1\n  }: Service,\n  {\n    type: type2,\n    valid_days: validDays2,\n    typicality: typicality2,\n    start_date: date2\n  }: Service\n): number =>\n  serviceTypeOrder[type2] - serviceTypeOrder[type1] ||\n  validDays1[0] - validDays2[0] ||\n  serviceTypicalityOrder[typicality2] - serviceTypicalityOrder[typicality1] ||\n  stringToDateObject(date1).getTime() - stringToDateObject(date2).getTime();\n\n// group names may have extra verbiage\nexport const optGroupComparator = (groupA: string, groupB: string): number => {\n  const optGroupNames = Object.values(ServiceGroupNames);\n  const a = optGroupNames.find(name => groupA.includes(name));\n  const b = optGroupNames.find(name => groupB.includes(name));\n  return optGroupOrder[b!] - optGroupOrder[a!];\n};\n\nexport const hasMultipleWeekdaySchedules = (services: Service[]): boolean =>\n  services.filter(\n    service =>\n      service.type === \"weekday\" && service.typicality !== \"holiday_service\"\n  ).length > 1;\n\nconst dayIntegerToString = (day: DayInteger): string =>\n  [\n    \"Monday\",\n    \"Tuesday\",\n    \"Wednesday\",\n    \"Thursday\",\n    \"Friday\",\n    \"Saturday\",\n    \"Sunday\"\n  ][day - 1];\n\nconst daysAreConsecutive = (days: DayInteger[]): boolean => {\n  const [day, nextDay, ...rest] = days;\n  if (rest.length === 0) return day + 1 === nextDay;\n  if (day + 1 !== nextDay) return false;\n  return daysAreConsecutive([nextDay, ...rest]);\n};\n\nexport const serviceDays = ({\n  type,\n  valid_days: validDays\n}: Service): string => {\n  if (type === \"saturday\" || type === \"sunday\") return \"\";\n\n  if (validDays.length === 1) return `${dayIntegerToString(validDays[0])}`;\n\n  if (daysAreConsecutive(validDays)) {\n    return validDays[0] === 1 && validDays[validDays.length - 1] === 5\n      ? \"Weekday\"\n      : `${dayIntegerToString(validDays[0])} - ${dayIntegerToString(\n          validDays[validDays.length - 1]\n        )}`;\n  }\n\n  return `${validDays.map(dayIntegerToString).join(\", \")}`;\n};\n","import { isEmpty } from \"lodash\";\nimport {\n  RouteStop,\n  StopId,\n  StopTree,\n  StopTreeEdges,\n  StopTreeNode,\n  StopTreePath,\n  StopTreeSlice\n} from \"../schedule/components/__schedule\";\n\nexport const nodeForId = (stopTree: StopTree, id: StopId): StopTreeNode =>\n  stopTree.byId[id];\nexport const edgesForId = (stopTree: StopTree, id: StopId): StopTreeEdges =>\n  stopTree.edges[id];\nexport const startingNodes = (stopTree: StopTree): StopId[] =>\n  stopTree.startingNodes;\n\nexport const stopIds = (stopTree: StopTree): StopId[] =>\n  Object.keys(stopTree.byId);\n\nexport const nodeId = (node: StopTreeNode): StopId => node.id;\nexport const nodeValue = (node: StopTreeNode): RouteStop => node.value;\n\nexport const nextEdges = (edges: StopTreeEdges): StopId[] => edges.next;\nexport const previousEdges = (edges: StopTreeEdges): StopId[] => edges.previous;\n\nexport const stopForId = (stopTree: StopTree, id: StopId): RouteStop =>\n  nodeValue(nodeForId(stopTree, id));\n\nexport const nextStopIds = (stopTree: StopTree, id: StopId): StopId[] =>\n  nextEdges(edgesForId(stopTree, id));\nexport const previousStopIds = (stopTree: StopTree, id: StopId): StopId[] =>\n  previousEdges(edgesForId(stopTree, id));\n\nexport const isStartNode = (stopTree: StopTree, id: StopId): boolean =>\n  startingNodes(stopTree).includes(id);\nexport const isEndNode = (stopTree: StopTree, id: StopId): boolean =>\n  nextStopIds(stopTree, id).length === 0;\n\nexport const isMergeNode = (stopTree: StopTree, id: StopId): boolean =>\n  previousStopIds(stopTree, id).length > 1;\nexport const isBranchingNode = (stopTree: StopTree, id: StopId): boolean =>\n  nextStopIds(stopTree, id).length > 1;\n\nconst prependStopId = (ids: StopTreePath, id: StopId): StopTreePath => [\n  id,\n  ...ids\n];\n\nconst pathsFrom = (stopTree: StopTree, id: StopId): StopTreePath[] => {\n  if (isEndNode(stopTree, id)) return [[id]];\n\n  return nextStopIds(stopTree, id).flatMap((nextId: StopId) =>\n    pathsFrom(stopTree, nextId).map(ids => prependStopId(ids, id))\n  );\n};\n\nexport const paths = (stopTree: StopTree): StopTreePath[] =>\n  startingNodes(stopTree).flatMap(id => pathsFrom(stopTree, id));\n\nconst pathLength = (stops: StopTreePath): number => stops.length;\n\nexport const longestPathLength = (stopTree: StopTree): number =>\n  Math.max(...paths(stopTree).map(pathLength));\n\nexport const longestPath = (stopTree: StopTree): StopTreePath => {\n  const longestLength = longestPathLength(stopTree);\n  return paths(stopTree).find(path => pathLength(path) === longestLength) || [];\n};\nexport const longestPathStartingId = (stopTree: StopTree): StopId =>\n  longestPath(stopTree)[0];\n\n/**\n * Calculate an array of cross-sections through the tree, where each\n * cross-sectional slice is an array of StopIds.\n *\n * These slices are useful for determining other branches running in parallel\n * with a given stop.\n *\n * @param stopTree A StopTree data structure\n * @returns An array of StopTreeSlices where each slice is an array of StopIds.\n */\nexport const slices = (stopTree: StopTree): StopTreeSlice[] => {\n  const len = longestPathLength(stopTree);\n  if (len < 1) return [[]];\n\n  const sliceSets: Set<StopId>[] = [...Array(len)].map(() => new Set());\n\n  const recordIdPositionsMovingForward = (id: StopId, index: number): void => {\n    sliceSets[index].add(id);\n    nextStopIds(stopTree, id).forEach(nextId =>\n      recordIdPositionsMovingForward(nextId, index + 1)\n    );\n  };\n  const recordIdPositionsMovingBackward = (id: StopId, index: number): void => {\n    sliceSets[index].add(id);\n    previousStopIds(stopTree, id).forEach(previousId =>\n      recordIdPositionsMovingBackward(previousId, index - 1)\n    );\n  };\n  const recordIdPositions = (id: StopId, index: number): void => {\n    recordIdPositionsMovingForward(id, index);\n    recordIdPositionsMovingBackward(id, index);\n  };\n\n  longestPath(stopTree).forEach(recordIdPositions);\n\n  return sliceSets.map(set => Array.from(set));\n};\n\nconst sliceSize = (slice: StopTreeSlice): number => slice.length;\n\nexport const largestSliceSize = (stopTree: StopTree): number =>\n  Math.max(...slices(stopTree).map(sliceSize));\n\nexport const sliceForId = (\n  stopTree: StopTree,\n  id: StopId\n): StopTreeSlice | undefined =>\n  slices(stopTree).find(slice => slice.includes(id));\n\nexport const sliceSizeForId = (\n  stopTree: StopTree,\n  id: StopId\n): number | undefined => {\n  const slice = sliceForId(stopTree, id);\n  return slice && sliceSize(slice);\n};\n\nexport const hasBranches = (stopTree: StopTree): boolean =>\n  slices(stopTree).some(slice => sliceSize(slice) > 1);\n\nexport const newBranchesStartingInSlice = (\n  stopTree: StopTree,\n  stopId: StopId\n): StopId[] =>\n  (sliceForId(stopTree, stopId) || []).filter(\n    id => id !== stopId && isStartNode(stopTree, id)\n  );\n\nexport const isEmptyTree = (stopTree: StopTree): boolean =>\n  Object.values(stopTree).some(isEmpty);\n","/**\n * Replaces slashes in a given string with a slash + ZERO_WIDTH_SPACE.\n * It's visually the same, but allows browsers to break the text into multiple lines.\n */\n// eslint-disable-next-line import/prefer-default-export\nexport const breakTextAtSlash = (str: string): string =>\n  str.replace(/\\//g, \"/​\");\n\ninterface HighlightedSpan {\n  offset: number;\n  length: number;\n}\nexport function highlightText(\n  text: string,\n  spans: HighlightedSpan[] = []\n): string {\n  const parts = [];\n  let cursor = 0;\n  spans.forEach(span => {\n    const { offset, length } = span;\n\n    parts.push(text.slice(cursor, offset));\n    parts.push(`<em>${text.slice(offset, offset + length)}</em>`);\n    cursor = length + offset;\n  });\n  parts.push(text.slice(cursor));\n\n  return parts.join(\"\");\n}\n","/* eslint-disable import/prefer-default-export */\n\nimport { useCallback, useEffect, useRef } from \"react\";\n\n/**\n * This is similar to `useInterval`, with the main difference being that\n * the Promise returned by `fn` is `await`ed before another timeout is\n * queued. For example, with a slow network request, this will wait until\n * the network request finishes to re-queue the follow up, as opposed to\n * starting the delay timer immediately after the network request is sent.\n *\n * Note that the cancel function returned by this hook does not cancel the\n * currently-running promise, it just prevents it from being queued up\n * again.\n */\n\nexport const useAwaitInterval = <Fn extends () => PromiseLike<unknown>>(\n  fn: Fn,\n  delay: number\n): (() => () => void) => {\n  type LatestTimeout = ReturnType<typeof setTimeout> | \"cancelled\" | undefined;\n  const latestTimeout = useRef<LatestTimeout>(undefined);\n\n  const enqueue = useCallback(\n    (fn_: () => unknown): void => {\n      if (latestTimeout.current !== \"cancelled\") {\n        latestTimeout.current = setTimeout(fn_, delay);\n      }\n    },\n    [delay]\n  );\n\n  const cancel = (): void => {\n    if (latestTimeout.current && latestTimeout.current !== \"cancelled\") {\n      clearTimeout(latestTimeout.current);\n      latestTimeout.current = \"cancelled\";\n    }\n  };\n\n  const go = useCallback(async () => {\n    await fn();\n\n    enqueue(go);\n  }, [fn, enqueue]);\n\n  useEffect(() => {\n    go();\n\n    return cancel;\n  }, [go]);\n\n  return useCallback(() => {\n    cancel();\n\n    return () => {\n      latestTimeout.current = undefined;\n\n      go();\n    };\n  }, [go]);\n};\n","import { useReducer } from \"react\";\n\n/**\n * Fetching comprises a simple state machine flow:\n *\n * NotStarted → Loading → Data\n *                      ↳ Error\n */\n// Exported just for testing\nexport enum FetchStatus {\n  NotStarted = 1,\n  Loading,\n  Data,\n  Error\n}\n\ninterface StartFetchAction {\n  type: \"FETCH_STARTED\";\n}\n\nconst startFetch = (): StartFetchAction => ({ type: \"FETCH_STARTED\" });\n\ninterface CompleteFetchAction<T> {\n  type: \"FETCH_COMPLETE\";\n  payload: T;\n}\n\nconst completeFetch = <T>(payload: T): CompleteFetchAction<T> => ({\n  type: \"FETCH_COMPLETE\",\n  payload\n});\n\ninterface ErrorFetchAction {\n  type: \"FETCH_ERROR\";\n}\n\nconst errorFetch = (): ErrorFetchAction => ({ type: \"FETCH_ERROR\" });\n\nexport type FetchAction<T> =\n  | StartFetchAction\n  | CompleteFetchAction<T>\n  | ErrorFetchAction;\n\nexport interface FetchState<T> {\n  status: FetchStatus;\n  data?: T;\n}\n\nconst createInitialState = <T>(): FetchState<T> => ({\n  status: FetchStatus.NotStarted,\n  data: undefined\n});\n\nexport const isNotStarted = <T>({ status }: FetchState<T>): boolean =>\n  status === FetchStatus.NotStarted;\n\nexport const isLoading = <T>({ status }: FetchState<T>): boolean =>\n  status === FetchStatus.Loading;\n\nexport const hasData = <T>({ status }: FetchState<T>): boolean =>\n  status === FetchStatus.Data;\n\nexport const gotError = <T>({ status }: FetchState<T>): boolean =>\n  status === FetchStatus.Error;\n\ntype Reducer<T> = (\n  state: FetchState<T>,\n  action: FetchAction<T>\n) => FetchState<T>;\n\nconst createFetchReducer = <T>(): Reducer<T> => (state, action) => {\n  switch (action.type) {\n    case \"FETCH_STARTED\":\n      return { ...state, status: FetchStatus.Loading, data: undefined };\n    case \"FETCH_COMPLETE\":\n      return { ...state, status: FetchStatus.Data, data: action.payload };\n    case \"FETCH_ERROR\":\n      return { ...state, status: FetchStatus.Error };\n    default:\n      return state;\n  }\n};\n\nexport type Fetcher = () => Promise<Response>;\n\nexport type Parser<T> = (json: JSON) => T;\n\ninterface FetchProps<T> {\n  fetcher: Fetcher;\n  parser: Parser<T>;\n}\n\nexport type Fetch<T> = ({ fetcher, parser }: FetchProps<T>) => Promise<void>;\n\nconst parseJsonResponse = (response: Response): Promise<JSON> => {\n  if (response.ok) return response.json();\n  throw new Error(response.statusText);\n};\n\nexport const fetch = <T>(\n  dispatch: (action: FetchAction<T>) => void\n): Fetch<T> => ({ fetcher, parser }) => {\n  dispatch(startFetch());\n\n  return fetcher()\n    .then(parseJsonResponse)\n    .then((json: JSON) => dispatch(completeFetch<T>(parser(json))))\n    .catch(() => dispatch(errorFetch()));\n};\n\nconst useFetch = <T>(): [FetchState<T>, Fetch<T>] => {\n  const [state, dispatch] = useReducer(\n    createFetchReducer<T>(),\n    createInitialState<T>()\n  );\n\n  return [state, fetch<T>(dispatch)];\n};\n\nexport default useFetch;\n","import { useCallback, useEffect, useRef, useState } from \"react\";\n\n/**\n * A hook which wraps an async data provider, allowing it to be used as\n * part of a functional component.\n *\n * The provider is initially called at component mount, and the data can\n * be manually refreshed using the second element of the value returned\n * by the hook.\n *\n * Internally, the state diagram looks something like this:\n * <Component Mount> → Loading → ↱           Loaded ↴\n *                               ↑          <Calls update>\n *                               ⬑ LoadingWithStale ↵\n */\n\nexport type InitialLoading = { loading: true };\nexport type Loaded<T> = { loading: false; data: T };\nexport type LoadingWithStale<T> = { loading: true; data: T };\nexport type UseProviderState<T> =\n  | InitialLoading\n  | Loaded<T>\n  | LoadingWithStale<T>;\nexport type UseProviderStateWithoutInitialLoading<T> = Exclude<\n  UseProviderState<T>,\n  InitialLoading\n>;\n\n// any used here for type inference\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const useProvider = <Fn extends (...args: any[]) => PromiseLike<any>>(\n  provider: Fn,\n  deps: Parameters<Fn>\n): [\n  UseProviderState<Awaited<ReturnType<Fn>>>,\n  () => Promise<Awaited<ReturnType<Fn>>>\n] => {\n  const [state, setState] = useState<UseProviderState<Awaited<ReturnType<Fn>>>>(\n    { loading: true }\n  );\n\n  const updateData = useCallback(\n    async () => {\n      const setStateIfSame = (\n        fn: (currentState: typeof state) => typeof state\n      ): void =>\n        setState(currentState => {\n          // eslint-disable-next-line @typescript-eslint/no-use-before-define\n          if (newestUpdateData.current !== updateData) {\n            return currentState;\n          }\n\n          return fn(currentState);\n        });\n\n      setStateIfSame(state_ => ({ ...state_, loading: true }));\n      const data = await provider(...deps);\n      setStateIfSame(() => ({ loading: false, data }));\n\n      return data;\n    },\n    // we spread deps here to rebind this closure if any of them change,\n    // but eslint isn't smart enough to know that\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [provider, ...deps]\n  );\n  const newestUpdateData = useRef(updateData);\n  newestUpdateData.current = updateData;\n\n  useEffect(() => {\n    updateData();\n  }, [updateData]);\n\n  return [state, updateData];\n};\n\nexport const isInitialLoading = <T>(\n  state: UseProviderState<T>\n): state is InitialLoading => state.loading && !(\"data\" in state);\n","import { useReducer, useEffect, Reducer } from \"react\";\nimport { joinChannel, leaveChannel } from \"../app/channels\";\n\n// extract the state and action types from the given reducer\n// is there a way to do this without using \"any\"?\n/* eslint-disable @typescript-eslint/no-explicit-any */\ntype State<T> = T extends Reducer<infer S, any> ? S : never;\ntype Action<T> = T extends Reducer<any, infer A> ? A : never;\n/* eslint-enable @typescript-eslint/no-explicit-any */\n\n/**\n * useChannel is intended to be generic enough to work with any Websocket-based\n * channel we might set up. Thus it requires many arguments.\n\n * @template OnDataEventType - Describes the data recieved through the\n * channel's \"data\" event.\n * @template OnDataReducerType - A type extending React's Reducer<State, Action>\n * @param {string} channelId - The name of the channel to subscribe to.\n * @param {OnDataReducerType} reducer - A function that will be used to process\n * channel data.\n * @param {State<OnDataReducerType>} initialData - The initial state value for\n * the reducer.\n * @return {State<OnDataReducerType>} - the data output from the channel after\n * going through the reducer.\n */\nfunction useChannel<\n  OnDataEventType,\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  OnDataReducerType extends Reducer<any, any>\n>(\n  channelId: string,\n  reducer: OnDataReducerType,\n  initialData: State<OnDataReducerType>\n): State<OnDataReducerType> {\n  const [state, dispatch] = useReducer<OnDataReducerType>(reducer, initialData);\n\n  useEffect(() => {\n    joinChannel<OnDataEventType[]>(channelId);\n\n    return () => {\n      leaveChannel(channelId);\n    };\n  }, [channelId]);\n\n  useEffect(() => {\n    // Set up an event listener to listen to the channel's custom event\n    // update state when new data is emitted\n    const onChannelData = (\n      event: CustomEvent<Action<OnDataReducerType>>\n    ): void => dispatch(event.detail);\n    document.addEventListener(channelId, onChannelData as EventListener);\n\n    return () => {\n      document.removeEventListener(channelId, onChannelData as EventListener);\n    };\n  }, [channelId, dispatch]);\n\n  return state;\n}\n\nexport default useChannel;\n","import { useEffect, useState } from \"react\";\nimport { DirectionId } from \"../__v3api\";\n\nconst EVENT_NAME = \"changeddirection\";\n\n// for valid typing, extend DocumentEventMap interface to include custom event\ndeclare global {\n  interface DocumentEventMap {\n    [EVENT_NAME]: CustomEvent<{ direction: DirectionId }>;\n  }\n}\n\nexport function dispatchChangedDirection(direction: DirectionId): void {\n  document.dispatchEvent(\n    new CustomEvent(EVENT_NAME, {\n      detail: { direction }\n    })\n  );\n}\n\n// outputs the direction from a \"changeddirection\" event\nfunction useDirectionChangeEvent(initialDirection: DirectionId): DirectionId {\n  const [currentDirection, setCurrentDirection] = useState<DirectionId>(\n    initialDirection\n  );\n\n  useEffect(() => {\n    function listener(e: CustomEvent<{ direction: DirectionId }>): void {\n      setCurrentDirection(e.detail.direction);\n    }\n\n    document.addEventListener(EVENT_NAME, listener);\n\n    return () => {\n      document.removeEventListener(EVENT_NAME, listener);\n    };\n  }, []);\n\n  return currentDirection;\n}\n\nexport default useDirectionChangeEvent;\n","import { useEffect, useState } from \"react\";\nimport { fetchJsonOrThrow } from \"../helpers/fetch-json\";\nimport { RapidTransitHours, TransitHours } from \"../__v3api\";\n\nconst fetchData = async (\n  routeIdString: string\n): Promise<RapidTransitHours | TransitHours> =>\n  fetchJsonOrThrow(\n    `/schedules/${routeIdString}/line/hours?${window.location.search.substring(\n      1\n    )}`\n  );\n\nconst useHoursOfOperation = (\n  routeId: string\n): RapidTransitHours | TransitHours | null => {\n  const [hoursOfOperation, setHoursOfOperation] = useState<\n    RapidTransitHours | TransitHours | null\n  >(null);\n\n  useEffect(() => {\n    fetchData(routeId).then(result => setHoursOfOperation(result));\n  }, [routeId]);\n\n  return hoursOfOperation;\n};\n\nexport default useHoursOfOperation;\n","import { useState, useEffect } from \"react\";\n\ntype GlxOpenStatus = [boolean, string | null]; // [status, Date string if true status]\n\nconst getIsGlxOpen = (stationId: string): GlxOpenStatus => {\n  const glxStationsOpen: HTMLElement | null = document.querySelector(\n    \".glx-stations-open\"\n  );\n  if (!glxStationsOpen || !glxStationsOpen.dataset) return [false, null];\n  const { stations, opening } = glxStationsOpen.dataset;\n  const isStationOpen = stations ? stations.includes(stationId) : false;\n  const stationOpenDate = isStationOpen && opening ? opening : null;\n  return [isStationOpen, stationOpenDate];\n};\n\nconst useIsGlxOpen = (stopId: string): GlxOpenStatus => {\n  const [[isGlxOpen, glxOpenDate], setIsGlxOpen] = useState<GlxOpenStatus>([\n    false,\n    null\n  ]);\n  useEffect(() => {\n    setIsGlxOpen(getIsGlxOpen(stopId));\n  }, [stopId]);\n\n  return [isGlxOpen, glxOpenDate];\n};\n\nexport default useIsGlxOpen;\n","import useSWR, { Fetcher } from \"swr\";\nimport { LiveDataByStop } from \"../schedule/components/line-diagram/__line-diagram\";\nimport { DirectionId, Route } from \"../__v3api\";\n\n/**\n * Live data, including realtime vehicle locations and predictions\n * Available on all modes except ferry (route.type 4)\n */\nconst fetcher: Fetcher<LiveDataByStop, string> = (url: string) =>\n  fetch(url).then(response => response.json());\n\nconst useRealtime = (\n  route: Route,\n  directionId: DirectionId,\n  enabled: boolean = true\n): LiveDataByStop | undefined => {\n  const liveUrl = `/schedules/line_api/realtime?id=${route.id}&direction_id=${directionId}`;\n  const { data } = useSWR<LiveDataByStop>(\n    enabled && route.type !== 4 ? liveUrl : null,\n    fetcher,\n    {\n      refreshInterval: 15000\n    }\n  );\n  return data;\n};\n\nexport default useRealtime;\n","import { LatLng, latLng, LatLngBounds, latLngBounds } from \"leaflet\";\nimport { MapMarker as Marker } from \"./components/__mapdata\";\n\nconst getBounds = (markers: Marker[]): LatLngBounds => {\n  const points: LatLng[] = markers.map(m => latLng(m.latitude, m.longitude));\n  return latLngBounds(points);\n};\n\nexport default getBounds;\n","import React, { ReactElement } from \"react\";\nimport { uniqBy } from \"lodash\";\nimport deepEqual from \"fast-deep-equal/react\";\nimport {\n  Icon,\n  LatLngBounds,\n  Marker as LeafletMarker,\n  MarkerOptions\n} from \"leaflet\";\nimport Leaflet from \"react-leaflet\";\nimport { MapData, MapMarker, IconOpts } from \"./__mapdata\";\n\nexport interface ZoomOpts {\n  maxZoom: number;\n  minZoom: number;\n  scrollWheelZoom: boolean;\n  style: object;\n}\n\nexport const defaultZoomOpts: ZoomOpts = {\n  maxZoom: 18,\n  minZoom: 9,\n  scrollWheelZoom: false,\n  style: { touchAction: \"none\" } // fix for chrome-android to prevent zooming page\n};\n\ninterface Props {\n  bounds?: LatLngBounds;\n  boundsByMarkers?: boolean;\n  mapData: MapData;\n}\n\nconst mapCenter = (\n  markers: MapMarker[],\n  { latitude, longitude }: { latitude: number; longitude: number }\n): [number, number] | undefined => {\n  if (markers.length === 1) return [markers[0].latitude, markers[0].longitude];\n  return [latitude, longitude];\n};\n\nconst rotateMarker = (\n  markerEl: LeafletMarker<MarkerOptions>,\n  { rotation_angle: angle }: MapMarker\n): void => {\n  // TS does not recognize setRotationAngle, which\n  // is added by the leaflet-rotatedmarker plugin\n  // @ts-ignore\n  markerEl.setRotationAngle(angle);\n};\n\nconst Component = ({\n  bounds,\n  boundsByMarkers,\n  mapData: {\n    default_center: defaultCenter,\n    markers,\n    polylines,\n    tile_server_url: tileServerUrl,\n    zoom\n  }\n}: Props): ReactElement<HTMLElement> | null => {\n  if (typeof window !== \"undefined\" && tileServerUrl !== \"\") {\n    /* eslint-disable */\n    const leaflet: typeof Leaflet = require(\"react-leaflet\");\n    const buildIcon: (\n      icon: string | null,\n      opts?: IconOpts\n    ) => Icon | undefined = require(\"../icon\").default;\n    require(\"leaflet-rotatedmarker\");\n    const getBounds = require(\"../bounds\").default;\n    /* eslint-enable */\n    const { Map, Marker, Polyline, Popup, TileLayer } = leaflet;\n    /* istanbul ignore next */\n    const boundsOrByMarkers = bounds || (boundsByMarkers && getBounds(markers));\n    const position = mapCenter(markers, defaultCenter);\n    const nonNullZoom = zoom === null ? undefined : zoom;\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const mapRef = React.createRef<any>();\n    const onTilesLoaded = (): void => {\n      mapRef.current.container.parentElement.classList += \" map--loaded\";\n    };\n\n    return (\n      <Map\n        ref={mapRef}\n        bounds={boundsOrByMarkers}\n        center={position}\n        zoom={nonNullZoom}\n        {...defaultZoomOpts}\n      >\n        <TileLayer\n          attribution='&amp;copy <a href=\"http://osm.org/copyright\">OpenStreetMap</a> contributors'\n          url={`${tileServerUrl}/osm_tiles/{z}/{x}/{y}.png`}\n          onload={onTilesLoaded}\n        />\n        {polylines.map(\n          /* istanbul ignore next */\n          polyline => (\n            <Polyline\n              key={\n                polyline.id || `polyline-${Math.floor(Math.random() * 1000)}`\n              }\n              positions={polyline.positions}\n              color={polyline.color}\n              weight={polyline.weight}\n              dashArray={polyline[\"dotted?\"] ? \"4px 8px\" : \"none\"}\n              lineCap={polyline[\"dotted?\"] ? \"butt\" : \"round\"}\n              lineJoin={polyline[\"dotted?\"] ? \"miter\" : \"round\"}\n            />\n          )\n        )}\n        {uniqBy(markers, \"id\").map(marker => (\n          <Marker\n            icon={buildIcon(marker.icon, marker.icon_opts)}\n            key={\n              marker.id ||\n              /* istanbul ignore next */ `marker-${Math.floor(\n                Math.random() * 1000\n              )}`\n            }\n            position={[marker.latitude, marker.longitude]}\n            ref={ref => ref && rotateMarker(ref.leafletElement, marker)}\n            zIndexOffset={marker.z_index}\n            keyboard={false}\n            onclick={marker.onClick}\n          >\n            {marker.tooltip && <Popup maxHeight={175}>{marker.tooltip}</Popup>}\n          </Marker>\n        ))}\n      </Map>\n    );\n  }\n  return null;\n};\n\nexport default React.memo(Component, deepEqual);\n","import { Icon } from \"leaflet\";\nimport { IconOpts } from \"../leaflet/components/__mapdata\";\n\nexport type IconType = (\n  icon: string | null,\n  opts: IconOpts | undefined\n) => Icon | undefined;\n\ninterface LeafletOpts {\n  iconSize: [number, number];\n  iconAnchor: [number, number];\n  popupAnchor: [number, number];\n}\n\nexport const defaultIconOpts: LeafletOpts = {\n  iconAnchor: [22, 55],\n  iconSize: [45, 75],\n  popupAnchor: [0, -37]\n};\n\nexport default (\n  icon: string | null,\n  opts?: IconOpts | null\n): Icon | undefined => {\n  const iconOpts =\n    opts !== null && opts\n      ? {\n          iconAnchor: opts.icon_anchor || defaultIconOpts.iconAnchor,\n          iconSize: opts.icon_size || defaultIconOpts.iconSize,\n          popupAnchor: opts.popup_anchor || defaultIconOpts.popupAnchor\n        }\n      : defaultIconOpts;\n  return icon === null\n    ? undefined\n    : new Icon({\n        ...iconOpts,\n        iconUrl: `/images/icon-${icon}.svg`,\n        iconRetinaUrl: `/images/icon-${icon}.svg`\n      });\n};\n","import { isValid, parseISO } from \"date-fns\";\nimport { StopId } from \"../schedule/components/__schedule\";\nimport { Alert, TimePeriodPairs } from \"../__v3api\";\n\nexport const isHighSeverityOrHighPriority = ({\n  priority,\n  severity\n}: Alert): boolean => priority === \"high\" || severity >= 7;\n\nexport const isDiversion = ({ effect }: Alert): boolean =>\n  effect === \"shuttle\" ||\n  effect === \"stop_closure\" ||\n  effect === \"station_closure\" ||\n  effect === \"detour\";\n\nexport const alertsByStop = (alerts: Alert[], stopId: StopId): Alert[] =>\n  alerts.filter(\n    ({ informed_entity: entities }: Alert): boolean =>\n      !!entities.stop && entities.stop!.some((id: StopId) => id === stopId)\n  );\n\nexport const uniqueByEffect = (\n  alert: Alert,\n  index: number,\n  alerts: Alert[]\n): boolean => alerts.findIndex(a => a.effect === alert.effect) === index;\n\nconst activePeriodToDates = (activePeriod: TimePeriodPairs): Date[] => {\n  return activePeriod.map(\n    (d: string): Date => {\n      return parseISO(d);\n    }\n  );\n};\n\nconst isCurrentLifecycle = ({ lifecycle }: Alert): boolean =>\n  lifecycle === \"new\" ||\n  lifecycle === \"ongoing\" ||\n  lifecycle === \"ongoing_upcoming\";\n\nexport const isCurrentAlert = (\n  alert: Alert,\n  currentDate: Date = new Date()\n): boolean => {\n  if (!alert.active_period) return false;\n  const dateRanges = alert.active_period.map(ap => activePeriodToDates(ap));\n  const isInARange = dateRanges.some((range): boolean => {\n    const [start, end] = range;\n    if (!isValid(start)) return false; // end might be null for ongoing alerts\n    return currentDate >= start && (isValid(end) ? currentDate <= end : true);\n  });\n  return isCurrentLifecycle(alert) && isInARange;\n};\n\nexport const isActiveDiversion = (alert: Alert): boolean =>\n  isDiversion(alert) && isCurrentAlert(alert);\n\nexport const hasAnActiveDiversion = (\n  stopId: StopId,\n  alerts: Alert[]\n): boolean => alertsByStop(alerts, stopId).some(isActiveDiversion);\n","import { TripPrediction } from \"../schedule/components/__trips\";\nimport { HeadsignWithCrowding } from \"../__v3api\";\n\n// eslint-disable-next-line import/prefer-default-export\nexport const isSkippedOrCancelled = (\n  prediction: TripPrediction | null\n): boolean =>\n  prediction\n    ? prediction.schedule_relationship === \"skipped\" ||\n      prediction.schedule_relationship === \"cancelled\"\n    : false;\n\nexport const hasPredictionTime = ({\n  time_data_with_crowding_list: timeDataList\n}: HeadsignWithCrowding): boolean =>\n  !!(\n    timeDataList &&\n    timeDataList[0] &&\n    timeDataList[0].time_data &&\n    timeDataList[0].time_data.prediction &&\n    timeDataList[0].time_data.prediction.time\n  );\n","import { Mode, Route, RouteType } from \"../__v3api\";\n\nconst isRouteType = (obj: Route | RouteType): obj is RouteType =>\n  typeof obj === \"number\";\n\nexport const isFerryRoute = ({ type }: Route): boolean => type === 4;\n\nexport const isABusRoute = ({ type }: Route): boolean => type === 3;\n\nexport const isSubwayRoute = ({ type }: Route): boolean =>\n  type === 1 || type === 0;\n\nconst isCommuterRailRouteType = (type: RouteType): boolean => type === 2;\n\nexport const isACommuterRailRoute = (routeOrType: Route | RouteType): boolean =>\n  isRouteType(routeOrType)\n    ? isCommuterRailRouteType(routeOrType)\n    : isCommuterRailRouteType(routeOrType.type);\n\nexport const isAGreenLineRoute = ({ id }: Route): boolean =>\n  id.startsWith(\"Green\");\n\nexport const isASilverLineRoute = (routeOrRouteId: Route | string): boolean => {\n  const id =\n    typeof routeOrRouteId === \"string\" ? routeOrRouteId : routeOrRouteId.id;\n  return [\"741\", \"742\", \"743\", \"746\", \"749\", \"751\"].includes(id);\n};\n\nexport const RAPID_TRANSIT = \"rapid_transit\";\n\nexport const isRapidTransit = ({ description }: Route): boolean =>\n  description === RAPID_TRANSIT;\nexport const isGreenLine = ({ id }: Route): boolean => id === \"Green\";\n\nconst routeTypesToMode: {\n  [key in RouteType]: Mode;\n} = {\n  0: \"subway\",\n  1: \"subway\",\n  2: \"commuter_rail\",\n  3: \"bus\",\n  4: \"ferry\"\n};\n\nexport const modeForRoute = ({ type }: Route): Mode => routeTypesToMode[type];\n","import { CrowdingType } from \"../schedule/components/__schedule\";\n\n// eslint-disable-next-line import/prefer-default-export\nexport const crowdingDescriptions = (crowding: CrowdingType): string =>\n  crowding\n    ? {\n        // eslint-disable-next-line camelcase\n        not_crowded: \"Not crowded\",\n        // eslint-disable-next-line camelcase\n        some_crowding: \"Some crowding\",\n        crowded: \"Crowded\"\n      }[crowding]\n    : \"\";\n\nexport const crCrowdingDescriptions = (crowding: CrowdingType): string =>\n  crowding\n    ? {\n        // eslint-disable-next-line camelcase\n        not_crowded: \"many seats available\",\n        // eslint-disable-next-line camelcase\n        some_crowding: \"some seats available\",\n        crowded: \"few seats available\"\n      }[crowding]\n    : \"\";\n","import { ReactElement } from \"react\";\n\nimport {\n  blueLineIcon,\n  busIcon,\n  commuterRailIcon,\n  ferryIcon,\n  genericSubwayIcon,\n  greenLineIcon,\n  greenBLineIcon,\n  greenCLineIcon,\n  greenDLineIcon,\n  greenELineIcon,\n  mattapanLineIcon,\n  orangeLineIcon,\n  redLineIcon,\n  silverLineIcon\n} from \"../../helpers/icon\";\n\ninterface TagDispatchTable {\n  [key: string]: (className: string) => JSX.Element;\n}\n\ninterface Props {\n  tag: string;\n  extraClasses: string;\n}\n\nconst tagsToIcons: TagDispatchTable = {\n  blue: blueLineIcon,\n  bus: busIcon,\n  commuterRail: commuterRailIcon,\n  ferry: ferryIcon,\n  green: greenLineIcon,\n  \"green-b\": greenBLineIcon,\n  \"green-c\": greenCLineIcon,\n  \"green-d\": greenDLineIcon,\n  \"green-e\": greenELineIcon,\n  mattapan: mattapanLineIcon,\n  orange: orangeLineIcon,\n  red: redLineIcon,\n  silver: silverLineIcon,\n  subway: genericSubwayIcon\n};\n\nconst RouteIcon = ({ tag, extraClasses }: Props): ReactElement<HTMLElement> => {\n  const iconFunction = tagsToIcons[tag];\n  return iconFunction(`c-svg__icon ${extraClasses}`);\n};\n\nexport default RouteIcon;\n","import schedule from \"./schedule/schedule-loader\";\n\nschedule();\n","import React, { ReactElement } from \"react\";\nimport { Holiday, SchedulePDF, Fare, ScheduleNote } from \"./__schedule\";\nimport { EnhancedRoute } from \"../../__v3api\";\nimport { TypedRoutes } from \"../../stop/components/__stop\";\nimport PDFSchedules from \"./PDFSchedules\";\nimport Connections from \"./Connections\";\nimport ContentTeasers from \"./ContentTeasers\";\nimport Fares from \"./Fares\";\nimport UpcomingHolidays from \"./UpcomingHolidays\";\nimport HoursOfOperation from \"./HoursOfOperation\";\nimport { isSubwayRoute } from \"../../models/route\";\n\ninterface Props {\n  teasers: string | null;\n  pdfs: SchedulePDF[];\n  connections: TypedRoutes[];\n  fares: Fare[];\n  fareLink: string;\n  route: EnhancedRoute;\n  holidays: Holiday[];\n  scheduleNote: ScheduleNote | null;\n  hours: string;\n}\n\nconst AdditionalLineInfo = ({\n  connections,\n  pdfs,\n  teasers,\n  fares,\n  holidays,\n  fareLink,\n  route,\n  hours,\n  scheduleNote\n}: Props): ReactElement<HTMLElement> => (\n  <>\n    <ContentTeasers teasers={teasers} />\n    <PDFSchedules pdfs={pdfs} />\n    <Connections connections={connections} />\n    <Fares fares={fares} fareLink={fareLink} routeType={route.type} />\n    {/* Only show the hours for non subway lines */}\n    {!isSubwayRoute(route) && (\n      <HoursOfOperation\n        route={route}\n        pdfs={pdfs}\n        scheduleNote={scheduleNote}\n        hours={hours}\n      />\n    )}\n    <UpcomingHolidays holidays={holidays} />\n  </>\n);\n\nexport default AdditionalLineInfo;\n","import React, { ReactElement } from \"react\";\nimport ExpandableBlock from \"../../components/ExpandableBlock\";\nimport RoutePillList from \"../../stop/components/RoutePillList\";\nimport { TypedRoutes } from \"../../stop/components/__stop\";\n\ninterface Props {\n  connections: TypedRoutes[];\n}\n\nconst Connections = ({\n  connections\n}: Props): ReactElement<HTMLDivElement> | null =>\n  connections.length ? (\n    <ExpandableBlock\n      header={{ text: \"Connections\", iconSvgText: null }}\n      initiallyExpanded={false}\n      id=\"connections\"\n    >\n      <RoutePillList routes={connections} showGroupName />\n    </ExpandableBlock>\n  ) : null;\n\nexport default Connections;\n","import React, { ReactElement } from \"react\";\n\ninterface Props {\n  teasers: string | null;\n}\n\nconst ContentTeasers = ({ teasers }: Props): ReactElement<HTMLElement> | null =>\n  // eslint-disable-next-line react/no-danger\n  teasers ? <div dangerouslySetInnerHTML={{ __html: teasers }} /> : null;\n\nexport default ContentTeasers;\n","import React, { ReactElement } from \"react\";\nimport ExpandableBlock from \"../../components/ExpandableBlock\";\n\nconst DefaultHoursOfOperation = ({\n  hours\n}: {\n  hours: string;\n}): ReactElement<HTMLElement> | null =>\n  hours ? (\n    <ExpandableBlock\n      header={{ text: \"Hours of Operation\", iconSvgText: null }}\n      initiallyExpanded={false}\n      id=\"hours\"\n    >\n      <div\n        className=\"m-schedule-page__sidebar-hours\"\n        // eslint-disable-next-line react/no-danger\n        dangerouslySetInnerHTML={{ __html: hours }}\n      />\n    </ExpandableBlock>\n  ) : null;\n\nexport default DefaultHoursOfOperation;\n","import React, { ReactElement } from \"react\";\nimport ExpandableBlock from \"../../components/ExpandableBlock\";\nimport { Fare } from \"./__schedule\";\nimport { RouteType } from \"../../__v3api\";\n\nconst fareItem = (fare: Fare): ReactElement<HTMLElement> => (\n  <p key={fare.title} className=\"m-schedule-page__fare\">\n    <span>{fare.title}</span>\n    <span>{fare.price}</span>\n  </p>\n);\n\ninterface Props {\n  fares: Fare[];\n  fareLink: string;\n  routeType: RouteType;\n}\n\nconst Fares = ({\n  fares,\n  fareLink,\n  routeType\n}: Props): ReactElement<HTMLElement> | null =>\n  fares.length > 0 ? (\n    <ExpandableBlock\n      header={{ text: \"Fares\", iconSvgText: null }}\n      initiallyExpanded={false}\n      id=\"fares\"\n    >\n      <>\n        {fares.map(f => fareItem(f))}\n        {routeType === 2 && (\n          <p>\n            <a className=\"c-call-to-action\" href=\"/fares/commuter-rail-fares\">\n              Commuter Rail Fares\n            </a>\n          </p>\n        )}\n        <p className=\"m-schedule-page__link\">\n          <a className=\"c-call-to-action\" href={fareLink}>\n            More about fares\n          </a>\n        </p>\n      </>\n    </ExpandableBlock>\n  ) : null;\n\nexport default Fares;\n","import React, { ReactElement } from \"react\";\nimport ExpandableBlock from \"../../components/ExpandableBlock\";\nimport pdfLink from \"../helpers/hoursOfOperationHelpers\";\nimport { SchedulePDF } from \"./__schedule\";\n\nconst getGreenLineScheduleLinks = (): ReactElement<HTMLElement> => (\n  <>\n    <div>\n      <a href=\"/schedules/Green-B/line\">B Line Schedule</a>\n    </div>\n    <div>\n      <a href=\"/schedules/Green-C/line\">C Line Schedule</a>\n    </div>\n    <div>\n      <a href=\"/schedules/Green-D/line\">D Line Schedule</a>\n    </div>\n    <div>\n      <a href=\"/schedules/Green-E/line\">E Line Schedule</a>\n    </div>\n  </>\n);\n\nconst GreenLineScheduleLinks = ({\n  pdfs\n}: {\n  pdfs: SchedulePDF[];\n}): ReactElement<HTMLElement> | null => (\n  <>\n    <ExpandableBlock\n      header={{ text: \"Weekday Schedule\", iconSvgText: null }}\n      initiallyExpanded={false}\n      id=\"weekday-hours\"\n    >\n      <div className=\"m-schedule-page__sidebar-hours\">\n        {getGreenLineScheduleLinks()}\n        {pdfLink(pdfs[0])}\n      </div>\n    </ExpandableBlock>\n    <ExpandableBlock\n      header={{ text: \"Weekend Schedule\", iconSvgText: null }}\n      initiallyExpanded={false}\n      id=\"weekend-hours\"\n    >\n      <div className=\"m-schedule-page__sidebar-hours\">\n        {getGreenLineScheduleLinks()}\n        {pdfLink(pdfs[0])}\n      </div>\n    </ExpandableBlock>\n  </>\n);\n\nexport default GreenLineScheduleLinks;\n","import React, { ReactElement } from \"react\";\nimport { isGreenLine, isRapidTransit } from \"../../models/route\";\nimport { EnhancedRoute } from \"../../__v3api\";\nimport DefaultHoursOfOperation from \"./DefaultHoursOfOperation\";\nimport GreenLineScheduleLinks from \"./GreenLineScheduleLinks\";\nimport RapidTransitHoursOfOperation from \"./RapidTransitHoursOfOperation\";\nimport { SchedulePDF, ScheduleNote } from \"./__schedule\";\n\nconst HoursOfOperation = ({\n  route,\n  pdfs,\n  hours,\n  scheduleNote\n}: {\n  route: EnhancedRoute;\n  pdfs: SchedulePDF[];\n  hours: string;\n  scheduleNote: ScheduleNote | null;\n}): ReactElement<HTMLElement> | null => {\n  if (isGreenLine(route)) {\n    return <GreenLineScheduleLinks pdfs={pdfs} />;\n  }\n  if (isRapidTransit(route)) {\n    return (\n      <RapidTransitHoursOfOperation\n        pdfs={pdfs}\n        route={route}\n        scheduleNote={scheduleNote}\n      />\n    );\n  }\n  return <DefaultHoursOfOperation hours={hours} />;\n};\n\nexport default HoursOfOperation;\n","import React, { ReactElement, Reducer, useRef } from \"react\";\nimport { SocketEvent } from \"../../app/channels\";\nimport LeafletMap from \"../../leaflet/components/Map\";\nimport getBounds from \"../../leaflet/bounds\";\nimport {\n  MapData,\n  MapMarker as Marker\n} from \"../../leaflet/components/__mapdata\";\nimport CrowdingPill from \"./line-diagram/CrowdingPill\";\nimport useChannel from \"../../hooks/useChannel\";\n\ninterface Props {\n  channel: string;\n  data: MapData;\n  currentShapes: string[];\n  currentStops: string[];\n}\n\nexport const iconOpts = (\n  icon: string | null\n): {\n  icon_size?: [number, number];\n  icon_anchor?: [number, number];\n} => {\n  switch (icon) {\n    case null:\n      return {};\n\n    case \"vehicle-bordered-expanded\":\n      return {\n        icon_size: [18, 18], // eslint-disable-line camelcase\n        icon_anchor: [6, 6] // eslint-disable-line camelcase\n      };\n\n    case \"stop-circle-bordered-expanded\":\n      return {\n        icon_size: [12, 12], // eslint-disable-line camelcase\n        icon_anchor: [6, 6] // eslint-disable-line camelcase\n      };\n\n    default:\n      throw new Error(`unexpected icon type: ${icon}`);\n  }\n};\n\nconst zIndex = (icon: string | null): number | undefined =>\n  icon === \"vehicle-bordered-expanded\" ? 1000 : undefined;\n\nconst updateMarker = (marker: Marker): Marker => ({\n  ...marker,\n  tooltip: (\n    <div>\n      {marker.vehicle_crowding && (\n        <>\n          <CrowdingPill crowding={marker.vehicle_crowding} />\n          <br />\n        </>\n      )}\n      {marker.tooltip_text}\n    </div>\n  ),\n  icon_opts: iconOpts(marker.icon), // eslint-disable-line camelcase\n  z_index: zIndex(marker.icon) // eslint-disable-line camelcase\n});\n\nconst isVehicleMarker = (marker: Marker): boolean =>\n  marker.icon ? marker.icon.includes(\"vehicle\") : false;\n\ninterface IdHash {\n  [id: string]: true;\n}\n\nconst shouldRemoveMarker = (id: string | null, idHash: IdHash): boolean =>\n  id !== null && idHash[id] === true;\n\ninterface EventData {\n  marker: Marker;\n}\n\ntype DataFromSocketType = SocketEvent<EventData[]>;\ninterface DataReducerState {\n  markers: Marker[];\n}\ntype DataReducerAction = DataFromSocketType;\ntype DataReducerType = Reducer<DataReducerState, DataReducerAction>;\n\nexport const reducer: DataReducerType = (state, action) => {\n  switch (action.event) {\n    case \"reset\":\n      return {\n        ...state,\n        markers: state.markers\n          .filter(marker => !isVehicleMarker(marker))\n          .concat(\n            action.data.map(({ marker }: EventData) => updateMarker(marker))\n          )\n      };\n\n    case \"add\":\n      return {\n        ...state,\n        markers: state.markers.concat(\n          action.data.map(({ marker }) => updateMarker(marker))\n        )\n      };\n\n    case \"update\":\n      if (action.data.length === 0) {\n        return state;\n      }\n      // Filter out the existing marker if necessary, always add new marker\n      return {\n        ...state,\n        markers: [\n          updateMarker(action.data[0].marker),\n          ...state.markers.filter(\n            marker => marker.id !== action.data[0].marker.id\n          )\n        ]\n      };\n    case \"remove\":\n      return {\n        ...state,\n        markers: state.markers.filter(\n          marker =>\n            !shouldRemoveMarker(\n              marker.id,\n              action.data.reduce((acc: IdHash, id: string) => {\n                acc[id] = true;\n                return acc;\n              }, {})\n            )\n        )\n      };\n    default:\n      /* istanbul ignore next */\n      throw new Error(`unexpected event: ${action}`);\n  }\n};\n\nconst Map = ({\n  data,\n  channel,\n  currentShapes,\n  currentStops\n}: Props): ReactElement<HTMLElement> | null => {\n  const state = useChannel<DataFromSocketType, DataReducerType>(\n    channel,\n    reducer,\n    { markers: [] }\n  );\n\n  const stopMarkers = data.stop_markers\n    ? data.stop_markers\n        .filter(mark => currentStops.includes(mark.id as string))\n        .map(marker => updateMarker(marker))\n    : [];\n\n  const mapData = {\n    ...data,\n    polylines: data.polylines.filter(p =>\n      currentShapes.some(shape => shape === p.id)\n    ),\n    markers: state.markers.concat(stopMarkers)\n  };\n  const bounds = useRef(getBounds(stopMarkers));\n  return (\n    <div className=\"m-schedule__map\">\n      <LeafletMap bounds={bounds.current} mapData={mapData} />\n    </div>\n  );\n};\n\nexport default Map;\n","import React, { ReactElement } from \"react\";\nimport ExpandableBlock from \"../../components/ExpandableBlock\";\nimport { SchedulePDF } from \"./__schedule\";\nimport renderSvg from \"../../helpers/render-svg\";\nimport pdfIcon from \"../../../static/images/icon-pdf-default.svg\";\n\nconst link = (pdf: SchedulePDF): ReactElement<HTMLElement> => (\n  <a\n    key={pdf.url}\n    href={pdf.url}\n    rel=\"noopener noreferrer\"\n    target=\"_blank\"\n    data-turbolinks=\"false\"\n    className=\"m-schedule-page__sidebar-pdfs\"\n  >\n    {renderSvg(\"c-svg__icon-pdf\", pdfIcon)}\n    {pdf.title}\n  </a>\n);\n\ninterface Props {\n  pdfs: SchedulePDF[];\n}\n\nconst PDFSchedules = ({ pdfs }: Props): ReactElement<HTMLElement> | null =>\n  pdfs.length > 0 ? (\n    <ExpandableBlock\n      header={{ text: \"PDF Schedules\", iconSvgText: null }}\n      initiallyExpanded\n      id=\"pdfs\"\n    >\n      <>{pdfs.map(pdf => link(pdf))}</>\n    </ExpandableBlock>\n  ) : null;\n\nexport default PDFSchedules;\n","import { isEqual, isWeekend, parseISO } from \"date-fns\";\nimport { map, uniqueId, sortBy, filter, concat } from \"lodash\";\nimport React, { ReactElement } from \"react\";\nimport ExpandableBlock from \"../../components/ExpandableBlock\";\nimport { formatToBostonTime } from \"../../helpers/date\";\nimport useHoursOfOperation from \"../../hooks/useHoursOfOperation\";\nimport { EnhancedRoute, StopHours } from \"../../__v3api\";\nimport pdfLink from \"../helpers/hoursOfOperationHelpers\";\nimport { ScheduleNote, SchedulePDF } from \"./__schedule\";\n\nconst getSchedule = (\n  dataArray: StopHours[][] | StopHours[]\n): ReactElement<HTMLElement>[] | ReactElement<HTMLElement> => {\n  const bothDirectionData = concat(dataArray[0], dataArray[1]);\n  const filteredData = filter(\n    bothDirectionData,\n    (stopData: StopHours) => stopData.is_terminus\n  );\n  const sortedData = sortBy(\n    filteredData,\n    (stopData: StopHours) => stopData.stop_name\n  );\n  const mappedData = map(sortedData, (stopData: StopHours) => {\n    const firstDeparture = parseISO(stopData.first_departure);\n    const lastDeparture = parseISO(stopData.last_departure);\n    if (isEqual(firstDeparture, lastDeparture)) {\n      return <></>;\n    }\n    const timeString = `${formatToBostonTime(\n      stopData.first_departure\n    )} – ${formatToBostonTime(stopData.last_departure)}`;\n    return (\n      <div key={uniqueId()} className=\"fs-18 font-helvetica-neue\">\n        <span className=\"pe-16\">{stopData.stop_name}</span>\n        <span className=\"font-weight-bold\">{timeString}</span>\n      </div>\n    );\n  });\n\n  return mappedData;\n};\n\nconst regularScheduleHTML = (): JSX.Element => (\n  <div className=\"font-weight-bold fs-14 pb-8\">Regular schedule</div>\n);\n\nconst trainsEveryHTML = (minuteString: string | undefined): JSX.Element => (\n  <div className=\"fs-14 pt-8\">{`Trains depart every ${minuteString}`}</div>\n);\n\nconst RapidTransitHoursOfOperation = ({\n  route,\n  pdfs,\n  scheduleNote\n}: {\n  route: EnhancedRoute;\n  pdfs: SchedulePDF[];\n  scheduleNote: ScheduleNote | null;\n}): ReactElement<HTMLElement> => {\n  const hours = useHoursOfOperation(route.id);\n  const isTodayWeekend = isWeekend(new Date());\n  const hideScheduleFrequency = route.id === \"Orange\";\n\n  return (\n    <>\n      <ExpandableBlock\n        header={{ text: \"Weekday Schedule\", iconSvgText: null }}\n        initiallyExpanded={!isTodayWeekend}\n        id=\"weekday-hours\"\n      >\n        <div className=\"m-schedule-page__sidebar-hours\">\n          {regularScheduleHTML()}\n          {hours && getSchedule(hours.week)}\n          {!hideScheduleFrequency &&\n            trainsEveryHTML(scheduleNote?.peak_service)}\n          {pdfLink(pdfs[0])}\n        </div>\n      </ExpandableBlock>\n      <ExpandableBlock\n        header={{ text: \"Weekend Schedule\", iconSvgText: null }}\n        initiallyExpanded={isTodayWeekend}\n        id=\"weekend-hours\"\n      >\n        <div className=\"m-schedule-page__sidebar-hours\">\n          <div className=\"font-weight-bold fs-18 pb-14 font-helvetica-neue\">\n            Saturday\n          </div>\n          {regularScheduleHTML()}\n          {hours && getSchedule(hours.saturday)}\n          {!hideScheduleFrequency &&\n            trainsEveryHTML(scheduleNote?.offpeak_service)}\n          <hr\n            style={{\n              borderBottomWidth: \"1px\",\n              borderBottomColor: \"#e9eaed\",\n              borderBottomStyle: \"solid\",\n              marginBottom: \"0rem\"\n            }}\n          />\n          <div className=\"font-weight-bold fs-18 pt-18 pb-14 font-helvetica-neue\">\n            Sunday\n          </div>\n          {regularScheduleHTML()}\n          {hours && getSchedule(hours.sunday)}\n          {!hideScheduleFrequency &&\n            trainsEveryHTML(scheduleNote?.offpeak_service)}\n          {pdfLink(pdfs[0])}\n        </div>\n      </ExpandableBlock>\n    </>\n  );\n};\n\nexport default RapidTransitHoursOfOperation;\n","import React, { ReactElement, useReducer, useEffect, Dispatch } from \"react\";\nimport { Alert, DirectionId, EnhancedRoute } from \"../../__v3api\";\nimport {\n  RoutePatternsByDirection,\n  EnhancedRoutePattern,\n  StopTree\n} from \"./__schedule\";\nimport ScheduleDirectionMenu from \"./direction/ScheduleDirectionMenu\";\nimport ScheduleDirectionButton from \"./direction/ScheduleDirectionButton\";\nimport { fetchAction, reducer as fetchReducer } from \"../../helpers/fetch\";\nimport { menuReducer } from \"./direction/reducer\";\nimport { MapData, StaticMapData } from \"../../leaflet/components/__mapdata\";\nimport Map from \"./Map\";\nimport {\n  isABusRoute,\n  isSubwayRoute,\n  isACommuterRailRoute\n} from \"../../models/route\";\nimport LineDiagram from \"./line-diagram/LineDiagram\";\nimport { fromStopTreeData } from \"./ScheduleLoader\";\nimport { isEmptyTree } from \"../../helpers/stop-tree\";\n\nexport interface Props {\n  route: EnhancedRoute;\n  directionId: DirectionId;\n  routePatternsByDirection: RoutePatternsByDirection;\n  mapData?: MapData;\n  staticMapData?: StaticMapData;\n  stopTree: StopTree;\n  alerts: Alert[];\n  busVariantId: string | null;\n}\n\nexport const fetchMapData = (\n  routeId: string,\n  directionId: DirectionId,\n  currentRoutePatternIdForData: string | undefined,\n  dispatch: Dispatch<fetchAction>\n): Promise<void> => {\n  dispatch({ type: \"FETCH_STARTED\" });\n  const baseURL = `/schedules/map_api?id=${routeId}&direction_id=${directionId}`;\n  const url = currentRoutePatternIdForData\n    ? `${baseURL}&shape_id=${currentRoutePatternIdForData}`\n    : baseURL;\n\n  return (\n    window.fetch &&\n    window\n      .fetch(url)\n      .then(response => {\n        if (response.ok) return response.json();\n        throw new Error(response.statusText);\n      })\n      .then(json => dispatch({ type: \"FETCH_COMPLETE\", payload: json }))\n      // @ts-ignore\n      .catch(() => dispatch({ type: \"FETCH_ERROR\" }))\n  );\n};\n\nexport const fetchLineData = (\n  routeId: string,\n  directionId: DirectionId,\n  currentRoutePatternIdForData: string | undefined,\n  dispatch: Dispatch<fetchAction>\n): Promise<void> => {\n  dispatch({ type: \"FETCH_STARTED\" });\n\n  const baseURL = `/schedules/line_api?id=${routeId}&direction_id=${directionId}`;\n  const url = currentRoutePatternIdForData\n    ? `${baseURL}&route_pattern=${currentRoutePatternIdForData}`\n    : baseURL;\n\n  return (\n    window.fetch &&\n    window\n      .fetch(url)\n      .then(response => {\n        if (response.ok) return response.json();\n        throw new Error(response.statusText);\n      })\n      .then(({ stop_tree }) => {\n        const stopTree: StopTree = fromStopTreeData(stop_tree);\n        dispatch({\n          type: \"FETCH_COMPLETE\",\n          payload: { stopTree }\n        });\n      })\n      // @ts-ignore\n      .catch(() => dispatch({ type: \"FETCH_ERROR\" }))\n  );\n};\n\nconst ScheduleDirection = ({\n  route,\n  directionId,\n  routePatternsByDirection,\n  mapData,\n  staticMapData,\n  stopTree: initialStopTree,\n  alerts,\n  busVariantId\n}: Props): ReactElement<HTMLElement> => {\n  const routePatternsInCurrentDirection = routePatternsByDirection[directionId];\n  const defaultRoutePattern =\n    routePatternsInCurrentDirection.find(\n      routePattern => routePattern.id === busVariantId\n    ) || routePatternsInCurrentDirection.slice(0, 1)[0];\n\n  const reverseDirection = directionId === 0 ? 1 : 0;\n  const directionIsChangeable = route.direction_names[reverseDirection] != null;\n\n  const [state, dispatch] = useReducer(menuReducer, {\n    routePattern: defaultRoutePattern,\n    directionId,\n    routePatternsByDirection,\n    routePatternMenuOpen: false,\n    routePatternMenuAll: false,\n    itemFocus: null\n  });\n\n  const [mapState, dispatchMapData] = useReducer(fetchReducer, {\n    data: mapData,\n    isLoading: false,\n    error: false\n  });\n\n  // To distinguish CR shuttles and branches and multi-route trips, we have to filter in a particular order:\n  //    1. Filter by route_id - we only want to show the primary path, not the multi-route trips\n  //    2. Filter by typicality\n  //    3. If there are multiple route_patterns with different shape values, then filter out shuttles (which usually have priority = -1)\n  let currentShapes;\n  let currentStops;\n  if (isABusRoute(route)) {\n    currentShapes = [state.routePattern.shape_id];\n    currentStops = state.routePattern.stop_ids;\n  } else if (isACommuterRailRoute(route)) {\n    const currentPatterns = routePatternsInCurrentDirection\n      .filter(pattern => pattern.route_id === route.id)\n      .reduce((result, current) => {\n        if (result.length === 0 || current.typicality < result[0].typicality)\n          return [current];\n        if (current.typicality === result[0].typicality) {\n          if (result[0].shape_priority < 0 && current.shape_priority > 0)\n            return [current];\n          if (current.shape_priority < 0 && result[0].shape_priority > 0)\n            return result;\n          return result.concat(current);\n        }\n        return result;\n      }, [] as EnhancedRoutePattern[]);\n\n    currentShapes = currentPatterns.map(pattern => pattern.shape_id);\n    currentStops = currentPatterns.reduce(\n      (acc, cur) => acc.concat(cur.stop_ids),\n      [] as string[]\n    );\n  } else {\n    currentShapes = routePatternsInCurrentDirection.map(\n      pattern => pattern.shape_id\n    );\n    currentStops = routePatternsInCurrentDirection.reduce(\n      (acc, cur) => acc.concat(cur.stop_ids),\n      [] as string[]\n    );\n  }\n\n  const currentRoutePatternIdForData =\n    isABusRoute(route) && routePatternsInCurrentDirection.length > 1\n      ? state.routePattern.id\n      : undefined;\n\n  useEffect(\n    () => {\n      if (!staticMapData) {\n        fetchMapData(\n          route.id,\n          state.directionId,\n          currentRoutePatternIdForData,\n          dispatchMapData\n        );\n      }\n    },\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [route, state.directionId, busVariantId, staticMapData]\n  );\n\n  const [lineState, dispatchLineData] = useReducer(fetchReducer, {\n    data: {\n      stopTree: initialStopTree\n    },\n    isLoading: false,\n    error: false\n  });\n  useEffect(() => {\n    fetchLineData(\n      route.id,\n      state.directionId,\n      currentRoutePatternIdForData,\n      dispatchLineData\n    );\n  }, [route, state.directionId, busVariantId, currentRoutePatternIdForData]);\n\n  const hasValidTree = lineState.data && !isEmptyTree(lineState.data.stopTree);\n  return (\n    <>\n      <div className=\"m-schedule-direction\">\n        <div id=\"direction-name\" className=\"m-schedule-direction__direction\">\n          {route.direction_names[state.directionId]}\n        </div>\n        <ScheduleDirectionMenu\n          route={route}\n          directionId={state.directionId}\n          routePatternsByDirection={routePatternsByDirection}\n          selectedRoutePatternId={state.routePattern.id}\n          menuOpen={state.routePatternMenuOpen}\n          showAllRoutePatterns={state.routePatternMenuAll}\n          itemFocus={state.itemFocus}\n          dispatch={dispatch}\n        />\n        {directionIsChangeable ? (\n          <ScheduleDirectionButton dispatch={dispatch} />\n        ) : null}\n      </div>\n      {isSubwayRoute(route) && hasValidTree && (\n        <LineDiagram\n          stopTree={lineState.data.stopTree}\n          route={route}\n          directionId={state.directionId}\n          alerts={alerts}\n        />\n      )}\n\n      {!staticMapData && mapState.data && (\n        <Map\n          channel={`vehicles:${route.id}:${state.directionId}`}\n          data={mapState.data}\n          currentShapes={currentShapes}\n          currentStops={currentStops}\n        />\n      )}\n      {staticMapData && (\n        <>\n          <img\n            src={staticMapData.img_src}\n            alt={`${route.name} route map`}\n            className=\"img-fluid\"\n          />\n          <a\n            href={staticMapData.pdf_url}\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n          >\n            <i className=\"fa fa-search-plus\" aria-hidden=\"true\" />\n            View map as a PDF\n          </a>\n        </>\n      )}\n      {!isSubwayRoute(route) && hasValidTree && (\n        <LineDiagram\n          stopTree={lineState.data.stopTree}\n          route={route}\n          directionId={state.directionId}\n          alerts={alerts}\n        />\n      )}\n    </>\n  );\n};\n\nexport default ScheduleDirection;\n","import React, { ReactElement } from \"react\";\nimport { Route, DirectionId } from \"../../__v3api\";\nimport {\n  SimpleStopMap,\n  RoutePatternsByDirection,\n  ServiceInSelector,\n  SelectedOrigin,\n  ScheduleNote\n} from \"./__schedule\";\nimport ScheduleFinderForm from \"./schedule-finder/ScheduleFinderForm\";\nimport ScheduleFinderModal, {\n  Mode as ModalMode\n} from \"./schedule-finder/ScheduleFinderModal\";\nimport { getCurrentState, storeHandler } from \"../store/ScheduleStore\";\nimport { routeToModeName } from \"../../helpers/css\";\nimport useDirectionChangeEvent from \"../../hooks/useDirectionChangeEvent\";\n\ninterface Props {\n  updateURL: (origin: SelectedOrigin, direction?: DirectionId) => void;\n  services: ServiceInSelector[];\n  directionId: DirectionId;\n  route: Route;\n  stops: SimpleStopMap;\n  routePatternsByDirection: RoutePatternsByDirection;\n  today: string;\n  changeDirection: (direction: DirectionId) => void;\n  selectedOrigin: SelectedOrigin;\n  changeOrigin: (origin: SelectedOrigin) => void;\n  closeModal: () => void;\n  modalMode: ModalMode;\n  modalOpen: boolean;\n  scheduleNote: ScheduleNote | null;\n}\n\nconst ScheduleFinder = ({\n  updateURL,\n  directionId,\n  route,\n  services,\n  stops,\n  routePatternsByDirection,\n  today,\n  modalMode,\n  selectedOrigin,\n  changeDirection,\n  changeOrigin,\n  modalOpen,\n  closeModal,\n  scheduleNote\n}: Props): ReactElement<HTMLElement> => {\n  const currentDirection = useDirectionChangeEvent(directionId);\n  const openOriginModal = (): void => {\n    const currentState = getCurrentState();\n    const { modalOpen: modalIsOpen } = currentState;\n    if (!modalIsOpen) {\n      storeHandler({\n        type: \"OPEN_MODAL\",\n        newStoreValues: {\n          modalMode: \"origin\"\n        }\n      });\n    }\n  };\n\n  const openScheduleModal = (): void => {\n    const currentState = getCurrentState();\n    const { modalOpen: modalIsOpen } = currentState;\n    if (selectedOrigin !== undefined && !modalIsOpen) {\n      storeHandler({\n        type: \"OPEN_MODAL\",\n        newStoreValues: {\n          modalMode: \"schedule\"\n        }\n      });\n    }\n  };\n\n  const handleOriginSelectClick = (): void => {\n    storeHandler({\n      type: \"OPEN_MODAL\",\n      newStoreValues: {\n        modalMode: \"origin\"\n      }\n    });\n  };\n\n  const isFerryRoute = routeToModeName(route) === \"ferry\";\n\n  return (\n    <div\n      className={`${\n        isFerryRoute ? \"schedule-finder-vertical\" : \"schedule-finder\"\n      }`}\n    >\n      <ScheduleFinderForm\n        onDirectionChange={changeDirection}\n        onOriginChange={changeOrigin}\n        onOriginSelectClick={openOriginModal}\n        onSubmit={openScheduleModal}\n        route={route}\n        selectedDirection={currentDirection}\n        selectedOrigin={selectedOrigin}\n        stopsByDirection={stops}\n      />\n      {modalOpen && (\n        <ScheduleFinderModal\n          closeModal={closeModal}\n          directionChanged={changeDirection}\n          initialMode={modalMode}\n          initialDirection={currentDirection}\n          initialOrigin={selectedOrigin}\n          handleOriginSelectClick={handleOriginSelectClick}\n          originChanged={changeOrigin}\n          route={route}\n          routePatternsByDirection={routePatternsByDirection}\n          services={services}\n          stops={stops}\n          today={today}\n          updateURL={updateURL}\n          scheduleNote={scheduleNote}\n        />\n      )}\n    </div>\n  );\n};\n\nexport default ScheduleFinder;\n","import React, { ReactElement } from \"react\";\nimport { connect } from \"react-redux\";\nimport { useQueryParams, StringParam } from \"use-query-params\";\nimport ContentTeasers from \"./ContentTeasers\";\nimport UpcomingHolidays from \"./UpcomingHolidays\";\nimport AdditionalLineInfo from \"./AdditionalLineInfo\";\nimport ScheduleNote from \"./ScheduleNote\";\nimport ScheduleDirection from \"./ScheduleDirection\";\nimport {\n  SchedulePageData,\n  SelectedOrigin,\n  ComponentToRender,\n  StopTree,\n  StopTreeData\n} from \"../components/__schedule\";\nimport { MapData, StaticMapData } from \"../../leaflet/components/__mapdata\";\nimport ScheduleFinder from \"./ScheduleFinder\";\nimport ScheduleFinderModal from \"./schedule-finder/ScheduleFinderModal\";\nimport { DirectionId } from \"../../__v3api\";\nimport {\n  mapStateToProps,\n  getCurrentState,\n  storeHandler\n} from \"../store/ScheduleStore\";\nimport { routeToModeName } from \"../../helpers/css\";\nimport { isSubwayRoute } from \"../../models/route\";\nimport HoursOfOperation from \"./HoursOfOperation\";\n\ninterface Props {\n  schedulePageData: SchedulePageData;\n  component: ComponentToRender;\n  updateURL: (origin: SelectedOrigin, direction?: DirectionId) => void;\n}\n\nexport const fromStopTreeData = (stopTreeData: StopTreeData): StopTree => ({\n  byId: stopTreeData.by_id,\n  edges: stopTreeData.edges,\n  startingNodes: stopTreeData.starting_nodes\n});\n\nexport const changeOrigin = (origin: SelectedOrigin): void => {\n  storeHandler({\n    type: \"CHANGE_ORIGIN\",\n    newStoreValues: {\n      selectedOrigin: origin\n    }\n  });\n  // reopen modal depending on choice:\n  storeHandler({\n    type: \"OPEN_MODAL\",\n    newStoreValues: {\n      modalMode: origin ? \"schedule\" : \"origin\"\n    }\n  });\n};\n\nexport const ScheduleLoader = ({\n  component,\n  schedulePageData,\n  updateURL\n}: Props): ReactElement<HTMLElement> => {\n  const [query] = useQueryParams({\n    // eslint-disable-next-line camelcase\n    \"schedule_finder[direction_id]\": StringParam,\n    \"schedule_direction[direction_id]\": StringParam,\n    \"schedule_finder[origin]\": StringParam\n  });\n\n  const changeDirection = (direction: DirectionId): void => {\n    storeHandler({\n      type: \"CHANGE_DIRECTION\",\n      newStoreValues: {\n        selectedDirection: direction,\n        selectedOrigin: null\n      }\n    });\n  };\n\n  const closeModal = (): void => {\n    storeHandler({\n      type: \"CLOSE_MODAL\",\n      newStoreValues: {}\n    });\n    // clear parameters from URL when closing the modal:\n    updateURL(\"\");\n  };\n\n  React.useEffect(() => {\n    // get initial values from the store:\n    const currentState = getCurrentState();\n    const { selectedDirection, selectedOrigin } = currentState;\n    let { modalOpen, modalMode } = currentState;\n\n    let newDirection: DirectionId | undefined;\n    const newOrigin: SelectedOrigin | undefined =\n      query[\"schedule_finder[origin]\"];\n\n    // modify the store values in case URL has parameters:\n    const queryDirectionId =\n      query[\"schedule_finder[direction_id]\"] ||\n      query[\"schedule_direction[direction_id]\"];\n    if (queryDirectionId !== undefined) {\n      newDirection = queryDirectionId === \"0\" ? 0 : 1;\n    }\n\n    if (newDirection !== undefined && newOrigin !== undefined) {\n      modalMode = \"schedule\";\n      modalOpen = true;\n    }\n\n    storeHandler({\n      type: \"INITIALIZE\",\n      newStoreValues: {\n        selectedDirection: newDirection || selectedDirection,\n        selectedOrigin: newOrigin || selectedOrigin,\n        modalMode,\n        modalOpen\n      }\n    });\n    // we disable linting in this next line because we DO want to specify an empty array since we want this piece to run only once\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n\n  const handleOriginSelectClick = (): void => {\n    storeHandler({\n      type: \"OPEN_MODAL\",\n      newStoreValues: {\n        modalMode: \"origin\"\n      }\n    });\n  };\n\n  const {\n    route,\n    stops,\n    services,\n    route_patterns: routePatternsByDirection,\n    schedule_note: scheduleNote,\n    today,\n    stop_tree,\n    alerts,\n    variant: busVariantId\n  } = schedulePageData;\n  const stopTree: StopTree = fromStopTreeData(stop_tree);\n\n  const routeIsSuspended = Object.keys(routePatternsByDirection).length === 0;\n\n  const currentState = getCurrentState();\n  if (!!currentState && Object.keys(currentState).length !== 0) {\n    const {\n      selectedDirection: currentDirection,\n      selectedOrigin,\n      modalOpen,\n      modalMode\n    } = currentState;\n\n    // check first if this is a unidirectional route:\n    let readjustedDirectionId: DirectionId = currentDirection;\n    if (\n      !routeIsSuspended &&\n      !Object.keys(routePatternsByDirection).includes(\n        currentDirection.toString()\n      )\n    ) {\n      // This route doesn't have this direction, so pick first existing direction\n      readjustedDirectionId = parseInt(\n        Object.keys(routePatternsByDirection)[0],\n        10\n      ) as DirectionId;\n      changeDirection(readjustedDirectionId);\n      updateURL(selectedOrigin, readjustedDirectionId);\n    }\n\n    const isFerryRoute = routeToModeName(route) === \"ferry\";\n\n    if (component === \"ADDITIONAL_LINE_INFORMATION\") {\n      const {\n        teasers,\n        pdfs,\n        connections,\n        fares,\n        fare_link: fareLink,\n        holidays,\n        hours\n      } = schedulePageData;\n\n      if (routeIsSuspended) {\n        return (\n          <>\n            <ContentTeasers teasers={teasers} />\n            <UpcomingHolidays holidays={holidays} />\n          </>\n        );\n      }\n\n      return (\n        <AdditionalLineInfo\n          teasers={teasers}\n          pdfs={pdfs}\n          connections={connections}\n          fares={fares}\n          fareLink={fareLink}\n          route={route}\n          holidays={holidays}\n          hours={hours}\n          scheduleNote={scheduleNote}\n        />\n      );\n    }\n\n    if (component === \"SCHEDULE_NOTE\" && scheduleNote) {\n      const { pdfs, hours } = schedulePageData;\n      return (\n        <>\n          {!routeIsSuspended && !isSubwayRoute(route) ? (\n            <ScheduleNote\n              className=\"m-schedule-page__schedule-notes--desktop\"\n              scheduleNote={scheduleNote}\n            />\n          ) : null}\n          {isSubwayRoute(route) ? (\n            <HoursOfOperation\n              route={route}\n              pdfs={pdfs}\n              hours={hours}\n              scheduleNote={scheduleNote}\n            />\n          ) : null}\n          {modalOpen && (\n            <ScheduleFinderModal\n              closeModal={closeModal}\n              directionChanged={changeDirection}\n              initialMode={modalMode}\n              initialDirection={readjustedDirectionId}\n              initialOrigin={selectedOrigin}\n              handleOriginSelectClick={handleOriginSelectClick}\n              originChanged={changeOrigin}\n              route={route}\n              routePatternsByDirection={routePatternsByDirection}\n              services={services}\n              stops={stops}\n              today={today}\n              updateURL={updateURL}\n              scheduleNote={scheduleNote}\n            />\n          )}\n        </>\n      );\n    }\n\n    if (component === \"SCHEDULE_FINDER\" && !isFerryRoute) {\n      return (\n        <ScheduleFinder\n          updateURL={updateURL}\n          route={route}\n          stops={stops}\n          services={services}\n          routePatternsByDirection={routePatternsByDirection}\n          today={today}\n          modalMode={modalMode}\n          modalOpen={modalOpen}\n          directionId={readjustedDirectionId}\n          changeDirection={changeDirection}\n          selectedOrigin={selectedOrigin}\n          changeOrigin={changeOrigin}\n          closeModal={closeModal}\n          scheduleNote={scheduleNote}\n        />\n      );\n    }\n\n    if (component === \"SCHEDULE_DIRECTION\") {\n      let mapData: MapData | undefined;\n      const mapDataEl = document.getElementById(\"js-map-data\");\n      if (mapDataEl) {\n        mapData = JSON.parse(mapDataEl.innerHTML);\n      }\n\n      let staticMapData: StaticMapData | undefined;\n      const staticDataEl = document.getElementById(\"static-map-data\");\n      if (staticDataEl) {\n        staticMapData = JSON.parse(staticDataEl.innerHTML);\n      }\n\n      return isFerryRoute ? (\n        <>\n          <ScheduleFinder\n            updateURL={updateURL}\n            route={route}\n            stops={stops}\n            services={services}\n            routePatternsByDirection={routePatternsByDirection}\n            today={today}\n            modalMode={modalMode}\n            modalOpen={modalOpen}\n            directionId={readjustedDirectionId}\n            changeDirection={changeDirection}\n            selectedOrigin={selectedOrigin}\n            changeOrigin={changeOrigin}\n            closeModal={closeModal}\n            scheduleNote={scheduleNote}\n          />\n          <div className=\"schedule-map-container\">\n            <h2>Route Map</h2>\n            {staticMapData && (\n              <>\n                <img\n                  src={staticMapData.img_src}\n                  alt={`${route.name} route map`}\n                  className=\"img-fluid\"\n                />\n                <a\n                  href={staticMapData.pdf_url}\n                  target=\"_blank\"\n                  rel=\"noopener noreferrer\"\n                >\n                  <i className=\"fa fa-search-plus\" aria-hidden=\"true\" />\n                  View map as a PDF\n                </a>\n              </>\n            )}\n          </div>\n        </>\n      ) : (\n        <ScheduleDirection\n          directionId={readjustedDirectionId}\n          route={route}\n          routePatternsByDirection={routePatternsByDirection}\n          mapData={mapData}\n          staticMapData={staticMapData}\n          stopTree={stopTree}\n          alerts={alerts}\n          busVariantId={busVariantId}\n        />\n      );\n    }\n  }\n  return <></>;\n};\n\nexport default connect(mapStateToProps)(ScheduleLoader);\n","import React, { ReactElement } from \"react\";\nimport {\n  ScheduleNote as ScheduleNoteType,\n  ServiceException\n} from \"./__schedule\";\nimport scheduleIcon from \"../../../static/images/icon-schedule-finder.svg\";\n\nconst service = (serviceTime: string): ReactElement<HTMLElement> => (\n  <p className=\"m-schedule-page__service-note-time\" key={serviceTime}>\n    Trains arrive every {serviceTime}\n  </p>\n);\n\nconst offPeak = (\n  offpeak: string,\n  exceptions: ServiceException[]\n): ReactElement<HTMLElement> => {\n  const except =\n    exceptions.length > 0\n      ? `except ${exceptions.map(e => e.type).join(\", \")}`\n      : \"\";\n  return service(`${offpeak} ${except}`);\n};\n\nconst alternateNote = (alternateText: string): ReactElement<HTMLElement> => (\n  /* eslint-disable react/no-danger */\n  <div className=\"m-schedule-page__schedule-note m-schedule-page__schedule-note--alternate\">\n    <div dangerouslySetInnerHTML={{ __html: alternateText }} />\n  </div> /* eslint-enable react/no-danger */\n);\n\nconst peakOffPeakTimes = ({\n  peakService,\n  offpeakService,\n  exceptions\n}: {\n  peakService: string;\n  offpeakService: string;\n  exceptions: ServiceException[];\n}): ReactElement<HTMLElement> => (\n  <>\n    <div className=\"m-schedule-page__schedule-note\">\n      <h4 className=\"m-schedule-page__service\">Weekdays</h4>\n      {service(peakService)}\n    </div>\n    <div className=\"m-schedule-page__schedule-note\">\n      <h4 className=\"m-schedule-page__service\">Weekends</h4>\n      {offPeak(offpeakService, exceptions)}\n      {exceptions.map(exception =>\n        service(`${exception.service} ${exception.type}`)\n      )}\n    </div>\n    <div className=\"m-schedule-page__note-footer\">\n      Schedules subject to change\n    </div>\n  </>\n);\n\ninterface Props {\n  scheduleNote: ScheduleNoteType;\n  className: string;\n}\n\nconst ScheduleNote = ({\n  scheduleNote: {\n    peak_service: peakService,\n    offpeak_service: offpeakService,\n    exceptions,\n    alternate_text: alternateText\n  },\n  className\n}: Props): ReactElement<HTMLElement> => (\n  <div className={`m-schedule-page__schedule-notes ${className}`}>\n    <h3 className=\"m-schedule-page__schedule-note-title\">\n      <div\n        className=\"m-schedule-page__schedule-note-icon\"\n        dangerouslySetInnerHTML={{ __html: scheduleIcon }} // eslint-disable-line react/no-danger\n      />\n      Schedule Note\n    </h3>\n    {alternateText\n      ? alternateNote(alternateText)\n      : peakOffPeakTimes({ peakService, offpeakService, exceptions })}\n  </div>\n);\n\nexport default ScheduleNote;\n","import React, { ReactElement } from \"react\";\nimport ExpandableBlock from \"../../components/ExpandableBlock\";\nimport { Holiday } from \"./__schedule\";\n\ninterface Props {\n  holidays: Holiday[];\n}\n\nconst UpcomingHolidays = ({\n  holidays\n}: Props): ReactElement<HTMLElement> | null =>\n  holidays.length > 0 ? (\n    <ExpandableBlock\n      header={{ text: \"Upcoming Holidays\", iconSvgText: null }}\n      initiallyExpanded={false}\n      id=\"holidays\"\n    >\n      <>\n        <ul className=\"c-unordered-list m-schedule-page__sidebar-list\">\n          {holidays.map(\n            (holiday: Holiday): ReactElement<HTMLElement> => (\n              <li key={holiday.date} className=\"c-unordered-list-item\">\n                {holiday.name} ({holiday.date})\n              </li>\n            )\n          )}\n        </ul>\n        <a className=\"c-call-to-action\" href=\"/holiday\">\n          View holiday schedules\n        </a>\n      </>\n    </ExpandableBlock>\n  ) : null;\n\nexport default UpcomingHolidays;\n","import React, {\n  ReactElement,\n  Dispatch,\n  KeyboardEvent as ReactKeyboardEvent\n} from \"react\";\nimport {\n  MenuAction,\n  setRoutePatternAction,\n  showAllRoutePatternsAction,\n  toggleRoutePatternMenuAction\n} from \"./reducer\";\nimport { EnhancedRoutePattern } from \"../__schedule\";\nimport handleNavigation from \"./menu-helpers\";\nimport renderSvg from \"../../../helpers/render-svg\";\nimport arrowIcon from \"../../../../static/images/icon-down-arrow.svg\";\nimport checkIcon from \"../../../../static/images/icon-checkmark.svg\";\nimport { handleReactEnterKeyPress } from \"../../../helpers/keyboard-events-react\";\n\ninterface ExpandedBusMenuProps {\n  routePatterns: EnhancedRoutePattern[];\n  selectedRoutePatternId: string;\n  showAllRoutePatterns: boolean;\n  itemFocus: string | null;\n  dispatch: Dispatch<MenuAction>;\n}\n\ninterface RoutePatternItem {\n  routePatternIds: string[];\n  routePattern: EnhancedRoutePattern;\n  selected: boolean;\n  focused: boolean;\n  duplicated: boolean;\n  dispatch: Dispatch<MenuAction>;\n}\n\ninterface UncommonDestinationsItem {\n  routePatternIds: string[];\n  dispatch: Dispatch<MenuAction>;\n}\n\ninterface BusMenuSelectProps {\n  routePatterns: EnhancedRoutePattern[];\n  selectedRoutePatternId: string;\n  dispatch: Dispatch<MenuAction>;\n}\n\nconst typicalityDefaultText = (typicality: number): string => {\n  if (typicality === 1) return \"typical route\";\n  if (typicality === 2) return \"less common route\";\n  return \"\";\n};\n\nconst RoutePatternItem = ({\n  routePatternIds,\n  routePattern,\n  selected,\n  focused,\n  duplicated,\n  dispatch\n}: RoutePatternItem): ReactElement<HTMLElement> => {\n  const selectedClass = selected ? \" m-schedule-direction__menu--selected\" : \"\";\n\n  const icon = selected ? (\n    <div className=\"m-schedule-direction__checkmark\">\n      {renderSvg(\"c-svg__icon\", checkIcon)}\n    </div>\n  ) : null;\n\n  const handleClick = (): void => dispatch(setRoutePatternAction(routePattern));\n\n  return (\n    <div\n      aria-current={selected ? \"page\" : undefined}\n      id={`route-pattern_${routePattern.id}`}\n      tabIndex={0}\n      role=\"menuitem\"\n      className={`m-schedule-direction__menu-item${selectedClass}`}\n      onClick={handleClick}\n      ref={item => item && focused && item.focus()}\n      onKeyUp={(e: ReactKeyboardEvent) => {\n        handleReactEnterKeyPress(e, () => {\n          handleClick();\n        });\n      }}\n      onKeyDown={(e: ReactKeyboardEvent) => {\n        handleNavigation(e, routePatternIds);\n      }}\n    >\n      <div className=\"m-schedule-direction__menu-item-headsign\">\n        {icon}\n        {routePattern.headsign}\n      </div>\n      <div className=\"m-schedule-direction__menu-item-description\">\n        {duplicated && `from ${routePattern.name.split(\" - \")[0]}, `}\n        {routePattern.time_desc ||\n          typicalityDefaultText(routePattern.typicality)}\n      </div>\n    </div>\n  );\n};\n\nconst UncommonDestinationsItem = ({\n  routePatternIds,\n  dispatch\n}: UncommonDestinationsItem): ReactElement<HTMLElement> => {\n  const handleClick = (): void => dispatch(showAllRoutePatternsAction());\n\n  return (\n    <div\n      id=\"route-pattern_uncommon\"\n      role=\"menuitem\"\n      tabIndex={0}\n      aria-label=\"click for additional routes\"\n      className=\"m-schedule-direction__menu-item\"\n      onClick={handleClick}\n      onKeyUp={(e: ReactKeyboardEvent) =>\n        handleReactEnterKeyPress(e, () => {\n          handleClick();\n        })\n      }\n      onKeyDown={(e: ReactKeyboardEvent) => {\n        handleNavigation(e, routePatternIds);\n      }}\n    >\n      <div className=\"m-schedule-direction__menu-item-more\">\n        Uncommon destinations{\" \"}\n        {renderSvg(\n          \"c-svg__icon m-schedule-direction__route-pattern-arrow\",\n          arrowIcon\n        )}\n      </div>\n    </div>\n  );\n};\n\nconst hasMoreRoutePatterns = (routePatterns: EnhancedRoutePattern[]): boolean =>\n  routePatterns.some(\n    (routePattern: EnhancedRoutePattern) => routePattern.typicality > 2\n  );\n\nconst determineFocusIndex = (\n  itemFocus: string | null,\n  routePatterns: EnhancedRoutePattern[]\n): number => {\n  if (itemFocus === \"first\") return 0;\n  return routePatterns.findIndex(\n    (routePattern: EnhancedRoutePattern) => routePattern.typicality > 2\n  );\n};\n\nconst isDuplicateHeadsign = (\n  compareRoutePattern: EnhancedRoutePattern,\n  routePatterns: EnhancedRoutePattern[]\n): boolean =>\n  routePatterns.filter(\n    (routePattern: EnhancedRoutePattern) =>\n      routePattern.id !== compareRoutePattern.id &&\n      routePattern.headsign === compareRoutePattern.headsign\n  ).length > 0;\n\nexport const ExpandedBusMenu = ({\n  routePatterns,\n  selectedRoutePatternId,\n  showAllRoutePatterns,\n  itemFocus,\n  dispatch\n}: ExpandedBusMenuProps): ReactElement<HTMLElement> => {\n  const filterRule = (routePattern: EnhancedRoutePattern): boolean =>\n    showAllRoutePatterns ? true : routePattern.typicality < 3;\n\n  const focusIndex = determineFocusIndex(itemFocus, routePatterns);\n\n  const toggleButtonIds =\n    hasMoreRoutePatterns(routePatterns) && showAllRoutePatterns === false\n      ? [\"uncommon\"]\n      : [];\n\n  const routePatternIds = routePatterns\n    .filter(filterRule)\n    .map((routePattern: EnhancedRoutePattern) => routePattern.id)\n    .concat(toggleButtonIds);\n\n  return (\n    <div className=\"m-schedule-direction__menu\" role=\"menu\">\n      {routePatterns\n        .filter(filterRule)\n        .map((routePattern: EnhancedRoutePattern, index: number) => (\n          <RoutePatternItem\n            key={routePattern.id}\n            routePatternIds={routePatternIds}\n            routePattern={routePattern}\n            selected={selectedRoutePatternId === routePattern.id}\n            focused={index === focusIndex}\n            duplicated={isDuplicateHeadsign(routePattern, routePatterns)}\n            dispatch={dispatch}\n          />\n        ))}\n      {hasMoreRoutePatterns(routePatterns) &&\n        showAllRoutePatterns === false && (\n          <UncommonDestinationsItem\n            routePatternIds={routePatternIds}\n            dispatch={dispatch}\n          />\n        )}\n    </div>\n  );\n};\n\nconst routePatternNameById = (\n  routePatterns: EnhancedRoutePattern[],\n  selectedRoutePatternId: string\n): string =>\n  routePatterns.find(\n    (routePattern: EnhancedRoutePattern) =>\n      routePattern.id === selectedRoutePatternId\n  )!.headsign;\n\nexport const BusMenuSelect = ({\n  routePatterns,\n  selectedRoutePatternId,\n  dispatch\n}: BusMenuSelectProps): ReactElement<HTMLElement> => {\n  const isMenuClickable = routePatterns.length > 1;\n\n  const handleClick = isMenuClickable\n    ? () => {\n        dispatch(toggleRoutePatternMenuAction());\n      }\n    : /* istanbul ignore next */\n      () => {};\n\n  const linkClass = isMenuClickable\n    ? \" m-schedule-direction__route-pattern--clickable\"\n    : \"\";\n\n  return (\n    // eslint-disable-next-line jsx-a11y/no-static-element-interactions\n    <div\n      // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex\n      tabIndex={isMenuClickable ? 0 : undefined}\n      role={isMenuClickable ? \"button\" : undefined}\n      className={`m-schedule-direction__route-pattern${linkClass} notranslate`}\n      onClick={handleClick}\n      onKeyUp={e =>\n        handleReactEnterKeyPress(e, () => {\n          handleClick();\n        })\n      }\n    >\n      {routePatternNameById(routePatterns, selectedRoutePatternId)}{\" \"}\n      {isMenuClickable &&\n        renderSvg(\n          \"c-svg__icon m-schedule-direction__route-pattern-arrow\",\n          arrowIcon\n        )}\n    </div>\n  );\n};\n","import React, {\n  ReactElement,\n  Dispatch,\n  KeyboardEvent as ReactKeyboardEvent\n} from \"react\";\nimport { DirectionId, EnhancedRoute } from \"../../../__v3api\";\nimport { MenuAction, toggleRoutePatternMenuAction } from \"./reducer\";\nimport renderSvg from \"../../../helpers/render-svg\";\nimport handleNavigation from \"./menu-helpers\";\nimport arrowIcon from \"../../../../static/images/icon-down-arrow.svg\";\nimport checkIcon from \"../../../../static/images/icon-checkmark.svg\";\nimport iconGreenB from \"../../../../static/images/icon-green-line-b-small.svg\";\nimport iconGreenC from \"../../../../static/images/icon-green-line-c-small.svg\";\nimport iconGreenD from \"../../../../static/images/icon-green-line-d-small.svg\";\nimport iconGreenE from \"../../../../static/images/icon-green-line-e-small.svg\";\nimport iconGreen from \"../../../../static/images/icon-green-line-small.svg\";\nimport { handleReactEnterKeyPress } from \"../../../helpers/keyboard-events-react\";\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nconst destinations: Map<string, any> = new Map();\ndestinations.set(\"Green\", [\"All branches\", \"All branches\"]);\nPromise.resolve(\n  window.fetch &&\n    window\n      .fetch(`/schedules/green_termini_api`)\n      .then(response => {\n        if (response.ok) return response.json();\n        throw new Error(response.statusText);\n      })\n      .then(result => {\n        const keys = Object.keys(result);\n        for (let i = 0; i < keys.length; i += 1) {\n          destinations.set(keys[i], result[keys[i]]);\n        }\n      })\n);\n\ninterface GreenLineSelectProps {\n  routeId: string;\n  dispatch: Dispatch<MenuAction>;\n  directionId: DirectionId;\n}\n\ninterface ExpandedGreenMenuProps {\n  route: EnhancedRoute;\n  directionId: DirectionId;\n}\n\ninterface GreenRoute {\n  id: string;\n  name: string;\n  direction_destinations: String[];\n  icon: string;\n}\n\ninterface GreenLineItem {\n  routeIds: string[];\n  route: GreenRoute;\n  selected: boolean;\n  focused: boolean;\n  directionId: DirectionId;\n}\n\n/* eslint-disable camelcase */\nconst greenRoutes: GreenRoute[] = [\n  {\n    id: \"Green\",\n    name: \"Green Line\",\n    direction_destinations: destinations.get(\"Green\"),\n    icon: iconGreen\n  },\n  {\n    id: \"Green-B\",\n    name: \"Green Line B\",\n    direction_destinations:\n      destinations.size > 1 ? destinations.get(\"Green-B\") : \"\",\n    icon: iconGreenB\n  },\n  {\n    id: \"Green-C\",\n    name: \"Green Line C\",\n    direction_destinations:\n      destinations.size > 1 ? destinations.get(\"Green-C\") : \"\",\n    icon: iconGreenC\n  },\n  {\n    id: \"Green-D\",\n    name: \"Green Line D\",\n    direction_destinations:\n      destinations.size > 1 ? destinations.get(\"Green-D\") : \"\",\n    icon: iconGreenD\n  },\n  {\n    id: \"Green-E\",\n    name: \"Green Line E\",\n    direction_destinations:\n      destinations.size > 1 ? destinations.get(\"Green-E\") : \"\",\n    icon: iconGreenE\n  }\n];\n\nexport const GreenLineItem = ({\n  directionId,\n  routeIds,\n  route,\n  selected,\n  focused\n}: GreenLineItem): ReactElement<HTMLElement> => {\n  const selectedClass = selected ? \" m-schedule-direction__menu--selected\" : \"\";\n  const icon = selected ? (\n    <div className=\"m-schedule-direction__checkmark\">\n      {renderSvg(\"c-svg__icon\", checkIcon)}\n    </div>\n  ) : null;\n  const handleClick = (): void => {\n    window.location.assign(\n      `/schedules/${route.id}?direction_id=${directionId}`\n    );\n  };\n\n  return (\n    <div\n      aria-current={selected ? \"page\" : undefined}\n      id={`route-pattern_${route.id}`}\n      tabIndex={0}\n      role=\"menuitem\"\n      className={`m-schedule-direction__menu-item${selectedClass} notranslate`}\n      onClick={handleClick}\n      onKeyUp={(e: ReactKeyboardEvent) => {\n        handleReactEnterKeyPress(e, () => {\n          handleClick();\n        });\n      }}\n      onKeyDown={(e: ReactKeyboardEvent) => {\n        handleNavigation(e, routeIds);\n      }}\n      ref={item => item && focused && item.focus()}\n    >\n      <div className=\"m-schedule-direction__menu-item-headsign notranslate\">\n        {icon}\n        {renderSvg(\n          \"c-svg__icon m-schedule-direction__menu-item-icon\",\n          route.icon\n        )}\n        <span className=\"sr-only\">{route.name}</span>\n        {destinations.size > 1\n          ? destinations.get(route.id)[directionId]\n          : []}{\" \"}\n      </div>\n    </div>\n  );\n};\n\nexport const ExpandedGreenMenu = ({\n  route,\n  directionId\n}: ExpandedGreenMenuProps): ReactElement<HTMLElement> => {\n  const routeIds = greenRoutes.map(greenRoute => greenRoute.id);\n  return (\n    <div className=\"m-schedule-direction__menu notranslate\" role=\"menu\">\n      {greenRoutes.map((greenRoute: GreenRoute, index: number) => (\n        <GreenLineItem\n          directionId={directionId}\n          key={greenRoute.id}\n          routeIds={routeIds}\n          route={greenRoute}\n          selected={route.id === greenRoute.id}\n          focused={index === 0}\n        />\n      ))}\n    </div>\n  );\n};\n\nexport const GreenLineSelect = ({\n  routeId,\n  dispatch,\n  directionId\n}: GreenLineSelectProps): ReactElement<HTMLElement> => {\n  const handleClick = (): void => {\n    dispatch(toggleRoutePatternMenuAction());\n  };\n\n  return (\n    // eslint-disable-next-line jsx-a11y/no-static-element-interactions\n    <div\n      // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex\n      tabIndex={0}\n      role=\"button\"\n      className=\"m-schedule-direction__route-pattern m-schedule-direction__route-pattern--clickable notranslate\"\n      onClick={handleClick}\n      onKeyUp={e =>\n        handleReactEnterKeyPress(e, () => {\n          handleClick();\n        })\n      }\n    >\n      {destinations.size > 1 ? destinations.get(routeId)[directionId] : []}{\" \"}\n      {renderSvg(\n        \"c-svg__icon m-schedule-direction__route-pattern-arrow\",\n        arrowIcon\n      )}\n    </div>\n  );\n};\n","import React, { ReactElement, Dispatch } from \"react\";\nimport renderSVG from \"../../../helpers/render-svg\";\nimport icon from \"../../../../static/images/icon-change-direction.svg\";\nimport { MenuAction, toggleDirectionAction } from \"./reducer\";\n\ninterface Props {\n  dispatch: Dispatch<MenuAction>;\n}\n\nconst ScheduleDirectionButton = ({\n  dispatch\n}: Props): ReactElement<HTMLElement> => (\n  <button\n    type=\"button\"\n    className=\"m-schedule-direction__button btn btn-primary\"\n    onClick={() => {\n      dispatch(toggleDirectionAction());\n    }}\n  >\n    {renderSVG(\"m-schedule-direction__icon\", icon)}Change Direction\n  </button>\n);\n\nexport default ScheduleDirectionButton;\n","import React, { ReactElement, Dispatch, useEffect } from \"react\";\nimport { DirectionId, EnhancedRoute } from \"../../../__v3api\";\nimport { RoutePatternsByDirection } from \"../__schedule\";\nimport { MenuAction, closeRoutePatternMenuAction } from \"./reducer\";\nimport { GreenLineSelect, ExpandedGreenMenu } from \"./GreenLineMenu\";\nimport { BusMenuSelect, ExpandedBusMenu } from \"./BusMenu\";\nimport { handleNativeEscapeKeyPress } from \"../../../helpers/keyboard-events\";\nimport { isABusRoute, isAGreenLineRoute } from \"../../../models/route\";\n\ninterface Props {\n  route: EnhancedRoute;\n  routePatternsByDirection: RoutePatternsByDirection;\n  directionId: DirectionId;\n  selectedRoutePatternId: string;\n  menuOpen: boolean;\n  showAllRoutePatterns: boolean;\n  itemFocus: string | null;\n  dispatch: Dispatch<MenuAction>;\n}\n\nconst ScheduleDirectionMenu = ({\n  route,\n  routePatternsByDirection,\n  directionId,\n  selectedRoutePatternId,\n  menuOpen,\n  showAllRoutePatterns,\n  itemFocus,\n  dispatch\n}: Props): ReactElement<HTMLElement> => {\n  const routePatterns = routePatternsByDirection[directionId];\n\n  useEffect(() => {\n    if (!menuOpen) return () => {};\n    // if the menu is open, add event listeners to enable closing the menu by\n    // clicking outside the menu or with keypress\n    const clickToClose = (event: Event): void => {\n      if (!event.target) return;\n      const element = event.target as HTMLElement;\n      if (element.closest(\".js-m-schedule-click-boundary\")) return;\n      dispatch(closeRoutePatternMenuAction());\n    };\n\n    const keyToClose = (event: KeyboardEvent): void => {\n      handleNativeEscapeKeyPress(event, () => {\n        dispatch(closeRoutePatternMenuAction());\n      });\n    };\n\n    document.addEventListener(\"click\", clickToClose, true);\n    document.addEventListener(\"keydown\", keyToClose);\n\n    return () => {\n      // remove the event listeners\n      document.removeEventListener(\"click\", clickToClose, true);\n      document.removeEventListener(\"keydown\", keyToClose);\n    };\n  }, [menuOpen, dispatch]);\n\n  return (\n    <div className=\"js-m-schedule-click-boundary\">\n      {// bus mode\n      isABusRoute(route) && (\n        <BusMenuSelect\n          routePatterns={routePatternsByDirection[directionId]}\n          selectedRoutePatternId={selectedRoutePatternId}\n          dispatch={dispatch}\n        />\n      )}\n      {// Green Line\n      isAGreenLineRoute(route) && (\n        <GreenLineSelect\n          routeId={route.id}\n          dispatch={dispatch}\n          directionId={directionId}\n        />\n      )}\n      {// Mattapan Trolley\n      route.id === \"Mattapan\" && (\n        <div className=\"m-schedule-direction__route-pattern notranslate\">\n          {route.direction_destinations[directionId]}\n        </div>\n      )}\n      {// Subway, CR, Ferry\n      [1, 2, 4].indexOf(route.type) !== -1 && (\n        <div className=\"m-schedule-direction__route-pattern notranslate\">\n          {route.direction_destinations[directionId]}\n        </div>\n      )}\n      {menuOpen && isABusRoute(route) && (\n        <ExpandedBusMenu\n          routePatterns={routePatterns}\n          selectedRoutePatternId={selectedRoutePatternId}\n          showAllRoutePatterns={showAllRoutePatterns}\n          itemFocus={itemFocus}\n          dispatch={dispatch}\n        />\n      )}\n      {menuOpen && isAGreenLineRoute(route) && (\n        <ExpandedGreenMenu directionId={directionId} route={route} />\n      )}\n    </div>\n  );\n};\n\nexport default ScheduleDirectionMenu;\n","import { KeyboardEvent as ReactKeyboardEvent } from \"react\";\n\nconst nextRoutePatternIndex = (\n  currentId: string,\n  routePatternIds: string[]\n): number => {\n  const index = routePatternIds.indexOf(currentId);\n  return index === routePatternIds.length - 1 ? 0 : index + 1;\n};\n\nconst prevRoutePatternIndex = (\n  currentId: string,\n  routePatternIds: string[]\n): number => {\n  const index = routePatternIds.indexOf(currentId);\n  return index === 0 ? routePatternIds.length - 1 : index - 1;\n};\n\nexport default (e: ReactKeyboardEvent, routePatternIds: string[]): void => {\n  if (\n    e.key !== \"Tab\" &&\n    e.key !== \"ArrowRight\" &&\n    e.key !== \"ArrowLeft\" &&\n    e.key !== \"ArrowDown\" &&\n    e.key !== \"ArrowUp\"\n  )\n    return;\n\n  e.preventDefault();\n\n  const targetEl = e.target as HTMLDivElement;\n  const targetElId = targetEl.id.replace(\"route-pattern_\", \"\");\n\n  // forward\n  if (\n    (e.key === \"Tab\" && !e.shiftKey) ||\n    e.key === \"ArrowRight\" ||\n    e.key === \"ArrowDown\"\n  ) {\n    const nextIndex = nextRoutePatternIndex(targetElId, routePatternIds);\n    const nextElId = `route-pattern_${routePatternIds[nextIndex]}`;\n    // eslint-disable-next-line no-unused-expressions\n    document.getElementById(nextElId) &&\n      /* istanbul ignore next */\n      document.getElementById(nextElId)!.focus();\n  }\n\n  // backwards\n  if (\n    (e.key === \"Tab\" && e.shiftKey) ||\n    e.key === \"ArrowLeft\" ||\n    e.key === \"ArrowUp\"\n  ) {\n    const prevIndex = prevRoutePatternIndex(targetElId, routePatternIds);\n    const prevElId = `route-pattern_${routePatternIds[prevIndex]}`;\n    // eslint-disable-next-line no-unused-expressions\n    document.getElementById(prevElId) &&\n      /* istanbul ignore next */\n      document.getElementById(prevElId)!.focus();\n  }\n};\n","import { updateInLocation } from \"use-query-params\";\nimport { DirectionId } from \"../../../__v3api\";\nimport { RoutePatternsByDirection, EnhancedRoutePattern } from \"../__schedule\";\nimport { MapData } from \"../../../leaflet/components/__mapdata\";\nimport { dispatchChangedDirection } from \"../../../hooks/useDirectionChangeEvent\";\n\nexport interface State {\n  routePattern: EnhancedRoutePattern;\n  directionId: DirectionId;\n  routePatternsByDirection: RoutePatternsByDirection;\n  routePatternMenuOpen: boolean;\n  routePatternMenuAll: boolean;\n  itemFocus: string | null;\n}\n\nexport interface Payload {\n  routePattern?: EnhancedRoutePattern;\n}\n\nexport const toggleDirectionAction = (): MenuAction => ({\n  type: \"toggleDirection\"\n});\n\nexport const setRoutePatternAction = (\n  routePattern: EnhancedRoutePattern\n): MenuAction => ({\n  type: \"setRoutePattern\",\n  payload: { routePattern }\n});\n\nexport const toggleRoutePatternMenuAction = (): MenuAction => ({\n  type: \"toggleRoutePatternMenu\"\n});\n\nexport const closeRoutePatternMenuAction = (): MenuAction => ({\n  type: \"closeRoutePatternMenu\"\n});\n\nexport const showAllRoutePatternsAction = (): MenuAction => ({\n  type: \"showAllRoutePatterns\"\n});\n\nexport interface MenuAction {\n  type:\n    | \"toggleDirection\"\n    | \"setRoutePattern\"\n    | \"toggleRoutePatternMenu\"\n    | \"closeRoutePatternMenu\"\n    | \"showAllRoutePatterns\";\n  payload?: Payload;\n}\n\nexport type FetchAction =\n  | { type: \"FETCH_COMPLETE\"; payload: MapData[] }\n  | { type: \"FETCH_ERROR\" }\n  | { type: \"FETCH_STARTED\" };\n\nconst updateDirectionAndVariantInURL = (\n  directionId: DirectionId,\n  routePatternId: string\n): void => {\n  const query = {\n    // eslint-disable-next-line camelcase\n    \"schedule_direction[direction_id]\": directionId.toString(),\n    \"schedule_direction[variant]\": routePatternId\n  };\n  const newLoc = updateInLocation(query, window.location);\n  // newLoc is not a true Location, so toString doesn't work\n  window.history.replaceState({}, \"\", `${newLoc.pathname}${newLoc.search}`);\n};\n\nconst toggleDirection = (state: State): State => {\n  const nextDirection = state.directionId === 0 ? 1 : 0;\n\n  // attempt to find the same route pattern for the opposite direction\n  const possibleNextRoutePattern = `${state.routePattern.id.slice(\n    0,\n    -1\n  )}${nextDirection}`;\n\n  const nextRoutePattern = state.routePatternsByDirection[nextDirection].find(\n    element => element.id === possibleNextRoutePattern\n  );\n\n  const defaultRoutePatternForDirection =\n    nextRoutePattern || state.routePatternsByDirection[nextDirection][0];\n\n  updateDirectionAndVariantInURL(\n    nextDirection,\n    defaultRoutePatternForDirection.id\n  );\n\n  // notify other components of change\n  dispatchChangedDirection(nextDirection);\n\n  return {\n    ...state,\n    directionId: nextDirection,\n    routePattern: defaultRoutePatternForDirection,\n    itemFocus: \"first\"\n  };\n};\n\nconst toggleRoutePatternMenu = (state: State): State => ({\n  ...state,\n  routePatternMenuOpen: !state.routePatternMenuOpen,\n  itemFocus: \"first\"\n});\n\nconst setRoutePattern = (state: State, data: Payload): State => {\n  const newRoutePattern = data!.routePattern!;\n  updateDirectionAndVariantInURL(state.directionId, newRoutePattern.id);\n  return {\n    ...state,\n    routePattern: newRoutePattern,\n    routePatternMenuOpen: false,\n    itemFocus: null\n  };\n};\n\nconst showAllRoutePatterns = (state: State): State => ({\n  ...state,\n  routePatternMenuAll: true,\n  itemFocus: \"first-uncommon\"\n});\n\nexport const menuReducer = (state: State, action: MenuAction): State => {\n  switch (action.type) {\n    case \"toggleDirection\":\n      return toggleDirection(state);\n\n    case \"toggleRoutePatternMenu\":\n      return toggleRoutePatternMenu(state);\n\n    case \"showAllRoutePatterns\":\n      return showAllRoutePatterns(state);\n\n    case \"closeRoutePatternMenu\":\n      return {\n        ...state,\n        routePatternMenuOpen: false,\n        itemFocus: null\n      };\n\n    case \"setRoutePattern\":\n      return setRoutePattern(state, action.payload!);\n\n    /* istanbul ignore next */\n    default:\n      return state;\n  }\n};\n","import React from \"react\";\nimport { CrowdingType } from \"../__schedule\";\nimport { crowdingIcon } from \"../../../helpers/icon\";\nimport { crowdingDescriptions } from \"../../../models/vehicle\";\n\nconst CrowdingPill = ({\n  crowding\n}: {\n  crowding: CrowdingType;\n}): JSX.Element | null => {\n  if (!crowding) return null;\n\n  return (\n    <div\n      className={`u-small-caps u-bold c-crowding-pill c-crowding-pill--${crowding}`}\n    >\n      {crowdingIcon(`c-icon__crowding--${crowding}`)}\n      <span className=\"c-crowding-pill__label\">\n        {crowdingDescriptions(crowding)}\n      </span>\n    </div>\n  );\n};\n\nexport default CrowdingPill;\n","import { times } from \"lodash\";\nimport React, { ReactElement, useContext, useState } from \"react\";\nimport ExpandableBlock from \"../../../components/ExpandableBlock\";\nimport { routeToModeName } from \"../../../helpers/css\";\nimport { stopForId } from \"../../../helpers/stop-tree\";\nimport { Alert } from \"../../../__v3api\";\nimport { RouteStop, StopId, StopTree } from \"../__schedule\";\nimport {\n  BRANCH_LINE_WIDTH,\n  CIRC_DIAMETER,\n  CIRC_RADIUS\n} from \"./graphics/graphic-helpers\";\nimport { branchPosition, diagramWidth } from \"./line-diagram-helpers\";\nimport { StopRefContext } from \"./LineDiagramWithStops\";\nimport StopCard from \"./StopCard\";\nimport { LiveDataByStop } from \"./__line-diagram\";\n\ninterface Props {\n  stopTree: StopTree;\n  stopIds: StopId[];\n  alerts: Alert[];\n  handleStopClick: (stop: RouteStop) => void;\n  liveData?: LiveDataByStop;\n}\n\nconst BranchToggle = (\n  stopTree: StopTree,\n  stopIds: StopId[],\n  isExpanded: boolean\n): JSX.Element => {\n  const position = branchPosition(stopTree, stopIds[0]);\n  const width = diagramWidth(position) - 15;\n\n  return (\n    <div className=\"m-schedule-diagram__expander-header\">\n      <div style={{ width }}>\n        {!isExpanded && (\n          <svg\n            className={`line-diagram-svg__toggle ${routeToModeName(\n              stopForId(stopTree, stopIds[0]).route!\n            )}`}\n            width={width}\n            height=\"100%\"\n          >\n            <g\n              transform={`translate(${(position - 1) * BRANCH_LINE_WIDTH -\n                1}, 1)`}\n            >\n              <rect width={CIRC_DIAMETER * 2} height=\"42\" rx={CIRC_DIAMETER} />\n              {times(3, i => (\n                <circle\n                  key={i}\n                  cx={CIRC_DIAMETER}\n                  cy={10 * (i + 1) + 1}\n                  r={CIRC_RADIUS}\n                />\n              ))}\n            </g>\n          </svg>\n        )}\n      </div>\n      <button className=\"btn btn-link m-schedule-diagram__toggle\" type=\"button\">\n        {stopIds.length} stops\n      </button>\n    </div>\n  );\n};\n\nconst ExpandableBranch = ({\n  stopTree,\n  stopIds,\n  alerts,\n  handleStopClick,\n  liveData\n}: Props): ReactElement<HTMLElement> => {\n  const [isExpanded, setIsExpanded] = useState(false);\n  const updateAllStopCoords = useContext(StopRefContext)[1];\n  // reset all the coordinates.\n  React.useEffect(() => {\n    updateAllStopCoords();\n  }, [isExpanded, updateAllStopCoords]);\n\n  return (\n    <div className=\"m-schedule-diagram__expander\">\n      <ExpandableBlock\n        header={{\n          iconSvgText: null,\n          text: BranchToggle(stopTree, stopIds, isExpanded)\n        }}\n        initiallyExpanded={isExpanded}\n        notifyExpanded={(blockIsExpanded: boolean) => {\n          setIsExpanded(blockIsExpanded);\n        }}\n        preventScroll\n        id={`${stopForId(stopTree, stopIds[0]).branch}`}\n      >\n        <>\n          {stopIds.map(stopId => (\n            <StopCard\n              key={stopId}\n              stopTree={stopTree}\n              stopId={stopId}\n              alerts={alerts}\n              onClick={handleStopClick}\n              liveData={liveData?.[stopId]}\n            />\n          ))}\n        </>\n      </ExpandableBlock>\n    </div>\n  );\n};\n\nexport default ExpandableBranch;\n","import React, { ReactElement, useState } from \"react\";\nimport { Provider } from \"react-redux\";\nimport { updateInLocation } from \"use-query-params\";\nimport SearchBox from \"../../../components/SearchBox\";\nimport { stopForId, stopIds } from \"../../../helpers/stop-tree\";\nimport useRealtime from \"../../../hooks/useRealtime\";\nimport { isSubwayRoute } from \"../../../models/route\";\nimport { Alert, DirectionId, Route } from \"../../../__v3api\";\nimport { getCurrentState, storeHandler } from \"../../store/ScheduleStore\";\nimport { changeOrigin } from \"../ScheduleLoader\";\nimport { RouteStop, SelectedOrigin, StopTree } from \"../__schedule\";\nimport { createStopTreeCoordStore } from \"./graphics/useTreeStopPositions\";\nimport LineDiagramWithStops from \"./LineDiagramWithStops\";\nimport StopCard from \"./StopCard\";\n\ninterface Props {\n  stopTree: StopTree;\n  route: Route;\n  directionId: DirectionId;\n  alerts: Alert[];\n}\n\nconst stationsOrStops = (routeType: number): string =>\n  [0, 1, 2].includes(routeType) ? \"Stations\" : \"Stops\";\n\nconst updateURL = (origin: SelectedOrigin, direction?: DirectionId): void => {\n  /* istanbul ignore else */\n  if (window) {\n    // eslint-disable-next-line camelcase\n    const newQuery = {\n      \"schedule_finder[direction_id]\":\n        direction !== undefined ? direction.toString() : \"\",\n      \"schedule_finder[origin]\": origin\n    };\n    const newLoc = updateInLocation(newQuery, window.location);\n    // newLoc is not a true Location, so toString doesn't work\n    window.history.replaceState({}, \"\", `${newLoc.pathname}${newLoc.search}`);\n  }\n};\n\nconst LineDiagram = ({\n  stopTree,\n  route,\n  directionId,\n  alerts\n}: Props): ReactElement<HTMLElement> => {\n  const stopTreeCoordStore = createStopTreeCoordStore(stopTree);\n  const liveData = useRealtime(route, directionId, true);\n  const [query, setQuery] = useState(\"\");\n\n  const allStops: RouteStop[] = stopIds(stopTree).map(stopId =>\n    stopForId(stopTree, stopId)\n  );\n  const filteredStops: RouteStop[] = allStops.filter(stop =>\n    stop.name.toLowerCase().includes(query.toLowerCase())\n  );\n\n  const handleStopClick = (stop: RouteStop): void => {\n    changeOrigin(stop.id);\n\n    const currentState = getCurrentState();\n    const { modalOpen: modalIsOpen } = currentState;\n\n    updateURL(stop.id, directionId);\n\n    if (currentState.selectedOrigin !== undefined && !modalIsOpen) {\n      storeHandler({\n        type: \"OPEN_MODAL\",\n        newStoreValues: {\n          modalMode: \"schedule\"\n        }\n      });\n    }\n  };\n\n  return (\n    <>\n      {!isSubwayRoute(route) && (\n        <h3 className=\"m-schedule-diagram__heading\">\n          {stationsOrStops(route.type)}\n        </h3>\n      )}\n      <SearchBox\n        id=\"stop-search\"\n        labelText={`Search for a ${stationsOrStops(route.type)\n          .toLowerCase()\n          .slice(0, -1)}`}\n        onChange={setQuery}\n        className=\"m-schedule-diagram__filter\"\n      />\n      {query !== \"\" ? (\n        <ol className=\"m-schedule-diagram m-schedule-diagram--searched\">\n          {filteredStops.length ? (\n            filteredStops.map((stop: RouteStop) => (\n              <StopCard\n                key={stop.id}\n                stopTree={stopTree}\n                stopId={stop.id}\n                alerts={alerts}\n                onClick={handleStopClick}\n                liveData={liveData?.[stop.id]}\n                searchQuery={query}\n              />\n            ))\n          ) : (\n            <div className=\"c-alert-item c-alert-item--low c-alert-item__top-text-container\">\n              No stops {route.direction_names[directionId]} to{\" \"}\n              {route.direction_destinations[directionId]} matching{\" \"}\n              <b className=\"u-highlight\">{query}</b>. Try changing your\n              direction or adjusting your search.\n            </div>\n          )}\n        </ol>\n      ) : (\n        <Provider store={stopTreeCoordStore}>\n          <LineDiagramWithStops\n            stopTree={stopTree}\n            route={route}\n            directionId={directionId}\n            alerts={alerts}\n            handleStopClick={handleStopClick}\n            liveData={liveData}\n          />\n        </Provider>\n      )}\n    </>\n  );\n};\n\nexport default LineDiagram;\n","import { partition } from \"lodash\";\nimport React, { ReactElement } from \"react\";\nimport {\n  longestPath,\n  longestPathStartingId,\n  newBranchesStartingInSlice,\n  nextStopIds\n} from \"../../../helpers/stop-tree\";\nimport { hasPredictionTime } from \"../../../models/prediction\";\nimport { Alert, DirectionId, Route } from \"../../../__v3api\";\nimport { RouteStop, StopId, StopTree } from \"../__schedule\";\nimport Diagram from \"./graphics/Diagram\";\nimport useTreeStopPositions, { RefMap } from \"./graphics/useTreeStopPositions\";\nimport ExpandableBranch from \"./ExpandableBranch\";\nimport StopCard from \"./StopCard\";\nimport { LiveDataByStop } from \"./__line-diagram\";\n\ninterface Props {\n  stopTree: StopTree;\n  route: Route;\n  directionId: DirectionId;\n  alerts: Alert[];\n  handleStopClick: (stop: RouteStop) => void;\n  liveData?: LiveDataByStop;\n}\n\nexport const StopRefContext = React.createContext<[RefMap, () => void]>([\n  new Map(),\n  () => {}\n]);\n\nconst stopsToTerminus = (stopTree: StopTree, stopId: StopId): StopId[] => [\n  stopId,\n  ...nextStopIds(stopTree, stopId).flatMap(nextId =>\n    stopsToTerminus(stopTree, nextId)\n  )\n];\n\nconst nextPrimaryAndBranches = (\n  stopTree: StopTree,\n  stopIds: StopId[]\n): [StopId, StopId[]] => {\n  const primaryPath = longestPath(stopTree);\n  const [primary, branches] = partition(stopIds, id =>\n    primaryPath.includes(id)\n  );\n\n  return [primary[0], branches];\n};\n\nconst NextStopOrBranch = ({\n  stopTree,\n  stopId,\n  alerts,\n  mergingInBranches,\n  splittingOffBranches,\n  handleStopClick,\n  liveData\n}: {\n  stopTree: StopTree;\n  stopId: StopId;\n  alerts: Alert[];\n  mergingInBranches: StopId[][];\n  splittingOffBranches: StopId[];\n  handleStopClick: (stop: RouteStop) => void;\n  liveData?: LiveDataByStop;\n}): ReactElement<HTMLElement> => {\n  // Splitting off branch\n  if (splittingOffBranches.length) {\n    const splittingOffBranch =\n      splittingOffBranches[splittingOffBranches.length - 1];\n    const remainingSplittingOffBranches = splittingOffBranches.slice(0, -1);\n\n    const branchStopIds = stopsToTerminus(stopTree, splittingOffBranch);\n    const terminalStopId = branchStopIds[branchStopIds.length - 1];\n    const nonTerminalStops = branchStopIds.slice(0, -1);\n    const expandableBranch = nonTerminalStops.length\n      ? [\n          <ExpandableBranch\n            key={`branch-${terminalStopId}`}\n            stopTree={stopTree}\n            // Strip the terminus stop\n            stopIds={nonTerminalStops}\n            alerts={alerts}\n            handleStopClick={handleStopClick}\n            liveData={liveData}\n          />\n        ]\n      : [];\n    const children = [\n      ...expandableBranch,\n      <StopCard\n        key={`stop-card-${terminalStopId}`}\n        stopTree={stopTree}\n        stopId={terminalStopId}\n        alerts={alerts}\n        onClick={handleStopClick}\n        liveData={liveData?.[terminalStopId]}\n      />,\n      <NextStopOrBranch\n        key={`tail-${terminalStopId}`}\n        stopTree={stopTree}\n        stopId={stopId}\n        alerts={alerts}\n        mergingInBranches={mergingInBranches}\n        splittingOffBranches={remainingSplittingOffBranches}\n        handleStopClick={handleStopClick}\n        liveData={liveData}\n      />\n    ];\n\n    return <>{children}</>;\n  }\n\n  const newMergingInBranches: StopId[][] = mergingInBranches.concat(\n    newBranchesStartingInSlice(stopTree, stopId).map(id => [id])\n  );\n\n  const mergingBranch: StopId[] | undefined = newMergingInBranches.find(\n    branch => branch[branch.length - 1] === stopId\n  );\n\n  // Merging in branch\n  if (mergingBranch) {\n    const remainingMergingInBranches = mergingInBranches.filter(\n      branch => branch !== mergingBranch\n    );\n    const startingId: StopId = mergingBranch[0];\n    const nonStartingStops = mergingBranch.slice(1, -1);\n\n    const expandableBranch = nonStartingStops.length\n      ? [\n          <ExpandableBranch\n            key={`branch-${startingId}`}\n            stopTree={stopTree}\n            // Strip the merge stop\n            stopIds={nonStartingStops}\n            alerts={alerts}\n            handleStopClick={handleStopClick}\n            liveData={liveData}\n          />\n        ]\n      : [];\n    const children = [\n      <StopCard\n        key={`stop-card-${startingId}`}\n        stopTree={stopTree}\n        stopId={startingId}\n        alerts={alerts}\n        onClick={handleStopClick}\n        liveData={liveData?.[startingId]}\n      />,\n      ...expandableBranch,\n      <NextStopOrBranch\n        key={`tail-${startingId}`}\n        stopTree={stopTree}\n        stopId={stopId}\n        alerts={alerts}\n        mergingInBranches={remainingMergingInBranches}\n        splittingOffBranches={splittingOffBranches}\n        handleStopClick={handleStopClick}\n        liveData={liveData}\n      />\n    ];\n\n    return <>{children}</>;\n  }\n\n  // Primary branch\n  const nextIds = nextStopIds(stopTree, stopId);\n  if (nextIds.length) {\n    const [nextId, newSplittingOffBranches] = nextPrimaryAndBranches(\n      stopTree,\n      nextIds\n    );\n\n    if (newSplittingOffBranches.length) {\n      // Display splitting off branches before any next stops on the primary branch\n      const children = [\n        <StopCard\n          key={stopId}\n          stopTree={stopTree}\n          stopId={stopId}\n          alerts={alerts}\n          onClick={handleStopClick}\n          liveData={liveData?.[stopId]}\n        />,\n        <NextStopOrBranch\n          key={`${stopId}-${nextId}`}\n          stopTree={stopTree}\n          stopId={nextId}\n          alerts={alerts}\n          mergingInBranches={mergingInBranches}\n          splittingOffBranches={newSplittingOffBranches}\n          handleStopClick={handleStopClick}\n          liveData={liveData}\n        />\n      ];\n\n      return <>{children}</>;\n    }\n\n    const mergingInBranchesWithNext = newMergingInBranches.map(branch => {\n      const lastStopId: StopId = branch[branch.length - 1];\n      return branch.concat(nextStopIds(stopTree, lastStopId));\n    });\n\n    const children = [\n      <StopCard\n        key={stopId}\n        stopTree={stopTree}\n        stopId={stopId}\n        alerts={alerts}\n        onClick={handleStopClick}\n        liveData={liveData?.[stopId]}\n      />,\n      <NextStopOrBranch\n        key={`${stopId}-${nextId}`}\n        stopTree={stopTree}\n        stopId={nextId}\n        alerts={alerts}\n        mergingInBranches={mergingInBranchesWithNext}\n        splittingOffBranches={[]}\n        handleStopClick={handleStopClick}\n        liveData={liveData}\n      />\n    ];\n\n    return <>{children}</>;\n  }\n\n  return (\n    <StopCard\n      key={stopId}\n      stopTree={stopTree}\n      stopId={stopId}\n      alerts={alerts}\n      onClick={handleStopClick}\n      liveData={liveData?.[stopId]}\n    />\n  );\n};\n\nconst LineDiagramWithStops = ({\n  stopTree,\n  route,\n  directionId,\n  alerts,\n  handleStopClick,\n  liveData\n}: Props): ReactElement<HTMLElement> => {\n  // create a ref for each stop - we will use this to track the location of the stop so we can place the line diagram bubbles\n  const [stopRefsMap, updateAllStopCoords] = useTreeStopPositions(stopTree);\n\n  const anyCrowding = Object.values(\n    liveData || {}\n  ).some(({ headsigns }): boolean =>\n    headsigns\n      ? headsigns\n          .filter(hasPredictionTime)\n          .some(\n            ({ time_data_with_crowding_list: timeData }): boolean =>\n              !!timeData[0].crowding\n          )\n      : false\n  );\n\n  return (\n    <StopRefContext.Provider value={[stopRefsMap, updateAllStopCoords]}>\n      <div\n        className={`m-schedule-diagram ${\n          !anyCrowding ? \"u-no-crowding-data\" : \"\"\n        }`}\n      >\n        <Diagram\n          stopTree={stopTree}\n          route={route}\n          directionId={directionId}\n          alerts={alerts}\n          liveData={liveData}\n        />\n        <ol>\n          <NextStopOrBranch\n            stopTree={stopTree}\n            stopId={longestPathStartingId(stopTree)}\n            alerts={alerts}\n            mergingInBranches={[]}\n            splittingOffBranches={[]}\n            handleStopClick={handleStopClick}\n            liveData={liveData}\n          />\n        </ol>\n      </div>\n    </StopRefContext.Provider>\n  );\n};\n\nexport default LineDiagramWithStops;\n","import React from \"react\";\nimport { TooltipWrapper, crowdingIcon } from \"../../../helpers/icon\";\nimport {\n  crowdingDescriptions,\n  crCrowdingDescriptions\n} from \"../../../models/vehicle\";\nimport { CrowdingType } from \"../__schedule\";\n\ninterface LiveCrowdingIconProps {\n  crowding: CrowdingType;\n  tooltipPlacement?: \"top\" | \"bottom\" | \"left\" | \"right\";\n  isCommuterRail?: boolean;\n}\n\nconst LiveCrowdingIcon = ({\n  crowding,\n  tooltipPlacement,\n  isCommuterRail\n}: LiveCrowdingIconProps): JSX.Element => (\n  <div className=\"m-schedule-diagram__prediction-crowding\">\n    {crowding ? (\n      <TooltipWrapper\n        tooltipText={\n          isCommuterRail\n            ? `This train typically has<br /><strong>${crCrowdingDescriptions(\n                crowding\n              )}</strong>`\n            : `Currently <strong>${crowdingDescriptions(\n                crowding\n              ).toLowerCase()}</strong>`\n        }\n        tooltipOptions={{\n          placement: tooltipPlacement || \"left\",\n          animation: false,\n          html: true\n        }}\n      >\n        {crowdingIcon(\n          `c-icon__crowding--${crowding} ${\n            isCommuterRail ? \"c-icon__crowding--commuter-rail\" : \"\"\n          }`\n        )}\n      </TooltipWrapper>\n    ) : (\n      crowdingIcon(\"c-icon__crowding--crowding_unavailable\")\n    )}\n  </div>\n);\n\nexport default LiveCrowdingIcon;\n","import React, { ReactElement, useContext } from \"react\";\nimport { effectNameForAlert } from \"../../../components/Alerts\";\nimport GlxOpen from \"../../../components/GlxOpen\";\nimport MatchHighlight from \"../../../components/MatchHighlight\";\nimport { alertIcon } from \"../../../helpers/icon\";\nimport {\n  hasBranches,\n  isEndNode,\n  isStartNode,\n  stopForId\n} from \"../../../helpers/stop-tree\";\nimport {\n  alertsByStop,\n  isActiveDiversion,\n  isHighSeverityOrHighPriority\n} from \"../../../models/alert\";\nimport { hasPredictionTime } from \"../../../models/prediction\";\nimport {\n  isACommuterRailRoute,\n  isAGreenLineRoute,\n  isSubwayRoute\n} from \"../../../models/route\";\nimport { Alert, Route } from \"../../../__v3api\";\nimport { RouteStop, RouteStopRoute, StopId, StopTree } from \"../__schedule\";\nimport { branchPosition, diagramWidth } from \"./line-diagram-helpers\";\nimport StopConnections from \"./StopConnections\";\nimport StopFeatures from \"./StopFeatures\";\nimport StopPredictions from \"./StopPredictions\";\nimport { StopRefContext } from \"./LineDiagramWithStops\";\nimport { LiveData } from \"./__line-diagram\";\n\ninterface Props {\n  stopTree: StopTree;\n  stopId: StopId;\n  alerts: Alert[];\n  onClick: (stop: RouteStop) => void;\n  liveData?: LiveData;\n  searchQuery?: string;\n}\n\nconst width = (stopTree: StopTree, stopId: StopId): number =>\n  diagramWidth(branchPosition(stopTree, stopId));\n\nconst hasBranchLabel = (stopTree: StopTree, stopId: StopId): boolean => {\n  const stop: RouteStop = stopForId(stopTree, stopId);\n  return (\n    hasBranches(stopTree) &&\n    (isStartNode(stopTree, stopId) || isEndNode(stopTree, stopId)) &&\n    !!stop.branch &&\n    !!stop.route\n  );\n};\n\nconst lineName = ({ name, route: routeStopRoute }: RouteStop): string => {\n  const route = routeStopRoute as Route;\n  const title = isAGreenLineRoute(route)\n    ? `Green Line ${route.id.split(\"-\")[1]}`\n    : name;\n  const lineOrBranch = isACommuterRailRoute(route) ? \"Line\" : \"Branch\";\n  return `${title} ${lineOrBranch}`;\n};\n\nconst hasLivePredictions = (liveData?: LiveData): boolean =>\n  !!liveData && liveData.headsigns.some(hasPredictionTime);\nconst showPrediction = (\n  stopTree: StopTree,\n  stopId: StopId,\n  liveData?: LiveData\n): boolean => hasLivePredictions(liveData) && !isEndNode(stopTree, stopId);\n\nconst connectionsFor = (\n  routeStop: RouteStop,\n  stopTree: StopTree\n): RouteStopRoute[] => {\n  const { connections } = routeStop;\n  const greenLineConnections = connections.filter(isAGreenLineRoute);\n  if (routeStop.route && hasBranches(stopTree) && greenLineConnections.length) {\n    // If we can connect to other Green Line routes, they can connect back to\n    // this route as well.\n    const routeStopRoute: RouteStopRoute = {\n      ...routeStop.route,\n      \"custom_route?\": false\n    };\n    return [routeStopRoute, ...connections];\n  }\n  return connections;\n};\n\nconst hasHighPriorityAlert = (stopId: StopId, alerts: Alert[]): boolean =>\n  alertsByStop(alerts, stopId).filter(isHighSeverityOrHighPriority).length > 0;\n\nconst routeForStop = (\n  stopTree: StopTree,\n  stopId: StopId\n): RouteStopRoute | null => {\n  const { route } = stopForId(stopTree, stopId);\n  return route;\n};\n\nconst hasUpcomingDeparturesIfSubway = (\n  stopTree: StopTree,\n  stopId: StopId,\n  liveData?: LiveData\n): boolean => {\n  const route = routeForStop(stopTree, stopId);\n  if (!route || !isSubwayRoute(route)) return true;\n  return !!liveData && liveData.headsigns.length > 0;\n};\n\nconst schedulesButtonLabel = (stopTree: StopTree, stopId: StopId): string => {\n  const route = routeForStop(stopTree, stopId);\n  return route && isSubwayRoute(route)\n    ? \"View upcoming departures\"\n    : \"View schedule\";\n};\n\nconst Alert = (): JSX.Element => (\n  <>\n    {alertIcon(\"c-svg__icon-alerts-triangle\")}\n    <span className=\"sr-only\">Service alert or delay</span>\n    &nbsp;\n  </>\n);\n\nconst StopCard = ({\n  stopTree,\n  stopId,\n  alerts,\n  onClick,\n  liveData,\n  searchQuery\n}: Props): ReactElement<HTMLElement> => {\n  const refs = useContext(StopRefContext)[0];\n  const routeStop: RouteStop = stopForId(stopTree, stopId);\n\n  const diversionAlert = alerts.find(isActiveDiversion);\n  const showDiversion =\n    diversionAlert &&\n    !(hasLivePredictions(liveData) && isEndNode(stopTree, stopId));\n\n  return (\n    <li\n      className=\"m-schedule-diagram__stop\"\n      style={{\n        paddingLeft: searchQuery ? \"0.5rem\" : `${width(stopTree, stopId)}px`\n      }}\n    >\n      <section className=\"m-schedule-diagram__content\">\n        <GlxOpen pageType=\"line-diagram\" stopId={stopId} />\n        {hasBranchLabel(stopTree, stopId) && (\n          <div className=\"u-bold u-small-caps\">{lineName(routeStop)}</div>\n        )}\n        <header\n          className=\"m-schedule-diagram__stop-heading\"\n          ref={el => refs.set(stopId, el)}\n        >\n          <h4 className=\"m-schedule-diagram__stop-link notranslate\">\n            <a href={`/stops/${stopId}`}>\n              {hasHighPriorityAlert(stopId, alerts) && <Alert />}\n              <MatchHighlight text={routeStop.name} matchQuery={searchQuery} />\n            </a>\n          </h4>\n          {StopFeatures(routeStop)}\n        </header>\n\n        <div className=\"m-schedule-diagram__stop-details\">\n          {StopConnections(stopId, connectionsFor(routeStop, stopTree))}\n          {showPrediction(stopTree, stopId, liveData) ? (\n            <StopPredictions\n              headsigns={liveData!.headsigns}\n              isCommuterRail={\n                !!routeStop.route && isACommuterRailRoute(routeStop.route)\n              }\n            />\n          ) : (\n            showDiversion && (\n              <div className=\"m-schedule-diagram__alert\">\n                {effectNameForAlert(diversionAlert!)}\n              </div>\n            )\n          )}\n        </div>\n\n        {!isEndNode(stopTree, stopId) &&\n          hasUpcomingDeparturesIfSubway(stopTree, stopId, liveData) && (\n            <footer className=\"m-schedule-diagram__footer\">\n              <button\n                className=\"btn btn-link\"\n                type=\"button\"\n                onClick={() => onClick(routeStop)}\n              >\n                {schedulesButtonLabel(stopTree, stopId)}\n              </button>\n            </footer>\n          )}\n      </section>\n    </li>\n  );\n};\n\nexport default StopCard;\n","import React from \"react\";\nimport { sortBy } from \"lodash\";\nimport { RouteStopRoute } from \"../__schedule\";\nimport { TooltipWrapper, modeIcon } from \"../../../helpers/icon\";\nimport { isABusRoute, isACommuterRailRoute } from \"../../../models/route\";\nimport { routeBgClass } from \"../../../helpers/css\";\nimport { Route } from \"../../../__v3api\";\n\nconst filteredConnections = (\n  connections: RouteStopRoute[]\n): RouteStopRoute[] => {\n  const firstCRIndex = connections.findIndex(\n    connection => connection.type === 2\n  );\n  const firstFerryIndex = connections.findIndex(\n    connection => connection.type === 4\n  );\n\n  // show only 1 CR or Ferry icon\n  const consolidated = connections.filter(\n    (connection, index) =>\n      (connection.type !== 2 && connection.type !== 4) ||\n      (connection.type === 2 && index === firstCRIndex) ||\n      (connection.type === 4 && index === firstFerryIndex)\n  );\n\n  // sort by type (CR or Ferry icon first), then sort_order\n  return sortBy(consolidated, [\n    ({ type }) => ([2, 4].includes(type) ? -1 : 0),\n    \"sort_order\"\n  ]);\n};\n\nconst connectionName = (connection: Route): string => {\n  if (isABusRoute(connection)) {\n    return connection.name.startsWith(\"SL\")\n      ? `Silver Line ${connection.name}`\n      : `Route ${connection.name}`;\n  }\n\n  if (isACommuterRailRoute(connection)) {\n    return \"Commuter Rail\";\n  }\n\n  return connection.name;\n};\n\nconst StopConnections = (\n  route_id: string,\n  connections: RouteStopRoute[]\n): JSX.Element => (\n  <div className=\"m-schedule-diagram__connections\">\n    {filteredConnections(connections).map((connectingRoute: Route) => (\n      <TooltipWrapper\n        key={connectingRoute.id}\n        href={`/schedules/${connectingRoute.id}/line`}\n        tooltipText={connectionName(connectingRoute)}\n        tooltipOptions={{\n          placement: \"bottom\",\n          animation: false\n        }}\n      >\n        {isABusRoute(connectingRoute) ? (\n          <span\n            key={connectingRoute.id}\n            className={`c-icon__bus-pill--small m-schedule-diagram__connection ${routeBgClass(\n              connectingRoute\n            )}`}\n          >\n            {connectingRoute.name}\n          </span>\n        ) : (\n          <span\n            key={connectingRoute.id}\n            className=\"m-schedule-diagram__connection\"\n          >\n            {modeIcon(connectingRoute.id)}\n          </span>\n        )}\n      </TooltipWrapper>\n    ))}\n  </div>\n);\n\nexport { filteredConnections, StopConnections as default };\n","import React from \"react\";\nimport { RouteStop } from \"../__schedule\";\nimport {\n  TooltipWrapper,\n  parkingIcon,\n  accessibleIcon\n} from \"../../../helpers/icon\";\nimport { isACommuterRailRoute } from \"../../../models/route\";\nimport { isBusRouteStop } from \"../../../helpers/routes\";\n\nconst StopFeatures = (routeStop: RouteStop): JSX.Element => (\n  <div className=\"m-schedule-diagram__features\">\n    {routeStop.stop_features.includes(\"parking_lot\") ? (\n      <TooltipWrapper\n        tooltipText=\"Parking\"\n        tooltipOptions={{ placement: \"bottom\" }}\n      >\n        {parkingIcon(\"m-schedule-diagram__feature-icon\")}\n      </TooltipWrapper>\n    ) : null}\n    {// NOTE: Bus routes are always considered accessible, see\n    // https://app.asana.com/0/1201653980996886/1201894234147725/f\n    isBusRouteStop(routeStop) || routeStop.stop_features.includes(\"access\") ? (\n      <TooltipWrapper\n        tooltipText=\"Accessible\"\n        tooltipOptions={{ placement: \"bottom\" }}\n      >\n        {accessibleIcon(\n          \"c-svg__icon-acessible-default m-schedule-diagram__feature-icon\"\n        )}\n      </TooltipWrapper>\n    ) : null}\n    {routeStop.zone &&\n      routeStop.route &&\n      isACommuterRailRoute(routeStop.route) && (\n        <span className=\"c-icon__cr-zone m-schedule-diagram__feature-icon\">{`Zone ${routeStop.zone}`}</span>\n      )}\n  </div>\n);\n\nexport default StopFeatures;\n","import React from \"react\";\nimport { capitalize } from \"lodash\";\nimport { HeadsignWithCrowding } from \"../../../__v3api\";\nimport {\n  timeForCommuterRail,\n  statusForCommuterRail\n} from \"../../../helpers/prediction-helpers\";\nimport {\n  isSkippedOrCancelled,\n  hasPredictionTime\n} from \"../../../models/prediction\";\nimport LiveCrowdingIcon from \"./LiveCrowdingIcon\";\n\ninterface StopPredictions {\n  headsigns: HeadsignWithCrowding[];\n  isCommuterRail: boolean;\n}\n\nconst predictionTexts = (headsign: HeadsignWithCrowding): string[] => {\n  const texts = [headsign.name];\n  if (headsign.train_number) {\n    texts.push(` · Train ${headsign.train_number}`);\n  }\n\n  const predictedOrScheduledTime =\n    headsign.time_data_with_crowding_list[0].time_data;\n  const { prediction } = predictedOrScheduledTime;\n\n  if (prediction && prediction.track) {\n    texts.push(` · Track ${prediction.track}`);\n  }\n\n  const status = statusForCommuterRail(predictedOrScheduledTime);\n  if (status) {\n    texts.push(` · ${status}`);\n  }\n  return texts;\n};\n\nconst StopPredictions = ({\n  headsigns,\n  isCommuterRail\n}: StopPredictions): JSX.Element => {\n  let predictions: JSX.Element[];\n  const liveHeadsigns = headsigns.filter(hasPredictionTime);\n\n  if (isCommuterRail) {\n    // Display at most 1 prediction for Commuter Rail\n    predictions = liveHeadsigns.slice(0, 1).map(headsign => {\n      const enhancedTimeData = headsign.time_data_with_crowding_list[0];\n      const predictedOrScheduledTime = enhancedTimeData.time_data;\n      const predictionTimeClass = isSkippedOrCancelled(\n        enhancedTimeData.predicted_schedule.prediction\n      )\n        ? \"m-schedule-diagram__cr-prediction-time strikethrough\"\n        : \"m-schedule-diagram__cr-prediction-time\";\n\n      return (\n        <div key={`${headsign.name}-cr`}>\n          <div className=\"m-schedule-diagram__cr-prediction\">\n            {timeForCommuterRail(predictedOrScheduledTime, predictionTimeClass)}\n          </div>\n          <div className=\"m-schedule-diagram__cr-prediction-details\">\n            {predictionTexts(headsign).map((text: string) => (\n              <span key={text}>{text}</span>\n            ))}\n          </div>\n        </div>\n      );\n    });\n  } else {\n    predictions = liveHeadsigns.map((headsign, index) => {\n      const { crowding } = headsign.time_data_with_crowding_list[0];\n      return (\n        <div\n          // eslint-disable-next-line react/no-array-index-key\n          key={`headsign.name-${index}`}\n          className=\"m-schedule-diagram__prediction notranslate\"\n        >\n          <div>{headsign.name}</div>\n          <div className=\"m-schedule-diagram__prediction-time\">\n            {capitalize(\n              headsign.time_data_with_crowding_list[0].time_data.prediction!.time.join(\n                \" \"\n              )\n            )}\n          </div>\n          <LiveCrowdingIcon crowding={crowding} />\n        </div>\n      );\n    });\n  }\n\n  return <div className=\"m-schedule-diagram__predictions\">{predictions}</div>;\n};\n\nexport default StopPredictions;\n","import React from \"react\";\nimport { renderToString } from \"react-dom/server\";\nimport { useSelector } from \"react-redux\";\nimport { RouteStop, LineDiagramVehicle } from \"../__schedule\";\nimport CrowdingPill from \"./CrowdingPill\";\nimport { TooltipWrapper, vehicleArrowIcon } from \"../../../helpers/icon\";\nimport { StopCoord, CoordState, CIRC_RADIUS } from \"./graphics/graphic-helpers\";\n\ninterface VehicleIconsProps {\n  stop: RouteStop;\n  vehicles: LineDiagramVehicle[] | null;\n}\n\nconst CrowdingIconString = (vehicle: LineDiagramVehicle): string =>\n  renderToString(<CrowdingPill crowding={vehicle.crowding} />);\n\nconst VehicleIcons = ({\n  stop,\n  vehicles\n}: VehicleIconsProps): JSX.Element | null => {\n  const coords: StopCoord | null = useSelector(\n    (state: CoordState) => state[stop.id]\n  );\n  if (!vehicles || !coords) return null;\n  const [x, y] = coords;\n  const left = `${x - CIRC_RADIUS}px`;\n  const tooltips = vehicles.map(vehicle => {\n    const top = `${{\n      // eslint-disable-next-line camelcase\n      in_transit: y - 50,\n      incoming: y - 25,\n      stopped: y - 10\n    }[vehicle.status] || y}px`;\n\n    return (\n      <div\n        key={vehicle.id}\n        className=\"m-schedule-diagram__vehicle\"\n        style={{ top, left }}\n      >\n        <TooltipWrapper\n          tooltipText={`<div class=\"m-schedule-diagram__vehicle-tooltip\">${\n            vehicle.crowding ? `${CrowdingIconString(vehicle)}<br/>` : \"\"\n          }${vehicle.tooltip}</div>`}\n          tooltipOptions={{ placement: \"right\", animation: false, html: true }}\n        >\n          {vehicleArrowIcon(\"m-schedule-diagram__vehicle--icon\")}\n        </TooltipWrapper>\n      </div>\n    );\n  });\n\n  return <>{tooltips}</>;\n};\n\nexport default VehicleIcons;\n","import React, { ReactElement } from \"react\";\nimport { uniqBy } from \"lodash\";\nimport { routeToModeName } from \"../../../../helpers/css\";\nimport {\n  isBranchingNode,\n  isStartNode,\n  largestSliceSize,\n  longestPath,\n  longestPathLength,\n  nextStopIds,\n  stopForId,\n  stopIds\n} from \"../../../../helpers/stop-tree\";\nimport { isAGreenLineRoute } from \"../../../../models/route\";\nimport { Alert, DirectionId, Route } from \"../../../../__v3api\";\nimport { RouteStop, StopId, StopTree } from \"../../__schedule\";\nimport { diagramWidth } from \"../line-diagram-helpers\";\nimport VehicleIcons from \"../VehicleIcons\";\nimport { LiveDataByStop } from \"../__line-diagram\";\nimport { BASE_LINE_WIDTH, DiagonalHatchPattern } from \"./graphic-helpers\";\nimport Stop from \"./Stop\";\nimport Line from \"./Line\";\nimport Merges from \"./Merges\";\n\ninterface Props {\n  stopTree: StopTree;\n  route: Route;\n  directionId: DirectionId;\n  alerts: Alert[];\n  liveData?: LiveDataByStop;\n}\n\nconst routeName = (route: Route): string =>\n  isAGreenLineRoute(route) ? \"Green Line\" : route.name;\n\nconst diagramDescription = (\n  stopTree: StopTree,\n  route: Route,\n  directionId: DirectionId\n): string => {\n  const text = `${longestPathLength(stopTree)} stops`;\n  const {\n    direction_destinations: destinations,\n    direction_names: names\n  } = route;\n  if (destinations) {\n    return `${text} going ${names[directionId]} to ${destinations[directionId]}`;\n  }\n  return text;\n};\n\nconst hasBranchLines = (stopTree: StopTree): boolean =>\n  largestSliceSize(stopTree) > 1;\n\nconst branchingDescription = (stopTree: StopTree): string => {\n  const primaryPath = longestPath(stopTree);\n  const branchingStops: StopId[] = primaryPath.filter(id =>\n    isBranchingNode(stopTree, id)\n  );\n  const branchText = branchingStops.map(branchingStopId => {\n    const routeStop: RouteStop = stopForId(stopTree, branchingStopId);\n    const branchNames: string[] = nextStopIds(stopTree, branchingStopId)\n      .filter(id => !primaryPath.includes(id))\n      .map(id => stopForId(stopTree, id)?.branch || \"\");\n\n    return `Use ${routeStop.name} to transfer to trains on ${branchNames.join(\n      \" or \"\n    )} branches.`;\n  });\n  return branchText.join(\"\");\n};\n\nconst LiveVehicleIconSet = ({\n  stopTree,\n  stopId,\n  liveData\n}: {\n  stopTree: StopTree;\n  stopId: StopId;\n  liveData?: LiveDataByStop;\n}): ReactElement<HTMLElement> | null => {\n  if (!liveData || !liveData[stopId]) return null;\n  const vehicles = uniqBy(liveData[stopId].vehicles, \"id\");\n  // Hide vehicles arriving to the origin from 'off the line'\n  const vehicleData = isStartNode(stopTree, stopId)\n    ? vehicles.filter(vehicle => vehicle.status === \"stopped\")\n    : vehicles;\n\n  return (\n    <VehicleIcons\n      key={`${stopId}-vehicles`}\n      stop={stopForId(stopTree, stopId)}\n      vehicles={vehicleData}\n    />\n  );\n};\n\nconst Diagram = ({\n  stopTree,\n  route,\n  directionId,\n  alerts,\n  liveData\n}: Props): ReactElement<HTMLElement> => (\n  <>\n    {stopIds(stopTree).map(stopId => (\n      <LiveVehicleIconSet\n        key={stopId}\n        stopTree={stopTree}\n        stopId={stopId}\n        liveData={liveData}\n      />\n    ))}\n    <svg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      role=\"img\"\n      aria-labelledby=\"diagram-title diagram-desc\"\n      className={`line-diagram-svg ${routeToModeName(route)}`}\n      width={`${diagramWidth(1)}px`}\n      height=\"100%\"\n      style={{ left: BASE_LINE_WIDTH / 2, overflow: \"visible\" }}\n    >\n      <title id=\"diagram-title\">Line diagram for {routeName(route)}</title>\n      <desc id=\"diagram-desc\">\n        {diagramDescription(stopTree, route, directionId)}\n        {hasBranchLines(stopTree) && branchingDescription(stopTree)}\n      </desc>\n      <defs>{DiagonalHatchPattern()}</defs>\n\n      {/* If there are multiple branches, draw the lines and curves for those */\n      hasBranchLines(stopTree) && (\n        <Merges stopTree={stopTree} alerts={alerts} />\n      )}\n\n      {/* Draw lines between stops */\n      stopIds(stopTree).map(stopId =>\n        nextStopIds(stopTree, stopId).map(nextStopId => (\n          <Line\n            key={`${stopId}-${nextStopId}`}\n            stopTree={stopTree}\n            fromId={stopId}\n            toId={nextStopId}\n            alerts={alerts}\n          />\n        ))\n      )}\n\n      {/* Draw circles for each stop */\n      stopIds(stopTree).map(stopId => (\n        <Stop key={stopId} stopId={stopId} />\n      ))}\n    </svg>\n  </>\n);\n\nexport default Diagram;\n","import React, { ReactElement } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport {\n  isBranchingNode,\n  isEndNode,\n  isMergeNode,\n  isStartNode,\n  longestPath\n} from \"../../../../helpers/stop-tree\";\nimport { hasAnActiveDiversion } from \"../../../../models/alert\";\nimport { Alert } from \"../../../../__v3api\";\nimport { StopId, StopTree } from \"../../__schedule\";\nimport { branchPosition } from \"../line-diagram-helpers\";\nimport {\n  BASE_LINE_WIDTH,\n  BRANCH_LINE_WIDTH,\n  BRANCH_SPACING,\n  CoordState,\n  StopCoord\n} from \"./graphic-helpers\";\n\ninterface Props {\n  stopTree: StopTree;\n  fromId: StopId;\n  toId: StopId;\n  alerts: Alert[];\n}\n\nconst isOnPrimaryBranch = (stopTree: StopTree, stopId: StopId): boolean =>\n  longestPath(stopTree).includes(stopId);\n\nconst isMiddleBranchStop = (stopTree: StopTree, stopId: StopId): boolean =>\n  !isOnPrimaryBranch(stopTree, stopId) &&\n  !isStartNode(stopTree, stopId) &&\n  !isEndNode(stopTree, stopId) &&\n  !isMergeNode(stopTree, stopId) &&\n  !isBranchingNode(stopTree, stopId);\n\nconst lineProps = (\n  stopTree: StopTree,\n  fromId: StopId,\n  toId: StopId,\n  fromCoords: StopCoord,\n  toCoords: StopCoord,\n  alerts: Alert[]\n): React.SVGProps<SVGLineElement> => {\n  const x =\n    BRANCH_SPACING * (branchPosition(stopTree, fromId) - 1) +\n    BASE_LINE_WIDTH +\n    1;\n  const [, y1] = fromCoords;\n  const [, y2] = toCoords;\n\n  const strokeWidth =\n    isMiddleBranchStop(stopTree, fromId) && isMiddleBranchStop(stopTree, toId)\n      ? BRANCH_LINE_WIDTH\n      : BASE_LINE_WIDTH;\n\n  const strokeProp =\n    hasAnActiveDiversion(fromId, alerts) && hasAnActiveDiversion(toId, alerts)\n      ? { stroke: \"url(#diagonalHatch)\" }\n      : {};\n\n  return {\n    key: `${fromId}-${toId}`,\n    className: \"line-diagram-svg__line\",\n    strokeWidth: `${strokeWidth}px`,\n    x1: `${x}px`,\n    x2: `${x}px`,\n    y1: `${y1}px`,\n    y2: `${y2}px`,\n    ...strokeProp\n  };\n};\n\nconst Line = ({\n  stopTree,\n  fromId,\n  toId,\n  alerts\n}: Props): ReactElement | null => {\n  const fromCoords: StopCoord | null = useSelector(\n    (state: CoordState) => state[fromId]\n  );\n  const toCoords: StopCoord | null = useSelector(\n    (state: CoordState) => state[toId]\n  );\n  if (!fromCoords || !toCoords) return null;\n\n  if (isMergeNode(stopTree, toId) && !isOnPrimaryBranch(stopTree, fromId))\n    return null;\n\n  return (\n    <line\n      {...lineProps(stopTree, fromId, toId, fromCoords, toCoords, alerts)}\n    />\n  );\n};\n\nexport default Line;\n","import React, { ReactElement } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport {\n  isBranchingNode,\n  isMergeNode,\n  longestPath,\n  nextStopIds,\n  previousStopIds\n} from \"../../../../helpers/stop-tree\";\nimport { hasAnActiveDiversion } from \"../../../../models/alert\";\nimport { Alert } from \"../../../../__v3api\";\nimport { StopId, StopTree } from \"../../__schedule\";\nimport {\n  BASE_LINE_WIDTH,\n  CoordState,\n  MERGE_RADIUS,\n  StopCoord\n} from \"./graphic-helpers\";\nimport Line from \"./Line\";\n\ninterface Props {\n  stopTree: StopTree;\n  alerts: Alert[];\n}\n\n// [fromStopId, toStopId]\ntype StopGap = [StopId, StopId];\n\nconst notOnPrimaryPath = (primaryPath: StopId[]) => (stopId: StopId): boolean =>\n  !primaryPath.includes(stopId);\n\nconst mergeStopGaps = (\n  stopTree: StopTree,\n  primaryPath: StopId[]\n): StopGap[] => {\n  const mergeStops: StopId[] = primaryPath.filter(id =>\n    isMergeNode(stopTree, id)\n  );\n  return mergeStops.flatMap(toStopId => {\n    const fromStopIds: StopId[] = previousStopIds(stopTree, toStopId).filter(\n      notOnPrimaryPath(primaryPath)\n    );\n    return fromStopIds.map(fromStopId => [fromStopId, toStopId] as StopGap);\n  });\n};\n\nconst branchingStopGaps = (\n  stopTree: StopTree,\n  primaryPath: StopId[]\n): StopGap[] => {\n  const branchingStops: StopId[] = primaryPath.filter(id =>\n    isBranchingNode(stopTree, id)\n  );\n  return branchingStops.flatMap(fromStopId => {\n    const toStopIds: StopId[] = nextStopIds(stopTree, fromStopId).filter(\n      notOnPrimaryPath(primaryPath)\n    );\n    return toStopIds.map(toStopId => [fromStopId, toStopId] as StopGap);\n  });\n};\n\nconst stopsToStart = (stopTree: StopTree, stopId: StopId): StopId[] => [\n  ...previousStopIds(stopTree, stopId).flatMap(previousId =>\n    stopsToStart(stopTree, previousId)\n  ),\n  stopId\n];\nconst mergeBends = (\n  stopTree: StopTree,\n  coords: CoordState,\n  mergeGaps: StopGap[],\n  alerts: Alert[]\n): (JSX.Element | null)[] =>\n  mergeGaps.map(([lastStopOnBranch, trunkStop]) => {\n    const trunkStopCoords: StopCoord | null = coords[trunkStop];\n    if (!trunkStopCoords) return null;\n\n    const branchStopIds = stopsToStart(stopTree, lastStopOnBranch);\n    const startingStopId: StopId = branchStopIds[0];\n\n    // Try the last stop on the branch first. If the branch is collapsed, the\n    // coordinates will be null as the last stop is hidden, so use terminus.\n    const branchStopCoords: StopCoord | null =\n      coords[lastStopOnBranch] || coords[startingStopId];\n    if (!branchStopCoords) return null;\n\n    const [trunkX, trunkY] = trunkStopCoords;\n    const [branchX, branchY] = branchStopCoords;\n    const dx = (Math.abs(trunkX - branchX) - MERGE_RADIUS) * -1;\n    const dy = (Math.abs(trunkY - branchY) - MERGE_RADIUS - 20) * 1;\n    const arc = `-${MERGE_RADIUS},${MERGE_RADIUS} 0 0 1 -${MERGE_RADIUS},${MERGE_RADIUS}`;\n    const strokeProp = hasAnActiveDiversion(lastStopOnBranch, alerts)\n      ? { stroke: \"url(#diagonalHatch)\" }\n      : {};\n    const pathProps: React.SVGProps<SVGPathElement> = {\n      key: `${startingStopId}-${trunkStop}-merge`,\n      strokeWidth: `${BASE_LINE_WIDTH}px`,\n      d: `M${branchX},${branchY} v${dy} a${arc} h${dx}`,\n      ...strokeProp\n    };\n    return <path key={pathProps.key} {...pathProps} />;\n  });\n\nconst stopsToTerminus = (stopTree: StopTree, stopId: StopId): StopId[] => [\n  stopId,\n  ...nextStopIds(stopTree, stopId).flatMap(nextId =>\n    stopsToTerminus(stopTree, nextId)\n  )\n];\nconst branchingBends = (\n  stopTree: StopTree,\n  coords: CoordState,\n  branchingGaps: StopGap[],\n  alerts: Alert[]\n): (JSX.Element | null)[] =>\n  branchingGaps.map(([trunkStop, firstStopOnBranch]) => {\n    const trunkStopCoords: StopCoord | null = coords[trunkStop];\n    if (!trunkStopCoords) return null;\n\n    const branchStopIds = stopsToTerminus(stopTree, firstStopOnBranch);\n    const terminusStopId: StopId = branchStopIds[branchStopIds.length - 1];\n\n    // Try the next stop on the branch first. If the branch is collapsed, the\n    // coordinates will be null as the next stop is hidden, so use terminus.\n    const branchStopCoords: StopCoord | null =\n      coords[firstStopOnBranch] || coords[terminusStopId];\n    if (!branchStopCoords) return null;\n\n    const [trunkX, trunkY] = trunkStopCoords;\n    const [branchX, branchY] = branchStopCoords;\n    const dx = (Math.abs(trunkX - branchX) - MERGE_RADIUS) * -1;\n    const dy = (Math.abs(trunkY - branchY) - MERGE_RADIUS - 60) * -1;\n    const arc = `-${MERGE_RADIUS},-${MERGE_RADIUS} 0 0 0 -${MERGE_RADIUS},-${MERGE_RADIUS}`;\n    const strokeProp = hasAnActiveDiversion(firstStopOnBranch, alerts)\n      ? { stroke: \"url(#diagonalHatch)\" }\n      : {};\n    const pathProps: React.SVGProps<SVGPathElement> = {\n      key: `${trunkStop}-${terminusStopId}-branch`,\n      strokeWidth: `${BASE_LINE_WIDTH}px`,\n      d: `M${branchX},${branchY} v${dy} a${arc} h${dx}`,\n      ...strokeProp\n    };\n\n    return <path key={pathProps.key} {...pathProps} />;\n  });\n\nconst Merges = ({\n  stopTree,\n  alerts\n}: Props): ReactElement<HTMLElement> | null => {\n  const coords: CoordState = useSelector((state: CoordState) => state);\n  if (!coords) return null;\n\n  const primaryPath = longestPath(stopTree);\n  const mergeGaps: StopGap[] = mergeStopGaps(stopTree, primaryPath);\n  const branchingGaps: StopGap[] = branchingStopGaps(stopTree, primaryPath);\n  const stopGaps: StopGap[] = mergeGaps.concat(branchingGaps);\n  const bends = mergeBends(stopTree, coords, mergeGaps, alerts).concat(\n    branchingBends(stopTree, coords, branchingGaps, alerts)\n  );\n\n  if (!stopGaps.length && !bends.length) return null;\n\n  return (\n    <g className=\"line-diagram-svg__merge\">\n      {stopGaps.map(\n        ([fromId, toId]) =>\n          fromId &&\n          toId && (\n            <Line\n              key={`${fromId}-${toId}-line`}\n              stopTree={stopTree}\n              fromId={fromId}\n              toId={toId}\n              alerts={alerts}\n            />\n          )\n      )}\n      {bends}\n    </g>\n  );\n};\n\nexport default Merges;\n","import React, { ReactElement } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { StopId } from \"../../__schedule\";\nimport { StopCoord, CoordState, CIRC_RADIUS } from \"./graphic-helpers\";\n\nconst Stop = ({\n  stopId,\n  shuttle\n}: {\n  stopId: StopId;\n  shuttle?: boolean;\n}): ReactElement<SVGCircleElement> | null => {\n  const coords: StopCoord | null = useSelector(\n    (state: CoordState) => state[stopId]\n  );\n  if (!coords) return null;\n  const [x, y] = coords;\n  return (\n    <circle\n      className=\"line-diagram-svg__stop\"\n      r={`${CIRC_RADIUS}px`}\n      cx={`${x}px`}\n      cy={`${y}px`}\n      data-shuttle={!!shuttle}\n    />\n  );\n};\n\nexport default Stop;\n","import React from \"react\";\nimport { AnyAction, Reducer } from \"redux\";\n\nexport const CIRC_RADIUS = 4;\nexport const CIRC_DIAMETER = CIRC_RADIUS * 2;\nexport const BASE_LINE_WIDTH = CIRC_DIAMETER + 2;\nexport const BRANCH_LINE_WIDTH = BASE_LINE_WIDTH + 6;\nexport const BRANCH_SPACING = 16;\nexport const MERGE_RADIUS = 6;\n\nexport type StopCoord = [number, number];\nexport interface CoordState {\n  [key: string]: StopCoord | null;\n}\n\nexport interface CoordAction extends AnyAction {\n  stop: string;\n  coords: StopCoord | null;\n}\n\nexport const coordReducer: Reducer<CoordState, CoordAction> = (\n  allCoordinates: CoordState | undefined,\n  action: CoordAction\n): CoordState => {\n  const { stop, coords } = action;\n  return {\n    ...allCoordinates,\n    [stop]: coords\n  };\n};\n\nexport const DiagonalHatchPattern = (\n  id?: string | undefined\n): React.SVGProps<SVGPatternElement> => (\n  <pattern\n    id={id ?? \"diagonalHatch\"}\n    width=\"10\"\n    height=\"10\"\n    patternTransform=\"rotate(45 0 0)\"\n    patternUnits=\"userSpaceOnUse\"\n  >\n    <line\n      className=\"line-diagram-svg__line\"\n      y2={CIRC_DIAMETER}\n      strokeWidth={`${BRANCH_LINE_WIDTH}px`}\n    />\n  </pattern>\n);\n","import { useCallback, useEffect, useRef } from \"react\";\nimport { useDispatch } from \"react-redux\";\nimport { createStore, Store } from \"redux\";\nimport { stopIds } from \"../../../../helpers/stop-tree\";\nimport { StopId, StopTree } from \"../../__schedule\";\nimport { branchPosition } from \"../line-diagram-helpers\";\nimport {\n  BASE_LINE_WIDTH,\n  BRANCH_SPACING,\n  CoordAction,\n  coordReducer,\n  CoordState\n} from \"./graphic-helpers\";\n\nexport type RefMap = Map<string, HTMLElement | null>;\n\nexport const createStopTreeCoordStore = (\n  stopTree: StopTree\n): Store<CoordState, CoordAction> => {\n  const ids: StopId[] = stopIds(stopTree);\n\n  const initialCoordState: CoordState = ids.reduce(\n    (acc, id) => ({ ...acc, [id]: null }),\n    {}\n  );\n  const store = createStore(\n    coordReducer,\n    initialCoordState,\n    /* eslint-disable no-underscore-dangle, @typescript-eslint/no-explicit-any */\n    (window as any).__REDUX_DEVTOOLS_EXTENSION__ &&\n      (window as any).__REDUX_DEVTOOLS_EXTENSION__()\n    /* eslint-enable no-underscore-dangle, @typescript-eslint/no-explicit-any */\n  );\n\n  return store;\n};\n\nconst xCoordForStop = (stopTree: StopTree, id: StopId): number =>\n  BRANCH_SPACING * (branchPosition(stopTree, id) - 1) + BASE_LINE_WIDTH + 1;\n\nexport default function useTreeStopPositions(\n  stopTree: StopTree\n): [RefMap, () => void] {\n  const stopRefsMap = useRef(new Map() as RefMap);\n  const dispatchStopCoords = useDispatch();\n\n  const updateAllStops = useCallback((): void => {\n    stopRefsMap.current.forEach((el, stopId) => {\n      const x = xCoordForStop(stopTree, stopId);\n      let coordinates = null;\n      if (el) {\n        const { offsetTop, offsetHeight } = el;\n        const y = offsetTop + offsetHeight / 2;\n        coordinates = [x, y];\n      }\n\n      dispatchStopCoords({\n        type: \"set\",\n        stop: stopId,\n        coords: coordinates\n      });\n    });\n  }, [dispatchStopCoords, stopRefsMap, stopTree]);\n\n  useEffect(() => {\n    updateAllStops();\n    window.addEventListener(\"resize\", updateAllStops);\n    return () => window.removeEventListener(\"resize\", updateAllStops);\n  }, [updateAllStops]);\n\n  return [stopRefsMap.current, updateAllStops];\n}\n","import {\n  isBranchingNode,\n  isEndNode,\n  isMergeNode,\n  isStartNode,\n  longestPath,\n  nextStopIds,\n  previousStopIds,\n  sliceForId,\n  stopForId\n} from \"../../../helpers/stop-tree\";\nimport { RouteStop, StopId, StopTree } from \"../__schedule\";\nimport { BRANCH_SPACING, BASE_LINE_WIDTH } from \"./graphics/graphic-helpers\";\n\nexport const diagramWidth = (maxBranches: number): number =>\n  BASE_LINE_WIDTH + maxBranches * BRANCH_SPACING + BASE_LINE_WIDTH;\n\nconst isOnPrimaryPath = (stopTree: StopTree, stopId: StopId): boolean =>\n  longestPath(stopTree).includes(stopId);\n\nconst stopBeforeMerging = (\n  stopTree: StopTree,\n  stopId: StopId\n): StopId | undefined => {\n  if (isEndNode(stopTree, stopId)) return undefined;\n  // Making an assumption that branches never branch again\n  const nextId = nextStopIds(stopTree, stopId)[0];\n  if (isMergeNode(stopTree, nextId)) return stopId;\n  return stopBeforeMerging(stopTree, nextId);\n};\n\nconst stopAfterBranchingOff = (\n  stopTree: StopTree,\n  stopId: StopId\n): StopId | undefined => {\n  if (isStartNode(stopTree, stopId)) return undefined;\n  // Making an assumption that branches never branch again\n  const previousId = previousStopIds(stopTree, stopId)[0];\n  if (isBranchingNode(stopTree, previousId)) return stopId;\n  return stopAfterBranchingOff(stopTree, previousId);\n};\n\nconst byBranch = (stopTree: StopTree) => (\n  stopA: StopId,\n  stopB: StopId\n): number => {\n  if (isOnPrimaryPath(stopTree, stopA)) return -1;\n  if (isOnPrimaryPath(stopTree, stopB)) return +1;\n\n  const routeA: RouteStop = stopForId(stopTree, stopA);\n  const routeB: RouteStop = stopForId(stopTree, stopB);\n\n  return (routeA.branch || \"\") < (routeB.branch || \"\") ? -1 : +1;\n};\n\nconst slicePosition = (stopTree: StopTree, stopId: StopId): number => {\n  const slice = sliceForId(stopTree, stopId)?.sort(byBranch(stopTree));\n  return (slice?.findIndex(id => id === stopId) || 0) + 1;\n};\n\nconst stopAdjacentToMerge = (\n  stopTree: StopTree,\n  stopId: StopId\n): StopId | undefined =>\n  stopBeforeMerging(stopTree, stopId) ||\n  stopAfterBranchingOff(stopTree, stopId);\n\nexport const branchPosition = (stopTree: StopTree, stopId: StopId): number => {\n  if (isOnPrimaryPath(stopTree, stopId)) return 1;\n\n  const stop = stopAdjacentToMerge(stopTree, stopId);\n  return stop ? slicePosition(stopTree, stop) : 1;\n};\n","import React, { ReactElement } from \"react\";\nimport { handleReactEnterKeyPress } from \"../../../helpers/keyboard-events-react\";\nimport renderSvg from \"../../../helpers/render-svg\";\nimport checkIcon from \"../../../../static/images/icon-checkmark.svg\";\nimport { SimpleStop, SelectedOrigin } from \"../__schedule\";\n\ninterface OriginListItemProps {\n  changeOrigin: Function;\n  stop: SimpleStop;\n  selectedOrigin: SelectedOrigin;\n  lastStop: SimpleStop;\n}\n\nconst OriginListItem = ({\n  changeOrigin,\n  stop,\n  selectedOrigin,\n  lastStop\n}: OriginListItemProps): ReactElement<HTMLElement> => {\n  const isDisabled = stop.is_closed || stop.id === lastStop.id;\n  const handleClick = (): void => {\n    if (isDisabled) return;\n    changeOrigin(stop.id);\n  };\n\n  return (\n    <div\n      tabIndex={0}\n      role=\"button\"\n      className={`schedule-finder__origin-list-item ${\n        stop.id === selectedOrigin ? \"active\" : \"\"\n      } ${isDisabled ? \"disabled\" : \"\"}`}\n      onClick={() => {\n        handleClick();\n      }}\n      onKeyUp={e =>\n        handleReactEnterKeyPress(e, () => {\n          handleClick();\n        })\n      }\n    >\n      <div className=\"schedule-finder__origin-list-leftpad\">\n        {stop.id === selectedOrigin\n          ? renderSvg(\"schedule-finder__check\", checkIcon)\n          : \"\"}{\" \"}\n      </div>\n      {stop.name}{\" \"}\n      {stop.zone && (\n        <span className=\"schedule-finder__zone\">Zone {stop.zone}</span>\n      )}\n    </div>\n  );\n};\n\nexport default OriginListItem;\n","import React, { ReactElement, useState } from \"react\";\nimport { SimpleStop, SelectedOrigin } from \"../__schedule\";\nimport OriginListItem from \"./OriginListItem\";\nimport SearchBox from \"../../../components/SearchBox\";\n\nconst stopListSearchFilter = (\n  stops: SimpleStop[],\n  originSearch: string\n): SimpleStop[] => {\n  if (originSearch.trim() === \"\") {\n    return stops;\n  }\n\n  const streetSuffixRegExp = /( s| st| | st\\.| str| stre| stree| street)$/gi;\n  const cleanSearch = originSearch.trim().replace(streetSuffixRegExp, \"\");\n\n  const regExp = new RegExp(cleanSearch, \"gi\");\n  return stops.filter(stop => (stop.name.match(regExp) || []).length > 0);\n};\n\ninterface Props {\n  selectedOrigin: SelectedOrigin;\n  stops: SimpleStop[];\n  handleChangeOrigin: Function;\n}\n\nconst OriginModalContent = ({\n  selectedOrigin,\n  stops,\n  handleChangeOrigin\n}: Props): ReactElement<HTMLElement> => {\n  const [originSearch, setOriginSearch] = useState(\"\");\n\n  return (\n    <>\n      <br />\n      <h3 className=\"schedule-finder__origin-text\">Choose an origin stop</h3>\n      <SearchBox\n        id=\"origin-filter\"\n        labelText=\"Choose an origin stop\"\n        className=\"schedule-finder__origin-search-container\"\n        placeholder=\"Filter stops and stations\"\n        onChange={setOriginSearch}\n      />\n      <p className=\"schedule-finder__origin-text\">\n        Select from the list below.\n      </p>\n      <div className=\"schedule-finder__origin-list notranslate\">\n        {stopListSearchFilter(stops, originSearch).map((stop: SimpleStop) => (\n          <OriginListItem\n            key={stop.id}\n            stop={stop}\n            changeOrigin={handleChangeOrigin}\n            selectedOrigin={selectedOrigin}\n            lastStop={stops[stops.length - 1]}\n          />\n        ))}\n      </div>\n    </>\n  );\n};\n\nexport default OriginModalContent;\n","import React, { FormEvent, ReactElement, useState } from \"react\";\nimport { DirectionId, DirectionInfo, Route } from \"../../../__v3api\";\nimport { SimpleStopMap, SelectedOrigin } from \"../__schedule\";\nimport icon from \"../../../../static/images/icon-schedule-finder.svg\";\nimport renderSvg from \"../../../helpers/render-svg\";\nimport SelectContainer from \"./SelectContainer\";\nimport { routeToModeName } from \"../../../helpers/css\";\n\nconst validDirections = (directionInfo: DirectionInfo): DirectionId[] =>\n  ([0, 1] as DirectionId[]).filter(dir => directionInfo[dir] !== null);\n\ninterface Props {\n  onDirectionChange: (direction: DirectionId) => void;\n  onOriginChange: (origin: SelectedOrigin) => void;\n  onOriginSelectClick: () => void;\n  onSubmit?: () => void;\n  route: Route;\n  selectedDirection: DirectionId;\n  selectedOrigin: SelectedOrigin;\n  stopsByDirection: SimpleStopMap;\n}\n\nconst ScheduleFinderForm = ({\n  onDirectionChange,\n  onOriginChange,\n  onSubmit = () => {},\n  onOriginSelectClick,\n  route,\n  selectedDirection,\n  selectedOrigin,\n  stopsByDirection\n}: Props): ReactElement => {\n  const {\n    direction_names: directionNames,\n    direction_destinations: directionDestinations\n  } = route;\n\n  const [originError, setOriginError] = useState(false);\n\n  const handleOriginClick = (): void => {\n    setOriginError(false);\n    onOriginSelectClick();\n  };\n\n  const handleSubmit = (event: FormEvent): void => {\n    event.preventDefault();\n\n    if (!selectedOrigin) {\n      setOriginError(true);\n    } else {\n      setOriginError(false);\n      onSubmit();\n    }\n  };\n\n  const directionNameForId = (\n    direction: DirectionId\n  ): string => `${directionNames[direction]!.toUpperCase()} \n  ${directionDestinations[direction]!}`;\n\n  const isFerryRoute = routeToModeName(route) === \"ferry\";\n\n  return (\n    <>\n      <form onSubmit={handleSubmit}>\n        <h2 className=\"schedule-finder__heading\">\n          {renderSvg(\"c-svg__icon\", icon, true)} Schedule Finder\n        </h2>\n        <div className=\"schedule-finder__prompt\">\n          {isFerryRoute\n            ? `Get schedule information for your next ${route.name} trip.`\n            : \"Choose a stop to get schedule information and real-time departure predictions.\"}\n        </div>\n\n        {originError && (\n          <div className=\"error-container\">\n            <span role=\"alert\">Please provide an origin</span>\n          </div>\n        )}\n\n        <div className=\"schedule-finder__inputs\">\n          <label className=\"schedule-finder__label\">\n            Choose a direction\n            <SelectContainer>\n              <select\n                className=\"c-select-custom notranslate\"\n                value={selectedDirection}\n                onChange={e =>\n                  onDirectionChange(parseInt(e.target.value, 10) as DirectionId)\n                }\n              >\n                {validDirections(directionNames).map(direction => (\n                  <option\n                    key={direction}\n                    value={direction}\n                    aria-label={directionNameForId(direction)}\n                  >\n                    {directionNameForId(direction)}\n                  </option>\n                ))}\n              </select>\n            </SelectContainer>\n          </label>\n\n          <label className=\"schedule-finder__label\">\n            Choose an origin stop\n            <SelectContainer\n              error={originError}\n              handleClick={handleOriginClick}\n            >\n              <select\n                className=\"c-select-custom c-select-custom--noclick notranslate\"\n                value={selectedOrigin || \"\"}\n                onChange={e => onOriginChange(e.target.value || null)}\n              >\n                <option value=\"\">Select</option>\n                {stopsByDirection[selectedDirection].map(({ id, name }) => (\n                  <option key={id} value={id} aria-label={name}>\n                    {name}\n                  </option>\n                ))}\n              </select>\n            </SelectContainer>\n          </label>\n        </div>\n\n        <div className=\"schedule-finder__submit text-right\">\n          <input\n            className=\"btn btn-primary\"\n            type=\"submit\"\n            value=\"Get schedules\"\n          />\n        </div>\n      </form>\n    </>\n  );\n};\n\nexport default ScheduleFinderForm;\n","import React, { ReactElement } from \"react\";\nimport { DirectionId, Route } from \"../../../__v3api\";\nimport {\n  SimpleStopMap,\n  RoutePatternsByDirection,\n  ServiceInSelector,\n  SelectedOrigin,\n  ScheduleNote\n} from \"../__schedule\";\nimport Modal from \"../../../components/Modal\";\nimport OriginModalContent from \"./OriginModalContent\";\nimport ScheduleModalContent from \"./ScheduleModalContent\";\n\nexport type Mode = \"origin\" | \"schedule\";\n\ninterface Props {\n  closeModal: () => void;\n  directionChanged?: (direction: DirectionId) => void;\n  initialMode: Mode;\n  initialDirection: DirectionId;\n  initialOrigin: SelectedOrigin;\n  originChanged?: (origin: SelectedOrigin) => void;\n  route: Route;\n  routePatternsByDirection: RoutePatternsByDirection;\n  services: ServiceInSelector[];\n  stops: SimpleStopMap;\n  today: string;\n  updateURL: (origin: SelectedOrigin, direction?: DirectionId) => void;\n  handleOriginSelectClick: () => void;\n  scheduleNote: ScheduleNote | null;\n}\n\nconst ScheduleFinderModal = ({\n  closeModal,\n  directionChanged,\n  initialMode,\n  initialDirection,\n  initialOrigin,\n  originChanged,\n  route,\n  routePatternsByDirection,\n  services,\n  stops,\n  today,\n  updateURL,\n  handleOriginSelectClick,\n  scheduleNote\n}: Props): ReactElement => {\n  const handleChangeDirection = (newDirection: DirectionId): void => {\n    if (directionChanged) directionChanged(newDirection);\n    if (originChanged) originChanged(null);\n    updateURL(initialOrigin, newDirection);\n  };\n\n  const handleChangeOrigin = (newOrigin: SelectedOrigin): void => {\n    if (originChanged) originChanged(newOrigin);\n    updateURL(newOrigin, initialDirection);\n  };\n\n  const originModalContent = (): ReactElement => {\n    const origin = initialOrigin;\n    const direction = initialDirection;\n    return (\n      <OriginModalContent\n        handleChangeOrigin={handleChangeOrigin}\n        selectedOrigin={origin}\n        stops={stops[direction] || []}\n      />\n    );\n  };\n\n  const scheduleModalContent = (scheduleOrigin: string): ReactElement => (\n    <ScheduleModalContent\n      handleChangeDirection={handleChangeDirection}\n      handleChangeOrigin={handleChangeOrigin}\n      handleOriginSelectClick={handleOriginSelectClick}\n      route={route}\n      routePatternsByDirection={routePatternsByDirection}\n      selectedDirection={initialDirection}\n      selectedOrigin={scheduleOrigin}\n      services={services}\n      stops={stops}\n      today={today}\n      scheduleNote={scheduleNote}\n    />\n  );\n\n  const direction = initialDirection;\n  const origin = initialOrigin;\n  const originStop = stops[direction].find(stop => stop.id === origin);\n\n  return (\n    <Modal\n      focusElementId={\n        initialMode === \"origin\" ? \"origin-filter\" : \"modal-close\"\n      }\n      ariaLabel={{\n        label:\n          initialMode === \"origin\"\n            ? \"Choose Origin Stop\"\n            : `Schedules on the ${route.name} ${\n                route.direction_names[direction]\n              } to ${route.direction_destinations[direction]}${\n                originStop ? ` from ${originStop.name}` : \"\"\n              }`\n      }}\n      className={\n        initialMode === \"origin\" ? \"schedule-finder__origin-modal\" : \"\"\n      }\n      closeModal={closeModal}\n    >\n      {initialMode === \"origin\" && originModalContent()}\n      {initialMode === \"schedule\" &&\n        origin !== null &&\n        scheduleModalContent(origin)}\n    </Modal>\n  );\n};\n\nexport default ScheduleFinderModal;\n","import React, { ReactElement } from \"react\";\nimport { DirectionId, Route } from \"../../../__v3api\";\nimport { routeToModeName } from \"../../../helpers/css\";\nimport {\n  SimpleStopMap,\n  RoutePatternsByDirection,\n  ServiceInSelector,\n  SelectedOrigin,\n  UserInput,\n  ScheduleNote\n} from \"../__schedule\";\nimport { EnhancedJourney, Journey, TripInfo } from \"../__trips\";\nimport ScheduleFinderForm from \"./ScheduleFinderForm\";\nimport DailySchedule from \"./daily-schedule/DailySchedule\";\nimport UpcomingDepartures from \"./upcoming-departures/UpcomingDepartures\";\nimport { useProvider } from \"../../../helpers/use-provider\";\nimport {\n  fetchJsonOrThrow,\n  fetchJson,\n  isFetchFailed\n} from \"../../../helpers/fetch-json\";\nimport { useAwaitInterval } from \"../../../helpers/use-await-interval\";\nimport { isSubwayRoute } from \"../../../models/route\";\nimport DailyScheduleSubway from \"./daily-schedule/DailyScheduleSubway\";\nimport formattedDate, { stringToDateObject } from \"../../../helpers/date\";\nimport { isInCurrentService } from \"../../../helpers/service\";\n\n// exported for testing\nexport const fetchData = async (\n  routeId: string,\n  selectedOrigin: string,\n  selectedDirection: DirectionId,\n  date: string\n): Promise<EnhancedJourney[]> => {\n  const departures = await fetchJsonOrThrow<Journey[]>(\n    `/schedules/finder_api/departures?id=${routeId}&stop=${selectedOrigin}&direction=${selectedDirection}`\n  );\n\n  const enhanced = await Promise.all(\n    departures.map(async departure => {\n      const res = await fetchJson<TripInfo>(\n        `/schedules/finder_api/trip?id=${departure.trip.id}&route=${routeId}&date=${date}&direction=${selectedDirection}&stop=${selectedOrigin}`\n      );\n\n      if (isFetchFailed(res)) {\n        // 404s here are a known failure mode, see finder_api.ex#get_trip_info\n        if (res.status !== 404) {\n          throw new Error(\n            `Failed to fetch trip information: ${res.status} ${res.statusText}`\n          );\n        }\n\n        return { ...departure, tripInfo: null };\n      }\n\n      return { ...departure, tripInfo: res };\n    })\n  );\n\n  return enhanced;\n};\n\ninterface Props {\n  handleChangeDirection: (direction: DirectionId) => void;\n  handleChangeOrigin: (origin: SelectedOrigin) => void;\n  handleOriginSelectClick: () => void;\n  route: Route;\n  selectedDirection: DirectionId;\n  selectedOrigin: string;\n  services: ServiceInSelector[];\n  stops: SimpleStopMap;\n  routePatternsByDirection: RoutePatternsByDirection;\n  today: string;\n  scheduleNote: ScheduleNote | null;\n}\n\nconst ScheduleModalContent = ({\n  handleChangeDirection,\n  handleChangeOrigin,\n  handleOriginSelectClick,\n  route,\n  selectedDirection,\n  selectedOrigin,\n  services,\n  stops,\n  routePatternsByDirection,\n  today,\n  scheduleNote\n}: Props): ReactElement<HTMLElement> | null => {\n  const { id: routeId } = route;\n\n  const input: UserInput = {\n    route: routeId,\n    origin: selectedOrigin,\n    date: today,\n    direction: selectedDirection\n  };\n\n  const [state, updateData] = useProvider(fetchData, [\n    routeId,\n    selectedOrigin,\n    selectedDirection,\n    input.date\n  ]);\n  useAwaitInterval(updateData, 10000);\n\n  const serviceToday = services.some(service =>\n    isInCurrentService(service, stringToDateObject(today))\n  );\n\n  const renderUpcomingDepartures = (): ReactElement<HTMLElement> =>\n    serviceToday ? (\n      <UpcomingDepartures state={state} />\n    ) : (\n      <div className=\"callout text-center u-bold\">\n        There are no scheduled trips for {formattedDate(today)}.\n      </div>\n    );\n\n  return (\n    <>\n      <div className=\"schedule-finder schedule-finder--modal\">\n        <ScheduleFinderForm\n          onDirectionChange={handleChangeDirection}\n          onOriginChange={handleChangeOrigin}\n          onOriginSelectClick={handleOriginSelectClick}\n          route={route}\n          selectedDirection={selectedDirection}\n          selectedOrigin={selectedOrigin}\n          stopsByDirection={stops}\n        />\n      </div>\n\n      {!isSubwayRoute(route) ? null : (\n        <DailyScheduleSubway\n          stops={stops}\n          services={services}\n          stopId={selectedOrigin}\n          directionId={selectedDirection}\n          routeId={routeId}\n          route={route}\n          scheduleNote={scheduleNote}\n          today={today}\n        />\n      )}\n\n      {routeToModeName(route) !== \"ferry\" && renderUpcomingDepartures()}\n\n      {isSubwayRoute(route) ? null : (\n        <DailySchedule\n          selectedOrigin={selectedOrigin}\n          services={services}\n          routeId={routeId}\n          directionId={selectedDirection}\n          routePatterns={routePatternsByDirection[selectedDirection]}\n          today={today}\n        />\n      )}\n    </>\n  );\n};\n\nexport default ScheduleModalContent;\n","import React, { ReactElement, ReactNode } from \"react\";\nimport { handleReactEnterKeyPress } from \"../../../helpers/keyboard-events-react\";\nimport renderSvg from \"../../../helpers/render-svg\";\nimport arrowIcon from \"../../../../static/images/icon-down-arrow.svg\";\n\ninterface SelectContainerProps {\n  children: ReactNode;\n  error?: boolean;\n  handleClick?: Function;\n}\n\nconst SelectContainer = ({\n  children,\n  error = false,\n  handleClick\n}: SelectContainerProps): ReactElement<HTMLElement> => (\n  <div\n    tabIndex={0}\n    className={`c-select-custom__container ${error ? \"error\" : \"\"}`}\n    role=\"button\"\n    onClick={e => {\n      if (handleClick) {\n        handleClick(e);\n      }\n    }}\n    onKeyUp={e =>\n      handleReactEnterKeyPress(e, () => {\n        if (handleClick) {\n          handleClick(e);\n        }\n      })\n    }\n  >\n    {children}\n    {renderSvg(\"c-svg__icon c-select-custom__arrow\", arrowIcon, true)}\n  </div>\n);\n\nexport default SelectContainer;\n","import React, { ReactElement, ReactNode } from \"react\";\nimport { caret } from \"../../../../helpers/icon\";\nimport { handleReactEnterKeyPress } from \"../../../../helpers/keyboard-events-react\";\n\ninterface Props {\n  id: string;\n  colSpan: number;\n  contentComponent: () => ReactElement<HTMLElement>;\n  expanded: boolean;\n  toggle: () => void;\n  children: ReactNode;\n}\n\nconst AccordionRow = ({\n  id,\n  colSpan,\n  contentComponent,\n  expanded,\n  toggle,\n  children\n}: Props): ReactElement<HTMLElement> => (\n  <>\n    <tr\n      className={\n        expanded ? \"schedule-table__row--expanded\" : \"schedule-table__row\"\n      }\n      aria-controls={id}\n      aria-expanded={expanded}\n      role=\"button\"\n      onClick={toggle}\n      onKeyPress={e => handleReactEnterKeyPress(e, toggle)}\n      tabIndex={0}\n    >\n      {contentComponent()}\n      <td className=\"schedule-table__cell schedule-table__cell--tiny\">\n        {expanded\n          ? caret(\"c-expandable-block__header-caret--white\", expanded)\n          : caret(\"c-expandable-block__header-caret\", expanded)}\n      </td>\n    </tr>\n    {expanded && (\n      <tr id={`${id}-expanded`}>\n        <td\n          colSpan={colSpan}\n          className=\"schedule-table__cell schedule-table__cell--expanded\"\n        >\n          {children}\n        </td>\n      </tr>\n    )}\n  </>\n);\n\nexport default AccordionRow;\n","import React, { ReactElement, useEffect, useState } from \"react\";\nimport { Dictionary } from \"lodash\";\nimport { DirectionId, Service } from \"../../../../__v3api\";\nimport Loading from \"../../../../components/Loading\";\nimport { stringToDateObject } from \"../../../../helpers/date\";\nimport {\n  hasMultipleWeekdaySchedules,\n  groupServicesByDateRating,\n  isCurrentValidService,\n  serviceStartDateComparator,\n  optGroupComparator,\n  serviceComparator\n} from \"../../../../helpers/service\";\nimport useFetch, {\n  isLoading,\n  isNotStarted\n} from \"../../../../helpers/use-fetch\";\nimport { EnhancedRoutePattern, ServiceInSelector } from \"../../__schedule\";\nimport { Journey } from \"../../__trips\";\nimport SelectContainer from \"../SelectContainer\";\nimport ScheduleTable from \"./ScheduleTable\";\nimport ServiceOptGroup from \"./ServiceOptGroup\";\n\n// until we come up with a good integration test for async with loading\n// some lines in this file have been ignored from codecov\n\ninterface Props {\n  selectedOrigin: string;\n  services: ServiceInSelector[];\n  routeId: string;\n  directionId: DirectionId;\n  routePatterns: EnhancedRoutePattern[];\n  today: string;\n}\n\n// Exported solely for testing\nexport const fetchJourneys = (\n  routeId: string,\n  selectedOrigin: string,\n  selectedService: Service,\n  selectedDirection: DirectionId,\n  isCurrent: boolean\n): (() => Promise<Response>) => () =>\n  window.fetch &&\n  window.fetch(\n    `/schedules/finder_api/journeys?id=${\n      routeId === \"627\" ? \"627,76,62\" : routeId\n    }&date=${\n      selectedService.end_date\n    }&direction=${selectedDirection}&stop=${selectedOrigin}&is_current=${isCurrent}`\n  );\n\n// Exported solely for testing\nexport const parseResults = (json: JSON): Journey[] =>\n  (json as unknown) as Journey[];\n\nconst SchedulesSelect = ({\n  sortedServices,\n  todayServiceId,\n  defaultSelectedServiceId,\n  todayDate,\n  onSelectService\n}: {\n  sortedServices: ServiceInSelector[];\n  defaultSelectedServiceId: string;\n  todayServiceId: string;\n  todayDate: Date;\n  onSelectService: (service: ServiceInSelector | undefined) => void;\n}): ReactElement<HTMLElement> => {\n  const servicesByOptGroup: Dictionary<Service[]> = groupServicesByDateRating(\n    sortedServices,\n    todayDate\n  );\n\n  return (\n    <div className=\"schedule-finder__service-selector\">\n      <label>\n        <span className=\"sr-only\">\n          Choose a schedule type from the available options\n        </span>\n        <SelectContainer>\n          <select\n            className=\"c-select-custom text-center u-bold\"\n            defaultValue={defaultSelectedServiceId}\n            onChange={e =>\n              onSelectService(sortedServices.find(s => s.id === e.target.value))\n            }\n            aria-controls=\"daily-schedule\"\n          >\n            {Object.keys(servicesByOptGroup)\n              .sort(optGroupComparator)\n              .map((group: string) => {\n                const groupedServices = servicesByOptGroup[group];\n                /* istanbul ignore next */\n                if (groupedServices.length <= 0) return null;\n\n                return (\n                  <ServiceOptGroup\n                    key={group}\n                    label={group}\n                    services={groupedServices.sort(serviceComparator)}\n                    multipleWeekdays={hasMultipleWeekdaySchedules(\n                      groupedServices\n                    )}\n                    todayServiceId={todayServiceId}\n                  />\n                );\n              })}\n          </select>\n        </SelectContainer>\n      </label>\n    </div>\n  );\n};\n\nexport const DailySchedule = ({\n  selectedOrigin,\n  services,\n  routeId,\n  directionId,\n  routePatterns,\n  today\n}: Props): ReactElement<HTMLElement> | null => {\n  const [fetchState, fetch] = useFetch<Journey[]>();\n\n  const todayDate = stringToDateObject(today);\n\n  // By default, show the current day's service\n  const sortedServices = services.sort(serviceStartDateComparator);\n  const currentServices = sortedServices.filter(service =>\n    isCurrentValidService(service, todayDate)\n  );\n  const todayServiceId =\n    currentServices.length > 0 ? currentServices[0].id : \"\";\n  const [defaultSelectedService] = currentServices.length\n    ? currentServices\n    : sortedServices;\n\n  const [selectedService, setSelectedService] = useState(\n    defaultSelectedService\n  );\n\n  const getJourneysForSelectedService = (service: Service): void => {\n    fetch({\n      fetcher: fetchJourneys(\n        routeId,\n        selectedOrigin,\n        service,\n        directionId,\n        false\n      ),\n      parser: parseResults\n    });\n  };\n\n  useEffect(\n    () => {\n      /* istanbul ignore next */\n      if (selectedService && isNotStarted(fetchState)) {\n        getJourneysForSelectedService(selectedService);\n      }\n    },\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    []\n  );\n\n  if (services.length <= 0) return null;\n\n  return (\n    <>\n      <h3>Daily Schedule</h3>\n\n      <SchedulesSelect\n        sortedServices={sortedServices}\n        todayServiceId={todayServiceId}\n        defaultSelectedServiceId={defaultSelectedService.id}\n        todayDate={todayDate}\n        onSelectService={chosenService => {\n          if (chosenService) {\n            setSelectedService(chosenService);\n            getJourneysForSelectedService(chosenService);\n          }\n        }}\n      />\n\n      <div id=\"daily-schedule\">\n        {isLoading(fetchState) ? (\n          <Loading />\n        ) : (\n          <span className=\"sr-only\" aria-live=\"polite\">\n            Showing times for {selectedService.description}\n          </span>\n        )}\n\n        {/* istanbul ignore next */ !isLoading(fetchState) &&\n          /* istanbul ignore next */ fetchState.data && (\n            /* istanbul ignore next */ <ScheduleTable\n              journeys={fetchState.data}\n              routePatterns={routePatterns}\n              input={{\n                route: routeId,\n                origin: selectedOrigin,\n                direction: directionId,\n                date: selectedService!.end_date\n              }}\n            />\n          )}\n      </div>\n    </>\n  );\n};\n\nexport default DailySchedule;\n","import {\n  compareAsc,\n  format,\n  isSameDay,\n  isSaturday,\n  isSunday,\n  isWeekend,\n  parse\n} from \"date-fns\";\nimport { concat, find, toLower } from \"lodash\";\nimport React, { ReactElement, useEffect, useState } from \"react\";\nimport ExpandableBlock from \"../../../../components/ExpandableBlock\";\nimport {\n  formatToBostonTime,\n  stringToDateObject\n} from \"../../../../helpers/date\";\nimport useHoursOfOperation from \"../../../../hooks/useHoursOfOperation\";\nimport RouteIcon from \"../../../../projects/components/RouteIcon\";\nimport { DirectionId, Route, StopHours } from \"../../../../__v3api\";\nimport {\n  ScheduleNote,\n  ServiceInSelector,\n  SimpleStopMap\n} from \"../../__schedule\";\nimport SelectContainer from \"../SelectContainer\";\n\nconst findStopName = (\n  stopId: string,\n  directionId: DirectionId,\n  stops: SimpleStopMap\n): string => {\n  const stopsInDirection = stops[directionId];\n  const stop = find(stopsInDirection, stopData => stopData.id === stopId);\n  return stop ? stop.name : \"\";\n};\n\nconst getHoursByStop = (\n  stopId: string,\n  hours: StopHours[][] | StopHours[] | undefined\n): StopHours | undefined => {\n  if (!hours) {\n    return undefined;\n  }\n  const bothDirectionHours = concat(hours[0], hours[1]);\n  const stopHours = find(bothDirectionHours, h => h.parent_stop_id === stopId);\n\n  return stopHours;\n};\n\ntype SpecialServiceMap = {\n  date: Date;\n  dateString: string;\n  name: string;\n};\n\nconst getSpecialServiceMaps = (\n  services: ServiceInSelector[]\n): SpecialServiceMap[] => {\n  const specialServices = services.filter(\n    service => service.typicality !== \"typical_service\"\n  );\n\n  const dateNameMaps = specialServices.flatMap(service =>\n    service.added_dates.flatMap(addedDate => {\n      return {\n        date: parse(addedDate, \"yyyy-MM-dd\", new Date()),\n        dateString: addedDate,\n        name: service.added_dates_notes[addedDate]\n      };\n    })\n  );\n\n  return dateNameMaps.sort((date1, date2) =>\n    compareAsc(date1.date, date2.date)\n  );\n};\n\nconst getSpecialServiceByDate = (\n  date: Date,\n  specialServices: SpecialServiceMap[]\n): SpecialServiceMap | undefined =>\n  specialServices.find(service => isSameDay(date, service.date));\n\nconst DailyScheduleSubway = ({\n  directionId,\n  stops,\n  stopId,\n  routeId,\n  route,\n  services,\n  scheduleNote,\n  today\n}: {\n  directionId: DirectionId;\n  stops: SimpleStopMap;\n  stopId: string;\n  routeId: string;\n  route: Route;\n  services: ServiceInSelector[];\n  scheduleNote: ScheduleNote | null;\n  today: string;\n}): ReactElement | null => {\n  const [selectedSchedule, setSelectedSchedule] = useState<string>(\"\");\n  const [firstTrainHours, setFirstTrainHours] = useState<string | undefined>();\n  const [lastTrainHours, setLastTrainHours] = useState<string | undefined>();\n  const [stopLatLong, setStopLatLong] = useState<string>(\"\");\n  const [scheduleNoteText, setScheduleNoteText] = useState<string>(\"\");\n\n  const todayDate = stringToDateObject(today);\n  const originStopName = findStopName(stopId, directionId, stops);\n  const hoursOfOperation = useHoursOfOperation(routeId);\n\n  const { direction_destinations: directionDestinations } = route;\n\n  const destinationName = directionDestinations[directionId];\n\n  const specialServices = getSpecialServiceMaps(services);\n\n  const todaysSpecialService = getSpecialServiceByDate(\n    todayDate,\n    specialServices\n  );\n  const isTodaySpecialService = todaysSpecialService !== undefined;\n  // We only want the regular schedule days if it is a typical service day\n  const isTodaySunday = isSunday(todayDate) && !isTodaySpecialService;\n  const isTodaySaturday = isSaturday(todayDate) && !isTodaySpecialService;\n  const isTodayAWeekday = !isWeekend(todayDate) && !isTodaySpecialService;\n\n  const hideScheduleFrequency = route.id === \"Orange\";\n\n  useEffect(() => {\n    if (isTodayAWeekday) {\n      setSelectedSchedule(\"weekday\");\n    } else if (isTodaySaturday) {\n      setSelectedSchedule(\"saturday\");\n    } else if (isTodaySunday) {\n      setSelectedSchedule(\"sunday\");\n    } else if (todaysSpecialService) {\n      setSelectedSchedule(todaysSpecialService.dateString);\n    }\n  }, [isTodayAWeekday, isTodaySaturday, isTodaySunday, todaysSpecialService]);\n\n  useEffect(() => {\n    if (selectedSchedule === \"weekday\") {\n      setScheduleNoteText(scheduleNote ? scheduleNote.peak_service : \"\");\n    } else {\n      setScheduleNoteText(scheduleNote ? scheduleNote.offpeak_service : \"\");\n    }\n  }, [selectedSchedule, scheduleNote]);\n\n  useEffect(() => {\n    let hours;\n    if (selectedSchedule === \"weekday\") {\n      hours = getHoursByStop(stopId, hoursOfOperation?.week);\n    } else if (selectedSchedule === \"saturday\") {\n      hours = getHoursByStop(stopId, hoursOfOperation?.saturday);\n    } else if (selectedSchedule === \"sunday\") {\n      hours = getHoursByStop(stopId, hoursOfOperation?.sunday);\n    } else {\n      // We need to select a special service\n      const specialServiceHours = hoursOfOperation?.special_service;\n\n      if (specialServiceHours) {\n        hours = getHoursByStop(\n          stopId,\n          specialServiceHours[\n            selectedSchedule as keyof typeof specialServiceHours\n          ]\n        );\n      }\n    }\n    setStopLatLong(\n      hours?.latitude ? `${hours.latitude},${hours.longitude}` : \"\"\n    );\n    setFirstTrainHours(hours?.first_departure);\n    setLastTrainHours(hours?.last_departure);\n  }, [selectedSchedule, hoursOfOperation, stopId]);\n\n  return (\n    <div>\n      <div className=\"u-highlight-gray m-n24\">\n        <div className=\"m-24\">\n          <div className=\"d-flex pt-10\">\n            <RouteIcon\n              tag={toLower(routeId)}\n              extraClasses=\"schedule__icon-header--size me-8\"\n            />\n            <div className=\"fs-18 u-bold\">{originStopName}</div>\n          </div>\n          <div className=\"fs-12 u-bold pb-10\">To {destinationName}</div>\n        </div>\n      </div>\n      <h3 className=\"pt-18\">Daily Schedule</h3>\n      <div className=\"pt-8\">\n        <SelectContainer>\n          <select\n            value={selectedSchedule}\n            className=\"c-select-custom notranslate\"\n            onChange={e => {\n              setSelectedSchedule(e.target.value);\n            }}\n          >\n            <option value=\"weekday\" key=\"weekday\">\n              Weekday {isTodayAWeekday ? \"(Today)\" : \"\"}\n            </option>\n            <option value=\"saturday\" key=\"saturday\">\n              Saturday {isTodaySaturday ? \"(Today)\" : \"\"}\n            </option>\n            <option value=\"sunday\" key=\"sunday\">\n              Sunday {isTodaySunday ? \"(Today)\" : \"\"}\n            </option>\n            {specialServices.length > 0 && (\n              <optgroup label=\"Special Service\">\n                {specialServices.map(service => {\n                  const dateString = format(service.date, \"MMM dd\");\n                  const isToday = isSameDay(todayDate, service.date);\n                  return (\n                    <option value={service.dateString} key={service.dateString}>\n                      {service.name}, {dateString} {isToday ? \"(Today)\" : \"\"}\n                    </option>\n                  );\n                })}\n              </optgroup>\n            )}\n          </select>\n        </SelectContainer>\n      </div>\n      <div\n        className=\"d-flex justify-content-space-between pt-8\"\n        style={{ gap: \"2%\" }}\n        aria-live=\"polite\"\n      >\n        <div className=\"w-100 u-highlight ps-16 pt-16 pb-16\">\n          <div className=\"fs-14\">First Train</div>\n          <div className=\"fs-18 u-bold\">\n            {firstTrainHours && formatToBostonTime(firstTrainHours)}\n          </div>\n        </div>\n        <div className=\"w-100 u-highlight ps-16 pt-16 pb-16\">\n          <div className=\"fs-14\">Last Train</div>\n          <div className=\"fs-18 u-bold\">\n            {lastTrainHours && formatToBostonTime(lastTrainHours)}\n          </div>\n        </div>\n      </div>\n      {!hideScheduleFrequency && scheduleNoteText !== \"\" && (\n        <ExpandableBlock\n          header={{\n            text: \"Train Frequency\",\n            iconSvgText: null,\n            classOverride: \"mt-8\"\n          }}\n          initiallyExpanded={false}\n          id=\"train-frequency\"\n        >\n          <div className=\"m-schedule-page__sidebar-hours\">\n            <div className=\"font-weight-bold fs-14\">Regular schedule</div>\n            <div className=\"fs-16 pt-8\">\n              Trains depart every {scheduleNoteText}\n            </div>\n          </div>\n        </ExpandableBlock>\n      )}\n      <div className=\"d-flex pt-8 pb-18 fs-18\">\n        <a\n          href={`/trip-planner/from/${stopLatLong}`}\n          className=\"btn btn-secondary btn-block mt-8\"\n        >\n          Plan Your Trip\n        </a>\n      </div>\n    </div>\n  );\n};\n\nexport default DailyScheduleSubway;\n","import React, { ReactElement } from \"react\";\nimport { isACommuterRailRoute } from \"../../../../models/route\";\nimport { EnhancedRoutePattern, UserInput } from \"../../__schedule\";\nimport { Journey } from \"../../__trips\";\nimport TableRow from \"./TableRow\";\n\ninterface Props {\n  journeys: Journey[];\n  routePatterns: EnhancedRoutePattern[];\n  input: UserInput;\n}\n\ninterface RoutePatternsById {\n  [key: string]: EnhancedRoutePattern;\n}\n\nconst isSchoolTrip = (\n  routePatternsById: RoutePatternsById,\n  routePatternId: string\n): boolean =>\n  (\n    (routePatternsById[routePatternId] &&\n      routePatternsById[routePatternId].time_desc) ||\n    \"\"\n  ).match(/school/gi) !== null;\n\nconst ScheduleTable = ({\n  journeys,\n  routePatterns,\n  input\n}: Props): ReactElement<HTMLElement> => {\n  if (journeys.length === 0) {\n    return (\n      <div className=\"callout u-bold text-center\">\n        There is no scheduled service for this time period.\n      </div>\n    );\n  }\n\n  const routePatternsById = routePatterns.reduce(\n    (accumulator, routePattern) => ({\n      ...accumulator,\n      [routePattern.id]: routePattern\n    }),\n    {}\n  ) as RoutePatternsById;\n  const anySchoolTrips = Object.values(\n    journeys\n  ).some(({ trip: { route_pattern_id: routePatternId } }) =>\n    isSchoolTrip(routePatternsById, routePatternId)\n  );\n\n  const firstTrip = journeys[0];\n  const lastTrip = journeys.length > 1 ? journeys[journeys.length - 1] : null;\n\n  return (\n    <>\n      <div className=\"schedule-finder__first-last-trip\">\n        <div className=\"u-small-caps u-bold\">First Trip</div>\n        {firstTrip.departure.time}\n        {lastTrip && (\n          <>\n            <div className=\"u-small-caps u-bold\">Last Trip</div>\n            {lastTrip.departure.time}\n          </>\n        )}\n      </div>\n\n      {anySchoolTrips && (\n        <p className=\"text-center\">\n          <strong>S</strong> - Does NOT run on school vacation\n        </p>\n      )}\n\n      <table className=\"schedule-table\">\n        <thead className=\"schedule-table__header\">\n          <tr>\n            {anySchoolTrips && <td className=\"schedule-table__cell\" />}\n            <th scope=\"col\" className=\"schedule-table__cell\">\n              Departs\n            </th>\n            {isACommuterRailRoute(firstTrip.route) && (\n              <th scope=\"col\" className=\"schedule-table__cell\">\n                Train\n              </th>\n            )}\n            <th scope=\"col\" colSpan={2} className=\"schedule-table__cell\">\n              <span className=\"pull-left\">Destination</span>\n              Trip Details\n            </th>\n          </tr>\n        </thead>\n        <tbody>\n          {journeys.map((journey: Journey) => (\n            <TableRow\n              key={journey.trip.id}\n              input={input}\n              journey={journey}\n              isSchoolTrip={isSchoolTrip(\n                routePatternsById,\n                journey.trip.route_pattern_id\n              )}\n              anySchoolTrips={anySchoolTrips}\n            />\n          ))}\n        </tbody>\n      </table>\n    </>\n  );\n};\n\nexport default ScheduleTable;\n","import React, { ReactElement } from \"react\";\nimport { Service } from \"../../../../__v3api\";\nimport { shortDate, stringToDateObject } from \"../../../../helpers/date\";\nimport {\n  ServiceGroupNames,\n  serviceDays,\n  dedupeServices\n} from \"../../../../helpers/service\";\n\ninterface Props {\n  label: string;\n  services: Service[];\n  multipleWeekdays: boolean;\n  todayServiceId: string;\n}\n\nconst ServiceOptGroup = ({\n  label,\n  services,\n  multipleWeekdays,\n  todayServiceId\n}: Props): ReactElement<HTMLElement> | null =>\n  services.length === 0 ? null : (\n    <optgroup label={label}>\n      {dedupeServices(services).map(service => {\n        const isMultipleWeekday =\n          multipleWeekdays &&\n          service.type === \"weekday\" &&\n          service.typicality !== \"holiday_service\";\n\n        const startDate = stringToDateObject(service.start_date);\n        const endDate = stringToDateObject(service.end_date);\n        let optionText = \"\";\n\n        if (\n          service.typicality === \"unplanned_disruption\" ||\n          service.typicality === \"planned_disruption\"\n        ) {\n          optionText = service.description;\n        } else if (\n          service.typicality === \"holiday_service\" &&\n          service.added_dates_notes\n        ) {\n          optionText = Object.entries(service.added_dates_notes)\n            .map(entry => {\n              const [addedDate, addedNote] = entry;\n              if (addedNote === \"\") {\n                return `${shortDate(stringToDateObject(addedDate))}`;\n              }\n              return `${addedNote}, ${shortDate(\n                stringToDateObject(addedDate)\n              )}`;\n            })\n            .join(\", \");\n        } else if (label === ServiceGroupNames.OTHER) {\n          optionText = isMultipleWeekday\n            ? `${serviceDays(service)} schedule`\n            : service.description;\n          optionText += `, ${shortDate(startDate)} to ${shortDate(endDate)}`;\n        } else {\n          optionText = isMultipleWeekday\n            ? `${serviceDays(service)} schedule`\n            : service.description;\n          if (service.rating_description) {\n            optionText += `, ${service.rating_description}`;\n          }\n        }\n\n        if (service.id === todayServiceId) {\n          optionText += \" (now)\";\n        }\n\n        return (\n          <option\n            key={service.id}\n            value={service.id}\n            // the <optgroup> is not reliably conveyed to assistive tech, so add extra label here\n            aria-label={`${label} ${optionText}`}\n          >\n            {optionText}\n          </option>\n        );\n      })}\n    </optgroup>\n  );\n\nexport default ServiceOptGroup;\n","import React, { useEffect, useState, ReactElement } from \"react\";\nimport { modeIcon } from \"../../../../helpers/icon\";\nimport { breakTextAtSlash } from \"../../../../helpers/text\";\nimport useFetch, { isNotStarted } from \"../../../../helpers/use-fetch\";\nimport { isACommuterRailRoute } from \"../../../../models/route\";\nimport { UserInput } from \"../../__schedule\";\nimport { Journey, TripInfo } from \"../../__trips\";\nimport AccordionRow from \"./AccordionRow\";\nimport TripDetails from \"./TripDetails\";\n\ninterface TableRowProps {\n  input: UserInput;\n  journey: Journey;\n  isSchoolTrip: boolean;\n  anySchoolTrips: boolean;\n}\n\ninterface AccordionProps {\n  input: UserInput;\n  journey: Journey;\n  anySchoolTrips: boolean;\n  contentComponent: () => ReactElement<HTMLElement>;\n}\n\n// Exported solely for testing\nexport const fetchTripInfo = (\n  tripId: string,\n  { route, direction, date, origin }: UserInput\n): (() => Promise<Response>) => () =>\n  window.fetch &&\n  window.fetch(\n    `/schedules/finder_api/trip?id=${tripId}&route=${route}&date=${date}&direction=${direction}&stop=${origin}`\n  );\n\n// Exported solely for testing\nexport const parseResults = (json: JSON): TripInfo =>\n  (json as unknown) as TripInfo;\n\nconst RouteIcon = ({\n  route: { type, name, id }\n}: Journey): ReactElement<HTMLElement> | undefined => {\n  if (type !== 3) {\n    return modeIcon(id);\n  }\n\n  const backgroundClass = name.startsWith(\"SL\")\n    ? \"u-bg--silver-line\"\n    : \"u-bg--bus\";\n  return (\n    <span className={`c-icon__bus-pill--small ${backgroundClass}`}>{name}</span>\n  );\n};\n\nconst BusTableRow = ({\n  journey,\n  anySchoolTrips,\n  isSchoolTrip\n}: {\n  journey: Journey;\n  anySchoolTrips: boolean;\n  isSchoolTrip: boolean;\n}): ReactElement<HTMLElement> => (\n  <>\n    {anySchoolTrips && (\n      <td className=\"schedule-table__cell schedule-table__cell--tiny\">\n        {isSchoolTrip && <strong>S</strong>}\n      </td>\n    )}\n    <td className=\"schedule-table__cell schedule-table__cell--time u-nowrap u-tabular-nums\">\n      {journey.departure.time}\n    </td>\n    <td className=\"schedule-table__cell schedule-table__cell--headsign\">\n      <span className=\"schedule-table__route-pill m-route-pills\">\n        {RouteIcon(journey)}\n      </span>\n      {breakTextAtSlash(journey.trip.headsign)}\n    </td>\n  </>\n);\n\nconst CrTableRow = ({\n  journey\n}: {\n  journey: Journey;\n}): ReactElement<HTMLElement> => (\n  <>\n    <td className=\"schedule-table__cell schedule-table__cell--time u-nowrap u-tabular-nums\">\n      {journey.departure.time}\n    </td>\n    {journey.trip.name && (\n      <td className=\"schedule-table__cell u-tabular-nums\">\n        {journey.trip.name}\n      </td>\n    )}\n    <td className=\"schedule-table__cell schedule-table__cell--headsign\">\n      {modeIcon(journey.route.id)} {breakTextAtSlash(journey.trip.headsign)}\n    </td>\n  </>\n);\n\nconst Accordion = ({\n  input,\n  journey,\n  anySchoolTrips,\n  contentComponent\n}: AccordionProps): ReactElement<HTMLElement> => {\n  const [expanded, setExpanded] = useState(false);\n  const [fetchState, fetch] = useFetch<TripInfo>();\n\n  const toggle = (): void => setExpanded(!expanded);\n  const tripId = journey.trip.id;\n\n  useEffect(() => {\n    if (expanded && isNotStarted(fetchState)) {\n      fetch({\n        fetcher: fetchTripInfo(tripId, input),\n        parser: parseResults\n      });\n    }\n  }, [tripId, input, expanded, fetchState, fetch]);\n\n  const isCommuterRail = isACommuterRailRoute(journey.route);\n\n  return (\n    <AccordionRow\n      id={`trip-${tripId}`}\n      colSpan={isCommuterRail || anySchoolTrips ? 4 : 3}\n      contentComponent={contentComponent}\n      expanded={expanded}\n      toggle={toggle}\n    >\n      <TripDetails fetchState={fetchState} showFare={isCommuterRail} />\n    </AccordionRow>\n  );\n};\n\nconst TableRow = ({\n  input,\n  journey,\n  anySchoolTrips,\n  isSchoolTrip\n}: TableRowProps): ReactElement<HTMLElement> | null => {\n  const contentComponent =\n    journey.route.type !== 2 &&\n    journey.route.description !== \"rail_replacement_bus\"\n      ? () => (\n          <BusTableRow\n            journey={journey}\n            anySchoolTrips={anySchoolTrips}\n            isSchoolTrip={isSchoolTrip}\n          />\n        )\n      : () => <CrTableRow journey={journey} />;\n\n  return (\n    <Accordion\n      input={input}\n      journey={journey}\n      anySchoolTrips={anySchoolTrips}\n      contentComponent={contentComponent}\n    />\n  );\n};\n\nexport default TableRow;\n","import React, { ReactElement } from \"react\";\nimport Loading from \"../../../../components/Loading\";\nimport { FetchState, hasData, isLoading } from \"../../../../helpers/use-fetch\";\nimport { TripInfo } from \"../../__trips\";\nimport CrowdingPill from \"../../line-diagram/CrowdingPill\";\nimport TripStop from \"./TripStop\";\n\ninterface Props {\n  fetchState: FetchState<TripInfo>;\n  showFare: boolean;\n}\n\nconst TripSummary = ({\n  tripInfo,\n  showFare\n}: {\n  tripInfo: TripInfo;\n  showFare: boolean;\n}): ReactElement<HTMLElement> => (\n  <tr className=\"trip-details-table__summary\">\n    <td colSpan={3} className=\"schedule-table__cell\">\n      <div>\n        <span className=\"trip-details-table__title u-small-caps u-bold\">\n          Trip length\n        </span>\n        {tripInfo.times.length} stops, {tripInfo.duration} minutes total\n      </div>\n      {showFare && (\n        <div>\n          <span className=\"trip-details-table__title u-small-caps u-bold\">\n            Fare\n          </span>\n\n          {tripInfo.fare && tripInfo.fare.price}\n          <a\n            className=\"trip-details-table__link\"\n            href={tripInfo.fare.fare_link}\n          >\n            View fares\n          </a>\n        </div>\n      )}\n    </td>\n  </tr>\n);\n\nconst allTimesHaveSchedule = (tripInfo: TripInfo): boolean =>\n  tripInfo.times.every(time => !!time.schedule);\n\nconst ErrorLoadingTrip = (): ReactElement<HTMLElement> => (\n  <p>\n    <em>Error loading trip details. Please try again later.</em>\n  </p>\n);\n\nconst TripDetailsTable = ({\n  tripInfo,\n  showFare\n}: {\n  tripInfo: TripInfo;\n  showFare: boolean;\n}): ReactElement<HTMLElement> => {\n  const crowding = tripInfo.vehicle ? tripInfo.vehicle.crowding : null;\n\n  return (\n    <table className=\"trip-details-table\">\n      <thead>\n        {crowding && (\n          <tr>\n            <th>\n              <CrowdingPill crowding={crowding} />\n            </th>\n          </tr>\n        )}\n        <TripSummary tripInfo={tripInfo} showFare={showFare} />\n        <tr>\n          <th scope=\"col\" className=\"schedule-table__cell\">\n            Stops\n          </th>\n          {showFare && (\n            <th\n              scope=\"col\"\n              className=\"schedule-table__cell schedule-table__cell--right-adjusted\"\n            >\n              Fare\n            </th>\n          )}\n          <th\n            scope=\"col\"\n            className=\"schedule-table__cell schedule-table__cell--right-adjusted\"\n          >\n            Arrival\n          </th>\n        </tr>\n      </thead>\n      <tbody>\n        {allTimesHaveSchedule(tripInfo) ? (\n          tripInfo.times.map((departure, index: number) => (\n            <TripStop\n              departure={departure}\n              index={index}\n              showFare={showFare}\n              routeType={tripInfo.route_type}\n              key={departure.schedule.stop.id}\n            />\n          ))\n        ) : (\n          <ErrorLoadingTrip />\n        )}\n      </tbody>\n    </table>\n  );\n};\n\nconst TripDetails = ({\n  fetchState,\n  showFare\n}: Props): ReactElement<HTMLElement> => {\n  if (hasData(fetchState) && !!fetchState.data) {\n    return <TripDetailsTable tripInfo={fetchState.data} showFare={showFare} />;\n  }\n\n  if (isLoading(fetchState)) {\n    return <Loading />;\n  }\n\n  return <ErrorLoadingTrip />;\n};\n\nexport default TripDetails;\n","import React, { ReactElement } from \"react\";\nimport { RouteType } from \"../../../../__v3api\";\nimport { alertIcon } from \"../../../../helpers/icon\";\nimport { breakTextAtSlash } from \"../../../../helpers/text\";\nimport { isSkippedOrCancelled } from \"../../../../models/prediction\";\nimport { isACommuterRailRoute } from \"../../../../models/route\";\nimport { TripDeparture } from \"../../__trips\";\n\ninterface Props {\n  departure: TripDeparture;\n  index: number;\n  showFare: boolean;\n  routeType: RouteType;\n}\n\nconst formattedDepartureTimes = (\n  departure: TripDeparture,\n  routeType: RouteType\n): ReactElement<HTMLElement> => {\n  const { schedule, prediction, delay } = departure;\n\n  if (isACommuterRailRoute(routeType)) {\n    if (delay && delay >= 300 && prediction && prediction.time) {\n      return (\n        <>\n          <span className=\"schedule-table__times--delayed schedule-table__times--delayed-future_stop\">\n            {schedule.time}\n          </span>\n          <br className=\"hidden-sm-up\" />\n          {prediction.time}\n        </>\n      );\n    }\n\n    return <>{schedule.time}</>;\n  }\n\n  return <>{prediction && prediction.time ? prediction.time : schedule.time}</>;\n};\n\nconst TripStop = ({\n  departure,\n  index,\n  showFare,\n  routeType\n}: Props): ReactElement<HTMLElement> | null => {\n  const { schedule } = departure;\n\n  /* istanbul ignore next */\n  if (!schedule || !schedule.stop) return null;\n\n  return (\n    <tr key={`${schedule.stop.id}`}>\n      <th className=\"schedule-table__cell\" scope=\"row\">\n        <a\n          href={`/stops/${schedule.stop.id}`}\n          className={\n            isSkippedOrCancelled(departure.prediction) ? \"strikethrough\" : \"\"\n          }\n        >\n          {isSkippedOrCancelled(departure.prediction) && (\n            <>\n              {alertIcon(\"c-svg__icon-alerts-triangle\")}\n              <span className=\"sr-only\">This trip skips this stop at</span>\n            </>\n          )}\n          {breakTextAtSlash(schedule.stop.name)}\n        </a>\n      </th>\n      {showFare && (\n        <td className=\"schedule-table__cell schedule-table__cell--right-adjusted u-tabular-nums\">\n          {index === 0 ? \"\" : schedule.fare.price}\n        </td>\n      )}\n      <td className=\"schedule-table__cell schedule-table__cell--right-adjusted u-tabular-nums\">\n        {formattedDepartureTimes(departure, routeType)}\n      </td>\n    </tr>\n  );\n};\n\nexport default TripStop;\n","import React, { ReactElement } from \"react\";\nimport {\n  TripDeparture,\n  TripDepartureWithPrediction,\n  TripInfo\n} from \"../../__trips\";\nimport CrowdingPill from \"../../line-diagram/CrowdingPill\";\nimport TripStop from \"./TripStop\";\n\ninterface Props {\n  tripInfo: TripInfo | null;\n  showFare: boolean;\n}\n\nconst hasAPrediction = (\n  departure: TripDeparture\n): departure is TripDepartureWithPrediction => departure.prediction !== null;\n\nconst departuresWithPredictions = (\n  departures: TripDeparture[]\n): TripDepartureWithPrediction[] => departures.filter(hasAPrediction);\n\nconst TripSummary = ({\n  tripInfo\n}: {\n  tripInfo: TripInfo;\n}): ReactElement<HTMLElement> => (\n  <tr className=\"trip-details-table__summary\">\n    <td colSpan={3} className=\"schedule-table__cell\">\n      <div>\n        <span className=\"trip-details-table__title u-small-caps u-bold\">\n          Trip length\n        </span>\n        {tripInfo.times.length} stops, {tripInfo.duration} minutes total\n      </div>\n      <div>\n        <span className=\"trip-details-table__title u-small-caps u-bold\">\n          Fare\n        </span>\n\n        {tripInfo.fare && tripInfo.fare.price}\n        <a className=\"trip-details-table__link\" href={tripInfo.fare.fare_link}>\n          View fares\n        </a>\n      </div>\n    </td>\n  </tr>\n);\n\nconst TripDetails = ({\n  tripInfo,\n  showFare\n}: Props): ReactElement<HTMLElement> | null => {\n  if (!tripInfo) return null;\n\n  const crowding = tripInfo.vehicle?.crowding || null;\n\n  return (\n    <table className=\"trip-details-table\">\n      <thead>\n        {crowding && (\n          <tr>\n            <th>\n              <CrowdingPill crowding={crowding} />\n            </th>\n          </tr>\n        )}\n        <TripSummary tripInfo={tripInfo} />\n        <tr>\n          <th scope=\"col\" className=\"schedule-table__cell\">\n            Stops\n          </th>\n          {showFare && (\n            <th\n              scope=\"col\"\n              className=\"schedule-table__cell schedule-table__cell--right-adjusted\"\n            >\n              Fare\n            </th>\n          )}\n          <th\n            scope=\"col\"\n            className=\"schedule-table__cell schedule-table__cell--right-adjusted\"\n          >\n            Arrival\n          </th>\n        </tr>\n      </thead>\n      <tbody>\n        {departuresWithPredictions(tripInfo.times).map(\n          (departure, index: number) => (\n            <TripStop\n              departure={departure}\n              index={index}\n              showFare={showFare}\n              routeType={tripInfo.route_type}\n              key={\n                (departure.prediction.stop && departure.prediction.stop.id) ||\n                departure.schedule.stop.id\n              }\n            />\n          )\n        )}\n      </tbody>\n    </table>\n  );\n};\n\nexport default TripDetails;\n","import React, { ReactElement } from \"react\";\nimport { RouteType } from \"../../../../__v3api\";\nimport { alertIcon } from \"../../../../helpers/icon\";\nimport { breakTextAtSlash } from \"../../../../helpers/text\";\nimport { isSkippedOrCancelled } from \"../../../../models/prediction\";\nimport { isACommuterRailRoute } from \"../../../../models/route\";\nimport { TripDepartureWithPrediction } from \"../../__trips\";\nimport GlxOpen from \"../../../../components/GlxOpen\";\n\ninterface Props {\n  departure: TripDepartureWithPrediction;\n  index: number;\n  showFare: boolean;\n  routeType: RouteType;\n}\n\nconst formattedDepartureTimes = (\n  departure: TripDepartureWithPrediction,\n  routeType: RouteType\n): ReactElement<HTMLElement> => {\n  const { schedule, prediction, delay } = departure;\n  if (isACommuterRailRoute(routeType)) {\n    if (delay && delay >= 300 && prediction && prediction.time) {\n      return (\n        <>\n          <span className=\"schedule-table__times--delayed schedule-table__times--delayed-future_stop\">\n            {schedule.time}\n          </span>\n          <br className=\"hidden-sm-up\" />\n          {prediction.time}\n        </>\n      );\n    }\n\n    return <>{schedule.time}</>;\n  }\n\n  return <>{prediction && prediction.time ? prediction.time : schedule.time}</>;\n};\n\nconst TripStop = ({\n  departure,\n  index,\n  showFare,\n  routeType\n}: Props): ReactElement<HTMLElement> | null => {\n  const { prediction, schedule } = departure;\n\n  /* istanbul ignore next */\n  if (!prediction.stop) return null;\n\n  return (\n    <tr key={`${prediction.stop.id}`}>\n      <th className=\"schedule-table__cell\" scope=\"row\">\n        <a\n          href={`/stops/${prediction.stop.id}`}\n          className={isSkippedOrCancelled(prediction) ? \"strikethrough\" : \"\"}\n        >\n          {isSkippedOrCancelled(prediction) && (\n            <>\n              {alertIcon(\"c-svg__icon-alerts-triangle\")}\n              <span className=\"sr-only\">This trip skips this stop at</span>\n            </>\n          )}\n          {breakTextAtSlash(prediction.stop.name)}\n        </a>\n        <GlxOpen pageType=\"schedule-finder\" stopId={prediction.stop.id} />\n      </th>\n      {showFare && (\n        <td className=\"schedule-table__cell schedule-table__cell--right-adjusted u-tabular-nums\">\n          {index === 0 ? \"\" : schedule.fare.price}\n        </td>\n      )}\n      <td className=\"schedule-table__cell schedule-table__cell--right-adjusted u-tabular-nums\">\n        {formattedDepartureTimes(departure, routeType)}\n      </td>\n    </tr>\n  );\n};\n\nexport default TripStop;\n","import React, { ReactElement, useState } from \"react\";\nimport { get, isEmpty } from \"lodash\";\nimport { Route } from \"../../../../__v3api\";\nimport Loading from \"../../../../components/Loading\";\nimport { caret, modeIcon } from \"../../../../helpers/icon\";\nimport liveClockSvg from \"../../../../../static/images/icon-live-clock.svg\";\nimport {\n  timeForCommuterRail,\n  trackForCommuterRail,\n  statusForCommuterRail\n} from \"../../../../helpers/prediction-helpers\";\nimport { breakTextAtSlash } from \"../../../../helpers/text\";\nimport { isABusRoute, isACommuterRailRoute } from \"../../../../models/route\";\nimport { modeBgClass } from \"../../../../stop/components/RoutePillList\";\nimport { EnhancedJourney, Journey } from \"../../__trips\";\nimport LiveCrowdingIcon from \"../../line-diagram/LiveCrowdingIcon\";\nimport {\n  isInitialLoading,\n  UseProviderState,\n  UseProviderStateWithoutInitialLoading\n} from \"../../../../helpers/use-provider\";\nimport TripDetails from \"./TripDetails\";\nimport { handleReactEnterKeyPress } from \"../../../../helpers/keyboard-events-react\";\n\ntype State = UseProviderState<EnhancedJourney[]>;\ntype StateWithoutInitialLoading = UseProviderStateWithoutInitialLoading<\n  EnhancedJourney[]\n>;\n\ninterface Props {\n  state: State;\n}\n\ninterface AccordionProps {\n  journey: EnhancedJourney;\n  contentComponent: () => ReactElement<HTMLElement>;\n}\n\n// Predictions are nil unless they have a time. This helps\n// prevent far-future trips from appearing in Upcoming Departures.\nconst hasPredictions = (journeys: Journey[]): boolean =>\n  journeys.filter(journey => journey.realtime.prediction !== null).length > 0;\n\nconst RoutePillSmall = ({\n  route\n}: {\n  route: Route;\n}): ReactElement<HTMLElement> | null => (\n  <span className=\"schedule-table__route-pill m-route-pills\">\n    <span className={`c-icon__bus-pill--small ${modeBgClass(route)}`}>\n      {route.name}\n    </span>\n  </span>\n);\n\nexport const crowdingInformation = (\n  journey: EnhancedJourney,\n  tripId: string\n): ReactElement<HTMLElement> | null => {\n  const { tripInfo } = journey;\n  if (tripInfo?.vehicle) {\n    const showCrowding =\n      tripInfo.vehicle.crowding && tripInfo.vehicle.trip_id === tripId;\n\n    return (\n      <LiveCrowdingIcon\n        crowding={showCrowding ? tripInfo.vehicle.crowding : null}\n      />\n    );\n  }\n\n  return null;\n};\n\nexport const BusTableRow = ({\n  journey\n}: {\n  journey: EnhancedJourney;\n}): ReactElement<HTMLElement> | null => {\n  const { trip, route, realtime } = journey;\n\n  return (\n    <>\n      <td className=\"schedule-table__cell schedule-table__cell--headsign\">\n        {isABusRoute(route) ? (\n          <RoutePillSmall route={route} />\n        ) : (\n          <span className=\"schedule-table__row-route-pill m-route-pills\">\n            {modeIcon(route.id)}\n          </span>\n        )}\n        {trip.headsign}\n      </td>\n      <td className=\"schedule-table__cell schedule-table__cell--time u-nowrap u-bold text-right\">\n        {realtime.prediction!.time}\n        {crowdingInformation(journey, trip.id)}\n      </td>\n    </>\n  );\n};\n\nexport const CrTableRow = ({\n  journey\n}: {\n  journey: Journey;\n}): ReactElement<HTMLElement> | null => {\n  const { trip, route, realtime } = journey;\n\n  if (realtime.prediction === null) return null;\n\n  const status = statusForCommuterRail(realtime);\n  const track = trackForCommuterRail(realtime);\n  const trainNumber = trip.name ? `Train ${trip.name}` : null;\n\n  const statusWithTrain = [trainNumber, status].filter(x => x).join(\" · \");\n\n  return (\n    <>\n      <td className=\"schedule-table__cell schedule-table__cell--headsign\">\n        {modeIcon(route.id)} {breakTextAtSlash(trip.headsign)}\n      </td>\n      <td className=\"schedule-table__cell text-right\">\n        {timeForCommuterRail(\n          realtime,\n          \"u-tabular-nums u-nowrap schedule-table__times\"\n        )}\n        <div className=\"u-nowrap\">\n          {statusWithTrain}\n          {track && (\n            <span className=\"schedule-table__track\">{` · ${track}`}</span>\n          )}\n        </div>\n      </td>\n    </>\n  );\n};\n\nconst AccordionRow = ({\n  journey,\n  contentComponent,\n  expanded,\n  toggle\n}: {\n  journey: EnhancedJourney;\n  contentComponent: () => ReactElement<HTMLElement>;\n  expanded: boolean;\n  toggle: () => void;\n}): ReactElement<HTMLElement> => {\n  const tripId = journey.trip.id;\n  const isCommuterRail = isACommuterRailRoute(journey.route);\n\n  return (\n    <>\n      <tr\n        className={\n          expanded ? \"schedule-table__row--expanded\" : \"schedule-table__row\"\n        }\n        aria-controls={`trip-${tripId}`}\n        aria-expanded={expanded}\n        role=\"button\"\n        onClick={toggle}\n        onKeyPress={e => handleReactEnterKeyPress(e, toggle)}\n        tabIndex={0}\n      >\n        {contentComponent()}\n        <td className=\"schedule-table__cell schedule-table__cell--tiny\">\n          {expanded\n            ? caret(\"c-expandable-block__header-caret--white\", expanded)\n            : caret(\"c-expandable-block__header-caret\", expanded)}\n        </td>\n      </tr>\n      {expanded && (\n        <tr id={`trip-${tripId}-expanded`}>\n          <td\n            colSpan={isCommuterRail ? 4 : 3}\n            className=\"schedule-table__cell schedule-table__cell--expanded\"\n          >\n            <TripDetails\n              showFare={isCommuterRail}\n              tripInfo={journey.tripInfo}\n            />\n          </td>\n        </tr>\n      )}\n    </>\n  );\n};\n\nconst Accordion = ({\n  journey,\n  contentComponent\n}: AccordionProps): ReactElement<HTMLElement> => {\n  const [expanded, setExpanded] = useState(false);\n  const toggle = (): void => setExpanded(!expanded);\n\n  return (\n    <AccordionRow\n      journey={journey}\n      contentComponent={contentComponent}\n      expanded={expanded}\n      toggle={toggle}\n    />\n  );\n};\n\nconst TableRow = ({\n  journey\n}: {\n  journey: EnhancedJourney;\n}): ReactElement<HTMLElement> | null => {\n  const { realtime } = journey;\n\n  if (realtime.prediction === null) return null;\n\n  const contentComponent =\n    journey.route.type !== 2\n      ? () => <BusTableRow journey={journey} />\n      : () => <CrTableRow journey={journey} />;\n\n  return <Accordion journey={journey} contentComponent={contentComponent} />;\n};\n\nconst UpcomingDeparturesHeader = (\n  <div className=\"schedule-table__upcoming-departures-header\">\n    <h3>Upcoming Departures</h3>\n    <span className=\"schedule-table__live-clock\" aria-hidden>\n      <span className=\"icon-realtime animate notranslate\">\n        <span\n          className=\"c-svg__icon-live-clock\"\n          // eslint-disable-next-line react/no-danger\n          dangerouslySetInnerHTML={{ __html: liveClockSvg }}\n        />\n        <span className=\"icon-realtime-text\">live</span>\n      </span>\n    </span>\n  </div>\n);\n\nexport const upcomingDeparturesTable = (\n  state: StateWithoutInitialLoading\n): ReactElement<HTMLElement> => {\n  const headerLabel = \"Trip Details\";\n  const { data: journeys } = state;\n\n  // We use this condition for cosmetic purposes: if there's no crowding information for _any_ of the upcoming departures, we don't want to show a gap/empty column.\n  const someCrowdingInfoExists =\n    !isEmpty(journeys) && isABusRoute(journeys[0].route)\n      ? journeys.some(journey => {\n          const { tripInfo } = journey;\n          if (!tripInfo) return false;\n          const crowding = get(tripInfo, \"vehicle.crowding\", null);\n          return crowding !== null;\n        })\n      : false;\n\n  return (\n    <>\n      {UpcomingDeparturesHeader}\n      {hasPredictions(journeys) ? (\n        <table\n          className={`schedule-table schedule-table--upcoming ${\n            !someCrowdingInfoExists ? \"u-no-crowding-data\" : \"\"\n          }`}\n        >\n          <thead className=\"schedule-table__header\">\n            <tr className=\"schedule-table__row-header\">\n              <th scope=\"col\" className=\"schedule-table__cell\">\n                Destinations\n              </th>\n              <th scope=\"col\" colSpan={2} className=\"schedule-table__cell\">\n                {someCrowdingInfoExists ? (\n                  <span className=\"trip-details-table__title\">\n                    {headerLabel}\n                  </span>\n                ) : (\n                  headerLabel\n                )}\n              </th>\n            </tr>\n          </thead>\n          <tbody>\n            {journeys.map((journey, idx: number) => (\n              <TableRow\n                journey={journey}\n                // eslint-disable-next-line react/no-array-index-key\n                key={idx}\n              />\n            ))}\n          </tbody>\n        </table>\n      ) : (\n        <div className=\"callout text-center u-bold\">\n          There are currently no realtime departures available.\n        </div>\n      )}\n    </>\n  );\n};\n\nexport const UpcomingDepartures = ({\n  state\n}: Props): ReactElement<HTMLElement> | null => {\n  if (isInitialLoading(state)) {\n    return <Loading />;\n  }\n\n  return <>{upcomingDeparturesTable(state)}</>;\n};\n\nexport default UpcomingDepartures;\n","import React, { ReactElement } from \"react\";\nimport renderFa from \"../../helpers/render-fa\";\nimport { SchedulePDF } from \"../components/__schedule\";\n\nconst pdfLink = (pdf: SchedulePDF | null): ReactElement<HTMLElement> | null => {\n  if (!pdf) {\n    return null;\n  }\n  return (\n    <div className=\"fs-16 pt-16\">\n      <a\n        key={pdf.url}\n        href={pdf.url}\n        rel=\"noopener noreferrer\"\n        className=\"c-call-to-action\"\n        target=\"_blank\"\n      >\n        {`Open full schedule PDF`}{\" \"}\n        {renderFa(\"fa-arrow-up-right-from-square\", \"\")}\n      </a>\n    </div>\n  );\n};\n\nexport default pdfLink;\n","import React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { Provider } from \"react-redux\";\nimport { isEmpty } from \"lodash\";\nimport { updateInLocation } from \"use-query-params\";\nimport Map from \"./components/Map\";\nimport { SchedulePageData, SelectedOrigin } from \"./components/__schedule\";\nimport { MapData } from \"../leaflet/components/__mapdata\";\nimport { DirectionId } from \"../__v3api\";\nimport ScheduleLoader from \"./components/ScheduleLoader\";\nimport {\n  store,\n  createScheduleStore,\n  getCurrentState\n} from \"./store/ScheduleStore\";\nimport { isABusRoute } from \"../models/route\";\n\nconst renderMap = ({\n  route_patterns: routePatternsByDirection,\n  direction_id: directionId,\n  route\n}: SchedulePageData): void => {\n  const routePatterns = routePatternsByDirection[directionId];\n  const defaultRoutePattern = routePatterns.slice(0, 1)[0];\n  const currentShapes = isABusRoute(route)\n    ? [defaultRoutePattern.shape_id]\n    : routePatterns.map(pattern => pattern.shape_id);\n  const currentStops = defaultRoutePattern.stop_ids;\n  const mapDataEl = document.getElementById(\"js-map-data\");\n  if (!mapDataEl) return;\n  const channel = mapDataEl.getAttribute(\"data-channel-id\");\n  if (!channel) throw new Error(\"data-channel-id attribute not set\");\n  const mapEl = document.getElementById(\"map-root\");\n  if (!mapEl) throw new Error(\"cannot find #map-root\");\n  const mapData: MapData = JSON.parse(mapDataEl.innerHTML);\n  ReactDOM.render(\n    <Map\n      data={mapData}\n      channel={channel}\n      currentShapes={currentShapes}\n      currentStops={currentStops}\n    />,\n    mapEl\n  );\n};\n\nconst updateURL = (origin: SelectedOrigin, direction?: DirectionId): void => {\n  /* istanbul ignore else  */\n  if (window) {\n    // eslint-disable-next-line camelcase\n    const newQuery = {\n      \"schedule_finder[direction_id]\":\n        direction !== undefined ? direction.toString() : \"\",\n      \"schedule_finder[origin]\": origin\n    };\n    const newLoc = updateInLocation(newQuery, window.location);\n    // newLoc is not a true Location, so toString doesn't work\n    window.history.replaceState({}, \"\", `${newLoc.pathname}${newLoc.search}`);\n  }\n};\n\nexport const renderAdditionalLineInformation = (\n  schedulePageData: SchedulePageData\n): void => {\n  const { schedule_note: scheduleNote } = schedulePageData;\n\n  ReactDOM.render(\n    <Provider store={store}>\n      <ScheduleLoader\n        component=\"ADDITIONAL_LINE_INFORMATION\"\n        schedulePageData={schedulePageData}\n        updateURL={updateURL}\n      />\n    </Provider>,\n    document.getElementById(\"react-root\")\n  );\n  // don't show Schedule Finder for subway\n  if (scheduleNote) {\n    ReactDOM.render(\n      <Provider store={store}>\n        <ScheduleLoader\n          component=\"SCHEDULE_NOTE\"\n          schedulePageData={schedulePageData}\n          updateURL={updateURL}\n        />\n      </Provider>,\n      document.getElementById(\"react-schedule-note-root\")\n    );\n  } else {\n    const scheduleFinderRoot = document.getElementById(\n      \"react-schedule-finder-root\"\n    );\n    if (scheduleFinderRoot) {\n      ReactDOM.render(\n        <Provider store={store}>\n          <ScheduleLoader\n            component=\"SCHEDULE_FINDER\"\n            schedulePageData={schedulePageData}\n            updateURL={updateURL}\n          />\n        </Provider>,\n        scheduleFinderRoot\n      );\n    }\n  }\n};\n\nconst renderDirectionAndMap = (\n  schedulePageData: SchedulePageData,\n  root: HTMLElement\n): void => {\n  const currentState = getCurrentState();\n  if (!!currentState && Object.keys(currentState).length !== 0) {\n    ReactDOM.render(\n      <Provider store={store}>\n        <ScheduleLoader\n          component=\"SCHEDULE_DIRECTION\"\n          schedulePageData={schedulePageData}\n          updateURL={updateURL}\n        />\n      </Provider>,\n      root\n    );\n  }\n};\n\nexport const renderDirectionOrMap = (\n  schedulePageData: SchedulePageData\n): void => {\n  const root = document.getElementById(\"react-schedule-direction-root\");\n  if (!root) {\n    renderMap(schedulePageData);\n    return;\n  }\n  renderDirectionAndMap(schedulePageData, root);\n};\n\nconst render = (): void => {\n  const schedulePageDataEl = document.getElementById(\"js-schedule-page-data\");\n  if (!schedulePageDataEl) return;\n  const schedulePageData = JSON.parse(\n    schedulePageDataEl.innerHTML\n  ) as SchedulePageData;\n  const {\n    direction_id: directionId,\n    route_patterns: routePatterns\n  } = schedulePageData;\n\n  createScheduleStore(directionId);\n  renderAdditionalLineInformation(schedulePageData);\n\n  if (!isEmpty(routePatterns)) {\n    renderDirectionOrMap(schedulePageData);\n  }\n};\n\nconst onLoad = (): void => {\n  render();\n};\n\nexport default onLoad;\n","import { Reducer, createStore, Store } from \"redux\";\nimport { StoreAction, SelectedOrigin } from \"../components/__schedule\";\nimport { DirectionId } from \"../../__v3api\";\nimport { Mode as ModalMode } from \"../components/schedule-finder/ScheduleFinderModal\";\nimport { dispatchChangedDirection } from \"../../hooks/useDirectionChangeEvent\";\n\nexport interface StoreProps {\n  selectedDirection: DirectionId;\n  selectedOrigin: SelectedOrigin | \"\";\n  modalOpen: boolean;\n  modalMode: ModalMode;\n}\n\ninterface ActionData {\n  selectedDirection?: DirectionId;\n  selectedOrigin?: SelectedOrigin | \"\";\n  modalOpen?: boolean;\n  modalMode?: ModalMode;\n}\n\nexport interface Action {\n  type: StoreAction;\n  newStoreValues: ActionData;\n}\n\nexport const scheduleStoreReducer: Reducer<StoreProps, Action> = (\n  state: StoreProps | undefined,\n  action: Action\n): StoreProps => {\n  const newState: StoreProps = Object.assign(\n    {\n      selectedDirection: undefined,\n      selectedOrigin: undefined,\n      modalOpen: false,\n      modalMode: \"schedule\"\n    },\n    state\n  );\n\n  switch (action.type) {\n    case \"INITIALIZE\":\n      return { ...newState, ...action.newStoreValues };\n    case \"CHANGE_DIRECTION\":\n      // notify other components of changed direction\n      dispatchChangedDirection(action.newStoreValues.selectedDirection!);\n\n      return {\n        ...newState,\n        selectedDirection: action.newStoreValues.selectedDirection!,\n        selectedOrigin: action.newStoreValues.selectedOrigin!\n      };\n    case \"CHANGE_ORIGIN\":\n      return {\n        ...newState,\n        selectedOrigin: action.newStoreValues.selectedOrigin!\n      };\n    case \"OPEN_MODAL\":\n      return {\n        ...newState,\n        modalMode: action.newStoreValues.modalMode!,\n        modalOpen: true\n      };\n    case \"CLOSE_MODAL\":\n      return {\n        ...newState,\n        modalOpen: false\n      };\n    default:\n      return newState;\n  }\n};\n\nexport const createScheduleStore = (directionId: DirectionId): Store =>\n  // create store with preloadedState:\n  createStore(scheduleStoreReducer, {\n    selectedDirection: directionId,\n    selectedOrigin: \"\",\n    modalOpen: false,\n    modalMode: \"schedule\"\n  });\n\n// initial 'dummy' value (will be overwritten when schedule-loader loads)\nexport const store: Store = createScheduleStore(0);\n\nexport const getCurrentState = (): StoreProps => store.getState();\n\nexport const storeHandler = (newValues: Action): void => {\n  store.dispatch(newValues);\n};\n\nexport const mapStateToProps = (state: StoreProps): StoreProps => ({\n  ...state\n});\n\nexport default mapStateToProps;\n","import React, { ReactElement } from \"react\";\n\nconst bgClass = (color: string | undefined): string =>\n  color ? `u-bg--${color}` : \"\";\n\nconst PillLink = ({\n  displayText,\n  linkURL,\n  backgroundColor,\n  optionalCSS = \"\",\n  externalLink\n}: {\n  displayText: string;\n  linkURL: string;\n  backgroundColor?: string | undefined;\n  optionalCSS?: string | undefined;\n  externalLink?: boolean;\n}): ReactElement<HTMLElement> => {\n  return (\n    <a\n      target={externalLink ? \"_blank\" : \"_self\"}\n      rel=\"noreferrer\"\n      href={linkURL}\n      className={`\n      m-stop-page__header-feature\n      m-stop-page__header-description\n      u-small-caps\n      ${bgClass(backgroundColor)}\n      ${optionalCSS}\n    `}\n    >\n      {displayText}\n    </a>\n  );\n};\n\nexport default PillLink;\n","import React, { ReactElement } from \"react\";\nimport { EnhancedRoute, Route } from \"../../__v3api\";\nimport { TypedRoutes } from \"./__stop\";\nimport { breakTextAtSlash } from \"../../helpers/text\";\nimport { routeToCSSClass } from \"../../helpers/css\";\nimport PillLink from \"./PillLink\";\n\ninterface RoutePillListProps {\n  routes: TypedRoutes[];\n  showGroupName?: boolean;\n}\n\ninterface RoutePillProps {\n  route: Route | EnhancedRoute;\n}\n\nconst busName = (name: string): string =>\n  name.startsWith(\"SL\") ? \"silver-line\" : \"bus\";\n\nconst modeNameForBg = ({ name, type }: EnhancedRoute | Route): string => {\n  switch (type) {\n    case 0:\n    case 1:\n      return routeToCSSClass(name);\n    case 2:\n      return \"commuter-rail\";\n    case 4:\n      return \"ferry\";\n    default:\n      return busName(name);\n  }\n};\n\nexport const modeBgClass = (route: EnhancedRoute | Route): string =>\n  `u-bg--${modeNameForBg(route)}`;\n\nconst RoutePill = ({ route }: RoutePillProps): ReactElement<HTMLElement> => (\n  <PillLink\n    displayText={breakTextAtSlash(route.name)}\n    linkURL={`/schedules/${route.id}`}\n    optionalCSS={modeBgClass(route)}\n  />\n);\n\nconst RoutePillList = ({\n  routes,\n  showGroupName\n}: RoutePillListProps): ReactElement<HTMLElement> => (\n  <div className=\"m-route-pills\">\n    {routes.map(typedRoute => (\n      <div\n        key={typedRoute.group_name}\n        className={`m-route-pills--${typedRoute.group_name}`}\n      >\n        {showGroupName && <h4 className=\"h4\">{typedRoute.group_name}</h4>}\n        {typedRoute.routes.map(routeWithDirections => (\n          <RoutePill\n            key={routeWithDirections.route.id}\n            route={routeWithDirections.route}\n          />\n        ))}\n      </div>\n    ))}\n  </div>\n);\n\nexport default RoutePillList;\n","module.exports = \"<svg viewBox=\\\"0 0 99 44\\\" version=\\\"1.1\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\" xmlns:xlink=\\\"http://www.w3.org/1999/xlink\\\"><g stroke=\\\"none\\\" stroke-width=\\\"1\\\" fill=\\\"none\\\" fill-rule=\\\"evenodd\\\"><path d=\\\"M64.7468627,7.09418079 C63.7278627,7.92118079 62.2328627,7.76518079 61.4058627,6.74618079 C60.5798627,5.72818079 60.7348627,4.23218079 61.7538627,3.40618079 C62.7718627,2.57918079 64.2678627,2.73518079 65.0948627,3.75318079 C65.9208627,4.77218079 65.7648627,6.26718079 64.7468627,7.09418079 M71.3778627,15.2651808 C70.7348627,15.7871808 69.7898627,15.6891808 69.2678627,15.0461808 C68.7458627,14.4021808 68.8438627,13.4581808 69.4878627,12.9361808 C70.1308627,12.4141808 71.0758627,12.5121808 71.5978627,13.1551808 C72.1198627,13.7991808 72.0208627,14.7431808 71.3778627,15.2651808 M78.5838627,24.1451808 C77.9408627,24.6671808 76.9958627,24.5691808 76.4738627,23.9251808 C75.9518627,23.2821808 76.0498627,22.3371808 76.6938627,21.8151808 C77.3368627,21.2931808 78.2818627,21.3921808 78.8038627,22.0351808 C79.3258627,22.6781808 79.2268627,23.6231808 78.5838627,24.1451808 M85.7898627,33.0241808 C85.1468627,33.5461808 84.2018627,33.4481808 83.6798627,32.8051808 C83.1578627,32.1621808 83.2558627,31.2171808 83.8998627,30.6951808 C84.5428627,30.1731808 85.4878627,30.2711808 86.0098627,30.9141808 C86.5318627,31.5581808 86.4328627,32.5021808 85.7898627,33.0241808 M92.9958627,41.9041808 C92.3528627,42.4261808 91.4078627,42.3281808 90.8858627,41.6841808 C90.3638627,41.0411808 90.4618627,40.0961808 91.1058627,39.5741808 C91.7488627,39.0521808 92.6928627,39.1511808 93.2158627,39.7941808 C93.7378627,40.4371808 93.6388627,41.3821808 92.9958627,41.9041808 M60.5718627,1.95018079 C58.7498627,3.42918079 58.4708627,6.10518079 59.9498627,7.92818079 C60.8378627,9.02218079 62.1578627,9.54718079 63.4648627,9.48218079 L90.3658627,42.6311808 C91.2358627,43.7031808 92.8098627,43.8681808 93.8828627,42.9971808 C94.9548627,42.1271808 95.1178627,40.5521808 94.2478627,39.4801808 L67.3478627,6.33218079 C67.6808627,5.06618079 67.4388627,3.66618079 66.5498627,2.57218079 C65.0708627,0.749180788 62.3948627,0.471180788 60.5718627,1.95018079\\\" fill=\\\"#00843D\\\"></path><polygon fill=\\\"#494F5C\\\" points=\\\"83.0152627 21.4583808 92.1742627 8.11338079 86.1102627 8.11338079 79.7292627 17.4093808\\\"></polygon><path d=\\\"M73.5692627,26.3859808 L76.8542627,30.4339808 L74.6942627,33.5829808 C75.1272627,34.8179808 74.9972627,36.2319808 74.2002627,37.3939808 C72.8722627,39.3289808 70.2262627,39.8209808 68.2912627,38.4929808 C66.3562627,37.1649808 65.8642627,34.5189808 67.1922627,32.5839808 C67.9892627,31.4219808 69.2632627,30.7929808 70.5712627,30.7529808 L70.5712627,30.7529808 L73.5692627,26.3859808 Z M72.0402627,33.0309808 C70.9592627,32.2889808 69.4802627,32.5639808 68.7382627,33.6449808 C67.9952627,34.7259808 68.2702627,36.2049808 69.3522627,36.9469808 C70.4332627,37.6889808 71.9122627,37.4139808 72.6542627,36.3329808 C73.3962627,35.2519808 73.1212627,33.7729808 72.0402627,33.0309808 Z\\\" fill=\\\"#00843D\\\"></path><g transform=\\\"translate(5.619061, 8.355000)\\\" fill=\\\"#494F5C\\\" fill-rule=\\\"nonzero\\\"><path d=\\\"M25.8759388,13.905 L15.1659388,13.905 L15.1659388,18.27 L20.5209388,18.27 L20.5209388,25.83 C19.8009388,26.19 18.3159388,26.46 16.3359388,26.46 C10.0359388,26.46 5.80593883,22.365 5.80593883,15.48 C5.80593883,8.415 10.3509388,4.59 16.8309388,4.59 C20.0259388,4.59 22.0509388,5.175 23.7159388,5.895 L24.9309388,1.44 C23.5359388,0.765 20.6109388,0 16.8759388,0 C6.84093883,0 0.000938830435,6.165 0.000938830435,15.75 C-0.0440611696,20.34 1.53093883,24.345 4.23093883,26.91 C7.11093883,29.655 10.9809388,30.96 16.1109388,30.96 C20.1609388,30.96 23.9409388,29.97 25.8759388,29.25 L25.8759388,13.905 Z\\\"></path><polygon points=\\\"35.2959388 30.645 53.2959388 30.645 53.2959388 26.01 40.8309388 26.01 40.8309388 0.315 35.2959388 0.315\\\"></polygon></g></g></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" role=\\\"img\\\" viewBox=\\\"0 0 16 16\\\"><rect width=\\\"16\\\" height=\\\"16\\\" fill=\\\"#165c96\\\" rx=\\\"3.74837\\\"></rect><g fill=\\\"#fff\\\"><path d=\\\"m6.90573 13a3.27922 3.27922 0 0 1 -1.36713-6.26353l.07439.97088a2.38543 2.38543 0 1 0 3.6515 2.29152l.58176 1.19057a3.33147 3.33147 0 0 1 -2.94052 1.81056z\\\"></path><path d=\\\"m10.61986 11.93766-1.34186-3.14392-3.27138-.00087-.31762-4.4696a.926.926 0 0 1 -.11143-.4318.89147.89147 0 1 1 .97853.888l.0939 1.6679h2.293l.00674.7194h-2.21937l.05246.80944 3.04171-.02043 1.29828 2.99729.98591-.35587.27281.64958z\\\"></path></g></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" role=\\\"img\\\" viewBox=\\\"0 0 48 48\\\"><path fill=\\\"#1c1e23\\\" d=\\\"m47.55089 42.53651-20.5403-40.60229a3.60991 3.60991 0 0 0 -1.27059-1.3994 3.08289 3.08289 0 0 0 -3.4708 0 3.57213 3.57213 0 0 0 -1.2518 1.3994l-20.5404 40.60229a3.715 3.715 0 0 0 0 3.6423 3.47281 3.47281 0 0 0 1.2518 1.3228 3.21739 3.21739 0 0 0 1.70689.49839h41.1186a3.16147 3.16147 0 0 0 1.688-.49841 3.47248 3.47248 0 0 0 1.2517-1.3228 3.71467 3.71467 0 0 0 .0569-3.64228z\\\"></path><g fill=\\\"#fff\\\"><path d=\\\"m27.04259 39.22282a.71323.71323 0 0 1 -.21909.544.73324.73324 0 0 1 -.54.2332h-4.5683a.73294.73294 0 0 1 -.5394-.2332.77238.77238 0 0 1 -.2192-.544v-4.4456a.77247.77247 0 0 1 .2192-.544.73331.73331 0 0 1 .53939-.23322h4.56881a.73351.73351 0 0 1 .54.2332.71375.71375 0 0 1 .2192.544z\\\"></path><path d=\\\"m26.73759 30.35892a.62508.62508 0 0 1 -.2345.4568.7061.7061 0 0 1 -.516.1828h-4.12809a.73374.73374 0 0 1 -.516-.1828.53482.53482 0 0 1 -.219-.4568l-1.1215-14.4817a.71.71 0 0 1 .2189-.5848.76.76 0 0 1 .516-.2924h6.512a.81448.81448 0 0 1 .53161.2924.70371.70371 0 0 1 .2189.53z\\\"></path></g></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" role=\\\"img\\\" viewBox=\\\"0 0 48 48\\\"><path fill=\\\"#003da5\\\" d=\\\"m24 0a24 24 0 1 0 24 24 24 24 0 0 0 -24-24\\\"></path><g fill=\\\"#fff\\\"><path d=\\\"m16.21338 13.647a12.87772 12.87772 0 0 1 2.69726.26123 5.83 5.83 0 0 1 2.0879.85547 3.98326 3.98326 0 0 1 1.34863 1.58057 5.56185 5.56185 0 0 1 .47851 2.43555 4.5366 4.5366 0 0 1 -.71093 2.61035 5.16141 5.16141 0 0 1 -2.10254 1.71093 4.97692 4.97692 0 0 1 2.85644 1.92823 5.74358 5.74358 0 0 1 .94239 3.3208 5.70688 5.70688 0 0 1 -.6084 2.71142 5.28726 5.28726 0 0 1 -1.63864 1.87058 7.25022 7.25022 0 0 1 -2.3496 1.07275 10.589 10.589 0 0 1 -2.71094.34815h-10.03422v-20.70603zm-.58008 8.38086a3.27472 3.27472 0 0 0 2.001-.57959 2.19 2.19 0 0 0 .7832-1.88525 2.41024 2.41024 0 0 0 -.26074-1.189 1.94175 1.94175 0 0 0 -.69629-.72509 2.94457 2.94457 0 0 0 -1.001-.36231 6.66287 6.66287 0 0 0 -1.17383-.10156h-4.26364v4.84277zm.26074 8.78711a6.08961 6.08961 0 0 0 1.27637-.13037 3.12816 3.12816 0 0 0 1.07324-.43506 2.20243 2.20243 0 0 0 .73926-.82666 2.84574 2.84574 0 0 0 .27539-1.334 2.67712 2.67712 0 0 0 -.89941-2.27637 3.83584 3.83584 0 0 0 -2.37793-.68164h-4.95896v5.68408z\\\"></path><path d=\\\"m31.438 13.647v16.8779h10.09276v3.8281h-14.64551v-20.706z\\\"></path></g></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" role=\\\"img\\\" viewBox=\\\"0 0 48 48\\\"><path fill=\\\"#1c1e23\\\" d=\\\"m14.29 0h19.43a1.05 1.05 0 0 1 .71.29l13.28 13.28a1.05 1.05 0 0 1 .29.71v18.92a1 1 0 0 1 -.28.69l-13.29 13.8a1 1 0 0 1 -.72.31h-19.43a1.05 1.05 0 0 1 -.71-.29l-13.28-13.28a1.05 1.05 0 0 1 -.29-.71v-18.92a1 1 0 0 1 .28-.69l13.29-13.8a1 1 0 0 1 .72-.31z\\\"></path><path fill=\\\"#fff\\\" d=\\\"m12.28 15.76 3.43-3.47a1 1 0 0 1 1.39 0l6.9 6.84 6.89-6.84a1 1 0 0 1 1.4 0l3.43 3.47a1 1 0 0 1 0 1.39l-6.91 6.85 6.9 7a1 1 0 0 1 0 1.4l-3.4 3.33a1 1 0 0 1 -1.39 0l-6.91-7-6.91 7a1 1 0 0 1 -1.39 0l-3.4-3.33a1 1 0 0 1 0-1.4l6.9-7-6.9-6.85a1 1 0 0 1 -.03-1.39z\\\"></path></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 48 48\\\"><path d=\\\"m31.93 7.28h-14.39l1.2-5.87a1.37 1.37 0 0 0 -2.11-1.18l-14.86 9.88a1.44 1.44 0 0 0 0 2.38l14.86 9.88a1.37 1.37 0 0 0 2.11-1.19l-1.2-5.86h14.39c3.94 0 7.14 2.82 7.14 6.3v12c0 3.48-3.2 6.3-7.14 6.3h-8.2v8h8.2c8.23 0 14.93-6.43 14.93-14.34v-12c0-7.91-6.7-14.34-14.93-14.34\\\"></path></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" role=\\\"img\\\" viewBox=\\\"0 0 48 48\\\"><path d=\\\"m47.13 14.89-22.42 22.43-4.21 4.21a3 3 0 0 1 -4.21 0l-4.21-4.21-11.21-11.21a3 3 0 0 1 0-4.22l4.21-4.21a3 3 0 0 1 4.21 0l9.11 9.14 20.31-20.35a3 3 0 0 1 4.21 0l4.21 4.21a3 3 0 0 1 .87 2.11 3 3 0 0 1 -.87 2.1z\\\"></path></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" role=\\\"img\\\" viewBox=\\\"0 0 48 48\\\"><path class=\\\"person person-left\\\" d=\\\"m6.86 16.05a6.86 6.86 0 0 0 -6.86 6.86v17.77a3.43 3.43 0 0 0 3.43 3.42h6.86a3.42 3.42 0 0 0 3.42-3.42v-17.77a6.86 6.86 0 0 0 -6.85-6.86z\\\"></path><path class=\\\"person person-left\\\" d=\\\"m6.9 13.23a4.93 4.93 0 1 0 -4.9-4.93 4.93 4.93 0 0 0 4.9 4.93z\\\"></path><path class=\\\"person person-middle\\\" d=\\\"m24 16.05a6.86 6.86 0 0 0 -6.86 6.86v17.77a3.43 3.43 0 0 0 3.43 3.42h6.86a3.43 3.43 0 0 0 3.43-3.42v-17.77a6.86 6.86 0 0 0 -6.86-6.86z\\\"></path><path class=\\\"person person-middle\\\" d=\\\"m24.05 13.23a4.93 4.93 0 1 0 -4.93-4.93 4.93 4.93 0 0 0 4.93 4.93z\\\"></path><path class=\\\"person person-right\\\" d=\\\"m41.14 16.05a6.86 6.86 0 0 0 -6.85 6.86v17.77a3.42 3.42 0 0 0 3.42 3.42h6.86a3.43 3.43 0 0 0 3.43-3.42v-17.77a6.86 6.86 0 0 0 -6.86-6.86z\\\"></path><path class=\\\"person person-right\\\" d=\\\"m41.19 13.23a4.93 4.93 0 1 0 -4.93-4.93 4.93 4.93 0 0 0 4.93 4.93z\\\"></path></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" xmlns:xlink=\\\"http://www.w3.org/1999/xlink\\\" data-name=\\\"Layer 1\\\" role=\\\"img\\\" viewBox=\\\"0 0 48 48\\\"><defs><style>.cls-1{fill:none;clip-rule:evenodd;}.cls-2{clip-path:url(#clip-path);}.cls-3{clip-path:url(#clip-path-2);}.cls-4{clip-path:url(#clip-path-3);}.cls-5{fill:#1c1e23;}</style><clipPath><path d=\\\"M80.17-26.74q19.32-18,19.32-28.68A19.32,19.32,0,0,0,80.17-74.74,19.32,19.32,0,0,0,60.85-55.42Q60.85-44.75,80.17-26.74Z\\\" class=\\\"cls-1\\\"></path></clipPath><clipPath><path d=\\\"M25-26.74q19.32-18,19.32-28.68A19.32,19.32,0,0,0,25-74.74,19.32,19.32,0,0,0,5.64-55.42Q5.64-44.75,25-26.74Z\\\" class=\\\"cls-1\\\"></path></clipPath><clipPath><path d=\\\"M-42.62-26.74q19.32-18,19.32-28.68A19.32,19.32,0,0,0-42.62-74.74,19.32,19.32,0,0,0-61.94-55.42Q-61.94-44.75-42.62-26.74Z\\\" class=\\\"cls-1\\\"></path></clipPath></defs><path d=\\\"M35.55,19.8,25.05,30.3a1.45,1.45,0,0,1-2.1,0L12.45,19.8A1.44,1.44,0,0,1,12,18.75a1.51,1.51,0,0,1,1.5-1.5h21a1.51,1.51,0,0,1,1.5,1.5A1.44,1.44,0,0,1,35.55,19.8Z\\\" class=\\\"cls-5\\\"></path></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" role=\\\"img\\\" viewBox=\\\"0 0 16 16\\\"><path fill=\\\"#00843d\\\" d=\\\"m8 0a8 8 0 1 0 8 8 8 8 0 0 0 -8-8\\\"></path><path fill=\\\"#fff\\\" d=\\\"m8.59043 4a5.39839 5.39839 0 0 1 1.08557.10121 2.392 2.392 0 0 1 .83953.33044 1.55783 1.55783 0 0 1 .54221.61054 2.06794 2.06794 0 0 1 .19251.941 1.70139 1.70139 0 0 1 -.28591 1.00827 2.06017 2.06017 0 0 1 -.84522.66143 2.00387 2.00387 0 0 1 1.14822.74512 2.15155 2.15155 0 0 1 .37933 1.28291 2.13665 2.13665 0 0 1 -.24491 1.04767 2.05831 2.05831 0 0 1 -.65955.72215 2.95712 2.95712 0 0 1 -.94432.41469 4.42311 4.42311 0 0 1 -1.09014.13457h-4.03587v-8zm-.23352 3.23819a1.35217 1.35217 0 0 0 .80535-.22431.83167.83167 0 0 0 .3144-.72817.89181.89181 0 0 0 -.1048-.459.75208.75208 0 0 0 -.27909-.28011 1.2235 1.2235 0 0 0 -.40324-.14 2.75738 2.75738 0 0 0 -.47159-.03939h-1.71551v1.871zm.10593 3.39465a2.50985 2.50985 0 0 0 .51261-.05033 1.28994 1.28994 0 0 0 .43172-.168.85959.85959 0 0 0 .29731-.31949 1.05918 1.05918 0 0 0 .11052-.51532 1.01659 1.01659 0 0 0 -.3611-.87916 1.59077 1.59077 0 0 0 -.9569-.26369h-1.99457v2.196z\\\"></path></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" role=\\\"img\\\" viewBox=\\\"0 0 16 16\\\"><path fill=\\\"#00843d\\\" d=\\\"m8 0a8 8 0 1 0 8 8 8 8 0 0 0 -8-8\\\"></path><path fill=\\\"#fff\\\" d=\\\"m9.91236 6.22237a1.685 1.685 0 0 0 -.37441-.423 1.75365 1.75365 0 0 0 -1.10334-.3859 1.96325 1.96325 0 0 0 -.9632.21962 1.8196 1.8196 0 0 0 -.64318.58932 2.59 2.59 0 0 0 -.35871.84031 4.22351 4.22351 0 0 0 -.1119.97471 3.92818 3.92818 0 0 0 .1119.937 2.536 2.536 0 0 0 .35871.8194 1.83829 1.83829 0 0 0 .64318.58357 1.95744 1.95744 0 0 0 .9632.21962 1.55383 1.55383 0 0 0 1.20479-.47114 2.17357 2.17357 0 0 0 .53023-1.24243h1.62837a3.87815 3.87815 0 0 1 -.33257 1.29577 3.08815 3.08815 0 0 1 -.707.98516 2.99838 2.99838 0 0 1 -1.02805.62122 3.76351 3.76351 0 0 1 -1.29577.2144 3.92217 3.92217 0 0 1 -1.57918-.30538 3.393 3.393 0 0 1 -1.18387-.84084 3.71981 3.71981 0 0 1 -.73835-1.25812 4.61521 4.61521 0 0 1 -.25727-1.55827 4.77251 4.77251 0 0 1 .25727-1.59017 3.83132 3.83132 0 0 1 .73835-1.28008 3.3914 3.3914 0 0 1 1.18387-.85653 3.86194 3.86194 0 0 1 1.57918-.31061 3.853 3.853 0 0 1 1.19433.182 3.25411 3.25411 0 0 1 1.00712.53023 2.86159 2.86159 0 0 1 .73312.86228 3.08969 3.08969 0 0 1 .36395 1.1776h-1.6273a1.37793 1.37793 0 0 0 -.19347-.52974z\\\"></path></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" role=\\\"img\\\" viewBox=\\\"0 0 16 16\\\"><path fill=\\\"#00843d\\\" d=\\\"m8 0a8 8 0 1 0 8 8 8 8 0 0 0 -8-8\\\"></path><path fill=\\\"#fff\\\" d=\\\"m7.90973 4a4.12016 4.12016 0 0 1 1.43992.24673 3.12441 3.12441 0 0 1 1.15435.73966 3.404 3.404 0 0 1 .76154 1.232 4.96822 4.96822 0 0 1 .27464 1.737 5.52384 5.52384 0 0 1 -.22431 1.61335 3.55236 3.55236 0 0 1 -.67729 1.27744 3.1858 3.1858 0 0 1 -1.13137.84579 3.8368 3.8368 0 0 1 -1.59748.30803h-3.44991v-8zm-.12255 6.52123a2.252 2.252 0 0 0 .73966-.12364 1.62238 1.62238 0 0 0 .6379-.40867 2.04332 2.04332 0 0 0 .44861-.74513 3.28738 3.28738 0 0 0 .1685-1.12042 4.64682 4.64682 0 0 0 -.11817-1.09253 2.18483 2.18483 0 0 0 -.38624-.83484 1.7182 1.7182 0 0 0 -.71121-.53176 2.83742 2.83742 0 0 0 -1.09307-.18492h-1.255v5.04192z\\\"></path></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" role=\\\"img\\\" viewBox=\\\"0 0 16 16\\\"><path fill=\\\"#00843d\\\" d=\\\"m8 0a8 8 0 1 0 8 8 8 8 0 0 0 -8-8\\\"></path><path fill=\\\"#fff\\\" d=\\\"m11.18354 4v1.47931h-4.22454v1.714h3.8766v1.36718h-3.8766v1.96074h4.3143v1.47877h-6.07266v-8z\\\"></path></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" role=\\\"img\\\" viewBox=\\\"0 0 16 16\\\"><path fill=\\\"#00843d\\\" d=\\\"m8 0a8 8 0 1 0 8 8 8 8 0 0 0 -8-8\\\"></path><g fill=\\\"#fff\\\"><path d=\\\"m6.083 11.53381a2.63844 2.63844 0 0 1 -1.03434.21619 3.67706 3.67706 0 0 1 -1.48049-.28629 3.18108 3.18108 0 0 1 -1.10987-.78829 3.48761 3.48761 0 0 1 -.69221-1.17949 4.327 4.327 0 0 1 -.24119-1.46088 4.47445 4.47445 0 0 1 .24119-1.49078 3.59212 3.59212 0 0 1 .69221-1.20008 3.17958 3.17958 0 0 1 1.10987-.803 3.62061 3.62061 0 0 1 1.48049-.29119 3.48952 3.48952 0 0 1 1.06968.1657 3.037 3.037 0 0 1 .93339.48679 2.63108 2.63108 0 0 1 1.01968 1.87758h-1.506a1.5098 1.5098 0 0 0 -.54219-.90349 1.57786 1.57786 0 0 0 -.97458-.30149 1.84057 1.84057 0 0 0 -.903.20589 1.70591 1.70591 0 0 0 -.603.55249 2.42823 2.42823 0 0 0 -.3363.7878 3.95986 3.95986 0 0 0 -.1049.91378 3.68309 3.68309 0 0 0 .1049.87849 2.37769 2.37769 0 0 0 .3363.76819 1.72339 1.72339 0 0 0 .603.54709 1.83509 1.83509 0 0 0 .903.2059 1.711 1.711 0 0 0 1.20989-.3966 1.72506 1.72506 0 0 0 .49709-1.14958h-1.58636v-1.17454h3.012v3.87526h-1.004l-.16079-.81329a2.3565 2.3565 0 0 1 -.93347.75784z\\\"></path><path d=\\\"m11.03239 4.4206v5.84352h3.49434v1.32509h-5.06994v-7.16861z\\\"></path></g></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" role=\\\"img\\\" viewBox=\\\"0 0 9 9\\\"><path fill-rule=\\\"evenodd\\\" d=\\\"M5 4V1.5a.5.5 0 0 0-1 0v3a.498.498 0 0 0 .5.5h2a.5.5 0 0 0 0-1H5zm-.5 5a4.5 4.5 0 1 1 0-9 4.5 4.5 0 0 1 0 9z\\\"></path></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" role=\\\"img\\\" viewBox=\\\"0 0 16 16\\\"><path fill=\\\"#da291c\\\" d=\\\"m8 0a8 8 0 1 0 8 8 8 8 0 0 0 -8-8\\\"></path><path fill=\\\"#fff\\\" d=\\\"m6.16836 4 1.871 5.50147h.02188l1.7704-5.50147h2.47609v8h-1.64673v-5.66942h-.023l-1.96071 5.66942h-1.35567l-1.96075-5.61308h-.02187v5.61308h-1.64673v-8z\\\"></path></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" role=\\\"img\\\" viewBox=\\\"0 0 16 16\\\"><path fill=\\\"#ffc72c\\\" d=\\\"m8.03494 0a8.04088 8.04088 0 0 0 -8 8 8 8 0 1 0 8-8\\\"></path><path fill=\\\"#1c1e23\\\" d=\\\"m12.55163 6.95515-.43927-3.29782c-.11487-.59469-.50684-.83119-1.088-1.07447a9.94811 9.94811 0 0 0 -2.99371-.52036 9.94139 9.94139 0 0 0 -2.98694.52036c-.57444.24328-.97312.47978-1.09476 1.07447l-.43251 3.29782v4.55476h.80756v.77716a.56688.56688 0 0 0 .29735.48655c.04054.02029.08109.04054.11487.05407a.689.689 0 0 0 .09462.027.57561.57561 0 0 0 .15546.02029h.2297a.63557.63557 0 0 0 .669-.58793v-.77716h4.363v.77716a.56686.56686 0 0 0 .29735.48655c.04054.02029.08109.04054.11487.05407a.689.689 0 0 0 .09462.027.57561.57561 0 0 0 .15546.02029h.22974a.63556.63556 0 0 0 .669-.58793v-.77716h.74252zm-6.64292-3.93953h4.25065c.20273 0 .37167.23083.37167.50782s-.16894.50781-.37167.50781h-4.25065c-.20272 0-.37167-.23083-.37167-.50781s.16896-.50782.37167-.50782zm-1.03959 4.55438.3006-2.33388a.31412.31412 0 0 1 .32228-.26712h5.12466a.31832.31832 0 0 1 .32226.26712l.34393 2.33388v.10421a.32557.32557 0 0 1 -.3223.32579h-5.7811a.3317.3317 0 0 1 -.31033-.3388.23335.23335 0 0 1 0-.0912zm.6465 2.75347a.82854.82854 0 1 1 -.03709-1.65432.83107.83107 0 1 1 .03709 1.65432zm5.01541 0a.82854.82854 0 1 1 -.03709-1.65432.83107.83107 0 1 1 .03709 1.65432z\\\"></path></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" role=\\\"img\\\" viewBox=\\\"0 0 16 16\\\"><path fill=\\\"#80276c\\\" d=\\\"m6.19 11.91998h3.63v1h-3.63z\\\" transform=\\\"matrix(.99919448 .0401297 -.0401297 .99919448 .50486 -.31123)\\\"></path><path fill=\\\"#80276c\\\" d=\\\"m8 0a8.02127 8.02127 0 0 0 -7.65785 10.376 7.78359 7.78359 0 0 0 5.28185 5.28185 8.008 8.008 0 1 0 2.376-15.65785\\\"></path><g fill=\\\"#fff\\\"><path d=\\\"m10.33 11.75 1.15-.85a1.46975 1.46975 0 0 0 .52-.84v-4.82a.88891.88891 0 0 0 -.3-.66.79321.79321 0 0 1 -.31-.6l-.01-1.19a.81979.81979 0 0 0 -.65-.79 20.91806 20.91806 0 0 0 -2.5-.52 1.06538 1.06538 0 0 0 -.47 0c-.7.15-1.55.3-2.24.48-.42.12-.85.35-.85.85v1.18a.80288.80288 0 0 1 -.33.61.851.851 0 0 0 -.31.66v4.8a1.40971 1.40971 0 0 0 .48.84l1.1.81-1.74 2.84h1.13l.24-.39h5.53l.13.22.02.03.08.14h1.05zm.95-2.3a.73.73 0 1 1 -.73-.73.72767.72767 0 0 1 .73.73zm-1.44 3.15h-3.65l.41-.68h2.84l.03.06.35.58zm-1.14-9.65a.24471.24471 0 0 1 .3-.24l1.21.25a.25351.25351 0 0 1 .2.24v.73a.24955.24955 0 0 1 -.3.24l-1.21-.24a.23758.23758 0 0 1 -.2-.24zm-.72 2.26a.82.82 0 1 1 -.82.82.82371.82371 0 0 1 .82-.82zm-2.32-2.01a.25358.25358 0 0 1 .2-.24l1.21-.25a.24868.24868 0 0 1 .3.24v.74a.24683.24683 0 0 1 -.2.24l-1.22.24a.24554.24554 0 0 1 -.29-.24zm-.2 6.98a.73.73 0 1 1 .73-.73.72767.72767 0 0 1 -.73.73zm0 3.61.5-.82h4.1l.49.82z\\\"></path><path d=\\\"m11 14.55h-.01l-.07-.14z\\\"></path></g></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" role=\\\"img\\\" viewBox=\\\"0 0 16 16\\\"><path fill=\\\"#008eaa\\\" d=\\\"m14.14 13.11v-2.78h-1.54v4.21a.00976.00976 0 0 1 -.00995.01 7.96744 7.96744 0 0 1 -9.18005-.01c-.07995-.06-.16-.11-.24-.18l-1.53-1.52a7.91568 7.91568 0 0 1 -1.64-4.84 8 8 0 0 1 16 0 7.8954 7.8954 0 0 1 -1.86 5.11z\\\"></path><path fill=\\\"#008eaa\\\" d=\\\"m14.14 10.33v2.78a2.33839 2.33839 0 0 1 -.29.35 7.5757 7.5757 0 0 1 -1.25 1.08v-4.21z\\\"></path><g fill=\\\"#fff\\\"><path d=\\\"m12.6 13.07v1.1a.81712.81712 0 0 1 -.19-.09 1.08477 1.08477 0 0 0 -1.15-.03 1.327 1.327 0 0 1 -1.36.03 1.1128 1.1128 0 0 0 -1.19-.04 1.457 1.457 0 0 1 -1.43 0 1.09284 1.09284 0 0 0 -1.19.04 1.30468 1.30468 0 0 1 -1.36-.04 1.12472 1.12472 0 0 0 -1.16.04.25063.25063 0 0 0 -.07.04v-1.09a.07583.07583 0 0 0 .04-.02 1.22855 1.22855 0 0 1 1.4.08 1.37912 1.37912 0 0 0 1.19-.07 1.18568 1.18568 0 0 1 1.29.04 1.31353 1.31353 0 0 0 1.16 0 1.186 1.186 0 0 1 1.29-.04 1.38316 1.38316 0 0 0 1.19.07 1.24661 1.24661 0 0 1 1.4-.08.351.351 0 0 0 .14.06z\\\"></path><path d=\\\"m11.06 10.98a.87762.87762 0 0 1 -.15.05 3.51709 3.51709 0 0 1 -.16-1.49 10.81375 10.81375 0 0 1 1.85-2.66l-.6-.24v-3.64h-1v-1h-1.99v.01h-.01v-.01h.01v-.99h-2v.99h-2.01v1h-1v3.64l-.59.24a10.46678 10.46678 0 0 1 1.83 2.64 3.75072 3.75072 0 0 1 -.15 1.5.41845.41845 0 0 1 -.15-.04 1.2264 1.2264 0 0 0 -1.4-.07c-.00995.01-.03.01-.04.02v1.08c.02-.01.05-.03.07-.04a1.10228 1.10228 0 0 1 1.16-.03 1.32675 1.32675 0 0 0 1.36.03 1.09231 1.09231 0 0 1 1.19-.03 1.457 1.457 0 0 0 1.43 0 1.09273 1.09273 0 0 1 1.19.04 1.32768 1.32768 0 0 0 1.36-.04 1.12876 1.12876 0 0 1 1.15.03 1.73655 1.73655 0 0 0 .19.1v-1.1a.4229.4229 0 0 1 -.14-.06 1.26247 1.26247 0 0 0 -1.4.07zm-3.06-8.98h.01v.01h-.01zm2.01 3.84v-.84h-1.01v-1h-2v1h-1v.84l-1 .4v-2.24h1v-1h4v1h1v2.24z\\\"></path><path d=\\\"m8 2h.01001v.01001h-.01001z\\\"></path><path d=\\\"m9 2h.01001v.01001h-.01001z\\\"></path><path d=\\\"m8 2h.01001v.01001h-.01001z\\\"></path><path d=\\\"m9 2h.01001v.01001h-.01001z\\\"></path></g></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" role=\\\"img\\\" viewBox=\\\"0 0 48 48\\\"><path fill=\\\"#494f5b\\\" d=\\\"m24 0a24 24 0 1 0 24 24 24 24 0 0 0 -24-24\\\"></path><g fill=\\\"#fff\\\"><path d=\\\"m25.8889 5.8222a1.4111 1.4111 0 1 0 -1.4111-1.4111 1.411 1.411 0 0 0 1.4111 1.4111z\\\"></path><path d=\\\"m31.4555 34.2111a4.9779 4.9779 0 0 0 3.889-4.8222v-18.1445a5.0112 5.0112 0 0 0 -5.0778-4.9111h-12.5333a5.0112 5.0112 0 0 0 -5.1 4.9v18.1556a4.9779 4.9779 0 0 0 3.8889 4.8222l-5.8556 8.7889h3.4l4.1889-6.1445h11.5555l4.1889 6.1445h3.3333zm-10.7555-25.9889a.8445.8445 0 0 1 .8445-.8111h4.9555a.8444.8444 0 0 1 .8333.8111v1.4445l-.0006.0339a.8334.8334 0 0 1 -.866.7994l-4.9222-.0111a.8333.8333 0 0 1 -.8445-.8222zm-3.1111 23.3334a2.2223 2.2223 0 1 1 2.2222-2.2223 2.2223 2.2223 0 0 1 -2.2222 2.2223zm.2889-11.8112c-.0758.0036-.1518.0036-.2276 0a2.4221 2.4221 0 0 1 -2.3057-2.5333v-3.2667a2.4109 2.4109 0 0 1 2.5333-2.5444h12.2222a2.4113 2.4113 0 0 1 2.5333 2.5444v3.2667q.0054.1137 0 .2276a2.4221 2.4221 0 0 1 -2.5333 2.3057zm12.4333 11.8112a2.2334 2.2334 0 1 1 .0223 0z\\\"></path><path d=\\\"m22.1445 5.8222h-.0334.0337a1.4113 1.4113 0 1 0 -1.4115-1.4115 1.4111 1.4111 0 0 0 1.4115 1.4119z\\\"></path></g></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" role=\\\"img\\\" viewBox=\\\"0 0 16 16\\\"><path fill=\\\"#ed8b00\\\" d=\\\"m8 0a8 8 0 1 0 8 8 8 8 0 0 0 -8-8\\\"></path><g fill=\\\"#fff\\\"><path d=\\\"m1.81834 6.54427a3.5921 3.5921 0 0 1 .6922-1.20008 3.17962 3.17962 0 0 1 1.10988-.803 3.62054 3.62054 0 0 1 1.48049-.29119 3.61289 3.61289 0 0 1 1.48637.2912 3.17488 3.17488 0 0 1 1.104.803 3.59428 3.59428 0 0 1 .69319 1.20008 4.47445 4.47445 0 0 1 .24119 1.49078 4.327 4.327 0 0 1 -.24119 1.46088 3.48977 3.48977 0 0 1 -.69319 1.17949 3.176 3.176 0 0 1 -1.104.78829 3.66921 3.66921 0 0 1 -1.48637.28628 3.677 3.677 0 0 1 -1.48049-.28629 3.18112 3.18112 0 0 1 -1.10988-.78829 3.48759 3.48759 0 0 1 -.6922-1.17949 4.327 4.327 0 0 1 -.24119-1.46088 4.47445 4.47445 0 0 1 .24119-1.49078zm1.44029 2.36927a2.37747 2.37747 0 0 0 .3363.76819 1.72331 1.72331 0 0 0 .603.54709 1.835 1.835 0 0 0 .903.2059 1.84164 1.84164 0 0 0 .904-.2059 1.72881 1.72881 0 0 0 .602-.54709 2.35675 2.35675 0 0 0 .3363-.76819 3.63424 3.63424 0 0 0 .10588-.87849 3.90728 3.90728 0 0 0 -.10588-.91378 2.40722 2.40722 0 0 0 -.3363-.7878 1.7112 1.7112 0 0 0 -.602-.55249 1.84715 1.84715 0 0 0 -.904-.20589 1.84052 1.84052 0 0 0 -.903.20589 1.70583 1.70583 0 0 0 -.603.55249 2.428 2.428 0 0 0 -.3363.7878 3.95986 3.95986 0 0 0 -.10491.91378 3.6831 3.6831 0 0 0 .10491.87849z\\\"></path><path d=\\\"m11.27582 4.4206v5.84352h3.49435v1.32509h-5.06994v-7.16861z\\\"></path></g></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" role=\\\"img\\\" viewBox=\\\"0 0 48 48\\\"><path d=\\\"m40.82 11.75-11.11-11.12a2.18 2.18 0 0 0 -1.52-.63h-17.64a4 4 0 0 0 -4 4v40a4 4 0 0 0 4 4h26.9a4 4 0 0 0 4-4v-30.73a2.12 2.12 0 0 0 -.63-1.52zm-11.74-7.28 7.92 7.91h-6.94a1 1 0 0 1 -1-1zm9.37 39.53a1 1 0 0 1 -1 1h-26.9a1 1 0 0 1 -1-1v-40a1 1 0 0 1 1-1h15.53v8.39a4 4 0 0 0 4 4h8.39z\\\"></path><path d=\\\"m16.31 21.05h-3.7v8.64h1.79v-3.11h1.8a3.27 3.27 0 0 0 2.16-.58 2.66 2.66 0 0 0 .76-2.16 2.59 2.59 0 0 0 -.76-2.07 3 3 0 0 0 -2.05-.72zm.69 3.73a1.37 1.37 0 0 1 -1 .31h-1.6v-2.54h1.6a1.47 1.47 0 0 1 1 .29 1.21 1.21 0 0 1 .34 1 1.28 1.28 0 0 1 -.34.94z\\\"></path><path d=\\\"m27.1 22.33a2.81 2.81 0 0 0 -1.47-1.09 4.54 4.54 0 0 0 -1.34-.19h-3.72v8.64h3.72a3.13 3.13 0 0 0 2.9-1.61 5.76 5.76 0 0 0 .69-2.92 6.6 6.6 0 0 0 -.16-1.43 3.91 3.91 0 0 0 -.62-1.4zm-1.33 4.6a1.79 1.79 0 0 1 -1.77 1.26h-1.68v-5.64h1.68a1.73 1.73 0 0 1 1.64.71 4 4 0 0 1 .42 2 4.32 4.32 0 0 1 -.29 1.67z\\\"></path><path d=\\\"m29.23 29.69h1.8v-3.62h3.82v-1.5h-3.82v-1.99h4.36v-1.52h-6.16z\\\"></path></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" role=\\\"img\\\" viewBox=\\\"0 0 16 16\\\"><path fill=\\\"#da291c\\\" d=\\\"m8 0a8 8 0 1 0 8 8 8 8 0 0 0 -8-8\\\"></path><g fill=\\\"#fff\\\"><path d=\\\"m6.01545 4.25a2.39689 2.39689 0 0 1 .90832.16341 2.09735 2.09735 0 0 1 .694.44567 1.9348 1.9348 0 0 1 .44036.65684 2.09816 2.09816 0 0 1 .1528.80327 2.26208 2.26208 0 0 1 -.278 1.14494 1.74718 1.74718 0 0 1 -.90938.73536v.02122a1.26481 1.26481 0 0 1 .504.25679 1.42114 1.42114 0 0 1 .32576.4096 1.91173 1.91173 0 0 1 .18358.51995 4.56343 4.56343 0 0 1 .07958.5677c.00637.11884.0138.25891.02122.4202.00637.16129.01911.32576.03608.49342a3.41227 3.41227 0 0 0 .08383.4775 1.113 1.113 0 0 0 .174.38413h-1.649a2.91366 2.91366 0 0 1 -.16871-.851c-.02123-.329-.052-.6441-.09444-.94546a1.4991 1.4991 0 0 0 -.35645-.86165 1.2331 1.2331 0 0 0 -.89346-.2727h-1.64904v2.93081h-1.649v-7.5zm-.58786 3.3924a1.24739 1.24739 0 0 0 .85-.25148 1.04463 1.04463 0 0 0 .28438-.81919.99843.99843 0 0 0 -.28442-.79373 1.26393 1.26393 0 0 0 -.85-.24618h-1.80705v2.11058z\\\"></path><path d=\\\"m11.20433 4.25v6.11312h3.65556v1.38688h-5.30454v-7.5z\\\"></path></g></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" role=\\\"img\\\" viewBox=\\\"0 0 48 48\\\"><g fill=\\\"none\\\"><path d=\\\"m36.65 32.47h6.09v6.8h-6.09z\\\"></path><path d=\\\"m28.53 23.41h6.77v7.55h-6.77z\\\"></path><path d=\\\"m35.3 11.33h1.35a.75.75 0 0 0 .68-.76v-6.79a.74.74 0 0 0 -.68-.78h-1.35a.74.74 0 0 0 -.68.76v6.79a.75.75 0 0 0 .68.78z\\\"></path><path d=\\\"m36.65 15.1h6.09v6.8h-6.09z\\\"></path><path d=\\\"m36.65 23.41h6.09v7.55h-6.09z\\\"></path><path d=\\\"m20.41 23.41h6.77v7.55h-6.77z\\\"></path><path d=\\\"m21.55 39.26h5.63v-6.79h-6.51a10.82 10.82 0 0 1 .88 6.79z\\\"></path><path d=\\\"m19.05 30v-6.59h-6.05v3.13a10.82 10.82 0 0 1 6.05 3.46z\\\"></path><path d=\\\"m28.53 32.47h6.77v6.8h-6.77z\\\"></path><path d=\\\"m28.53 15.1h6.77v6.8h-6.77z\\\"></path><path d=\\\"m12.96 15.1h6.09v6.8h-6.09z\\\"></path><path d=\\\"m19.05 11.33h1.36a.74.74 0 0 0 .67-.76v-6.79a.73.73 0 0 0 -.67-.78h-1.36a.73.73 0 0 0 -.67.76v6.79a.74.74 0 0 0 .67.78z\\\"></path><path d=\\\"m20.41 15.1h6.77v6.8h-6.77z\\\"></path></g><path fill=\\\"#165c96\\\" d=\\\"m42.75 6h-2.75v-2.22a3.61 3.61 0 0 0 -3.35-3.78h-1.35a3.61 3.61 0 0 0 -3.38 3.78v2.22h-8.13v-2.22a3.61 3.61 0 0 0 -3.38-3.78h-1.36a3.61 3.61 0 0 0 -3.38 3.78v2.22h-2.67a2.9 2.9 0 0 0 -2.71 3v17.38a10.82 10.82 0 1 0 2 21.54 11 11 0 0 0 8.21-5.63h22.25a2.9 2.9 0 0 0 2.71-3v-30.23a2.9 2.9 0 0 0 -2.71-3.06zm-24.45 33.26a7.64 7.64 0 0 1 -1.67 3 7.67 7.67 0 1 1 1.67-3zm.75-9.26a10.82 10.82 0 0 0 -6.05-3.46v-3.13h6.09zm0-8.13h-6.05v-6.77h6.09zm-.67-11.33v-6.76a.73.73 0 0 1 .67-.78h1.36a.73.73 0 0 1 .67.76v6.79a.74.74 0 0 1 -.67.76h-1.36a.74.74 0 0 1 -.67-.74zm8.8 28.69h-5.63a10.82 10.82 0 0 0 -.88-6.79h6.51zm0-8.3h-6.77v-7.52h6.77zm0-9.06h-6.77v-6.77h6.77zm8.12 17.39h-6.77v-6.79h6.77zm0-8.3h-6.77v-7.55h6.77zm0-9.06h-6.77v-6.8h6.77zm-.68-11.33v-6.79a.74.74 0 0 1 .68-.78h1.35a.74.74 0 0 1 .68.76v6.79a.75.75 0 0 1 -.68.76h-1.35a.75.75 0 0 1 -.68-.74zm8.13 28.69h-6.1v-6.79h6.1zm0-8.3h-6.1v-7.55h6.1zm0-9.06h-6.1v-6.8h6.1z\\\"></path><path fill=\\\"#165c96\\\" d=\\\"m12.28 31.76h-.9a.45.45 0 0 0 -.45.45v5h-3.16a.45.45 0 0 0 -.45.45v.91a.45.45 0 0 0 .45.45h4.51a.44.44 0 0 0 .45-.45v-6.36a.44.44 0 0 0 -.45-.45z\\\"></path></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" role=\\\"img\\\" viewBox=\\\"0 0 48 48\\\"><path fill=\\\"#fff\\\" d=\\\"m27.92 1.0025a19.07 19.07 0 1 1 -10.8513 34.7012l-10.315 10.2951a3.3658 3.3658 0 0 1 -4.77-4.75l10.315-10.315a18.899 18.899 0 0 1 -3.4387-10.8715 19.1146 19.1146 0 0 1 19.06-19.0598zm0 6.7176a12.3422 12.3422 0 1 0 12.3425 12.3422 12.2866 12.2866 0 0 0 -12.3425-12.3423z\\\"></path></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" role=\\\"img\\\" viewBox=\\\"0 0 48 48\\\"><path fill=\\\"#1c1e23\\\" d=\\\"m42.94908 21.61-1.84056-14.63c-.46772-2.64-2.115-3.67-4.56567-4.75a39.04369 39.04369 0 0 0 -12.52764-2.32 39.21741 39.21741 0 0 0 -12.54795 2.32c-2.42011 1.06-4.06741 2.11-4.56566 4.75l-1.85068 14.63v20.24h3.24885v3.525a2.65516 2.65516 0 0 0 2.66923 2.625 2.65522 2.65522 0 0 0 2.66925-2.625v-3.525h20.82007v3.525a2.66961 2.66961 0 0 0 5.33848 0v-3.525h3.15228zm-26.73308-18h15.65953a1.18036 1.18036 0 1 1 0 2.36h-15.65953a1.18015 1.18015 0 1 1 0-2.36zm-7.7993 17.57 1.5253-11.55a1.52367 1.52367 0 0 1 1.52528-1.25h25.28913a1.513 1.513 0 0 1 1.51511 1.25l1.52528 11.55a1.31759 1.31759 0 0 1 0 .4v.08a1.49613 1.49613 0 0 1 -1.52528 1.49h-28.40072a1.50954 1.50954 0 0 1 -1.4541-1.57 1.31759 1.31759 0 0 1 0-.4zm2.5523 14.41a2.79533 2.79533 0 1 1 2.837-2.8 2.817 2.817 0 0 1 -2.837 2.8zm26.15346 0a2.79549 2.79549 0 1 1 2.84718-2.8 2.817 2.817 0 0 1 -2.84717 2.8z\\\"></path></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" role=\\\"img\\\" viewBox=\\\"0 0 16 16\\\"><path fill=\\\"#1c1e23\\\" d=\\\"m14.2452 6.9551-.4392-3.2978c-.1149-.5947-.5069-.8312-1.088-1.0744a9.9485 9.9485 0 0 0 -2.9937-.52 9.9418 9.9418 0 0 0 -2.987.52c-.5744.2432-.9731.48-1.0947 1.0744l-.4326 3.2978v4.5549h.8075v.7772a.5668.5668 0 0 0 .2974.4865c.04.02.0811.0406.1148.0541a.69.69 0 0 0 .0947.027.5762.5762 0 0 0 .1554.02h.23a.6356.6356 0 0 0 .669-.5879v-.7769h4.363v.7772a.5667.5667 0 0 0 .2973.4865c.0406.02.0811.0406.1149.0541a.6885.6885 0 0 0 .0946.027.5769.5769 0 0 0 .1555.02h.23a.6356.6356 0 0 0 .669-.5879v-.7769h.7425zm-6.6429-3.9395h4.2507c.2027 0 .3716.2309.3716.5078s-.1689.5078-.3716.5078h-4.2507c-.2027 0-.3716-.2308-.3716-.5078s.1693-.5078.3716-.5078zm-1.0396 4.5544.3006-2.3339a.3143.3143 0 0 1 .3223-.2671h5.1244a.3183.3183 0 0 1 .3222.2671l.344 2.3339v.1042a.3256.3256 0 0 1 -.322.3258h-5.7811a.3318.3318 0 0 1 -.31-.3388.2326.2326 0 0 1 -.0004-.0912zm.6465 2.7535a.8285.8285 0 1 1 -.0371-1.6543.8311.8311 0 1 1 .0371 1.6543zm5.0154 0a.8285.8285 0 1 1 -.037-1.6543.8311.8311 0 1 1 .037 1.6543z\\\"></path><path fill=\\\"#7c878e\\\" d=\\\"m8.0009 0a8.0405 8.0405 0 0 0 -7.9991 8 7.9991 7.9991 0 1 0 7.9991-8\\\"></path><g fill=\\\"#fff\\\"><path d=\\\"m3.6379 9.8223a1.14 1.14 0 0 0 .3465.4066 1.4926 1.4926 0 0 0 .5068.2309 2.3973 2.3973 0 0 0 .6027.0753 3.1157 3.1157 0 0 0 .4516-.0351 1.5712 1.5712 0 0 0 .4519-.1354.9923.9923 0 0 0 .3515-.2762.6942.6942 0 0 0 .14-.4468.6287.6287 0 0 0 -.1854-.4716 1.4719 1.4719 0 0 0 -.4868-.3012 4.88 4.88 0 0 0 -.6827-.211q-.3819-.09-.7733-.2007a6.8 6.8 0 0 1 -.7829-.246 2.688 2.688 0 0 1 -.683-.3764 1.7749 1.7749 0 0 1 -.4868-.5777 1.7528 1.7528 0 0 1 -.1857-.8383 1.8759 1.8759 0 0 1 .2359-.9587 2.1364 2.1364 0 0 1 .6174-.6776 2.69 2.69 0 0 1 .8634-.4017 3.6837 3.6837 0 0 1 .964-.13 4.5682 4.5682 0 0 1 1.0791.1255 2.6987 2.6987 0 0 1 .9189.4067 2.0622 2.0622 0 0 1 .6376.7171 2.2036 2.2036 0 0 1 .2359 1.0593h-1.5261a1.2706 1.2706 0 0 0 -.1358-.5321.8879.8879 0 0 0 -.3061-.3314 1.2971 1.2971 0 0 0 -.4365-.1707 2.6957 2.6957 0 0 0 -.5371-.05 1.86 1.86 0 0 0 -.3818.04 1.0222 1.0222 0 0 0 -.3462.14.8675.8675 0 0 0 -.2561.2511.6746.6746 0 0 0 -.1.3815.6437.6437 0 0 0 .08.3413.7137.7137 0 0 0 .3162.241 4.0247 4.0247 0 0 0 .6527.2209q.4164.1105 1.0892.2811.2008.04.5574.1455a2.6774 2.6774 0 0 1 .7077.3365 2.1409 2.1409 0 0 1 .6073.6174 1.7574 1.7574 0 0 1 .2562.9889 2.1911 2.1911 0 0 1 -.1909.9136 1.9859 1.9859 0 0 1 -.5672.728 2.7248 2.7248 0 0 1 -.9336.4768 4.4152 4.4152 0 0 1 -1.29.1708 4.5312 4.5312 0 0 1 -1.15-.1457 2.887 2.887 0 0 1 -.9838-.4563 2.2529 2.2529 0 0 1 -.6778-.7931 2.3668 2.3668 0 0 1 -.241-1.1444h1.5261a1.3138 1.3138 0 0 0 .1306.6123z\\\"></path><path d=\\\"m10.5254 4.4207v5.8433h3.4938v1.3253h-5.0702v-7.1686z\\\"></path></g></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" role=\\\"img\\\" viewBox=\\\"0 0 48 48\\\"><path fill=\\\"#1c1e23\\\" d=\\\"m20.27 16.87-6.54-3.81-1.56-5.86a1 1 0 0 0 -1.17-.7l-5.08 1.37a1 1 0 0 0 -.69 1.21l1 3.95-3.89 1.06a1 1 0 0 0 -.69 1.22l1.35 5.09a1 1 0 0 0 1.2.7l6.12-1.66 6.35 3.7-5.78 3.37-7.19-1.94a1 1 0 0 0 -1.2.7l-1.35 5.09a1 1 0 0 0 .69 1.21l4.44 1.2-1.22 4.6a1 1 0 0 0 .69 1.21l5.05 1.42a1 1 0 0 0 1.2-.7l1.58-5.94 6.69-3.89v7.71l-5.33 5.32a1 1 0 0 0 0 1.4l3.7 3.73a1 1 0 0 0 1.39 0l3.58-3.63 3.67 3.7a1 1 0 0 0 1.39 0l3.7-3.7a1 1 0 0 0 0-1.39l-4.92-5v-8.19l7.29 4.24 1.49 5.59a1 1 0 0 0 1.2.7l5-1.37a1 1 0 0 0 .7-1.21l-1.24-4.66 4.23-1.14a1 1 0 0 0 .7-1.21l-1.32-5.09a1 1 0 0 0 -1.2-.7l-7.38 2-5.87-3.42 6.63-3.86 6.73 1.82a1 1 0 0 0 1.2-.7l1.39-5.1a1 1 0 0 0 -.7-1.22l-4-1.07 1.05-3.94a1 1 0 0 0 -.69-1.21l-5-1.37a1 1 0 0 0 -1.2.7l-1.46 5.27-7.55 4.4v-6.17l4.92-4.95a1 1 0 0 0 0-1.4l-3.7-3.72a1 1 0 0 0 -1.39 0l-3.52 3.55-3.76-3.77a1 1 0 0 0 -1.39 0l-3.7 3.73a1 1 0 0 0 0 1.39l5.33 5.37z\\\"></path></svg>\"","module.exports = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" role=\\\"img\\\" viewBox=\\\"0 0 48 48\\\"><path fill=\\\"#fff\\\" d=\\\"m42.88 45.83a2.1 2.1 0 0 1 -.87-.19l-15.92-7.17a5.23 5.23 0 0 0 -2.09-.47 5.14 5.14 0 0 0 -2.08.44l-15.92 7.2a2.1 2.1 0 0 1 -.87.19 2.14 2.14 0 0 1 -1.76-1 2 2 0 0 1 -.12-2l18.86-40.83a2.08 2.08 0 0 1 3.78 0l18.87 40.87a2 2 0 0 1 -.12 2 2.14 2.14 0 0 1 -1.76.96z\\\"></path><path d=\\\"m24 2.34a.55.55 0 0 1 .53.33l18.86 40.83a.49.49 0 0 1 0 .53.61.61 0 0 1 -.49.3.65.65 0 0 1 -.25-.06l-15.95-7.16a6.57 6.57 0 0 0 -5.4 0l-15.93 7.16a.65.65 0 0 1 -.25.06.61.61 0 0 1 -.49-.3.49.49 0 0 1 0-.53l18.84-40.83a.55.55 0 0 1 .53-.33m0-3a3.53 3.53 0 0 0 -3.25 2.07l-18.87 40.83a3.59 3.59 0 0 0 3.24 5.09 3.74 3.74 0 0 0 1.49-.33l15.92-7.17a3.64 3.64 0 0 1 2.94 0l15.92 7.17a3.74 3.74 0 0 0 1.49.32 3.59 3.59 0 0 0 3.24-5.09l-18.87-40.82a3.53 3.53 0 0 0 -3.25-2.07z\\\"></path></svg>\"","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","__webpack_require__.amdD = function () {\n\tthrow new Error('define cannot be used indirect');\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.hmd = (module) => {\n\tmodule = Object.create(module);\n\tif (!module.children) module.children = [];\n\tObject.defineProperty(module, 'exports', {\n\t\tenumerable: true,\n\t\tset: () => {\n\t\t\tthrow new Error('ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: ' + module.id);\n\t\t}\n\t});\n\treturn module;\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.j = 580;","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t580: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = globalThis[\"webpackChunksite_dotcom\"] = globalThis[\"webpackChunksite_dotcom\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [216,514], () => (__webpack_require__(3767)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","isVehicleChannel","channelId","includes","joinChannel","window","socket","channels","channel","state","join","receive","_a","reason","console","error","log","split","route_id","direction_id","push","on","data","event","CustomEvent","detail","document","dispatchEvent","exports","leaveChannel","id","off","leave","leaveAllChannels","Object","keys","forEach","phoenix_1","connect","addEventListener","querySelectorAll","el","getAttribute","alertClassNames","expanded","priority","description","classNames","effect","icon_alerts_triangle_svg_1","icon_cancelled_default_svg_1","icon_snow_default_svg_1","icon_shuttle_default_svg_1","humanLifecycle","lifecycle","severity","alert","alertClasses","react_1","className","humanLabelForAlert","map","word","charAt","toUpperCase","slice","alertDescription","tabIndex","role","ref","panel","focus","dangerouslySetInnerHTML","__html","updated_at","useState","toggleExpanded","onClick","strippedAlertUrl","url","replace","headerContent","header","onKeyPress","e","handleReactEnterKeyPress","iconForAlert","effectNameForAlert","alertLabel","noDescription","caret","caretIcon","alerts","key","props","text","iconSvgText","classOverride","dispatch","notifyExpanded","initiallyExpanded","initiallyFocused","children","panelClassName","preventScroll","initialState","focused","action","type","payload","hookedState","headerId","panelId","iconHelper","render_svg_1","render_fa_1","classOverrideString","isString","textContent","pageType","stopId","glx_logo_svg_1","glxLogoElement","matchQuery","childNodes","setChildNodes","useEffect","matched","match","RegExp","precedingText","subsequentText","createElement","ModalContent","closeText","closeModal","ariaLabel","focusElementId","bodyPadding","scrollBarPadding","_b","asideRef","useRef","scrollRef","current","scrollTo","top","passive","removeEventListener","useLayoutEffect","trap","initialFocus","clickOutsideDeactivates","activate","bodyWrapper","getElementById","setAttribute","body","classList","add","style","paddingRight","remove","deactivate","createPortal","labelOrDescribedBy","onKeyDown","handleReactExitKeyPress","target","onClickAway","Modal","_c","_d","priorPadding","innerWidth","clientWidth","labelText","onChange","placeholder","query","setQuery","htmlFor","value","searchIcon","label","undefined","isLabel","elementId","route","toLowerCase","isABusRoute","isASilverLineRoute","isACommuterRailRoute","isAGreenLineRoute","routeToModeName","unformatted","part","Number","parseInt","year","month","day","Date","date","getFullYear","getMonth","getDate","stringToDateObject","toLocaleDateString","timeZone","timeStr1","timeStr2","today","dateFormatted","Intl","DateTimeFormat","format","fullDate1","fullDate2","timeInMs1","getTime","timeInMs2","comparison","dateTimeString","dateTime","parseISO","formatString","getMinutes","formatInTimeZone","r","result","isFetchFailed","Error","_i","args","Promise","fetch","resp","ok","json","fetchJson","then","isLoading","icon_accessible_small_svg_1","icon_blue_line_default_svg_1","icon_mode_bus_small_svg_1","icon_mode_commuter_rail_small_svg_1","icon_mode_ferry_small_svg_1","icon_mode_subway_default_svg_1","icon_green_line_small_svg_1","icon_green_line_b_small_svg_1","icon_green_line_c_small_svg_1","icon_green_line_d_small_svg_1","icon_green_line_e_small_svg_1","icon_mattapan_line_small_svg_1","icon_orange_line_small_svg_1","icon_red_line_small_svg_1","icon_silver_line_small_svg_1","icon_vehicle_bordered_expanded_svg_1","icon_search_reverse_default_svg_1","routeId","startsWith","commuterRailIcon","ferryIcon","blueLineIcon","greenLineIcon","greenBLineIcon","greenCLineIcon","greenDLineIcon","greenELineIcon","mattapanLineIcon","orangeLineIcon","redLineIcon","silverLineIcon","busIcon","unicodeCharacter","defaultTooltipOptions","animation","html","placement","trigger","tooltipText","tooltipOptions","href","options","assign","Tag","icon_crowding_svg_1","cb","isEnter","keyCode","isEscape","delay","prediction","scheduledTime","scheduled_time","time","delayForCommuterRail","compareStringTimes","status","isSkippedOrCancelled","track","svgName","ariaHide","svgText","stop","routes","length","reduce","acc","find","group_name","ServiceGroupNames","service1","service2","start_date","isInAddedDates","service","currentDate","added_dates","dateObjectToString","serviceStartDate","serviceEndDate","end_date","rating_start_date","ratingStartDate","rating_end_date","ratingEndDate","removed_dates","isInRemovedDates","currentDay","getDay","valid_days","isOnValidDay","isInCurrentRating","startDateObject","endDateObject","shortDate","areSimilarServices","lodash_1","every","p","isEqual","services","uniqWith","groupBy","typicality","HOLIDAY","OTHER","isInCurrentService","CURRENT","isInFutureRating","FUTURE","rating_description","optGroupOrder","serviceTypeOrder","weekday","saturday","sunday","other","serviceTypicalityOrder","unplanned_disruption","planned_disruption","holiday_service","extra_service","typical_service","unknown","type1","validDays1","typicality1","date1","type2","validDays2","typicality2","date2","groupA","groupB","optGroupNames","values","a","name","b","filter","dayIntegerToString","daysAreConsecutive","days","nextDay","rest","validDays","stopTree","byId","edges","startingNodes","node","next","previous","nodeValue","nodeForId","nextEdges","edgesForId","previousEdges","nextStopIds","previousStopIds","pathsFrom","isEndNode","flatMap","nextId","ids","prependStopId","pathLength","stops","Math","max","paths","longestLength","longestPathLength","path","longestPath","len","sliceSets","__spreadArray","Array","Set","recordIdPositionsMovingForward","index","recordIdPositionsMovingBackward","previousId","set","from","sliceSize","slices","sliceForId","some","isStartNode","str","spans","parts","cursor","span","offset","fn","latestTimeout","enqueue","useCallback","fn_","setTimeout","cancel","clearTimeout","go","FetchStatus","NotStarted","Loading","Data","parseJsonResponse","response","statusText","fetcher","parser","catch","useReducer","provider","deps","loading","setState","updateData","setStateIfSame","currentState","newestUpdateData","state_","reducer","initialData","onChannelData","EVENT_NAME","direction","initialDirection","currentDirection","setCurrentDirection","listener","hoursOfOperation","setHoursOfOperation","routeIdString","fetchJsonOrThrow","location","search","substring","isGlxOpen","glxOpenDate","setIsGlxOpen","stationId","glxStationsOpen","querySelector","dataset","stations","opening","isStationOpen","getIsGlxOpen","directionId","enabled","liveUrl","refreshInterval","markers","points","m","latLng","latitude","longitude","latLngBounds","maxZoom","minZoom","scrollWheelZoom","touchAction","memo","bounds","boundsByMarkers","defaultCenter","polylines","tileServerUrl","zoom","leaflet","require","buildIcon_1","getBounds","Map","Marker_1","Polyline_1","Popup_1","TileLayer","boundsOrByMarkers","position","mapCenter","nonNullZoom","mapRef_1","createRef","center","attribution","onload","container","parentElement","polyline","floor","random","positions","color","weight","dashArray","lineCap","lineJoin","uniqBy","marker","icon","icon_opts","markerEl","angle","setRotationAngle","rotateMarker","leafletElement","zIndexOffset","z_index","keyboard","onclick","tooltip","maxHeight","react_2","iconAnchor","iconSize","popupAnchor","opts","iconOpts","icon_anchor","icon_size","popup_anchor","leaflet_1","iconUrl","iconRetinaUrl","entities","findIndex","active_period","isInARange","ap","d","range","start","end","isValid","isDiversion","isCurrentAlert","alertsByStop","schedule_relationship","timeDataList","time_data","isCommuterRailRouteType","routeOrType","routeOrRouteId","routeTypesToMode","crowding","not_crowded","some_crowding","crowded","tagsToIcons","blue","icon_1","bus","commuterRail","ferry","green","mattapan","orange","red","silver","subway","tag","extraClasses","iconFunction","connections","pdfs","teasers","fares","holidays","fareLink","hours","scheduleNote","ContentTeasers_1","PDFSchedules_1","Connections_1","Fares_1","routeType","isSubwayRoute","HoursOfOperation_1","UpcomingHolidays_1","ExpandableBlock_1","RoutePillList_1","showGroupName","f","fare","title","price","getGreenLineScheduleLinks","isGreenLine","GreenLineScheduleLinks_1","isRapidTransit","RapidTransitHoursOfOperation_1","DefaultHoursOfOperation_1","updateMarker","vehicle_crowding","CrowdingPill_1","tooltip_text","isVehicleMarker","concat","idHash","currentShapes","currentStops","stopMarkers","stop_markers","mark","mapData","shape","Map_1","pdf","rel","icon_pdf_default_svg_1","link","getSchedule","dataArray","bothDirectionData","filteredData","stopData","is_terminus","sortedData","sortBy","stop_name","firstDeparture","first_departure","lastDeparture","last_departure","timeString","formatToBostonTime","uniqueId","regularScheduleHTML","trainsEveryHTML","minuteString","isTodayWeekend","isWeekend","hideScheduleFrequency","week","peak_service","offpeak_service","borderBottomWidth","borderBottomColor","borderBottomStyle","marginBottom","currentRoutePatternIdForData","baseURL","stop_tree","fromStopTreeData","routePatternsByDirection","staticMapData","initialStopTree","busVariantId","routePatternsInCurrentDirection","defaultRoutePattern","routePattern","reverseDirection","directionIsChangeable","direction_names","reducer_1","routePatternMenuOpen","routePatternMenuAll","itemFocus","fetch_1","mapState","dispatchMapData","shape_id","stop_ids","currentPatterns","pattern","shape_priority","cur","fetchMapData","lineState","dispatchLineData","fetchLineData","hasValidTree","isEmptyTree","ScheduleDirectionMenu_1","selectedRoutePatternId","menuOpen","showAllRoutePatterns","ScheduleDirectionButton_1","LineDiagram_1","src","img_src","alt","pdf_url","updateURL","modalMode","selectedOrigin","changeDirection","changeOrigin","modalOpen","isFerryRoute","ScheduleFinderForm_1","onDirectionChange","onOriginChange","onOriginSelectClick","getCurrentState","storeHandler","newStoreValues","onSubmit","modalIsOpen","selectedDirection","stopsByDirection","ScheduleFinderModal_1","directionChanged","initialMode","initialOrigin","handleOriginSelectClick","originChanged","stopTreeData","by_id","starting_nodes","origin","component","schedulePageData","useQueryParams","use_query_params_1","newDirection","newOrigin","queryDirectionId","routeIsSuspended","readjustedDirectionId","toString","AdditionalLineInfo_1","ScheduleNote_1","ScheduleFinder_1","mapDataEl","JSON","parse","innerHTML","staticDataEl","ScheduleDirection_1","ScheduleStore_1","serviceTime","peakOffPeakTimes","peakService","offpeakService","exceptions","offpeak","except","offPeak","exception","alternateText","icon_schedule_finder_svg_1","alternateNote","holiday","RoutePatternItem","routePatternIds","selected","duplicated","selectedClass","icon_checkmark_svg_1","handleClick","setRoutePatternAction","item","onKeyUp","headsign","time_desc","UncommonDestinationsItem","showAllRoutePatternsAction","icon_down_arrow_svg_1","hasMoreRoutePatterns","routePatterns","isDuplicateHeadsign","compareRoutePattern","filterRule","focusIndex","determineFocusIndex","toggleButtonIds","isMenuClickable","toggleRoutePatternMenuAction","linkClass","routePatternNameById","destinations","resolve","i","greenRoutes","direction_destinations","get","size","routeIds","greenRoute","toggleDirectionAction","icon_change_direction_svg_1","clickToClose","closest","closeRoutePatternMenuAction","keyToClose","handleNativeEscapeKeyPress","BusMenu_1","GreenLineMenu_1","indexOf","preventDefault","targetElId","shiftKey","nextIndex","currentId","nextRoutePatternIndex","nextElId","prevIndex","prevRoutePatternIndex","prevElId","updateDirectionAndVariantInURL","routePatternId","newLoc","updateInLocation","history","replaceState","pathname","nextDirection","possibleNextRoutePattern","defaultRoutePatternForDirection","element","dispatchChangedDirection","toggleDirection","toggleRoutePatternMenu","newRoutePattern","setRoutePattern","crowdingIcon","crowdingDescriptions","BranchToggle","stopIds","isExpanded","branchPosition","width","diagramWidth","stopForId","height","transform","graphic_helpers_1","rx","times","cx","cy","handleStopClick","liveData","setIsExpanded","updateAllStopCoords","useContext","LineDiagramWithStops_1","blockIsExpanded","branch","StopCard_1","stationsOrStops","stopTreeCoordStore","createStopTreeCoordStore","filteredStops","newQuery","SearchBox_1","searchQuery","react_redux_1","store","createContext","stopsToTerminus","NextStopOrBranch","mergingInBranches","splittingOffBranches","splittingOffBranch","remainingSplittingOffBranches","branchStopIds","terminalStopId","nonTerminalStops","expandableBranch","ExpandableBranch_1","newMergingInBranches","newBranchesStartingInSlice","mergingBranch","remainingMergingInBranches","startingId","nonStartingStops","nextIds","primaryPath","partition","primary","branches","nextPrimaryAndBranches","newSplittingOffBranches","children_1","mergingInBranchesWithNext","lastStopId","stopRefsMap","anyCrowding","headsigns","prediction_1","Provider","Diagram_1","longestPathStartingId","tooltipPlacement","isCommuterRail","crCrowdingDescriptions","hasLivePredictions","routeForStop","Alert","alertIcon","refs","routeStop","diversionAlert","alert_1","showDiversion","paddingLeft","GlxOpen_1","hasBranches","hasBranchLabel","lineOrBranch","lineName","hasHighPriorityAlert","MatchHighlight_1","greenLineConnections","route_1","routeStopRoute","connectionsFor","showPrediction","StopPredictions_1","hasUpcomingDeparturesIfSubway","schedulesButtonLabel","filteredConnections","firstCRIndex","connection","firstFerryIndex","consolidated","connectingRoute","routeBgClass","modeIcon","stop_features","parkingIcon","isBusRouteStop","accessibleIcon","zone","predictions","liveHeadsigns","enhancedTimeData","time_data_with_crowding_list","predictedOrScheduledTime","predictionTimeClass","predicted_schedule","timeForCommuterRail","texts","train_number","statusForCommuterRail","predictionTexts","capitalize","LiveCrowdingIcon_1","CrowdingIconString","vehicle","renderToString","vehicles","coords","useSelector","x","y","left","tooltips","in_transit","incoming","stopped","vehicleArrowIcon","hasBranchLines","largestSliceSize","LiveVehicleIconSet","vehicleData","VehicleIcons_1","xmlns","overflow","routeName","names","diagramDescription","isBranchingNode","branchingStopId","branchNames","branchingDescription","DiagonalHatchPattern","Merges_1","nextStopId","Line_1","fromId","toId","Stop_1","isOnPrimaryBranch","isMiddleBranchStop","isMergeNode","fromCoords","toCoords","y1","y2","strokeWidth","strokeProp","hasAnActiveDiversion","stroke","x1","x2","lineProps","notOnPrimaryPath","stopsToStart","mergeGaps","toStopId","fromStopId","mergeStopGaps","branchingGaps","branchingStopGaps","stopGaps","bends","lastStopOnBranch","trunkStop","trunkStopCoords","startingStopId","branchStopCoords","trunkX","trunkY","branchX","branchY","dx","abs","dy","arc","pathProps","mergeBends","firstStopOnBranch","terminusStopId","branchingBends","shuttle","allCoordinates","patternTransform","patternUnits","initialCoordState","createStore","__REDUX_DEVTOOLS_EXTENSION__","dispatchStopCoords","useDispatch","updateAllStops","BRANCH_SPACING","xCoordForStop","coordinates","maxBranches","BASE_LINE_WIDTH","isOnPrimaryPath","stopBeforeMerging","stopAfterBranchingOff","slicePosition","sort","stopA","stopB","routeA","routeB","byBranch","stopAdjacentToMerge","lastStop","isDisabled","is_closed","handleChangeOrigin","originSearch","setOriginSearch","trim","cleanSearch","regExp","stopListSearchFilter","OriginListItem_1","directionInfo","directionNames","directionDestinations","originError","setOriginError","directionNameForId","SelectContainer_1","dir","scheduleOrigin","handleChangeDirection","originStop","Modal_1","OriginModalContent_1","originModalContent","ScheduleModalContent_1","departures","all","departure","trip","res","tripInfo","input","useProvider","useAwaitInterval","serviceToday","DailyScheduleSubway_1","UpcomingDepartures_1","DailySchedule_1","colSpan","contentComponent","toggle","selectedService","isCurrent","SchedulesSelect","sortedServices","todayServiceId","defaultSelectedServiceId","todayDate","onSelectService","servicesByOptGroup","groupServicesByDateRating","defaultValue","s","service_1","group","groupedServices","ServiceOptGroup_1","multipleWeekdays","hasMultipleWeekdaySchedules","fetchState","currentServices","isCurrentValidService","defaultSelectedService","setSelectedService","getJourneysForSelectedService","fetchJourneys","isNotStarted","chosenService","Loading_1","ScheduleTable_1","journeys","getHoursByStop","bothDirectionHours","h","parent_stop_id","selectedSchedule","setSelectedSchedule","firstTrainHours","setFirstTrainHours","lastTrainHours","setLastTrainHours","stopLatLong","setStopLatLong","scheduleNoteText","setScheduleNoteText","originStopName","stopsInDirection","findStopName","destinationName","specialServices","addedDate","dateString","added_dates_notes","compareAsc","getSpecialServiceMaps","todaysSpecialService","isSameDay","getSpecialServiceByDate","isTodaySpecialService","isTodaySunday","isSunday","isTodaySaturday","isSaturday","isTodayAWeekday","specialServiceHours","special_service","RouteIcon_1","toLower","isToday","gap","isSchoolTrip","routePatternsById","accumulator","anySchoolTrips","firstTrip","lastTrip","scope","journey","TableRow_1","route_pattern_id","dedupeServices","isMultipleWeekday","startDate","endDate","optionText","entries","entry","addedNote","serviceDays","tripId","BusTableRow","backgroundClass","RouteIcon","breakTextAtSlash","CrTableRow","Accordion","setExpanded","fetchTripInfo","AccordionRow_1","TripDetails_1","showFare","TripSummary","duration","fare_link","ErrorLoadingTrip","TripDetailsTable","schedule","allTimesHaveSchedule","TripStop_1","route_type","hasData","formattedDepartureTimes","hasAPrediction","RoutePillSmall","modeBgClass","showCrowding","trip_id","realtime","crowdingInformation","trackForCommuterRail","statusWithTrain","AccordionRow","TableRow","UpcomingDeparturesHeader","icon_live_clock_svg_1","headerLabel","someCrowdingInfoExists","isEmpty","hasPredictions","idx","isInitialLoading","upcomingDeparturesTable","react_dom_1","render","ScheduleLoader_1","scheduleFinderRoot","root","renderDirectionAndMap","mapEl","renderMap","schedulePageDataEl","createScheduleStore","renderAdditionalLineInformation","renderDirectionOrMap","newState","getState","newValues","displayText","linkURL","backgroundColor","optionalCSS","externalLink","routeToCSSClass","busName","modeNameForBg","RoutePill","PillLink_1","typedRoute","routeWithDirections","module","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","loaded","__webpack_modules__","call","amdD","O","chunkIds","notFulfilled","Infinity","fulfilled","j","splice","n","getter","__esModule","definition","o","defineProperty","enumerable","g","globalThis","this","Function","hmd","create","obj","prop","prototype","hasOwnProperty","Symbol","toStringTag","nmd","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","chunkLoadingGlobal","bind","__webpack_exports__"],"sourceRoot":""}